theseus/PENDING.md
Hermes Dev a04775ad0d Claude connector panel: split site approvals from add-on-panel approvals
Site approvals and panel approvals share one allowedOrigins list on
disk because the policy is one SitePolicy either way, but on screen
they are two different things: a URL you signed in on versus an
Aegis sidebar panel you unlocked. The panel showed them in one mono
list under "Sites Claude may control", so an Aegis approval read as
"theseus-panel://aegis" with no label and no clue it was a panel at
all.

publicState() now splits allowedOrigins into allowedSites (web
origins) and allowedPanels (theseus-panel://<addon>, enriched with
the add-on's own title via api.tabControl.list()). The panel.html
renders them in their own sections: "Sites Claude may control" and
"Add-on panels Claude may control", the latter hidden when nothing
is approved. Each panel row shows the add-on title in bold with the
mono origin as a subtitle. The ✕ button goes through the existing
remove-origin IPC — removing either kind takes one call.

The renderer falls back to deriving the split from allowedOrigins so
a UI loaded against an older host still renders both sections.
2026-10-29 00:32:51 +02:00

3.9 KiB

Pending — uncommitted Theseus changes

Working-tree state that hasn't been committed or shipped. Read this before touching the same files. Update when you land or add work.

Format: each group has a session: label so parallel sessions can see what belongs to whom and coordinate. Naming convention: YYYY-MM-DD:short-slug for date-bounded work, or parallel:<theme> for work owned by a session that isn't the current one.

Last updated: 2026-10-28.


Releases are no longer recorded here: the live version and hashes are in ../site/releases-manifest.json and https://dl.silentmode.st/releases-manifest.json, and each release commit is Theseus 0.3.x: ... in git history.

Staged for the next release (post-0.3.128)

Queue of asks for the next cut. Items marked LANDED are edited in the working tree waiting for a bump + build. Items marked TODO still need the code change.

  • TODO: Home — swap SilentMode.X out, Game.X in on the Silent Mode cards section (home.html:366-375 defaultState().sections.sm). Game.X should pick up its own description + favicon from the live site, so the entry is a stub ({ title: "Game.X", url: "https://game.x/", brand: "game" }) until game.x goes live. SilentMode.X moves to a short link somewhere else — the user suggested either under the search field, at the bottom of the home page, or in the quicklinks (sections.q). The canonical remote list at https://dl.silentmode.st/home-cards.json needs the same swap so existing profiles pick it up without a reset (local sections.sm isn't reseeded by migrateCards — the remote cache is the only way through to installed users). game.x isn't resolving yet (no s3 pointer on-chain, no manifest); wait until the service is up before baking its description/favicon.
  • LANDED: Claude connector reaches add-on sidebar panels (Aegis, Hermes, Pithos, and any other sidebar add-on). The tab-control hook now exposes each open panel as a tab with a negative id, kind: "panel", addon and panelId fields (main.js panelCtrlEntries / tabControlHook.list). The connector's use() branches to _usePanel, approves control under a synthetic theseus-panel://<addonId> origin (one approval covers every panel owned by that add-on), skips origin pinning (panels load from the add-on scheme and never change under us) and drives the panel's webContents with the same TabDriver as a web tab. navigate / activate_tab / close_tab refuse panels — the user owns panel visibility. The approval modal says "Let Claude control the Aegis panel?" when the origin is a panel origin. list_tabs returns closed panels too so a client can see what exists; webContents(-N) throws " is not open; ask the user to open the panel from the sidebar first" until the user docks it. Password-field refusal and the action log still apply. The connector panel.html now splits site approvals from panel approvals into their own sections, with the add-on's own title ("Aegis panel") above the mono origin string and a ✕ Remove button that goes through the existing remove-origin IPC.

session: parallel:collision-policy

Owner's focus: BCNR ↔ ICANN name collision handling. Not mine — leave for that session to land or bundle by explicit ask.

Live state

Shipped hashes live at ../site/releases-manifest.json and https://dl.silentmode.st/releases-manifest.json. On-chain pointer at releases.silentmode.bch. See GOTCHAS.md for the release gotchas.