mirror of
https://github.com/Jeuners/agenttwo-tools.git
synced 2026-09-09 15:02:31 +02:00
docs: Handoff für die nächste Sitzung
Arbeitsnotiz mit Stand, den beiden nächsten Schritten (Export/Snapshots, Papierkorb) und dem zurückgestellten Cron-Entwurf. Dazu die Fallstricke dieser Sitzung, damit sie nicht zweimal Zeit kosten — vor allem das falsche gh-Remote, Ollamas effektives Kontextfenster und die Reihenfolge von onStats und onDone. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015AUP4R3rgq4XwVs4bVf7uh
This commit is contained in:
parent
a36e366b58
commit
695fcf82f4
1 changed files with 115 additions and 0 deletions
115
HANDOFF.md
Normal file
115
HANDOFF.md
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
# Handoff
|
||||
|
||||
Stand: 28.08.2026. Arbeitsnotiz für die nächste Sitzung — kein Teil der
|
||||
Projektdokumentation, die steht im [README](README.md).
|
||||
|
||||
## Wo wir stehen
|
||||
|
||||
Auf `main`:
|
||||
|
||||
| Commit | Inhalt |
|
||||
|-----------|--------------------------------------------------------------------------------------------|
|
||||
| `8a489df` | Werkzeug-Bestätigung, DNS-Pinning, Statistik-Leiste, Produktionsbetrieb (Squash aus PR #1) |
|
||||
| `a36e366` | Mic-/Anhang-Icons als SVG, blinkender Warte-Cursor |
|
||||
|
||||
Arbeitsverzeichnis sauber, `npm run typecheck` und `vite build` grün.
|
||||
|
||||
## Als Nächstes
|
||||
|
||||
### 1. Export und Snapshots
|
||||
|
||||
Anlass: Am 28.08. waren die vier Chats des Nutzers plötzlich weg. Rettbar
|
||||
waren sie nur, weil die Löschungen noch im SQLite-WAL standen und der
|
||||
Hauptfile den Stand des letzten Checkpoints hielt. Das war Glück, keine
|
||||
Vorkehrung.
|
||||
|
||||
- **Export** eines Chats als Markdown (Nachrichten, Anhänge als Dateinamen,
|
||||
Werkzeugaufrufe optional). Naheliegender Ort: Button im Sidebar-Kontext
|
||||
oder `GET /api/sessions/:id/export`.
|
||||
- **Snapshot** der Datenbank: beim Serverstart und danach täglich eine Kopie
|
||||
nach `server/backups/data-JJJJ-MM-TT.sqlite`, die letzten ~7 behalten.
|
||||
Wichtig: `VACUUM INTO` statt `cp` — das schreibt einen konsistenten Stand
|
||||
ohne WAL-Abhängigkeit. Verzeichnis in `.gitignore` aufnehmen.
|
||||
|
||||
### 2. Papierkorb statt Sofortlöschung
|
||||
|
||||
Der ✕-Button in `web/src/components/Sidebar.tsx:38` ruft `onDelete` ohne
|
||||
jede Rückfrage. Am 28.08. sind so vier Chats mit 34 Nachrichten in 1,1
|
||||
Sekunden verschwunden (vier Klicks, je ~250 ms auseinander, jeweils auf den
|
||||
obersten Eintrag, der nach dem Löschen nachrückt).
|
||||
|
||||
- Spalte `deleted_at` in `sessions`; ✕ setzt sie, statt zu löschen
|
||||
- Listenabfragen filtern `deleted_at IS NULL`
|
||||
- Endgültiges Löschen nach 30 Tagen oder manuell im Papierkorb
|
||||
- Optional zusätzlich: kurzes „Rückgängig" nach dem Klick
|
||||
|
||||
Eine reine Bestätigungsabfrage wäre billiger, aber schwächer — sie schützt
|
||||
nicht vor dem schnellen Durchklicken, das hier genau passiert ist.
|
||||
|
||||
### 3. Datenbankpfad konfigurierbar machen (klein, aber Voraussetzung)
|
||||
|
||||
`server/src/db.ts:5` hat den Pfad fest verdrahtet. Jeder Testlauf schreibt
|
||||
damit in die echte Datenbank des Nutzers — genau das hat am 28.08. Testchats
|
||||
in seiner Historie hinterlassen. Eine Variable `DB_PATH` (Default wie
|
||||
bisher) erlaubt Tests gegen eine Wegwerf-Datei und gehört vor allem, was
|
||||
automatisiert testet.
|
||||
|
||||
## Später: geplante Aufgaben (Cron)
|
||||
|
||||
Idee des Nutzers, bewusst zurückgestellt. Passt gut — Werkzeug-Loop,
|
||||
Gedächtnis und TTS liegen bereit, und mit `dreamTimers` (`index.ts:71`)
|
||||
existiert schon ein kleiner Scheduler. Zwei Punkte entscheiden das Design:
|
||||
|
||||
**Bestätigungspflicht.** `read_webpage` und `remember` laufen nur nach
|
||||
Freigabe, und ohne Rückkanal gilt „abgelehnt" (`tools/index.ts:107`). Ein
|
||||
Job um 8 Uhr hat niemanden zum Fragen — ausgerechnet der nützlichste Job
|
||||
würde zuverlässig scheitern. Auflösung: Freigabe wandert vom Ausführungs-
|
||||
zum **Anlegezeitpunkt**. Beim Erstellen hakt der Nutzer die erlaubten
|
||||
Werkzeuge an und sieht sie zusammen mit dem Prompt; der Job trägt diese
|
||||
Allowlist als `ToolContext.confirm`. Das ist Einwilligung, nicht ihre
|
||||
Umgehung.
|
||||
|
||||
Dabei eng bleiben: `remember` **nicht** in die Standard-Allowlist. Ein
|
||||
unbeaufsichtigter Job, der Fremdinhalt liest und daraus dauerhafte „Fakten
|
||||
über den Nutzer" ableitet, ist genau die Kette, die der Security-Review
|
||||
geschlossen hat. Jeder Job schreibt in einen eigenen Chat.
|
||||
|
||||
**Laufzeit.** Cron feuert nur, solange der Server läuft; gestartet wird er
|
||||
heute von Hand. Statt launchd lieber Verpasstes beim nächsten Start
|
||||
nachholen — deutlich weniger Systemeingriff.
|
||||
|
||||
## Offen beim Nutzer
|
||||
|
||||
- Die vier wiederhergestellten Chats: unklar, ob die Löschung am 28.08. um
|
||||
15:02 Absicht war. Falls ja, gehören sie wieder raus. Sicherungen liegen
|
||||
in `~/agenttwo-backups/` (`vor-wal.sqlite` = 8 Sessions inkl. vier
|
||||
Testchats, `geloeschter-stand.sqlite*` = leerer Stand).
|
||||
- Static-Serving im Entwicklungsbetrieb: seit `8a489df` liefert `:8788` auch
|
||||
`web/dist` aus, sobald ein Build existiert — ein Standbild neben dem
|
||||
lebenden Vite auf `:5174`. Abschaltbar über `NODE_ENV` im `dev`-Script,
|
||||
bisher nicht gemacht.
|
||||
|
||||
## Fallstricke, teuer gelernt
|
||||
|
||||
- **`gh` zielt auf das falsche Repo.** Es löst auf `Jeuners/agenttwo` (das
|
||||
`upstream`-Remote) auf, nicht auf `agenttwo-tools`. Ohne
|
||||
`--repo Jeuners/agenttwo-tools` scheitert `gh pr create` mit einem
|
||||
irreführenden „No commits between". Dauerhaft:
|
||||
`gh repo set-default Jeuners/agenttwo-tools`.
|
||||
- **Ollamas Kontextfenster ist nicht das deklarierte.** qwen3.5 meldet
|
||||
262144, geladen läuft es mit 4096. Der wahre Wert steht in
|
||||
`GET /api/ps`, nicht in `/api/show`.
|
||||
- **Emoji lassen sich nicht einfärben.** `🎙` und `📎` sind in den Fonts fest
|
||||
grau. Zustandsfarben in CSS verpuffen an ihnen — deshalb jetzt SVG mit
|
||||
`currentColor`.
|
||||
- **`.caret` ist belegt** (Aufklapp-Dreieck des Denkprozesses). Der
|
||||
Warte-Cursor heißt `.stream-caret`.
|
||||
- **`onStats` muss vor `onDone` abgewartet werden.** Der `/api/ps`-Lookup ist
|
||||
asynchron; ohne `await` geht die Stats-Nachricht hinter dem `done` raus und
|
||||
der Client verwirft sie. Fiel nur auf, weil der erste (ungecachte) Lauf
|
||||
leer blieb und der zweite nicht.
|
||||
- **OpenRouters `usage` kommt nach `finish_reason`.** Ein früher Return
|
||||
verschluckt die Tokenzahlen. Es braucht `stream_options.include_usage`.
|
||||
- **Werkzeuge ohne Rückkanal werden abgelehnt.** Skripte und Tests, die
|
||||
`runTool` direkt aufrufen, bekommen bei bestätigungspflichtigen Werkzeugen
|
||||
„abgelehnt". Das ist Absicht — beim Testen ein `confirm` mitgeben.
|
||||
Loading…
Add table
Add a link
Reference in a new issue