@agents24/react 0.2.0 → 0.2.2

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/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/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 HitlAction,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState = \"idle\" | \"streaming\" | \"reconnecting\" | \"paused\" | \"completed\" | \"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 type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatTextPart = { id: string; type: \"text\"; kind: \"text\"; text: string; raw?: Record<string, unknown> };\nexport type ChatToolPart = {\n id: string;\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolCallId?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n errorText?: string | null;\n presentation?: Record<string, unknown> | null;\n raw: Record<string, unknown>;\n};\nexport type ChatReasoningPart = { id: string; type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null; raw: Record<string, unknown> };\nexport type ChatUiBlocksPart = { id: string; type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null; raw: Record<string, unknown> };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlPart = {\n id: string;\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 resolution?: Record<string, unknown> | null;\n raw: Record<string, unknown>;\n};\nexport type ChatErrorPart = { id: string; type: \"error\"; kind: \"error\"; errorText: string; raw: Record<string, unknown> };\nexport type ChatDataPart = { id: string; type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown>; raw: Record<string, unknown> };\nexport type ChatSourcePart = { id: string; type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null; raw: Record<string, unknown> };\nexport type ChatCitationPart = { id: string; type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null; raw: Record<string, unknown> };\nexport type ChatAttachmentPart = { id: string; type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment; raw: Record<string, unknown> };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | 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 liked?: boolean;\n disliked?: boolean;\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 messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\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 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\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};\n\nexport function partsFromResponseBlocks(blocks: unknown, fallbackText = \"\"): 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 if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ id, type: \"text\", kind: \"text\", text: value, raw: block }] : [];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.action || tool.title || \"tool\");\n return [{\n id,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolCallId: text(tool.toolCallId),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n errorText: text(tool.error || block.error),\n presentation: record(tool.presentation),\n raw: block,\n }];\n }\n if (kind === \"reasoning_note\") return [{ id, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status), raw: block }];\n if (kind === \"ui_blocks\") return [{ id, 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), raw: block }];\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 id,\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 resolution: record(block.resolution),\n raw: block,\n }];\n }\n if (kind === \"error\") return [{ id, type: \"error\", kind: \"error\", errorText: String(record(block.error)?.message || block.text || \"The run failed.\"), raw: block }];\n if (kind === \"source\") return [{ id, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description), raw: block }];\n if (kind === \"citation\") return [{ id, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url), raw: block }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ id, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined }, raw: block }];\n }\n return [{ id, type: \"data\", kind: \"data\", name: kind, data: block, raw: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: \"assistant-text\", 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(payload.response_blocks, content);\n if (fromBlocks.length) return { content, parts: fromBlocks };\n if (event.event === \"reasoning.update\") return {\n content,\n parts: [{ id: `reasoning-${event.seq}`, type: \"reasoning\", kind: \"reasoning\", label: text(payload.label), text: text(payload.description), status: text(payload.status), raw: payload }],\n };\n if (event.event === \"ui_blocks.updated\") return {\n content,\n parts: [{ id: `ui-blocks-${event.seq}`, type: \"ui-blocks\", kind: \"ui-blocks\", state: \"input-available\", bundle: record(payload.bundle), raw: payload }],\n };\n if (event.event === \"runtime.error\") return {\n content,\n parts: [{ id: `error-${event.seq}`, type: \"error\", kind: \"error\", errorText: String(record(payload.error)?.message || \"The run failed.\"), raw: payload }],\n };\n if ((event.event === \"source.added\" || event.event === \"citation.added\") && record(payload.source)) {\n return { content, parts: partsFromResponseBlocks([payload.source]) };\n }\n if (event.event === \"tool.started\") {\n const toolName = String(payload.display_name || \"Tool\");\n return {\n content,\n parts: [{ id: String(payload.tool_call_id || `tool-${event.seq}`), type: `tool-${toolName}`, kind: \"tool\", toolName, toolCallId: text(payload.tool_call_id), state: \"input-available\", presentation: { title: toolName }, raw: payload }],\n };\n }\n if (event.event === \"hitl.requested\") {\n const hitl = record(payload.hitl) || {};\n const kind = String(hitl.kind || \"\") as ChatHitlKind;\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n if (kind in allowedActions && actions.length === allowedActions[kind].length && actions.every((action, index) => action === allowedActions[kind][index])) {\n return {\n content,\n parts: [{ id: `hitl-${event.seq}`, type: \"hitl\", kind: \"hitl\", interruptId: String(hitl.interrupt_id || \"\"), hitlKind: kind, message: String(hitl.message || \"\"), allowedActions: actions, status: \"pending\", presentation: record(hitl.presentation) || hitl, raw: payload }],\n };\n }\n }\n return { content, parts: [] };\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 attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => record(attachment) ? [record(attachment) as ChatAttachment] : [])\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)) 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 parts: partsFromResponseBlocks(turn.response_blocks, assistantText),\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n return output;\n });\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return { ...result, id: result.id, filename: result.filename, mediaType: result.mime_type, status: result.status };\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 type { ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent } from \"./model\";\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 runState: \"idle\" | \"streaming\" | \"reconnecting\" | \"paused\" | \"completed\" | \"failed\";\n error: unknown;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n runState: \"idle\",\n error: null,\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\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 existing = state.messages.find((message) => message.id === messageId || Boolean(runId && message.runId === runId));\n const payload = event.payload || {};\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const content = delta ? `${existing?.content || \"\"}${delta}` : projection.content || existing?.content || \"\";\n const deltaParts = delta\n ? [{ id: `${runId || \"run\"}-assistant-text`, type: \"text\" as const, kind: \"text\" as const, text: content }]\n : [];\n const incomingParts = projection.parts.length ? projection.parts : deltaParts;\n const parts = incomingParts.length\n ? [...(existing?.parts || []).filter((part) => !incomingParts.some((incoming) => incoming.id === part.id || (incoming.kind === \"text\" && part.kind === \"text\"))), ...incomingParts]\n : existing?.parts || [];\n return {\n ...state,\n activeRunId: terminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n 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 runState: paused ? \"paused\" : terminal ? (eventName === \"run.completed\" ? \"completed\" : \"failed\") : \"streaming\",\n streamingMessageId: terminal || paused ? null : messageId,\n };\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\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 { AgentClient, HitlAction, PortableUpload, RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { threadDetailToMessages } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport {\n appendStableStreamingTurn,\n applyRuntimeEvent,\n applyThreadSummaryEvent,\n initialAgentChatState,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n requestedModelId?: 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 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, action: HitlAction, comment?: string): 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 active = thread.active_run as Record<string, unknown> | null | undefined;\n const status = String(active?.status || thread.last_run_status || \"\").toLowerCase();\n if (![\"queued\", \"running\", \"cancelling\"].includes(status)) return null;\n return String(active?.run_id || thread.last_run_id || \"\") || 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: options.activeThreadId ?? runtime.storage?.loadActiveThreadId?.() ?? null,\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 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 detach = React.useCallback(() => {\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [update]);\n\n React.useEffect(() => () => streamControllerRef.current?.abort(), []);\n\n const refreshThreads = React.useCallback(async () => {\n setIsLoadingThreads(true);\n try {\n const result = await client.threads.list({ limit: threadPageSize });\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 { ...current, threads: nextThreads };\n });\n } finally {\n setIsLoadingThreads(false);\n }\n }, [client, 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 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 } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [client, isLoadingMoreThreads, threadPageSize, threadTotal, update]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n detach();\n update((current) => ({ ...current, activeThreadId: threadId, error: null, messages: current.threads.find((thread) => thread.id === threadId)?.messages || [] }));\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({ threadId, limit: pageSize, includeRunEvents: true });\n const messages = threadDetailToMessages(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 };\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n messages,\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 }));\n const activeRunId = activeRunIdFromThread(stored);\n if (activeRunId) await attachRunRef.current(activeRunId);\n } finally {\n setIsLoadingHistory(false);\n }\n }, [client, detach, pageSize, update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n update((current) => {\n const next = applyRuntimeEvent(current, event);\n if (!next.activeThreadId) return next;\n return {\n ...next,\n threads: next.threads.map((thread) => thread.id === next.activeThreadId\n ? { ...thread, messages: next.messages, isHydrated: true, last_run_id: next.activeRunId }\n : thread),\n };\n });\n }, [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 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)) update((current) => ({ ...current, error, runState: \"failed\", streamingMessageId: null }));\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [client, consumeEvent, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length) return;\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 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: input.attachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n update((current) => ({ ...current, messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage), streamingMessageId: assistantId, runState: \"streaming\", error: null }));\n setIsSubmitting(true);\n try {\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds: input.attachmentIds, requestedModelId: input.requestedModelId, idempotencyKey, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeThreadId: result.threadId || current.activeThreadId, activeRunId: result.detached ? result.runId : current.activeRunId, cursor: result.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (result.threadId) await refreshThreads();\n } catch (error) {\n if (!isAbortLike(error)) update((current) => ({ ...current, error, runState: \"failed\", streamingMessageId: null }));\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [client, consumeEvent, detach, refreshThreads, runtime, update]);\n\n const startNewThread = React.useCallback(() => {\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({ ...current, activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId, messages: current.activeThreadId === threadId ? [] : current.messages, threads: current.threads.filter((thread) => thread.id !== threadId) }));\n }, [client, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId) return;\n await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n detach();\n update((current) => ({ ...current, activeRunId: null, runState: \"completed\", streamingMessageId: null }));\n }, [client, detach, runtime, update]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, action: HitlAction, comment?: string) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n if (!runId) throw new Error(\"No paused run is available to resume.\");\n const result = await client.hitl.resume({ runId, interruptId: part.interruptId, action, comment, idempotencyKey: runtime.createId() });\n await attachRun(result.run_id || runId);\n }, [attachRun, client, runtime]);\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 setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex, includeRunEvents: true });\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 } finally { setIsLoadingOlder(false); }\n }, [client, 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({ text: user.content, attachments: user.attachments });\n }, [submit]);\n\n React.useEffect(() => { void refreshThreads(); }, [refreshThreads]);\n React.useEffect(() => {\n const controller = runtime.createAbortController();\n void client.threads.events({ signal: controller.signal }, async (event: ThreadSummaryEvent) => {\n if (event.event === \"snapshot_required\") { await refreshThreads(); return; }\n update((current) => ({ ...current, threads: applyThreadSummaryEvent(current.threads, event) }));\n }).catch((error) => { if (!isAbortLike(error)) update((current) => ({ ...current, error })); });\n return () => controller.abort();\n }, [client, refreshThreads, runtime, update]);\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n if (threadId && threadId !== stateRef.current.activeThreadId) void openThread(threadId);\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 deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n resumeHitl,\n startNewThread,\n submit,\n };\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n 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; includeRunEvents?: boolean } = {}) {\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.includeRunEvents, 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 upload = React.useCallback(async (input: { data: BinaryUploadData; name: string; mediaType: string; threadId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const result = await client.attachments.upload({ upload: input as PortableUpload, threadId: input.threadId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => ({ ...current, [result.id]: result }));\n return attachmentResultToChatAttachment(result);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n return { isUploading, upload, 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; 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":";AASO,SAAS,mBAA2B;AACzC,QAAM,aAAc,WAAqE;AACzF,MAAI,YAAY,WAAY,QAAO,WAAW,WAAW;AACzD,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC9E;AAEO,SAAS,YAAY,OAAyB;AACnD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,QAAQ;AACd,SAAO,MAAM,SAAS,gBAAgB,MAAM,SAAS,aAAa,MAAM,SAAS;AACnF;;;AC4EA,IAAM,SAAS,CAAC,UACd,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AACnG,IAAM,OAAO,CAAC,UAAkC,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AACpG,IAAM,oBAAoB,CAAC,UAAkC;AAC3D,QAAM,aAAa,OAAO,SAAS,EAAE,EAAE,YAAY;AACnD,MAAI,eAAe,YAAY,eAAe,QAAS,QAAO;AAC9D,MAAI,eAAe,eAAe,eAAe,WAAY,QAAO;AACpE,MAAI,CAAC,YAAY,aAAa,QAAQ,SAAS,EAAE,SAAS,UAAU,EAAG,QAAO;AAC9E,SAAO,eAAe,cAAc,oBAAoB;AAC1D;AAEA,IAAM,iBAAqD;AAAA,EACzD,aAAa,CAAC,WAAW,QAAQ;AAAA,EACjC,UAAU,CAAC,WAAW,MAAM;AAAA,EAC5B,eAAe,CAAC,WAAW,QAAQ;AAAA,EACnC,qBAAqB,CAAC,WAAW,QAAQ;AAC3C;AAEO,SAAS,wBAAwB,QAAiB,eAAe,IAAgB;AACtF,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAChD,QAAM,QAAQ,MAAM,QAAQ,CAAC,MAAM,UAAsB;AACvD,UAAM,QAAQ,OAAO,IAAI;AACzB,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,UAAM,OAAO,OAAO,MAAM,QAAQ,MAAM;AACxC,UAAM,KAAK,OAAO,MAAM,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE;AAChD,QAAI,SAAS,kBAAkB;AAC7B,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,aAAO,QAAQ,CAAC,EAAE,IAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC;AAAA,IAClF;AACA,QAAI,SAAS,UAAU,SAAS,eAAe,SAAS,eAAe;AACrE,YAAM,OAAO,OAAO,MAAM,IAAI,KAAK;AACnC,YAAM,WAAW,OAAO,KAAK,UAAU,KAAK,SAAS,MAAM;AAC3D,aAAO,CAAC;AAAA,QACN;AAAA,QACA,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,QACA,YAAY,KAAK,KAAK,UAAU;AAAA,QAChC,OAAO,kBAAkB,MAAM,MAAM;AAAA,QACrC,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK,KAAK,SAAS,MAAM,KAAK;AAAA,QACzC,cAAc,OAAO,KAAK,YAAY;AAAA,QACtC,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AACA,QAAI,SAAS,iBAAkB,QAAO,CAAC,EAAE,IAAI,MAAM,aAAa,MAAM,aAAa,OAAO,KAAK,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM,WAAW,GAAG,QAAQ,KAAK,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC;AACpL,QAAI,SAAS,YAAa,QAAO,CAAC,EAAE,IAAI,MAAM,aAAa,MAAM,aAAa,OAAO,kBAAkB,MAAM,MAAM,GAAG,YAAY,KAAK,MAAM,UAAU,GAAG,iBAAiB,KAAK,MAAM,eAAe,GAAG,QAAQ,OAAO,MAAM,MAAM,GAAG,WAAW,KAAK,MAAM,KAAK,GAAG,KAAK,MAAM,CAAC;AAChR,QAAI,SAAS,gBAAgB;AAC3B,YAAM,OAAO,OAAO,MAAM,IAAI,KAAK,CAAC;AACpC,YAAM,WAAW,OAAO,MAAM,YAAY,KAAK,QAAQ,EAAE;AACzD,UAAI,EAAE,YAAY,gBAAiB,QAAO,CAAC;AAC3C,YAAM,UAAU,MAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,gBAAgB,IAAI,MAAM,IAAoB,CAAC;AAC1G,YAAM,WAAW,eAAe,QAAQ;AACxC,UAAI,QAAQ,WAAW,SAAS,UAAU,QAAQ,KAAK,CAAC,QAAQ,gBAAgB,WAAW,SAAS,WAAW,CAAC,EAAG,QAAO,CAAC;AAC3H,aAAO,CAAC;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,OAAO,MAAM,eAAe,KAAK,gBAAgB,EAAE;AAAA,QAChE;AAAA,QACA,SAAS,OAAO,MAAM,QAAQ,KAAK,WAAW,EAAE;AAAA,QAChD,gBAAgB;AAAA,QAChB,QAAQ,OAAO,MAAM,UAAU,SAAS;AAAA,QACxC,cAAc,OAAO,KAAK,YAAY,KAAK;AAAA,QAC3C,YAAY,OAAO,MAAM,UAAU;AAAA,QACnC,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AACA,QAAI,SAAS,QAAS,QAAO,CAAC,EAAE,IAAI,MAAM,SAAS,MAAM,SAAS,WAAW,OAAO,OAAO,MAAM,KAAK,GAAG,WAAW,MAAM,QAAQ,iBAAiB,GAAG,KAAK,MAAM,CAAC;AAClK,QAAI,SAAS,SAAU,QAAO,CAAC,EAAE,IAAI,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO,MAAM,SAAS,QAAQ,GAAG,KAAK,KAAK,MAAM,GAAG,GAAG,aAAa,KAAK,MAAM,WAAW,GAAG,KAAK,MAAM,CAAC;AACrL,QAAI,SAAS,WAAY,QAAO,CAAC,EAAE,IAAI,MAAM,YAAY,MAAM,YAAY,UAAU,KAAK,MAAM,QAAQ,GAAG,OAAO,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,MAAM,CAAC;AACvK,QAAI,SAAS,cAAc;AACzB,YAAM,aAAa,OAAO,MAAM,UAAU,KAAK,CAAC;AAChD,aAAO,CAAC,EAAE,IAAI,MAAM,cAAc,MAAM,cAAc,YAAY,EAAE,GAAG,YAAY,IAAI,KAAK,WAAW,EAAE,KAAK,QAAW,UAAU,KAAK,WAAW,IAAI,KAAK,cAAc,WAAW,KAAK,WAAW,SAAS,KAAK,OAAU,GAAG,KAAK,MAAM,CAAC;AAAA,IAC9O;AACA,WAAO,CAAC,EAAE,IAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,EACjF,CAAC;AACD,MAAI,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM,KAAK,aAAa,KAAK,GAAG;AACtE,UAAM,KAAK,EAAE,IAAI,kBAAkB,MAAM,QAAQ,MAAM,QAAQ,MAAM,aAAa,KAAK,EAAE,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;AAEO,SAAS,6BAA6B,OAA6D;AACxG,QAAM,UAAU,OAAO,MAAM,OAAO,KAAK,CAAC;AAC1C,QAAM,UAAU,KAAK,QAAQ,qBAAqB,KAAK;AACvD,QAAM,aAAa,wBAAwB,QAAQ,iBAAiB,OAAO;AAC3E,MAAI,WAAW,OAAQ,QAAO,EAAE,SAAS,OAAO,WAAW;AAC3D,MAAI,MAAM,UAAU,mBAAoB,QAAO;AAAA,IAC7C;AAAA,IACA,OAAO,CAAC,EAAE,IAAI,aAAa,MAAM,GAAG,IAAI,MAAM,aAAa,MAAM,aAAa,OAAO,KAAK,QAAQ,KAAK,GAAG,MAAM,KAAK,QAAQ,WAAW,GAAG,QAAQ,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,CAAC;AAAA,EACzL;AACA,MAAI,MAAM,UAAU,oBAAqB,QAAO;AAAA,IAC9C;AAAA,IACA,OAAO,CAAC,EAAE,IAAI,aAAa,MAAM,GAAG,IAAI,MAAM,aAAa,MAAM,aAAa,OAAO,mBAAmB,QAAQ,OAAO,QAAQ,MAAM,GAAG,KAAK,QAAQ,CAAC;AAAA,EACxJ;AACA,MAAI,MAAM,UAAU,gBAAiB,QAAO;AAAA,IAC1C;AAAA,IACA,OAAO,CAAC,EAAE,IAAI,SAAS,MAAM,GAAG,IAAI,MAAM,SAAS,MAAM,SAAS,WAAW,OAAO,OAAO,QAAQ,KAAK,GAAG,WAAW,iBAAiB,GAAG,KAAK,QAAQ,CAAC;AAAA,EAC1J;AACA,OAAK,MAAM,UAAU,kBAAkB,MAAM,UAAU,qBAAqB,OAAO,QAAQ,MAAM,GAAG;AAClG,WAAO,EAAE,SAAS,OAAO,wBAAwB,CAAC,QAAQ,MAAM,CAAC,EAAE;AAAA,EACrE;AACA,MAAI,MAAM,UAAU,gBAAgB;AAClC,UAAM,WAAW,OAAO,QAAQ,gBAAgB,MAAM;AACtD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,CAAC,EAAE,IAAI,OAAO,QAAQ,gBAAgB,QAAQ,MAAM,GAAG,EAAE,GAAG,MAAM,QAAQ,QAAQ,IAAI,MAAM,QAAQ,UAAU,YAAY,KAAK,QAAQ,YAAY,GAAG,OAAO,mBAAmB,cAAc,EAAE,OAAO,SAAS,GAAG,KAAK,QAAQ,CAAC;AAAA,IAC1O;AAAA,EACF;AACA,MAAI,MAAM,UAAU,kBAAkB;AACpC,UAAM,OAAO,OAAO,QAAQ,IAAI,KAAK,CAAC;AACtC,UAAM,OAAO,OAAO,KAAK,QAAQ,EAAE;AACnC,UAAM,UAAU,MAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,gBAAgB,IAAI,MAAM,IAAoB,CAAC;AAC1G,QAAI,QAAQ,kBAAkB,QAAQ,WAAW,eAAe,IAAI,EAAE,UAAU,QAAQ,MAAM,CAAC,QAAQ,UAAU,WAAW,eAAe,IAAI,EAAE,KAAK,CAAC,GAAG;AACxJ,aAAO;AAAA,QACL;AAAA,QACA,OAAO,CAAC,EAAE,IAAI,QAAQ,MAAM,GAAG,IAAI,MAAM,QAAQ,MAAM,QAAQ,aAAa,OAAO,KAAK,gBAAgB,EAAE,GAAG,UAAU,MAAM,SAAS,OAAO,KAAK,WAAW,EAAE,GAAG,gBAAgB,SAAS,QAAQ,WAAW,cAAc,OAAO,KAAK,YAAY,KAAK,MAAM,KAAK,QAAQ,CAAC;AAAA,MAC/Q;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,OAAO,CAAC,EAAE;AAC9B;AAEO,SAAS,uBAAuB,QAAqC;AAC1E,UAAQ,OAAO,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,UAAU;AACnD,UAAM,OAAO,OAAO,IAAI,KAAK,CAAC;AAC9B,UAAM,WAAW,KAAK,KAAK,eAAe,KAAK;AAC/C,UAAM,gBAAgB,KAAK,KAAK,qBAAqB,KAAK;AAC1D,UAAM,QAAQ,KAAK,KAAK,MAAM;AAC9B,UAAM,YAAY,KAAK,KAAK,UAAU,MAAK,oBAAI,KAAK,CAAC,GAAE,YAAY;AACnE,UAAM,cAAc,MAAM,QAAQ,KAAK,WAAW,IAC9C,KAAK,YAAY,QAAQ,CAAC,eAAe,OAAO,UAAU,IAAI,CAAC,OAAO,UAAU,CAAmB,IAAI,CAAC,CAAC,IACzG,CAAC;AACL,UAAM,SAAwB,CAAC;AAC/B,QAAI,YAAY,YAAY,OAAQ,QAAO,KAAK;AAAA,MAC9C,IAAI,OAAO,KAAK,MAAM,GAAG,SAAS,KAAK,OAAO;AAAA,MAC9C,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,OAAO,WAAW,CAAC,EAAE,IAAI,GAAG,SAAS,KAAK,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS,CAAC,IAAI,CAAC;AAAA,MACzG;AAAA,MACA,cAAc,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IACxE,CAAC;AACD,QAAI,iBAAiB,MAAM,QAAQ,KAAK,eAAe,EAAG,QAAO,KAAK;AAAA,MACpE,IAAI,GAAG,SAAS,KAAK,MAAM,KAAK;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,WAAW,KAAK,KAAK,YAAY,KAAK;AAAA,MACtC,SAAS,CAAC,CAAC,UAAU,WAAW,UAAU,YAAY,EAAE,SAAS,OAAO,KAAK,UAAU,EAAE,EAAE,YAAY,CAAC;AAAA,MACxG,OAAO,wBAAwB,KAAK,iBAAiB,aAAa;AAAA,MAClE,cAAc,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IACxE,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,iCAAiC,QAA0C;AACzF,SAAO,EAAE,GAAG,QAAQ,IAAI,OAAO,IAAI,UAAU,OAAO,UAAU,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO;AACnH;;;AC/PA,YAAY,WAAW;AAwCd;AArBT,IAAM,kBAAwB,oBAA2C,IAAI;AAUtE,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAA0B;AACxB,QAAM,QAAc;AAAA,IAClB,OAAO,EAAE,QAAQ,uBAAuB,UAAU,QAAQ;AAAA,IAC1D,CAAC,QAAQ,uBAAuB,UAAU,OAAO;AAAA,EACnD;AACA,SAAO,oBAAC,gBAAgB,UAAhB,EAAyB,OAAe,UAAS;AAC3D;AAEO,SAAS,qBAA2C;AACzD,QAAM,QAAc,iBAAW,eAAe;AAC9C,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,0DAA0D;AACtF,SAAO;AACT;AAEO,SAAS,iBAA8B;AAC5C,SAAO,mBAAmB,EAAE;AAC9B;;;ACrCO,IAAM,wBAAwC;AAAA,EACnD,SAAS,CAAC;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU,CAAC;AAAA,EACX,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,OAAO;AACT;AAgBO,SAAS,0BACd,UACA,aACA,kBACY;AACZ,QAAM,OAAO,CAAC,GAAG,QAAQ;AACzB,MAAI,CAAC,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,YAAY,EAAE,EAAG,MAAK,KAAK,WAAW;AACjF,MAAI,CAAC,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,iBAAiB,MAAM;AAAA,IAChE,iBAAiB,SAAS,QAAQ,SAAS,eAAe,QAAQ,UAAU,iBAAiB;AAAA,EAC/F,CAAC,EAAG,MAAK,KAAK,gBAAgB;AAC9B,SAAO;AACT;AAEO,SAAS,6BACd,UACA,OACY;AACZ,QAAM,OAAO,CAAC,GAAG,QAAQ;AACzB,aAAW,eAAe,MAAM,gBAAgB,CAAC,GAAG;AAClD,UAAM,WAAW,YAAY,SAAS,gBACpC,QAAQ,MAAM,aAAa,YAAY,OAAO,MAAM,SAAS,KAC1D,QAAQ,MAAM,SAAS,YAAY,UAAU,MAAM,KAAK;AAE7D,QAAI,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,YAAY,EAAE,EAAG,MAAK,KAAK,WAAW;AAAA,EAChG;AACA,QAAM,QAAQ,KAAK,UAAU,CAAC,YAAY,QAAQ,SAAS,gBACzD,QAAQ,MAAM,aAAa,QAAQ,OAAO,MAAM,SAAS,KACtD,QAAQ,MAAM,SAAS,QAAQ,UAAU,MAAM,KAAK,EACxD;AACD,MAAI,UAAU,GAAI,MAAK,KAAK,MAAM,OAAO,CAAC;AAAA,MACrC,MAAK,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,CAAC;AAC3C,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAuB,OAAqC;AAC5F,QAAM,aAAa,6BAA6B,KAAK;AACrD,QAAM,YAAY,OAAO,MAAM,SAAS,EAAE;AAC1C,QAAM,QAAQ,MAAM,UAAU,MAAM;AACpC,QAAM,YAAY,MAAM,sBAAsB,GAAG,SAAS,KAAK;AAC/D,QAAM,WAAW,cAAc,mBAAmB,cAAc,gBAAgB,cAAc;AAC9F,QAAM,SAAS,cAAc,gBAAgB,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU,KAAK,WAAW,SAAS;AAC9H,QAAM,WAAW,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,aAAa,QAAQ,SAAS,QAAQ,UAAU,KAAK,CAAC;AACvH,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,QAAQ,cAAc,qBAAqB,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AACzG,QAAM,UAAU,QAAQ,GAAG,UAAU,WAAW,EAAE,GAAG,KAAK,KAAK,WAAW,WAAW,UAAU,WAAW;AAC1G,QAAM,aAAa,QACf,CAAC,EAAE,IAAI,GAAG,SAAS,KAAK,mBAAmB,MAAM,QAAiB,MAAM,QAAiB,MAAM,QAAQ,CAAC,IACxG,CAAC;AACL,QAAM,gBAAgB,WAAW,MAAM,SAAS,WAAW,QAAQ;AACnE,QAAM,QAAQ,cAAc,SACxB,CAAC,IAAI,UAAU,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,KAAK,CAAC,aAAa,SAAS,OAAO,KAAK,MAAO,SAAS,SAAS,UAAU,KAAK,SAAS,MAAO,CAAC,GAAG,GAAG,aAAa,IAChL,UAAU,SAAS,CAAC;AACxB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,WAAW,OAAO;AAAA,IAC/B,QAAQ,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM,MAAM;AAAA,IAC1D,UAAU,6BAA6B,MAAM,UAAU;AAAA,MACrD;AAAA,MACA;AAAA,MACA,QAAQ,OAAO;AAAA,QACb,IAAI;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,SAAS;AAAA,QACT;AAAA,MACF;AAAA,MACA,QAAQ,CAAC,aAAa;AAAA,QACpB,GAAG;AAAA,QACH,OAAO,SAAS,QAAQ;AAAA,QACxB;AAAA,QACA;AAAA,QACA,SAAS,YAAY,QAAQ;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,IACD,UAAU,SAAS,WAAW,WAAY,cAAc,kBAAkB,cAAc,WAAY;AAAA,IACpG,oBAAoB,YAAY,SAAS,OAAO;AAAA,EAClD;AACF;AAEO,SAAS,wBAAwB,SAA6B,OAA+C;AAClH,MAAI,MAAM,UAAU,oBAAqB,QAAO;AAChD,MAAI,MAAM,UAAU,iBAAkB,QAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,OAAO,MAAM,SAAS;AACrG,MAAI,MAAM,UAAU,yBAA0B,QAAO;AACrD,QAAM,WAAW,MAAM;AACvB,QAAM,QAAQ,QAAQ,UAAU,CAAC,WAAW,OAAO,OAAO,SAAS,EAAE;AACrE,MAAI,UAAU,GAAI,QAAO,CAAC,EAAE,GAAG,UAAU,UAAU,SAAS,YAAY,CAAC,GAAG,YAAY,MAAM,GAAG,GAAG,OAAO;AAC3G,QAAM,OAAO,CAAC,GAAG,OAAO;AACxB,OAAK,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,GAAG,UAAU,UAAU,KAAK,KAAK,EAAE,UAAU,YAAY,KAAK,KAAK,EAAE,WAAW;AAChH,SAAO;AACT;;;AClIA,YAAYA,YAAW;AAkDvB,SAAS,gBAAgB,QAAmD;AAC1E,SAAO,EAAE,GAAI,QAA6B,IAAI,OAAO,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,YAAY,MAAM;AACnG;AAEA,SAAS,sBAAsB,QAAgD;AAC7E,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,OAAO;AACtB,QAAM,SAAS,OAAO,QAAQ,UAAU,OAAO,mBAAmB,EAAE,EAAE,YAAY;AAClF,MAAI,CAAC,CAAC,UAAU,WAAW,YAAY,EAAE,SAAS,MAAM,EAAG,QAAO;AAClE,SAAO,OAAO,QAAQ,UAAU,OAAO,eAAe,EAAE,KAAK;AAC/D;AAEO,SAAS,aAAa,UAA+B,CAAC,GAAwB;AACnF,QAAM,UAAU,mBAAmB;AACnC,QAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAyB,OAAO;AAAA,IAC9D,GAAG;AAAA,IACH,gBAAgB,QAAQ,kBAAkB,QAAQ,SAAS,qBAAqB,KAAK;AAAA,IACrF,SAAS,QAAQ,SAAS,YAAY,KAAK,CAAC;AAAA,EAC9C,EAAE;AACF,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAS,KAAK;AACpE,QAAM,CAAC,sBAAsB,uBAAuB,IAAU,gBAAS,KAAK;AAC5E,QAAM,CAAC,aAAa,cAAc,IAAU,gBAA6B;AACzE,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAS,KAAK;AACpE,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,gBAAS,KAAK;AAChE,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAS,KAAK;AAC5D,QAAM,sBAA4B,cAAgE,IAAI;AACtG,QAAM,eAAqB,cAA0D,YAAY,MAAS;AAC1G,QAAM,WAAiB,cAAO,KAAK;AACnC,WAAS,UAAU;AAEnB,QAAM,UAAgB,mBAAY,CAAC,SAAyB;AAC1D,YAAQ,SAAS,YAAY,KAAK,OAAO;AACzC,YAAQ,SAAS,qBAAqB,KAAK,cAAc;AAAA,EAC3D,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,QAAM,SAAe,mBAAY,CAAC,YAAyD;AACzF,aAAS,CAAC,YAAY;AACpB,YAAM,OAAO,QAAQ,OAAO;AAC5B,eAAS,UAAU;AACnB,cAAQ,IAAI;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,SAAe,mBAAY,MAAM;AACrC,wBAAoB,SAAS,MAAM;AACnC,wBAAoB,UAAU;AAC9B,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,oBAAoB,MAAM,UAAU,QAAQ,cAAc,iBAAiB,OAAO,EAAE;AAAA,EACzH,GAAG,CAAC,MAAM,CAAC;AAEX,EAAM,iBAAU,MAAM,MAAM,oBAAoB,SAAS,MAAM,GAAG,CAAC,CAAC;AAEpE,QAAM,iBAAuB,mBAAY,YAAY;AACnD,wBAAoB,IAAI;AACxB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,KAAK,EAAE,OAAO,eAAe,CAAC;AAClE,qBAAe,OAAO,KAAK;AAC3B,aAAO,CAAC,YAAY;AAClB,cAAM,OAAO,IAAI,IAAI,QAAQ,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACzE,cAAM,cAAc,OAAO,MAAM,IAAI,CAAC,SAAS;AAC7C,gBAAM,WAAW,KAAK,IAAI,KAAK,EAAE;AACjC,iBAAO,EAAE,GAAG,UAAU,GAAG,gBAAgB,IAAI,GAAG,UAAU,UAAU,YAAY,CAAC,GAAG,YAAY,UAAU,WAAW;AAAA,QACvH,CAAC;AACD,eAAO,EAAE,GAAG,SAAS,SAAS,YAAY;AAAA,MAC5C,CAAC;AAAA,IACH,UAAE;AACA,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,QAAQ,gBAAgB,MAAM,CAAC;AAEnC,QAAM,kBAAwB,mBAAY,YAAY;AACpD,QAAI,qBAAsB;AAC1B,UAAM,OAAO,SAAS,QAAQ,QAAQ;AACtC,QAAI,gBAAgB,UAAa,QAAQ,YAAa;AACtD,4BAAwB,IAAI;AAC5B,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,KAAK,EAAE,MAAM,OAAO,eAAe,CAAC;AACxE,qBAAe,OAAO,KAAK;AAC3B,aAAO,CAAC,YAAY;AAClB,cAAM,OAAO,IAAI,IAAI,QAAQ,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACzE,mBAAW,QAAQ,OAAO,OAAO;AAC/B,gBAAM,WAAW,KAAK,IAAI,KAAK,EAAE;AACjC,eAAK,IAAI,KAAK,IAAI;AAAA,YAChB,GAAG;AAAA,YACH,GAAG,gBAAgB,IAAI;AAAA,YACvB,UAAU,UAAU,YAAY,CAAC;AAAA,YACjC,YAAY,UAAU;AAAA,UACxB,CAAC;AAAA,QACH;AACA,eAAO,EAAE,GAAG,SAAS,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE;AAAA,MACnD,CAAC;AAAA,IACH,UAAE;AACA,8BAAwB,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,QAAQ,sBAAsB,gBAAgB,aAAa,MAAM,CAAC;AAEtE,QAAM,aAAmB,mBAAY,OAAO,aAAqB;AAC/D,WAAO;AACP,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,gBAAgB,UAAU,OAAO,MAAM,UAAU,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE;AAC/J,wBAAoB,IAAI;AACxB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,IAAI,EAAE,UAAU,OAAO,UAAU,kBAAkB,KAAK,CAAC;AAC7F,YAAM,WAAW,uBAAuB,MAAM;AAC9C,YAAM,SAA2B;AAAA,QAC/B,GAAG;AAAA,QACH;AAAA,QACA,YAAY;AAAA,QACZ,eAAe,QAAQ,OAAO,QAAQ,QAAQ;AAAA,QAC9C,qBAAqB,OAAO,QAAQ,0BAA0B;AAAA,MAChE;AACA,aAAO,CAAC,aAAa;AAAA,QACnB,GAAG;AAAA,QACH,gBAAgB;AAAA,QAChB;AAAA,QACA,aAAa,sBAAsB,MAAM;AAAA,QACzC,SAAS,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,IAC5D,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,WAAW,SAAS,MAAM,IACxE,CAAC,QAAQ,GAAG,QAAQ,OAAO;AAAA,MACjC,EAAE;AACF,YAAM,cAAc,sBAAsB,MAAM;AAChD,UAAI,YAAa,OAAM,aAAa,QAAQ,WAAW;AAAA,IACzD,UAAE;AACA,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,UAAU,MAAM,CAAC;AAErC,QAAM,eAAqB,mBAAY,CAAC,UAAwB;AAC9D,WAAO,CAAC,YAAY;AAClB,YAAM,OAAO,kBAAkB,SAAS,KAAK;AAC7C,UAAI,CAAC,KAAK,eAAgB,QAAO;AACjC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,KAAK,iBACrD,EAAE,GAAG,QAAQ,UAAU,KAAK,UAAU,YAAY,MAAM,aAAa,KAAK,YAAY,IACtF,MAAM;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,YAAkB,mBAAY,OAAO,OAAe,WAAoB;AAC5E,wBAAoB,SAAS,MAAM;AACnC,UAAM,aAAa,QAAQ,sBAAsB;AACjD,wBAAoB,UAAU;AAC9B,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,aAAa,OAAO,UAAU,gBAAgB,OAAO,KAAK,EAAE;AAC/F,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,OAAO,GAAG,YAAY;AAClG,aAAO,CAAC,aAAa,EAAE,GAAG,SAAS,aAAa,OAAO,WAAW,QAAQ,QAAQ,aAAa,QAAQ,OAAO,UAAU,QAAQ,QAAQ,UAAU,OAAO,WAAW,iBAAiB,QAAQ,SAAS,EAAE;AAAA,IAC1M,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,EAAG,QAAO,CAAC,aAAa,EAAE,GAAG,SAAS,OAAO,UAAU,UAAU,oBAAoB,KAAK,EAAE;AAAA,IACpH,UAAE;AACA,UAAI,oBAAoB,YAAY,WAAY,qBAAoB,UAAU;AAAA,IAChF;AAAA,EACF,GAAG,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC;AAC1C,eAAa,UAAU;AAEvB,QAAM,SAAe,mBAAY,OAAO,UAAgC;AACtE,QAAI,CAAC,MAAM,KAAK,KAAK,KAAK,CAAC,MAAM,eAAe,OAAQ;AACxD,WAAO;AACP,UAAM,aAAa,QAAQ,sBAAsB;AACjD,wBAAoB,UAAU;AAC9B,UAAM,SAAS,QAAQ,SAAS;AAChC,UAAM,cAAc,QAAQ,SAAS;AACrC,UAAM,iBAAiB,QAAQ,SAAS;AACxC,UAAM,cAA2B,EAAE,IAAI,QAAQ,MAAM,QAAQ,SAAS,MAAM,KAAK,KAAK,GAAG,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,SAAS,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,aAAa,MAAM,YAAY;AAC9Q,UAAM,mBAAgC,EAAE,IAAI,aAAa,MAAM,aAAa,SAAS,IAAI,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,SAAS,OAAO,OAAO,CAAC,EAAE;AACxJ,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,UAAU,0BAA0B,QAAQ,UAAU,aAAa,gBAAgB,GAAG,oBAAoB,aAAa,UAAU,aAAa,OAAO,KAAK,EAAE;AAC/L,oBAAgB,IAAI;AACpB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,MAAM,KAAK,KAAK,GAAG,UAAU,SAAS,QAAQ,kBAAkB,QAAW,eAAe,MAAM,eAAe,kBAAkB,MAAM,kBAAkB,gBAAgB,QAAQ,WAAW,OAAO,GAAG,YAAY;AACnQ,aAAO,CAAC,aAAa,EAAE,GAAG,SAAS,gBAAgB,OAAO,YAAY,QAAQ,gBAAgB,aAAa,OAAO,WAAW,OAAO,QAAQ,QAAQ,aAAa,QAAQ,OAAO,QAAQ,UAAU,OAAO,WAAW,iBAAiB,QAAQ,SAAS,EAAE;AACxP,UAAI,OAAO,SAAU,OAAM,eAAe;AAAA,IAC5C,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,EAAG,QAAO,CAAC,aAAa,EAAE,GAAG,SAAS,OAAO,UAAU,UAAU,oBAAoB,KAAK,EAAE;AAAA,IACpH,UAAE;AACA,sBAAgB,KAAK;AACrB,UAAI,oBAAoB,YAAY,WAAY,qBAAoB,UAAU;AAAA,IAChF;AAAA,EACF,GAAG,CAAC,QAAQ,cAAc,QAAQ,gBAAgB,SAAS,MAAM,CAAC;AAElE,QAAM,iBAAuB,mBAAY,MAAM;AAC7C,WAAO;AACP,WAAO,CAAC,aAAa,EAAE,GAAG,uBAAuB,SAAS,QAAQ,QAAQ,EAAE;AAAA,EAC9E,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,QAAM,eAAqB,mBAAY,OAAO,aAAqB;AACjE,UAAM,OAAO,QAAQ,OAAO,EAAE,UAAU,gBAAgB,QAAQ,SAAS,EAAE,CAAC;AAC5E,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,gBAAgB,QAAQ,mBAAmB,WAAW,OAAO,QAAQ,gBAAgB,UAAU,QAAQ,mBAAmB,WAAW,CAAC,IAAI,QAAQ,UAAU,SAAS,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,OAAO,QAAQ,EAAE,EAAE;AAAA,EACvQ,GAAG,CAAC,QAAQ,SAAS,MAAM,CAAC;AAE5B,QAAM,YAAkB,mBAAY,YAAY;AAC9C,UAAM,QAAQ,SAAS,QAAQ;AAC/B,QAAI,CAAC,MAAO;AACZ,UAAM,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAgB,QAAQ,SAAS,EAAE,CAAC;AACtE,WAAO;AACP,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,aAAa,MAAM,UAAU,aAAa,oBAAoB,KAAK,EAAE;AAAA,EAC1G,GAAG,CAAC,QAAQ,QAAQ,SAAS,MAAM,CAAC;AAEpC,QAAM,aAAmB,mBAAY,OAAO,MAAoB,QAAoB,YAAqB;AACvG,UAAM,QAAQ,SAAS,QAAQ,eAAe,SAAS,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,MAAM,SAAS,IAAI,CAAC,GAAG;AACzH,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,uCAAuC;AACnE,UAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,aAAa,KAAK,aAAa,QAAQ,SAAS,gBAAgB,QAAQ,SAAS,EAAE,CAAC;AACrI,UAAM,UAAU,OAAO,UAAU,KAAK;AAAA,EACxC,GAAG,CAAC,WAAW,QAAQ,OAAO,CAAC;AAE/B,QAAM,YAAkB,mBAAY,YAAY;AAC9C,UAAM,SAAS,SAAS,QAAQ,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS,QAAQ,cAAc;AAClG,QAAI,CAAC,QAAQ,oBAAqB;AAClC,sBAAkB,IAAI;AACtB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,IAAI,EAAE,UAAU,OAAO,IAAI,OAAO,UAAU,iBAAiB,OAAO,qBAAqB,kBAAkB,KAAK,CAAC;AACrJ,YAAM,QAAQ,uBAAuB,MAAM;AAC3C,aAAO,CAAC,aAAa,EAAE,GAAG,SAAS,UAAU,CAAC,GAAG,OAAO,GAAG,QAAQ,SAAS,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE,CAAC,CAAC,GAAG,SAAS,QAAQ,QAAQ,IAAI,CAAC,SAAS,KAAK,OAAO,OAAO,KAAK,EAAE,GAAG,MAAM,eAAe,QAAQ,OAAO,QAAQ,QAAQ,GAAG,qBAAqB,OAAO,QAAQ,0BAA0B,KAAK,IAAI,IAAI,EAAE,EAAE;AAAA,IAC7V,UAAE;AAAU,wBAAkB,KAAK;AAAA,IAAG;AAAA,EACxC,GAAG,CAAC,QAAQ,UAAU,MAAM,CAAC;AAE7B,QAAM,aAAmB,mBAAY,OAAO,YAAyB;AACnE,UAAM,QAAQ,SAAS,QAAQ,SAAS,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAClF,UAAM,OAAO,SAAS,QAAQ,SAAS,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AACpG,QAAI,KAAM,OAAM,OAAO,EAAE,MAAM,KAAK,SAAS,aAAa,KAAK,YAAY,CAAC;AAAA,EAC9E,GAAG,CAAC,MAAM,CAAC;AAEX,EAAM,iBAAU,MAAM;AAAE,SAAK,eAAe;AAAA,EAAG,GAAG,CAAC,cAAc,CAAC;AAClE,EAAM,iBAAU,MAAM;AACpB,UAAM,aAAa,QAAQ,sBAAsB;AACjD,SAAK,OAAO,QAAQ,OAAO,EAAE,QAAQ,WAAW,OAAO,GAAG,OAAO,UAA8B;AAC7F,UAAI,MAAM,UAAU,qBAAqB;AAAE,cAAM,eAAe;AAAG;AAAA,MAAQ;AAC3E,aAAO,CAAC,aAAa,EAAE,GAAG,SAAS,SAAS,wBAAwB,QAAQ,SAAS,KAAK,EAAE,EAAE;AAAA,IAChG,CAAC,EAAE,MAAM,CAAC,UAAU;AAAE,UAAI,CAAC,YAAY,KAAK,EAAG,QAAO,CAAC,aAAa,EAAE,GAAG,SAAS,MAAM,EAAE;AAAA,IAAG,CAAC;AAC9F,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,QAAQ,gBAAgB,SAAS,MAAM,CAAC;AAC5C,EAAM,iBAAU,MAAM;AACpB,UAAM,WAAW,QAAQ;AACzB,QAAI,YAAY,aAAa,SAAS,QAAQ,eAAgB,MAAK,WAAW,QAAQ;AAAA,EACxF,GAAG,CAAC,YAAY,QAAQ,cAAc,CAAC;AAEvC,QAAM,eAAe,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,cAAc,KAAK;AAC3F,QAAM,iBAAiB,gBAAgB,SACnC,MAAM,QAAQ,UAAU,iBACxB,MAAM,QAAQ,SAAS;AAC3B,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,eAAe,QAAQ,cAAc,aAAa;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC/SA,YAAYC,YAAW;AAKhB,SAAS,gBAAgB,UAA6C,CAAC,GAAG;AAC/E,QAAM,EAAE,QAAQ,sBAAsB,IAAI,mBAAmB;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAU,gBAA0B,CAAC,CAAC;AAChE,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAA6B;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkB,IAAI;AACtD,QAAM,gBAAsB,cAAwD,IAAI;AACxF,QAAM,OAAa,mBAAY,YAAY;AACzC,kBAAc,SAAS,MAAM;AAC7B,UAAM,aAAa,sBAAsB;AACzC,kBAAc,UAAU;AACxB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,KAAK,EAAE,GAAG,SAAS,QAAQ,WAAW,OAAO,CAAC;AAClF,iBAAW,OAAO,KAAK;AACvB,eAAS,OAAO,KAAK;AAAA,IACvB,SAAS,WAAW;AAClB,UAAI,CAAC,YAAY,SAAS,EAAG,UAAS,SAAS;AAAA,IACjD,UAAE;AACA,UAAI,cAAc,YAAY,YAAY;AACxC,sBAAc,UAAU;AACxB,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAC/D,EAAM,iBAAU,MAAM;AACpB,SAAK,KAAK;AACV,WAAO,MAAM,cAAc,SAAS,MAAM;AAAA,EAC5C,GAAG,CAAC,IAAI,CAAC;AACT,SAAO,EAAE,OAAO,WAAW,SAAS,MAAM,SAAS,MAAM;AAC3D;AAEO,SAAS,eAAe,UAAyB,UAAoF,CAAC,GAAG;AAC9I,QAAM,EAAE,QAAQ,sBAAsB,IAAI,mBAAmB;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAU,gBAA8B,IAAI;AACpE,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,QAAQ,QAAQ,CAAC;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkB,IAAI;AACtD,QAAM,gBAAsB,cAAwD,IAAI;AACxF,QAAM,OAAa,mBAAY,YAAY;AACzC,QAAI,CAAC,UAAU;AACb,oBAAc,SAAS,MAAM;AAC7B,oBAAc,UAAU;AACxB,gBAAU,IAAI;AACd,mBAAa,KAAK;AAClB,aAAO;AAAA,IACT;AACA,kBAAc,SAAS,MAAM;AAC7B,UAAM,aAAa,sBAAsB;AACzC,kBAAc,UAAU;AACxB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,IAAI,EAAE,UAAU,GAAG,SAAS,QAAQ,WAAW,OAAO,CAAC;AAC3F,gBAAU,MAAM;AAChB,aAAO;AAAA,IACT,SAAS,WAAW;AAClB,UAAI,CAAC,YAAY,SAAS,EAAG,UAAS,SAAS;AAC/C,aAAO;AAAA,IACT,UAAE;AACA,UAAI,cAAc,YAAY,YAAY;AACxC,sBAAc,UAAU;AACxB,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,QAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,OAAO,QAAQ,CAAC;AAC9G,EAAM,iBAAU,MAAM;AACpB,SAAK,KAAK;AACV,WAAO,MAAM,cAAc,SAAS,MAAM;AAAA,EAC5C,GAAG,CAAC,IAAI,CAAC;AACT,SAAO,EAAE,OAAO,WAAW,SAAS,MAAM,OAAO;AACnD;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,QAAQ,uBAAuB,SAAS,IAAI,mBAAmB;AACvE,QAAM,gBAAsB,cAAwD,IAAI;AACxF,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAS,KAAK;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkB,IAAI;AACtD,EAAM,iBAAU,MAAM,MAAM,cAAc,SAAS,MAAM,GAAG,CAAC,CAAC;AAC9D,QAAM,SAAe,mBAAY,MAAM;AACrC,kBAAc,SAAS,MAAM;AAC7B,kBAAc,UAAU;AACxB,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AACL,QAAM,SAAe,mBAAY,OAAO,OAAe,SAAwD,WAAoB;AACjI,WAAO;AACP,UAAM,aAAa,sBAAsB;AACzC,kBAAc,UAAU;AACxB,aAAS,IAAI;AACb,kBAAc,IAAI;AAClB,QAAI;AACF,aAAO,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,OAAO,GAAG,OAAO;AAAA,IACvF,SAAS,WAAW;AAClB,UAAI,CAAC,YAAY,SAAS,EAAG,UAAS,SAAS;AAC/C,YAAM;AAAA,IACR,UAAE;AACA,UAAI,cAAc,YAAY,WAAY,eAAc,UAAU;AAClE,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,MAAM,CAAC;AAC1C,QAAM,SAAe,mBAAY,OAAO,UAAkB;AACxD,UAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAgB,SAAS,EAAE,CAAC;AAC7E,WAAO;AACP,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,UAAU,MAAM,CAAC;AAC7B,SAAO,EAAE,QAAQ,QAAQ,QAAQ,OAAO,WAAW;AACrD;AAEO,SAAS,sBAAsB;AACpC,QAAM,EAAE,QAAQ,SAAS,IAAI,mBAAmB;AAChD,QAAM,CAAC,SAAS,UAAU,IAAU,gBAA2C,CAAC,CAAC;AACjF,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAS,KAAK;AAC1D,QAAM,SAAe,mBAAY,OAAO,UAAoH;AAC1J,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,YAAY,OAAO,EAAE,QAAQ,OAAyB,UAAU,MAAM,UAAU,gBAAgB,SAAS,GAAG,QAAQ,MAAM,OAAO,CAAC;AAC9J,iBAAW,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE;AAC7D,aAAO,iCAAiC,MAAM;AAAA,IAChD,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,SAAO,EAAE,aAAa,QAAQ,QAAQ;AACxC;AAEO,SAAS,eAAe;AAC7B,QAAM,EAAE,QAAQ,SAAS,IAAI,mBAAmB;AAChD,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAS,KAAK;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAkC,IAAI;AAChF,QAAM,SAAe,mBAAY,OAAO,UAAkH;AACxJ,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,GAAG,OAAO,gBAAgB,SAAS,EAAE,CAAC;AAChF,oBAAc,MAAM;AACpB,aAAO;AAAA,IACT,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,SAAO,EAAE,aAAa,YAAY,OAAO;AAC3C;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,QAAQ,SAAS,IAAI,mBAAmB;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAU,gBAAS,KAAK;AAC9D,QAAM,qBAA2B,mBAAY,OAAO,UAA+L;AACjP,qBAAiB,IAAI;AACrB,QAAI;AAAE,aAAO,MAAM,OAAO,IAAI,mBAAmB,EAAE,GAAG,OAAO,gBAAgB,SAAS,EAAE,CAAC;AAAA,IAAG,UAC5F;AAAU,uBAAiB,KAAK;AAAA,IAAG;AAAA,EACrC,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,QAAM,iBAAuB,mBAAY,OAAO,UAC9C,OAAO,IAAI,eAAe,EAAE,GAAG,OAAO,gBAAgB,SAAS,EAAE,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACzF,SAAO,EAAE,eAAe,gBAAgB,mBAAmB;AAC7D;","names":["React","React"]}
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/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 | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\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 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),\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 { 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: \"idle\" | \"streaming\" | \"reconnecting\" | \"paused\" | \"cancelling\" | \"completed\" | \"cancelled\" | \"failed\";\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): StoredChatThread[] {\n if (!activeThreadId || incoming.some((thread) => thread.id === activeThreadId)) {\n return incoming;\n }\n const active = current.find((thread) => thread.id === activeThreadId);\n return active?.isHydrated ? [active, ...incoming] : incoming;\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 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 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: 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 ? 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 (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 { chatAttachmentIds, getThreadActivity, latestThreadContext, threadDetailToMessages } from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport {\n isCurrentThreadOpenRequest,\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n appendStableStreamingTurn,\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 requestedModelId?: 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 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 const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\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 ),\n };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\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(\"A newer thread was selected.\");\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 (!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 eventBuffer.push(event);\n }, [eventBuffer]);\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) 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 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: input.attachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n clearOperationError();\n update((current) => ({ ...current, messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage), streamingMessageId: assistantId, runState: \"streaming\", error: null }));\n setIsSubmitting(true);\n try {\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds: input.attachmentIds, requestedModelId: input.requestedModelId, idempotencyKey, signal: controller.signal }, consumeEvent);\n update((current) => ({ ...current, activeThreadId: result.threadId || current.activeThreadId, activeRunId: result.detached ? result.runId : current.activeRunId, cursor: result.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (result.threadId) await refreshThreads().catch(() => undefined);\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", streamingMessageId: null }));\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, 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 client.threads.events({ signal: controller.signal }, async (event: ThreadSummaryEvent) => {\n if (event.event === \"snapshot_required\") {\n clearBackgroundError();\n await refreshThreads();\n return;\n }\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n }).catch((error) => {\n if (!isAbortLike(error)) update((current) => withAgentChatBackgroundError(current, error));\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","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; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const results = await client.attachments.uploadBatch({ uploads: input.uploads as readonly PortableUpload[], threadId: input.threadId, 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"]}
@@ -0,0 +1,11 @@
1
+ export declare function resolveInitialActiveThreadId(options: {
2
+ activeThreadId?: string | null;
3
+ }, storedThreadId: string | null): string | null;
4
+ export declare function shouldHydrateSelectedThread(selectedThreadId: string | null | undefined, activeThreadId: string | null, activeThreadIsHydrated: boolean): boolean;
5
+ export declare function isCurrentThreadOpenRequest(input: {
6
+ activeThreadId: string | null;
7
+ currentGeneration: number;
8
+ requestGeneration: number;
9
+ requestedThreadId: string;
10
+ signalAborted: boolean;
11
+ }): boolean;