Files
Veskslop-t/TODO.md
T

5.7 KiB

TODO

Ordered backlog. CURRENT.md tracks the live session state.

Where the project finished (2026-09-13)

  • The validated core bridge is live: a fixed action list, input validation, structured errors, and a hard outbound rate limit. See docs/core-bridge.md.
  • The daemon uses the core bridge. QR login, pacing, the trigger log, trust tiers, context, the response policy, the continuation window, the persistent action log, and the read-only voice state all work.
  • Human pacing is live: a fast first send (30-200 ms), burst sends (500-2800 ms), and a variable 5-20 s burst reset. Reads take a small gap. See docs/daemon.md.
  • User search reads the client cache and guild members. voice.get searches all guilds without a guildId. voice.overview lists occupied channels per guild.
  • The web UI follows the Nocturne design handoff: the 7a debug shell with the guild rail, message view, voice membership, agent console, Takeover read-only gate, and a Settings slide-over for core process, login, visible guilds, and the action log. Messages fetch the latest 50 on open; attachments use CDN links; avatars and guild icons load from the CDN. Drafts survive reloads. Roadmap surfaces show as placeholders. See docs/webui.md.
  • dm.list lists cached DM and group DM channels. list_dms exposes it over MCP.
  • The daemon starts, stops, and restarts the client, and the Settings panel runs the QR login.
  • Mock end-to-end tests pass: tiers, continuation, sensitive replies, batch MCP, and voice state.
  • Repo note: use zib/Veskslop-t (remote veskslop-t) until the original repo's server hook is fixed.

Paused

  • The poll command. POLL_ENABLED is false in poc/src/puppet.ts. The parser and tests stay.
  • The setup command flow. The reaction-based multiple-choice design is on hold.
  • The LLM attachment and MCP event delivery. Parked by the owner.

Deferred

  • stay @user, invite-link joins, audio in and out, and video streaming. The plan is in docs/voice.md. The basic voice actions exist; auto-leave and audio do not.
  • Client lightening. Low priority. The client must stay stable.
  • Web UI authentication and remote accounts. Accepted for now: no auth, LAN or Tailscale only.

Next

  1. Voice auto-leave (owner-based) is implemented. stay @user is deferred.
  2. Live verification on the audio host: TTS local + API, ducking, capture, and voice.join/ voice.leave end to end.
  3. Browser microphone puppeting: a mix sink so the browser mic and TTS share veskslop_mic, a pacat input path, and echo handling.
  4. Speech to text: Vosk (small CPU model in poc/models/) is wired and verified; add more languages or a larger model when needed. VESKSLOP_STT_CMD/_API_URL stay available.
  5. Notification parsing (edits, deletes, reactions, replies) and the reply-to-puppet trigger: done.
  6. Per-user rate limit and command cooldowns.
  7. Collector account: stripped-down read-only modules. Use it when the puppet cannot find a user's voice channel or the channel members.
  8. Local agent harness (agent/, Go + Eino): scaffold done and smoke-tested. Next: daemon task push (free-form triggers only; commands stay local), tool allowlist, per-conversation serialization with cancel-and-replace, delivery IDs, and tests against a fake model.
  9. Remote agent MCP path: a notification tool set for external systems, a documented LAN/Tailscale bind, and optional token auth on the MCP listener. See docs/agent.md.
  10. Mobile web UI: first draft at 390px with the four tabs (Users, Chat, Call, Activity) is implemented and rendered headless. Next: move the transcript into the Call tab, put the TTS box in the Call tab as in 1c, and verify with real data on a phone-width viewport.

Media archive follow-ups

TTS follow-ups

  1. HTTP provider voice discovery. TTS-DESIGN.md specifies GET /voices (id, name, language, gender, speed/pitch ranges) for the HTTP provider; Veskslop still lists voices from espeak or VESKSLOP_TTS_VOICES only. The command-provider path in use does not need it; implement when an HTTP engine with multiple voices is deployed.

Web UI follow-ups

Ordered after the voice backend unless the owner asks first.

  • Favourites, presence dots, and real member counts.
  • MCP tool-call tracing in the console Tool calls tab.
  • Transcript tab fed by the audio capture and STT.
  • Yield (stop mid-line) for TTS when a human speaks.
  • DM scope in the header (the guild picker becomes "Direct messages").
  • Message editing, deletion, reactions, and history pagination.
  • The remaining mockup screens: 7b/7c console details, 6b history window, 4b group chat, 2c state legend.

Open decisions

  • Web UI auth. Accepted: no auth, LAN or Tailscale only. Revisit before any wider exposure.

  • MCP event delivery. Parked. Options when it returns:

    1. Poll get_message_log and get_action_log with a since cursor. No new transport work.
    2. A stateful Streamable HTTP session. The server can send notifications.
    3. A separate local event stream over SSE or a WebSocket.
  • Untrusted logging. Untrusted interactions are ignored at this time. The separate 30-entry buffer exists but receives nothing. Decide whether to log untrusted DMs and mentions again.

  • Privacy pass. Only token-shaped and mfa. strings are redacted, and only in the persistent action log. Decide the fuller policy (retention, cache clearing, message redaction) later.

  • Update poc/src/test-trigger.ts: the core bridge rejects its debug.emit action (UNKNOWN_ACTION), so the live trigger test cannot run.

  • Install the Go toolchain (owner action, no sudo here) so agent/ can build, and add the respond-only mode branch plus the {reply} response to the harness.

  • Add a fake-server test for AgentClient (respond-only task push, timeout, error path).