@opengeni/react 0.52.1 → 1.0.1

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 (132) hide show
  1. package/README.md +51 -1
  2. package/dist/artifacts.d.ts +1 -1
  3. package/dist/artifacts.js +43 -14
  4. package/dist/artifacts.js.map +1 -1
  5. package/dist/{chunk-ROIRTM37.js → chunk-5UQPNLIO.js} +6 -6
  6. package/dist/{chunk-JR3QFY6B.js → chunk-6KLX2RH5.js} +49 -2
  7. package/dist/chunk-6KLX2RH5.js.map +1 -0
  8. package/dist/{chunk-FWS3KC3Z.js → chunk-B6WPZSTT.js} +104 -104
  9. package/dist/{chunk-FWS3KC3Z.js.map → chunk-B6WPZSTT.js.map} +1 -1
  10. package/dist/{chunk-HDBG7XGO.js → chunk-C5ZPSSS5.js} +50 -1
  11. package/dist/chunk-C5ZPSSS5.js.map +1 -0
  12. package/dist/{chunk-X4S56Y2H.js → chunk-HA46CYQK.js} +135 -11
  13. package/dist/chunk-HA46CYQK.js.map +1 -0
  14. package/dist/{chunk-724BW4TW.js → chunk-IGC6A2ZI.js} +2 -2
  15. package/dist/chunk-LLOLUHVG.js +5937 -0
  16. package/dist/chunk-LLOLUHVG.js.map +1 -0
  17. package/dist/{chunk-WYA65Y3F.js → chunk-MKPIAGVL.js} +13 -3
  18. package/dist/chunk-MKPIAGVL.js.map +1 -0
  19. package/dist/chunk-R3AZOAB5.js +933 -0
  20. package/dist/chunk-R3AZOAB5.js.map +1 -0
  21. package/dist/{chunk-23EJ676W.js → chunk-XBZWOM2K.js} +9 -4
  22. package/dist/chunk-XBZWOM2K.js.map +1 -0
  23. package/dist/{chunk-JAGDUCZQ.js → chunk-Y7OEDUJ5.js} +17 -13
  24. package/dist/chunk-Y7OEDUJ5.js.map +1 -0
  25. package/dist/client.d.ts +6 -4
  26. package/dist/components/artifacts/index.d.ts +1 -0
  27. package/dist/components/artifacts/published-html-artifact-frame.d.ts +14 -0
  28. package/dist/components/browser-input.d.ts +7 -0
  29. package/dist/components/browser-viewer.d.ts +5 -4
  30. package/dist/components/computer-viewer.d.ts +2 -1
  31. package/dist/components/desktop-viewer.d.ts +26 -2
  32. package/dist/components/interaction-intervention-banner.d.ts +11 -0
  33. package/dist/components/sandbox-terminal.d.ts +4 -1
  34. package/dist/components/sandbox-workspace.d.ts +3 -0
  35. package/dist/composer.js +6 -6
  36. package/dist/hooks/use-auth-runs.d.ts +32 -0
  37. package/dist/hooks/use-browser-downloads.d.ts +25 -0
  38. package/dist/hooks/use-browser-identities.d.ts +5 -1
  39. package/dist/hooks/use-browser-session.d.ts +2 -1
  40. package/dist/hooks/use-browser-sessions.d.ts +1 -1
  41. package/dist/hooks/use-channels.d.ts +26 -0
  42. package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
  43. package/dist/hooks/use-computer-session.d.ts +2 -1
  44. package/dist/hooks/use-computer-sessions.d.ts +1 -1
  45. package/dist/hooks/use-desktop-stream.d.ts +4 -0
  46. package/dist/hooks/use-interaction-interventions.d.ts +27 -0
  47. package/dist/hooks/use-interaction-invalidation.d.ts +19 -0
  48. package/dist/hooks/use-network-routes.d.ts +25 -0
  49. package/dist/hooks/use-site-auth-connections.d.ts +25 -0
  50. package/dist/hooks/use-supergrok-accounts.d.ts +26 -0
  51. package/dist/hooks/use-terminal-stream.d.ts +3 -0
  52. package/dist/index.d.ts +4 -0
  53. package/dist/index.js +1220 -1545
  54. package/dist/index.js.map +1 -1
  55. package/dist/interaction.d.ts +13 -3
  56. package/dist/interaction.js +520 -6
  57. package/dist/interaction.js.map +1 -1
  58. package/dist/interactive-workbench-viewers-TOHBXJEE.js +15 -0
  59. package/dist/lib/host-platform.d.ts +5 -0
  60. package/dist/lib/relay-wire.d.ts +20 -1
  61. package/dist/machines.js +3 -3
  62. package/dist/model-policy.d.ts +1 -1
  63. package/dist/model-policy.js +1 -1
  64. package/dist/provider.d.ts +3 -2
  65. package/dist/realtime/realtime-control.d.ts +6 -2
  66. package/dist/realtime.js +138 -24
  67. package/dist/realtime.js.map +1 -1
  68. package/dist/session-context.d.ts +10 -2
  69. package/dist/session-ui.js +3 -3
  70. package/dist/session.js +11 -11
  71. package/dist/timeline/types.d.ts +5 -0
  72. package/package.json +2 -2
  73. package/src/artifacts.ts +3 -0
  74. package/src/client.ts +73 -3
  75. package/src/components/artifacts/index.ts +5 -0
  76. package/src/components/artifacts/published-html-artifact-frame.tsx +38 -0
  77. package/src/components/browser-input.ts +65 -0
  78. package/src/components/browser-viewer.tsx +1287 -177
  79. package/src/components/computer-viewer.tsx +611 -114
  80. package/src/components/desktop-viewer.tsx +114 -1
  81. package/src/components/interaction-intervention-banner.tsx +99 -0
  82. package/src/components/machines/machine-detail.tsx +1 -1
  83. package/src/components/model-policy-picker.tsx +15 -0
  84. package/src/components/sandbox-terminal.tsx +24 -7
  85. package/src/components/sandbox-workspace.tsx +42 -4
  86. package/src/components/workspace-dock.tsx +59 -5
  87. package/src/hooks/use-attached-browsers.ts +13 -11
  88. package/src/hooks/use-auth-runs.ts +278 -0
  89. package/src/hooks/use-browser-downloads.ts +218 -0
  90. package/src/hooks/use-browser-frame-stream.ts +168 -59
  91. package/src/hooks/use-browser-identities.ts +47 -6
  92. package/src/hooks/use-browser-session.ts +94 -27
  93. package/src/hooks/use-browser-sessions.ts +19 -14
  94. package/src/hooks/use-channels.ts +99 -0
  95. package/src/hooks/use-computer-frame-stream.ts +184 -61
  96. package/src/hooks/use-computer-session.ts +22 -2
  97. package/src/hooks/use-computer-sessions.ts +19 -13
  98. package/src/hooks/use-desktop-stream.ts +39 -7
  99. package/src/hooks/use-interaction-interventions.ts +242 -0
  100. package/src/hooks/use-interaction-invalidation.ts +66 -0
  101. package/src/hooks/use-machine-chip.ts +13 -3
  102. package/src/hooks/use-network-routes.ts +214 -0
  103. package/src/hooks/use-site-auth-connections.ts +226 -0
  104. package/src/hooks/use-supergrok-accounts.ts +81 -0
  105. package/src/hooks/use-terminal-stream.ts +288 -55
  106. package/src/index.ts +8 -0
  107. package/src/interaction.ts +30 -0
  108. package/src/lib/host-platform.ts +10 -0
  109. package/src/lib/relay-wire.ts +43 -4
  110. package/src/lib/terminal-capability.ts +1 -1
  111. package/src/model-policy.ts +19 -4
  112. package/src/provider.tsx +133 -1
  113. package/src/realtime/realtime-control.tsx +181 -26
  114. package/src/session-context.ts +66 -1
  115. package/src/timeline/activity-rail.tsx +6 -0
  116. package/src/timeline/projection.ts +58 -0
  117. package/src/timeline/types.ts +2 -0
  118. package/styles/compiled.css +64 -6
  119. package/dist/chunk-23EJ676W.js.map +0 -1
  120. package/dist/chunk-6BBWWOOU.js +0 -82
  121. package/dist/chunk-6BBWWOOU.js.map +0 -1
  122. package/dist/chunk-7I2KB3OK.js +0 -3895
  123. package/dist/chunk-7I2KB3OK.js.map +0 -1
  124. package/dist/chunk-HDBG7XGO.js.map +0 -1
  125. package/dist/chunk-JAGDUCZQ.js.map +0 -1
  126. package/dist/chunk-JR3QFY6B.js.map +0 -1
  127. package/dist/chunk-WYA65Y3F.js.map +0 -1
  128. package/dist/chunk-X4S56Y2H.js.map +0 -1
  129. package/dist/interactive-workbench-viewers-KHNOHWQE.js +0 -13
  130. /package/dist/{chunk-ROIRTM37.js.map → chunk-5UQPNLIO.js.map} +0 -0
  131. /package/dist/{chunk-724BW4TW.js.map → chunk-IGC6A2ZI.js.map} +0 -0
  132. /package/dist/{interactive-workbench-viewers-KHNOHWQE.js.map → interactive-workbench-viewers-TOHBXJEE.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/timeline/tool-display-name.ts","../src/timeline/projection.ts","../src/timeline/fleet-decision-projection.ts"],"sourcesContent":["/**\n * MCP / first-party tool naming helpers.\n *\n * Wire names are often `<serverId>__<toolName>` (see prefixedMcpToolName).\n * Matching and titles must use the leaf tool name so `opengeni__session_create`\n * and bare `session_create` resolve the same UI — without inventing previews\n * from argument JSON.\n */\n\n/** Leaf tool name after the first `__` server boundary (or the whole name). */\nexport function mcpToolLeaf(name: string): string {\n const boundary = name.indexOf(\"__\");\n return boundary >= 0 ? name.slice(boundary + 2) : name;\n}\n\n/**\n * True when `wireName` is exactly `leaf` or ends with `__${leaf}` (MCP prefix).\n * Does not treat arbitrary suffixes as matches — the leaf must be the full\n * right-hand side after `__`.\n */\nexport function toolMatchesLeaf(wireName: string, leaf: string): boolean {\n return wireName === leaf || wireName.endsWith(`__${leaf}`);\n}\n\n/**\n * Readable label for a tool call (\"session_create\" / \"opengeni__session_create\"\n * → \"Session create\"). Title-cases the first character of the leaf phrase.\n */\nexport function toolDisplayName(name: string): string {\n const phrase = mcpToolLeaf(name).replace(/[_-]+/g, \" \").trim();\n if (!phrase) {\n return name;\n }\n return phrase.charAt(0).toUpperCase() + phrase.slice(1);\n}\n","import {\n parseMediaGenerationResult,\n type SessionEvent,\n type SessionStatus,\n type TimelineAnnotation,\n} from \"@opengeni/sdk\";\nimport fleetDecisionItem from \"./fleet-decision-projection\";\nimport {\n CREDIT_EXHAUSTION_MESSAGE,\n humanizeFailureReason,\n isCreditExhaustion,\n tryParseJson,\n} from \"../lib/format\";\nimport { mcpToolLeaf, toolMatchesLeaf } from \"./tool-display-name\";\nimport type {\n AgentMessageItem,\n ActivityItem,\n AuthNeededItem,\n ContextCompactionItem,\n GoalItem,\n MachineInputBatchItem,\n MemoryItem,\n SandboxItem,\n SessionStatusItem,\n TimelineGroup,\n TimelineItem,\n TurnEndItem,\n ToolCallItem,\n ToolCallTruncation,\n WorkerItem,\n} from \"./types\";\n\nexport { toolDisplayName, mcpToolLeaf, toolMatchesLeaf } from \"./tool-display-name\";\n\n/* ----------------------------------------------------------------------------\n Timeline projection\n\n `buildTimeline` folds a session's raw event log (replayed + live, ordered by\n sequence) into renderable items: chat messages with accumulated streaming\n deltas, reasoning summaries, tool calls matched to their outputs, sandbox\n operations with command output, spawned-worker status (the manager's\n `session_create` / `session_send_message` orchestration calls), goal\n markers, status changes, and turn failures.\n\n It is a pure function — same events in, same items out — so it can be\n memoized, unit-tested, and re-run incrementally as new events stream in.\n -------------------------------------------------------------------------- */\n\n/** Tool leaves on the first-party OpenGeni MCP server that operate on sessions. */\nconst WORKER_SPAWN_TOOL = \"session_create\";\nconst WORKER_MESSAGE_TOOL = \"session_send_message\";\nconst WORKER_FAILURE_CODE_MAX_LENGTH = 128;\nconst WORKER_FAILURE_MESSAGE_MAX_UTF8_BYTES = 1_024;\n\n/**\n * Tools whose durable side-effect events already own the timeline (MemoryRow).\n * Emitting a generic tool-call too is double chrome — skip the call.\n *\n * Goal tools are intentionally NOT landmark-only: an agent `goal_set` /\n * `goal_update` / `goal_complete` / `goal_pause` stays an in-cluster tool row,\n * and the matching `goal.*` session event is suppressed below when `actor` is\n * `\"agent\"`. That keeps mid-turn goal tools from splitting the step rail with\n * a breakaway GoalRow pill. Non-agent goal events (API, create-session,\n * system auto-pause, continuations) still render as landmarks.\n *\n * Solo `goal_continuation` machine-input batches are also suppressed: the\n * paired `goal.continuation` GoalRow already marks the tick; rendering both\n * restates the goal text. Mixed batches (continuation + other kinds) still\n * render as machine-input rows.\n */\nconst LANDMARK_ONLY_TOOL_LEAVES = new Set([\"memory_save\", \"memory_correct\"]);\nconst TIMELINE_ANNOTATION_ANSI_SEQUENCE = new RegExp(\"\\\\u001B\\\\[[0-?]*[ -/]*[@-~]\", \"g\");\n\nfunction safeTimelineAnnotationJson(value: unknown): string {\n try {\n return JSON.stringify(value) ?? \"\";\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction timelineAnnotationToolOutputValue(value: unknown, depth = 0): string {\n if (depth > 8 || value === null || value === undefined) {\n return value == null ? \"\" : safeTimelineAnnotationJson(value);\n }\n if (typeof value === \"string\") return value;\n if (typeof value !== \"object\" || Array.isArray(value)) {\n return safeTimelineAnnotationJson(value);\n }\n const record = value as Record<string, unknown>;\n if (record.type === \"text\" && typeof record.text === \"string\") return record.text;\n if (Array.isArray(record.content)) {\n const text = record.content.find(\n (part) =>\n part !== null &&\n typeof part === \"object\" &&\n (part as { type?: unknown }).type === \"text\" &&\n typeof (part as { text?: unknown }).text === \"string\",\n ) as { text: string } | undefined;\n if (text) return text.text;\n }\n if (\"structuredContent\" in record) {\n return timelineAnnotationToolOutputValue(record.structuredContent, depth + 1);\n }\n if (\"result\" in record) return timelineAnnotationToolOutputValue(record.result, depth + 1);\n return safeTimelineAnnotationJson(value);\n}\n\n/** Browser mirror of the server's canonical annotation source projection. */\nfunction timelineAnnotationToolOutputText(output: unknown): string | null {\n const raw = timelineAnnotationToolOutputValue(output);\n const marker = raw.indexOf(\"\\nOutput:\\n\");\n const text = (\n marker >= 0\n ? raw.slice(marker + \"\\nOutput:\\n\".length)\n : raw.startsWith(\"Output:\\n\")\n ? raw.slice(\"Output:\\n\".length)\n : raw\n ).replace(TIMELINE_ANNOTATION_ANSI_SEQUENCE, \"\");\n return text.length > 0 ? text : null;\n}\n\nexport function buildTimeline(events: SessionEvent[]): TimelineItem[] {\n const items: TimelineItem[] = [];\n const prescan = prescanTurnAnchors(events);\n const ordered = orderTimelineEvents(events, prescan);\n\n const last = (): TimelineItem | undefined => items[items.length - 1];\n\n /** A new item of a different kind ends whatever was streaming at the tail. */\n const closeStreamingTail = (): void => {\n const open = last();\n if ((open?.kind === \"agent-message\" || open?.kind === \"reasoning\") && open.streaming) {\n open.streaming = false;\n }\n };\n\n const finalizeOpen = (\n turnId?: string | null,\n disposition: \"complete\" | \"failed\" | \"cancelled\" = \"complete\",\n ): void => {\n for (const item of items) {\n if (\n turnId !== undefined &&\n \"turnId\" in item &&\n item.turnId &&\n turnId &&\n item.turnId !== turnId\n ) {\n continue;\n }\n if ((item.kind === \"agent-message\" || item.kind === \"reasoning\") && item.streaming) {\n item.streaming = false;\n }\n if ((item.kind === \"tool-call\" || item.kind === \"worker\") && item.status === \"running\") {\n item.status = disposition;\n }\n if (item.kind === \"sandbox\" && item.status === \"running\") {\n item.status = disposition;\n }\n }\n };\n\n for (const event of ordered) {\n const payload = asRecord(event.payload);\n const turnId = event.turnId ?? null;\n\n switch (event.type) {\n case \"user.message\": {\n // A steering message must not mark in-flight tools complete; it only\n // ends whatever text was streaming. Turn lifecycle events finalize.\n closeStreamingTail();\n const childCompletion = workerCompletionPayload(payload.childCompletion);\n if (childCompletion) {\n items.push({\n kind: \"worker-completion\",\n id: event.id,\n turnId,\n occurredAt: event.occurredAt,\n childSessionId: childCompletion.childSessionId,\n childStatus: childCompletion.childStatus,\n goalStatus: childCompletion.goalStatus,\n goalText: childCompletion.goalText,\n evidence: childCompletion.evidence,\n pausedReason: childCompletion.pausedReason,\n text: stringValue(payload.text),\n });\n break;\n }\n const voiceMessage = realtimeVoiceMessage(payload);\n items.push({\n kind: \"user-message\",\n id: event.id,\n text: voiceMessage?.text ?? stringValue(payload.text),\n annotations: timelineAnnotations(payload.annotations),\n annotationSource: {\n kind: \"user_message\",\n eventId: event.id,\n eventType: \"user.message\",\n sequence: event.sequence,\n turnId,\n text: voiceMessage?.text ?? stringValue(payload.text),\n },\n ...(voiceMessage ? { presentation: voiceMessage.presentation } : {}),\n resources: resourceRefs(payload.resources),\n tools: toolRefs(payload.tools),\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"system.update.delivered\": {\n const inputs = machineInputMembers(payload.members);\n if (inputs.length === 0) break;\n // Goal continuations already land as `goal.continuation` GoalRows.\n // A solo continuation batch would duplicate that landmark + dump the\n // model-facing prompt — skip chrome for that case only.\n if (inputs.every((member) => member.kind === \"goal_continuation\")) {\n break;\n }\n closeStreamingTail();\n items.push({\n kind: \"machine-input-batch\",\n id: event.id,\n turnId,\n members: inputs,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"agent.message.delta\": {\n const text = stringValue(payload.text);\n if (!text) {\n break;\n }\n const open = last();\n if (open?.kind === \"agent-message\" && open.streaming && open.turnId === turnId) {\n open.text += text;\n break;\n }\n closeStreamingTail();\n items.push({\n kind: \"agent-message\",\n id: event.id,\n turnId,\n text,\n streaming: true,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"agent.message.completed\": {\n const text = stringValue(payload.text);\n // Reconcile the most recent same-turn agent message — even when\n // activity (tool calls, reasoning) landed after its deltas — so the\n // completed text never duplicates the streamed one.\n let openIndex = -1;\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const candidate = items[index];\n if (candidate?.kind === \"agent-message\" && candidate.turnId === turnId) {\n openIndex = index;\n break;\n }\n }\n const candidate = openIndex >= 0 ? items[openIndex] : undefined;\n const open: AgentMessageItem | undefined =\n candidate?.kind === \"agent-message\" ? candidate : undefined;\n if (\n open &&\n (open.streaming || !open.text || text === open.text || text.startsWith(open.text))\n ) {\n // The completed text is authoritative when it extends what streamed.\n if (!open.text || (text && text.startsWith(open.text))) {\n open.text = text || open.text;\n }\n open.streaming = false;\n // Completion time is what the footer shows (\"finished at\"); keep the\n // first-delta stamp only until this event arrives.\n open.occurredAt = event.occurredAt;\n open.annotationSource =\n text && open.text === text\n ? {\n kind: \"assistant_message\",\n eventId: event.id,\n eventType: \"agent.message.completed\",\n sequence: event.sequence,\n turnId,\n text,\n }\n : undefined;\n // The SDK can emit a hosted-tool item only after its provider-native\n // operation has completed, even though answer deltas were already\n // streamed. The completed message event is the durable ordering\n // authority, so move the reconciled row after any intervening tool\n // activity instead of leaving completed web searches below the answer.\n if (openIndex < items.length - 1) {\n items.splice(openIndex, 1);\n items.push(open);\n }\n break;\n }\n if (text) {\n items.push({\n kind: \"agent-message\",\n id: event.id,\n turnId,\n text,\n streaming: false,\n occurredAt: event.occurredAt,\n annotationSource: {\n kind: \"assistant_message\",\n eventId: event.id,\n eventType: \"agent.message.completed\",\n sequence: event.sequence,\n turnId,\n text,\n },\n });\n }\n break;\n }\n\n case \"agent.reasoning.delta\": {\n const text = reasoningText(event.payload);\n if (!text) {\n break;\n }\n const open = last();\n if (open?.kind === \"reasoning\" && open.streaming && open.turnId === turnId) {\n open.text += text;\n break;\n }\n closeStreamingTail();\n items.push({\n kind: \"reasoning\",\n id: event.id,\n turnId,\n text,\n streaming: true,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"agent.toolCall.created\": {\n const name = typeof payload.name === \"string\" ? payload.name : \"tool\";\n const callId = typeof payload.id === \"string\" ? payload.id : null;\n const args = payload.arguments ?? null;\n closeStreamingTail();\n if (\n toolMatchesLeaf(name, WORKER_SPAWN_TOOL) ||\n toolMatchesLeaf(name, WORKER_MESSAGE_TOOL)\n ) {\n items.push({\n kind: \"worker\",\n id: event.id,\n turnId,\n callId,\n action: toolMatchesLeaf(name, WORKER_SPAWN_TOOL) ? \"spawn\" : \"message\",\n prompt: workerPrompt(args),\n workerSessionId: extractSessionRef(args),\n failure: null,\n status: \"running\",\n occurredAt: event.occurredAt,\n });\n break;\n }\n if (LANDMARK_ONLY_TOOL_LEAVES.has(mcpToolLeaf(name))) {\n // Goal/memory landmarks arrive as goal.* / memory.* events.\n break;\n }\n // Live Responses `web_search_call` events and the later SDK\n // `RunToolCallItem` share the same item id. Merge so mid-stream cards\n // do not duplicate when the step finally materializes.\n if (callId) {\n const existing = [...items]\n .reverse()\n .find(\n (item): item is ToolCallItem => item.kind === \"tool-call\" && item.callId === callId,\n );\n if (existing) {\n if (args != null) {\n existing.arguments = args;\n }\n if (payload.raw !== undefined) {\n existing.raw = mergeToolCallRaw(existing.raw, payload.raw);\n }\n existing.status = providerNativeToolStatus(existing.raw);\n break;\n }\n }\n items.push({\n kind: \"tool-call\",\n id: event.id,\n turnId,\n callId,\n name,\n arguments: args,\n output: undefined,\n truncation: null,\n // The provider-native item drives the per-tool renderers (apply_patch\n // operation, computer_call action, web_search providerData, …).\n raw: payload.raw,\n status: providerNativeToolStatus(payload.raw),\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"agent.toolCall.output\": {\n const callId = typeof payload.id === \"string\" ? payload.id : null;\n const target = findOpenCall(items, callId);\n if (!target) {\n break;\n }\n if (target.kind === \"worker\") {\n // A worker spawn/message that returns an error flag (or an MCP\n // isError result) settles to \"failed\" too, so WorkerRow surfaces it.\n target.status = isErrorOutput(payload) ? \"failed\" : \"complete\";\n target.workerSessionId = target.workerSessionId ?? extractSessionRef(payload.output);\n target.failure = target.status === \"failed\" ? workerFailure(payload.output) : null;\n break;\n }\n // An output carrying an explicit error flag (or an MCP isError result)\n // settles the tool to \"failed\" so the renderer can surface it loudly.\n const truncation = toolCallTruncation(payload);\n target.status = isErrorOutput(payload) ? \"failed\" : \"complete\";\n target.output = Object.prototype.hasOwnProperty.call(payload, \"output\")\n ? payload.output\n : truncation && typeof payload.preview === \"string\"\n ? payload.preview\n : payload.output;\n target.truncation = truncation;\n const sourceText = timelineAnnotationToolOutputText(\n Object.prototype.hasOwnProperty.call(payload, \"output\")\n ? payload.output\n : payload.preview,\n );\n if (sourceText !== null) {\n target.annotationSource = {\n kind: \"tool_output\",\n eventId: event.id,\n eventType: \"agent.toolCall.output\",\n sequence: event.sequence,\n turnId,\n text: sourceText,\n label: target.name,\n };\n }\n break;\n }\n\n case \"sandbox.operation.started\":\n case \"sandbox.operation.completed\":\n case \"sandbox.operation.failed\": {\n const name = typeof payload.name === \"string\" ? payload.name : \"sandbox\";\n const status = event.type.endsWith(\".failed\")\n ? \"failed\"\n : event.type.endsWith(\".completed\")\n ? \"complete\"\n : \"running\";\n // Routine per-turn platform plumbing that runs before EVERY turn to\n // guarantee box contents survive a re-warm — NOT the agent redoing work:\n // - repository-clone: idempotent clone check + off-manifest token re-seed;\n // - file-resource-download: idempotent `if [ ! -f ] then curl` (skips\n // when the attached file is already on the box — see\n // sandboxFileDownloadCommand), so an uploaded image is not re-fetched;\n // the operation still emits every turn even when it does nothing.\n // Rendering either every turn reads as churn. Only FAILURES surface, and\n // they surface loudly — the failed event below creates its own item even\n // without a started row.\n if (\n (name === \"repository-clone\" || name === \"file-resource-download\") &&\n status !== \"failed\"\n ) {\n break;\n }\n const existing = findOpenSandbox(items, name);\n if (existing && status !== \"running\") {\n existing.status = status;\n if (\n payload.origin === \"created\" ||\n payload.origin === \"restored\" ||\n payload.origin === \"resumed\"\n ) {\n existing.origin = payload.origin;\n }\n const message = failureMessage(payload);\n if (message) {\n existing.output = existing.output ? `${existing.output}\\n${message}` : message;\n }\n break;\n }\n if (!existing) {\n closeStreamingTail();\n items.push({\n kind: \"sandbox\",\n id: event.id,\n turnId,\n name,\n command: typeof payload.command === \"string\" ? payload.command : null,\n output: failureMessage(payload) ?? \"\",\n origin:\n payload.origin === \"created\" ||\n payload.origin === \"restored\" ||\n payload.origin === \"resumed\"\n ? payload.origin\n : null,\n status,\n occurredAt: event.occurredAt,\n });\n }\n break;\n }\n\n case \"sandbox.command.output.delta\": {\n // `chunk` is the canonical wire field; text/output are legacy shapes.\n const text =\n typeof payload.chunk === \"string\"\n ? payload.chunk\n : typeof payload.text === \"string\"\n ? payload.text\n : typeof payload.output === \"string\"\n ? payload.output\n : \"\";\n if (!text) {\n break;\n }\n // Attach to the named operation when the payload carries one;\n // otherwise the latest running operation is the best available owner.\n const open =\n (typeof payload.name === \"string\" ? findOpenSandbox(items, payload.name) : undefined) ??\n [...items]\n .reverse()\n .find(\n (item): item is SandboxItem => item.kind === \"sandbox\" && item.status === \"running\",\n );\n if (open) {\n open.output += text;\n }\n break;\n }\n\n case \"session.status.changed\": {\n const status = payload.status;\n if (!isSessionStatus(status)) {\n break;\n }\n // Only attention-worthy statuses earn a timeline divider. queued /\n // running / idle are machinery telemetry: the header pill carries the\n // live status, the shimmer says \"running\", and the turn chip's duration\n // facet says how long — a stale \"idle · 27s\" row is pure noise,\n // especially in historical traces.\n if (!ATTENTION_STATUSES.has(status)) {\n break;\n }\n const previous = [...items]\n .reverse()\n .find((item): item is SessionStatusItem => item.kind === \"session-status\");\n if (previous?.status === status) {\n break;\n }\n items.push({\n kind: \"session-status\",\n id: event.id,\n status,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"session.requiresAction\": {\n finalizeOpen(turnId);\n items.push({\n kind: \"notice\",\n id: event.id,\n tone: \"waiting\",\n text: \"Approval needed — the turn is paused until someone decides.\",\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"session.context.compaction.requested\":\n case \"session.context.compaction.started\": {\n closeStreamingTail();\n settleOrPushContextCompaction(items, {\n id: event.id,\n turnId,\n phase: \"started\",\n trigger: compactionTrigger(payload),\n estimatedTokensBefore: numberOrNull(payload.estimatedTokensBefore),\n estimatedTokensAfter: null,\n skipReason: null,\n implementation:\n typeof payload.implementation === \"string\" ? payload.implementation : null,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"session.context.compacted\": {\n closeStreamingTail();\n settleOrPushContextCompaction(items, {\n id: event.id,\n turnId,\n phase: \"compacted\",\n trigger: compactionTrigger(payload),\n estimatedTokensBefore: numberOrNull(payload.estimatedTokensBefore),\n estimatedTokensAfter: numberOrNull(payload.estimatedTokensAfter),\n skipReason: null,\n implementation:\n typeof payload.implementation === \"string\" ? payload.implementation : null,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"session.context.compaction.skipped\": {\n closeStreamingTail();\n settleOrPushContextCompaction(items, {\n id: event.id,\n turnId,\n phase: \"skipped\",\n trigger: compactionTrigger(payload),\n estimatedTokensBefore: numberOrNull(payload.estimatedTokensBefore),\n estimatedTokensAfter: null,\n skipReason: typeof payload.reason === \"string\" ? payload.reason : null,\n implementation:\n typeof payload.implementation === \"string\" ? payload.implementation : null,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"turn.recovery.requested\": {\n // Recovery requests are durable control-plane evidence, not a user\n // message or proof that recovery succeeded. Live state already exposes\n // a genuinely recovering session; keep the raw event in Debug/audit.\n break;\n }\n\n case \"turn.event.rejected_late\": {\n // Attempt-fence rejections prove stale callbacks did not alter current\n // truth. They are useful diagnostics but never actionable chat content,\n // regardless of the rejected event type. Debug/audit retains the event.\n break;\n }\n\n case \"tool.auth_needed\":\n case \"credential.auth_needed\": {\n const capability = capabilityAuthorizationRequest(payload.capability);\n if (\n event.type === \"tool.auth_needed\" &&\n !stringValue(payload.toolName) &&\n stringValue(payload.serverId) !== \"codex_apps\"\n ) {\n // Historical optional-MCP initialize/tools-list credential misses are\n // setup availability, not evidence of a concrete conversational tool\n // call. Keep the raw event in Debug/audit but do not manufacture an\n // actionable reconnect card in the transcript. Actual tools/call auth\n // failures carry a concrete toolName and remain visible.\n break;\n }\n // Keep the whole structured payload — the renderer turns it into a clean\n // inline reconnect card, and the app starts the recovery flow off the\n // connectionId/resource. Losing it to a plain-text notice was the ugly\n // \"linear.app needs to be reconnected.\" line users complained about.\n closeStreamingTail();\n items.push({\n kind: \"auth-needed\",\n id: event.id,\n turnId,\n serverId: typeof payload.serverId === \"string\" ? payload.serverId : null,\n source: capability\n ? \"capability\"\n : event.type === \"tool.auth_needed\"\n ? \"tool\"\n : \"credential\",\n providerDomain: stringValue(payload.providerDomain),\n connectionId: typeof payload.connectionId === \"string\" ? payload.connectionId : null,\n reason: authNeededReason(payload.reason),\n scopes: stringList(payload.scopes),\n resource: typeof payload.resource === \"string\" ? payload.resource : null,\n toolName: typeof payload.toolName === \"string\" ? payload.toolName : null,\n authorizationUrl:\n typeof payload.authorizationUrl === \"string\" ? payload.authorizationUrl : null,\n capability,\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"turn.completed\": {\n // A standalone manual compaction uses the turn ledger for fencing and\n // recovery, but it is maintenance rather than a conversational turn.\n // The dedicated context-compaction landmark is the complete UI truth;\n // adding a generic turn chip would falsely make it look like an\n // extra agent response.\n if (payload.maintenance === \"context_compaction\") {\n finalizeOpen(turnId);\n break;\n }\n // Credit exhaustion arrives as a NOMINALLY completed turn (`detail:\n // \"insufficient OpenGeni credits\"`, `segmentLimit: \"budget_exhausted\"`)\n // — the engine ended the segment early, it did not finish the work.\n // Rendering it as a clean \"complete\" turn is a lie that leaves the\n // session looking healthy while every future turn silently dies, so it\n // projects exactly like a failed turn plus an explicit notice.\n if (isCreditExhaustionPayload(payload)) {\n finalizeOpen(turnId);\n items.push(turnEndItem(event, \"failed\", CREDIT_EXHAUSTION_MESSAGE));\n items.push({\n kind: \"notice\",\n id: event.id,\n tone: \"failed\",\n text: CREDIT_EXHAUSTION_MESSAGE,\n occurredAt: event.occurredAt,\n });\n break;\n }\n finalizeOpen(turnId);\n items.push(turnEndItem(event, \"complete\", null));\n break;\n }\n\n case \"turn.failed\": {\n const hadActivity = hasTurnActivity(items, turnId);\n // Credit death can hide behind fields `failureMessage` doesn't read\n // (detail/segmentLimit), so classify the whole payload before falling\n // back to the generic error/message extraction.\n const failureText = isCreditExhaustionPayload(payload)\n ? CREDIT_EXHAUSTION_MESSAGE\n : failureMessage(payload);\n // The TURN failed — the in-flight items did not. Chip doctrine: red is\n // spent once, on the turn-level outcome. Items caught mid-flight read\n // as calm \"interrupted\" (same as turn.cancelled); an item that itself\n // failed keeps its own failed status from its output event.\n finalizeOpen(turnId, \"cancelled\");\n items.push(turnEndItem(event, \"failed\", failureText));\n if (!hadActivity) {\n items.push({\n kind: \"notice\",\n id: event.id,\n tone: \"failed\",\n text: failureText ?? \"The turn failed.\",\n occurredAt: event.occurredAt,\n });\n }\n break;\n }\n\n case \"turn.cancelled\": {\n // A retraction of a never-started queued turn is not a turn ending —\n // the message was withdrawn before any work happened; show nothing.\n // A null turnId proves nothing, so it keeps the legacy finalize path.\n if (turnId && !prescan.startedTurnIds.has(turnId)) {\n break;\n }\n const hadActivity = hasTurnActivity(items, turnId);\n finalizeOpen(turnId, \"cancelled\");\n items.push(turnEndItem(event, \"cancelled\", null));\n if (!hadActivity) {\n items.push({\n kind: \"notice\",\n id: event.id,\n tone: \"cancelled\",\n text: \"Interrupted.\",\n occurredAt: event.occurredAt,\n });\n }\n break;\n }\n\n case \"memory.saved\":\n case \"memory.corrected\": {\n // A first-party memory write is a discrete step, not streamed text, so it\n // ends whatever was streaming (mirrors tool/sandbox pushes). A payload\n // missing the memory id is malformed and dropped rather than shown blank.\n const memory = memoryItem(event.id, event.type, turnId, payload, event.occurredAt);\n if (memory) {\n closeStreamingTail();\n items.push(memory);\n }\n break;\n }\n\n case \"codex.fleet.decision\": {\n const decision = fleetDecisionItem(event, payload);\n if (decision) {\n closeStreamingTail();\n items.push(decision);\n }\n break;\n }\n\n case \"goal.set\":\n case \"goal.updated\":\n case \"goal.completed\":\n case \"goal.paused\":\n case \"goal.resumed\":\n case \"goal.cleared\":\n case \"goal.continuation\": {\n // Agent tool mutations already appear as tool-call rows in the activity\n // cluster. Re-emitting them as GoalRow landmarks splits \"N steps\" mid-turn.\n if (shouldSuppressAgentGoalLandmark(event.type, payload)) {\n break;\n }\n items.push({\n kind: \"goal\",\n id: event.id,\n action: event.type.slice(\"goal.\".length) as GoalItem[\"action\"],\n text: goalText(payload),\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n default:\n break;\n }\n }\n\n for (const item of items) {\n if (item.kind === \"agent-message\") {\n item.text = stripOpaqueCitationTokens(item.text);\n }\n }\n return items;\n}\n\nfunction realtimeVoiceMessage(payload: Record<string, unknown>): {\n text: string;\n presentation: {\n kind: \"realtime_voice\" | \"realtime_voice_handoff\";\n context: string;\n };\n} | null {\n const presentation = asRecord(payload.presentation);\n const visibleText = stringValue(payload.text);\n if (presentation.kind === \"realtime_voice\" || presentation.kind === \"realtime_voice_handoff\") {\n const context = stringValue(presentation.context);\n return visibleText && context\n ? { text: visibleText, presentation: { kind: presentation.kind, context } }\n : null;\n }\n return null;\n}\n\nfunction providerNativeToolStatus(rawValue: unknown): ToolCallItem[\"status\"] {\n const raw = asRecord(rawValue);\n if (raw.type !== \"hosted_tool_call\") {\n return \"running\";\n }\n switch (raw.status) {\n case \"completed\":\n return \"complete\";\n case \"failed\":\n case \"incomplete\":\n return \"failed\";\n case \"cancelled\":\n return \"cancelled\";\n default:\n return \"running\";\n }\n}\n\n/**\n * Prefer newer status/fields, but keep earlier providerData.action when a\n * progress-only Responses event arrives without the search query payload.\n */\nfunction mergeToolCallRaw(existingValue: unknown, nextValue: unknown): unknown {\n const existing = asRecord(existingValue);\n const next = asRecord(nextValue);\n if (Object.keys(next).length === 0) {\n return existingValue;\n }\n const existingProvider = asRecord(existing.providerData);\n const nextProvider = asRecord(next.providerData);\n const providerData = {\n ...existingProvider,\n ...nextProvider,\n };\n if (\n existingProvider.action != null &&\n (nextProvider.action == null ||\n (typeof nextProvider.action === \"object\" &&\n nextProvider.action !== null &&\n Object.keys(nextProvider.action as object).length === 0))\n ) {\n providerData.action = existingProvider.action;\n }\n return {\n ...existing,\n ...next,\n ...(Object.keys(providerData).length > 0 ? { providerData } : {}),\n };\n}\n\n/**\n * Codex subscription web search can return private citation handles without\n * the URL annotation table that would make them resolvable. Keep the canonical\n * model-history item untouched, but never expose those unusable handles in the\n * human timeline. Ordinary markdown links and structured URL citations remain.\n */\nexport function stripOpaqueCitationTokens(text: string): string {\n return text.replace(/\\s*cite(?:[^]+)+/gu, \"\");\n}\n\n/** The turn-end payload shape, as `isCreditExhaustion` wants it. */\nfunction isCreditExhaustionPayload(payload: Record<string, unknown>): boolean {\n return isCreditExhaustion({\n error: typeof payload.error === \"string\" ? payload.error : null,\n detail: typeof payload.detail === \"string\" ? payload.detail : null,\n segmentLimit: typeof payload.segmentLimit === \"string\" ? payload.segmentLimit : null,\n });\n}\n\n/**\n * Whether the session's most recent turn ended in credit exhaustion — the\n * terminal credit state apps key their \"add credits\" affordances on. Derived\n * from the LAST turn-end event (completed/failed/cancelled): a later turn that\n * settles any other way (someone topped up and kept working) clears it.\n */\nexport function creditExhaustedFromEvents(events: SessionEvent[]): boolean {\n const ordered = [...events].sort((a, b) => a.sequence - b.sequence);\n for (let index = ordered.length - 1; index >= 0; index -= 1) {\n const event = ordered[index];\n if (\n event?.type !== \"turn.completed\" &&\n event?.type !== \"turn.failed\" &&\n event?.type !== \"turn.cancelled\"\n ) {\n continue;\n }\n return isCreditExhaustionPayload(asRecord(event.payload));\n }\n return false;\n}\n\n/** The latest session status carried in the event log, if any. */\nexport function sessionStatusFromEvents(events: SessionEvent[]): SessionStatus | null {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type !== \"session.status.changed\") {\n continue;\n }\n const status = asRecord(event.payload).status;\n if (isSessionStatus(status)) {\n return status;\n }\n }\n return null;\n}\n\n/* ----------------------------------------------------------------------------\n Visual grouping: consecutive activity items (reasoning / tools / workers /\n sandbox) cluster into collapsible blocks. Once a turn settles, the full\n non-user span folds behind a turn group, with activity blocks nested inside.\n -------------------------------------------------------------------------- */\n\n/**\n * Whether an item clusters into an activity block. A `switch` (not a stringly-\n * typed set) so adding an {@link ActivityItem} kind is a compile-time prompt to\n * decide its grouping — and it narrows `item` to `ActivityItem` with no cast.\n */\nfunction isActivityItem(item: TimelineItem): item is ActivityItem {\n switch (item.kind) {\n case \"reasoning\":\n case \"tool-call\":\n case \"worker\":\n case \"sandbox\":\n case \"memory\":\n case \"fleet-decision\":\n return true;\n default:\n return false;\n }\n}\n\nexport function groupTimeline(items: TimelineItem[]): TimelineGroup[] {\n const groups: TimelineGroup[] = [];\n for (const item of items) {\n if (isActivityItem(item)) {\n const open = groups[groups.length - 1];\n if (open?.kind === \"activity\" && open.outcome === undefined) {\n open.items.push(item);\n } else {\n groups.push({\n kind: \"activity\",\n id: `activity-${item.id}`,\n items: [item],\n });\n }\n continue;\n }\n if (item.kind === \"turn-end\") {\n stampTurnOutcome(groups, item);\n foldSettledTurn(groups, item);\n continue;\n }\n groups.push({ kind: \"item\", item });\n }\n return groups;\n}\n\n/* --- helpers ---------------------------------------------------------------- */\n\ntype TurnAnchorPrescan = {\n queuedTurnByTrigger: Map<string, string>;\n startSeqByTrigger: Map<string, number>;\n cancelledBeforeStartTriggers: Set<string>;\n startedTurnIds: Set<string>;\n};\n\nfunction prescanTurnAnchors(events: SessionEvent[]): TurnAnchorPrescan {\n const ordered = [...events].sort((a, b) => a.sequence - b.sequence);\n const queuedTurnByTrigger = new Map<string, string>();\n const startSeqByTrigger = new Map<string, number>();\n const cancelledTurnIds = new Set<string>();\n const fallbackSeqByTurn = new Map<string, number>();\n const startedTurnIds = new Set<string>();\n\n for (const event of ordered) {\n const payload = asRecord(event.payload);\n const turnId = event.turnId ?? null;\n if (event.type === \"turn.queued\") {\n const triggerEventId =\n typeof payload.triggerEventId === \"string\" ? payload.triggerEventId : null;\n const queuedTurnId = typeof payload.turnId === \"string\" ? payload.turnId : turnId;\n if (triggerEventId && queuedTurnId) {\n queuedTurnByTrigger.set(triggerEventId, queuedTurnId);\n }\n continue;\n }\n if (event.type === \"turn.started\") {\n const triggerEventId =\n typeof payload.triggerEventId === \"string\" ? payload.triggerEventId : null;\n if (triggerEventId && !startSeqByTrigger.has(triggerEventId)) {\n startSeqByTrigger.set(triggerEventId, event.sequence);\n }\n if (turnId) {\n startedTurnIds.add(turnId);\n }\n } else if (event.type === \"turn.cancelled\" && turnId) {\n cancelledTurnIds.add(turnId);\n }\n\n if (turnId && isTurnExecutionEvidence(event.type)) {\n const previous = fallbackSeqByTurn.get(turnId);\n if (previous === undefined || event.sequence < previous) {\n fallbackSeqByTurn.set(turnId, event.sequence);\n }\n }\n if (turnId && isTurnExecutionEvidence(event.type)) {\n startedTurnIds.add(turnId);\n }\n }\n\n for (const [triggerEventId, turnId] of queuedTurnByTrigger) {\n if (!startSeqByTrigger.has(triggerEventId)) {\n const fallbackSeq = fallbackSeqByTurn.get(turnId);\n if (fallbackSeq !== undefined) {\n startSeqByTrigger.set(triggerEventId, fallbackSeq);\n }\n }\n }\n\n const cancelledBeforeStartTriggers = new Set<string>();\n for (const [triggerEventId, turnId] of queuedTurnByTrigger) {\n if (\n cancelledTurnIds.has(turnId) &&\n !startSeqByTrigger.has(triggerEventId) &&\n !fallbackSeqByTurn.has(turnId)\n ) {\n cancelledBeforeStartTriggers.add(triggerEventId);\n }\n }\n\n return {\n queuedTurnByTrigger,\n startSeqByTrigger,\n cancelledBeforeStartTriggers,\n startedTurnIds,\n };\n}\n\nfunction orderTimelineEvents(events: SessionEvent[], prescan: TurnAnchorPrescan): SessionEvent[] {\n const ordered = [...events].sort((a, b) => a.sequence - b.sequence);\n const insertions = new Map<number, SessionEvent[]>();\n\n for (const event of ordered) {\n if (event.type !== \"user.message\") {\n continue;\n }\n const queuedTurnId = prescan.queuedTurnByTrigger.get(event.id);\n if (!queuedTurnId) {\n pushInsertion(insertions, event.sequence, event);\n continue;\n }\n if (prescan.cancelledBeforeStartTriggers.has(event.id)) {\n continue;\n }\n const startSeq = prescan.startSeqByTrigger.get(event.id);\n if (startSeq !== undefined) {\n pushInsertion(insertions, startSeq, event);\n continue;\n }\n // A waiting prompt belongs only in the prompt queue. It enters the\n // timeline at turn.started (or the first same-turn activity fallback),\n // never as a second queued representation.\n }\n\n const projected: SessionEvent[] = [];\n for (const event of ordered) {\n const before = insertions.get(event.sequence);\n if (before) {\n projected.push(...before);\n }\n if (event.type !== \"user.message\") {\n projected.push(event);\n }\n }\n return projected;\n}\n\nfunction pushInsertion(\n insertions: Map<number, SessionEvent[]>,\n sequence: number,\n event: SessionEvent,\n): void {\n const bucket = insertions.get(sequence);\n if (bucket) {\n bucket.push(event);\n } else {\n insertions.set(sequence, [event]);\n }\n}\n\nfunction isAgentActivityEvent(type: string): boolean {\n return type.startsWith(\"agent.\") || type.startsWith(\"sandbox.\");\n}\n\n/**\n * Evidence that a queued prompt crossed the execution boundary when an older\n * or partially recovered ledger is missing its canonical `turn.started`.\n * Queue/control bookkeeping intentionally does not qualify: moving, editing,\n * steering, or deleting a waiting row must never make its prompt appear in the\n * transcript as though inference had begun.\n */\nfunction isTurnExecutionEvidence(type: string): boolean {\n return (\n isAgentActivityEvent(type) ||\n type === \"turn.completed\" ||\n type === \"turn.failed\" ||\n type === \"turn.recovery.requested\" ||\n type === \"turn.capacity_waiting\" ||\n type === \"session.requiresAction\" ||\n type === \"tool.auth_needed\" ||\n type === \"credential.auth_needed\" ||\n type.startsWith(\"rig.setup.\") ||\n type === \"codex.capacity.waiting\" ||\n type === \"codex.capacity.resumed\" ||\n type === \"codex.fleet.decision\"\n );\n}\n\nfunction turnEndItem(\n event: SessionEvent,\n outcome: TurnEndItem[\"outcome\"],\n failureText: string | null,\n): TurnEndItem {\n return {\n kind: \"turn-end\",\n id: `${event.id}-turn-end`,\n turnId: event.turnId ?? null,\n outcome,\n failureText,\n occurredAt: event.occurredAt,\n };\n}\n\nfunction hasTurnActivity(items: TimelineItem[], turnId: string | null): boolean {\n if (turnId) {\n return items.some((item) => isActivityItem(item) && item.turnId === turnId);\n }\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (!item || item.kind === \"turn-end\" || item.kind === \"user-message\") {\n return false;\n }\n if (isActivityItem(item)) {\n return true;\n }\n }\n return false;\n}\n\nfunction stampTurnOutcome(groups: TimelineGroup[], turnEnd: TurnEndItem): void {\n if (turnEnd.turnId === null) {\n const trailing = groups[groups.length - 1];\n if (trailing?.kind === \"activity\" && trailing.outcome === undefined) {\n applyTurnOutcome(trailing, turnEnd);\n }\n return;\n }\n for (const group of groups) {\n if (group.kind !== \"activity\" || group.outcome !== undefined) {\n continue;\n }\n if (group.items.some((activity) => activity.turnId === turnEnd.turnId)) {\n applyTurnOutcome(group, turnEnd);\n }\n }\n}\n\nfunction applyTurnOutcome(\n group: Extract<TimelineGroup, { kind: \"activity\" }>,\n turnEnd: TurnEndItem,\n): void {\n // A sub-cluster reports ITS OWN outcome, not the turn's. When a turn fails\n // at step 7, clusters 1–6 completed — painting them all red says \"everything\n // broke\" when one thing did. The turn-level fold carries the turn outcome;\n // a cluster goes red only if an item inside it actually failed, and reads\n // \"cancelled\" (interrupted) only when it holds the items cut off mid-flight.\n if (turnEnd.outcome === \"complete\") {\n group.outcome = \"complete\";\n return;\n }\n const hasFailed = group.items.some((item) => \"status\" in item && item.status === \"failed\");\n const hasInterrupted = group.items.some(\n (item) => \"status\" in item && item.status === \"cancelled\",\n );\n group.outcome = hasFailed ? \"failed\" : hasInterrupted ? \"cancelled\" : \"complete\";\n if (turnEnd.failureText && hasFailed) {\n group.failureText = turnEnd.failureText;\n }\n}\n\nfunction foldSettledTurn(groups: TimelineGroup[], turnEnd: TurnEndItem): void {\n let startIndex = groups.length;\n let stoppedAtForeignTurn = false;\n while (startIndex > 0) {\n const previous = groups[startIndex - 1];\n if (isTurnBoundary(previous)) {\n break;\n }\n if (belongsToDifferentTurn(previous, turnEnd.turnId)) {\n stoppedAtForeignTurn = true;\n break;\n }\n startIndex -= 1;\n }\n if (stoppedAtForeignTurn) {\n while (startIndex < groups.length && isBetweenTurnDivider(groups[startIndex])) {\n startIndex += 1;\n }\n }\n\n const collected = groups.slice(startIndex);\n if (collected.length === 0) {\n return;\n }\n\n const finalMessage = extractFinalAgentMessage(collected, turnEnd);\n const body = finalMessage ? collected.slice(0, -1) : collected;\n if (body.length === 0) {\n return;\n }\n\n const firstOccurredAt = groupStartedAt(body[0]) ?? turnEnd.occurredAt;\n const prior = startIndex > 0 ? groups[startIndex - 1] : undefined;\n const contextCompactionCount =\n prior?.kind === \"item\" &&\n prior.item.kind === \"context-compaction\" &&\n prior.item.phase === \"compacted\"\n ? 1\n : 0;\n const turnGroup: TimelineGroup = {\n kind: \"turn\",\n id: `turn-${turnEnd.turnId ?? turnEnd.id}`,\n outcome: turnEnd.outcome,\n startedAt: firstOccurredAt,\n endedAt: turnEnd.occurredAt,\n groups: body,\n ...(contextCompactionCount > 0 ? { contextCompactionCount } : {}),\n };\n if (turnEnd.failureText) {\n turnGroup.failureText = turnEnd.failureText;\n }\n\n groups.splice(\n startIndex,\n collected.length,\n ...(finalMessage ? [turnGroup, finalMessage] : [turnGroup]),\n );\n}\n\nfunction isTurnBoundary(group: TimelineGroup | undefined): boolean {\n return (\n group?.kind === \"turn\" ||\n (group?.kind === \"item\" &&\n (group.item.kind === \"user-message\" ||\n group.item.kind === \"context-compaction\" ||\n (group.item.kind === \"machine-input-batch\" &&\n group.item.members.some((member) => member.kind === \"media_generation_result\")) ||\n (group.item.kind === \"notice\" && group.item.tone === \"input\")))\n );\n}\n\nfunction belongsToDifferentTurn(group: TimelineGroup | undefined, turnId: string | null): boolean {\n if (!group || !turnId) {\n return false;\n }\n if (group.kind === \"activity\") {\n return (\n group.items.length > 0 &&\n group.items.every((item) => item.turnId !== null && item.turnId !== turnId)\n );\n }\n return (\n group.kind === \"item\" &&\n group.item.kind === \"agent-message\" &&\n group.item.turnId !== null &&\n group.item.turnId !== turnId\n );\n}\n\nfunction isBetweenTurnDivider(group: TimelineGroup | undefined): boolean {\n return (\n group?.kind === \"item\" &&\n group.item.kind === \"session-status\" &&\n group.item.status !== \"running\"\n );\n}\n\nfunction extractFinalAgentMessage(\n groups: TimelineGroup[],\n turnEnd: TurnEndItem,\n): Extract<TimelineGroup, { kind: \"item\" }> | null {\n const tail = groups[groups.length - 1];\n if (tail?.kind !== \"item\" || tail.item.kind !== \"agent-message\" || tail.item.streaming) {\n return null;\n }\n if (tail.item.turnId && turnEnd.turnId && tail.item.turnId !== turnEnd.turnId) {\n return null;\n }\n return tail;\n}\n\nfunction groupStartedAt(group: TimelineGroup | undefined): string | undefined {\n if (!group) {\n return undefined;\n }\n switch (group.kind) {\n case \"item\":\n return group.item.occurredAt;\n case \"activity\":\n return group.items[0]?.occurredAt;\n case \"turn\":\n return group.startedAt;\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction numberOrNull(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction compactionTrigger(payload: Record<string, unknown>): ContextCompactionItem[\"trigger\"] {\n const trigger = payload.trigger;\n return trigger === \"auto\" ||\n trigger === \"operator\" ||\n trigger === \"proactive\" ||\n trigger === \"overflow\"\n ? trigger\n : null;\n}\n\n/**\n * Keep one landmark per turn: a later started/compacted/skipped settles the\n * open started row instead of stacking notices.\n */\nfunction settleOrPushContextCompaction(\n items: TimelineItem[],\n next: Omit<ContextCompactionItem, \"kind\">,\n): void {\n const openIndex = findOpenContextCompactionIndex(items, next.turnId);\n if (openIndex >= 0) {\n const open = items[openIndex];\n if (open?.kind === \"context-compaction\") {\n items[openIndex] = {\n ...open,\n ...next,\n // Prefer the settled event id so keys stay stable with the finish row.\n id: next.phase === \"started\" ? open.id : next.id,\n trigger: next.trigger ?? open.trigger,\n estimatedTokensBefore: next.estimatedTokensBefore ?? open.estimatedTokensBefore,\n implementation: next.implementation ?? open.implementation,\n };\n return;\n }\n }\n items.push({ kind: \"context-compaction\", ...next });\n}\n\nfunction findOpenContextCompactionIndex(items: TimelineItem[], turnId: string | null): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item?.kind !== \"context-compaction\" || item.phase !== \"started\") {\n continue;\n }\n if (turnId && item.turnId && item.turnId !== turnId) {\n continue;\n }\n return index;\n }\n return -1;\n}\n\nfunction machineInputMembers(value: unknown): MachineInputBatchItem[\"members\"] {\n const kinds = new Set<MachineInputBatchItem[\"members\"][number][\"kind\"]>([\n \"scheduled_occurrence\",\n \"goal_continuation\",\n \"agent_message\",\n \"agent_steer_instruction\",\n \"child_terminal_result\",\n \"media_generation_result\",\n ]);\n const classifications = new Set<MachineInputBatchItem[\"members\"][number][\"classification\"]>([\n \"success\",\n \"failure\",\n \"action_required\",\n \"info\",\n ]);\n return Array.isArray(value)\n ? value.flatMap((candidate) => {\n const member = asRecord(candidate);\n return typeof member.id === \"string\" &&\n typeof member.kind === \"string\" &&\n kinds.has(member.kind as MachineInputBatchItem[\"members\"][number][\"kind\"]) &&\n typeof member.classification === \"string\" &&\n classifications.has(\n member.classification as MachineInputBatchItem[\"members\"][number][\"classification\"],\n ) &&\n typeof member.sourceId === \"string\"\n ? (() => {\n const kind = member.kind as MachineInputBatchItem[\"members\"][number][\"kind\"];\n const result =\n kind === \"media_generation_result\"\n ? parseMediaGenerationResult(member.result)\n : null;\n return [\n {\n id: member.id,\n kind,\n classification:\n member.classification as MachineInputBatchItem[\"members\"][number][\"classification\"],\n sourceId: member.sourceId,\n summary: stringValue(member.summary),\n ...(result ? { result } : {}),\n },\n ];\n })()\n : [];\n })\n : [];\n}\n\nconst SESSION_STATUSES: readonly SessionStatus[] = [\n \"queued\",\n \"running\",\n \"idle\",\n \"requires_action\",\n \"failed\",\n \"cancelled\",\n];\n\n/** Statuses that demand the reader's attention and so earn a timeline divider. */\nconst ATTENTION_STATUSES: ReadonlySet<SessionStatus> = new Set([\n \"requires_action\",\n \"failed\",\n \"cancelled\",\n]);\n\n/** Keep only entries that match the wire shapes; user payloads are untyped. */\nfunction resourceRefs(value: unknown): import(\"@opengeni/sdk\").ResourceRef[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((entry): entry is import(\"@opengeni/sdk\").ResourceRef => {\n const record = asRecord(entry);\n if (record.kind === \"repository\") {\n return typeof record.uri === \"string\" && typeof record.ref === \"string\";\n }\n return record.kind === \"file\" && typeof record.fileId === \"string\";\n });\n}\n\nfunction timelineAnnotations(value: unknown): TimelineAnnotation[] {\n if (!Array.isArray(value)) return [];\n return value.filter((candidate): candidate is TimelineAnnotation => {\n const annotation = asRecord(candidate);\n const source = asRecord(annotation.source);\n return (\n typeof annotation.id === \"string\" &&\n typeof annotation.ordinal === \"number\" &&\n typeof annotation.quote === \"string\" &&\n typeof annotation.note === \"string\" &&\n typeof source.eventId === \"string\" &&\n typeof source.eventType === \"string\" &&\n typeof source.sequence === \"number\" &&\n typeof source.startOffset === \"number\" &&\n typeof source.endOffset === \"number\"\n );\n });\n}\n\nfunction toolRefs(value: unknown): import(\"@opengeni/sdk\").ToolRef[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((entry): entry is import(\"@opengeni/sdk\").ToolRef => {\n const record = asRecord(entry);\n return record.kind === \"mcp\" && typeof record.id === \"string\";\n });\n}\n\nfunction workerCompletionPayload(value: unknown): {\n childSessionId: string;\n childStatus: string;\n goalStatus: string | null;\n goalText: string | null;\n evidence: string | null;\n pausedReason: string | null;\n} | null {\n const payload = asRecord(value);\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (\n typeof payload.childSessionId !== \"string\" ||\n !uuidPattern.test(payload.childSessionId) ||\n typeof payload.status !== \"string\" ||\n payload.status.trim() === \"\"\n ) {\n return null;\n }\n const goal = asRecord(payload.goal);\n return {\n childSessionId: payload.childSessionId,\n childStatus: payload.status,\n goalStatus: typeof goal.status === \"string\" ? goal.status : null,\n goalText: typeof goal.text === \"string\" ? goal.text : null,\n evidence: typeof goal.evidence === \"string\" ? goal.evidence : null,\n // Console pauses and several server paths put the human explanation on\n // `rationale`, not `pausedReason` — same fallback the goal pill uses, so a\n // paused worker card never shows \"Worker paused\" with the reason missing.\n pausedReason:\n typeof goal.pausedReason === \"string\"\n ? goal.pausedReason\n : typeof goal.rationale === \"string\"\n ? goal.rationale\n : null,\n };\n}\n\nfunction isSessionStatus(value: unknown): value is SessionStatus {\n return typeof value === \"string\" && (SESSION_STATUSES as readonly string[]).includes(value);\n}\n\n/** Does this tool output represent an error (explicit flag or MCP `isError`)? */\nfunction isErrorOutput(payload: Record<string, unknown>): boolean {\n if (payload.error === true || payload.failed === true) {\n return true;\n }\n const output = payload.output;\n return (\n !!output && typeof output === \"object\" && (output as { isError?: unknown }).isError === true\n );\n}\n\nfunction toolCallTruncation(payload: Record<string, unknown>): ToolCallTruncation | null {\n const truncation = asRecord(payload.truncation);\n const fullEvidence = asRecord(truncation.fullEvidence);\n const surface = stringValue(truncation.surface);\n const reason = stringValue(truncation.reason);\n if (\n truncation.truncated !== true ||\n !surface ||\n !reason ||\n typeof fullEvidence.available !== \"boolean\"\n ) {\n return null;\n }\n return {\n truncated: true,\n surface,\n reason,\n omittedBytes: numberOrNull(truncation.omittedBytes),\n fullEvidence: {\n available: fullEvidence.available,\n reason: stringValue(fullEvidence.reason) || null,\n },\n };\n}\n\nfunction findOpenCall(\n items: TimelineItem[],\n callId: string | null,\n): ToolCallItem | WorkerItem | undefined {\n const reversed = [...items].reverse();\n const isCall = (item: TimelineItem): item is ToolCallItem | WorkerItem =>\n item.kind === \"tool-call\" || item.kind === \"worker\";\n if (callId) {\n const byId = reversed.find((item) => isCall(item) && item.callId === callId);\n if (byId) {\n return byId as ToolCallItem | WorkerItem;\n }\n }\n return reversed.find(\n (item): item is ToolCallItem | WorkerItem => isCall(item) && item.status === \"running\",\n );\n}\n\nfunction findOpenSandbox(items: TimelineItem[], name: string): SandboxItem | undefined {\n return [...items]\n .reverse()\n .find(\n (item): item is SandboxItem =>\n item.kind === \"sandbox\" && item.name === name && item.status === \"running\",\n );\n}\n\nfunction failureMessage(payload: Record<string, unknown>): string | null {\n for (const key of [\"error\", \"message\"] as const) {\n const value = payload[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n // Auth/quota provider errors are rewritten for the right audience\n // (raw text remains in the event payload for debug surfaces).\n return humanizeFailureReason(value);\n }\n }\n return null;\n}\n\nfunction goalText(payload: Record<string, unknown>): string | null {\n if (typeof payload.text === \"string\" && payload.text) {\n return payload.text;\n }\n const goal = asRecord(payload.goal);\n if (typeof goal.text === \"string\" && goal.text) {\n return goal.text;\n }\n if (typeof payload.prompt === \"string\" && payload.prompt) {\n return payload.prompt;\n }\n return null;\n}\n\n/**\n * Agent-owned goal mutations already have an in-cluster tool row. Suppress the\n * breakaway landmark for those only. `goal.completed` has no actor field today\n * and is only emitted by the agent tool, so it is always suppressed. API /\n * system / create-session / continuation landmarks stay visible.\n */\nfunction shouldSuppressAgentGoalLandmark(type: string, payload: Record<string, unknown>): boolean {\n if (type === \"goal.completed\") {\n return true;\n }\n if (type === \"goal.set\" || type === \"goal.updated\" || type === \"goal.paused\") {\n return payload.actor === \"agent\";\n }\n return false;\n}\n\n/**\n * Fold a `memory.saved` / `memory.corrected` event into a {@link MemoryItem}.\n * Reads DEFENSIVELY (the payload is untyped `unknown`, no Zod schema): a missing\n * memory id means a malformed event, so we return null and the case drops it.\n */\nfunction memoryItem(\n id: string,\n type: string,\n turnId: string | null,\n payload: Record<string, unknown>,\n occurredAt: string,\n): MemoryItem | null {\n const memoryId =\n typeof payload.memoryId === \"string\" && payload.memoryId ? payload.memoryId : null;\n if (!memoryId) {\n return null;\n }\n const replacementPreview =\n typeof payload.replacementPreview === \"string\" ? payload.replacementPreview : undefined;\n const replacementMemoryId =\n typeof payload.replacementMemoryId === \"string\" ? payload.replacementMemoryId : undefined;\n const action = typeof payload.action === \"string\" ? payload.action : undefined;\n return {\n kind: \"memory\",\n id,\n turnId,\n variant: type === \"memory.corrected\" ? \"corrected\" : \"saved\",\n memoryKind: stringValue(payload.kind),\n preview: stringValue(payload.preview),\n ...(payload.deduped === true ? { deduped: true } : {}),\n ...(replacementPreview ? { replacementPreview } : {}),\n ...(action ? { action } : {}),\n memoryId,\n ...(replacementMemoryId ? { replacementMemoryId } : {}),\n occurredAt,\n };\n}\n\nconst AUTH_NEEDED_REASONS: ReadonlySet<string> = new Set([\n \"missing_connection\",\n \"expired\",\n \"insufficient_scope\",\n \"refresh_failed\",\n \"personal_authority_unavailable\",\n \"unsupported_auth\",\n \"resource_scope_unavailable\",\n]);\n\nfunction authNeededReason(value: unknown): AuthNeededItem[\"reason\"] {\n return typeof value === \"string\" && AUTH_NEEDED_REASONS.has(value)\n ? (value as AuthNeededItem[\"reason\"])\n : null;\n}\n\nfunction capabilityAuthorizationRequest(\n value: unknown,\n): NonNullable<AuthNeededItem[\"capability\"]> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n const kind = record.kind;\n const source = record.source;\n const action = record.action;\n if (\n typeof record.id !== \"string\" ||\n typeof record.name !== \"string\" ||\n ![\"pack\", \"mcp\", \"api\", \"skill\", \"plugin\"].includes(String(kind)) ||\n ![\"built_in\", \"library\", \"configured\", \"public_registry\", \"registry\", \"manual\"].includes(\n String(source),\n ) ||\n ![\"connect\", \"add_credentials\", \"enable\"].includes(String(action)) ||\n typeof record.rationale !== \"string\"\n ) {\n return null;\n }\n return {\n id: record.id,\n name: record.name,\n kind: kind as NonNullable<AuthNeededItem[\"capability\"]>[\"kind\"],\n source: source as NonNullable<AuthNeededItem[\"capability\"]>[\"source\"],\n action: action as NonNullable<AuthNeededItem[\"capability\"]>[\"action\"],\n rationale: record.rationale,\n requiredVariables: stringList(record.requiredVariables),\n };\n}\n\nfunction stringList(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0)\n : [];\n}\n\nfunction reasoningText(payload: unknown): string {\n const record = asRecord(payload);\n if (typeof record.text === \"string\") {\n return record.text;\n }\n const content = asRecord(asRecord(record.item).rawItem).content;\n if (!Array.isArray(content)) {\n return \"\";\n }\n return content\n .map((part) => {\n const text = asRecord(part).text;\n return stringValue(text);\n })\n .join(\"\");\n}\n\n/** The worker's initial/sent message from `session_create`/`session_send_message` args. */\nfunction workerPrompt(args: unknown): string | null {\n const record = asRecord(typeof args === \"string\" ? tryParseJson(args) : args);\n for (const key of [\"initialMessage\", \"message\", \"text\", \"prompt\"] as const) {\n const value = record[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n return null;\n}\n\nfunction boundedWorkerFailureMessage(value: string): string | null {\n const normalized = value.replace(/[\\u0000-\\u001f\\u007f]+/g, \" \").trim();\n if (!normalized) return null;\n const encoded = new TextEncoder().encode(normalized);\n if (encoded.byteLength <= WORKER_FAILURE_MESSAGE_MAX_UTF8_BYTES) return normalized;\n let end = WORKER_FAILURE_MESSAGE_MAX_UTF8_BYTES;\n while (end > 0 && (encoded[end]! & 0xc0) === 0x80) end -= 1;\n return new TextDecoder().decode(encoded.slice(0, end)).trim();\n}\n\nfunction boundedWorkerFailure(value: unknown): WorkerItem[\"failure\"] {\n const record = asRecord(value);\n const code = typeof record.code === \"string\" ? record.code.trim() : \"\";\n const message =\n typeof record.message === \"string\" ? boundedWorkerFailureMessage(record.message) : null;\n if (!/^[A-Za-z0-9._:-]{1,128}$/.test(code) || !message) return null;\n return { code: code.slice(0, WORKER_FAILURE_CODE_MAX_LENGTH), message };\n}\n\n/**\n * Extract the API's structured orchestration failure from raw objects, JSON\n * text, or retained MCP CallToolResult wrappers. Legacy flat strings remain\n * unprojected rather than being mistaken for the trusted diagnostic contract.\n */\nfunction workerFailure(value: unknown, depth = 0): WorkerItem[\"failure\"] {\n if (depth > 6 || value === null || value === undefined) return null;\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n return parsed === value ? null : workerFailure(parsed, depth + 1);\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n const failure = workerFailure(entry, depth + 1);\n if (failure) return failure;\n }\n return null;\n }\n if (typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n const direct = boundedWorkerFailure(record.error);\n if (direct) return direct;\n for (const key of [\"structuredContent\", \"content\", \"result\", \"output\"] as const) {\n if (!(key in record)) continue;\n const failure = workerFailure(record[key], depth + 1);\n if (failure) return failure;\n }\n if (record.type === \"text\" && typeof record.text === \"string\") {\n return workerFailure(record.text, depth + 1);\n }\n return null;\n}\n\n/**\n * Find a session id in orchestration tool arguments or output. Handles raw\n * objects, JSON strings, and MCP tool results (`{ content: [{ type: \"text\",\n * text: \"{...}\" }], structuredContent? }`).\n */\nexport function extractSessionRef(value: unknown, depth = 0): string | null {\n if (depth > 6 || value === null || value === undefined) {\n return null;\n }\n if (typeof value === \"string\") {\n return extractSessionRef(tryParseJson(value), depth + 1);\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n const found = extractSessionRef(entry, depth + 1);\n if (found) {\n return found;\n }\n }\n return null;\n }\n if (typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n const receiptResource = asRecord(record.resource);\n if (\n record.receiptVersion === \"mcp-mutation-receipt.v1\" &&\n receiptResource.type === \"session\" &&\n typeof receiptResource.id === \"string\" &&\n looksLikeId(receiptResource.id)\n ) {\n return receiptResource.id;\n }\n if (typeof record.sessionId === \"string\" && looksLikeId(record.sessionId)) {\n return record.sessionId;\n }\n if (\n typeof record.id === \"string\" &&\n looksLikeId(record.id) &&\n (\"status\" in record || \"workspaceId\" in record || \"initialMessage\" in record)\n ) {\n return record.id;\n }\n for (const key of [\"structuredContent\", \"session\", \"result\", \"content\"] as const) {\n if (key in record) {\n const found = extractSessionRef(record[key], depth + 1);\n if (found) {\n return found;\n }\n }\n }\n if (typeof record.text === \"string\") {\n return extractSessionRef(tryParseJson(record.text), depth + 1);\n }\n return null;\n}\n\nfunction looksLikeId(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n}\n","import type { SessionEvent } from \"@opengeni/sdk\";\nimport type { FleetDecisionItem, FleetDecisionScoreItem } from \"./types\";\n\nconst FLEET_ACTUAL_OUTCOMES = [\"selected\", \"waiting\", \"none\"] as const;\nconst FLEET_ACTUAL_REASONS = [\n \"lease_reused\",\n \"pin\",\n \"rotation\",\n \"active\",\n \"all_capped\",\n \"none\",\n] as const;\nconst FLEET_SHADOW_OUTCOMES = [\"selected\", \"paced\", \"none\"] as const;\nconst FLEET_SHADOW_REASONS = [\n \"fenced_in_flight\",\n \"fenced_candidate_missing\",\n \"admission_paced\",\n \"no_eligible_candidate\",\n \"overlay_isolated_empty\",\n \"best_score\",\n \"affinity_best\",\n \"hysteresis_hold\",\n] as const;\nconst FLEET_COMPARISONS = [\n \"match\",\n \"different_candidate\",\n \"different_outcome\",\n \"not_comparable_truncated\",\n] as const;\nconst FLEET_CONFIDENCES = [\"unknown\", \"low\", \"medium\", \"high\"] as const;\nconst FLEET_ADMISSION_OUTCOMES = [\"admit\", \"pace\"] as const;\nconst FLEET_ADMISSION_REASONS = [\n \"fenced_in_flight\",\n \"pacing_disabled\",\n \"capacity_unknown\",\n \"capacity_available\",\n \"work_conserving_borrow\",\n \"manager_priority\",\n \"standard_starvation_bound\",\n \"capacity_saturated\",\n \"emergency_fuse\",\n] as const;\ntype FleetAdmissionReason = (typeof FLEET_ADMISSION_REASONS)[number];\nconst FLEET_ADMISSION_REASON_CLASSIFICATION = {\n fenced_in_flight: \"admit\",\n pacing_disabled: \"admit\",\n capacity_unknown: \"admit\",\n capacity_available: \"admit\",\n work_conserving_borrow: \"admit\",\n manager_priority: \"pace\",\n standard_starvation_bound: \"admit\",\n capacity_saturated: \"pace\",\n emergency_fuse: \"pace\",\n} as const satisfies Record<FleetAdmissionReason, \"admit\" | \"pace\">;\nconst FLEET_REJECTION_REASONS = [\n \"allocator_disabled\",\n \"unavailable\",\n \"cooling\",\n \"quota_ceiling\",\n \"overlay_isolation\",\n] as const;\nconst FLEET_MAX_CANDIDATES = 32;\nconst FLEET_MAX_COUNT = 1_000_000;\n\n/**\n * Project the identity-free fleet event into the deliberately smaller UI\n * contract. This is a trust boundary: session event payloads are untyped, so\n * arbitrary strings (fingerprints, provider errors, future metadata) must never\n * become renderable copy. Only fixed enums and event-local aliases cross it.\n */\nexport default function fleetDecisionItem(\n event: SessionEvent,\n payload: Record<string, unknown>,\n): FleetDecisionItem | null {\n const actual = asRecord(payload.actual);\n const replay = asRecord(payload.replay);\n const input = asRecord(replay.input);\n const decision = asRecord(replay.decision);\n const admission = asRecord(decision.admission);\n if (\n payload.schemaVersion !== 1 ||\n payload.mode !== \"shadow\" ||\n replay.schemaVersion !== 1 ||\n replay.mode !== \"shadow\" ||\n replay.policyVersion !== \"adaptive-shadow-v1\"\n ) {\n return null;\n }\n\n const actualOutcome = fleetEnum(actual.outcome, FLEET_ACTUAL_OUTCOMES);\n const actualReason = fleetEnum(actual.reason, FLEET_ACTUAL_REASONS);\n const shadowOutcome = fleetEnum(decision.outcome, FLEET_SHADOW_OUTCOMES);\n const shadowReason = fleetEnum(decision.reason, FLEET_SHADOW_REASONS);\n const comparison = fleetEnum(payload.comparison, FLEET_COMPARISONS);\n const confidence = fleetEnum(decision.confidence, FLEET_CONFIDENCES);\n const admissionOutcome = fleetEnum(admission.outcome, FLEET_ADMISSION_OUTCOMES);\n const admissionReason = fleetEnum(admission.reason, FLEET_ADMISSION_REASONS);\n if (\n !actualOutcome ||\n !actualReason ||\n !shadowOutcome ||\n !shadowReason ||\n !comparison ||\n !confidence ||\n !admissionOutcome ||\n !admissionReason\n ) {\n return null;\n }\n if (\n typeof admission.borrowedIdleCapacity !== \"boolean\" ||\n typeof decision.borrowedOverlayCapacity !== \"boolean\"\n ) {\n return null;\n }\n\n const actualCandidateKey = fleetCandidateKey(actual.candidateKey);\n const shadowCandidateKey = fleetCandidateKey(decision.selectedCandidateKey);\n if (actualCandidateKey === undefined || shadowCandidateKey === undefined) {\n return null;\n }\n if (\n (actualOutcome === \"selected\") !== (actualCandidateKey !== null) ||\n (shadowOutcome === \"selected\") !== (shadowCandidateKey !== null)\n ) {\n return null;\n }\n\n const candidates = input.candidates;\n if (!Array.isArray(candidates) || candidates.length > FLEET_MAX_CANDIDATES) {\n return null;\n }\n const candidateKeys = new Set<string>();\n for (const candidate of candidates) {\n const key = asRecord(candidate).key;\n if (!isFleetCandidateAlias(key) || candidateKeys.has(key)) {\n return null;\n }\n candidateKeys.add(key);\n }\n\n const truncatedCandidateCount = fleetCount(replay.truncatedCandidateCount);\n const strandedEligibleCount = fleetCount(decision.strandedEligibleCount);\n if (\n truncatedCandidateCount === null ||\n strandedEligibleCount === null ||\n strandedEligibleCount > candidates.length ||\n !fleetDecisionSemanticsAreConsistent({\n actualOutcome,\n actualReason,\n shadowOutcome,\n shadowReason,\n admissionOutcome,\n admissionReason,\n borrowedIdleCapacity: admission.borrowedIdleCapacity,\n borrowedOverlayCapacity: decision.borrowedOverlayCapacity,\n strandedEligibleCount,\n })\n ) {\n return null;\n }\n if (shadowCandidateKey !== null && !candidateKeys.has(shadowCandidateKey)) {\n return null;\n }\n if (\n actualCandidateKey !== null &&\n !candidateKeys.has(actualCandidateKey) &&\n !(comparison === \"not_comparable_truncated\" && truncatedCandidateCount > 0)\n ) {\n return null;\n }\n if (\n comparison === \"not_comparable_truncated\" &&\n (truncatedCandidateCount === 0 ||\n actualCandidateKey === null ||\n candidateKeys.has(actualCandidateKey))\n ) {\n return null;\n }\n\n if (\n !fleetComparisonIsConsistent(\n comparison,\n actualOutcome,\n actualCandidateKey,\n shadowOutcome,\n shadowCandidateKey,\n )\n ) {\n return null;\n }\n\n const rawScores = decision.scores;\n if (!Array.isArray(rawScores)) {\n return null;\n }\n const scores: FleetDecisionScoreItem[] = [];\n const scoreKeys = new Set<string>();\n for (const value of rawScores.slice(0, FLEET_MAX_CANDIDATES)) {\n const score = asRecord(value);\n const candidateKey = score.candidateKey;\n const parsedRejectionReason =\n score.rejectionReason === null\n ? null\n : fleetEnum(score.rejectionReason, FLEET_REJECTION_REASONS);\n if (score.rejectionReason !== null && parsedRejectionReason === null) {\n return null;\n }\n const rejectionReason = parsedRejectionReason;\n const total = fleetFiniteNumber(score.total);\n const scoreConfidence = fleetEnum(score.confidence, FLEET_CONFIDENCES);\n if (\n !isFleetCandidateAlias(candidateKey) ||\n !candidateKeys.has(candidateKey) ||\n scoreKeys.has(candidateKey) ||\n typeof score.eligible !== \"boolean\" ||\n total === null ||\n !scoreConfidence ||\n (score.eligible ? rejectionReason !== null : rejectionReason === null)\n ) {\n return null;\n }\n scoreKeys.add(candidateKey);\n scores.push({\n candidateKey,\n eligible: score.eligible,\n rejectionReason,\n total,\n confidence: scoreConfidence,\n });\n }\n if (shadowCandidateKey !== null && !scoreKeys.has(shadowCandidateKey)) {\n return null;\n }\n\n return {\n kind: \"fleet-decision\",\n id: event.id,\n turnId: event.turnId ?? null,\n policyVersion: \"adaptive-shadow-v1\",\n actualOutcome,\n actualCandidateKey,\n actualReason,\n shadowOutcome,\n shadowCandidateKey,\n shadowReason,\n comparison,\n confidence,\n admissionOutcome,\n admissionReason,\n borrowedIdleCapacity: admission.borrowedIdleCapacity,\n borrowedOverlayCapacity: decision.borrowedOverlayCapacity,\n strandedEligibleCount,\n candidateCount: candidates.length,\n truncatedCandidateCount,\n scoreRowsTruncatedCount: Math.max(0, rawScores.length - FLEET_MAX_CANDIDATES),\n scores,\n occurredAt: event.occurredAt,\n };\n}\n\nfunction fleetEnum<const Values extends readonly string[]>(\n value: unknown,\n values: Values,\n): Values[number] | null {\n return typeof value === \"string\" && (values as readonly string[]).includes(value)\n ? (value as Values[number])\n : null;\n}\n\n/** c00..czz: ordinal aliases scoped to one event, never stable account ids. */\nfunction isFleetCandidateAlias(value: unknown): value is string {\n return typeof value === \"string\" && /^c[0-9a-z]{2}$/.test(value);\n}\n\n/** `undefined` denotes malformed; `null` is a valid no-selection value. */\nfunction fleetCandidateKey(value: unknown): string | null | undefined {\n return value === null ? null : isFleetCandidateAlias(value) ? value : undefined;\n}\n\nfunction fleetCount(value: unknown): number | null {\n return typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value >= 0 &&\n value <= FLEET_MAX_COUNT\n ? value\n : null;\n}\n\nfunction fleetFiniteNumber(value: unknown): number | null {\n return typeof value === \"number\" &&\n Number.isFinite(value) &&\n Math.abs(value) <= Number.MAX_SAFE_INTEGER\n ? value\n : null;\n}\n\nfunction fleetComparisonIsConsistent(\n comparison: FleetDecisionItem[\"comparison\"],\n actualOutcome: FleetDecisionItem[\"actualOutcome\"],\n actualCandidateKey: string | null,\n shadowOutcome: FleetDecisionItem[\"shadowOutcome\"],\n shadowCandidateKey: string | null,\n): boolean {\n if (comparison === \"not_comparable_truncated\") {\n return actualOutcome === \"selected\" && actualCandidateKey !== null;\n }\n const comparableActualOutcome = actualOutcome === \"selected\" ? \"selected\" : \"none\";\n const comparableShadowOutcome = shadowOutcome === \"selected\" ? \"selected\" : \"none\";\n if (comparison === \"different_outcome\") {\n return comparableActualOutcome !== comparableShadowOutcome;\n }\n if (comparableActualOutcome !== comparableShadowOutcome) {\n return false;\n }\n if (comparison === \"different_candidate\") {\n return comparableActualOutcome === \"selected\" && actualCandidateKey !== shadowCandidateKey;\n }\n return comparableActualOutcome !== \"selected\" || actualCandidateKey === shadowCandidateKey;\n}\n\nfunction fleetDecisionSemanticsAreConsistent(input: {\n actualOutcome: FleetDecisionItem[\"actualOutcome\"];\n actualReason: FleetDecisionItem[\"actualReason\"];\n shadowOutcome: FleetDecisionItem[\"shadowOutcome\"];\n shadowReason: FleetDecisionItem[\"shadowReason\"];\n admissionOutcome: FleetDecisionItem[\"admissionOutcome\"];\n admissionReason: FleetDecisionItem[\"admissionReason\"];\n borrowedIdleCapacity: boolean;\n borrowedOverlayCapacity: boolean;\n strandedEligibleCount: number;\n}): boolean {\n const actualConsistent =\n input.actualOutcome === \"selected\"\n ? [\"lease_reused\", \"pin\", \"rotation\", \"active\"].includes(input.actualReason)\n : input.actualOutcome === \"waiting\"\n ? input.actualReason === \"all_capped\"\n : input.actualReason === \"none\";\n const shadowConsistent =\n input.shadowOutcome === \"selected\"\n ? [\"fenced_in_flight\", \"best_score\", \"affinity_best\", \"hysteresis_hold\"].includes(\n input.shadowReason,\n )\n : input.shadowOutcome === \"paced\"\n ? input.shadowReason === \"admission_paced\"\n : [\"fenced_candidate_missing\", \"no_eligible_candidate\", \"overlay_isolated_empty\"].includes(\n input.shadowReason,\n );\n // Keep this mapping exhaustive so a newly accepted admission reason cannot\n // silently be dropped from the paced/admitted event consistency check.\n const pacedAdmissionReason =\n FLEET_ADMISSION_REASON_CLASSIFICATION[input.admissionReason] === \"pace\";\n return (\n actualConsistent &&\n shadowConsistent &&\n (input.admissionOutcome === \"pace\") === pacedAdmissionReason &&\n (input.shadowOutcome === \"paced\") === (input.admissionOutcome === \"pace\") &&\n input.borrowedIdleCapacity === (input.admissionReason === \"work_conserving_borrow\") &&\n (!input.borrowedOverlayCapacity ||\n (input.shadowOutcome === \"selected\" && input.strandedEligibleCount === 0))\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n"],"mappings":"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","names":["asRecord","candidate"]}
@@ -2,7 +2,7 @@ import {
2
2
  buildTimeline,
3
3
  groupTimeline,
4
4
  sessionStatusFromEvents
5
- } from "./chunk-JR3QFY6B.js";
5
+ } from "./chunk-6KLX2RH5.js";
6
6
  import {
7
7
  useDebouncedCallback,
8
8
  useMutationRunner,
@@ -18,7 +18,7 @@ import {
18
18
  useEmbeddedSessionLineage,
19
19
  useEmbeddedSessionMcpApprovalPolicy,
20
20
  useEmbeddedSessionRead
21
- } from "./chunk-HDBG7XGO.js";
21
+ } from "./chunk-C5ZPSSS5.js";
22
22
 
23
23
  // src/hooks/use-session.ts
24
24
  import { useCallback, useEffect, useMemo, useState } from "react";
@@ -1687,97 +1687,12 @@ function useGoal(sessionId, options = {}) {
1687
1687
  };
1688
1688
  }
1689
1689
 
1690
- // src/hooks/use-session-lineage.ts
1691
- import { useCallback as useCallback6, useEffect as useEffect6, useRef as useRef5 } from "react";
1692
- function isLineageRefreshEvent(event) {
1693
- if (event.type === "session.status.changed" || event.type === "session.created") {
1694
- return true;
1695
- }
1696
- if (event.type === "agent.toolCall.output") {
1697
- const payload = event.payload;
1698
- const name = typeof payload?.name === "string" ? payload.name : typeof payload?.toolName === "string" ? payload.toolName : "";
1699
- return name === "session_create" || name.endsWith("__session_create");
1700
- }
1701
- return false;
1702
- }
1703
- function isSessionCreateToolCallCreated(event) {
1704
- if (event.type !== "agent.toolCall.created") {
1705
- return false;
1706
- }
1707
- const payload = event.payload;
1708
- const name = typeof payload?.name === "string" ? payload.name : typeof payload?.toolName === "string" ? payload.toolName : "";
1709
- return name === "session_create" || name.endsWith("__session_create");
1710
- }
1711
- function useSessionLineage(sessionId, options = {}) {
1712
- const { client, workspaceId, workspaceControlEvent, registerSessionReconciler } = useEmbeddedSessionLineage(options);
1713
- const enabled = (options.enabled ?? true) && Boolean(sessionId);
1714
- const load = useCallback6(
1715
- async () => sessionId ? await client.getSessionLineage(workspaceId, sessionId) : { ancestors: [], children: [], truncated: false },
1716
- [client, workspaceId, sessionId]
1717
- );
1718
- const state = usePolledValue(load, { pollIntervalMs: options.pollIntervalMs, enabled });
1719
- const refresh = state.refresh;
1720
- useEffect6(() => {
1721
- if (enabled && workspaceControlEvent) void refresh();
1722
- }, [enabled, refresh, workspaceControlEvent]);
1723
- useEffect6(() => {
1724
- if (!sessionId || !enabled) return;
1725
- return registerSessionReconciler(sessionId, "lineage", refresh);
1726
- }, [enabled, refresh, registerSessionReconciler, sessionId]);
1727
- const refreshSoon = useDebouncedCallback(() => void refresh(), 150);
1728
- const delayedChildRefreshRef = useRef5(null);
1729
- useEffect6(() => {
1730
- return () => {
1731
- if (delayedChildRefreshRef.current !== null) {
1732
- clearTimeout(delayedChildRefreshRef.current);
1733
- delayedChildRefreshRef.current = null;
1734
- }
1735
- };
1736
- }, [sessionId, workspaceId]);
1737
- const refreshAfterChildCreate = useCallback6(() => {
1738
- void refresh();
1739
- if (delayedChildRefreshRef.current !== null) {
1740
- clearTimeout(delayedChildRefreshRef.current);
1741
- }
1742
- delayedChildRefreshRef.current = setTimeout(() => {
1743
- delayedChildRefreshRef.current = null;
1744
- void refresh();
1745
- }, 2500);
1746
- }, [refresh]);
1747
- useSessionEventTrigger(
1748
- client,
1749
- workspaceId,
1750
- sessionId,
1751
- isLineageRefreshEvent,
1752
- refreshSoon,
1753
- // SHARED-FEED ONLY: without a caller-provided events log the trigger would
1754
- // open its OWN streamEvents tail — a second live SSE connection next to the
1755
- // session route's useSessionEvents. A caller with no feed opts into polling
1756
- // (pollIntervalMs), never a duplicate stream.
1757
- { events: options.events, enabled: enabled && options.events !== void 0 }
1758
- );
1759
- useSessionEventTrigger(
1760
- client,
1761
- workspaceId,
1762
- sessionId,
1763
- isSessionCreateToolCallCreated,
1764
- refreshAfterChildCreate,
1765
- { events: options.events, enabled: enabled && options.events !== void 0 }
1766
- );
1767
- return {
1768
- lineage: state.data,
1769
- loading: state.loading,
1770
- error: state.error,
1771
- refresh
1772
- };
1773
- }
1774
-
1775
1690
  // src/hooks/use-session-control.ts
1776
- import { useCallback as useCallback7, useLayoutEffect as useLayoutEffect2, useRef as useRef6 } from "react";
1691
+ import { useCallback as useCallback6, useLayoutEffect as useLayoutEffect2, useRef as useRef5 } from "react";
1777
1692
  function useSessionControl(sessionId, options = {}) {
1778
1693
  const { client, workspaceId } = useEmbeddedSession(options);
1779
1694
  const approvalTargetKey = `${workspaceId}\0${sessionId ?? ""}`;
1780
- const pendingApproval = useRef6(null);
1695
+ const pendingApproval = useRef5(null);
1781
1696
  useLayoutEffect2(() => {
1782
1697
  if (pendingApproval.current?.targetKey !== approvalTargetKey) {
1783
1698
  pendingApproval.current = null;
@@ -1795,7 +1710,7 @@ function useSessionControl(sessionId, options = {}) {
1795
1710
  mutationError: approvalError,
1796
1711
  clearMutationError: clearApprovalError
1797
1712
  } = useMutationRunner(approvalTargetKey);
1798
- const pause = useCallback7(
1713
+ const pause = useCallback6(
1799
1714
  async (reason) => {
1800
1715
  if (!sessionId) {
1801
1716
  return null;
@@ -1806,7 +1721,7 @@ function useSessionControl(sessionId, options = {}) {
1806
1721
  },
1807
1722
  [client, workspaceId, sessionId, runControl]
1808
1723
  );
1809
- const resume = useCallback7(
1724
+ const resume = useCallback6(
1810
1725
  async (reason) => {
1811
1726
  if (!sessionId) return null;
1812
1727
  return await runControl(
@@ -1815,7 +1730,7 @@ function useSessionControl(sessionId, options = {}) {
1815
1730
  },
1816
1731
  [client, workspaceId, sessionId, runControl]
1817
1732
  );
1818
- const decide = useCallback7(
1733
+ const decide = useCallback6(
1819
1734
  async (approvalId, decision, message) => {
1820
1735
  if (!sessionId) {
1821
1736
  return null;
@@ -1844,16 +1759,16 @@ function useSessionControl(sessionId, options = {}) {
1844
1759
  },
1845
1760
  [approvalTargetKey, client, workspaceId, sessionId, runApproval]
1846
1761
  );
1847
- const approve = useCallback7(
1762
+ const approve = useCallback6(
1848
1763
  async (approvalId, message) => await decide(approvalId, "approve", message),
1849
1764
  [decide]
1850
1765
  );
1851
- const reject = useCallback7(
1766
+ const reject = useCallback6(
1852
1767
  async (approvalId, message) => await decide(approvalId, "reject", message),
1853
1768
  [decide]
1854
1769
  );
1855
1770
  const error = approvalError ?? controlError;
1856
- const clearError = useCallback7(() => {
1771
+ const clearError = useCallback6(() => {
1857
1772
  clearControlError();
1858
1773
  clearApprovalError();
1859
1774
  }, [clearControlError, clearApprovalError]);
@@ -1870,7 +1785,7 @@ function useSessionControl(sessionId, options = {}) {
1870
1785
  }
1871
1786
 
1872
1787
  // src/hooks/use-session-mcp-approval-policy.ts
1873
- import { useCallback as useCallback8, useEffect as useEffect7, useLayoutEffect as useLayoutEffect3, useMemo as useMemo4, useRef as useRef7, useState as useState6 } from "react";
1788
+ import { useCallback as useCallback7, useEffect as useEffect6, useLayoutEffect as useLayoutEffect3, useMemo as useMemo4, useRef as useRef6, useState as useState6 } from "react";
1874
1789
  function isSessionMcpApprovalPolicyEvent(event, serverId) {
1875
1790
  if (event.type !== "session.mcp.approval_policy.updated") {
1876
1791
  return false;
@@ -1886,14 +1801,14 @@ function useSessionMcpApprovalPolicy(sessionId, serverId, options = {}) {
1886
1801
  const enabled = (options.enabled ?? true) && Boolean(sessionId && serverId);
1887
1802
  const [override, setOverride] = useState6(null);
1888
1803
  const targetKey = `${workspaceId}\0${sessionId ?? ""}\0${serverId ?? ""}`;
1889
- const authoritativeGeneration = useRef7(0);
1804
+ const authoritativeGeneration = useRef6(0);
1890
1805
  const mutationIdentity = useMemo4(() => ({ client, targetKey }), [client, targetKey]);
1891
1806
  const { run, mutating, mutationError, clearMutationError } = useMutationRunner(mutationIdentity);
1892
1807
  useLayoutEffect3(() => {
1893
1808
  authoritativeGeneration.current += 1;
1894
1809
  setOverride(null);
1895
1810
  }, [client, targetKey]);
1896
- const load = useCallback8(async () => {
1811
+ const load = useCallback7(async () => {
1897
1812
  const generation = authoritativeGeneration.current;
1898
1813
  if (!sessionId || !serverId) {
1899
1814
  return { targetKey, generation, server: null };
@@ -1914,13 +1829,13 @@ function useSessionMcpApprovalPolicy(sessionId, serverId, options = {}) {
1914
1829
  enabled,
1915
1830
  pollIntervalMs: options.pollIntervalMs
1916
1831
  });
1917
- useEffect7(() => {
1832
+ useEffect6(() => {
1918
1833
  if (data?.targetKey === targetKey && data.generation === authoritativeGeneration.current) {
1919
1834
  setOverride(null);
1920
1835
  }
1921
1836
  }, [data, targetKey]);
1922
1837
  const scheduleRefresh = useDebouncedCallback(() => void refresh());
1923
- const matchesPolicyEvent = useCallback8(
1838
+ const matchesPolicyEvent = useCallback7(
1924
1839
  (event) => isSessionMcpApprovalPolicyEvent(event, serverId ?? void 0),
1925
1840
  [serverId]
1926
1841
  );
@@ -1936,7 +1851,7 @@ function useSessionMcpApprovalPolicy(sessionId, serverId, options = {}) {
1936
1851
  },
1937
1852
  async () => await refresh()
1938
1853
  );
1939
- const update = useCallback8(
1854
+ const update = useCallback7(
1940
1855
  async (policy) => {
1941
1856
  if (!sessionId || !serverId) {
1942
1857
  return null;
@@ -1970,6 +1885,91 @@ function useSessionMcpApprovalPolicy(sessionId, serverId, options = {}) {
1970
1885
  };
1971
1886
  }
1972
1887
 
1888
+ // src/hooks/use-session-lineage.ts
1889
+ import { useCallback as useCallback8, useEffect as useEffect7, useRef as useRef7 } from "react";
1890
+ function isLineageRefreshEvent(event) {
1891
+ if (event.type === "session.status.changed" || event.type === "session.created") {
1892
+ return true;
1893
+ }
1894
+ if (event.type === "agent.toolCall.output") {
1895
+ const payload = event.payload;
1896
+ const name = typeof payload?.name === "string" ? payload.name : typeof payload?.toolName === "string" ? payload.toolName : "";
1897
+ return name === "session_create" || name.endsWith("__session_create");
1898
+ }
1899
+ return false;
1900
+ }
1901
+ function isSessionCreateToolCallCreated(event) {
1902
+ if (event.type !== "agent.toolCall.created") {
1903
+ return false;
1904
+ }
1905
+ const payload = event.payload;
1906
+ const name = typeof payload?.name === "string" ? payload.name : typeof payload?.toolName === "string" ? payload.toolName : "";
1907
+ return name === "session_create" || name.endsWith("__session_create");
1908
+ }
1909
+ function useSessionLineage(sessionId, options = {}) {
1910
+ const { client, workspaceId, workspaceControlEvent, registerSessionReconciler } = useEmbeddedSessionLineage(options);
1911
+ const enabled = (options.enabled ?? true) && Boolean(sessionId);
1912
+ const load = useCallback8(
1913
+ async () => sessionId ? await client.getSessionLineage(workspaceId, sessionId) : { ancestors: [], children: [], truncated: false },
1914
+ [client, workspaceId, sessionId]
1915
+ );
1916
+ const state = usePolledValue(load, { pollIntervalMs: options.pollIntervalMs, enabled });
1917
+ const refresh = state.refresh;
1918
+ useEffect7(() => {
1919
+ if (enabled && workspaceControlEvent) void refresh();
1920
+ }, [enabled, refresh, workspaceControlEvent]);
1921
+ useEffect7(() => {
1922
+ if (!sessionId || !enabled) return;
1923
+ return registerSessionReconciler(sessionId, "lineage", refresh);
1924
+ }, [enabled, refresh, registerSessionReconciler, sessionId]);
1925
+ const refreshSoon = useDebouncedCallback(() => void refresh(), 150);
1926
+ const delayedChildRefreshRef = useRef7(null);
1927
+ useEffect7(() => {
1928
+ return () => {
1929
+ if (delayedChildRefreshRef.current !== null) {
1930
+ clearTimeout(delayedChildRefreshRef.current);
1931
+ delayedChildRefreshRef.current = null;
1932
+ }
1933
+ };
1934
+ }, [sessionId, workspaceId]);
1935
+ const refreshAfterChildCreate = useCallback8(() => {
1936
+ void refresh();
1937
+ if (delayedChildRefreshRef.current !== null) {
1938
+ clearTimeout(delayedChildRefreshRef.current);
1939
+ }
1940
+ delayedChildRefreshRef.current = setTimeout(() => {
1941
+ delayedChildRefreshRef.current = null;
1942
+ void refresh();
1943
+ }, 2500);
1944
+ }, [refresh]);
1945
+ useSessionEventTrigger(
1946
+ client,
1947
+ workspaceId,
1948
+ sessionId,
1949
+ isLineageRefreshEvent,
1950
+ refreshSoon,
1951
+ // SHARED-FEED ONLY: without a caller-provided events log the trigger would
1952
+ // open its OWN streamEvents tail — a second live SSE connection next to the
1953
+ // session route's useSessionEvents. A caller with no feed opts into polling
1954
+ // (pollIntervalMs), never a duplicate stream.
1955
+ { events: options.events, enabled: enabled && options.events !== void 0 }
1956
+ );
1957
+ useSessionEventTrigger(
1958
+ client,
1959
+ workspaceId,
1960
+ sessionId,
1961
+ isSessionCreateToolCallCreated,
1962
+ refreshAfterChildCreate,
1963
+ { events: options.events, enabled: enabled && options.events !== void 0 }
1964
+ );
1965
+ return {
1966
+ lineage: state.data,
1967
+ loading: state.loading,
1968
+ error: state.error,
1969
+ refresh
1970
+ };
1971
+ }
1972
+
1973
1973
  // src/approvals.ts
1974
1974
  function approvalsFromRequiresAction(payload) {
1975
1975
  const approvals = payload && typeof payload === "object" ? payload.approvals : void 0;
@@ -2146,11 +2146,11 @@ export {
2146
2146
  useTurnQueue,
2147
2147
  isGoalEvent,
2148
2148
  useGoal,
2149
- isLineageRefreshEvent,
2150
- useSessionLineage,
2151
2149
  useSessionControl,
2152
2150
  isSessionMcpApprovalPolicyEvent,
2153
2151
  useSessionMcpApprovalPolicy,
2152
+ isLineageRefreshEvent,
2153
+ useSessionLineage,
2154
2154
  approvalsFromRequiresAction,
2155
2155
  projectPendingApprovals,
2156
2156
  humanInputRequestFromEvent,
@@ -2158,4 +2158,4 @@ export {
2158
2158
  isHumanInputEvent,
2159
2159
  useHumanInputRequests
2160
2160
  };
2161
- //# sourceMappingURL=chunk-FWS3KC3Z.js.map
2161
+ //# sourceMappingURL=chunk-B6WPZSTT.js.map