Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily
, '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

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily
, '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

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily
, '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

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily
, '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

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily
, '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

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily
, '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

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily
, '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

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001) - #106

Merged
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev
Aug 1, 2026
Merged

Consolidation: upstream v1.18.10 + all fork follow-ups (workbench split, webview bridges, ADR 0001)#106
aarontrowbridge merged 1300 commits into
local/amicodefrom
amicode/merge-upstream-dev

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Consolidation: upstream v1.18.10 + all fork follow-ups (the "where we are now" PR)

This lands the entire current state of Amicode's app on local/amicode in one merge: the sst/opencode v1.17.3 → v1.18.10 upstream merge (1,229 upstream commits, merge-base 2026-06-10) plus every fork follow-up since, including the work that until today only existed as uncommitted WIP on one laptop. ~1,300 commits ahead of local/amicode; fast-forwardable. The running 0.1.2 extension vendors this exact tree (built from bcefef8a1).

What's in it

  • The upstream merge — full notes in AMICODE-PATCHES.md (78 conflicts resolved by policy; session-ui package split adopted; fork's branding/KaTeX/entity-rail/titlebar strip kept).
  • Workbench split panes (feat/workbench-split, merged as e7cf0cca0) — the fork side of the Chat Deck: SplitProvider/WorkbenchProvider on SharedProviders, pane-namespaced tab stores (tabs:<paneId>), openPath/closePath cross-pane tab commands, tab-drag bridging, workbench panel + split frame, 3 new Playwright specs (pane-boot-watch, workbench-drops, workbench-panes).
  • Webview bridge fixes (fix/webview-bridges, merged as 437c37778) — copyTextToClipboard (session-ui twin) reviving dead copy buttons in the sandboxed iframe; ConnectionBanner + streamStatus so a dead server stops reading as an endless thinking wave; webview context menu; text-selection selectors. Superseded hunks (openLink/installLinkBridge, 15s heartbeat timer) deliberately dropped — see commit message.
  • ADR 0001 (docs/adr/) — one home per chrome surface (the titlebar-buttons design-of-record, Titlebar chrome: one home per surface (vault drawer · Work Column · status popover) #105) + CONTEXT.md chrome glossary.
  • i18n parityconnectionLost/reconnected English fallbacks in all 16 missing locales.

Supersedes (their commits are all in here — close on merge)

Build recipe (unchanged, from AMICODE-PATCHES.md)

bun 1.3.14 with ~/.bun/binon PATH (tree-sitter-powershell's node-gyp re-invokes bun by name — plain ~/.bun/bin/bun install fails); OPENCODE_CHANNEL=dev for the channel gate.

Verification (this branch, this machine)

  • bun run typecheck clean in packages/app and packages/session-ui (e2e tsconfig too)
  • App suite (env -u OPENCODE_CONFIG_CONTENT -u OPENCODE_SERVER_PASSWORD bun test …): 756/756 green — the env unset is required from an Amicode shell or skill/permission fixtures break

Known reds (pre-existing — do not chase them here)

  • pasqal connections (8) + amicode widgets (15) fail identically on origin/local/amicode (WIP features)
  • httpapi-v2-pty "serves location-wrapped PTY routes" times out ~1-in-3 on clean upstream on this machine

opencode-agentBotand others added 30 commits July 20, 2026 22:52
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com>
…(#37562)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
Co-authored-by: tobwen <1864057+tobwen@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com>
Co-authored-by: opencode <noreply@opencode.ai>
fwangand others added 27 commits July 31, 2026 13:15
471-commit fork sync: 78 conflicted paths resolved — mechanical (versions,
lockfile) by policy, ~40 files hand-merged. Upstream's session-ui restructure,
review/diffs side panel, controller-driven composer + settings, AppNodeBuilder
test harness, bounded SSE stream + heartbeat all adopted; amicode identity
re-applied (branding, KaTeX macros, AmicoSpinner sites, vault tab, entity
rail card dispatch, titlebar tab strip, prompt-agnostic cassette matcher).
Fork's markdown polish + entity-rail message-timeline mounts intentionally
dropped with upstream's deleted files — ports tracked as follow-ups.
DebugBar stays deleted; showSessionProgressBar row dropped (consumer gone).
Verified: typecheck green (ui, session-ui, app, opencode, server, desktop);
tests green (ui amicode 358, session-ui moved modules 11, opencode transform
397, llm-native-recorded 3+1skip).
…tream event contract
- locales: fill 72 amicode-era English keys into all 17 app locales as
English fallbacks (upstream's strict i18n parity test now demands every
key in every locale; placeholders preserved verbatim). Non-English
translations remain deliberately unreviewed per AMICODE-PATCHES.md.
- prompt.ts silent-turn guard: fire only on reasoning-bearing turns with no
error — a mid-stream provider explosion records finish 'unknown' with no
error and no reasoning, and upstream's run-process tests lock 'end the
run' for exactly that shape. Guard's live-bug target (reasoning-only
turns on open-weight models) unchanged; turn-output tests green.
- server/handlers/event.ts: revert to upstream's native per-event-location
contract (bounded stream + heartbeat). Upstream superseded the fork's
connection-pinned streams; the app's event-reducer already filters
per-directory client-side.
Full opencode suite: 24 fails remain = 23 pre-existing fork WIP tests
(pasqal connections 8, amicode widgets 15 — fail identically on
origin/local/amicode) + 1 upstream-flaky PTY timing test (flakes on clean
upstream at the same rate on this machine).
…ine + port normalizeDisplayMath
The merge deleted the fork's message-timeline.tsx with upstream's rewrite,
orphaning the mounts that lived there. Re-mounted into
pages/session/timeline/message-timeline.tsx (same sticky header slot):
- AmicodeEntityRail (System/Formulation/Run chips) with full widgetHost,
fetch props, onAsk bridge (ask-card buttons can submit again),
onInspectRun, retry/unavailable labels
- the ring-2 entity dialog (AmicodeEntityView) with open-gated resources
- ContextTreePanel (the brain), folded into the header as before
Verified not lost (alive elsewhere): RunWindow + WidgetPreviewCard render
inside card.tsx's tool dispatch; the markdown CSS polish converged
independently upstream (heading hierarchy + inline-code chips already in
session-ui's markdown.css — no port needed).
Ported normalizeDisplayMath (mid-line-opened multi-line $$ display math)
into session-ui's markdown-stream + wired into the block parse path, with
the fork's pure-function tests. Typecheck green app+session-ui; markdown
suites 39 pass.
Note: packages/app SSR test failures ('use' not found in solid-js/web
server build) reproduce identically on clean upstream on this machine —
bun/solid-js environment issue, not merge-related.
…model + receipt-currency
Brings in the harmonic wave indicator (AmicoWave — thinking line carries the
wave, H-mark static; tool-status-title de-shimmered), collapsed identical
receipt runs (receipt-runs.ts), AmicoSkillChip, Quantizing/Obsidianing
thinking words, system-card physics rows, receipt-currency fix.
Conflicts: AMICODE-PATCHES.md (union both entries), session-ui
message-part.tsx (union upstream's useV2Actions threading with the branch's
count threading), tool-status-title import (branch's de-shimmer). New shims:
amicode-receipt, amicode-receipt-runs (session-ui imports through the
components wildcard as usual).
…r open-external bridge
Upstream's openExternal platform method gains the branch's framed-context
postMessage route (sandboxed webview can't window.open). The branch's global
installLinkBridge interceptor is dropped — patch #25's markdown-delegated
setupExternalLinks already handles chat anchors without double-firing.
…l card
Warrant chip + Inspect Run button on the rail, approval card (warrant
transport deliberately off onAsk — provenance stays out of the chat), rail
warrants/onApprove props wired through the timeline mount with
/amicode/warrants fetch + /amicode/approve POST + ledger-driven refetch.
Union with HEAD's INLINE_KINDS receipt import and beta-tag CSS.
… system-card physics rows, KaTeX dedupe
The parallel stack to pr/amico-working-indicator; message-part conflicts all
resolved to the already-merged union (useV2Actions + count + shims). Net-new
content: system-render physics rows + Hamiltonian render + equation dedupe
(the spine and aside-lane commits cancel against their own reverts).
…unt in the new timeline
Root cause of 'harmonics thinking indicator missing': the working lane lived
in AssistantParts, which upstream's new timeline never renders (Message →
AssistantMessageDisplay has its own part loop). AssistantParts was dead code,
so rolldown DCE'd it and the whole amicode-thinking/amico-wave import chain
out of the bundle. The new-architecture working indicator is the Thinking
row (TextShimmer) — the Amico thinking line (AmicoWave glyph + gerund +
elapsed/tokens) now mounts there, with turn tokens computed from the turn's
assistant messages. AmicoMark static beside it (pr design: wave carries the
motion).
…view, patch #11 parity)
The legacy composer's ⌘V bridge survived the merge but upstream's v2 composer
is what the new layout renders — its paste path had no bridge hooks, so paste
was dead in the webview. session-ui attachments gains readClipboardText + a
handleFramedPaste method (image-first precedence, same as handlePaste);
interaction.ts intercepts ⌘V in framed contexts; the app wires the bridge
(bridge-first image read with platform fallback, text via readClipboardViaBridge).
…ver the wordmark
Upstream's NewSessionView renders the giant full-width WordmarkV2 only; the
fork's composition (MarkDetailed w-24 + small Logo, Kimi-clean ordering,
patches 594d117/75aca7c83) lost its mark when the page moved to upstream's
structure. Restores MarkDetailed (the H-robot, neutral ink) above a w-52
wordmark — composer-as-hero, matching the fork's design exactly.
The chip row was pinned to the screen bottom (merge-artifact mount) with a
mostly static set. Now it rides inside NewSessionView's hero flow (brand →
composer → chips, the Kimi ordering) via a gettingStarted slot, and the set
is computed: Resume (most recent problem) → Warm-start (recent with a pulse
entity) → Retry (recent run without a pulse) → static starters padding to 3,
capped at 4. Static-only when the profile is fresh. AmicodeStarterChips
accepts a computed list with the legacy static path as fallback.
The design-of-record for fixing the titlebar's three right-side buttons:
vault = global drawer (session tab retired), right column = Work Column
with diffs as full-width file tabs, status popover re-anchored honestly.
Tracking: #105
… bridge, drop zones, e2e
The fork side of the Chat Deck: SplitProvider + WorkbenchProvider wrap the
v2 shell; pane-namespaced persisted tab stores (tabs:<paneId>); openPath/
closePath cross-pane tab commands; tab-drag bridging (pane-bridge) with
the parent's tab mirror resolving drops; workbench panel + split frame;
titlebar sessions-panel toggle (S1.4), ellipsized pane tabs (FM4/S1.3).
Playwright: pane-boot-watch, workbench-drops, workbench-panes.
Brings the deck's fork-side machinery (feat/workbench-split, 7dc4a8e —
SplitProvider/WorkbenchProvider, pane-namespaced tab stores, openPath/
closePath cross-pane tab commands, tab-drag bridging, workbench panel +
split frame, 3 Playwright specs) onto the merged 1.18.10 base.
Conflict resolutions (semantic, all typechecked):
- app.tsx: providers grafted onto SharedProviders around the route tree —
covers legacy + v2 shells (createSimpleContext.use throws providerless).
- tabs.tsx: pane-namespacing composed with the merge's Persist.window scope
and migrateTabs module; openPath drops dirBase64 (SessionTab lost the
field post-merge); base64Encode import dropped (HEAD rewrote
sessionHasOpenTab without it).
- entry.tsx: kept the merge's adjudicated openExternal bridge; the WIP's
openLink + installLinkBridge were deliberately NOT carried (double-fire,
comment in situ); back/forward Platform slots no longer exist upstream.
- new-session/home/session: kept the merge's controller structure; added
only the deck's postRouteInfo route-label bridges.
- workbench-panel.tsx: sync().child — useServerSync is an accessor post-merge.
…nner, context menu
copyTextToClipboard (ui twin of the app's bridge helper) rewires the
message-part copy button, which was dead in the sandboxed iframe;
ConnectionBanner surfaces a dead server instead of an endless thinking
wave; webview-context-menu; markdown/terminal/server-sdk bridge touch-ups;
en+zh i18n keys.
Triage results (fix/webview-bridges, 60d0242 — 14 files, +361):
LIVE, kept:
- copyTextToClipboard: session-ui twin (ui exports only components/*.tsx, so
util/clipboard is unreachable across the boundary); rewires the message-part
copy button, tool-error-card copy, and markdown code-block copy — all dead
in the sandboxed iframe.
- ConnectionBanner + streamStatus: composed onto the merge's protocol-aware
(v1/v2) SSE subscription; banner accessors fixed for the post-merge shape.
- webview-context-menu; select-text selectors for text/user-message/reasoning
parts; en+zh i18n keys.
SUPERSEDED, dropped:
- openLink/installLinkBridge/back/forward Platform slots (merge adjudicated
openExternal; upstream dropped the slots).
- 15s SSE heartbeat timer (upstream's bounded SSE heartbeat governs liveness;
two abort clocks would fight).
- ui/markdown.tsx edit (file moved to session-ui; change ported there).
…ales
The ConnectionBanner keys landed in en+zh only; the strict parity test
demands every English key in every locale — English fallbacks, verbatim,
per the merge's parity policy.
@aarontrowbridge
aarontrowbridge merged commit cbea9f6 into local/amicodeAug 1, 2026
1 of 4 checks passed
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.

20 participants

@aarontrowbridge@OpeOginni@mreso@rekram1-node@arvsrn@fwang@dbpolito@MrMushrooooom@Brendonovich@dleopold@remixz@kitlangton@ProdigyRahul@david1gp@Hona@usrnk1@develop7@vglafirov@roborew@lakshyaag-tavily