# CURRENT.md — session state Last updated: 2026-09-13 This file tracks the work state. Read it first. Update it before you stop. ## Current focus (broad) 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 - 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 - Validated core bridge: protocol, actions, validation, structured errors, hard outbound rate limit. - Auth persistence: pinned `DATA_DIR`, token file, preload seeding, `VESKSLOP_HEADLESS`. - Daemon on the core-bridge transport. CDP stays as a development fallback. - Trusted-only triggers: DMs and direct mentions. Trust tiers: user, trusted, admin. - Context: 15 messages or 4000 characters, time stamps, file names only, incremental fetch, tmp cache with a size limit, fetch cooldown. - 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. - `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. 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. ## Open discussions (need the user) 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. 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 - The original repo `zib/Veskslop` has a broken server-side git setup. Fetches and clones fail with `bad pack header` because a script (`/home/git/.sys_health_s3`) runs on the Veskslop read path. The admin must fix it. Use `zib/Veskslop-t` (remote `veskslop-t`) until then. - `main` on the original server is `68fc8bb` (zib, "Upload files to docs/images"). It diverged from the local `main` (`24447f5`). Reconcile after the server is fixed. ## Where to look - 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`