aboutsummaryrefslogtreecommitdiffstats
path: root/AGENTS.md
diff options
context:
space:
mode:
Diffstat (limited to 'AGENTS.md')
-rw-r--r--AGENTS.md15
1 files changed, 11 insertions, 4 deletions
diff --git a/AGENTS.md b/AGENTS.md
index 45d6e31..e25ec1e 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -10,9 +10,14 @@ canvas (`desktop/assistant/` in the quickshell repo, SUPER+Home). Spec:
`docs/superpowers/specs/2026-10-16-text-daemon-design.md`.
The voice version is the tag `voice-v1`: push-to-talk on the mic's mute
-button, whisper large-v3-turbo, Kokoro. The sections from "Hardware"
-through "Kokoro-82M" describe that version and its measurements. They are
-kept because a return to voice starts from them.
+button, whisper large-v3-turbo, Kokoro. These sections describe only that
+version, and are kept because a return to voice starts from them:
+"Hardware", "whisper.cpp", and under Findings "Models", "STT backends",
+"Live mic with whisper-stream", both "Push-to-talk" sections,
+"large-v3-turbo", "The loop", "Overlay", "Barge-in", "Wake word trial",
+"TTS" and "Kokoro-82M". The rest still describes the daemon: the tool,
+context-size and tool-call-history findings are rules `assistant.py`
+applies today.
Tools (2026-09-26): read-only shell-command TOML files in
`~/.config/desktop-assistant/tools/`; `config.toml` there overrides the
@@ -35,7 +40,9 @@ socket (ask) ──> llama-server (LLM, tools) ──> socket (think, token, too
- **Concurrency:** one reader thread per client, one reply thread per
question. One lock guards the conversation, the turn counter and the
database. `say()` checks the turn under it before each emit, and stop
- bumps the turn under it, so a stopped reply cannot emit after its `done`.
+ bumps the turn under it, so a stopped reply cannot send a token or tool
+ event after its `done`. A late `ctx` can still arrive: `ask()` emits it
+ outside the lock, and its numbers are true regardless.
- **One daemon:** `serve()` probe-connects first and refuses to start over a socket that answers; `main()` removes the socket only if it served it.
- **Commands** are type-checked before they run (ids must be `int`: SQLite would match `"1"` to row 1 while the Python comparison with the current id would not) and run under a try, so a failing command answers `error` instead of killing the client's reader.
- **Client sockets** have a 2 s timeout, not non-blocking mode: a large