Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback) - #65

Merged
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom
Jul 27, 2026
Merged

Context-tree top panel, vault browser, zoom fixes, framed paste fallback (Aaron's feedback)#65
kateebonner merged 6 commits into
local/amicodefrom
kate/context-tree-vault-zoom

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements all three items of Aaron Trowbridge's 2026-07-26 feedback, plus the API-key paste fix Kate requested overnight.

1 · Knowledge graph → top panel, redesigned as the agent's context tree (ADR 0003)

  • The inline brain strip is removed from the message timeline (TimelineRow.Brain deleted; ADR 0002's background direction marked superseded).
  • New pinned, collapsible panel between the session header and the chat: a left-to-right tidy tree of the agent's actual context — root = amico, branches = turns (roman plates + prompt excerpt), leaves = the distinct markdown/source/skills/agents each turn pulled in. Re-touched items dedupe into thin recall links; marathon sessions fold old turns into one earlier branch.
  • Interactive: hover raises labels; clicking a file node opens the real file — project files as a session file tab (same flow as the file tree), vault files land directly in the Vault panel. Wheel zooms about the cursor, drag pans, double-click refits. The log's hover-glance events still work against the tree.
  • New purpose-built engine context-tree-engine.ts (declarative setTree, hit-testing, DPR-change-aware, reduced-motion) + pure context-tree-data.ts builder — 20 headless tests.

2 · The vault lives in the interface

  • New read-only raw routes beside the mount list: GET /amicode/vault-files (recursive listing; skips dotfiles/machinery; symlinks that escape the mount are not listed) and GET /amicode/vault-file (single read; real-path traversal guard; 512 KB cap; binaries listed but marked unreadable). 14 server tests incl. traversal/symlink adversarial cases.
  • New Vault panel drawer: mount chips → file tree → inline Markdown/source viewer. Entry points: titlebar vault button (both titlebar variants), command palette (Toggle vault panel), and context-tree clicks on vault nodes (deep-links to the file).

3 · Command zoom fixes (all hosts)

  • Web/amicode host had no in-app zoom at all — added CSS-zoom-based webviewZoom for platform: web with palette commands Zoom in / out / reset (⌘= / ⌘− / ⌘0), persisted per-window; titlebar + terminal already consume the signal.
  • Canvas blur after zoom: both engines now watch devicePixelRatio changes (webview zoom changes DPR without a resize) and re-arm per change.
  • Desktop: zoom factor now persists across relaunch/new windows; macOS menu items dropped their native roles (they fought the renderer keydown over ⌘=/−/0 with mismatched step math and a stale signal) — one action path on every platform; setZoom now notifies the renderer.
  • Canvas hit-testing normalizes by the rendered rect so picks stay true at any zoom.

4 · API-key paste fix (Kate, overnight report)

In any framed host without the amicode relay (VS Code Simple Browser at :3002, plain embeds), the clipboard fallback preventDefaulted native paste, posted a clipboard-request into the void, timed out, and inserted nothing — credential fields pasted dead, silently. An empty/timed-out bridge reply now falls through to navigator.clipboard.readText() — restores paste wherever the host grants clipboard-read; the VS Code webview bridge is unchanged and still wins when it answers. If your repro was elsewhere (e.g. the native Connect Cloud input box, which only appears when no server is up), say where and I'll chase that path too.

Also

  • docs/design/agentic-surfaces.md — the agentic-static-elements proposal for you and Aaron to react to (tiered architecture, surface inventory, open questions). No implementation.
  • CONTEXT.md glossary updated (Context tree + Vault panel; Brain/Glass retired), ADR 0002 marked superseded.

Verification

  • Typecheck clean: app, ui, opencode, desktop. Lint: 0 errors. Build: green.
  • Tests: app 442 ✓, ui 345 ✓, new server tests 14 ✓. The full opencode suite has ~18 pre-existing env failures (widget-src temp-dir dynamic imports, recorded-LLM fixtures, two long timeouts) — verified identical with this branch's changes reverted, i.e. not introduced here.
  • Multi-agent adversarial review ran over the diff; both surviving findings (symlink listing leak, mount-name shadowing) are fixed with regression tests.

🤖 Generated with Claude Code

kateebonnerand others added 2 commits July 27, 2026 03:30
Aaron's 2026-07-26 feedback, all three items:
1. Knowledge graph moves from the inline timeline strip to a pinned top
panel, redesigned as the agent's interactive context tree (ADR 0003).
2. The vault and all its files live in the interface: read-only Vault
panel over new /amicode/vault-files + /amicode/vault-file routes.
3. Command zoom fixes across hosts: in-app zoom + palette commands for
the web/amicode host, canvas DPR-staleness blur fix, desktop zoom
persistence, macOS menu-role collision, setZoom notify. Plus the
agentic-surfaces design proposal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review findings: the vault listing no longer follows symlinks out of the
mount (metadata leak), and duplicate mount names resolve to the dir named
like the id instead of silently shadowing.
Paste fix (Kate's report): in any framed host WITHOUT the amicode relay
(VS Code Simple Browser at :3002, plain embeds), the clipboard fallback
preventDefaulted native paste, posted into the void, timed out, and
inserted nothing — API-key fields pasted dead. An empty/timed-out bridge
reply now falls through to navigator.clipboard.readText(), restoring
paste wherever the host grants clipboard-read; the VS Code webview bridge
path is unchanged and still wins when it answers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner
kateebonner marked this pull request as ready for review July 27, 2026 15:17
kateebonnerand others added 4 commits July 27, 2026 11:40
…l renders
The sticky header's pb-4 exists to seat the entity-chip rail; sessions
with no amicode tool parts kept the full reserved band under the title.
The rail's session gate is now exported and shared, so the header drops
to a slim pb-2 fade tail exactly when the rail will not mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Upload PDF and Discuss latest sat side by side; Kate wants them stacked.
Applied to the live dashboard widget (widgets-src/library.ts) AND the
app-side LibraryCard so the two renderings stay in parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… prompt
The tree was its own card above the timeline; it now closes the sticky
header block beneath the title row and entity chips, on the header's
solid ground, and only renders once the session holds context.
Turn grouping bug (Kate): one ask spanning several assistant messages
charted duplicate roman-numeral branches with the same excerpt — turns
now group by the parent user message.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vault contents are proprietary knowledge (team mounts hold unpublished
results); browsing is a local-researcher capability, not a server API.
The routes now refuse on any non-loopback bind — the same bind signal
the credential-mutation guard rides — with AMICO_VAULT_BROWSER=1/0 as
the explicit override, and a mount can opt out entirely via
browse = false in its .amico-vault.toml. Agent read grants unaffected.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@kateebonner