fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@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

fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@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

fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@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

fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@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

fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@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

fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@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

fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@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

fix(chat): keep latest command live between messages - #9098

Merged
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row
Sep 1, 2026
Merged

fix(chat): keep latest command live between messages#9098
maria-rcks merged 4 commits into
pingdotgg:mainfrom
maria-rcks:t3code/restore-live-command-row

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Restores the single live activity row with a Lucide brain icon and keeps the latest successful command animated as Running until the next assistant message replaces it. Failed and declined tools retain terminal behavior.

Before

The completed command dropped into its past state while the turn was still working.

Completed command incorrectly shown as past activity

After

Thinking starts in the shared activity row with the brain icon.

Thinking shown in the shared activity row with a brain icon

Once a command appears, it replaces Thinking on the same row and remains animated as Running until the next assistant text.

Completed command retained as the live running activity row

The second after screenshot was captured after the server persisted tool.completed at 21:35:40.436Z and before the next assistant message at 21:35:44.125Z.

Verification

  • 88 focused timeline tests
  • scoped lint
  • web typecheck
  • real web client at 1920x1080 against an isolated T3 environment

Created by gpt-5.6-sol through the Codex harness.

Note

Unify thinking and latest tool activity into shared live-activity-row in MessagesTimeline

  • Replaces the separate thinking-indicator-row with a single shared LIVE_ACTIVITY_ROW_ID ('live-activity-row') that covers both initial thinking and the latest tool activity, so the latest command stays live between messages.
  • deriveMessagesTimelineRows now treats the activity as live when a tool entry is running or the latest visible tool indicates success (workEntryIndicatesToolSuccess), setting the active flag and using the shared id; otherwise it falls back to a per-group id with active false.
  • Renders the thinking row with an explicit brain icon by adding 'brain' to WorkEntryIconName and mapping workToneIcon tone 'thinking' from 'bot' to 'brain'.
  • Moves thinking rows into the same bottom-padding group as work rows in MessagesTimeline.tsx, slightly increasing their vertical spacing.
  • Behavioral Change: completed successful tools now keep the shared activity row active instead of ending the live state, and all live states reuse one stable id; consumers keyed on the old thinking-indicator-row id or the separate thinking row need updating.

Macroscope summarized 64c8012.


Note

Low Risk
Scoped to chat timeline row derivation and presentation; stable row id changes may affect tests or selectors that targeted the old thinking/work-live ids.

Overview
Unifies in-progress “Thinking” and the latest tool into one shared timeline row (live-activity-row) so the UI does not swap row ids or drop completed commands back to a past “Ran” state while the turn is still working.

deriveMessagesTimelineRows now treats the activity slot as live when a tool is running or the latest visible tool succeeded (workEntryIndicatesToolSuccess), keeping the Running shimmer on that row until the next assistant message. Declined (and other non-success) tools stop occupying the live slot; Thinking returns on the same row id. The thinking state uses a brain icon instead of the bot icon.

Tests and markup expectations move from thinking-indicator-row / per-group work-live:* ids to live-activity-row where the shared handoff applies.

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

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 1, 2026
Comment threadapps/web/src/components/chat/MessagesTimeline.logic.ts
@macroscopeapp

macroscopeappBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 64c8012

Macroscope's review found this PR approvable — This is a narrowly scoped chat timeline fix that keeps the latest successful command visually live until the next assistant message, with declined and failed tools retaining their existing behavior. Production changes are confined to row derivation and presentation, and focused tests cover the transition states.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/web/src/components/chat/MessagesTimeline.tsx Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Sep 1, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewSeptember 1, 2026 21:54

Dismissing prior approval to re-evaluate 64c8012

@maria-rcks
maria-rcks merged commit 590a579 into pingdotgg:mainSep 1, 2026
27 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
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>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

1 participant

@maria-rcks