You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit e2de9a1
Browse filesBrowse the repository at this point in the historyBrowse files
feat(terminal): associate terminals with workspace tabs
- Added workspaceTabId to terminal request, port, and record contracts
- Propagated workspaceTabId through server handler to runtime terminal creation
- Updated WorkspacePanels to find terminal by active tab instead of using global first terminal
- Changed auto-create logic to trigger per tab rather than when no terminals exist globally
- Included workspaceTabId in listTerminals response for client-side matching
- Updated known-gaps documentation to clarify ADR 0020 contract-baseline scope
Copy file name to clipboardExpand all lines: packages/webui/docs/browser-use/01-capability-matrix.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -443,7 +443,7 @@ that closes it. It is a gap, not a denial.
443
443
| The page a person opened lands in the tab that asked for it |**implemented**| the launcher dispatches `request-web-page` before the call, so a `watchBrowserWebTabs` snapshot that lands mid-call finds the tab that asked; `open-web-tab` binds the page to the named tab, and to a launcher that is waiting when the command names none. Either order, one page, one tab — and the tab is not activated, so a person who looked elsewhere is not moved. `packages/webui/src/client/features/workspace/projection/workspace-panel-state.ts`|
444
444
| A refusal keeps the launcher, and says why |**implemented**| the runtime's own message is carried on the launcher's `request.error` and rendered under the URL box, so the box stays and the person can type something else. Nothing about the launcher's refusal is worded differently from the Agent's |
445
445
| The URL box exists only on the new tab page |**implemented**| the launcher renders exactly one input, and a web tab renders none: the browser business's host shows the page's URL in the tab's toolbar as text, not as a field. `packages/webui/src/client/features/browser/ui/BrowserPanelHost.public.tsx`|
446
-
| A web tab carries back, forward, reloadand the URL |**implemented**| the toolbar is rendered by the browser business's **published host** — ADR 0022's component table already gave it that home ("binds a tab to a target, shows the picture and the toolbar") — and it is drawn over the one thing the strip hands it: the tab's target, and the url the runtime published with it. The strip owns the row of tabs; a workspace component drawing a foreign business's page chrome would invert the dependency rule. `BrowserPanelHost.public.tsx`|
446
+
| A web tab carries back, forward, reload, home and the URL |**implemented**| the toolbar is rendered by the browser business's **published host** — ADR 0022's component table already gave it that home ("binds a tab to a target, shows the picture and the toolbar") — and it is drawn over the one thing the strip hands it: the tab's target, the url and navigation-history availability the runtime publishes with it. Back and forward are disabled when no entry exists in that direction; home replaces the current tab's content with its launcher. The strip owns the row of tabs; a workspace component drawing a foreign business's page chrome would invert the dependency rule. `BrowserPanelHost.public.tsx`|
447
447
| The toolbar's three presses go through the existing command path, and name the page |**implemented**| one request per press on the browser family's own `sendBrowserCommand` operation — no second operation, no second route. `WebuiBrowserCommandRequest` gained an optional `target`, and the handler routes a named target to `WebuiBrowserPort.sendCommandToTarget`. The target is what makes the press mean the page in front of the person: an absent target still resolves the surface's selection (a run's, or the panel's own cell), which is a page the tab may not be showing. `packages/webui/src/server/operation/browser.ts`, `packages/webui/src/server/operation/handlers/browser.ts`, `packages/webui/src/runtime/browser/browser-service.ts`|
448
448
| A toolbar press that cannot be honoured says so, and leaves the page alone |**implemented**| the refusal travels out with the runtime's own code and message: `browser_target_stale` for a reference recorded before a move, `browser_capability_denied` when the page's history has nothing to go to. The service checks the surface switch and the command gate first, so a refusal names the switch rather than the page. The client helper does not catch: `browser-web-tab-toolbar.test.tsx`|
449
449
| Back, forward and reload move a real page |**implemented**|`packages/webui/test/integration/isolated-chromium-two-pages.test.ts`, "the web tab's toolbar, on a real page": three presses through the client's own helper, the operation's validator and handler, the service and a real isolated Chromium. Observed: `back` lands on the page it came from, `forward` on the one it left, `reload` re-reads the page it is on, the generation advances with each move so the pre-move reference is refused with `browser_target_stale` while the tab's current reference still works, and a `back` with nothing behind it is refused with `browser_capability_denied` with the page untouched |
@@ -602,4 +602,4 @@ the thing that changes — which is what #207 does.
602
602
when it is refreshed, is not decided.
603
603
-**The bridged surfaces have no tab model at all.** Everything measured here is the isolated
604
604
Chromium. The extension bridge exposes one visible tab per browser, so a tab strip over it is a
0 commit comments