disclaw/tasks/DIS-154.md
Nick Tabeling 00f7909e6b
Some checks failed
CI / build-and-test (ubuntu-latest) (pull_request) Has been cancelled
CI / build-and-test (windows-latest) (pull_request) Has been cancelled
CI / lint (pull_request) Has been cancelled
feat(DIS-154): agent file sending via [ATTACH: path] convention
- parseAttachments() extracts [ATTACH: path] markers from response text
- validateAttachPath() enforces workspace boundary + readability + 8MB limit
- sendResponse() sends validated files as Discord attachments before text
- CLAUDE.md template teaches agents the [ATTACH: ...] syntax
- Path-traversal guard: only files within workspace are allowed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 10:16:50 +02:00

99 lines
4.1 KiB
Markdown

---
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 `<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.