feat(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu
, '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(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu
, '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(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu
, '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(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu
, '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(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu
, '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(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu
, '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(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu
, '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(grok): show Grok subagents in the Agents panel - #8412

Open
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel
Open

feat(grok): show Grok subagents in the Agents panel#8412
charindithjaindu wants to merge 2 commits into
pingdotgg:mainfrom
charindithjaindu:feat/grok-subagent-agents-panel

Conversation

@charindithjaindu

@charindithjainducharindithjaindu commented Aug 27, 2026

Copy link
Copy Markdown

Problem

Claude Task and Codex collab children already emit task.* events that the right-hand Agents panel folds into a live roster. Grok Build streams the same child work over ACP (subagent_spawned / subagent_progress / subagent_finished, plus workflow_updated), but T3 dropped those notifications. Grok threads showed an empty Agents panel.

Fix

Map Grok's x.ai session notifications onto the existing task.started / task.progress / task.completed path. Complexity stays at the adapter.

  • Standalone agent() children become taskType: "subagent" rows with timelineBypass, so they list in the Agents panel like Claude Task.
  • Workflow members use Claude/Codex linkage: parentAgentId + timelineBypass + a stable :wf: slot. The parent ACP session id is not used as parentAgentId (that would mis-classify a direct spawn as a workflow member).
  • First-seen terminal updates still emit task.started then task.completed. Unchanged member ticks are fingerprinted and skipped. Child tokens stay on typedUsage.
  • No new UI, contracts, or usage/rewind work. Web, desktop, and mobile already render this stream through client-runtime.

Tests

vp test run apps/server/src/provider/acp/GrokAcpSubagents.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts — 48 passed.

Made with Grok 4.6.


Note

Medium Risk
Non-trivial Grok adapter changes (notification buffering, semaphore ordering, and turn-liveness interaction) could drop or mis-time events at session startup, though scope stays within existing task.* ingestion with no contract or auth changes.

Overview
Grok Build child work (subagent_* and workflow_updated) was invisible in the Agents panel because those private ACP notifications were never translated into the shared task.* runtime events Claude Task and Codex collab already use.

This PR adds GrokAcpSubagents to parse flexible x.ai envelopes and emit task.started / task.progress / task.completed with the same linkage rules as other drivers: standalone agent() rows as subagent with timelineBypass (no fake parentAgentId), workflow members under a local_workflow parent with stable runId:wf:agentId slots. GrokAdapter registers four notification methods, queues early notifications until the session context exists, then flushes them under a lock and refreshes turn liveness when subagent ticks arrive so long quiet parent streams do not stall the watchdog.

The ACP mock agent can emit a sample subagent lifecycle when T3_ACP_EMIT_XAI_SUBAGENT=1; unit and adapter tests cover parsing, dedupe, and end-to-end streaming.

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

Note

Show Grok subagents in the Agents panel by mapping session notifications to task.* events

  • GrokAdapter now listens to _x.ai/session/update notifications and parses them as workflow or subagent updates via GrokAcpSubagents.ts, emitting canonical task.started/task.progress/task.completed events with stable RuntimeTaskIds
  • Added buffering for early session notifications so they replay after session start, and notifications now refresh turn liveness to avoid inadvertent watchdog timeouts
  • Added a mock flag T3_ACP_EMIT_XAI_SUBAGENT in acp-mock-agent.ts to simulate subagent lifecycle notifications for testing
  • Documented the mapping in providers.md
  • Risk: early notifications are queued via pending + readiness flag in GrokSessionContext; if the session-start handshake does not flip the readiness flag, buffered workflow/subagent events may be dropped silently

Macroscope summarized 468a4bf.

Claude Task and Codex collab children already emit task.* events that the
right-hand Agents panel folds into a live roster. Grok Build streams the
same work over x.ai session notifications, but T3 dropped them, so Grok
threads never listed child agents.
Map subagent_spawned/progress/finished and workflow_updated onto the
existing task.started/progress/completed path, with Claude/Codex linkage
(parentAgentId + timelineBypass for workflow members; standalone agent()
rows stay direct subagents).
Made with Grok 4.6.
@coderabbitai

coderabbitaiBot commented Aug 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: Pro Plus

Run ID: 62d2ac96-5ae7-472e-9eaf-dba2d00349ac

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

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2c8a9e0. Configure here.

Comment threadapps/server/src/provider/acp/GrokAcpSubagents.ts
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a substantial production capability for surfacing Grok subagents and workflows, including new event mapping, startup buffering, and turn-liveness behavior. The resulting changes affect existing Grok request paths and shared Agents-panel state, so the scope merits human review.

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

Subagent and workflow ACP ticks now stamp lastTurnActivityAtNanos before
waking the watchdog, so a quiet parent stream is not cancelled while
children are still working.
Spawn-time token counts are kept in usageByTaskId so a later
tools-or-duration tick cannot publish totalTokens 0. Workflow member
fingerprints include the wire state so start-to-running still emits
progress.
Made with Grok 4.6.
@charindithjaindu

Copy link
Copy Markdown
Author

Addressed the Macroscope and Bugbot findings in 468a4bf:

  • Subagent/workflow ACP ticks now stamp lastTurnActivityAtNanos before waking the watchdog, so a quiet parent stream is not cancelled while children are still working.
  • Spawn-time token counts are kept in usageByTaskId, so a later tools-or-duration tick cannot publish totalTokens: 0.
  • Workflow member fingerprints include the wire state, so startrunning still emits progress.

Mapper + adapter tests: 49 passed.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@charindithjaindu