feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks
, '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

feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks
, '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

feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks
, '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

feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks
, '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

feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks
, '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

feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks
, '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

feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks
, '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

feat(web): surface orchestration agents in the timeline - #4664

Open
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility
Open

feat(web): surface orchestration agents in the timeline#4664
shivamhwp wants to merge 333 commits into
t3code/codex-turn-mappingfrom
subagent-obs/05-thread-visibility

Conversation

@shivamhwp

@shivamhwpshivamhwp commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Orchestrator V2 already projects native subagents, and the existing Agents panel already owns their live detail. The remaining problem is presentation: chat repeats one lifecycle row per agent, duplicating the roster and stretching the turn.

This PR keeps the existing orchestration semantics and:

  • collapses only local subagents from the same run into one compact timeline action;
  • derives the visible count and aggregate state from existing projected item statuses;
  • keeps partial failures visible and destructive while sibling agents are still working;
  • opens the existing Agents panel for names, status, duration, output, and hierarchy;
  • preserves inherited fork projections as lifecycle rows so they keep their source-thread context;
  • keeps superseded and replacement attempts in separate summary rosters;
  • isolates changing agent summaries from unrelated virtualized timeline rows.

There are no server, contract, persistence, provider-adapter, recovery, client-runtime, or mobile behavior changes.

Screenshots

BeforeAfter
Before: one lifecycle row per agentAfter: one run summary
Agents panelMobile width
Existing Agents panel with all three agentsExisting Agents panel at mobile width

Verification

  • 163 focused timeline, session, runtime, and panel tests pass across five files.
  • Web typecheck passes.
  • The changed timeline files pass formatting, lint, and whitespace checks.
  • Render coverage confirms local agents collapse to one summary row while inherited rows and separate attempts remain independent.
  • The summary exposes working, failed, stopped, and completed states and opens the existing Agents panel.

Built and tested with GPT-5.6-Sol in the Codex harness through T3 Code.


Note

Low Risk
Web-only chat timeline presentation; behavior changes only when onOpenAgents is wired, with no auth, API, or persistence impact.

Overview
Local subagent events in chat are collapsed into one summary row per run (or per attempt when steered), instead of repeating a lifecycle card per agent.

deriveMessagesTimelineRows gains optional summarizeSubagents and a new agent-spawn row type with aggregated counts (working, failed, stopped). Inherited subagents and runs without a summarization callback still render as ordinary event rows; superseded vs active attempts stay in separate groups.

MessagesTimeline takes onOpenAgents and enables summarization only when that callback is present. The new AgentSpawnCtaRow shows status text (including visible failures while others are still running) and opens the existing Agents panel. ChatView passes addAgentsSurface for that hook.

Tests cover grouping, attempt boundaries, opt-out when summarization is off, and the updated markup expectations.

Reviewed by Cursor Bugbot for commit 28a337d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add orchestration agent summary rows to MessagesTimeline

  • Introduces a new agent-spawn row variant in deriveMessagesTimelineRows that collapses local subagent events into a single aggregated summary per attempt, run, or item when summarizeSubagents is enabled.
  • Adds the AgentSpawnCtaRow component, which renders a clickable CTA with dynamic status text (live vs completed, failed/stopped counts) and opens the Agents panel via onOpenAgents.
  • MessagesTimeline accepts an optional onOpenAgents prop; when present it enables subagent summarization and threads the callback through TimelineRowCtx.
  • ChatViewContent wires onOpenAgents={addAgentsSurface} to the timeline so users can open the Agents panel from the summary row.
  • isRowUnchanged extended to shallow-compare agent-spawn rows, preventing unnecessary re-renders in virtualization.
  • Risk: when onOpenAgents is provided, local subagent event rows are no longer rendered individually — callers relying on per-event row rendering (e.g. in MessagesTimeline.logic.ts) should verify the collapsed summary covers their use case.

Macroscope summarized 28a337d.

@coderabbitai

coderabbitaiBot commented Jul 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 606ccf48-8344-45dd-ab00-72d4e58d33f9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch subagent-obs/05-thread-visibility

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 27, 2026
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 940e8fb to c3a50f8CompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from d2ef6c7 to adb1e9bCompareJuly 27, 2026 20:20
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c3a50f8 to 8c6a796CompareJuly 27, 2026 20:52
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from adb1e9b to 39912b0CompareJuly 27, 2026 20:52
Comment threadapps/web/src/components/chat/ThreadRelationshipsControl.tsx
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 8c6a796 to 103b937CompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 39912b0 to 6bc3a8dCompareJuly 27, 2026 23:03
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 103b937 to 31adb36CompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6bc3a8d to 05fe44cCompareJuly 28, 2026 15:31
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 31adb36 to b270c47CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 05fe44c to 7458298CompareJuly 28, 2026 19:27
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from b270c47 to daf1a88CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 7458298 to 4daeac4CompareJuly 28, 2026 19:46
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from daf1a88 to 1dce464CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 4daeac4 to 095cab7CompareJuly 28, 2026 20:26
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 1dce464 to 4c169edCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 095cab7 to 1d37a6fCompareJuly 29, 2026 01:19
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 4c169ed to 70d5111CompareJuly 29, 2026 01:24
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 1d37a6f to 6cf67a2CompareJuly 29, 2026 01:25
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from 70d5111 to c78d0ffCompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 6cf67a2 to 5e3c535CompareJuly 30, 2026 00:00
@shivamhwp
shivamhwpforce-pushed the subagent-obs/04-agents-panel branch from c78d0ff to a997806CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwpforce-pushed the subagent-obs/05-thread-visibility branch from 5e3c535 to 2430736CompareJuly 30, 2026 00:45
@shivamhwp
shivamhwp marked this pull request as ready for review July 30, 2026 20:04
Comment threadapps/web/src/state/entities.ts Outdated
juliusmarmingeand others added 30 commits September 1, 2026 22:53
Keep typed plan and todo records distinct from generic tool events, activate captured plans, and supersede older planning state within the owning thread. Ignore nested todo snapshots for the parent and retain identity across duplicate SDK messages.
Finding: R05 follow-up
Model: GPT-5.6 Sol via Codex
R04 follow-up
Convert client multi-select answer arrays to the comma-separated string shape required by the pinned Claude SDK while preserving single-select strings.
Implemented by GPT-5.6 Sol via Codex.
Stale cached user and status events could admit and complete a newly submitted OpenCode prompt. Generate the native message ID before submission and only advance admission when that exact message is observed.
Finding: R14
Implemented by GPT-5.6 Sol with Codex.
R12 follow-up
Insert persistent feedback blocks by their timestamp within the canonical timeline while preserving projected row order. Keep real optimistic sends appended and suppress duplicate local messages already committed by the server.
Implemented by GPT-5.6 Sol via Codex.
R20 follow-up
Give inspector reasoning markdown its projected source thread and retain the explicit environment fallback for proposed plans without a thread reference. Workspace links and images now resolve through their owning environment after removal of the active-environment fallback.
Implemented by GPT-5.6 Sol via Codex.
Read the inclusive cursor, a full history page, and a look-behind row so older history does not terminate after one page.
Finding: P01 pagination termination
Model: GPT-5.6 Sol via Codex
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.
Finding: R14 prompt cancellation
Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.
Finding: P01 nested lineage
Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.
Finding: R14 status reconciliation
Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.
Finding: P01 bounded history visibility
Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.
Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: #8569 theme wiring,
settings search rework, #8803 workspace-mutation refresh (v2-adapted),
video + image previews (web and mobile, v2-adapted), #8862 Expo glass,
and the round's docs. Timeline thinking rows (#8984) stay on the v2
work-live system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The v2 equivalents of main's #8984 and #8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts the round's main features into the v2 architecture: the #9023
media rework (streamed videos, media-file assets, protocol-relative
links), #9098 shared live-activity row folded into the v2 working and
thinking rows, the #9084/#9078 Claude model catalog for v2 consumers,
a native #9005 OpenCode child-session abort in the v2 adapter, #9013's
landed LegendList patch, and per-environment sidebar provider entries.
For #8600 the server-side pieces land, but auto-settle evaluation stays
client-side (reading the new server-owned settings) until the v2
orchestrator grows its own settlement reactor; main's v1-only reactor
and coalescer additions are dropped with the rest of the v1 path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ator
Ports #8600's server-owned settlement to orchestration v2 instead of
keeping client-side evaluation. A ThreadSettlementService sweep runs at
startup, on auto-settle settings changes, and once per minute: it
evaluates inactivity and merged or closed pull requests over v2 thread
shells and dispatches the new guarded thread.auto-settle command, which
rejects threads that changed after the sweep's snapshot or carry any
explicit override, then reuses the orchestrator's settle lifecycle.
With the server deciding, the clients drop their effectiveSettled
evaluation and partition on the persisted settledOverride like main.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adopts main's round-19 features into the v2 stack: payload-budgeted
orchestration replay (#8992), sidebar row subscription leases (#9052),
tool group virtualization and scroll anchoring (#9106), repeated-command
and browser-group presentation, inline assistant citations (#9146),
per-cwd provider skills discovery (#8778), Claude composer skill
dispatch (#9128), grok health probe and model negotiation (#9154), and
the failed-tool thinking fallback (#9165).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Round 17 adopted main's #8850 ComposerBanner.Attachment (mx-auto plus the
standalone drawer-inset width) without main's matching mounts, so the
stash tab's ml-auto lost to the attachment's auto right margin and the
tab centered over the composer. Column now spans its attachments like
main does, the stash tab zeroes the right margin, and the stash menu
keeps the full dock width.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@shivamhwp@PixPMusic@juliusmarminge@mwolson@nsxdavid@Yusuf007R@maria-rcks