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.
74 lines
3.9 KiB
Markdown
74 lines
3.9 KiB
Markdown
# 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](home.html) `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](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 "<addon> 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.
|
|
|
|
- Android / mobile: [../AriadneResolver/mobile/app/AndroidManifest.xml](../AriadneResolver/mobile/app/AndroidManifest.xml),
|
|
[BchFetcher.java](../AriadneResolver/mobile/app/src/com/silentmode/ariadne/BchFetcher.java),
|
|
[Bns.java](../AriadneResolver/mobile/app/src/com/silentmode/ariadne/Bns.java),
|
|
[build.ps1](../AriadneResolver/mobile/build.ps1) — mobile-side collision changes.
|
|
- Repo-wide: `.gitignore` gained a `/.keys/` line (harmless).
|
|
|
|
## 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](GOTCHAS.md) for the release
|
|
gotchas.
|