Update docs for the debug web UI, voice plan, and current status

This commit is contained in:
Fisto
2026-09-13 15:47:51 +02:00
parent 2bcd8c6d7a
commit 65f0788502
14 changed files with 594 additions and 115 deletions
+55 -28
View File
@@ -1,17 +1,26 @@
# CURRENT.md — session state
Last updated: 2026-09-11
Last updated: 2026-09-13
This file tracks the work state. Read it first. Update it before you stop.
## Current focus (broad)
Build the text-based communication layer: trusted tiers, context, response routing, MCP tools, and
persistent logging. Voice, audio, and video stay deferred.
The text layer is done. The web UI follows the Nocturne design handoff. The voice backend is the
next feature; live verification and a full QR approval are pending. The LLM attachment and MCP
event delivery are parked.
## In progress
- None. The documentation pass is complete. The project is ready to resume.
- The web UI follows the Nocturne design handoff (`poc/WebUIMockup.zip`). The 7a shell is
implemented and rendered headless for review: header, call strip, three-column body, composer,
and the agent console.
- Takeover is a client-side read-only gate. Off, the composer is locked. Manual sends are logged.
- Core process control is implemented and verified live: the daemon starts the client under
auto-Xvfb, the bridge connects, and stop exits cleanly.
- Web QR login is implemented. The session reached `pending` against the real gateway; a full
phone approval is pending.
- Voice actions are designed in [docs/voice.md](docs/voice.md). The backend is not started.
## Done
@@ -24,38 +33,54 @@ persistent logging. Voice, audio, and video stay deferred.
- Continuation window: a rushed follow-up joins the request context.
- Response policy: origin channel or DM. Sensitive commands default to DM.
- Persistent action log: triggers, commands, replies, errors, rotation, and secret redaction.
- Chat command: `poll` with number-emoji reactions, one vote per user, and auto results.
- MCP tools: context, config, voice state, action log, and a read-only batch tool.
- Event processing is serialized. Replayed events are dropped.
- Unit tests for the pure logic and the cache. Mock end-to-end tests pass.
- Live verification: state, DM send, and a synthetic trigger through the real event path.
- `poll` is paused (`POLL_ENABLED = false`). The parser and its tests stay.
- Human send pacing: first send of a burst waits 30-200 ms, later sends 500-2800 ms, and the burst
resets after a random 5-20 s of quiet. Reads take 100-300 ms and do not reset the burst.
- `user.search`: cache and guild-member lookup. `voice.get` searches all guilds without a `guildId`.
- `voice.overview`: occupied voice channels and members for a guild.
- `VOICE_STATE_UPDATE` events: normalized and pushed. Mock-verified.
- Web UI: Nocturne design tokens in `poc/public/nocturne.css`, the 7a debug shell, live guild and
channel rail, messages, DMs, voice membership, agent console with a live event tab, and a
Settings slide-over for core process, login, visible guilds, and the action log. Roadmap
surfaces show as placeholders.
- Web UI data: opening a chat fetches the latest 50 messages into the client cache; attachments
hotlink Discord CDN URLs and are never stored; avatars and guild icons load from the CDN with a
monogram fallback; the page reloads itself when the bridge connects.
- Web UI drafts: composer and TTS text persist per channel in `localStorage` and survive
re-renders, reconnects, and page reloads.
- Visible guilds: the Settings panel filters the guild switcher and picker.
- Takeover: client-side read-only switch with `localStorage` persistence; manual sends are written
to the action log with `type: "manual"`.
- `dm.list`: cached DM and group DM channels, exposed over MCP as `list_dms`.
- Core process control: the daemon starts, stops, and restarts the client, reconnects the bridge
after a restart, auto-starts Xvfb when `DISPLAY` is missing, and stops what it started on exit.
Override with `VESKSLOP_CORE_CMD`/`ARGS`; disable Xvfb with `VESKSLOP_XVFB=0`.
- Web QR login: the Settings panel runs the remote-auth session and renders the QR. The token file
is written on approval and a running managed core restarts with the new token.
- Unit tests cover the pacing policy. `pnpm lint` and `pnpm testTypes` pass at the root.
## Next (in order)
1. Notification parsing: edits, deletes, reactions, and message references.
2. Reply-to-puppet counts as a trigger.
3. Per-user rate limit and command cooldowns.
4. Setup command with reaction-based multiple choice.
5. MCP event delivery decision: poll, stateful session, or a local event stream.
1. Voice backend: `voice.join`, `voice.leave`, `voice.move`, auto-leave, and the `stay @user` command.
2. Live verification: `user.search`, `voice.overview`, `VOICE_STATE_UPDATE`, and a full web QR login
approval on the real client.
3. Notification parsing: edits, deletes, reactions, and message references.
4. Reply-to-puppet counts as a trigger.
5. Per-user rate limit and command cooldowns.
6. Collector account: read-only modules for voice membership fallback.
7. Later: voice actions, audio, video, client lightening, web debug UI, remote authentication.
## Open discussions (need the user)
These items were discussed and wait for a decision or a live check.
1. **MCP event delivery.** The MCP server is stateless, so it cannot push events. Options: (a) poll
the logs with a `since` cursor, (b) a stateful Streamable HTTP session with server notifications,
(c) a separate local SSE or WebSocket event stream. Option (a) works today. Decide before an LLM
attaches.
2. **Untrusted logging.** Untrusted interactions are ignored at this time. The separate 30-entry
buffer exists but receives nothing. Confirm whether to log untrusted DMs and mentions again.
3. **Privacy pass.** Only token-shaped and `mfa.` strings are redacted, and only in the persistent
1. **Web UI auth.** Accepted: no auth, LAN or Tailscale only. Revisit before any wider exposure.
2. **MCP event delivery.** Parked with the LLM attachment. Options stay in `TODO.md`.
3. **Untrusted logging.** Untrusted interactions are ignored at this time. Confirm whether to log
untrusted DMs and mentions again.
4. **Privacy pass.** Only token-shaped and `mfa.` strings are redacted, and only in the persistent
action log. A fuller policy (retention, cache clearing, message redaction) is deferred.
4. **First live run of reactions.** `reaction.add` and the message-ID return are mock-verified only.
The first real-client poll must confirm Discord's internal `addReaction` lookup.
5. **Setup command flow.** The reaction-based multiple-choice design is recorded in `TODO.md`. The
poll command now provides the reaction machinery.
5. **Live checks.** `reaction.add`, `user.search`, `voice.overview`, and the voice state event
normalization are mock-verified only. The QR login session reached `pending` and `cancel`
against the real gateway; the approval path needs the phone. Confirm on the first real-client
run.
## Blocked / needs input
@@ -69,7 +94,9 @@ These items were discussed and wait for a decision or a live check.
- Backlog: `TODO.md`
- Design documents: `docs/INDEX.md`
- Design handoff: `poc/WebUIMockup.zip` (screen 7a is implemented)
- Agent rules: `AGENTS.md`
- Daemon code: `poc/src/`
- Web UI code: `poc/src/webui.ts`, `poc/public/`
- Core bridge code: `src/shared/puppetProtocol.ts`, `src/renderer/puppet/`,
`src/main/puppetBridge.ts`