@agents24/react 0.2.26 → 0.2.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compatibility.json +3 -3
- package/dist/assistant-preview.d.ts +18 -0
- package/dist/index.js +93 -3
- package/dist/index.js.map +1 -1
- package/dist/state.d.ts +2 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lifecycle.ts","../src/chat-observation.ts","../src/use-chat-observation.ts","../src/model.ts","../src/provider.tsx","../src/runtime-event-buffer.ts","../src/hitl-resolution.ts","../src/state.ts","../src/thread-message-queue.ts","../src/chat-timing.ts","../src/operation-ownership.ts","../src/use-agent-chat-hitl-submissions.ts","../src/hitl-submission.ts","../src/use-agent-chat.ts","../src/refresh-chat-summaries.ts","../src/use-agent-chat-thread-list.ts","../src/use-agent-chat-feedback.ts","../src/use-agent-chat-queue-actions.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport type VisibilitySource = {\n isVisible(): boolean;\n subscribe(listener: () => void): () => void;\n};\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport type { AbortControllerFactory, VisibilitySource } from \"./lifecycle\";\n\nexport type ChatObservationState = {\n threadId: string | null;\n running: boolean;\n waiting: boolean;\n pending: boolean;\n paused: boolean;\n degraded?: boolean;\n mode?: \"on-demand\" | \"realtime\";\n background?: boolean;\n sidebar?: boolean;\n};\n\n/** One observation policy for SDK chats and platform transport adapters. */\nexport function createChatObservation(input: {\n createAbortController: AbortControllerFactory;\n events: AgentClient[\"threads\"][\"events\"];\n refresh(signal: AbortSignalLike): Promise<void>;\n onEvent(event: ThreadSummaryEvent): void;\n onError(error: unknown): void;\n onRecovered(): void;\n onDetach(): void;\n onResume(): void;\n visibility?: VisibilitySource;\n}) {\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, ms: number): unknown;\n clearTimeout(timer: unknown): void;\n };\n let state: ChatObservationState = { threadId: null, running: false, waiting: false, pending: false, paused: false };\n let visible = input.visibility?.isVisible() ?? true;\n let disposed = false;\n let generation = 0;\n let recovery: ReturnType<AbortControllerFactory> | undefined;\n let refreshing: Promise<void> | undefined;\n let timer: unknown;\n let failures = 0;\n const needed = () => !disposed && visible && Boolean(state.threadId || state.sidebar);\n const interval = () => failures\n ? Math.min(30_000, 5_000 * 2 ** Math.min(failures, 3))\n : state.running || state.pending || state.degraded || state.waiting || state.paused || state.background ? 5_000 : 30_000;\n const stop = () => { clock.clearTimeout(timer); timer = undefined; };\n const schedule = () => {\n stop();\n if (needed()) timer = clock.setTimeout(poll, interval());\n };\n\n function refresh(): Promise<void> {\n if (!needed()) return Promise.resolve();\n if (refreshing) return refreshing;\n const owned = generation;\n const controller = input.createAbortController();\n recovery = controller;\n const timeout = clock.setTimeout(() => controller.abort(\"Observation refresh timed out.\"), 5_000);\n let onAbort = () => {};\n const aborted = new Promise<never>((_, reject) => {\n onAbort = () => reject(Object.assign(new Error(\"Observation refresh detached.\"), { name: \"AbortError\" }));\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n const promise = Promise.race([input.refresh(controller.signal), aborted]).then(() => {\n if (owned === generation && !controller.signal.aborted) input.onRecovered();\n }).finally(() => {\n clock.clearTimeout(timeout);\n controller.signal.removeEventListener(\"abort\", onAbort);\n if (recovery === controller) recovery = undefined;\n if (refreshing === promise) refreshing = undefined;\n });\n refreshing = promise;\n return promise;\n }\n\n function poll() {\n stop();\n if (!needed()) return;\n const owned = generation;\n void refresh().then(() => {\n if (owned === generation && needed()) { failures = 0; input.onResume(); }\n }).catch((error) => {\n if (owned !== generation || !needed()) return;\n failures += 1;\n input.onError(error);\n }).finally(() => { if (owned === generation) schedule(); });\n }\n\n const unsubscribe = input.visibility?.subscribe(() => {\n const next = input.visibility!.isVisible();\n if (next === visible) return;\n visible = next;\n if (!visible) { generation += 1; stop(); recovery?.abort(); refreshing = undefined; input.onDetach(); }\n else poll();\n });\n\n return {\n refresh,\n update(next: ChatObservationState) {\n const changed = next.threadId !== state.threadId;\n const accelerated = !(state.running || state.pending || state.background || state.waiting)\n && Boolean(next.running || next.pending || next.background || next.waiting);\n if (changed) {\n generation += 1;\n stop(); recovery?.abort(); refreshing = undefined;\n failures = 0;\n }\n state = next;\n if (!needed()) stop();\n else if (changed || accelerated) poll();\n else if (timer === undefined && !refreshing) schedule();\n },\n dispose() {\n disposed = true; generation += 1;\n stop(); recovery?.abort(); unsubscribe?.();\n },\n };\n}\n","import * as React from \"react\";\nimport { createChatObservation, type ChatObservationState } from \"./chat-observation\";\n\nexport function useChatObservation(input: Parameters<typeof createChatObservation>[0] & { state: ChatObservationState }) {\n const latest = React.useRef(input);\n latest.current = input;\n const owner = React.useRef<ReturnType<typeof createChatObservation> | null>(null);\n React.useEffect(() => {\n const observation = createChatObservation({\n createAbortController: input.createAbortController, visibility: input.visibility,\n events: (options, handler) => latest.current.events(options, handler),\n refresh: (signal) => latest.current.refresh(signal),\n onEvent: (event) => latest.current.onEvent(event),\n onError: (error) => latest.current.onError(error),\n onRecovered: () => latest.current.onRecovered(),\n onDetach: () => latest.current.onDetach(),\n onResume: () => latest.current.onResume(),\n });\n owner.current = observation;\n observation.update(latest.current.state);\n return () => { observation.dispose(); if (owner.current === observation) owner.current = null; };\n }, [input.createAbortController, input.visibility]);\n const { threadId, running, waiting, pending, paused, degraded, mode, background, sidebar } = input.state;\n React.useEffect(() => {\n owner.current?.update({ threadId, running, waiting, pending, paused, degraded, mode, background, sidebar });\n }, [threadId, running, waiting, pending, paused, degraded, mode, background, sidebar]);\n return React.useCallback(() => owner.current?.refresh() ?? Promise.resolve(), []);\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"waiting\"\n | \"interrupted\"\n | \"cancelling\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ChatCitation = {\n title: string;\n url: string;\n description?: string;\n sourceRef?: string;\n [key: string]: unknown;\n};\n\nexport type ChatAttachment = {\n id?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n contentType?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nexport function chatAttachmentIds(attachments?: readonly ChatAttachment[]): string[] {\n return (attachments || []).flatMap((attachment) => typeof attachment.id === \"string\" && attachment.id.trim()\n ? [attachment.id.trim()]\n : []);\n}\n\nexport type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatPartMetadata = {\n id: string;\n runId?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n raw?: Record<string, unknown>;\n};\n\nexport type ChatToolChildRun = {\n runId?: string | null;\n agentId?: string | null;\n agentName?: string | null;\n status?: string | null;\n error?: string | null;\n};\n\nexport type ChatToolChild = {\n id: string;\n runId?: string | null;\n toolCallId?: string | null;\n toolName: string;\n title: string;\n status: string;\n detail?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n};\n\nexport type ChatToolPresentation = Record<string, unknown> & {\n title?: string | null;\n activity?: string | null;\n detail?: string | null;\n category?: string | null;\n groupKey?: string | null;\n groupLabel?: string | null;\n path?: string | null;\n threadId?: string | null;\n isExploration?: boolean;\n childRun?: ChatToolChildRun | null;\n childTools?: ChatToolChild[];\n activeChildToolId?: string | null;\n};\n\nexport type ChatTextPart = ChatPartMetadata & { type: \"text\"; kind: \"text\"; text: string };\nexport type ChatComputerResourceTarget = {\n type: \"computer\";\n thread_id: string;\n computer_id: string;\n path: string;\n kind: \"file\" | \"directory\";\n};\nexport type ChatToolPart = ChatPartMetadata & {\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolKey?: string | null;\n action?: string | null;\n displayName?: string | null;\n summary?: string | null;\n toolCallId?: string | null;\n sourceKind?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n resourceTargets?: readonly ChatComputerResourceTarget[];\n errorText?: string | null;\n failure?: FailureView | null;\n presentation: ChatToolPresentation;\n};\nexport type ChatReasoningPart = ChatPartMetadata & { type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null };\nexport type ChatModelTurnPart = ChatPartMetadata & {\n type: \"model-turn\";\n kind: \"model-turn\";\n modelTurnId: string;\n turnKind: \"agent\" | \"model\";\n status: \"running\";\n iteration?: number | null;\n};\nexport type ChatContextCompressionPart = ChatPartMetadata & {\n type: \"context-compression\";\n kind: \"context-compression\";\n status: \"started\" | \"completed\" | \"failed\";\n compression: ContextCompression;\n};\nexport type ChatNodeActivityState = \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"skipped\";\nexport type ChatNodeSkipReason = \"missing_required_input\" | \"upstream_input_unavailable\" | \"empty_optional_source\";\nconst chatNodeSkipReason = (value: unknown): ChatNodeSkipReason | null => {\n const normalized = text(value);\n return normalized === \"missing_required_input\"\n || normalized === \"upstream_input_unavailable\"\n || normalized === \"empty_optional_source\"\n ? normalized\n : null;\n};\nexport type ChatNodeActivityPart = ChatPartMetadata & {\n type: \"node-activity\";\n kind: \"node-activity\";\n activityId: string;\n /** Opaque trusted-host trace selector; absent from public projections. */\n traceStepId?: string | null;\n label: string;\n nodeKind: string;\n status: ChatNodeActivityState;\n defaultChatVisible: boolean;\n reason?: ChatNodeSkipReason | null;\n failure?: FailureView | null;\n};\nexport type ChatUiBlocksPart = ChatPartMetadata & { type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\" | \"user_input\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlQuestion = {\n id: string;\n header: string;\n question: string;\n options: Array<{ id: string; label: string }>;\n multiSelect: boolean;\n};\nexport type ChatHitlAnswer = {\n questionId: string;\n selectedOptionIds: string[];\n customText?: string;\n};\nexport type ChatHitlResolution = Record<string, unknown> & {\n answers?: ChatHitlAnswer[];\n outcome?: string;\n status?: string;\n};\nexport type ChatHitlPart = ChatPartMetadata & {\n type: \"hitl\";\n kind: \"hitl\";\n interruptId: string;\n hitlKind: ChatHitlKind;\n message: string;\n allowedActions: HitlAction[];\n status: ChatHitlStatus;\n presentation: Record<string, unknown>;\n questions: ChatHitlQuestion[];\n resolution?: ChatHitlResolution | null;\n};\nexport type ChatErrorPart = ChatPartMetadata & { type: \"error\"; kind: \"error\"; errorText: string; failure?: FailureView | null };\nexport type ChatDataPart = ChatPartMetadata & { type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown> };\nexport type ChatSourcePart = ChatPartMetadata & { type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null };\nexport type ChatCitationPart = ChatPartMetadata & { type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null };\nexport type ChatAttachmentPart = ChatPartMetadata & { type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatModelTurnPart | ChatContextCompressionPart | ChatNodeActivityPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;\n\nexport type ChatMessage = {\n id: string;\n /** Durable timeline identity when a mounted optimistic turn keeps its display key. */\n durableId?: string;\n clientSubmissionId?: string;\n segmentIndex?: number | null;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n responseCompletion?: import(\"@agents24/client/protocol\").ResponseCompletion;\n parts: ChatPart[];\n attachments?: ChatAttachment[];\n citations?: ChatCitation[];\n feedback?: ResponseFeedback | null;\n messageIndex?: number;\n reasoningSteps?: Array<Record<string, unknown>>;\n thinkingDurationMs?: number;\n tokenUsage?: { inputTokens?: number | null; outputTokens?: number | null; totalTokens?: number | null; usageSource?: string | null };\n isVoice?: boolean;\n};\n\nexport type StoredChatThread = ThreadSummary & {\n taskNotifications?: Array<Record<string, unknown> & { handle: string }>;\n messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\n contextWindow?: ContextWindow | null;\n contextCompression?: ContextCompression | null;\n};\n\nexport type ThreadActivity = {\n status: string | null;\n runId: string | null;\n isSpinning: boolean;\n isPaused: boolean;\n isFailed: boolean;\n isCompleted: boolean;\n isCancelled: boolean;\n};\n\nexport function getThreadActivity(thread: Pick<ThreadSummary, \"active_run\" | \"last_run_id\" | \"last_run_status\">): ThreadActivity {\n const activeRun = thread.active_run || null;\n const status = String(activeRun?.status || thread.last_run_status || \"\").trim().toLowerCase() || null;\n return {\n status,\n runId: activeRun?.run_id || thread.last_run_id || null,\n isSpinning: Boolean(activeRun) && [\"queued\", \"running\", \"cancelling\"].includes(status || \"\"),\n isPaused: status === \"paused\",\n isFailed: status === \"failed\",\n isCompleted: status === \"completed\",\n isCancelled: status === \"cancelled\" || status === \"canceled\",\n };\n}\n\nconst record = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : null;\nexport function computerResourceTargets(value: unknown): ChatComputerResourceTarget[] {\n const output = record(value);\n if (!output) return [];\n const candidates = [output.resource_target,\n ...(Array.isArray(output.resource_targets) ? output.resource_targets : []),\n ...(Array.isArray(output.files) ? output.files.map(file => record(file)?.resource_target) : [])];\n const seen = new Set<string>();\n return candidates.flatMap(candidate => {\n const target = record(candidate);\n if (target?.type !== \"computer\" || typeof target.thread_id !== \"string\"\n || typeof target.computer_id !== \"string\" || typeof target.path !== \"string\"\n || !target.path.startsWith(\"/workspace\")\n || (target.kind !== \"file\" && target.kind !== \"directory\")) return [];\n const key = `${target.thread_id}:${target.computer_id}:${target.path}:${target.kind}`;\n if (seen.has(key)) return [];\n seen.add(key);\n return [target as ChatComputerResourceTarget];\n });\n}\nconst text = (value: unknown): string | null => typeof value === \"string\" && value.trim() ? value : null;\nconst finiteNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\nconst statusToToolState = (value: unknown): ChatToolState => {\n const normalized = String(value || \"\").toLowerCase();\n if (normalized === \"failed\" || normalized === \"error\") return \"output-error\";\n if (normalized === \"cancelled\" || normalized === \"canceled\") return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n return normalized === \"streaming\" ? \"input-streaming\" : \"input-available\";\n};\n\nfunction failureView(value: unknown): FailureView | null {\n const candidate = record(value);\n return candidate?.schema_version === \"agents24.failure.v1\"\n && text(candidate.failure_id)\n && text(candidate.code)\n && text(candidate.message)\n && typeof candidate.retryable === \"boolean\"\n && record(candidate.details)\n ? candidate as unknown as FailureView\n : null;\n}\n\nconst allowedActions: Record<ChatHitlKind, HitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n user_input: [\"respond\"],\n};\n\nfunction hitlQuestions(presentation: Record<string, unknown>): ChatHitlQuestion[] {\n return (Array.isArray(presentation.questions) ? presentation.questions : []).flatMap((value) => {\n const question = record(value);\n if (!question || !Array.isArray(question.options)) return [];\n const options = question.options.flatMap((rawOption) => {\n const option = record(rawOption);\n return option && text(option.id) && text(option.label)\n ? [{ id: String(option.id), label: String(option.label) }]\n : [];\n });\n return text(question.id) && text(question.header) && text(question.question) && options.length >= 2\n ? [{\n id: String(question.id),\n header: String(question.header),\n question: String(question.question),\n options,\n multiSelect: question.multi_select === true,\n }]\n : [];\n });\n}\n\nfunction hitlResolution(value: unknown): ChatHitlResolution | null {\n const resolution = record(value);\n if (!resolution) return null;\n const answers = (Array.isArray(resolution.answers) ? resolution.answers : []).flatMap((value) => {\n const answer = record(value);\n if (!answer || !text(answer.question_id) || !Array.isArray(answer.selected_option_ids)) return [];\n return [{\n questionId: String(answer.question_id),\n selectedOptionIds: answer.selected_option_ids.map(String),\n ...(text(answer.custom_text) ? { customText: String(answer.custom_text) } : {}),\n }];\n });\n return { ...resolution, ...(answers.length ? { answers } : {}) };\n}\n\nfunction partMetadata(block: Record<string, unknown>, id: string): ChatPartMetadata {\n return {\n id,\n runId: text(block.runId) || text(block.run_id),\n sequence: finiteNumber(block.seq),\n timestamp: text(block.ts),\n raw: block,\n };\n}\n\nfunction toolPresentation(tool: Record<string, unknown>): ChatToolPresentation {\n const nested = record(tool.presentation) || {};\n const childRunValue = record(tool.childRun) || record(tool.child_run);\n const childRun = childRunValue && (\n text(childRunValue.runId || childRunValue.run_id)\n || text(childRunValue.agentName || childRunValue.agent_name)\n || text(childRunValue.status)\n )\n ? {\n runId: text(childRunValue.runId) || text(childRunValue.run_id),\n agentId: text(childRunValue.agentId) || text(childRunValue.agent_id),\n agentName: text(childRunValue.agentName) || text(childRunValue.agent_name),\n status: text(childRunValue.status),\n error: text(childRunValue.error),\n }\n : null;\n const childTools = (Array.isArray(tool.childTools) ? tool.childTools : Array.isArray(tool.child_tools) ? tool.child_tools : [])\n .flatMap((value): ChatToolChild[] => {\n const child = record(value);\n if (!child || !text(child.id) || !text(child.title)) return [];\n return [{\n id: String(child.id),\n runId: text(child.runId) || text(child.run_id),\n toolCallId: text(child.toolCallId) || text(child.tool_call_id),\n toolName: String(child.toolName || child.tool_name || child.title),\n title: String(child.title),\n status: String(child.status || \"\"),\n detail: text(child.detail),\n sequence: finiteNumber(child.seq),\n timestamp: text(child.ts),\n }];\n });\n return {\n ...nested,\n title: text(tool.title) || text(nested.title),\n activity: text(tool.activity) || text(nested.activity),\n detail: text(tool.detail) || text(nested.detail),\n category: text(tool.category) || text(nested.category),\n groupKey: text(tool.groupKey) || text(tool.group_key) || text(nested.groupKey) || text(nested.group_key),\n groupLabel: text(tool.groupLabel) || text(tool.group_label) || text(nested.groupLabel) || text(nested.group_label),\n path: text(tool.path),\n threadId: text(tool.threadId) || text(tool.thread_id),\n isExploration: tool.isExploration === true || tool.is_exploration === true,\n childRun,\n childTools,\n activeChildToolId: text(tool.activeChildToolId) || text(tool.active_child_tool_id),\n };\n}\n\nexport function partsFromResponseBlocks(\n blocks: unknown,\n fallbackText = \"\",\n fallbackPartId = \"assistant-text\",\n): ChatPart[] {\n const input = Array.isArray(blocks) ? blocks : [];\n const parts = input.flatMap((item, index): ChatPart[] => {\n const block = record(item);\n if (!block) return [];\n const kind = String(block.kind || \"data\");\n const id = String(block.id || `${kind}-${index}`);\n const metadata = partMetadata(block, id);\n if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ ...metadata, type: \"text\", kind: \"text\", text: value }] : [];\n }\n if (kind === \"context_compression\") {\n const compression = normalizeContextCompression(block.compression);\n if (!compression?.active) return [];\n const status = compression.status === \"started\" || compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : block.status === \"complete\"\n ? \"completed\"\n : block.status === \"error\"\n ? \"failed\"\n : \"started\";\n return [{\n ...metadata,\n type: \"context-compression\",\n kind: \"context-compression\",\n status,\n compression: { ...compression, status },\n }];\n }\n if (kind === \"node_activity\") {\n const node = record(block.node);\n const activityId = text(node?.activityId) || text(node?.activity_id) || id;\n const statusValue = String(node?.status || \"\").toLowerCase();\n const status: ChatNodeActivityState = [\"completed\", \"failed\", \"cancelled\", \"skipped\"].includes(statusValue)\n ? statusValue as ChatNodeActivityState\n : \"running\";\n const label = text(node?.label) || \"Working\";\n const nodeKind = text(node?.kind) || \"node\";\n return [{\n ...metadata,\n type: \"node-activity\",\n kind: \"node-activity\",\n activityId,\n traceStepId: text(node?.traceStepId) || text(node?.trace_step_id) || null,\n label,\n nodeKind,\n status,\n defaultChatVisible: node?.defaultChatVisible === true,\n reason: chatNodeSkipReason(node?.reason),\n failure: failureView(node?.failure),\n }];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.toolName || tool.tool_name || tool.action || tool.title || \"tool\");\n return [{\n ...metadata,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolKey: text(tool.toolKey) || text(tool.tool_key),\n action: text(tool.action),\n displayName: text(tool.displayName) || text(tool.display_name),\n summary: text(tool.summary),\n toolCallId: text(tool.toolCallId) || text(tool.tool_call_id),\n sourceKind: text(tool.sourceKind) || text(tool.source_kind),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n resourceTargets: computerResourceTargets(tool.output),\n errorText: text(tool.error || block.error),\n failure: failureView(tool.failure),\n presentation: toolPresentation(tool),\n }];\n }\n if (kind === \"reasoning_note\") return [{ ...metadata, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status) }];\n if (kind === \"ui_blocks\") return [{ ...metadata, type: \"ui-blocks\", kind: \"ui-blocks\", state: statusToToolState(block.status), toolCallId: text(block.toolCallId), contractVersion: text(block.contractVersion), bundle: record(block.bundle), errorText: text(block.error) }];\n if (kind === \"hitl_request\") {\n const hitl = record(block.hitl) || {};\n const hitlKind = String(block.hitlKind || hitl.kind || \"\") as ChatHitlKind;\n if (!(hitlKind in allowedActions)) return [];\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n const expected = allowedActions[hitlKind];\n if (actions.length !== expected.length || actions.some((action, actionIndex) => action !== expected[actionIndex])) return [];\n return [{\n ...metadata,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId: String(block.interruptId || hitl.interrupt_id || \"\"),\n hitlKind,\n message: String(block.text || hitl.message || \"\"),\n allowedActions: actions,\n status: String(block.status || \"pending\") as ChatHitlStatus,\n presentation: record(hitl.presentation) || hitl,\n questions: hitlQuestions(record(hitl.presentation) || {}),\n resolution: hitlResolution(block.resolution),\n }];\n }\n if (kind === \"error\") {\n const failure = failureView(block.failure) || failureView(block.error);\n return [{\n ...metadata,\n type: \"error\",\n kind: \"error\",\n errorText: failure?.message || String(block.text || \"The run failed.\"),\n failure,\n }];\n }\n if (kind === \"source\") return [{ ...metadata, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description) }];\n if (kind === \"citation\") return [{ ...metadata, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url) }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ ...metadata, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined } }];\n }\n return [{ ...metadata, type: \"data\", kind: \"data\", name: kind, data: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: fallbackText.trim() });\n }\n return parts;\n}\n\nexport function assistantProjectionFromEvent(event: RuntimeEvent): { content: string; parts: ChatPart[] } {\n const payload = record(event.payload) || {};\n const content = text(payload.assistant_output_text) || \"\";\n const fromBlocks = partsFromResponseBlocks(\n payload.response_blocks,\n content,\n `${event.run_id}:assistant-text`,\n );\n if (fromBlocks.length) return {\n content: content || fromBlocks\n .filter((part): part is ChatTextPart => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n parts: fromBlocks,\n };\n const fromPatch = partsFromResponseBlocks(\n payload.response_block === undefined ? undefined : [payload.response_block],\n );\n if (fromPatch.length) return { content, parts: fromPatch };\n return { content, parts: [] };\n}\n\nexport function modelTurnPartFromEvent(event: RuntimeEvent): ChatModelTurnPart | null {\n const eventName = String(event.event || \"\");\n const payload = record(event.payload) || {};\n const source = eventName === \"run.snapshot\" ? record(payload.active_model_turn) : payload;\n if (\n !source\n || (eventName !== \"model.turn.started\" && eventName !== \"run.snapshot\")\n || source.status !== \"running\"\n || !text(source.model_turn_id)\n ) return null;\n const modelTurnId = String(source.model_turn_id);\n const iteration = finiteNumber(source.iteration);\n return {\n id: `model-turn:${modelTurnId}`,\n type: \"model-turn\",\n kind: \"model-turn\",\n modelTurnId,\n turnKind: source.kind === \"agent\" ? \"agent\" : \"model\",\n status: \"running\",\n runId: event.run_id || null,\n sequence: finiteNumber(event.seq),\n timestamp: text(event.ts),\n ...(iteration === null ? {} : { iteration }),\n raw: source,\n };\n}\n\nexport function contextCompressionPartFromEvent(\n event: RuntimeEvent,\n existingParts: readonly ChatPart[] = [],\n): ChatContextCompressionPart | null {\n if (String(event.event || \"\") !== \"context.compression.updated\") return null;\n const payload = record(event.payload) || {};\n const compression = normalizeContextCompression(payload.context_compression);\n if (!compression?.active) return null;\n const status = compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : \"started\";\n const activePart = [...existingParts].reverse().find(\n (part): part is ChatContextCompressionPart => (\n part.kind === \"context-compression\" && part.status === \"started\"\n ),\n );\n const sequence = finiteNumber(event.seq);\n const id = status === \"started\"\n ? `context-compression:${event.run_id || \"run\"}:${sequence ?? \"active\"}`\n : activePart?.id || `context-compression:${event.run_id || \"run\"}:${sequence ?? \"terminal\"}`;\n return {\n id,\n type: \"context-compression\",\n kind: \"context-compression\",\n runId: event.run_id || null,\n sequence,\n timestamp: text(event.ts),\n status,\n compression,\n };\n}\n\nexport function threadDetailToMessages(detail: ThreadDetail): ChatMessage[] {\n return (detail.turns || []).flatMap((item, index) => {\n const turn = record(item) || {};\n const userText = text(turn.user_input_text) || \"\";\n const assistantText = text(turn.assistant_output_text) || \"\";\n const runId = text(turn.run_id);\n const createdAt = text(turn.created_at) || new Date(0).toISOString();\n const rawFeedback = record(turn.feedback);\n const feedback: ResponseFeedback | null = rawFeedback\n && (rawFeedback.rating === \"like\" || rawFeedback.rating === \"dislike\")\n && text(rawFeedback.created_at)\n && text(rawFeedback.updated_at)\n ? {\n rating: rawFeedback.rating === \"like\" ? \"like\" : \"dislike\",\n reason: [\n \"incorrect\",\n \"irrelevant\",\n \"incomplete\",\n \"unsafe\",\n \"citation_issue\",\n \"other\",\n ].includes(String(rawFeedback.reason || \"\"))\n ? rawFeedback.reason as ResponseFeedback[\"reason\"]\n : null,\n comment: text(rawFeedback.comment),\n created_at: String(rawFeedback.created_at),\n updated_at: String(rawFeedback.updated_at),\n }\n : null;\n const attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => {\n const value = record(attachment);\n return value ? [attachmentResultToChatAttachment(value as AttachmentResult)] : [];\n })\n : [];\n const output: ChatMessage[] = [];\n if (userText || attachments.length) output.push({\n id: String(turn.id || `${runId || index}-user`),\n role: \"user\",\n content: userText,\n createdAt,\n parts: userText ? [{ id: `${runId || index}-user-text`, type: \"text\", kind: \"text\", text: userText }] : [],\n attachments,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n if (assistantText || Array.isArray(turn.response_blocks)) {\n const assistantParts = partsFromResponseBlocks(\n turn.response_blocks,\n assistantText,\n `${runId || turn.id || index}-assistant-text`,\n );\n output.push({\n id: `${runId || turn.id || index}-assistant`,\n role: \"assistant\",\n runId,\n content: assistantText,\n createdAt: text(turn.completed_at) || createdAt,\n responseCompletion: item.response_completion,\n isFinal: Boolean(item.response_completion) || ![\"queued\", \"running\", \"paused\", \"cancelling\"].includes(String(turn.status || \"\").toLowerCase()),\n feedback,\n parts: assistantParts,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n }\n return output;\n });\n}\n\nexport function threadTimelineToMessages(\n items: readonly import(\"@agents24/client\").ThreadMessage[],\n): ChatMessage[] {\n return items.map((item) => ({\n id: item.id,\n clientSubmissionId: item.client_submission_id || undefined,\n role: item.role,\n runId: item.run_id,\n segmentIndex: item.segment_index,\n content: item.text,\n createdAt: item.created_at,\n isFinal: item.status === \"completed\" || item.status === \"delivered\",\n responseCompletion: item.response_completion,\n parts: item.role === \"assistant\"\n ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`)\n : item.text ? [{ id: `${item.id}-text`, type: \"text\" as const, kind: \"text\" as const, text: item.text }] : [],\n attachments: item.role === \"user\" ? item.attachment_ids.map((id) => {\n const descriptor = item.attachments?.find((attachment) => attachment.id === id);\n return { id, filename: descriptor?.filename || \"Attachment\", mediaType: descriptor?.mime_type || \"application/octet-stream\" };\n }) : undefined,\n feedback: item.role === \"assistant\" ? item.feedback ?? null : undefined,\n }));\n}\n\nexport function latestThreadContext(detail: ThreadDetail): {\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n} {\n let contextWindow: ContextWindow | null = null;\n for (const turn of detail.turns || []) {\n contextWindow = mergeContextWindowUpdate(contextWindow, turn.context_window);\n }\n return {\n contextWindow,\n contextCompression: compressionFromContextWindow(contextWindow),\n };\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return {\n ...result,\n id: result.id,\n filename: result.filename,\n mediaType: result.mime_type,\n status: result.processing_status,\n };\n}\n","import type { AgentClient } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AbortControllerFactory, VisibilitySource } from \"./lifecycle\";\nimport { createPortableId } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\n\nexport type AgentChatStorage = {\n loadThreads(): StoredChatThread[];\n saveThreads(threads: readonly StoredChatThread[]): void;\n loadActiveThreadId?(): string | null;\n saveActiveThreadId?(threadId: string | null): void;\n};\n\nexport type Agents24ReactRuntime = {\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId: () => string;\n storage?: AgentChatStorage;\n visibility?: VisibilitySource;\n onHitlTiming?: (timing: { stage: \"preparation\" | \"acknowledgement\" | \"attachment\" | \"first_activity\"; durationMs: number }) => void;\n};\n\nconst Agents24Context = React.createContext<Agents24ReactRuntime | null>(null);\n\nexport type Agents24ProviderProps = {\n children: React.ReactNode;\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId?: () => string;\n storage?: AgentChatStorage;\n visibility?: VisibilitySource;\n onHitlTiming?: (timing: { stage: \"preparation\" | \"acknowledgement\" | \"attachment\" | \"first_activity\"; durationMs: number }) => void;\n};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n visibility,\n onHitlTiming,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage, visibility: visibility ?? client.visibility, onHitlTiming }),\n [client, createAbortController, createId, storage, visibility, onHitlTiming],\n );\n return <Agents24Context.Provider value={value}>{children}</Agents24Context.Provider>;\n}\n\nexport function useAgents24Runtime(): Agents24ReactRuntime {\n const value = React.useContext(Agents24Context);\n if (!value) throw new Error(\"Agents24 hooks must be rendered inside Agents24Provider.\");\n return value;\n}\n\nexport function useAgentClient(): AgentClient {\n return useAgents24Runtime().client;\n}\n","import type { RuntimeEvent } from \"@agents24/client\";\n\nexport type RuntimeEventFrameScheduler = (callback: () => void) => () => void;\n\nexport type RuntimeEventFrameBuffer = {\n dispose(): void;\n flush(): void;\n push(event: RuntimeEvent): void;\n};\n\ntype AnimationFrameRuntime = {\n cancelAnimationFrame?: (handle: number) => void;\n requestAnimationFrame?: (callback: () => void) => number;\n};\n\nexport function runtimeEventFrameScheduler(): RuntimeEventFrameScheduler | undefined {\n const runtime = globalThis as AnimationFrameRuntime;\n if (typeof runtime.requestAnimationFrame !== \"function\") return undefined;\n return (callback) => {\n const handle = runtime.requestAnimationFrame?.(callback);\n return () => {\n if (handle !== undefined) runtime.cancelAnimationFrame?.(handle);\n };\n };\n}\n\nexport function createRuntimeEventFrameBuffer(\n apply: (events: readonly RuntimeEvent[]) => void,\n scheduleFrame?: RuntimeEventFrameScheduler,\n): RuntimeEventFrameBuffer {\n let pending: RuntimeEvent[] = [];\n let cancelFrame: (() => void) | null = null;\n\n const flush = () => {\n cancelFrame?.();\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n };\n\n return {\n dispose() {\n cancelFrame?.();\n cancelFrame = null;\n pending = [];\n },\n flush,\n push(event) {\n if (event.event !== \"assistant.delta\" || !scheduleFrame) {\n pending.push(event);\n flush();\n return;\n }\n pending.push(event);\n if (cancelFrame) return;\n cancelFrame = scheduleFrame(() => {\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n });\n },\n };\n}\n","import type { HitlResumeResult } from \"@agents24/client\";\nimport type { ChatHitlPart, ChatMessage, ChatPart } from \"./model\";\n\nexport type HitlDecisionReceipt = Pick<HitlResumeResult, \"run_id\" | \"thread_id\" | \"interrupt_id\" | \"resolution\"> & {\n run_status?: string;\n};\n\n/** Apply a durable receipt without moving the delivery cursor or changing run execution. */\nexport function applyHitlResolution<T extends Pick<ChatMessage, \"runId\" | \"parts\">>(messages: T[], receipt: HitlDecisionReceipt): T[] {\n return messages.map(message => message.runId !== receipt.run_id ? message : {\n ...message,\n parts: message.parts.map(part => part.kind !== \"hitl\" || part.interruptId !== receipt.interrupt_id ? part : {\n ...part,\n status: receipt.resolution.status,\n resolution: {\n ...receipt.resolution,\n answers: receipt.resolution.answers?.map(answer => ({\n questionId: answer.question_id, selectedOptionIds: [...answer.selected_option_ids],\n ...(answer.custom_text ? { customText: answer.custom_text } : {}),\n })),\n },\n }),\n });\n}\n\nexport function findHitlResolution(messages: readonly ChatMessage[], runId: string, interruptId: string): ChatHitlPart | undefined {\n return messages.filter(message => message.runId === runId).flatMap(message => message.parts).find((part): part is ChatHitlPart =>\n part.kind === \"hitl\" && part.interruptId === interruptId && part.status !== \"pending\");\n}\n\n/** Terminal decisions are monotonic even when delivery replays an older pending snapshot. */\nexport function preserveResolvedHitlParts(current: readonly ChatPart[], incoming: ChatPart[]): ChatPart[] {\n const resolved = current.filter((part): part is ChatHitlPart => part.kind === \"hitl\" && part.status !== \"pending\");\n if (!resolved.length) return incoming;\n const next = incoming.map(part => {\n if (part.kind !== \"hitl\" || part.status !== \"pending\") return part;\n const known = resolved.find(item => item.interruptId === part.interruptId);\n return known ? { ...part, status: known.status, resolution: known.resolution } : part;\n });\n for (const part of resolved) if (!next.some(item => item.kind === \"hitl\" && item.interruptId === part.interruptId)) {\n next.splice(Math.min(current.indexOf(part), next.length), 0, part);\n }\n return next;\n}\n","import { preserveResolvedHitlParts } from \"./hitl-resolution\";\nimport type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { AgentChatRunState, ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: AgentChatRunState;\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n concurrentEvents: readonly ThreadSummaryEvent[] = [],\n): StoredChatThread[] {\n const currentById = new Map(current.map((thread) => [thread.id, thread]));\n const newest = incoming.map((thread) => preferNewestThreadSummary(currentById.get(thread.id), thread));\n const active = activeThreadId && !incoming.some((thread) => thread.id === activeThreadId)\n ? current.find((thread) => thread.id === activeThreadId)\n : null;\n const base = active?.isHydrated ? [active, ...newest] : newest;\n return concurrentEvents.reduce(applyThreadSummaryEvent, base);\n}\n\nexport function preferNewestThreadSummary(\n current: StoredChatThread | undefined,\n incoming: StoredChatThread,\n): StoredChatThread {\n const currentTime = Date.parse(current?.updated_at || \"\");\n const incomingTime = Date.parse(incoming.updated_at || \"\");\n const newest = current && Number.isFinite(currentTime) && Number.isFinite(incomingTime) && currentTime > incomingTime\n ? current : incoming;\n // A terminal stream event is authoritative even if a summary read was already in flight.\n if (current?.last_run_id && current.last_run_id === incoming.last_run_id\n && !current.active_run && [\"completed\", \"failed\", \"cancelled\"].includes(current.last_run_status || \"\")\n && (!incoming.active_run || incoming.active_run.run_id === current.last_run_id)) {\n return { ...newest, active_run: null, last_run_status: current.last_run_status };\n }\n return newest;\n}\n\n/** Adopt the server-created thread without reloading the in-memory transcript. */\nexport function adoptStreamingThread(\n state: AgentChatState,\n threadId: string,\n): AgentChatState {\n const normalizedThreadId = threadId.trim();\n if (!normalizedThreadId || state.activeThreadId) return state;\n const existing = state.threads.find((thread) => thread.id === normalizedThreadId);\n const adopted: StoredChatThread = existing\n ? { ...existing, messages: state.messages, isHydrated: true }\n : {\n id: normalizedThreadId,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages: state.messages,\n isHydrated: true,\n };\n return {\n ...state,\n activeThreadId: normalizedThreadId,\n threads: existing\n ? state.threads.map((thread) => thread.id === normalizedThreadId ? adopted : thread)\n : [adopted, ...state.threads],\n };\n}\n\nexport type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n strictMessageId?: boolean;\n update: (message: TMessage) => TMessage;\n};\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage,\n): TMessage[] {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);\n if (!next.some((message) => message.id === assistantMessage.id || Boolean(\n assistantMessage.runId && message.role === \"assistant\" && message.runId === assistantMessage.runId,\n ))) next.push(assistantMessage);\n return next;\n}\n\n/** Keep mounted display keys while matching only durable IDs and run linkage. */\nexport function preserveMountedMessageIds(\n canonical: ChatMessage[],\n current: ChatMessage[],\n): ChatMessage[] {\n return canonical.map((message) => {\n const mounted = current.find((item) => item.role === message.role && (\n item.durableId === message.id || item.id === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId)\n || (message.role === \"assistant\" && message.segmentIndex === 1 && item.runId\n && item.runId === message.runId && !item.durableId)\n ));\n return mounted && mounted.id !== message.id\n ? { ...message, id: mounted.id, durableId: message.id }\n : message;\n });\n}\n\n/** Reconcile a durable timeline without replacing a newer live assistant segment. */\nexport function reconcileThreadTimeline(\n current: ChatMessage[],\n canonical: ChatMessage[],\n activeRunId: string | null,\n streamingMessageId: string | null,\n): ChatMessage[] {\n const mounted = preserveMountedMessageIds(canonical, current);\n const canonicalIds = new Set(mounted.map((message) => message.id));\n const retained = current.filter((message) => !canonicalIds.has(message.id) && (\n message.isFinal || (activeRunId && (!message.runId || message.runId === activeRunId))\n ));\n const reconciled = mounted.map((message) => {\n const live = current.find((item) => item.id === message.id);\n if (live && live.runId === message.runId) message = { ...message, parts: preserveResolvedHitlParts(live.parts, message.parts) };\n return activeRunId && live?.role === \"assistant\" && live.runId === activeRunId\n && (live.id === streamingMessageId || !live.isFinal || live.responseCompletion)\n ? message.responseCompletion && !live.responseCompletion\n ? { ...message, id: live.id, durableId: message.durableId || live.durableId }\n : { ...message, ...live, feedback: message.feedback, durableId: message.durableId || live.durableId }\n : message;\n });\n // Keep locally retained rows beside their preceding durable row. In particular,\n // a live reply missing from a history snapshot stays after its user message.\n const retainedIds = new Set(retained.map((message) => message.id));\n const userByRun = new Map(reconciled.filter((message) => message.role === \"user\")\n .map((message) => [message.runId, message.id]));\n const after = new Map<string | null, ChatMessage[]>();\n let anchor: string | null = null;\n let anchorRun: string | null | undefined;\n for (const message of current) {\n if (canonicalIds.has(message.id)) { anchor = message.id; anchorRun = message.runId; }\n else if (retainedIds.has(message.id)) {\n const position = message.role === \"assistant\" && message.runId && message.runId !== anchorRun\n ? userByRun.get(message.runId) ?? anchor : anchor;\n const group = after.get(position) || [];\n group.push(message);\n after.set(position, group);\n }\n }\n return [...(after.get(null) || []), ...reconciled.flatMap((message) => [message, ...(after.get(message.id) || [])])];\n}\n\n/** Older pages add history without replacing already mounted or live messages. */\nexport function prependThreadTimeline(current: ChatMessage[], older: ChatMessage[]): ChatMessage[] {\n const mounted = preserveMountedMessageIds(older, current);\n const ids = new Set(current.map((message) => message.id));\n return [...mounted.filter((message) => !ids.has(message.id)), ...current];\n}\n\n/** A promoted queue item enters the transcript under its durable message ID. */\nexport function promoteThreadMessage(\n current: ChatMessage[],\n message: ChatMessage,\n runId: string,\n): ChatMessage[] {\n const promoted = { ...message, runId, isFinal: true };\n const index = current.findIndex((item) => item.id === message.id || item.durableId === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId));\n if (index < 0) return [...current, message.clientSubmissionId\n ? { ...promoted, id: message.clientSubmissionId, durableId: message.id } : promoted];\n return current.map((item, itemIndex) => itemIndex === index\n ? { ...item, ...promoted, id: item.id, durableId: item.id === message.id ? item.durableId : message.id }\n : message.clientSubmissionId && item.role === \"assistant\" && item.id === `${current[index].id}:assistant`\n ? { ...item, runId } : item);\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>,\n): TMessage[] {\n const next = [...messages];\n for (const baseMessage of input.baseMessages || []) {\n const isTarget = baseMessage.role === \"assistant\" && (\n Boolean(input.messageId && baseMessage.id === input.messageId)\n || Boolean(!input.strictMessageId && input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const exactIndex = next.findIndex((message) => message.role === \"assistant\" && Boolean(input.messageId && message.id === input.messageId));\n const index = exactIndex >= 0 ? exactIndex : input.strictMessageId ? -1 : next.findIndex((message) =>\n message.role === \"assistant\" && Boolean(input.runId && message.runId === input.runId));\n if (index === -1) next.push(input.create());\n else next[index] = input.update(next[index]);\n return next;\n}\n\nfunction appendAssistantDelta(\n parts: ChatMessage[\"parts\"],\n delta: string,\n fallbackPartId: string,\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n const trailing = next[next.length - 1];\n if (trailing?.kind === \"text\") {\n next[next.length - 1] = { ...trailing, text: `${trailing.text}${delta}` };\n return next;\n }\n next.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: delta });\n return next;\n}\n\nfunction upsertResponseBlockParts(\n parts: ChatMessage[\"parts\"],\n incoming: ChatMessage[\"parts\"],\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n for (const part of incoming) {\n const index = next.findIndex((current) => current.id === part.id);\n if (index === -1) next.push(part);\n else next[index] = part;\n }\n return next;\n}\n\nfunction reconcileModelTurnParts(\n parts: ChatMessage[\"parts\"],\n event: RuntimeEvent,\n): ChatMessage[\"parts\"] {\n const eventName = String(event.event || \"\");\n const payload = event.payload || {};\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const modelTurnId = typeof payload.model_turn_id === \"string\" ? payload.model_turn_id : null;\n let next = parts;\n\n if (eventName === \"run.snapshot\" || eventName === \"assistant.completed\" || terminal) {\n next = next.filter((part) => part.kind !== \"model-turn\");\n } else if (eventName === \"assistant.delta\" && typeof payload.content === \"string\" && payload.content) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (eventName.startsWith(\"tool.\") || eventName === \"node.status.updated\") {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (\n (eventName === \"model.turn.failed\" || (eventName === \"model.turn.completed\" && payload.outcome !== \"tool_calls\"))\n && modelTurnId\n ) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.modelTurnId !== modelTurnId);\n }\n\n const active = modelTurnPartFromEvent(event);\n return active ? upsertResponseBlockParts(next, [active]) : next;\n}\n\nexport function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n if (state.activeRunId && event.run_id && event.run_id !== state.activeRunId) {\n const previous = state.messages.find((message) => message.role === \"assistant\" && message.runId === event.run_id);\n if (event.event !== \"run.accepted\") {\n if (!previous) return state;\n // A committed handoff can arrive before the preceding run's terminal SSE.\n // Reconcile that answer without changing ownership of the new live run.\n const reconciled = applyRuntimeEvent({ ...state, activeRunId: event.run_id,\n streamingMessageId: previous.id }, event);\n return { ...state, messages: reconciled.messages };\n }\n if (previous?.isFinal) return state;\n }\n\n if (event.event === \"run.accepted\" && typeof event.payload?.message_id === \"string\") {\n const messageId = event.payload.message_id;\n let optimisticIndex = -1;\n for (let index = state.messages.length - 1; index >= 0; index -= 1) {\n const message = state.messages[index];\n if (message.role === \"user\" && (event.payload.client_submission_id\n ? message.clientSubmissionId === event.payload.client_submission_id\n : !message.runId && !message.durableId)) {\n optimisticIndex = index;\n break;\n }\n }\n if (optimisticIndex >= 0) {\n const assistantId = event.payload.client_submission_id\n ? `${state.messages[optimisticIndex].id}:assistant`\n : state.streamingMessageId;\n state = { ...state, streamingMessageId: assistantId, messages: state.messages.map((message, index) => index === optimisticIndex\n ? { ...message, durableId: messageId, runId: event.run_id }\n : message.role === \"assistant\" && message.id === assistantId\n ? { ...message, runId: event.run_id }\n : message) };\n }\n }\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const completion = (eventName === \"assistant.completed\" ? event.payload : event.payload?.response_completion) as import(\"@agents24/client/protocol\").ResponseCompletion | undefined;\n const responseCompleted = Boolean(completion?.completed_at);\n const runId = state.activeRunId && event.event !== \"run.accepted\"\n ? state.activeRunId : event.run_id || state.activeRunId;\n const segmentId = typeof event.payload?.segment_id === \"string\" ? event.payload.segment_id : null;\n const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);\n const messageId = distinctSegment\n ? `${runId || \"run\"}-assistant-${segmentId}`\n : state.streamingMessageId || `${runId || \"run\"}-assistant`;\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const paused = eventName === \"run.paused\" || projection.parts.some((part) => part.kind === \"hitl\" && part.status === \"pending\");\n const suspension = eventName === \"run.waiting\" ? \"waiting\" : eventName === \"run.interrupted\" ? \"interrupted\" : null;\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && message.id === messageId)\n || (!distinctSegment ? state.messages.find((message) => message.role === \"assistant\" && Boolean(runId && message.runId === runId)) : undefined);\n const sealedAfterTerminal = responseCompleted && !state.activeRunId\n && [\"completed\", \"failed\", \"cancelled\"].includes(state.runState) && existing?.runId === runId;\n const payload = event.payload || {};\n const eventThreadId = typeof payload.thread_id === \"string\" && payload.thread_id.trim()\n ? payload.thread_id.trim()\n : null;\n const contextApplies = (\n (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId)\n && (!state.activeRunId || !runId || runId === state.activeRunId)\n );\n const contextPayload = payload.context_window && typeof payload.context_window === \"object\"\n ? { ...payload.context_window as Record<string, unknown>, run_id: runId }\n : payload.context_window;\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, contextPayload)\n : state.contextWindow;\n const explicitCompression = contextApplies\n ? normalizeContextCompression(payload.context_compression)\n : null;\n const contextCompression = contextApplies\n ? explicitCompression || compressionFromContextWindow(contextWindow) || state.contextCompression\n : state.contextCompression;\n const hasLiveCompressionUpdate = Boolean(\n contextApplies\n && (\n explicitCompression?.active\n || compressionFromContextWindow(\n mergeContextWindowUpdate(null, contextPayload),\n )?.active\n )\n );\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const hasCanonicalResponseBlocks = Array.isArray(payload.response_blocks);\n const content = hasCanonicalResponseBlocks\n ? projection.content\n : delta\n ? `${existing?.content || \"\"}${delta}`\n : projection.content || existing?.content || \"\";\n const projectedParts = hasCanonicalResponseBlocks\n ? projection.parts\n : delta\n ? appendAssistantDelta(\n existing?.parts || [],\n delta,\n typeof payload.block_id === \"string\" ? payload.block_id : `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(preserveResolvedHitlParts(existing?.parts || [], projectedParts), event);\n const compressionPart = contextApplies && explicitCompression?.active\n ? contextCompressionPartFromEvent(event, lifecycleParts)\n : null;\n const parts = compressionPart\n ? upsertResponseBlockParts(lifecycleParts, [compressionPart])\n : lifecycleParts;\n const activeThreadId = eventThreadId || state.activeThreadId;\n let messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n strictMessageId: distinctSegment,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal || responseCompleted,\n responseCompletion: completion,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || responseCompleted || message.isFinal,\n responseCompletion: completion || message.responseCompletion,\n }),\n });\n if (responseCompleted) messages = messages.map((message) => {\n if (message.role !== \"assistant\" || message.runId !== runId) return message;\n const segment = completion?.segments.find((item) => item.message_id === message.durableId\n || item.message_id === message.id || message.id.endsWith(`-assistant-${item.segment_id}`))\n || (!message.segmentIndex || message.segmentIndex === 1 ? completion?.segments[0] : undefined);\n return { ...message, isFinal: true, responseCompletion: completion,\n ...(segment ? { durableId: segment.message_id } : {}) };\n });\n const activityStatus: NonNullable<StoredChatThread[\"active_run\"]>[\"status\"] = suspension || (paused ? \"paused\" : cancelling ? \"cancelling\" : \"running\");\n const terminalThread = runId && !sealedAfterTerminal ? {\n active_run: terminal ? null : { run_id: runId, status: activityStatus,\n started_at: state.threads.find(thread => thread.id === activeThreadId)?.active_run?.started_at ?? null,\n created_at: state.threads.find(thread => thread.id === activeThreadId && thread.active_run?.run_id === runId)?.active_run?.created_at ?? event.ts,\n is_cancellable: !cancelling },\n last_run_status: terminal ? eventName.slice(4) : activityStatus,\n } : {};\n const threads = activeThreadId\n ? state.threads.some((thread) => thread.id === activeThreadId)\n ? state.threads.map((thread) => thread.id === activeThreadId\n ? {\n ...thread,\n messages,\n isHydrated: true,\n last_run_id: terminal && thread.active_run && thread.active_run.run_id !== runId\n ? thread.last_run_id : runId ?? thread.last_run_id,\n ...(!terminal || !thread.active_run || thread.active_run.run_id === runId ? terminalThread : {}),\n contextWindow,\n contextCompression,\n }\n : thread)\n : [{\n id: activeThreadId,\n title: null,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages,\n isHydrated: true,\n last_run_id: runId,\n ...terminalThread,\n contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal || sealedAfterTerminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n messages,\n threads,\n contextWindow,\n contextCompression,\n contextCompressionRevision: hasLiveCompressionUpdate\n ? state.contextCompressionRevision + 1\n : state.contextCompressionRevision,\n runState: sealedAfterTerminal ? state.runState : suspension || (paused\n ? \"paused\"\n : cancelling\n ? \"cancelling\"\n : terminal\n ? eventName === \"run.completed\"\n ? \"completed\"\n : eventName === \"run.cancelled\"\n ? \"cancelled\"\n : \"failed\"\n : \"streaming\"),\n streamingMessageId: terminal || paused || suspension || responseCompleted || existing?.responseCompletion ? null : messageId,\n };\n}\n\nexport function applyRuntimeEvents(\n state: AgentChatState,\n events: readonly RuntimeEvent[],\n): AgentChatState {\n return events.reduce(applyRuntimeEvent, state);\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\n if (String(event.event) === \"thread.task.updated\") {\n const value = event as unknown as { thread_id: string; task: Record<string, unknown> };\n const handle = value.task?.handle;\n if (typeof handle !== \"string\") return threads;\n return threads.map(thread => thread.id === value.thread_id ? { ...thread,\n taskNotifications: [...(thread.taskNotifications || []).filter(task => task.handle !== handle),\n { ...value.task, handle }].slice(-1000) } : thread);\n }\n if (event.event === \"snapshot_required\") return threads;\n if (event.event === \"thread.deleted\") return threads.filter((thread) => thread.id !== event.thread_id);\n if (event.event !== \"thread.summary.updated\") return threads;\n const incoming = event.thread as StoredChatThread;\n const index = threads.findIndex((thread) => thread.id === incoming.id);\n if (index === -1) return [{ ...incoming, messages: incoming.messages || [], isHydrated: false }, ...threads];\n const next = [...threads];\n next[index] = preferNewestThreadSummary(next[index], {\n ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated,\n });\n return next;\n}\n","import * as React from \"react\";\nimport { measureOptimisticPaint } from \"./chat-timing\";\nimport { captureChatOperation } from \"./operation-ownership\";\nimport type { ChatMessage } from \"./model\";\nimport { appendStableStreamingTurn, type AgentChatState } from \"./state\";\nimport type {\n ThreadMessage, ThreadMessageInput, ThreadMessageQueueState,\n ThreadMessageSubmission, ThreadMessagesPage,\n AbortSignalLike,\n} from \"@agents24/client\";\n\n/** Retry uncertain admission once; the caller retains the same receipt and payload. */\nexport async function retrySubmissionAdmission<T>(admit: () => Promise<T>): Promise<T> {\n try { return await admit(); }\n catch (error) {\n const failure = error as { kind?: string; name?: string } | null;\n if (failure?.kind !== \"network\" && failure?.name !== \"HttpRequestTimeoutError\"\n && !(error instanceof TypeError)) throw error;\n return admit();\n }\n}\n\nexport type ThreadMessageNotice = {\n messageId: string;\n status: string;\n runId: string | null;\n cursor?: number;\n clientSubmissionId?: string | null;\n};\n\nexport type ThreadMessageQueueTransport = {\n list(threadId: string, signal?: AbortSignalLike): Promise<ThreadMessagesPage>;\n submit(input: ThreadMessageInput): Promise<ThreadMessageSubmission>;\n edit(message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }): Promise<ThreadMessage>;\n remove(message: ThreadMessage): Promise<void>;\n resume(threadId: string): Promise<{ run_id: string | null }>;\n};\n\nexport type RetractedMessageDraft = Pick<ThreadMessage, \"text\" | \"attachment_ids\" | \"attachments\">;\n\nexport function useThreadMessageQueue({ threadId, transport, onPromoted, onUnknownPromotion, onOptimistic, onDiscard, ownOperation: ownSelection }: {\n threadId: string | null;\n ownOperation?: (options?: Parameters<typeof captureChatOperation>[1]) => () => boolean;\n transport: ThreadMessageQueueTransport;\n onPromoted: (message: ThreadMessage, runId: string) => void;\n onUnknownPromotion?: (runId: string, threadId: string) => void;\n onOptimistic?: (message: ThreadMessage, uploading: boolean) => void;\n onDiscard?: (message: ThreadMessage) => void;\n}) {\n const [pendingMessages, setPendingMessages] = React.useState<readonly ThreadMessage[]>([]);\n const [messageQueue, setMessageQueue] = React.useState<ThreadMessageQueueState | null>(null);\n const pendingRef = React.useRef(new Map<string, ThreadMessage & { optimisticQueued?: boolean }>());\n const admissionRef = React.useRef<{ threadId: string; done: Promise<void> } | null>(null);\n const initialAdmissionRef = React.useRef<{ id: string; threadId?: string; failure?: unknown; isCurrent: () => boolean;\n done: Promise<string | null>; resolve(threadId: string | null): void } | null>(null);\n const versionRef = React.useRef(0);\n const cursorRef = React.useRef(0);\n const promotedRef = React.useRef(new Set<string>());\n const threadRef = React.useRef(threadId);\n const selectionGenerationRef = React.useRef(0);\n if (threadRef.current !== threadId && initialAdmissionRef.current?.threadId !== threadId) selectionGenerationRef.current += 1;\n const transportRef = React.useRef(transport);\n const onPromotedRef = React.useRef(onPromoted);\n threadRef.current = threadId;\n transportRef.current = transport;\n onPromotedRef.current = onPromoted;\n const ownSelectionRef = React.useRef(ownSelection);\n ownSelectionRef.current = ownSelection;\n const callbacksRef = React.useRef({ onOptimistic, onDiscard, onUnknownPromotion });\n callbacksRef.current = { onOptimistic, onDiscard, onUnknownPromotion };\n\n const ownOperation = React.useCallback((options?: Parameters<typeof captureChatOperation>[1]) => ownSelectionRef.current?.(options) ?? captureChatOperation(() => ({\n generation: selectionGenerationRef.current, threadId: threadRef.current,\n }), options), []);\n const confirmThreadAdmission = React.useCallback((admittedThreadId: string) => {\n const initial = initialAdmissionRef.current;\n if (!initial || !initial.isCurrent()) return;\n initial.threadId = admittedThreadId;\n initial.resolve(admittedThreadId);\n }, []);\n const assertCurrent = (isCurrent: () => boolean) => {\n if (!isCurrent()) throw Object.assign(new Error(\"Thread selection changed.\"), { name: \"AbortError\" });\n };\n\n const knownMessage = (id: string, submissionId?: string | null) => pendingRef.current.get(id)\n || (submissionId ? [...pendingRef.current.values()].find((item) => item.client_submission_id === submissionId) : undefined);\n\n const hydrate = React.useCallback((page: ThreadMessagesPage, selectedThreadId: string) => {\n if (threadRef.current !== selectedThreadId) return;\n const pending = page.pending.filter((message) => !promotedRef.current.has(message.id)).map((message) => {\n const known = knownMessage(message.id, message.client_submission_id);\n if (message.attachments?.length || !known?.attachments?.length) return message;\n return { ...message, attachments: known.attachments.filter((attachment) =>\n message.attachment_ids.includes(attachment.id)) };\n });\n for (const message of pending) pendingRef.current.set(message.id, message);\n const optimistic = [...pendingRef.current.values()].filter((message) => message.thread_id === selectedThreadId\n && message.revision === 0 && message.optimisticQueued && !pending.some((item) => item.client_submission_id === message.client_submission_id));\n setPendingMessages([...pending, ...optimistic]);\n setMessageQueue(page.queue);\n }, []);\n\n const refresh = React.useCallback(async (selectedThreadId = threadRef.current, signal?: AbortSignalLike) => {\n if (!selectedThreadId) return null;\n const isCurrent = ownOperation();\n const version = ++versionRef.current;\n const page = await transportRef.current.list(selectedThreadId, signal);\n if (signal?.aborted || !isCurrent() || version !== versionRef.current || threadRef.current !== selectedThreadId) return null;\n for (const item of page.items) {\n if (item.role === \"user\" && item.status === \"delivered\" && item.run_id) {\n const pending = knownMessage(item.id, item.client_submission_id);\n if (pending && !promotedRef.current.has(item.id)) {\n promotedRef.current.add(item.id);\n pendingRef.current.delete(pending.id);\n pendingRef.current.delete(item.id);\n onPromotedRef.current({ ...pending, ...item,\n attachments: item.attachments?.length ? item.attachments : pending.attachments }, item.run_id);\n }\n }\n }\n hydrate(page, selectedThreadId);\n return page;\n }, [hydrate, ownOperation]);\n\n const acceptNotice = React.useCallback((notice: ThreadMessageNotice) => {\n if (notice.cursor && notice.cursor <= cursorRef.current) return false;\n if (notice.cursor) cursorRef.current = notice.cursor;\n const pending = knownMessage(notice.messageId, notice.clientSubmissionId);\n if (notice.status === \"delivered\" && notice.runId && !promotedRef.current.has(notice.messageId)) {\n promotedRef.current.add(notice.messageId);\n versionRef.current += 1;\n if (pending) {\n pendingRef.current.delete(pending.id);\n setPendingMessages((current) => current.filter((message) => message.id !== pending.id));\n onPromotedRef.current({ ...pending, id: notice.messageId, run_id: notice.runId, status: \"delivered\" }, notice.runId);\n } else if (threadRef.current) callbacksRef.current.onUnknownPromotion?.(notice.runId, threadRef.current);\n }\n if (notice.status === \"removed\") pendingRef.current.delete(notice.messageId);\n return true;\n }, []);\n\n const beginSubmission = React.useCallback((input: {\n input: string; clientSubmissionId: string; mode?: \"queue\" | \"steer\";\n attachmentIds?: readonly string[]; attachments?: ThreadMessage[\"attachments\"]; uploading?: boolean;\n }, queued = false) => {\n const now = new Date().toISOString();\n const message: ThreadMessage = {\n id: input.clientSubmissionId, client_submission_id: input.clientSubmissionId,\n thread_id: threadRef.current || \"\", sequence: Number.MAX_SAFE_INTEGER,\n run_id: null, turn_id: null, segment_index: 0, role: \"user\",\n status: \"queued\", requested_mode: input.mode || \"queue\", text: input.input,\n attachment_ids: input.attachmentIds || input.attachments?.map((item) => item.id) || [], attachments: input.attachments,\n response_blocks: [], revision: 0, created_at: now, updated_at: now,\n };\n pendingRef.current.set(message.id, { ...message, optimisticQueued: queued });\n if (!queued && !threadRef.current && !initialAdmissionRef.current) {\n let resolve!: (threadId: string | null) => void;\n const done = new Promise<string | null>(callback => { resolve = callback; });\n initialAdmissionRef.current = { id: message.id, done, resolve, isCurrent: ownOperation({ adoptThread: true }) };\n }\n versionRef.current += 1;\n if (queued) setPendingMessages((current) => [...current, message]);\n else callbacksRef.current.onOptimistic?.(message, Boolean(input.uploading));\n measureOptimisticPaint(input.clientSubmissionId, threadRef.current);\n return message;\n }, [ownOperation]);\n\n const discardSubmission = React.useCallback((message: ThreadMessage, failure?: unknown) => {\n if (initialAdmissionRef.current?.id === message.id) {\n initialAdmissionRef.current.failure = failure;\n initialAdmissionRef.current.resolve(null);\n initialAdmissionRef.current = null;\n }\n if (!pendingRef.current.has(message.id)) return;\n pendingRef.current.delete(message.id);\n callbacksRef.current.onDiscard?.(message);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== message.client_submission_id));\n }, []);\n\n const submit = React.useCallback(async (input: Omit<ThreadMessageInput, \"threadId\"> & {\n attachments?: ThreadMessage[\"attachments\"];\n queued?: boolean;\n uploading?: boolean;\n prepare?: () => Promise<Pick<ThreadMessageInput, \"attachmentIds\"> & { attachments?: ThreadMessage[\"attachments\"] }>;\n }) => {\n const initial = !threadRef.current ? initialAdmissionRef.current : null;\n let selectedThreadId = threadRef.current;\n if (!selectedThreadId && !initial) throw new Error(\"No active Agent thread is available.\");\n const isCurrent = ownOperation({ adoptThread: Boolean(initial) });\n const { queued: requestedQueued, prepare, attachments, uploading, ...submission } = input;\n const priorAdmission = admissionRef.current?.threadId === (selectedThreadId || \"\") ? admissionRef.current.done : undefined;\n const queued = Boolean(requestedQueued || priorAdmission || initial);\n const optimistic = beginSubmission({ ...submission, attachments, uploading,\n clientSubmissionId: submission.clientSubmissionId || submission.idempotencyKey }, queued);\n let releaseAdmission!: () => void;\n const admission = { threadId: selectedThreadId || \"\", done: new Promise<void>((resolve) => { releaseAdmission = resolve; }) };\n admissionRef.current = admission;\n try {\n const prepared = prepare ? await prepare() : {};\n if (initial) selectedThreadId = await initial.done;\n if (priorAdmission) await priorAdmission;\n assertCurrent(isCurrent);\n if (!selectedThreadId) throw Object.assign(new Error(\"Initial message admission did not complete.\"), { name: \"AbortError\" });\n admission.threadId = selectedThreadId;\n pendingRef.current.set(optimistic.id, { ...optimistic, optimisticQueued: queued, attachment_ids: prepared.attachmentIds || optimistic.attachment_ids, attachments: prepared.attachments || attachments });\n const request = { ...submission, ...prepared, clientSubmissionId: optimistic.client_submission_id!, threadId: selectedThreadId };\n const result = await retrySubmissionAdmission(() => transportRef.current.submit(request));\n if (!isCurrent()) return result;\n versionRef.current += 1;\n const bound: ThreadMessage = { ...optimistic, id: result.message_id,\n client_submission_id: result.client_submission_id || optimistic.client_submission_id,\n attachment_ids: request.attachmentIds || [], attachments: prepared.attachments || attachments,\n run_id: result.run_id, status: result.status, revision: 1 };\n pendingRef.current.delete(optimistic.id);\n if (result.run_id) {\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== bound.client_submission_id));\n if (!promotedRef.current.has(bound.id)) {\n promotedRef.current.add(bound.id);\n onPromotedRef.current(bound, result.run_id);\n }\n } else if (!promotedRef.current.has(bound.id)) {\n if (!queued) callbacksRef.current.onDiscard?.(optimistic);\n pendingRef.current.set(bound.id, bound);\n setPendingMessages((current) => [...current.filter((item) => item.client_submission_id !== bound.client_submission_id), bound]);\n }\n void refresh().catch(() => undefined);\n return result;\n } catch (error) {\n if (isCurrent()) discardSubmission(optimistic);\n throw error; // Composer restores this draft only if newer typing is absent.\n } finally {\n void Promise.resolve(priorAdmission).then(() => {\n releaseAdmission();\n if (admissionRef.current === admission) admissionRef.current = null;\n });\n }\n }, [beginSubmission, discardSubmission, refresh, ownOperation]);\n\n const edit = React.useCallback(async (message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }) => {\n const isCurrent = ownOperation();\n const updated = await transportRef.current.edit(message, input);\n assertCurrent(isCurrent);\n versionRef.current += 1;\n pendingRef.current.set(updated.id, updated);\n await refresh(message.thread_id);\n return updated;\n }, [refresh, ownOperation]);\n\n const remove = React.useCallback(async (message: ThreadMessage) => {\n const isCurrent = ownOperation();\n await transportRef.current.remove(message);\n assertCurrent(isCurrent);\n versionRef.current += 1;\n pendingRef.current.delete(message.id);\n setPendingMessages((current) => current.filter((item) => item.id !== message.id));\n await refresh(message.thread_id);\n }, [refresh, ownOperation]);\n\n const retractForEdit = React.useCallback(async (message: ThreadMessage): Promise<RetractedMessageDraft> => {\n const isCurrent = ownOperation();\n await remove(message);\n assertCurrent(isCurrent);\n return { text: message.text, attachment_ids: message.attachment_ids, attachments: message.attachments };\n }, [remove, ownOperation]);\n\n const resume = React.useCallback(async () => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) return null;\n const isCurrent = ownOperation();\n const result = await transportRef.current.resume(selectedThreadId);\n if (!isCurrent()) return null;\n await refresh(selectedThreadId);\n return result;\n }, [refresh, ownOperation]);\n\n const reset = React.useCallback(() => {\n initialAdmissionRef.current?.resolve(null);\n initialAdmissionRef.current = null;\n admissionRef.current = null;\n selectionGenerationRef.current += 1;\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n pendingRef.current.clear();\n setPendingMessages([]);\n setMessageQueue(null);\n }, []);\n\n React.useEffect(() => {\n const initial = initialAdmissionRef.current;\n const adopting = Boolean(initial?.threadId && initial.threadId === threadId && initial.isCurrent());\n if (adopting) {\n for (const [id, message] of pendingRef.current) pendingRef.current.set(id, { ...message, thread_id: threadId! });\n initialAdmissionRef.current = null;\n } else {\n initial?.resolve(null);\n initialAdmissionRef.current = null;\n pendingRef.current.clear();\n setPendingMessages([]);\n }\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n setMessageQueue(null);\n if (threadId) void refresh(threadId).catch(() => undefined);\n return () => { initialAdmissionRef.current?.resolve(null); };\n }, [threadId, refresh]);\n\n\n return { pendingMessages, messageQueue, refresh, hydrate, acceptNotice, beginSubmission, discardSubmission, reset,\n confirmThreadAdmission, hasPendingAdmission: () => Boolean(initialAdmissionRef.current?.isCurrent()),\n waitForInitialAdmission: () => {\n const initial = initialAdmissionRef.current;\n return initial ? initial.done.then(threadId => {\n if (!threadId) throw initial.failure || Object.assign(new Error(\"Initial message admission detached.\"), { name: \"AbortError\" });\n return threadId;\n }) : Promise.resolve(threadRef.current);\n },\n submit, edit, remove, retractForEdit, resume };\n}\n\n/** One provisional identity for first sends, idle sends, uploads and queue rows. */\nexport function optimisticSubmissionTurn(message: ThreadMessage): [ChatMessage, ChatMessage] {\n const user: ChatMessage = { id: message.client_submission_id || message.id,\n clientSubmissionId: message.client_submission_id || undefined,\n role: \"user\", content: message.text, createdAt: message.created_at, isFinal: true,\n parts: message.text ? [{ id: `${message.id}:text`, type: \"text\", kind: \"text\", text: message.text }] : [],\n attachments: message.attachments?.map((item) => ({ id: item.id, filename: item.filename,\n mediaType: item.mime_type, byteSize: item.byte_size })),\n };\n return [user, { id: `${user.id}:assistant`, role: \"assistant\", content: \"\", parts: [],\n createdAt: message.created_at, isFinal: false }];\n}\n\nexport function optimisticSubmissionState(state: AgentChatState, message: ThreadMessage, uploading: boolean): AgentChatState {\n const [user, assistant] = optimisticSubmissionTurn(message);\n return { ...state, messages: appendStableStreamingTurn(state.messages, user, assistant),\n streamingMessageId: assistant.id, runState: uploading ? \"uploading\" : \"streaming\", error: null };\n}\n\nexport function discardOptimisticSubmission(state: AgentChatState, message: ThreadMessage): AgentChatState {\n const activeDraft = state.streamingMessageId === `${message.id}:assistant`;\n return { ...state, messages: state.messages.filter((item) => item.runId\n || (item.id !== message.id && item.id !== `${message.id}:assistant`)),\n streamingMessageId: activeDraft ? null : state.streamingMessageId,\n runState: activeDraft && !state.activeRunId ? \"idle\" : state.runState };\n}\n","import { runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\n\n/** Browser paint evidence is independent of backend trace timestamps. */\nexport function measureOptimisticPaint(submissionId: string, threadId: string | null): void {\n const runtime = globalThis as unknown as {\n document?: { visibilityState: string };\n performance?: { now(): number; clearMeasures(name: string): void;\n measure(name: string, options: { start: number; end: number; detail: unknown }): void };\n };\n const schedule = runtimeEventFrameScheduler();\n const performance = runtime.performance;\n if (!schedule || !performance || runtime.document?.visibilityState === \"hidden\") return;\n const start = performance.now();\n // Observe the first frame's opportunity to paint; retain one bounded entry.\n schedule(() => schedule(() => {\n performance.clearMeasures(\"agents24.optimistic-paint\");\n performance.measure(\"agents24.optimistic-paint\", { start, end: performance.now(),\n detail: { client_submission_id: submissionId, thread_id: threadId } });\n }));\n}\n","/** A selection generation distinguishes A → B → A from uninterrupted ownership. */\nexport type ChatOperationOwner = {\n generation: number;\n client?: unknown;\n threadId: string | null;\n runId?: string | null;\n stream?: unknown;\n};\n\nexport function captureChatOperation(\n read: () => ChatOperationOwner,\n options: { run?: boolean; stream?: boolean; adoptThread?: boolean } = {},\n): () => boolean {\n const owner = read();\n return () => {\n const current = read();\n return current.client === owner.client\n && current.generation === owner.generation\n && (options.adoptThread || current.threadId === owner.threadId)\n && (!options.run || current.runId === owner.runId)\n && (!options.stream || current.stream === owner.stream);\n };\n}\n","import type { AgentClient, HitlResponse, HitlResumeResult } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatHitlPart } from \"./model\";\nimport { threadTimelineToMessages } from \"./model\";\nimport type { AgentChatState } from \"./state\";\nimport type { Agents24ReactRuntime } from \"./provider\";\nimport { findHitlResolution, type HitlDecisionReceipt } from \"./hitl-resolution\";\nimport { createHitlSubmission, type HitlSubmissionOptions, type HitlSubmissionState } from \"./hitl-submission\";\n\nfunction hitlSubmissionKey(threadId: string | null, runId: string, interruptId: string, generation: number): string {\n return `${generation}:${threadId}:${runId}:${interruptId}`;\n}\n\nexport function useAgentChatHitlSubmissions(options: {\n client: AgentClient;\n runtime: Agents24ReactRuntime;\n pageSize: number;\n stateRef: React.MutableRefObject<AgentChatState>;\n selectionGeneration: React.MutableRefObject<number>;\n ownOperation(): () => boolean;\n accept(receipt: HitlDecisionReceipt): void;\n attach(runId: string): void;\n}) {\n const latest = React.useRef(options);\n latest.current = options;\n const mounted = React.useRef(true);\n const operations = React.useRef(new Map<string, ReturnType<typeof createHitlSubmission>>());\n const [states, setStates] = React.useState<Record<string, HitlSubmissionState>>({});\n const clientRef = React.useRef(options.client);\n if (clientRef.current !== options.client) {\n clientRef.current = options.client;\n operations.current.clear();\n }\n React.useEffect(() => { mounted.current = true; return () => { mounted.current = false; operations.current.clear(); }; }, []);\n const resumeHitl = React.useCallback((part: ChatHitlPart, response: HitlResponse, submission?: HitlSubmissionOptions): Promise<void> => {\n const captured = latest.current;\n const { client, runtime, stateRef, ownOperation, pageSize } = captured;\n const threadId = stateRef.current.activeThreadId;\n const runId = part.runId || stateRef.current.messages.find(message => message.parts.some(candidate => candidate.id === part.id))?.runId || stateRef.current.activeRunId;\n if (!threadId || !runId) return Promise.reject(new Error(\"No paused run is available to resume.\"));\n const isOwned = ownOperation();\n const isCurrent = () => mounted.current && latest.current.client === client && isOwned()\n && (!stateRef.current.activeRunId || stateRef.current.activeRunId === runId);\n const key = hitlSubmissionKey(threadId, runId, part.interruptId, captured.selectionGeneration.current);\n const live = stateRef.current.messages.filter(message => message.runId === runId).flatMap(message => message.parts)\n .find((candidate): candidate is ChatHitlPart => candidate.kind === \"hitl\" && candidate.interruptId === part.interruptId);\n if (part.status !== \"pending\" || (live && live.status !== \"pending\")) return Promise.resolve();\n const previous = operations.current.get(key);\n if (previous && !previous.failed) return previous.retry();\n if ( [\"cancelling\", \"cancelled\", \"failed\", \"completed\"].includes(stateRef.current.runState)) return Promise.resolve();\n const operation = createHitlSubmission({\n response, idempotencyKey: runtime.createId(), prepare: submission?.prepare,\n createAbortController: runtime.createAbortController, isCurrent,\n send: (decision, idempotencyKey, signal) => client.hitl.resume({ runId, interruptId: part.interruptId, ...decision, idempotencyKey, signal }),\n accept: receipt => {\n captured.accept(receipt);\n if (![\"completed\", \"failed\", \"cancelled\"].includes(receipt.run_status || \"\")) captured.attach(receipt.run_id);\n },\n reconcile: async signal => {\n const [page, detail] = await Promise.all([\n client.threads.messages.list({ threadId, limit: pageSize, signal }),\n client.threads.get({ threadId, limit: pageSize, signal }),\n ]);\n if (!isCurrent()) return null;\n const part = findHitlResolution(threadTimelineToMessages(page.items), runId, capturedPart.interruptId);\n if (!part?.resolution) return null;\n return { run_id: runId, thread_id: threadId, interrupt_id: part.interruptId,\n run_status: detail.active_run?.run_id === runId ? detail.active_run.status\n : detail.last_run_id === runId ? detail.last_run_status || undefined : undefined,\n resolution: { ...part.resolution, status: part.status as HitlResumeResult[\"resolution\"][\"status\"],\n action: (part.resolution.action as HitlResumeResult[\"action\"]) || null,\n outcome: part.resolution.outcome || part.status,\n resolved_at: part.resolution.resolved_at as string | null,\n answers: part.resolution.answers?.map(answer => ({ question_id: answer.questionId,\n selected_option_ids: answer.selectedOptionIds, custom_text: answer.customText })),\n } };\n },\n changed: state => { if (isCurrent()) setStates(current => ({ ...current, [key]: state })); },\n timing: (stage, durationMs) => runtime.onHitlTiming?.({ stage, durationMs }),\n });\n const capturedPart = part;\n // Set the lock before a prerequisite, transport, or React render can yield.\n operations.current.set(key, operation);\n return operation.retry();\n }, []);\n // Selection ownership is part of the retained operation, including A → B → A.\n const selection = options.stateRef.current.activeThreadId;\n const generation = options.selectionGeneration.current;\n React.useEffect(() => {\n const prefix = `${generation}:${selection}:`;\n for (const key of operations.current.keys()) if (!key.startsWith(prefix)) operations.current.delete(key);\n setStates(current => Object.fromEntries(Object.entries(current).filter(([key]) => key.startsWith(prefix))));\n }, [options.client, selection, generation]);\n return { resumeHitl, getHitlSubmissionState: (part: ChatHitlPart) => {\n const runId = part.runId || options.stateRef.current.messages.find(message => message.parts.some(candidate => candidate.id === part.id))?.runId || options.stateRef.current.activeRunId;\n const key = runId ? hitlSubmissionKey(selection, runId, part.interruptId, generation) : null;\n const state = key && operations.current.has(key) ? states[key] : undefined;\n if (!state) return undefined;\n if (part.status !== \"pending\") {\n return !options.stateRef.current.activeRunId || [\"completed\", \"failed\", \"cancelled\"].includes(options.stateRef.current.runState)\n ? undefined : { action: String(part.resolution?.action || state.action), status: \"accepted\" as const };\n }\n return state;\n } };\n}\n","import type { AbortSignalLike, HitlResponse, HitlResumeResult } from \"@agents24/client\";\nimport type { HitlDecisionReceipt } from \"./hitl-resolution\";\nimport type { AbortControllerFactory } from \"./lifecycle\";\n\nexport type HitlSubmissionOptions = {\n /** Host-owned prerequisite. Runs inside the submission lock and decision deadline. */\n prepare?: (input: { signal: AbortSignalLike }) => Promise<void>;\n};\nexport type HitlSubmissionState = {\n action: string;\n status: \"submitting\" | \"checking\" | \"uncertain\" | \"accepted\" | \"error\";\n error?: string | null;\n retry?: () => Promise<void>;\n};\n\ntype TimerRuntime = { setTimeout(callback: () => void, ms: number): unknown; clearTimeout(handle: unknown): void };\nconst timers = globalThis as unknown as TimerRuntime;\n\n/** A separate deadline for decisions and reconciliation, never for continuation streams. */\nexport async function withHitlDeadline<T>(factory: AbortControllerFactory, work: (signal: AbortSignalLike) => Promise<T>, ms = 15_000): Promise<T> {\n const abort = factory();\n let timer: unknown;\n try {\n return await Promise.race([work(abort.signal), new Promise<never>((_, reject) => {\n timer = timers.setTimeout(() => { abort.abort(); reject(new Error(\"Submission acknowledgement timed out.\")); }, ms);\n })]);\n } finally { timers.clearTimeout(timer); }\n}\n\nexport function isDefinitiveHitlRejection(error: unknown): boolean {\n const status = (error as { status?: number; statusCode?: number } | null)?.status\n ?? (error as { statusCode?: number } | null)?.statusCode;\n // A processing/conflicting decision may already be durable. Read it before offering anything.\n return typeof status === \"number\" && status >= 400 && status < 500 && ![408, 409, 425, 429].includes(status);\n}\n\n/** One immutable decision; retry is the very same operation and idempotency identity. */\nexport function createHitlSubmission(options: {\n response: HitlResponse;\n idempotencyKey: string;\n prepare?: HitlSubmissionOptions[\"prepare\"];\n createAbortController: AbortControllerFactory;\n isCurrent(): boolean;\n send(response: HitlResponse, key: string, signal: AbortSignalLike): Promise<HitlResumeResult>;\n reconcile(signal: AbortSignalLike): Promise<HitlDecisionReceipt | null>;\n accept(receipt: HitlDecisionReceipt): void;\n changed(state: HitlSubmissionState): void;\n now?: () => number;\n timing?: (stage: \"preparation\" | \"acknowledgement\", durationMs: number) => void;\n}) {\n const response: HitlResponse = { ...options.response, answers: options.response.answers?.map(answer => ({\n ...answer, selected_option_ids: [...answer.selected_option_ids],\n })) };\n let pending: Promise<void> | undefined;\n let accepted = false;\n let failed = false;\n let uncertain = false;\n const now = options.now ?? Date.now;\n const publish = (state: HitlSubmissionState) => { if (options.isCurrent()) options.changed(state); };\n const accept = (receipt: HitlDecisionReceipt) => {\n if (!options.isCurrent() || accepted) return;\n accepted = true;\n uncertain = false;\n options.accept(receipt);\n publish({ action: receipt.resolution.action || response.action, status: \"accepted\" });\n };\n const retry = (): Promise<void> => {\n if (pending) return pending;\n if (accepted || !options.isCurrent()) return Promise.resolve();\n failed = false;\n uncertain = false;\n publish({ action: response.action, status: \"submitting\" });\n // The microtask lets the caller retain the operation synchronously, before any host work.\n pending = Promise.resolve().then(async () => {\n try {\n await withHitlDeadline(options.createAbortController, async signal => {\n const started = now();\n await options.prepare?.({ signal });\n options.timing?.(\"preparation\", now() - started);\n if (!options.isCurrent() || signal.aborted) return;\n const submitted = now();\n const receipt = await options.send(response, options.idempotencyKey, signal);\n options.timing?.(\"acknowledgement\", now() - submitted);\n // A late HTTP acknowledgement remains authoritative after a timeout.\n accept(receipt);\n });\n } catch (error) {\n if (!options.isCurrent() || accepted) return;\n if (isDefinitiveHitlRejection(error)) {\n failed = true;\n publish({ action: response.action, status: \"error\", error: error instanceof Error ? error.message : \"Submission was rejected.\" });\n throw error;\n }\n publish({ action: response.action, status: \"checking\" });\n // Existing authorized history is the recovery authority, not a guessed success.\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n const resolved = await withHitlDeadline(options.createAbortController, options.reconcile, 3_000);\n if (resolved) accept(resolved);\n } catch { /* Keep the immutable decision until an authorized read or retry succeeds. */ }\n if (accepted || !options.isCurrent()) return;\n }\n uncertain = true;\n publish({ action: response.action, status: \"uncertain\", retry });\n }\n }).finally(() => { pending = undefined; });\n return pending;\n };\n return { retry, get failed() { return failed; }, get uncertain() { return uncertain; } };\n}\n","import { applyHitlResolution, type HitlDecisionReceipt } from \"./hitl-resolution\";\nimport { useAgentChatHitlSubmissions } from \"./use-agent-chat-hitl-submissions\";\nimport type { HitlSubmissionOptions, HitlSubmissionState } from \"./hitl-submission\";\nimport type {\n AgentClient,\n AbortSignalLike,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n RuntimeEvent,\n ThreadMessage,\n ThreadMessageQueueState,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { captureChatOperation } from \"./operation-ownership\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadTimelineToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport { refreshChatSummaries } from \"./refresh-chat-summaries\";\nimport { useChatObservation } from \"./use-chat-observation\";\nimport { summaryToStored, useAgentChatThreadList } from \"./use-agent-chat-thread-list\";\nimport { useAgentChatFeedback } from \"./use-agent-chat-feedback\";\nimport { useAgentChatQueueActions } from \"./use-agent-chat-queue-actions\";\nimport { optimisticSubmissionState, discardOptimisticSubmission, useThreadMessageQueue, type RetractedMessageDraft, type ThreadMessageQueueTransport } from \"./thread-message-queue\";\nimport {\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n adoptStreamingThread,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n promoteThreadMessage,\n prependThreadTimeline,\n reconcileThreadTimeline,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n uploads?: readonly PortableUpload[];\n requestedModelId?: string;\n requestedAgentId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n observation?: \"on-demand\" | \"realtime\";\n};\n\nexport type AgentChatController = AgentChatState & {\n pendingMessages: readonly ThreadMessage[];\n messageQueue: ThreadMessageQueueState | null;\n activeThread: StoredChatThread | null;\n hasOlderTurns: boolean;\n hasMoreThreads: boolean;\n isLoadingHistory: boolean;\n isLoadingMoreThreads: boolean;\n isLoadingOlder: boolean;\n isLoadingThreads: boolean;\n isSubmitting: boolean;\n attachRun(runId: string, cursor?: number): Promise<void>;\n cancelRun(): Promise<void>;\n clearBackgroundError(): void;\n clearOperationError(operation?: AgentChatOperation): void;\n deleteThread(threadId: string): Promise<void>;\n detach(): void;\n loadOlder(): Promise<void>;\n loadMoreThreads(): Promise<void>;\n openThread(threadId: string): Promise<void>;\n refreshThreads(): Promise<void>;\n regenerate(message: ChatMessage): Promise<void>;\n refreshMessages(threadId?: string): Promise<void>;\n editPendingMessage(message: ThreadMessage, input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">): Promise<void>;\n steerPendingMessage(message: ThreadMessage): Promise<void>;\n removePendingMessage(message: ThreadMessage): Promise<void>;\n retractPendingMessage(message: ThreadMessage): Promise<RetractedMessageDraft>;\n resumeQueue(): Promise<void>;\n steer(text: string): Promise<void>;\n resumeHitl(part: ChatHitlPart, response: HitlResponse, options?: HitlSubmissionOptions): Promise<void>;\n getHitlSubmissionState(part: ChatHitlPart): HitlSubmissionState | undefined;\n setFeedback(\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ): Promise<void>;\n startNewThread(): void;\n submit(input: AgentChatSubmitInput): Promise<void>;\n};\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const activity = getThreadActivity(thread);\n return thread.active_run ? activity.runId : null;\n}\n\nexport function useAgentChat(options: UseAgentChatOptions = {}): AgentChatController {\n const runtime = useAgents24Runtime();\n const client = options.client || runtime.client;\n const pageSize = options.pageSize ?? 30;\n const threadPageSize = options.threadPageSize ?? 50;\n const [state, setState] = React.useState<AgentChatState>(() => ({\n ...initialAgentChatState,\n activeThreadId: resolveInitialActiveThreadId(\n options,\n runtime.storage?.loadActiveThreadId?.() ?? null,\n ),\n threads: runtime.storage?.loadThreads() ?? [],\n }));\n const [isLoadingHistory, setIsLoadingHistory] = React.useState(false);\n const [isLoadingOlder, setIsLoadingOlder] = React.useState(false);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const streamControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenGenerationRef = React.useRef(0);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const messageRefreshVersionRef = React.useRef(0);\n const promotedRunHintRef = React.useRef<string | null>(null);\n const promotedAttachRef = React.useRef<string | null>(null);\n const olderRequestRef = React.useRef<{ key: string; promise: Promise<void> } | null>(null);\n const submissionGenerationRef = React.useRef(0);\n const continuationTiming = React.useRef(new Map<string, { acknowledgedAt: number; attached: boolean; active: boolean }>());\n const resolutionFences = React.useRef(new Map<string, HitlDecisionReceipt>());\n const clientIdentityRef = React.useRef(client);\n if (clientIdentityRef.current !== client) { resolutionFences.current.clear(); continuationTiming.current.clear(); clientIdentityRef.current = client; }\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const ownOperation = React.useCallback((options?: Parameters<typeof captureChatOperation>[1]) => captureChatOperation(() => ({\n client: clientIdentityRef.current, generation: threadOpenGenerationRef.current, threadId: stateRef.current.activeThreadId,\n runId: stateRef.current.activeRunId, stream: streamControllerRef.current,\n }), options), []);\n\n const persist = React.useCallback((next: AgentChatState) => {\n runtime.storage?.saveThreads(next.threads);\n runtime.storage?.saveActiveThreadId?.(next.activeThreadId);\n }, [runtime.storage]);\n\n const update = React.useCallback((updater: (current: AgentChatState) => AgentChatState) => {\n let next = updater(stateRef.current);\n for (const receipt of resolutionFences.current.values()) next = { ...next,\n messages: applyHitlResolution(next.messages, receipt),\n threads: next.threads.map(thread => thread.id !== receipt.thread_id ? thread : { ...thread, messages: applyHitlResolution(thread.messages, receipt) }),\n };\n stateRef.current = next;\n persist(next);\n setState(next);\n }, [persist]);\n\n const queueTransport = React.useMemo<ThreadMessageQueueTransport>(() => ({\n list: (threadId, signal) => client.threads.messages.list({ threadId, limit: pageSize, signal }),\n submit: (input) => client.threads.messages.submit(input),\n edit: (message, input) => client.threads.messages.edit({\n threadId: message.thread_id, messageId: message.id, revision: message.revision,\n input: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids, mode: input.mode,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n }),\n remove: async (message) => {\n await client.threads.messages.remove({ threadId: message.thread_id, messageId: message.id, revision: message.revision });\n },\n resume: (threadId) => client.threads.resumeQueue({ threadId }),\n }), [client, pageSize]);\n const attachPromotion = React.useCallback((runId: string, threadId: string) => {\n if (stateRef.current.activeThreadId !== threadId) return;\n promotedRunHintRef.current = runId;\n if (stateRef.current.activeRunId === runId || promotedAttachRef.current === runId) return;\n promotedAttachRef.current = runId;\n const isCurrent = ownOperation();\n void attachRunRef.current(runId, 0).catch(() => {\n if (isCurrent() && promotedAttachRef.current === runId) promotedAttachRef.current = null;\n });\n }, [ownOperation]);\n const onQueuePromotion = React.useCallback((message: ThreadMessage, runId: string) => {\n if (stateRef.current.activeThreadId !== message.thread_id) return;\n const userMessage = threadTimelineToMessages([{ ...message, run_id: runId, status: \"delivered\" }])[0];\n update((current) => current.activeThreadId === message.thread_id\n ? { ...current, messages: promoteThreadMessage(current.messages, userMessage, runId),\n threads: current.threads.map(thread => thread.id === message.thread_id ? { ...thread,\n last_run_id: runId, last_run_status: \"running\",\n active_run: { run_id: runId, status: \"running\", started_at: null, created_at: message.created_at, is_cancellable: true },\n } : thread) } : current);\n attachPromotion(runId, message.thread_id);\n }, [update, attachPromotion]);\n const queue = useThreadMessageQueue({ threadId: state.activeThreadId, transport: queueTransport, ownOperation,\n onPromoted: onQueuePromotion, onUnknownPromotion: attachPromotion,\n onOptimistic: (message, uploading) => update((current) => optimisticSubmissionState(current, message, uploading)),\n onDiscard: (message) => update((current) => discardOptimisticSubmission(current, message)),\n });\n const { pendingMessages, messageQueue } = queue;\n\n const eventBuffer = React.useMemo(\n () => createRuntimeEventFrameBuffer(\n (events) => update((current) => applyRuntimeEvents(current, events)),\n runtimeEventFrameScheduler(),\n ),\n [update],\n );\n\n const clearOperationError = React.useCallback((operation?: AgentChatOperation) => {\n update((current) => clearAgentChatOperationError(current, operation));\n }, [update]);\n\n const clearBackgroundError = React.useCallback(() => {\n update(clearAgentChatBackgroundError);\n }, [update]);\n\n const failOperation = React.useCallback((operation: AgentChatOperation, cause: unknown) => {\n update((current) => withAgentChatOperationError(current, operation, cause));\n }, [update]);\n\n const { isLoadingThreads, isLoadingMoreThreads, threadTotal,\n eventsDuringRefreshRef: threadEventsDuringRefreshRef, refreshThreads, loadMoreThreads,\n } = useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation });\n\n const invalidateThreadOpen = React.useCallback(() => {\n threadOpenGenerationRef.current += 1;\n threadOpenControllerRef.current?.abort(\"Thread selection changed.\");\n threadOpenControllerRef.current = null;\n messageRefreshVersionRef.current += 1;\n promotedAttachRef.current = null;\n promotedRunHintRef.current = null;\n olderRequestRef.current = null;\n queue.reset();\n resolutionFences.current.clear();\n continuationTiming.current.clear();\n setIsSubmitting(false);\n setIsLoadingOlder(false);\n setIsLoadingHistory(false);\n }, [queue.reset]);\n\n const detach = React.useCallback(() => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [eventBuffer, update]);\n\n const refreshMessagesRef = React.useRef<() => Promise<void>>(async () => undefined);\n const { setFeedback, captureRead: captureFeedbackRead } = useAgentChatFeedback({\n client, update, clearOperationError, failOperation, ownOperation,\n refreshMessages: React.useCallback(() => refreshMessagesRef.current(), []),\n });\n\n const refreshMessages = React.useCallback(async (threadId?: string, promotedRunId?: string, signal?: AbortSignalLike) => {\n const target = threadId || stateRef.current.activeThreadId;\n if (!target) return;\n const isCurrent = ownOperation();\n const reconcileFeedback = captureFeedbackRead();\n const version = ++messageRefreshVersionRef.current;\n const page = await client.threads.messages.list({ threadId: target, limit: pageSize, ...(signal ? { signal } : {}) });\n if (!isCurrent() || stateRef.current.activeThreadId !== target || version !== messageRefreshVersionRef.current) return;\n queue.hydrate(page, target);\n const promoted = promotedRunId || promotedRunHintRef.current;\n if (promoted && page.items.some((message) => message.run_id === promoted)) promotedRunHintRef.current = null;\n update((current) => {\n if (!isCurrent() || current.activeThreadId !== target) return current;\n const messages = reconcileThreadTimeline(current.messages,\n reconcileFeedback(threadTimelineToMessages(page.items), current.messages), current.activeRunId, current.streamingMessageId);\n return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };\n });\n }, [client, ownOperation, pageSize, queue.hydrate, update, captureFeedbackRead]);\n refreshMessagesRef.current = refreshMessages;\n\n React.useEffect(() => () => {\n threadOpenGenerationRef.current += 1;\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n invalidateThreadOpen();\n const requestController = runtime.createAbortController();\n threadOpenControllerRef.current = requestController;\n const requestGeneration = threadOpenGenerationRef.current + 1;\n threadOpenGenerationRef.current = requestGeneration;\n detach();\n clearOperationError();\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n activeRunId: null,\n cursor: null,\n error: null,\n messages: current.threads.find((thread) => thread.id === threadId)?.messages || [],\n contextWindow: current.threads.find((thread) => thread.id === threadId)?.contextWindow || null,\n contextCompression: current.threads.find((thread) => thread.id === threadId)?.contextCompression || null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n streamingMessageId: null,\n }));\n const isCurrent = ownOperation();\n const reconcileFeedback = captureFeedbackRead();\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrent()) return;\n const timeline = await client.threads.messages.list({ threadId, limit: pageSize, signal: requestController.signal });\n if (!isCurrent()) return;\n queue.hydrate(timeline, threadId);\n const messages = reconcileFeedback(threadTimelineToMessages(timeline.items), stateRef.current.messages);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(timeline.paging.has_more),\n nextBeforeTurnIndex: timeline.paging.next_before_turn_index,\n ...context,\n };\n update((current) => isCurrent() ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\n runState: getThreadActivity(stored).isSpinning ? \"reconnecting\" : (stored.active_run?.status || \"idle\") as AgentChatState[\"runState\"],\n threads: current.threads.some((thread) => thread.id === threadId)\n ? current.threads.map((thread) => thread.id === threadId ? stored : thread)\n : [stored, ...current.threads],\n } : current);\n const activeRunId = activeRunIdFromThread(stored);\n if (\n activeRunId\n && getThreadActivity(stored).isSpinning\n && isCurrent()\n ) void attachRunRef.current(activeRunId).catch(() => undefined);\n } catch (error) {\n if (!requestController.signal.aborted && !isAbortLike(error) && requestGeneration === threadOpenGenerationRef.current) {\n failOperation(\"open_thread\", error);\n update((current) => restoreAgentChatThreadSelection(current, previousSelection));\n if (previousSelection.activeRunId) {\n void attachRunRef.current(previousSelection.activeRunId, previousSelection.cursor ?? undefined).catch(() => undefined);\n }\n throw error;\n }\n } finally {\n if (requestGeneration === threadOpenGenerationRef.current) {\n if (threadOpenControllerRef.current === requestController) threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }\n }\n }, [clearOperationError, client, detach, failOperation, pageSize, queue.hydrate, runtime, update, invalidateThreadOpen, ownOperation, captureFeedbackRead]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n const timing = continuationTiming.current.get(event.run_id);\n if (timing && !timing.attached) {\n timing.attached = true;\n runtime.onHitlTiming?.({ stage: \"attachment\", durationMs: Date.now() - timing.acknowledgedAt });\n }\n if (timing && !timing.active && [\"assistant.delta\", \"model.turn.started\", \"tool.started\"].includes(event.event)) {\n timing.active = true;\n runtime.onHitlTiming?.({ stage: \"first_activity\", durationMs: Date.now() - timing.acknowledgedAt });\n }\n if ([\"run.completed\", \"run.cancelled\", \"run.failed\"].includes(event.event)) continuationTiming.current.delete(event.run_id);\n const eventThreadId = typeof event.payload?.thread_id === \"string\"\n ? event.payload.thread_id.trim()\n : \"\";\n if (eventThreadId && !stateRef.current.activeThreadId) {\n queue.confirmThreadAdmission(eventThreadId);\n update((current) => adoptStreamingThread(current, eventThreadId));\n setIsSubmitting(false);\n }\n eventBuffer.push(event);\n }, [eventBuffer, update, queue.confirmThreadAdmission, runtime.onHitlTiming]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const isCurrent = ownOperation({ stream: true });\n clearOperationError(\"attach_run\");\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, leaseSeconds: 60, signal: controller.signal }, (event) => { if (isCurrent()) consumeEvent(event); });\n if (!isCurrent()) return;\n eventBuffer.flush();\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (!result.detached && result.threadId) await refreshMessages(result.threadId);\n } catch (error) {\n if (isCurrent() && !isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"reconnecting\", streamingMessageId: null }));\n failOperation(\"attach_run\", error);\n throw error;\n }\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, eventBuffer, failOperation, refreshMessages, runtime, update, ownOperation]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;\n const existingThreadId = stateRef.current.activeThreadId;\n if (existingThreadId || queue.hasPendingAdmission()) {\n const isCurrent = ownOperation({ adoptThread: !existingThreadId });\n const submissionGeneration = ++submissionGenerationRef.current;\n clearOperationError();\n setIsSubmitting(true);\n try {\n await queue.submit({\n mode: \"queue\", input: input.text.trim(),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((item, index) => ({ id: `upload-${index}`, filename: item.name,\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: 0 })),\n queued: Boolean(stateRef.current.activeRunId), uploading: Boolean(input.uploads?.length),\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n clientSubmissionId: runtime.createId(), idempotencyKey: runtime.createId(),\n prepare: async () => {\n const uploaded = input.uploads?.length ? await client.attachments.uploadBatch({\n uploads: input.uploads, threadId: existingThreadId || undefined,\n requestedAgentId: input.requestedAgentId, idempotencyKey: runtime.createId(),\n }) : [];\n if (input.uploads?.length && uploaded.length !== input.uploads.length) throw new Error(\"Attachment upload returned an incomplete batch\");\n return { attachmentIds: uploaded.length ? uploaded.map((item) => item.id) : input.attachmentIds,\n attachments: uploaded.length ? uploaded.map((item) => ({ id: item.id, filename: item.filename,\n mime_type: item.mime_type, byte_size: item.byte_size })) : undefined };\n },\n });\n } catch (error) {\n if (isCurrent()) failOperation(\"submit\", error);\n throw error;\n } finally {\n if (isCurrent() && submissionGeneration === submissionGenerationRef.current) setIsSubmitting(false);\n }\n return;\n }\n invalidateThreadOpen();\n const submissionOwner = ownOperation({ adoptThread: true });\n const stream = (async () => {\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const isCurrent = ownOperation({ stream: true, adoptThread: true });\n const submissionGeneration = ++submissionGenerationRef.current;\n const ticket = queue.beginSubmission({ input: input.text.trim(), clientSubmissionId: runtime.createId(),\n uploading: Boolean(input.uploads?.length),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((upload, index) => ({ id: `upload-${index}`, filename: upload.name,\n mime_type: upload.mediaType || \"application/octet-stream\", byte_size: 0 })),\n });\n const userId = ticket.id;\n const idempotencyKey = runtime.createId();\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n setIsSubmitting(true);\n try {\n const uploaded = hasPendingUploads\n ? await client.attachments.uploadBatch({\n uploads: input.uploads || [],\n threadId: stateRef.current.activeThreadId || undefined,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n signal: controller.signal,\n })\n : [];\n if (!isCurrent()) return;\n if (hasPendingUploads && uploaded.length !== input.uploads?.length) {\n throw new Error(\"Attachment upload returned an incomplete batch\");\n }\n const resolvedAttachments = uploaded.length\n ? uploaded.map(attachmentResultToChatAttachment)\n : input.attachments;\n const attachmentIds = uploaded.length\n ? uploaded.map((attachment) => attachment.id)\n : input.attachmentIds;\n if (uploaded.length) {\n update((current) => ({\n ...current,\n messages: current.messages.map((message) => message.id === userId\n ? { ...message, attachments: resolvedAttachments }\n : message),\n runState: \"streaming\",\n }));\n }\n const result = await client.chat.stream({\n leaseSeconds: 60, clientSubmissionId: ticket.client_submission_id!, input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, (event) => { if (isCurrent()) consumeEvent(event); });\n if (!isCurrent()) return;\n eventBuffer.flush();\n update((current) => {\n const threadId = result.threadId || current.activeThreadId;\n return {\n ...current,\n activeThreadId: threadId,\n activeRunId: result.detached ? result.runId : current.activeRunId,\n cursor: result.cursor,\n runState: result.detached ? \"reconnecting\" : current.runState,\n threads: threadId\n ? current.threads.map((thread) => thread.id === threadId\n ? { ...thread, messages: current.messages, isHydrated: true }\n : thread)\n : current.threads,\n };\n });\n if (result.threadId) await refreshThreads().catch(() => undefined);\n if (result.threadId && !result.detached) await refreshMessages(result.threadId);\n } catch (error) {\n if (!isCurrent()) return;\n const admitted = Boolean(stateRef.current.messages.find((message) => message.id === userId)?.runId);\n if (!admitted) queue.discardSubmission(ticket, error);\n if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n runState: admitted ? \"reconnecting\" : \"failed\",\n streamingMessageId: admitted ? current.streamingMessageId : null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n if (!stateRef.current.messages.some(message => (message.id === ticket.id || message.clientSubmissionId === ticket.client_submission_id) && message.runId)) queue.discardSubmission(ticket);\n if (isCurrent() && submissionGeneration === submissionGenerationRef.current) setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n })();\n try { await Promise.race([stream, queue.waitForInitialAdmission()]); }\n catch (error) { if (submissionOwner() || !isAbortLike(error)) throw error; }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, queue.submit, refreshMessages, refreshThreads, runtime, update, ownOperation]);\n\n const { steer, editPendingMessage, steerPendingMessage, removePendingMessage, resumeQueue } =\n useAgentChatQueueActions({ queue, stateRef, createId: runtime.createId, clearOperationError,\n failOperation, refreshMessages, attachRun, ownOperation });\n\n const startNewThread = React.useCallback(() => {\n invalidateThreadOpen();\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, invalidateThreadOpen, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n const isCurrent = ownOperation();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n if (stateRef.current.activeThreadId === threadId) startNewThread();\n update((current) => ({ ...current, threads: current.threads.filter((thread) => thread.id !== threadId) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n if (isCurrent()) failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, ownOperation, runtime, startNewThread, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\n const isCurrent = ownOperation({ run: true, stream: true });\n const previousRunState = stateRef.current.runState;\n clearOperationError();\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: \"cancelling\" }\n : current\n ));\n try {\n const result = await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n if (!isCurrent()) return;\n if (result.status === \"cancelled\") {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: \"cancelled\",\n streamingMessageId: null,\n }));\n } else if (result.status === \"cancelling\") {\n update((current) => ({\n ...current,\n activeRunId: runId,\n runState: \"cancelling\",\n }));\n } else {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: result.status === \"completed\" ? \"completed\" : \"failed\",\n streamingMessageId: null,\n }));\n }\n } catch (error) {\n if (isCurrent() && !isAbortLike(error)) {\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: previousRunState }\n : current\n ));\n failOperation(\"cancel_run\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, detach, failOperation, runtime, update, ownOperation]);\n\n const { resumeHitl, getHitlSubmissionState } = useAgentChatHitlSubmissions({\n client, runtime, pageSize, stateRef, ownOperation, selectionGeneration: threadOpenGenerationRef,\n accept: receipt => {\n resolutionFences.current.set(`${receipt.run_id}:${receipt.interrupt_id}`, receipt);\n continuationTiming.current.set(receipt.run_id, { acknowledgedAt: Date.now(), attached: false, active: false });\n update(current => {\n const status = receipt.run_status;\n return current.activeRunId === receipt.run_id && (status === \"completed\" || status === \"failed\" || status === \"cancelled\")\n ? { ...current, activeRunId: null, runState: status, streamingMessageId: null } : current;\n });\n },\n attach: runId => {\n if ([\"completed\", \"failed\", \"cancelled\", \"cancelling\"].includes(stateRef.current.runState)) return;\n void attachRunRef.current(runId, stateRef.current.cursor ?? undefined).catch(() => undefined);\n },\n });\n\n const loadOlder = React.useCallback((): Promise<void> => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (thread?.nextBeforeTurnIndex == null) return Promise.resolve();\n const cursor = thread.nextBeforeTurnIndex;\n const reconcileFeedback = captureFeedbackRead();\n const key = `${threadOpenGenerationRef.current}:${thread.id}:${cursor}`;\n if (olderRequestRef.current?.key === key) return olderRequestRef.current.promise;\n const isCurrent = ownOperation();\n clearOperationError();\n setIsLoadingOlder(true);\n const promise = (async () => {\n try {\n const page = await client.threads.messages.list({ threadId: thread.id, limit: pageSize, before: cursor });\n if (!isCurrent()) return;\n const older = reconcileFeedback(threadTimelineToMessages(page.items), stateRef.current.messages);\n update((current) => ({ ...current,\n messages: prependThreadTimeline(current.messages, older),\n threads: current.threads.map((item) => item.id === thread.id ? { ...item,\n hasOlderTurns: page.paging.has_more, nextBeforeTurnIndex: page.paging.next_before_turn_index } : item),\n }));\n } catch (error) {\n if (isCurrent() && !isAbortLike(error)) { failOperation(\"load_older_turns\", error); throw error; }\n } finally {\n if (olderRequestRef.current?.key === key) {\n olderRequestRef.current = null;\n setIsLoadingOlder(false);\n }\n }\n })();\n olderRequestRef.current = { key, promise };\n return promise;\n }, [clearOperationError, client, failOperation, ownOperation, pageSize, update, captureFeedbackRead]);\n\n const regenerate = React.useCallback(async (message: ChatMessage) => {\n const index = stateRef.current.messages.findIndex((item) => item.id === message.id);\n const user = stateRef.current.messages.slice(0, index).reverse().find((item) => item.role === \"user\");\n if (user) await submit({\n text: user.content,\n attachmentIds: chatAttachmentIds(user.attachments),\n attachments: user.attachments,\n });\n }, [submit]);\n\n useChatObservation({\n state: { threadId: state.activeThreadId,\n running: Boolean(state.activeRunId) && ![\"idle\", \"completed\", \"failed\", \"cancelled\"].includes(state.runState),\n waiting: [\"paused\", \"waiting\", \"interrupted\"].includes(state.runState),\n sidebar: true, background: state.threads.some(thread => thread.id !== state.activeThreadId && Boolean(thread.active_run || thread.message_queue?.pending_count)),\n pending: pendingMessages.length > 0, paused: Boolean(messageQueue?.paused), degraded: state.runState === \"reconnecting\", mode: options.observation },\n visibility: runtime.visibility, createAbortController: runtime.createAbortController,\n events: (input, handler) => client.threads.events(input, handler),\n async refresh(signal) {\n const target = stateRef.current.activeThreadId;\n const previous = stateRef.current.threads.find(thread => thread.id === target);\n const isCurrent = ownOperation();\n const summary = await refreshChatSummaries({ client, limit: threadPageSize, signal,\n current: () => stateRef.current, update,\n onDeleted(threadId) {\n if (isCurrent() && stateRef.current.activeThreadId === threadId) startNewThread();\n } });\n if (!target || !summary || !isCurrent() || signal.aborted || threadOpenControllerRef.current) return;\n const runId = activeRunIdFromThread(summary);\n const changed = previous?.active_run?.run_id !== summary.active_run?.run_id\n || previous?.active_run?.status !== summary.active_run?.status;\n if (runId && getThreadActivity(summary).isSpinning && (!streamControllerRef.current || stateRef.current.activeRunId !== runId)) {\n void attachRunRef.current(runId, runId === stateRef.current.activeRunId ? stateRef.current.cursor ?? undefined : 0)\n .catch(() => undefined);\n } else if (!getThreadActivity(summary).isSpinning && changed) {\n streamControllerRef.current?.abort(); streamControllerRef.current = null;\n update(current => ({ ...current, activeRunId: summary.active_run?.run_id || null, streamingMessageId: null,\n runState: (summary.active_run?.status || summary.last_run_status || \"idle\") as AgentChatState[\"runState\"] }));\n }\n if (changed || pendingMessages.length || stateRef.current.runState === \"reconnecting\" || !streamControllerRef.current) {\n await refreshMessages(target, runId || undefined, signal);\n }\n },\n onEvent(event) {\n if (event.event === \"thread.deleted\" && event.thread_id === stateRef.current.activeThreadId) startNewThread();\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({ ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event) }));\n if (event.event === \"thread.message.updated\" && event.thread_id === stateRef.current.activeThreadId) {\n queue.acceptNotice({ messageId: event.message_id, status: event.status,\n runId: event.run_id, cursor: event.cursor, clientSubmissionId: event.client_submission_id });\n }\n },\n onError(error) { if (!isAbortLike(error)) update((current) => withAgentChatBackgroundError(current, error)); },\n onRecovered: clearBackgroundError,\n onDetach: detach,\n onResume() {\n const current = stateRef.current;\n if (current.activeRunId && !streamControllerRef.current && ![\"paused\", \"waiting\", \"interrupted\", \"completed\", \"failed\", \"cancelled\", \"idle\"].includes(current.runState)) {\n void attachRunRef.current(current.activeRunId, current.cursor ?? undefined).catch(() => undefined);\n }\n },\n });\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n const activeThread = stateRef.current.threads.find((thread) => thread.id === stateRef.current.activeThreadId);\n if (shouldHydrateSelectedThread(threadId, stateRef.current.activeThreadId, Boolean(activeThread?.isHydrated))) {\n void openThread(threadId as string).catch(() => undefined);\n }\n }, [openThread, options.activeThreadId]);\n\n const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId) || null;\n const hasMoreThreads = threadTotal === undefined\n ? state.threads.length >= threadPageSize\n : state.threads.length < threadTotal;\n return {\n ...state,\n activeThread,\n pendingMessages,\n messageQueue,\n hasOlderTurns: Boolean(activeThread?.hasOlderTurns),\n hasMoreThreads,\n isLoadingHistory,\n isLoadingMoreThreads,\n isLoadingOlder,\n isLoadingThreads,\n isSubmitting,\n attachRun,\n cancelRun,\n clearBackgroundError,\n clearOperationError,\n deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n refreshMessages,\n editPendingMessage,\n steerPendingMessage,\n removePendingMessage,\n retractPendingMessage: queue.retractForEdit,\n resumeQueue,\n steer,\n resumeHitl,\n getHitlSubmissionState,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { AbortSignalLike, AgentClient } from \"@agents24/client\";\nimport { applyThreadSummaryEvent, type AgentChatState } from \"./state\";\nimport type { StoredChatThread } from \"./model\";\n\n/** Refresh the first page plus observed threads outside it without dropping loaded history. */\nexport async function refreshChatSummaries(input: {\n client: AgentClient;\n limit: number;\n signal: AbortSignalLike;\n current(): AgentChatState;\n update(updater: (current: AgentChatState) => AgentChatState): void;\n onDeleted?(threadId: string): void;\n}): Promise<StoredChatThread | null> {\n const before = input.current();\n const page = await input.client.threads.list({ limit: input.limit, signal: input.signal });\n if (input.signal.aborted) return null;\n const summaries = [...page.items];\n const seen = new Set(summaries.map(thread => thread.id));\n const missing = before.threads.filter(thread => !seen.has(thread.id)\n && (thread.active_run || thread.id === before.activeThreadId)).map(thread => thread.id);\n if (before.activeThreadId && !seen.has(before.activeThreadId) && !missing.includes(before.activeThreadId)) {\n missing.push(before.activeThreadId);\n }\n const deleted = new Set<string>();\n const errors: unknown[] = [];\n // Bound concurrent reads even when many background runs are loaded.\n for (let offset = 0; offset < missing.length && !input.signal.aborted; offset += 4) {\n const ids = missing.slice(offset, offset + 4);\n const results = await Promise.allSettled(ids.map(threadId =>\n input.client.threads.get({ threadId, limit: 1, signal: input.signal })));\n results.forEach((result, index) => {\n if (result.status === \"fulfilled\") summaries.push(result.value);\n else if (result.reason?.name === \"Agents24ClientError\"\n && result.reason.kind === \"not_found\" && result.reason.status === 404) {\n deleted.add(ids[index]!);\n } else errors.push(result.reason);\n });\n }\n if (input.signal.aborted) return null;\n const removed: string[] = [];\n input.update(current => ({ ...current, threads: summaries.reduce((threads, thread) => {\n const previous = before.threads.find(item => item.id === thread.id);\n const latest = current.threads.find(item => item.id === thread.id);\n if (previous && !latest) return threads;\n if (latest && (previous?.last_run_id !== latest.last_run_id\n || previous?.active_run?.status !== latest.active_run?.status\n || previous?.last_run_status !== latest.last_run_status)) return threads;\n return applyThreadSummaryEvent(threads, { schema_version: \"agents24.thread_summary_event.v1\",\n event: \"thread.summary.updated\", cursor: 0, thread });\n }, current.threads.filter(thread => {\n // A local change since this read began wins over a stale deletion response.\n if (!deleted.has(thread.id) || before.threads.find(item => item.id === thread.id) !== thread) return true;\n removed.push(thread.id);\n return false;\n })) }));\n if (before.activeThreadId && deleted.has(before.activeThreadId)\n && !input.current().threads.some(thread => thread.id === before.activeThreadId)\n && !removed.includes(before.activeThreadId)) removed.push(before.activeThreadId);\n for (const id of removed) input.onDeleted?.(id);\n // Preserve successful refreshes while surfacing real transport/authorization failures.\n if (errors.length) throw errors[0];\n return input.current().threads.find(thread => thread.id === before.activeThreadId) || null;\n}\n","import type { AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\nimport { preferNewestThreadSummary, reconcileRefreshedThreads, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nexport function useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation }: {\n client: AgentClient;\n threadPageSize: number;\n stateRef: React.RefObject<AgentChatState>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n const [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\n const refreshPromiseRef = React.useRef<Promise<void> | null>(null);\n const eventsDuringRefreshRef = React.useRef<ThreadSummaryEvent[] | null>(null);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshPromiseRef.current) return refreshPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n eventsDuringRefreshRef.current = [];\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n const concurrentEvents = eventsDuringRefreshRef.current || [];\n eventsDuringRefreshRef.current = null;\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const incoming = result.items.map((item) => {\n const existing = byId.get(item.id);\n return { ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated };\n });\n return { ...current, threads: reconcileRefreshedThreads(current.threads, incoming, current.activeThreadId, concurrentEvents) };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n eventsDuringRefreshRef.current = null;\n setIsLoadingThreads(false);\n }\n })();\n refreshPromiseRef.current = request;\n void request.finally(() => {\n if (refreshPromiseRef.current === request) refreshPromiseRef.current = null;\n }).catch(() => undefined);\n return request;\n }, [clearOperationError, client, failOperation, threadPageSize, update]);\n\n const loadMoreThreads = React.useCallback(async () => {\n if (isLoadingMoreThreads) return;\n const skip = stateRef.current.threads.length;\n if (threadTotal !== undefined && skip >= threadTotal) return;\n clearOperationError();\n setIsLoadingMoreThreads(true);\n try {\n const result = await client.threads.list({ skip, limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n for (const item of result.items) {\n const existing = byId.get(item.id);\n byId.set(item.id, preferNewestThreadSummary(existing, {\n ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated,\n }));\n }\n return { ...current, threads: [...byId.values()] };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_more_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [clearOperationError, client, failOperation, isLoadingMoreThreads, stateRef, threadPageSize, threadTotal, update]);\n\n return { isLoadingThreads, isLoadingMoreThreads, threadTotal, eventsDuringRefreshRef, refreshThreads, loadMoreThreads };\n}\n","import type { AgentClient, FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { withAgentChatOperationError, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function useAgentChatFeedback({ client, update, clearOperationError, failOperation, ownOperation, refreshMessages }: {\n client: { runs: Pick<AgentClient[\"runs\"], \"setFeedback\"> };\n ownOperation: () => () => boolean;\n refreshMessages: () => Promise<void>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n const mutations = React.useRef(new Map<string, { revision: number; pending: number; readRevision: number }>());\n const captureRead = React.useCallback(() => {\n const revisions = new Map([...mutations.current].map(([run, mutation]) => [run, mutation.readRevision]));\n return (incoming: ChatMessage[], current: ChatMessage[]) => incoming.map((message) => {\n const mutation = message.runId ? mutations.current.get(message.runId) : undefined;\n const preserve = mutation && (mutation.pending > 0 || mutation.readRevision !== revisions.get(message.runId!));\n const live = preserve && current.find((item) => item.role === \"assistant\" && item.runId === message.runId);\n return live ? { ...message, feedback: live.feedback } : message;\n });\n }, []);\n const setFeedback = React.useCallback(async (message: ChatMessage, input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n }) => {\n const runId = message.runId;\n if (!runId || message.role !== \"assistant\" || message.isFinal === false) {\n const error = new Error(\"Only persisted final responses can receive feedback.\");\n failOperation(\"set_feedback\", error);\n throw error;\n }\n const isCurrent = ownOperation();\n const revision = (mutations.current.get(runId)?.revision ?? 0) + 1;\n const pending = (mutations.current.get(runId)?.pending ?? 0) + 1;\n mutations.current.set(runId, { revision, pending, readRevision: (mutations.current.get(runId)?.readRevision ?? 0) + 1 });\n const isLatest = () => mutations.current.get(runId)?.revision === revision;\n const previous = message.feedback ?? null;\n const timestamp = new Date().toISOString();\n const optimistic: ResponseFeedback | null = input.rating ? {\n rating: input.rating,\n reason: input.rating === \"dislike\" ? input.reason ?? null : null,\n comment: input.rating === \"dislike\" ? input.comment?.trim() || null : null,\n created_at: previous?.created_at || timestamp,\n updated_at: timestamp,\n } : null;\n const replaceFeedback = (current: AgentChatState, feedback: ResponseFeedback | null): AgentChatState => ({\n ...current,\n messages: current.messages.map((item) => item.role === \"assistant\" && item.runId === runId ? { ...item, feedback } : item),\n threads: current.threads.map((thread) => ({ ...thread,\n messages: thread.messages.map((item) => item.role === \"assistant\" && item.runId === runId ? { ...item, feedback } : item),\n })),\n });\n clearOperationError();\n update((current) => replaceFeedback(current, optimistic));\n try {\n const result = await client.runs.setFeedback({ runId, ...input });\n if (isLatest() && isCurrent()) update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n if (isLatest() && isCurrent()) update((current) => {\n const restored = replaceFeedback(current, previous);\n return isCurrent() ? withAgentChatOperationError(restored, \"set_feedback\", error) : restored;\n });\n throw error;\n } finally {\n const mutation = mutations.current.get(runId)!;\n mutations.current.set(runId, { ...mutation, readRevision: mutation.readRevision + 1, pending: mutation.pending - 1 });\n if (mutation.pending === 1 && isCurrent()) await refreshMessages().catch(() => undefined);\n }\n }, [clearOperationError, client, failOperation, update, ownOperation, refreshMessages]);\n return { setFeedback, captureRead };\n}\n","import type { ThreadMessage } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AgentChatSubmitInput } from \"./use-agent-chat\";\nimport { useThreadMessageQueue } from \"./thread-message-queue\";\nimport type { AgentChatOperation, AgentChatState } from \"./state\";\n\nexport function useAgentChatQueueActions({ queue, stateRef, createId, clearOperationError,\n failOperation, refreshMessages, attachRun, ownOperation }: {\n ownOperation: () => () => boolean;\n queue: ReturnType<typeof useThreadMessageQueue>;\n stateRef: React.RefObject<AgentChatState>;\n createId: () => string;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n refreshMessages: (threadId: string) => Promise<void>;\n attachRun: (runId: string) => Promise<void>;\n}) {\n const steer = React.useCallback(async (text: string) => {\n const threadId = stateRef.current.activeThreadId;\n if (!threadId || !text.trim()) throw new Error(\"An active thread and text are required to steer.\");\n const isCurrent = ownOperation();\n clearOperationError();\n try {\n await queue.submit({ mode: \"steer\", input: text.trim(), idempotencyKey: createId() });\n if (isCurrent()) await refreshMessages(threadId);\n } catch (error) {\n if (isCurrent()) failOperation(\"submit\", error);\n throw error;\n }\n }, [clearOperationError, createId, failOperation, queue.submit, refreshMessages, stateRef, ownOperation]);\n\n const editPendingMessage = React.useCallback(async (message: ThreadMessage,\n input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">) => {\n await queue.edit(message, { text: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId });\n }, [queue.edit]);\n const steerPendingMessage = React.useCallback(async (message: ThreadMessage) => {\n await queue.edit(message, { text: message.text, attachmentIds: message.attachment_ids, mode: \"steer\" });\n }, [queue.edit]);\n const resumeQueue = React.useCallback(async () => {\n if (!stateRef.current.activeThreadId) return;\n const isCurrent = ownOperation();\n const result = await queue.resume();\n if (isCurrent() && result?.run_id && stateRef.current.activeRunId !== result.run_id) void attachRun(result.run_id).catch(() => undefined);\n }, [attachRun, queue.resume, stateRef, ownOperation]);\n return { steer, editPendingMessage, steerPendingMessage, removePendingMessage: queue.remove, resumeQueue };\n}\n","export function resolveInitialActiveThreadId(\n options: { activeThreadId?: string | null },\n storedThreadId: string | null,\n): string | null {\n return Object.prototype.hasOwnProperty.call(options, \"activeThreadId\")\n ? options.activeThreadId ?? null\n : storedThreadId;\n}\n\nexport function shouldHydrateSelectedThread(\n selectedThreadId: string | null | undefined,\n activeThreadId: string | null,\n activeThreadIsHydrated: boolean,\n): boolean {\n return Boolean(selectedThreadId) && (\n selectedThreadId !== activeThreadId || !activeThreadIsHydrated\n );\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n ThreadComputerStatus,\n ThreadSummary,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { attachmentResultToChatAttachment } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\n\nexport function useAgentThreads(options: { limit?: number; skip?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [threads, setThreads] = React.useState<ThreadSummary[]>([]);\n const [total, setTotal] = React.useState<number | undefined>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.list({ ...options, signal: controller.signal });\n setThreads(result.items);\n setTotal(result.total);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.limit, options.skip]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, threads, total };\n}\n\nexport function useAgentThread(threadId: string | null, options: { limit?: number; beforeTurnIndex?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [thread, setThread] = React.useState<ThreadDetail | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n if (!threadId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setThread(null);\n setIsLoading(false);\n return null;\n }\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.get({ threadId, ...options, signal: controller.signal });\n setThread(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.beforeTurnIndex, options.limit, threadId]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, thread };\n}\n\nexport function useThreadComputer(threadId: string | null) {\n const { client, createAbortController } = useAgents24Runtime();\n const [computer, setComputer] = React.useState<ThreadComputerStatus | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const refresh = React.useCallback(async () => {\n controllerRef.current?.abort();\n if (!threadId) {\n setComputer(null);\n setIsLoading(false);\n return null;\n }\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.computer.get({ threadId, signal: controller.signal });\n setComputer(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, threadId]);\n React.useEffect(() => {\n void refresh();\n return () => controllerRef.current?.abort();\n }, [refresh]);\n const list = React.useCallback((input: { path?: string; cursor?: number; limit?: number }) => {\n if (!threadId) throw new Error(\"A thread is required to list computer files\");\n return client.threads.computer.list({ threadId, ...input });\n }, [client, threadId]);\n const read = React.useCallback((path: string) => {\n if (!threadId) throw new Error(\"A thread is required to read a computer file\");\n return client.threads.computer.read({ threadId, path });\n }, [client, threadId]);\n const createContentAccess = React.useCallback((path: string, download = false) => {\n if (!threadId) throw new Error(\"A thread is required to access a computer file\");\n return client.threads.computer.createContentAccess({ threadId, path, download });\n }, [client, threadId]);\n return { computer, error, isLoading, list, read, createContentAccess, refresh };\n}\n\nexport function useAgentRun() {\n const { client, createAbortController, createId } = useAgents24Runtime();\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const [isAttached, setIsAttached] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n React.useEffect(() => () => controllerRef.current?.abort(), []);\n const detach = React.useCallback(() => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setIsAttached(false);\n }, []);\n const attach = React.useCallback(async (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => {\n detach();\n const controller = createAbortController();\n controllerRef.current = controller;\n setError(null);\n setIsAttached(true);\n try {\n return await client.runs.attach({ runId, cursor, signal: controller.signal }, onEvent);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n throw nextError;\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n setIsAttached(false);\n }\n }, [client, createAbortController, detach]);\n const cancel = React.useCallback(async (runId: string) => {\n const result = await client.runs.cancel({ runId, idempotencyKey: createId() });\n detach();\n return result;\n }, [client, createId, detach]);\n return { attach, cancel, detach, error, isAttached };\n}\n\nexport function useAgentAttachments() {\n const { client, createId } = useAgents24Runtime();\n const [uploads, setUploads] = React.useState<Record<string, AttachmentResult>>({});\n const [isUploading, setIsUploading] = React.useState(false);\n const uploadBatch = React.useCallback(async (input: { uploads: readonly { data: BinaryUploadData; name: string; mediaType: string }[]; threadId?: string; requestedAgentId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const results = await client.attachments.uploadBatch({ uploads: input.uploads as readonly PortableUpload[], threadId: input.threadId, requestedAgentId: input.requestedAgentId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => Object.fromEntries([\n ...Object.entries(current),\n ...results.map((result) => [result.id, result]),\n ]));\n return results.map(attachmentResultToChatAttachment);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n const createContentAccess = React.useCallback(\n (input: { attachmentId: string; disposition: \"inline\" | \"attachment\"; signal?: AbortSignalLike }) =>\n client.attachments.createContentAccess(input),\n [client],\n );\n return { createContentAccess, isUploading, uploadBatch, uploads };\n}\n\nexport function useAgentHitl() {\n const { client, createId } = useAgents24Runtime();\n const [isResolving, setIsResolving] = React.useState(false);\n const [lastResult, setLastResult] = React.useState<HitlResumeResult | null>(null);\n const resume = React.useCallback(async (input: { runId: string; interruptId: string; action: HitlAction; comment?: string; answers?: import(\"@agents24/client\").HitlAnswer[]; signal?: AbortSignalLike }) => {\n setIsResolving(true);\n try {\n const result = await client.hitl.resume({ ...input, idempotencyKey: createId() });\n setLastResult(result);\n return result;\n } finally {\n setIsResolving(false);\n }\n }, [client, createId]);\n return { isResolving, lastResult, resume };\n}\n\nexport function useAgentMcp() {\n const { client, createId } = useAgents24Runtime();\n const [isAuthorizing, setIsAuthorizing] = React.useState(false);\n const startAuthorization = React.useCallback(async (input: { runId: string; serverId: string; interruptId: string; redirectUri: string; popupNonce: string; codeChallenge: string; signal?: AbortSignalLike }): Promise<McpAuthorizationResult> => {\n setIsAuthorizing(true);\n try { return await client.mcp.startAuthorization({ ...input, idempotencyKey: createId() }); }\n finally { setIsAuthorizing(false); }\n }, [client, createId]);\n const redeemCallback = React.useCallback(async (input: { code: string; codeVerifier: string; signal?: AbortSignalLike }): Promise<McpCallbackResult> =>\n client.mcp.redeemCallback({ ...input, idempotencyKey: createId() }), [client, createId]);\n return { isAuthorizing, redeemCallback, startAuthorization };\n}\n"],"mappings":"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","names":["value","React","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","messageId","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","threadId","React","part","React","React","React","React","text","options","activeThread","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/lifecycle.ts","../src/chat-observation.ts","../src/use-chat-observation.ts","../src/model.ts","../src/provider.tsx","../src/runtime-event-buffer.ts","../src/assistant-preview.ts","../src/hitl-resolution.ts","../src/state.ts","../src/thread-message-queue.ts","../src/chat-timing.ts","../src/operation-ownership.ts","../src/use-agent-chat-hitl-submissions.ts","../src/hitl-submission.ts","../src/use-agent-chat.ts","../src/refresh-chat-summaries.ts","../src/use-agent-chat-thread-list.ts","../src/use-agent-chat-feedback.ts","../src/use-agent-chat-queue-actions.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport type VisibilitySource = {\n isVisible(): boolean;\n subscribe(listener: () => void): () => void;\n};\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport type { AbortControllerFactory, VisibilitySource } from \"./lifecycle\";\n\nexport type ChatObservationState = {\n threadId: string | null;\n running: boolean;\n waiting: boolean;\n pending: boolean;\n paused: boolean;\n degraded?: boolean;\n mode?: \"on-demand\" | \"realtime\";\n background?: boolean;\n sidebar?: boolean;\n};\n\n/** One observation policy for SDK chats and platform transport adapters. */\nexport function createChatObservation(input: {\n createAbortController: AbortControllerFactory;\n events: AgentClient[\"threads\"][\"events\"];\n refresh(signal: AbortSignalLike): Promise<void>;\n onEvent(event: ThreadSummaryEvent): void;\n onError(error: unknown): void;\n onRecovered(): void;\n onDetach(): void;\n onResume(): void;\n visibility?: VisibilitySource;\n}) {\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, ms: number): unknown;\n clearTimeout(timer: unknown): void;\n };\n let state: ChatObservationState = { threadId: null, running: false, waiting: false, pending: false, paused: false };\n let visible = input.visibility?.isVisible() ?? true;\n let disposed = false;\n let generation = 0;\n let recovery: ReturnType<AbortControllerFactory> | undefined;\n let refreshing: Promise<void> | undefined;\n let timer: unknown;\n let failures = 0;\n const needed = () => !disposed && visible && Boolean(state.threadId || state.sidebar);\n const interval = () => failures\n ? Math.min(30_000, 5_000 * 2 ** Math.min(failures, 3))\n : state.running || state.pending || state.degraded || state.waiting || state.paused || state.background ? 5_000 : 30_000;\n const stop = () => { clock.clearTimeout(timer); timer = undefined; };\n const schedule = () => {\n stop();\n if (needed()) timer = clock.setTimeout(poll, interval());\n };\n\n function refresh(): Promise<void> {\n if (!needed()) return Promise.resolve();\n if (refreshing) return refreshing;\n const owned = generation;\n const controller = input.createAbortController();\n recovery = controller;\n const timeout = clock.setTimeout(() => controller.abort(\"Observation refresh timed out.\"), 5_000);\n let onAbort = () => {};\n const aborted = new Promise<never>((_, reject) => {\n onAbort = () => reject(Object.assign(new Error(\"Observation refresh detached.\"), { name: \"AbortError\" }));\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n const promise = Promise.race([input.refresh(controller.signal), aborted]).then(() => {\n if (owned === generation && !controller.signal.aborted) input.onRecovered();\n }).finally(() => {\n clock.clearTimeout(timeout);\n controller.signal.removeEventListener(\"abort\", onAbort);\n if (recovery === controller) recovery = undefined;\n if (refreshing === promise) refreshing = undefined;\n });\n refreshing = promise;\n return promise;\n }\n\n function poll() {\n stop();\n if (!needed()) return;\n const owned = generation;\n void refresh().then(() => {\n if (owned === generation && needed()) { failures = 0; input.onResume(); }\n }).catch((error) => {\n if (owned !== generation || !needed()) return;\n failures += 1;\n input.onError(error);\n }).finally(() => { if (owned === generation) schedule(); });\n }\n\n const unsubscribe = input.visibility?.subscribe(() => {\n const next = input.visibility!.isVisible();\n if (next === visible) return;\n visible = next;\n if (!visible) { generation += 1; stop(); recovery?.abort(); refreshing = undefined; input.onDetach(); }\n else poll();\n });\n\n return {\n refresh,\n update(next: ChatObservationState) {\n const changed = next.threadId !== state.threadId;\n const accelerated = !(state.running || state.pending || state.background || state.waiting)\n && Boolean(next.running || next.pending || next.background || next.waiting);\n if (changed) {\n generation += 1;\n stop(); recovery?.abort(); refreshing = undefined;\n failures = 0;\n }\n state = next;\n if (!needed()) stop();\n else if (changed || accelerated) poll();\n else if (timer === undefined && !refreshing) schedule();\n },\n dispose() {\n disposed = true; generation += 1;\n stop(); recovery?.abort(); unsubscribe?.();\n },\n };\n}\n","import * as React from \"react\";\nimport { createChatObservation, type ChatObservationState } from \"./chat-observation\";\n\nexport function useChatObservation(input: Parameters<typeof createChatObservation>[0] & { state: ChatObservationState }) {\n const latest = React.useRef(input);\n latest.current = input;\n const owner = React.useRef<ReturnType<typeof createChatObservation> | null>(null);\n React.useEffect(() => {\n const observation = createChatObservation({\n createAbortController: input.createAbortController, visibility: input.visibility,\n events: (options, handler) => latest.current.events(options, handler),\n refresh: (signal) => latest.current.refresh(signal),\n onEvent: (event) => latest.current.onEvent(event),\n onError: (error) => latest.current.onError(error),\n onRecovered: () => latest.current.onRecovered(),\n onDetach: () => latest.current.onDetach(),\n onResume: () => latest.current.onResume(),\n });\n owner.current = observation;\n observation.update(latest.current.state);\n return () => { observation.dispose(); if (owner.current === observation) owner.current = null; };\n }, [input.createAbortController, input.visibility]);\n const { threadId, running, waiting, pending, paused, degraded, mode, background, sidebar } = input.state;\n React.useEffect(() => {\n owner.current?.update({ threadId, running, waiting, pending, paused, degraded, mode, background, sidebar });\n }, [threadId, running, waiting, pending, paused, degraded, mode, background, sidebar]);\n return React.useCallback(() => owner.current?.refresh() ?? Promise.resolve(), []);\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"waiting\"\n | \"interrupted\"\n | \"cancelling\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ChatCitation = {\n title: string;\n url: string;\n description?: string;\n sourceRef?: string;\n [key: string]: unknown;\n};\n\nexport type ChatAttachment = {\n id?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n contentType?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nexport function chatAttachmentIds(attachments?: readonly ChatAttachment[]): string[] {\n return (attachments || []).flatMap((attachment) => typeof attachment.id === \"string\" && attachment.id.trim()\n ? [attachment.id.trim()]\n : []);\n}\n\nexport type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatPartMetadata = {\n id: string;\n runId?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n raw?: Record<string, unknown>;\n};\n\nexport type ChatToolChildRun = {\n runId?: string | null;\n agentId?: string | null;\n agentName?: string | null;\n status?: string | null;\n error?: string | null;\n};\n\nexport type ChatToolChild = {\n id: string;\n runId?: string | null;\n toolCallId?: string | null;\n toolName: string;\n title: string;\n status: string;\n detail?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n};\n\nexport type ChatToolPresentation = Record<string, unknown> & {\n title?: string | null;\n activity?: string | null;\n detail?: string | null;\n category?: string | null;\n groupKey?: string | null;\n groupLabel?: string | null;\n path?: string | null;\n threadId?: string | null;\n isExploration?: boolean;\n childRun?: ChatToolChildRun | null;\n childTools?: ChatToolChild[];\n activeChildToolId?: string | null;\n};\n\nexport type ChatTextPart = ChatPartMetadata & { type: \"text\"; kind: \"text\"; text: string };\nexport type ChatComputerResourceTarget = {\n type: \"computer\";\n thread_id: string;\n computer_id: string;\n path: string;\n kind: \"file\" | \"directory\";\n};\nexport type ChatToolPart = ChatPartMetadata & {\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolKey?: string | null;\n action?: string | null;\n displayName?: string | null;\n summary?: string | null;\n toolCallId?: string | null;\n sourceKind?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n resourceTargets?: readonly ChatComputerResourceTarget[];\n errorText?: string | null;\n failure?: FailureView | null;\n presentation: ChatToolPresentation;\n};\nexport type ChatReasoningPart = ChatPartMetadata & { type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null };\nexport type ChatModelTurnPart = ChatPartMetadata & {\n type: \"model-turn\";\n kind: \"model-turn\";\n modelTurnId: string;\n turnKind: \"agent\" | \"model\";\n status: \"running\";\n iteration?: number | null;\n};\nexport type ChatContextCompressionPart = ChatPartMetadata & {\n type: \"context-compression\";\n kind: \"context-compression\";\n status: \"started\" | \"completed\" | \"failed\";\n compression: ContextCompression;\n};\nexport type ChatNodeActivityState = \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"skipped\";\nexport type ChatNodeSkipReason = \"missing_required_input\" | \"upstream_input_unavailable\" | \"empty_optional_source\";\nconst chatNodeSkipReason = (value: unknown): ChatNodeSkipReason | null => {\n const normalized = text(value);\n return normalized === \"missing_required_input\"\n || normalized === \"upstream_input_unavailable\"\n || normalized === \"empty_optional_source\"\n ? normalized\n : null;\n};\nexport type ChatNodeActivityPart = ChatPartMetadata & {\n type: \"node-activity\";\n kind: \"node-activity\";\n activityId: string;\n /** Opaque trusted-host trace selector; absent from public projections. */\n traceStepId?: string | null;\n label: string;\n nodeKind: string;\n status: ChatNodeActivityState;\n defaultChatVisible: boolean;\n reason?: ChatNodeSkipReason | null;\n failure?: FailureView | null;\n};\nexport type ChatUiBlocksPart = ChatPartMetadata & { type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\" | \"user_input\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlQuestion = {\n id: string;\n header: string;\n question: string;\n options: Array<{ id: string; label: string }>;\n multiSelect: boolean;\n};\nexport type ChatHitlAnswer = {\n questionId: string;\n selectedOptionIds: string[];\n customText?: string;\n};\nexport type ChatHitlResolution = Record<string, unknown> & {\n answers?: ChatHitlAnswer[];\n outcome?: string;\n status?: string;\n};\nexport type ChatHitlPart = ChatPartMetadata & {\n type: \"hitl\";\n kind: \"hitl\";\n interruptId: string;\n hitlKind: ChatHitlKind;\n message: string;\n allowedActions: HitlAction[];\n status: ChatHitlStatus;\n presentation: Record<string, unknown>;\n questions: ChatHitlQuestion[];\n resolution?: ChatHitlResolution | null;\n};\nexport type ChatErrorPart = ChatPartMetadata & { type: \"error\"; kind: \"error\"; errorText: string; failure?: FailureView | null };\nexport type ChatDataPart = ChatPartMetadata & { type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown> };\nexport type ChatSourcePart = ChatPartMetadata & { type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null };\nexport type ChatCitationPart = ChatPartMetadata & { type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null };\nexport type ChatAttachmentPart = ChatPartMetadata & { type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatModelTurnPart | ChatContextCompressionPart | ChatNodeActivityPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;\n\nexport type ChatMessage = {\n id: string;\n /** Durable timeline identity when a mounted optimistic turn keeps its display key. */\n durableId?: string;\n clientSubmissionId?: string;\n segmentIndex?: number | null;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n responseCompletion?: import(\"@agents24/client/protocol\").ResponseCompletion;\n parts: ChatPart[];\n attachments?: ChatAttachment[];\n citations?: ChatCitation[];\n feedback?: ResponseFeedback | null;\n messageIndex?: number;\n reasoningSteps?: Array<Record<string, unknown>>;\n thinkingDurationMs?: number;\n tokenUsage?: { inputTokens?: number | null; outputTokens?: number | null; totalTokens?: number | null; usageSource?: string | null };\n isVoice?: boolean;\n};\n\nexport type StoredChatThread = ThreadSummary & {\n taskNotifications?: Array<Record<string, unknown> & { handle: string }>;\n messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\n contextWindow?: ContextWindow | null;\n contextCompression?: ContextCompression | null;\n};\n\nexport type ThreadActivity = {\n status: string | null;\n runId: string | null;\n isSpinning: boolean;\n isPaused: boolean;\n isFailed: boolean;\n isCompleted: boolean;\n isCancelled: boolean;\n};\n\nexport function getThreadActivity(thread: Pick<ThreadSummary, \"active_run\" | \"last_run_id\" | \"last_run_status\">): ThreadActivity {\n const activeRun = thread.active_run || null;\n const status = String(activeRun?.status || thread.last_run_status || \"\").trim().toLowerCase() || null;\n return {\n status,\n runId: activeRun?.run_id || thread.last_run_id || null,\n isSpinning: Boolean(activeRun) && [\"queued\", \"running\", \"cancelling\"].includes(status || \"\"),\n isPaused: status === \"paused\",\n isFailed: status === \"failed\",\n isCompleted: status === \"completed\",\n isCancelled: status === \"cancelled\" || status === \"canceled\",\n };\n}\n\nconst record = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : null;\nexport function computerResourceTargets(value: unknown): ChatComputerResourceTarget[] {\n const output = record(value);\n if (!output) return [];\n const candidates = [output.resource_target,\n ...(Array.isArray(output.resource_targets) ? output.resource_targets : []),\n ...(Array.isArray(output.files) ? output.files.map(file => record(file)?.resource_target) : [])];\n const seen = new Set<string>();\n return candidates.flatMap(candidate => {\n const target = record(candidate);\n if (target?.type !== \"computer\" || typeof target.thread_id !== \"string\"\n || typeof target.computer_id !== \"string\" || typeof target.path !== \"string\"\n || !target.path.startsWith(\"/workspace\")\n || (target.kind !== \"file\" && target.kind !== \"directory\")) return [];\n const key = `${target.thread_id}:${target.computer_id}:${target.path}:${target.kind}`;\n if (seen.has(key)) return [];\n seen.add(key);\n return [target as ChatComputerResourceTarget];\n });\n}\nconst text = (value: unknown): string | null => typeof value === \"string\" && value.trim() ? value : null;\nconst finiteNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\nconst statusToToolState = (value: unknown): ChatToolState => {\n const normalized = String(value || \"\").toLowerCase();\n if (normalized === \"failed\" || normalized === \"error\") return \"output-error\";\n if (normalized === \"cancelled\" || normalized === \"canceled\") return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n return normalized === \"streaming\" ? \"input-streaming\" : \"input-available\";\n};\n\nfunction failureView(value: unknown): FailureView | null {\n const candidate = record(value);\n return candidate?.schema_version === \"agents24.failure.v1\"\n && text(candidate.failure_id)\n && text(candidate.code)\n && text(candidate.message)\n && typeof candidate.retryable === \"boolean\"\n && record(candidate.details)\n ? candidate as unknown as FailureView\n : null;\n}\n\nconst allowedActions: Record<ChatHitlKind, HitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n user_input: [\"respond\"],\n};\n\nfunction hitlQuestions(presentation: Record<string, unknown>): ChatHitlQuestion[] {\n return (Array.isArray(presentation.questions) ? presentation.questions : []).flatMap((value) => {\n const question = record(value);\n if (!question || !Array.isArray(question.options)) return [];\n const options = question.options.flatMap((rawOption) => {\n const option = record(rawOption);\n return option && text(option.id) && text(option.label)\n ? [{ id: String(option.id), label: String(option.label) }]\n : [];\n });\n return text(question.id) && text(question.header) && text(question.question) && options.length >= 2\n ? [{\n id: String(question.id),\n header: String(question.header),\n question: String(question.question),\n options,\n multiSelect: question.multi_select === true,\n }]\n : [];\n });\n}\n\nfunction hitlResolution(value: unknown): ChatHitlResolution | null {\n const resolution = record(value);\n if (!resolution) return null;\n const answers = (Array.isArray(resolution.answers) ? resolution.answers : []).flatMap((value) => {\n const answer = record(value);\n if (!answer || !text(answer.question_id) || !Array.isArray(answer.selected_option_ids)) return [];\n return [{\n questionId: String(answer.question_id),\n selectedOptionIds: answer.selected_option_ids.map(String),\n ...(text(answer.custom_text) ? { customText: String(answer.custom_text) } : {}),\n }];\n });\n return { ...resolution, ...(answers.length ? { answers } : {}) };\n}\n\nfunction partMetadata(block: Record<string, unknown>, id: string): ChatPartMetadata {\n return {\n id,\n runId: text(block.runId) || text(block.run_id),\n sequence: finiteNumber(block.seq),\n timestamp: text(block.ts),\n raw: block,\n };\n}\n\nfunction toolPresentation(tool: Record<string, unknown>): ChatToolPresentation {\n const nested = record(tool.presentation) || {};\n const childRunValue = record(tool.childRun) || record(tool.child_run);\n const childRun = childRunValue && (\n text(childRunValue.runId || childRunValue.run_id)\n || text(childRunValue.agentName || childRunValue.agent_name)\n || text(childRunValue.status)\n )\n ? {\n runId: text(childRunValue.runId) || text(childRunValue.run_id),\n agentId: text(childRunValue.agentId) || text(childRunValue.agent_id),\n agentName: text(childRunValue.agentName) || text(childRunValue.agent_name),\n status: text(childRunValue.status),\n error: text(childRunValue.error),\n }\n : null;\n const childTools = (Array.isArray(tool.childTools) ? tool.childTools : Array.isArray(tool.child_tools) ? tool.child_tools : [])\n .flatMap((value): ChatToolChild[] => {\n const child = record(value);\n if (!child || !text(child.id) || !text(child.title)) return [];\n return [{\n id: String(child.id),\n runId: text(child.runId) || text(child.run_id),\n toolCallId: text(child.toolCallId) || text(child.tool_call_id),\n toolName: String(child.toolName || child.tool_name || child.title),\n title: String(child.title),\n status: String(child.status || \"\"),\n detail: text(child.detail),\n sequence: finiteNumber(child.seq),\n timestamp: text(child.ts),\n }];\n });\n return {\n ...nested,\n title: text(tool.title) || text(nested.title),\n activity: text(tool.activity) || text(nested.activity),\n detail: text(tool.detail) || text(nested.detail),\n category: text(tool.category) || text(nested.category),\n groupKey: text(tool.groupKey) || text(tool.group_key) || text(nested.groupKey) || text(nested.group_key),\n groupLabel: text(tool.groupLabel) || text(tool.group_label) || text(nested.groupLabel) || text(nested.group_label),\n path: text(tool.path),\n threadId: text(tool.threadId) || text(tool.thread_id),\n isExploration: tool.isExploration === true || tool.is_exploration === true,\n childRun,\n childTools,\n activeChildToolId: text(tool.activeChildToolId) || text(tool.active_child_tool_id),\n };\n}\n\nexport function partsFromResponseBlocks(\n blocks: unknown,\n fallbackText = \"\",\n fallbackPartId = \"assistant-text\",\n): ChatPart[] {\n const input = Array.isArray(blocks) ? blocks : [];\n const parts = input.flatMap((item, index): ChatPart[] => {\n const block = record(item);\n if (!block) return [];\n const kind = String(block.kind || \"data\");\n const id = String(block.id || `${kind}-${index}`);\n const metadata = partMetadata(block, id);\n if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ ...metadata, type: \"text\", kind: \"text\", text: value }] : [];\n }\n if (kind === \"context_compression\") {\n const compression = normalizeContextCompression(block.compression);\n if (!compression?.active) return [];\n const status = compression.status === \"started\" || compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : block.status === \"complete\"\n ? \"completed\"\n : block.status === \"error\"\n ? \"failed\"\n : \"started\";\n return [{\n ...metadata,\n type: \"context-compression\",\n kind: \"context-compression\",\n status,\n compression: { ...compression, status },\n }];\n }\n if (kind === \"node_activity\") {\n const node = record(block.node);\n const activityId = text(node?.activityId) || text(node?.activity_id) || id;\n const statusValue = String(node?.status || \"\").toLowerCase();\n const status: ChatNodeActivityState = [\"completed\", \"failed\", \"cancelled\", \"skipped\"].includes(statusValue)\n ? statusValue as ChatNodeActivityState\n : \"running\";\n const label = text(node?.label) || \"Working\";\n const nodeKind = text(node?.kind) || \"node\";\n return [{\n ...metadata,\n type: \"node-activity\",\n kind: \"node-activity\",\n activityId,\n traceStepId: text(node?.traceStepId) || text(node?.trace_step_id) || null,\n label,\n nodeKind,\n status,\n defaultChatVisible: node?.defaultChatVisible === true,\n reason: chatNodeSkipReason(node?.reason),\n failure: failureView(node?.failure),\n }];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.toolName || tool.tool_name || tool.action || tool.title || \"tool\");\n return [{\n ...metadata,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolKey: text(tool.toolKey) || text(tool.tool_key),\n action: text(tool.action),\n displayName: text(tool.displayName) || text(tool.display_name),\n summary: text(tool.summary),\n toolCallId: text(tool.toolCallId) || text(tool.tool_call_id),\n sourceKind: text(tool.sourceKind) || text(tool.source_kind),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n resourceTargets: computerResourceTargets(tool.output),\n errorText: text(tool.error || block.error),\n failure: failureView(tool.failure),\n presentation: toolPresentation(tool),\n }];\n }\n if (kind === \"reasoning_note\") return [{ ...metadata, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status) }];\n if (kind === \"ui_blocks\") return [{ ...metadata, type: \"ui-blocks\", kind: \"ui-blocks\", state: statusToToolState(block.status), toolCallId: text(block.toolCallId), contractVersion: text(block.contractVersion), bundle: record(block.bundle), errorText: text(block.error) }];\n if (kind === \"hitl_request\") {\n const hitl = record(block.hitl) || {};\n const hitlKind = String(block.hitlKind || hitl.kind || \"\") as ChatHitlKind;\n if (!(hitlKind in allowedActions)) return [];\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n const expected = allowedActions[hitlKind];\n if (actions.length !== expected.length || actions.some((action, actionIndex) => action !== expected[actionIndex])) return [];\n return [{\n ...metadata,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId: String(block.interruptId || hitl.interrupt_id || \"\"),\n hitlKind,\n message: String(block.text || hitl.message || \"\"),\n allowedActions: actions,\n status: String(block.status || \"pending\") as ChatHitlStatus,\n presentation: record(hitl.presentation) || hitl,\n questions: hitlQuestions(record(hitl.presentation) || {}),\n resolution: hitlResolution(block.resolution),\n }];\n }\n if (kind === \"error\") {\n const failure = failureView(block.failure) || failureView(block.error);\n return [{\n ...metadata,\n type: \"error\",\n kind: \"error\",\n errorText: failure?.message || String(block.text || \"The run failed.\"),\n failure,\n }];\n }\n if (kind === \"source\") return [{ ...metadata, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description) }];\n if (kind === \"citation\") return [{ ...metadata, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url) }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ ...metadata, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined } }];\n }\n return [{ ...metadata, type: \"data\", kind: \"data\", name: kind, data: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: fallbackText.trim() });\n }\n return parts;\n}\n\nexport function assistantProjectionFromEvent(event: RuntimeEvent): { content: string; parts: ChatPart[] } {\n const payload = record(event.payload) || {};\n const content = text(payload.assistant_output_text) || \"\";\n const fromBlocks = partsFromResponseBlocks(\n payload.response_blocks,\n content,\n `${event.run_id}:assistant-text`,\n );\n if (fromBlocks.length) return {\n content: content || fromBlocks\n .filter((part): part is ChatTextPart => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n parts: fromBlocks,\n };\n const fromPatch = partsFromResponseBlocks(\n payload.response_block === undefined ? undefined : [payload.response_block],\n );\n if (fromPatch.length) return { content, parts: fromPatch };\n return { content, parts: [] };\n}\n\nexport function modelTurnPartFromEvent(event: RuntimeEvent): ChatModelTurnPart | null {\n const eventName = String(event.event || \"\");\n const payload = record(event.payload) || {};\n const source = eventName === \"run.snapshot\" ? record(payload.active_model_turn) : payload;\n if (\n !source\n || (eventName !== \"model.turn.started\" && eventName !== \"run.snapshot\")\n || source.status !== \"running\"\n || !text(source.model_turn_id)\n ) return null;\n const modelTurnId = String(source.model_turn_id);\n const iteration = finiteNumber(source.iteration);\n return {\n id: `model-turn:${modelTurnId}`,\n type: \"model-turn\",\n kind: \"model-turn\",\n modelTurnId,\n turnKind: source.kind === \"agent\" ? \"agent\" : \"model\",\n status: \"running\",\n runId: event.run_id || null,\n sequence: finiteNumber(event.seq),\n timestamp: text(event.ts),\n ...(iteration === null ? {} : { iteration }),\n raw: source,\n };\n}\n\nexport function contextCompressionPartFromEvent(\n event: RuntimeEvent,\n existingParts: readonly ChatPart[] = [],\n): ChatContextCompressionPart | null {\n if (String(event.event || \"\") !== \"context.compression.updated\") return null;\n const payload = record(event.payload) || {};\n const compression = normalizeContextCompression(payload.context_compression);\n if (!compression?.active) return null;\n const status = compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : \"started\";\n const activePart = [...existingParts].reverse().find(\n (part): part is ChatContextCompressionPart => (\n part.kind === \"context-compression\" && part.status === \"started\"\n ),\n );\n const sequence = finiteNumber(event.seq);\n const id = status === \"started\"\n ? `context-compression:${event.run_id || \"run\"}:${sequence ?? \"active\"}`\n : activePart?.id || `context-compression:${event.run_id || \"run\"}:${sequence ?? \"terminal\"}`;\n return {\n id,\n type: \"context-compression\",\n kind: \"context-compression\",\n runId: event.run_id || null,\n sequence,\n timestamp: text(event.ts),\n status,\n compression,\n };\n}\n\nexport function threadDetailToMessages(detail: ThreadDetail): ChatMessage[] {\n return (detail.turns || []).flatMap((item, index) => {\n const turn = record(item) || {};\n const userText = text(turn.user_input_text) || \"\";\n const assistantText = text(turn.assistant_output_text) || \"\";\n const runId = text(turn.run_id);\n const createdAt = text(turn.created_at) || new Date(0).toISOString();\n const rawFeedback = record(turn.feedback);\n const feedback: ResponseFeedback | null = rawFeedback\n && (rawFeedback.rating === \"like\" || rawFeedback.rating === \"dislike\")\n && text(rawFeedback.created_at)\n && text(rawFeedback.updated_at)\n ? {\n rating: rawFeedback.rating === \"like\" ? \"like\" : \"dislike\",\n reason: [\n \"incorrect\",\n \"irrelevant\",\n \"incomplete\",\n \"unsafe\",\n \"citation_issue\",\n \"other\",\n ].includes(String(rawFeedback.reason || \"\"))\n ? rawFeedback.reason as ResponseFeedback[\"reason\"]\n : null,\n comment: text(rawFeedback.comment),\n created_at: String(rawFeedback.created_at),\n updated_at: String(rawFeedback.updated_at),\n }\n : null;\n const attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => {\n const value = record(attachment);\n return value ? [attachmentResultToChatAttachment(value as AttachmentResult)] : [];\n })\n : [];\n const output: ChatMessage[] = [];\n if (userText || attachments.length) output.push({\n id: String(turn.id || `${runId || index}-user`),\n role: \"user\",\n content: userText,\n createdAt,\n parts: userText ? [{ id: `${runId || index}-user-text`, type: \"text\", kind: \"text\", text: userText }] : [],\n attachments,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n if (assistantText || Array.isArray(turn.response_blocks)) {\n const assistantParts = partsFromResponseBlocks(\n turn.response_blocks,\n assistantText,\n `${runId || turn.id || index}-assistant-text`,\n );\n output.push({\n id: `${runId || turn.id || index}-assistant`,\n role: \"assistant\",\n runId,\n content: assistantText,\n createdAt: text(turn.completed_at) || createdAt,\n responseCompletion: item.response_completion,\n isFinal: Boolean(item.response_completion) || ![\"queued\", \"running\", \"paused\", \"cancelling\"].includes(String(turn.status || \"\").toLowerCase()),\n feedback,\n parts: assistantParts,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n }\n return output;\n });\n}\n\nexport function threadTimelineToMessages(\n items: readonly import(\"@agents24/client\").ThreadMessage[],\n): ChatMessage[] {\n return items.map((item) => ({\n id: item.id,\n clientSubmissionId: item.client_submission_id || undefined,\n role: item.role,\n runId: item.run_id,\n segmentIndex: item.segment_index,\n content: item.text,\n createdAt: item.created_at,\n isFinal: item.status === \"completed\" || item.status === \"delivered\",\n responseCompletion: item.response_completion,\n parts: item.role === \"assistant\"\n ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`)\n : item.text ? [{ id: `${item.id}-text`, type: \"text\" as const, kind: \"text\" as const, text: item.text }] : [],\n attachments: item.role === \"user\" ? item.attachment_ids.map((id) => {\n const descriptor = item.attachments?.find((attachment) => attachment.id === id);\n return { id, filename: descriptor?.filename || \"Attachment\", mediaType: descriptor?.mime_type || \"application/octet-stream\" };\n }) : undefined,\n feedback: item.role === \"assistant\" ? item.feedback ?? null : undefined,\n }));\n}\n\nexport function latestThreadContext(detail: ThreadDetail): {\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n} {\n let contextWindow: ContextWindow | null = null;\n for (const turn of detail.turns || []) {\n contextWindow = mergeContextWindowUpdate(contextWindow, turn.context_window);\n }\n return {\n contextWindow,\n contextCompression: compressionFromContextWindow(contextWindow),\n };\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return {\n ...result,\n id: result.id,\n filename: result.filename,\n mediaType: result.mime_type,\n status: result.processing_status,\n };\n}\n","import type { AgentClient } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AbortControllerFactory, VisibilitySource } from \"./lifecycle\";\nimport { createPortableId } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\n\nexport type AgentChatStorage = {\n loadThreads(): StoredChatThread[];\n saveThreads(threads: readonly StoredChatThread[]): void;\n loadActiveThreadId?(): string | null;\n saveActiveThreadId?(threadId: string | null): void;\n};\n\nexport type Agents24ReactRuntime = {\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId: () => string;\n storage?: AgentChatStorage;\n visibility?: VisibilitySource;\n onHitlTiming?: (timing: { stage: \"preparation\" | \"acknowledgement\" | \"attachment\" | \"first_activity\"; durationMs: number }) => void;\n};\n\nconst Agents24Context = React.createContext<Agents24ReactRuntime | null>(null);\n\nexport type Agents24ProviderProps = {\n children: React.ReactNode;\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId?: () => string;\n storage?: AgentChatStorage;\n visibility?: VisibilitySource;\n onHitlTiming?: (timing: { stage: \"preparation\" | \"acknowledgement\" | \"attachment\" | \"first_activity\"; durationMs: number }) => void;\n};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n visibility,\n onHitlTiming,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage, visibility: visibility ?? client.visibility, onHitlTiming }),\n [client, createAbortController, createId, storage, visibility, onHitlTiming],\n );\n return <Agents24Context.Provider value={value}>{children}</Agents24Context.Provider>;\n}\n\nexport function useAgents24Runtime(): Agents24ReactRuntime {\n const value = React.useContext(Agents24Context);\n if (!value) throw new Error(\"Agents24 hooks must be rendered inside Agents24Provider.\");\n return value;\n}\n\nexport function useAgentClient(): AgentClient {\n return useAgents24Runtime().client;\n}\n","import type { RuntimeEvent } from \"@agents24/client\";\n\nexport type RuntimeEventFrameScheduler = (callback: () => void) => () => void;\n\nexport type RuntimeEventFrameBuffer = {\n dispose(): void;\n flush(): void;\n push(event: RuntimeEvent): void;\n};\n\ntype AnimationFrameRuntime = {\n cancelAnimationFrame?: (handle: number) => void;\n requestAnimationFrame?: (callback: () => void) => number;\n};\n\nexport function runtimeEventFrameScheduler(): RuntimeEventFrameScheduler | undefined {\n const runtime = globalThis as AnimationFrameRuntime;\n if (typeof runtime.requestAnimationFrame !== \"function\") return undefined;\n return (callback) => {\n const handle = runtime.requestAnimationFrame?.(callback);\n return () => {\n if (handle !== undefined) runtime.cancelAnimationFrame?.(handle);\n };\n };\n}\n\nexport function createRuntimeEventFrameBuffer(\n apply: (events: readonly RuntimeEvent[]) => void,\n scheduleFrame?: RuntimeEventFrameScheduler,\n): RuntimeEventFrameBuffer {\n let pending: RuntimeEvent[] = [];\n let cancelFrame: (() => void) | null = null;\n\n const flush = () => {\n cancelFrame?.();\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n };\n\n return {\n dispose() {\n cancelFrame?.();\n cancelFrame = null;\n pending = [];\n },\n flush,\n push(event) {\n if (event.event !== \"assistant.delta\" || !scheduleFrame) {\n pending.push(event);\n flush();\n return;\n }\n pending.push(event);\n if (cancelFrame) return;\n cancelFrame = scheduleFrame(() => {\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n });\n },\n };\n}\n","/** Ephemeral display only: these fragments never enter stored messages or replay cursors. */\nimport type { AssistantPreview } from \"@agents24/client/protocol\";\nimport type { RuntimeEvent } from \"@agents24/client\";\nimport type { ChatMessage } from \"./model\";\n\nexport type AssistantPreviewState = {\n runId: string; key: string; segmentId: string; committed: number;\n dispatchId: string; generation: number;\n chunks: Record<number, string>; retired: string[];\n};\nconst keyOf = (frame: Pick<AssistantPreview, \"dispatch_id\" | \"generation\" | \"segment_id\">) => `${frame.dispatch_id}:${frame.generation}:${frame.segment_id}`;\n\nexport function acceptAssistantPreview(current: AssistantPreviewState | null | undefined, frame: AssistantPreview | null): AssistantPreviewState | null {\n if (!frame) return current ? { ...current, chunks: {} } : null;\n const key = keyOf(frame);\n if (current?.runId === frame.run_id && current.dispatchId === frame.dispatch_id && current.generation > frame.generation) return current;\n if (current?.runId === frame.run_id && current.retired.includes(key)) return current;\n const state: AssistantPreviewState = current?.runId === frame.run_id && current.key === key ? current : {\n runId: frame.run_id, dispatchId: frame.dispatch_id, generation: frame.generation, key, segmentId: frame.segment_id, committed: -1, chunks: {},\n retired: current?.runId === frame.run_id ? [...current.retired, current.key].slice(-8) : [],\n };\n if (frame.chunk_index <= state.committed || Object.keys(state.chunks).length >= 32\n || Object.values(state.chunks).reduce((size, text) => size + text.length, 0) + frame.text.length > 65_536) return state;\n return { ...state, chunks: { ...state.chunks, [frame.chunk_index]: frame.text } };\n}\n\nexport function commitAssistantPreview(current: AssistantPreviewState | null | undefined, event: RuntimeEvent): AssistantPreviewState | null {\n if (event.event === \"run.accepted\" && current && current.runId !== event.run_id) return null;\n if (current && current.runId !== event.run_id) return current;\n if ([\"assistant.completed\", \"run.completed\", \"run.failed\", \"run.cancelled\", \"run.waiting\", \"run.interrupted\", \"run.paused\", \"run.snapshot\"].includes(event.event)) return null;\n const ack = event.payload.preview_ack as Partial<AssistantPreview> | undefined;\n if (event.event !== \"assistant.delta\" || !ack || typeof ack.dispatch_id !== \"string\" || typeof ack.segment_id !== \"string\"\n || !Number.isSafeInteger(ack.generation) || !Number.isSafeInteger(ack.chunk_index)) return current || null;\n const key = keyOf(ack as AssistantPreview);\n if (current && current.key !== key) return current;\n const committed = Math.max(current?.committed ?? -1, ack.chunk_index!);\n return { runId: event.run_id, dispatchId: ack.dispatch_id, generation: ack.generation!, key, segmentId: ack.segment_id, committed,\n retired: current?.retired || [], chunks: Object.fromEntries(Object.entries(current?.chunks || {}).filter(([index]) => Number(index) > committed)) };\n}\n\nexport function previewText(state: AssistantPreviewState | null | undefined): string {\n if (!state) return \"\";\n let text = \"\";\n for (let index = state.committed + 1; Object.hasOwn(state.chunks, index); index++) text += state.chunks[index];\n return text;\n}\n\nexport function messagesWithAssistantPreview(messages: ChatMessage[], state: AssistantPreviewState | null | undefined): ChatMessage[] {\n const tail = previewText(state);\n if (!state || !tail) return messages;\n let index = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"assistant\" && messages[i]!.runId === state.runId && !messages[i]!.isFinal) { index = i; break; }\n }\n const base: ChatMessage = index < 0 ? { id: `preview-${state.runId}`, role: \"assistant\", runId: state.runId,\n content: \"\", parts: [], createdAt: new Date(0), isFinal: false } : messages[index]!;\n const parts = [...base.parts];\n const last = parts[parts.length - 1];\n if (last?.type === \"text\") parts[parts.length - 1] = { ...last, text: last.text + tail };\n else parts.push({ id: `preview-${state.segmentId}`, type: \"text\", kind: \"text\", text: tail });\n const rendered = { ...base, content: base.content + tail, parts };\n return index < 0 ? [...messages, rendered] : messages.map((message, i) => i === index ? rendered : message);\n}\n","import type { HitlResumeResult } from \"@agents24/client\";\nimport type { ChatHitlPart, ChatMessage, ChatPart } from \"./model\";\n\nexport type HitlDecisionReceipt = Pick<HitlResumeResult, \"run_id\" | \"thread_id\" | \"interrupt_id\" | \"resolution\"> & {\n run_status?: string;\n};\n\n/** Apply a durable receipt without moving the delivery cursor or changing run execution. */\nexport function applyHitlResolution<T extends Pick<ChatMessage, \"runId\" | \"parts\">>(messages: T[], receipt: HitlDecisionReceipt): T[] {\n return messages.map(message => message.runId !== receipt.run_id ? message : {\n ...message,\n parts: message.parts.map(part => part.kind !== \"hitl\" || part.interruptId !== receipt.interrupt_id ? part : {\n ...part,\n status: receipt.resolution.status,\n resolution: {\n ...receipt.resolution,\n answers: receipt.resolution.answers?.map(answer => ({\n questionId: answer.question_id, selectedOptionIds: [...answer.selected_option_ids],\n ...(answer.custom_text ? { customText: answer.custom_text } : {}),\n })),\n },\n }),\n });\n}\n\nexport function findHitlResolution(messages: readonly ChatMessage[], runId: string, interruptId: string): ChatHitlPart | undefined {\n return messages.filter(message => message.runId === runId).flatMap(message => message.parts).find((part): part is ChatHitlPart =>\n part.kind === \"hitl\" && part.interruptId === interruptId && part.status !== \"pending\");\n}\n\n/** Terminal decisions are monotonic even when delivery replays an older pending snapshot. */\nexport function preserveResolvedHitlParts(current: readonly ChatPart[], incoming: ChatPart[]): ChatPart[] {\n const resolved = current.filter((part): part is ChatHitlPart => part.kind === \"hitl\" && part.status !== \"pending\");\n if (!resolved.length) return incoming;\n const next = incoming.map(part => {\n if (part.kind !== \"hitl\" || part.status !== \"pending\") return part;\n const known = resolved.find(item => item.interruptId === part.interruptId);\n return known ? { ...part, status: known.status, resolution: known.resolution } : part;\n });\n for (const part of resolved) if (!next.some(item => item.kind === \"hitl\" && item.interruptId === part.interruptId)) {\n next.splice(Math.min(current.indexOf(part), next.length), 0, part);\n }\n return next;\n}\n","import { commitAssistantPreview, type AssistantPreviewState } from \"./assistant-preview\";\nimport { preserveResolvedHitlParts } from \"./hitl-resolution\";\nimport type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { AgentChatRunState, ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n assistantPreview?: AssistantPreviewState | null;\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: AgentChatRunState;\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n concurrentEvents: readonly ThreadSummaryEvent[] = [],\n): StoredChatThread[] {\n const currentById = new Map(current.map((thread) => [thread.id, thread]));\n const newest = incoming.map((thread) => preferNewestThreadSummary(currentById.get(thread.id), thread));\n const active = activeThreadId && !incoming.some((thread) => thread.id === activeThreadId)\n ? current.find((thread) => thread.id === activeThreadId)\n : null;\n const base = active?.isHydrated ? [active, ...newest] : newest;\n return concurrentEvents.reduce(applyThreadSummaryEvent, base);\n}\n\nexport function preferNewestThreadSummary(\n current: StoredChatThread | undefined,\n incoming: StoredChatThread,\n): StoredChatThread {\n const currentTime = Date.parse(current?.updated_at || \"\");\n const incomingTime = Date.parse(incoming.updated_at || \"\");\n const newest = current && Number.isFinite(currentTime) && Number.isFinite(incomingTime) && currentTime > incomingTime\n ? current : incoming;\n // A terminal stream event is authoritative even if a summary read was already in flight.\n if (current?.last_run_id && current.last_run_id === incoming.last_run_id\n && !current.active_run && [\"completed\", \"failed\", \"cancelled\"].includes(current.last_run_status || \"\")\n && (!incoming.active_run || incoming.active_run.run_id === current.last_run_id)) {\n return { ...newest, active_run: null, last_run_status: current.last_run_status };\n }\n return newest;\n}\n\n/** Adopt the server-created thread without reloading the in-memory transcript. */\nexport function adoptStreamingThread(\n state: AgentChatState,\n threadId: string,\n): AgentChatState {\n const normalizedThreadId = threadId.trim();\n if (!normalizedThreadId || state.activeThreadId) return state;\n const existing = state.threads.find((thread) => thread.id === normalizedThreadId);\n const adopted: StoredChatThread = existing\n ? { ...existing, messages: state.messages, isHydrated: true }\n : {\n id: normalizedThreadId,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages: state.messages,\n isHydrated: true,\n };\n return {\n ...state,\n activeThreadId: normalizedThreadId,\n threads: existing\n ? state.threads.map((thread) => thread.id === normalizedThreadId ? adopted : thread)\n : [adopted, ...state.threads],\n };\n}\n\nexport type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n strictMessageId?: boolean;\n update: (message: TMessage) => TMessage;\n};\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage,\n): TMessage[] {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);\n if (!next.some((message) => message.id === assistantMessage.id || Boolean(\n assistantMessage.runId && message.role === \"assistant\" && message.runId === assistantMessage.runId,\n ))) next.push(assistantMessage);\n return next;\n}\n\n/** Keep mounted display keys while matching only durable IDs and run linkage. */\nexport function preserveMountedMessageIds(\n canonical: ChatMessage[],\n current: ChatMessage[],\n): ChatMessage[] {\n return canonical.map((message) => {\n const mounted = current.find((item) => item.role === message.role && (\n item.durableId === message.id || item.id === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId)\n || (message.role === \"assistant\" && message.segmentIndex === 1 && item.runId\n && item.runId === message.runId && !item.durableId)\n ));\n return mounted && mounted.id !== message.id\n ? { ...message, id: mounted.id, durableId: message.id }\n : message;\n });\n}\n\n/** Reconcile a durable timeline without replacing a newer live assistant segment. */\nexport function reconcileThreadTimeline(\n current: ChatMessage[],\n canonical: ChatMessage[],\n activeRunId: string | null,\n streamingMessageId: string | null,\n): ChatMessage[] {\n const mounted = preserveMountedMessageIds(canonical, current);\n const canonicalIds = new Set(mounted.map((message) => message.id));\n const retained = current.filter((message) => !canonicalIds.has(message.id) && (\n message.isFinal || (activeRunId && (!message.runId || message.runId === activeRunId))\n ));\n const reconciled = mounted.map((message) => {\n const live = current.find((item) => item.id === message.id);\n if (live && live.runId === message.runId) message = { ...message, parts: preserveResolvedHitlParts(live.parts, message.parts) };\n return activeRunId && live?.role === \"assistant\" && live.runId === activeRunId\n && (live.id === streamingMessageId || !live.isFinal || live.responseCompletion)\n ? message.responseCompletion && !live.responseCompletion\n ? { ...message, id: live.id, durableId: message.durableId || live.durableId }\n : { ...message, ...live, feedback: message.feedback, durableId: message.durableId || live.durableId }\n : message;\n });\n // Keep locally retained rows beside their preceding durable row. In particular,\n // a live reply missing from a history snapshot stays after its user message.\n const retainedIds = new Set(retained.map((message) => message.id));\n const userByRun = new Map(reconciled.filter((message) => message.role === \"user\")\n .map((message) => [message.runId, message.id]));\n const after = new Map<string | null, ChatMessage[]>();\n let anchor: string | null = null;\n let anchorRun: string | null | undefined;\n for (const message of current) {\n if (canonicalIds.has(message.id)) { anchor = message.id; anchorRun = message.runId; }\n else if (retainedIds.has(message.id)) {\n const position = message.role === \"assistant\" && message.runId && message.runId !== anchorRun\n ? userByRun.get(message.runId) ?? anchor : anchor;\n const group = after.get(position) || [];\n group.push(message);\n after.set(position, group);\n }\n }\n return [...(after.get(null) || []), ...reconciled.flatMap((message) => [message, ...(after.get(message.id) || [])])];\n}\n\n/** Older pages add history without replacing already mounted or live messages. */\nexport function prependThreadTimeline(current: ChatMessage[], older: ChatMessage[]): ChatMessage[] {\n const mounted = preserveMountedMessageIds(older, current);\n const ids = new Set(current.map((message) => message.id));\n return [...mounted.filter((message) => !ids.has(message.id)), ...current];\n}\n\n/** A promoted queue item enters the transcript under its durable message ID. */\nexport function promoteThreadMessage(\n current: ChatMessage[],\n message: ChatMessage,\n runId: string,\n): ChatMessage[] {\n const promoted = { ...message, runId, isFinal: true };\n const index = current.findIndex((item) => item.id === message.id || item.durableId === message.id\n || Boolean(message.clientSubmissionId && item.clientSubmissionId === message.clientSubmissionId));\n if (index < 0) return [...current, message.clientSubmissionId\n ? { ...promoted, id: message.clientSubmissionId, durableId: message.id } : promoted];\n return current.map((item, itemIndex) => itemIndex === index\n ? { ...item, ...promoted, id: item.id, durableId: item.id === message.id ? item.durableId : message.id }\n : message.clientSubmissionId && item.role === \"assistant\" && item.id === `${current[index].id}:assistant`\n ? { ...item, runId } : item);\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>,\n): TMessage[] {\n const next = [...messages];\n for (const baseMessage of input.baseMessages || []) {\n const isTarget = baseMessage.role === \"assistant\" && (\n Boolean(input.messageId && baseMessage.id === input.messageId)\n || Boolean(!input.strictMessageId && input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const exactIndex = next.findIndex((message) => message.role === \"assistant\" && Boolean(input.messageId && message.id === input.messageId));\n const index = exactIndex >= 0 ? exactIndex : input.strictMessageId ? -1 : next.findIndex((message) =>\n message.role === \"assistant\" && Boolean(input.runId && message.runId === input.runId));\n if (index === -1) next.push(input.create());\n else next[index] = input.update(next[index]);\n return next;\n}\n\nfunction appendAssistantDelta(\n parts: ChatMessage[\"parts\"],\n delta: string,\n fallbackPartId: string,\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n const trailing = next[next.length - 1];\n if (trailing?.kind === \"text\") {\n next[next.length - 1] = { ...trailing, text: `${trailing.text}${delta}` };\n return next;\n }\n next.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: delta });\n return next;\n}\n\nfunction upsertResponseBlockParts(\n parts: ChatMessage[\"parts\"],\n incoming: ChatMessage[\"parts\"],\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n for (const part of incoming) {\n const index = next.findIndex((current) => current.id === part.id);\n if (index === -1) next.push(part);\n else next[index] = part;\n }\n return next;\n}\n\nfunction reconcileModelTurnParts(\n parts: ChatMessage[\"parts\"],\n event: RuntimeEvent,\n): ChatMessage[\"parts\"] {\n const eventName = String(event.event || \"\");\n const payload = event.payload || {};\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const modelTurnId = typeof payload.model_turn_id === \"string\" ? payload.model_turn_id : null;\n let next = parts;\n\n if (eventName === \"run.snapshot\" || eventName === \"assistant.completed\" || terminal) {\n next = next.filter((part) => part.kind !== \"model-turn\");\n } else if (eventName === \"assistant.delta\" && typeof payload.content === \"string\" && payload.content) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (eventName.startsWith(\"tool.\") || eventName === \"node.status.updated\") {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (\n (eventName === \"model.turn.failed\" || (eventName === \"model.turn.completed\" && payload.outcome !== \"tool_calls\"))\n && modelTurnId\n ) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.modelTurnId !== modelTurnId);\n }\n\n const active = modelTurnPartFromEvent(event);\n return active ? upsertResponseBlockParts(next, [active]) : next;\n}\n\nexport function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n const next = applyCanonicalRuntimeEvent(state, event);\n if (!state.assistantPreview && !event.payload.preview_ack) return next;\n return { ...next, assistantPreview: commitAssistantPreview(state.assistantPreview, event) };\n}\n\nfunction applyCanonicalRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n if (state.activeRunId && event.run_id && event.run_id !== state.activeRunId) {\n const previous = state.messages.find((message) => message.role === \"assistant\" && message.runId === event.run_id);\n if (event.event !== \"run.accepted\") {\n if (!previous) return state;\n // A committed handoff can arrive before the preceding run's terminal SSE.\n // Reconcile that answer without changing ownership of the new live run.\n const reconciled = applyRuntimeEvent({ ...state, activeRunId: event.run_id,\n streamingMessageId: previous.id }, event);\n return { ...state, messages: reconciled.messages };\n }\n if (previous?.isFinal) return state;\n }\n\n if (event.event === \"run.accepted\" && typeof event.payload?.message_id === \"string\") {\n const messageId = event.payload.message_id;\n let optimisticIndex = -1;\n for (let index = state.messages.length - 1; index >= 0; index -= 1) {\n const message = state.messages[index];\n if (message.role === \"user\" && (event.payload.client_submission_id\n ? message.clientSubmissionId === event.payload.client_submission_id\n : !message.runId && !message.durableId)) {\n optimisticIndex = index;\n break;\n }\n }\n if (optimisticIndex >= 0) {\n const assistantId = event.payload.client_submission_id\n ? `${state.messages[optimisticIndex].id}:assistant`\n : state.streamingMessageId;\n state = { ...state, streamingMessageId: assistantId, messages: state.messages.map((message, index) => index === optimisticIndex\n ? { ...message, durableId: messageId, runId: event.run_id }\n : message.role === \"assistant\" && message.id === assistantId\n ? { ...message, runId: event.run_id }\n : message) };\n }\n }\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const completion = (eventName === \"assistant.completed\" ? event.payload : event.payload?.response_completion) as import(\"@agents24/client/protocol\").ResponseCompletion | undefined;\n const responseCompleted = Boolean(completion?.completed_at);\n const runId = state.activeRunId && event.event !== \"run.accepted\"\n ? state.activeRunId : event.run_id || state.activeRunId;\n const segmentId = typeof event.payload?.segment_id === \"string\" ? event.payload.segment_id : null;\n const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);\n const messageId = distinctSegment\n ? `${runId || \"run\"}-assistant-${segmentId}`\n : state.streamingMessageId || `${runId || \"run\"}-assistant`;\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const paused = eventName === \"run.paused\" || projection.parts.some((part) => part.kind === \"hitl\" && part.status === \"pending\");\n const suspension = eventName === \"run.waiting\" ? \"waiting\" : eventName === \"run.interrupted\" ? \"interrupted\" : null;\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && message.id === messageId)\n || (!distinctSegment ? state.messages.find((message) => message.role === \"assistant\" && Boolean(runId && message.runId === runId)) : undefined);\n const sealedAfterTerminal = responseCompleted && !state.activeRunId\n && [\"completed\", \"failed\", \"cancelled\"].includes(state.runState) && existing?.runId === runId;\n const payload = event.payload || {};\n const eventThreadId = typeof payload.thread_id === \"string\" && payload.thread_id.trim()\n ? payload.thread_id.trim()\n : null;\n const contextApplies = (\n (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId)\n && (!state.activeRunId || !runId || runId === state.activeRunId)\n );\n const contextPayload = payload.context_window && typeof payload.context_window === \"object\"\n ? { ...payload.context_window as Record<string, unknown>, run_id: runId }\n : payload.context_window;\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, contextPayload)\n : state.contextWindow;\n const explicitCompression = contextApplies\n ? normalizeContextCompression(payload.context_compression)\n : null;\n const contextCompression = contextApplies\n ? explicitCompression || compressionFromContextWindow(contextWindow) || state.contextCompression\n : state.contextCompression;\n const hasLiveCompressionUpdate = Boolean(\n contextApplies\n && (\n explicitCompression?.active\n || compressionFromContextWindow(\n mergeContextWindowUpdate(null, contextPayload),\n )?.active\n )\n );\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const hasCanonicalResponseBlocks = Array.isArray(payload.response_blocks);\n const content = hasCanonicalResponseBlocks\n ? projection.content\n : delta\n ? `${existing?.content || \"\"}${delta}`\n : projection.content || existing?.content || \"\";\n const projectedParts = hasCanonicalResponseBlocks\n ? projection.parts\n : delta\n ? appendAssistantDelta(\n existing?.parts || [],\n delta,\n typeof payload.block_id === \"string\" ? payload.block_id : `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(preserveResolvedHitlParts(existing?.parts || [], projectedParts), event);\n const compressionPart = contextApplies && explicitCompression?.active\n ? contextCompressionPartFromEvent(event, lifecycleParts)\n : null;\n const parts = compressionPart\n ? upsertResponseBlockParts(lifecycleParts, [compressionPart])\n : lifecycleParts;\n const activeThreadId = eventThreadId || state.activeThreadId;\n let messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n strictMessageId: distinctSegment,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal || responseCompleted,\n responseCompletion: completion,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || responseCompleted || message.isFinal,\n responseCompletion: completion || message.responseCompletion,\n }),\n });\n if (responseCompleted) messages = messages.map((message) => {\n if (message.role !== \"assistant\" || message.runId !== runId) return message;\n const segment = completion?.segments.find((item) => item.message_id === message.durableId\n || item.message_id === message.id || message.id.endsWith(`-assistant-${item.segment_id}`))\n || (!message.segmentIndex || message.segmentIndex === 1 ? completion?.segments[0] : undefined);\n return { ...message, isFinal: true, responseCompletion: completion,\n ...(segment ? { durableId: segment.message_id } : {}) };\n });\n const activityStatus: NonNullable<StoredChatThread[\"active_run\"]>[\"status\"] = suspension || (paused ? \"paused\" : cancelling ? \"cancelling\" : \"running\");\n const terminalThread = runId && !sealedAfterTerminal ? {\n active_run: terminal ? null : { run_id: runId, status: activityStatus,\n started_at: state.threads.find(thread => thread.id === activeThreadId)?.active_run?.started_at ?? null,\n created_at: state.threads.find(thread => thread.id === activeThreadId && thread.active_run?.run_id === runId)?.active_run?.created_at ?? event.ts,\n is_cancellable: !cancelling },\n last_run_status: terminal ? eventName.slice(4) : activityStatus,\n } : {};\n const threads = activeThreadId\n ? state.threads.some((thread) => thread.id === activeThreadId)\n ? state.threads.map((thread) => thread.id === activeThreadId\n ? {\n ...thread,\n messages,\n isHydrated: true,\n last_run_id: terminal && thread.active_run && thread.active_run.run_id !== runId\n ? thread.last_run_id : runId ?? thread.last_run_id,\n ...(!terminal || !thread.active_run || thread.active_run.run_id === runId ? terminalThread : {}),\n contextWindow,\n contextCompression,\n }\n : thread)\n : [{\n id: activeThreadId,\n title: null,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages,\n isHydrated: true,\n last_run_id: runId,\n ...terminalThread,\n contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal || sealedAfterTerminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n messages,\n threads,\n contextWindow,\n contextCompression,\n contextCompressionRevision: hasLiveCompressionUpdate\n ? state.contextCompressionRevision + 1\n : state.contextCompressionRevision,\n runState: sealedAfterTerminal ? state.runState : suspension || (paused\n ? \"paused\"\n : cancelling\n ? \"cancelling\"\n : terminal\n ? eventName === \"run.completed\"\n ? \"completed\"\n : eventName === \"run.cancelled\"\n ? \"cancelled\"\n : \"failed\"\n : \"streaming\"),\n streamingMessageId: terminal || paused || suspension || responseCompleted || existing?.responseCompletion ? null : messageId,\n };\n}\n\nexport function applyRuntimeEvents(\n state: AgentChatState,\n events: readonly RuntimeEvent[],\n): AgentChatState {\n return events.reduce(applyRuntimeEvent, state);\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\n if (String(event.event) === \"thread.task.updated\") {\n const value = event as unknown as { thread_id: string; task: Record<string, unknown> };\n const handle = value.task?.handle;\n if (typeof handle !== \"string\") return threads;\n return threads.map(thread => thread.id === value.thread_id ? { ...thread,\n taskNotifications: [...(thread.taskNotifications || []).filter(task => task.handle !== handle),\n { ...value.task, handle }].slice(-1000) } : thread);\n }\n if (event.event === \"snapshot_required\") return threads;\n if (event.event === \"thread.deleted\") return threads.filter((thread) => thread.id !== event.thread_id);\n if (event.event !== \"thread.summary.updated\") return threads;\n const incoming = event.thread as StoredChatThread;\n const index = threads.findIndex((thread) => thread.id === incoming.id);\n if (index === -1) return [{ ...incoming, messages: incoming.messages || [], isHydrated: false }, ...threads];\n const next = [...threads];\n next[index] = preferNewestThreadSummary(next[index], {\n ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated,\n });\n return next;\n}\n","import * as React from \"react\";\nimport { measureOptimisticPaint } from \"./chat-timing\";\nimport { captureChatOperation } from \"./operation-ownership\";\nimport type { ChatMessage } from \"./model\";\nimport { appendStableStreamingTurn, type AgentChatState } from \"./state\";\nimport type {\n ThreadMessage, ThreadMessageInput, ThreadMessageQueueState,\n ThreadMessageSubmission, ThreadMessagesPage,\n AbortSignalLike,\n} from \"@agents24/client\";\n\n/** Retry uncertain admission once; the caller retains the same receipt and payload. */\nexport async function retrySubmissionAdmission<T>(admit: () => Promise<T>): Promise<T> {\n try { return await admit(); }\n catch (error) {\n const failure = error as { kind?: string; name?: string } | null;\n if (failure?.kind !== \"network\" && failure?.name !== \"HttpRequestTimeoutError\"\n && !(error instanceof TypeError)) throw error;\n return admit();\n }\n}\n\nexport type ThreadMessageNotice = {\n messageId: string;\n status: string;\n runId: string | null;\n cursor?: number;\n clientSubmissionId?: string | null;\n};\n\nexport type ThreadMessageQueueTransport = {\n list(threadId: string, signal?: AbortSignalLike): Promise<ThreadMessagesPage>;\n submit(input: ThreadMessageInput): Promise<ThreadMessageSubmission>;\n edit(message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }): Promise<ThreadMessage>;\n remove(message: ThreadMessage): Promise<void>;\n resume(threadId: string): Promise<{ run_id: string | null }>;\n};\n\nexport type RetractedMessageDraft = Pick<ThreadMessage, \"text\" | \"attachment_ids\" | \"attachments\">;\n\nexport function useThreadMessageQueue({ threadId, transport, onPromoted, onUnknownPromotion, onOptimistic, onDiscard, ownOperation: ownSelection }: {\n threadId: string | null;\n ownOperation?: (options?: Parameters<typeof captureChatOperation>[1]) => () => boolean;\n transport: ThreadMessageQueueTransport;\n onPromoted: (message: ThreadMessage, runId: string) => void;\n onUnknownPromotion?: (runId: string, threadId: string) => void;\n onOptimistic?: (message: ThreadMessage, uploading: boolean) => void;\n onDiscard?: (message: ThreadMessage) => void;\n}) {\n const [pendingMessages, setPendingMessages] = React.useState<readonly ThreadMessage[]>([]);\n const [messageQueue, setMessageQueue] = React.useState<ThreadMessageQueueState | null>(null);\n const pendingRef = React.useRef(new Map<string, ThreadMessage & { optimisticQueued?: boolean }>());\n const admissionRef = React.useRef<{ threadId: string; done: Promise<void> } | null>(null);\n const initialAdmissionRef = React.useRef<{ id: string; threadId?: string; failure?: unknown; isCurrent: () => boolean;\n done: Promise<string | null>; resolve(threadId: string | null): void } | null>(null);\n const versionRef = React.useRef(0);\n const cursorRef = React.useRef(0);\n const promotedRef = React.useRef(new Set<string>());\n const threadRef = React.useRef(threadId);\n const selectionGenerationRef = React.useRef(0);\n if (threadRef.current !== threadId && initialAdmissionRef.current?.threadId !== threadId) selectionGenerationRef.current += 1;\n const transportRef = React.useRef(transport);\n const onPromotedRef = React.useRef(onPromoted);\n threadRef.current = threadId;\n transportRef.current = transport;\n onPromotedRef.current = onPromoted;\n const ownSelectionRef = React.useRef(ownSelection);\n ownSelectionRef.current = ownSelection;\n const callbacksRef = React.useRef({ onOptimistic, onDiscard, onUnknownPromotion });\n callbacksRef.current = { onOptimistic, onDiscard, onUnknownPromotion };\n\n const ownOperation = React.useCallback((options?: Parameters<typeof captureChatOperation>[1]) => ownSelectionRef.current?.(options) ?? captureChatOperation(() => ({\n generation: selectionGenerationRef.current, threadId: threadRef.current,\n }), options), []);\n const confirmThreadAdmission = React.useCallback((admittedThreadId: string) => {\n const initial = initialAdmissionRef.current;\n if (!initial || !initial.isCurrent()) return;\n initial.threadId = admittedThreadId;\n initial.resolve(admittedThreadId);\n }, []);\n const assertCurrent = (isCurrent: () => boolean) => {\n if (!isCurrent()) throw Object.assign(new Error(\"Thread selection changed.\"), { name: \"AbortError\" });\n };\n\n const knownMessage = (id: string, submissionId?: string | null) => pendingRef.current.get(id)\n || (submissionId ? [...pendingRef.current.values()].find((item) => item.client_submission_id === submissionId) : undefined);\n\n const hydrate = React.useCallback((page: ThreadMessagesPage, selectedThreadId: string) => {\n if (threadRef.current !== selectedThreadId) return;\n const pending = page.pending.filter((message) => !promotedRef.current.has(message.id)).map((message) => {\n const known = knownMessage(message.id, message.client_submission_id);\n if (message.attachments?.length || !known?.attachments?.length) return message;\n return { ...message, attachments: known.attachments.filter((attachment) =>\n message.attachment_ids.includes(attachment.id)) };\n });\n for (const message of pending) pendingRef.current.set(message.id, message);\n const optimistic = [...pendingRef.current.values()].filter((message) => message.thread_id === selectedThreadId\n && message.revision === 0 && message.optimisticQueued && !pending.some((item) => item.client_submission_id === message.client_submission_id));\n setPendingMessages([...pending, ...optimistic]);\n setMessageQueue(page.queue);\n }, []);\n\n const refresh = React.useCallback(async (selectedThreadId = threadRef.current, signal?: AbortSignalLike) => {\n if (!selectedThreadId) return null;\n const isCurrent = ownOperation();\n const version = ++versionRef.current;\n const page = await transportRef.current.list(selectedThreadId, signal);\n if (signal?.aborted || !isCurrent() || version !== versionRef.current || threadRef.current !== selectedThreadId) return null;\n for (const item of page.items) {\n if (item.role === \"user\" && item.status === \"delivered\" && item.run_id) {\n const pending = knownMessage(item.id, item.client_submission_id);\n if (pending && !promotedRef.current.has(item.id)) {\n promotedRef.current.add(item.id);\n pendingRef.current.delete(pending.id);\n pendingRef.current.delete(item.id);\n onPromotedRef.current({ ...pending, ...item,\n attachments: item.attachments?.length ? item.attachments : pending.attachments }, item.run_id);\n }\n }\n }\n hydrate(page, selectedThreadId);\n return page;\n }, [hydrate, ownOperation]);\n\n const acceptNotice = React.useCallback((notice: ThreadMessageNotice) => {\n if (notice.cursor && notice.cursor <= cursorRef.current) return false;\n if (notice.cursor) cursorRef.current = notice.cursor;\n const pending = knownMessage(notice.messageId, notice.clientSubmissionId);\n if (notice.status === \"delivered\" && notice.runId && !promotedRef.current.has(notice.messageId)) {\n promotedRef.current.add(notice.messageId);\n versionRef.current += 1;\n if (pending) {\n pendingRef.current.delete(pending.id);\n setPendingMessages((current) => current.filter((message) => message.id !== pending.id));\n onPromotedRef.current({ ...pending, id: notice.messageId, run_id: notice.runId, status: \"delivered\" }, notice.runId);\n } else if (threadRef.current) callbacksRef.current.onUnknownPromotion?.(notice.runId, threadRef.current);\n }\n if (notice.status === \"removed\") pendingRef.current.delete(notice.messageId);\n return true;\n }, []);\n\n const beginSubmission = React.useCallback((input: {\n input: string; clientSubmissionId: string; mode?: \"queue\" | \"steer\";\n attachmentIds?: readonly string[]; attachments?: ThreadMessage[\"attachments\"]; uploading?: boolean;\n }, queued = false) => {\n const now = new Date().toISOString();\n const message: ThreadMessage = {\n id: input.clientSubmissionId, client_submission_id: input.clientSubmissionId,\n thread_id: threadRef.current || \"\", sequence: Number.MAX_SAFE_INTEGER,\n run_id: null, turn_id: null, segment_index: 0, role: \"user\",\n status: \"queued\", requested_mode: input.mode || \"queue\", text: input.input,\n attachment_ids: input.attachmentIds || input.attachments?.map((item) => item.id) || [], attachments: input.attachments,\n response_blocks: [], revision: 0, created_at: now, updated_at: now,\n };\n pendingRef.current.set(message.id, { ...message, optimisticQueued: queued });\n if (!queued && !threadRef.current && !initialAdmissionRef.current) {\n let resolve!: (threadId: string | null) => void;\n const done = new Promise<string | null>(callback => { resolve = callback; });\n initialAdmissionRef.current = { id: message.id, done, resolve, isCurrent: ownOperation({ adoptThread: true }) };\n }\n versionRef.current += 1;\n if (queued) setPendingMessages((current) => [...current, message]);\n else callbacksRef.current.onOptimistic?.(message, Boolean(input.uploading));\n measureOptimisticPaint(input.clientSubmissionId, threadRef.current);\n return message;\n }, [ownOperation]);\n\n const discardSubmission = React.useCallback((message: ThreadMessage, failure?: unknown) => {\n if (initialAdmissionRef.current?.id === message.id) {\n initialAdmissionRef.current.failure = failure;\n initialAdmissionRef.current.resolve(null);\n initialAdmissionRef.current = null;\n }\n if (!pendingRef.current.has(message.id)) return;\n pendingRef.current.delete(message.id);\n callbacksRef.current.onDiscard?.(message);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== message.client_submission_id));\n }, []);\n\n const submit = React.useCallback(async (input: Omit<ThreadMessageInput, \"threadId\"> & {\n attachments?: ThreadMessage[\"attachments\"];\n queued?: boolean;\n uploading?: boolean;\n prepare?: () => Promise<Pick<ThreadMessageInput, \"attachmentIds\"> & { attachments?: ThreadMessage[\"attachments\"] }>;\n }) => {\n const initial = !threadRef.current ? initialAdmissionRef.current : null;\n let selectedThreadId = threadRef.current;\n if (!selectedThreadId && !initial) throw new Error(\"No active Agent thread is available.\");\n const isCurrent = ownOperation({ adoptThread: Boolean(initial) });\n const { queued: requestedQueued, prepare, attachments, uploading, ...submission } = input;\n const priorAdmission = admissionRef.current?.threadId === (selectedThreadId || \"\") ? admissionRef.current.done : undefined;\n const queued = Boolean(requestedQueued || priorAdmission || initial);\n const optimistic = beginSubmission({ ...submission, attachments, uploading,\n clientSubmissionId: submission.clientSubmissionId || submission.idempotencyKey }, queued);\n let releaseAdmission!: () => void;\n const admission = { threadId: selectedThreadId || \"\", done: new Promise<void>((resolve) => { releaseAdmission = resolve; }) };\n admissionRef.current = admission;\n try {\n const prepared = prepare ? await prepare() : {};\n if (initial) selectedThreadId = await initial.done;\n if (priorAdmission) await priorAdmission;\n assertCurrent(isCurrent);\n if (!selectedThreadId) throw Object.assign(new Error(\"Initial message admission did not complete.\"), { name: \"AbortError\" });\n admission.threadId = selectedThreadId;\n pendingRef.current.set(optimistic.id, { ...optimistic, optimisticQueued: queued, attachment_ids: prepared.attachmentIds || optimistic.attachment_ids, attachments: prepared.attachments || attachments });\n const request = { ...submission, ...prepared, clientSubmissionId: optimistic.client_submission_id!, threadId: selectedThreadId };\n const result = await retrySubmissionAdmission(() => transportRef.current.submit(request));\n if (!isCurrent()) return result;\n versionRef.current += 1;\n const bound: ThreadMessage = { ...optimistic, id: result.message_id,\n client_submission_id: result.client_submission_id || optimistic.client_submission_id,\n attachment_ids: request.attachmentIds || [], attachments: prepared.attachments || attachments,\n run_id: result.run_id, status: result.status, revision: 1 };\n pendingRef.current.delete(optimistic.id);\n if (result.run_id) {\n setPendingMessages((current) => current.filter((item) => item.client_submission_id !== bound.client_submission_id));\n if (!promotedRef.current.has(bound.id)) {\n promotedRef.current.add(bound.id);\n onPromotedRef.current(bound, result.run_id);\n }\n } else if (!promotedRef.current.has(bound.id)) {\n if (!queued) callbacksRef.current.onDiscard?.(optimistic);\n pendingRef.current.set(bound.id, bound);\n setPendingMessages((current) => [...current.filter((item) => item.client_submission_id !== bound.client_submission_id), bound]);\n }\n void refresh().catch(() => undefined);\n return result;\n } catch (error) {\n if (isCurrent()) discardSubmission(optimistic);\n throw error; // Composer restores this draft only if newer typing is absent.\n } finally {\n void Promise.resolve(priorAdmission).then(() => {\n releaseAdmission();\n if (admissionRef.current === admission) admissionRef.current = null;\n });\n }\n }, [beginSubmission, discardSubmission, refresh, ownOperation]);\n\n const edit = React.useCallback(async (message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }) => {\n const isCurrent = ownOperation();\n const updated = await transportRef.current.edit(message, input);\n assertCurrent(isCurrent);\n versionRef.current += 1;\n pendingRef.current.set(updated.id, updated);\n await refresh(message.thread_id);\n return updated;\n }, [refresh, ownOperation]);\n\n const remove = React.useCallback(async (message: ThreadMessage) => {\n const isCurrent = ownOperation();\n await transportRef.current.remove(message);\n assertCurrent(isCurrent);\n versionRef.current += 1;\n pendingRef.current.delete(message.id);\n setPendingMessages((current) => current.filter((item) => item.id !== message.id));\n await refresh(message.thread_id);\n }, [refresh, ownOperation]);\n\n const retractForEdit = React.useCallback(async (message: ThreadMessage): Promise<RetractedMessageDraft> => {\n const isCurrent = ownOperation();\n await remove(message);\n assertCurrent(isCurrent);\n return { text: message.text, attachment_ids: message.attachment_ids, attachments: message.attachments };\n }, [remove, ownOperation]);\n\n const resume = React.useCallback(async () => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) return null;\n const isCurrent = ownOperation();\n const result = await transportRef.current.resume(selectedThreadId);\n if (!isCurrent()) return null;\n await refresh(selectedThreadId);\n return result;\n }, [refresh, ownOperation]);\n\n const reset = React.useCallback(() => {\n initialAdmissionRef.current?.resolve(null);\n initialAdmissionRef.current = null;\n admissionRef.current = null;\n selectionGenerationRef.current += 1;\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n pendingRef.current.clear();\n setPendingMessages([]);\n setMessageQueue(null);\n }, []);\n\n React.useEffect(() => {\n const initial = initialAdmissionRef.current;\n const adopting = Boolean(initial?.threadId && initial.threadId === threadId && initial.isCurrent());\n if (adopting) {\n for (const [id, message] of pendingRef.current) pendingRef.current.set(id, { ...message, thread_id: threadId! });\n initialAdmissionRef.current = null;\n } else {\n initial?.resolve(null);\n initialAdmissionRef.current = null;\n pendingRef.current.clear();\n setPendingMessages([]);\n }\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n setMessageQueue(null);\n if (threadId) void refresh(threadId).catch(() => undefined);\n return () => { initialAdmissionRef.current?.resolve(null); };\n }, [threadId, refresh]);\n\n\n return { pendingMessages, messageQueue, refresh, hydrate, acceptNotice, beginSubmission, discardSubmission, reset,\n confirmThreadAdmission, hasPendingAdmission: () => Boolean(initialAdmissionRef.current?.isCurrent()),\n waitForInitialAdmission: () => {\n const initial = initialAdmissionRef.current;\n return initial ? initial.done.then(threadId => {\n if (!threadId) throw initial.failure || Object.assign(new Error(\"Initial message admission detached.\"), { name: \"AbortError\" });\n return threadId;\n }) : Promise.resolve(threadRef.current);\n },\n submit, edit, remove, retractForEdit, resume };\n}\n\n/** One provisional identity for first sends, idle sends, uploads and queue rows. */\nexport function optimisticSubmissionTurn(message: ThreadMessage): [ChatMessage, ChatMessage] {\n const user: ChatMessage = { id: message.client_submission_id || message.id,\n clientSubmissionId: message.client_submission_id || undefined,\n role: \"user\", content: message.text, createdAt: message.created_at, isFinal: true,\n parts: message.text ? [{ id: `${message.id}:text`, type: \"text\", kind: \"text\", text: message.text }] : [],\n attachments: message.attachments?.map((item) => ({ id: item.id, filename: item.filename,\n mediaType: item.mime_type, byteSize: item.byte_size })),\n };\n return [user, { id: `${user.id}:assistant`, role: \"assistant\", content: \"\", parts: [],\n createdAt: message.created_at, isFinal: false }];\n}\n\nexport function optimisticSubmissionState(state: AgentChatState, message: ThreadMessage, uploading: boolean): AgentChatState {\n const [user, assistant] = optimisticSubmissionTurn(message);\n return { ...state, messages: appendStableStreamingTurn(state.messages, user, assistant),\n streamingMessageId: assistant.id, runState: uploading ? \"uploading\" : \"streaming\", error: null };\n}\n\nexport function discardOptimisticSubmission(state: AgentChatState, message: ThreadMessage): AgentChatState {\n const activeDraft = state.streamingMessageId === `${message.id}:assistant`;\n return { ...state, messages: state.messages.filter((item) => item.runId\n || (item.id !== message.id && item.id !== `${message.id}:assistant`)),\n streamingMessageId: activeDraft ? null : state.streamingMessageId,\n runState: activeDraft && !state.activeRunId ? \"idle\" : state.runState };\n}\n","import { runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\n\n/** Browser paint evidence is independent of backend trace timestamps. */\nexport function measureOptimisticPaint(submissionId: string, threadId: string | null): void {\n const runtime = globalThis as unknown as {\n document?: { visibilityState: string };\n performance?: { now(): number; clearMeasures(name: string): void;\n measure(name: string, options: { start: number; end: number; detail: unknown }): void };\n };\n const schedule = runtimeEventFrameScheduler();\n const performance = runtime.performance;\n if (!schedule || !performance || runtime.document?.visibilityState === \"hidden\") return;\n const start = performance.now();\n // Observe the first frame's opportunity to paint; retain one bounded entry.\n schedule(() => schedule(() => {\n performance.clearMeasures(\"agents24.optimistic-paint\");\n performance.measure(\"agents24.optimistic-paint\", { start, end: performance.now(),\n detail: { client_submission_id: submissionId, thread_id: threadId } });\n }));\n}\n","/** A selection generation distinguishes A → B → A from uninterrupted ownership. */\nexport type ChatOperationOwner = {\n generation: number;\n client?: unknown;\n threadId: string | null;\n runId?: string | null;\n stream?: unknown;\n};\n\nexport function captureChatOperation(\n read: () => ChatOperationOwner,\n options: { run?: boolean; stream?: boolean; adoptThread?: boolean } = {},\n): () => boolean {\n const owner = read();\n return () => {\n const current = read();\n return current.client === owner.client\n && current.generation === owner.generation\n && (options.adoptThread || current.threadId === owner.threadId)\n && (!options.run || current.runId === owner.runId)\n && (!options.stream || current.stream === owner.stream);\n };\n}\n","import type { AgentClient, HitlResponse, HitlResumeResult } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatHitlPart } from \"./model\";\nimport { threadTimelineToMessages } from \"./model\";\nimport type { AgentChatState } from \"./state\";\nimport type { Agents24ReactRuntime } from \"./provider\";\nimport { findHitlResolution, type HitlDecisionReceipt } from \"./hitl-resolution\";\nimport { createHitlSubmission, type HitlSubmissionOptions, type HitlSubmissionState } from \"./hitl-submission\";\n\nfunction hitlSubmissionKey(threadId: string | null, runId: string, interruptId: string, generation: number): string {\n return `${generation}:${threadId}:${runId}:${interruptId}`;\n}\n\nexport function useAgentChatHitlSubmissions(options: {\n client: AgentClient;\n runtime: Agents24ReactRuntime;\n pageSize: number;\n stateRef: React.MutableRefObject<AgentChatState>;\n selectionGeneration: React.MutableRefObject<number>;\n ownOperation(): () => boolean;\n accept(receipt: HitlDecisionReceipt): void;\n attach(runId: string): void;\n}) {\n const latest = React.useRef(options);\n latest.current = options;\n const mounted = React.useRef(true);\n const operations = React.useRef(new Map<string, ReturnType<typeof createHitlSubmission>>());\n const [states, setStates] = React.useState<Record<string, HitlSubmissionState>>({});\n const clientRef = React.useRef(options.client);\n if (clientRef.current !== options.client) {\n clientRef.current = options.client;\n operations.current.clear();\n }\n React.useEffect(() => { mounted.current = true; return () => { mounted.current = false; operations.current.clear(); }; }, []);\n const resumeHitl = React.useCallback((part: ChatHitlPart, response: HitlResponse, submission?: HitlSubmissionOptions): Promise<void> => {\n const captured = latest.current;\n const { client, runtime, stateRef, ownOperation, pageSize } = captured;\n const threadId = stateRef.current.activeThreadId;\n const runId = part.runId || stateRef.current.messages.find(message => message.parts.some(candidate => candidate.id === part.id))?.runId || stateRef.current.activeRunId;\n if (!threadId || !runId) return Promise.reject(new Error(\"No paused run is available to resume.\"));\n const isOwned = ownOperation();\n const isCurrent = () => mounted.current && latest.current.client === client && isOwned()\n && (!stateRef.current.activeRunId || stateRef.current.activeRunId === runId);\n const key = hitlSubmissionKey(threadId, runId, part.interruptId, captured.selectionGeneration.current);\n const live = stateRef.current.messages.filter(message => message.runId === runId).flatMap(message => message.parts)\n .find((candidate): candidate is ChatHitlPart => candidate.kind === \"hitl\" && candidate.interruptId === part.interruptId);\n if (part.status !== \"pending\" || (live && live.status !== \"pending\")) return Promise.resolve();\n const previous = operations.current.get(key);\n if (previous && !previous.failed) return previous.retry();\n if ( [\"cancelling\", \"cancelled\", \"failed\", \"completed\"].includes(stateRef.current.runState)) return Promise.resolve();\n const operation = createHitlSubmission({\n response, idempotencyKey: runtime.createId(), prepare: submission?.prepare,\n createAbortController: runtime.createAbortController, isCurrent,\n send: (decision, idempotencyKey, signal) => client.hitl.resume({ runId, interruptId: part.interruptId, ...decision, idempotencyKey, signal }),\n accept: receipt => {\n captured.accept(receipt);\n if (![\"completed\", \"failed\", \"cancelled\"].includes(receipt.run_status || \"\")) captured.attach(receipt.run_id);\n },\n reconcile: async signal => {\n const [page, detail] = await Promise.all([\n client.threads.messages.list({ threadId, limit: pageSize, signal }),\n client.threads.get({ threadId, limit: pageSize, signal }),\n ]);\n if (!isCurrent()) return null;\n const part = findHitlResolution(threadTimelineToMessages(page.items), runId, capturedPart.interruptId);\n if (!part?.resolution) return null;\n return { run_id: runId, thread_id: threadId, interrupt_id: part.interruptId,\n run_status: detail.active_run?.run_id === runId ? detail.active_run.status\n : detail.last_run_id === runId ? detail.last_run_status || undefined : undefined,\n resolution: { ...part.resolution, status: part.status as HitlResumeResult[\"resolution\"][\"status\"],\n action: (part.resolution.action as HitlResumeResult[\"action\"]) || null,\n outcome: part.resolution.outcome || part.status,\n resolved_at: part.resolution.resolved_at as string | null,\n answers: part.resolution.answers?.map(answer => ({ question_id: answer.questionId,\n selected_option_ids: answer.selectedOptionIds, custom_text: answer.customText })),\n } };\n },\n changed: state => { if (isCurrent()) setStates(current => ({ ...current, [key]: state })); },\n timing: (stage, durationMs) => runtime.onHitlTiming?.({ stage, durationMs }),\n });\n const capturedPart = part;\n // Set the lock before a prerequisite, transport, or React render can yield.\n operations.current.set(key, operation);\n return operation.retry();\n }, []);\n // Selection ownership is part of the retained operation, including A → B → A.\n const selection = options.stateRef.current.activeThreadId;\n const generation = options.selectionGeneration.current;\n React.useEffect(() => {\n const prefix = `${generation}:${selection}:`;\n for (const key of operations.current.keys()) if (!key.startsWith(prefix)) operations.current.delete(key);\n setStates(current => Object.fromEntries(Object.entries(current).filter(([key]) => key.startsWith(prefix))));\n }, [options.client, selection, generation]);\n return { resumeHitl, getHitlSubmissionState: (part: ChatHitlPart) => {\n const runId = part.runId || options.stateRef.current.messages.find(message => message.parts.some(candidate => candidate.id === part.id))?.runId || options.stateRef.current.activeRunId;\n const key = runId ? hitlSubmissionKey(selection, runId, part.interruptId, generation) : null;\n const state = key && operations.current.has(key) ? states[key] : undefined;\n if (!state) return undefined;\n if (part.status !== \"pending\") {\n return !options.stateRef.current.activeRunId || [\"completed\", \"failed\", \"cancelled\"].includes(options.stateRef.current.runState)\n ? undefined : { action: String(part.resolution?.action || state.action), status: \"accepted\" as const };\n }\n return state;\n } };\n}\n","import type { AbortSignalLike, HitlResponse, HitlResumeResult } from \"@agents24/client\";\nimport type { HitlDecisionReceipt } from \"./hitl-resolution\";\nimport type { AbortControllerFactory } from \"./lifecycle\";\n\nexport type HitlSubmissionOptions = {\n /** Host-owned prerequisite. Runs inside the submission lock and decision deadline. */\n prepare?: (input: { signal: AbortSignalLike }) => Promise<void>;\n};\nexport type HitlSubmissionState = {\n action: string;\n status: \"submitting\" | \"checking\" | \"uncertain\" | \"accepted\" | \"error\";\n error?: string | null;\n retry?: () => Promise<void>;\n};\n\ntype TimerRuntime = { setTimeout(callback: () => void, ms: number): unknown; clearTimeout(handle: unknown): void };\nconst timers = globalThis as unknown as TimerRuntime;\n\n/** A separate deadline for decisions and reconciliation, never for continuation streams. */\nexport async function withHitlDeadline<T>(factory: AbortControllerFactory, work: (signal: AbortSignalLike) => Promise<T>, ms = 15_000): Promise<T> {\n const abort = factory();\n let timer: unknown;\n try {\n return await Promise.race([work(abort.signal), new Promise<never>((_, reject) => {\n timer = timers.setTimeout(() => { abort.abort(); reject(new Error(\"Submission acknowledgement timed out.\")); }, ms);\n })]);\n } finally { timers.clearTimeout(timer); }\n}\n\nexport function isDefinitiveHitlRejection(error: unknown): boolean {\n const status = (error as { status?: number; statusCode?: number } | null)?.status\n ?? (error as { statusCode?: number } | null)?.statusCode;\n // A processing/conflicting decision may already be durable. Read it before offering anything.\n return typeof status === \"number\" && status >= 400 && status < 500 && ![408, 409, 425, 429].includes(status);\n}\n\n/** One immutable decision; retry is the very same operation and idempotency identity. */\nexport function createHitlSubmission(options: {\n response: HitlResponse;\n idempotencyKey: string;\n prepare?: HitlSubmissionOptions[\"prepare\"];\n createAbortController: AbortControllerFactory;\n isCurrent(): boolean;\n send(response: HitlResponse, key: string, signal: AbortSignalLike): Promise<HitlResumeResult>;\n reconcile(signal: AbortSignalLike): Promise<HitlDecisionReceipt | null>;\n accept(receipt: HitlDecisionReceipt): void;\n changed(state: HitlSubmissionState): void;\n now?: () => number;\n timing?: (stage: \"preparation\" | \"acknowledgement\", durationMs: number) => void;\n}) {\n const response: HitlResponse = { ...options.response, answers: options.response.answers?.map(answer => ({\n ...answer, selected_option_ids: [...answer.selected_option_ids],\n })) };\n let pending: Promise<void> | undefined;\n let accepted = false;\n let failed = false;\n let uncertain = false;\n const now = options.now ?? Date.now;\n const publish = (state: HitlSubmissionState) => { if (options.isCurrent()) options.changed(state); };\n const accept = (receipt: HitlDecisionReceipt) => {\n if (!options.isCurrent() || accepted) return;\n accepted = true;\n uncertain = false;\n options.accept(receipt);\n publish({ action: receipt.resolution.action || response.action, status: \"accepted\" });\n };\n const retry = (): Promise<void> => {\n if (pending) return pending;\n if (accepted || !options.isCurrent()) return Promise.resolve();\n failed = false;\n uncertain = false;\n publish({ action: response.action, status: \"submitting\" });\n // The microtask lets the caller retain the operation synchronously, before any host work.\n pending = Promise.resolve().then(async () => {\n try {\n await withHitlDeadline(options.createAbortController, async signal => {\n const started = now();\n await options.prepare?.({ signal });\n options.timing?.(\"preparation\", now() - started);\n if (!options.isCurrent() || signal.aborted) return;\n const submitted = now();\n const receipt = await options.send(response, options.idempotencyKey, signal);\n options.timing?.(\"acknowledgement\", now() - submitted);\n // A late HTTP acknowledgement remains authoritative after a timeout.\n accept(receipt);\n });\n } catch (error) {\n if (!options.isCurrent() || accepted) return;\n if (isDefinitiveHitlRejection(error)) {\n failed = true;\n publish({ action: response.action, status: \"error\", error: error instanceof Error ? error.message : \"Submission was rejected.\" });\n throw error;\n }\n publish({ action: response.action, status: \"checking\" });\n // Existing authorized history is the recovery authority, not a guessed success.\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n const resolved = await withHitlDeadline(options.createAbortController, options.reconcile, 3_000);\n if (resolved) accept(resolved);\n } catch { /* Keep the immutable decision until an authorized read or retry succeeds. */ }\n if (accepted || !options.isCurrent()) return;\n }\n uncertain = true;\n publish({ action: response.action, status: \"uncertain\", retry });\n }\n }).finally(() => { pending = undefined; });\n return pending;\n };\n return { retry, get failed() { return failed; }, get uncertain() { return uncertain; } };\n}\n","import { acceptAssistantPreview, messagesWithAssistantPreview } from \"./assistant-preview\";\nimport { applyHitlResolution, type HitlDecisionReceipt } from \"./hitl-resolution\";\nimport { useAgentChatHitlSubmissions } from \"./use-agent-chat-hitl-submissions\";\nimport type { HitlSubmissionOptions, HitlSubmissionState } from \"./hitl-submission\";\nimport type {\n AgentClient,\n AbortSignalLike,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n RuntimeEvent,\n ThreadMessage,\n ThreadMessageQueueState,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { captureChatOperation } from \"./operation-ownership\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadTimelineToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport { refreshChatSummaries } from \"./refresh-chat-summaries\";\nimport { useChatObservation } from \"./use-chat-observation\";\nimport { summaryToStored, useAgentChatThreadList } from \"./use-agent-chat-thread-list\";\nimport { useAgentChatFeedback } from \"./use-agent-chat-feedback\";\nimport { useAgentChatQueueActions } from \"./use-agent-chat-queue-actions\";\nimport { optimisticSubmissionState, discardOptimisticSubmission, useThreadMessageQueue, type RetractedMessageDraft, type ThreadMessageQueueTransport } from \"./thread-message-queue\";\nimport {\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n adoptStreamingThread,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n promoteThreadMessage,\n prependThreadTimeline,\n reconcileThreadTimeline,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n uploads?: readonly PortableUpload[];\n requestedModelId?: string;\n requestedAgentId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n observation?: \"on-demand\" | \"realtime\";\n};\n\nexport type AgentChatController = AgentChatState & {\n pendingMessages: readonly ThreadMessage[];\n messageQueue: ThreadMessageQueueState | null;\n activeThread: StoredChatThread | null;\n hasOlderTurns: boolean;\n hasMoreThreads: boolean;\n isLoadingHistory: boolean;\n isLoadingMoreThreads: boolean;\n isLoadingOlder: boolean;\n isLoadingThreads: boolean;\n isSubmitting: boolean;\n attachRun(runId: string, cursor?: number): Promise<void>;\n cancelRun(): Promise<void>;\n clearBackgroundError(): void;\n clearOperationError(operation?: AgentChatOperation): void;\n deleteThread(threadId: string): Promise<void>;\n detach(): void;\n loadOlder(): Promise<void>;\n loadMoreThreads(): Promise<void>;\n openThread(threadId: string): Promise<void>;\n refreshThreads(): Promise<void>;\n regenerate(message: ChatMessage): Promise<void>;\n refreshMessages(threadId?: string): Promise<void>;\n editPendingMessage(message: ThreadMessage, input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">): Promise<void>;\n steerPendingMessage(message: ThreadMessage): Promise<void>;\n removePendingMessage(message: ThreadMessage): Promise<void>;\n retractPendingMessage(message: ThreadMessage): Promise<RetractedMessageDraft>;\n resumeQueue(): Promise<void>;\n steer(text: string): Promise<void>;\n resumeHitl(part: ChatHitlPart, response: HitlResponse, options?: HitlSubmissionOptions): Promise<void>;\n getHitlSubmissionState(part: ChatHitlPart): HitlSubmissionState | undefined;\n setFeedback(\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ): Promise<void>;\n startNewThread(): void;\n submit(input: AgentChatSubmitInput): Promise<void>;\n};\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const activity = getThreadActivity(thread);\n return thread.active_run ? activity.runId : null;\n}\n\nexport function useAgentChat(options: UseAgentChatOptions = {}): AgentChatController {\n const runtime = useAgents24Runtime();\n const client = options.client || runtime.client;\n const pageSize = options.pageSize ?? 30;\n const threadPageSize = options.threadPageSize ?? 50;\n const [state, setState] = React.useState<AgentChatState>(() => ({\n ...initialAgentChatState,\n activeThreadId: resolveInitialActiveThreadId(\n options,\n runtime.storage?.loadActiveThreadId?.() ?? null,\n ),\n threads: runtime.storage?.loadThreads() ?? [],\n }));\n const [isLoadingHistory, setIsLoadingHistory] = React.useState(false);\n const [isLoadingOlder, setIsLoadingOlder] = React.useState(false);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const streamControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenGenerationRef = React.useRef(0);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const messageRefreshVersionRef = React.useRef(0);\n const promotedRunHintRef = React.useRef<string | null>(null);\n const promotedAttachRef = React.useRef<string | null>(null);\n const olderRequestRef = React.useRef<{ key: string; promise: Promise<void> } | null>(null);\n const submissionGenerationRef = React.useRef(0);\n const continuationTiming = React.useRef(new Map<string, { acknowledgedAt: number; attached: boolean; active: boolean }>());\n const resolutionFences = React.useRef(new Map<string, HitlDecisionReceipt>());\n const clientIdentityRef = React.useRef(client);\n if (clientIdentityRef.current !== client) { resolutionFences.current.clear(); continuationTiming.current.clear(); clientIdentityRef.current = client; }\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const ownOperation = React.useCallback((options?: Parameters<typeof captureChatOperation>[1]) => captureChatOperation(() => ({\n client: clientIdentityRef.current, generation: threadOpenGenerationRef.current, threadId: stateRef.current.activeThreadId,\n runId: stateRef.current.activeRunId, stream: streamControllerRef.current,\n }), options), []);\n\n const persist = React.useCallback((next: AgentChatState) => {\n runtime.storage?.saveThreads(next.threads);\n runtime.storage?.saveActiveThreadId?.(next.activeThreadId);\n }, [runtime.storage]);\n\n const update = React.useCallback((updater: (current: AgentChatState) => AgentChatState) => {\n let next = updater(stateRef.current);\n for (const receipt of resolutionFences.current.values()) next = { ...next,\n messages: applyHitlResolution(next.messages, receipt),\n threads: next.threads.map(thread => thread.id !== receipt.thread_id ? thread : { ...thread, messages: applyHitlResolution(thread.messages, receipt) }),\n };\n stateRef.current = next;\n persist(next);\n setState(next);\n }, [persist]);\n\n const queueTransport = React.useMemo<ThreadMessageQueueTransport>(() => ({\n list: (threadId, signal) => client.threads.messages.list({ threadId, limit: pageSize, signal }),\n submit: (input) => client.threads.messages.submit(input),\n edit: (message, input) => client.threads.messages.edit({\n threadId: message.thread_id, messageId: message.id, revision: message.revision,\n input: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids, mode: input.mode,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n }),\n remove: async (message) => {\n await client.threads.messages.remove({ threadId: message.thread_id, messageId: message.id, revision: message.revision });\n },\n resume: (threadId) => client.threads.resumeQueue({ threadId }),\n }), [client, pageSize]);\n const attachPromotion = React.useCallback((runId: string, threadId: string) => {\n if (stateRef.current.activeThreadId !== threadId) return;\n promotedRunHintRef.current = runId;\n if (stateRef.current.activeRunId === runId || promotedAttachRef.current === runId) return;\n promotedAttachRef.current = runId;\n const isCurrent = ownOperation();\n void attachRunRef.current(runId, 0).catch(() => {\n if (isCurrent() && promotedAttachRef.current === runId) promotedAttachRef.current = null;\n });\n }, [ownOperation]);\n const onQueuePromotion = React.useCallback((message: ThreadMessage, runId: string) => {\n if (stateRef.current.activeThreadId !== message.thread_id) return;\n const userMessage = threadTimelineToMessages([{ ...message, run_id: runId, status: \"delivered\" }])[0];\n update((current) => current.activeThreadId === message.thread_id\n ? { ...current, messages: promoteThreadMessage(current.messages, userMessage, runId),\n threads: current.threads.map(thread => thread.id === message.thread_id ? { ...thread,\n last_run_id: runId, last_run_status: \"running\",\n active_run: { run_id: runId, status: \"running\", started_at: null, created_at: message.created_at, is_cancellable: true },\n } : thread) } : current);\n attachPromotion(runId, message.thread_id);\n }, [update, attachPromotion]);\n const queue = useThreadMessageQueue({ threadId: state.activeThreadId, transport: queueTransport, ownOperation,\n onPromoted: onQueuePromotion, onUnknownPromotion: attachPromotion,\n onOptimistic: (message, uploading) => update((current) => optimisticSubmissionState(current, message, uploading)),\n onDiscard: (message) => update((current) => discardOptimisticSubmission(current, message)),\n });\n const { pendingMessages, messageQueue } = queue;\n\n const eventBuffer = React.useMemo(\n () => createRuntimeEventFrameBuffer(\n (events) => update((current) => applyRuntimeEvents(current, events)),\n runtimeEventFrameScheduler(),\n ),\n [update],\n );\n\n const clearOperationError = React.useCallback((operation?: AgentChatOperation) => {\n update((current) => clearAgentChatOperationError(current, operation));\n }, [update]);\n\n const clearBackgroundError = React.useCallback(() => {\n update(clearAgentChatBackgroundError);\n }, [update]);\n\n const failOperation = React.useCallback((operation: AgentChatOperation, cause: unknown) => {\n update((current) => withAgentChatOperationError(current, operation, cause));\n }, [update]);\n\n const { isLoadingThreads, isLoadingMoreThreads, threadTotal,\n eventsDuringRefreshRef: threadEventsDuringRefreshRef, refreshThreads, loadMoreThreads,\n } = useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation });\n\n const invalidateThreadOpen = React.useCallback(() => {\n threadOpenGenerationRef.current += 1;\n threadOpenControllerRef.current?.abort(\"Thread selection changed.\");\n threadOpenControllerRef.current = null;\n messageRefreshVersionRef.current += 1;\n promotedAttachRef.current = null;\n promotedRunHintRef.current = null;\n olderRequestRef.current = null;\n queue.reset();\n resolutionFences.current.clear();\n continuationTiming.current.clear();\n setIsSubmitting(false);\n setIsLoadingOlder(false);\n setIsLoadingHistory(false);\n }, [queue.reset]);\n\n const detach = React.useCallback(() => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [eventBuffer, update]);\n\n const refreshMessagesRef = React.useRef<() => Promise<void>>(async () => undefined);\n const { setFeedback, captureRead: captureFeedbackRead } = useAgentChatFeedback({\n client, update, clearOperationError, failOperation, ownOperation,\n refreshMessages: React.useCallback(() => refreshMessagesRef.current(), []),\n });\n\n const refreshMessages = React.useCallback(async (threadId?: string, promotedRunId?: string, signal?: AbortSignalLike) => {\n const target = threadId || stateRef.current.activeThreadId;\n if (!target) return;\n const isCurrent = ownOperation();\n const reconcileFeedback = captureFeedbackRead();\n const version = ++messageRefreshVersionRef.current;\n const page = await client.threads.messages.list({ threadId: target, limit: pageSize, ...(signal ? { signal } : {}) });\n if (!isCurrent() || stateRef.current.activeThreadId !== target || version !== messageRefreshVersionRef.current) return;\n queue.hydrate(page, target);\n const promoted = promotedRunId || promotedRunHintRef.current;\n if (promoted && page.items.some((message) => message.run_id === promoted)) promotedRunHintRef.current = null;\n update((current) => {\n if (!isCurrent() || current.activeThreadId !== target) return current;\n const messages = reconcileThreadTimeline(current.messages,\n reconcileFeedback(threadTimelineToMessages(page.items), current.messages), current.activeRunId, current.streamingMessageId);\n return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };\n });\n }, [client, ownOperation, pageSize, queue.hydrate, update, captureFeedbackRead]);\n refreshMessagesRef.current = refreshMessages;\n\n React.useEffect(() => () => {\n threadOpenGenerationRef.current += 1;\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n invalidateThreadOpen();\n const requestController = runtime.createAbortController();\n threadOpenControllerRef.current = requestController;\n const requestGeneration = threadOpenGenerationRef.current + 1;\n threadOpenGenerationRef.current = requestGeneration;\n detach();\n clearOperationError();\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n activeRunId: null,\n cursor: null,\n error: null,\n messages: current.threads.find((thread) => thread.id === threadId)?.messages || [],\n contextWindow: current.threads.find((thread) => thread.id === threadId)?.contextWindow || null,\n contextCompression: current.threads.find((thread) => thread.id === threadId)?.contextCompression || null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n streamingMessageId: null,\n }));\n const isCurrent = ownOperation();\n const reconcileFeedback = captureFeedbackRead();\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrent()) return;\n const timeline = await client.threads.messages.list({ threadId, limit: pageSize, signal: requestController.signal });\n if (!isCurrent()) return;\n queue.hydrate(timeline, threadId);\n const messages = reconcileFeedback(threadTimelineToMessages(timeline.items), stateRef.current.messages);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(timeline.paging.has_more),\n nextBeforeTurnIndex: timeline.paging.next_before_turn_index,\n ...context,\n };\n update((current) => isCurrent() ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\n runState: getThreadActivity(stored).isSpinning ? \"reconnecting\" : (stored.active_run?.status || \"idle\") as AgentChatState[\"runState\"],\n threads: current.threads.some((thread) => thread.id === threadId)\n ? current.threads.map((thread) => thread.id === threadId ? stored : thread)\n : [stored, ...current.threads],\n } : current);\n const activeRunId = activeRunIdFromThread(stored);\n if (\n activeRunId\n && getThreadActivity(stored).isSpinning\n && isCurrent()\n ) void attachRunRef.current(activeRunId).catch(() => undefined);\n } catch (error) {\n if (!requestController.signal.aborted && !isAbortLike(error) && requestGeneration === threadOpenGenerationRef.current) {\n failOperation(\"open_thread\", error);\n update((current) => restoreAgentChatThreadSelection(current, previousSelection));\n if (previousSelection.activeRunId) {\n void attachRunRef.current(previousSelection.activeRunId, previousSelection.cursor ?? undefined).catch(() => undefined);\n }\n throw error;\n }\n } finally {\n if (requestGeneration === threadOpenGenerationRef.current) {\n if (threadOpenControllerRef.current === requestController) threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }\n }\n }, [clearOperationError, client, detach, failOperation, pageSize, queue.hydrate, runtime, update, invalidateThreadOpen, ownOperation, captureFeedbackRead]);\n\n const consumePreview = React.useCallback((frame: import(\"@agents24/client/protocol\").AssistantPreview | null) => {\n update((current) => {\n if (frame && current.activeRunId && current.activeRunId !== frame.run_id) return current;\n return { ...current, assistantPreview: acceptAssistantPreview(current.assistantPreview, frame) };\n });\n }, [update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n const timing = continuationTiming.current.get(event.run_id);\n if (timing && !timing.attached) {\n timing.attached = true;\n runtime.onHitlTiming?.({ stage: \"attachment\", durationMs: Date.now() - timing.acknowledgedAt });\n }\n if (timing && !timing.active && [\"assistant.delta\", \"model.turn.started\", \"tool.started\"].includes(event.event)) {\n timing.active = true;\n runtime.onHitlTiming?.({ stage: \"first_activity\", durationMs: Date.now() - timing.acknowledgedAt });\n }\n if ([\"run.completed\", \"run.cancelled\", \"run.failed\"].includes(event.event)) continuationTiming.current.delete(event.run_id);\n const eventThreadId = typeof event.payload?.thread_id === \"string\"\n ? event.payload.thread_id.trim()\n : \"\";\n if (eventThreadId && !stateRef.current.activeThreadId) {\n queue.confirmThreadAdmission(eventThreadId);\n update((current) => adoptStreamingThread(current, eventThreadId));\n setIsSubmitting(false);\n }\n eventBuffer.push(event);\n }, [eventBuffer, update, queue.confirmThreadAdmission, runtime.onHitlTiming]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const isCurrent = ownOperation({ stream: true });\n clearOperationError(\"attach_run\");\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, onPreview: (frame) => { if (isCurrent()) consumePreview(frame); }, leaseSeconds: 60, signal: controller.signal }, (event) => { if (isCurrent()) consumeEvent(event); });\n if (!isCurrent()) return;\n eventBuffer.flush();\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (!result.detached && result.threadId) await refreshMessages(result.threadId);\n } catch (error) {\n if (isCurrent() && !isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"reconnecting\", streamingMessageId: null }));\n failOperation(\"attach_run\", error);\n throw error;\n }\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, consumePreview, eventBuffer, failOperation, refreshMessages, runtime, update, ownOperation]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;\n const existingThreadId = stateRef.current.activeThreadId;\n if (existingThreadId || queue.hasPendingAdmission()) {\n const isCurrent = ownOperation({ adoptThread: !existingThreadId });\n const submissionGeneration = ++submissionGenerationRef.current;\n clearOperationError();\n setIsSubmitting(true);\n try {\n await queue.submit({\n mode: \"queue\", input: input.text.trim(),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((item, index) => ({ id: `upload-${index}`, filename: item.name,\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: 0 })),\n queued: Boolean(stateRef.current.activeRunId), uploading: Boolean(input.uploads?.length),\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n clientSubmissionId: runtime.createId(), idempotencyKey: runtime.createId(),\n prepare: async () => {\n const uploaded = input.uploads?.length ? await client.attachments.uploadBatch({\n uploads: input.uploads, threadId: existingThreadId || undefined,\n requestedAgentId: input.requestedAgentId, idempotencyKey: runtime.createId(),\n }) : [];\n if (input.uploads?.length && uploaded.length !== input.uploads.length) throw new Error(\"Attachment upload returned an incomplete batch\");\n return { attachmentIds: uploaded.length ? uploaded.map((item) => item.id) : input.attachmentIds,\n attachments: uploaded.length ? uploaded.map((item) => ({ id: item.id, filename: item.filename,\n mime_type: item.mime_type, byte_size: item.byte_size })) : undefined };\n },\n });\n } catch (error) {\n if (isCurrent()) failOperation(\"submit\", error);\n throw error;\n } finally {\n if (isCurrent() && submissionGeneration === submissionGenerationRef.current) setIsSubmitting(false);\n }\n return;\n }\n invalidateThreadOpen();\n const submissionOwner = ownOperation({ adoptThread: true });\n const stream = (async () => {\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const isCurrent = ownOperation({ stream: true, adoptThread: true });\n const submissionGeneration = ++submissionGenerationRef.current;\n const ticket = queue.beginSubmission({ input: input.text.trim(), clientSubmissionId: runtime.createId(),\n uploading: Boolean(input.uploads?.length),\n attachmentIds: input.attachmentIds,\n attachments: input.attachments?.map((item, index) => ({ id: item.id || `attachment-${index}`, filename: item.filename || \"Attachment\",\n mime_type: item.mediaType || \"application/octet-stream\", byte_size: typeof item.byteSize === \"number\" ? item.byteSize : 0 }))\n || input.uploads?.map((upload, index) => ({ id: `upload-${index}`, filename: upload.name,\n mime_type: upload.mediaType || \"application/octet-stream\", byte_size: 0 })),\n });\n const userId = ticket.id;\n const idempotencyKey = runtime.createId();\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n setIsSubmitting(true);\n try {\n const uploaded = hasPendingUploads\n ? await client.attachments.uploadBatch({\n uploads: input.uploads || [],\n threadId: stateRef.current.activeThreadId || undefined,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n signal: controller.signal,\n })\n : [];\n if (!isCurrent()) return;\n if (hasPendingUploads && uploaded.length !== input.uploads?.length) {\n throw new Error(\"Attachment upload returned an incomplete batch\");\n }\n const resolvedAttachments = uploaded.length\n ? uploaded.map(attachmentResultToChatAttachment)\n : input.attachments;\n const attachmentIds = uploaded.length\n ? uploaded.map((attachment) => attachment.id)\n : input.attachmentIds;\n if (uploaded.length) {\n update((current) => ({\n ...current,\n messages: current.messages.map((message) => message.id === userId\n ? { ...message, attachments: resolvedAttachments }\n : message),\n runState: \"streaming\",\n }));\n }\n const result = await client.chat.stream({\n onPreview: (frame) => { if (isCurrent()) consumePreview(frame); }, leaseSeconds: 60, clientSubmissionId: ticket.client_submission_id!, input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, (event) => { if (isCurrent()) consumeEvent(event); });\n if (!isCurrent()) return;\n eventBuffer.flush();\n update((current) => {\n const threadId = result.threadId || current.activeThreadId;\n return {\n ...current,\n activeThreadId: threadId,\n activeRunId: result.detached ? result.runId : current.activeRunId,\n cursor: result.cursor,\n runState: result.detached ? \"reconnecting\" : current.runState,\n threads: threadId\n ? current.threads.map((thread) => thread.id === threadId\n ? { ...thread, messages: current.messages, isHydrated: true }\n : thread)\n : current.threads,\n };\n });\n if (result.threadId) await refreshThreads().catch(() => undefined);\n if (result.threadId && !result.detached) await refreshMessages(result.threadId);\n } catch (error) {\n if (!isCurrent()) return;\n const admitted = Boolean(stateRef.current.messages.find((message) => message.id === userId)?.runId);\n if (!admitted) queue.discardSubmission(ticket, error);\n if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n runState: admitted ? \"reconnecting\" : \"failed\",\n streamingMessageId: admitted ? current.streamingMessageId : null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n if (!stateRef.current.messages.some(message => (message.id === ticket.id || message.clientSubmissionId === ticket.client_submission_id) && message.runId)) queue.discardSubmission(ticket);\n if (isCurrent() && submissionGeneration === submissionGenerationRef.current) setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n })();\n try { await Promise.race([stream, queue.waitForInitialAdmission()]); }\n catch (error) { if (submissionOwner() || !isAbortLike(error)) throw error; }\n }, [clearOperationError, client, consumeEvent, consumePreview, detach, eventBuffer, failOperation, invalidateThreadOpen, queue.submit, refreshMessages, refreshThreads, runtime, update, ownOperation]);\n\n const { steer, editPendingMessage, steerPendingMessage, removePendingMessage, resumeQueue } =\n useAgentChatQueueActions({ queue, stateRef, createId: runtime.createId, clearOperationError,\n failOperation, refreshMessages, attachRun, ownOperation });\n\n const startNewThread = React.useCallback(() => {\n invalidateThreadOpen();\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, invalidateThreadOpen, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n const isCurrent = ownOperation();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n if (stateRef.current.activeThreadId === threadId) startNewThread();\n update((current) => ({ ...current, threads: current.threads.filter((thread) => thread.id !== threadId) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n if (isCurrent()) failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, ownOperation, runtime, startNewThread, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\n const isCurrent = ownOperation({ run: true, stream: true });\n const previousRunState = stateRef.current.runState;\n clearOperationError();\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: \"cancelling\" }\n : current\n ));\n try {\n const result = await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n if (!isCurrent()) return;\n if (result.status === \"cancelled\") {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: \"cancelled\",\n streamingMessageId: null,\n }));\n } else if (result.status === \"cancelling\") {\n update((current) => ({\n ...current,\n activeRunId: runId,\n runState: \"cancelling\",\n }));\n } else {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: result.status === \"completed\" ? \"completed\" : \"failed\",\n streamingMessageId: null,\n }));\n }\n } catch (error) {\n if (isCurrent() && !isAbortLike(error)) {\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: previousRunState }\n : current\n ));\n failOperation(\"cancel_run\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, detach, failOperation, runtime, update, ownOperation]);\n\n const { resumeHitl, getHitlSubmissionState } = useAgentChatHitlSubmissions({\n client, runtime, pageSize, stateRef, ownOperation, selectionGeneration: threadOpenGenerationRef,\n accept: receipt => {\n resolutionFences.current.set(`${receipt.run_id}:${receipt.interrupt_id}`, receipt);\n continuationTiming.current.set(receipt.run_id, { acknowledgedAt: Date.now(), attached: false, active: false });\n update(current => {\n const status = receipt.run_status;\n return current.activeRunId === receipt.run_id && (status === \"completed\" || status === \"failed\" || status === \"cancelled\")\n ? { ...current, activeRunId: null, runState: status, streamingMessageId: null } : current;\n });\n },\n attach: runId => {\n if ([\"completed\", \"failed\", \"cancelled\", \"cancelling\"].includes(stateRef.current.runState)) return;\n void attachRunRef.current(runId, stateRef.current.cursor ?? undefined).catch(() => undefined);\n },\n });\n\n const loadOlder = React.useCallback((): Promise<void> => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (thread?.nextBeforeTurnIndex == null) return Promise.resolve();\n const cursor = thread.nextBeforeTurnIndex;\n const reconcileFeedback = captureFeedbackRead();\n const key = `${threadOpenGenerationRef.current}:${thread.id}:${cursor}`;\n if (olderRequestRef.current?.key === key) return olderRequestRef.current.promise;\n const isCurrent = ownOperation();\n clearOperationError();\n setIsLoadingOlder(true);\n const promise = (async () => {\n try {\n const page = await client.threads.messages.list({ threadId: thread.id, limit: pageSize, before: cursor });\n if (!isCurrent()) return;\n const older = reconcileFeedback(threadTimelineToMessages(page.items), stateRef.current.messages);\n update((current) => ({ ...current,\n messages: prependThreadTimeline(current.messages, older),\n threads: current.threads.map((item) => item.id === thread.id ? { ...item,\n hasOlderTurns: page.paging.has_more, nextBeforeTurnIndex: page.paging.next_before_turn_index } : item),\n }));\n } catch (error) {\n if (isCurrent() && !isAbortLike(error)) { failOperation(\"load_older_turns\", error); throw error; }\n } finally {\n if (olderRequestRef.current?.key === key) {\n olderRequestRef.current = null;\n setIsLoadingOlder(false);\n }\n }\n })();\n olderRequestRef.current = { key, promise };\n return promise;\n }, [clearOperationError, client, failOperation, ownOperation, pageSize, update, captureFeedbackRead]);\n\n const regenerate = React.useCallback(async (message: ChatMessage) => {\n const index = stateRef.current.messages.findIndex((item) => item.id === message.id);\n const user = stateRef.current.messages.slice(0, index).reverse().find((item) => item.role === \"user\");\n if (user) await submit({\n text: user.content,\n attachmentIds: chatAttachmentIds(user.attachments),\n attachments: user.attachments,\n });\n }, [submit]);\n\n useChatObservation({\n state: { threadId: state.activeThreadId,\n running: Boolean(state.activeRunId) && ![\"idle\", \"completed\", \"failed\", \"cancelled\"].includes(state.runState),\n waiting: [\"paused\", \"waiting\", \"interrupted\"].includes(state.runState),\n sidebar: true, background: state.threads.some(thread => thread.id !== state.activeThreadId && Boolean(thread.active_run || thread.message_queue?.pending_count)),\n pending: pendingMessages.length > 0, paused: Boolean(messageQueue?.paused), degraded: state.runState === \"reconnecting\", mode: options.observation },\n visibility: runtime.visibility, createAbortController: runtime.createAbortController,\n events: (input, handler) => client.threads.events(input, handler),\n async refresh(signal) {\n const target = stateRef.current.activeThreadId;\n const previous = stateRef.current.threads.find(thread => thread.id === target);\n const isCurrent = ownOperation();\n const summary = await refreshChatSummaries({ client, limit: threadPageSize, signal,\n current: () => stateRef.current, update,\n onDeleted(threadId) {\n if (isCurrent() && stateRef.current.activeThreadId === threadId) startNewThread();\n } });\n if (!target || !summary || !isCurrent() || signal.aborted || threadOpenControllerRef.current) return;\n const runId = activeRunIdFromThread(summary);\n const changed = previous?.active_run?.run_id !== summary.active_run?.run_id\n || previous?.active_run?.status !== summary.active_run?.status;\n if (runId && getThreadActivity(summary).isSpinning && (!streamControllerRef.current || stateRef.current.activeRunId !== runId)) {\n void attachRunRef.current(runId, runId === stateRef.current.activeRunId ? stateRef.current.cursor ?? undefined : 0)\n .catch(() => undefined);\n } else if (!getThreadActivity(summary).isSpinning && changed) {\n streamControllerRef.current?.abort(); streamControllerRef.current = null;\n update(current => ({ ...current, activeRunId: summary.active_run?.run_id || null, streamingMessageId: null,\n runState: (summary.active_run?.status || summary.last_run_status || \"idle\") as AgentChatState[\"runState\"] }));\n }\n if (changed || pendingMessages.length || stateRef.current.runState === \"reconnecting\" || !streamControllerRef.current) {\n await refreshMessages(target, runId || undefined, signal);\n }\n },\n onEvent(event) {\n if (event.event === \"thread.deleted\" && event.thread_id === stateRef.current.activeThreadId) startNewThread();\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({ ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event) }));\n if (event.event === \"thread.message.updated\" && event.thread_id === stateRef.current.activeThreadId) {\n queue.acceptNotice({ messageId: event.message_id, status: event.status,\n runId: event.run_id, cursor: event.cursor, clientSubmissionId: event.client_submission_id });\n }\n },\n onError(error) { if (!isAbortLike(error)) update((current) => withAgentChatBackgroundError(current, error)); },\n onRecovered: clearBackgroundError,\n onDetach: detach,\n onResume() {\n const current = stateRef.current;\n if (current.activeRunId && !streamControllerRef.current && ![\"paused\", \"waiting\", \"interrupted\", \"completed\", \"failed\", \"cancelled\", \"idle\"].includes(current.runState)) {\n void attachRunRef.current(current.activeRunId, current.cursor ?? undefined).catch(() => undefined);\n }\n },\n });\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n const activeThread = stateRef.current.threads.find((thread) => thread.id === stateRef.current.activeThreadId);\n if (shouldHydrateSelectedThread(threadId, stateRef.current.activeThreadId, Boolean(activeThread?.isHydrated))) {\n void openThread(threadId as string).catch(() => undefined);\n }\n }, [openThread, options.activeThreadId]);\n\n const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId) || null;\n const hasMoreThreads = threadTotal === undefined\n ? state.threads.length >= threadPageSize\n : state.threads.length < threadTotal;\n return {\n ...state,\n messages: messagesWithAssistantPreview(state.messages, state.assistantPreview),\n activeThread,\n pendingMessages,\n messageQueue,\n hasOlderTurns: Boolean(activeThread?.hasOlderTurns),\n hasMoreThreads,\n isLoadingHistory,\n isLoadingMoreThreads,\n isLoadingOlder,\n isLoadingThreads,\n isSubmitting,\n attachRun,\n cancelRun,\n clearBackgroundError,\n clearOperationError,\n deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n refreshMessages,\n editPendingMessage,\n steerPendingMessage,\n removePendingMessage,\n retractPendingMessage: queue.retractForEdit,\n resumeQueue,\n steer,\n resumeHitl,\n getHitlSubmissionState,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { AbortSignalLike, AgentClient } from \"@agents24/client\";\nimport { applyThreadSummaryEvent, type AgentChatState } from \"./state\";\nimport type { StoredChatThread } from \"./model\";\n\n/** Refresh the first page plus observed threads outside it without dropping loaded history. */\nexport async function refreshChatSummaries(input: {\n client: AgentClient;\n limit: number;\n signal: AbortSignalLike;\n current(): AgentChatState;\n update(updater: (current: AgentChatState) => AgentChatState): void;\n onDeleted?(threadId: string): void;\n}): Promise<StoredChatThread | null> {\n const before = input.current();\n const page = await input.client.threads.list({ limit: input.limit, signal: input.signal });\n if (input.signal.aborted) return null;\n const summaries = [...page.items];\n const seen = new Set(summaries.map(thread => thread.id));\n const missing = before.threads.filter(thread => !seen.has(thread.id)\n && (thread.active_run || thread.id === before.activeThreadId)).map(thread => thread.id);\n if (before.activeThreadId && !seen.has(before.activeThreadId) && !missing.includes(before.activeThreadId)) {\n missing.push(before.activeThreadId);\n }\n const deleted = new Set<string>();\n const errors: unknown[] = [];\n // Bound concurrent reads even when many background runs are loaded.\n for (let offset = 0; offset < missing.length && !input.signal.aborted; offset += 4) {\n const ids = missing.slice(offset, offset + 4);\n const results = await Promise.allSettled(ids.map(threadId =>\n input.client.threads.get({ threadId, limit: 1, signal: input.signal })));\n results.forEach((result, index) => {\n if (result.status === \"fulfilled\") summaries.push(result.value);\n else if (result.reason?.name === \"Agents24ClientError\"\n && result.reason.kind === \"not_found\" && result.reason.status === 404) {\n deleted.add(ids[index]!);\n } else errors.push(result.reason);\n });\n }\n if (input.signal.aborted) return null;\n const removed: string[] = [];\n input.update(current => ({ ...current, threads: summaries.reduce((threads, thread) => {\n const previous = before.threads.find(item => item.id === thread.id);\n const latest = current.threads.find(item => item.id === thread.id);\n if (previous && !latest) return threads;\n if (latest && (previous?.last_run_id !== latest.last_run_id\n || previous?.active_run?.status !== latest.active_run?.status\n || previous?.last_run_status !== latest.last_run_status)) return threads;\n return applyThreadSummaryEvent(threads, { schema_version: \"agents24.thread_summary_event.v1\",\n event: \"thread.summary.updated\", cursor: 0, thread });\n }, current.threads.filter(thread => {\n // A local change since this read began wins over a stale deletion response.\n if (!deleted.has(thread.id) || before.threads.find(item => item.id === thread.id) !== thread) return true;\n removed.push(thread.id);\n return false;\n })) }));\n if (before.activeThreadId && deleted.has(before.activeThreadId)\n && !input.current().threads.some(thread => thread.id === before.activeThreadId)\n && !removed.includes(before.activeThreadId)) removed.push(before.activeThreadId);\n for (const id of removed) input.onDeleted?.(id);\n // Preserve successful refreshes while surfacing real transport/authorization failures.\n if (errors.length) throw errors[0];\n return input.current().threads.find(thread => thread.id === before.activeThreadId) || null;\n}\n","import type { AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\nimport { preferNewestThreadSummary, reconcileRefreshedThreads, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nexport function useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation }: {\n client: AgentClient;\n threadPageSize: number;\n stateRef: React.RefObject<AgentChatState>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n const [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\n const refreshPromiseRef = React.useRef<Promise<void> | null>(null);\n const eventsDuringRefreshRef = React.useRef<ThreadSummaryEvent[] | null>(null);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshPromiseRef.current) return refreshPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n eventsDuringRefreshRef.current = [];\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n const concurrentEvents = eventsDuringRefreshRef.current || [];\n eventsDuringRefreshRef.current = null;\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const incoming = result.items.map((item) => {\n const existing = byId.get(item.id);\n return { ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated };\n });\n return { ...current, threads: reconcileRefreshedThreads(current.threads, incoming, current.activeThreadId, concurrentEvents) };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n eventsDuringRefreshRef.current = null;\n setIsLoadingThreads(false);\n }\n })();\n refreshPromiseRef.current = request;\n void request.finally(() => {\n if (refreshPromiseRef.current === request) refreshPromiseRef.current = null;\n }).catch(() => undefined);\n return request;\n }, [clearOperationError, client, failOperation, threadPageSize, update]);\n\n const loadMoreThreads = React.useCallback(async () => {\n if (isLoadingMoreThreads) return;\n const skip = stateRef.current.threads.length;\n if (threadTotal !== undefined && skip >= threadTotal) return;\n clearOperationError();\n setIsLoadingMoreThreads(true);\n try {\n const result = await client.threads.list({ skip, limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n for (const item of result.items) {\n const existing = byId.get(item.id);\n byId.set(item.id, preferNewestThreadSummary(existing, {\n ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated,\n }));\n }\n return { ...current, threads: [...byId.values()] };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_more_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [clearOperationError, client, failOperation, isLoadingMoreThreads, stateRef, threadPageSize, threadTotal, update]);\n\n return { isLoadingThreads, isLoadingMoreThreads, threadTotal, eventsDuringRefreshRef, refreshThreads, loadMoreThreads };\n}\n","import type { AgentClient, FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { withAgentChatOperationError, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function useAgentChatFeedback({ client, update, clearOperationError, failOperation, ownOperation, refreshMessages }: {\n client: { runs: Pick<AgentClient[\"runs\"], \"setFeedback\"> };\n ownOperation: () => () => boolean;\n refreshMessages: () => Promise<void>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n const mutations = React.useRef(new Map<string, { revision: number; pending: number; readRevision: number }>());\n const captureRead = React.useCallback(() => {\n const revisions = new Map([...mutations.current].map(([run, mutation]) => [run, mutation.readRevision]));\n return (incoming: ChatMessage[], current: ChatMessage[]) => incoming.map((message) => {\n const mutation = message.runId ? mutations.current.get(message.runId) : undefined;\n const preserve = mutation && (mutation.pending > 0 || mutation.readRevision !== revisions.get(message.runId!));\n const live = preserve && current.find((item) => item.role === \"assistant\" && item.runId === message.runId);\n return live ? { ...message, feedback: live.feedback } : message;\n });\n }, []);\n const setFeedback = React.useCallback(async (message: ChatMessage, input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n }) => {\n const runId = message.runId;\n if (!runId || message.role !== \"assistant\" || message.isFinal === false) {\n const error = new Error(\"Only persisted final responses can receive feedback.\");\n failOperation(\"set_feedback\", error);\n throw error;\n }\n const isCurrent = ownOperation();\n const revision = (mutations.current.get(runId)?.revision ?? 0) + 1;\n const pending = (mutations.current.get(runId)?.pending ?? 0) + 1;\n mutations.current.set(runId, { revision, pending, readRevision: (mutations.current.get(runId)?.readRevision ?? 0) + 1 });\n const isLatest = () => mutations.current.get(runId)?.revision === revision;\n const previous = message.feedback ?? null;\n const timestamp = new Date().toISOString();\n const optimistic: ResponseFeedback | null = input.rating ? {\n rating: input.rating,\n reason: input.rating === \"dislike\" ? input.reason ?? null : null,\n comment: input.rating === \"dislike\" ? input.comment?.trim() || null : null,\n created_at: previous?.created_at || timestamp,\n updated_at: timestamp,\n } : null;\n const replaceFeedback = (current: AgentChatState, feedback: ResponseFeedback | null): AgentChatState => ({\n ...current,\n messages: current.messages.map((item) => item.role === \"assistant\" && item.runId === runId ? { ...item, feedback } : item),\n threads: current.threads.map((thread) => ({ ...thread,\n messages: thread.messages.map((item) => item.role === \"assistant\" && item.runId === runId ? { ...item, feedback } : item),\n })),\n });\n clearOperationError();\n update((current) => replaceFeedback(current, optimistic));\n try {\n const result = await client.runs.setFeedback({ runId, ...input });\n if (isLatest() && isCurrent()) update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n if (isLatest() && isCurrent()) update((current) => {\n const restored = replaceFeedback(current, previous);\n return isCurrent() ? withAgentChatOperationError(restored, \"set_feedback\", error) : restored;\n });\n throw error;\n } finally {\n const mutation = mutations.current.get(runId)!;\n mutations.current.set(runId, { ...mutation, readRevision: mutation.readRevision + 1, pending: mutation.pending - 1 });\n if (mutation.pending === 1 && isCurrent()) await refreshMessages().catch(() => undefined);\n }\n }, [clearOperationError, client, failOperation, update, ownOperation, refreshMessages]);\n return { setFeedback, captureRead };\n}\n","import type { ThreadMessage } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AgentChatSubmitInput } from \"./use-agent-chat\";\nimport { useThreadMessageQueue } from \"./thread-message-queue\";\nimport type { AgentChatOperation, AgentChatState } from \"./state\";\n\nexport function useAgentChatQueueActions({ queue, stateRef, createId, clearOperationError,\n failOperation, refreshMessages, attachRun, ownOperation }: {\n ownOperation: () => () => boolean;\n queue: ReturnType<typeof useThreadMessageQueue>;\n stateRef: React.RefObject<AgentChatState>;\n createId: () => string;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n refreshMessages: (threadId: string) => Promise<void>;\n attachRun: (runId: string) => Promise<void>;\n}) {\n const steer = React.useCallback(async (text: string) => {\n const threadId = stateRef.current.activeThreadId;\n if (!threadId || !text.trim()) throw new Error(\"An active thread and text are required to steer.\");\n const isCurrent = ownOperation();\n clearOperationError();\n try {\n await queue.submit({ mode: \"steer\", input: text.trim(), idempotencyKey: createId() });\n if (isCurrent()) await refreshMessages(threadId);\n } catch (error) {\n if (isCurrent()) failOperation(\"submit\", error);\n throw error;\n }\n }, [clearOperationError, createId, failOperation, queue.submit, refreshMessages, stateRef, ownOperation]);\n\n const editPendingMessage = React.useCallback(async (message: ThreadMessage,\n input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">) => {\n await queue.edit(message, { text: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId });\n }, [queue.edit]);\n const steerPendingMessage = React.useCallback(async (message: ThreadMessage) => {\n await queue.edit(message, { text: message.text, attachmentIds: message.attachment_ids, mode: \"steer\" });\n }, [queue.edit]);\n const resumeQueue = React.useCallback(async () => {\n if (!stateRef.current.activeThreadId) return;\n const isCurrent = ownOperation();\n const result = await queue.resume();\n if (isCurrent() && result?.run_id && stateRef.current.activeRunId !== result.run_id) void attachRun(result.run_id).catch(() => undefined);\n }, [attachRun, queue.resume, stateRef, ownOperation]);\n return { steer, editPendingMessage, steerPendingMessage, removePendingMessage: queue.remove, resumeQueue };\n}\n","export function resolveInitialActiveThreadId(\n options: { activeThreadId?: string | null },\n storedThreadId: string | null,\n): string | null {\n return Object.prototype.hasOwnProperty.call(options, \"activeThreadId\")\n ? options.activeThreadId ?? null\n : storedThreadId;\n}\n\nexport function shouldHydrateSelectedThread(\n selectedThreadId: string | null | undefined,\n activeThreadId: string | null,\n activeThreadIsHydrated: boolean,\n): boolean {\n return Boolean(selectedThreadId) && (\n selectedThreadId !== activeThreadId || !activeThreadIsHydrated\n );\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n ThreadComputerStatus,\n ThreadSummary,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { attachmentResultToChatAttachment } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\n\nexport function useAgentThreads(options: { limit?: number; skip?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [threads, setThreads] = React.useState<ThreadSummary[]>([]);\n const [total, setTotal] = React.useState<number | undefined>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.list({ ...options, signal: controller.signal });\n setThreads(result.items);\n setTotal(result.total);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.limit, options.skip]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, threads, total };\n}\n\nexport function useAgentThread(threadId: string | null, options: { limit?: number; beforeTurnIndex?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [thread, setThread] = React.useState<ThreadDetail | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n if (!threadId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setThread(null);\n setIsLoading(false);\n return null;\n }\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.get({ threadId, ...options, signal: controller.signal });\n setThread(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.beforeTurnIndex, options.limit, threadId]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, thread };\n}\n\nexport function useThreadComputer(threadId: string | null) {\n const { client, createAbortController } = useAgents24Runtime();\n const [computer, setComputer] = React.useState<ThreadComputerStatus | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const refresh = React.useCallback(async () => {\n controllerRef.current?.abort();\n if (!threadId) {\n setComputer(null);\n setIsLoading(false);\n return null;\n }\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.computer.get({ threadId, signal: controller.signal });\n setComputer(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, threadId]);\n React.useEffect(() => {\n void refresh();\n return () => controllerRef.current?.abort();\n }, [refresh]);\n const list = React.useCallback((input: { path?: string; cursor?: number; limit?: number }) => {\n if (!threadId) throw new Error(\"A thread is required to list computer files\");\n return client.threads.computer.list({ threadId, ...input });\n }, [client, threadId]);\n const read = React.useCallback((path: string) => {\n if (!threadId) throw new Error(\"A thread is required to read a computer file\");\n return client.threads.computer.read({ threadId, path });\n }, [client, threadId]);\n const createContentAccess = React.useCallback((path: string, download = false) => {\n if (!threadId) throw new Error(\"A thread is required to access a computer file\");\n return client.threads.computer.createContentAccess({ threadId, path, download });\n }, [client, threadId]);\n return { computer, error, isLoading, list, read, createContentAccess, refresh };\n}\n\nexport function useAgentRun() {\n const { client, createAbortController, createId } = useAgents24Runtime();\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const [isAttached, setIsAttached] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n React.useEffect(() => () => controllerRef.current?.abort(), []);\n const detach = React.useCallback(() => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setIsAttached(false);\n }, []);\n const attach = React.useCallback(async (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => {\n detach();\n const controller = createAbortController();\n controllerRef.current = controller;\n setError(null);\n setIsAttached(true);\n try {\n return await client.runs.attach({ runId, cursor, signal: controller.signal }, onEvent);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n throw nextError;\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n setIsAttached(false);\n }\n }, [client, createAbortController, detach]);\n const cancel = React.useCallback(async (runId: string) => {\n const result = await client.runs.cancel({ runId, idempotencyKey: createId() });\n detach();\n return result;\n }, [client, createId, detach]);\n return { attach, cancel, detach, error, isAttached };\n}\n\nexport function useAgentAttachments() {\n const { client, createId } = useAgents24Runtime();\n const [uploads, setUploads] = React.useState<Record<string, AttachmentResult>>({});\n const [isUploading, setIsUploading] = React.useState(false);\n const uploadBatch = React.useCallback(async (input: { uploads: readonly { data: BinaryUploadData; name: string; mediaType: string }[]; threadId?: string; requestedAgentId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const results = await client.attachments.uploadBatch({ uploads: input.uploads as readonly PortableUpload[], threadId: input.threadId, requestedAgentId: input.requestedAgentId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => Object.fromEntries([\n ...Object.entries(current),\n ...results.map((result) => [result.id, result]),\n ]));\n return results.map(attachmentResultToChatAttachment);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n const createContentAccess = React.useCallback(\n (input: { attachmentId: string; disposition: \"inline\" | \"attachment\"; signal?: AbortSignalLike }) =>\n client.attachments.createContentAccess(input),\n [client],\n );\n return { createContentAccess, isUploading, uploadBatch, uploads };\n}\n\nexport function useAgentHitl() {\n const { client, createId } = useAgents24Runtime();\n const [isResolving, setIsResolving] = React.useState(false);\n const [lastResult, setLastResult] = React.useState<HitlResumeResult | null>(null);\n const resume = React.useCallback(async (input: { runId: string; interruptId: string; action: HitlAction; comment?: string; answers?: import(\"@agents24/client\").HitlAnswer[]; signal?: AbortSignalLike }) => {\n setIsResolving(true);\n try {\n const result = await client.hitl.resume({ ...input, idempotencyKey: createId() });\n setLastResult(result);\n return result;\n } finally {\n setIsResolving(false);\n }\n }, [client, createId]);\n return { isResolving, lastResult, resume };\n}\n\nexport function useAgentMcp() {\n const { client, createId } = useAgents24Runtime();\n const [isAuthorizing, setIsAuthorizing] = React.useState(false);\n const startAuthorization = React.useCallback(async (input: { runId: string; serverId: string; interruptId: string; redirectUri: string; popupNonce: string; codeChallenge: string; signal?: AbortSignalLike }): Promise<McpAuthorizationResult> => {\n setIsAuthorizing(true);\n try { return await client.mcp.startAuthorization({ ...input, idempotencyKey: createId() }); }\n finally { setIsAuthorizing(false); }\n }, [client, createId]);\n const redeemCallback = React.useCallback(async (input: { code: string; codeVerifier: string; signal?: AbortSignalLike }): Promise<McpCallbackResult> =>\n client.mcp.redeemCallback({ ...input, idempotencyKey: createId() }), [client, createId]);\n return { isAuthorizing, redeemCallback, startAuthorization };\n}\n"],"mappings":"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","names":["value","React","text","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","messageId","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","threadId","React","part","React","React","React","React","text","options","activeThread","React"]}
|