@opengeni/react 0.25.0 → 0.25.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/{chunk-AVPU5PMC.js → chunk-F4CFWKVI.js} +332 -64
  2. package/dist/chunk-F4CFWKVI.js.map +1 -0
  3. package/dist/chunk-GQN2QIR2.js +3767 -0
  4. package/dist/chunk-GQN2QIR2.js.map +1 -0
  5. package/dist/{chunk-I3BJZIG5.js → chunk-HIWPQYWI.js} +2 -120
  6. package/dist/chunk-HIWPQYWI.js.map +1 -0
  7. package/dist/chunk-M7X4JZOD.js +121 -0
  8. package/dist/chunk-M7X4JZOD.js.map +1 -0
  9. package/dist/{chunk-SHOFILHJ.js → chunk-MP6237JB.js} +570 -984
  10. package/dist/chunk-MP6237JB.js.map +1 -0
  11. package/dist/chunk-OZDLELJQ.js +937 -0
  12. package/dist/chunk-OZDLELJQ.js.map +1 -0
  13. package/dist/{chunk-RDPDU4TA.js → chunk-TMH6HZWF.js} +3 -3
  14. package/dist/{chunk-6XUS5VFM.js → chunk-YU5PGUK7.js} +6 -4
  15. package/dist/{chunk-6XUS5VFM.js.map → chunk-YU5PGUK7.js.map} +1 -1
  16. package/dist/{composer-BXb0Q1HF.d.ts → composer-DoC4veX1.d.ts} +4 -75
  17. package/dist/composer.d.ts +2 -1
  18. package/dist/composer.js +4 -3
  19. package/dist/index.d.ts +14 -259
  20. package/dist/index.js +1016 -5140
  21. package/dist/index.js.map +1 -1
  22. package/dist/machines.js +3 -2
  23. package/dist/session-Du_FsrZ1.d.ts +264 -0
  24. package/dist/session-ui-BqQDH7YV.d.ts +183 -0
  25. package/dist/session-ui.d.ts +7 -0
  26. package/dist/session-ui.js +17 -0
  27. package/dist/session-ui.js.map +1 -0
  28. package/dist/session.d.ts +3 -1
  29. package/dist/session.js +26 -9
  30. package/dist/use-file-attachments-C0kpHrs9.d.ts +76 -0
  31. package/dist/{session-BEvtFWhe.d.ts → use-turn-queue-3rkJwjFv.d.ts} +3 -185
  32. package/package.json +6 -2
  33. package/src/components/message-timeline.tsx +92 -52
  34. package/src/hooks/use-composer.ts +456 -69
  35. package/src/hooks/use-file-attachments.ts +1 -1
  36. package/src/hooks/use-goal.ts +1 -1
  37. package/src/hooks/use-session-events.ts +5 -0
  38. package/src/hooks/use-session-lineage.ts +1 -1
  39. package/src/hooks/use-session.ts +9 -6
  40. package/src/session-ui.ts +13 -0
  41. package/src/session.ts +15 -0
  42. package/src/timeline/activity-rail.tsx +1 -1
  43. package/dist/chunk-AVPU5PMC.js.map +0 -1
  44. package/dist/chunk-I3BJZIG5.js.map +0 -1
  45. package/dist/chunk-SHOFILHJ.js.map +0 -1
  46. /package/dist/{chunk-RDPDU4TA.js.map → chunk-TMH6HZWF.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/queue-surface.tsx","../src/components/human-input-form.tsx","../src/timeline/registry.ts","../src/timeline/parsers.ts","../src/timeline/disclosure-context.tsx","../src/timeline/screenshot-lightbox.tsx","../src/timeline/shared.tsx","../src/lib/git-patch.ts","../src/components/pierre-diff.tsx","../src/timeline/tool-renderers.tsx","../src/timeline/tool-diff.tsx","../src/lib/use-theme-type.ts","../src/timeline/tool-display-name.ts","../src/timeline/activity-rail.tsx","../src/timeline/entrance.tsx","../src/timeline/turn-summary.tsx","../src/components/markdown.tsx","../src/components/session-status.tsx","../src/components/message-timeline.tsx"],"sourcesContent":["import { Loader2Icon } from \"lucide-react\";\nimport { lazy, Suspense, type ComponentType } from \"react\";\n\nimport type { QueueSurfaceProps } from \"./queue-surface-implementation\";\nexport { requestQueueDraftEdit } from \"./queue-draft-policy\";\nimport { EmptyQueueStateSurface } from \"./queue-surface-state\";\n\nexport type { QueueSurfaceProps } from \"./queue-surface-implementation\";\n\nconst loadQueueSurface = () => import(\"./queue-surface-implementation\");\ntype QueueSurfaceModule = { QueueSurface: ComponentType<QueueSurfaceProps> };\ntype QueueSurfaceLoader = () => Promise<QueueSurfaceModule>;\n\n/** The sole human prompt queue: compact above Goal, Agents, and composer. */\nexport const QueueSurface = createQueueSurface(loadQueueSurface);\n\n/** @internal Deterministic Suspense seam for the QueueSurface regression suite. */\nexport function createQueueSurfaceForTest(loadImplementation: QueueSurfaceLoader) {\n return createQueueSurface(loadImplementation);\n}\n\nfunction createQueueSurface(loadImplementation: QueueSurfaceLoader) {\n const LazyQueueSurface = lazy(async () => ({\n default: (await loadImplementation()).QueueSurface,\n }));\n\n return function QueueSurfaceBoundary(props: QueueSurfaceProps) {\n const { queue } = props;\n if (queue.queue.length === 0) {\n if (!queue.stoppingPreviousAttempt && !queue.error && !queue.mutationError) return null;\n return <EmptyQueueStateSurface queue={queue} />;\n }\n\n return (\n <Suspense fallback={<QueueSurfaceFallback count={queue.queue.length} />}>\n <LazyQueueSurface {...props} />\n </Suspense>\n );\n };\n}\n\nfunction QueueSurfaceFallback({ count }: { count: number }) {\n return (\n <div\n aria-live=\"polite\"\n className=\"mx-auto mb-2 w-full max-w-3xl shrink-0 px-4 sm:px-6\"\n data-testid=\"queue-surface-loading\"\n role=\"status\"\n >\n <div className=\"overflow-hidden rounded-lg border border-border bg-surface/80 shadow-sm\">\n <div className=\"flex items-center gap-2 px-3 py-2 text-xs text-fg-muted pointer-coarse:min-h-[44px]\">\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 animate-spin motion-reduce:animate-none\"\n />\n Loading {count} queued prompt{count === 1 ? \"\" : \"s\"}…\n </div>\n </div>\n </div>\n );\n}\n","import type {\n HumanInputAnswer,\n HumanInputQuestion,\n SessionHumanInputRequest,\n SubmitHumanInputResponseRequest,\n} from \"@opengeni/sdk\";\nimport { useEffect, useId, useRef, useState, type FormEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport type HumanInputAnswerDraft = {\n values: string[];\n other: string;\n otherSelected: boolean;\n};\n\nexport type HumanInputFormMessages = {\n title: string;\n description: string;\n submit: string;\n skip: string;\n submitting: string;\n other: string;\n deadlineLabel: string;\n formatDeadline: (value: string) => string;\n required: string;\n minLength: (count: number) => string;\n maxLength: (count: number) => string;\n otherRequired: string;\n minSelections: (count: number) => string;\n maxSelections: (count: number) => string;\n};\n\nexport const defaultHumanInputFormMessages: HumanInputFormMessages = {\n title: \"Your input is needed\",\n description: \"The agent is paused until you answer these questions.\",\n submit: \"Continue\",\n skip: \"Skip\",\n submitting: \"Submitting…\",\n other: \"Other\",\n deadlineLabel: \"Respond before\",\n formatDeadline,\n required: \"This question is required.\",\n minLength: (count) => `Enter at least ${count} characters.`,\n maxLength: (count) => `Enter no more than ${count} characters.`,\n otherRequired: \"Enter a value for Other.\",\n minSelections: (count) => `Choose at least ${count} option${count === 1 ? \"\" : \"s\"}.`,\n maxSelections: (count) => `Choose no more than ${count} option${count === 1 ? \"\" : \"s\"}.`,\n};\n\nexport type HumanInputFormProps = {\n request: Pick<SessionHumanInputRequest, \"id\" | \"questions\" | \"allowSkip\" | \"expiresAt\">;\n onSubmit: (response: SubmitHumanInputResponseRequest) => void | Promise<void>;\n submitting?: boolean | undefined;\n error?: string | null | undefined;\n title?: ReactNode;\n description?: ReactNode;\n submitLabel?: string | undefined;\n skipLabel?: string | undefined;\n messages?: Partial<HumanInputFormMessages> | undefined;\n autoFocus?: boolean | undefined;\n className?: string | undefined;\n};\n\n/**\n * Styled but host-neutral renderer for one structured request. Hosts can use\n * the headless `useHumanInputRequests` hook instead, or replace the title and\n * description while retaining accessible field semantics and validation.\n */\nexport function HumanInputForm({\n request,\n onSubmit,\n submitting = false,\n error,\n title,\n description,\n submitLabel,\n skipLabel,\n messages: messageOverrides,\n autoFocus = true,\n className,\n}: HumanInputFormProps) {\n const messages = { ...defaultHumanInputFormMessages, ...messageOverrides };\n const resolvedTitle = title === undefined ? messages.title : title;\n const resolvedDescription = description === undefined ? messages.description : description;\n const resolvedSubmitLabel = submitLabel ?? messages.submit;\n const resolvedSkipLabel = skipLabel ?? messages.skip;\n const formId = useId();\n const [drafts, setDrafts] = useState<Record<string, HumanInputAnswerDraft>>(() =>\n initialDrafts(request.questions),\n );\n const [validationErrors, setValidationErrors] = useState<Record<string, string>>({});\n const [submissionError, setSubmissionError] = useState<string | null>(null);\n const [submittingInternally, setSubmittingInternally] = useState(false);\n const submissionInFlight = useRef(false);\n const submissionGeneration = useRef(0);\n const busy = submitting || submittingInternally;\n\n useEffect(() => {\n submissionGeneration.current += 1;\n submissionInFlight.current = false;\n setDrafts(initialDrafts(request.questions));\n setValidationErrors({});\n setSubmissionError(null);\n setSubmittingInternally(false);\n }, [request.id, request.questions]);\n\n const update = (\n questionId: string,\n apply: (draft: HumanInputAnswerDraft) => HumanInputAnswerDraft,\n ): void => {\n setDrafts((current) => ({\n ...current,\n [questionId]: apply(current[questionId] ?? emptyDraft()),\n }));\n setValidationErrors((current) => {\n if (!(questionId in current)) return current;\n const next = { ...current };\n delete next[questionId];\n return next;\n });\n };\n\n const submitResponse = async (response: SubmitHumanInputResponseRequest): Promise<void> => {\n if (busy || submissionInFlight.current) return;\n const generation = submissionGeneration.current;\n submissionInFlight.current = true;\n setSubmissionError(null);\n setSubmittingInternally(true);\n try {\n await onSubmit(response);\n } catch (cause) {\n if (generation === submissionGeneration.current) {\n setSubmissionError(cause instanceof Error ? cause.message : String(cause));\n }\n } finally {\n if (generation === submissionGeneration.current) {\n submissionInFlight.current = false;\n setSubmittingInternally(false);\n }\n }\n };\n\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault();\n const result = answersFromDrafts(request.questions, drafts, messages);\n if (Object.keys(result.errors).length > 0) {\n setValidationErrors(result.errors);\n return;\n }\n await submitResponse({ outcome: \"answered\", answers: result.answers });\n };\n\n return (\n <form\n data-human-input-request={request.id}\n onSubmit={(event) => void submit(event)}\n className={cn(\n \"og-root flex w-full flex-col gap-5 rounded-og-lg border border-og-border bg-og-surface-1 p-5 shadow-og-sm\",\n className,\n )}\n >\n <header>\n <h2 className=\"text-og-md font-semibold text-og-fg\">{resolvedTitle}</h2>\n {resolvedDescription ? (\n <div className=\"mt-1 text-og-sm text-og-fg-muted\">{resolvedDescription}</div>\n ) : null}\n {request.expiresAt ? (\n <p className=\"mt-1 text-og-xs text-og-fg-subtle\">\n {messages.deadlineLabel}{\" \"}\n <time dateTime={request.expiresAt}>{messages.formatDeadline(request.expiresAt)}</time>\n </p>\n ) : null}\n </header>\n\n <fieldset disabled={busy} className=\"contents\">\n {request.questions.map((question, index) => {\n const draft = drafts[question.id] ?? emptyDraft();\n const fieldId = `${formId}-${index}`;\n const errorId = `${fieldId}-error`;\n const helpId = `${fieldId}-help`;\n const describedBy =\n [question.helpText ? helpId : null, validationErrors[question.id] ? errorId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n return (\n <div key={question.id} className=\"flex flex-col gap-2\">\n <label\n htmlFor={question.kind === \"text\" ? fieldId : undefined}\n className=\"text-og-base font-medium text-og-fg\"\n >\n {question.label ?? question.prompt}\n {question.required ? (\n <span aria-hidden className=\"ml-1 text-og-status-failed\">\n *\n </span>\n ) : null}\n </label>\n {question.label ? (\n <p className=\"text-og-sm text-og-fg-muted\">{question.prompt}</p>\n ) : null}\n {question.helpText ? (\n <p id={helpId} className=\"text-og-xs text-og-fg-subtle\">\n {question.helpText}\n </p>\n ) : null}\n {question.kind === \"text\" ? (\n <textarea\n id={fieldId}\n value={draft.values[0] ?? \"\"}\n onChange={(event) =>\n update(question.id, (current) => ({\n ...current,\n values: event.target.value ? [event.target.value] : [],\n }))\n }\n aria-invalid={Boolean(validationErrors[question.id])}\n aria-describedby={describedBy}\n autoFocus={autoFocus && index === 0}\n rows={3}\n className=\"min-h-20 w-full resize-y rounded-og-md border border-og-border bg-og-surface-2 px-3 py-2 text-og-base text-og-fg outline-none placeholder:text-og-fg-subtle focus:border-og-accent\"\n />\n ) : (\n <div\n role={question.kind === \"single_select\" ? \"radiogroup\" : \"group\"}\n aria-describedby={describedBy}\n className=\"flex flex-col gap-2\"\n >\n {question.options.map((option, optionIndex) => {\n const checked = draft.values.includes(option.id);\n return (\n <label\n key={option.id}\n className=\"flex cursor-pointer items-start gap-2 rounded-og-md border border-og-border px-3 py-2 hover:bg-og-surface-2\"\n >\n <input\n type={question.kind === \"single_select\" ? \"radio\" : \"checkbox\"}\n name={question.kind === \"single_select\" ? fieldId : undefined}\n autoFocus={autoFocus && index === 0 && optionIndex === 0}\n checked={checked}\n onChange={(event) =>\n update(question.id, (current) => ({\n ...current,\n values:\n question.kind === \"single_select\"\n ? event.target.checked\n ? [option.id]\n : []\n : event.target.checked\n ? [...current.values, option.id]\n : current.values.filter((value) => value !== option.id),\n ...(question.kind === \"single_select\" && event.target.checked\n ? { otherSelected: false }\n : {}),\n }))\n }\n className=\"mt-0.5 accent-og-accent\"\n />\n <span className=\"min-w-0\">\n <span className=\"block text-og-sm font-medium text-og-fg\">\n {option.label}\n </span>\n {option.description ? (\n <span className=\"block text-og-xs text-og-fg-muted\">\n {option.description}\n </span>\n ) : null}\n </span>\n </label>\n );\n })}\n {question.allowOther ? (\n <label className=\"flex items-start gap-2 rounded-og-md border border-og-border px-3 py-2\">\n <input\n type={question.kind === \"single_select\" ? \"radio\" : \"checkbox\"}\n name={question.kind === \"single_select\" ? fieldId : undefined}\n checked={draft.otherSelected}\n autoFocus={autoFocus && index === 0 && question.options.length === 0}\n onChange={(event) =>\n update(question.id, (current) => ({\n ...current,\n otherSelected: event.target.checked,\n ...(question.kind === \"single_select\" && event.target.checked\n ? { values: [] }\n : {}),\n }))\n }\n className=\"mt-2 accent-og-accent\"\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-og-sm font-medium text-og-fg\">\n {messages.other}\n </span>\n <input\n type=\"text\"\n value={draft.other}\n disabled={!draft.otherSelected || busy}\n onChange={(event) =>\n update(question.id, (current) => ({\n ...current,\n other: event.target.value,\n }))\n }\n className=\"mt-1 w-full rounded-og-sm border border-og-border bg-og-surface-2 px-2 py-1.5 text-og-sm text-og-fg outline-none focus:border-og-accent disabled:opacity-50\"\n />\n </span>\n </label>\n ) : null}\n </div>\n )}\n {validationErrors[question.id] ? (\n <p id={errorId} role=\"alert\" className=\"text-og-xs text-og-status-failed\">\n {validationErrors[question.id]}\n </p>\n ) : null}\n </div>\n );\n })}\n </fieldset>\n\n {(error ?? submissionError) ? (\n <p role=\"alert\" className=\"text-og-sm text-og-status-failed\">\n {error ?? submissionError}\n </p>\n ) : null}\n <footer className=\"flex items-center justify-end gap-2\">\n {request.allowSkip ? (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void submitResponse({ outcome: \"skipped\" })}\n className=\"rounded-og-md border border-og-border px-3 py-2 text-og-sm font-medium text-og-fg-muted hover:bg-og-surface-2 disabled:opacity-50\"\n >\n {resolvedSkipLabel}\n </button>\n ) : null}\n <button\n type=\"submit\"\n disabled={busy}\n className=\"rounded-og-md bg-og-accent px-3 py-2 text-og-sm font-medium text-og-accent-fg hover:bg-og-accent-strong disabled:opacity-50\"\n >\n {busy ? messages.submitting : resolvedSubmitLabel}\n </button>\n </footer>\n </form>\n );\n}\n\nexport function answersFromDrafts(\n questions: HumanInputQuestion[],\n drafts: Record<string, HumanInputAnswerDraft>,\n messageOverrides: Partial<HumanInputFormMessages> = {},\n): { answers: HumanInputAnswer[]; errors: Record<string, string> } {\n const messages = { ...defaultHumanInputFormMessages, ...messageOverrides };\n const answers: HumanInputAnswer[] = [];\n const errors: Record<string, string> = {};\n for (const question of questions) {\n const draft = drafts[question.id] ?? emptyDraft();\n const values = question.kind === \"text\" ? draft.values.filter(Boolean) : draft.values;\n const other = draft.otherSelected ? draft.other.trim() : \"\";\n const supplied = values.length + (other ? 1 : 0);\n if (question.required && supplied === 0) {\n errors[question.id] = messages.required;\n continue;\n }\n if (question.kind === \"text\") {\n const value = values[0] ?? \"\";\n if (\n value &&\n question.validation?.minLength != null &&\n value.length < question.validation.minLength\n ) {\n errors[question.id] = messages.minLength(question.validation.minLength);\n continue;\n }\n if (question.validation?.maxLength != null && value.length > question.validation.maxLength) {\n errors[question.id] = messages.maxLength(question.validation.maxLength);\n continue;\n }\n } else {\n if (draft.otherSelected && !other) {\n errors[question.id] = messages.otherRequired;\n continue;\n }\n const min = question.validation?.minSelections;\n const max = question.kind === \"single_select\" ? 1 : question.validation?.maxSelections;\n if (min != null && supplied < min) {\n errors[question.id] = messages.minSelections(min);\n continue;\n }\n if (max != null && supplied > max) {\n errors[question.id] = messages.maxSelections(max);\n continue;\n }\n }\n if (supplied > 0) {\n answers.push({\n questionId: question.id,\n values,\n ...(other ? { other } : {}),\n });\n }\n }\n return { answers, errors };\n}\n\nfunction initialDrafts(questions: HumanInputQuestion[]): Record<string, HumanInputAnswerDraft> {\n return Object.fromEntries(questions.map((question) => [question.id, emptyDraft()]));\n}\n\nfunction emptyDraft(): HumanInputAnswerDraft {\n return { values: [], other: \"\", otherSelected: false };\n}\n\nfunction formatDeadline(value: string): string {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString();\n}\n","import type { ComponentType } from \"react\";\nimport type { ToolCallItem } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Tool renderer registry\n\n The extension point. A `ToolRenderer` is a React component fed one projected\n `ToolCallItem`; the registry resolves which renderer handles a given call,\n keyed on the tool `name` and (secondarily) its provider-native `raw.type`.\n\n Resolution order (most → least specific):\n 1. exact match on `raw.type` (e.g. \"apply_patch_call\", \"computer_call\")\n 2. exact match on the tool `name` (e.g. \"exec_command\", \"web_search_call\")\n 3. the registry's generic fallback\n\n A consumer extends the defaults without forking by passing overrides to\n `createToolRegistry` — e.g. a custom renderer for their own MCP tool, or a\n replacement for a built-in one. The registry is immutable and fully typed.\n -------------------------------------------------------------------------- */\n\nexport type ToolRendererProps = {\n item: ToolCallItem;\n};\n\nexport type ToolRenderer = ComponentType<ToolRendererProps>;\n\n/** A registry entry: which key it matches and the component that renders it. */\nexport type ToolRegistryEntry =\n | { match: \"rawType\"; type: string; render: ToolRenderer }\n | { match: \"name\"; name: string; render: ToolRenderer };\n\nexport type ToolRegistry = {\n /** Resolve the renderer for a call (never null — falls back to generic). */\n resolve: (item: ToolCallItem) => ToolRenderer;\n /** The generic fallback renderer. */\n fallback: ToolRenderer;\n};\n\nexport type CreateToolRegistryOptions = {\n /**\n * Entries that take precedence over the built-ins. Earlier entries win, so a\n * consumer can shadow a default renderer for the same key.\n */\n entries?: ToolRegistryEntry[] | undefined;\n /** Replace the generic fallback used for unmatched tools. */\n fallback?: ToolRenderer | undefined;\n};\n\n/** The `raw.type` of a projected tool call, when the provider item carries one. */\nexport function rawTypeOf(item: ToolCallItem): string | null {\n const raw = item.raw;\n if (raw && typeof raw === \"object\" && typeof (raw as { type?: unknown }).type === \"string\") {\n return (raw as { type: string }).type;\n }\n return null;\n}\n\n/**\n * Build a tool registry from a set of entries and a fallback. The returned\n * registry resolves in priority order: `raw.type` entries first, then `name`\n * entries, then the fallback. Consumer `entries` are consulted before the\n * built-in `baseEntries`, so they shadow defaults cleanly.\n */\nexport function createToolRegistry(\n baseEntries: ToolRegistryEntry[],\n baseFallback: ToolRenderer,\n options: CreateToolRegistryOptions = {},\n): ToolRegistry {\n const entries = [...(options.entries ?? []), ...baseEntries];\n const fallback = options.fallback ?? baseFallback;\n\n const byRawType = new Map<string, ToolRenderer>();\n const byName = new Map<string, ToolRenderer>();\n for (const entry of entries) {\n if (entry.match === \"rawType\") {\n if (!byRawType.has(entry.type)) {\n byRawType.set(entry.type, entry.render);\n }\n } else if (!byName.has(entry.name)) {\n byName.set(entry.name, entry.render);\n }\n }\n\n const resolve = (item: ToolCallItem): ToolRenderer => {\n const rawType = rawTypeOf(item);\n if (rawType) {\n const byType = byRawType.get(rawType);\n if (byType) {\n return byType;\n }\n }\n return byName.get(item.name) ?? fallback;\n };\n\n return { resolve, fallback };\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\nimport { tryParseJson } from \"../lib/format\";\n\n/* ----------------------------------------------------------------------------\n Pure parsers for the provider-native tool shapes that the timeline renders.\n\n These are intentionally browser-safe, dependency-free mirrors of the\n server-side helpers in `@opengeni/runtime` (`sandboxCommandExitCode`,\n `parseExecBannerSessionId`, `stripExecBanner`) plus the V4A diff parser the\n apply-patch renderer needs. The SDK does not depend on `@opengeni/runtime` by\n design (runtime is a heavy server package); these few regexes are cheap to\n own here and keep the React surface free of a server dependency.\n\n Every function is pure -- same input, same output -- so it can be\n unit-tested and memoized.\n -------------------------------------------------------------------------- */\n\n/** Recover the exit code from a sandbox exec banner (`Process exited with code N`). */\nexport function sandboxCommandExitCode(out: unknown): number | null {\n const match = String(out ?? \"\").match(/Process exited with code (-?\\d+)/);\n return match ? Number(match[1]) : null;\n}\n\n/**\n * Recover the numeric exec-session id the sandbox embeds for a STILL-RUNNING\n * (backgrounded) process (`Process running with session ID N`). A finished\n * command emits `Process exited with code N` instead, which yields `null`.\n */\nexport function parseExecBannerSessionId(out: unknown): number | null {\n const text = String(out ?? \"\");\n const outputIdx = text.indexOf(\"\\nOutput:\\n\");\n const banner =\n outputIdx >= 0 ? text.slice(0, outputIdx) : text.startsWith(\"Output:\\n\") ? \"\" : text;\n const match = banner.match(/Process running with session ID (\\d+)/);\n if (!match) {\n return null;\n }\n const n = Number.parseInt(match[1]!, 10);\n return Number.isFinite(n) ? n : null;\n}\n\n/** Strip the exec banner (`Chunk ID ...\\n...\\nOutput:\\n`) down to the command's stdout. */\nexport function stripExecBanner(out: unknown): string {\n const text = String(out ?? \"\");\n const marker = text.indexOf(\"\\nOutput:\\n\");\n if (marker >= 0) {\n return text.slice(marker + \"\\nOutput:\\n\".length);\n }\n if (text.startsWith(\"Output:\\n\")) {\n return text.slice(\"Output:\\n\".length);\n }\n return text;\n}\n\n/** The sandbox clamped the output (token/line truncation markers in the banner). */\nexport function execTruncated(out: unknown): boolean {\n return /Total output lines:|\\.{3}\\d+ tokens truncated\\.{3}|\\[\\.{3}\\d+ characters truncated/.test(\n String(out ?? \"\"),\n );\n}\n\n/** A `write_stdin` whose target PTY vanished (`write_stdin failed: session not found: N`). */\nexport function isExecSessionLostBanner(out: unknown): boolean {\n return /write_stdin failed: session not found: \\d+/.test(String(out ?? \"\"));\n}\n\n/** True when the exec stdout looks binary/garbled (a NUL byte or ELF magic). */\nexport function looksBinary(text: string): boolean {\n return text.includes(\"\\u0000\") || text.startsWith(\"\\u007fELF\");\n}\n\n/**\n * Render unprintable control characters as caret notation (0x03 -> `^C`) so a\n * `write_stdin` keystroke payload reads cleanly in the row title.\n */\nexport function controlCaret(printable: string): string {\n return String(printable).replace(\n /[\\u0000-\\u001f]/g,\n (c) => `^${String.fromCharCode(c.charCodeAt(0) + 64)}`,\n );\n}\n\n/* --- V4A apply_patch diff -> GitFileDiff ------------------------------------ */\n\n/** One operation inside an `apply_patch_call` (a V4A file edit). */\nexport type ApplyPatchOperation = {\n /**\n * The V4A op kind. The three canonical values are `create_file`,\n * `update_file`, and `delete_file`; the open `string` tail tolerates a\n * forward-compatible/unknown op kind from the provider without a type error\n * (it falls through to the \"Edited\" treatment).\n */\n type: \"create_file\" | \"update_file\" | \"delete_file\" | (string & {});\n path: string;\n /** Rename target -- when present the op is a move/rename. */\n moveTo?: string | null | undefined;\n /** The V4A hunk string (`@@ ...` lines with `+`/`-`/context prefixes). */\n diff?: string | undefined;\n};\n\n/**\n * Parse a single V4A `apply_patch` operation into the SDK's `GitFileDiff` shape\n * so it can flow into the SAME `DiffView` / `PierreDiff` the Files tab uses.\n * Throws on a hunk string it cannot structure (no `@@` anchor on an update); the\n * renderer catches and falls back to a raw-patch view.\n */\nexport function v4aToGitFileDiff(op: ApplyPatchOperation): GitFileDiff {\n const status: GitFileDiff[\"status\"] =\n op.type === \"create_file\"\n ? \"added\"\n : op.type === \"delete_file\"\n ? \"deleted\"\n : op.moveTo\n ? \"renamed\"\n : \"modified\";\n const oldPath = op.moveTo ? op.path : null;\n const path = op.moveTo || op.path;\n\n const hunks: GitFileDiff[\"hunks\"] = [];\n let additions = 0;\n let deletions = 0;\n let sawHunkAnchor = false;\n\n if (op.type !== \"delete_file\") {\n const lines = (op.diff ?? \"\").split(\"\\n\");\n let cur: GitFileDiff[\"hunks\"][number] | null = null;\n let oldNo = 1;\n let newNo = 1;\n for (const raw of lines) {\n if (raw.startsWith(\"@@\")) {\n sawHunkAnchor = true;\n const match = raw.match(/-(\\d+)(?:,\\d+)?\\s+\\+(\\d+)/);\n oldNo = match ? Number(match[1]) : 1;\n newNo = match ? Number(match[2]) : 1;\n cur = {\n oldStart: oldNo,\n oldLines: 0,\n newStart: newNo,\n newLines: 0,\n header: raw,\n lines: [{ type: \"meta\", oldNo: null, newNo: null, text: raw }],\n };\n hunks.push(cur);\n } else if (cur || op.type === \"create_file\") {\n if (!cur) {\n // No `@@` anchor on a create_file body: synthesize an add-only hunk.\n // Leave `header` empty so `gitFileDiffToPatch` regenerates a valid\n // `@@ -0,0 +1,N @@` from the range fields once newLines is counted — a\n // pre-baked partial header (e.g. `@@ +1 @@`) renders zero lines in a\n // generic unified-diff parser.\n cur = {\n oldStart: 0,\n oldLines: 0,\n newStart: 1,\n newLines: 0,\n header: \"\",\n lines: [],\n };\n hunks.push(cur);\n oldNo = 0;\n newNo = 1;\n }\n if (raw.startsWith(\"+\")) {\n cur.lines.push({\n type: \"add\",\n oldNo: null,\n newNo: newNo++,\n text: raw.slice(1),\n });\n cur.newLines += 1;\n additions += 1;\n } else if (raw.startsWith(\"-\")) {\n cur.lines.push({\n type: \"del\",\n oldNo: oldNo++,\n newNo: null,\n text: raw.slice(1),\n });\n cur.oldLines += 1;\n deletions += 1;\n } else {\n cur.lines.push({\n type: \"context\",\n oldNo: oldNo++,\n newNo: newNo++,\n text: raw.replace(/^ /, \"\"),\n });\n cur.oldLines += 1;\n cur.newLines += 1;\n }\n }\n }\n // An update with content but no recognizable hunk anchor is malformed V4A;\n // the caller falls back to the raw-patch view instead of a structured diff.\n if (op.type === \"update_file\" && !sawHunkAnchor && lines.some((l) => l.trim().length > 0)) {\n throw new Error(\"malformed V4A: no @@ hunk anchor\");\n }\n }\n\n return {\n path,\n oldPath,\n status,\n isBinary: false,\n isImage: false,\n additions,\n deletions,\n hunks,\n truncated: false,\n };\n}\n\n/**\n * Extract the `apply_patch` operations from a provider-native tool item's `raw`\n * payload, normalizing the two wire shapes (`raw.operations[]` for a multi-file\n * patch, `raw.operation` for a single op). The single owner of this shape so the\n * renderer and the turn-summary facet counter never drift.\n */\nexport function applyPatchOps(raw: unknown): ApplyPatchOperation[] {\n const r = (raw ?? {}) as {\n operation?: ApplyPatchOperation;\n operations?: ApplyPatchOperation[];\n };\n if (Array.isArray(r.operations)) {\n return r.operations;\n }\n return r.operation ? [r.operation] : [];\n}\n\n/**\n * True when a tool item is an `apply_patch_call` — by its provider-native\n * `raw.type` (the live-wire source of truth) or by tool `name` (first-party\n * replays that omit `raw`). Centralizes the rawType-or-name check.\n */\nexport function isApplyPatch(item: { name: string; raw: unknown }): boolean {\n const type =\n item.raw && typeof item.raw === \"object\" ? (item.raw as { type?: unknown }).type : undefined;\n return type === \"apply_patch_call\" || item.name === \"apply_patch_call\";\n}\n\n/* --- secret redaction ------------------------------------------------------- */\n\nconst SECRET_KEY = /^(value|secret|token|password|api[_-]?key|signing[_-]?key)$/i;\n\n/** Deep-redact secret-looking values so arguments never leak a key into the UI. */\nexport function redactSecrets(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(redactSecrets);\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = SECRET_KEY.test(k) ? \"••••\" : redactSecrets(v);\n }\n return out;\n }\n return value;\n}\n\n/** Parse tool arguments that may arrive as a JSON string or an object. */\nexport function parseToolArgs(args: unknown): Record<string, unknown> {\n if (args == null) {\n return {};\n }\n if (typeof args === \"string\") {\n const parsed = tryParseJson(args);\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : {};\n }\n return typeof args === \"object\" ? (args as Record<string, unknown>) : {};\n}\n\n/** The last non-empty line of a string -- the compact \"what happened\" peek. */\nexport function tailPeek(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return \"\";\n }\n const lines = trimmed.split(\"\\n\");\n return lines[lines.length - 1] ?? \"\";\n}\n\n/**\n * Unwrap an MCP tool result (`{ content: [{ type: \"text\", text }], isError? }`)\n * into a flat `{ text, isError }`. Non-MCP outputs pass through as their string\n * form.\n */\nexport function unwrapMcpOutput(output: unknown): {\n text: string;\n isError: boolean;\n} {\n // Managed MCP events persist a normalized single text part as\n // `{ type: \"text\", text }`; accept it alongside the SDK-native content array.\n if (\n output &&\n typeof output === \"object\" &&\n (output as { type?: unknown }).type === \"text\" &&\n typeof (output as { text?: unknown }).text === \"string\"\n ) {\n const record = output as { text: string; isError?: unknown };\n return { text: record.text, isError: Boolean(record.isError) };\n }\n if (output && typeof output === \"object\" && \"content\" in output) {\n const record = output as { content?: unknown; isError?: unknown };\n const isError = Boolean(record.isError);\n if (Array.isArray(record.content)) {\n const textPart = record.content.find(\n (part): part is { type: string; text: string } =>\n !!part && typeof part === \"object\" && (part as { type?: unknown }).type === \"text\",\n );\n return {\n text: textPart ? String(textPart.text) : JSON.stringify(output),\n isError,\n };\n }\n return { text: JSON.stringify(output), isError };\n }\n return {\n text: typeof output === \"string\" ? output : output == null ? \"\" : JSON.stringify(output),\n isError: false,\n };\n}\n\n/* --- computer-use screenshot extraction ------------------------------------- */\n\n/**\n * Extract a renderable `data:` URL from a computer-use screenshot output,\n * whatever transport produced it. The hosted `computer_call` and the\n * function-text mode persist a plain `data:image/...` string; the\n * function-image mode (codex-backed sessions) persists the STRUCTURED image\n * output — `{type:\"image\", image:{data, mediaType}}` with `data` arriving as a\n * number array / index map / Buffer-JSON / base64 string after event\n * serialization — or the agents-core normalized `input_image` content item.\n * Returns null when the output carries no image (so callers fall back to their\n * text/empty presentation).\n */\nexport function screenshotDataUrl(out: unknown): string | null {\n if (typeof out === \"string\") {\n if (out.startsWith(\"data:image\")) {\n return out;\n }\n // A JSON-encoded structured output (some transports stringify tool results).\n if (out.startsWith(\"{\") || out.startsWith(\"[\")) {\n const parsed = tryParseJson(out);\n if (parsed !== undefined && parsed !== out) {\n return screenshotDataUrl(parsed);\n }\n }\n return null;\n }\n if (Array.isArray(out)) {\n for (const entry of out) {\n const url = screenshotDataUrl(entry);\n if (url) {\n return url;\n }\n }\n return null;\n }\n if (out === null || typeof out !== \"object\") {\n return null;\n }\n const record = out as Record<string, unknown>;\n // agents-core normalized content item: {type:\"input_image\", image_url: \"data:…\" | {url}}\n const imageUrl = record.image_url ?? record.imageUrl;\n if (typeof imageUrl === \"string\" && imageUrl.startsWith(\"data:image\")) {\n return imageUrl;\n }\n if (imageUrl && typeof imageUrl === \"object\") {\n const url = (imageUrl as Record<string, unknown>).url;\n if (typeof url === \"string\" && url.startsWith(\"data:image\")) {\n return url;\n }\n }\n // Structured tool output: {type:\"image\", image:{data, mediaType}}\n const image = record.image as Record<string, unknown> | undefined;\n if (image && typeof image === \"object\") {\n const mediaType = typeof image.mediaType === \"string\" ? image.mediaType : \"image/png\";\n const base64 = bytesToBase64(image.data);\n if (base64) {\n return `data:${mediaType};base64,${base64}`;\n }\n if (typeof image.data === \"string\" && image.data.length > 0) {\n // Already base64 text.\n return `data:${mediaType};base64,${image.data}`;\n }\n }\n return null;\n}\n\nexport type TimelineMediaPreview = {\n type: \"media_preview\";\n mediaType: string;\n inlineBytes: number | null;\n fullOutputAvailable: false;\n preview: string;\n};\n\n/** Find the explicit non-retained inline-media fact in a tool output. */\nexport function mediaPreviewFact(out: unknown): TimelineMediaPreview | null {\n if (typeof out === \"string\" && (out.startsWith(\"{\") || out.startsWith(\"[\"))) {\n const parsed = tryParseJson(out);\n if (parsed !== undefined && parsed !== out) return mediaPreviewFact(parsed);\n }\n if (Array.isArray(out)) {\n for (const entry of out) {\n const preview = mediaPreviewFact(entry);\n if (preview) return preview;\n }\n return null;\n }\n if (!out || typeof out !== \"object\") return null;\n const record = out as Record<string, unknown>;\n if (\n record.type !== \"media_preview\" ||\n typeof record.mediaType !== \"string\" ||\n record.fullOutputAvailable !== false ||\n typeof record.preview !== \"string\" ||\n (record.inlineBytes !== null && typeof record.inlineBytes !== \"number\")\n ) {\n return null;\n }\n return record as TimelineMediaPreview;\n}\n\n/** Serialize whatever a Uint8Array became in JSON (number[], {\"0\":n,…} index\n * map, or Buffer-JSON {type:\"Buffer\",data:[…]}) back into base64. */\nfunction bytesToBase64(data: unknown): string | null {\n const isByte = (n: unknown): n is number =>\n typeof n === \"number\" && Number.isInteger(n) && n >= 0 && n <= 255;\n let bytes: number[] | null = null;\n if (Array.isArray(data) && data.every(isByte)) {\n bytes = data;\n } else if (data && typeof data === \"object\") {\n const record = data as Record<string, unknown>;\n if (record.type === \"Buffer\" && Array.isArray(record.data) && record.data.every(isByte)) {\n bytes = record.data;\n } else {\n const keys = Object.keys(record);\n if (keys.length > 0 && keys.every((key) => /^\\d+$/.test(key))) {\n const values = keys.sort((a, b) => Number(a) - Number(b)).map((key) => record[key]);\n if (values.every(isByte)) {\n bytes = values;\n }\n }\n }\n }\n if (!bytes || bytes.length === 0) {\n return null;\n }\n try {\n let binary = \"\";\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.slice(i, i + CHUNK));\n }\n return typeof btoa === \"function\"\n ? btoa(binary)\n : Buffer.from(binary, \"binary\").toString(\"base64\");\n } catch {\n // A hostile/absurd payload must degrade to \"no image\", never crash a render.\n return null;\n }\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\n\n/* ----------------------------------------------------------------------------\n Disclosure defaults context\n\n A tiny, opt-in context that lets an ancestor seed the INITIAL open state of\n every collapsible in the timeline (ActivityDisclosure rows and TurnSummary\n chips). Its sole intended use is deterministic screenshot capture: a tool can\n force every card open so a headless render shows expanded bodies.\n\n It is fully inert in normal app usage. With no provider, the hook returns\n `undefined`, every collapsible keeps its own author-chosen default, and there\n is zero change to how the components look or animate. Mounting the provider\n only changes the SEED of the initial `open` state — Radix still owns the\n open/close transition, so animations are untouched.\n -------------------------------------------------------------------------- */\n\nconst DisclosureDefaultsContext = createContext<boolean | undefined>(undefined);\n\n/**\n * Seed the initial open state of every timeline collapsible below this node.\n * Intended for screenshot/test instrumentation only; absent by default.\n */\nexport function DisclosureDefaultsProvider({\n defaultOpen,\n children,\n}: {\n defaultOpen: boolean;\n children: ReactNode;\n}) {\n return (\n <DisclosureDefaultsContext.Provider value={defaultOpen}>\n {children}\n </DisclosureDefaultsContext.Provider>\n );\n}\n\n/**\n * The forced initial-open seed from an ancestor {@link DisclosureDefaultsProvider},\n * or `undefined` when none is mounted (the inert, app-default case).\n */\nexport function useForcedDefaultOpen(): boolean | undefined {\n return useContext(DisclosureDefaultsContext);\n}\n","import { XIcon } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from \"react\";\nimport { Dialog } from \"radix-ui\";\nimport { cn } from \"../lib/cn\";\n\n/* ----------------------------------------------------------------------------\n Screenshot lightbox\n\n A single, app-level lightbox the computer_call / view_image renderers open by\n `src`. Built on Radix Dialog so it is focus-trapped, ESC-closable, and\n scroll-locked — fixing the v1 mockup's broken expand (an absolutely-positioned\n <img> that overflowed its row). The image is centered, constrained to the\n viewport (`max-w/max-h` + `object-contain`), and sits on a dimmed backdrop.\n\n Consumers render `<LightboxProvider>` once near the timeline; renderers call\n `useLightbox().open(src)`.\n -------------------------------------------------------------------------- */\n\ntype LightboxController = {\n open: (src: string, caption?: string) => void;\n};\n\nconst LightboxContext = createContext<LightboxController | null>(null);\n\n/** Open the app-level screenshot lightbox. No-op outside a `LightboxProvider`. */\nexport function useLightbox(): LightboxController {\n return useContext(LightboxContext) ?? NOOP;\n}\n\n/**\n * The lightbox controller when one is mounted, or `null` outside a\n * `LightboxProvider`. Lets a media primitive degrade to a non-interactive image\n * (rather than a dead \"Expand\" button that announces an action it cannot do).\n */\nexport function useLightboxOptional(): LightboxController | null {\n return useContext(LightboxContext);\n}\n\nconst NOOP: LightboxController = { open: () => {} };\n\n/**\n * The app-level screenshot lightbox. Render once near the timeline; renderers\n * call `useLightbox().open(src)`.\n *\n * Idempotent by design: when an ancestor `LightboxProvider` already exists (e.g.\n * a `MessageTimeline` mounted inside an app that already wraps its shell), this\n * one becomes a pass-through and does NOT mount a second focus-trapping Dialog.\n * That keeps `MessageTimeline` self-sufficient (it owns its own provider) while\n * composing cleanly when nested.\n */\nexport function LightboxProvider({ children }: { children: ReactNode }) {\n const ancestor = useContext(LightboxContext);\n if (ancestor) {\n return <>{children}</>;\n }\n return <LightboxRoot>{children}</LightboxRoot>;\n}\n\nfunction LightboxRoot({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{ src: string; caption?: string } | null>(null);\n\n const open = useCallback((src: string, caption?: string) => {\n setState(caption ? { src, caption } : { src });\n }, []);\n\n const controller = useMemo<LightboxController>(() => ({ open }), [open]);\n\n return (\n <LightboxContext.Provider value={controller}>\n {children}\n <Dialog.Root open={state !== null} onOpenChange={(next) => !next && setState(null)}>\n <AnimatePresence>\n {state !== null ? (\n <Dialog.Portal forceMount>\n <Dialog.Overlay asChild forceMount>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n className=\"og-root fixed inset-0 z-50 bg-black/90 backdrop-blur-md\"\n />\n </Dialog.Overlay>\n <Dialog.Content\n asChild\n forceMount\n aria-label=\"Screenshot\"\n onOpenAutoFocus={(event) => event.preventDefault()}\n >\n <motion.div\n initial={{ opacity: 0, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.98 }}\n transition={{ duration: 0.18, ease: [0.16, 1, 0.3, 1] }}\n // Content is a full-inset centering wrapper layered above the\n // Overlay, so Radix's own click-outside (which fires on the\n // Overlay) can never see a backdrop click — every click lands on\n // Content. We make Content's own backdrop dismiss: a click whose\n // target is the wrapper itself (not the figure) closes it, so the\n // figcaption's \"click outside to close\" affordance is real.\n onClick={(event) => {\n if (event.target === event.currentTarget) {\n setState(null);\n }\n }}\n className=\"og-root fixed inset-0 z-50 flex items-center justify-center p-6 sm:p-12\"\n >\n <Dialog.Title className=\"sr-only\">Screenshot</Dialog.Title>\n {/* The figure is one self-contained object: image, caption, and\n its own close control. The close button anchors to a wrapper\n sized to the IMAGE (w-fit), so it hugs the real top-right\n corner regardless of aspect ratio — never floating into the\n empty space of a wide figure column. */}\n <figure className=\"m-0 flex max-h-full max-w-5xl flex-col items-center gap-3\">\n <div className=\"relative flex min-h-0 w-fit max-w-full\">\n {/* A plain <img>: this SDK is framework-agnostic, with no host Image component. */}\n <img\n src={state.src}\n alt={state.caption ?? \"Screenshot\"}\n className=\"min-h-0 max-h-[82vh] w-auto max-w-full rounded-og-md border border-white/10 object-contain shadow-og-lg\"\n />\n <Dialog.Close\n className={cn(\n \"absolute -right-3 -top-3 inline-flex size-9 items-center justify-center rounded-full\",\n \"border border-white/15 bg-black/60 text-white/70 backdrop-blur\",\n \"transition-colors hover:border-white/30 hover:text-white\",\n )}\n aria-label=\"Close\"\n >\n <XIcon className=\"size-4\" />\n </Dialog.Close>\n </div>\n {state.caption ? (\n <figcaption className=\"max-w-2xl text-center font-og-mono text-og-xs text-white/55\">\n {state.caption}\n </figcaption>\n ) : (\n <figcaption className=\"font-og-mono text-og-xs uppercase tracking-[0.1em] text-white/35\">\n Esc or click outside to close\n </figcaption>\n )}\n </figure>\n </motion.div>\n </Dialog.Content>\n </Dialog.Portal>\n ) : null}\n </AnimatePresence>\n </Dialog.Root>\n </LightboxContext.Provider>\n );\n}\n","import { CameraIcon, CameraOffIcon, ChevronRightIcon } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\nimport { Collapsible } from \"radix-ui\";\nimport { cn } from \"../lib/cn\";\nimport { stringifyPayload } from \"../lib/format\";\nimport { useForcedDefaultOpen } from \"./disclosure-context\";\nimport { useLightboxOptional } from \"./screenshot-lightbox\";\n\n/* ----------------------------------------------------------------------------\n Shared timeline primitives\n\n The restraint layer. One disclosure shape every tool renderer reuses, so the\n rail reads as a calm, aligned column: a chevron, a tinted icon, a title, an\n optional muted preview, and — at most — ONE quiet right-aligned signal\n (a settle chip). Compact by default; the body only mounts when expanded.\n\n CHIP DOCTRINE (closed set — do not extend):\n The right gutter carries at most ONE terse status token per row, and COLOR is\n spent only on the exception. Success is the default, so it never earns a hue:\n a settled-ok chip is bare muted text (or nothing). The colored dot is reserved\n for failure alone. In-flight state is NOT a gutter chip — the shimmering title\n carries it, so a running row has a clean right edge (no detached pulse badge).\n There is no bordered/filled pill. Anything narrative (a session id, \"approval\n rejected\", \"malformed V4A\") belongs in the muted preview line, never the gutter.\n\n ok a settled success quiet muted text (\"0\", \"done\") — no dot\n bad a settled failure red dot + red text (\"exit 6\") — the one hue\n muted quiet metadata subtle text (\"session 3\")\n -------------------------------------------------------------------------- */\n\n/**\n * A subtle settle signal — see the CHIP DOCTRINE above. The closed tone set.\n * `\"interrupted\"` is a calm neutral tone for cancelled items — no dot, same\n * quiet weight as `\"muted\"`, but semantically distinct from metadata.\n */\nexport type DisclosureChip = {\n tone: \"ok\" | \"bad\" | \"muted\" | \"interrupted\";\n text: string;\n};\n\nexport type ActivityDisclosureProps = {\n icon: ReactNode;\n /** Icon tint. Defaults to the muted foreground; renderers pass accent/failed. */\n iconTone?: \"accent\" | \"failed\" | \"running\" | \"muted\" | undefined;\n title: ReactNode;\n /** Render the title in the mono face (commands, paths). */\n titleMono?: boolean | undefined;\n /** Shimmer the title while the tool is in-flight. */\n running?: boolean | undefined;\n /**\n * Quiet single-line secondary text (truncated). It is detail-on-demand: hidden\n * when a media preview is set, AND hidden once the row is expanded (the body\n * then owns the detail), so a stat/path never appears twice at once.\n */\n preview?: ReactNode | undefined;\n /** A small inline media preview (a screenshot thumbnail) shown in place of `preview`. */\n media?: ReactNode | undefined;\n /** At most one quiet settle chip, right-aligned to the gutter. */\n chip?: DisclosureChip | undefined;\n /**\n * When true the row carries the standard failure affordance: the icon is tinted\n * red and a \"failed\" bad-chip appears in the right gutter (unless an explicit\n * `chip` is already supplied — the caller's chip wins). Output is still visible\n * on expand; this is a quiet status signal, not a blocking banner.\n *\n * Renderers should pass `failed={item.status === \"failed\"}` on their settled\n * (non-running) paths so any tool with a failed status shows a consistent\n * affordance without each renderer having to duplicate the logic.\n */\n failed?: boolean | undefined;\n /**\n * When true the row carries a calm \"interrupted\" affordance: the icon stays\n * muted (no red) and a quiet \"interrupted\" chip appears in the right gutter\n * (unless an explicit `chip` is already supplied — the caller's chip wins).\n * This is the cancelled-status analogue of `failed`, but deliberately calm\n * and neutral — it is NOT an error; the user chose to stop.\n *\n * Renderers should pass `cancelled={item.status === \"cancelled\"}` so any\n * in-flight item that was interrupted on turn.cancelled reads consistently.\n * `cancelled` is ignored when `failed` is also true (failure takes precedence).\n */\n cancelled?: boolean | undefined;\n /** When false the row is a static line (no expand affordance). */\n expandable?: boolean | undefined;\n children?: ReactNode | undefined;\n};\n\nconst ICON_TONE: Record<NonNullable<ActivityDisclosureProps[\"iconTone\"]>, string> = {\n accent: \"text-og-accent\",\n failed: \"text-og-status-failed\",\n running: \"text-og-status-running\",\n muted: \"text-og-fg-subtle\",\n};\n\n/**\n * The one disclosure row shape every activity row reuses (tool calls, reasoning,\n * sandbox ops): a chevron, a tinted icon, a title, an optional muted preview or\n * inline media, and at most one right-gutter settle chip. Compact by default;\n * the body mounts only when expanded.\n */\nexport function ActivityDisclosure({\n icon,\n iconTone: iconToneProp = \"muted\",\n title,\n titleMono,\n running,\n preview,\n media,\n chip: chipProp,\n failed,\n cancelled,\n expandable = true,\n children,\n}: ActivityDisclosureProps) {\n // `failed` takes precedence over `cancelled` when both are set (shouldn't happen, but be safe).\n // When `failed` is set the icon goes red and a \"failed\" chip appears in the\n // gutter — unless the caller already supplied an explicit chip (their chip wins,\n // e.g. an exit-code chip that is more informative than a bare \"failed\" label).\n // When `cancelled` is set (and not failed) the icon stays muted and a calm\n // \"interrupted\" chip appears — no red, just a quiet neutral signal.\n const iconTone = failed && iconToneProp === \"muted\" ? \"failed\" : iconToneProp;\n const chip =\n chipProp ??\n (failed\n ? ({ tone: \"bad\", text: \"failed\" } satisfies DisclosureChip)\n : cancelled\n ? ({ tone: \"interrupted\", text: \"interrupted\" } satisfies DisclosureChip)\n : undefined);\n // An ancestor may seed the initial open state (screenshot instrumentation);\n // absent in normal app usage, where the row starts collapsed.\n const forcedDefaultOpen = useForcedDefaultOpen();\n const [open, setOpen] = useState(forcedDefaultOpen ?? false);\n const hasBody = expandable && children != null;\n\n // The preview is detail-on-demand: it is suppressed once the row is open so a\n // path/stat shown in the body never also sits in the collapsed row.\n const previewVisible = preview != null && !open;\n\n // ONE full-row layout for EVERY tool — media or not — so the hit target always\n // equals the visible row. The chevron → icon → title lead; a flex spacer (or\n // the preview) fills the middle; the right gutter (ml-auto) carries the chip OR\n // the media thumbnail. There is no media-vs-non-media fork: the screenshot card\n // toggles from anywhere on the row, exactly like every other row.\n //\n // The row is the single Collapsible.Trigger (via `asChild` onto a div), so it\n // is the toggle surface. A div — not a native <button> — so the interactive\n // media thumbnail (itself a <button>) is valid nested DOM; that thumbnail calls\n // stopPropagation so activating it never toggles the row.\n //\n // Radix forwards aria-expanded / aria-controls / data-state and a click handler\n // onto the asChild child, but it does NOT synthesize the button role, tab stop,\n // or Enter/Space activation for a non-button element. We add those ourselves\n // (role/tabIndex/onKeyDown) so the row is a fully keyboard-operable button to\n // AT and the keyboard, matching its native-<button> siblings (TurnSummary).\n const rowClass = cn(\n \"group/disclosure flex w-full min-w-0 items-center gap-2 rounded-og-sm px-1.5 py-1.5 text-left text-og-base\",\n \"text-og-fg-muted transition-colors duration-150\",\n // A tool row is a touch target on coarse pointers: grow its padding so the\n // hit area clears the 40px minimum without loosening the dense desktop rail.\n \"pointer-coarse:py-2.5\",\n );\n // The chevron rotates to point down when open; it tracks `data-state` on this\n // same row (the Trigger), so the affordance never freezes.\n const inner = (\n <>\n {hasBody ? (\n <ChevronRightIcon className=\"size-3.5 shrink-0 text-og-fg-subtle transition-transform duration-150 ease-og-in-out group-data-[state=open]/disclosure:rotate-90\" />\n ) : (\n <span className=\"size-3.5 shrink-0\" />\n )}\n <span className={cn(\"shrink-0\", ICON_TONE[iconTone])}>{icon}</span>\n <span\n className={cn(\n \"min-w-0 shrink truncate text-og-base font-medium\",\n titleMono && \"font-og-mono text-og-sm font-normal\",\n running && \"og-shimmer-text\",\n )}\n >\n {title}\n </span>\n {previewVisible && !media ? (\n <span className=\"min-w-0 flex-1 truncate text-og-sm text-og-fg-subtle\">{preview}</span>\n ) : (\n <span className=\"flex-1\" />\n )}\n {/* The right gutter carries at most ONE signal: the media thumbnail, else a\n terse settle chip (hidden once expanded — the body owns the detail). */}\n {media ? (\n <span className=\"ml-auto flex shrink-0 items-center gap-2 pl-2\">{media}</span>\n ) : chip && !open ? (\n <span className=\"ml-auto shrink-0 pl-2\">\n <Chip chip={chip} />\n </span>\n ) : null}\n </>\n );\n\n // A `data-status` attribute on the root lets tests (and AT) detect the item's\n // settled state regardless of whether the chip slot is occupied by media.\n const dataStatus = cancelled ? \"cancelled\" : failed ? \"failed\" : undefined;\n\n if (!hasBody) {\n return (\n <div className={cn(rowClass, \"cursor-default\")} data-status={dataStatus}>\n {inner}\n </div>\n );\n }\n\n return (\n <Collapsible.Root open={open} onOpenChange={setOpen}>\n <Collapsible.Trigger asChild>\n <div\n role=\"button\"\n tabIndex={0}\n // Space/Enter activate a native button; Radix doesn't add this for a\n // non-button asChild child, so we toggle here. preventDefault on Space\n // stops the page from scrolling.\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen((prev) => !prev);\n }\n }}\n data-status={dataStatus}\n className={cn(\n rowClass,\n \"cursor-pointer outline-none hover:bg-og-surface-1 hover:text-og-fg\",\n \"focus-visible:ring-2 focus-visible:ring-og-accent focus-visible:ring-offset-0\",\n )}\n >\n {inner}\n </div>\n </Collapsible.Trigger>\n <Collapsible.Content className=\"overflow-hidden data-[state=closed]:animate-og-collapse data-[state=open]:animate-og-expand\">\n <div className=\"mb-2 ml-7 mt-1.5 flex flex-col gap-2\">{children}</div>\n </Collapsible.Content>\n </Collapsible.Root>\n );\n}\n\n/**\n * The right-gutter settle chip. Color is spent only on the exception: a failure\n * is a red dot + red text (the one colored token in a healthy run); success and\n * metadata are bare muted text with no dot. No box, no fill (see the CHIP\n * DOCTRINE above). A `bad` chip with empty text is a lone dot (no trailing void).\n */\nfunction Chip({ chip }: { chip: DisclosureChip }) {\n const base = \"inline-flex items-center font-og-mono text-og-xs leading-none\";\n const withText = chip.text ? \"gap-1.5\" : \"gap-0\";\n if (chip.tone === \"bad\") {\n return (\n <span className={cn(base, withText, \"text-og-status-failed\")}>\n <span className=\"size-1.5 rounded-full bg-og-status-failed\" />\n {chip.text}\n </span>\n );\n }\n // \"interrupted\" is a calm cancelled signal: same quiet weight as muted, no\n // dot, no red — just a slightly more prominent subtle text so \"interrupted\"\n // reads at a glance without demanding attention the way a failure does.\n if (chip.tone === \"interrupted\") {\n return <span className={cn(base, \"text-og-fg-subtle og-cancelled-chip\")}>{chip.text}</span>;\n }\n // ok and muted are the same quiet weight — success never earns a hue.\n return <span className={cn(base, \"text-og-fg-subtle\")}>{chip.text}</span>;\n}\n\n/* --- terminal output block (exec / write_stdin) ---------------------------- */\n\nexport function TermBlock({\n command,\n workdir,\n output,\n live,\n tailLines = 12,\n failed,\n}: {\n /**\n * The command shown in the prompt header. Pass `null` when the row title\n * already carries it (e.g. an exec row titled `$ cmd`): the header then drops\n * the command — and the whole prompt line if there is no workdir either — so\n * the command never reads twice, stacked, above the output.\n */\n command: string | null;\n workdir?: string | null | undefined;\n /** The FULL output. TermBlock owns the tail/full slicing internally. */\n output: string;\n live?: boolean | undefined;\n /** A non-zero exit / failed call — tints the left accent red (the one hue). */\n failed?: boolean | undefined;\n /**\n * When the output exceeds the tail window, only the last `tailLines` are shown\n * with a \"show full output\" toggle. The component holds the full text, so the\n * toggle reveals the rest (never a dead affordance). Defaults to 12.\n */\n tailLines?: number | undefined;\n}) {\n const [full, setFull] = useState(false);\n const empty = output.trim() === \"\";\n const lines = output.split(\"\\n\");\n const big = lines.length > tailLines + 4;\n const shown = full || !big ? output : lines.slice(-tailLines).join(\"\\n\");\n const showMore = big && !full;\n const showHeader = command != null || workdir != null;\n\n // No frame, no fill: a quiet monospace run flush on the page, marked only by a\n // 2px left accent so it reads as terminal output at a glance without becoming\n // yet another nested box. Color is spent only on the exception — a settled run\n // gets a calm neutral rule, a live one the running hue, a failed one the red.\n return (\n <div\n className={cn(\n \"min-w-0 border-l-2 pl-3\",\n failed\n ? \"border-og-status-failed/50\"\n : live\n ? \"border-og-status-running/50\"\n : \"border-og-border\",\n )}\n >\n {showHeader ? (\n <div className=\"flex items-center gap-2 pb-1\">\n <span className=\"select-none text-og-status-idle\">$</span>\n {command != null ? (\n <span className=\"min-w-0 flex-1 truncate font-og-mono text-og-sm text-og-fg-muted\">\n {command}\n </span>\n ) : (\n <span className=\"flex-1\" />\n )}\n {workdir ? (\n <span className=\"shrink-0 font-og-mono text-og-xs text-og-fg-subtle\">{workdir}</span>\n ) : null}\n </div>\n ) : null}\n {empty ? (\n <p className=\"font-og-mono text-og-xs italic text-og-fg-subtle\">(no output)</p>\n ) : (\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap break-all font-og-mono text-og-xs leading-5 text-og-fg-muted\">\n {shown}\n {live ? (\n <span className=\"ml-px inline-block h-[1em] w-[2px] translate-y-[2px] animate-og-blink bg-og-accent align-middle\" />\n ) : null}\n </pre>\n )}\n {showMore ? (\n <button\n type=\"button\"\n onClick={() => setFull(true)}\n className=\"mt-1 text-left text-og-xs text-og-fg-subtle transition-colors hover:text-og-fg\"\n >\n show full output ({lines.length} lines)\n </button>\n ) : null}\n </div>\n );\n}\n\n/* --- generic payload block -------------------------------------------------- */\n\nexport function PayloadBlock({\n label,\n value,\n failed,\n}: {\n label: string;\n value: unknown;\n failed?: boolean | undefined;\n}) {\n const text = typeof value === \"string\" ? value : stringifyPayload(value);\n if (!text || text.trim() === \"\") {\n return null;\n }\n // Flush on the page, no frame — a labelled monospace run marked only by a 2px\n // left accent (red when the call failed, otherwise a calm neutral rule), so a\n // payload reads as detail hanging off the row, never a nested card.\n return (\n <div\n className={cn(\n \"min-w-0 border-l-2 pl-3\",\n failed ? \"border-og-status-failed/50\" : \"border-og-border\",\n )}\n >\n <p className=\"mb-1 text-og-xs font-medium uppercase tracking-[0.08em] text-og-fg-subtle\">\n {label}\n </p>\n <pre\n className={cn(\n \"max-h-64 overflow-auto whitespace-pre-wrap break-all font-og-mono text-og-xs leading-5\",\n failed ? \"text-og-status-failed\" : \"text-og-fg-muted\",\n )}\n >\n {text}\n </pre>\n </div>\n );\n}\n\n/** A quiet inline note inside an expanded body (lost output, empty frame, …). */\nexport function BodyNote({\n children,\n tone,\n}: {\n children: ReactNode;\n tone?: \"error\" | \"muted\" | undefined;\n}) {\n if (tone === \"error\") {\n // A quiet error run marked by a 2px red accent — the same flush, frameless\n // language as the payload/output blocks, not a filled callout box.\n return (\n <div className=\"border-l-2 border-og-status-failed/50 pl-3 font-og-mono text-og-xs leading-5 text-og-status-failed\">\n {children}\n </div>\n );\n }\n return <p className=\"px-0.5 text-og-sm italic leading-5 text-og-fg-subtle\">{children}</p>;\n}\n\n/* --- screenshot thumbnail + media states ------------------------------------ */\n\n/**\n * The shared inline-media footprint, so thumb / skeleton / empty align. Sized to\n * the row's line height (~28px) so a media row never out-weighs a text row and\n * the single-column rhythm holds.\n */\nconst MEDIA_BOX = \"h-7 w-[52px] shrink-0 rounded-og-xs border border-og-border\";\n\n/**\n * A loading screenshot placeholder. A faint camera glyph over a shimmering box,\n * so a still frame of the running state reads unambiguously as \"capturing\" — not\n * a broken thumbnail.\n */\nexport function MediaSkeleton() {\n return (\n <span\n className={cn(\n MEDIA_BOX,\n \"relative inline-flex items-center justify-center overflow-hidden bg-og-surface-2\",\n )}\n >\n <span className=\"absolute inset-0 animate-og-pulse bg-og-surface-3/50\" />\n <CameraIcon className=\"relative size-3.5 text-og-fg-subtle\" />\n </span>\n );\n}\n\n/** A standardized \"tool ran, produced no image\" placeholder in the media slot. */\nexport function MediaEmpty() {\n return (\n <span className={cn(MEDIA_BOX, \"inline-flex items-center justify-center bg-og-bg\")}>\n <CameraOffIcon className=\"size-3.5 text-og-fg-subtle\" />\n </span>\n );\n}\n\n/**\n * A small inline screenshot thumbnail that opens the app lightbox on click.\n *\n * Requires a `LightboxProvider` ancestor for the click-to-expand affordance.\n * Outside one it degrades to a plain, non-interactive image — never a dead\n * \"Expand\" button that announces an action it cannot perform.\n */\nexport function Thumbnail({\n src,\n caption,\n alt = \"screenshot\",\n}: {\n src: string;\n caption?: string | undefined;\n alt?: string;\n}) {\n const lightbox = useLightboxOptional();\n const [failed, setFailed] = useState(false);\n if (failed) {\n return <MediaEmpty />;\n }\n // A plain <img> (not a framework Image): this is a framework-agnostic SDK, so\n // the host's image component is unavailable and unwanted here.\n const img = (\n <img\n src={src}\n alt={alt}\n onError={() => setFailed(true)}\n className=\"h-full w-full object-cover transition-opacity group-hover/thumb:opacity-80\"\n />\n );\n if (!lightbox) {\n return <span className={cn(MEDIA_BOX, \"inline-flex overflow-hidden bg-og-bg\")}>{img}</span>;\n }\n // The thumbnail is a real, independently-focusable button nested inside the\n // row's disclosure trigger. It stops both pointer AND keyboard activation from\n // bubbling, so opening the lightbox never also toggles the row.\n return (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n lightbox.open(src, caption);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.stopPropagation();\n }\n }}\n className={cn(\n MEDIA_BOX,\n \"group/thumb relative inline-flex overflow-hidden bg-og-bg outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-og-accent\",\n )}\n aria-label=\"Expand screenshot\"\n >\n {img}\n </button>\n );\n}\n\n/**\n * The expanded screenshot inside a tool body: a contained, clickable preview\n * (opens the lightbox) with a quiet caption. Constrained height + object-contain\n * so it never breaks the row layout. Like {@link Thumbnail}, it degrades to a\n * plain image outside a `LightboxProvider`.\n */\nexport function ScreenshotFigure({\n src,\n caption,\n alt = \"screenshot\",\n}: {\n src: string;\n caption?: string | undefined;\n alt?: string;\n}) {\n const lightbox = useLightboxOptional();\n const [failed, setFailed] = useState(false);\n const surface = \"block w-full overflow-hidden rounded-og-md border border-og-border bg-og-bg\";\n // A plain <img>, like {@link Thumbnail} — a framework-agnostic SDK has no host\n // Image component to defer to.\n const img = (\n <img\n src={src}\n alt={alt}\n onError={() => setFailed(true)}\n className=\"max-h-80 w-full object-contain\"\n />\n );\n return (\n <figure className=\"m-0 min-w-0\">\n {failed ? (\n <div className=\"rounded-og-md border border-og-border bg-og-bg px-3 py-6 text-center font-og-mono text-og-xs text-og-fg-subtle\">\n image unavailable\n </div>\n ) : lightbox ? (\n <button\n type=\"button\"\n onClick={() => lightbox.open(src, caption)}\n className={surface}\n aria-label=\"Expand screenshot\"\n >\n {img}\n </button>\n ) : (\n <div className={surface}>{img}</div>\n )}\n {caption ? (\n <figcaption className=\"mt-1.5 font-og-mono text-og-xs text-og-fg-subtle\">\n {caption}\n </figcaption>\n ) : null}\n </figure>\n );\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\n\n/**\n * Reconstruct a unified-diff patch string for a single `GitFileDiff` so it can\n * be fed to a generic patch renderer (e.g. Pierre's `PatchDiff`). The hook\n * already carries per-line old/new numbers and a hunk header, so we emit a\n * conventional `--- / +++ / @@` patch the parser understands.\n */\nexport function gitFileDiffToPatch(file: GitFileDiff): string {\n const oldPath = file.oldPath ?? file.path;\n const newPath = file.path;\n const lines: string[] = [];\n lines.push(`diff --git a/${oldPath} b/${newPath}`);\n if (file.status === \"deleted\") {\n lines.push(`--- a/${oldPath}`);\n lines.push(`+++ /dev/null`);\n } else if (file.status === \"added\" || file.status === \"untracked\") {\n lines.push(`--- /dev/null`);\n lines.push(`+++ b/${newPath}`);\n } else {\n lines.push(`--- a/${oldPath}`);\n lines.push(`+++ b/${newPath}`);\n }\n for (const hunk of file.hunks) {\n // Only trust a pre-parsed header if it carries the full unified range form\n // `@@ -<o>[,<n>] +<o>[,<n>] @@`. A synthesized create_file hunk (parsers.ts)\n // can carry a degenerate `@@ +1 @@` with no `-`/`+` ranges; a generic patch\n // parser (Pierre) renders zero lines from it, so the expanded diff comes up\n // empty while the collapsed chip still shows the (correct) addition count.\n // In that case regenerate a valid header from the hunk's range fields.\n const headerIsValid = /^@@ -\\d+(?:,\\d+)? \\+\\d+(?:,\\d+)? @@/.test(hunk.header ?? \"\");\n const header = headerIsValid\n ? hunk.header\n : `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@`;\n lines.push(header);\n for (const line of hunk.lines) {\n if (line.type === \"meta\") continue;\n const prefix = line.type === \"add\" ? \"+\" : line.type === \"del\" ? \"-\" : \" \";\n lines.push(`${prefix}${line.text}`);\n }\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\nimport {\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n lazy,\n Suspense,\n useEffect,\n useState,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { gitFileDiffToPatch } from \"../lib/git-patch\";\n\n/** Pierre `PatchDiff` props subset we drive. */\ntype PatchDiffComponent = ComponentType<{\n patch: string;\n options?: {\n theme?: string | { dark: string; light: string };\n themeType?: \"dark\" | \"light\";\n diffStyle?: \"unified\" | \"split\";\n overflow?: \"scroll\" | \"wrap\";\n stickyHeader?: boolean;\n };\n disableWorkerPool?: boolean;\n className?: string;\n}>;\n\nexport type PierreDiffProps = {\n diff: GitFileDiff[];\n layout?: \"unified\" | \"split\" | undefined;\n themeType?: \"dark\" | \"light\" | undefined;\n /** Shiki bundled theme names (dark/light) — derived from the host palette. */\n theme?: { dark: string; light: string } | undefined;\n /** Disable Pierre's worker pool if its worker bundling fights the host bundler. */\n disableWorkerPool?: boolean | undefined;\n /** Rendered while the (lazy) Pierre bundle loads. */\n loading?: ReactNode | undefined;\n /** Rendered if `@pierre/diffs/react` is not installed / fails to import. */\n fallback?: ReactNode | undefined;\n /** Skip the Shiki renderer entirely and show the plain-text degrade (the old\n * `usePierre={false}` path — one renderer, opted out of highlighting). */\n plain?: boolean | undefined;\n /** Long-line handling: `\"wrap\"` soft-wraps (the default — a diff in a narrow\n * dock pane should be readable without a horizontal-scroll tax), `\"scroll\"`\n * keeps lines on one row behind a horizontal scrollbar (better for a wide\n * viewport or pathological minified lines). */\n overflow?: \"wrap\" | \"scroll\" | undefined;\n className?: string | undefined;\n};\n\n// Lazy-load `@pierre/diffs/react` so Shiki + the worker pool stay off the\n// critical path (and out of an SSR bundle) until a diff is actually shown. The\n// dynamic specifier is static so the bundler can resolve + chunk it. If the\n// optional peer is absent the import rejects and we render `fallback`.\nconst LazyPatchDiff = lazy(async () => {\n const mod = (await import(\"@pierre/diffs/react\")) as unknown as {\n PatchDiff: PatchDiffComponent;\n };\n return { default: mod.PatchDiff };\n});\n\n/**\n * The Pierre-backed diff: Shiki-highlighted, virtualized, unified/split. Renders\n * one `PatchDiff` per changed file (a reconstructed unified patch from the\n * `GitFileDiff` hunks). The ONE workbench diff renderer; a host without\n * `@pierre/diffs` gets the built-in plain-text degrade (`PlainPatch`).\n */\nexport function PierreDiff({\n diff,\n layout = \"unified\",\n themeType,\n theme,\n disableWorkerPool,\n loading,\n fallback,\n plain,\n overflow = \"wrap\",\n className,\n}: PierreDiffProps) {\n const [failed, setFailed] = useState(false);\n const [forcedColors, setForcedColors] = useState(false);\n\n // Pierre's rich renderer distinguishes additions/deletions primarily through\n // foreground and background colors inside a shadow root. In Windows forced-\n // colors mode those paints intentionally collapse, so expose the literal\n // unified patch (+/- markers) instead of leaving changed lines ambiguous.\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const query = window.matchMedia(\"(forced-colors: active)\");\n const update = () => setForcedColors(query.matches);\n update();\n query.addEventListener?.(\"change\", update);\n return () => query.removeEventListener?.(\"change\", update);\n }, []);\n\n // Probe the import once so a hard failure (peer missing) shows `fallback`\n // rather than a Suspense boundary that never resolves. Skipped when `plain`.\n useEffect(() => {\n if (plain) return;\n let cancelled = false;\n void import(\"@pierre/diffs/react\").catch(() => {\n if (!cancelled) setFailed(true);\n });\n return () => {\n cancelled = true;\n };\n }, [plain]);\n\n if (plain || failed || forcedColors) {\n // `plain` opts out of highlighting; `failed` = `@pierre/diffs` not installed.\n // Render the caller's fallback, or a plain (unhighlighted) patch dump — NOT a\n // second hunk renderer. One highlighted renderer (Pierre) + a text degrade.\n return (\n <div\n className={className}\n data-opengeni-plain-diff={forcedColors ? \"forced-colors\" : \"fallback\"}\n >\n {fallback ?? <PlainPatch diff={diff} />}\n </div>\n );\n }\n\n // Default to the dark theme: the host UI is dark-first, and Pierre's own\n // auto-detection otherwise lands on the light Shiki theme (a white diff pane\n // inside a dark dock). Callers pass `themeType=\"light\"` to opt into light.\n const options = {\n diffStyle: layout,\n overflow,\n stickyHeader: true,\n ...(theme\n ? { theme }\n : {\n theme: {\n dark: \"github-dark-high-contrast\",\n light: \"github-light-high-contrast\",\n },\n }),\n themeType: themeType ?? \"dark\",\n };\n\n // Pierre renders inside a shadow DOM, so host CSS can't reach it — but it reads\n // a set of `--diffs-*-override` custom properties through the shadow boundary.\n // Pin the diff's own base background to the dock surface and quiet the hunk\n // separator slab so collapsed context rows do not become heavy bars.\n const pierreVars = {\n \"--diffs-dark-bg\": \"var(--og-color-bg)\",\n \"--diffs-light-bg\": \"var(--og-color-bg)\",\n \"--diffs-bg-buffer-override\": \"var(--og-color-surface-1)\",\n \"--diffs-bg-separator-override\": \"var(--og-color-surface-1)\",\n \"--diffs-addition-color-override\": \"var(--og-color-status-idle)\",\n \"--diffs-deletion-color-override\": \"var(--og-color-status-failed)\",\n \"--diffs-fg-number-addition-override\": \"var(--og-color-status-idle)\",\n \"--diffs-fg-number-deletion-override\": \"var(--og-color-status-failed)\",\n \"--diffs-bg-addition-override\":\n \"color-mix(in oklab, var(--og-color-status-idle) 12%, var(--og-color-bg))\",\n \"--diffs-bg-deletion-override\":\n \"color-mix(in oklab, var(--og-color-status-failed) 12%, var(--og-color-bg))\",\n \"--diffs-bg-addition-emphasis-override\":\n \"color-mix(in oklab, var(--og-color-status-idle) 22%, var(--og-color-bg))\",\n \"--diffs-bg-deletion-emphasis-override\":\n \"color-mix(in oklab, var(--og-color-status-failed) 22%, var(--og-color-bg))\",\n \"--diffs-header-font-family\": \"var(--og-font-sans)\",\n \"--diffs-font-family\": \"var(--og-font-mono)\",\n \"--diffs-font-size\": \"var(--og-code-font-size)\",\n \"--diffs-line-height\": \"var(--og-code-line-height)\",\n } as CSSProperties;\n\n return (\n <div className={cn(\"min-w-0\", className)} data-opengeni-pierre-diff style={pierreVars}>\n <Suspense fallback={loading ?? <DiffSkeleton />}>\n {diff.map((file) => (\n <div key={file.path} className=\"mb-2\">\n <LazyPatchDiff\n patch={gitFileDiffToPatch(file)}\n options={options}\n {...(disableWorkerPool !== undefined ? { disableWorkerPool } : {})}\n />\n </div>\n ))}\n </Suspense>\n </div>\n );\n}\n\nfunction DiffSkeleton() {\n return <div className=\"p-3 text-og-sm text-og-fg-subtle\">Loading diff…</div>;\n}\n\n/**\n * The unhighlighted degrade for a host without `@pierre/diffs`: the reconstructed\n * unified patch as monospace text with +/−/@@ tinting. Deliberately NOT a\n * structured hunk renderer — the workbench keeps exactly one of those (Pierre).\n */\nfunction PlainPatch({ diff }: { diff: GitFileDiff[] }) {\n if (diff.length === 0) {\n return <div className=\"p-3 text-og-sm text-og-fg-subtle\">No changes</div>;\n }\n return (\n <div className=\"min-w-0\">\n {diff.map((file) => (\n <pre\n key={file.path}\n aria-label={`Diff for ${file.path}`}\n className=\"mb-2 overflow-auto whitespace-pre rounded-og-sm border border-og-border bg-og-bg/60 p-2.5 font-og-mono text-og-xs leading-5\"\n role=\"region\"\n tabIndex={0}\n >\n {gitFileDiffToPatch(file)\n .split(\"\\n\")\n .map((line, index) => (\n <span\n // Patch line position is the stable identity in this immutable plain-text fallback.\n // oxlint-disable-next-line react/no-array-index-key\n key={index}\n className={cn(\n \"block\",\n line.startsWith(\"@@\")\n ? \"text-og-accent\"\n : line.startsWith(\"+\")\n ? \"text-og-status-idle\"\n : line.startsWith(\"-\")\n ? \"text-og-status-failed\"\n : \"text-og-fg-muted\",\n )}\n >\n {line || \" \"}\n </span>\n ))}\n </pre>\n ))}\n </div>\n );\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\nimport {\n CameraIcon,\n CameraOffIcon,\n FileDiffIcon,\n GlobeIcon,\n ImageIcon,\n KeyboardIcon,\n KeyRoundIcon,\n LockIcon,\n MousePointer2Icon,\n PlugIcon,\n SearchIcon,\n TerminalIcon,\n WrenchIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { stringifyPayload, tryParseJson } from \"../lib/format\";\nimport {\n applyPatchOps,\n controlCaret,\n execTruncated,\n isExecSessionLostBanner,\n looksBinary,\n mediaPreviewFact,\n parseExecBannerSessionId,\n parseToolArgs,\n redactSecrets,\n sandboxCommandExitCode,\n stripExecBanner,\n tailPeek,\n unwrapMcpOutput,\n v4aToGitFileDiff,\n screenshotDataUrl,\n type ApplyPatchOperation,\n} from \"./parsers\";\nimport {\n createToolRegistry,\n type ToolRegistry,\n type ToolRegistryEntry,\n type ToolRendererProps,\n} from \"./registry\";\nimport {\n BodyNote,\n MediaEmpty,\n MediaSkeleton,\n PayloadBlock,\n ScreenshotFigure,\n TermBlock,\n Thumbnail,\n ActivityDisclosure,\n type DisclosureChip,\n} from \"./shared\";\nimport { RawPatch, ToolDiff } from \"./tool-diff\";\nimport { toolDisplayName } from \"./tool-display-name\";\n\n/* ----------------------------------------------------------------------------\n Per-tool renderers\n\n Each renderer takes one projected `ToolCallItem` and returns an `ActivityDisclosure`\n tuned for that tool's real wire shape. The defaults below populate the\n registry; the mapping is registered at the bottom of the file.\n\n Restraint is the rule: compact title + one quiet preview, secondary detail\n only on expand. No loud right-side badges — at most a single settle chip.\n -------------------------------------------------------------------------- */\n\nconst ICON_SIZE = \"size-3.5\";\n\n/**\n * The single in-flight locus for a running row: a pulse dot immediately left of\n * the status word, riding the preview line — NOT a detached gutter badge. The\n * title already shimmers; this keeps the live signal in one place the eye reads\n * left-to-right.\n */\nfunction RunningPreview({ children }: { children: ReactNode }) {\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"size-1.5 shrink-0 animate-og-pulse rounded-full bg-og-status-running\" />\n <span className=\"min-w-0 truncate\">{children}</span>\n </span>\n );\n}\n\n/* ---- exec_command ---------------------------------------------------------- */\n\nfunction ExecRenderer({ item }: ToolRendererProps) {\n const args = parseToolArgs(item.arguments);\n const cmd = typeof args.cmd === \"string\" ? args.cmd : \"\";\n const workdir = typeof args.workdir === \"string\" ? args.workdir : null;\n const running = item.status === \"running\";\n const out = item.output;\n const title = `$ ${cmd}`;\n\n // No output event ever arrived (item.output stays undefined from creation):\n // the turn failed before the output insert — most likely a NUL byte in the\n // command output prevented storage. Surface the specific explanation.\n // (Cancelled items bypass this: a cancellation is not a NUL-storage failure.)\n if (item.status === \"failed\" && out === undefined) {\n return (\n <ActivityDisclosure\n icon={<TerminalIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={title}\n titleMono\n chip={{ tone: \"bad\", text: \"failed\" }}\n preview=\"output lost — NUL byte could not be stored\"\n >\n <BodyNote tone=\"error\">\n output contained a NUL byte and could not be stored; the turn failed on this tool&apos;s\n output insert — no output event ever arrived.\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n\n // An output event arrived but the tool still failed (error:true / MCP isError)\n // and the output is empty — show a generic failure rather than claiming NUL.\n // (Cancelled items bypass this: a cancellation is not a tool-call failure.)\n if (item.status === \"failed\" && (out == null || out === \"\")) {\n return (\n <ActivityDisclosure\n icon={<TerminalIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={title}\n titleMono\n chip={{ tone: \"bad\", text: \"failed\" }}\n preview=\"tool call failed\"\n >\n <BodyNote tone=\"error\">the tool call failed with no output.</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n if (running) {\n const streamed = typeof out === \"string\" ? stripExecBanner(out) : \"\";\n return (\n <ActivityDisclosure\n icon={<TerminalIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={title}\n titleMono\n running\n preview={\n <RunningPreview>\n {streamed ? `${streamed.split(\"\\n\").length} lines` : \"running…\"}\n </RunningPreview>\n }\n >\n {/* The row title is already `$ ${cmd}`; the TermBlock header drops the\n command (command={null}) so it never repeats above the output. */}\n <TermBlock command={null} workdir={workdir} output={streamed} live />\n </ActivityDisclosure>\n );\n }\n\n const text = typeof out === \"string\" ? out : stringifyPayload(out);\n const stripped = stripExecBanner(text);\n const bgSession = parseExecBannerSessionId(text);\n const exitCode = sandboxCommandExitCode(text);\n const binary = looksBinary(stripped);\n\n // Color is spent on the exception only: a clean exit (0) earns NO chip — the\n // absence of a red token is the success signal. Background sessions surface a\n // muted id; a non-zero exit is the one red token.\n let chip: DisclosureChip | undefined;\n let iconTone: \"accent\" | \"failed\" | \"muted\" = \"muted\";\n if (bgSession != null) {\n chip = { tone: \"muted\", text: `session ${bgSession}` };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n iconTone = \"failed\";\n }\n\n const preview = binary ? \"binary output\" : tailPeek(stripped) || \"(no output)\";\n const truncated = execTruncated(text);\n // Hand TermBlock the FULL stripped output; it owns the tail/show-more slicing.\n const body = binary ? \"(binary output suppressed)\" : stripped;\n\n return (\n <ActivityDisclosure\n icon={<TerminalIcon className={ICON_SIZE} />}\n iconTone={iconTone}\n title={title}\n titleMono\n {...(chip ? { chip } : {})}\n failed={item.status === \"failed\"}\n cancelled={item.status === \"cancelled\"}\n preview={truncated ? `⋯ truncated · ${preview}` : preview}\n >\n <TermBlock\n command={null}\n workdir={workdir}\n output={body}\n failed={item.status === \"failed\" || (exitCode != null && exitCode !== 0)}\n />\n {bgSession != null ? (\n <BodyNote>↳ session {bgSession} — a later write_stdin can target this PTY.</BodyNote>\n ) : null}\n </ActivityDisclosure>\n );\n}\n\n/* ---- write_stdin ----------------------------------------------------------- */\n\nfunction WriteStdinRenderer({ item }: ToolRendererProps) {\n const args = parseToolArgs(item.arguments);\n const sessionId =\n typeof args.session_id === \"string\" || typeof args.session_id === \"number\"\n ? args.session_id\n : undefined;\n const running = item.status === \"running\";\n const text = typeof item.output === \"string\" ? item.output : stringifyPayload(item.output);\n const lost = isExecSessionLostBanner(text);\n const keys = controlCaret(typeof args.chars === \"string\" ? args.chars : \"\");\n const exitCode = sandboxCommandExitCode(text);\n const stripped = stripExecBanner(text);\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={<KeyboardIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={`session ${sessionId} ← ${keys || \"∅\"}`}\n titleMono\n running\n preview={<RunningPreview>sending…</RunningPreview>}\n >\n <BodyNote>sending input to session {sessionId}…</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n // Success (exit 0 or a quiet ack) earns no chip; only a lost PTY / non-zero\n // exit gets the one red token.\n let chip: DisclosureChip | undefined;\n if (lost) {\n chip = { tone: \"bad\", text: \"lost\" };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n }\n\n return (\n <ActivityDisclosure\n icon={<KeyboardIcon className={ICON_SIZE} />}\n iconTone={lost ? \"failed\" : \"muted\"}\n title={`session ${sessionId} ← ${keys || \"∅\"}`}\n titleMono\n {...(chip ? { chip } : {})}\n failed={item.status === \"failed\"}\n cancelled={item.status === \"cancelled\"}\n preview={lost ? `session ${sessionId} PTY vanished` : tailPeek(stripped) || \"sent\"}\n >\n {lost ? (\n <BodyNote tone=\"error\">{stripped || text}</BodyNote>\n ) : (\n <TermBlock command={`write_stdin → session ${sessionId}`} output={stripped} />\n )}\n </ActivityDisclosure>\n );\n}\n\n/* ---- apply_patch ----------------------------------------------------------- */\n\nfunction verbForOp(op: ApplyPatchOperation | undefined): string {\n if (!op) {\n return \"Edited\";\n }\n return op.type === \"create_file\"\n ? \"Created\"\n : op.type === \"delete_file\"\n ? \"Deleted\"\n : op.moveTo\n ? \"Renamed\"\n : \"Edited\";\n}\n\nfunction basename(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n return parts.length ? parts[parts.length - 1]! : path;\n}\n\nfunction dirname(path: string): string {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(0, idx + 1) : \"\";\n}\n\n/**\n * The collapsed-row path preview. Diff magnitude is rendered as a SINGLE muted\n * \"+N −M\" glyph pair — the saturated add/del green/red is reserved exclusively\n * for the expanded DiffView gutter, so the one-line rail stays a calm, single\n * hue (the file path) with no competing colored numerics.\n */\nfunction PathPreview({\n path,\n add,\n del,\n}: {\n path: string;\n add?: number | undefined;\n del?: number | undefined;\n}) {\n return (\n <span className=\"inline-flex items-center gap-2 truncate font-og-mono\">\n <span className=\"truncate\">\n <span className=\"text-og-fg-subtle\">{dirname(path)}</span>\n <span className=\"text-og-fg-muted\">{basename(path)}</span>\n </span>\n {add != null || del != null ? (\n <span className=\"shrink-0 text-og-fg-subtle\">\n {add != null ? `+${add}` : \"\"}\n {add != null && del != null ? \" \" : \"\"}\n {del != null ? `−${del}` : \"\"}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction ApplyPatchRenderer({ item }: ToolRendererProps) {\n const ops = applyPatchOps(item.raw);\n const failed = item.status === \"failed\";\n const cancelled = item.status === \"cancelled\";\n const running = item.status === \"running\";\n const firstOp = ops[0];\n\n if (running) {\n // Show the patch structure from the arguments (available immediately on\n // creation), but mark the row clearly as in-progress — not applied yet.\n const fileCount = ops.length;\n const titleVerb = firstOp ? `Applying ${basename(firstOp.path)}` : \"Applying patch\";\n return (\n <ActivityDisclosure\n icon={<FileDiffIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={fileCount > 1 ? `Applying ${fileCount} files` : titleVerb}\n running\n preview={\n <RunningPreview>\n {fileCount > 1 ? `${fileCount} files` : firstOp ? firstOp.path : \"applying…\"}\n </RunningPreview>\n }\n >\n {ops.map((op) => {\n const file = safeParseOp(op);\n return file ? (\n <ToolDiff key={op.path} files={[file]} />\n ) : (\n <div key={op.path}>\n <p className=\"mb-1 font-og-mono text-og-xs text-og-fg-muted\">{op.path}</p>\n <RawPatch diff={op.diff ?? \"\"} />\n </div>\n );\n })}\n </ActivityDisclosure>\n );\n }\n\n if (failed) {\n return (\n <ActivityDisclosure\n icon={<FileDiffIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={firstOp ? `${verbForOp(firstOp)} ${basename(firstOp.path)}` : \"apply_patch\"}\n chip={{ tone: \"bad\", text: \"failed\" }}\n preview={typeof item.output === \"string\" ? item.output : \"patch failed\"}\n >\n <PayloadBlock label=\"Error\" value={item.output} failed />\n </ActivityDisclosure>\n );\n }\n\n // multi-file edit — magnitude stays a single muted glyph; the per-file\n // green/red lives only inside the expanded DiffView gutter.\n if (ops.length > 1) {\n // Parse every op: successfully parsed ones go into ToolDiff; malformed ops\n // fall back to a RawPatch display (mirroring the single-op fallback path).\n // The count in the title/preview equals ops.length so it is always truthful\n // regardless of how many ops parsed successfully.\n const parsed = ops.map((op) => safeParseOp(op));\n const goodFiles = parsed.filter((f): f is GitFileDiff => f !== null);\n const add = goodFiles.reduce((n, f) => n + f.additions, 0);\n const del = goodFiles.reduce((n, f) => n + f.deletions, 0);\n return (\n <ActivityDisclosure\n icon={<FileDiffIcon className={ICON_SIZE} />}\n iconTone=\"accent\"\n title={`Edited ${ops.length} files`}\n cancelled={cancelled}\n preview={\n <span className=\"inline-flex items-center gap-2 font-og-mono\">\n <span className=\"text-og-fg-muted\">{ops.length} files</span>\n <span className=\"text-og-fg-subtle\">\n +{add} −{del}\n </span>\n </span>\n }\n >\n {ops.map((op, index) => {\n const file = parsed[index];\n return file ? (\n <ToolDiff key={op.path} files={[file]} />\n ) : (\n <div key={op.path}>\n <p className=\"mb-1 font-og-mono text-og-xs text-og-fg-muted\">{op.path}</p>\n <RawPatch diff={op.diff ?? \"\"} />\n </div>\n );\n })}\n </ActivityDisclosure>\n );\n }\n\n // single op\n if (!firstOp) {\n return <GenericRenderer item={item} />;\n }\n if (firstOp.type === \"delete_file\") {\n return (\n <ActivityDisclosure\n icon={<FileDiffIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={`Deleted ${basename(firstOp.path)}`}\n cancelled={cancelled}\n preview={<PathPreview path={firstOp.path} />}\n >\n <BodyNote>File deleted — no diff to show.</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n const file = safeParseOp(firstOp);\n if (!file) {\n return (\n <ActivityDisclosure\n icon={<FileDiffIcon className={ICON_SIZE} />}\n iconTone=\"accent\"\n title={`${verbForOp(firstOp)} ${basename(firstOp.path)}`}\n cancelled={cancelled}\n preview={\n <span className=\"inline-flex items-center gap-2 font-og-mono\">\n <span className=\"text-og-fg-muted\">{basename(firstOp.path)}</span>\n <span className=\"text-og-fg-subtle\">malformed V4A</span>\n </span>\n }\n >\n <RawPatch diff={firstOp.diff ?? \"\"} />\n </ActivityDisclosure>\n );\n }\n\n // The collapsed row shows verb + basename (title) and a muted \"+N −M\"\n // (preview); on expand the preview is hidden and the DiffView header carries\n // the path + churn — so the filename/stat never appears twice at once.\n return (\n <ActivityDisclosure\n icon={<FileDiffIcon className={ICON_SIZE} />}\n iconTone=\"accent\"\n title={`${verbForOp(firstOp)} ${basename(file.path)}`}\n cancelled={cancelled}\n preview={<PathPreview path={file.path} add={file.additions} del={file.deletions} />}\n >\n <ToolDiff files={[file]} />\n </ActivityDisclosure>\n );\n}\n\nfunction safeParseOp(op: ApplyPatchOperation): GitFileDiff | null {\n try {\n return v4aToGitFileDiff(op);\n } catch {\n return null;\n }\n}\n\n/* ---- computer_call --------------------------------------------------------- */\n\ntype ComputerAction = {\n type?: string;\n x?: number;\n y?: number;\n text?: string;\n keys?: string[];\n button?: string;\n};\n\nfunction computerVerb(action: ComputerAction | undefined): string {\n if (!action || !action.type) {\n return \"Acted\";\n }\n switch (action.type) {\n case \"screenshot\":\n return \"Screenshot\";\n case \"click\":\n return `Clicked (${action.x}, ${action.y})`;\n case \"double_click\":\n return `Double-clicked (${action.x}, ${action.y})`;\n case \"move\":\n return `Moved (${action.x}, ${action.y})`;\n case \"scroll\":\n return \"Scrolled\";\n case \"type\": {\n const t = action.text ?? \"\";\n return `Typed “${t.slice(0, 28)}${t.length > 28 ? \"…\" : \"\"}”`;\n }\n case \"keypress\":\n return `Pressed ${(action.keys ?? []).join(\"+\")}`;\n case \"drag\":\n return \"Dragged\";\n case \"wait\":\n return \"Waited\";\n default:\n return action.type;\n }\n}\n\n/** Coerce a function-tool arguments payload into the ComputerAction fields. */\nfunction asComputerArgs(args: unknown): Partial<ComputerAction> {\n if (!args) {\n return {};\n }\n const parsed = typeof args === \"string\" ? tryParseJson(args) : args;\n if (!parsed || typeof parsed !== \"object\") {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n return {\n ...(typeof record.x === \"number\" ? { x: record.x } : {}),\n ...(typeof record.y === \"number\" ? { y: record.y } : {}),\n ...(typeof record.text === \"string\" ? { text: record.text } : {}),\n ...(Array.isArray(record.keys) ? { keys: record.keys as string[] } : {}),\n ...(typeof record.button === \"string\" ? { button: record.button } : {}),\n };\n}\n\nfunction ComputerCallRenderer({ item }: ToolRendererProps) {\n const raw = (item.raw ?? {}) as {\n action?: ComputerAction;\n actions?: ComputerAction[];\n providerData?: { approvalStatus?: string };\n };\n // Function-mode computer tools (computer_screenshot / computer_click / …,\n // used on codex + chat-wire providers since the explicit tool-transport\n // change) carry the action in the tool NAME + arguments instead of raw.action.\n // Normalize them into the same ComputerAction shape so one renderer serves\n // every transport.\n const functionAction: ComputerAction | undefined =\n !raw.action && item.name.startsWith(\"computer_\") && item.name !== \"computer_call\"\n ? { type: item.name.slice(\"computer_\".length), ...asComputerArgs(item.arguments) }\n : undefined;\n const action = raw.action ?? functionAction;\n const actions = raw.actions ?? (action ? [action] : []);\n const verb = computerVerb(action);\n const out = item.output;\n const running = item.status === \"running\";\n const rejected = raw.providerData?.approvalStatus === \"rejected\";\n const readOnly = typeof out === \"string\" && out.includes(\"read-only\");\n const shotUrl = screenshotDataUrl(out);\n const omittedMedia = mediaPreviewFact(out);\n const empty = out === \"\" || out == null;\n const batched = actions.length > 1 ? actions.map((a) => computerVerb(a)).join(\" · \") : null;\n // Fold the batched-action count into the title (one media affordance per row),\n // rather than a separate \"+N more\" mono label competing beside the thumbnail.\n const countSuffix = actions.length > 1 ? ` ·${actions.length}` : \"\";\n const isShot = action?.type === \"screenshot\";\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={\n isShot ? (\n <CameraIcon className={ICON_SIZE} />\n ) : (\n <MousePointer2Icon className={ICON_SIZE} />\n )\n }\n iconTone=\"running\"\n title={verb}\n running\n media={<MediaSkeleton />}\n >\n <BodyNote>capturing frame…</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n if (readOnly) {\n return (\n <ActivityDisclosure\n icon={<MousePointer2Icon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={verb}\n chip={{ tone: \"bad\", text: \"read-only\" }}\n preview=\"write actions disabled\"\n >\n <BodyNote tone=\"error\">computer-use is read-only — write actions are disabled.</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n if (rejected) {\n return (\n <ActivityDisclosure\n icon={<LockIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title={verb}\n preview=\"approval rejected — this action did not run\"\n >\n <BodyNote>approval rejected — this action did not run.</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n const isFailed = item.status === \"failed\";\n const isCancelled = item.status === \"cancelled\";\n\n if (shotUrl) {\n const caption = `${verb}${actions.length > 1 ? ` (+${actions.length - 1} more)` : \"\"}`;\n return (\n <ActivityDisclosure\n icon={\n isShot ? (\n <CameraIcon className={ICON_SIZE} />\n ) : (\n <MousePointer2Icon className={ICON_SIZE} />\n )\n }\n iconTone={isFailed ? \"failed\" : \"accent\"}\n title={`${verb}${countSuffix}`}\n failed={isFailed}\n cancelled={isCancelled}\n media={<Thumbnail src={shotUrl} caption={caption} />}\n >\n <ScreenshotFigure src={shotUrl} caption={caption} />\n {batched ? <BodyNote>batched: {batched}</BodyNote> : null}\n </ActivityDisclosure>\n );\n }\n\n if (omittedMedia) {\n return (\n <ActivityDisclosure\n icon={<CameraOffIcon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"muted\"}\n title={`${verb}${countSuffix} · image omitted · not retained`}\n failed={isFailed}\n cancelled={isCancelled}\n preview=\"inline image omitted · not retained\"\n media={<MediaEmpty />}\n >\n <BodyNote>\n The inline {omittedMedia.mediaType} output was omitted from the audit timeline and its\n source bytes were not retained.\n </BodyNote>\n {batched ? <BodyNote>batched: {batched}</BodyNote> : null}\n </ActivityDisclosure>\n );\n }\n\n if (empty) {\n return (\n <ActivityDisclosure\n icon={<CameraOffIcon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"muted\"}\n title={verb}\n failed={isFailed}\n cancelled={isCancelled}\n media={<MediaEmpty />}\n >\n <BodyNote>\n {isFailed\n ? \"computer_call failed — no image returned.\"\n : isCancelled\n ? \"computer_call interrupted — no image returned.\"\n : \"(no image) — the session returned an empty screenshot.\"}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n\n // a non-screenshot action whose output is not an image (click/keypress)\n return (\n <ActivityDisclosure\n icon={<MousePointer2Icon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"accent\"}\n title={verb}\n failed={isFailed}\n cancelled={isCancelled}\n preview={batched ?? undefined}\n expandable={batched != null}\n >\n {batched ? <BodyNote>{batched}</BodyNote> : null}\n </ActivityDisclosure>\n );\n}\n\n/* ---- web_search ------------------------------------------------------------ */\n\ntype WebSearchResult = { title: string; domain: string; snippet: string };\n\nfunction WebSearchRenderer({ item }: ToolRendererProps) {\n const raw = (item.raw ?? {}) as {\n providerData?: { action?: { query?: string; queries?: string[] } };\n };\n const action = raw.providerData?.action ?? {};\n const query = action.query ?? \"(query unavailable)\";\n const queries = action.queries ?? [];\n const variants = queries.length > 1 ? ` +${queries.length - 1} variants` : \"\";\n const running = item.status === \"running\";\n // web_search may surface a results array on the output when the host enriches it.\n // Filter out null/undefined/non-object entries before casting: host-provided\n // data is untrusted and a null element would throw on result.title access.\n const rawResults = (item.output as { results?: unknown } | undefined)?.results;\n const results = Array.isArray(rawResults)\n ? (rawResults as unknown[]).filter((r): r is WebSearchResult => !!r && typeof r === \"object\")\n : undefined;\n const resultOccurrences = new Map<string, number>();\n const keyedResults = results?.map((result) => {\n const contentKey = `${result.domain}\\u0000${result.title}\\u0000${result.snippet}`;\n const occurrence = (resultOccurrences.get(contentKey) ?? 0) + 1;\n resultOccurrences.set(contentKey, occurrence);\n return { key: `${contentKey}\\u0000${occurrence}`, result };\n });\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={<SearchIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title=\"Searching the web\"\n running\n preview={<RunningPreview>{`${query}${variants}`}</RunningPreview>}\n >\n <BodyNote>searching… results fold into the model context (no output event).</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n return (\n <ActivityDisclosure\n icon={<SearchIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title=\"Searched the web\"\n preview={`${query}${variants}`}\n failed={item.status === \"failed\"}\n cancelled={item.status === \"cancelled\"}\n >\n {keyedResults && keyedResults.length ? (\n <ul className=\"flex flex-col gap-2\">\n {keyedResults.map(({ key, result }) => (\n <li key={key} className=\"flex gap-2.5\">\n <GlobeIcon className=\"mt-0.5 size-3.5 shrink-0 text-og-fg-subtle\" />\n <div className=\"min-w-0\">\n <p className=\"truncate text-og-base text-og-fg\">\n {result.title} <span className=\"text-og-fg-subtle\">{result.domain}</span>\n </p>\n <p className=\"text-og-sm leading-5 text-og-fg-muted\">{result.snippet}</p>\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <BodyNote>results folded into model context — no list available.</BodyNote>\n )}\n </ActivityDisclosure>\n );\n}\n\n/* ---- view_image ------------------------------------------------------------ */\n\nconst VIEW_IMAGE_ERRORS = [\n \"was not found\",\n \"is not a file\",\n \"exceeded the allowed size\",\n \"is not a supported image\",\n \"unable to read image\",\n];\n\nfunction ViewImageRenderer({ item }: ToolRendererProps) {\n const args = parseToolArgs(item.arguments);\n const path = typeof args.path === \"string\" ? args.path : \"\";\n const out = item.output;\n const text = typeof out === \"string\" ? out : \"\";\n const omittedMedia = mediaPreviewFact(out);\n\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={`View ${basename(path)}`}\n running\n preview={<RunningPreview>reading…</RunningPreview>}\n media={<MediaSkeleton />}\n >\n <BodyNote>reading image…</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n const viewFailed = item.status === \"failed\";\n const viewCancelled = item.status === \"cancelled\";\n\n const errMatch = VIEW_IMAGE_ERRORS.find((p) => text.includes(p));\n if (errMatch) {\n const tooBig = text.includes(\"exceeded the allowed size\");\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={`View ${basename(path)}`}\n chip={{ tone: \"bad\", text: tooBig ? \"too large\" : \"error\" }}\n preview={text}\n >\n <BodyNote tone=\"error\">{text}</BodyNote>\n </ActivityDisclosure>\n );\n }\n if (text.startsWith(\"OpenAI file reference:\")) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"muted\"}\n title={`Viewed ${basename(path)}`}\n failed={viewFailed}\n cancelled={viewCancelled}\n preview={path}\n >\n <BodyNote>{text}</BodyNote>\n </ActivityDisclosure>\n );\n }\n if (omittedMedia) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"muted\"}\n title={`Viewed ${basename(path)} · image omitted · not retained`}\n failed={viewFailed}\n cancelled={viewCancelled}\n preview=\"inline image omitted · not retained\"\n media={<MediaEmpty />}\n >\n <BodyNote>\n The inline {omittedMedia.mediaType} output was omitted from the audit timeline and its\n source bytes were not retained.\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n if (text.includes(\"No image data\")) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"muted\"}\n title={`Viewed ${basename(path)}`}\n failed={viewFailed}\n cancelled={viewCancelled}\n preview=\"(no image)\"\n >\n <BodyNote>\n {viewFailed\n ? \"view_image failed — no image data returned.\"\n : viewCancelled\n ? \"view_image interrupted.\"\n : \"(no image) — the sandbox session returned no image data.\"}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n if (text.startsWith(\"data:\")) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"accent\"}\n title={`Viewed ${basename(path)}`}\n failed={viewFailed}\n cancelled={viewCancelled}\n media={<Thumbnail src={text} caption={path} alt={path} />}\n >\n <ScreenshotFigure src={text} caption={path} alt={path} />\n </ActivityDisclosure>\n );\n }\n return <GenericRenderer item={item} />;\n}\n\n/* ---- environment_set_variable (secret-safe, write-only) -------------------- */\n\nfunction SecretSetRenderer({ item }: ToolRendererProps) {\n const args = parseToolArgs(item.arguments);\n const name = typeof args.name === \"string\" ? args.name : \"variable\";\n\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={<KeyRoundIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={`Set ${name}`}\n running\n preview={<RunningPreview>setting…</RunningPreview>}\n >\n <PayloadBlock label=\"Arguments\" value={redactSecrets(args)} />\n </ActivityDisclosure>\n );\n }\n\n if (item.status === \"failed\") {\n const errorText = typeof item.output === \"string\" ? item.output : null;\n return (\n <ActivityDisclosure\n icon={<KeyRoundIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={`Set ${name}`}\n failed\n preview={errorText ?? \"variable write failed\"}\n >\n <PayloadBlock label=\"Arguments\" value={redactSecrets(args)} />\n {errorText ? (\n <PayloadBlock label=\"Error\" value={errorText} failed />\n ) : (\n <BodyNote tone=\"error\">the tool call failed with no output.</BodyNote>\n )}\n </ActivityDisclosure>\n );\n }\n\n return (\n <ActivityDisclosure\n icon={<KeyRoundIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title={`Set ${name}`}\n cancelled={item.status === \"cancelled\"}\n preview=\"value write-only · never returned\"\n >\n <PayloadBlock label=\"Arguments\" value={redactSecrets(args)} />\n <BodyNote>the value is a secret — redacted in every view; the API never returns it.</BodyNote>\n </ActivityDisclosure>\n );\n}\n\n/* ---- generic fallback (first-party MCP, external MCP, unknown) ------------- */\n\nfunction GenericRenderer({ item }: ToolRendererProps) {\n const running = item.status === \"running\";\n const args = redactSecrets(parseToolArgs(item.arguments));\n const display = toolDisplayName(item.name);\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={<PlugIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={display}\n running\n preview={<RunningPreview>{compactArgs(args) || \"running…\"}</RunningPreview>}\n >\n <PayloadBlock label=\"Arguments\" value={args} />\n </ActivityDisclosure>\n );\n }\n\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n // Cancelled is NOT an error — a user-cancelled tool should not surface the red\n // error chip even if the output payload carries an isError flag (the error may be\n // a consequence of the cancellation, not the tool's own failure).\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return (\n <ActivityDisclosure\n icon={<WrenchIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={display}\n chip={{ tone: \"bad\", text: \"error\" }}\n preview={outText.slice(0, 80)}\n >\n <PayloadBlock label=\"Arguments\" value={args} />\n <PayloadBlock label=\"Error\" value={outText} failed />\n </ActivityDisclosure>\n );\n }\n\n return (\n <ActivityDisclosure\n icon={<WrenchIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title={display}\n cancelled={item.status === \"cancelled\"}\n preview={compactArgs(args)}\n >\n <PayloadBlock label=\"Arguments\" value={args} />\n <PayloadBlock label=\"Result\" value={outText} />\n </ActivityDisclosure>\n );\n}\n\nfunction compactArgs(args: unknown): string {\n const text = stringifyPayload(args).replace(/\\s+/g, \" \").trim();\n return text === \"{}\" ? \"\" : text.length > 90 ? `${text.slice(0, 89)}…` : text;\n}\n\n/* ---- the default registry -------------------------------------------------- */\n\nconst BASE_ENTRIES: ToolRegistryEntry[] = [\n // Provider-native items carry `raw.type` on the wire — this is their source of\n // truth and is consulted first by the registry.\n { match: \"rawType\", type: \"apply_patch_call\", render: ApplyPatchRenderer },\n { match: \"rawType\", type: \"computer_call\", render: ComputerCallRenderer },\n { match: \"rawType\", type: \"hosted_tool_call\", render: WebSearchRenderer },\n // First-party sandbox + MCP tools resolve by name. `apply_patch_call` /\n // `computer_call` are intentionally repeated by name as a fallback only for\n // first-party replays that omit `raw` (the rawType entries above win whenever\n // `raw.type` is present, which is the live-wire case).\n { match: \"name\", name: \"exec_command\", render: ExecRenderer },\n { match: \"name\", name: \"write_stdin\", render: WriteStdinRenderer },\n { match: \"name\", name: \"apply_patch_call\", render: ApplyPatchRenderer },\n { match: \"name\", name: \"computer_call\", render: ComputerCallRenderer },\n // Function-mode computer tools (codex / chat-wire transports).\n { match: \"name\", name: \"computer_screenshot\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_click\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_double_click\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_move\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_scroll\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_type\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_keypress\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_drag\", render: ComputerCallRenderer },\n { match: \"name\", name: \"web_search_call\", render: WebSearchRenderer },\n { match: \"name\", name: \"view_image\", render: ViewImageRenderer },\n { match: \"name\", name: \"environment_set_variable\", render: SecretSetRenderer },\n];\n\n/** The built-in tool renderer registry: every first-party tool plus a fallback. */\nexport const defaultToolRegistry: ToolRegistry = createToolRegistry(BASE_ENTRIES, GenericRenderer);\n\n/** Build a registry that extends the built-ins with consumer entries/fallback. */\nexport function createDefaultToolRegistry(\n options: Parameters<typeof createToolRegistry>[2] = {},\n): ToolRegistry {\n return createToolRegistry(BASE_ENTRIES, GenericRenderer, options);\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\nimport { useState } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useThemeType } from \"../lib/use-theme-type\";\nimport { PierreDiff } from \"../components/pierre-diff\";\n\n/* ----------------------------------------------------------------------------\n Tool diff\n\n Renders parsed `GitFileDiff[]` (from the V4A apply_patch parser) through the\n EXACT same diff stack the Files/Changes tabs use: `PierreDiff` (Shiki-\n highlighted), with a built-in plain-text degrade for a host without\n `@pierre/diffs` — one renderer, a single data contract. A per-block\n Unified/Split toggle sits in the header.\n -------------------------------------------------------------------------- */\n\nexport function ToolDiff({ files }: { files: GitFileDiff[] }) {\n const [layout, setLayout] = useState<\"unified\" | \"split\">(\"unified\");\n // Resolve the host theme (auto-detect via `data-og-theme`) with the SAME hook\n // the Files tab uses, then thread it into Pierre. Without it Pierre falls back\n // to its hard dark default and renders a github-dark slab inside a light page.\n const themeType = useThemeType(undefined);\n return (\n <div className=\"min-w-0\">\n <div className=\"mb-1.5 flex justify-end\">\n <LayoutToggle layout={layout} onChange={setLayout} />\n </div>\n <PierreDiff diff={files} layout={layout} themeType={themeType} />\n </div>\n );\n}\n\nfunction LayoutToggle({\n layout,\n onChange,\n}: {\n layout: \"unified\" | \"split\";\n onChange: (next: \"unified\" | \"split\") => void;\n}) {\n return (\n <div className=\"inline-flex items-center gap-px rounded-og-xs border border-og-border p-px\">\n {([\"unified\", \"split\"] as const).map((value) => (\n <button\n key={value}\n type=\"button\"\n onClick={() => onChange(value)}\n className={cn(\n \"rounded-og-xs px-2 py-[3px] text-og-xs font-medium capitalize transition-colors\",\n layout === value\n ? \"bg-og-surface-2 text-og-fg\"\n : \"text-og-fg-subtle hover:text-og-fg-muted\",\n )}\n >\n {value}\n </button>\n ))}\n </div>\n );\n}\n\n/** Raw-patch fallback for a V4A hunk string the parser could not structure. */\nexport function RawPatch({ diff }: { diff: string }) {\n const occurrences = new Map<string, number>();\n const lines = diff.split(\"\\n\").map((line) => {\n const occurrence = (occurrences.get(line) ?? 0) + 1;\n occurrences.set(line, occurrence);\n return { key: `${line}\\u0000${occurrence}`, line };\n });\n return (\n <div className=\"min-w-0\">\n <p className=\"mb-1 text-og-xs font-medium uppercase tracking-[0.08em] text-og-fg-subtle\">\n raw patch (could not parse hunks)\n </p>\n <pre className=\"max-h-72 overflow-auto border-l-2 border-og-border pl-3 font-og-mono text-og-xs leading-5\">\n {lines.map(({ key, line }) => (\n <span\n key={key}\n className={cn(\n \"block\",\n line.startsWith(\"@@\")\n ? \"text-og-accent\"\n : line.startsWith(\"+\")\n ? \"text-og-status-idle\"\n : line.startsWith(\"-\")\n ? \"text-og-status-failed\"\n : \"text-og-fg-muted\",\n )}\n >\n {line || \" \"}\n </span>\n ))}\n </pre>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\n/* ----------------------------------------------------------------------------\n useThemeType\n\n Resolve the effective dark/light theme for surfaces (the Pierre/Shiki diff)\n that render outside the reach of host CSS — they need the theme as a value,\n not a cascade. An explicit prop always wins; otherwise read the host's\n `data-og-theme` attribute (set on `<html>` or any ancestor by the same opt-in\n the tokens use) and default to dark, the first-class theme. A MutationObserver\n keeps it live across runtime theme flips.\n\n One detector, shared by every diff surface (the Files tab and the timeline),\n so the two can never drift onto different themes.\n -------------------------------------------------------------------------- */\n\n/**\n * Resolve the diff theme. An explicit `forced` value wins; otherwise auto-detect\n * from the host `data-og-theme` (defaulting to dark) and track live flips.\n */\nexport function useThemeType(forced: \"dark\" | \"light\" | undefined): \"dark\" | \"light\" {\n const [detected, setDetected] = useState<\"dark\" | \"light\">(\"dark\");\n useEffect(() => {\n if (forced || typeof document === \"undefined\") return;\n const read = () => {\n const el = document.querySelector(\"[data-og-theme]\");\n const value = el?.getAttribute(\"data-og-theme\");\n setDetected(value === \"light\" ? \"light\" : \"dark\");\n };\n read();\n const observer = new MutationObserver(read);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-og-theme\"],\n subtree: true,\n });\n return () => observer.disconnect();\n }, [forced]);\n return forced ?? detected;\n}\n","/**\n * Readable label for a tool call (\"session_create\" -> \"session create\").\n *\n * MCP tools are namespaced `<serverId>__<toolName>` (see prefixedMcpToolName),\n * and for catalog-imported servers that serverId is an opaque slug+hash.\n * De-slugging the whole thing leaked that id into the timeline; strip the\n * server prefix and show just the tool. Names without the `__` boundary (plain\n * built-ins like \"session_create\") are unaffected.\n */\nexport function toolDisplayName(name: string): string {\n // The prefix is a single LEFT boundary (`registryId__toolName`), so split on\n // the FIRST `__` — the tool name itself may contain `__` and must survive whole.\n const boundary = name.indexOf(\"__\");\n const toolPart = boundary >= 0 ? name.slice(boundary + 2) : name;\n return toolPart.replace(/[_-]+/g, \" \").trim();\n}\n","import {\n ArrowRightIcon,\n BotIcon,\n BrainCircuitIcon,\n BrainIcon,\n SquareTerminalIcon,\n} from \"lucide-react\";\nimport { lazy, Suspense } from \"react\";\nimport { jsx as rowJsx, jsxs as rowJsxs } from \"react/jsx-runtime\";\nimport { cn } from \"../lib/cn\";\nimport { truncate } from \"../lib/format\";\nimport { defaultToolRegistry } from \"./tool-renderers\";\nimport { useEntranceAnimation } from \"./entrance\";\nimport type { ToolRegistry } from \"./registry\";\nimport { BodyNote, PayloadBlock, ActivityDisclosure } from \"./shared\";\nimport { toolDisplayName } from \"./tool-display-name\";\nimport type { ActivityItem, MemoryItem, ReasoningItem, SandboxItem, WorkerItem } from \"./types\";\n\nconst LazyFleetDecisionRow = lazy(() => import(\"./fleet-decision-row\"));\n\n/* ----------------------------------------------------------------------------\n Activity rail\n\n Renders a run of clustered activity items (reasoning, tool calls, workers,\n sandbox ops) as the left-bordered column between chat messages. Tool calls\n resolve through the renderer registry; everything else has a first-class row.\n\n Shared by `MessageTimeline` and the component demo so both draw the exact\n same rail — no divergence.\n -------------------------------------------------------------------------- */\n\nexport type ActivityRailProps = {\n items: ActivityItem[];\n /** Renderer registry for tool calls. Defaults to {@link defaultToolRegistry}. */\n toolRegistry?: ToolRegistry | undefined;\n /** Drill into a spawned worker session. */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n /**\n * Deep-link a memory row to its record in the host's memory pane. Opt-in: the\n * library draws no \"View in memory\" affordance without a handler (the memory\n * row is then non-interactive rich content). See {@link MessageTimelineProps}.\n */\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n /** Drop the left rule + indent (used inside a folded turn summary). */\n bare?: boolean | undefined;\n className?: string | undefined;\n};\n\n/**\n * The \"family\" a row belongs to, for light intra-rail grouping. Consecutive\n * rows of the same family sit tight; a family change gets a little extra top\n * margin so a long run reads as clusters rather than one undifferentiated wall.\n */\nfunction familyOf(item: ActivityItem): string {\n if (item.kind === \"tool-call\") {\n return item.name === \"exec_command\" || item.name === \"write_stdin\" ? \"terminal\" : item.name;\n }\n return item.kind;\n}\n\nexport function ActivityRail({\n items,\n toolRegistry = defaultToolRegistry,\n onOpenSession,\n onMemoryClick,\n bare,\n className,\n}: ActivityRailProps) {\n const enter = useEntranceAnimation();\n return (\n <div\n className={cn(\n // Rows sit TIGHT by default (gap-0.5) so a same-family run reads as one\n // calm cluster; a family change opens real breathing room (mt-3) below,\n // so a long rail reads as a few clusters, not a metronome of rows.\n \"flex flex-col gap-0.5\",\n !bare && \"border-l-2 border-og-border pl-3 sm:pl-4\",\n !bare && enter && \"animate-og-enter\",\n className,\n )}\n >\n {items.map((item, index) => {\n const newFamily = index > 0 && familyOf(item) !== familyOf(items[index - 1]!);\n const row = renderActivity(item, toolRegistry, onOpenSession, onMemoryClick);\n return (\n <div key={item.id} data-og-timeline-row-anchor=\"\" className={cn(newFamily && \"mt-3\")}>\n {row}\n </div>\n );\n })}\n </div>\n );\n}\n\n/** A never-reachable guard: adding an `ActivityItem` kind is now a compile error. */\nfunction assertNever(item: never): never {\n throw new Error(`ActivityRail: unhandled activity item ${JSON.stringify(item)}`);\n}\n\nfunction renderActivity(\n item: ActivityItem,\n toolRegistry: ToolRegistry,\n onOpenSession: ((sessionId: string) => void) | undefined,\n onMemoryClick: ((memoryId: string) => void) | undefined,\n) {\n switch (item.kind) {\n case \"reasoning\":\n return <ReasoningRow item={item} />;\n case \"tool-call\": {\n const Renderer = toolRegistry.resolve(item);\n return <Renderer item={item} />;\n }\n case \"worker\":\n return <WorkerRow item={item} onOpenSession={onOpenSession} />;\n case \"sandbox\":\n return <SandboxRow item={item} />;\n case \"memory\":\n return <MemoryRow item={item} onMemoryClick={onMemoryClick} />;\n case \"fleet-decision\":\n return (\n <Suspense fallback={null}>\n <LazyFleetDecisionRow\n item={item}\n d={ActivityDisclosure}\n b={BodyNote}\n j={rowJsx}\n s={rowJsxs}\n />\n </Suspense>\n );\n default:\n return assertNever(item);\n }\n}\n\nfunction ReasoningRow({ item }: { item: ReasoningItem }) {\n // Reasoning recedes: a dimmer, lighter-weight title so action rows lead and\n // thought rows sit a half-step back in the hierarchy.\n return (\n <ActivityDisclosure\n icon={<BrainIcon className=\"size-3.5\" />}\n iconTone=\"muted\"\n title={\n item.streaming ? (\n \"Thinking\"\n ) : (\n <span className=\"font-normal italic text-og-fg-subtle\">Thought</span>\n )\n }\n running={item.streaming}\n preview={truncate(item.text, 110)}\n >\n <p className=\"whitespace-pre-wrap text-og-base leading-6 text-og-fg-muted\">{item.text}</p>\n </ActivityDisclosure>\n );\n}\n\n/**\n * Human labels for the memory kinds, translated at the SDK boundary so a raw\n * enum slug never renders as UI. Kept local to the library (the app has its own\n * `KIND_LABEL`); an unknown kind simply omits the chip rather than showing a slug.\n */\nconst MEMORY_KIND_LABEL: Record<string, string> = {\n preference: \"Preference\",\n semantic: \"Fact\",\n procedural: \"Procedure\",\n decision: \"Decision\",\n episodic: \"History\",\n};\n\n/**\n * A memory write the agent made mid-turn. A calm, NEUTRAL step (a successful save\n * is ordinary progress, never an exceptional state, so no accent/color): a brain-\n * circuit glyph, \"Saved to memory\" / \"Updated memory\", a human kind chip, and the\n * memory text. Expanding reveals the full text; a supersede shows the old text\n * struck through above the new one. When the host opts in with `onMemoryClick`,\n * a quiet \"View in memory\" affordance deep-links to the LIVE record.\n */\nfunction MemoryRow({\n item,\n onMemoryClick,\n}: {\n item: MemoryItem;\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n}) {\n const corrected = item.variant === \"corrected\";\n const kindLabel = MEMORY_KIND_LABEL[item.memoryKind];\n // A supersede carries both the old text (`preview`) and the new (`replacementPreview`);\n // an in-place update / archive carries only `preview`.\n const superseded = corrected && Boolean(item.replacementPreview);\n // Link to the LIVE record: a supersede's replacement when present, else the memory itself.\n const targetId = corrected ? (item.replacementMemoryId ?? item.memoryId) : item.memoryId;\n const deepLink = Boolean(onMemoryClick);\n return (\n <ActivityDisclosure\n icon={<BrainCircuitIcon className=\"size-3.5\" />}\n iconTone=\"muted\"\n title={\n <span className=\"inline-flex min-w-0 items-center gap-2\">\n <span className=\"shrink-0\">{corrected ? \"Updated memory\" : \"Saved to memory\"}</span>\n {kindLabel ? (\n <span className=\"shrink-0 rounded-og-xs bg-og-surface-2 px-1.5 py-px text-og-xs font-normal leading-tight text-og-fg-subtle\">\n {kindLabel}\n </span>\n ) : null}\n </span>\n }\n preview={superseded ? item.replacementPreview : item.preview}\n >\n {superseded ? (\n // The correction as a before → after: the old memory struck through and\n // dimmed, the new text in the ordinary body weight below it.\n <div className=\"flex flex-col gap-1.5\">\n <p className=\"whitespace-pre-wrap text-og-sm leading-6 text-og-fg-subtle line-through\">\n {item.preview}\n </p>\n <p className=\"whitespace-pre-wrap text-og-base leading-6 text-og-fg-muted\">\n {item.replacementPreview}\n </p>\n </div>\n ) : corrected && item.action === \"updated\" ? (\n // Edited in place, no replacement record: the memory is still live, so\n // show its current text — NOT the archived treatment.\n <>\n <p className=\"whitespace-pre-wrap text-og-base leading-6 text-og-fg-muted\">\n {item.preview}\n </p>\n <BodyNote tone=\"muted\">Updated in place.</BodyNote>\n </>\n ) : corrected ? (\n // A correction with no replacement (and not an in-place update) archived the record.\n <BodyNote tone=\"muted\">Archived.</BodyNote>\n ) : (\n <p className=\"whitespace-pre-wrap text-og-base leading-6 text-og-fg-muted\">\n {item.preview}\n </p>\n )}\n {item.deduped ? <BodyNote tone=\"muted\">Merged into an existing memory.</BodyNote> : null}\n {deepLink ? (\n <button\n type=\"button\"\n onClick={() => onMemoryClick?.(targetId)}\n className={cn(\n \"group/memlink -mx-1 inline-flex w-fit items-center gap-1 rounded-og-sm px-1 py-0.5 text-left text-og-sm text-og-fg-subtle\",\n \"outline-none transition-colors duration-150 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent\",\n )}\n >\n View in memory\n <ArrowRightIcon className=\"size-3.5 transition-transform duration-150 group-hover/memlink:translate-x-0.5\" />\n </button>\n ) : null}\n </ActivityDisclosure>\n );\n}\n\n/**\n * A human title for a sandbox operation row. Named platform operations (the lazy\n * `sandbox.provision` first-establish that now runs mid-turn) read as calm,\n * status-aware English instead of a raw op id — the box coming up should look\n * like \"Starting sandbox\", never an unexplained long-running command. Unnamed /\n * unknown ops fall back to the generic id-to-words {@link toolDisplayName}.\n */\nfunction sandboxRowTitle(item: SandboxItem): string {\n if (item.name === \"sandbox.provision\") {\n if (item.status === \"failed\") return \"Sandbox didn’t start\";\n if (item.status === \"running\") return \"Starting sandbox\";\n if (item.origin === \"resumed\") return \"Sandbox reattached\";\n if (item.origin === \"restored\") return \"Sandbox restored\";\n if (item.origin === \"created\") return \"Sandbox created\";\n return \"Sandbox ready\";\n }\n return toolDisplayName(item.name);\n}\n\nfunction SandboxRow({ item }: { item: SandboxItem }) {\n return (\n <ActivityDisclosure\n icon={<SquareTerminalIcon className=\"size-3.5\" />}\n iconTone={\n item.status === \"failed\" ? \"failed\" : item.status === \"running\" ? \"running\" : \"muted\"\n }\n title={sandboxRowTitle(item)}\n running={item.status === \"running\"}\n failed={item.status === \"failed\"}\n cancelled={item.status === \"cancelled\"}\n preview={item.command ?? undefined}\n >\n {item.command ? <PayloadBlock label=\"Command\" value={item.command} /> : null}\n {item.output ? <PayloadBlock label=\"Output\" value={item.output} /> : null}\n </ActivityDisclosure>\n );\n}\n\n/** Spawned/messaged worker sessions get a first-class card, not a tool row. */\nfunction WorkerRow({\n item,\n onOpenSession,\n}: {\n item: WorkerItem;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n const running = item.status === \"running\";\n const failed = item.status === \"failed\";\n const cancelled = item.status === \"cancelled\";\n const title =\n item.action === \"spawn\"\n ? running\n ? \"Spawning worker\"\n : failed\n ? \"Worker spawn failed\"\n : cancelled\n ? \"Worker interrupted\"\n : \"Worker spawned\"\n : running\n ? \"Messaging worker\"\n : failed\n ? \"Worker message failed\"\n : cancelled\n ? \"Worker interrupted\"\n : \"Worker messaged\";\n // A worker is a first-class actor but still a STEP on the rail — a borderless\n // row (no card), aligned to its sibling tool rows: the chevron column is an\n // empty spacer (a worker doesn't expand), then the bot glyph, then the title\n // with a quiet prompt beneath, and one right-gutter affordance.\n //\n // Once the worker's session id is known, the WHOLE row is a clean, clickable\n // deep-link into that child session (a trailing arrow brightens on hover) —\n // the spawn moment itself is the affordance, not a small side button. A\n // still-in-flight spawn (no id yet) or a failed/cancelled worker is inert, so\n // there is never a dead click target. The gutter mirrors the worker-completion\n // card's calm language: red chip on failure, \"interrupted\" on cancel.\n const sessionId = item.workerSessionId;\n const deepLink = Boolean(sessionId) && Boolean(onOpenSession) && !failed && !cancelled;\n const inner = (\n <>\n <span className=\"size-3.5 shrink-0\" aria-hidden />\n <span className={cn(\"mt-px shrink-0\", failed ? \"text-og-status-failed\" : \"text-og-accent\")}>\n <BotIcon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n {/* In-flight state is carried ONLY by the shimmering title (no detached\n pulse badge), matching every other running row in the rail. */}\n <span\n className={cn(\n \"text-og-base font-medium\",\n running ? \"og-shimmer-text\" : failed ? \"text-og-status-failed\" : \"text-og-fg\",\n )}\n >\n {title}\n </span>\n {item.prompt ? (\n <p className=\"mt-0.5 truncate text-og-sm text-og-fg-muted\">\n {truncate(item.prompt, 140)}\n </p>\n ) : null}\n </div>\n {failed ? (\n <span className=\"inline-flex shrink-0 self-center items-center gap-1.5 font-og-mono text-og-xs leading-none text-og-status-failed\">\n <span className=\"size-1.5 rounded-full bg-og-status-failed\" />\n failed\n </span>\n ) : cancelled ? (\n <span className=\"og-cancelled-chip shrink-0 self-center font-og-mono text-og-xs leading-none text-og-fg-subtle\">\n interrupted\n </span>\n ) : deepLink ? (\n <ArrowRightIcon\n aria-hidden\n className=\"mt-0.5 size-3.5 shrink-0 text-og-fg-subtle transition-[transform,color] duration-150 group-hover/worker:translate-x-0.5 group-hover/worker:text-og-fg\"\n />\n ) : null}\n </>\n );\n\n if (deepLink && sessionId && onOpenSession) {\n return (\n <button\n type=\"button\"\n onClick={() => onOpenSession(sessionId)}\n className={cn(\n \"group/worker -mx-1.5 flex w-full items-start gap-2 rounded-og-sm px-1.5 py-1.5 text-left\",\n \"outline-none transition-colors duration-150 hover:bg-og-surface-1 focus-visible:ring-2 focus-visible:ring-og-accent\",\n \"pointer-coarse:py-2.5\",\n )}\n >\n {inner}\n </button>\n );\n }\n return <div className=\"flex items-start gap-2 px-1.5 py-1.5\">{inner}</div>;\n}\n","import { createContext, useContext, useRef } from \"react\";\n\n/* ----------------------------------------------------------------------------\n Entrance animation gating\n\n Bulk paints (the initial tail window, a prepended older window) must not run\n per-row entrance animations — hundreds of rows fading in at once reads as a\n full-timeline flash. Toggling `animation: none` on and off is NOT an option:\n removing the override restarts every animation, which is itself the flash.\n\n Instead each animated element decides ONCE, at its own mount, whether it was\n born in a bulk paint — and keeps that decision forever. Rows born in a bulk\n paint never animate; rows appended live animate exactly as before. Nothing\n is ever toggled on existing DOM, so nothing can replay.\n -------------------------------------------------------------------------- */\n\nconst EntranceAnimationContext = createContext(true);\n\nexport const EntranceAnimationProvider = EntranceAnimationContext.Provider;\n\n/**\n * Whether this element should wear the entrance animation. Captured at mount\n * from the nearest provider (true outside any provider) and stable for the\n * element's lifetime — see the module doctrine above.\n */\nexport function useEntranceAnimation(): boolean {\n const enabled = useContext(EntranceAnimationContext);\n const captured = useRef(enabled);\n return captured.current;\n}\n","import { CheckIcon, ChevronRightIcon, CircleSlashIcon, TriangleAlertIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Collapsible } from \"radix-ui\";\nimport { cn } from \"../lib/cn\";\nimport { useForcedDefaultOpen } from \"./disclosure-context\";\nimport { useEntranceAnimation } from \"./entrance\";\nimport { applyPatchOps, isApplyPatch, mediaPreviewFact, screenshotDataUrl } from \"./parsers\";\nimport { rawTypeOf } from \"./registry\";\nimport type { ActivityItem, TurnOutcome } from \"./types\";\nexport type { TurnOutcome } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Turn summary\n\n A completed (or failed/cancelled) turn folds behind one quiet summary chip:\n \"N steps · M files · K commands · 1 screenshot · 4m\". The chip is the default\n surface; expanding it reveals the full settled turn body. A live turn never\n folds — render its rows directly.\n\n This keeps the timeline calm: a finished turn is a single line until the\n reader chooses to look inside it.\n -------------------------------------------------------------------------- */\n\nexport type TurnSummaryProps = {\n /** The activity items in the turn (used only to compute the facet counts). */\n items: ActivityItem[];\n /**\n * The settled verdict — or absent for a completed CLUSTER of a still-running\n * turn, which folds neutrally: no verdict glyph (the turn has none yet), a\n * quiet pulse dot in its place so alignment and the running feel both hold.\n */\n outcome?: TurnOutcome | undefined;\n /** A short failure reason shown inline on a failed chip (never hidden). */\n failureText?: string | undefined;\n /** Elapsed turn duration; shown as a trailing facet when at least 1s. */\n durationMs?: number | undefined;\n /** Start expanded. */\n defaultOpen?: boolean | undefined;\n /**\n * A nested fold — a cluster or sub-turn INSIDE an already-expanded turn. It\n * drops the bordered/filled chip and renders as a plain disclosure node on the\n * parent's rail (chevron + glyph + facets), so expanding a turn reveals a thread\n * of nodes, never a stack of boxes-in-boxes. The top-level fold stays a chip.\n */\n bare?: boolean | undefined;\n /** The rendered activity rail revealed on expand. */\n children: React.ReactNode;\n};\n\nexport function TurnSummary({\n items,\n outcome,\n failureText,\n durationMs,\n defaultOpen,\n bare,\n children,\n}: TurnSummaryProps) {\n // An explicit `defaultOpen` always wins; otherwise an ancestor may seed it\n // (screenshot instrumentation); otherwise the turn starts folded.\n const forcedDefaultOpen = useForcedDefaultOpen();\n const [open, setOpen] = useState(defaultOpen ?? forcedDefaultOpen ?? false);\n const enter = useEntranceAnimation();\n const facets = summarizeTurn(items, durationMs);\n\n return (\n <Collapsible.Root\n open={open}\n onOpenChange={setOpen}\n className={enter && !bare ? \"animate-og-enter\" : undefined}\n >\n <Collapsible.Trigger\n className={cn(\n // Both the top-level turn fold and a nested cluster fold render as a\n // FLAT rail row — chevron + glyph + facets on the page background, no\n // border, no fill. Only a hover tint hints the row is expandable, so a\n // collapsed turn never reads as a boxed card. The top-level row is a\n // touch larger (base text, size-5 glyph, wider gap) so it still reads\n // as a turn landmark above the nested cluster rows it groups.\n \"group flex w-full items-center rounded-og-sm text-left transition-colors\",\n // A folded turn is a touch target on coarse pointers: grow the row so it\n // clears the 40px minimum without disturbing the calm desktop rhythm.\n \"pointer-coarse:py-2.5\",\n bare\n ? \"gap-2 px-1.5 py-1.5 text-og-sm text-og-fg-muted\"\n : \"-mx-2 gap-2.5 px-2 py-1.5 text-og-base text-og-fg-muted\",\n // A failed fold keeps its red accent (glyph + inline reason below) and a\n // faint red hover wash so attention still lands there; every other\n // outcome gets the neutral surface hover.\n outcome === \"failed\"\n ? \"hover:bg-og-status-failed/[0.06] hover:text-og-fg\"\n : \"hover:bg-og-surface-1 hover:text-og-fg\",\n )}\n >\n {/* Disclosure grammar matches the rows: chevron leads (far left), then the\n outcome glyph, then the facets — one expand affordance side everywhere. */}\n <ChevronRightIcon className=\"size-3.5 shrink-0 text-og-fg-subtle transition-transform duration-150 group-data-[state=open]:rotate-90\" />\n {/* The outcome glyph carries the state by hue alone — no filled circle, no\n card. A clean (complete) run draws a bare muted check; a failed one a\n red triangle; a cancelled one a muted slash; a still-running cluster a\n quiet pulse dot in the glyph's place so alignment holds. */}\n <span\n className={cn(\n \"inline-flex shrink-0 items-center justify-center\",\n bare ? \"size-3.5\" : \"size-5\",\n outcome === \"failed\" ? \"text-og-status-failed\" : \"text-og-fg-subtle\",\n )}\n >\n {outcome === \"failed\" ? (\n <TriangleAlertIcon className=\"size-3\" />\n ) : outcome === \"cancelled\" ? (\n <CircleSlashIcon className=\"size-3\" />\n ) : outcome === \"complete\" ? (\n <CheckIcon className={bare ? \"size-3\" : \"size-3.5\"} />\n ) : (\n <span className=\"size-1.5 animate-og-pulse rounded-full bg-og-fg-subtle\" />\n )}\n </span>\n <span className={cn(\"min-w-0 flex-1 truncate\", bare ? \"text-og-sm\" : \"text-og-fg-muted\")}>\n {facets}\n {outcome === \"failed\" && failureText ? (\n <span className=\"text-og-status-failed\"> · {failureText}</span>\n ) : null}\n {outcome === \"cancelled\" ? (\n <span className=\"text-og-fg-subtle\"> · interrupted</span>\n ) : null}\n </span>\n {/* The disclosure hint. Calm at rest on fine pointers (revealed on hover\n and keyboard focus), but always present on coarse pointers where there\n is no hover to lean on — so the fold never reads as a static status\n line. Purely visual: the trigger's aria-expanded already conveys state\n to assistive tech, so the hint is hidden from the accessible name. */}\n <span\n aria-hidden\n className={cn(\n \"ml-auto shrink-0 pl-2 text-og-xs text-og-fg-subtle transition-opacity duration-150\",\n \"opacity-0 group-hover:opacity-100 group-focus-visible:opacity-100\",\n \"pointer-coarse:opacity-100\",\n )}\n >\n {open ? \"hide steps\" : \"show steps\"}\n </span>\n </Collapsible.Trigger>\n <Collapsible.Content className=\"overflow-hidden data-[state=closed]:animate-og-collapse data-[state=open]:animate-og-expand\">\n {/* A nested node indents its revealed rows under the glyph (thread nesting\n off the parent rail); the top-level turn body owns its own rail. */}\n <div className={bare ? \"pt-1 pl-5\" : \"pt-2\"}>{children}</div>\n </Collapsible.Content>\n </Collapsible.Root>\n );\n}\n\n/** Compose the facet summary line (\"14 steps · 3 files · 2 commands · 1 screenshot · 4m\"). */\nfunction summarizeTurn(items: ActivityItem[], durationMs?: number): string {\n let files = 0;\n let commands = 0;\n let screenshots = 0;\n let memoriesSaved = 0;\n let memoriesUpdated = 0;\n for (const item of items) {\n if (item.kind === \"memory\") {\n // A memory write is a first-class facet — the \"wrote 1 memory\" signal the\n // fold should make prominent — counted saved vs updated separately.\n if (item.variant === \"corrected\") {\n memoriesUpdated += 1;\n } else {\n memoriesSaved += 1;\n }\n continue;\n }\n if (item.kind !== \"tool-call\") {\n continue;\n }\n // `item` is narrowed to ToolCallItem by the guard above — no cast needed.\n if (isApplyPatch(item)) {\n files += applyPatchOps(item.raw).length;\n } else if (item.name === \"exec_command\") {\n commands += 1;\n } else if (\n rawTypeOf(item) === \"computer_call\" ||\n item.name === \"computer_call\" ||\n item.name === \"computer_screenshot\"\n ) {\n if (screenshotDataUrl(item.output) !== null || mediaPreviewFact(item.output) !== null) {\n screenshots += 1;\n }\n }\n }\n const parts = [`${items.length} ${items.length === 1 ? \"step\" : \"steps\"}`];\n if (files) {\n parts.push(`${files} ${files === 1 ? \"file\" : \"files\"} edited`);\n }\n if (commands) {\n parts.push(`${commands} ${commands === 1 ? \"command\" : \"commands\"}`);\n }\n if (screenshots) {\n parts.push(`${screenshots} ${screenshots === 1 ? \"screenshot\" : \"screenshots\"}`);\n }\n if (memoriesSaved) {\n parts.push(`${memoriesSaved} ${memoriesSaved === 1 ? \"memory\" : \"memories\"} saved`);\n }\n if (memoriesUpdated) {\n parts.push(`${memoriesUpdated} ${memoriesUpdated === 1 ? \"memory\" : \"memories\"} updated`);\n }\n const duration = formatDurationFacet(durationMs);\n if (duration) {\n parts.push(duration);\n }\n return parts.join(\" · \");\n}\n\nfunction formatDurationFacet(durationMs: number | undefined): string | null {\n if (durationMs === undefined || !Number.isFinite(durationMs) || durationMs < 1000) {\n return null;\n }\n const totalSeconds = Math.floor(durationMs / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const totalMinutes = Math.floor(totalSeconds / 60);\n if (totalMinutes < 60) {\n return `${totalMinutes}m`;\n }\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n return `${hours}h ${String(minutes).padStart(2, \"0\")}m`;\n}\n","import { memo } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * The default renderer for chat message bodies in {@link MessageTimeline}.\n *\n * Agent (and user) messages arrive as GitHub-flavored markdown. This turns the\n * raw text into styled HTML using `react-markdown` + `remark-gfm`, themed to the\n * package's `og-*` design tokens so it reads as one cohesive dark surface — no\n * stock Tailwind colors leak in.\n *\n * It re-parses on every render, which is exactly right for streaming: a body\n * that is still arriving (an unterminated `**`, a half-open code fence, a table\n * mid-row) renders as best-effort markdown and resolves cleanly as the rest of\n * the tokens land. Consumers who want a different renderer can still pass\n * `renderMessageText` to `MessageTimeline` to override this entirely.\n */\nexport type MarkdownProps = {\n children: string;\n className?: string | undefined;\n};\n\n/* --- element renderers (themed to og-* tokens) ------------------------------ */\n\nconst components: Components = {\n h1: ({ children, ...props }) => (\n <h1\n className=\"mt-5 mb-2.5 text-xl font-semibold tracking-tight text-og-fg first:mt-0\"\n {...props}\n >\n {children}\n </h1>\n ),\n h2: ({ children, ...props }) => (\n <h2 className=\"mt-5 mb-2 text-lg font-semibold tracking-tight text-og-fg first:mt-0\" {...props}>\n {children}\n </h2>\n ),\n h3: ({ children, ...props }) => (\n <h3\n className=\"mt-4 mb-1.5 text-og-md font-semibold tracking-tight text-og-fg first:mt-0\"\n {...props}\n >\n {children}\n </h3>\n ),\n h4: ({ children, ...props }) => (\n <h4\n className=\"mt-4 mb-1.5 text-og-sm font-semibold uppercase tracking-[0.04em] text-og-fg-muted first:mt-0\"\n {...props}\n >\n {children}\n </h4>\n ),\n p: ({ children, ...props }) => (\n <p className=\"my-2.5 leading-7 first:mt-0 last:mb-0\" {...props}>\n {children}\n </p>\n ),\n strong: ({ children, ...props }) => (\n <strong className=\"font-semibold text-og-fg\" {...props}>\n {children}\n </strong>\n ),\n em: ({ children, ...props }) => (\n <em className=\"italic\" {...props}>\n {children}\n </em>\n ),\n a: ({ children, ...props }) => (\n <a\n className=\"break-words font-medium text-og-accent underline-offset-2 hover:underline\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n {...props}\n >\n {children}\n </a>\n ),\n ul: ({ children, ...props }) => (\n <ul\n className=\"my-2.5 ml-5 flex list-disc flex-col gap-1 marker:text-og-fg-subtle first:mt-0 last:mb-0\"\n {...props}\n >\n {children}\n </ul>\n ),\n ol: ({ children, ...props }) => (\n <ol\n className=\"my-2.5 ml-5 flex list-decimal flex-col gap-1 marker:text-og-fg-subtle first:mt-0 last:mb-0\"\n {...props}\n >\n {children}\n </ol>\n ),\n // GFM task-list items carry a leading checkbox <input>; `list-none` + a\n // negative margin pull the checkbox back to the bullet column so it aligns\n // with the text.\n li: ({ children, ...props }) => (\n <li\n className=\"leading-7 marker:text-og-fg-subtle [&>ul]:my-1 [&>ol]:my-1 [&:has(>input)]:list-none [&:has(>input)]:-ml-5\"\n {...props}\n >\n {children}\n </li>\n ),\n input: ({ type, ...props }) =>\n type === \"checkbox\" ? (\n <input\n {...props}\n type=\"checkbox\"\n disabled\n className=\"mr-2 size-3.5 translate-y-[2px] cursor-default accent-og-accent align-baseline\"\n />\n ) : (\n <input type={type} {...props} />\n ),\n blockquote: ({ children, ...props }) => (\n <blockquote\n className=\"my-3 border-l-2 border-og-border-strong pl-3.5 text-og-fg-muted [&>p]:my-1.5 first:mt-0 last:mb-0\"\n {...props}\n >\n {children}\n </blockquote>\n ),\n hr: (props) => <hr className=\"my-4 border-0 border-t border-og-border\" {...props} />,\n // Inline `code` vs fenced code blocks. react-markdown v10 no longer passes an\n // `inline` flag; a fenced block is a <code> whose parent is <pre> (styled by\n // the `pre` renderer), so a `code` reaching here is treated as inline.\n code: ({ children, className: _className, ...props }) => (\n <code\n className=\"rounded-og-xs border border-og-border bg-og-surface-1 px-1 py-0.5 font-og-mono text-og-sm text-og-fg\"\n {...props}\n >\n {children}\n </code>\n ),\n // Fenced code blocks — mirror the timeline's PayloadBlock <pre> styling for\n // visual consistency (bordered, scrollable, mono, surface background).\n pre: ({ children, ...props }) => (\n <pre\n className=\"my-3 max-h-96 overflow-auto rounded-og-md border border-og-border bg-og-bg/60 p-3 font-og-mono text-og-sm text-og-fg-muted [&>code]:border-0 [&>code]:bg-transparent [&>code]:p-0 [&>code]:text-inherit first:mt-0 last:mb-0\"\n {...props}\n >\n {children}\n </pre>\n ),\n table: ({ children, ...props }) => (\n <div className=\"my-3 max-w-full overflow-x-auto rounded-og-md border border-og-border first:mt-0 last:mb-0\">\n <table className=\"w-full border-collapse text-og-base\" {...props}>\n {children}\n </table>\n </div>\n ),\n thead: ({ children, ...props }) => (\n <thead className=\"bg-og-surface-1\" {...props}>\n {children}\n </thead>\n ),\n th: ({ children, ...props }) => (\n <th\n className=\"border-b border-og-border px-3 py-1.5 text-left font-medium text-og-fg\"\n {...props}\n >\n {children}\n </th>\n ),\n td: ({ children, ...props }) => (\n <td\n className=\"border-b border-og-border px-3 py-1.5 align-top text-og-fg-muted [tr:last-child>&]:border-b-0\"\n {...props}\n >\n {children}\n </td>\n ),\n img: ({ alt, ...props }) => (\n <img\n alt={alt ?? \"\"}\n className=\"my-3 max-w-full rounded-og-md border border-og-border\"\n {...props}\n />\n ),\n};\n\nfunction MarkdownImpl({ children, className }: MarkdownProps) {\n return (\n // `min-w-0` lets the prose shrink inside flex parents (message bubbles) so\n // long links and code blocks wrap/scroll instead of forcing overflow.\n <div className={cn(\"min-w-0 break-words\", className)}>\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>\n {children}\n </ReactMarkdown>\n </div>\n );\n}\n\n/** Memoized so streaming re-renders of the parent don't re-parse settled bodies. */\nexport const Markdown = memo(MarkdownImpl);\n","import type { SessionStatus as SessionStatusValue } from \"@opengeni/sdk\";\nimport { cn } from \"../lib/cn\";\n\nexport type SessionStatusMeta = {\n label: string;\n /** Token-backed color classes for the dot and tinted badge. */\n dotClassName: string;\n badgeClassName: string;\n /** Live states breathe; terminal states hold still. */\n pulse: boolean;\n};\n\nexport const SESSION_STATUS_META: Record<SessionStatusValue, SessionStatusMeta> = {\n queued: {\n label: \"Queued\",\n dotClassName: \"bg-og-status-queued\",\n badgeClassName: \"text-og-fg-muted border-og-border bg-og-status-queued/10\",\n pulse: true,\n },\n running: {\n label: \"Running\",\n dotClassName: \"bg-og-status-running\",\n badgeClassName: \"text-og-status-running border-og-status-running/30 bg-og-status-running/10\",\n pulse: true,\n },\n recovering: {\n label: \"Recovering\",\n dotClassName: \"bg-og-status-running\",\n badgeClassName: \"text-og-status-running border-og-status-running/30 bg-og-status-running/10\",\n pulse: true,\n },\n waiting_capacity: {\n label: \"Waiting for capacity\",\n dotClassName: \"bg-og-status-waiting\",\n badgeClassName: \"text-og-status-waiting border-og-status-waiting/35 bg-og-status-waiting/10\",\n pulse: true,\n },\n idle: {\n label: \"Idle\",\n dotClassName: \"bg-og-status-idle\",\n badgeClassName: \"text-og-status-idle border-og-status-idle/30 bg-og-status-idle/10\",\n pulse: false,\n },\n requires_action: {\n label: \"Waiting on you\",\n dotClassName: \"bg-og-status-waiting\",\n badgeClassName: \"text-og-status-waiting border-og-status-waiting/35 bg-og-status-waiting/10\",\n pulse: true,\n },\n failed: {\n label: \"Failed\",\n dotClassName: \"bg-og-status-failed\",\n badgeClassName: \"text-og-status-failed border-og-status-failed/35 bg-og-status-failed/10\",\n pulse: false,\n },\n cancelled: {\n label: \"Cancelled\",\n dotClassName: \"bg-og-status-cancelled\",\n badgeClassName: \"text-og-fg-subtle border-og-border bg-og-status-cancelled/10\",\n pulse: false,\n },\n};\n\nexport type SessionStatusProps = {\n status: SessionStatusValue;\n /** Override the label (\"Running\" -> \"Deploying\", ...). */\n label?: string | undefined;\n size?: \"sm\" | \"md\" | undefined;\n className?: string | undefined;\n};\n\n/** Status badge with a breathing dot for live states. */\nexport function SessionStatus({ status, label, size = \"md\", className }: SessionStatusProps) {\n const meta = SESSION_STATUS_META[status];\n return (\n <span\n data-status={status}\n className={cn(\n \"og-root inline-flex shrink-0 items-center rounded-full border font-medium\",\n size === \"sm\" ? \"gap-1 px-1.5 py-px text-og-xs\" : \"gap-1.5 px-2 py-0.5 text-xs\",\n meta.badgeClassName,\n className,\n )}\n >\n <StatusDot status={status} className={size === \"sm\" ? \"size-1\" : \"size-1.5\"} />\n {label ?? meta.label}\n </span>\n );\n}\n\nexport type StatusDotProps = {\n status: SessionStatusValue;\n className?: string | undefined;\n};\n\n/** Just the dot — for dense rows and tiles. */\nexport function StatusDot({ status, className }: StatusDotProps) {\n const meta = SESSION_STATUS_META[status];\n return (\n <span\n className={cn(\n \"relative inline-flex size-1.5 shrink-0 rounded-full\",\n meta.dotClassName,\n className,\n )}\n >\n {meta.pulse ? (\n <span className={cn(\"absolute inset-0 animate-og-pulse rounded-full\", meta.dotClassName)} />\n ) : null}\n </span>\n );\n}\n","import type { SessionEvent, SessionStatus } from \"@opengeni/sdk\";\nimport {\n ArrowDownIcon,\n ArrowRightIcon,\n BotIcon,\n CheckCircle2Icon,\n CheckIcon,\n ChevronRightIcon,\n PauseCircleIcon,\n PauseIcon,\n PencilLineIcon,\n PlayIcon,\n RefreshCwIcon,\n TargetIcon,\n Trash2Icon,\n TriangleAlertIcon,\n XCircleIcon,\n} from \"lucide-react\";\nimport type { ComponentType } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Collapsible } from \"radix-ui\";\nimport {\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { formatRelativeTime, truncate } from \"../lib/format\";\nimport { Markdown } from \"./markdown\";\nimport {\n ActivityRail,\n buildTimeline,\n defaultToolRegistry,\n groupTimeline,\n LightboxProvider,\n type ActivityItem,\n type AgentMessageItem,\n type AuthNeededItem,\n type GoalItem,\n type NoticeItem,\n type TimelineGroup,\n type TimelineItem,\n type ToolRegistry,\n type UserMessageItem,\n type WorkerCompletionItem,\n TurnSummary,\n} from \"../timeline\";\nimport { SESSION_STATUS_META, StatusDot } from \"./session-status\";\nimport { EntranceAnimationProvider, useEntranceAnimation } from \"../timeline/entrance\";\n\nexport type MessageTimelineProps = {\n /** Raw session events (projected internally) … */\n events?: SessionEvent[] | undefined;\n /** … or pre-projected items (e.g. from `useSessionEvents().timeline`). */\n items?: TimelineItem[] | undefined;\n /** Current session status; drives the live \"working\" indicator. */\n status?: SessionStatus | null | undefined;\n /** Plug a markdown renderer for message bodies (e.g. streamdown). */\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n /** Drill into a spawned worker session. */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n /**\n * Deep-link a memory row (a `memory.saved` / `memory.corrected` step) to its\n * record in the host's memory pane. Opt-in, exactly like `onReconnect`: the\n * library draws no \"View in memory\" affordance without a handler — the memory\n * row is then non-interactive rich content. This is the switch that makes the\n * deep-link a first-party OpenGeni capability without other SDK consumers\n * opting into it. The app supplies it (it owns routing to the memory pane).\n */\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n /**\n * Start the reconnect flow when a tool needs its connection reauthorized. The\n * app supplies this (it owns the SDK client + workspace): it typically kicks\n * off `startConnectionOAuth` and redirects, or routes to credential entry.\n * Rejecting surfaces a calm inline error on the card; the library never draws\n * a Reconnect button without a handler to run it.\n */\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n /**\n * Resolve a provider domain (from a reconnect card) to a logo URL the host\n * serves itself — the app maps it through its catalog + `catalogAssetUrl`.\n * Return null/undefined to fall back to a calm monogram. The library never\n * fetches an off-origin favicon (CSP + privacy); an unresolved logo is a\n * monogram, not an external image.\n */\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n /**\n * The tool-renderer registry that resolves how each tool call is drawn.\n * Defaults to {@link defaultToolRegistry}; pass a registry from\n * `createDefaultToolRegistry({ entries })` to add custom tool renderers.\n */\n toolRegistry?: ToolRegistry | undefined;\n /** Follow new events when pinned to the bottom. Defaults to true. */\n autoFollow?: boolean | undefined;\n /** Older durable history exists above the current window (see useSessionEvents). */\n hasOlder?: boolean | undefined;\n /** An older window is being fetched; shows the quiet top shimmer. */\n loadingOlder?: boolean | undefined;\n /** Called when the reader nears the top and older history should backfill. */\n onLoadOlder?: (() => void) | undefined;\n emptyState?: ReactNode | undefined;\n className?: string | undefined;\n};\n\nconst INITIAL_MOUNTED_GROUPS = 1;\n\n/**\n * The session timeline: chat messages with streaming deltas, collapsed\n * activity clusters (reasoning, tool calls, sandbox work), spawned-worker\n * cards, goal markers, and status transitions. Owns stick-to-bottom scrolling\n * with a \"jump to latest\" affordance when the reader scrolls back.\n */\nexport function MessageTimeline({\n events,\n items,\n status,\n renderMessageText,\n onOpenSession,\n onMemoryClick,\n onReconnect,\n resolveProviderLogo,\n toolRegistry = defaultToolRegistry,\n autoFollow = true,\n hasOlder = false,\n loadingOlder = false,\n onLoadOlder,\n emptyState,\n className,\n}: MessageTimelineProps) {\n const resolvedItems = useMemo(() => items ?? buildTimeline(events ?? []), [items, events]);\n const allGroups = useMemo(() => groupTimeline(resolvedItems), [resolvedItems]);\n const keyedGroups = useStableTimelineGroupKeys(allGroups);\n const { mountedGroups: groups, mountingOlderGroups } = useProgressivelyMountedGroups(keyedGroups);\n const firstGroupKey = allGroups[0] ? timelineGroupKey(allGroups[0]) : null;\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const topSentinelRef = useRef<HTMLDivElement | null>(null);\n const previousBulkFirstKeyRef = useRef<string | null | undefined>(undefined);\n const [pinned, setPinned] = useState(true);\n const [bulkActive, setBulkActive] = useState(true);\n // Content stays invisible until its first bottom-anchored frame, so a flash\n // of the window's TOP while a large timeline lays out across commits is\n // structurally impossible — the reader only ever sees it already at the\n // bottom. An empty timeline reveals immediately (there is nothing to anchor).\n const [revealed, setRevealed] = useState(false);\n // Our own scrollTop assignments echo back as delayed scroll events. Keep the\n // ordered, clamped targets rather than only the latest one: successive\n // ResizeObserver corrections can queue several echoes before the browser\n // dispatches them. If reader input lands at a different position, its value\n // wins and clears the pending echoes. A matching echo must not recapture the\n // visual anchor while progressive prepend is still mounting older rows.\n const programmaticScrollTargetsRef = useRef<number[]>([]);\n const assignScrollTop = useCallback((node: HTMLElement, value: number) => {\n const previous = node.scrollTop;\n node.scrollTop = value;\n if (node.scrollTop === previous) {\n return;\n }\n const pending = programmaticScrollTargetsRef.current;\n pending.push(node.scrollTop);\n if (pending.length > 32) {\n pending.splice(0, pending.length - 32);\n }\n }, []);\n // Mirror `pinned` into a ref so the ResizeObserver callback (a stable closure)\n // always reads the live value without re-subscribing on every scroll.\n const pinnedRef = useRef(true);\n // The reader's visual anchor: the topmost still-visible timeline element and\n // its offset from the viewport top. Recaptured on scroll and after every\n // height change, it lets us hold the reader's position when content above the\n // viewport expands or collapses (e.g. a turn folds when it settles).\n const anchorRef = useRef<{ el: Element; top: number } | null>(null);\n const lastItem = resolvedItems[resolvedItems.length - 1];\n const streaming =\n lastItem !== undefined &&\n (lastItem.kind === \"agent-message\" || lastItem.kind === \"reasoning\") &&\n lastItem.streaming;\n const working = status === \"running\" && !streaming;\n // Bulk paints (the initial tail window, a prepended older window — detected\n // by the first group key changing) must not run per-row entrance animations.\n const firstKeyChangedForBulk =\n previousBulkFirstKeyRef.current !== undefined &&\n previousBulkFirstKeyRef.current !== firstGroupKey;\n const bulkRender =\n allGroups.length > 0 && (bulkActive || firstKeyChangedForBulk || mountingOlderGroups);\n\n // Snapshot the topmost visible element and where it sits in the viewport, so a\n // later reflow can restore it to the same spot. Prefer durable row wrappers\n // over their containing group: an older activity item can merge into the\n // existing group, leaving that outer group in place while shifting every row\n // after the insertion. Transient chrome (the backfill sentinel and shimmer) is\n // skipped — anchoring to a row that unmounts when the older window lands would\n // drop the correction mid-prepend.\n const captureAnchor = useCallback(() => {\n const node = scrollRef.current;\n const inner = node?.firstElementChild;\n if (!node || !inner) {\n anchorRef.current = null;\n return;\n }\n const containerTop = node.getBoundingClientRect().top;\n const findVisible = (selector: string): Element | null => {\n for (const candidate of inner.querySelectorAll(selector)) {\n if (candidate instanceof HTMLElement && candidate.dataset.ogTimelineChrome !== undefined) {\n continue;\n }\n const rect = candidate.getBoundingClientRect();\n if (rect.bottom > containerTop + 1 && rect.height > 0) {\n return candidate;\n }\n }\n return null;\n };\n const anchor =\n findVisible(\"[data-og-timeline-row-anchor]\") ??\n findVisible(\"[data-og-timeline-group-anchor]\");\n if (anchor) {\n const rect = anchor.getBoundingClientRect();\n anchorRef.current = { el: anchor, top: rect.top - containerTop };\n return;\n }\n anchorRef.current = null;\n }, []);\n\n // Restore the user-owned anchor synchronously after React commits a frame.\n // ResizeObserver remains a late-measurement fallback, but progressive history\n // frames must be corrected before the browser can paint an intermediate jump.\n const restoreAnchor = useCallback(\n (node: HTMLElement) => {\n if (autoFollow && pinnedRef.current) {\n assignScrollTop(node, node.scrollHeight);\n return;\n }\n const anchor = anchorRef.current;\n if (!anchor || !anchor.el.isConnected) {\n return;\n }\n const containerTop = node.getBoundingClientRect().top;\n const now = anchor.el.getBoundingClientRect().top - containerTop;\n const diff = now - anchor.top;\n if (diff !== 0) {\n assignScrollTop(node, node.scrollTop + diff);\n }\n },\n [assignScrollTop, autoFollow],\n );\n\n // A LAYOUT effect so the very first paint of a freshly loaded session is\n // already anchored at the bottom — no visible traversal down the history.\n useLayoutEffect(() => {\n const node = scrollRef.current;\n if (node) {\n restoreAnchor(node);\n }\n if (!revealed && groups.length > 0) {\n setRevealed(true);\n }\n }, [resolvedItems, working, revealed, groups.length, restoreAnchor]);\n\n // A cleared timeline (stream identity change) re-arms the reveal so the next\n // session also first paints at its bottom.\n useLayoutEffect(() => {\n if (allGroups.length === 0 && revealed) {\n setRevealed(false);\n }\n }, [allGroups.length, revealed]);\n\n // Clear the bulk-paint marker a frame after it renders, so rows appended\n // live (streams, new turns) animate exactly as before.\n useLayoutEffect(() => {\n previousBulkFirstKeyRef.current = firstGroupKey;\n if (!bulkRender) {\n return;\n }\n setBulkActive(true);\n // Initial tails and prepended history mount from newest to oldest across\n // frames. Keep every row born during that bulk window animation-free; only\n // clear the marker after the authoritative group list is fully mounted.\n if (mountingOlderGroups) {\n return;\n }\n const frame = requestFrame(() => setBulkActive(false));\n return () => cancelFrame(frame);\n }, [bulkRender, firstGroupKey, mountingOlderGroups]);\n\n // Prefetch older history well before the reader reaches the top: the\n // sentinel sits above the first group and trips 1600px early, so backfill\n // is usually rendered (and anchored by the ResizeObserver below) before the\n // top of the window ever becomes visible.\n useEffect(() => {\n const root = scrollRef.current;\n const target = topSentinelRef.current;\n if (\n !root ||\n !target ||\n mountingOlderGroups ||\n !hasOlder ||\n loadingOlder ||\n !onLoadOlder ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n onLoadOlder();\n }\n },\n { root, rootMargin: \"1600px 0px 0px 0px\" },\n );\n observer.observe(target);\n return () => observer.disconnect();\n }, [hasOlder, loadingOlder, onLoadOlder, firstGroupKey, mountingOlderGroups]);\n\n // Scroll anchoring: when the content reflows (a fold expands/collapses, a\n // stream appends), keep following the bottom if pinned; otherwise pin the\n // reader's anchor in place. A change ABOVE the anchor shifts its viewport\n // offset — we correct scrollTop by that shift so the reader never gets yanked.\n // A change BELOW the anchor (a bottom append while scrolled up) leaves the\n // anchor put, so `diff` is 0 and we leave scrollTop alone.\n useEffect(() => {\n const node = scrollRef.current;\n const inner = node?.firstElementChild;\n if (!node || !inner || typeof ResizeObserver === \"undefined\") {\n return;\n }\n const observer = new ResizeObserver(() => {\n const current = scrollRef.current;\n if (!current) {\n return;\n }\n restoreAnchor(current);\n });\n observer.observe(inner);\n return () => observer.disconnect();\n }, [restoreAnchor]);\n\n const onScroll = () => {\n const node = scrollRef.current;\n if (!node) {\n return;\n }\n const pending = programmaticScrollTargetsRef.current;\n const programmaticIndex = pending.findIndex((target) => Math.abs(node.scrollTop - target) <= 1);\n const programmatic = programmaticIndex >= 0;\n if (programmatic) {\n pending.splice(0, programmaticIndex + 1);\n } else {\n // A real reader scroll supersedes every delayed programmatic echo.\n pending.length = 0;\n }\n const nextPinned = node.scrollHeight - node.scrollTop - node.clientHeight < 48;\n // Echoes of our own assignments may PIN but never UNPIN — only the reader\n // scrolling away releases the bottom-follow.\n if (nextPinned || !programmatic) {\n pinnedRef.current = nextPinned;\n setPinned(nextPinned);\n }\n // The assignment site already captured the corrected anchor. Recapturing\n // it from a delayed echo can observe the next prepended row before that\n // row's ResizeObserver correction and make the viewport walk up the page.\n if (!programmatic) {\n captureAnchor();\n }\n };\n\n return (\n <LightboxProvider>\n <EntranceAnimationProvider value={!bulkRender}>\n <div className={cn(\"og-root relative flex min-h-0 flex-col\", className)}>\n {/* overflow-anchor off: the browser's native scroll anchoring would fight\n the ResizeObserver corrections above — one authority only. */}\n <div\n ref={scrollRef}\n onScroll={onScroll}\n style={groups.length > 0 && !revealed ? { visibility: \"hidden\" } : undefined}\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 py-6 [overflow-anchor:none] sm:px-6\"\n >\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-5\">\n {groups.length === 0 && !working\n ? (emptyState ?? (\n <p className=\"py-10 text-center text-sm text-og-fg-subtle\">No activity yet.</p>\n ))\n : null}\n {hasOlder && !mountingOlderGroups ? (\n <div\n ref={topSentinelRef}\n data-og-top-sentinel=\"\"\n data-og-timeline-chrome=\"\"\n aria-hidden=\"true\"\n className=\"h-px w-full shrink-0\"\n />\n ) : null}\n {loadingOlder ? (\n <div data-og-timeline-chrome=\"\" className=\"flex items-center gap-2 text-sm\">\n <span className=\"og-shimmer-text font-medium\">Loading earlier activity…</span>\n </div>\n ) : null}\n {groups.map(({ group, key }, index) => (\n <div key={key} data-og-timeline-group-anchor=\"\">\n <TimelineGroupView\n group={group}\n renderMessageText={renderMessageText}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n onReconnect={onReconnect}\n resolveProviderLogo={resolveProviderLogo}\n toolRegistry={toolRegistry}\n foldLiveCluster={isAgentProgress(groups[index + 1]?.group)}\n />\n </div>\n ))}\n {working ? (\n <div className=\"flex items-center gap-2 text-sm\">\n <span className=\"og-shimmer-text font-medium\">Working…</span>\n </div>\n ) : null}\n </div>\n </div>\n <AnimatePresence>\n {!pinned && autoFollow ? (\n <motion.button\n type=\"button\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n onClick={() => {\n const node = scrollRef.current;\n if (node) {\n node.scrollTo({ top: node.scrollHeight, behavior: \"smooth\" });\n }\n pinnedRef.current = true;\n setPinned(true);\n }}\n className={cn(\n \"absolute bottom-4 left-1/2 -translate-x-1/2\",\n \"inline-flex items-center gap-1.5 rounded-full border border-og-border bg-og-surface-3/90 px-3 py-1.5\",\n \"text-xs font-medium text-og-fg shadow-og-md backdrop-blur\",\n \"hover:border-og-border-strong\",\n )}\n >\n <ArrowDownIcon className=\"size-3.5\" />\n Jump to latest\n </motion.button>\n ) : null}\n </AnimatePresence>\n </div>\n </EntranceAnimationProvider>\n </LightboxProvider>\n );\n}\n\ntype MountedGroupWindow = {\n groupKeys: string[];\n visibleStart: number;\n};\n\ntype KeyedTimelineGroup = {\n group: TimelineGroup;\n key: string;\n};\n\n/**\n * Projection can legitimately change a group's content-derived key while\n * retaining its existing rows. The common pagination case is an older activity\n * item merging into the first activity group; live appends grow the same group\n * from the other side. Match the new authoritative groups to the previous\n * committed groups by their durable item IDs so both the React key and the\n * progressive-window anchor survive either change.\n */\nfunction useStableTimelineGroupKeys(allGroups: TimelineGroup[]): KeyedTimelineGroup[] {\n const previousRef = useRef<KeyedTimelineGroup[]>([]);\n const keyedGroups = useMemo(() => {\n const previousByItemId = new Map<string, KeyedTimelineGroup>();\n for (const previous of previousRef.current) {\n for (const itemId of timelineGroupItemIds(previous.group)) {\n previousByItemId.set(itemId, previous);\n }\n }\n\n const usedKeys = new Set<string>();\n return allGroups.map((group, index) => {\n const itemIds = timelineGroupItemIds(group);\n let retainedKey: string | undefined;\n for (const itemId of itemIds) {\n const previous = previousByItemId.get(itemId);\n if (previous && !usedKeys.has(previous.key)) {\n retainedKey = previous.key;\n break;\n }\n }\n\n const canonicalKey = timelineGroupKey(group);\n let key = retainedKey ?? canonicalKey;\n let collision = 0;\n while (usedKeys.has(key)) {\n key = `${canonicalKey}:${index}:${collision}`;\n collision += 1;\n }\n usedKeys.add(key);\n return { group, key };\n });\n }, [allGroups]);\n\n useLayoutEffect(() => {\n previousRef.current = keyedGroups;\n }, [keyedGroups]);\n\n return keyedGroups;\n}\n\n/**\n * Bulk history is already projected into its authoritative order before this\n * hook runs. Mount its newest group first, then prepend one older group per\n * animation frame so low-end browsers can paint and service input between\n * React/Markdown commits instead of doing the entire tail in one long task.\n *\n * A live append does not move the first mounted key, so it is included\n * immediately in the mounted suffix. A history prepend moves that key deeper\n * in the array; shifting `visibleStart` by that exact prefix keeps every\n * existing row mounted while the new prefix is revealed. If projection\n * coalesces the seam item itself away, the earliest surviving mounted key\n * provides the same anchor. Replacements with no shared mounted key (for\n * example a session switch or clear-view) start a fresh suffix.\n */\nfunction useProgressivelyMountedGroups(allGroups: KeyedTimelineGroup[]): {\n mountedGroups: KeyedTimelineGroup[];\n mountingOlderGroups: boolean;\n} {\n const previousGroupKeysRef = useRef<string[]>([]);\n const groupKeys = useMemo(() => {\n const nextKeys = allGroups.map((group) => group.key);\n const previousKeys = previousGroupKeysRef.current;\n return nextKeys.length === previousKeys.length &&\n nextKeys.every((key, index) => key === previousKeys[index])\n ? previousKeys\n : nextKeys;\n }, [allGroups]);\n useLayoutEffect(() => {\n previousGroupKeysRef.current = groupKeys;\n }, [groupKeys]);\n const [window, setWindow] = useState<MountedGroupWindow>(() => ({\n groupKeys,\n visibleStart: Math.max(0, allGroups.length - INITIAL_MOUNTED_GROUPS),\n }));\n\n const lastPossibleStart = Math.max(0, allGroups.length - INITIAL_MOUNTED_GROUPS);\n let visibleStart = 0;\n if (allGroups.length > 0) {\n const currentIndexByKey = new Map(groupKeys.map((key, index) => [key, index]));\n let retainedStart: number | undefined;\n for (const key of window.groupKeys.slice(window.visibleStart)) {\n const index = currentIndexByKey.get(key);\n if (index !== undefined) {\n retainedStart = index;\n break;\n }\n }\n visibleStart =\n retainedStart === undefined ? lastPossibleStart : Math.min(retainedStart, lastPossibleStart);\n }\n\n useEffect(() => {\n // Synchronize a prepend/replacement before scheduling its first reveal.\n if (window.groupKeys !== groupKeys || window.visibleStart !== visibleStart) {\n setWindow({ groupKeys, visibleStart });\n return;\n }\n if (visibleStart === 0) {\n return;\n }\n const frame = requestFrame(() => {\n setWindow((current) =>\n current.groupKeys === groupKeys && current.visibleStart > 0\n ? { ...current, visibleStart: current.visibleStart - 1 }\n : current,\n );\n });\n return () => cancelFrame(frame);\n }, [groupKeys, visibleStart, window.groupKeys, window.visibleStart]);\n\n return {\n mountedGroups: allGroups.slice(visibleStart),\n mountingOlderGroups: visibleStart > 0,\n };\n}\n\nfunction requestFrame(callback: FrameRequestCallback): number {\n if (typeof requestAnimationFrame === \"function\") {\n return requestAnimationFrame(callback);\n }\n return window.setTimeout(() => callback(performance.now()), 16);\n}\n\nfunction cancelFrame(id: number): void {\n if (typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(id);\n return;\n }\n window.clearTimeout(id);\n}\n\n// Progressive history mounting reuses the exact group objects from `allGroups`.\n// Skip repainting those stable rows on every prefix reveal; live projection\n// creates a new group object, and behavior/callback changes are separate props,\n// so ordinary streaming and host updates still invalidate immediately.\nconst TimelineGroupView = memo(function TimelineGroupView({\n group,\n renderMessageText,\n onOpenSession,\n onMemoryClick,\n onReconnect,\n resolveProviderLogo,\n toolRegistry,\n insideTurn = false,\n foldLiveCluster = false,\n}: {\n group: TimelineGroup;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n toolRegistry: ToolRegistry;\n /** A completed cluster of a still-RUNNING turn (not the live tail) folds\n behind a neutral chip — the one place activity without an outcome still\n folds, bounding the DOM of days-long autonomous turns. */\n foldLiveCluster?: boolean;\n /** Rendering inside an expanded turn group: the outer chip already owns the\n failure surface, so nested chips stay tinted but quiet (no repeated\n failure text, no auto-open) — one loud error, N calm sub-expands. */\n insideTurn?: boolean;\n}) {\n switch (group.kind) {\n case \"activity\":\n return group.outcome || (foldLiveCluster && clusterIsSettled(group)) ? (\n <TurnSummary\n items={group.items}\n outcome={group.outcome}\n failureText={insideTurn ? undefined : group.failureText}\n defaultOpen={!insideTurn && group.outcome === \"failed\" ? true : undefined}\n bare={insideTurn}\n >\n <ActivityRail\n items={group.items}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n toolRegistry={toolRegistry}\n bare={insideTurn}\n />\n </TurnSummary>\n ) : (\n // A nested live cluster hangs on the turn's rail (bare); a top-level one\n // owns its own rail.\n <ActivityRail\n items={group.items}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n toolRegistry={toolRegistry}\n bare={insideTurn}\n />\n );\n case \"turn\": {\n const activityItems = flattenActivityItems(group.groups);\n const body = group.groups.map((child) => (\n <TimelineGroupView\n key={timelineGroupKey(child)}\n group={child}\n renderMessageText={renderMessageText}\n onOpenSession={onOpenSession}\n onMemoryClick={onMemoryClick}\n onReconnect={onReconnect}\n resolveProviderLogo={resolveProviderLogo}\n toolRegistry={toolRegistry}\n insideTurn\n />\n ));\n return (\n <TurnSummary\n items={activityItems}\n outcome={group.outcome}\n // One loud error at the top; nested sub-turn chips stay calm — the\n // parent already renders the failure reason, so clear it here exactly\n // as the nested activity-cluster case does.\n failureText={insideTurn ? undefined : group.failureText}\n durationMs={durationBetween(group.startedAt, group.endedAt)}\n defaultOpen={!insideTurn && group.outcome === \"failed\" ? true : undefined}\n bare={insideTurn}\n >\n {insideTurn ? (\n // A nested turn is already on an ancestor rail — its body just stacks\n // flush (the bare-node body already indents it), so no second rule.\n <div className=\"flex flex-col gap-4\">{body}</div>\n ) : (\n // The top-level turn draws THE rail: one thin continuous rule that\n // every nested node and step hangs off of.\n <div className=\"flex flex-col gap-4 border-l-2 border-og-border pl-3 sm:pl-4\">\n {body}\n </div>\n )}\n </TurnSummary>\n );\n }\n case \"item\":\n return (\n <TimelineRow\n item={group.item}\n renderMessageText={renderMessageText}\n onReconnect={onReconnect}\n resolveProviderLogo={resolveProviderLogo}\n onOpenSession={onOpenSession}\n />\n );\n }\n});\n\nfunction timelineGroupKey(group: TimelineGroup): string {\n switch (group.kind) {\n case \"item\":\n return group.item.id;\n case \"activity\":\n return group.id;\n case \"turn\":\n return group.id;\n }\n}\n\nfunction timelineGroupItemIds(group: TimelineGroup): string[] {\n switch (group.kind) {\n case \"item\":\n return [group.item.id];\n case \"activity\":\n return group.items.map((item) => item.id);\n case \"turn\":\n return group.groups.flatMap(timelineGroupItemIds);\n }\n}\n\n/** The agent has moved PAST a cluster only when what follows is more agent\n progress — new activity, a settled turn, or narration. A waiting notice\n (approval pause), a pending queued message, a goal pill, or nothing at all\n do NOT advance the story, and folding on them would hide exactly the work\n the reader needs in view. */\nfunction isAgentProgress(next: TimelineGroup | undefined): boolean {\n if (!next) {\n return false;\n }\n return (\n next.kind === \"activity\" ||\n next.kind === \"turn\" ||\n (next.kind === \"item\" && next.item.kind === \"agent-message\")\n );\n}\n\n/** No item still running or streaming — the only state safe to fold live.\n Position alone is a broken proxy: a pending queued message (or any trailing\n item) can sit after the ACTIVE cluster, which must never fold mid-work. */\nfunction clusterIsSettled(group: Extract<TimelineGroup, { kind: \"activity\" }>): boolean {\n return group.items.every((item) => {\n if (item.kind === \"reasoning\") {\n return !item.streaming;\n }\n // Memory writes and fleet observations are discrete, already-settled events.\n if (item.kind === \"memory\" || item.kind === \"fleet-decision\") {\n return true;\n }\n return item.status !== \"running\";\n });\n}\n\nfunction flattenActivityItems(groups: TimelineGroup[]): ActivityItem[] {\n const items: ActivityItem[] = [];\n for (const group of groups) {\n if (group.kind === \"activity\") {\n items.push(...group.items);\n } else if (group.kind === \"turn\") {\n items.push(...flattenActivityItems(group.groups));\n }\n }\n return items;\n}\n\nfunction durationBetween(startedAt: string, endedAt: string): number | undefined {\n const started = Date.parse(startedAt);\n const ended = Date.parse(endedAt);\n if (!Number.isFinite(started) || !Number.isFinite(ended) || ended < started) {\n return undefined;\n }\n return ended - started;\n}\n\n/* --- single rows ------------------------------------------------------------ */\n\n/**\n * Render one non-activity timeline item (chat message, status divider, goal\n * landmark, notice). Exported so the component demo draws the EXACT same rows as\n * the live app — no forked bubble/goal markup.\n */\nexport function TimelineRow({\n item,\n renderMessageText,\n onReconnect,\n resolveProviderLogo,\n onOpenSession,\n}: {\n item: TimelineItem;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n switch (item.kind) {\n case \"user-message\":\n return <UserMessageRow item={item} renderMessageText={renderMessageText} />;\n case \"agent-message\":\n return <AgentMessageRow item={item} renderMessageText={renderMessageText} />;\n case \"worker-completion\":\n return <WorkerCompletionRow item={item} onOpenSession={onOpenSession} />;\n case \"session-status\":\n return <SessionStatusRow item={item} />;\n case \"goal\":\n return <GoalRow item={item} />;\n case \"notice\":\n return <NoticeRow item={item} />;\n case \"auth-needed\":\n return (\n <AuthNeededRow\n item={item}\n onReconnect={onReconnect}\n resolveProviderLogo={resolveProviderLogo}\n />\n );\n default:\n return null;\n }\n}\n\nfunction UserMessageRow({\n item,\n renderMessageText,\n}: {\n item: UserMessageItem;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n}) {\n const enter = useEntranceAnimation();\n return (\n <div className={cn(enter && \"animate-og-enter\", \"flex justify-end\")}>\n <div className=\"flex max-w-[85%] min-w-0 flex-col items-end gap-1\">\n <div className=\"w-fit max-w-full min-w-0 rounded-og-lg rounded-br-og-xs border border-og-border bg-og-surface-2 px-4 py-2.5 text-og-md leading-6 text-og-fg\">\n {renderMessageText ? (\n renderMessageText(item.text, item)\n ) : (\n <Markdown>{item.text}</Markdown>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction AgentMessageRow({\n item,\n renderMessageText,\n}: {\n item: AgentMessageItem;\n renderMessageText?:\n | ((text: string, item: AgentMessageItem | UserMessageItem) => ReactNode)\n | undefined;\n}) {\n const enter = useEntranceAnimation();\n const caret = item.streaming ? (\n <span\n className=\"ml-0.5 inline-block h-[1.1em] w-[2px] translate-y-[3px] animate-og-blink rounded-full bg-og-accent\"\n aria-hidden\n />\n ) : null;\n return (\n <div className={cn(enter && \"animate-og-enter\", \"min-w-0 text-og-md leading-7 text-og-fg\")}>\n {renderMessageText ? (\n <>\n {renderMessageText(item.text, item)}\n {caret}\n </>\n ) : (\n // While streaming, let the caret ride the end of the last rendered line:\n // the trailing block (usually a <p>) flows inline so the caret sits on\n // its baseline instead of dropping to a new line.\n <div className={item.streaming ? \"[&_>div>:last-child]:inline\" : undefined}>\n <Markdown>{item.text}</Markdown>\n {caret}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * A worker session reporting back to its manager. The child's completion arrives\n * as a `user.message` carrying a `childCompletion` payload (the raw message text\n * used to render as an \"ugly\" user bubble); it projects to a `worker-completion`\n * item and draws here as a quietly-confident card — an inbound result, not\n * something the human said. One glyph + one line carry the outcome; the worker's\n * full report, evidence, and any paused reason live behind a collapsed\n * disclosure, and a \"View session\" affordance deep-links into the child.\n *\n * Color follows the timeline's restraint: green only for a completed goal, the\n * waiting hue only for a paused one, red only for a failed child — everything\n * else is a neutral inbound card.\n */\ntype WorkerCompletionMeta = {\n label: string;\n icon: ComponentType<{ className?: string }>;\n iconClass: string;\n /** The 2px left-accent hue — color spent only on the exceptional outcomes. */\n accentClass: string;\n};\n\nfunction workerCompletionMeta(item: WorkerCompletionItem): WorkerCompletionMeta {\n if (item.childStatus === \"failed\") {\n return {\n label: \"Worker failed\",\n icon: XCircleIcon,\n iconClass: \"text-og-status-failed\",\n accentClass: \"border-og-status-failed/60\",\n };\n }\n if (item.goalStatus === \"paused\") {\n return {\n label: \"Worker paused\",\n icon: PauseCircleIcon,\n iconClass: \"text-og-status-waiting\",\n accentClass: \"border-og-status-waiting/50\",\n };\n }\n if (item.goalStatus === \"completed\") {\n return {\n label: \"Worker completed\",\n icon: CheckCircle2Icon,\n iconClass: \"text-og-status-idle\",\n accentClass: \"border-og-status-idle/45\",\n };\n }\n return {\n label: \"Worker reported back\",\n icon: BotIcon,\n iconClass: \"text-og-accent\",\n accentClass: \"border-og-border-strong\",\n };\n}\n\nfunction WorkerCompletionRow({\n item,\n onOpenSession,\n}: {\n item: WorkerCompletionItem;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n const enter = useEntranceAnimation();\n const [open, setOpen] = useState(false);\n const meta = workerCompletionMeta(item);\n const Icon = meta.icon;\n // The worker's own report is the substance behind the fold; evidence and any\n // paused reason sit alongside it as quieter, labelled context.\n // \"Paused because\" only when the outcome actually IS a pause — completion\n // payloads can carry a leftover pausedReason/rationale from earlier in the\n // worker's life, and a \"Worker completed\" card must not show a pause section.\n const showPausedReason =\n item.childStatus !== \"failed\" &&\n item.goalStatus === \"paused\" &&\n Boolean(item.pausedReason?.trim());\n const details: { label: string; value: string; muted?: boolean }[] = [\n ...(item.text.trim() ? [{ label: \"Report\", value: item.text.trim() }] : []),\n ...(item.evidence?.trim()\n ? [{ label: \"Evidence\", value: item.evidence.trim(), muted: true }]\n : []),\n ...(showPausedReason\n ? [{ label: \"Paused because\", value: item.pausedReason!.trim(), muted: true }]\n : []),\n ];\n const hasDetails = details.length > 0;\n return (\n <div className={cn(enter && \"animate-og-enter\", \"min-w-0\")}>\n {/* An inbound result, not a bubble: a 2px left accent carries the outcome —\n no full frame, no surface fill. The report unfolds flush beneath. */}\n <div className={cn(\"flex flex-col gap-2 border-l-2 pl-3\", meta.accentClass)}>\n <div className=\"flex items-start gap-2.5\">\n <span className={cn(\"mt-0.5 shrink-0\", meta.iconClass)}>\n <Icon className=\"size-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-og-base leading-5 text-og-fg\">\n <span className=\"font-medium\">{meta.label}</span>\n {item.goalText ? (\n <span className=\"text-og-fg-muted\"> · {truncate(item.goalText, 90)}</span>\n ) : null}\n </p>\n </div>\n {item.childSessionId && onOpenSession ? (\n <button\n type=\"button\"\n onClick={() => onOpenSession(item.childSessionId)}\n className={cn(\n \"-my-0.5 -mr-1 inline-flex shrink-0 items-center gap-1 rounded-og-sm px-2 py-1 text-og-sm font-medium text-og-fg-muted pointer-coarse:py-2\",\n \"outline-none transition-colors duration-150 hover:bg-og-surface-2 hover:text-og-fg\",\n \"focus-visible:ring-2 focus-visible:ring-og-accent\",\n )}\n >\n View session\n <ArrowRightIcon className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n {hasDetails ? (\n <Collapsible.Root open={open} onOpenChange={setOpen}>\n <Collapsible.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"group/wc -mx-1 inline-flex w-fit items-center gap-1 rounded-og-sm px-1 py-0.5 text-og-xs font-medium text-og-fg-subtle\",\n \"outline-none transition-colors duration-150 hover:text-og-fg-muted focus-visible:ring-2 focus-visible:ring-og-accent\",\n )}\n >\n <ChevronRightIcon className=\"size-3 transition-transform duration-150 ease-og-in-out group-data-[state=open]/wc:rotate-90\" />\n {open ? \"Hide details\" : \"Show details\"}\n </button>\n </Collapsible.Trigger>\n <Collapsible.Content className=\"overflow-hidden data-[state=closed]:animate-og-collapse data-[state=open]:animate-og-expand\">\n <div className=\"ml-1 mt-1.5 flex flex-col gap-2.5\">\n {details.map((detail) => (\n <div key={detail.label} className=\"min-w-0\">\n <p className=\"mb-1 text-og-xs font-medium uppercase tracking-[0.08em] text-og-fg-subtle\">\n {detail.label}\n </p>\n <p\n className={cn(\n \"whitespace-pre-wrap break-words text-og-sm leading-6\",\n detail.muted ? \"text-og-fg-subtle\" : \"text-og-fg-muted\",\n )}\n >\n {detail.value}\n </p>\n </div>\n ))}\n </div>\n </Collapsible.Content>\n </Collapsible.Root>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction SessionStatusRow({ item }: { item: { status: SessionStatus; occurredAt: string } }) {\n const enter = useEntranceAnimation();\n const meta = SESSION_STATUS_META[item.status];\n return (\n <div\n className={cn(\n enter && \"animate-og-enter\",\n \"flex items-center gap-3 text-og-xs text-og-fg-subtle\",\n )}\n role=\"status\"\n >\n <span className=\"h-px flex-1 bg-og-border\" />\n <span className=\"inline-flex items-center gap-1.5\">\n <StatusDot status={item.status} className=\"size-1\" />\n {meta.label.toLowerCase()} · {formatRelativeTime(item.occurredAt)}\n </span>\n <span className=\"h-px flex-1 bg-og-border\" />\n </div>\n );\n}\n\n/**\n * The per-action presentation of a goal landmark pill. Each of the six goal\n * actions reads distinctly, but the palette stays quiet — color is spent only on\n * the two states that genuinely earn it, the rest are neutral pills set apart by\n * their glyph alone:\n *\n * completed success green (status-idle) check — the only \"done\" hue\n * paused attention waiting-tinted pause — a held goal asks to resume\n * set a landmark a quiet accent target — opening a fresh goal\n * resumed forward neutral play — motion picking back up\n * updated a revision neutral pencil — the goal text changed\n * continuation steady on neutral arrow — still tracking the same goal\n *\n * The pill class is the established badge convention (`text-X border-X/30\n * bg-X/10`); neutral actions reuse the surface/border tokens so a clean run of\n * landmarks stays calm rather than a row of colored chips.\n */\ntype GoalMeta = { label: string; pill: string; icon: ComponentType<{ className?: string }> };\n\nconst NEUTRAL_PILL = \"border-og-border bg-og-surface-1 text-og-fg-muted\";\n\nconst GOAL_META: Record<GoalItem[\"action\"], GoalMeta> = {\n set: {\n label: \"Goal set\",\n pill: \"border-og-accent/30 bg-og-accent/10 text-og-accent\",\n icon: TargetIcon,\n },\n updated: { label: \"Goal updated\", pill: NEUTRAL_PILL, icon: PencilLineIcon },\n completed: {\n label: \"Goal completed\",\n pill: \"border-og-status-idle/30 bg-og-status-idle/10 text-og-status-idle\",\n icon: CheckIcon,\n },\n paused: {\n label: \"Goal paused\",\n pill: \"border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting\",\n icon: PauseIcon,\n },\n resumed: { label: \"Goal resumed\", pill: NEUTRAL_PILL, icon: PlayIcon },\n cleared: { label: \"Goal cleared\", pill: NEUTRAL_PILL, icon: Trash2Icon },\n continuation: { label: \"Continuing toward the goal\", pill: NEUTRAL_PILL, icon: ArrowRightIcon },\n};\n\n/**\n * A goal landmark pill. Resolves its label, accent/tone, and glyph from\n * {@link GOAL_META} so all six actions are visually distinguishable while the\n * palette stays restrained — see that table for the per-action rationale.\n */\nfunction GoalRow({ item }: { item: GoalItem }) {\n const enter = useEntranceAnimation();\n const { label, pill, icon: Icon } = GOAL_META[item.action];\n return (\n <div className={cn(enter && \"animate-og-enter\", \"flex justify-center\")}>\n <span\n className={cn(\n \"inline-flex max-w-full items-center gap-1.5 rounded-full border px-3 py-1 text-og-sm\",\n pill,\n )}\n >\n <Icon className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">\n {label}\n {item.text ? `: ${truncate(item.text, 90)}` : \"\"}\n </span>\n </span>\n </div>\n );\n}\n\nfunction NoticeRow({ item }: { item: NoticeItem }) {\n const enter = useEntranceAnimation();\n const tone =\n item.tone === \"failed\"\n ? \"border-og-status-failed/35 bg-og-status-failed/10 text-og-status-failed\"\n : item.tone === \"waiting\"\n ? \"border-og-status-waiting/35 bg-og-status-waiting/10 text-og-status-waiting\"\n : \"border-og-border bg-og-surface-1 text-og-fg-muted\";\n return (\n <div\n className={cn(\n enter && \"animate-og-enter\",\n \"flex items-start gap-2.5 rounded-og-md border px-3.5 py-2.5 text-sm\",\n tone,\n )}\n role=\"status\"\n >\n <TriangleAlertIcon\n className={cn(\"mt-0.5 size-4 shrink-0\", item.tone === \"cancelled\" && \"opacity-60\")}\n />\n <div className=\"min-w-0 flex-1\">\n <span className=\"whitespace-pre-wrap break-words\">{item.text}</span>\n {item.details ? (\n <details className=\"mt-2 text-xs\">\n <summary className=\"cursor-pointer font-medium\">{item.details.label}</summary>\n <pre className=\"mt-2 max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-og-sm bg-black/5 p-2 font-mono dark:bg-white/5\">\n {JSON.stringify(item.details.value, null, 2)}\n </pre>\n </details>\n ) : null}\n </div>\n {item.action ? (\n <a\n className=\"shrink-0 rounded-og-sm border border-current/25 px-2 py-1 text-xs font-medium hover:bg-current/10\"\n href={item.action.url}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {item.action.label}\n </a>\n ) : null}\n </div>\n );\n}\n\n/**\n * The inline connection-recovery card: missing or lapsed access surfaces as a\n * calm, tappable affordance instead of a raw provider-domain error. The `reason`\n * only shapes human copy; no domain or enum code is shown as a label.\n * `onReconnect` (from the app, which owns the SDK client) starts the flow;\n * without it, a pre-minted authorization link is offered, or the card stays\n * informative. Recovery never claims to resume/replay the failed tool call.\n */\nfunction AuthNeededRow({\n item,\n onReconnect,\n resolveProviderLogo,\n}: {\n item: AuthNeededItem;\n onReconnect?: ((item: AuthNeededItem) => void | Promise<void>) | undefined;\n resolveProviderLogo?: ((providerDomain: string) => string | null | undefined) | undefined;\n}) {\n const enter = useEntranceAnimation();\n const [busy, setBusy] = useState(false);\n const [failed, setFailed] = useState(false);\n const provider = providerLabel(item.providerDomain);\n const unavailable =\n item.reason === \"unsupported_auth\" || item.reason === \"resource_scope_unavailable\";\n const missing = item.reason === \"missing_connection\";\n const actionLabel = missing ? \"Connect\" : \"Reconnect\";\n\n const start = async () => {\n if (!onReconnect || busy) {\n return;\n }\n setBusy(true);\n setFailed(false);\n try {\n // On success the app redirects to consent (or routes to credential entry),\n // so this row unmounts; a resolve without navigation just relaxes the button.\n // The callback starts authorization only. It never resumes this tool call.\n await onReconnect(item);\n setBusy(false);\n } catch {\n setFailed(true);\n setBusy(false);\n }\n };\n\n return (\n <div className={cn(enter && \"animate-og-enter\", \"flex flex-col gap-2\")} role=\"status\">\n <div className=\"flex flex-col gap-3 rounded-og-lg border border-og-border bg-og-surface-1 px-3.5 py-3 sm:flex-row sm:items-center\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <AuthProviderLogo\n src={resolveProviderLogo?.(item.providerDomain) ?? null}\n label={provider}\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-og-md font-medium text-og-fg\">\n {unavailable ? `${provider} tools unavailable` : `${actionLabel} ${provider}`}\n </p>\n <p className=\"truncate text-og-sm text-og-fg-subtle\">{authReasonLine(item.reason)}</p>\n </div>\n </div>\n {!unavailable && onReconnect ? (\n <button\n type=\"button\"\n onClick={() => void start()}\n disabled={busy}\n className={cn(\n \"inline-flex w-full shrink-0 items-center justify-center gap-1.5 rounded-og-md bg-og-accent px-3 py-1.5 text-sm font-medium text-og-accent-fg sm:w-auto\",\n \"transition-colors hover:bg-og-accent-strong disabled:opacity-70 pointer-coarse:min-h-9\",\n )}\n >\n <RefreshCwIcon className={cn(\"size-3.5\", busy && \"animate-og-spin\")} aria-hidden />\n {busy ? \"Opening…\" : actionLabel}\n </button>\n ) : !unavailable && item.authorizationUrl ? (\n <a\n href={item.authorizationUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n className={cn(\n \"inline-flex w-full shrink-0 items-center justify-center gap-1.5 rounded-og-md bg-og-accent px-3 py-1.5 text-sm font-medium text-og-accent-fg sm:w-auto\",\n \"transition-colors hover:bg-og-accent-strong pointer-coarse:min-h-9\",\n )}\n >\n <RefreshCwIcon className=\"size-3.5\" aria-hidden />\n {actionLabel}\n </a>\n ) : null}\n </div>\n {!unavailable ? (\n <p className=\"px-1 text-og-xs text-og-fg-subtle\">\n This tool call wasn't replayed. After {missing ? \"connecting\" : \"reconnecting\"}, send a\n new message to try again.\n </p>\n ) : null}\n {failed ? (\n <p className=\"px-1 text-og-xs text-og-status-failed\">\n Couldn't start {missing ? \"connecting\" : \"reconnecting\"} {provider}. Try again.\n </p>\n ) : null}\n </div>\n );\n}\n\n/**\n * The provider's logo in a rounded tile, from a URL the HOST serves itself\n * (resolved via `resolveProviderLogo` → the app's catalog assets). A missing or\n * failed image falls back to a calm letter monogram — same as the rest of the\n * app — so the card never shows a broken-image glyph and never reaches off-origin\n * for a favicon (CSP + privacy).\n */\nfunction AuthProviderLogo({ src, label }: { src: string | null; label: string }) {\n const [failed, setFailed] = useState(false);\n // A resolver that only returns the URL after a lazy catalog fetch means `src`\n // can arrive on a later render; reset the error latch so it gets its attempt.\n useEffect(() => setFailed(false), [src]);\n const showImage = src && !failed;\n return (\n <span\n className=\"relative flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-og-md border border-og-border bg-og-surface-2 text-sm font-semibold text-og-fg-muted\"\n aria-hidden\n >\n {showImage ? (\n <img\n src={src}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n className=\"size-full object-contain p-1.5\"\n onError={() => setFailed(true)}\n />\n ) : (\n <span>{monogram(label)}</span>\n )}\n </span>\n );\n}\n\n/** First one or two initials for the monogram fallback — mirrors the app's\n `capabilityMonogram` so the reconnect tile reads like every other logo tile. */\nfunction monogram(label: string): string {\n const words = label.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) {\n return \"?\";\n }\n if (words.length === 1) {\n return words[0]!.slice(0, 2).toUpperCase();\n }\n return (words[0]![0]! + words[1]![0]!).toUpperCase();\n}\n\n/** \"linear.app\" -> \"Linear\": the first domain label, capitalized. A calm human\n name for the provider — never the raw domain shown as a label. */\nfunction providerLabel(domain: string): string {\n const host =\n domain\n .trim()\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^www\\./, \"\")\n .split(\"/\")[0] ?? \"\";\n const first = host.split(\".\")[0] ?? host;\n if (!first) {\n return \"this service\";\n }\n return first.charAt(0).toUpperCase() + first.slice(1);\n}\n\n/** A calm, human helper line per reauth reason — the `reason` informs the copy\n but is never rendered as a raw enum/code. */\nfunction authReasonLine(reason: AuthNeededItem[\"reason\"]): string {\n switch (reason) {\n case \"insufficient_scope\":\n return \"It needs additional access to continue.\";\n case \"missing_connection\":\n return \"It isn't connected yet.\";\n case \"expired\":\n case \"refresh_failed\":\n return \"Its access expired.\";\n case \"unsupported_auth\":\n return \"This connection cannot authenticate the configured tool endpoint.\";\n case \"resource_scope_unavailable\":\n return \"This tool endpoint cannot enforce the selected repository access.\";\n default:\n return \"Its connection needs attention.\";\n }\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","createContext","useContext","useState","jsx","jsxs","createContext","useContext","useState","useState","Fragment","jsx","jsxs","useState","lazy","Suspense","useEffect","useState","jsx","lazy","useState","useEffect","Suspense","CameraIcon","CameraOffIcon","useState","useEffect","useState","jsx","jsxs","useState","jsx","jsxs","file","CameraIcon","CameraOffIcon","lazy","Suspense","createContext","useContext","useRef","Fragment","jsx","jsxs","lazy","Suspense","ChevronRightIcon","useState","Collapsible","jsx","jsxs","useState","Collapsible","ChevronRightIcon","jsx","jsx","jsxs","ArrowRightIcon","BotIcon","CheckIcon","ChevronRightIcon","TriangleAlertIcon","AnimatePresence","motion","Collapsible","memo","useCallback","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useMemo","useRef","useState","useCallback","useEffect","AnimatePresence","motion","window","memo","TimelineGroupView","BotIcon","ArrowRightIcon","Collapsible","ChevronRightIcon","CheckIcon","TriangleAlertIcon"]}