From 19a61b1b885255e0378cdf73aebe0fc77ed009ab Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 21 Oct 2026 14:20:08 -0700 Subject: [PATCH 1/2] fix(app): make the subagent bar say what it is and drop dead controls --- .../app/component-tests/subagent-bar.spec.ts | 7 +- packages/app/src/runtime/i18n/en.ts | 2 + packages/app/src/session/composer/region.tsx | 1 + .../app/src/session/composer/subagent-bar.tsx | 142 +++++++++++------- .../src/session/session-screen.stories.tsx | 13 +- 5 files changed, 103 insertions(+), 62 deletions(-) diff --git a/packages/app/component-tests/subagent-bar.spec.ts b/packages/app/component-tests/subagent-bar.spec.ts index 82826ceac4ab..a504b207375f 100644 --- a/packages/app/component-tests/subagent-bar.spec.ts +++ b/packages/app/component-tests/subagent-bar.spec.ts @@ -1,10 +1,11 @@ import { expect, story } from "../../storybook/playwright/story" -story("a subagent session shows its model where the composer would be", async ({ mount, page }) => { +story("a subagent session names the subagent and its task where the composer would be", async ({ mount, page }) => { await mount("app-current-session-surface--child-session") const bar = page.locator('[data-component="subagent-bar"]') - await expect(bar.locator('[data-slot="subagent-model"]')).toHaveText("Anthropic / Claude Opus 5.5") - await expect(bar).toContainText(/high/i) + await expect(bar).toContainText("Surveyor subagent") + await expect(bar.locator('[data-slot="subagent-title"]')).toHaveText("Trace why the sidebar flickers on resize") + await expect(bar).not.toContainText("Claude Opus 5.5") await expect(page.locator('[data-component="composer"]')).toHaveCount(0) }) diff --git a/packages/app/src/runtime/i18n/en.ts b/packages/app/src/runtime/i18n/en.ts index f8a498b41ba6..6d59a474d8ed 100644 --- a/packages/app/src/runtime/i18n/en.ts +++ b/packages/app/src/runtime/i18n/en.ts @@ -304,6 +304,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "session.child.backToParent": "Main session", + "session.child.agent": "{{agent}} subagent", + "session.child.subagent": "Subagent", "session.child.status.running": "Running", "session.child.status.succeeded": "Done", "session.child.status.failed": "Failed", diff --git a/packages/app/src/session/composer/region.tsx b/packages/app/src/session/composer/region.tsx index 6f59b1465f47..cfeb59fcfd83 100644 --- a/packages/app/src/session/composer/region.tsx +++ b/packages/app/src/session/composer/region.tsx @@ -430,6 +430,7 @@ export function ActiveSessionComposerRegion(props: { {(info) => ( props.status, () => setChanged(true), { defer: true })) createEffect(() => { if (props.status !== "running") return @@ -31,68 +36,93 @@ export function SubagentBar(props: { onCleanup(() => clearInterval(timer)) }) + const agent = () => + props.agent + ? language.t("session.child.agent", { agent: `${props.agent[0].toUpperCase()}${props.agent.slice(1)}` }) + : language.t("session.child.subagent") + return (
-
- - {(status) => ( - <> - {language.t(`session.child.status.${status()}`)} - {" · "} - {formatElapsed((props.ended ?? now()) - props.started, language.t)} - - )} - -
-
- - - - - - - - - - - - - - - - -
- - {(agent) => {agent()}} - - - {(model) => ( - <> - - - {model().provider} - {" / "} + + {(title) => {title()}} + + {(model) => ( + + {[model().provider, model().name].filter(Boolean).join(" / ")} + + {(variant) => {` · ${variant()}`}} - {model().name} - - {model().variant} - - + )} + + + } + > + + + {agent()} + + + {(title) => ( + + {title()} + )} -
- -
+ )} + +
) } diff --git a/packages/app/src/session/session-screen.stories.tsx b/packages/app/src/session/session-screen.stories.tsx index 724265d833e3..4c8b3f5a0e89 100644 --- a/packages/app/src/session/session-screen.stories.tsx +++ b/packages/app/src/session/session-screen.stories.tsx @@ -14,6 +14,7 @@ import { subagentDocument, terminalPassedDocument, } from "@opencode/session-ui/storybook" +import type { SubagentStatus } from "./composer/subagent-bar" import { SessionPreview } from "./story-model" const description = "opencode · modular-session-ui" @@ -203,16 +204,21 @@ export const ReviewPlusTerminal = { } export const ChildSession = { - render: () => ( + args: { status: "running", title: "Trace why the sidebar flickers on resize", permission: false }, + argTypes: { status: { control: "select", options: ["running", "succeeded", "failed", "interrupted"] } }, + render: (args: { status: SubagentStatus; title: string; permission: boolean }) => ( ), @@ -226,6 +232,7 @@ export const ChildSessionDone = { document={subagentDocument} child={{ agent: "surveyor", + title: "Map every caller of the legacy theme tokens", model: { provider: "Anthropic", name: "Claude Opus 5.5", variant: "high" }, status: "succeeded", started: 0, From 85729e5ca354f755d2f6b2f52386f56f52a30490 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 21 Oct 2026 14:50:44 -0700 Subject: [PATCH 2/2] fix(app): let keyboard users reach the subagent task tooltip --- packages/app/src/session/composer/subagent-bar.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/app/src/session/composer/subagent-bar.tsx b/packages/app/src/session/composer/subagent-bar.tsx index 95cb11035831..10a9a51302f0 100644 --- a/packages/app/src/session/composer/subagent-bar.tsx +++ b/packages/app/src/session/composer/subagent-bar.tsx @@ -50,7 +50,8 @@ export function SubagentBar(props: { >