Update docs for the debug web UI, voice plan, and current status
This commit is contained in:
+52
-8
@@ -6,12 +6,17 @@ The daemon runs outside Vesktop. It holds all logic. It talks to the core bridge
|
||||
|
||||
| File | Role | Status |
|
||||
| --- | --- | --- |
|
||||
| `poc/src/control-bridge.ts` | MCP server, tool list, health endpoint | Implemented |
|
||||
| `poc/src/control-bridge.ts` | MCP server, tool list, health endpoint, core reconnect | Implemented |
|
||||
| `poc/src/core-process.ts` | Start, stop, and restart the Vesktop core process | Implemented |
|
||||
| `poc/src/qr-session.ts` | Remote-auth QR login session (shared with the web UI) | Implemented |
|
||||
| `poc/src/auth-service.ts` | Auth state for the web UI | Implemented |
|
||||
| `poc/src/puppet.ts` | Trust list, command handling, trigger log, response policy | Implemented |
|
||||
| `poc/src/communication.ts` | Pure log, parser, and context logic | Implemented |
|
||||
| `poc/src/message-cache.ts` | Channel message cache in a tmp folder | Implemented |
|
||||
| `poc/src/action-log.ts` | Persistent JSONL action log with rotation | Implemented |
|
||||
| `poc/src/pacing.ts` | Paced queue and query coalescing | Implemented |
|
||||
| `poc/src/pacing.ts` | Paced send queue and read queries | Implemented |
|
||||
| `poc/src/webui.ts` | Web UI listener and JSON API | First draft |
|
||||
| `poc/public/` | Static web UI (HTML, CSS, JS) | First draft |
|
||||
| `poc/src/core-client.ts` | Client actions over the core bridge | Implemented (primary transport) |
|
||||
| `poc/src/cdp-client.ts` | Chrome DevTools Protocol client | Development fallback |
|
||||
| `poc/src/qr-login.ts` | Terminal QR login | Implemented and verified |
|
||||
@@ -33,9 +38,14 @@ the page, so it has no core-side guardrails. Use it for debugging only.
|
||||
|
||||
## Pacing
|
||||
|
||||
The daemon paces all commands. The policy is a random delay of 500 to 2800 ms. The queue
|
||||
serializes the commands. The queue coalesces identical concurrent reads. The daemon also prefers
|
||||
cached state over queries.
|
||||
The daemon paces all outbound sends. A send is `message.send` or `dm.send`.
|
||||
|
||||
- The first send of a burst waits 30 to 200 ms.
|
||||
- Later sends in the same burst wait 500 to 2800 ms.
|
||||
- A burst ends after a random 5 to 20 seconds of quiet. The next send is a fast first action.
|
||||
|
||||
Read queries are serialized with a small 100 to 300 ms gap. Reads do not reset the send burst.
|
||||
Identical concurrent reads are coalesced. The daemon prefers cached state over queries.
|
||||
|
||||
The core adds a second, hard rate limit. See [core-bridge.md](core-bridge.md).
|
||||
|
||||
@@ -50,6 +60,9 @@ The daemon exposes MCP over Streamable HTTP. The default address is `http://127.
|
||||
| `read_messages` | Read cached messages from a channel. |
|
||||
| `send_dm` | Send a DM to a user. |
|
||||
| `get_voice_state` | Which voice channel a user is in and who else is there. |
|
||||
| `get_voice_overview` | Occupied voice channels in a guild and their members. |
|
||||
| `search_users` | Search the client user cache by username, global name, or nickname. |
|
||||
| `list_dms` | List cached DM and group DM channels with recipients. |
|
||||
| `get_message_log` | Read the trigger log. |
|
||||
| `get_action_log` | Read the persistent action log. |
|
||||
| `run_commands` | Run several read-only tools in one call, in order. |
|
||||
@@ -63,9 +76,12 @@ The daemon exposes MCP over Streamable HTTP. The default address is `http://127.
|
||||
## Run commands
|
||||
|
||||
```sh
|
||||
# Start the daemon. It connects to the core bridge.
|
||||
# Start the daemon. It connects to the core bridge and starts the web UI.
|
||||
pnpm control:bridge
|
||||
|
||||
# Start the daemon with a different web UI port.
|
||||
WEBUI_PORT=18889 pnpm control:bridge
|
||||
|
||||
# Start a mock core for tests without Electron.
|
||||
VESKSLOP_SOCKET=/tmp/vesktop-puppet-mock.sock pnpm control:mock
|
||||
|
||||
@@ -84,12 +100,34 @@ pnpm cdp:probe
|
||||
CDP_EXPRESSION='...' pnpm cdp:dispatch
|
||||
```
|
||||
|
||||
## Core process
|
||||
|
||||
The daemon can start, stop, and restart the Vesktop client (`poc/src/core-process.ts`). The web UI
|
||||
Core tab and the `/api/core/*` routes use it.
|
||||
|
||||
- The spawn sets `VESKSLOP_HEADLESS=1` and `VESKSLOP_TOKEN_FILE` (the daemon token file).
|
||||
- The default command is `node_modules/.bin/electron .` from the repo root. `VESKSLOP_CORE_CMD`
|
||||
replaces it. `VESKSLOP_CORE_ARGS` replaces the default flags.
|
||||
- On Linux without a `DISPLAY`, the daemon starts Xvfb on the first free display from `:99` and
|
||||
points the client at it. An existing `DISPLAY` wins. `VESKSLOP_XVFB=0` disables auto-start.
|
||||
- The status holds the last exit code and signal, and the last 20 output lines. The Core tab shows
|
||||
both, so a failed start explains itself.
|
||||
- The daemon stops a client that it started, and any Xvfb it started, when the daemon exits. An
|
||||
externally started client is reported as `external` and is not managed.
|
||||
- When the core bridge drops, the daemon retries every 2 s. A restart moves the bridge connection
|
||||
to the new client. The in-memory trigger log resets; the state file and the action log survive.
|
||||
- QR login lives in `poc/src/qr-session.ts` and is shared by the terminal tool and the web UI.
|
||||
See [auth.md](auth.md).
|
||||
|
||||
Verified live on 2026-09-13: the web UI started the client under auto-Xvfb, the bridge connected,
|
||||
`state.get` returned the real account and guilds, and stop exited with code 0.
|
||||
|
||||
## Health endpoint
|
||||
|
||||
`GET /health` returns the CDP state, the owner ID, and the query count.
|
||||
`GET /health` returns the core connection state, the socket path, the owner ID, and the query count.
|
||||
|
||||
```json
|
||||
{ "ok": true, "cdpConnected": true, "ownerId": "177117296140091393", "queries": 4 }
|
||||
{ "ok": true, "coreConnected": true, "socketPath": "/run/user/1000/vesktop-puppet.sock", "ownerId": "177117296140091393", "queries": 4 }
|
||||
```
|
||||
|
||||
## Settings and paths
|
||||
@@ -103,6 +141,10 @@ CDP_EXPRESSION='...' pnpm cdp:dispatch
|
||||
| `VESKSLOP_CACHE_DIR` | `<tmp>/veskslop-cache` | Context cache folder |
|
||||
| `VESKSLOP_CACHE_MAX_BYTES` | 50 MiB | Context cache size limit |
|
||||
| `MCP_HOST` / `MCP_PORT` | `127.0.0.1` / `8788` | MCP listen address |
|
||||
| `WEBUI_HOST` / `WEBUI_PORT` | `0.0.0.0` / `8789` | Web UI listen address. No authentication. |
|
||||
| `VESKSLOP_CORE_CMD` | unset | Full command that starts the client. Overrides the default. |
|
||||
| `VESKSLOP_CORE_ARGS` | `--no-sandbox --disable-gpu --disable-dev-shm-usage` | Flags for the default Electron command. |
|
||||
| `VESKSLOP_XVFB` | unset | Set to `0` to disable automatic Xvfb start on Linux. |
|
||||
|
||||
## How to add an MCP tool
|
||||
|
||||
@@ -115,6 +157,8 @@ CDP_EXPRESSION='...' pnpm cdp:dispatch
|
||||
## Security notes
|
||||
|
||||
- The MCP server binds to localhost by default.
|
||||
- The web UI binds to all interfaces by default and has no authentication. Use it over LAN or
|
||||
Tailscale only. Do not expose the port to the public internet. See [webui.md](webui.md).
|
||||
- Remote access must go over LAN or Tailscale. Do not expose the daemon to the public internet.
|
||||
- The daemon holds no Discord credentials. The client holds the session.
|
||||
- The daemon token file is separate from the client session. See [auth.md](auth.md).
|
||||
|
||||
Reference in New Issue
Block a user