theseus/PENDING.md
Theseus Dev b4cea7b83f Theseus 0.3.130: startpage sidebar fills the panel, searchbar stops auto-growing, Store Claude Desktop detected
Startpage sidebar is now a real left column that starts at the Theseus
title's top edge and runs the full page height. The slot grid is 3
columns stretched to the full sidebar width, with enough rows to cover
the sidebar vertically (count derived from the main column's height on
each render, and re-derived on viewport resize). Empty cells sit as
semi-transparent dashed outlines in the exact position a filled tile
would occupy, so the grid reads as one uniform surface; any empty cell
doubles as the "add link" surface and clicking it opens the Add-link
modal with that cell pre-pinned, so new links land exactly where the
click did instead of being pushed to the end. The dedicated "+" button
is gone — the pin-location is the click target. A "Theseus v0.3.X —
What's new" link appears under the search tip, pointing at
silentmode.st/releases; version comes from a new getVersion exposed on
window.home over the existing app-version IPC.

Chrome toolbar: 0.3.128's "give the searchbox more room while typing"
rule is removed — focusing the search field was pulling the drag handle
with it, which made the URL / search ratio impossible to set by hand.
The URL bar now caps at 75% of the pair's shared budget via a hard CSS
max-width (so a wide urlBarWidthPx stored under the old 80% ceiling
clamps on load without the user having to re-drag), and the drag floor
matches at 25 % so the search field always keeps at least a quarter of
the pair.

Claude connector: bumped bundled-addons/claude-connector from 0.2.0 to
0.2.1. The clients.cjs Store-install detection and the panel-access
work shipped in 0.3.129's bundled 0.2.0, but seedBundledAddons only
overwrites the installed copy when the bundle is strictly newer, so
every user with an existing 0.2.0 kept the stale pre-fix copy from
%APPDATA%/Theseus/extensions/claude-connector/. The version bump
surfaces the Store-install detection ("Claude Desktop not installed on
this computer" was false on every Microsoft Store install) and the
add-on-panel approvals split in the connector panel, both of which
were already in-tree but gated behind the version check.
2026-10-29 14:46:29 +02:00

152 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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-29.
---
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.129)
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: Searchbox no longer auto-grows on focus; URL/search ratio
capped at 75/25.** Reverts the 0.3.128 "give the searchbox more room
while typing" rule — focusing the searchbox was pulling the drag handle
with it and making the ratio hard to set by hand. Changes in
[chrome.html](chrome.html): dropped the
`.urlsearch:has(.searchbox:focus-within) .searchbox { flex: 2 1 480px }`
rule and its `.14s` transition on `.searchbox`; added
`max-width: 75%` to `.urlwrap` so a stored `urlBarWidthPx` from the old
80 % ceiling clamps on load without the user having to redrag; bumped
the drag `MIN_SHARE` 0.20 → 0.25 so new drags can't push the search
bar below 25 % of the shared budget. 0.3.128's typing-wider effect
stays off; the user owns the ratio again.
- **LANDED: Startpage sidebar runs the full page height alongside the
hero; slots fill the whole sidebar panel; empty cells double as the
"add link" surface.** [home.html](home.html):
- **Page layout restructured.** Hero + homepage are now wrapped in a
single `.page` grid (`grid-template-columns: minmax(240, 280) 1fr`)
with the sidebar `<aside>` as a true left column and `.main-col` on
the right holding the hero on top of the SM cards. The sidebar's
top edge now aligns with the Theseus logo + search box instead of
starting below them. Hero top padding dropped (page handles it);
hero stays centered inside the main column.
- **Sidebar fills the panel vertically.** `.sidebar { align-self:
stretch }` makes the aside match the main column's height.
`.slots-list { grid-template-columns: repeat(3, 1fr); width: 100% }`
stretches cells to the sidebar's full width (icons stay 48 px,
centered inside the wider cell; labels gain `max-width: 100%` so
they center over the cell). A new `minSlotsForFill()` computes row
count from `.main-col` height on each render; a ResizeObserver
re-renders on viewport resize so new rows appear (or drop off) as
the window changes.
- **Empty tiles top-aligned.** `.slot-empty` switched to
`flex-direction: column; justify-content: flex-start` so the dashed
tile sits at the top of its 72×68 cell — same Y as a filled slot's
`.tile` (which sits above its label). Before this the dashed box
was centered in the cell while filled tiles were top-aligned, so
the two read as misaligned.
- **Chromeless sidebar.** `.left-column` renamed to `.sidebar`,
`.right-column` renamed to `.cards-wrap`; the new `.section.chromeless`
modifier removes background, inset border, and padding box on the
sidebar so it blends with the page body. The SM cards area keeps
its soft panel (the cards area is "the rest of the page", not the
sidebar).
- **Dedicated `.slot-add` cell removed; dashed outline semi-transparent.**
`.slot-empty::before` has `content: ""` (no "+" glyph) and renders at
.18 opacity on container hover, .35 on this-cell hover, strong acid
only on drop-hot — so empty cells never compete visually with the
real icons. Clicking any empty cell opens the Add-link modal with
that cell's index pre-pinned (`openModal(sec, i, pinSlot)` carries
the pin through `editKey` to the save handler), so the new link
lands exactly where the user clicked.
- `layoutSlots()` default `minSlots` still 18 (fallback for the first
render before layout is measured); render() passes the dynamic
value from `minSlotsForFill()` which uses it as a floor.
- **LANDED: Startpage shows running version + link to release notes.**
New line under the "Tip: hello.bch" hint on [home.html](home.html):
"Theseus v0.3.X — What's new ↗", linking to
`https://silentmode.st/releases`. Version comes from
`window.home.getVersion()` (added to [home-preload.js](home-preload.js);
wired to the existing `app-version` IPC — no new backend). Visible on
every startpage load so a user who just updated has a one-click path to
the changelog without hunting for a chrome chip that only shows when a
NEWER version is out.
- **LANDED: Claude connector detects Microsoft Store install of Claude
Desktop.** [bundled-addons/claude-connector/addon.json](bundled-addons/claude-connector/addon.json)
bumped from 0.2.0 to 0.2.1 so Theseus's `seedBundledAddons` reseeds the
stale copy sitting in `%APPDATA%\Theseus\extensions\claude-connector\`
on first boot of the next Theseus. The actual detection code (Store
package path under `%LOCALAPPDATA%\Packages\Claude_<pub>\LocalCache\
Roaming\Claude\` + fallback to `AnthropicClaude` / `Programs\Claude` /
`Program Files\Claude`) is already in the tree in
[bundled-addons/claude-connector/lib/clients.cjs](bundled-addons/claude-connector/lib/clients.cjs);
it just wasn't reaching installed users because the addon version
hadn't been bumped — `seedBundledAddons` skips the overwrite when
user version >= bundle version. User-visible symptom: the connector
panel showed Claude Desktop as "Not installed on this computer" on
every box where Claude Desktop is the Store install (which is the
default modern install).
- **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.