@agents24/react 0.2.7 → 0.2.9
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 +8 -8
- package/dist/index.d.ts +2 -0
- package/dist/index.js +848 -333
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +13 -0
- package/dist/state.d.ts +8 -0
- package/dist/thread-message-queue.d.ts +49 -0
- package/dist/use-agent-chat-feedback.d.ts +13 -0
- package/dist/use-agent-chat-queue-actions.d.ts +20 -0
- package/dist/use-agent-chat-thread-list.d.ts +20 -0
- package/dist/use-agent-chat.d.ts +11 -1
- package/dist/use-agent-resources.d.ts +14 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/state.ts","../src/use-agent-chat.ts","../src/runtime-event-buffer.ts","../src/thread-summary-subscription.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 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 {\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 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 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 role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\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) && ![\"waiting\", \"interrupted\"].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;\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 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 isFinal: ![\"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 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 } 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};\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};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage }),\n [client, createAbortController, createId, storage],\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, 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 active = activeThreadId && !incoming.some((thread) => thread.id === activeThreadId)\n ? current.find((thread) => thread.id === activeThreadId)\n : null;\n const base = active?.isHydrated ? [active, ...incoming] : incoming;\n return concurrentEvents.reduce(applyThreadSummaryEvent, base);\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 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\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.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const index = next.findIndex((message) => message.role === \"assistant\" && (\n Boolean(input.messageId && message.id === input.messageId)\n || Boolean(input.runId && message.runId === input.runId)\n ));\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\" || 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 projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const runId = event.run_id || state.activeRunId;\n const messageId = 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\" && (\n message.id === messageId || Boolean(runId && message.runId === runId)\n ));\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 contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, payload.context_window)\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, payload.context_window),\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 `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(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 const messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || message.isFinal,\n }),\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: runId ?? thread.last_run_id,\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 contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal ? 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: 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 ? 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] = { ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated };\n return next;\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n ResponseFeedback,\n RuntimeEvent,\n ThreadSummaryEvent,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadDetailToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport { subscribeToThreadSummaries } from \"./thread-summary-subscription\";\nimport {\n isCurrentThreadOpenRequest,\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n appendStableStreamingTurn,\n adoptStreamingThread,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n reconcileRefreshedThreads,\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};\n\nexport type AgentChatController = AgentChatState & {\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 resumeHitl(part: ChatHitlPart, response: HitlResponse): Promise<void>;\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 summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const activity = getThreadActivity(thread);\n return activity.isSpinning ? 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 [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\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 refreshThreadsPromiseRef = React.useRef<Promise<void> | null>(null);\n const threadEventsDuringRefreshRef = React.useRef<ThreadSummaryEvent[] | null>(null);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const stateRef = React.useRef(state);\n stateRef.current = state;\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 setState((current) => {\n const next = updater(current);\n stateRef.current = next;\n persist(next);\n return next;\n });\n }, [persist]);\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 invalidateThreadOpen = React.useCallback(() => {\n threadOpenGenerationRef.current += 1;\n threadOpenControllerRef.current?.abort(\"Thread selection changed.\");\n threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }, []);\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 React.useEffect(() => () => {\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshThreadsPromiseRef.current) return refreshThreadsPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n threadEventsDuringRefreshRef.current = [];\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n const concurrentEvents = threadEventsDuringRefreshRef.current || [];\n threadEventsDuringRefreshRef.current = null;\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const nextThreads = 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 {\n ...current,\n threads: reconcileRefreshedThreads(\n current.threads,\n nextThreads,\n current.activeThreadId,\n concurrentEvents,\n ),\n };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n threadEventsDuringRefreshRef.current = null;\n setIsLoadingThreads(false);\n }\n })();\n refreshThreadsPromiseRef.current = request;\n void request.then(\n () => {\n if (refreshThreadsPromiseRef.current === request) refreshThreadsPromiseRef.current = null;\n },\n () => {\n if (refreshThreadsPromiseRef.current === request) refreshThreadsPromiseRef.current = null;\n },\n );\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, {\n ...existing,\n ...summaryToStored(item),\n messages: existing?.messages || [],\n 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, threadPageSize, threadTotal, update]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n threadOpenControllerRef.current?.abort();\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 setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n const messages = threadDetailToMessages(detail);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(detail.paging?.has_more),\n nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null,\n ...context,\n };\n update((current) => isCurrentThreadOpenRequest({\n activeThreadId: current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n }) ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\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 && isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })\n ) await 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, runtime, update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n const eventThreadId = typeof event.payload?.thread_id === \"string\"\n ? event.payload.thread_id.trim()\n : \"\";\n if (eventThreadId && !stateRef.current.activeThreadId) {\n update((current) => adoptStreamingThread(current, eventThreadId));\n }\n eventBuffer.push(event);\n }, [eventBuffer, update]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n clearOperationError();\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", 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, failOperation, runtime, update]);\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 invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const userId = runtime.createId();\n const assistantId = runtime.createId();\n const idempotencyKey = runtime.createId();\n const optimisticAttachments = input.attachments?.length\n ? input.attachments\n : input.uploads?.map((upload, index) => ({\n id: `${userId}-attachment-${index}`,\n filename: upload.name,\n mediaType: upload.mediaType,\n status: \"uploading\",\n }));\n const userMessage: ChatMessage = { id: userId, role: \"user\", content: input.text.trim(), createdAt: new Date().toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [], attachments: optimisticAttachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n update((current) => ({\n ...current,\n messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage),\n streamingMessageId: assistantId,\n runState: hasPendingUploads ? \"uploading\" : \"streaming\",\n error: null,\n }));\n setIsSubmitting(true);\n let streamStarted = false;\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 (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 streamStarted = true;\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);\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 } catch (error) {\n if (isAbortLike(error) && !streamStarted) {\n update((current) => current.streamingMessageId === assistantId\n ? {\n ...current,\n messages: current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"idle\",\n streamingMessageId: null,\n }\n : current);\n } else if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n messages: streamStarted\n ? current.messages\n : current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"failed\",\n streamingMessageId: null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, refreshThreads, runtime, update]);\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 if (stateRef.current.activeThreadId === threadId) invalidateThreadOpen();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({\n ...current,\n activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId,\n messages: current.activeThreadId === threadId ? [] : current.messages,\n contextWindow: current.activeThreadId === threadId ? null : current.contextWindow,\n contextCompression: current.activeThreadId === threadId ? null : current.contextCompression,\n contextCompressionRevision: current.activeThreadId === threadId ? 0 : current.contextCompressionRevision,\n threads: current.threads.filter((thread) => thread.id !== threadId),\n }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, invalidateThreadOpen, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\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 (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 (!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]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n clearOperationError();\n if (!runId) {\n const error = new Error(\"No paused run is available to resume.\");\n failOperation(\"resume_hitl\", error);\n throw error;\n }\n try {\n const result = await client.hitl.resume({\n runId,\n interruptId: part.interruptId,\n ...response,\n idempotencyKey: runtime.createId(),\n });\n await attachRun(result.run_id || runId);\n } catch (error) {\n if (!isAbortLike(error)) failOperation(\"resume_hitl\", error);\n throw error;\n }\n }, [attachRun, clearOperationError, client, failOperation, runtime]);\n\n const setFeedback = React.useCallback(async (\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\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 previous = message.feedback ?? null;\n const timestamp = new Date().toISOString();\n const optimistic: ResponseFeedback | null = input.rating\n ? {\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 }\n : null;\n const replaceFeedback = (\n current: AgentChatState,\n feedback: ResponseFeedback | null,\n ): AgentChatState => {\n const messages = current.messages.map((item) =>\n item.id === message.id ? { ...item, feedback } : item\n );\n return {\n ...current,\n messages,\n threads: current.threads.map((thread) => ({\n ...thread,\n messages: thread.messages.map((item) =>\n item.id === message.id ? { ...item, feedback } : item\n ),\n })),\n };\n };\n clearOperationError();\n update((current) => replaceFeedback(current, optimistic));\n try {\n const result = await client.runs.setFeedback({ runId, ...input });\n update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n update((current) =>\n withAgentChatOperationError(\n replaceFeedback(current, previous),\n \"set_feedback\",\n error,\n )\n );\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\n\n const loadOlder = React.useCallback(async () => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (!thread?.nextBeforeTurnIndex) return;\n clearOperationError();\n setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex });\n const older = threadDetailToMessages(detail);\n update((current) => ({ ...current, messages: [...older, ...current.messages.filter((message) => !older.some((item) => item.id === message.id))], threads: current.threads.map((item) => item.id === thread.id ? { ...item, hasOlderTurns: Boolean(detail.paging?.has_more), nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null } : item) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_older_turns\", error);\n throw error;\n }\n } finally { setIsLoadingOlder(false); }\n }, [clearOperationError, client, failOperation, pageSize, update]);\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 React.useEffect(() => {\n const controller = runtime.createAbortController();\n clearBackgroundError();\n void subscribeToThreadSummaries({\n client,\n signal: controller.signal,\n refresh: refreshThreads,\n onEvent(event) {\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n },\n onError(error) {\n update((current) => withAgentChatBackgroundError(current, error));\n },\n onRecovered() {\n clearBackgroundError();\n },\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, refreshThreads, runtime.createAbortController, update]);\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 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 resumeHitl,\n setFeedback,\n startNewThread,\n submit,\n };\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 { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport { isAbortLike } from \"./lifecycle\";\n\ntype ThreadSummarySubscription = {\n client: AgentClient;\n signal: AbortSignalLike;\n onEvent(event: ThreadSummaryEvent): Promise<void> | void;\n onError(error: unknown): void;\n onRecovered(): void;\n refresh(): Promise<void>;\n};\n\nfunction waitForReconnect(signal: AbortSignalLike, delay: number): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, delay: number): unknown;\n clearTimeout(handle: unknown): void;\n };\n const finish = () => {\n clock.clearTimeout(timer);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timer = clock.setTimeout(finish, delay);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\n/** Keep the thread list connected across clean EOFs and transient stream failures. */\nexport async function subscribeToThreadSummaries(input: ThreadSummarySubscription): Promise<void> {\n let cursor: number | undefined;\n let failures = 0;\n while (!input.signal.aborted) {\n let refreshedFromSnapshot = false;\n try {\n await input.client.threads.events({ cursor, signal: input.signal }, async (event) => {\n if (event.event === \"snapshot_required\") {\n await input.refresh();\n cursor = undefined;\n refreshedFromSnapshot = true;\n return;\n }\n cursor = event.cursor;\n failures = 0;\n await input.onEvent(event);\n });\n if (input.signal.aborted) break;\n // A clean EOF can be an expired stream authorization. Reconcile before reconnecting.\n if (!refreshedFromSnapshot) await input.refresh();\n input.onRecovered();\n failures = 0;\n } catch (error) {\n if (input.signal.aborted || isAbortLike(error)) break;\n input.onError(error);\n failures += 1;\n try {\n await input.refresh();\n input.onRecovered();\n } catch (refreshError) {\n if (!input.signal.aborted && !isAbortLike(refreshError)) input.onError(refreshError);\n }\n }\n if (!input.signal.aborted) {\n await waitForReconnect(input.signal, Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5)));\n }\n }\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\nexport function isCurrentThreadOpenRequest(input: {\n activeThreadId: string | null;\n currentGeneration: number;\n requestGeneration: number;\n requestedThreadId: string;\n signalAborted: boolean;\n}): boolean {\n return !input.signalAborted\n && input.requestGeneration === input.currentGeneration\n && input.requestedThreadId === input.activeThreadId;\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 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 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","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","activeThread","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/runtime-event-buffer.ts","../src/state.ts","../src/thread-message-queue.ts","../src/use-agent-chat.ts","../src/thread-summary-subscription.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 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 {\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 segmentIndex?: number | null;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\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) && ![\"waiting\", \"interrupted\"].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 isFinal: ![\"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 detail?: ThreadDetail,\n): ChatMessage[] {\n const feedbackByRun = new Map((detail?.turns || []).flatMap((turn) =>\n turn.run_id && turn.feedback ? [[turn.run_id, turn.feedback] as const] : []));\n return items.map((item) => ({\n id: item.id,\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 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.run_id ? feedbackByRun.get(item.run_id) as ResponseFeedback | undefined : 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 } 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};\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};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage }),\n [client, createAbortController, createId, storage],\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 { 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 if (!current?.updated_at || !incoming.updated_at) return incoming;\n const currentTime = Date.parse(current.updated_at);\n const incomingTime = Date.parse(incoming.updated_at);\n return Number.isFinite(currentTime) && Number.isFinite(incomingTime) && currentTime > incomingTime\n ? current : incoming;\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 || (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 return activeRunId && live?.role === \"assistant\" && live.runId === activeRunId\n && (live.id === streamingMessageId || !live.isFinal)\n ? { ...message, ...live, durableId: message.durableId || live.durableId }\n : message;\n });\n return [...retained, ...reconciled];\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 if (index < 0) return [...current, 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 : 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\" || 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 (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\" && !message.runId && !message.durableId) {\n optimisticIndex = index;\n break;\n }\n }\n if (optimisticIndex >= 0) {\n state = { ...state, messages: state.messages.map((message, index) => index === optimisticIndex\n ? { ...message, durableId: messageId, runId: event.run_id }\n : message.role === \"assistant\" && !message.runId\n ? { ...message, runId: event.run_id }\n : message) };\n }\n }\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\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 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 `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(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 const 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,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || message.isFinal,\n }),\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: runId ?? thread.last_run_id,\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 contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal ? 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: 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 ? 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 type {\n ThreadMessage, ThreadMessageInput, ThreadMessageQueueState,\n ThreadMessageSubmission, ThreadMessagesPage,\n} from \"@agents24/client\";\n\nexport type ThreadMessageNotice = {\n messageId: string;\n status: string;\n runId: string | null;\n cursor?: number;\n};\n\nexport type ThreadMessageQueueTransport = {\n list(threadId: string): 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 }: {\n threadId: string | null;\n transport: ThreadMessageQueueTransport;\n onPromoted: (message: ThreadMessage, runId: string) => 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>());\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 transportRef = React.useRef(transport);\n const onPromotedRef = React.useRef(onPromoted);\n threadRef.current = threadId;\n transportRef.current = transport;\n onPromotedRef.current = onPromoted;\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 = pendingRef.current.get(message.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 setPendingMessages(pending);\n setMessageQueue(page.queue);\n }, []);\n\n const refresh = React.useCallback(async (selectedThreadId = threadRef.current) => {\n if (!selectedThreadId) return null;\n const version = ++versionRef.current;\n const page = await transportRef.current.list(selectedThreadId);\n if (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 = pendingRef.current.get(item.id);\n if (pending && !promotedRef.current.has(item.id)) {\n promotedRef.current.add(item.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]);\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 = pendingRef.current.get(notice.messageId);\n if (notice.status === \"delivered\" && notice.runId && pending && !promotedRef.current.has(pending.id)) {\n promotedRef.current.add(pending.id);\n pendingRef.current.delete(pending.id);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((message) => message.id !== pending.id));\n onPromotedRef.current(pending, notice.runId);\n }\n if (notice.status === \"removed\") pendingRef.current.delete(notice.messageId);\n void refresh().catch(() => undefined);\n return true;\n }, [refresh]);\n\n const submit = React.useCallback(async (input: Omit<ThreadMessageInput, \"threadId\"> & {\n attachments?: ThreadMessage[\"attachments\"];\n }) => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) throw new Error(\"No active Agent thread is available.\");\n const { attachments, ...submission } = input;\n const result = await transportRef.current.submit({ ...submission, threadId: selectedThreadId });\n if (threadRef.current !== selectedThreadId) return result;\n versionRef.current += 1;\n if (!result.run_id && [\"queued\", \"steer_pending\", \"blocked\"].includes(result.status)) {\n const now = new Date().toISOString();\n const pending: ThreadMessage = {\n id: result.message_id, thread_id: selectedThreadId, sequence: Number.MAX_SAFE_INTEGER,\n run_id: null, turn_id: null, segment_index: null, role: \"user\", status: result.status,\n requested_mode: input.mode, text: input.input, attachment_ids: input.attachmentIds || [],\n attachments,\n response_blocks: [], revision: 1, created_at: now, updated_at: now,\n };\n pendingRef.current.set(pending.id, pending);\n setPendingMessages((current) => current.some((message) => message.id === pending.id)\n ? current : [...current, pending]);\n setMessageQueue((current) => ({ pending_count: Math.max(current?.pending_count || 0, result.queue_position || 1),\n paused: current?.paused || false, reason: current?.reason || null }));\n }\n void refresh().catch(() => undefined);\n return result;\n }, [refresh]);\n\n const edit = React.useCallback(async (message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }) => {\n const updated = await transportRef.current.edit(message, input);\n versionRef.current += 1;\n pendingRef.current.set(updated.id, updated);\n await refresh(message.thread_id);\n return updated;\n }, [refresh]);\n\n const remove = React.useCallback(async (message: ThreadMessage) => {\n await transportRef.current.remove(message);\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]);\n\n const retractForEdit = React.useCallback(async (message: ThreadMessage): Promise<RetractedMessageDraft> => {\n await remove(message);\n return { text: message.text, attachment_ids: message.attachment_ids, attachments: message.attachments };\n }, [remove]);\n\n const resume = React.useCallback(async () => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) return null;\n const result = await transportRef.current.resume(selectedThreadId);\n await refresh(selectedThreadId);\n return result;\n }, [refresh]);\n\n React.useEffect(() => {\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n pendingRef.current.clear();\n setPendingMessages([]);\n setMessageQueue(null);\n if (threadId) void refresh(threadId).catch(() => undefined);\n }, [threadId, refresh]);\n\n React.useEffect(() => {\n if (!threadId || !pendingMessages.length || messageQueue?.paused) return;\n const clock = globalThis as typeof globalThis & {\n setInterval(callback: () => void, interval: number): unknown;\n clearInterval(timer: unknown): void;\n };\n const timer = clock.setInterval(() => { void refresh(threadId).catch(() => undefined); }, 3000);\n return () => clock.clearInterval(timer);\n }, [threadId, pendingMessages.length, messageQueue?.paused, refresh]);\n\n return { pendingMessages, messageQueue, refresh, hydrate, acceptNotice, submit, edit, remove, retractForEdit, resume };\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n RuntimeEvent,\n ThreadMessage,\n ThreadMessageQueueState,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadDetailToMessages,\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 { subscribeToThreadSummaries } from \"./thread-summary-subscription\";\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 { useThreadMessageQueue, type RetractedMessageDraft, type ThreadMessageQueueTransport } from \"./thread-message-queue\";\nimport {\n isCurrentThreadOpenRequest,\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n appendStableStreamingTurn,\n adoptStreamingThread,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n promoteThreadMessage,\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};\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): Promise<void>;\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 activity.isSpinning ? 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 firstSubmissionRef = React.useRef<Promise<void> | null>(null);\n const firstSubmissionAdmittedRef = React.useRef<(() => void) | null>(null);\n const stateRef = React.useRef(state);\n stateRef.current = state;\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 setState((current) => {\n const next = updater(current);\n stateRef.current = next;\n persist(next);\n return next;\n });\n }, [persist]);\n\n const queueTransport = React.useMemo<ThreadMessageQueueTransport>(() => ({\n list: (threadId) => client.threads.messages.list({ threadId, limit: pageSize }),\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 onQueuePromotion = React.useCallback((message: ThreadMessage, runId: string) => {\n if (stateRef.current.activeThreadId !== message.thread_id) return;\n promotedRunHintRef.current = runId;\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) } : current);\n if (stateRef.current.activeRunId !== runId && promotedAttachRef.current !== runId) {\n promotedAttachRef.current = runId;\n void attachRunRef.current(runId).catch(() => { promotedAttachRef.current = null; });\n }\n }, [update]);\n const queue = useThreadMessageQueue({ threadId: state.activeThreadId, transport: queueTransport, onPromoted: onQueuePromotion });\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 setIsLoadingHistory(false);\n }, []);\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 refreshMessages = React.useCallback(async (threadId?: string, promotedRunId?: string) => {\n const target = threadId || stateRef.current.activeThreadId;\n if (!target) return;\n const version = ++messageRefreshVersionRef.current;\n const page = await client.threads.messages.list({ threadId: target, limit: pageSize });\n if (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.role === \"user\" && message.run_id === promoted)) {\n promotedRunHintRef.current = null;\n update((current) => {\n if (current.activeThreadId !== target) return current;\n return {\n ...current,\n messages: reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), current.activeRunId, current.streamingMessageId),\n };\n });\n return;\n }\n if (stateRef.current.activeRunId) {\n const delivered = threadTimelineToMessages(page.items.filter((item) =>\n item.role === \"user\" && item.run_id === stateRef.current.activeRunId && (item.segment_index ?? 0) > 0));\n if (delivered.length) update((current) => {\n if (current.activeThreadId !== target) return current;\n const additions = delivered.filter((item) => !current.messages.some((existing) => existing.id === item.id));\n return additions.length ? { ...current, messages: [...current.messages, ...additions] } : current;\n });\n }\n if (!stateRef.current.activeRunId && page.items.length) {\n update((current) => current.activeThreadId === target && !current.activeRunId\n ? (() => {\n const messages = reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), null, null);\n return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };\n })()\n : current);\n }\n }, [client, pageSize, queue.hydrate, update]);\n\n React.useEffect(() => () => {\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 threadOpenControllerRef.current?.abort();\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 setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n const timeline = await client.threads.messages.list({ threadId, limit: pageSize, signal: requestController.signal });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n queue.hydrate(timeline, threadId);\n const messages = timeline.items.length ? threadTimelineToMessages(timeline.items, detail) : threadDetailToMessages(detail);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(detail.paging?.has_more),\n nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null,\n ...context,\n };\n update((current) => isCurrentThreadOpenRequest({\n activeThreadId: current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n }) ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\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 && isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })\n ) await 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]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n const eventThreadId = typeof event.payload?.thread_id === \"string\"\n ? event.payload.thread_id.trim()\n : \"\";\n if (eventThreadId && !stateRef.current.activeThreadId) {\n update((current) => adoptStreamingThread(current, eventThreadId));\n firstSubmissionAdmittedRef.current?.();\n }\n eventBuffer.push(event);\n }, [eventBuffer, update]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n clearOperationError();\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, signal: controller.signal }, consumeEvent);\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 (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", 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]);\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 if (firstSubmissionRef.current && !stateRef.current.activeThreadId) {\n await firstSubmissionRef.current;\n }\n const existingThreadId = stateRef.current.activeThreadId;\n if (existingThreadId) {\n clearOperationError();\n setIsSubmitting(true);\n try {\n const uploaded = input.uploads?.length\n ? await client.attachments.uploadBatch({\n uploads: input.uploads,\n threadId: existingThreadId,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n })\n : [];\n const result = await queue.submit({\n mode: \"queue\",\n input: input.text.trim(),\n attachmentIds: uploaded.length ? uploaded.map((item) => item.id) : input.attachmentIds,\n requestedAgentId: input.requestedAgentId,\n requestedModelId: input.requestedModelId,\n idempotencyKey: runtime.createId(),\n });\n if (stateRef.current.activeThreadId !== existingThreadId) return;\n if (result.run_id) {\n const userMessage: ChatMessage = {\n id: result.message_id, role: \"user\", runId: result.run_id,\n content: input.text.trim(), createdAt: new Date().toISOString(),\n isFinal: true,\n parts: input.text.trim() ? [{ id: `${result.message_id}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [],\n attachments: input.attachments || [],\n };\n update((current) => current.activeThreadId !== existingThreadId\n || current.messages.some((message) => message.id === userMessage.id)\n ? current : { ...current, messages: [...current.messages, userMessage] });\n }\n void refreshMessages(existingThreadId).catch(() => undefined);\n if (result.run_id && promotedAttachRef.current !== result.run_id\n && stateRef.current.activeRunId !== result.run_id) {\n void attachRunRef.current(result.run_id).catch(() => undefined);\n }\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n return;\n }\n const admission = new Promise<void>((resolve) => { firstSubmissionAdmittedRef.current = resolve; });\n const stream = (async () => {\n invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const userId = runtime.createId();\n const assistantId = runtime.createId();\n const idempotencyKey = runtime.createId();\n const optimisticAttachments = input.attachments?.length\n ? input.attachments\n : input.uploads?.map((upload, index) => ({\n id: `${userId}-attachment-${index}`,\n filename: upload.name,\n mediaType: upload.mediaType,\n status: \"uploading\",\n }));\n const userMessage: ChatMessage = { id: userId, role: \"user\", content: input.text.trim(), createdAt: new Date().toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [], attachments: optimisticAttachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n update((current) => ({\n ...current,\n messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage),\n streamingMessageId: assistantId,\n runState: hasPendingUploads ? \"uploading\" : \"streaming\",\n error: null,\n }));\n setIsSubmitting(true);\n let streamStarted = false;\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 (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 streamStarted = true;\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);\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 (isAbortLike(error) && !streamStarted) {\n update((current) => current.streamingMessageId === assistantId\n ? {\n ...current,\n messages: current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"idle\",\n streamingMessageId: null,\n }\n : current);\n } else if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n messages: streamStarted\n ? current.messages\n : current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"failed\",\n streamingMessageId: null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n })();\n const accepted = Promise.race([stream, admission]);\n firstSubmissionRef.current = accepted;\n try {\n await accepted;\n } finally {\n if (firstSubmissionRef.current === accepted) firstSubmissionRef.current = null;\n firstSubmissionAdmittedRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, queue.submit, refreshMessages, refreshThreads, runtime, update]);\n\n const { steer, editPendingMessage, steerPendingMessage, removePendingMessage, resumeQueue } =\n useAgentChatQueueActions({ queue, stateRef, createId: runtime.createId, clearOperationError,\n failOperation, refreshMessages, attachRun });\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 if (stateRef.current.activeThreadId === threadId) invalidateThreadOpen();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({\n ...current,\n activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId,\n messages: current.activeThreadId === threadId ? [] : current.messages,\n contextWindow: current.activeThreadId === threadId ? null : current.contextWindow,\n contextCompression: current.activeThreadId === threadId ? null : current.contextCompression,\n contextCompressionRevision: current.activeThreadId === threadId ? 0 : current.contextCompressionRevision,\n threads: current.threads.filter((thread) => thread.id !== threadId),\n }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, invalidateThreadOpen, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\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 (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 (!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]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n clearOperationError();\n if (!runId) {\n const error = new Error(\"No paused run is available to resume.\");\n failOperation(\"resume_hitl\", error);\n throw error;\n }\n try {\n const result = await client.hitl.resume({\n runId,\n interruptId: part.interruptId,\n ...response,\n idempotencyKey: runtime.createId(),\n });\n await attachRun(result.run_id || runId);\n } catch (error) {\n if (!isAbortLike(error)) failOperation(\"resume_hitl\", error);\n throw error;\n }\n }, [attachRun, clearOperationError, client, failOperation, runtime]);\n\n const setFeedback = useAgentChatFeedback({ client, update, clearOperationError, failOperation });\n\n const loadOlder = React.useCallback(async () => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (!thread?.nextBeforeTurnIndex) return;\n clearOperationError();\n setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex });\n const older = threadDetailToMessages(detail);\n update((current) => ({ ...current, messages: [...older, ...current.messages.filter((message) => !older.some((item) => item.id === message.id))], threads: current.threads.map((item) => item.id === thread.id ? { ...item, hasOlderTurns: Boolean(detail.paging?.has_more), nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null } : item) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_older_turns\", error);\n throw error;\n }\n } finally { setIsLoadingOlder(false); }\n }, [clearOperationError, client, failOperation, pageSize, update]);\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 React.useEffect(() => {\n const controller = runtime.createAbortController();\n clearBackgroundError();\n void subscribeToThreadSummaries({\n client,\n signal: controller.signal,\n refresh: refreshThreads,\n onEvent(event) {\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n if (event.event === \"thread.message.updated\" && event.thread_id === stateRef.current.activeThreadId) {\n const wasQueued = queue.acceptNotice({ messageId: event.message_id,\n status: event.status, runId: event.run_id, cursor: event.cursor });\n if (wasQueued) void refreshMessages(event.thread_id, event.run_id || undefined).catch(() => undefined);\n }\n if (event.event === \"thread.summary.updated\" && event.thread.id === stateRef.current.activeThreadId) {\n if (streamControllerRef.current && stateRef.current.messages.some((message) =>\n message.role === \"user\" && !message.runId)) return;\n const promotedRunId = activeRunIdFromThread(summaryToStored(event.thread));\n void (async () => {\n await refreshMessages(String(event.thread.id), promotedRunId || undefined);\n if (promotedRunId && stateRef.current.activeRunId !== promotedRunId\n && stateRef.current.activeThreadId === String(event.thread.id)\n && promotedAttachRef.current !== promotedRunId) {\n promotedAttachRef.current = promotedRunId;\n await attachRunRef.current(promotedRunId);\n }\n })().catch(() => undefined);\n }\n },\n onError(error) {\n update((current) => withAgentChatBackgroundError(current, error));\n },\n onRecovered() {\n clearBackgroundError();\n },\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, queue.acceptNotice, refreshMessages, refreshThreads, runtime.createAbortController, update]);\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 setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport { isAbortLike } from \"./lifecycle\";\n\ntype ThreadSummarySubscription = {\n client: AgentClient;\n signal: AbortSignalLike;\n onEvent(event: ThreadSummaryEvent): Promise<void> | void;\n onError(error: unknown): void;\n onRecovered(): void;\n refresh(): Promise<void>;\n};\n\nfunction waitForReconnect(signal: AbortSignalLike, delay: number): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, delay: number): unknown;\n clearTimeout(handle: unknown): void;\n };\n const finish = () => {\n clock.clearTimeout(timer);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timer = clock.setTimeout(finish, delay);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\n/** Keep the thread list connected across clean EOFs and transient stream failures. */\nexport async function subscribeToThreadSummaries(input: ThreadSummarySubscription): Promise<void> {\n let cursor: number | undefined;\n let failures = 0;\n while (!input.signal.aborted) {\n let refreshedFromSnapshot = false;\n try {\n await input.client.threads.events({ cursor, signal: input.signal }, async (event) => {\n if (event.event === \"snapshot_required\") {\n await input.refresh();\n cursor = undefined;\n refreshedFromSnapshot = true;\n return;\n }\n cursor = event.cursor;\n failures = 0;\n await input.onEvent(event);\n });\n if (input.signal.aborted) break;\n // A clean EOF can be an expired stream authorization. Reconcile before reconnecting.\n if (!refreshedFromSnapshot) await input.refresh();\n input.onRecovered();\n failures = 0;\n } catch (error) {\n if (input.signal.aborted || isAbortLike(error)) break;\n input.onError(error);\n failures += 1;\n try {\n await input.refresh();\n input.onRecovered();\n } catch (refreshError) {\n if (!input.signal.aborted && !isAbortLike(refreshError)) input.onError(refreshError);\n }\n }\n if (!input.signal.aborted) {\n await waitForReconnect(input.signal, Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5)));\n }\n }\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 }: {\n client: AgentClient;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n return 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 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.id === message.id ? { ...item, feedback } : item),\n threads: current.threads.map((thread) => ({ ...thread,\n messages: thread.messages.map((item) => item.id === message.id ? { ...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 update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n update((current) => withAgentChatOperationError(replaceFeedback(current, previous), \"set_feedback\", error));\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\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 }: {\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 clearOperationError();\n try {\n await queue.submit({ mode: \"steer\", input: text.trim(), idempotencyKey: createId() });\n await refreshMessages(threadId);\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n }\n }, [clearOperationError, createId, failOperation, queue.submit, refreshMessages, stateRef]);\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 result = await queue.resume();\n if (result?.run_id) void attachRun(result.run_id).catch(() => undefined);\n }, [attachRun, queue.resume, stateRef]);\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\nexport function isCurrentThreadOpenRequest(input: {\n activeThreadId: string | null;\n currentGeneration: number;\n requestGeneration: number;\n requestedThreadId: string;\n signalAborted: boolean;\n}): boolean {\n return !input.signalAborted\n && input.requestGeneration === input.currentGeneration\n && input.requestedThreadId === input.activeThreadId;\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","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","messageId","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","React","React","React","React","text","activeThread","React"]}
|