99 lines
4.1 KiB
Markdown
99 lines
4.1 KiB
Markdown
---
|
|
id: DIS-154
|
|
status: done
|
|
phase: 1.5
|
|
priority: p1
|
|
labels: [phase:1.5, type:feat, priority:p1]
|
|
branch: refinement/discord-rich-features
|
|
assignee: developer-agent
|
|
started: 2026-04-13
|
|
pr: "#64"
|
|
merged: 2026-04-13
|
|
---
|
|
|
|
# DIS-154: Discord Rich Features für Agents (Reactions, Embeds, Dateien)
|
|
|
|
## Ziel
|
|
Agents nutzen Discord vollständiger: Status-Reactions, strukturierte Embeds für
|
|
lange Antworten, Datei-Uploads für Code/Outputs, und Datei-Empfang aus dem Channel.
|
|
Vorgezogen aus Phase 3 / SF-004.
|
|
|
|
## Kontext
|
|
Aktuell senden Agents nur Plaintext. Discord bietet viel mehr:
|
|
→ `docs/ideas/future-features.md` SF-004
|
|
→ `docs/development-plan.md` Phase 3
|
|
|
|
## Scope
|
|
|
|
### 1. Status-Reactions (`src/router.ts`)
|
|
- `👀` sobald Nachricht in Queue eingereiht wird (sofort, nicht blockierend)
|
|
- `✅` nach erfolgreicher Antwort
|
|
- `❌` bei Fehler (timeout, cli-error)
|
|
- Alle `.catch(() => {})` — nie blockierend
|
|
|
|
### 2. Typing-Refresh-Intervall
|
|
- Aktuell: 5s Intervall — auf **8s** erhöhen (Discord-Timeout ist 10s)
|
|
- Typing endet exakt wenn `runAgent` fertig ist (kein Overshoot)
|
|
|
|
### 3. Lange Antworten als Datei-Attachment (`src/discord/send-response.ts`)
|
|
- Neue Funktion `sendResponse(channel, text, message)` ersetzt direktes `channel.send()`
|
|
- Wenn Text > **4000 Zeichen**: als `.md`-Attachment senden statt mehrerer Chunks
|
|
- Unter 4000 Zeichen: bisheriges Split-Verhalten (`splitForDiscord`)
|
|
|
|
### 4. Eingehende Dateien verarbeiten (`src/discord/attachment-inbox.ts`)
|
|
- `messageCreate`-Handler prüft `message.attachments`
|
|
- Dateien werden in `<workspace>/.disclaw-inbox/<timestamp>-<filename>` gespeichert
|
|
- Im Prompt-Kontext wird ein Hinweis auf die Datei eingefügt:
|
|
`[Datei verfügbar: .disclaw-inbox/1234-example.py]`
|
|
- TTL-Cleanup: Dateien älter als 24h werden beim nächsten Start gelöscht
|
|
|
|
### 5. Input-Limit
|
|
- Nachrichten > **4000 Zeichen** → `⚠️`-Reaction + kurze Hinweis-Nachricht
|
|
- Agent wird nicht aufgerufen
|
|
|
|
## Definition of Done
|
|
- [ ] Reactions `👀` / `✅` / `❌` werden korrekt gesetzt
|
|
- [ ] Typing-Intervall 8s, endet mit Agent-Antwort
|
|
- [ ] Antworten > 4000 Zeichen kommen als `.md`-Attachment
|
|
- [ ] Eingehende Dateien landen im `.disclaw-inbox/`-Verzeichnis
|
|
- [ ] Input > 4000 Zeichen → `⚠️` + Hinweis, kein Agent-Aufruf
|
|
- [ ] Unit-Tests: `send-response`, `attachment-inbox`
|
|
- [ ] `npm run build && npm test` grün
|
|
|
|
## Dateien (erwartet)
|
|
- `src/discord/send-response.ts`
|
|
- `src/discord/attachment-inbox.ts`
|
|
- `src/router.ts` (Reactions, Typing, Input-Limit)
|
|
- `tests/unit/send-response.test.ts`
|
|
- `tests/unit/attachment-inbox.test.ts`
|
|
|
|
## Abhängigkeiten
|
|
Phase 1 abgeschlossen (splitForDiscord, RunResult).
|
|
|
|
### 6. Agent sendet Dateien zurück (`src/discord/send-response.ts`)
|
|
- Agent schreibt `[ATTACH: pfad/zur/datei.ext]` in seine Antwort
|
|
- Bot parst alle `[ATTACH: ...]`-Marker heraus, entfernt sie aus dem Text
|
|
- Sicherheitscheck vor dem Senden:
|
|
- Datei muss existieren und lesbar sein (`fs.accessSync(path, fs.constants.R_OK)`)
|
|
- Pfad darf nicht außerhalb des Workspace liegen (Path-Traversal-Schutz via `path.resolve`)
|
|
- Max. Dateigröße: **8 MB** (Discord-Limit für reguläre Bots)
|
|
- Erlaubte Pfade: relativ zum Workspace-Root oder absolut innerhalb des Workspace
|
|
- Dateien werden als Discord-Attachments gesendet, verbleibender Text normal
|
|
- CLAUDE.md-Template informiert den Agent über die `[ATTACH: ...]`-Konvention
|
|
|
|
## Definition of Done
|
|
- [ ] Reactions `👀` / `✅` / `❌` werden korrekt gesetzt
|
|
- [ ] Typing-Intervall 8s, endet mit Agent-Antwort
|
|
- [ ] Antworten > 4000 Zeichen kommen als `.md`-Attachment
|
|
- [ ] Eingehende Dateien landen im `.disclaw-inbox/`-Verzeichnis
|
|
- [ ] Input > 4000 Zeichen → `⚠️` + Hinweis, kein Agent-Aufruf
|
|
- [ ] Agent kann mit `[ATTACH: pfad]` Dateien zurücksenden
|
|
- [ ] Path-Traversal-Schutz: nur Dateien im Workspace erlaubt
|
|
- [ ] Dateien > 8 MB → Fehlermeldung an Channel statt Absturz
|
|
- [ ] CLAUDE.md-Template enthält Hinweis auf `[ATTACH: ...]`
|
|
- [ ] Unit-Tests: `send-response`, `attachment-inbox`
|
|
- [ ] `npm run build && npm test` grün
|
|
|
|
## Hinweis
|
|
Reactions, Embeds, Threads und Polls (voller SF-004-Scope) können in Folge-Issues
|
|
ausgebaut werden. Dieses Issue implementiert den Kern-QoL-Teil.
|