The connector only drove web pages. Add-on sidebar panels — Aegis's wallet, Hermes's messenger, Pithos's storage panel, anything with a sidebar-panel capability — were walled off: list_tabs skipped them and webContents() refused anything that was not kind:"web". Panels are now first-class tabs with a negative id, kind:"panel", and an addon/panelId pair. Each open panel is listed next to the real tabs; a closed one is still listed so a client can see what exists. screenshot / snapshot / read_page_text / click / type / press_key / paste_html / paste_text / wait_for / upload_file / evaluate all work on them with the same TabDriver a web page uses. navigate / activate_tab / close_tab refuse panels — the user owns panel visibility, not the connector. Approval is per add-on under a synthetic theseus-panel://<addon> origin, so Aegis is approved once and every Aegis panel is reachable from then on. The approval modal titles itself "Let Claude control the Aegis panel?" when the origin is a panel origin, and the body explains the panel is read, not the whole browser profile. Origin pinning is skipped (the panel is served from the add-on scheme and never navigates under us); password-field refusal and the action log still apply, so a PIN input in a wallet panel is never typed into and every call is in the connector's log. |
||
|---|---|---|
| .. | ||
| lib | ||
| addon.json | ||
| index.js | ||
| panel.html | ||
| README.md | ||
| stdio-shim.cjs | ||
Claude connector
Built-in Theseus extension: a local MCP server through which Claude Code or Claude Desktop works in the user's tabs. Setup and safety model are in the Theseus README ("Claude connector (MCP)") and DESIGN-claude-connector.md.
| file | role |
|---|---|
index.js |
activation, settings (add-on store), server start/stop, panel messages |
lib/mcp-server.cjs |
Streamable HTTP + JSON-RPC, token, Host/Origin guards, sessions, SSE presence |
lib/tools.cjs |
tool definitions and handlers; resolves tabs through api.tabControl |
lib/tab-driver.cjs |
one tab over its own webContents.debugger (CDP 1.3) |
lib/policy.cjs |
site approvals, upload-folder checks, password-field detection |
lib/clipboard.cjs |
put / save / restore the system clipboard around a paste |
lib/clients.cjs |
"Connect": registers the connector with Claude Code (its CLI, user scope) and Claude Desktop (its config file), reports status, re-registers after token/port changes |
lib/action-log.cjs |
timestamped action log (panel + actions.log) |
panel.html |
the sidebar panel |
stdio-shim.cjs |
stdio ⇄ HTTP relay for Claude Desktop, run by Theseus in Node mode |
Stored in <userData>/extensions-data/claude-connector.json (token, port,
switches, approved origins, upload folders) and
<userData>/extensions-data/claude-connector/ (endpoint.json while
listening, actions.log).
Needs the host's tab-control capability, which only built-in add-ons get.
Turning any extension on or off restarts every add-on, this one included,
which ends the connected clients' sessions. A client that does not start a
new session by itself reconnects from its MCP menu (/mcp in Claude Code).