@xenosystem/agent-interface-ui 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/adapters/agentHostPlatformBridge.d.ts.map +1 -1
  2. package/dist/adapters/agentHostPlatformBridge.js +78 -4
  3. package/dist/adapters/agentHostPlatformBridge.js.map +1 -1
  4. package/dist/components/agent/AgentInterface.d.ts +2 -1
  5. package/dist/components/agent/AgentInterface.d.ts.map +1 -1
  6. package/dist/components/agent/AgentInterface.js +110 -14
  7. package/dist/components/agent/AgentInterface.js.map +1 -1
  8. package/dist/components/agent/AgentView.d.ts +1 -0
  9. package/dist/components/agent/AgentView.d.ts.map +1 -1
  10. package/dist/components/agent/AgentView.js +57 -47
  11. package/dist/components/agent/AgentView.js.map +1 -1
  12. package/dist/components/agent/AgentWorkbenchPanel.d.ts +3 -0
  13. package/dist/components/agent/AgentWorkbenchPanel.d.ts.map +1 -1
  14. package/dist/components/agent/AgentWorkbenchPanel.js +2 -1
  15. package/dist/components/agent/AgentWorkbenchPanel.js.map +1 -1
  16. package/dist/components/agent/FleetPanel.d.ts.map +1 -1
  17. package/dist/components/agent/FleetPanel.js +7 -1
  18. package/dist/components/agent/FleetPanel.js.map +1 -1
  19. package/dist/components/agent/RunReviewPanel.d.ts.map +1 -1
  20. package/dist/components/agent/RunReviewPanel.js +2 -2
  21. package/dist/components/agent/RunReviewPanel.js.map +1 -1
  22. package/dist/components/agent/SessionsPanel.d.ts.map +1 -1
  23. package/dist/components/agent/SessionsPanel.js +85 -5
  24. package/dist/components/agent/SessionsPanel.js.map +1 -1
  25. package/dist/components/agent/compactionSummary.d.ts +0 -23
  26. package/dist/components/agent/compactionSummary.d.ts.map +1 -1
  27. package/dist/components/agent/compactionSummary.js +145 -3
  28. package/dist/components/agent/compactionSummary.js.map +1 -1
  29. package/dist/components/agent/injectionSummary.d.ts +37 -0
  30. package/dist/components/agent/injectionSummary.d.ts.map +1 -0
  31. package/dist/components/agent/injectionSummary.js +49 -0
  32. package/dist/components/agent/injectionSummary.js.map +1 -0
  33. package/dist/components/agent/runtimeEventSummary.d.ts +61 -0
  34. package/dist/components/agent/runtimeEventSummary.d.ts.map +1 -0
  35. package/dist/components/agent/runtimeEventSummary.js +112 -0
  36. package/dist/components/agent/runtimeEventSummary.js.map +1 -0
  37. package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.d.ts.map +1 -1
  38. package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js +27 -1
  39. package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js.map +1 -1
  40. package/dist/components/agent/timelineContextPressure.d.ts +62 -0
  41. package/dist/components/agent/timelineContextPressure.d.ts.map +1 -0
  42. package/dist/components/agent/timelineContextPressure.js +104 -0
  43. package/dist/components/agent/timelineContextPressure.js.map +1 -0
  44. package/dist/components/agent/tokenLabel.d.ts +14 -0
  45. package/dist/components/agent/tokenLabel.d.ts.map +1 -0
  46. package/dist/components/agent/tokenLabel.js +18 -0
  47. package/dist/components/agent/tokenLabel.js.map +1 -0
  48. package/dist/index.d.ts +17 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +17 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/platformApiTypes.d.ts +36 -1
  53. package/dist/platformApiTypes.d.ts.map +1 -1
  54. package/package.json +5 -5
@@ -16,7 +16,8 @@ import { EntitySettingsLayout } from './settings/EntitySettingsLayout';
16
16
  import { AgentOnboarding } from './AgentOnboarding';
17
17
  import { isWideWorkbenchTab } from './AgentWorkbenchPanel';
18
18
  import { PermissionDialog } from './PermissionDialog';
19
- import { compactionSummary } from './compactionSummary.js';
19
+ import { runtimeEventSummary } from './runtimeEventSummary.js';
20
+ import { latestContextPressure } from './timelineContextPressure.js';
20
21
  import { usePermissionStore } from '../../stores/permissionStore';
21
22
  import { useAgentChatStore, loadLocalAgentConversations, projectConversationRuntimeEvents, } from '../../stores/agentChatStore';
22
23
  import { useAgentIdeStore } from '../../stores/agentIdeStore';
@@ -796,12 +797,10 @@ function toEngineeringRuntimeEvents(response) {
796
797
  if (!timeline)
797
798
  return [];
798
799
  return timeline.orderedEvents.map((entry) => {
799
- const summary = compactionSummary(entry)
800
- || readOptionalString(entry.payload, 'summary')
801
- || readOptionalString(entry.payload, 'outputPreview')
802
- || readOptionalString(entry.payload, 'reason')
803
- || readOptionalString(entry.payload, 'checkpointId')
804
- || readOptionalString(entry.payload, 'toolName');
800
+ // ONE chain, shared with the cross-package gate. It used to live here inline while `test-kit`
801
+ // rebuilt it by hand — so the gate that exists to prove "every SPAWN signal renders" was
802
+ // asserting its own copy, and did not know about pressure at all.
803
+ const summary = runtimeEventSummary(entry);
805
804
  return {
806
805
  id: entry.id,
807
806
  sequence: entry.sequence,
@@ -3114,7 +3113,7 @@ function waitForSubagentConversationResult(conversationId, timeoutMs) {
3114
3113
  });
3115
3114
  });
3116
3115
  }
3117
- export default function AgentInterface({ surface = 'embedded', windowControls, } = {}) {
3116
+ export default function AgentInterface({ surface = 'embedded', initialSdkSessionId, windowControls, } = {}) {
3118
3117
  const [settingsPanel, setSettingsPanel] = useState(null);
3119
3118
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
3120
3119
  const [folderPanelOpen, setFolderPanelOpen] = useState(false);
@@ -3166,6 +3165,11 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
3166
3165
  const [engineeringCheckpointCompare, setEngineeringCheckpointCompare] = useState(null);
3167
3166
  const [engineeringSessions, setEngineeringSessions] = useState([]);
3168
3167
  const [engineeringRuntimeEvents, setEngineeringRuntimeEvents] = useState([]);
3168
+ /**
3169
+ * XENO SPAWN §15 step 3's pressure reading. It lives in `timeline.requests`, which the event
3170
+ * mapper discards — so without this the projection carried it and no surface ever showed it.
3171
+ */
3172
+ const [engineeringContextPressure, setEngineeringContextPressure] = useState(null);
3169
3173
  const [cliControlPlaneLoading, setCliControlPlaneLoading] = useState(false);
3170
3174
  const [cliControlPlaneError, setCliControlPlaneError] = useState(null);
3171
3175
  const [cliControlPlaneStatus, setCliControlPlaneStatus] = useState('idle');
@@ -3213,6 +3217,7 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
3213
3217
  const [sessionTabsHydrated, setSessionTabsHydrated] = useState(false);
3214
3218
  const sessionTabsRestoreAttemptedRef = useRef(false);
3215
3219
  const editorStatusTimerRef = useRef(null);
3220
+ const initialSdkSessionHandledRef = useRef(false);
3216
3221
  const terminalDraftSyncTimerRef = useRef(null);
3217
3222
  const lastPersistedEditorStateRef = useRef('');
3218
3223
  const codeAutoIndexKeyRef = useRef('');
@@ -3224,6 +3229,7 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
3224
3229
  const addAgentApprovalRule = useWorkspaceStore(s => s.addAgentApprovalRule);
3225
3230
  const conversations = useAgentChatStore(s => s.conversations);
3226
3231
  const createConversation = useAgentChatStore(s => s.createConversation);
3232
+ const appendMessage = useAgentChatStore(s => s.appendMessage);
3227
3233
  const updateConversation = useAgentChatStore(s => s.updateConversation);
3228
3234
  const activeRuntimeRequestId = useAgentChatStore(s => s.activeRequestId);
3229
3235
  const activeRuntimeConversationId = useAgentChatStore(s => s.activeConversationId);
@@ -3231,6 +3237,69 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
3231
3237
  const setCenterPaneMode = useAgentIdeStore(s => s.setMode);
3232
3238
  const setAgentIdeHasOpenFiles = useAgentIdeStore(s => s.setHasOpenFiles);
3233
3239
  const authDisplayName = useAuthStore(s => s.user?.display_name);
3240
+ useEffect(() => {
3241
+ const sessionId = initialSdkSessionId?.trim();
3242
+ if (!sessionId || initialSdkSessionHandledRef.current)
3243
+ return;
3244
+ initialSdkSessionHandledRef.current = true;
3245
+ let cancelled = false;
3246
+ const openSdkSession = async () => {
3247
+ const state = useAgentChatStore.getState();
3248
+ const existing = Object.values(state.conversations).find((conversation) => (conversation.sessionUi?.sdkSessionId === sessionId));
3249
+ const conversationId = existing?.id || createConversation(MAIN_ASSISTANT_ID);
3250
+ setViewMode('inbox');
3251
+ setSelectedInboxConversationId(conversationId);
3252
+ const attach = getAgentPlatformBridge()?.agent?.attachSdkSession;
3253
+ if (!attach) {
3254
+ appendMessage(conversationId, {
3255
+ role: 'assistant',
3256
+ content: `Unable to resume SDK session ${sessionId}: the Agent host session bridge is unavailable.`,
3257
+ error: 'Agent host session bridge unavailable',
3258
+ hideToolbar: true,
3259
+ });
3260
+ return;
3261
+ }
3262
+ try {
3263
+ const result = await attach({ conversationId, sessionId });
3264
+ if (cancelled)
3265
+ return;
3266
+ if (!result.success) {
3267
+ const message = result.error || 'unknown host error';
3268
+ console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
3269
+ appendMessage(conversationId, {
3270
+ role: 'assistant',
3271
+ content: `Unable to resume SDK session ${sessionId}: ${message}`,
3272
+ error: message,
3273
+ hideToolbar: true,
3274
+ });
3275
+ return;
3276
+ }
3277
+ const current = useAgentChatStore.getState().getConversation(conversationId);
3278
+ updateConversation(conversationId, {
3279
+ sessionUi: {
3280
+ ...(current?.sessionUi || {}),
3281
+ sdkSessionId: sessionId,
3282
+ sdkSessionDir: result.sessionDir,
3283
+ sdkSessionHistoryPath: result.sessionHistoryPath,
3284
+ },
3285
+ });
3286
+ }
3287
+ catch (error) {
3288
+ if (cancelled)
3289
+ return;
3290
+ const message = error instanceof Error ? error.message : 'unknown host error';
3291
+ console.error(`[agent-interface] Unable to attach SDK session ${sessionId}: ${message}`);
3292
+ appendMessage(conversationId, {
3293
+ role: 'assistant',
3294
+ content: `Unable to resume SDK session ${sessionId}: ${message}`,
3295
+ error: message,
3296
+ hideToolbar: true,
3297
+ });
3298
+ }
3299
+ };
3300
+ void openSdkSession();
3301
+ return () => { cancelled = true; };
3302
+ }, [appendMessage, createConversation, initialSdkSessionId, updateConversation]);
3234
3303
  // Dynamic context for system prompt enrichment (fetched from main process)
3235
3304
  const [runtimeContext, setRuntimeContext] = useState(null);
3236
3305
  // Fetch runtime context on mount and every 60 seconds
@@ -3316,6 +3385,19 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
3316
3385
  }, [activeConversation]);
3317
3386
  const activeSessionUi = activeConversation?.sessionUi || {};
3318
3387
  const workbenchPanelOpen = !!activeSessionUi.panelOpen;
3388
+ useEffect(() => {
3389
+ if (!activeConversationId)
3390
+ return;
3391
+ const conversation = useAgentChatStore.getState().getConversation(activeConversationId);
3392
+ if (!conversation?.sessionUi?.panelOpen)
3393
+ return;
3394
+ updateConversation(activeConversationId, {
3395
+ sessionUi: {
3396
+ ...conversation.sessionUi,
3397
+ panelOpen: false,
3398
+ },
3399
+ });
3400
+ }, [activeConversationId, updateConversation]);
3319
3401
  const workbenchPanelTab = activeSessionUi.panelTab || 'trace';
3320
3402
  const selectedTraceMessageId = activeSessionUi.selectedTraceMessageId || null;
3321
3403
  const terminalHistory = activeSessionUi.terminalHistory || [];
@@ -5119,6 +5201,14 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
5119
5201
  activateSessionConversation(conversationId);
5120
5202
  };
5121
5203
  const handleOpenSettings = (panel) => {
5204
+ if (activeConversationId) {
5205
+ updateConversation(activeConversationId, {
5206
+ sessionUi: {
5207
+ ...(useAgentChatStore.getState().getConversation(activeConversationId)?.sessionUi || {}),
5208
+ panelOpen: false,
5209
+ },
5210
+ });
5211
+ }
5122
5212
  setSettingsPanel(panel);
5123
5213
  setCenterPaneMode('agent');
5124
5214
  };
@@ -5648,6 +5738,7 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
5648
5738
  setEngineeringCheckpointCompare(null);
5649
5739
  setEngineeringSessions([]);
5650
5740
  setEngineeringRuntimeEvents([]);
5741
+ setEngineeringContextPressure(null);
5651
5742
  }, [activeConversationId, codeWorkbenchRootDirectory]);
5652
5743
  const handleEngineeringRefresh = useCallback(async () => {
5653
5744
  if (!codeWorkbenchRootDirectory) {
@@ -5713,9 +5804,13 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
5713
5804
  }
5714
5805
  if (runtimeTimelineResult?.success) {
5715
5806
  setEngineeringRuntimeEvents(toEngineeringRuntimeEvents(runtimeTimelineResult));
5807
+ // Read from `timeline.requests` rather than the flattened events — the mapper above drops
5808
+ // it, which is why this signal reached the projection and stopped there.
5809
+ setEngineeringContextPressure(latestContextPressure(runtimeTimelineResult.timeline));
5716
5810
  }
5717
5811
  else if (!activeConversationId) {
5718
5812
  setEngineeringRuntimeEvents([]);
5813
+ setEngineeringContextPressure(null);
5719
5814
  }
5720
5815
  if (diagnosticsResult?.success) {
5721
5816
  setEngineeringDiagnosticsSummary(diagnosticsResult.summary || null);
@@ -6865,9 +6960,11 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
6865
6960
  checkpointCompare: engineeringCheckpointCompare,
6866
6961
  sessions: engineeringSessions,
6867
6962
  runtimeEvents: engineeringRuntimeEvents,
6963
+ contextPressure: engineeringContextPressure,
6868
6964
  }), [
6869
6965
  codeWorkbenchRootDirectory,
6870
6966
  engineeringBackgroundRuns,
6967
+ engineeringContextPressure,
6871
6968
  engineeringCheckpointCompare,
6872
6969
  engineeringCheckpoints,
6873
6970
  engineeringChecks,
@@ -7161,11 +7258,10 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
7161
7258
  }, [openWorkspaceAcpAgents, selectedAgent, selectedAgentHierarchy]);
7162
7259
  const handleSelectSidebarSettings = useCallback(() => {
7163
7260
  if (activeConversationId) {
7164
- handleSelectWorkbenchTab('settings');
7165
- return;
7261
+ patchActiveConversationSessionUi({ panelOpen: false });
7166
7262
  }
7167
7263
  handleOpenActiveConversationSettings();
7168
- }, [activeConversationId, handleOpenActiveConversationSettings, handleSelectWorkbenchTab]);
7264
+ }, [activeConversationId, handleOpenActiveConversationSettings, patchActiveConversationSessionUi]);
7169
7265
  const handleOpenActiveConversationAcpAgents = useCallback(() => {
7170
7266
  void openWorkspaceAcpAgents(selectedAgentHierarchy?.workspace, 'Chat ACP agents');
7171
7267
  }, [openWorkspaceAcpAgents, selectedAgentHierarchy?.workspace]);
@@ -7482,7 +7578,7 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
7482
7578
  }, teamId: settingsPanel.teamId, teamName: teamForSettings?.name || settingsPanel.teamName, onClose: handleCloseSettings, onDelete: handleDeleteFromSettings }));
7483
7579
  }
7484
7580
  if (viewMode === 'inbox') {
7485
- return (_jsx(React.Suspense, { fallback: _jsx("div", { className: "flex h-full items-center justify-center text-[12px] text-white/35", children: "Loading chat..." }), children: _jsx(AgentView, { agentId: MAIN_ASSISTANT_ID, conversationId: selectedInboxConversationId, isMainAssistant: true, agentName: MAIN_ASSISTANT_NAME, model: MAIN_ASSISTANT_MODEL, templateName: "Main Assistant", workspaceName: "All Workspaces", teamName: "Global", systemPrompt: enrichedMainSystemPromptWithCodeContext, capabilities: { terminal: true, fileRead: true, fileWrite: true, appLaunch: true }, permissionProfile: "standard", allowedDirectories: [], approvalRules: [], allowedApps: [], teamAgents: [], onCreateWorkspace: handleMainCreateWorkspace, onCreateTeam: handleMainCreateTeam, onCreateTeamAgent: handleMainCreateTeamAgent, onGetInboxWorkspaceOptions: handleGetInboxWorkspaceOptions, onBindInboxConversationToWorkspace: handleBindInboxConversationToWorkspace, onOpenReassignedConversation: handleOpenReassignedConversation, onOpenEditorPath: handleOpenEditorPath, onOpenEditorDiff: handleOpenEditorDiff, onPeekEditorPath: handlePeekEditorPath, onPeekEditorDiff: handlePeekEditorDiff, renderWorkbenchPanel: false, onConversationCreated: activateSessionConversation }) }));
7581
+ return (_jsx(React.Suspense, { fallback: _jsx("div", { className: "flex h-full items-center justify-center text-[12px] text-white/35", children: "Loading chat..." }), children: _jsx(AgentView, { agentId: MAIN_ASSISTANT_ID, conversationId: selectedInboxConversationId, isMainAssistant: true, agentName: MAIN_ASSISTANT_NAME, model: MAIN_ASSISTANT_MODEL, templateName: "Main Assistant", workspaceName: "All Workspaces", teamName: "Global", systemPrompt: enrichedMainSystemPromptWithCodeContext, capabilities: { terminal: true, fileRead: true, fileWrite: true, appLaunch: true }, permissionProfile: "standard", allowedDirectories: [], approvalRules: [], allowedApps: [], teamAgents: [], onCreateWorkspace: handleMainCreateWorkspace, onCreateTeam: handleMainCreateTeam, onCreateTeamAgent: handleMainCreateTeamAgent, onGetInboxWorkspaceOptions: handleGetInboxWorkspaceOptions, onBindInboxConversationToWorkspace: handleBindInboxConversationToWorkspace, onOpenReassignedConversation: handleOpenReassignedConversation, onOpenEditorPath: handleOpenEditorPath, onOpenEditorDiff: handleOpenEditorDiff, onPeekEditorPath: handlePeekEditorPath, onPeekEditorDiff: handlePeekEditorDiff, renderWorkbenchPanel: false, onOpenConversationSettings: handleSelectSidebarSettings, onConversationCreated: activateSessionConversation }) }));
7486
7582
  }
7487
7583
  // If an agent is selected, show the chat view.
7488
7584
  // Conversation is created lazily on first message send.
@@ -7545,7 +7641,7 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
7545
7641
  selectedBy: 'user'
7546
7642
  }
7547
7643
  });
7548
- }, renderWorkbenchPanel: false, onConversationCreated: activateSessionConversation }) }));
7644
+ }, renderWorkbenchPanel: false, onOpenConversationSettings: handleSelectSidebarSettings, onConversationCreated: activateSessionConversation }) }));
7549
7645
  }
7550
7646
  // Plugins view
7551
7647
  if (viewMode === 'plugins') {
@@ -7572,7 +7668,7 @@ export default function AgentInterface({ surface = 'embedded', windowControls, }
7572
7668
  : 'bg-transparent hover:bg-white/[0.055] text-white/35 hover:text-white/60'}`, children: "Panel" }) })] }), _jsx("div", { className: "flex-1 min-h-0 flex flex-col overflow-hidden", children: _jsx(React.Suspense, { fallback: _jsx(WorkbenchLoadingSkeleton, { title: "Loading editor", subtitle: "Preparing editor workbench." }), children: activeEditorDiff ? (_jsx(MonacoDiffWorkbenchEditor, { diff: activeEditorDiff, rootDirectory: activeConversation?.rootDirectory || null, layoutKey: editorLayoutKey, statusMessage: editorStatusMessage, onOpenFile: handleOpenEditorPath })) : (_jsx(MonacoWorkbenchEditor, { file: activeEditorFile, pendingFilePath: pendingEditorPath, rootDirectory: activeConversation?.rootDirectory || null, openFilePaths: openEditorFiles.map((file) => file.path), layoutKey: editorLayoutKey, statusMessage: editorStatusMessage, onChangeFile: handleEditorContentChange, onSaveFile: handleSaveEditorFile, onRevertFile: handleRevertEditorFile })) }) })] })] }))
7573
7669
  : centerPaneMode === 'editor'
7574
7670
  ? (_jsx(React.Suspense, { fallback: _jsx(WorkbenchLoadingSkeleton, { title: "Loading editor", subtitle: "Preparing editor workbench." }), children: activeEditorDiff ? (_jsx(MonacoDiffWorkbenchEditor, { diff: activeEditorDiff, rootDirectory: activeConversation?.rootDirectory || null, layoutKey: editorLayoutKey, statusMessage: editorStatusMessage, onOpenFile: handleOpenEditorPath })) : (_jsx(MonacoWorkbenchEditor, { file: activeEditorFile, pendingFilePath: pendingEditorPath, rootDirectory: activeConversation?.rootDirectory || null, openFilePaths: openEditorFiles.map((file) => file.path), layoutKey: editorLayoutKey, statusMessage: editorStatusMessage, onChangeFile: handleEditorContentChange, onSaveFile: handleSaveEditorFile, onRevertFile: handleRevertEditorFile })) }))
7575
- : renderContent() }), activeConversationId && workbenchPanelOpen && (_jsx("div", { className: "px-6 pb-5", children: _jsx("div", { className: `w-full mx-auto ${isWideWorkbenchTab(workbenchPanelTab) ? 'max-w-[1120px]' : 'max-w-[820px]'}`, children: _jsx(React.Suspense, { fallback: _jsx(WorkbenchLoadingSkeleton, { title: "Loading workbench", subtitle: "Preparing trace and support panels." }), children: _jsx(AgentWorkbenchPanel, { tab: workbenchPanelTab,
7671
+ : renderContent() }), activeConversationId && workbenchPanelOpen && !settingsPanel && (_jsx("div", { className: "px-6 pb-5", children: _jsx("div", { className: `w-full mx-auto ${isWideWorkbenchTab(workbenchPanelTab) ? 'max-w-[1120px]' : 'max-w-[820px]'}`, children: _jsx(React.Suspense, { fallback: _jsx(WorkbenchLoadingSkeleton, { title: "Loading workbench", subtitle: "Preparing trace and support panels." }), children: _jsx(AgentWorkbenchPanel, { tab: workbenchPanelTab,
7576
7672
  /* The host's default `resolveRunId` is
7577
7673
  `subagentRunId ?? conversationId`, so the conversation id
7578
7674
  IS the run id here. Passing anything else would ask the