@opengeni/react 6.0.0-canary.1 → 6.1.0
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.
- package/README.md +10 -0
- package/dist/{chunk-PZ27MCZP.js → chunk-L2NBTKRX.js} +14 -2
- package/dist/chunk-L2NBTKRX.js.map +1 -0
- package/dist/{chunk-CC7AVRIJ.js → chunk-TDSEILUH.js} +80 -7
- package/dist/chunk-TDSEILUH.js.map +1 -0
- package/dist/components/message-timeline.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/session-ui.js +2 -2
- package/dist/session.js +1 -1
- package/package.json +3 -3
- package/src/components/message-timeline.tsx +88 -4
- package/src/components/session-conversation.tsx +1 -3
- package/src/hooks/use-session-events.ts +17 -1
- package/styles/compiled.css +3 -0
- package/dist/chunk-CC7AVRIJ.js.map +0 -1
- package/dist/chunk-PZ27MCZP.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/human-input.ts","../src/timeline/tool-display-name.ts","../src/older-history.ts","../src/timeline/projection.ts","../src/timeline/fleet-decision-projection.ts","../src/hooks/use-session-events.ts","../src/hooks/use-session.ts","../src/hooks/use-turn-queue.ts","../src/hooks/use-human-input.ts"],"sourcesContent":["import type { HumanInputQuestion, SessionEvent, SessionHumanInputRequest } from \"@opengeni/sdk\";\n\n/** Minimal actionable request shape available from the durable event log. */\nexport type PendingHumanInputRequest = {\n id: string;\n turnId: string | null;\n questions: HumanInputQuestion[];\n allowSkip: boolean;\n expiresAt: string | null;\n};\n\n/** A pending row stops being actionable at its durable deadline, even before refresh. */\nexport function isActionableHumanInputRequest(\n request: Pick<SessionHumanInputRequest, \"status\" | \"expiresAt\">,\n nowMs = Date.now(),\n): boolean {\n if (request.status !== \"pending\") return false;\n if (!request.expiresAt) return true;\n const deadline = Date.parse(request.expiresAt);\n return Number.isFinite(deadline) && deadline > nowMs;\n}\n\n/** Parse one generic `session.humanInput.requested` event defensively. */\nexport function humanInputRequestFromEvent(\n event: Pick<SessionEvent, \"type\" | \"payload\" | \"turnId\">,\n): PendingHumanInputRequest | null {\n if (event.type !== \"session.humanInput.requested\" || !isRecord(event.payload)) return null;\n const request = event.payload.request;\n if (!isRecord(request) || typeof request.id !== \"string\" || !Array.isArray(request.questions)) {\n return null;\n }\n return {\n id: request.id,\n turnId: event.turnId ?? null,\n questions: request.questions as HumanInputQuestion[],\n allowSkip: request.allowSkip === true,\n expiresAt: typeof request.expiresAt === \"string\" ? request.expiresAt : null,\n };\n}\n\n/**\n * Fold a durable event log into the structured requests that are actionable\n * now. Responses remove one request; a terminal owning turn clears any\n * unresolved requests that died with it. Replaying history cannot resurrect a\n * previously answered card.\n */\nexport function projectPendingHumanInputRequests(\n events: SessionEvent[],\n): PendingHumanInputRequest[] {\n const pending = new Map<string, PendingHumanInputRequest>();\n for (const event of events) {\n const requested = humanInputRequestFromEvent(event);\n if (requested) {\n pending.set(requested.id, requested);\n continue;\n }\n if (event.type === \"user.humanInputResponse\" && isRecord(event.payload)) {\n if (typeof event.payload.requestId === \"string\") pending.delete(event.payload.requestId);\n continue;\n }\n if (\n event.type === \"turn.completed\" ||\n event.type === \"turn.failed\" ||\n event.type === \"turn.cancelled\"\n ) {\n for (const [id, request] of pending) {\n if (\n request.turnId === null ||\n event.turnId === null ||\n event.turnId === undefined ||\n request.turnId === event.turnId\n ) {\n pending.delete(id);\n }\n }\n }\n }\n return [...pending.values()];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","/**\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","/**\n * Await-compatible older-history result with a causal commit receipt.\n *\n * `committed` flips synchronously before the accepted older window is exposed\n * to React. Returning this exact object preserves the receipt directly;\n * synchronous wrappers that discard it remain supported through receipt\n * capture, while replacing it asynchronously with a plain promise does not.\n */\nexport type OlderHistoryLoadReceipt = Promise<boolean> & {\n readonly committed: boolean;\n readonly tailPreserved?: boolean;\n};\n\n/**\n * Source-compatible public callback accepted by MessageTimeline.\n *\n * The callback historically returned `void`, which permits consumers to\n * return any synchronous value or promise. Receipt-aware loaders opt into the\n * stronger runtime contract by returning (or synchronously creating through a\n * wrapper) an {@link OlderHistoryLoadReceipt}.\n */\nexport type OlderHistoryLoader = () => unknown;\n\ntype MutableOlderHistoryLoadReceipt = Promise<boolean> & {\n committed: boolean;\n tailPreserved: boolean;\n};\n\ntype OlderHistoryReceiptCapture = (receipt: OlderHistoryLoadReceipt) => void;\n\nlet activeReceiptCapture: OlderHistoryReceiptCapture | undefined;\nlet preserveTailForAutomaticLoad = false;\n\n/** Bind a receipt before a synchronous forwarding stack can publish state. */\nexport function invokeOlderHistoryLoaderWithReceiptCapture(\n load: OlderHistoryLoader,\n capture: OlderHistoryReceiptCapture,\n preserveTail = false,\n): unknown {\n const previousCapture = activeReceiptCapture;\n const previousPreserveTail = preserveTailForAutomaticLoad;\n activeReceiptCapture = capture;\n preserveTailForAutomaticLoad = preserveTail;\n try {\n return load();\n } finally {\n activeReceiptCapture = previousCapture;\n preserveTailForAutomaticLoad = previousPreserveTail;\n }\n}\n\n/**\n * Build an await-compatible older-history receipt for custom timeline hosts.\n * Call `markCommitted` immediately before publishing an accepted older window.\n */\nexport function createOlderHistoryLoadReceipt(\n load: (\n markCommitted: () => void,\n preserveTail: boolean,\n markTailPreserved: () => void,\n ) => boolean | Promise<boolean>,\n): OlderHistoryLoadReceipt {\n let resolveResult!: (value: boolean | PromiseLike<boolean>) => void;\n let rejectResult!: (reason?: unknown) => void;\n const result = new Promise<boolean>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n }) as MutableOlderHistoryLoadReceipt;\n result.committed = false;\n result.tailPreserved = false;\n activeReceiptCapture?.(result);\n try {\n const loaded = load(\n () => {\n result.committed = true;\n },\n preserveTailForAutomaticLoad,\n () => {\n result.tailPreserved = true;\n },\n );\n Promise.resolve(loaded).then(resolveResult, rejectResult);\n } catch (error) {\n rejectResult(error);\n }\n return result;\n}\n","import {\n parseMediaGenerationResult,\n type HumanInputAnswer,\n type HumanInputQuestion,\n type HumanInputResponse,\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 presentFailure,\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 HumanInputAnswerSummary,\n HumanInputItem,\n MachineInputBatchItem,\n MemoryItem,\n SandboxItem,\n StartupPhase,\n StartupPhaseItem,\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;\ntype PendingWaitOutcome = { id: string; reason: string; occurredAt: string };\ntype TrackedAgentResponse = { item: AgentMessageItem; completed: boolean };\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 const pendingWaitOutcomeByTurn = new Map<string | null, PendingWaitOutcome>();\n const latestAgentResponseByTurn = new Map<string | null, TrackedAgentResponse>();\n const identifiedMessages = new Map<string, AgentMessageItem>();\n const humanInputRequests = humanInputRequestsById(events);\n const humanInputToolCallIds = new Set(\n [...humanInputRequests.values()]\n .map((request) => stringValue(request.toolCallId))\n .filter(Boolean),\n );\n const queuedAtByTurn = new Map<string, string>();\n const startupRecoveryRevisionByTurn = new Map<string, number>();\n const startupPhases = new Map<string, readonly [StartupPhaseItem, string | null, number]>();\n let startupEvent: SessionEvent;\n let startupTurnId: string | null = null;\n let startupAttemptId: string | null = null;\n let startupRecoveryRevision = 0;\n\n const settleStartupPhase = (\n phase: StartupPhase,\n status: StartupPhaseItem[\"status\"],\n duration: number | null,\n outcome: StartupPhaseItem[\"outcome\"],\n mode = 0,\n explicitStartedAt?: string,\n explicitId?: string,\n blockedReason?: StartupPhaseItem[\"blockedReason\"],\n ): void => {\n const key = `${startupTurnId}:${phase}`;\n const priorState = startupPhases.get(key);\n const prior = priorState?.[0];\n const comparedByAttempt = priorState?.[1] && startupAttemptId;\n const sameAttempt = comparedByAttempt\n ? priorState[1] === startupAttemptId\n : (priorState?.[2] ?? 0) === startupRecoveryRevision;\n const open = prior?.status === \"running\" && sameAttempt ? prior : undefined;\n const replacesPriorAttempt =\n prior !== undefined &&\n (comparedByAttempt ? !sameAttempt : startupRecoveryRevision > (priorState?.[2] ?? 0));\n // A later activity attempt may replay preparation that the logical turn had\n // already completed before the worker moved. Keep that first successful\n // landmark; only an abandoned or failed attempt needs replacement.\n if (replacesPriorAttempt && prior.status === \"complete\") return;\n if (mode === 2 && prior && !replacesPriorAttempt) return;\n if (mode === 1 && !open) return;\n if (!replacesPriorAttempt && status !== \"running\" && open) {\n open.status = status;\n open.completedAt = startupEvent.occurredAt;\n open.durationMs =\n duration === null\n ? elapsedDurationMs(open.startedAt, startupEvent.occurredAt)\n : Math.max(0, duration);\n open.outcome = outcome ?? open.outcome;\n open.blockedReason = blockedReason;\n return;\n }\n const running = status === \"running\";\n const durationMs = running || duration === null ? null : Math.max(0, duration);\n const completedEpoch = Date.parse(startupEvent.occurredAt);\n const startedAt =\n explicitStartedAt ??\n (!running && durationMs !== null && Number.isFinite(completedEpoch)\n ? new Date(completedEpoch - durationMs).toISOString()\n : startupEvent.occurredAt);\n if (replacesPriorAttempt) {\n Object.assign(prior, {\n id: explicitId ?? startupEvent.id,\n status,\n startedAt,\n completedAt: running ? null : startupEvent.occurredAt,\n durationMs,\n outcome,\n blockedReason,\n occurredAt: startedAt,\n } satisfies Partial<StartupPhaseItem>);\n startupPhases.set(key, [prior, startupAttemptId, startupRecoveryRevision]);\n return;\n }\n const item: StartupPhaseItem = {\n kind: \"startup-phase\",\n id: explicitId ?? startupEvent.id,\n turnId: startupTurnId,\n phase,\n status,\n startedAt,\n completedAt: running ? null : startupEvent.occurredAt,\n durationMs,\n outcome,\n blockedReason,\n occurredAt: startedAt,\n };\n items.push(item);\n startupPhases.set(key, [item, startupAttemptId, startupRecoveryRevision]);\n };\n\n const last = (): TimelineItem | undefined => items[items.length - 1];\n\n const rememberAgentResponse = (\n turnId: string | null,\n item: AgentMessageItem,\n completed: boolean,\n ): void => {\n latestAgentResponseByTurn.set(turnId, { item, completed });\n };\n\n const takePendingWaitOutcome = (turnId: string | null): PendingWaitOutcome | undefined => {\n const outcome = pendingWaitOutcomeByTurn.get(turnId);\n pendingWaitOutcomeByTurn.delete(turnId);\n return outcome;\n };\n\n const takeAgentResponse = (turnId: string | null): TrackedAgentResponse | undefined => {\n const response = latestAgentResponseByTurn.get(turnId);\n latestAgentResponseByTurn.delete(turnId);\n return response;\n };\n\n const clearUnscopedTerminalTracking = (): void => {\n latestAgentResponseByTurn.delete(null);\n pendingWaitOutcomeByTurn.delete(null);\n };\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 completedAt?: string,\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 if (item.kind === \"startup-phase\" && item.status === \"running\") {\n item.status = disposition;\n if (completedAt) {\n item.completedAt = completedAt;\n item.durationMs = elapsedDurationMs(item.startedAt, completedAt);\n }\n }\n }\n };\n\n for (const event of ordered) {\n const payload = asRecord(event.payload);\n const turnId = event.turnId ?? null;\n startupEvent = event;\n startupTurnId = turnId;\n startupAttemptId =\n (typeof event.turnAttemptId === \"string\" ? event.turnAttemptId : null) ??\n stringValue(payload.attemptId);\n startupRecoveryRevision = turnId ? (startupRecoveryRevisionByTurn.get(turnId) ?? 0) : 0;\n const setupPhase = event.type.startsWith(\"rig.setup.\")\n ? \"rig\"\n : event.type.startsWith(\"turn.startup.phase.\")\n ? startupPhaseFromPayload(payload.phase)\n : null;\n const setupStatus = event.type.endsWith(\".started\")\n ? \"running\"\n : event.type.endsWith(\".failed\")\n ? \"failed\"\n : event.type.endsWith(\".completed\") || event.type === \"rig.setup.skipped\"\n ? \"complete\"\n : null;\n if (setupPhase && setupStatus) {\n closeStreamingTail();\n settleStartupPhase(\n setupPhase,\n setupStatus,\n numberOrNull(payload.durationMs),\n event.type === \"rig.setup.skipped\" ? \"skipped\" : null,\n );\n continue;\n }\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 clearUnscopedTerminalTracking();\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 ...(event.clientEventId\n ? { reconciliationKey: `user-message:${event.clientEventId}` }\n : {}),\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 \"user.humanInputResponse\": {\n // A structured answer resumes the frozen tool call rather than adding a\n // synthetic user.message to model history. Keep the original question\n // and the resolved human choice together as first-class chat history;\n // neither belongs behind the generic activity fold.\n const item = humanInputItemFromResponse(event, payload, humanInputRequests);\n if (!item) break;\n closeStreamingTail();\n items.push(item);\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 messageId = stringValue(payload.messageId);\n const messageKey = messageId ? JSON.stringify([turnId, messageId]) : null;\n const identified = messageKey ? identifiedMessages.get(messageKey) : undefined;\n if (identified) {\n if (identified.annotationSource?.eventType !== \"agent.message.completed\") {\n identified.text += text;\n rememberAgentResponse(turnId, identified, false);\n }\n break;\n }\n const open = last();\n if (!messageKey && open?.kind === \"tool-call\" && open.status === \"running\") {\n const previous = latestAgentResponseByTurn.get(turnId);\n const previousIndex = previous ? items.indexOf(previous.item) : -1;\n if (\n previous &&\n !previous.completed &&\n previousIndex >= 0 &&\n items\n .slice(previousIndex + 1)\n .every(\n (item) =>\n item.kind === \"tool-call\" && item.turnId === turnId && item.status === \"running\",\n )\n ) {\n // Legacy deltas have no provider message identity. Tool creation\n // alone is not a text boundary; completed output still is.\n previous.item.text += text;\n break;\n }\n }\n if (\n !messageKey &&\n open?.kind === \"agent-message\" &&\n open.streaming &&\n open.turnId === turnId\n ) {\n open.text += text;\n rememberAgentResponse(turnId, open, false);\n break;\n }\n closeStreamingTail();\n const item: AgentMessageItem = {\n kind: \"agent-message\",\n id: event.id,\n turnId,\n text,\n streaming: true,\n occurredAt: event.occurredAt,\n };\n items.push(item);\n if (messageKey) identifiedMessages.set(messageKey, item);\n rememberAgentResponse(turnId, item, false);\n break;\n }\n\n case \"agent.message.completed\": {\n const text = stringValue(payload.text);\n const messageId = stringValue(payload.messageId);\n const messageKey = messageId ? JSON.stringify([turnId, messageId]) : null;\n const phase = assistantMessagePhase(payload.phase);\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 = messageKey ? items.indexOf(identifiedMessages.get(messageKey)!) : -1;\n for (let index = messageKey ? -1 : 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 (messageKey ||\n open.streaming ||\n !open.text ||\n text === open.text ||\n text.startsWith(open.text))\n ) {\n // Identity makes the final text authoritative even if it corrects the\n // draft; legacy receipts still require an extension match.\n if (!open.text || (text && (messageKey || text.startsWith(open.text)))) {\n open.text = text || open.text;\n }\n open.streaming = false;\n // A phase-less settlement mirror (the worker's final-output receipt)\n // must not erase the provider-declared phase captured by the SDK item.\n if (phase) open.phase = phase;\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 rememberAgentResponse(turnId, open, true);\n break;\n }\n if (text) {\n const item: AgentMessageItem = {\n kind: \"agent-message\",\n id: event.id,\n turnId,\n text,\n ...(phase ? { phase } : {}),\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 items.push(item);\n if (messageKey) identifiedMessages.set(messageKey, item);\n rememberAgentResponse(turnId, item, true);\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 (callId && humanInputToolCallIds.has(callId)) {\n // The matching session.humanInput.requested / response lifecycle owns\n // the visible chat card. Rendering the raw tool too would hide the\n // decision behind a duplicate generic \"Ask\" step.\n break;\n }\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 \"turn.queued\": {\n const queuedTurnId = turnId ?? (typeof payload.turnId === \"string\" ? payload.turnId : null);\n if (queuedTurnId) {\n queuedAtByTurn.set(queuedTurnId, event.occurredAt);\n }\n break;\n }\n\n case \"turn.started\": {\n if (turnId) clearUnscopedTerminalTracking();\n if (!turnId) break;\n const queuedAt = queuedAtByTurn.get(turnId);\n if (!queuedAt) break;\n // Recovery starts the same logical turn again. Queue latency belongs to\n // the first admission only, so consume the queued timestamp after its\n // first projection instead of manufacturing another queue span.\n queuedAtByTurn.delete(turnId);\n closeStreamingTail();\n settleStartupPhase(\n \"queue\",\n \"complete\",\n elapsedDurationMs(queuedAt, event.occurredAt),\n null,\n 0,\n queuedAt,\n `${event.id}-queue`,\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 ? payload.expectedTransition === true\n ? \"cancelled\"\n : \"failed\"\n : event.type.endsWith(\".completed\")\n ? \"complete\"\n : \"running\";\n const origin =\n payload.origin === \"created\" ||\n payload.origin === \"restored\" ||\n payload.origin === \"resumed\"\n ? payload.origin\n : null;\n const startupPhase = startupPhaseForSandboxOperation(name);\n if (startupPhase) {\n closeStreamingTail();\n settleStartupPhase(\n startupPhase,\n status,\n numberOrNull(payload.durationMs),\n origin,\n 0,\n undefined,\n undefined,\n status === \"cancelled\" && payload.failureCode === \"rotation_in_progress\"\n ? \"rotation_in_progress\"\n : undefined,\n );\n break;\n }\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 (origin) existing.origin = origin;\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 status,\n occurredAt: event.occurredAt,\n });\n }\n break;\n }\n\n case \"agent.model.request\": {\n const requestPhase = typeof payload.phase === \"string\" ? payload.phase : null;\n const status =\n requestPhase === \"started\"\n ? \"running\"\n : requestPhase === \"first_byte\" || requestPhase === \"first_event\"\n ? \"complete\"\n : requestPhase === \"failed\" || requestPhase === \"timed_out\"\n ? \"failed\"\n : null;\n if (status) {\n if (status === \"running\") closeStreamingTail();\n settleStartupPhase(\n \"provider_first_byte\",\n status,\n status === \"running\" ? null : numberOrNull(payload.durationMs),\n null,\n status === \"running\" ? 2 : 1,\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 \"codex.capacity.waiting\": {\n items.push({\n kind: \"notice\",\n id: event.id,\n tone: \"waiting\",\n text:\n stringValue(payload.detail) ??\n stringValue(payload.error) ??\n \"Waiting for Codex capacity.\",\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"session.requiresAction\": {\n finalizeOpen(turnId, \"complete\", event.occurredAt);\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 if (turnId) {\n startupRecoveryRevisionByTurn.set(\n turnId,\n (startupRecoveryRevisionByTurn.get(turnId) ?? 0) + 1,\n );\n }\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 authoritySource: payload.authoritySource === \"host\" ? \"host\" : null,\n reason: authNeededReason(\n payload.authoritySource === \"host\" && typeof payload.authorizationUrl === \"string\"\n ? (payload.hostReason ?? payload.reason)\n : payload.reason,\n ),\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, \"complete\", event.occurredAt);\n takeAgentResponse(turnId);\n takePendingWaitOutcome(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, \"complete\", event.occurredAt);\n takeAgentResponse(turnId);\n takePendingWaitOutcome(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 const latestAgentResponse = takeAgentResponse(turnId);\n const finalOutput = stringValue(payload.output);\n const visibleFinalOutput = stripOpaqueCitationTokens(finalOutput).trim();\n const visibleTrackedResponse = stripOpaqueCitationTokens(\n latestAgentResponse?.item.text ?? \"\",\n ).trim();\n const finalOutputMirrorsCommentary =\n latestAgentResponse?.item.phase === \"commentary\" &&\n visibleTrackedResponse === visibleFinalOutput;\n const hasAuthoritativeFinalOutput =\n Boolean(visibleFinalOutput) && !finalOutputMirrorsCommentary;\n const pendingWaitOutcome = takePendingWaitOutcome(turnId);\n if (hasAuthoritativeFinalOutput) {\n // `agent.message.completed` and `turn.completed` normally commit\n // together, but legacy or partially compacted ledgers may retain only\n // the terminal output receipt. Keep that authoritative response\n // visible instead of leaving it trapped in raw audit data.\n if (\n latestAgentResponse &&\n !latestAgentResponse.completed &&\n finalOutput.startsWith(latestAgentResponse.item.text)\n ) {\n latestAgentResponse.item.text = finalOutput;\n latestAgentResponse.item.streaming = false;\n latestAgentResponse.item.occurredAt = event.occurredAt;\n const responseIndex = items.indexOf(latestAgentResponse.item);\n if (responseIndex >= 0 && responseIndex < items.length - 1) {\n items.splice(responseIndex, 1);\n items.push(latestAgentResponse.item);\n }\n } else if (visibleTrackedResponse !== visibleFinalOutput) {\n items.push({\n kind: \"agent-message\",\n id: `${event.id}-output-message`,\n turnId,\n text: finalOutput,\n streaming: false,\n occurredAt: event.occurredAt,\n });\n }\n }\n finalizeOpen(turnId, \"complete\", event.occurredAt);\n const completedTurn = turnEndItem(event, \"complete\", null);\n items.push(completedTurn);\n const hasCompletedFinalResponse =\n latestAgentResponse?.completed === true &&\n latestAgentResponse.item.phase !== \"commentary\" &&\n Boolean(visibleTrackedResponse);\n if (!hasAuthoritativeFinalOutput && pendingWaitOutcome) {\n // Preserve existing prose, including delta-only streams, when a\n // trailing wait yields without a terminal output receipt.\n completedTurn.preserveWaitResponse = true;\n }\n if (!hasAuthoritativeFinalOutput && !hasCompletedFinalResponse && pendingWaitOutcome) {\n items.push({\n kind: \"notice\",\n id: `${pendingWaitOutcome.id}-visible-outcome`,\n tone: \"waiting\",\n text: waitingOutcomeText(pendingWaitOutcome.reason),\n recordedOutcome: true,\n occurredAt: pendingWaitOutcome.occurredAt,\n });\n }\n break;\n }\n\n case \"turn.failed\": {\n takeAgentResponse(turnId);\n takePendingWaitOutcome(turnId);\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\", event.occurredAt);\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 takeAgentResponse(turnId);\n takePendingWaitOutcome(turnId);\n const hadActivity = hasTurnActivity(items, turnId);\n finalizeOpen(turnId, \"cancelled\", event.occurredAt);\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 \"instruction.confirmation.recovered\": {\n const receipt = asRecord(payload.receipt);\n if (receipt.outcome !== \"published\") break;\n closeStreamingTail();\n items.push({\n kind: \"notice\",\n id: event.id,\n tone: \"input\",\n text: \"Your previously approved workspace instruction was saved.\",\n occurredAt: event.occurredAt,\n });\n break;\n }\n case \"knowledge.confirmation.recovered\":\n case \"knowledge.source.prepared\":\n case \"knowledge.source.failed\": {\n const receipt = asRecord(payload.receipt);\n const outcome = event.type === \"knowledge.source.failed\" ? \"failed\" : receipt.outcome;\n if (\n (event.type !== \"knowledge.confirmation.recovered\" &&\n typeof payload.fileId !== \"string\") ||\n ![\"published\", \"pending\", \"rejected\", \"archived\", \"failed\"].includes(String(outcome))\n )\n break;\n closeStreamingTail();\n items.push({\n kind: \"knowledge\",\n id: event.id,\n turnId,\n fileId: typeof payload.fileId === \"string\" ? payload.fileId : undefined,\n filename: typeof payload.filename === \"string\" ? payload.filename : undefined,\n entryId: typeof receipt.entryId === \"string\" ? receipt.entryId : undefined,\n status: outcome === \"failed\" ? \"failed\" : \"complete\",\n outcome: outcome as \"published\" | \"pending\" | \"rejected\" | \"archived\" | \"failed\",\n occurredAt: event.occurredAt,\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.held\":\n case \"goal.continuation\": {\n if (event.type === \"goal.held\" && payload.actor === \"agent\") {\n rememberPendingWaitOutcome(pendingWaitOutcomeByTurn, event, payload, turnId);\n }\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:\n event.type === \"goal.held\" && typeof payload.reason === \"string\" && payload.reason\n ? payload.reason\n : goalText(payload),\n occurredAt: event.occurredAt,\n });\n break;\n }\n\n case \"session.wait.started\": {\n if (payload.actor === \"agent\") {\n rememberPendingWaitOutcome(pendingWaitOutcomeByTurn, event, payload, turnId);\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 humanInputRequestsById(events: SessionEvent[]): Map<string, Record<string, unknown>> {\n const requests = new Map<string, Record<string, unknown>>();\n for (const event of events) {\n if (event.type !== \"session.humanInput.requested\") continue;\n const request = asRecord(asRecord(event.payload).request);\n const requestId = stringValue(request.id);\n if (requestId) requests.set(requestId, request);\n }\n return requests;\n}\n\nfunction humanInputItemFromResponse(\n event: SessionEvent,\n payload: Record<string, unknown>,\n requests: Map<string, Record<string, unknown>>,\n): HumanInputItem | null {\n const response = asRecord(payload.response);\n const outcome = response.outcome;\n if (\n outcome !== \"answered\" &&\n outcome !== \"skipped\" &&\n outcome !== \"expired\" &&\n outcome !== \"cancelled\"\n ) {\n return null;\n }\n\n const requestId = stringValue(payload.requestId);\n const request = requests.get(requestId);\n const questions = humanInputQuestions(request?.questions);\n const normalizedResponse: HumanInputResponse =\n outcome === \"answered\"\n ? {\n outcome,\n answers: Array.isArray(response.answers)\n ? response.answers\n .map(asRecord)\n .map(humanInputAnswer)\n .filter((answer): answer is HumanInputAnswer => answer !== null)\n : [],\n }\n : { outcome };\n const questionsById = new Map(questions.map((question) => [question.id, question]));\n const answers =\n normalizedResponse.outcome === \"answered\"\n ? normalizedResponse.answers.map((answer) =>\n humanInputAnswerSummary(answer, questionsById.get(answer.questionId)),\n )\n : [];\n return {\n kind: \"human-input\",\n id: event.id,\n turnId: event.turnId ?? null,\n requestId,\n questions,\n response: normalizedResponse,\n answers,\n occurredAt: event.occurredAt,\n };\n}\n\nfunction humanInputQuestions(value: unknown): HumanInputQuestion[] {\n if (!Array.isArray(value)) return [];\n return value.map(asRecord).flatMap((question) => {\n const id = stringValue(question.id);\n const prompt = stringValue(question.prompt);\n const kind = question.kind;\n if (\n !id ||\n !prompt ||\n (kind !== \"text\" && kind !== \"single_select\" && kind !== \"multi_select\")\n ) {\n return [];\n }\n const options = Array.isArray(question.options)\n ? question.options.map(asRecord).flatMap((option) => {\n const optionId = stringValue(option.id);\n const label = stringValue(option.label);\n return optionId && label\n ? [{ id: optionId, label, description: stringValue(option.description) || null }]\n : [];\n })\n : [];\n return [\n {\n id,\n kind,\n prompt,\n label: stringValue(question.label) || null,\n helpText: stringValue(question.helpText) || null,\n options,\n required: question.required === true,\n allowOther: question.allowOther === true,\n },\n ];\n });\n}\n\nfunction humanInputAnswer(value: Record<string, unknown>): HumanInputAnswer | null {\n const questionId = stringValue(value.questionId);\n if (!questionId) return null;\n return {\n questionId,\n values: Array.isArray(value.values)\n ? value.values.filter((answer): answer is string => typeof answer === \"string\")\n : [],\n ...(typeof value.other === \"string\" && value.other ? { other: value.other } : {}),\n };\n}\n\nfunction humanInputAnswerSummary(\n answer: HumanInputAnswer,\n question: HumanInputQuestion | undefined,\n): HumanInputAnswerSummary {\n const optionLabels = new Map(question?.options.map((option) => [option.id, option.label]) ?? []);\n const values = answer.values.map((value) => optionLabels.get(value) || value);\n if (answer.other) values.push(answer.other);\n const fallbackLabel = answer.questionId\n .replace(/[_-]+/g, \" \")\n .replace(/\\b\\w/g, (character) => character.toUpperCase());\n return {\n questionId: answer.questionId,\n label: question?.label || question?.prompt || fallbackLabel,\n prompt: question?.prompt || fallbackLabel,\n values,\n };\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 \"startup-phase\":\n case \"memory\":\n case \"knowledge\":\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 directChatSequenceByTrigger: Map<string, number>;\n explicitQueuedTriggers: 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 withdrawnTurnIds = new Set<string>();\n const fallbackSeqByTurn = new Map<string, number>();\n const directChatSequenceByTrigger = new Map<string, number>();\n const explicitQueuedTriggers = new Set<string>();\n const queueSteerSequenceByTurn = new Map<string, number>();\n const startedTurnIds = new Set<string>();\n const userMessageSequenceById = new Map<string, number>();\n\n for (const event of ordered) {\n const payload = asRecord(event.payload);\n const turnId = event.turnId ?? null;\n if (event.type === \"user.message\") {\n userMessageSequenceById.set(event.id, event.sequence);\n if (payload.routing === \"queued_for_execution\") {\n explicitQueuedTriggers.add(event.id);\n } else if (\n payload.routing === \"accepted_for_execution\" ||\n payload.routing === \"accepted_for_steering\"\n ) {\n directChatSequenceByTrigger.set(event.id, event.sequence);\n }\n }\n if (event.type === \"user.message\" && payload.delivery === \"steer\") {\n directChatSequenceByTrigger.set(event.id, event.sequence);\n }\n if (event.type === \"session.control.steer_requested\") {\n const targetTurnId = typeof payload.targetTurnId === \"string\" ? payload.targetTurnId : null;\n if (targetTurnId && !queueSteerSequenceByTurn.has(targetTurnId)) {\n queueSteerSequenceByTurn.set(targetTurnId, event.sequence);\n }\n }\n if (\n event.type === \"session.queue.changed\" &&\n (payload.operation === \"edit\" || payload.operation === \"delete\")\n ) {\n const withdrawnTurnId =\n typeof payload.turnId === \"string\" ? payload.turnId : (turnId ?? null);\n if (withdrawnTurnId) withdrawnTurnIds.add(withdrawnTurnId);\n }\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 if (\n (payload.routing === \"accepted_for_execution\" ||\n payload.routing === \"accepted_for_steering\") &&\n !directChatSequenceByTrigger.has(triggerEventId)\n ) {\n directChatSequenceByTrigger.set(\n triggerEventId,\n userMessageSequenceById.get(triggerEventId) ?? event.sequence,\n );\n }\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 const queueSteerSequence = queueSteerSequenceByTurn.get(turnId);\n if (queueSteerSequence !== undefined) {\n directChatSequenceByTrigger.set(triggerEventId, queueSteerSequence);\n }\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) || withdrawnTurnIds.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 directChatSequenceByTrigger,\n explicitQueuedTriggers,\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 // Steer is an accepted direction change, not waiting queue copy. Keep it\n // directly in chat across refresh/reconnect even before its turn starts.\n const directChatSequence = prescan.directChatSequenceByTrigger.get(event.id);\n if (directChatSequence !== undefined) {\n pushInsertion(insertions, directChatSequence, event);\n continue;\n }\n const queuedTurnId = prescan.queuedTurnByTrigger.get(event.id);\n if (!queuedTurnId) {\n if (prescan.explicitQueuedTriggers.has(event.id)) {\n const startSeq = prescan.startSeqByTrigger.get(event.id);\n if (startSeq !== undefined) {\n pushInsertion(insertions, startSeq, event);\n }\n continue;\n }\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(\"turn.startup.phase.\") ||\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 // Resolve only inside this turn's collected suffix. A user/machine-input\n // boundary or an interleaved foreign turn must never donate its answer.\n const waitMessages = turnEnd.preserveWaitResponse\n ? collected.filter(\n (group): group is Extract<TimelineGroup, { kind: \"item\" }> =>\n group.kind === \"item\" &&\n group.item.kind === \"agent-message\" &&\n !group.item.streaming &&\n group.item.text.trim().length > 0 &&\n belongsToTurn(group.item, turnEnd.turnId),\n )\n : [];\n // A completed answer outranks later commentary. Otherwise use the latest\n // visible existing prose, ignoring whitespace and opaque-only stream tails.\n const waitResponse =\n waitMessages\n .slice()\n .reverse()\n .find(\n (group) =>\n group.item.kind === \"agent-message\" &&\n group.item.phase !== \"commentary\" &&\n group.item.annotationSource?.eventType === \"agent.message.completed\",\n ) ?? waitMessages.at(-1);\n const finalMessage = waitResponse ?? extractFinalAgentMessage(collected, turnEnd);\n const fallbackMessage =\n finalMessage || hasOrdinaryFinalAgentMessage(collected, turnEnd)\n ? null\n : extractLatestCompletedCommentary(collected, turnEnd);\n const visibleMessage = finalMessage ?? fallbackMessage;\n const body = visibleMessage ? collected.filter((group) => group !== visibleMessage) : 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 ...(visibleMessage ? [turnGroup, visibleMessage] : [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 === \"human-input\" ||\n group.item.kind === \"context-compaction\" ||\n group.item.kind === \"machine-input-batch\" ||\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 hasOrdinaryFinalAgentMessage(groups: TimelineGroup[], turnEnd: TurnEndItem): boolean {\n return groups.some((group) => {\n if (group.kind !== \"item\" || group.item.kind !== \"agent-message\") return false;\n const message = group.item;\n return (\n !message.streaming &&\n message.phase !== \"commentary\" &&\n message.text.trim().length > 0 &&\n belongsToTurn(message, turnEnd.turnId)\n );\n });\n}\n\nfunction extractLatestCompletedCommentary(\n groups: TimelineGroup[],\n turnEnd: TurnEndItem,\n): Extract<TimelineGroup, { kind: \"item\" }> | null {\n for (let index = groups.length - 1; index >= 0; index -= 1) {\n const group = groups[index];\n if (group?.kind !== \"item\" || group.item.kind !== \"agent-message\") continue;\n const message = group.item;\n if (\n !message.streaming &&\n message.phase === \"commentary\" &&\n message.text.trim().length > 0 &&\n belongsToTurn(message, turnEnd.turnId)\n ) {\n return group;\n }\n }\n return null;\n}\n\nfunction belongsToTurn(message: AgentMessageItem, turnId: string | null): boolean {\n return !message.turnId || !turnId || message.turnId === turnId;\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 assistantMessagePhase(value: unknown): AgentMessageItem[\"phase\"] {\n return value === \"commentary\" || value === \"final_answer\" ? value : undefined;\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 \"background_command_result\",\n \"session_wait_timeout\",\n \"agent_message\",\n \"agent_steer_instruction\",\n \"child_terminal_result\",\n \"media_generation_result\",\n \"child_requires_action\",\n \"child_requires_action_resolved\",\n \"child_paused\",\n \"child_waiting_capacity\",\n \"child_progress\",\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 \"recovering\",\n \"waiting_capacity\",\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 // An explicit provider correlation id is authoritative. Falling back to\n // an unrelated running call corrupts its status/output when compact pages\n // or interleaved providers deliver an unmatched historical result.\n return undefined;\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 startupPhaseForSandboxOperation(name: string): StartupPhase | null {\n return SANDBOX_STARTUP_PHASES[name] ?? null;\n}\n\nfunction startupPhaseFromPayload(value: unknown): StartupPhase | null {\n return typeof value === \"string\" && STARTUP_PHASES.has(value as StartupPhase)\n ? (value as StartupPhase)\n : null;\n}\n\nconst SANDBOX_STARTUP_PHASES: Record<string, StartupPhase> = {\n \"sandbox.provision\": \"sandbox\",\n \"repository-clone\": \"repository\",\n \"file-resource-download\": \"files\",\n};\nconst STARTUP_PHASES = new Set<StartupPhase>([\n \"queue\",\n \"sandbox\",\n \"rig\",\n \"repository\",\n \"files\",\n \"tools\",\n \"model_preparation\",\n \"provider_first_byte\",\n]);\n\nfunction elapsedDurationMs(startedAt: string, completedAt: string): number | null {\n const start = Date.parse(startedAt);\n const end = Date.parse(completedAt);\n return Number.isFinite(start) && Number.isFinite(end) ? Math.max(0, end - start) : null;\n}\n\nfunction failureMessage(payload: Record<string, unknown>): string | null {\n return presentFailure(payload).reason;\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\nfunction rememberPendingWaitOutcome(\n pending: Map<string | null, PendingWaitOutcome>,\n event: SessionEvent,\n payload: Record<string, unknown>,\n eventTurnId: string | null,\n): void {\n const reason = stringValue(payload.reason).trim();\n if (!reason) return;\n const turnId =\n eventTurnId || stringValue(payload.waitTurnId) || stringValue(payload.turnId) || null;\n pending.set(turnId, { id: event.id, reason, occurredAt: event.occurredAt });\n}\n\nfunction waitingOutcomeText(reason: string): string {\n return /^waiting\\b/i.test(reason) ? reason : `Waiting: ${reason}`;\n}\n\n/**\n * Agent-owned goal mutations already have an in-cluster tool row. Suppress the\n * breakaway landmark for those only. Empty wait turns retain the durable hold\n * reason and surface it after the folded steps. `goal.completed` has no actor\n * field today and is only emitted by the agent tool, so it is always\n * suppressed. API / system / create-session / continuation landmarks stay\n * visible.\n */\nfunction shouldSuppressAgentGoalLandmark(type: string, payload: Record<string, unknown>): boolean {\n if (type === \"goal.completed\") {\n return true;\n }\n if (\n type === \"goal.set\" ||\n type === \"goal.updated\" ||\n type === \"goal.paused\" ||\n type === \"goal.held\"\n ) {\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 \"allocator_disabled\",\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 ? [\"all_capped\", \"allocator_disabled\"].includes(input.actualReason)\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","import {\n sessionEventStreamCoveredThrough,\n type SessionEvent,\n type SessionStatus,\n type StreamConnectionState,\n} from \"@opengeni/sdk\";\nimport { startTransition, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEmbeddedSession, type EmbeddedSessionClientOverride } from \"../session-context\";\nimport { createOlderHistoryLoadReceipt, type OlderHistoryLoadReceipt } from \"../older-history\";\nimport { buildTimeline, groupTimeline, sessionStatusFromEvents } from \"../timeline/projection\";\nimport type { TimelineItem } from \"../timeline/types\";\nimport type { EmbeddedSessionClientLike } from \"../client\";\nimport { usePageLiveActivity } from \"./internal\";\n\nexport type SessionEventsConnectionState = StreamConnectionState | \"idle\" | \"ended\" | \"error\";\n\nexport type UseSessionEventsOptions = EmbeddedSessionClientOverride & {\n /** Resume after this sequence (exclusive). Nonzero keeps full replay/resume semantics. */\n after?: number | undefined;\n /** Load a bounded tail by default, or opt back into full replay from `after`. */\n replay?: \"windowed\" | \"full\" | undefined;\n /** Pause the stream without unmounting (e.g. hidden tab). Defaults to true. */\n enabled?: boolean | undefined;\n};\n\nexport type UseSessionEventsResult = {\n /** Replayed + live events, ordered by sequence, no gaps, no duplicates. */\n events: SessionEvent[];\n /** Projected, renderable timeline (memoized over `events`). */\n timeline: TimelineItem[];\n /** Latest session status observed in the event log, if any. */\n sessionStatus: SessionStatus | null;\n /** Sequence of the retained status projection, including events evicted from the window. */\n sessionStatusSequence?: number;\n connectionState: SessionEventsConnectionState;\n /** Highest sequence seen so far (0 before the first event). */\n lastSequence: number;\n /** Exact serialized bytes retained in the current browser event window. */\n windowBytes: number;\n /** Whether older delivered events were evicted from the browser window. */\n windowTruncated: boolean;\n /** True until the initial tail window has been applied (windowed mode). */\n initialLoading: boolean;\n /** Whether older durable events are available before the current window. */\n hasOlder: boolean;\n /** True while an older window is being fetched. */\n loadingOlder: boolean;\n /** Prepend an older density-bounded window; resolves true when more remain. */\n loadOlder: () => OlderHistoryLoadReceipt;\n /**\n * Durable events exist after the current window (history view jumped away\n * from the live tip, or a forward page is incomplete).\n */\n hasNewer: boolean;\n /** True while a newer history page is being fetched. */\n loadingNewer: boolean;\n /**\n * Append one density-bounded newer page without pulling the whole gap.\n * Resolves true when more newer history remains.\n */\n loadNewer: () => Promise<boolean>;\n /** True while replacing the window with the session start. */\n loadingOldest: boolean;\n /**\n * Jump to the durable session start: one bounded oldest window, no middle.\n * Leaves live streaming until {@link jumpToLatest} (or loadNewer catches up).\n */\n loadOldest: () => Promise<boolean>;\n /** True while reloading the live tip window. */\n loadingLatest: boolean;\n /**\n * Reload the newest bounded tip and resume live streaming. Use for\n * \"Jump to latest\" when the tip is not in memory (history view).\n */\n jumpToLatest: () => Promise<void>;\n error: Error | null;\n};\n\n// Keep every browser history read inside one database batch, including the\n// server's one-row continuation lookahead. A large total session must never\n// turn one lazy page into dozens of sequential database round trips.\nconst SESSION_HISTORY_PAGE_SIZE = 1000;\nconst INITIAL_FETCH_CAP = 1;\nconst OLDER_GROUP_TARGET = 32;\nconst OLDER_FETCH_CAP = 2;\nconst NEWER_GROUP_TARGET = 32;\nconst NEWER_FETCH_CAP = 2;\nconst OLDEST_GROUP_TARGET = 32;\nconst OLDEST_FETCH_CAP = 2;\n// A tail page may land inside one unusually dense turn. Permit exactly one\n// additional bounded page to find its user/session boundary without turning a\n// fresh open into an unbounded history walk.\nconst BOUNDARY_PAGE_CAP = 1;\n// Foreground reconciliation is intentionally semantic, not merely time-based:\n// tiny raw gaps can stay on SSE; medium raw gaps get one compact probe so a\n// token-heavy single answer is not mistaken for hundreds of visible messages;\n// only a large/complex missed window reloads the latest tail.\nconst FOREGROUND_DIRECT_REPLAY_MAX_SEQUENCES = 16;\nconst FOREGROUND_COMPACT_PROBE_MAX_SEQUENCES = SESSION_HISTORY_PAGE_SIZE;\nconst FOREGROUND_COMPACT_CATCHUP_MAX_EVENTS = 128;\nconst FOREGROUND_COMPACT_CATCHUP_MAX_GROUPS = 16;\nconst FOREGROUND_COMPACT_CATCHUP_MAX_BYTES = 512 * 1024;\nconst EMPTY_EVENTS: SessionEvent[] = [];\nconst encoder = new TextEncoder();\nexport const SESSION_EVENT_BROWSER_MAX_BYTES = 8 * 1024 * 1024;\nexport const SESSION_EVENT_BROWSER_MAX_COUNT = 10_000;\nexport const SESSION_EVENT_BROWSER_PENDING_MAX_BYTES = 1024 * 1024;\nexport const SESSION_EVENT_BROWSER_PENDING_MAX_COUNT = 256;\n\nexport type BrowserSessionEventWindow = {\n events: SessionEvent[];\n bytes: number;\n truncated: boolean;\n};\n\nconst EMPTY_EVENT_WINDOW: BrowserSessionEventWindow = {\n events: EMPTY_EVENTS,\n bytes: 2,\n truncated: false,\n};\n\n/**\n * Live-stream a session's event log with replay-by-sequence, reconnect, and\n * batched React updates. Fresh loads default to a bounded tail window; pass\n * `replay: \"full\"` or a nonzero `after` for the previous full replay path.\n */\nexport function useSessionEvents(\n sessionId: string | null | undefined,\n options: UseSessionEventsOptions = {},\n): UseSessionEventsResult {\n const { client, workspaceId, reconcileSession } = useEmbeddedSession(options);\n const enabled = options.enabled ?? true;\n const pageLive = usePageLiveActivity();\n const streamEnabled = enabled && pageLive;\n const after = options.after ?? 0;\n const replay = options.replay ?? \"windowed\";\n const fullReplay = replay === \"full\" || after !== 0;\n const streamKey = `${workspaceId}\\u0000${sessionId ?? \"\"}\\u0000${after}\\u0000${fullReplay ? \"full\" : \"windowed\"}`;\n\n const [eventWindow, setEventWindow] = useState<BrowserSessionEventWindow>(EMPTY_EVENT_WINDOW);\n const [connectionState, setConnectionState] = useState<SessionEventsConnectionState>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const [newerError, setNewerError] = useState<Error | null>(null);\n const [hasOlder, setHasOlder] = useState(false);\n const [hasNewer, setHasNewer] = useState(false);\n const [sessionStatusProjection, setSessionStatusProjection] = useState<SessionStatus | null>(\n null,\n );\n const [initialLoading, setInitialLoading] = useState(true);\n const [loadingOlder, setLoadingOlder] = useState(false);\n const [loadingNewer, setLoadingNewer] = useState(false);\n const [loadingOldest, setLoadingOldest] = useState(false);\n const [loadingLatest, setLoadingLatest] = useState(false);\n const [streamEpoch, setStreamEpoch] = useState(0);\n // \"history\" = reading a non-tip window; live SSE must not fill the gap.\n const [viewMode, setViewMode] = useState<\"live\" | \"history\">(\"live\");\n const lastSequenceRef = useRef(after);\n const streamResumeSequenceRef = useRef(after);\n const oldestSequenceRef = useRef<number | null>(null);\n const newestSequenceRef = useRef<number | null>(null);\n const hasOlderRef = useRef(false);\n const hasNewerRef = useRef(false);\n const loadingOlderRef = useRef(false);\n const loadingNewerRef = useRef(false);\n const loadingOldestRef = useRef(false);\n const loadingLatestRef = useRef(false);\n const viewModeRef = useRef<\"live\" | \"history\">(\"live\");\n const initialWindowLoadedRef = useRef(false);\n const reconcileAfterPageResumeRef = useRef(false);\n const streamAbortRef = useRef<AbortController | null>(null);\n const streamKeyRef = useRef<string | null>(null);\n const generationRef = useRef(0);\n const navigationGenerationRef = useRef(0);\n const eventWindowRef = useRef<BrowserSessionEventWindow>(EMPTY_EVENT_WINDOW);\n const sessionStatusRef = useRef<{\n sequence: number;\n status: SessionStatus | null;\n }>({\n sequence: after,\n status: null,\n });\n // Effects reset state after commit. Tag the state so the first render for a\n // new stream identity cannot expose the previous session's event log.\n const [stateStreamKey, setStateStreamKey] = useState(streamKey);\n\n // Reopening SSE after a prepend must not cancel the next history page.\n // Navigation belongs to the session/client lifetime, not the transport.\n useEffect(() => {\n navigationGenerationRef.current += 1;\n setNewerError(null);\n loadingOlderRef.current = false;\n loadingNewerRef.current = false;\n loadingOldestRef.current = false;\n setLoadingOlder(false);\n setLoadingNewer(false);\n setLoadingOldest(false);\n return () => {\n navigationGenerationRef.current += 1;\n };\n }, [client, workspaceId, sessionId, after, enabled, fullReplay]);\n\n useEffect(() => {\n // Reset the accumulated log only when the stream identity changes —\n // pausing via `enabled: false` keeps the timeline visible.\n if (streamKeyRef.current !== streamKey) {\n streamKeyRef.current = streamKey;\n setStateStreamKey(streamKey);\n eventWindowRef.current = EMPTY_EVENT_WINDOW;\n setEventWindow(EMPTY_EVENT_WINDOW);\n setError(null);\n setHasOlder(false);\n setHasNewer(false);\n sessionStatusRef.current = { sequence: after, status: null };\n setSessionStatusProjection(null);\n setLoadingOlder(false);\n setLoadingNewer(false);\n setLoadingOldest(false);\n setLoadingLatest(false);\n setInitialLoading(true);\n lastSequenceRef.current = after;\n streamResumeSequenceRef.current = after;\n oldestSequenceRef.current = null;\n newestSequenceRef.current = null;\n hasOlderRef.current = false;\n hasNewerRef.current = false;\n loadingOlderRef.current = false;\n loadingNewerRef.current = false;\n loadingOldestRef.current = false;\n loadingLatestRef.current = false;\n viewModeRef.current = \"live\";\n setViewMode(\"live\");\n initialWindowLoadedRef.current = false;\n reconcileAfterPageResumeRef.current = false;\n }\n // AbortController is advisory: custom SDK clients and async iterators may\n // ignore it and resolve/yield after cleanup. Fence every effect instance so\n // only the newest dependency generation can mutate refs or React state.\n const generation = generationRef.current + 1;\n generationRef.current = generation;\n if (!sessionId || !streamEnabled) {\n // A page that stayed hidden beyond the live-activity grace deliberately\n // closed its SSE connection. Replaying from the old cursor on return can\n // drip a large background backlog through React in many fast batches and\n // leave the pinned camera catching up long after the user is foregrounded.\n // Remember that suspension so the next live effect replaces the browser\n // window with one compact durable tail instead.\n if (\n sessionId &&\n enabled &&\n !pageLive &&\n !fullReplay &&\n viewModeRef.current === \"live\" &&\n initialWindowLoadedRef.current\n ) {\n reconcileAfterPageResumeRef.current = true;\n }\n setConnectionState(\"idle\");\n return;\n }\n // History view owns a non-tip window; do not open SSE (it would replay the\n // entire gap into the browser). jumpToLatest / catching loadNewer resume live.\n if (viewMode === \"history\") {\n reconcileAfterPageResumeRef.current = false;\n setConnectionState(\"idle\");\n setInitialLoading(false);\n return;\n }\n const reconcileForegroundResume = reconcileAfterPageResumeRef.current && !fullReplay;\n reconcileAfterPageResumeRef.current = false;\n const controller = new AbortController();\n const isCurrent = () => generationRef.current === generation && !controller.signal.aborted;\n streamAbortRef.current = controller;\n // Batch yielded events into one React update per flush window so a long\n // replay (thousands of events) does not render per event. Project every\n // event before retaining it here and synchronously flush at independent\n // count+byte high-water marks: a synchronously yielding async iterator can\n // otherwise starve the 16 ms timer and grow this pre-React buffer without\n // bound even though the final browser window is bounded.\n let pending: SessionEvent[] = [];\n let pendingBytes = 2; // []\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n const flush = () => {\n // A synchronous count/byte high-water flush can run before the scheduled\n // callback gets a macrotask. Cancel that callback before clearing its\n // handle so a long synchronously yielding replay retains at most one\n // timer rather than one stale callback per flushed batch.\n if (flushTimer !== null) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n if (!isCurrent()) {\n pending = [];\n pendingBytes = 2;\n return;\n }\n if (pending.length === 0) {\n return;\n }\n const batch = pending;\n pending = [];\n pendingBytes = 2;\n // The resume cursor only advances with delivered batches: events still\n // sitting in `pending` when the stream is torn down are re-fetched on\n // the next connect instead of being skipped.\n const lastInBatch = batch[batch.length - 1];\n if (lastInBatch) {\n const batchResumeSequence = Math.max(...batch.map(eventResumeSequence));\n lastSequenceRef.current = Math.max(lastSequenceRef.current, batchResumeSequence);\n streamResumeSequenceRef.current = Math.max(\n streamResumeSequenceRef.current,\n batchResumeSequence,\n );\n }\n const status = observeSessionStatus(batch, sessionStatusRef);\n if (status !== undefined) {\n setSessionStatusProjection(status);\n }\n const current = eventWindowRef.current;\n const next = boundBrowserSessionEventWindow([...current.events, ...batch]);\n const retained = {\n ...next,\n truncated: current.truncated || next.truncated,\n };\n eventWindowRef.current = retained;\n setEventWindow(retained);\n oldestSequenceRef.current = retained.events[0]?.sequence ?? null;\n newestSequenceRef.current = maxResumeSequenceOrNull(retained.events);\n if (retained.truncated) {\n hasOlderRef.current = true;\n setHasOlder(true);\n }\n };\n const scheduleFlush = () => {\n if (!isCurrent()) return;\n flushTimer ??= setTimeout(flush, 16);\n };\n\n void (async () => {\n try {\n if (reconcileForegroundResume) {\n setConnectionState(\"connecting\");\n const cursor = streamResumeSequenceRef.current;\n let plan: ForegroundCatchupPlan = { kind: \"resume\" };\n try {\n plan = await planForegroundCatchup(client, workspaceId, sessionId, cursor, {\n signal: controller.signal,\n });\n } catch {\n if (controller.signal.aborted) return;\n // This read is an optimization gate, not a new availability\n // dependency. If it fails, preserve the SDK's exact cursor replay\n // rather than blanking a usable timeline or failing the stream.\n plan = { kind: \"resume\" };\n }\n if (!isCurrent()) return;\n if (plan.kind === \"append\") {\n const current = eventWindowRef.current;\n assertAppendOrder(current.events, plan.events);\n const status = observeSessionStatus(plan.events, sessionStatusRef);\n const next = boundBrowserSessionEventWindow([...current.events, ...plan.events]);\n const retained = {\n ...next,\n truncated: current.truncated || next.truncated,\n };\n eventWindowRef.current = retained;\n oldestSequenceRef.current = retained.events[0]?.sequence ?? null;\n newestSequenceRef.current = maxResumeSequenceOrNull(retained.events);\n lastSequenceRef.current = Math.max(lastSequenceRef.current, plan.resumeSequence);\n streamResumeSequenceRef.current = Math.max(\n streamResumeSequenceRef.current,\n plan.resumeSequence,\n );\n if (status !== undefined) {\n setSessionStatusProjection(status);\n }\n setEventWindow(retained);\n if (retained.truncated) {\n hasOlderRef.current = true;\n setHasOlder(true);\n }\n } else if (plan.kind === \"reload\") {\n // A large/complex missed window would make the foreground timeline\n // and pinned camera chase many rapid commits. Keep the last known\n // complete window visible until the bounded latest replacement is\n // ready, then install that replacement atomically below.\n initialWindowLoadedRef.current = false;\n setError(null);\n }\n }\n if (!fullReplay && !initialWindowLoadedRef.current) {\n setConnectionState(\"connecting\");\n // First paint is ONE compact fetch — the newest window, revealed at\n // the bottom in a few hundred ms. Deeper history loads only when the\n // reader actually scrolls up (the sentinel drives loadOlder).\n const window = await loadEventWindow(client, workspaceId, sessionId, {\n before: Number.MAX_SAFE_INTEGER,\n pageSize: SESSION_HISTORY_PAGE_SIZE,\n targetGroups: Number.POSITIVE_INFINITY,\n maxFetches: INITIAL_FETCH_CAP,\n boundaryPageCap: BOUNDARY_PAGE_CAP,\n signal: controller.signal,\n });\n if (!isCurrent()) {\n return;\n }\n const status = observeSessionStatus(window.events, sessionStatusRef);\n const retained = boundBrowserSessionEventWindow(window.events);\n // A replacement tail retires requests against the discarded window.\n // Ordinary SSE reconnects preserve navigation, but splicing an old\n // page into this new tail could leave an inaccessible history gap.\n navigationGenerationRef.current += 1;\n loadingOlderRef.current = false;\n loadingNewerRef.current = false;\n loadingOldestRef.current = false;\n setLoadingOlder(false);\n setLoadingNewer(false);\n setLoadingOldest(false);\n eventWindowRef.current = retained;\n oldestSequenceRef.current = retained.events[0]?.sequence ?? window.oldestSequence;\n newestSequenceRef.current =\n maxResumeSequenceOrNull(retained.events) ?? window.newestSequence;\n hasOlderRef.current = window.hasOlder || retained.truncated;\n hasNewerRef.current = false;\n lastSequenceRef.current = window.newestSequence;\n streamResumeSequenceRef.current = window.newestSequence;\n initialWindowLoadedRef.current = true;\n if (status !== undefined) {\n setSessionStatusProjection(status);\n }\n setEventWindow(retained);\n setHasOlder(window.hasOlder || retained.truncated);\n setHasNewer(false);\n setInitialLoading(false);\n }\n if (fullReplay) {\n setInitialLoading(false);\n }\n const stream = client.streamEvents(workspaceId, sessionId, {\n after: streamResumeSequenceRef.current,\n signal: controller.signal,\n onOpen: () => {\n // Reconciliation repairs projections, but it must not block reading\n // the already-open SSE body. Otherwise live events accumulate in the\n // browser and appear as one delayed burst after every reconciler ends.\n void Promise.resolve()\n .then(() => reconcileSession(sessionId))\n .catch((cause) => {\n if (isCurrent()) {\n setError(cause instanceof Error ? cause : new Error(String(cause)));\n }\n });\n },\n onStateChange: (state) => {\n if (isCurrent()) {\n setConnectionState(state);\n }\n },\n });\n for await (const event of stream) {\n if (!isCurrent()) break;\n const boundedEvent = event;\n const boundedEventBytes = browserJsonBytes(boundedEvent);\n const separatorBytes = pending.length === 0 ? 0 : 1;\n if (\n pending.length > 0 &&\n (pending.length >= SESSION_EVENT_BROWSER_PENDING_MAX_COUNT ||\n pendingBytes + separatorBytes + boundedEventBytes >\n SESSION_EVENT_BROWSER_PENDING_MAX_BYTES)\n ) {\n flush();\n }\n pending.push(boundedEvent);\n pendingBytes += (pending.length === 1 ? 0 : 1) + boundedEventBytes;\n if (\n pending.length >= SESSION_EVENT_BROWSER_PENDING_MAX_COUNT ||\n pendingBytes >= SESSION_EVENT_BROWSER_PENDING_MAX_BYTES\n ) {\n flush();\n } else {\n scheduleFlush();\n }\n }\n if (isCurrent()) {\n flush();\n setConnectionState(\"ended\");\n }\n } catch (cause) {\n if (isCurrent()) {\n flush();\n setError(cause instanceof Error ? cause : new Error(String(cause)));\n setConnectionState(\"error\");\n // A failed first compact-tail request has no later success path in\n // this effect instance. End the loading gate so hosts can render the\n // retryable error instead of an infinite initial spinner.\n setInitialLoading(false);\n }\n }\n })();\n\n return () => {\n controller.abort();\n if (generationRef.current === generation) {\n generationRef.current = generation + 1;\n }\n if (streamAbortRef.current === controller) {\n streamAbortRef.current = null;\n }\n if (flushTimer !== null) {\n clearTimeout(flushTimer);\n }\n };\n }, [\n client,\n workspaceId,\n sessionId,\n after,\n enabled,\n pageLive,\n streamEnabled,\n fullReplay,\n streamKey,\n streamEpoch,\n viewMode,\n reconcileSession,\n ]);\n\n const navigationBusy = (): boolean =>\n loadingOlderRef.current ||\n loadingNewerRef.current ||\n loadingOldestRef.current ||\n loadingLatestRef.current;\n\n const loadOlder = useCallback(\n (): OlderHistoryLoadReceipt =>\n createOlderHistoryLoadReceipt(async (markCommitted, preserveTail, markTailPreserved) => {\n if (!sessionId || navigationBusy() || !hasOlderRef.current) {\n return false;\n }\n const before = oldestSequenceRef.current;\n if (before === null) {\n oldestSequenceRef.current = null;\n hasOlderRef.current = false;\n setHasOlder(false);\n return false;\n }\n const generation = navigationGenerationRef.current;\n loadingOlderRef.current = true;\n setLoadingOlder(true);\n let published = false;\n try {\n const window = await loadEventWindow(client, workspaceId, sessionId, {\n before,\n pageSize: SESSION_HISTORY_PAGE_SIZE,\n targetGroups: OLDER_GROUP_TARGET,\n maxFetches: OLDER_FETCH_CAP,\n });\n if (navigationGenerationRef.current !== generation) {\n return false;\n }\n if (window.events.length === 0) {\n oldestSequenceRef.current = null;\n hasOlderRef.current = false;\n setHasOlder(false);\n return false;\n }\n const current = eventWindowRef.current;\n assertPrependOrder(current.events, window.events);\n // Freeze the live iterator before replacing its in-memory window. Rows\n // pending in the aborted iterator were never cursor-committed and will\n // be replayed from the retained high-water mark below.\n const next = boundBrowserSessionEventWindow([...window.events, ...current.events], {\n direction: \"oldest\",\n });\n if (preserveTail && maxResumeSequence(next.events) < maxResumeSequence(current.events)) {\n // Automatic viewport filling must not navigate away from the\n // reader's retained tail. Explicit history navigation may do so.\n markTailPreserved();\n return false;\n }\n streamAbortRef.current?.abort();\n const status = observeSessionStatus(window.events, sessionStatusRef);\n const retained = {\n ...next,\n truncated: current.truncated || next.truncated,\n };\n const retainedOldest = retained.events[0]?.sequence ?? null;\n if (retainedOldest === null || retainedOldest >= before) {\n throw new Error(\"@opengeni/react: loadOlder made no durable sequence progress\");\n }\n const retainedNewest = maxResumeSequenceOrNull(retained.events);\n const previousNewest = maxResumeSequenceOrNull(current.events);\n eventWindowRef.current = retained;\n markCommitted();\n oldestSequenceRef.current = retainedOldest;\n newestSequenceRef.current = retainedNewest;\n streamResumeSequenceRef.current = maxResumeSequence(retained.events);\n // Oldest-directed eviction can discard newer in-memory rows. That fact\n // keeps windowTruncated true, but it does not imply older durable rows\n // exist; only the backward DB page can answer hasOlder truthfully.\n const olderStillAvailable = window.hasOlder;\n hasOlderRef.current = olderStillAvailable;\n const evictedLiveTail =\n previousNewest !== null && retainedNewest !== null && retainedNewest < previousNewest;\n let newer: boolean | null = null;\n let enterHistory = false;\n let reconnectLive = false;\n if (viewModeRef.current === \"history\" || evictedLiveTail) {\n const highWater = lastSequenceRef.current;\n newer = retainedNewest !== null && (retainedNewest < highWater || retained.truncated);\n hasNewerRef.current = newer;\n if (evictedLiveTail) {\n // A full oldest-directed browser window cannot also retain the\n // live suffix. Keep the newly loaded history and page forward;\n // reconnecting SSE here immediately newest-bounds the window and\n // evicts every row the reader just requested.\n viewModeRef.current = \"history\";\n enterHistory = true;\n }\n } else {\n // The retained merge is still one contiguous live suffix. Restart\n // SSE from its cursor so events queued during the fetch are replayed.\n reconnectLive = true;\n }\n loadingOlderRef.current = false;\n startTransition(() => {\n if (status !== undefined) {\n setSessionStatusProjection(status);\n }\n setEventWindow(retained);\n setHasOlder(olderStillAvailable);\n if (newer !== null) {\n setHasNewer(newer);\n }\n if (enterHistory) {\n setViewMode(\"history\");\n } else if (reconnectLive) {\n setStreamEpoch((epoch) => epoch + 1);\n }\n setLoadingOlder(false);\n });\n published = true;\n return olderStillAvailable;\n } finally {\n if (!published && navigationGenerationRef.current === generation) {\n loadingOlderRef.current = false;\n setLoadingOlder(false);\n }\n }\n }),\n [client, workspaceId, sessionId],\n );\n\n const loadOldest = useCallback(async (): Promise<boolean> => {\n if (!sessionId || navigationBusy() || !hasOlderRef.current) {\n return false;\n }\n const generation = navigationGenerationRef.current;\n loadingOldestRef.current = true;\n setLoadingOldest(true);\n let published = false;\n try {\n const window = await loadForwardEventWindow(client, workspaceId, sessionId, {\n after: 0,\n pageSize: SESSION_HISTORY_PAGE_SIZE,\n targetGroups: OLDEST_GROUP_TARGET,\n maxFetches: OLDEST_FETCH_CAP,\n });\n if (navigationGenerationRef.current !== generation) {\n return false;\n }\n if (window.events.length === 0) {\n hasOlderRef.current = false;\n setHasOlder(false);\n return false;\n }\n streamAbortRef.current?.abort();\n const status = observeSessionStatus(window.events, sessionStatusRef);\n // Keep the oldest prefix — never the middle or tip.\n const retained = boundBrowserSessionEventWindow(window.events, { direction: \"oldest\" });\n const retainedOldest = retained.events[0]?.sequence ?? null;\n const retainedNewest = maxResumeSequenceOrNull(retained.events);\n eventWindowRef.current = retained;\n oldestSequenceRef.current = retainedOldest;\n newestSequenceRef.current = retainedNewest;\n hasOlderRef.current = false;\n const highWater = Math.max(lastSequenceRef.current, retainedNewest ?? 0);\n lastSequenceRef.current = highWater;\n const newer =\n window.hasNewer ||\n retained.truncated ||\n (retainedNewest !== null && retainedNewest < highWater);\n hasNewerRef.current = newer;\n initialWindowLoadedRef.current = true;\n viewModeRef.current = \"history\";\n loadingOldestRef.current = false;\n setNewerError(null);\n startTransition(() => {\n if (status !== undefined) {\n setSessionStatusProjection(status);\n }\n setEventWindow(retained);\n setHasOlder(false);\n setHasNewer(newer);\n setViewMode(\"history\");\n setLoadingOldest(false);\n });\n published = true;\n return newer;\n } finally {\n if (!published && navigationGenerationRef.current === generation) {\n loadingOldestRef.current = false;\n setLoadingOldest(false);\n }\n }\n }, [client, workspaceId, sessionId]);\n\n const loadNewer = useCallback(async (): Promise<boolean> => {\n if (!sessionId || navigationBusy() || !hasNewerRef.current) {\n return false;\n }\n const afterSequence = newestSequenceRef.current;\n if (afterSequence === null) {\n hasNewerRef.current = false;\n setHasNewer(false);\n return false;\n }\n const generation = navigationGenerationRef.current;\n loadingNewerRef.current = true;\n setLoadingNewer(true);\n let published = false;\n try {\n const window = await loadForwardEventWindow(client, workspaceId, sessionId, {\n after: afterSequence,\n pageSize: SESSION_HISTORY_PAGE_SIZE,\n targetGroups: NEWER_GROUP_TARGET,\n maxFetches: NEWER_FETCH_CAP,\n });\n if (navigationGenerationRef.current !== generation) {\n return false;\n }\n if (window.events.length === 0) {\n setNewerError(null);\n hasNewerRef.current = false;\n setHasNewer(false);\n // Caught up with durable history — resume the live tip stream.\n streamResumeSequenceRef.current = afterSequence;\n viewModeRef.current = \"live\";\n setViewMode(\"live\");\n setStreamEpoch((epoch) => epoch + 1);\n return false;\n }\n const current = eventWindowRef.current;\n assertAppendOrder(current.events, window.events);\n const status = observeSessionStatus(window.events, sessionStatusRef);\n const previousOldest = current.events[0]?.sequence ?? null;\n // Moving forward through history: keep the newest suffix of the merge.\n const next = boundBrowserSessionEventWindow([...current.events, ...window.events], {\n direction: \"newest\",\n });\n const retained = {\n ...next,\n truncated: current.truncated || next.truncated || window.hasNewer,\n };\n const retainedOldest = retained.events[0]?.sequence ?? null;\n const retainedNewest = maxResumeSequenceOrNull(retained.events);\n if (retainedNewest === null || retainedNewest <= afterSequence) {\n throw new Error(\"@opengeni/react: loadNewer made no durable sequence progress\");\n }\n eventWindowRef.current = retained;\n oldestSequenceRef.current = retainedOldest;\n newestSequenceRef.current = retainedNewest;\n // Evicting the start while paging forward re-arms hasOlder.\n if (\n retainedOldest !== null &&\n (previousOldest === null ||\n retainedOldest > previousOldest ||\n (retained.truncated &&\n retained.events[0]?.type !== \"session.created\" &&\n retainedOldest > 1))\n ) {\n hasOlderRef.current = true;\n }\n const rearmedOlder = hasOlderRef.current;\n const highWater = Math.max(lastSequenceRef.current, retainedNewest);\n lastSequenceRef.current = highWater;\n const newer = window.hasNewer || retainedNewest < highWater;\n hasNewerRef.current = newer;\n let resumeLive = false;\n if (!newer) {\n streamResumeSequenceRef.current = retainedNewest;\n viewModeRef.current = \"live\";\n resumeLive = true;\n }\n loadingNewerRef.current = false;\n setNewerError(null);\n startTransition(() => {\n if (status !== undefined) {\n setSessionStatusProjection(status);\n }\n setEventWindow(retained);\n setHasOlder(rearmedOlder);\n setHasNewer(newer);\n if (resumeLive) {\n setViewMode(\"live\");\n setStreamEpoch((epoch) => epoch + 1);\n }\n setLoadingNewer(false);\n });\n published = true;\n return newer;\n } catch (reason) {\n // A settled request from an old navigation lifetime is not a failure of\n // the current session. Preserve current loading/error state as well.\n if (navigationGenerationRef.current !== generation) {\n return false;\n }\n setNewerError(reason instanceof Error ? reason : new Error(String(reason)));\n // Keep authorization and integrity failures actionable for callers;\n // timeline-owned invocations attach their own explicit recovery UI.\n throw reason;\n } finally {\n if (!published && navigationGenerationRef.current === generation) {\n loadingNewerRef.current = false;\n setLoadingNewer(false);\n }\n }\n }, [client, workspaceId, sessionId]);\n\n const jumpToLatest = useCallback(async (): Promise<void> => {\n if (!sessionId || navigationBusy()) {\n return;\n }\n loadingLatestRef.current = true;\n setLoadingLatest(true);\n setNewerError(null);\n let published = false;\n try {\n streamAbortRef.current?.abort();\n hasNewerRef.current = false;\n hasOlderRef.current = false;\n newestSequenceRef.current = null;\n oldestSequenceRef.current = null;\n eventWindowRef.current = EMPTY_EVENT_WINDOW;\n initialWindowLoadedRef.current = false;\n streamResumeSequenceRef.current = after;\n viewModeRef.current = \"live\";\n loadingLatestRef.current = false;\n startTransition(() => {\n setHasNewer(false);\n setHasOlder(false);\n setEventWindow(EMPTY_EVENT_WINDOW);\n setInitialLoading(true);\n setViewMode(\"live\");\n setStreamEpoch((epoch) => epoch + 1);\n setLoadingLatest(false);\n });\n published = true;\n // Effect reloads the tip. The tip fetch itself is owned by the effect.\n await Promise.resolve();\n } finally {\n if (!published) {\n loadingLatestRef.current = false;\n setLoadingLatest(false);\n }\n }\n }, [after, sessionId]);\n\n const identityMatches = stateStreamKey === streamKey;\n const visibleEvents = identityMatches ? eventWindow.events : EMPTY_EVENTS;\n const timeline = useMemo(() => buildTimeline(visibleEvents), [visibleEvents]);\n\n return {\n events: visibleEvents,\n timeline,\n sessionStatus: identityMatches ? sessionStatusProjection : null,\n sessionStatusSequence: identityMatches ? sessionStatusRef.current.sequence : 0,\n connectionState: identityMatches ? connectionState : \"idle\",\n lastSequence: identityMatches ? lastSequenceRef.current : after,\n windowBytes: identityMatches ? eventWindow.bytes : 2,\n windowTruncated: identityMatches ? eventWindow.truncated : false,\n initialLoading: fullReplay ? false : identityMatches ? initialLoading : true,\n hasOlder: !identityMatches ? false : hasOlder,\n loadingOlder: !identityMatches ? false : loadingOlder,\n loadOlder,\n hasNewer: !identityMatches ? false : hasNewer,\n loadingNewer: !identityMatches ? false : loadingNewer,\n loadNewer,\n loadingOldest: !identityMatches ? false : loadingOldest,\n loadOldest,\n loadingLatest: !identityMatches ? false : loadingLatest,\n jumpToLatest,\n error: identityMatches ? (newerError ?? error) : null,\n };\n}\n\n/**\n * Keep one direction-aware count+byte-bounded browser window. Live/default\n * accumulation retains the newest suffix; backward paging retains the oldest\n * prefix so newly fetched history cannot be immediately evicted. This is\n * deliberately separate from durable history and transport paging: when a\n * backward page evicts the live tail, the hook enters bounded history mode and\n * preserves the highest-ever-observed sequence separately for forward paging.\n * The source event remains durable in PostgreSQL throughout. An event larger\n * than the byte target is retained alone, never replaced by a lossy preview.\n */\nexport function boundBrowserSessionEventWindow(\n events: readonly SessionEvent[],\n options: {\n maxBytes?: number;\n maxCount?: number;\n direction?: \"newest\" | \"oldest\";\n } = {},\n): BrowserSessionEventWindow {\n const maxBytes = Math.max(1024, options.maxBytes ?? SESSION_EVENT_BROWSER_MAX_BYTES);\n const maxCount = Math.max(1, Math.floor(options.maxCount ?? SESSION_EVENT_BROWSER_MAX_COUNT));\n const safe = events;\n const selected: SessionEvent[] = [];\n let bytes = 2; // []\n const direction = options.direction ?? \"newest\";\n const start = direction === \"newest\" ? safe.length - 1 : 0;\n const end = direction === \"newest\" ? Math.max(-1, safe.length - maxCount - 1) : safe.length;\n const step = direction === \"newest\" ? -1 : 1;\n for (let index = start; index !== end && selected.length < maxCount; index += step) {\n const event = safe[index]!;\n const eventBytes = browserJsonBytes(event);\n const separator = selected.length === 0 ? 0 : 1;\n if (selected.length > 0 && bytes + separator + eventBytes > maxBytes) break;\n selected.push(event);\n bytes += separator + eventBytes;\n }\n if (direction === \"newest\") selected.reverse();\n return {\n events: selected,\n bytes,\n truncated: selected.length < safe.length,\n };\n}\n\nfunction browserJsonBytes(value: unknown): number {\n return encoder.encode(JSON.stringify(value)).byteLength;\n}\n\nfunction observeSessionStatus(\n events: readonly SessionEvent[],\n ref: { current: { sequence: number; status: SessionStatus | null } },\n): SessionStatus | undefined {\n let latest: { sequence: number; status: SessionStatus } | null = null;\n for (const event of events) {\n const status = sessionStatusFromEvents([event]);\n if (status && (!latest || event.sequence >= latest.sequence)) {\n latest = { sequence: event.sequence, status };\n }\n }\n if (!latest || latest.sequence < ref.current.sequence) return undefined;\n ref.current = latest;\n return latest.status;\n}\n\ntype ForegroundCatchupPlan =\n | { kind: \"resume\" }\n | { kind: \"append\"; events: SessionEvent[]; resumeSequence: number }\n | { kind: \"reload\" };\n\n/**\n * Decide how a sustained hidden-tab suspension rejoins the durable event log.\n *\n * `lastSequence - cursor` is the exact raw durable work missed, but it is not\n * the number of visible messages: one streaming answer can own thousands of\n * adjacent delta rows. Small raw gaps therefore resume directly; medium gaps\n * get one forward compact page and are judged by the browser-visible result;\n * a page that cannot prove complete bounded coverage, or that would add too\n * many rows/groups/bytes, reloads the latest tail instead.\n */\nasync function planForegroundCatchup(\n client: EmbeddedSessionClientLike,\n workspaceId: string,\n sessionId: string,\n cursor: number,\n options: { signal?: AbortSignal } = {},\n): Promise<ForegroundCatchupPlan> {\n if (options.signal?.aborted) throw abortError();\n const session = await client.getSession(workspaceId, sessionId, {\n fresh: true,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n if (options.signal?.aborted) throw abortError();\n const durableHead = Math.max(cursor, session.lastSequence);\n const rawGap = durableHead - cursor;\n if (rawGap <= FOREGROUND_DIRECT_REPLAY_MAX_SEQUENCES) {\n return { kind: \"resume\" };\n }\n if (rawGap > FOREGROUND_COMPACT_PROBE_MAX_SEQUENCES) {\n return { kind: \"reload\" };\n }\n\n const page = await loadNextPage(client, workspaceId, sessionId, cursor, {\n pageSize: rawGap,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n const events = page.filter((event) => eventResumeSequence(event) > cursor);\n if (events.length === 0) {\n return { kind: \"reload\" };\n }\n assertAscending(events);\n const resumeSequence = maxResumeSequence(events);\n if (resumeSequence < durableHead) {\n // Byte/count truncation or an incomplete projection means this page cannot\n // prove that one append reaches the head observed above.\n return { kind: \"reload\" };\n }\n if (\n events.length > FOREGROUND_COMPACT_CATCHUP_MAX_EVENTS ||\n groupCount(events) > FOREGROUND_COMPACT_CATCHUP_MAX_GROUPS ||\n browserJsonBytes(events) > FOREGROUND_COMPACT_CATCHUP_MAX_BYTES\n ) {\n return { kind: \"reload\" };\n }\n return { kind: \"append\", events, resumeSequence };\n}\n\ntype LoadedEventWindow = {\n events: SessionEvent[];\n oldestSequence: number | null;\n newestSequence: number;\n hasOlder: boolean;\n};\n\ntype LoadedForwardEventWindow = {\n events: SessionEvent[];\n oldestSequence: number | null;\n newestSequence: number;\n hasNewer: boolean;\n};\n\nasync function loadEventWindow(\n client: EmbeddedSessionClientLike,\n workspaceId: string,\n sessionId: string,\n options: {\n before: number;\n pageSize: number;\n targetGroups: number;\n maxFetches: number;\n boundaryPageCap?: number;\n signal?: AbortSignal;\n },\n): Promise<LoadedEventWindow> {\n let cursor = options.before;\n let buffer: SessionEvent[] = [];\n let reachedStart = false;\n let fetches = 0;\n\n while (fetches < options.maxFetches) {\n if (buffer.length > 0 && groupCount(buffer) >= options.targetGroups) {\n break;\n }\n const page = await loadPreviousPage(client, workspaceId, sessionId, cursor, {\n pageSize: options.pageSize,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n fetches += 1;\n if (page.length === 0) {\n reachedStart = true;\n break;\n }\n assertAscending(page);\n buffer = [...page, ...buffer];\n cursor = page[0]!.sequence;\n if (isLogStart(page[0]!)) {\n reachedStart = true;\n break;\n }\n }\n\n // Boundary snap: a window that starts mid-turn TRIMS its head to the oldest\n // turn boundary already in the buffer — the dropped fragment is refetched by\n // the next loadOlder (everything below the new oldest sequence), whose own\n // window snaps the same way, so every seam lands on a turn start. Extra\n // page is fetched only when the buffer holds no boundary at all (one dense\n // turn); past the cap the existing truncation/hasOlder signal remains true.\n let snapPages = 0;\n while (\n !reachedStart &&\n findBoundaryIndex(buffer) === -1 &&\n snapPages < (options.boundaryPageCap ?? 0)\n ) {\n const page = await loadPreviousPage(client, workspaceId, sessionId, cursor, {\n pageSize: options.pageSize,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n fetches += 1;\n snapPages += 1;\n if (page.length === 0) {\n reachedStart = true;\n break;\n }\n assertAscending(page);\n buffer = [...page, ...buffer];\n cursor = page[0]!.sequence;\n if (isLogStart(page[0]!)) {\n reachedStart = true;\n break;\n }\n }\n if (!reachedStart) {\n const boundary = findBoundaryIndex(buffer);\n if (boundary > 0) {\n buffer = buffer.slice(boundary);\n }\n }\n const densityWindow = trimBackwardToGroupTarget(buffer, options.targetGroups);\n buffer = densityWindow.events;\n\n const oldest = buffer[0] ?? null;\n const newest = buffer[buffer.length - 1] ?? null;\n return {\n events: buffer,\n oldestSequence: oldest?.sequence ?? null,\n newestSequence: newest ? maxResumeSequence(buffer) : 0,\n hasOlder:\n buffer.length > 0 &&\n (densityWindow.trimmed || (!reachedStart && oldest?.type !== \"session.created\")),\n };\n}\n\n/** Index of the oldest clean turn start in the buffer, or -1. */\nfunction findBoundaryIndex(events: SessionEvent[]): number {\n for (let index = 0; index < events.length; index += 1) {\n if (isTurnBoundary(events[index]!)) {\n return index;\n }\n }\n return -1;\n}\n\nfunction isTurnBoundary(event: SessionEvent): boolean {\n return event.type === \"session.created\" || event.type === \"user.message\";\n}\n\n/**\n * Forward (oldest→newer) density-bounded window. Used for jump-to-start and\n * loadNewer so the browser never walks the whole middle gap.\n */\nasync function loadForwardEventWindow(\n client: EmbeddedSessionClientLike,\n workspaceId: string,\n sessionId: string,\n options: {\n after: number;\n pageSize: number;\n targetGroups: number;\n maxFetches: number;\n signal?: AbortSignal;\n },\n): Promise<LoadedForwardEventWindow> {\n let cursor = options.after;\n let buffer: SessionEvent[] = [];\n let fetches = 0;\n let reachedEnd = false;\n\n while (fetches < options.maxFetches) {\n if (buffer.length > 0 && groupCount(buffer) >= options.targetGroups) {\n break;\n }\n const page = await loadNextPage(client, workspaceId, sessionId, cursor, {\n pageSize: options.pageSize,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n fetches += 1;\n if (page.length === 0) {\n reachedEnd = true;\n break;\n }\n assertAscending(page);\n buffer = [...buffer, ...page];\n // Compact events retain their first raw sequence in `sequence` and expose\n // the covered high-water mark through `coalescedUntil`. Advancing by the\n // first sequence duplicates compacted text on the next page. A compact\n // response length is not an end-of-history signal either: thousands of raw\n // events may legitimately collapse into one returned event.\n cursor = maxResumeSequence(page);\n }\n const densityWindow = trimForwardToGroupTarget(buffer, options.targetGroups);\n buffer = densityWindow.events;\n\n const oldest = buffer[0] ?? null;\n const newest = buffer[buffer.length - 1] ?? null;\n return {\n events: buffer,\n oldestSequence: oldest?.sequence ?? null,\n newestSequence: newest ? maxResumeSequence(buffer) : 0,\n hasNewer: buffer.length > 0 && (densityWindow.trimmed || !reachedEnd),\n };\n}\n\ntype DensityWindow = {\n events: SessionEvent[];\n trimmed: boolean;\n};\n\n/** Keep the newest complete turn groups near an older-history seam. */\nfunction trimBackwardToGroupTarget(events: SessionEvent[], targetGroups: number): DensityWindow {\n if (!Number.isFinite(targetGroups) || targetGroups <= 0 || events.length === 0) {\n return { events, trimmed: false };\n }\n for (let index = events.length - 1; index > 0; index -= 1) {\n if (!isTurnBoundary(events[index]!)) continue;\n const candidate = events.slice(index);\n if (groupCount(candidate) >= targetGroups) {\n return { events: candidate, trimmed: true };\n }\n }\n return { events, trimmed: false };\n}\n\n/** Keep the oldest complete turn groups near a forward-history seam. */\nfunction trimForwardToGroupTarget(events: SessionEvent[], targetGroups: number): DensityWindow {\n if (!Number.isFinite(targetGroups) || targetGroups <= 0 || events.length === 0) {\n return { events, trimmed: false };\n }\n for (let index = 1; index < events.length; index += 1) {\n if (!isTurnBoundary(events[index]!)) continue;\n const candidate = events.slice(0, index);\n if (groupCount(candidate) >= targetGroups) {\n return { events: candidate, trimmed: true };\n }\n }\n return { events, trimmed: false };\n}\n\ntype PreviousPage = SessionEvent[] & { requested: number };\n\nasync function loadPreviousPage(\n client: EmbeddedSessionClientLike,\n workspaceId: string,\n sessionId: string,\n before: number,\n options: {\n pageSize: number;\n signal?: AbortSignal;\n },\n): Promise<PreviousPage> {\n if (options.signal?.aborted) {\n throw abortError();\n }\n const requested = options.pageSize;\n if (requested === 0) {\n return Object.assign([], { requested });\n }\n const page = await client.listEvents(workspaceId, sessionId, {\n before,\n limit: requested,\n compact: true,\n // Monitoring summaries omit correlation fields once a bounded durable\n // payload exceeds their preview threshold. The browser timeline needs the\n // exact stored payload so persisted tool outputs still match their\n // calls and expose truthful truncation telemetry after a reload.\n payloadMode: \"full\",\n });\n if (options.signal?.aborted) {\n throw abortError();\n }\n return Object.assign(page, { requested });\n}\n\nasync function loadNextPage(\n client: EmbeddedSessionClientLike,\n workspaceId: string,\n sessionId: string,\n after: number,\n options: {\n pageSize: number;\n signal?: AbortSignal;\n },\n): Promise<PreviousPage> {\n if (options.signal?.aborted) {\n throw abortError();\n }\n const requested = options.pageSize;\n if (requested === 0) {\n return Object.assign([], { requested });\n }\n const page = await client.listEvents(workspaceId, sessionId, {\n after,\n limit: requested,\n compact: true,\n direction: \"after\",\n payloadMode: \"full\",\n });\n if (options.signal?.aborted) {\n throw abortError();\n }\n return Object.assign(page, { requested });\n}\n\nfunction groupCount(events: SessionEvent[]): number {\n if (events.length === 0) {\n return 0;\n }\n return groupTimeline(buildTimeline(events)).length;\n}\n\nfunction isLogStart(event: SessionEvent): boolean {\n return event.type === \"session.created\" || event.sequence <= 1;\n}\n\nfunction maxResumeSequence(events: readonly SessionEvent[]): number {\n return events.reduce((max, event) => Math.max(max, eventResumeSequence(event)), 0);\n}\n\nfunction maxResumeSequenceOrNull(events: readonly SessionEvent[]): number | null {\n return events.length > 0 ? maxResumeSequence(events) : null;\n}\n\nfunction eventResumeSequence(event: SessionEvent): number {\n const streamedCoverage = sessionEventStreamCoveredThrough(event);\n if (streamedCoverage !== null) return streamedCoverage;\n return typeof event.coveredThrough === \"number\" &&\n Number.isSafeInteger(event.coveredThrough) &&\n event.coveredThrough >= event.sequence\n ? event.coveredThrough\n : event.sequence;\n}\n\nfunction assertAscending(events: SessionEvent[]): void {\n for (let index = 1; index < events.length; index += 1) {\n if (events[index - 1]!.sequence >= events[index]!.sequence) {\n throw new Error(\"@opengeni/react: session events must be ordered by ascending sequence\");\n }\n }\n}\n\nfunction assertPrependOrder(existing: SessionEvent[], older: SessionEvent[]): void {\n if (!shouldAssertDevelopment() || existing.length === 0 || older.length === 0) {\n return;\n }\n if (older[older.length - 1]!.sequence >= existing[0]!.sequence) {\n throw new Error(\"@opengeni/react: loadOlder returned overlapping session events\");\n }\n}\n\nfunction assertAppendOrder(existing: SessionEvent[], newer: SessionEvent[]): void {\n if (!shouldAssertDevelopment() || existing.length === 0 || newer.length === 0) {\n return;\n }\n if (newer[0]!.sequence <= existing[existing.length - 1]!.sequence) {\n throw new Error(\"@opengeni/react: loadNewer returned overlapping session events\");\n }\n}\n\nfunction shouldAssertDevelopment(): boolean {\n const processEnv = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env;\n return processEnv !== undefined && processEnv.NODE_ENV !== \"production\";\n}\n\nfunction abortError(): Error {\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n","import type { Session, SessionEvent } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useEmbeddedSessionRead, type EmbeddedSessionReadClientOverride } from \"../session-context\";\nimport {\n useMutationRunner,\n usePolledValue,\n useSessionEventTrigger,\n type SessionEventFeedOptions,\n} from \"./internal\";\n\nexport type UseSessionOptions = EmbeddedSessionReadClientOverride &\n SessionEventFeedOptions & {\n /** Re-fetch on an interval (ms). Off by default — pair with `useSessionEvents` for live status. */\n pollIntervalMs?: number | undefined;\n /** Optional shared causal clock invoked when each network read starts. */\n beginRead?: (() => number) | undefined;\n };\n\nexport type UseSessionResult = {\n session: Session | null;\n loading: boolean;\n error: Error | null;\n /** Monotonic revision of accepted authoritative detail reads. */\n readRevision: number;\n /** Causal generation captured when the accepted network read started. */\n readGeneration: number;\n refresh: () => Promise<void>;\n /** Manually rename the session (PATCH, source='user'). Returns the updated session, or null on failure. */\n updateTitle: (title: string) => Promise<Session | null>;\n /** True while a rename is in flight. */\n updating: boolean;\n mutationError: Error | null;\n clearMutationError: () => void;\n};\n\n/** Event types that change the session title (auto + cross-client renames). */\nexport function isTitleEvent(event: Pick<SessionEvent, \"type\">): boolean {\n return event.type === \"session.title_set\";\n}\n\nfunction isSessionDetailEvent(event: Pick<SessionEvent, \"type\">): boolean {\n return (\n isTitleEvent(event) ||\n event.type.startsWith(\"session.command.\") ||\n event.type.startsWith(\"session.wait.\") ||\n event.type === \"session.status.changed\" ||\n event.type === \"system.update.pending\"\n );\n}\n\n/** Fetch one session (with optional polling), live-patching its title on `session.title_set`. */\nexport function useSession(\n sessionId: string | null | undefined,\n options: UseSessionOptions = {},\n): UseSessionResult {\n const { client, workspaceId, workspaceControlEvent, registerSessionReconciler } =\n useEmbeddedSessionRead(options);\n const enabled = (options.enabled ?? true) && Boolean(sessionId);\n const [override, setOverride] = useState<Session | null>(null);\n const nextReadRevision = useRef(0);\n const nextReadGeneration = useRef(0);\n const beginRead = options.beginRead;\n const { run, mutating, mutationError, clearMutationError } = useMutationRunner();\n const load = useCallback(\n async (signal?: AbortSignal) => {\n if (!sessionId) {\n return null;\n }\n let readGeneration = 0;\n const fetched = await client.getSession(workspaceId, sessionId, {\n fresh: true,\n signal,\n onRequestStart: () => {\n readGeneration = beginRead?.() ?? ++nextReadGeneration.current;\n },\n });\n // A fresh server read supersedes any optimistic/event-driven override.\n setOverride(null);\n return {\n session: fetched,\n revision: ++nextReadRevision.current,\n readGeneration,\n };\n },\n [beginRead, client, workspaceId, sessionId],\n );\n const { data, loading, error, refresh } = usePolledValue(load, {\n pollIntervalMs: options.pollIntervalMs,\n enabled,\n });\n useEffect(() => {\n if (enabled && workspaceControlEvent) void refresh();\n }, [enabled, refresh, workspaceControlEvent]);\n useEffect(() => {\n if (!sessionId || !enabled) return;\n return registerSessionReconciler(sessionId, \"session\", refresh);\n }, [enabled, refresh, registerSessionReconciler, sessionId]);\n\n const base = data?.session ?? null;\n const readRevision = data?.revision ?? 0;\n const readGeneration = data?.readGeneration ?? 0;\n // The override only ever carries title/titleSource patches; it is reset on\n // every fresh load so it can never go stale against the server snapshot.\n const session = useMemo(\n () =>\n base && override && override.id === base.id\n ? { ...base, title: override.title, titleSource: override.titleSource }\n : base,\n [base, override],\n );\n\n const sharedEvents = options.events;\n\n // Live-patch the title on auto (agent) + cross-client (user/agent) renames so\n // the UI reflects the new title without polling or a full re-fetch.\n const onTitleEvent = useCallback(\n (event: SessionEvent) => {\n // Reconciliation emits only the last matching member of a shared batch.\n // A later title must not hide an earlier command activity change.\n if (\n sharedEvents?.some(\n (item) =>\n item.sessionId === sessionId &&\n !isTitleEvent(item) &&\n isSessionDetailEvent(item) &&\n item.sequence > (base?.lastSequence ?? -1),\n )\n ) {\n void refresh();\n } else if (!isTitleEvent(event)) {\n if (!base || event.sequence > base.lastSequence) void refresh();\n return;\n }\n // The fetched session row is the authoritative title projection through\n // lastSequence. Shared feeds may replay that historical tail after the\n // fetch; applying it would undo a row-only migration quarantine. Only an\n // event committed after this snapshot may live-patch the title.\n if (!base || event.sequence <= base.lastSequence) {\n return;\n }\n const payload = (event.payload ?? {}) as { title?: unknown; source?: unknown };\n const title = payload.title;\n if (typeof title !== \"string\") {\n return;\n }\n const source: \"user\" | \"agent\" | null =\n payload.source === \"user\" || payload.source === \"agent\" ? payload.source : null;\n setOverride((current): Session | null => {\n const next = current ?? base;\n return { ...next, title, titleSource: source };\n });\n },\n [base, refresh, sharedEvents, sessionId],\n );\n useSessionEventTrigger(client, workspaceId, sessionId, isSessionDetailEvent, onTitleEvent, {\n enabled,\n ...(options.events !== undefined ? { events: options.events } : {}),\n });\n\n const updateTitle = useCallback(\n async (title: string): Promise<Session | null> => {\n if (!sessionId) {\n return null;\n }\n const result = await run(() => client.updateSession(workspaceId, sessionId, { title }));\n if (result) {\n setOverride(result);\n }\n return result;\n },\n [client, workspaceId, sessionId, run],\n );\n\n return {\n session,\n loading,\n error,\n readRevision,\n readGeneration,\n refresh,\n updateTitle,\n updating: mutating,\n mutationError,\n clearMutationError,\n };\n}\n","import type {\n ComposerDraft,\n EffectiveSessionControl,\n McpPersonalConnectionSummary,\n SessionEvent,\n SessionQueueMutationResponse,\n SessionQueueSnapshot,\n SessionPendingInputPreview,\n SessionTurn,\n} from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useEmbeddedSession, type EmbeddedSessionClientOverride } from \"../session-context\";\nimport {\n useDebouncedCallback,\n usePageLiveActivity,\n useSessionEventTrigger,\n type SessionEventFeedOptions,\n} from \"./internal\";\n\n/** Events that can change the authoritative prompt queue or effective control. */\nexport function isTurnQueueEvent(event: Pick<SessionEvent, \"type\">): boolean {\n return (\n event.type.startsWith(\"turn.\") ||\n event.type.startsWith(\"session.queue.\") ||\n event.type.startsWith(\"session.control.\") ||\n event.type.startsWith(\"system.update.\") ||\n event.type.startsWith(\"workspace.inference.\")\n );\n}\n\nfunction queueSnapshotCovers(\n candidate: SessionQueueSnapshot | null,\n observed: SessionQueueSnapshot,\n): boolean {\n return Boolean(\n candidate &&\n candidate.version >= observed.version &&\n candidate.effectiveControl.controlVersion >= observed.effectiveControl.controlVersion,\n );\n}\n\nexport type QueueMutationKind = \"move\" | \"edit\" | \"steer\" | \"delete\";\nconst EMPTY_PENDING_BY_TURN: Readonly<Record<string, QueueMutationKind>> = {};\n\nexport type AcceptedQueueSteer = {\n turnId: string;\n triggerEventId: string;\n text: string;\n annotations: SessionTurn[\"annotations\"];\n resources: SessionTurn[\"resources\"];\n tools: SessionTurn[\"tools\"];\n occurredAt: string;\n state: \"sending\" | \"queued\";\n};\n\nexport type UseTurnQueueOptions = EmbeddedSessionClientOverride &\n SessionEventFeedOptions & {\n pollIntervalMs?: number | undefined;\n };\n\nexport type UseTurnQueueResult = {\n snapshot: SessionQueueSnapshot | null;\n /** Human/API prompts exactly in server execution order. Never client-sorted. */\n queue: SessionTurn[];\n /** Canonical pending machine inputs. Events only trigger an authoritative refresh. */\n pendingInputs: SessionPendingInputPreview[];\n /** Exact pending members projected to join an already-waiting prompt. */\n pendingInputAttachment: SessionQueueSnapshot[\"pendingInputAttachment\"];\n /** Secret-safe personal MCP summaries frozen on the exact active turn. */\n activePersonalConnections: McpPersonalConnectionSummary[];\n effectiveControl: EffectiveSessionControl | null;\n /** The latest interrupted attempt has not yet durably proved physical quiescence. */\n stoppingPreviousAttempt: boolean;\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n moveTurn: (turnId: string, beforeTurnId: string | null) => Promise<boolean>;\n /** Atomically withdraw a waiting prompt into the private durable composer draft. */\n editTurn: (\n turnId: string,\n options: { expectedDraftRevision: number; replaceDraft: boolean },\n ) => Promise<ComposerDraft | null>;\n /** Advance the same durable waiting prompt; no duplicate prompt is created. */\n steerTurn: (turnId: string) => Promise<boolean>;\n removeTurn: (turnId: string) => Promise<boolean>;\n pendingByTurn: Readonly<Record<string, QueueMutationKind>>;\n mutationFor: (turnId: string) => QueueMutationKind | null;\n mutating: boolean;\n mutationError: Error | null;\n clearMutationError: () => void;\n /** Immediate chat bridge while the durable Steer event catches up over SSE. */\n acceptedSteers?: AcceptedQueueSteer[] | undefined;\n};\n\n/**\n * The one authoritative human prompt queue. Every mutation carries the exact\n * server versions the operator saw and accepts only monotonic snapshots. A\n * conflict immediately reloads server truth; the client never invents order.\n */\nexport function useTurnQueue(\n sessionId: string | null | undefined,\n options: UseTurnQueueOptions = {},\n): UseTurnQueueResult {\n const { client, workspaceId, workspaceControlEvent, registerSessionReconciler } =\n useEmbeddedSession(options);\n const enabled = (options.enabled ?? true) && Boolean(sessionId);\n const targetKey = `${workspaceId}\\u0000${sessionId ?? \"\"}`;\n const pageLive = usePageLiveActivity();\n const [snapshot, setSnapshot] = useState<SessionQueueSnapshot | null>(null);\n const [stateTargetKey, setStateTargetKey] = useState(targetKey);\n const [loading, setLoading] = useState(enabled);\n const [error, setError] = useState<Error | null>(null);\n const [mutationError, setMutationError] = useState<Error | null>(null);\n const [pendingByTurn, setPendingByTurn] = useState<Record<string, QueueMutationKind>>({});\n const [acceptedSteers, setAcceptedSteers] = useState<AcceptedQueueSteer[]>([]);\n const pendingRef = useRef<Record<string, QueueMutationKind>>({});\n const readGeneration = useRef(0);\n const targetKeyRef = useRef(targetKey);\n const snapshotRef = useRef<SessionQueueSnapshot | null>(null);\n\n // Revoke the old target only when the new one commits. A concurrent render\n // may suspend while the previous target remains visible and interactive.\n useLayoutEffect(() => {\n if (targetKeyRef.current === targetKey) return;\n targetKeyRef.current = targetKey;\n readGeneration.current += 1;\n snapshotRef.current = null;\n pendingRef.current = {};\n setStateTargetKey(targetKey);\n setSnapshot(null);\n setLoading(enabled);\n setError(null);\n setMutationError(null);\n setPendingByTurn({});\n setAcceptedSteers([]);\n }, [enabled, targetKey]);\n\n useEffect(() => {\n if (acceptedSteers.length === 0 || options.events === undefined) return;\n const durablyStartedTurnIds = new Set(\n options.events.flatMap((event) =>\n event.type === \"turn.started\" && event.turnId ? [event.turnId] : [],\n ),\n );\n if (durablyStartedTurnIds.size === 0) return;\n // steer_requested can reach the browser before the timeline projection\n // that moves the queued user.message into chat. Keep this bridge through\n // physical cancellation; turn.started is the first boundary at which the\n // replacement timeline must already be visible.\n setAcceptedSteers((current) =>\n current.filter((steer) => !durablyStartedTurnIds.has(steer.turnId)),\n );\n }, [acceptedSteers.length, options.events]);\n\n const acceptSnapshot = useCallback(\n (ownedTargetKey: string, next: SessionQueueSnapshot | null): boolean => {\n if (targetKeyRef.current !== ownedTargetKey) return false;\n const current = snapshotRef.current;\n if (\n next &&\n current &&\n (next.version < current.version ||\n next.effectiveControl.controlVersion < current.effectiveControl.controlVersion)\n ) {\n return false;\n }\n snapshotRef.current = next;\n setStateTargetKey(ownedTargetKey);\n setSnapshot(next);\n return true;\n },\n [],\n );\n\n const load = useCallback(\n async (rejectOnFailure = false): Promise<void> => {\n if (!sessionId) return;\n const ownedTargetKey = `${workspaceId}\\u0000${sessionId}`;\n const ticket = ++readGeneration.current;\n try {\n const fetched = await client.getQueue(workspaceId, sessionId);\n if (targetKeyRef.current !== ownedTargetKey) return;\n const ownsLatestRead = ticket === readGeneration.current;\n if (rejectOnFailure) {\n const committed = acceptSnapshot(ownedTargetKey, fetched);\n if (!committed && !queueSnapshotCovers(snapshotRef.current, fetched)) {\n throw new TypeError(\"Queue reconciliation did not commit authoritative state\");\n }\n setError(null);\n if (ownsLatestRead) setLoading(false);\n } else if (ownsLatestRead) {\n acceptSnapshot(ownedTargetKey, fetched);\n setError(null);\n setLoading(false);\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n (ticket === readGeneration.current || rejectOnFailure)\n ) {\n setError(asError(cause));\n if (ticket === readGeneration.current) setLoading(false);\n }\n if (rejectOnFailure) throw cause;\n }\n },\n [client, workspaceId, sessionId, acceptSnapshot],\n );\n\n useEffect(() => {\n if (!enabled || !pageLive) {\n setLoading(false);\n return;\n }\n setLoading(true);\n const pollIntervalMs = options.pollIntervalMs;\n if (pollIntervalMs === undefined || pollIntervalMs <= 0) {\n void load();\n return () => {\n readGeneration.current += 1;\n };\n }\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const schedule = () => {\n if (cancelled) return;\n timer = setTimeout(() => {\n timer = null;\n void load().finally(schedule);\n }, pollIntervalMs);\n };\n void load().finally(schedule);\n return () => {\n cancelled = true;\n if (timer !== null) clearTimeout(timer);\n readGeneration.current += 1;\n };\n }, [load, enabled, pageLive, options.pollIntervalMs]);\n\n useEffect(() => {\n if (enabled && workspaceControlEvent) void load();\n }, [enabled, load, workspaceControlEvent]);\n useEffect(() => {\n if (!sessionId || !enabled) return;\n return registerSessionReconciler(sessionId, \"queue\", load);\n }, [enabled, load, registerSessionReconciler, sessionId]);\n\n const scheduleRefresh = useDebouncedCallback(() => void load());\n useSessionEventTrigger(\n client,\n workspaceId,\n sessionId,\n isTurnQueueEvent,\n scheduleRefresh,\n {\n enabled,\n ...(options.events !== undefined ? { events: options.events } : {}),\n },\n async () => await load(true),\n );\n\n const mutate = useCallback(\n async (\n turnId: string,\n kind: QueueMutationKind,\n command: (\n current: SessionQueueSnapshot,\n turn: SessionTurn,\n clientEventId: string,\n ) => Promise<SessionQueueMutationResponse>,\n ): Promise<SessionQueueMutationResponse | null> => {\n const ownedTargetKey = targetKey;\n if (!sessionId || targetKeyRef.current !== ownedTargetKey || pendingRef.current[turnId]) {\n return null;\n }\n const current = snapshotRef.current;\n const turn = current?.items.find((candidate) => candidate.id === turnId);\n if (!current || !turn) return null;\n pendingRef.current = { ...pendingRef.current, [turnId]: kind };\n setStateTargetKey(ownedTargetKey);\n setPendingByTurn(pendingRef.current);\n setMutationError(null);\n const clientEventId = operationKey();\n try {\n let result: SessionQueueMutationResponse;\n try {\n result = await command(current, turn, clientEventId);\n } catch (cause) {\n if (!isOutcomeUnknownError(cause)) throw cause;\n // Same-key replay is a fact check against the durable receipt. It\n // cannot duplicate the command even if the first response was lost.\n result = await command(current, turn, clientEventId);\n }\n if (targetKeyRef.current !== ownedTargetKey) return null;\n acceptSnapshot(ownedTargetKey, result.snapshot);\n return result;\n } catch (cause) {\n if (targetKeyRef.current === ownedTargetKey) {\n setMutationError(asError(cause));\n await load();\n }\n return null;\n } finally {\n if (targetKeyRef.current === ownedTargetKey && turnId in pendingRef.current) {\n const next = { ...pendingRef.current };\n delete next[turnId];\n pendingRef.current = next;\n setPendingByTurn(next);\n }\n }\n },\n [acceptSnapshot, load, sessionId, targetKey],\n );\n\n const moveTurn = useCallback(\n async (turnId: string, beforeTurnId: string | null): Promise<boolean> => {\n const result = await mutate(turnId, \"move\", (current, _turn, clientEventId) =>\n client.moveQueueItem(workspaceId, sessionId!, turnId, {\n clientEventId,\n expectedQueueVersion: current.version,\n beforeTurnId,\n }),\n );\n return result !== null;\n },\n [client, mutate, sessionId, workspaceId],\n );\n\n const editTurn = useCallback(\n async (\n turnId: string,\n edit: { expectedDraftRevision: number; replaceDraft: boolean },\n ): Promise<ComposerDraft | null> => {\n const result = await mutate(turnId, \"edit\", (_current, turn, clientEventId) =>\n client.editQueueItem(workspaceId, sessionId!, turnId, {\n clientEventId,\n expectedTurnVersion: turn.version,\n expectedDraftRevision: edit.expectedDraftRevision,\n replaceDraft: edit.replaceDraft,\n }),\n );\n return result?.draft ?? null;\n },\n [client, mutate, sessionId, workspaceId],\n );\n\n const steerTurn = useCallback(\n async (turnId: string): Promise<boolean> => {\n const ownedTargetKey = targetKey;\n const turn = snapshotRef.current?.items.find((candidate) => candidate.id === turnId);\n if (targetKeyRef.current !== ownedTargetKey) return false;\n if (!turn) {\n setMutationError(new Error(\"That queued prompt changed before Steer could be sent.\"));\n await load();\n return false;\n }\n const optimistic: AcceptedQueueSteer = {\n turnId: turn.id,\n triggerEventId: turn.triggerEventId,\n text: turn.prompt,\n annotations: turn.annotations ?? [],\n resources: turn.resources,\n tools: turn.tools,\n occurredAt: new Date().toISOString(),\n state: \"sending\",\n };\n setAcceptedSteers((current) => [\n ...current.filter((steer) => steer.turnId !== turnId),\n optimistic,\n ]);\n const result = await mutate(turnId, \"steer\", (current, queuedTurn, clientEventId) =>\n client.steerQueueItem(workspaceId, sessionId!, turnId, {\n clientEventId,\n expectedTurnVersion: queuedTurn.version,\n controlEtag: current.effectiveControl.controlEtag,\n }),\n );\n if (targetKeyRef.current !== ownedTargetKey) return false;\n // The active turn can finish while the operator clicks Steer. In that\n // race the queued prompt is atomically claimed before the steer command,\n // so the command conflicts but the user's prompt already advanced into\n // chat. Reconciled absence is success, not a scary unknown-outcome lie.\n const advancedWithoutSteer =\n result === null &&\n snapshotRef.current !== null &&\n !snapshotRef.current.items.some((candidate) => candidate.id === turnId);\n if (advancedWithoutSteer) {\n setMutationError(null);\n setAcceptedSteers((current) => current.filter((steer) => steer.turnId !== turnId));\n return true;\n }\n const accepted =\n result !== null ||\n snapshotRef.current?.items.some(\n (candidate) => candidate.id === turnId && candidate.metadata.delivery === \"steer\",\n ) === true;\n setAcceptedSteers((current) =>\n accepted\n ? current.map((steer) =>\n steer.turnId === turnId ? { ...steer, state: \"queued\" as const } : steer,\n )\n : current.filter((steer) => steer.turnId !== turnId),\n );\n return accepted;\n },\n [client, load, mutate, sessionId, targetKey, workspaceId],\n );\n\n const removeTurn = useCallback(\n async (turnId: string): Promise<boolean> => {\n const result = await mutate(turnId, \"delete\", (_current, turn, clientEventId) =>\n client.deleteQueueItem(workspaceId, sessionId!, turnId, {\n clientEventId,\n expectedTurnVersion: turn.version,\n reason: \"Deleted from the prompt queue\",\n }),\n );\n return result !== null;\n },\n [client, mutate, sessionId, workspaceId],\n );\n\n const identityMatches = stateTargetKey === targetKey;\n const visibleSnapshot = identityMatches ? snapshot : null;\n const visiblePendingByTurn = identityMatches ? pendingByTurn : EMPTY_PENDING_BY_TURN;\n const mutating = useMemo(\n () => Object.keys(visiblePendingByTurn).length > 0,\n [visiblePendingByTurn],\n );\n const mutationFor = useCallback(\n (turnId: string): QueueMutationKind | null => visiblePendingByTurn[turnId] ?? null,\n [visiblePendingByTurn],\n );\n\n return {\n snapshot: visibleSnapshot,\n queue: visibleSnapshot?.items ?? [],\n pendingInputs: visibleSnapshot?.pendingInputs ?? [],\n pendingInputAttachment: visibleSnapshot?.pendingInputAttachment ?? null,\n activePersonalConnections: visibleSnapshot?.activePersonalConnections ?? [],\n effectiveControl: visibleSnapshot?.effectiveControl ?? null,\n stoppingPreviousAttempt: visibleSnapshot?.stoppingPreviousAttempt ?? false,\n loading: identityMatches ? loading : enabled,\n error: identityMatches ? error : null,\n refresh: load,\n moveTurn,\n editTurn,\n steerTurn,\n removeTurn,\n pendingByTurn: visiblePendingByTurn,\n mutationFor,\n mutating,\n mutationError: identityMatches ? mutationError : null,\n clearMutationError: useCallback(() => {\n if (targetKeyRef.current === targetKey) setMutationError(null);\n }, [targetKey]),\n acceptedSteers: identityMatches ? acceptedSteers : [],\n };\n}\n\nfunction operationKey(): string {\n return globalThis.crypto.randomUUID();\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nfunction isOutcomeUnknownError(cause: unknown): boolean {\n return (\n typeof cause === \"object\" &&\n cause !== null &&\n (cause as { outcomeUnknown?: unknown }).outcomeUnknown === true\n );\n}\n","import type {\n SessionEvent,\n SessionHumanInputRequest,\n SubmitHumanInputResponseRequest,\n} from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n useEmbeddedHumanInputSession,\n type EmbeddedHumanInputClientOverride,\n} from \"../session-context\";\nimport { isActionableHumanInputRequest } from \"../human-input\";\nimport {\n useDebouncedCallback,\n useMutationRunner,\n usePolledValue,\n useSessionEventTrigger,\n type SessionEventFeedOptions,\n} from \"./internal\";\n\n/** Events that can create, settle, or invalidate an actionable request. */\nexport function isHumanInputEvent(event: Pick<SessionEvent, \"type\">): boolean {\n return (\n event.type === \"session.humanInput.requested\" ||\n event.type === \"user.humanInputResponse\" ||\n event.type === \"turn.completed\" ||\n event.type === \"turn.failed\" ||\n event.type === \"turn.cancelled\"\n );\n}\n\nexport type UseHumanInputRequestsOptions = EmbeddedHumanInputClientOverride &\n SessionEventFeedOptions & {\n /** Optional safety-net polling. Durable events drive refresh by default. */\n pollIntervalMs?: number | undefined;\n };\n\nexport type UseHumanInputRequestsResult = {\n requests: SessionHumanInputRequest[];\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n respond: (\n requestId: string,\n response: SubmitHumanInputResponseRequest,\n ) => Promise<SessionEvent | null>;\n respondingRequestId: string | null;\n mutationError: Error | null;\n clearMutationError: () => void;\n};\n\n/**\n * Authoritative structured-human-input hook. The server's pending-request\n * table is the read model; events only trigger reconciliation. This lets an\n * embedded host use the same primitive with a shared event feed or its own SDK\n * proxy without rebuilding request lifecycle logic.\n */\nexport function useHumanInputRequests(\n sessionId: string | null | undefined,\n options: UseHumanInputRequestsOptions = {},\n): UseHumanInputRequestsResult {\n const { client, workspaceId, registerSessionReconciler } = useEmbeddedHumanInputSession(options);\n const enabled = (options.enabled ?? true) && Boolean(sessionId);\n const load = useCallback(\n async (): Promise<SessionHumanInputRequest[]> =>\n sessionId\n ? await client.listHumanInputRequests(workspaceId, sessionId, { status: \"pending\" })\n : [],\n [client, sessionId, workspaceId],\n );\n const state = usePolledValue(load, {\n enabled,\n pollIntervalMs: options.pollIntervalMs,\n });\n const loadedRequests = state.data;\n const refreshRequests = state.refresh;\n const mutation = useMutationRunner(`${workspaceId}\\u0000${sessionId ?? \"\"}`);\n const [respondingRequestId, setRespondingRequestId] = useState<string | null>(null);\n const [deadlineVersion, setDeadlineVersion] = useState(0);\n const respondingRequestRef = useRef<string | null>(null);\n\n useEffect(() => {\n respondingRequestRef.current = null;\n setRespondingRequestId(null);\n }, [sessionId, workspaceId]);\n useEffect(() => {\n if (!sessionId || !enabled) return;\n return registerSessionReconciler(sessionId, \"human-input\", state.refresh);\n }, [enabled, registerSessionReconciler, sessionId, state.refresh]);\n\n const scheduleRefresh = useDebouncedCallback(() => void state.refresh());\n useSessionEventTrigger(client, workspaceId, sessionId, isHumanInputEvent, scheduleRefresh, {\n enabled,\n ...(options.events !== undefined ? { events: options.events } : {}),\n });\n\n useEffect(() => {\n const now = Date.now();\n const nextDeadline = (loadedRequests ?? []).reduce<number | null>((next, request) => {\n if (request.status !== \"pending\" || !request.expiresAt) return next;\n const deadline = Date.parse(request.expiresAt);\n if (!Number.isFinite(deadline) || deadline <= now) return next;\n return next === null ? deadline : Math.min(next, deadline);\n }, null);\n if (nextDeadline === null) return;\n const timer = globalThis.setTimeout(\n () => {\n setDeadlineVersion((current) => current + 1);\n void refreshRequests();\n },\n Math.min(2_147_483_647, Math.max(0, nextDeadline - now + 1)),\n );\n return () => globalThis.clearTimeout(timer);\n }, [loadedRequests, refreshRequests]);\n\n const respond = useCallback(\n async (\n requestId: string,\n response: SubmitHumanInputResponseRequest,\n ): Promise<SessionEvent | null> => {\n if (!sessionId || respondingRequestRef.current !== null) return null;\n respondingRequestRef.current = requestId;\n setRespondingRequestId(requestId);\n try {\n const event = await mutation.run(() =>\n client.submitHumanInputResponse(workspaceId, sessionId, requestId, response, {\n clientEventId: globalThis.crypto.randomUUID(),\n }),\n );\n if (event) await state.refresh();\n return event;\n } finally {\n if (respondingRequestRef.current === requestId) {\n respondingRequestRef.current = null;\n setRespondingRequestId(null);\n }\n }\n },\n [client, mutation, sessionId, state, workspaceId],\n );\n\n const now = Date.now();\n void deadlineVersion;\n return {\n requests: [...(state.data ?? [])]\n .filter((request) => isActionableHumanInputRequest(request, now))\n .sort(\n (left, right) =>\n left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id),\n ),\n loading: state.loading,\n error: state.error,\n refresh: state.refresh,\n respond,\n respondingRequestId,\n mutationError: mutation.mutationError,\n clearMutationError: mutation.clearMutationError,\n };\n}\n"],"mappings":"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","names":["asRecord","item","candidate","startSeq","isTurnBoundary","useCallback","useEffect","useMemo","useRef","useState","useState","useRef","useCallback","readGeneration","useEffect","useMemo","useCallback","useEffect","useMemo","useRef","useState","useState","useRef","useEffect","useCallback","useMemo","useCallback","useEffect","useRef","useState","useCallback","useState","useRef","useEffect","now"]}
|