Skip to content

fix(app): slash in the subagent breadcrumb and a quieter subagent bar - #59438

Merged
Hona merged 1 commit into
devfrom
subagent-bar-slash
Oct 26, 2026
Merged

Hona merged 1 commit into
devfrom
subagent-bar-slash

Conversation

@Hona

@Hona Hona commented Oct 26, 2026

Copy link
Copy Markdown
Member

Cherry-pick of #59347 from beta (Kit Langton), so the next dev release has it. It applies to dev unchanged.


In a subagent's session, the breadcrumb uses the same slash all the way along, and the bar in place of the composer is now a quiet one-line status instead of a second composer. A subagent session can't take prompts, so its composer slot shows how the run is going (status, time, agent, model) and a way back to the main session. Nothing about parent sessions or the composer itself changes. 🔍 Origin: seen in real use, from a screen capture with feedback ("shouldn't it just be another slash?", "maybe it should be a dimmer colour and not as large, because now it looks like the other thing"). ❌ Before 1. The breadcrumb read project / parent ❯ subagent: slashes, then a chevron. ❌ 2. The bar was a 104px card with the composer's background, rounding and two rows, so it looked like a text box you could type into. ❌ ✅ After 1. The breadcrumb reads project / parent / subagent, with the same 8px either side as the slash after the project. 2. The bar is one 32px line on the timeline's own background: ⠿ Running · 2h 17m · General · OpenCode / Claude Opus 4.6 · High, all in the faint text colour, with Main session ESC at the end. The timeline fades into it as it scrolls underneath. diff - project / parent ❯ subagent + project / parent / subagent - [ card: status row ] [ card: icon · agent · model · variant · Main session ] (104px, composer look) + icon · status · time · agent · model · variant ........ Main session ESC (32px, plain line) 📊 Proof: a subagent that has been running for 2h 17m, with a long title | | Before | After | |---|---|---| | Header | header-before | header-after | | Bar | bar-before | bar-after | | Whole view | child-before | child-after | Both updated tests fail without the change: the ancestor-path e2e test (finds 1 slash instead of 4) and the subagent bar component test (the bar is still rounded and 104px tall). ### Visual svg <svg xmlns="http://www.w3.org/2000/svg" width="240" height="72" viewBox="0 0 240 72" fill="none"> <style> .card{opacity:0;animation:card 4s ease-in-out infinite} .line{animation:line 4s ease-in-out infinite} .chev{opacity:0;animation:card 4s ease-in-out infinite} .slash{animation:line 4s ease-in-out infinite} @keyframes card{0%,35%{opacity:1}50%,100%{opacity:0}} @keyframes line{0%,35%{opacity:0}50%,100%{opacity:1}} @media (prefers-reduced-motion:reduce){.card,.line,.chev,.slash{animation:none}} </style> <g stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"> <path d="M16 14h28" stroke-width="4" opacity=".45"/> <path d="M54 18l4-8" stroke-width="1.5" opacity=".4"/> <path d="M68 14h36" stroke-width="4" opacity=".45"/> <path class="chev" d="M114 10l3 4-3 4" stroke-width="1.5"/> <path class="slash" d="M114 18l4-8" stroke-width="1.5" opacity=".4"/> <path d="M128 14h64" stroke-width="4" opacity=".9"/> </g> <g class="card"> <rect x="16.5" y="28.5" width="207" height="37" rx="7" stroke="currentColor" stroke-opacity=".3" fill="currentColor" fill-opacity=".06"/> <path d="M26 38h40M38 56h22M70 56h50M182 56h32" stroke="currentColor" stroke-width="3" stroke-linecap="round" opacity=".6"/> </g> <g class="line" stroke="currentColor" stroke-linecap="round" opacity=".4"> <circle cx="22" cy="56" r="2.5" fill="currentColor" stroke="none"/> <path d="M30 56h22M58 56h16M80 56h20M106 56h46M190 56h30" stroke-width="2.5"/> </g> </svg> 👀 Read: subagent-bar.tsx. The bar keeps the timeline's background and a 16px fade on top because the timeline scrolls on underneath the composer area; without them, scrolled text would show through the status line. The breadcrumb's chevron drawing and its right-to-left flip are gone, since nothing else used them. The rest is routine.

Checks run - bun typecheck (packages/app): no type errors - bun run test:components -- component-tests/subagent-bar.spec.ts: 1 pass with the change, 1 fail on dev's bar - bunx playwright test e2e/regression/subagent-child-navigation.spec.ts e2e/regression/session-header.spec.ts -g "subagent|ancestor|nested|location|session header groups": 20 pass, plus 1 first-run timeout in session header groups controls … in ltr that passed on its own rerun (both directions, 2 pass); the ancestor-path test fails on dev - bun run lint:changed: 0 problems

@Hona
Hona requested a review from Brendonovich as a code owner October 26, 2026 23:35
Copilot AI balanced review requested due to automatic review settings October 26, 2026 23:35
@Hona
Hona enabled auto-merge (squash) October 26, 2026 23:35

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change works as described, and I found nothing that should block it.

I rendered the child-session story on dev and on this branch (screenshots below). The bar goes from the two-row composer-style card to a single faint 32px status line. With the change, the ancestor-path e2e test passes and finds four slash separators. subagent-bar.spec.ts passes 2/2 here, and both tests fail against dev's bar. tsc -b in packages/app is clean.

The public API is unchanged: only app components, styles and stories change. SessionHeaderSeparator's props are now required, but it is only used in session-identity-header.tsx, which this change updates.

Before

After

@Hona
Hona merged commit 7b3f52f into dev Oct 26, 2026
20 checks passed
@Hona
Hona deleted the subagent-bar-slash branch October 26, 2026 23:45
Sign up for free to 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.

3 participants