--- id: DIS-154 status: in-progress 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: null merged: null --- # 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 `/.disclaw-inbox/-` 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.