@agents24/chat-react 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/controller.ts","../src/controller-actions.ts","../src/context-window.ts","../src/model.ts","../src/controller-helpers.ts","../src/message-lifecycle.ts","../src/latest-thread-scroller.tsx","../src/renderers.tsx","../src/sse.ts","../src/streaming-text.ts","../src/transport.ts","../src/viewport.ts"],"sourcesContent":["export * from \"./controller\";\nexport * from \"./context-window\";\nexport * from \"./latest-thread-scroller\";\nexport * from \"./message-lifecycle\";\nexport * from \"./model\";\nexport * from \"./renderers\";\nexport * from \"./sse\";\nexport * from \"./streaming-text\";\nexport * from \"./transport\";\nexport * from \"./types\";\nexport * from \"./viewport\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useControllerMessageActions } from \"./controller-actions\";\nimport { mergeContextWindowUpdate } from \"./context-window\";\nimport { abortDetachedStream, applyThreadSummaryEvent, isAbortError, isThreadNotFoundError, mergeStoredThreadsForRefresh, threadSummaryToStored, type ChatRuntimeEventContext, type FinalizeInput } from \"./controller-helpers\";\nimport { upsertStableAssistantMessage } from \"./message-lifecycle\";\nimport { activeRunIdFromThread, activeRunIdFromThreadDetail, assistantTextFromResponseBlocks, autoAttachRunIdFromThread, createChatId, DEFAULT_THREAD_PAGE_SIZE, hasStaleUnfinishedAssistantCache, latestContextWindowFromThread, mergeReasoningSteps, partsFromResponseBlocks, reasoningStepsFromParts, threadActivityDate, threadDetailToMessages, threadPaging, titleFromMessage } from \"./model\";\nimport type { ChatAttachment, ChatContextWindow, ChatController, ChatMessage, ChatPart, ChatReasoningStep, ChatRuntimeEvent, ChatStorageAdapter, ChatStreamResult, ChatSubmitMessage, ChatTransport } from \"./types\";\nimport type { StoredChatThread } from \"./types\";\nexport { mergeStoredThreadsForRefresh } from \"./controller-helpers\";\nexport type UseAgents24ChatControllerOptions = {\n transport: ChatTransport;\n storage: ChatStorageAdapter;\n activeThreadId?: string | null;\n pageSize?: number;\n storageKey?: unknown;\n createId?: () => string;\n onActiveThreadIdChange?: (threadId: string | null) => void;\n onSourceClick?: (citations: ChatMessage[\"citations\"]) => void;\n onStreamErrorMessage?: (error: unknown) => string;\n onRuntimeEvent?: (event: ChatRuntimeEvent, context: ChatRuntimeEventContext) => void | Promise<void>;\n onThreadDetailLoaded?: (detail: unknown) => void | Promise<void>;\n};\nexport function useAgents24ChatController({\n transport,\n storage,\n activeThreadId: controlledActiveThreadId,\n pageSize = DEFAULT_THREAD_PAGE_SIZE,\n storageKey,\n createId = createChatId,\n onActiveThreadIdChange,\n onSourceClick,\n onStreamErrorMessage,\n onRuntimeEvent,\n onThreadDetailLoaded,\n}: UseAgents24ChatControllerOptions): ChatController {\n const activeThreadId = controlledActiveThreadId ?? storage.getActiveThreadId?.() ?? null;\n const initialCached = activeThreadId ? storage.getThread(activeThreadId) : undefined;\n const [messages, setMessages] = useState<ChatMessage[]>(() => initialCached?.messages || []);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingHistory, setIsLoadingHistory] = useState(() => Boolean(activeThreadId) && !initialCached?.messages?.length);\n const [isLoadingOlder, setIsLoadingOlder] = useState(false);\n const [hasOlderTurns, setHasOlderTurns] = useState(Boolean(initialCached?.hasOlderTurns));\n const [streamingContent, setStreamingContent] = useState(\"\");\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [contextStatus, setContextStatus] = useState<ChatContextWindow | null>(null);\n const [currentReasoning, setCurrentReasoning] = useState<ChatReasoningStep[]>([]);\n const [liked, setLiked] = useState<Record<string, boolean>>({});\n const [disliked, setDisliked] = useState<Record<string, boolean>>({});\n const [copiedMessageId, setCopiedMessageId] = useState<string | null>(null);\n const [lastThinkingDurationMs, setLastThinkingDurationMs] = useState<number | null>(null);\n const [threads, setThreads] = useState<StoredChatThread[]>(() => storage.listThreads());\n const [isRefreshingThreads, setIsRefreshingThreads] = useState(false);\n const [isSelectingThread, setIsSelectingThread] = useState(false);\n const [activeRunId, setActiveRunId] = useState<string | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const activeThreadIdRef = useRef<string | null>(activeThreadId);\n const messagesRef = useRef<ChatMessage[]>(messages);\n const nextBeforeTurnIndexRef = useRef<number | null>(initialCached?.nextBeforeTurnIndex ?? null);\n const hasOlderTurnsRef = useRef(Boolean(initialCached?.hasOlderTurns));\n const isLoadingOlderRef = useRef(false);\n const loadedThreadIdRef = useRef<string | null>(initialCached?.messages?.length ? activeThreadId : null);\n const requestSeqRef = useRef(0);\n const isLoadingHistoryRef = useRef(isLoadingHistory);\n const activeRunIdRef = useRef<string | null>(null);\n const reattachedRunIdRef = useRef<string | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const [lifecycleAbortController] = useState(() => new AbortController());\n const streamingContentRef = useRef(\"\");\n const streamingMessageIdRef = useRef<string | null>(null);\n const reasoningRef = useRef<ChatReasoningStep[]>([]);\n const liveVoiceIdsRef = useRef<{ user?: string; assistant?: string }>({});\n const refreshSeqRef = useRef(0);\n const threadEventsCursorRef = useRef<number | null>(null);\n const setActiveRunIdValue = useCallback((runId: string | null) => {\n activeRunIdRef.current = runId;\n setActiveRunId(runId);\n }, []);\n\n const syncThreadsFromStorage = useCallback(() => {\n setThreads(storage.listThreads());\n }, [storage]);\n\n const upsertStoredThread = useCallback(\n (thread: StoredChatThread) => {\n storage.upsertThread(thread);\n syncThreadsFromStorage();\n },\n [storage, syncThreadsFromStorage]\n );\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n const persistThread = useCallback(\n (\n threadId: string,\n nextMessages: ChatMessage[],\n paging?: { hasOlderTurns?: boolean; nextBeforeTurnIndex?: number | null },\n options?: { updatedAt?: string; touch?: boolean }\n ) => {\n const existing = storage.getThread(threadId);\n const firstUser = nextMessages.find((message) => message.role === \"user\");\n upsertStoredThread({\n ...(existing || {}),\n id: threadId,\n title: existing?.title || (firstUser ? titleFromMessage(firstUser.content, firstUser.attachments || []) : \"New chat\"),\n updated_at: options?.updatedAt || (options?.touch ? new Date().toISOString() : existing?.updated_at) || new Date().toISOString(),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging?.hasOlderTurns ?? hasOlderTurnsRef.current,\n nextBeforeTurnIndex: paging?.nextBeforeTurnIndex ?? nextBeforeTurnIndexRef.current,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const markThreadRunStatus = useCallback(\n (threadId: string, runId: string, status: string, lastEventSeq?: number | null) => {\n const existing = storage.getThread(threadId);\n if (!existing || !runId) return;\n upsertStoredThread({\n ...existing,\n last_run_id: runId,\n last_run_status: status,\n active_run: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastEventSeq: typeof lastEventSeq === \"number\" ? lastEventSeq : existing.lastEventSeq ?? null,\n isRunning: activeRunIdFromThread({\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: { run_id: runId, status },\n }) !== null,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const refresh = useCallback(async () => {\n const seq = ++refreshSeqRef.current;\n setIsRefreshingThreads(true);\n try {\n const data = await transport.listThreads({ signal: lifecycleAbortController.signal });\n if (lifecycleAbortController.signal.aborted) return;\n if (seq !== refreshSeqRef.current) return;\n const nextThreads = (data.items || []).map((item) => threadSummaryToStored(item));\n storage.setThreads(mergeStoredThreadsForRefresh(storage.listThreads(), nextThreads));\n setThreads(storage.listThreads());\n } finally {\n if (!lifecycleAbortController.signal.aborted && seq === refreshSeqRef.current) setIsRefreshingThreads(false);\n }\n }, [lifecycleAbortController, storage, transport]);\n\n const applyThreadId = useCallback(\n (threadId: string, baseMessages: ChatMessage[]) => {\n if (!threadId || activeThreadIdRef.current === threadId) return;\n activeThreadIdRef.current = threadId;\n persistThread(threadId, messagesRef.current.length > 0 ? messagesRef.current : baseMessages, undefined, { touch: true });\n storage.setActiveThreadId?.(threadId);\n onActiveThreadIdChange?.(threadId);\n },\n [onActiveThreadIdChange, persistThread, storage]\n );\n\n const setStreamingText = (value: string) => {\n streamingContentRef.current = value;\n setStreamingContent(value);\n };\n\n const setLoadingHistory = useCallback((value: boolean) => {\n isLoadingHistoryRef.current = value;\n setIsLoadingHistory(value);\n }, []);\n\n const setReasoningSteps = useCallback((value: ChatReasoningStep[]) => {\n reasoningRef.current = value || [];\n setCurrentReasoning(value || []);\n }, []);\n\n const detachActiveStream = useCallback(() => {\n const controller = abortControllerRef.current;\n abortControllerRef.current = null;\n abortDetachedStream(controller);\n setActiveRunIdValue(null);\n reattachedRunIdRef.current = null;\n streamingMessageIdRef.current = null;\n streamingContentRef.current = \"\";\n reasoningRef.current = [];\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingContent(\"\");\n setCurrentReasoning([]);\n }, [setActiveRunIdValue]);\n\n const clearMissingThread = useCallback(\n (threadId: string) => {\n storage.deleteThread?.(threadId);\n syncThreadsFromStorage();\n if (activeThreadIdRef.current !== threadId) return;\n\n requestSeqRef.current += 1;\n detachActiveStream();\n activeThreadIdRef.current = null;\n loadedThreadIdRef.current = null;\n nextBeforeTurnIndexRef.current = null;\n hasOlderTurnsRef.current = false;\n storage.setActiveThreadId?.(null);\n onActiveThreadIdChange?.(null);\n setMessages([]);\n messagesRef.current = [];\n setHasOlderTurns(false);\n setIsLoadingOlder(false);\n setContextStatus(null);\n setLoadingHistory(false);\n },\n [detachActiveStream, onActiveThreadIdChange, setLoadingHistory, storage, syncThreadsFromStorage]\n );\n\n const setLiveAssistantMessage = useCallback(\n (input: {\n messageId: string;\n runId?: string | null;\n content: string;\n reasoning: ChatReasoningStep[];\n parts?: ChatPart[];\n baseMessages?: ChatMessage[];\n }) => {\n setMessages((prev) => {\n const next = upsertStableAssistantMessage(prev, {\n baseMessages: input.baseMessages,\n messageId: input.messageId,\n runId: input.runId,\n create: () => ({\n id: input.messageId,\n role: \"assistant\",\n runId: input.runId ?? null,\n content: input.content,\n createdAt: new Date(),\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts || [],\n }),\n update: (message) => ({\n ...message,\n runId: input.runId ?? message.runId ?? null,\n content: input.content,\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts ?? message.parts,\n }),\n });\n messagesRef.current = next;\n return next;\n });\n },\n []\n );\n\n const finalizeAssistantMessage = useCallback(\n (input: FinalizeInput) => {\n const content = input.error || input.assistantText.trim();\n if (!content) return input.baseMessages;\n const existingIndex = input.baseMessages.findIndex(\n (message) => (input.messageId && message.id === input.messageId) || (input.runId && message.role === \"assistant\" && message.runId === input.runId)\n );\n const existing = existingIndex >= 0 ? input.baseMessages[existingIndex] : undefined;\n const parts =\n input.parts ||\n existing?.parts ||\n partsFromResponseBlocks(undefined, content);\n const assistant: ChatMessage = {\n id: existing?.id || input.messageId || createId(),\n role: \"assistant\",\n runId: input.runId ?? existing?.runId ?? null,\n content,\n createdAt: new Date(),\n isFinal: true,\n parts,\n reasoningSteps: mergeReasoningSteps(input.reasoning, { finalize: true }),\n thinkingDurationMs: input.thinkingDurationMs,\n };\n const completed = upsertStableAssistantMessage(input.baseMessages, {\n messageId: input.messageId,\n runId: input.runId,\n create: () => assistant,\n update: (message) => ({\n ...message,\n ...assistant,\n id: message.id,\n createdAt: message.createdAt,\n }),\n });\n setMessages(completed);\n messagesRef.current = completed;\n if (input.threadId) {\n persistThread(input.threadId, completed);\n const existingThread = storage.getThread(input.threadId);\n if (existingThread && input.runId) {\n upsertStoredThread({\n ...existingThread,\n messages: completed,\n last_run_id: input.runId,\n last_run_status: input.error ? \"failed\" : \"completed\",\n active_run: null,\n lastRunId: input.runId,\n lastRunStatus: input.error ? \"failed\" : \"completed\",\n activeRun: null,\n isRunning: false,\n });\n }\n }\n return completed;\n },\n [createId, persistThread, storage, upsertStoredThread]\n );\n\n const loadThread = useCallback(\n async (threadId: string) => {\n const seq = ++requestSeqRef.current;\n setLoadingHistory(true);\n setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n includeRunEvents: false,\n signal: lifecycleAbortController.signal,\n });\n if (activeThreadIdRef.current !== threadId || seq !== requestSeqRef.current) return;\n void onThreadDetailLoaded?.(detail);\n const nextMessages = threadDetailToMessages(detail);\n const paging = threadPaging(detail);\n setContextStatus(latestContextWindowFromThread(detail));\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n setHasOlderTurns(paging.hasOlderTurns);\n hasOlderTurnsRef.current = paging.hasOlderTurns;\n nextBeforeTurnIndexRef.current = paging.nextBeforeTurnIndex;\n loadedThreadIdRef.current = threadId;\n upsertStoredThread({\n ...threadSummaryToStored(detail),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging.hasOlderTurns,\n nextBeforeTurnIndex: paging.nextBeforeTurnIndex,\n updated_at: threadActivityDate(detail),\n });\n } catch (error) {\n if (isAbortError(error)) return;\n if (isThreadNotFoundError(error)) {\n clearMissingThread(threadId);\n return;\n }\n throw error;\n } finally {\n if (!lifecycleAbortController.signal.aborted && activeThreadIdRef.current === threadId && seq === requestSeqRef.current) setLoadingHistory(false);\n }\n },\n [clearMissingThread, lifecycleAbortController, onThreadDetailLoaded, pageSize, setLoadingHistory, transport, upsertStoredThread]\n );\n\n const loadOlderTurns = useCallback(async () => {\n const threadId = activeThreadIdRef.current;\n const beforeTurnIndex = nextBeforeTurnIndexRef.current;\n if (!threadId || beforeTurnIndex === null || isLoadingOlderRef.current) return;\n isLoadingOlderRef.current = true;\n setIsLoadingOlder(true);\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n beforeTurnIndex,\n includeRunEvents: false,\n signal: lifecycleAbortController.signal,\n });\n if (activeThreadIdRef.current !== threadId) return;\n const older = threadDetailToMessages(detail);\n const paging = threadPaging(detail);\n const next = [...older, ...messagesRef.current];\n setMessages(next);\n messagesRef.current = next;\n setHasOlderTurns(paging.hasOlderTurns);\n hasOlderTurnsRef.current = paging.hasOlderTurns;\n nextBeforeTurnIndexRef.current = paging.nextBeforeTurnIndex;\n persistThread(threadId, next, paging);\n } catch (error) {\n if (isAbortError(error)) return;\n if (isThreadNotFoundError(error)) {\n clearMissingThread(threadId);\n return;\n }\n throw error;\n } finally {\n if (!lifecycleAbortController.signal.aborted && activeThreadIdRef.current === threadId) setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n }\n }, [clearMissingThread, lifecycleAbortController, pageSize, persistThread, transport]);\n\n const handleStreamEvent = useCallback(\n (input: { mode: \"submit\" | \"attach\"; event: ChatRuntimeEvent; assistantMessageId: string; startedAt: number; streamThreadIdRef: { current: string | null }; baseMessages: ChatMessage[] }) => {\n const { mode, event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages } = input;\n const payload = event.payload || {};\n const responseBlocks = Array.isArray(payload.response_blocks) ? (payload.response_blocks as Array<Record<string, unknown>>) : null;\n if (event.run_id) setActiveRunIdValue(event.run_id);\n void onRuntimeEvent?.(event, {\n mode,\n assistantMessageId,\n threadId: streamThreadIdRef.current,\n runId: event.run_id || activeRunIdRef.current,\n startedAt,\n });\n setContextStatus((current) => mergeContextWindowUpdate(current, payload.context_window));\n if (responseBlocks) {\n const blockText = String(payload.assistant_output_text || \"\") || assistantTextFromResponseBlocks(responseBlocks) || streamingContentRef.current;\n if (blockText) setStreamingText(blockText);\n const parts = partsFromResponseBlocks(responseBlocks, blockText);\n const reasoning = mergeReasoningSteps([...reasoningRef.current, ...reasoningStepsFromParts(parts)]);\n setReasoningSteps(reasoning);\n setLiveAssistantMessage({\n messageId: assistantMessageId,\n runId: event.run_id || activeRunIdRef.current,\n content: blockText,\n reasoning,\n parts,\n baseMessages,\n });\n }\n if (event.event === \"run.accepted\" || event.event === \"run.snapshot\") {\n const nextThreadId = String(payload.thread_id || streamThreadIdRef.current || \"\");\n if (nextThreadId) {\n streamThreadIdRef.current = nextThreadId;\n applyThreadId(nextThreadId, baseMessages);\n markThreadRunStatus(nextThreadId, event.run_id || activeRunIdRef.current || \"\", String(payload.status || \"running\"), typeof payload.last_event_seq === \"number\" ? payload.last_event_seq : null);\n }\n return;\n }\n const isTerminal = event.event === \"run.completed\" || event.event === \"run.cancelled\" || event.event === \"reshet.stream.result\";\n const isFailed = event.event === \"run.failed\" || event.event.endsWith(\".stream.error\");\n if (!isTerminal && !isFailed) return;\n const terminalThreadId = String(payload.thread_id || \"\");\n if (terminalThreadId && !streamThreadIdRef.current) {\n streamThreadIdRef.current = terminalThreadId;\n applyThreadId(terminalThreadId, baseMessages);\n }\n const finalText = String(payload.assistant_output_text || assistantTextFromResponseBlocks(responseBlocks || []) || streamingContentRef.current || \"\");\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current || activeThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: finalText,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: event.run_id || activeRunIdRef.current,\n parts: responseBlocks ? partsFromResponseBlocks(responseBlocks, finalText) : undefined,\n error: isFailed\n ? String(payload.message || payload.error || event.diagnostics?.[0]?.message || onStreamErrorMessage?.(event) || \"The chat run failed.\")\n : undefined,\n });\n },\n [applyThreadId, finalizeAssistantMessage, markThreadRunStatus, onRuntimeEvent, onStreamErrorMessage, setActiveRunIdValue, setLiveAssistantMessage, setReasoningSteps]\n );\n\n const runStream = useCallback(\n async (input: { mode: \"submit\"; message: ChatSubmitMessage } | { mode: \"attach\"; threadId: string; runId: string }) => {\n const startedAt = Date.now();\n const controller = new AbortController();\n requestSeqRef.current += 1;\n abortControllerRef.current = controller;\n setIsLoading(true);\n setStreamingText(\"\");\n setReasoningSteps([{ label: input.mode === \"attach\" ? \"Reconnecting\" : \"Connecting\", status: \"active\" }]);\n const streamThreadIdRef = { current: input.mode === \"attach\" ? input.threadId : activeThreadIdRef.current };\n const attachAssistantMessage = input.mode === \"attach\"\n ? [...messagesRef.current]\n .reverse()\n .find(\n (message) =>\n message.role === \"assistant\" &&\n (message.runId === input.runId || message.isFinal === false)\n )\n : undefined;\n let assistantMessageId = input.mode === \"attach\"\n ? attachAssistantMessage?.id || `${input.runId}-assistant`\n : createId();\n let baseMessages = messagesRef.current;\n if (input.mode === \"submit\") {\n const userMessage: ChatMessage = {\n id: createId(),\n role: \"user\",\n content: input.message.text,\n createdAt: new Date(),\n parts: input.message.text\n ? [{ id: createId(), type: \"text\", kind: \"text\", text: input.message.text }]\n : [],\n attachments: input.message.files,\n };\n baseMessages = [...messagesRef.current, userMessage];\n }\n if (!messagesRef.current.some((message) => message.id === assistantMessageId)) {\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n isFinal: false,\n parts: [],\n reasoningSteps: [],\n };\n const liveMessages: ChatMessage[] = [...baseMessages, assistantMessage];\n setMessages(liveMessages);\n messagesRef.current = liveMessages;\n } else if (input.mode === \"attach\" && attachAssistantMessage) {\n const nextMessages = messagesRef.current.map((message) =>\n message.id === attachAssistantMessage.id\n ? { ...message, runId: message.runId || input.runId, isFinal: false }\n : message\n );\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n baseMessages = nextMessages;\n if (streamThreadIdRef.current) persistThread(streamThreadIdRef.current, nextMessages);\n }\n streamingMessageIdRef.current = assistantMessageId;\n setStreamingMessageId(assistantMessageId);\n if (streamThreadIdRef.current) {\n persistThread(\n streamThreadIdRef.current,\n messagesRef.current.length > 0 ? messagesRef.current : baseMessages,\n undefined,\n { touch: input.mode === \"submit\" }\n );\n }\n try {\n let streamResult: ChatStreamResult | null = null;\n if (input.mode === \"attach\") {\n setActiveRunIdValue(input.runId);\n reattachedRunIdRef.current = input.runId;\n streamResult = await transport.attachRun({ runId: input.runId, signal: controller.signal }, (event) =>\n handleStreamEvent({ mode: \"attach\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n } else {\n streamResult = await transport.streamMessage(\n { ...input.message, files: input.message.files || [], threadId: activeThreadIdRef.current, signal: controller.signal },\n (event) => handleStreamEvent({ mode: \"submit\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n }\n if (streamResult?.runId) setActiveRunIdValue(streamResult.runId);\n if (streamResult?.threadId) {\n streamThreadIdRef.current = streamResult.threadId;\n applyThreadId(streamResult.threadId, baseMessages);\n if (streamResult.runId) {\n markThreadRunStatus(streamResult.threadId, streamResult.runId, \"running\");\n }\n }\n if (streamingContentRef.current.trim() && streamingMessageIdRef.current) {\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: streamingContentRef.current,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: activeRunIdRef.current,\n });\n }\n await refresh().catch(() => undefined);\n } catch (error) {\n if (!isAbortError(error)) {\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: streamingContentRef.current,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: activeRunIdRef.current,\n error: onStreamErrorMessage?.(error) || (error as Error).message || \"Failed to reach the chat agent.\",\n });\n }\n } finally {\n const isCurrentStream =\n abortControllerRef.current === controller ||\n streamingMessageIdRef.current === assistantMessageId;\n if (abortControllerRef.current === controller) abortControllerRef.current = null;\n if (isCurrentStream) {\n setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n reattachedRunIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n setLastThinkingDurationMs(Date.now() - startedAt);\n }\n }\n },\n [createId, finalizeAssistantMessage, handleStreamEvent, onStreamErrorMessage, persistThread, refresh, setActiveRunIdValue, setReasoningSteps, transport]\n );\n\n const handleSubmit = useCallback(\n async (message: ChatSubmitMessage) => {\n if (!message.text.trim() && !(message.files || []).length) return;\n await runStream({ mode: \"submit\", message });\n },\n [runStream]\n );\n const attachRun = useCallback(async (runId: string, threadId?: string | null) => {\n const resolvedThreadId = threadId ?? activeThreadIdRef.current;\n if (runId && resolvedThreadId) await runStream({ mode: \"attach\", runId, threadId: resolvedThreadId });\n }, [runStream]);\n const handleStop = useCallback(() => {\n const runId = activeRunIdRef.current;\n const partial = streamingContentRef.current;\n const liveMessageId = streamingMessageIdRef.current;\n abortDetachedStream(abortControllerRef.current);\n abortControllerRef.current = null;\n setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n if (runId) transport.cancelRun({ runId, assistantOutputText: partial }).catch(() => undefined);\n if (partial.trim()) {\n finalizeAssistantMessage({\n threadId: activeThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: partial,\n reasoning: reasoningRef.current,\n thinkingDurationMs: lastThinkingDurationMs || 0,\n messageId: liveMessageId,\n });\n }\n }, [finalizeAssistantMessage, lastThinkingDurationMs, setActiveRunIdValue, setReasoningSteps, transport]);\n\n useEffect(() => {\n refresh().catch((error) => {\n if (!isAbortError(error) && !lifecycleAbortController.signal.aborted) {\n setThreads(storage.listThreads());\n }\n });\n }, [lifecycleAbortController, refresh, storage]);\n\n useEffect(() => {\n return () => {\n lifecycleAbortController.abort();\n abortDetachedStream(abortControllerRef.current);\n abortControllerRef.current = null;\n };\n }, [lifecycleAbortController]);\n\n useEffect(() => {\n if (!transport.subscribeThreadEvents) return;\n let cancelled = false;\n let retryTimeout: ReturnType<typeof setTimeout> | null = null;\n let controller: AbortController | null = null;\n\n const connect = () => {\n if (cancelled) return;\n controller = new AbortController();\n transport.subscribeThreadEvents?.(\n { cursor: threadEventsCursorRef.current, signal: controller.signal },\n async (event) => {\n if (typeof event.cursor === \"number\") threadEventsCursorRef.current = event.cursor;\n if (event.event === \"snapshot_required\") {\n await refresh().catch(() => undefined);\n return;\n }\n const next = applyThreadSummaryEvent(storage.listThreads(), event);\n storage.setThreads(next);\n setThreads(storage.listThreads());\n }\n ).catch((error) => {\n if (cancelled || isAbortError(error)) return;\n retryTimeout = setTimeout(connect, 1500);\n });\n };\n\n connect();\n return () => {\n cancelled = true;\n if (retryTimeout) clearTimeout(retryTimeout);\n controller?.abort();\n };\n }, [refresh, storage, transport]);\n\n useEffect(() => {\n syncThreadsFromStorage();\n }, [storageKey, syncThreadsFromStorage]);\n\n useEffect(() => {\n const previous = activeThreadIdRef.current;\n activeThreadIdRef.current = activeThreadId;\n if (\n activeThreadId &&\n previous === activeThreadId &&\n (activeRunIdRef.current || streamingMessageIdRef.current)\n ) {\n return;\n }\n if (previous && previous !== activeThreadId && abortControllerRef.current) {\n detachActiveStream();\n }\n if (!activeThreadId) {\n if (\n previous === null &&\n loadedThreadIdRef.current === null &&\n messagesRef.current.length === 0 &&\n !hasOlderTurnsRef.current &&\n !isLoadingHistoryRef.current &&\n !isLoadingOlderRef.current &&\n nextBeforeTurnIndexRef.current === null\n ) {\n return;\n }\n requestSeqRef.current += 1;\n loadedThreadIdRef.current = null;\n setMessages([]);\n messagesRef.current = [];\n setHasOlderTurns(false);\n setIsLoadingOlder(false);\n setContextStatus(null);\n nextBeforeTurnIndexRef.current = null;\n setLoadingHistory(false);\n return;\n }\n const cached = storage.getThread(activeThreadId);\n const cachedMessages = cached?.isHydrated && cached.messages?.length ? cached.messages : null;\n const hasCachedMessages = Boolean(cachedMessages);\n const shouldRefreshStaleCache = hasCachedMessages && hasStaleUnfinishedAssistantCache(cached);\n if (cached && cachedMessages) {\n setMessages(cachedMessages);\n messagesRef.current = cachedMessages;\n setHasOlderTurns(Boolean(cached.hasOlderTurns));\n hasOlderTurnsRef.current = Boolean(cached.hasOlderTurns);\n nextBeforeTurnIndexRef.current = cached.nextBeforeTurnIndex ?? null;\n loadedThreadIdRef.current = activeThreadId;\n setLoadingHistory(false);\n if (!shouldRefreshStaleCache) return;\n }\n if (!hasCachedMessages) {\n setMessages([]);\n messagesRef.current = [];\n }\n void loadThread(activeThreadId).catch(() => setLoadingHistory(false));\n }, [activeThreadId, detachActiveStream, loadThread, setLoadingHistory, storage]);\n\n useEffect(() => {\n const threadId = activeThreadId;\n if (!threadId || isLoadingHistory || loadedThreadIdRef.current !== threadId || activeRunIdRef.current) return;\n const runId = autoAttachRunIdFromThread(storage.getThread(threadId));\n if (!runId || reattachedRunIdRef.current === runId) return;\n void runStream({ mode: \"attach\", threadId, runId });\n }, [activeThreadId, isLoadingHistory, runStream, storage, storageKey]);\n\n useEffect(() => {\n const threadId = activeThreadId;\n if (\n !threadId ||\n isLoadingHistoryRef.current ||\n activeRunIdRef.current ||\n streamingMessageIdRef.current\n ) {\n return;\n }\n const cached = storage.getThread(threadId);\n if (!hasStaleUnfinishedAssistantCache(cached)) return;\n void loadThread(threadId).catch(() => setLoadingHistory(false));\n }, [activeThreadId, loadThread, setLoadingHistory, storage, storageKey]);\n\n const {\n handleCopy,\n handleDislike,\n handleLike,\n handleRetry,\n startNewThread,\n upsertLiveVoiceMessage,\n } = useControllerMessageActions({\n activeThreadIdRef,\n createId,\n detachActiveStream,\n disliked,\n handleSubmit,\n hasOlderTurnsRef,\n liked,\n liveVoiceIdsRef,\n loadedThreadIdRef,\n messagesRef,\n nextBeforeTurnIndexRef,\n onActiveThreadIdChange,\n persistThread,\n requestSeqRef,\n setContextStatus,\n setCopiedMessageId,\n setDisliked,\n setHasOlderTurns,\n setIsLoadingOlder,\n setLiked,\n setLoadingHistory,\n setMessages,\n storage,\n });\n\n const loadThreadById = useCallback(\n async (threadId: string) => {\n if (!threadId) return;\n setIsSelectingThread(true);\n if (activeThreadIdRef.current !== threadId) {\n if (abortControllerRef.current) detachActiveStream();\n activeThreadIdRef.current = threadId;\n storage.setActiveThreadId?.(threadId);\n onActiveThreadIdChange?.(threadId);\n }\n try {\n await loadThread(threadId);\n } finally {\n if (activeThreadIdRef.current === threadId) setIsSelectingThread(false);\n }\n },\n [detachActiveStream, loadThread, onActiveThreadIdChange, storage]\n );\n\n const activeThread = activeThreadId\n ? storage.getThread(activeThreadId) || threads.find((thread) => thread.id === activeThreadId) || null\n : null;\n\n return useMemo(() => ({\n threads, activeThreadId, activeThread, messages, streamingContent, streamingMessageId,\n contextStatus, currentReasoning, isLoading, isLoadingHistory, isLoadingOlder,\n isRefreshingThreads, isSelectingThread, hasOlderTurns, liked, disliked, copiedMessageId,\n lastThinkingDurationMs, activeRunId, handleSubmit, attachRun, handleStop, handleCopy, handleLike,\n handleDislike, handleRetry, handleSourceClick: (citations: ChatMessage[\"citations\"]) => onSourceClick?.(citations),\n upsertLiveVoiceMessage, startNewThread, loadThreadById, loadOlderTurns, refresh, textareaRef,\n }), [\n copiedMessageId, activeRunId, activeThread, activeThreadId, attachRun, contextStatus, currentReasoning,\n disliked, handleCopy, handleDislike, handleLike, handleRetry, handleStop, handleSubmit,\n hasOlderTurns, isLoading, isLoadingHistory, isLoadingOlder, isRefreshingThreads,\n isSelectingThread, lastThinkingDurationMs, liked, loadThreadById, loadOlderTurns, messages,\n onSourceClick, refresh, streamingContent, streamingMessageId, startNewThread, threads, upsertLiveVoiceMessage,\n ]);\n}\n","import { useCallback, type Dispatch, type MutableRefObject, type SetStateAction } from \"react\";\nimport type {\n ChatCitation,\n ChatMessage,\n ChatReasoningStep,\n ChatStorageAdapter,\n ChatSubmitMessage,\n} from \"./types\";\n\ntype PagingRef = MutableRefObject<number | null>;\n\nexport function useControllerMessageActions(input: {\n activeThreadIdRef: MutableRefObject<string | null>;\n createId: () => string;\n detachActiveStream: () => void;\n disliked: Record<string, boolean>;\n handleSubmit: (message: ChatSubmitMessage) => Promise<void>;\n hasOlderTurnsRef: MutableRefObject<boolean>;\n liked: Record<string, boolean>;\n liveVoiceIdsRef: MutableRefObject<{ user?: string; assistant?: string }>;\n loadedThreadIdRef: MutableRefObject<string | null>;\n messagesRef: MutableRefObject<ChatMessage[]>;\n nextBeforeTurnIndexRef: PagingRef;\n onActiveThreadIdChange?: (threadId: string | null) => void;\n persistThread: (threadId: string, nextMessages: ChatMessage[]) => void;\n requestSeqRef: MutableRefObject<number>;\n setContextStatus: Dispatch<SetStateAction<any>>;\n setCopiedMessageId: Dispatch<SetStateAction<string | null>>;\n setDisliked: Dispatch<SetStateAction<Record<string, boolean>>>;\n setHasOlderTurns: Dispatch<SetStateAction<boolean>>;\n setIsLoadingOlder: Dispatch<SetStateAction<boolean>>;\n setLiked: Dispatch<SetStateAction<Record<string, boolean>>>;\n setLoadingHistory: (value: boolean) => void;\n setMessages: Dispatch<SetStateAction<ChatMessage[]>>;\n storage: ChatStorageAdapter;\n}) {\n const handleCopy = useCallback((content: string, messageId: string) => {\n navigator.clipboard?.writeText(content);\n input.setCopiedMessageId(messageId);\n setTimeout(() => input.setCopiedMessageId(null), 200);\n }, [input]);\n\n const handleLike = useCallback(async (msg: ChatMessage) => {\n const nextLiked = !input.liked[msg.id];\n input.setLiked((prev) => ({ ...prev, [msg.id]: nextLiked }));\n if (nextLiked) input.setDisliked((prev) => ({ ...prev, [msg.id]: false }));\n }, [input]);\n\n const handleDislike = useCallback(async (msg: ChatMessage) => {\n const nextDisliked = !input.disliked[msg.id];\n input.setDisliked((prev) => ({ ...prev, [msg.id]: nextDisliked }));\n if (nextDisliked) input.setLiked((prev) => ({ ...prev, [msg.id]: false }));\n }, [input]);\n\n const handleRetry = useCallback(async (msg: ChatMessage) => {\n const index = input.messagesRef.current.findIndex((message) => message.id === msg.id);\n if (index <= 0) return;\n const userMessage = input.messagesRef.current[index - 1];\n if (userMessage.role !== \"user\") return;\n const trimmed = input.messagesRef.current.slice(0, index);\n input.setMessages(trimmed);\n input.messagesRef.current = trimmed;\n if (input.activeThreadIdRef.current) input.persistThread(input.activeThreadIdRef.current, trimmed);\n await input.handleSubmit({ text: userMessage.content, files: userMessage.attachments || [] });\n }, [input]);\n\n const upsertLiveVoiceMessage = useCallback((payload: {\n role: \"user\" | \"assistant\";\n content: string;\n isFinal?: boolean;\n citations?: ChatCitation[];\n reasoningSteps?: ChatReasoningStep[];\n }) => {\n const content = payload.content?.trim() ?? \"\";\n if (!content && !payload.citations?.length && !payload.reasoningSteps?.length) return;\n input.setMessages((prev) => {\n const currentId = input.liveVoiceIdsRef.current[payload.role];\n const index = currentId ? prev.findIndex((message) => message.id === currentId) : -1;\n const nextMessage: ChatMessage = {\n id: currentId || input.createId(),\n role: payload.role,\n content,\n createdAt: new Date(),\n isFinal: Boolean(payload.isFinal),\n isVoice: payload.role === \"user\",\n parts: content ? [{ id: input.createId(), type: \"text\", kind: \"text\", text: content }] : [],\n citations: payload.citations,\n reasoningSteps: payload.reasoningSteps,\n };\n const next = index === -1 ? [...prev, nextMessage] : prev.map((message, itemIndex) => itemIndex === index ? { ...message, ...nextMessage } : message);\n input.liveVoiceIdsRef.current[payload.role] = payload.isFinal ? undefined : nextMessage.id;\n input.messagesRef.current = next;\n if (input.activeThreadIdRef.current) input.persistThread(input.activeThreadIdRef.current, next);\n return next;\n });\n }, [input]);\n\n const startNewThread = useCallback(() => {\n input.detachActiveStream();\n input.requestSeqRef.current += 1;\n input.activeThreadIdRef.current = null;\n input.loadedThreadIdRef.current = null;\n input.nextBeforeTurnIndexRef.current = null;\n input.hasOlderTurnsRef.current = false;\n input.storage.setActiveThreadId?.(null);\n input.onActiveThreadIdChange?.(null);\n input.setMessages([]);\n input.messagesRef.current = [];\n input.setHasOlderTurns(false);\n input.setIsLoadingOlder(false);\n input.setContextStatus(null);\n input.setLoadingHistory(false);\n }, [input]);\n\n return { handleCopy, handleDislike, handleLike, handleRetry, startNewThread, upsertLiveVoiceMessage };\n}\n","export type ContextWindowSource =\n | \"exact\"\n | \"estimated\"\n | \"provider_count_api\"\n | \"provider_usage\"\n | \"runtime_tokenizer\"\n | \"hf_tokenizer\"\n | \"multimodal_estimate\"\n | \"text_estimate\"\n | \"tokenizer_estimate\"\n | \"heuristic_estimate\"\n | \"unknown\";\n\nexport type ContextWindowStage = \"preflight\" | \"sent_prompt\" | \"final_usage\";\nexport type ContextWindowConfidence = \"exact\" | \"high\" | \"medium\" | \"low\" | \"unknown\";\n\nexport type ContextCompressionStatus = {\n active: boolean;\n reason?: string | null;\n input_tokens?: number | null;\n max_tokens?: number | null;\n usage_ratio?: number | null;\n full_frame_count?: number | null;\n compact_frame_count?: number | null;\n dropped_frame_count?: number | null;\n artifact_ref_count?: number | null;\n compression_trigger_budget?: number | null;\n compression_target_budget?: number | null;\n compression_target_ratio?: number | null;\n threshold_used?: number | null;\n};\n\nexport type ContextWindow = {\n source: ContextWindowSource;\n run_id?: string | null;\n stage?: ContextWindowStage | null;\n confidence?: ContextWindowConfidence | null;\n counter?: string | null;\n model_id?: string | null;\n max_tokens?: number | null;\n max_tokens_source?: string | null;\n input_tokens?: number | null;\n remaining_tokens?: number | null;\n usage_ratio?: number | null;\n assembly?: Record<string, unknown> | null;\n context_compression?: ContextCompressionStatus | null;\n};\n\nconst SOURCE_PRIORITY: Record<ContextWindowSource, number> = {\n unknown: 0,\n heuristic_estimate: 1,\n tokenizer_estimate: 1,\n text_estimate: 1,\n estimated: 1,\n multimodal_estimate: 2,\n hf_tokenizer: 3,\n runtime_tokenizer: 3,\n provider_count_api: 4,\n provider_usage: 5,\n exact: 5,\n};\n\nconst STAGE_PRIORITY: Record<ContextWindowStage, number> = {\n preflight: 0,\n sent_prompt: 1,\n final_usage: 2,\n};\n\nfunction numberOrNull(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction stagePriority(window: ContextWindow | null | undefined): number {\n return STAGE_PRIORITY[window?.stage || \"sent_prompt\"] ?? STAGE_PRIORITY.sent_prompt;\n}\n\nfunction hasRenderableContextWindow(window: ContextWindow | null | undefined): boolean {\n const maxTokens = window?.max_tokens;\n return typeof maxTokens === \"number\" && Number.isFinite(maxTokens) && maxTokens > 0;\n}\n\nfunction windowWeight(window: ContextWindow | null | undefined): [number, number] {\n if (!window) return [0, 0];\n return [stagePriority(window), SOURCE_PRIORITY[window.source] || 0];\n}\n\nexport function normalizeContextCompression(value: unknown): ContextCompressionStatus | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n return {\n active: Boolean(payload.active),\n reason: typeof payload.reason === \"string\" ? payload.reason : null,\n input_tokens: numberOrNull(payload.input_tokens),\n max_tokens: numberOrNull(payload.max_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n full_frame_count: numberOrNull(payload.full_frame_count),\n compact_frame_count: numberOrNull(payload.compact_frame_count),\n dropped_frame_count: numberOrNull(payload.dropped_frame_count),\n artifact_ref_count: numberOrNull(payload.artifact_ref_count),\n compression_trigger_budget: numberOrNull(payload.compression_trigger_budget),\n compression_target_budget: numberOrNull(payload.compression_target_budget),\n compression_target_ratio: numberOrNull(payload.compression_target_ratio),\n threshold_used: numberOrNull(payload.threshold_used),\n };\n}\n\nexport function normalizeContextWindow(value: unknown): ContextWindow | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n const rawSource = String(payload.source || \"\").trim();\n const source: ContextWindowSource =\n rawSource === \"exact\" ||\n rawSource === \"estimated\" ||\n rawSource === \"unknown\" ||\n rawSource === \"provider_count_api\" ||\n rawSource === \"provider_usage\" ||\n rawSource === \"runtime_tokenizer\" ||\n rawSource === \"hf_tokenizer\" ||\n rawSource === \"multimodal_estimate\" ||\n rawSource === \"text_estimate\" ||\n rawSource === \"tokenizer_estimate\" ||\n rawSource === \"heuristic_estimate\"\n ? rawSource\n : rawSource\n ? \"estimated\"\n : \"unknown\";\n const rawStage = String(payload.stage || \"\").trim();\n const stage: ContextWindowStage =\n rawStage === \"preflight\" || rawStage === \"sent_prompt\" || rawStage === \"final_usage\"\n ? rawStage\n : \"sent_prompt\";\n const rawConfidence = String(payload.confidence || \"\").trim();\n const confidence: ContextWindowConfidence | null =\n rawConfidence === \"exact\" ||\n rawConfidence === \"high\" ||\n rawConfidence === \"medium\" ||\n rawConfidence === \"low\" ||\n rawConfidence === \"unknown\"\n ? rawConfidence\n : null;\n\n return {\n source,\n run_id: typeof payload.run_id === \"string\" ? payload.run_id : null,\n stage,\n confidence,\n counter: typeof payload.counter === \"string\" ? payload.counter : null,\n model_id: typeof payload.model_id === \"string\" ? payload.model_id : null,\n max_tokens: numberOrNull(payload.max_tokens),\n max_tokens_source: typeof payload.max_tokens_source === \"string\" ? payload.max_tokens_source : null,\n input_tokens: numberOrNull(payload.input_tokens),\n remaining_tokens: numberOrNull(payload.remaining_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n assembly:\n payload.assembly && typeof payload.assembly === \"object\" && !Array.isArray(payload.assembly)\n ? (payload.assembly as Record<string, unknown>)\n : null,\n context_compression: normalizeContextCompression(payload.context_compression),\n };\n}\n\nexport function mergeContextWindow(\n current: ContextWindow | null | undefined,\n incoming: ContextWindow | null | undefined\n): ContextWindow | null {\n if (!incoming) return current ?? null;\n if (!current) return incoming;\n if (hasRenderableContextWindow(current) && !hasRenderableContextWindow(incoming)) return current;\n\n const currentRunId = current.run_id || null;\n const incomingRunId = incoming.run_id || null;\n if (incomingRunId && currentRunId && incomingRunId !== currentRunId) {\n return stagePriority(incoming) >= STAGE_PRIORITY.sent_prompt ? incoming : current;\n }\n\n const currentWeight = windowWeight(current);\n const incomingWeight = windowWeight(incoming);\n return incomingWeight[0] > currentWeight[0] ||\n (incomingWeight[0] === currentWeight[0] && incomingWeight[1] >= currentWeight[1])\n ? incoming\n : current;\n}\n\nexport function mergeContextWindowUpdate(\n current: ContextWindow | null | undefined,\n incoming: unknown\n): ContextWindow | null {\n return mergeContextWindow(current, normalizeContextWindow(incoming));\n}\n\nexport function compressionFromContextWindow(\n contextWindow: ContextWindow | null | undefined\n): ContextCompressionStatus | null {\n if (!contextWindow) return null;\n if (contextWindow.context_compression) return contextWindow.context_compression;\n const assembly = contextWindow.assembly;\n if (!assembly || typeof assembly !== \"object\" || Array.isArray(assembly)) return null;\n const artifactRefs = Array.isArray(assembly.artifact_refs) ? assembly.artifact_refs : [];\n const compactFrameCount = numberOrNull(assembly.compact_frame_count) ?? 0;\n const droppedFrameCount = numberOrNull(assembly.dropped_frame_count) ?? 0;\n const reason = typeof assembly.compaction_reason === \"string\" ? assembly.compaction_reason : \"none\";\n return {\n active: reason !== \"none\" || compactFrameCount > 0 || droppedFrameCount > 0,\n reason,\n input_tokens: contextWindow.input_tokens ?? null,\n max_tokens: contextWindow.max_tokens ?? null,\n usage_ratio: contextWindow.usage_ratio ?? null,\n full_frame_count: numberOrNull(assembly.full_frame_count),\n compact_frame_count: compactFrameCount,\n dropped_frame_count: droppedFrameCount,\n artifact_ref_count: artifactRefs.length,\n compression_trigger_budget: numberOrNull(assembly.compression_trigger_budget),\n compression_target_budget: numberOrNull(assembly.compression_target_budget),\n compression_target_ratio: numberOrNull(assembly.compression_target_ratio),\n threshold_used: numberOrNull(assembly.threshold_used),\n };\n}\n","import type {\n ChatPart,\n ChatContextWindow,\n ChatDataPart,\n ChatErrorPart,\n ChatMessage,\n ChatReasoningStep,\n ChatRuntimeEvent,\n ChatThreadDetail,\n ChatThreadSummary,\n ChatThreadTurn,\n ChatToolPart,\n ChatToolState,\n ToolPresentation,\n} from \"./types\";\nimport { normalizeContextWindow } from \"./context-window\";\n\nexport const DEFAULT_THREAD_PAGE_SIZE = 5;\n\nexport const isRunningThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\", \"cancelling\", \"paused\"]).has(String(status || \"\").toLowerCase());\n\nexport const isAutoAttachThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\", \"cancelling\"]).has(String(status || \"\").toLowerCase());\n\nexport const createChatId = () => {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) return crypto.randomUUID();\n return `chat-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nexport const titleFromMessage = (text: string, files: Array<{ filename?: string }> = []) => {\n const base = text.trim() || files[0]?.filename || \"New chat\";\n return base.replace(/\\s+/g, \" \").slice(0, 48);\n};\n\nexport const threadActivityDate = (thread: ChatThreadSummary) =>\n String(thread.updated_at || thread.last_activity_at || thread.created_at || new Date().toISOString());\n\nexport const assistantTextFromResponseBlocks = (blocks?: Array<Record<string, unknown>>) =>\n (blocks || [])\n .filter((block) => block.kind === \"assistant_text\" && typeof block.text === \"string\")\n .map((block) => String(block.text))\n .join(\"\\n\\n\")\n .trim();\n\nexport const assistantTextFromParts = (parts?: ChatPart[]) =>\n (parts || [])\n .filter((part): part is Extract<ChatPart, { kind: \"text\" }> => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\\n\\n\")\n .trim();\n\nconst displayTextWithoutInlineAttachments = (text: string, hasAttachments: boolean) => {\n if (!hasAttachments) return text;\n const marker = \"Attached text file (\";\n const trimmed = text.trim();\n if (trimmed.startsWith(marker)) return \"\";\n const markerIndex = text.indexOf(`\\n\\n${marker}`);\n if (markerIndex === -1) return text;\n return text.slice(0, markerIndex).trim();\n};\n\nconst attachmentsFromTurn = (turn: ChatThreadTurn) =>\n (turn.attachments || []).map((attachment, index) => {\n const record = attachment || {};\n return {\n ...record,\n type: \"file\",\n url: String(record.url || \"\"),\n filename: String(record.filename || record.name || `attachment-${index + 1}`),\n mediaType: String(record.mime_type || record.mediaType || record.type || \"application/octet-stream\"),\n };\n });\n\nconst tokenUsageFromTurn = (turn: ChatThreadTurn): ChatMessage[\"tokenUsage\"] | undefined => {\n const usage = turn.run_usage;\n if (!usage || typeof usage !== \"object\") return undefined;\n return {\n inputTokens: usage.input_tokens ?? null,\n outputTokens: usage.output_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n usageSource: usage.source ?? null,\n };\n};\n\nconst latestEventPayloadValue = (events: ChatRuntimeEvent[] | undefined, key: string) => {\n for (let index = (events || []).length - 1; index >= 0; index -= 1) {\n const payload = events?.[index]?.payload;\n if (payload && payload[key] !== undefined && payload[key] !== null) return payload[key];\n }\n return undefined;\n};\n\nconst responseBlocksFromTurn = (turn: ChatThreadTurn) => {\n if (Array.isArray(turn.response_blocks) && turn.response_blocks.length > 0) return turn.response_blocks;\n const fromEvents = latestEventPayloadValue(turn.run_events, \"response_blocks\");\n return Array.isArray(fromEvents) ? (fromEvents as Array<Record<string, unknown>>) : [];\n};\n\nconst assistantTextFromEvents = (events?: ChatRuntimeEvent[]) => {\n const assistantText = latestEventPayloadValue(events, \"assistant_output_text\");\n if (typeof assistantText === \"string\" && assistantText.trim()) return assistantText;\n return \"\";\n};\n\nconst asRecord = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n\nconst optionalString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n\nexport const toolStateFromStatus = (status?: unknown): ChatToolState => {\n const normalized = String(status || \"\").trim().toLowerCase();\n if ([\"failed\", \"error\"].includes(normalized)) return \"output-error\";\n if ([\"cancelled\", \"canceled\"].includes(normalized)) return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n if ([\"running\", \"active\", \"pending\", \"streaming\"].includes(normalized)) return \"input-available\";\n return \"input-available\";\n};\n\nconst toolNameFromRecord = (tool: Record<string, unknown>) =>\n String(tool.toolName || tool.tool_name || tool.name || tool.slug || tool.action || \"tool\").trim() || \"tool\";\n\nconst toolCallIdFromRecords = (\n block: Record<string, unknown>,\n tool: Record<string, unknown>\n) =>\n optionalString(tool.toolCallId) ||\n optionalString(tool.tool_call_id) ||\n optionalString(block.toolCallId) ||\n optionalString(block.tool_call_id) ||\n optionalString(block.id) ||\n null;\n\nconst presentationFromTool = (tool: Record<string, unknown>): ToolPresentation | null => {\n const presentation = asRecord(tool.presentation);\n const outputView = asRecord(tool.outputView) || asRecord(tool.output_view);\n const next: ToolPresentation = presentation ? { ...presentation } : {};\n ([\n \"title\",\n \"activity\",\n \"detail\",\n \"category\",\n \"groupKey\",\n \"groupLabel\",\n \"showOutput\",\n \"outputView\",\n ] as const).forEach((key) => {\n if (tool[key] !== undefined) {\n (next as Record<string, unknown>)[key] = tool[key];\n }\n });\n if (tool.group_key !== undefined) next.group_key = tool.group_key;\n if (tool.group_label !== undefined) next.group_label = tool.group_label;\n if (tool.show_output !== undefined) next.show_output = tool.show_output;\n if (outputView && next.outputView === undefined) next.outputView = outputView;\n return Object.keys(next).length > 0 ? next : null;\n};\n\nconst createToolPart = (block: Record<string, unknown>, index: number): ChatToolPart => {\n const tool = asRecord(block.tool) || {};\n const toolName = toolNameFromRecord(tool);\n const errorText =\n optionalString(tool.errorText) ||\n optionalString(tool.error) ||\n optionalString(block.error) ||\n null;\n return {\n id: String(block.id || `${block.kind || \"tool\"}-${index}`),\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolCallId: toolCallIdFromRecords(block, tool),\n state: toolStateFromStatus(block.status),\n input: tool.input ?? block.input,\n output: tool.output ?? block.output,\n errorText,\n presentation: presentationFromTool(tool),\n raw: block,\n };\n};\n\nconst createDataPart = (\n block: Record<string, unknown>,\n index: number,\n name = String(block.kind || \"data\")\n): ChatDataPart => ({\n id: String(block.id || `${name}-${index}`),\n type: \"data\",\n kind: \"data\",\n name,\n data: block,\n raw: block,\n});\n\nexport const partsFromResponseBlocks = (\n blocks?: Array<Record<string, unknown>>,\n fallbackText?: string\n): ChatPart[] => {\n const parts: ChatPart[] = [];\n (blocks || []).forEach((block, index) => {\n const id = String(block.id || `${block.kind || \"block\"}-${index}`);\n if (block.kind === \"assistant_text\" && typeof block.text === \"string\") {\n parts.push({ id, type: \"text\", kind: \"text\", text: String(block.text), raw: block });\n return;\n }\n if (block.kind === \"tool_call\") {\n parts.push(createToolPart(block, index));\n return;\n }\n if (block.kind === \"ui_blocks\") {\n parts.push({\n id,\n type: \"ui-blocks\",\n kind: \"ui-blocks\",\n state: toolStateFromStatus(block.status),\n toolCallId: optionalString(block.toolCallId) || optionalString(block.tool_call_id) || null,\n contractVersion: optionalString(block.contractVersion) || optionalString(block.contract_version) || null,\n bundle: asRecord(block.bundle),\n errorText: optionalString(block.error) || null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"reasoning_note\") {\n parts.push({\n id,\n type: \"reasoning\",\n kind: \"reasoning\",\n label: optionalString(block.label) || null,\n text: optionalString(block.text) || optionalString(block.summary) || null,\n status: optionalString(block.status) || null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"hitl_request\") {\n const hitl = asRecord(block.hitl) || block;\n parts.push({\n id,\n type: \"hitl\",\n kind: \"hitl\",\n hitl,\n interruptId: optionalString(block.interruptId) || optionalString(hitl.interrupt_id) || null,\n hitlKind: optionalString(block.hitlKind) || optionalString(hitl.kind) || null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"error\") {\n parts.push({\n id,\n type: \"error\",\n kind: \"error\",\n errorText: optionalString(block.error) || optionalString(block.message) || \"Error\",\n raw: block,\n } satisfies ChatErrorPart);\n return;\n }\n parts.push(createDataPart(block, index));\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText?.trim()) {\n parts.push({ id: \"assistant-fallback-text\", type: \"text\", kind: \"text\", text: fallbackText });\n }\n return parts;\n};\n\nexport const mergeReasoningSteps = (\n steps?: ChatReasoningStep[],\n options?: { finalize?: boolean }\n) => {\n if (!steps?.length) return [];\n const merged: ChatReasoningStep[] = [];\n const indexMap = new Map<string, number>();\n steps.forEach((step) => {\n const key = String(step.label);\n const status = options?.finalize ? \"complete\" : step.status || \"complete\";\n if (indexMap.has(key)) {\n const index = indexMap.get(key)!;\n merged[index] = { ...merged[index], ...step, status };\n } else {\n indexMap.set(key, merged.push({ ...step, status }) - 1);\n }\n });\n return merged;\n};\n\nexport const reasoningStepsFromParts = (parts?: ChatPart[]): ChatReasoningStep[] =>\n (parts || [])\n .map((block) => {\n if (block.kind === \"tool\") {\n const label =\n optionalString(block.presentation?.activity) ||\n optionalString(block.presentation?.title) ||\n block.toolName;\n return {\n label,\n status: block.state === \"input-available\" || block.state === \"input-streaming\" ? \"active\" : \"complete\",\n description: optionalString(block.presentation?.detail) || \"\",\n } satisfies ChatReasoningStep;\n }\n if (block.kind === \"reasoning\") {\n return {\n label: block.label || \"Reasoning\",\n status: block.status === \"running\" ? \"active\" : \"complete\",\n description: block.text || \"\",\n } satisfies ChatReasoningStep;\n }\n return null;\n })\n .filter(Boolean) as ChatReasoningStep[];\n\nconst turnToMessages = (turn: ChatThreadTurn, activeRunId?: string | null): ChatMessage[] => {\n const messages: ChatMessage[] = [];\n const createdAt = turn.created_at ? new Date(turn.created_at) : new Date();\n const baseId = turn.id || turn.run_id || createChatId();\n const responseBlocks = responseBlocksFromTurn(turn);\n const isRunning = isRunningThreadStatus(turn.status) || Boolean(turn.run_id && activeRunId === turn.run_id);\n const attachments = attachmentsFromTurn(turn);\n const userContent = displayTextWithoutInlineAttachments(turn.user_input_text || \"\", attachments.length > 0);\n if (userContent || attachments.length > 0) {\n messages.push({\n id: `${baseId}-user`,\n role: \"user\",\n content: userContent,\n createdAt,\n parts: userContent ? [{ id: `${baseId}-user-text`, type: \"text\", kind: \"text\", text: userContent }] : [],\n attachments,\n });\n }\n const assistantText =\n turn.assistant_output_text ||\n assistantTextFromResponseBlocks(responseBlocks) ||\n assistantTextFromEvents(turn.run_events);\n if (assistantText || responseBlocks.length > 0 || isRunning) {\n const parts = partsFromResponseBlocks(responseBlocks, assistantText);\n messages.push({\n id: `${baseId}-assistant`,\n role: \"assistant\",\n runId: turn.run_id || null,\n content: assistantText || assistantTextFromParts(parts),\n createdAt: turn.completed_at ? new Date(turn.completed_at) : createdAt,\n parts,\n reasoningSteps: mergeReasoningSteps(reasoningStepsFromParts(parts), { finalize: !isRunning }),\n isFinal: !isRunning,\n tokenUsage: tokenUsageFromTurn(turn),\n });\n }\n return messages;\n};\n\nexport const threadDetailToMessages = (thread: ChatThreadDetail) => {\n const activeRun = activeRunIdFromThreadDetail(thread);\n return (thread.turns || []).flatMap((turn) => turnToMessages(turn, activeRun));\n};\n\nexport const threadPaging = (thread: ChatThreadDetail) => {\n const nextBeforeTurnIndex = thread.paging?.next_before_turn_index ?? null;\n return {\n hasOlderTurns: Boolean(thread.paging?.has_more || nextBeforeTurnIndex !== null),\n nextBeforeTurnIndex,\n };\n};\n\nexport const latestContextWindowFromThread = (thread: ChatThreadDetail): ChatContextWindow | null => {\n const threadContextWindow = normalizeContextWindow(thread.context_window);\n if (threadContextWindow) return threadContextWindow;\n for (let index = (thread.turns || []).length - 1; index >= 0; index -= 1) {\n const contextWindow = normalizeContextWindow(thread.turns?.[index]?.context_window);\n if (contextWindow) return contextWindow;\n }\n return null;\n};\n\nexport const activeRunIdFromThread = (thread?: Partial<ChatThreadSummary> | null) => {\n const hasCamelActiveRun = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"activeRun\")\n );\n const hasCamelLastRunStatus = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunStatus\")\n );\n const hasCamelLastRunId = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunId\")\n );\n const activeRun = hasCamelActiveRun ? thread?.activeRun || null : thread?.active_run || null;\n const lastRunStatus = hasCamelLastRunStatus\n ? thread?.lastRunStatus || null\n : thread?.last_run_status || thread?.lastRunStatus || null;\n const activeRunId = activeRun?.run_id ? String(activeRun.run_id) : \"\";\n if (activeRunId && isRunningThreadStatus(activeRun?.status || lastRunStatus)) return activeRunId;\n const lastRunId = hasCamelLastRunId\n ? thread?.lastRunId\n : thread?.last_run_id || thread?.lastRunId;\n return lastRunId && isRunningThreadStatus(lastRunStatus) ? String(lastRunId) : null;\n};\n\nexport const autoAttachRunIdFromThread = (thread?: Partial<ChatThreadSummary> | null) => {\n const hasCamelActiveRun = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"activeRun\")\n );\n const hasCamelLastRunStatus = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunStatus\")\n );\n const hasCamelLastRunId = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunId\")\n );\n const activeRun = hasCamelActiveRun ? thread?.activeRun || null : thread?.active_run || null;\n const lastRunStatus = hasCamelLastRunStatus\n ? thread?.lastRunStatus || null\n : thread?.last_run_status || thread?.lastRunStatus || null;\n const activeRunId = activeRun?.run_id ? String(activeRun.run_id) : \"\";\n if (activeRunId && isAutoAttachThreadStatus(activeRun?.status || lastRunStatus)) return activeRunId;\n const lastRunId = hasCamelLastRunId\n ? thread?.lastRunId\n : thread?.last_run_id || thread?.lastRunId;\n return lastRunId && isAutoAttachThreadStatus(lastRunStatus) ? String(lastRunId) : null;\n};\n\nexport const hasUnfinishedAssistantMessage = (messages?: ChatMessage[]) =>\n Boolean(messages?.some((message) => message.role === \"assistant\" && message.isFinal === false));\n\nexport const hasStaleUnfinishedAssistantCache = (\n thread?: (Partial<ChatThreadSummary> & { messages?: ChatMessage[] }) | null\n) => hasUnfinishedAssistantMessage(thread?.messages) && !activeRunIdFromThread(thread);\n\nexport const activeRunIdFromThreadDetail = (thread?: ChatThreadDetail | null) => {\n const summaryRunId = activeRunIdFromThread(thread);\n if (summaryRunId) return summaryRunId;\n const runningTurn = [...(thread?.turns || [])].reverse().find((turn) => turn.run_id && isRunningThreadStatus(turn.status));\n return runningTurn?.run_id ? String(runningTurn.run_id) : null;\n};\n","import type { ChatMessage, ChatReasoningStep, ChatPart, ChatThreadSummaryEvent, StoredChatThread } from \"./types\";\nimport { autoAttachRunIdFromThread } from \"./model\";\n\nexport type ChatRuntimeEventContext = {\n mode: \"submit\" | \"attach\";\n assistantMessageId: string;\n threadId: string | null;\n runId: string | null;\n startedAt: number;\n};\n\nexport type FinalizeInput = {\n threadId: string | null;\n baseMessages: ChatMessage[];\n assistantText: string;\n reasoning: ChatReasoningStep[];\n thinkingDurationMs: number;\n messageId?: string | null;\n runId?: string | null;\n parts?: ChatPart[];\n error?: string;\n};\n\nexport const threadSummaryToStored = (thread: Record<string, unknown>): StoredChatThread => ({\n ...(thread as StoredChatThread),\n id: String(thread.id),\n title: String(thread.title || \"New chat\"),\n updated_at: String(thread.updated_at || thread.last_activity_at || thread.created_at || new Date().toISOString()),\n messages: [],\n isHydrated: false,\n});\n\nexport const isThreadNotFoundError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\" || !(\"status\" in error)) return false;\n return Number((error as { status?: unknown }).status) === 404;\n};\n\nexport const isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\") return false;\n const maybe = error as { name?: unknown; message?: unknown };\n return maybe.name === \"AbortError\" || String(maybe.message || \"\").toLowerCase().includes(\"aborted\");\n};\n\nexport const abortDetachedStream = (controller: AbortController | null) => {\n if (!controller || controller.signal.aborted) return;\n try {\n const reason =\n typeof DOMException !== \"undefined\"\n ? new DOMException(\"Chat stream detached.\", \"AbortError\")\n : new Error(\"Chat stream detached.\");\n controller.abort(reason);\n } catch {\n // Detaching a stream is expected and must not surface as a UI error.\n }\n};\n\nconst hasRunState = (thread: StoredChatThread) =>\n Boolean(\n thread.active_run ||\n thread.activeRun ||\n thread.last_run_id ||\n thread.lastRunId ||\n thread.last_run_status ||\n thread.lastRunStatus ||\n thread.isRunning\n );\n\nexport const mergeStoredThreadsForRefresh = (\n currentThreads: StoredChatThread[],\n serverThreads: StoredChatThread[]\n): StoredChatThread[] => {\n const currentById = new Map(currentThreads.map((thread) => [thread.id, thread]));\n const serverIds = new Set(serverThreads.map((thread) => thread.id));\n const mergedServerThreads = serverThreads.map((serverThread) => {\n const current = currentById.get(serverThread.id);\n if (!current) return serverThread;\n const incomingHasRunState = hasRunState(serverThread);\n return {\n ...current,\n ...serverThread,\n messages: current.messages || [],\n isHydrated: current.isHydrated,\n hasOlderTurns: current.hasOlderTurns,\n nextBeforeTurnIndex: current.nextBeforeTurnIndex,\n active_run: incomingHasRunState ? serverThread.active_run : current.active_run,\n activeRun: incomingHasRunState ? serverThread.activeRun : current.activeRun,\n last_run_id: incomingHasRunState ? serverThread.last_run_id : current.last_run_id,\n lastRunId: incomingHasRunState ? serverThread.lastRunId : current.lastRunId,\n last_run_status: incomingHasRunState ? serverThread.last_run_status : current.last_run_status,\n lastRunStatus: incomingHasRunState ? serverThread.lastRunStatus : current.lastRunStatus,\n lastEventSeq: incomingHasRunState ? serverThread.lastEventSeq : current.lastEventSeq,\n isRunning: incomingHasRunState ? serverThread.isRunning : current.isRunning,\n };\n });\n const localOnlyThreads = currentThreads.filter((thread) => {\n if (serverIds.has(thread.id)) return false;\n return Boolean(thread.isHydrated || thread.messages?.length || thread.isRunning || thread.activeRun || thread.active_run);\n });\n return [...mergedServerThreads, ...localOnlyThreads];\n};\n\nexport const hasRunningStoredThreads = (threads: StoredChatThread[]): boolean =>\n threads.some((thread) => autoAttachRunIdFromThread(thread) !== null);\n\nconst stableStringify = (value: unknown): string => JSON.stringify(value ?? null);\n\nexport const sameStoredThread = (left: StoredChatThread | undefined, right: StoredChatThread | undefined): boolean => {\n if (left === right) return true;\n if (!left || !right) return false;\n return stableStringify(left) === stableStringify(right);\n};\n\nexport const applyThreadSummaryEvent = (\n currentThreads: StoredChatThread[],\n event: ChatThreadSummaryEvent\n): StoredChatThread[] => {\n if (event.event === \"snapshot_required\") return currentThreads;\n if (event.event === \"thread.deleted\") {\n const next = currentThreads.filter((thread) => thread.id !== event.thread_id);\n return next.length === currentThreads.length ? currentThreads : next;\n }\n const incoming = threadSummaryToStored(event.thread as Record<string, unknown>);\n const index = currentThreads.findIndex((thread) => thread.id === incoming.id);\n const sortByActivity = (threads: StoredChatThread[]) =>\n [...threads].sort((a, b) => {\n const left = Date.parse(String(a.updated_at || a.last_activity_at || a.created_at || \"\"));\n const right = Date.parse(String(b.updated_at || b.last_activity_at || b.created_at || \"\"));\n return (Number.isFinite(right) ? right : 0) - (Number.isFinite(left) ? left : 0);\n });\n if (index === -1) return sortByActivity([...currentThreads, incoming]);\n const [merged] = mergeStoredThreadsForRefresh([currentThreads[index]], [incoming]);\n if (sameStoredThread(currentThreads[index], merged)) return currentThreads;\n const next = [...currentThreads];\n next[index] = merged;\n return sortByActivity(next);\n};\n","export 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 findStableAssistantMessageIndex<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: Pick<StableAssistantUpsertInput<TMessage>, \"messageId\" | \"runId\">\n) {\n return messages.findIndex(\n (message) =>\n message.role === \"assistant\" &&\n ((input.messageId && message.id === input.messageId) ||\n Boolean(input.runId && message.runId === input.runId))\n );\n}\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage\n) {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) {\n next.push(userMessage);\n }\n if (\n !next.some(\n (message) =>\n message.id === assistantMessage.id ||\n Boolean(\n assistantMessage.runId &&\n message.role === \"assistant\" &&\n message.runId === assistantMessage.runId\n )\n )\n ) {\n next.push(assistantMessage);\n }\n return next;\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>\n) {\n const next = [...messages];\n\n for (const baseMessage of input.baseMessages || []) {\n const matchesTarget =\n baseMessage.role === \"assistant\" &&\n ((input.messageId && baseMessage.id === input.messageId) ||\n Boolean(input.runId && baseMessage.runId === input.runId));\n if (!matchesTarget && !next.some((message) => message.id === baseMessage.id)) {\n next.push(baseMessage);\n }\n }\n\n const index = findStableAssistantMessageIndex(next, input);\n if (index === -1) {\n next.push(input.create());\n return next;\n }\n\n next[index] = input.update(next[index]);\n return next;\n}\n","import * as React from \"react\";\nimport {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\n\nconst cx = (...values: Array<string | false | null | undefined>) =>\n values.filter(Boolean).join(\" \");\n\ntype MessageScrollerProviderProps = React.ComponentProps<\n typeof MessageScroller.Provider\n>;\ntype MessageScrollerRootProps = React.ComponentProps<typeof MessageScroller.Root>;\ntype MessageScrollerViewportProps = React.ComponentProps<\n typeof MessageScroller.Viewport\n>;\ntype MessageScrollerContentProps = React.ComponentProps<\n typeof MessageScroller.Content\n>;\ntype MessageScrollerItemProps = React.ComponentProps<typeof MessageScroller.Item>;\ntype MessageScrollerButtonProps = React.ComponentProps<typeof MessageScroller.Button>;\n\ntype LatestThreadScrollerLayoutContextValue = {\n contentElement: HTMLElement | null;\n rootElement: HTMLElement | null;\n setContentElement: (node: HTMLElement | null) => void;\n setRootElement: (node: HTMLElement | null) => void;\n};\n\nconst LatestThreadScrollerLayoutContext =\n React.createContext<LatestThreadScrollerLayoutContextValue | null>(null);\n\nconst useLatestThreadScrollerLayout = () =>\n React.useContext(LatestThreadScrollerLayoutContext);\n\nexport type LatestThreadScrollerProviderProps = MessageScrollerProviderProps;\n\nexport function LatestThreadScrollerProvider({\n autoScroll = true,\n defaultScrollPosition = \"last-anchor\",\n scrollPreviousItemPeek = 64,\n ...props\n}: LatestThreadScrollerProviderProps) {\n return (\n <MessageScroller.Provider\n autoScroll={autoScroll}\n defaultScrollPosition={defaultScrollPosition}\n scrollPreviousItemPeek={scrollPreviousItemPeek}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerRootProps = MessageScrollerRootProps;\n\nexport function LatestThreadScrollerRoot({\n className,\n ref,\n ...props\n}: LatestThreadScrollerRootProps) {\n const [rootElement, setRootElement] = React.useState<HTMLElement | null>(null);\n const [contentElement, setContentElement] =\n React.useState<HTMLElement | null>(null);\n const layoutContext = React.useMemo<LatestThreadScrollerLayoutContextValue>(\n () => ({\n contentElement,\n rootElement,\n setContentElement,\n setRootElement,\n }),\n [contentElement, rootElement]\n );\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setRootElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref]\n );\n\n return (\n <LatestThreadScrollerLayoutContext.Provider value={layoutContext}>\n <MessageScroller.Root\n ref={setRef}\n className={cx(\n \"relative flex size-full min-h-0 flex-1 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n </LatestThreadScrollerLayoutContext.Provider>\n );\n}\n\nexport type LatestThreadScrollerViewportProps =\n MessageScrollerViewportProps & {\n onViewportChange?: (node: HTMLElement | null) => void;\n };\n\nexport function LatestThreadScrollerViewport({\n className,\n onViewportChange,\n preserveScrollOnPrepend = true,\n ref,\n ...props\n}: LatestThreadScrollerViewportProps) {\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n onViewportChange?.(node);\n },\n [onViewportChange, ref]\n );\n\n return (\n <MessageScroller.Viewport\n ref={setRef}\n className={cx(\n \"size-full min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\",\n className\n )}\n preserveScrollOnPrepend={preserveScrollOnPrepend}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerContentProps = MessageScrollerContentProps;\n\nexport function LatestThreadScrollerContent({\n className,\n ref,\n ...props\n}: LatestThreadScrollerContentProps) {\n const layout = useLatestThreadScrollerLayout();\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n layout?.setContentElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [layout, ref]\n );\n\n return (\n <MessageScroller.Content\n ref={setRef}\n data-agents24-latest-thread-content=\"\"\n className={cx(\"flex h-max min-h-full flex-col gap-8 p-4\", className)}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerItemProps = Omit<\n MessageScrollerItemProps,\n \"messageId\"\n> & {\n messageId: string;\n};\n\nexport function LatestThreadScrollerItem({\n className,\n messageId,\n ...props\n}: LatestThreadScrollerItemProps) {\n return (\n <MessageScroller.Item\n className={cx(\n \"min-w-0 shrink-0 overflow-visible\",\n className\n )}\n messageId={messageId}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerButtonProps = Omit<\n MessageScrollerButtonProps,\n \"render\"\n> & {\n className?: string;\n render?: MessageScrollerButtonProps[\"render\"];\n};\n\nexport function LatestThreadScrollerButton({\n children,\n className,\n direction = \"end\",\n render,\n ...props\n}: LatestThreadScrollerButtonProps) {\n if (render) {\n return (\n <MessageScroller.Button\n direction={direction}\n render={render}\n {...props}\n />\n );\n }\n\n return (\n <MessageScroller.Button\n direction={direction}\n render={(buttonProps) => (\n <button\n {...(buttonProps as Record<string, unknown>)}\n aria-label={\n direction === \"end\"\n ? \"Scroll to latest message\"\n : \"Scroll to first message\"\n }\n className={cx(\n \"absolute bottom-4 left-1/2 z-50 flex size-9 -translate-x-1/2 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-md transition-all duration-200 data-[active=false]:pointer-events-none data-[active=false]:translate-y-2 data-[active=false]:opacity-0 data-[active=true]:translate-y-0 data-[active=true]:opacity-100\",\n className\n )}\n type=\"button\"\n >\n {children ?? (direction === \"end\" ? \"↓\" : \"↑\")}\n </button>\n )}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerOutlineItem = {\n id: string;\n label: string;\n messageIds?: string[];\n responsePreview?: string;\n};\n\nexport type LatestThreadScrollerOutlineProps = {\n cardClassName?: string;\n className?: string;\n contentMaxWidth?: number;\n dir?: \"ltr\" | \"rtl\";\n items: LatestThreadScrollerOutlineItem[];\n minContainerWidthForRail?: number;\n minSideGutterForRail?: number;\n side?: \"left\" | \"right\";\n};\n\nexport function LatestThreadScrollerOutline({\n cardClassName,\n className,\n contentMaxWidth = 768,\n dir = \"ltr\",\n items,\n minContainerWidthForRail = 0,\n minSideGutterForRail = 48,\n side,\n}: LatestThreadScrollerOutlineProps) {\n const navRef = React.useRef<HTMLElement | null>(null);\n const layout = useLatestThreadScrollerLayout();\n const [hasSideRoom, setHasSideRoom] = React.useState(false);\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n const { scrollToMessage } = useMessageScroller();\n const { currentAnchorId, visibleMessageIds } = useMessageScrollerVisibility();\n const visibleMessageIdSet = React.useMemo(\n () => new Set(visibleMessageIds),\n [visibleMessageIds]\n );\n const focusIndex = hoveredIndex ?? -1;\n const railSide = side ?? (dir === \"rtl\" ? \"right\" : \"left\");\n\n React.useEffect(() => {\n const root = layout?.rootElement ?? navRef.current?.parentElement;\n if (!root) return;\n\n const updateSideRoom = () => {\n const rootRect = root.getBoundingClientRect();\n const rootWidth = rootRect.width;\n const content = layout?.contentElement;\n const sideGutter = content\n ? Math.max(\n 0,\n railSide === \"left\"\n ? content.getBoundingClientRect().left - rootRect.left\n : rootRect.right - content.getBoundingClientRect().right\n )\n : Math.max(0, (rootWidth - contentMaxWidth) / 2);\n const nextHasSideRoom =\n rootWidth >= minContainerWidthForRail &&\n sideGutter >= minSideGutterForRail;\n setHasSideRoom((current) =>\n current === nextHasSideRoom ? current : nextHasSideRoom\n );\n };\n\n updateSideRoom();\n if (typeof ResizeObserver === \"undefined\") return;\n const resizeObserver = new ResizeObserver(updateSideRoom);\n resizeObserver.observe(root);\n const content = layout?.contentElement;\n if (content) {\n resizeObserver.observe(content);\n }\n return () => resizeObserver.disconnect();\n }, [\n contentMaxWidth,\n layout?.contentElement,\n layout?.rootElement,\n minContainerWidthForRail,\n minSideGutterForRail,\n railSide,\n ]);\n\n if (items.length < 2) {\n return null;\n }\n\n return (\n <nav\n ref={navRef}\n aria-label=\"Transcript outline\"\n className={cx(\n \"pointer-events-none absolute top-[46%] z-10 max-h-[min(18rem,calc(100%-10rem))] w-16 -translate-y-1/2 overflow-visible\",\n hasSideRoom ? \"hidden md:block\" : \"hidden\",\n railSide === \"left\" ? \"left-1\" : \"right-1\",\n className\n )}\n dir={dir}\n >\n <div className=\"pointer-events-auto flex flex-col gap-0 py-1\">\n {items.map((item, index) => {\n const itemMessageIds =\n item.messageIds && item.messageIds.length > 0\n ? item.messageIds\n : [item.id];\n const active = itemMessageIds.some(\n (messageId) =>\n visibleMessageIdSet.has(messageId) || messageId === currentAnchorId\n );\n const distance =\n focusIndex >= 0 ? Math.abs(index - focusIndex) : Number.POSITIVE_INFINITY;\n const isFocused = distance === 0;\n const isNear = distance === 1;\n const isNextNear = distance === 2;\n const barWidth = isFocused\n ? 50\n : isNear\n ? 36\n : isNextNear\n ? 23\n : 10;\n const barOpacity = isFocused ? 1 : isNear ? 0.78 : isNextNear ? 0.58 : 0.36;\n const fallbackLabel = `Turn ${index + 1}`;\n const previewLabel =\n item.label && item.label !== fallbackLabel ? item.label : \"\";\n const responsePreview = (item.responsePreview || \"\").trim();\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={active}\n dir=\"ltr\"\n className={cx(\n \"group relative flex h-2 w-16 items-center rounded-sm outline-none\",\n railSide === \"left\" ? \"justify-start\" : \"justify-end\"\n )}\n aria-label={`Jump to ${item.label || fallbackLabel}`}\n onBlur={() => setHoveredIndex(null)}\n onFocus={() => setHoveredIndex(index)}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={() =>\n scrollToMessage(item.id, {\n align: \"start\",\n behavior: \"smooth\",\n })\n }\n >\n <span\n className=\"h-0.5 rounded-full bg-muted-foreground/55 transition-[width,background-color,opacity] duration-150 ease-out group-hover:bg-foreground group-focus-visible:bg-foreground group-data-[active=true]:bg-foreground\"\n style={{\n opacity: barOpacity,\n width: barWidth,\n }}\n />\n {previewLabel ? (\n <span\n dir={dir}\n className={cx(\n \"pointer-events-none absolute top-1/2 z-20 max-h-32 w-64 -translate-y-1/2 overflow-hidden rounded-lg border border-border/80 bg-background p-3 text-start opacity-0 shadow-lg transition-all duration-200 group-hover:pointer-events-auto group-hover:opacity-100 group-focus-visible:pointer-events-auto group-focus-visible:opacity-100\",\n railSide === \"left\"\n ? \"left-full ml-2 -translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\"\n : \"right-full mr-2 translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\",\n cardClassName\n )}\n >\n <span\n className=\"block overflow-hidden text-sm leading-5 text-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: responsePreview ? 2 : 4,\n }}\n >\n {previewLabel}\n </span>\n {responsePreview ? (\n <span\n className=\"mt-1 block overflow-hidden text-sm leading-5 text-muted-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n }}\n >\n {responsePreview}\n </span>\n ) : null}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n\nexport const LatestThreadScroller = {\n Provider: LatestThreadScrollerProvider,\n Root: LatestThreadScrollerRoot,\n Viewport: LatestThreadScrollerViewport,\n Content: LatestThreadScrollerContent,\n Item: LatestThreadScrollerItem,\n Button: LatestThreadScrollerButton,\n Outline: LatestThreadScrollerOutline,\n};\n","import type {\n Agents24ChatRenderOptions,\n ChatMessage,\n ChatPart,\n ChatToolPart,\n} from \"./types\";\n\nexport const DefaultToolPart = ({ part }: { part: ChatToolPart }) => {\n const label =\n typeof part.presentation?.activity === \"string\"\n ? part.presentation.activity\n : typeof part.presentation?.title === \"string\"\n ? part.presentation.title\n : part.toolName;\n const detail =\n typeof part.presentation?.detail === \"string\"\n ? part.presentation.detail\n : part.errorText || part.state;\n\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <div>{label}</div>\n {detail ? <div>{detail}</div> : null}\n </div>\n );\n};\n\nexport const DefaultChatPart = ({\n part,\n message,\n renderOptions,\n}: {\n part: ChatPart;\n message: ChatMessage;\n renderOptions?: Agents24ChatRenderOptions;\n}) => {\n if (renderOptions?.renderPart) {\n return <>{renderOptions.renderPart(part, message)}</>;\n }\n\n if (part.kind === \"text\") return <>{part.text}</>;\n\n if (part.kind === \"tool\") {\n const ToolRenderer =\n renderOptions?.toolRenderers?.[part.type] ||\n renderOptions?.fallbackToolRenderer ||\n DefaultToolPart;\n return <>{ToolRenderer({ part, message })}</>;\n }\n\n if (part.kind === \"reasoning\") {\n return <div data-agents24-reasoning-part>{part.text || part.label}</div>;\n }\n\n if (part.kind === \"ui-blocks\") {\n return <div data-agents24-ui-blocks-part data-state={part.state} />;\n }\n\n if (part.kind === \"hitl\") {\n return <div data-agents24-hitl-part={part.interruptId || \"\"} />;\n }\n\n if (part.kind === \"error\") {\n return <div data-agents24-error-part>{part.errorText}</div>;\n }\n\n if (part.kind === \"data\") {\n return <div data-agents24-data-part={part.name} />;\n }\n\n return null;\n};\n\nexport const renderChatPart = (\n part: ChatPart,\n message: ChatMessage,\n renderOptions?: Agents24ChatRenderOptions\n) => (\n <DefaultChatPart\n key={part.id}\n part={part}\n message={message}\n renderOptions={renderOptions}\n />\n);\n","import type { ChatRuntimeEvent, ChatStreamResult } from \"./types\";\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\") return false;\n const maybe = error as { name?: unknown; message?: unknown };\n return maybe.name === \"AbortError\" || String(maybe.message || \"\").toLowerCase().includes(\"aborted\");\n};\n\nexport const parseSseBlock = (block: string): ChatRuntimeEvent | null => {\n const data = block\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.replace(/^data:\\s?/, \"\"))\n .join(\"\\n\")\n .trim();\n if (!data) return null;\n return JSON.parse(data) as ChatRuntimeEvent;\n};\n\nexport const consumeSseResponse = async (\n response: Response,\n onEvent: (event: ChatRuntimeEvent) => void | Promise<void>,\n options: { signal?: AbortSignal } = {}\n): Promise<ChatStreamResult> => {\n if (!response.ok) {\n let message = response.statusText || \"Failed to open chat stream.\";\n try {\n const errorData = await response.json();\n message = String(errorData.detail || errorData.message || message);\n } catch {\n // Keep the status text.\n }\n throw new Error(message);\n }\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"The chat stream did not return a readable body.\");\n const decoder = new TextDecoder();\n let buffer = \"\";\n let threadId: string | null = response.headers.get(\"X-Thread-ID\") || null;\n let runId: string | null = response.headers.get(\"X-Run-ID\") || null;\n let closed = false;\n const closeReader = () => {\n closed = true;\n queueMicrotask(() => {\n void reader.cancel().catch(() => {\n // Reader cancellation is a normal stream shutdown path.\n });\n });\n };\n if (options.signal?.aborted) {\n closeReader();\n return { threadId, runId };\n }\n options.signal?.addEventListener(\"abort\", closeReader, { once: true });\n try {\n while (!closed) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n const event = parseSseBlock(block);\n if (!event) continue;\n if (event.run_id) runId = event.run_id;\n const payloadThreadId = event.payload?.thread_id;\n if (payloadThreadId) threadId = String(payloadThreadId);\n await onEvent(event);\n }\n }\n } catch (error) {\n if (!isAbortError(error)) throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", closeReader);\n }\n return { threadId, runId };\n};\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { ChatMessage, ChatPart } from \"./types\";\n\nexport type StreamingTextMode = \"streaming\" | \"static\";\n\nexport type StreamingTextCache = {\n get: (id: string) => string | undefined;\n set: (id: string, text: string) => void;\n};\n\nexport type UseStreamingTextOptions = {\n id: string;\n isStreaming: boolean;\n text: string;\n cache?: StreamingTextCache | false;\n charsPerSecond?: number;\n catchupThreshold?: number;\n maxCatchupChars?: number;\n};\n\nexport type UseStreamingTextResult = {\n displayedText: string;\n isAnimating: boolean;\n mode: StreamingTextMode;\n parseIncompleteMarkdown: boolean;\n};\n\nconst DEFAULT_COMPLETED_TEXT_CACHE_SIZE = 200;\nconst defaultCompletedTextCache = new Map<string, string>();\n\nconst defaultStreamingTextCache: StreamingTextCache = {\n get: (id) => defaultCompletedTextCache.get(id),\n set: (id, text) => {\n defaultCompletedTextCache.set(id, text);\n if (defaultCompletedTextCache.size > DEFAULT_COMPLETED_TEXT_CACHE_SIZE) {\n const firstKey = defaultCompletedTextCache.keys().next().value;\n if (firstKey) defaultCompletedTextCache.delete(firstKey);\n }\n },\n};\n\nexport const getActiveStreamingTextPartId = (\n message: ChatMessage,\n streamingMessageId: string | null\n) => {\n if (message.role !== \"assistant\" || streamingMessageId !== message.id) return null;\n return (\n message.parts\n .slice()\n .reverse()\n .find((part) => part.kind === \"text\")?.id || null\n );\n};\n\nexport const isActiveStreamingTextPart = (\n message: ChatMessage,\n part: ChatPart,\n streamingMessageId: string | null\n) => part.kind === \"text\" && part.id === getActiveStreamingTextPartId(message, streamingMessageId);\n\nexport function useStreamingText({\n id,\n isStreaming,\n text,\n cache = defaultStreamingTextCache,\n charsPerSecond = 72,\n catchupThreshold = 40,\n maxCatchupChars = 20,\n}: UseStreamingTextOptions): UseStreamingTextResult {\n const cacheAdapter = cache === false ? null : cache;\n const [displayedText, setDisplayedText] = useState(() => {\n const cachedText = cacheAdapter?.get(id);\n return isStreaming && cachedText !== text ? \"\" : text;\n });\n const targetRef = useRef(text);\n const displayedRef = useRef(displayedText);\n const rafRef = useRef<number | null>(null);\n const lastFrameAtRef = useRef<number | null>(null);\n const idRef = useRef(id);\n const shouldAnimateRef = useRef(isStreaming);\n\n useEffect(() => {\n if (isStreaming || !text) return;\n cacheAdapter?.set(id, text);\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n targetRef.current = text;\n }, [text]);\n\n useEffect(() => {\n if (idRef.current === id) return;\n\n idRef.current = id;\n const cachedText = cacheAdapter?.get(id);\n const initial = isStreaming && cachedText !== text ? \"\" : text;\n shouldAnimateRef.current = isStreaming && initial !== text;\n displayedRef.current = initial;\n setDisplayedText(initial);\n\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n const reduceMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n if (reduceMotion) {\n displayedRef.current = text;\n setDisplayedText(text);\n shouldAnimateRef.current = false;\n return;\n }\n\n const cachedText = cacheAdapter?.get(id);\n if (cachedText === text) {\n displayedRef.current = text;\n setDisplayedText(text);\n shouldAnimateRef.current = false;\n return;\n }\n\n if (isStreaming) {\n shouldAnimateRef.current = true;\n }\n\n if (!shouldAnimateRef.current) {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n if (!text.startsWith(displayedRef.current)) {\n displayedRef.current = \"\";\n setDisplayedText(\"\");\n }\n\n const tick = (timestamp: number) => {\n const previousTimestamp = lastFrameAtRef.current ?? timestamp;\n lastFrameAtRef.current = timestamp;\n\n const target = targetRef.current;\n const current = displayedRef.current;\n\n if (current.length >= target.length) {\n shouldAnimateRef.current = false;\n rafRef.current = null;\n return;\n }\n\n const elapsedMs = Math.max(8, timestamp - previousTimestamp);\n const charsFromTime = Math.max(1, Math.floor((elapsedMs / 1000) * charsPerSecond));\n const gap = target.length - current.length;\n const catchupStep =\n gap > catchupThreshold ? Math.min(maxCatchupChars, Math.ceil(gap / 10)) : charsFromTime;\n const nextLength = Math.min(\n target.length,\n current.length + Math.max(charsFromTime, catchupStep)\n );\n\n const next = target.slice(0, nextLength);\n displayedRef.current = next;\n setDisplayedText(next);\n rafRef.current = window.requestAnimationFrame(tick);\n };\n\n if (rafRef.current === null && displayedRef.current.length < text.length) {\n rafRef.current = window.requestAnimationFrame(tick);\n }\n\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n };\n }, [cacheAdapter, catchupThreshold, charsPerSecond, id, isStreaming, maxCatchupChars, text]);\n\n return {\n displayedText,\n isAnimating: isStreaming,\n mode: isStreaming ? \"streaming\" : \"static\",\n parseIncompleteMarkdown: isStreaming,\n };\n}\n","import { consumeSseResponse } from \"./sse\";\nimport type { ChatSubmitInput, ChatThreadSummaryEvent, ChatTransport } from \"./types\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FetchChatTransportRoutes = {\n listThreads: () => string;\n getThread: (input: {\n threadId: string;\n limit?: number;\n beforeTurnIndex?: number | null;\n includeRunEvents?: boolean;\n }) => string;\n streamMessage: () => string;\n attachRun: (input: { runId: string }) => string;\n cancelRun: (input: { runId: string }) => string;\n deleteThread?: (input: { threadId: string }) => string;\n threadEvents?: (input: { cursor?: number | null }) => string;\n resumeRun?: (input: { runId: string }) => string;\n startMcpAuth?: (input: { runId: string; serverId: string }) => string;\n};\n\nexport type FetchChatTransportOptions = {\n routes: FetchChatTransportRoutes;\n fetchImpl?: typeof fetch;\n headers?: () => MaybePromise<HeadersInit>;\n streamBody?: (input: ChatSubmitInput) => unknown;\n};\n\nconst jsonHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n});\n\nconst streamHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n});\n\nexport class ChatTransportError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"ChatTransportError\";\n this.status = status;\n }\n}\n\nconst transportError = (response: Response, fallback: string) =>\n new ChatTransportError(response.statusText || fallback, response.status);\n\nexport const createFetchChatTransport = ({\n routes,\n fetchImpl = fetch,\n headers,\n streamBody,\n}: FetchChatTransportOptions): ChatTransport => {\n const loadHeaders = async () => headers?.() ?? {};\n return {\n async listThreads(input) {\n const response = await fetchImpl(routes.listThreads(), {\n signal: input?.signal,\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to list chat threads.\");\n return response.json();\n },\n async getThread(input) {\n const response = await fetchImpl(routes.getThread(input), {\n signal: input.signal,\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to load chat thread.\");\n return response.json();\n },\n async streamMessage(input, onEvent) {\n const response = await fetchImpl(routes.streamMessage(), {\n method: \"POST\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n body: JSON.stringify(\n streamBody?.(input) ?? {\n input: input.text,\n thread_id: input.threadId || undefined,\n files: input.files || [],\n }\n ),\n });\n return consumeSseResponse(response, onEvent, { signal: input.signal });\n },\n async attachRun(input, onEvent) {\n const response = await fetchImpl(routes.attachRun(input), {\n method: \"POST\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n body: JSON.stringify({}),\n });\n return consumeSseResponse(response, onEvent, { signal: input.signal });\n },\n async cancelRun(input) {\n const response = await fetchImpl(routes.cancelRun(input), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({ assistant_output_text: input.assistantOutputText || undefined }),\n });\n if (!response.ok) throw transportError(response, \"Failed to cancel chat run.\");\n return response.json();\n },\n async deleteThread(input) {\n if (!routes.deleteThread) return { deleted: false };\n const response = await fetchImpl(routes.deleteThread(input), {\n method: \"DELETE\",\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to delete chat thread.\");\n return response.json();\n },\n async subscribeThreadEvents(input, onEvent) {\n if (!routes.threadEvents) return;\n const response = await fetchImpl(routes.threadEvents({ cursor: input.cursor }), {\n method: \"GET\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n });\n await consumeSseResponse(\n response,\n (event) => onEvent(event as unknown as ChatThreadSummaryEvent),\n { signal: input.signal },\n );\n },\n async resumeHitl(input) {\n if (!routes.resumeRun) throw new ChatTransportError(\"HITL resume is not configured.\", 501);\n const response = await fetchImpl(routes.resumeRun({ runId: input.runId }), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({\n schema_version: \"agents24.hitl.resume.v1\",\n interrupt_id: input.interruptId,\n decisions: input.decisions,\n client: input.client,\n }),\n });\n if (!response.ok) throw transportError(response, \"Failed to resume chat run.\");\n return response.json();\n },\n async startMcpAuth(input) {\n if (!routes.startMcpAuth) throw new ChatTransportError(\"MCP auth is not configured.\", 501);\n const response = await fetchImpl(routes.startMcpAuth({ runId: input.runId, serverId: input.serverId }), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({\n interrupt_id: input.interruptId || undefined,\n principal_type: input.principalType || undefined,\n principal_id: input.principalId || undefined,\n client: input.client,\n }),\n });\n if (!response.ok) throw transportError(response, \"Failed to start MCP authorization.\");\n return response.json();\n },\n };\n};\n","export {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\nexport type {\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollable,\n MessageScrollerScrollOptions,\n MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\n"],"mappings":"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","names":["import_react","window","next","content","import_jsx_runtime","isAbortError","import_react","import_message_scroller"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/controller.ts","../src/controller-actions.ts","../src/controller-hitl.ts","../src/controller-thread-events.ts","../src/context-window.ts","../src/model.ts","../src/controller-helpers.ts","../src/message-lifecycle.ts","../src/latest-thread-scroller.tsx","../src/renderers.tsx","../src/sse.ts","../src/streaming-text.ts","../src/transport.ts","../src/viewport.ts"],"sourcesContent":["export * from \"./controller\";\nexport * from \"./context-window\";\nexport * from \"./latest-thread-scroller\";\nexport * from \"./message-lifecycle\";\nexport * from \"./model\";\nexport * from \"./renderers\";\nexport * from \"./sse\";\nexport * from \"./streaming-text\";\nexport * from \"./transport\";\nexport * from \"./types\";\nexport * from \"./viewport\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useControllerMessageActions } from \"./controller-actions\";\nimport { useControllerHitl } from \"./controller-hitl\";\nimport type { UseAgents24ChatControllerOptions } from \"./controller-options\";\nimport { useControllerThreadEvents } from \"./controller-thread-events\";\nimport { mergeContextWindowUpdate } from \"./context-window\";\nimport { abortDetachedStream, isAbortError, isThreadNotFoundError, mergeStoredThreadsForRefresh, threadSummaryToStored, type FinalizeInput } from \"./controller-helpers\";\nimport { upsertStableAssistantMessage } from \"./message-lifecycle\";\nimport { activeRunIdFromThread, activeRunIdFromThreadDetail, assistantTextFromResponseBlocks, autoAttachRunIdFromThread, createChatId, DEFAULT_THREAD_PAGE_SIZE, hasStaleUnfinishedAssistantCache, latestContextWindowFromThread, mergeReasoningSteps, partsFromResponseBlocks, reasoningStepsFromParts, threadActivityDate, threadDetailToMessages, threadPaging, titleFromMessage } from \"./model\";\nimport type { ChatAttachment, ChatContextWindow, ChatController, ChatMessage, ChatPart, ChatReasoningStep, ChatRuntimeEvent, ChatStorageAdapter, ChatStreamResult, ChatSubmitMessage, ChatTransport } from \"./types\";\nimport type { StoredChatThread } from \"./types\";\nexport { mergeStoredThreadsForRefresh } from \"./controller-helpers\";\nexport type { UseAgents24ChatControllerOptions } from \"./controller-options\";\nexport function useAgents24ChatController(options: UseAgents24ChatControllerOptions): ChatController {\n const { transport, storage, activeThreadId: controlledActiveThreadId, pageSize = DEFAULT_THREAD_PAGE_SIZE,\n storageKey, createId = createChatId, onActiveThreadIdChange, onSourceClick, onStreamErrorMessage,\n onRuntimeEvent, onThreadDetailLoaded } = options;\n const activeThreadId = controlledActiveThreadId ?? storage.getActiveThreadId?.() ?? null;\n const initialCached = activeThreadId ? storage.getThread(activeThreadId) : undefined;\n const [messages, setMessages] = useState<ChatMessage[]>(() => initialCached?.messages || []);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingHistory, setIsLoadingHistory] = useState(() => Boolean(activeThreadId) && !initialCached?.messages?.length);\n const [isLoadingOlder, setIsLoadingOlder] = useState(false);\n const [hasOlderTurns, setHasOlderTurns] = useState(Boolean(initialCached?.hasOlderTurns));\n const [streamingContent, setStreamingContent] = useState(\"\");\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [contextStatus, setContextStatus] = useState<ChatContextWindow | null>(null);\n const [currentReasoning, setCurrentReasoning] = useState<ChatReasoningStep[]>([]);\n const [liked, setLiked] = useState<Record<string, boolean>>({});\n const [disliked, setDisliked] = useState<Record<string, boolean>>({});\n const [copiedMessageId, setCopiedMessageId] = useState<string | null>(null);\n const [lastThinkingDurationMs, setLastThinkingDurationMs] = useState<number | null>(null);\n const [threads, setThreads] = useState<StoredChatThread[]>(() => storage.listThreads());\n const [isRefreshingThreads, setIsRefreshingThreads] = useState(false);\n const [isSelectingThread, setIsSelectingThread] = useState(false);\n const [activeRunId, setActiveRunId] = useState<string | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const activeThreadIdRef = useRef<string | null>(activeThreadId);\n const messagesRef = useRef<ChatMessage[]>(messages);\n const nextBeforeTurnIndexRef = useRef<number | null>(initialCached?.nextBeforeTurnIndex ?? null);\n const hasOlderTurnsRef = useRef(Boolean(initialCached?.hasOlderTurns));\n const isLoadingOlderRef = useRef(false);\n const loadedThreadIdRef = useRef<string | null>(initialCached?.messages?.length ? activeThreadId : null);\n const requestSeqRef = useRef(0);\n const isLoadingHistoryRef = useRef(isLoadingHistory);\n const activeRunIdRef = useRef<string | null>(null);\n const reattachedRunIdRef = useRef<string | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const [lifecycleAbortController] = useState(() => new AbortController());\n const streamingContentRef = useRef(\"\");\n const streamingMessageIdRef = useRef<string | null>(null);\n const reasoningRef = useRef<ChatReasoningStep[]>([]);\n const liveVoiceIdsRef = useRef<{ user?: string; assistant?: string }>({});\n const refreshSeqRef = useRef(0);\n const setActiveRunIdValue = useCallback((runId: string | null) => {\n activeRunIdRef.current = runId;\n setActiveRunId(runId);\n }, []);\n const syncThreadsFromStorage = useCallback(() => {\n setThreads(storage.listThreads());\n }, [storage]);\n const upsertStoredThread = useCallback(\n (thread: StoredChatThread) => {\n storage.upsertThread(thread);\n syncThreadsFromStorage();\n },\n [storage, syncThreadsFromStorage]\n );\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n const persistThread = useCallback(\n (\n threadId: string,\n nextMessages: ChatMessage[],\n paging?: { hasOlderTurns?: boolean; nextBeforeTurnIndex?: number | null },\n options?: { updatedAt?: string; touch?: boolean }\n ) => {\n const existing = storage.getThread(threadId);\n const firstUser = nextMessages.find((message) => message.role === \"user\");\n upsertStoredThread({\n ...(existing || {}),\n id: threadId,\n title: existing?.title || (firstUser ? titleFromMessage(firstUser.content, firstUser.attachments || []) : \"New chat\"),\n updated_at: options?.updatedAt || (options?.touch ? new Date().toISOString() : existing?.updated_at) || new Date().toISOString(),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging?.hasOlderTurns ?? hasOlderTurnsRef.current,\n nextBeforeTurnIndex: paging?.nextBeforeTurnIndex ?? nextBeforeTurnIndexRef.current,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const markThreadRunStatus = useCallback(\n (threadId: string, runId: string, status: string, lastEventSeq?: number | null) => {\n const existing = storage.getThread(threadId);\n if (!existing || !runId) return;\n upsertStoredThread({\n ...existing,\n last_run_id: runId,\n last_run_status: status,\n active_run: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastEventSeq: typeof lastEventSeq === \"number\" ? lastEventSeq : existing.lastEventSeq ?? null,\n isRunning: activeRunIdFromThread({\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: { run_id: runId, status },\n }) !== null,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const refresh = useCallback(async () => {\n const seq = ++refreshSeqRef.current;\n setIsRefreshingThreads(true);\n try {\n const data = await transport.listThreads({ signal: lifecycleAbortController.signal });\n if (lifecycleAbortController.signal.aborted) return;\n if (seq !== refreshSeqRef.current) return;\n const nextThreads = (data.items || []).map((item) => threadSummaryToStored(item));\n storage.setThreads(mergeStoredThreadsForRefresh(storage.listThreads(), nextThreads));\n setThreads(storage.listThreads());\n } finally {\n if (!lifecycleAbortController.signal.aborted && seq === refreshSeqRef.current) setIsRefreshingThreads(false);\n }\n }, [lifecycleAbortController, storage, transport]);\n\n const applyThreadId = useCallback(\n (threadId: string, baseMessages: ChatMessage[]) => {\n if (!threadId || activeThreadIdRef.current === threadId) return;\n activeThreadIdRef.current = threadId;\n persistThread(threadId, messagesRef.current.length > 0 ? messagesRef.current : baseMessages, undefined, { touch: true });\n storage.setActiveThreadId?.(threadId);\n onActiveThreadIdChange?.(threadId);\n },\n [onActiveThreadIdChange, persistThread, storage]\n );\n const setStreamingText = (value: string) => {\n streamingContentRef.current = value;\n setStreamingContent(value);\n };\n const setLoadingHistory = useCallback((value: boolean) => {\n isLoadingHistoryRef.current = value;\n setIsLoadingHistory(value);\n }, []);\n const setReasoningSteps = useCallback((value: ChatReasoningStep[]) => {\n reasoningRef.current = value || [];\n setCurrentReasoning(value || []);\n }, []);\n const detachActiveStream = useCallback(() => {\n const controller = abortControllerRef.current;\n abortControllerRef.current = null;\n abortDetachedStream(controller);\n setActiveRunIdValue(null);\n reattachedRunIdRef.current = null;\n streamingMessageIdRef.current = null;\n streamingContentRef.current = \"\";\n reasoningRef.current = [];\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingContent(\"\");\n setCurrentReasoning([]);\n }, [setActiveRunIdValue]);\n\n const clearMissingThread = useCallback(\n (threadId: string) => {\n storage.deleteThread?.(threadId);\n syncThreadsFromStorage();\n if (activeThreadIdRef.current !== threadId) return;\n\n requestSeqRef.current += 1;\n detachActiveStream();\n activeThreadIdRef.current = null;\n loadedThreadIdRef.current = null;\n nextBeforeTurnIndexRef.current = null;\n hasOlderTurnsRef.current = false;\n storage.setActiveThreadId?.(null);\n onActiveThreadIdChange?.(null);\n setMessages([]);\n messagesRef.current = [];\n setHasOlderTurns(false);\n setIsLoadingOlder(false);\n setContextStatus(null);\n setLoadingHistory(false);\n },\n [detachActiveStream, onActiveThreadIdChange, setLoadingHistory, storage, syncThreadsFromStorage]\n );\n\n const setLiveAssistantMessage = useCallback(\n (input: {\n messageId: string;\n runId?: string | null;\n content: string;\n reasoning: ChatReasoningStep[];\n parts?: ChatPart[];\n baseMessages?: ChatMessage[];\n }) => {\n setMessages((prev) => {\n const next = upsertStableAssistantMessage(prev, {\n baseMessages: input.baseMessages,\n messageId: input.messageId,\n runId: input.runId,\n create: () => ({\n id: input.messageId,\n role: \"assistant\",\n runId: input.runId ?? null,\n content: input.content,\n createdAt: new Date(),\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts || [],\n }),\n update: (message) => ({\n ...message,\n runId: input.runId ?? message.runId ?? null,\n content: input.content,\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts ?? message.parts,\n }),\n });\n messagesRef.current = next;\n return next;\n });\n },\n []\n );\n\n const finalizeAssistantMessage = useCallback(\n (input: FinalizeInput) => {\n const content = input.error || input.assistantText.trim();\n if (!content) return input.baseMessages;\n const existingIndex = input.baseMessages.findIndex(\n (message) => (input.messageId && message.id === input.messageId) || (input.runId && message.role === \"assistant\" && message.runId === input.runId)\n );\n const existing = existingIndex >= 0 ? input.baseMessages[existingIndex] : undefined;\n const parts =\n input.parts ||\n existing?.parts ||\n partsFromResponseBlocks(undefined, content);\n const assistant: ChatMessage = {\n id: existing?.id || input.messageId || createId(),\n role: \"assistant\",\n runId: input.runId ?? existing?.runId ?? null,\n content,\n createdAt: new Date(),\n isFinal: true,\n parts,\n reasoningSteps: mergeReasoningSteps(input.reasoning, { finalize: true }),\n thinkingDurationMs: input.thinkingDurationMs,\n };\n const completed = upsertStableAssistantMessage(input.baseMessages, {\n messageId: input.messageId,\n runId: input.runId,\n create: () => assistant,\n update: (message) => ({\n ...message,\n ...assistant,\n id: message.id,\n createdAt: message.createdAt,\n }),\n });\n setMessages(completed);\n messagesRef.current = completed;\n if (input.threadId) {\n persistThread(input.threadId, completed);\n const existingThread = storage.getThread(input.threadId);\n if (existingThread && input.runId) {\n upsertStoredThread({\n ...existingThread,\n messages: completed,\n last_run_id: input.runId,\n last_run_status: input.error ? \"failed\" : \"completed\",\n active_run: null,\n lastRunId: input.runId,\n lastRunStatus: input.error ? \"failed\" : \"completed\",\n activeRun: null,\n isRunning: false,\n });\n }\n }\n return completed;\n },\n [createId, persistThread, storage, upsertStoredThread]\n );\n\n const loadThread = useCallback(\n async (threadId: string) => {\n const seq = ++requestSeqRef.current;\n setLoadingHistory(true);\n setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n includeRunEvents: false,\n signal: lifecycleAbortController.signal,\n });\n if (activeThreadIdRef.current !== threadId || seq !== requestSeqRef.current) return;\n void onThreadDetailLoaded?.(detail);\n const nextMessages = threadDetailToMessages(detail);\n const paging = threadPaging(detail);\n setContextStatus(latestContextWindowFromThread(detail));\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n setHasOlderTurns(paging.hasOlderTurns);\n hasOlderTurnsRef.current = paging.hasOlderTurns;\n nextBeforeTurnIndexRef.current = paging.nextBeforeTurnIndex;\n loadedThreadIdRef.current = threadId;\n upsertStoredThread({\n ...threadSummaryToStored(detail),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging.hasOlderTurns,\n nextBeforeTurnIndex: paging.nextBeforeTurnIndex,\n updated_at: threadActivityDate(detail),\n });\n } catch (error) {\n if (isAbortError(error)) return;\n if (isThreadNotFoundError(error)) {\n clearMissingThread(threadId);\n return;\n }\n throw error;\n } finally {\n if (!lifecycleAbortController.signal.aborted && activeThreadIdRef.current === threadId && seq === requestSeqRef.current) setLoadingHistory(false);\n }\n },\n [clearMissingThread, lifecycleAbortController, onThreadDetailLoaded, pageSize, setLoadingHistory, transport, upsertStoredThread]\n );\n\n const loadOlderTurns = useCallback(async () => {\n const threadId = activeThreadIdRef.current;\n const beforeTurnIndex = nextBeforeTurnIndexRef.current;\n if (!threadId || beforeTurnIndex === null || isLoadingOlderRef.current) return;\n isLoadingOlderRef.current = true;\n setIsLoadingOlder(true);\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n beforeTurnIndex,\n includeRunEvents: false,\n signal: lifecycleAbortController.signal,\n });\n if (activeThreadIdRef.current !== threadId) return;\n const older = threadDetailToMessages(detail);\n const paging = threadPaging(detail);\n const next = [...older, ...messagesRef.current];\n setMessages(next);\n messagesRef.current = next;\n setHasOlderTurns(paging.hasOlderTurns);\n hasOlderTurnsRef.current = paging.hasOlderTurns;\n nextBeforeTurnIndexRef.current = paging.nextBeforeTurnIndex;\n persistThread(threadId, next, paging);\n } catch (error) {\n if (isAbortError(error)) return;\n if (isThreadNotFoundError(error)) {\n clearMissingThread(threadId);\n return;\n }\n throw error;\n } finally {\n if (!lifecycleAbortController.signal.aborted && activeThreadIdRef.current === threadId) setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n }\n }, [clearMissingThread, lifecycleAbortController, pageSize, persistThread, transport]);\n\n const handleStreamEvent = useCallback(\n (input: { mode: \"submit\" | \"attach\"; event: ChatRuntimeEvent; assistantMessageId: string; startedAt: number; streamThreadIdRef: { current: string | null }; baseMessages: ChatMessage[] }) => {\n const { mode, event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages } = input;\n const payload = event.payload || {};\n const responseBlocks = Array.isArray(payload.response_blocks) ? (payload.response_blocks as Array<Record<string, unknown>>) : null;\n if (event.run_id) setActiveRunIdValue(event.run_id);\n void onRuntimeEvent?.(event, {\n mode,\n assistantMessageId,\n threadId: streamThreadIdRef.current,\n runId: event.run_id || activeRunIdRef.current,\n startedAt,\n });\n setContextStatus((current) => mergeContextWindowUpdate(current, payload.context_window));\n if (responseBlocks) {\n const blockText = String(payload.assistant_output_text || \"\") || assistantTextFromResponseBlocks(responseBlocks) || streamingContentRef.current;\n if (blockText) setStreamingText(blockText);\n const parts = partsFromResponseBlocks(responseBlocks, blockText);\n const reasoning = mergeReasoningSteps([...reasoningRef.current, ...reasoningStepsFromParts(parts)]);\n setReasoningSteps(reasoning);\n setLiveAssistantMessage({\n messageId: assistantMessageId,\n runId: event.run_id || activeRunIdRef.current,\n content: blockText,\n reasoning,\n parts,\n baseMessages,\n });\n }\n if (event.event === \"run.accepted\" || event.event === \"run.snapshot\") {\n const nextThreadId = String(payload.thread_id || streamThreadIdRef.current || \"\");\n if (nextThreadId) {\n streamThreadIdRef.current = nextThreadId;\n applyThreadId(nextThreadId, baseMessages);\n markThreadRunStatus(nextThreadId, event.run_id || activeRunIdRef.current || \"\", String(payload.status || \"running\"), typeof payload.last_event_seq === \"number\" ? payload.last_event_seq : null);\n }\n return;\n }\n const isTerminal = event.event === \"run.completed\" || event.event === \"run.cancelled\" || event.event === \"reshet.stream.result\";\n const isFailed = event.event === \"run.failed\" || event.event.endsWith(\".stream.error\");\n if (!isTerminal && !isFailed) return;\n const terminalThreadId = String(payload.thread_id || \"\");\n if (terminalThreadId && !streamThreadIdRef.current) {\n streamThreadIdRef.current = terminalThreadId;\n applyThreadId(terminalThreadId, baseMessages);\n }\n const finalText = String(payload.assistant_output_text || assistantTextFromResponseBlocks(responseBlocks || []) || streamingContentRef.current || \"\");\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current || activeThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: finalText,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: event.run_id || activeRunIdRef.current,\n parts: responseBlocks ? partsFromResponseBlocks(responseBlocks, finalText) : undefined,\n error: isFailed\n ? String(payload.message || payload.error || event.diagnostics?.[0]?.message || onStreamErrorMessage?.(event) || \"The chat run failed.\")\n : undefined,\n });\n },\n [applyThreadId, finalizeAssistantMessage, markThreadRunStatus, onRuntimeEvent, onStreamErrorMessage, setActiveRunIdValue, setLiveAssistantMessage, setReasoningSteps]\n );\n\n const runStream = useCallback(\n async (input: { mode: \"submit\"; message: ChatSubmitMessage } | { mode: \"attach\"; threadId: string; runId: string }) => {\n const startedAt = Date.now();\n const controller = new AbortController();\n requestSeqRef.current += 1;\n abortControllerRef.current = controller;\n setIsLoading(true);\n setStreamingText(\"\");\n setReasoningSteps([{ label: input.mode === \"attach\" ? \"Reconnecting\" : \"Connecting\", status: \"active\" }]);\n const streamThreadIdRef = { current: input.mode === \"attach\" ? input.threadId : activeThreadIdRef.current };\n const attachAssistantMessage = input.mode === \"attach\"\n ? [...messagesRef.current]\n .reverse()\n .find(\n (message) =>\n message.role === \"assistant\" &&\n (message.runId === input.runId || message.isFinal === false)\n )\n : undefined;\n let assistantMessageId = input.mode === \"attach\"\n ? attachAssistantMessage?.id || `${input.runId}-assistant`\n : createId();\n let baseMessages = messagesRef.current;\n if (input.mode === \"submit\") {\n const userMessage: ChatMessage = {\n id: createId(),\n role: \"user\",\n content: input.message.text,\n createdAt: new Date(),\n parts: input.message.text\n ? [{ id: createId(), type: \"text\", kind: \"text\", text: input.message.text }]\n : [],\n attachments: input.message.files,\n };\n baseMessages = [...messagesRef.current, userMessage];\n }\n if (!messagesRef.current.some((message) => message.id === assistantMessageId)) {\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n isFinal: false,\n parts: [],\n reasoningSteps: [],\n };\n const liveMessages: ChatMessage[] = [...baseMessages, assistantMessage];\n setMessages(liveMessages);\n messagesRef.current = liveMessages;\n } else if (input.mode === \"attach\" && attachAssistantMessage) {\n const nextMessages = messagesRef.current.map((message) =>\n message.id === attachAssistantMessage.id\n ? { ...message, runId: message.runId || input.runId, isFinal: false }\n : message\n );\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n baseMessages = nextMessages;\n if (streamThreadIdRef.current) persistThread(streamThreadIdRef.current, nextMessages);\n }\n streamingMessageIdRef.current = assistantMessageId;\n setStreamingMessageId(assistantMessageId);\n if (streamThreadIdRef.current) {\n persistThread(\n streamThreadIdRef.current,\n messagesRef.current.length > 0 ? messagesRef.current : baseMessages,\n undefined,\n { touch: input.mode === \"submit\" }\n );\n }\n try {\n let streamResult: ChatStreamResult | null = null;\n if (input.mode === \"attach\") {\n setActiveRunIdValue(input.runId);\n reattachedRunIdRef.current = input.runId;\n streamResult = await transport.attachRun({ runId: input.runId, signal: controller.signal }, (event) =>\n handleStreamEvent({ mode: \"attach\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n } else {\n streamResult = await transport.streamMessage(\n { ...input.message, files: input.message.files || [], threadId: activeThreadIdRef.current, signal: controller.signal },\n (event) => handleStreamEvent({ mode: \"submit\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n }\n if (streamResult?.runId) setActiveRunIdValue(streamResult.runId);\n if (streamResult?.threadId) {\n streamThreadIdRef.current = streamResult.threadId;\n applyThreadId(streamResult.threadId, baseMessages);\n if (streamResult.runId) {\n markThreadRunStatus(streamResult.threadId, streamResult.runId, \"running\");\n }\n }\n if (streamingContentRef.current.trim() && streamingMessageIdRef.current) {\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: streamingContentRef.current,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: activeRunIdRef.current,\n });\n }\n await refresh().catch(() => undefined);\n } catch (error) {\n if (!isAbortError(error)) {\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: streamingContentRef.current,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: activeRunIdRef.current,\n error: onStreamErrorMessage?.(error) || (error as Error).message || \"Failed to reach the chat agent.\",\n });\n }\n } finally {\n const isCurrentStream =\n abortControllerRef.current === controller ||\n streamingMessageIdRef.current === assistantMessageId;\n if (abortControllerRef.current === controller) abortControllerRef.current = null;\n if (isCurrentStream) {\n setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n reattachedRunIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n setLastThinkingDurationMs(Date.now() - startedAt);\n }\n }\n },\n [createId, finalizeAssistantMessage, handleStreamEvent, onStreamErrorMessage, persistThread, refresh, setActiveRunIdValue, setReasoningSteps, transport]\n );\n\n const handleSubmit = useCallback(\n async (message: ChatSubmitMessage) => {\n if (!message.text.trim() && !(message.files || []).length) return;\n await runStream({ mode: \"submit\", message });\n },\n [runStream]\n );\n const attachRun = useCallback(async (runId: string, threadId?: string | null) => {\n const resolvedThreadId = threadId ?? activeThreadIdRef.current;\n if (runId && resolvedThreadId) await runStream({ mode: \"attach\", runId, threadId: resolvedThreadId });\n }, [runStream]);\n const { pendingHitl, isResolvingHitl, resumeHitl } = useControllerHitl({\n messages,\n transport,\n activeRunId,\n activeRunIdRef,\n activeThreadIdRef,\n runStream,\n });\n const handleStop = useCallback(() => {\n const runId = activeRunIdRef.current;\n const partial = streamingContentRef.current;\n const liveMessageId = streamingMessageIdRef.current;\n abortDetachedStream(abortControllerRef.current);\n abortControllerRef.current = null;\n setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n if (runId) transport.cancelRun({ runId, assistantOutputText: partial }).catch(() => undefined);\n if (partial.trim()) {\n finalizeAssistantMessage({\n threadId: activeThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: partial,\n reasoning: reasoningRef.current,\n thinkingDurationMs: lastThinkingDurationMs || 0,\n messageId: liveMessageId,\n });\n }\n }, [finalizeAssistantMessage, lastThinkingDurationMs, setActiveRunIdValue, setReasoningSteps, transport]);\n\n useEffect(() => {\n refresh().catch((error) => {\n if (!isAbortError(error) && !lifecycleAbortController.signal.aborted) {\n setThreads(storage.listThreads());\n }\n });\n }, [lifecycleAbortController, refresh, storage]);\n\n useEffect(() => {\n return () => {\n lifecycleAbortController.abort();\n abortDetachedStream(abortControllerRef.current);\n abortControllerRef.current = null;\n };\n }, [lifecycleAbortController]);\n\n useControllerThreadEvents({ transport, storage, refresh, setThreads });\n\n useEffect(() => {\n syncThreadsFromStorage();\n }, [storageKey, syncThreadsFromStorage]);\n\n useEffect(() => {\n const previous = activeThreadIdRef.current;\n activeThreadIdRef.current = activeThreadId;\n if (\n activeThreadId &&\n previous === activeThreadId &&\n (activeRunIdRef.current || streamingMessageIdRef.current)\n ) {\n return;\n }\n if (previous && previous !== activeThreadId && abortControllerRef.current) {\n detachActiveStream();\n }\n if (!activeThreadId) {\n if (\n previous === null &&\n loadedThreadIdRef.current === null &&\n messagesRef.current.length === 0 &&\n !hasOlderTurnsRef.current &&\n !isLoadingHistoryRef.current &&\n !isLoadingOlderRef.current &&\n nextBeforeTurnIndexRef.current === null\n ) {\n return;\n }\n requestSeqRef.current += 1;\n loadedThreadIdRef.current = null;\n setMessages([]);\n messagesRef.current = [];\n setHasOlderTurns(false);\n setIsLoadingOlder(false);\n setContextStatus(null);\n nextBeforeTurnIndexRef.current = null;\n setLoadingHistory(false);\n return;\n }\n const cached = storage.getThread(activeThreadId);\n const cachedMessages = cached?.isHydrated && cached.messages?.length ? cached.messages : null;\n const hasCachedMessages = Boolean(cachedMessages);\n const shouldRefreshStaleCache = hasCachedMessages && hasStaleUnfinishedAssistantCache(cached);\n if (cached && cachedMessages) {\n setMessages(cachedMessages);\n messagesRef.current = cachedMessages;\n setHasOlderTurns(Boolean(cached.hasOlderTurns));\n hasOlderTurnsRef.current = Boolean(cached.hasOlderTurns);\n nextBeforeTurnIndexRef.current = cached.nextBeforeTurnIndex ?? null;\n loadedThreadIdRef.current = activeThreadId;\n setLoadingHistory(false);\n if (!shouldRefreshStaleCache) return;\n }\n if (!hasCachedMessages) {\n setMessages([]);\n messagesRef.current = [];\n }\n void loadThread(activeThreadId).catch(() => setLoadingHistory(false));\n }, [activeThreadId, detachActiveStream, loadThread, setLoadingHistory, storage]);\n\n useEffect(() => {\n const threadId = activeThreadId;\n if (!threadId || isLoadingHistory || loadedThreadIdRef.current !== threadId || activeRunIdRef.current) return;\n const runId = autoAttachRunIdFromThread(storage.getThread(threadId));\n if (!runId || reattachedRunIdRef.current === runId) return;\n void runStream({ mode: \"attach\", threadId, runId });\n }, [activeThreadId, isLoadingHistory, runStream, storage, storageKey]);\n\n useEffect(() => {\n const threadId = activeThreadId;\n if (\n !threadId ||\n isLoadingHistoryRef.current ||\n activeRunIdRef.current ||\n streamingMessageIdRef.current\n ) {\n return;\n }\n const cached = storage.getThread(threadId);\n if (!hasStaleUnfinishedAssistantCache(cached)) return;\n void loadThread(threadId).catch(() => setLoadingHistory(false));\n }, [activeThreadId, loadThread, setLoadingHistory, storage, storageKey]);\n\n const {\n handleCopy,\n handleDislike,\n handleLike,\n handleRetry,\n startNewThread,\n upsertLiveVoiceMessage,\n } = useControllerMessageActions({\n activeThreadIdRef,\n createId,\n detachActiveStream,\n disliked,\n handleSubmit,\n hasOlderTurnsRef,\n liked,\n liveVoiceIdsRef,\n loadedThreadIdRef,\n messagesRef,\n nextBeforeTurnIndexRef,\n onActiveThreadIdChange,\n persistThread,\n requestSeqRef,\n setContextStatus,\n setCopiedMessageId,\n setDisliked,\n setHasOlderTurns,\n setIsLoadingOlder,\n setLiked,\n setLoadingHistory,\n setMessages,\n storage,\n });\n\n const loadThreadById = useCallback(\n async (threadId: string) => {\n if (!threadId) return;\n setIsSelectingThread(true);\n if (activeThreadIdRef.current !== threadId) {\n if (abortControllerRef.current) detachActiveStream();\n activeThreadIdRef.current = threadId;\n storage.setActiveThreadId?.(threadId);\n onActiveThreadIdChange?.(threadId);\n }\n try {\n await loadThread(threadId);\n } finally {\n if (activeThreadIdRef.current === threadId) setIsSelectingThread(false);\n }\n },\n [detachActiveStream, loadThread, onActiveThreadIdChange, storage]\n );\n\n const activeThread = activeThreadId\n ? storage.getThread(activeThreadId) || threads.find((thread) => thread.id === activeThreadId) || null\n : null;\n\n return useMemo(() => ({\n threads, activeThreadId, activeThread, messages, streamingContent, streamingMessageId,\n contextStatus, currentReasoning, isLoading, isLoadingHistory, isLoadingOlder,\n isRefreshingThreads, isSelectingThread, hasOlderTurns, liked, disliked, copiedMessageId,\n lastThinkingDurationMs, activeRunId, pendingHitl, isResolvingHitl, handleSubmit, attachRun, resumeHitl, handleStop, handleCopy, handleLike,\n handleDislike, handleRetry, handleSourceClick: (citations: ChatMessage[\"citations\"]) => onSourceClick?.(citations),\n upsertLiveVoiceMessage, startNewThread, loadThreadById, loadOlderTurns, refresh, textareaRef,\n }), [\n copiedMessageId, activeRunId, activeThread, activeThreadId, attachRun, contextStatus, currentReasoning,\n disliked, handleCopy, handleDislike, handleLike, handleRetry, handleStop, handleSubmit,\n hasOlderTurns, isLoading, isLoadingHistory, isLoadingOlder, isRefreshingThreads,\n isSelectingThread, lastThinkingDurationMs, liked, loadThreadById, loadOlderTurns, messages,\n isResolvingHitl, onSourceClick, pendingHitl, refresh, resumeHitl, streamingContent, streamingMessageId, startNewThread, threads, upsertLiveVoiceMessage,\n ]);\n}\n","import { useCallback, type Dispatch, type MutableRefObject, type SetStateAction } from \"react\";\nimport type {\n ChatCitation,\n ChatMessage,\n ChatReasoningStep,\n ChatStorageAdapter,\n ChatSubmitMessage,\n} from \"./types\";\n\ntype PagingRef = MutableRefObject<number | null>;\n\nexport function useControllerMessageActions(input: {\n activeThreadIdRef: MutableRefObject<string | null>;\n createId: () => string;\n detachActiveStream: () => void;\n disliked: Record<string, boolean>;\n handleSubmit: (message: ChatSubmitMessage) => Promise<void>;\n hasOlderTurnsRef: MutableRefObject<boolean>;\n liked: Record<string, boolean>;\n liveVoiceIdsRef: MutableRefObject<{ user?: string; assistant?: string }>;\n loadedThreadIdRef: MutableRefObject<string | null>;\n messagesRef: MutableRefObject<ChatMessage[]>;\n nextBeforeTurnIndexRef: PagingRef;\n onActiveThreadIdChange?: (threadId: string | null) => void;\n persistThread: (threadId: string, nextMessages: ChatMessage[]) => void;\n requestSeqRef: MutableRefObject<number>;\n setContextStatus: Dispatch<SetStateAction<any>>;\n setCopiedMessageId: Dispatch<SetStateAction<string | null>>;\n setDisliked: Dispatch<SetStateAction<Record<string, boolean>>>;\n setHasOlderTurns: Dispatch<SetStateAction<boolean>>;\n setIsLoadingOlder: Dispatch<SetStateAction<boolean>>;\n setLiked: Dispatch<SetStateAction<Record<string, boolean>>>;\n setLoadingHistory: (value: boolean) => void;\n setMessages: Dispatch<SetStateAction<ChatMessage[]>>;\n storage: ChatStorageAdapter;\n}) {\n const handleCopy = useCallback((content: string, messageId: string) => {\n navigator.clipboard?.writeText(content);\n input.setCopiedMessageId(messageId);\n setTimeout(() => input.setCopiedMessageId(null), 200);\n }, [input]);\n\n const handleLike = useCallback(async (msg: ChatMessage) => {\n const nextLiked = !input.liked[msg.id];\n input.setLiked((prev) => ({ ...prev, [msg.id]: nextLiked }));\n if (nextLiked) input.setDisliked((prev) => ({ ...prev, [msg.id]: false }));\n }, [input]);\n\n const handleDislike = useCallback(async (msg: ChatMessage) => {\n const nextDisliked = !input.disliked[msg.id];\n input.setDisliked((prev) => ({ ...prev, [msg.id]: nextDisliked }));\n if (nextDisliked) input.setLiked((prev) => ({ ...prev, [msg.id]: false }));\n }, [input]);\n\n const handleRetry = useCallback(async (msg: ChatMessage) => {\n const index = input.messagesRef.current.findIndex((message) => message.id === msg.id);\n if (index <= 0) return;\n const userMessage = input.messagesRef.current[index - 1];\n if (userMessage.role !== \"user\") return;\n const trimmed = input.messagesRef.current.slice(0, index);\n input.setMessages(trimmed);\n input.messagesRef.current = trimmed;\n if (input.activeThreadIdRef.current) input.persistThread(input.activeThreadIdRef.current, trimmed);\n await input.handleSubmit({ text: userMessage.content, files: userMessage.attachments || [] });\n }, [input]);\n\n const upsertLiveVoiceMessage = useCallback((payload: {\n role: \"user\" | \"assistant\";\n content: string;\n isFinal?: boolean;\n citations?: ChatCitation[];\n reasoningSteps?: ChatReasoningStep[];\n }) => {\n const content = payload.content?.trim() ?? \"\";\n if (!content && !payload.citations?.length && !payload.reasoningSteps?.length) return;\n input.setMessages((prev) => {\n const currentId = input.liveVoiceIdsRef.current[payload.role];\n const index = currentId ? prev.findIndex((message) => message.id === currentId) : -1;\n const nextMessage: ChatMessage = {\n id: currentId || input.createId(),\n role: payload.role,\n content,\n createdAt: new Date(),\n isFinal: Boolean(payload.isFinal),\n isVoice: payload.role === \"user\",\n parts: content ? [{ id: input.createId(), type: \"text\", kind: \"text\", text: content }] : [],\n citations: payload.citations,\n reasoningSteps: payload.reasoningSteps,\n };\n const next = index === -1 ? [...prev, nextMessage] : prev.map((message, itemIndex) => itemIndex === index ? { ...message, ...nextMessage } : message);\n input.liveVoiceIdsRef.current[payload.role] = payload.isFinal ? undefined : nextMessage.id;\n input.messagesRef.current = next;\n if (input.activeThreadIdRef.current) input.persistThread(input.activeThreadIdRef.current, next);\n return next;\n });\n }, [input]);\n\n const startNewThread = useCallback(() => {\n input.detachActiveStream();\n input.requestSeqRef.current += 1;\n input.activeThreadIdRef.current = null;\n input.loadedThreadIdRef.current = null;\n input.nextBeforeTurnIndexRef.current = null;\n input.hasOlderTurnsRef.current = false;\n input.storage.setActiveThreadId?.(null);\n input.onActiveThreadIdChange?.(null);\n input.setMessages([]);\n input.messagesRef.current = [];\n input.setHasOlderTurns(false);\n input.setIsLoadingOlder(false);\n input.setContextStatus(null);\n input.setLoadingHistory(false);\n }, [input]);\n\n return { handleCopy, handleDislike, handleLike, handleRetry, startNewThread, upsertLiveVoiceMessage };\n}\n","import { useCallback, useMemo, useState, type MutableRefObject } from \"react\";\nimport type {\n ChatHitlPart,\n ChatHitlResumeInput,\n ChatHitlResumeResult,\n ChatMessage,\n ChatTransport,\n} from \"./types\";\n\ntype RunStream = (input: {\n mode: \"attach\";\n threadId: string;\n runId: string;\n}) => Promise<void>;\n\nexport function useControllerHitl({\n messages,\n transport,\n activeRunId,\n activeRunIdRef,\n activeThreadIdRef,\n runStream,\n}: {\n messages: ChatMessage[];\n transport: ChatTransport;\n activeRunId: string | null;\n activeRunIdRef: MutableRefObject<string | null>;\n activeThreadIdRef: MutableRefObject<string | null>;\n runStream: RunStream;\n}) {\n const [isResolvingHitl, setIsResolvingHitl] = useState(false);\n const pendingHitl = useMemo<ChatHitlPart | null>(() => {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const parts = messages[messageIndex]?.parts || [];\n for (let partIndex = parts.length - 1; partIndex >= 0; partIndex -= 1) {\n const part = parts[partIndex];\n if (part?.kind === \"hitl\" && part.status === \"pending\") return part;\n }\n }\n return null;\n }, [messages]);\n\n const resumeHitl = useCallback(async (\n input: Omit<ChatHitlResumeInput, \"runId\"> & { runId?: string },\n ): Promise<ChatHitlResumeResult> => {\n if (!transport.resumeHitl) throw new Error(\"HITL resume is not configured.\");\n const runId = input.runId || activeRunIdRef.current || activeRunId;\n if (!runId) throw new Error(\"No paused run is available to resume.\");\n setIsResolvingHitl(true);\n try {\n const result = await transport.resumeHitl({ ...input, runId });\n const threadId = result.thread_id || activeThreadIdRef.current;\n if (threadId) await runStream({ mode: \"attach\", runId: result.run_id || runId, threadId });\n return result;\n } finally {\n setIsResolvingHitl(false);\n }\n }, [activeRunId, activeRunIdRef, activeThreadIdRef, runStream, transport]);\n\n return { pendingHitl, isResolvingHitl, resumeHitl };\n}\n","import { useEffect, useRef } from \"react\";\nimport { applyThreadSummaryEvent, isAbortError } from \"./controller-helpers\";\nimport type { ChatStorageAdapter, ChatTransport, StoredChatThread } from \"./types\";\n\nexport function useControllerThreadEvents({\n transport,\n storage,\n refresh,\n setThreads,\n}: {\n transport: ChatTransport;\n storage: ChatStorageAdapter;\n refresh: () => Promise<void>;\n setThreads: (threads: StoredChatThread[]) => void;\n}) {\n const cursorRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!transport.subscribeThreadEvents) return;\n let cancelled = false;\n let retryTimeout: ReturnType<typeof setTimeout> | null = null;\n let controller: AbortController | null = null;\n\n const connect = () => {\n if (cancelled) return;\n controller = new AbortController();\n transport.subscribeThreadEvents?.(\n { cursor: cursorRef.current, signal: controller.signal },\n async (event) => {\n if (typeof event.cursor === \"number\") cursorRef.current = event.cursor;\n if (event.event === \"snapshot_required\") {\n await refresh().catch(() => undefined);\n return;\n }\n storage.setThreads(applyThreadSummaryEvent(storage.listThreads(), event));\n setThreads(storage.listThreads());\n }\n ).catch((error) => {\n if (cancelled || isAbortError(error)) return;\n retryTimeout = setTimeout(connect, 1500);\n });\n };\n\n connect();\n return () => {\n cancelled = true;\n if (retryTimeout) clearTimeout(retryTimeout);\n controller?.abort();\n };\n }, [refresh, setThreads, storage, transport]);\n}\n","export type ContextWindowSource =\n | \"exact\"\n | \"estimated\"\n | \"provider_count_api\"\n | \"provider_usage\"\n | \"runtime_tokenizer\"\n | \"hf_tokenizer\"\n | \"multimodal_estimate\"\n | \"text_estimate\"\n | \"tokenizer_estimate\"\n | \"heuristic_estimate\"\n | \"unknown\";\n\nexport type ContextWindowStage = \"preflight\" | \"sent_prompt\" | \"final_usage\";\nexport type ContextWindowConfidence = \"exact\" | \"high\" | \"medium\" | \"low\" | \"unknown\";\n\nexport type ContextCompressionStatus = {\n active: boolean;\n reason?: string | null;\n input_tokens?: number | null;\n max_tokens?: number | null;\n usage_ratio?: number | null;\n full_frame_count?: number | null;\n compact_frame_count?: number | null;\n dropped_frame_count?: number | null;\n artifact_ref_count?: number | null;\n compression_trigger_budget?: number | null;\n compression_target_budget?: number | null;\n compression_target_ratio?: number | null;\n threshold_used?: number | null;\n};\n\nexport type ContextWindow = {\n source: ContextWindowSource;\n run_id?: string | null;\n stage?: ContextWindowStage | null;\n confidence?: ContextWindowConfidence | null;\n counter?: string | null;\n model_id?: string | null;\n max_tokens?: number | null;\n max_tokens_source?: string | null;\n input_tokens?: number | null;\n remaining_tokens?: number | null;\n usage_ratio?: number | null;\n assembly?: Record<string, unknown> | null;\n context_compression?: ContextCompressionStatus | null;\n};\n\nconst SOURCE_PRIORITY: Record<ContextWindowSource, number> = {\n unknown: 0,\n heuristic_estimate: 1,\n tokenizer_estimate: 1,\n text_estimate: 1,\n estimated: 1,\n multimodal_estimate: 2,\n hf_tokenizer: 3,\n runtime_tokenizer: 3,\n provider_count_api: 4,\n provider_usage: 5,\n exact: 5,\n};\n\nconst STAGE_PRIORITY: Record<ContextWindowStage, number> = {\n preflight: 0,\n sent_prompt: 1,\n final_usage: 2,\n};\n\nfunction numberOrNull(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction stagePriority(window: ContextWindow | null | undefined): number {\n return STAGE_PRIORITY[window?.stage || \"sent_prompt\"] ?? STAGE_PRIORITY.sent_prompt;\n}\n\nfunction hasRenderableContextWindow(window: ContextWindow | null | undefined): boolean {\n const maxTokens = window?.max_tokens;\n return typeof maxTokens === \"number\" && Number.isFinite(maxTokens) && maxTokens > 0;\n}\n\nfunction windowWeight(window: ContextWindow | null | undefined): [number, number] {\n if (!window) return [0, 0];\n return [stagePriority(window), SOURCE_PRIORITY[window.source] || 0];\n}\n\nexport function normalizeContextCompression(value: unknown): ContextCompressionStatus | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n return {\n active: Boolean(payload.active),\n reason: typeof payload.reason === \"string\" ? payload.reason : null,\n input_tokens: numberOrNull(payload.input_tokens),\n max_tokens: numberOrNull(payload.max_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n full_frame_count: numberOrNull(payload.full_frame_count),\n compact_frame_count: numberOrNull(payload.compact_frame_count),\n dropped_frame_count: numberOrNull(payload.dropped_frame_count),\n artifact_ref_count: numberOrNull(payload.artifact_ref_count),\n compression_trigger_budget: numberOrNull(payload.compression_trigger_budget),\n compression_target_budget: numberOrNull(payload.compression_target_budget),\n compression_target_ratio: numberOrNull(payload.compression_target_ratio),\n threshold_used: numberOrNull(payload.threshold_used),\n };\n}\n\nexport function normalizeContextWindow(value: unknown): ContextWindow | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n const rawSource = String(payload.source || \"\").trim();\n const source: ContextWindowSource =\n rawSource === \"exact\" ||\n rawSource === \"estimated\" ||\n rawSource === \"unknown\" ||\n rawSource === \"provider_count_api\" ||\n rawSource === \"provider_usage\" ||\n rawSource === \"runtime_tokenizer\" ||\n rawSource === \"hf_tokenizer\" ||\n rawSource === \"multimodal_estimate\" ||\n rawSource === \"text_estimate\" ||\n rawSource === \"tokenizer_estimate\" ||\n rawSource === \"heuristic_estimate\"\n ? rawSource\n : rawSource\n ? \"estimated\"\n : \"unknown\";\n const rawStage = String(payload.stage || \"\").trim();\n const stage: ContextWindowStage =\n rawStage === \"preflight\" || rawStage === \"sent_prompt\" || rawStage === \"final_usage\"\n ? rawStage\n : \"sent_prompt\";\n const rawConfidence = String(payload.confidence || \"\").trim();\n const confidence: ContextWindowConfidence | null =\n rawConfidence === \"exact\" ||\n rawConfidence === \"high\" ||\n rawConfidence === \"medium\" ||\n rawConfidence === \"low\" ||\n rawConfidence === \"unknown\"\n ? rawConfidence\n : null;\n\n return {\n source,\n run_id: typeof payload.run_id === \"string\" ? payload.run_id : null,\n stage,\n confidence,\n counter: typeof payload.counter === \"string\" ? payload.counter : null,\n model_id: typeof payload.model_id === \"string\" ? payload.model_id : null,\n max_tokens: numberOrNull(payload.max_tokens),\n max_tokens_source: typeof payload.max_tokens_source === \"string\" ? payload.max_tokens_source : null,\n input_tokens: numberOrNull(payload.input_tokens),\n remaining_tokens: numberOrNull(payload.remaining_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n assembly:\n payload.assembly && typeof payload.assembly === \"object\" && !Array.isArray(payload.assembly)\n ? (payload.assembly as Record<string, unknown>)\n : null,\n context_compression: normalizeContextCompression(payload.context_compression),\n };\n}\n\nexport function mergeContextWindow(\n current: ContextWindow | null | undefined,\n incoming: ContextWindow | null | undefined\n): ContextWindow | null {\n if (!incoming) return current ?? null;\n if (!current) return incoming;\n if (hasRenderableContextWindow(current) && !hasRenderableContextWindow(incoming)) return current;\n\n const currentRunId = current.run_id || null;\n const incomingRunId = incoming.run_id || null;\n if (incomingRunId && currentRunId && incomingRunId !== currentRunId) {\n return stagePriority(incoming) >= STAGE_PRIORITY.sent_prompt ? incoming : current;\n }\n\n const currentWeight = windowWeight(current);\n const incomingWeight = windowWeight(incoming);\n return incomingWeight[0] > currentWeight[0] ||\n (incomingWeight[0] === currentWeight[0] && incomingWeight[1] >= currentWeight[1])\n ? incoming\n : current;\n}\n\nexport function mergeContextWindowUpdate(\n current: ContextWindow | null | undefined,\n incoming: unknown\n): ContextWindow | null {\n return mergeContextWindow(current, normalizeContextWindow(incoming));\n}\n\nexport function compressionFromContextWindow(\n contextWindow: ContextWindow | null | undefined\n): ContextCompressionStatus | null {\n if (!contextWindow) return null;\n if (contextWindow.context_compression) return contextWindow.context_compression;\n const assembly = contextWindow.assembly;\n if (!assembly || typeof assembly !== \"object\" || Array.isArray(assembly)) return null;\n const artifactRefs = Array.isArray(assembly.artifact_refs) ? assembly.artifact_refs : [];\n const compactFrameCount = numberOrNull(assembly.compact_frame_count) ?? 0;\n const droppedFrameCount = numberOrNull(assembly.dropped_frame_count) ?? 0;\n const reason = typeof assembly.compaction_reason === \"string\" ? assembly.compaction_reason : \"none\";\n return {\n active: reason !== \"none\" || compactFrameCount > 0 || droppedFrameCount > 0,\n reason,\n input_tokens: contextWindow.input_tokens ?? null,\n max_tokens: contextWindow.max_tokens ?? null,\n usage_ratio: contextWindow.usage_ratio ?? null,\n full_frame_count: numberOrNull(assembly.full_frame_count),\n compact_frame_count: compactFrameCount,\n dropped_frame_count: droppedFrameCount,\n artifact_ref_count: artifactRefs.length,\n compression_trigger_budget: numberOrNull(assembly.compression_trigger_budget),\n compression_target_budget: numberOrNull(assembly.compression_target_budget),\n compression_target_ratio: numberOrNull(assembly.compression_target_ratio),\n threshold_used: numberOrNull(assembly.threshold_used),\n };\n}\n","import type {\n ChatPart,\n ChatContextWindow,\n ChatDataPart,\n ChatErrorPart,\n ChatMessage,\n ChatReasoningStep,\n ChatRuntimeEvent,\n ChatThreadDetail,\n ChatThreadSummary,\n ChatThreadTurn,\n ChatToolPart,\n ChatToolState,\n ChatHitlAction,\n ChatHitlKind,\n ChatHitlStatus,\n ToolPresentation,\n} from \"./types\";\nimport { normalizeContextWindow } from \"./context-window\";\n\nexport const DEFAULT_THREAD_PAGE_SIZE = 5;\n\nexport const isRunningThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\", \"cancelling\", \"paused\"]).has(String(status || \"\").toLowerCase());\n\nexport const isAutoAttachThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\", \"cancelling\"]).has(String(status || \"\").toLowerCase());\n\nexport const createChatId = () => {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) return crypto.randomUUID();\n return `chat-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nexport const titleFromMessage = (text: string, files: Array<{ filename?: string }> = []) => {\n const base = text.trim() || files[0]?.filename || \"New chat\";\n return base.replace(/\\s+/g, \" \").slice(0, 48);\n};\n\nexport const threadActivityDate = (thread: ChatThreadSummary) =>\n String(thread.updated_at || thread.last_activity_at || thread.created_at || new Date().toISOString());\n\nexport const assistantTextFromResponseBlocks = (blocks?: Array<Record<string, unknown>>) =>\n (blocks || [])\n .filter((block) => block.kind === \"assistant_text\" && typeof block.text === \"string\")\n .map((block) => String(block.text))\n .join(\"\\n\\n\")\n .trim();\n\nexport const assistantTextFromParts = (parts?: ChatPart[]) =>\n (parts || [])\n .filter((part): part is Extract<ChatPart, { kind: \"text\" }> => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\\n\\n\")\n .trim();\n\nconst displayTextWithoutInlineAttachments = (text: string, hasAttachments: boolean) => {\n if (!hasAttachments) return text;\n const marker = \"Attached text file (\";\n const trimmed = text.trim();\n if (trimmed.startsWith(marker)) return \"\";\n const markerIndex = text.indexOf(`\\n\\n${marker}`);\n if (markerIndex === -1) return text;\n return text.slice(0, markerIndex).trim();\n};\n\nconst attachmentsFromTurn = (turn: ChatThreadTurn) =>\n (turn.attachments || []).map((attachment, index) => {\n const record = attachment || {};\n return {\n ...record,\n type: \"file\",\n url: String(record.url || \"\"),\n filename: String(record.filename || record.name || `attachment-${index + 1}`),\n mediaType: String(record.mime_type || record.mediaType || record.type || \"application/octet-stream\"),\n };\n });\n\nconst tokenUsageFromTurn = (turn: ChatThreadTurn): ChatMessage[\"tokenUsage\"] | undefined => {\n const usage = turn.run_usage;\n if (!usage || typeof usage !== \"object\") return undefined;\n return {\n inputTokens: usage.input_tokens ?? null,\n outputTokens: usage.output_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n usageSource: usage.source ?? null,\n };\n};\n\nconst latestEventPayloadValue = (events: ChatRuntimeEvent[] | undefined, key: string) => {\n for (let index = (events || []).length - 1; index >= 0; index -= 1) {\n const payload = events?.[index]?.payload;\n if (payload && payload[key] !== undefined && payload[key] !== null) return payload[key];\n }\n return undefined;\n};\n\nconst responseBlocksFromTurn = (turn: ChatThreadTurn) => {\n if (Array.isArray(turn.response_blocks) && turn.response_blocks.length > 0) return turn.response_blocks;\n const fromEvents = latestEventPayloadValue(turn.run_events, \"response_blocks\");\n return Array.isArray(fromEvents) ? (fromEvents as Array<Record<string, unknown>>) : [];\n};\n\nconst assistantTextFromEvents = (events?: ChatRuntimeEvent[]) => {\n const assistantText = latestEventPayloadValue(events, \"assistant_output_text\");\n if (typeof assistantText === \"string\" && assistantText.trim()) return assistantText;\n return \"\";\n};\n\nconst asRecord = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n\nconst optionalString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n\nexport const toolStateFromStatus = (status?: unknown): ChatToolState => {\n const normalized = String(status || \"\").trim().toLowerCase();\n if ([\"failed\", \"error\"].includes(normalized)) return \"output-error\";\n if ([\"cancelled\", \"canceled\"].includes(normalized)) return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n if ([\"running\", \"active\", \"pending\", \"streaming\"].includes(normalized)) return \"input-available\";\n return \"input-available\";\n};\n\nconst toolNameFromRecord = (tool: Record<string, unknown>) =>\n String(tool.toolName || tool.tool_name || tool.name || tool.slug || tool.action || \"tool\").trim() || \"tool\";\n\nconst toolCallIdFromRecords = (\n block: Record<string, unknown>,\n tool: Record<string, unknown>\n) =>\n optionalString(tool.toolCallId) ||\n optionalString(tool.tool_call_id) ||\n optionalString(block.toolCallId) ||\n optionalString(block.tool_call_id) ||\n optionalString(block.id) ||\n null;\n\nconst presentationFromTool = (tool: Record<string, unknown>): ToolPresentation | null => {\n const presentation = asRecord(tool.presentation);\n const outputView = asRecord(tool.outputView) || asRecord(tool.output_view);\n const next: ToolPresentation = presentation ? { ...presentation } : {};\n ([\n \"title\",\n \"activity\",\n \"detail\",\n \"category\",\n \"groupKey\",\n \"groupLabel\",\n \"showOutput\",\n \"outputView\",\n ] as const).forEach((key) => {\n if (tool[key] !== undefined) {\n (next as Record<string, unknown>)[key] = tool[key];\n }\n });\n if (tool.group_key !== undefined) next.group_key = tool.group_key;\n if (tool.group_label !== undefined) next.group_label = tool.group_label;\n if (tool.show_output !== undefined) next.show_output = tool.show_output;\n if (outputView && next.outputView === undefined) next.outputView = outputView;\n return Object.keys(next).length > 0 ? next : null;\n};\n\nconst createToolPart = (block: Record<string, unknown>, index: number): ChatToolPart => {\n const tool = asRecord(block.tool) || {};\n const toolName = toolNameFromRecord(tool);\n const errorText =\n optionalString(tool.errorText) ||\n optionalString(tool.error) ||\n optionalString(block.error) ||\n null;\n return {\n id: String(block.id || `${block.kind || \"tool\"}-${index}`),\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolCallId: toolCallIdFromRecords(block, tool),\n state: toolStateFromStatus(block.status),\n input: tool.input ?? block.input,\n output: tool.output ?? block.output,\n errorText,\n presentation: presentationFromTool(tool),\n raw: block,\n };\n};\n\nconst createDataPart = (\n block: Record<string, unknown>,\n index: number,\n name = String(block.kind || \"data\")\n): ChatDataPart => ({\n id: String(block.id || `${name}-${index}`),\n type: \"data\",\n kind: \"data\",\n name,\n data: block,\n raw: block,\n});\n\nexport const partsFromResponseBlocks = (\n blocks?: Array<Record<string, unknown>>,\n fallbackText?: string\n): ChatPart[] => {\n const parts: ChatPart[] = [];\n (blocks || []).forEach((block, index) => {\n const id = String(block.id || `${block.kind || \"block\"}-${index}`);\n if (block.kind === \"assistant_text\" && typeof block.text === \"string\") {\n parts.push({ id, type: \"text\", kind: \"text\", text: String(block.text), raw: block });\n return;\n }\n if (block.kind === \"tool_call\") {\n parts.push(createToolPart(block, index));\n return;\n }\n if (block.kind === \"ui_blocks\") {\n parts.push({\n id,\n type: \"ui-blocks\",\n kind: \"ui-blocks\",\n state: toolStateFromStatus(block.status),\n toolCallId: optionalString(block.toolCallId) || optionalString(block.tool_call_id) || null,\n contractVersion: optionalString(block.contractVersion) || optionalString(block.contract_version) || null,\n bundle: asRecord(block.bundle),\n errorText: optionalString(block.error) || null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"reasoning_note\") {\n parts.push({\n id,\n type: \"reasoning\",\n kind: \"reasoning\",\n label: optionalString(block.label) || null,\n text: optionalString(block.text) || optionalString(block.summary) || null,\n status: optionalString(block.status) || null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"hitl_request\") {\n const hitl = asRecord(block.hitl) || block;\n if (hitl.schema_version !== \"agents24.hitl.interrupt.v2\") {\n throw new Error(\"Invalid V2 HITL response block.\");\n }\n const interruptId = optionalString(block.interruptId) || optionalString(hitl.interrupt_id);\n const hitlKind = optionalString(block.hitlKind) || optionalString(hitl.kind);\n const status = optionalString(block.status) || optionalString(hitl.status) || \"pending\";\n const allowedActions = Array.isArray(hitl.allowed_actions)\n ? hitl.allowed_actions.filter((value): value is ChatHitlAction => [\"approve\", \"reject\", \"connect\", \"skip\"].includes(String(value)))\n : [];\n if (!interruptId || allowedActions.length === 0 || ![\"tool_review\", \"mcp_auth\", \"user_approval\", \"app_data_permission\"].includes(String(hitlKind))) {\n throw new Error(\"Invalid V2 HITL response block.\");\n }\n const resolution = asRecord(block.resolution);\n parts.push({\n id,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId,\n hitlKind: hitlKind as ChatHitlKind,\n message: optionalString(hitl.message) || optionalString(block.text) || \"Input is required to continue.\",\n allowedActions,\n status: status as ChatHitlStatus,\n presentation: asRecord(hitl.presentation) || {},\n resolution: resolution ? {\n action: [\"approve\", \"reject\", \"connect\", \"skip\"].includes(String(resolution.action))\n ? String(resolution.action) as ChatHitlAction\n : null,\n outcome: optionalString(resolution.outcome),\n reason: optionalString(resolution.reason),\n resolvedAt: optionalString(resolution.resolved_at),\n resolver: asRecord(resolution.resolver) as { principalType?: string | null; principalId?: string | null } | null,\n } : null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"error\") {\n parts.push({\n id,\n type: \"error\",\n kind: \"error\",\n errorText: optionalString(block.error) || optionalString(block.message) || \"Error\",\n raw: block,\n } satisfies ChatErrorPart);\n return;\n }\n parts.push(createDataPart(block, index));\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText?.trim()) {\n parts.push({ id: \"assistant-fallback-text\", type: \"text\", kind: \"text\", text: fallbackText });\n }\n return parts;\n};\n\nexport const mergeReasoningSteps = (\n steps?: ChatReasoningStep[],\n options?: { finalize?: boolean }\n) => {\n if (!steps?.length) return [];\n const merged: ChatReasoningStep[] = [];\n const indexMap = new Map<string, number>();\n steps.forEach((step) => {\n const key = String(step.label);\n const status = options?.finalize ? \"complete\" : step.status || \"complete\";\n if (indexMap.has(key)) {\n const index = indexMap.get(key)!;\n merged[index] = { ...merged[index], ...step, status };\n } else {\n indexMap.set(key, merged.push({ ...step, status }) - 1);\n }\n });\n return merged;\n};\n\nexport const reasoningStepsFromParts = (parts?: ChatPart[]): ChatReasoningStep[] =>\n (parts || [])\n .map((block) => {\n if (block.kind === \"tool\") {\n const label =\n optionalString(block.presentation?.activity) ||\n optionalString(block.presentation?.title) ||\n block.toolName;\n return {\n label,\n status: block.state === \"input-available\" || block.state === \"input-streaming\" ? \"active\" : \"complete\",\n description: optionalString(block.presentation?.detail) || \"\",\n } satisfies ChatReasoningStep;\n }\n if (block.kind === \"reasoning\") {\n return {\n label: block.label || \"Reasoning\",\n status: block.status === \"running\" ? \"active\" : \"complete\",\n description: block.text || \"\",\n } satisfies ChatReasoningStep;\n }\n return null;\n })\n .filter(Boolean) as ChatReasoningStep[];\n\nconst turnToMessages = (turn: ChatThreadTurn, activeRunId?: string | null): ChatMessage[] => {\n const messages: ChatMessage[] = [];\n const createdAt = turn.created_at ? new Date(turn.created_at) : new Date();\n const baseId = turn.id || turn.run_id || createChatId();\n const responseBlocks = responseBlocksFromTurn(turn);\n const isRunning = isRunningThreadStatus(turn.status) || Boolean(turn.run_id && activeRunId === turn.run_id);\n const attachments = attachmentsFromTurn(turn);\n const userContent = displayTextWithoutInlineAttachments(turn.user_input_text || \"\", attachments.length > 0);\n if (userContent || attachments.length > 0) {\n messages.push({\n id: `${baseId}-user`,\n role: \"user\",\n content: userContent,\n createdAt,\n parts: userContent ? [{ id: `${baseId}-user-text`, type: \"text\", kind: \"text\", text: userContent }] : [],\n attachments,\n });\n }\n const assistantText =\n turn.assistant_output_text ||\n assistantTextFromResponseBlocks(responseBlocks) ||\n assistantTextFromEvents(turn.run_events);\n if (assistantText || responseBlocks.length > 0 || isRunning) {\n const parts = partsFromResponseBlocks(responseBlocks, assistantText);\n messages.push({\n id: `${baseId}-assistant`,\n role: \"assistant\",\n runId: turn.run_id || null,\n content: assistantText || assistantTextFromParts(parts),\n createdAt: turn.completed_at ? new Date(turn.completed_at) : createdAt,\n parts,\n reasoningSteps: mergeReasoningSteps(reasoningStepsFromParts(parts), { finalize: !isRunning }),\n isFinal: !isRunning,\n tokenUsage: tokenUsageFromTurn(turn),\n });\n }\n return messages;\n};\n\nexport const threadDetailToMessages = (thread: ChatThreadDetail) => {\n const activeRun = activeRunIdFromThreadDetail(thread);\n return (thread.turns || []).flatMap((turn) => turnToMessages(turn, activeRun));\n};\n\nexport const threadPaging = (thread: ChatThreadDetail) => {\n const nextBeforeTurnIndex = thread.paging?.next_before_turn_index ?? null;\n return {\n hasOlderTurns: Boolean(thread.paging?.has_more || nextBeforeTurnIndex !== null),\n nextBeforeTurnIndex,\n };\n};\n\nexport const latestContextWindowFromThread = (thread: ChatThreadDetail): ChatContextWindow | null => {\n const threadContextWindow = normalizeContextWindow(thread.context_window);\n if (threadContextWindow) return threadContextWindow;\n for (let index = (thread.turns || []).length - 1; index >= 0; index -= 1) {\n const contextWindow = normalizeContextWindow(thread.turns?.[index]?.context_window);\n if (contextWindow) return contextWindow;\n }\n return null;\n};\n\nexport const activeRunIdFromThread = (thread?: Partial<ChatThreadSummary> | null) => {\n const hasCamelActiveRun = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"activeRun\")\n );\n const hasCamelLastRunStatus = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunStatus\")\n );\n const hasCamelLastRunId = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunId\")\n );\n const activeRun = hasCamelActiveRun ? thread?.activeRun || null : thread?.active_run || null;\n const lastRunStatus = hasCamelLastRunStatus\n ? thread?.lastRunStatus || null\n : thread?.last_run_status || thread?.lastRunStatus || null;\n const activeRunId = activeRun?.run_id ? String(activeRun.run_id) : \"\";\n if (activeRunId && isRunningThreadStatus(activeRun?.status || lastRunStatus)) return activeRunId;\n const lastRunId = hasCamelLastRunId\n ? thread?.lastRunId\n : thread?.last_run_id || thread?.lastRunId;\n return lastRunId && isRunningThreadStatus(lastRunStatus) ? String(lastRunId) : null;\n};\n\nexport const autoAttachRunIdFromThread = (thread?: Partial<ChatThreadSummary> | null) => {\n const hasCamelActiveRun = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"activeRun\")\n );\n const hasCamelLastRunStatus = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunStatus\")\n );\n const hasCamelLastRunId = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunId\")\n );\n const activeRun = hasCamelActiveRun ? thread?.activeRun || null : thread?.active_run || null;\n const lastRunStatus = hasCamelLastRunStatus\n ? thread?.lastRunStatus || null\n : thread?.last_run_status || thread?.lastRunStatus || null;\n const activeRunId = activeRun?.run_id ? String(activeRun.run_id) : \"\";\n if (activeRunId && isAutoAttachThreadStatus(activeRun?.status || lastRunStatus)) return activeRunId;\n const lastRunId = hasCamelLastRunId\n ? thread?.lastRunId\n : thread?.last_run_id || thread?.lastRunId;\n return lastRunId && isAutoAttachThreadStatus(lastRunStatus) ? String(lastRunId) : null;\n};\n\nexport const hasUnfinishedAssistantMessage = (messages?: ChatMessage[]) =>\n Boolean(messages?.some((message) => message.role === \"assistant\" && message.isFinal === false));\n\nexport const hasStaleUnfinishedAssistantCache = (\n thread?: (Partial<ChatThreadSummary> & { messages?: ChatMessage[] }) | null\n) => hasUnfinishedAssistantMessage(thread?.messages) && !activeRunIdFromThread(thread);\n\nexport const activeRunIdFromThreadDetail = (thread?: ChatThreadDetail | null) => {\n const summaryRunId = activeRunIdFromThread(thread);\n if (summaryRunId) return summaryRunId;\n const runningTurn = [...(thread?.turns || [])].reverse().find((turn) => turn.run_id && isRunningThreadStatus(turn.status));\n return runningTurn?.run_id ? String(runningTurn.run_id) : null;\n};\n","import type { ChatMessage, ChatReasoningStep, ChatPart, ChatThreadSummaryEvent, StoredChatThread } from \"./types\";\nimport { autoAttachRunIdFromThread } from \"./model\";\n\nexport type ChatRuntimeEventContext = {\n mode: \"submit\" | \"attach\";\n assistantMessageId: string;\n threadId: string | null;\n runId: string | null;\n startedAt: number;\n};\n\nexport type FinalizeInput = {\n threadId: string | null;\n baseMessages: ChatMessage[];\n assistantText: string;\n reasoning: ChatReasoningStep[];\n thinkingDurationMs: number;\n messageId?: string | null;\n runId?: string | null;\n parts?: ChatPart[];\n error?: string;\n};\n\nexport const threadSummaryToStored = (thread: Record<string, unknown>): StoredChatThread => ({\n ...(thread as StoredChatThread),\n id: String(thread.id),\n title: String(thread.title || \"New chat\"),\n updated_at: String(thread.updated_at || thread.last_activity_at || thread.created_at || new Date().toISOString()),\n messages: [],\n isHydrated: false,\n});\n\nexport const isThreadNotFoundError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\" || !(\"status\" in error)) return false;\n return Number((error as { status?: unknown }).status) === 404;\n};\n\nexport const isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\") return false;\n const maybe = error as { name?: unknown; message?: unknown };\n return maybe.name === \"AbortError\" || String(maybe.message || \"\").toLowerCase().includes(\"aborted\");\n};\n\nexport const abortDetachedStream = (controller: AbortController | null) => {\n if (!controller || controller.signal.aborted) return;\n try {\n const reason =\n typeof DOMException !== \"undefined\"\n ? new DOMException(\"Chat stream detached.\", \"AbortError\")\n : new Error(\"Chat stream detached.\");\n controller.abort(reason);\n } catch {\n // Detaching a stream is expected and must not surface as a UI error.\n }\n};\n\nconst hasRunState = (thread: StoredChatThread) =>\n Boolean(\n thread.active_run ||\n thread.activeRun ||\n thread.last_run_id ||\n thread.lastRunId ||\n thread.last_run_status ||\n thread.lastRunStatus ||\n thread.isRunning\n );\n\nexport const mergeStoredThreadsForRefresh = (\n currentThreads: StoredChatThread[],\n serverThreads: StoredChatThread[]\n): StoredChatThread[] => {\n const currentById = new Map(currentThreads.map((thread) => [thread.id, thread]));\n const serverIds = new Set(serverThreads.map((thread) => thread.id));\n const mergedServerThreads = serverThreads.map((serverThread) => {\n const current = currentById.get(serverThread.id);\n if (!current) return serverThread;\n const incomingHasRunState = hasRunState(serverThread);\n return {\n ...current,\n ...serverThread,\n messages: current.messages || [],\n isHydrated: current.isHydrated,\n hasOlderTurns: current.hasOlderTurns,\n nextBeforeTurnIndex: current.nextBeforeTurnIndex,\n active_run: incomingHasRunState ? serverThread.active_run : current.active_run,\n activeRun: incomingHasRunState ? serverThread.activeRun : current.activeRun,\n last_run_id: incomingHasRunState ? serverThread.last_run_id : current.last_run_id,\n lastRunId: incomingHasRunState ? serverThread.lastRunId : current.lastRunId,\n last_run_status: incomingHasRunState ? serverThread.last_run_status : current.last_run_status,\n lastRunStatus: incomingHasRunState ? serverThread.lastRunStatus : current.lastRunStatus,\n lastEventSeq: incomingHasRunState ? serverThread.lastEventSeq : current.lastEventSeq,\n isRunning: incomingHasRunState ? serverThread.isRunning : current.isRunning,\n };\n });\n const localOnlyThreads = currentThreads.filter((thread) => {\n if (serverIds.has(thread.id)) return false;\n return Boolean(thread.isHydrated || thread.messages?.length || thread.isRunning || thread.activeRun || thread.active_run);\n });\n return [...mergedServerThreads, ...localOnlyThreads];\n};\n\nexport const hasRunningStoredThreads = (threads: StoredChatThread[]): boolean =>\n threads.some((thread) => autoAttachRunIdFromThread(thread) !== null);\n\nconst stableStringify = (value: unknown): string => JSON.stringify(value ?? null);\n\nexport const sameStoredThread = (left: StoredChatThread | undefined, right: StoredChatThread | undefined): boolean => {\n if (left === right) return true;\n if (!left || !right) return false;\n return stableStringify(left) === stableStringify(right);\n};\n\nexport const applyThreadSummaryEvent = (\n currentThreads: StoredChatThread[],\n event: ChatThreadSummaryEvent\n): StoredChatThread[] => {\n if (event.event === \"snapshot_required\") return currentThreads;\n if (event.event === \"thread.deleted\") {\n const next = currentThreads.filter((thread) => thread.id !== event.thread_id);\n return next.length === currentThreads.length ? currentThreads : next;\n }\n const incoming = threadSummaryToStored(event.thread as Record<string, unknown>);\n const index = currentThreads.findIndex((thread) => thread.id === incoming.id);\n const sortByActivity = (threads: StoredChatThread[]) =>\n [...threads].sort((a, b) => {\n const left = Date.parse(String(a.updated_at || a.last_activity_at || a.created_at || \"\"));\n const right = Date.parse(String(b.updated_at || b.last_activity_at || b.created_at || \"\"));\n return (Number.isFinite(right) ? right : 0) - (Number.isFinite(left) ? left : 0);\n });\n if (index === -1) return sortByActivity([...currentThreads, incoming]);\n const [merged] = mergeStoredThreadsForRefresh([currentThreads[index]], [incoming]);\n if (sameStoredThread(currentThreads[index], merged)) return currentThreads;\n const next = [...currentThreads];\n next[index] = merged;\n return sortByActivity(next);\n};\n","export 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 findStableAssistantMessageIndex<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: Pick<StableAssistantUpsertInput<TMessage>, \"messageId\" | \"runId\">\n) {\n return messages.findIndex(\n (message) =>\n message.role === \"assistant\" &&\n ((input.messageId && message.id === input.messageId) ||\n Boolean(input.runId && message.runId === input.runId))\n );\n}\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage\n) {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) {\n next.push(userMessage);\n }\n if (\n !next.some(\n (message) =>\n message.id === assistantMessage.id ||\n Boolean(\n assistantMessage.runId &&\n message.role === \"assistant\" &&\n message.runId === assistantMessage.runId\n )\n )\n ) {\n next.push(assistantMessage);\n }\n return next;\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>\n) {\n const next = [...messages];\n\n for (const baseMessage of input.baseMessages || []) {\n const matchesTarget =\n baseMessage.role === \"assistant\" &&\n ((input.messageId && baseMessage.id === input.messageId) ||\n Boolean(input.runId && baseMessage.runId === input.runId));\n if (!matchesTarget && !next.some((message) => message.id === baseMessage.id)) {\n next.push(baseMessage);\n }\n }\n\n const index = findStableAssistantMessageIndex(next, input);\n if (index === -1) {\n next.push(input.create());\n return next;\n }\n\n next[index] = input.update(next[index]);\n return next;\n}\n","import * as React from \"react\";\nimport {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\n\nconst cx = (...values: Array<string | false | null | undefined>) =>\n values.filter(Boolean).join(\" \");\n\ntype MessageScrollerProviderProps = React.ComponentProps<\n typeof MessageScroller.Provider\n>;\ntype MessageScrollerRootProps = React.ComponentProps<typeof MessageScroller.Root>;\ntype MessageScrollerViewportProps = React.ComponentProps<\n typeof MessageScroller.Viewport\n>;\ntype MessageScrollerContentProps = React.ComponentProps<\n typeof MessageScroller.Content\n>;\ntype MessageScrollerItemProps = React.ComponentProps<typeof MessageScroller.Item>;\ntype MessageScrollerButtonProps = React.ComponentProps<typeof MessageScroller.Button>;\n\ntype LatestThreadScrollerLayoutContextValue = {\n contentElement: HTMLElement | null;\n rootElement: HTMLElement | null;\n setContentElement: (node: HTMLElement | null) => void;\n setRootElement: (node: HTMLElement | null) => void;\n};\n\nconst LatestThreadScrollerLayoutContext =\n React.createContext<LatestThreadScrollerLayoutContextValue | null>(null);\n\nconst useLatestThreadScrollerLayout = () =>\n React.useContext(LatestThreadScrollerLayoutContext);\n\nexport type LatestThreadScrollerProviderProps = MessageScrollerProviderProps;\n\nexport function LatestThreadScrollerProvider({\n autoScroll = true,\n defaultScrollPosition = \"last-anchor\",\n scrollPreviousItemPeek = 64,\n ...props\n}: LatestThreadScrollerProviderProps) {\n return (\n <MessageScroller.Provider\n autoScroll={autoScroll}\n defaultScrollPosition={defaultScrollPosition}\n scrollPreviousItemPeek={scrollPreviousItemPeek}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerRootProps = MessageScrollerRootProps;\n\nexport function LatestThreadScrollerRoot({\n className,\n ref,\n ...props\n}: LatestThreadScrollerRootProps) {\n const [rootElement, setRootElement] = React.useState<HTMLElement | null>(null);\n const [contentElement, setContentElement] =\n React.useState<HTMLElement | null>(null);\n const layoutContext = React.useMemo<LatestThreadScrollerLayoutContextValue>(\n () => ({\n contentElement,\n rootElement,\n setContentElement,\n setRootElement,\n }),\n [contentElement, rootElement]\n );\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setRootElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref]\n );\n\n return (\n <LatestThreadScrollerLayoutContext.Provider value={layoutContext}>\n <MessageScroller.Root\n ref={setRef}\n className={cx(\n \"relative flex size-full min-h-0 flex-1 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n </LatestThreadScrollerLayoutContext.Provider>\n );\n}\n\nexport type LatestThreadScrollerViewportProps =\n MessageScrollerViewportProps & {\n onViewportChange?: (node: HTMLElement | null) => void;\n };\n\nexport function LatestThreadScrollerViewport({\n className,\n onViewportChange,\n preserveScrollOnPrepend = true,\n ref,\n ...props\n}: LatestThreadScrollerViewportProps) {\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n onViewportChange?.(node);\n },\n [onViewportChange, ref]\n );\n\n return (\n <MessageScroller.Viewport\n ref={setRef}\n className={cx(\n \"size-full min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\",\n className\n )}\n preserveScrollOnPrepend={preserveScrollOnPrepend}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerContentProps = MessageScrollerContentProps;\n\nexport function LatestThreadScrollerContent({\n className,\n ref,\n ...props\n}: LatestThreadScrollerContentProps) {\n const layout = useLatestThreadScrollerLayout();\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n layout?.setContentElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [layout, ref]\n );\n\n return (\n <MessageScroller.Content\n ref={setRef}\n data-agents24-latest-thread-content=\"\"\n className={cx(\"flex h-max min-h-full flex-col gap-8 p-4\", className)}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerItemProps = Omit<\n MessageScrollerItemProps,\n \"messageId\"\n> & {\n messageId: string;\n};\n\nexport function LatestThreadScrollerItem({\n className,\n messageId,\n ...props\n}: LatestThreadScrollerItemProps) {\n return (\n <MessageScroller.Item\n className={cx(\n \"min-w-0 shrink-0 overflow-visible\",\n className\n )}\n messageId={messageId}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerButtonProps = Omit<\n MessageScrollerButtonProps,\n \"render\"\n> & {\n className?: string;\n render?: MessageScrollerButtonProps[\"render\"];\n};\n\nexport function LatestThreadScrollerButton({\n children,\n className,\n direction = \"end\",\n render,\n ...props\n}: LatestThreadScrollerButtonProps) {\n if (render) {\n return (\n <MessageScroller.Button\n direction={direction}\n render={render}\n {...props}\n />\n );\n }\n\n return (\n <MessageScroller.Button\n direction={direction}\n render={(buttonProps) => (\n <button\n {...(buttonProps as Record<string, unknown>)}\n aria-label={\n direction === \"end\"\n ? \"Scroll to latest message\"\n : \"Scroll to first message\"\n }\n className={cx(\n \"absolute bottom-4 left-1/2 z-50 flex size-9 -translate-x-1/2 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-md transition-all duration-200 data-[active=false]:pointer-events-none data-[active=false]:translate-y-2 data-[active=false]:opacity-0 data-[active=true]:translate-y-0 data-[active=true]:opacity-100\",\n className\n )}\n type=\"button\"\n >\n {children ?? (direction === \"end\" ? \"↓\" : \"↑\")}\n </button>\n )}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerOutlineItem = {\n id: string;\n label: string;\n messageIds?: string[];\n responsePreview?: string;\n};\n\nexport type LatestThreadScrollerOutlineProps = {\n cardClassName?: string;\n className?: string;\n contentMaxWidth?: number;\n dir?: \"ltr\" | \"rtl\";\n items: LatestThreadScrollerOutlineItem[];\n minContainerWidthForRail?: number;\n minSideGutterForRail?: number;\n side?: \"left\" | \"right\";\n};\n\nexport function LatestThreadScrollerOutline({\n cardClassName,\n className,\n contentMaxWidth = 768,\n dir = \"ltr\",\n items,\n minContainerWidthForRail = 0,\n minSideGutterForRail = 48,\n side,\n}: LatestThreadScrollerOutlineProps) {\n const navRef = React.useRef<HTMLElement | null>(null);\n const layout = useLatestThreadScrollerLayout();\n const [hasSideRoom, setHasSideRoom] = React.useState(false);\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n const { scrollToMessage } = useMessageScroller();\n const { currentAnchorId, visibleMessageIds } = useMessageScrollerVisibility();\n const visibleMessageIdSet = React.useMemo(\n () => new Set(visibleMessageIds),\n [visibleMessageIds]\n );\n const focusIndex = hoveredIndex ?? -1;\n const railSide = side ?? (dir === \"rtl\" ? \"right\" : \"left\");\n\n React.useEffect(() => {\n const root = layout?.rootElement ?? navRef.current?.parentElement;\n if (!root) return;\n\n const updateSideRoom = () => {\n const rootRect = root.getBoundingClientRect();\n const rootWidth = rootRect.width;\n const content = layout?.contentElement;\n const sideGutter = content\n ? Math.max(\n 0,\n railSide === \"left\"\n ? content.getBoundingClientRect().left - rootRect.left\n : rootRect.right - content.getBoundingClientRect().right\n )\n : Math.max(0, (rootWidth - contentMaxWidth) / 2);\n const nextHasSideRoom =\n rootWidth >= minContainerWidthForRail &&\n sideGutter >= minSideGutterForRail;\n setHasSideRoom((current) =>\n current === nextHasSideRoom ? current : nextHasSideRoom\n );\n };\n\n updateSideRoom();\n if (typeof ResizeObserver === \"undefined\") return;\n const resizeObserver = new ResizeObserver(updateSideRoom);\n resizeObserver.observe(root);\n const content = layout?.contentElement;\n if (content) {\n resizeObserver.observe(content);\n }\n return () => resizeObserver.disconnect();\n }, [\n contentMaxWidth,\n layout?.contentElement,\n layout?.rootElement,\n minContainerWidthForRail,\n minSideGutterForRail,\n railSide,\n ]);\n\n if (items.length < 2) {\n return null;\n }\n\n return (\n <nav\n ref={navRef}\n aria-label=\"Transcript outline\"\n className={cx(\n \"pointer-events-none absolute top-[46%] z-10 max-h-[min(18rem,calc(100%-10rem))] w-16 -translate-y-1/2 overflow-visible\",\n hasSideRoom ? \"hidden md:block\" : \"hidden\",\n railSide === \"left\" ? \"left-1\" : \"right-1\",\n className\n )}\n dir={dir}\n >\n <div className=\"pointer-events-auto flex flex-col gap-0 py-1\">\n {items.map((item, index) => {\n const itemMessageIds =\n item.messageIds && item.messageIds.length > 0\n ? item.messageIds\n : [item.id];\n const active = itemMessageIds.some(\n (messageId) =>\n visibleMessageIdSet.has(messageId) || messageId === currentAnchorId\n );\n const distance =\n focusIndex >= 0 ? Math.abs(index - focusIndex) : Number.POSITIVE_INFINITY;\n const isFocused = distance === 0;\n const isNear = distance === 1;\n const isNextNear = distance === 2;\n const barWidth = isFocused\n ? 50\n : isNear\n ? 36\n : isNextNear\n ? 23\n : 10;\n const barOpacity = isFocused ? 1 : isNear ? 0.78 : isNextNear ? 0.58 : 0.36;\n const fallbackLabel = `Turn ${index + 1}`;\n const previewLabel =\n item.label && item.label !== fallbackLabel ? item.label : \"\";\n const responsePreview = (item.responsePreview || \"\").trim();\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={active}\n dir=\"ltr\"\n className={cx(\n \"group relative flex h-2 w-16 items-center rounded-sm outline-none\",\n railSide === \"left\" ? \"justify-start\" : \"justify-end\"\n )}\n aria-label={`Jump to ${item.label || fallbackLabel}`}\n onBlur={() => setHoveredIndex(null)}\n onFocus={() => setHoveredIndex(index)}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={() =>\n scrollToMessage(item.id, {\n align: \"start\",\n behavior: \"smooth\",\n })\n }\n >\n <span\n className=\"h-0.5 rounded-full bg-muted-foreground/55 transition-[width,background-color,opacity] duration-150 ease-out group-hover:bg-foreground group-focus-visible:bg-foreground group-data-[active=true]:bg-foreground\"\n style={{\n opacity: barOpacity,\n width: barWidth,\n }}\n />\n {previewLabel ? (\n <span\n dir={dir}\n className={cx(\n \"pointer-events-none absolute top-1/2 z-20 max-h-32 w-64 -translate-y-1/2 overflow-hidden rounded-lg border border-border/80 bg-background p-3 text-start opacity-0 shadow-lg transition-all duration-200 group-hover:pointer-events-auto group-hover:opacity-100 group-focus-visible:pointer-events-auto group-focus-visible:opacity-100\",\n railSide === \"left\"\n ? \"left-full ml-2 -translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\"\n : \"right-full mr-2 translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\",\n cardClassName\n )}\n >\n <span\n className=\"block overflow-hidden text-sm leading-5 text-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: responsePreview ? 2 : 4,\n }}\n >\n {previewLabel}\n </span>\n {responsePreview ? (\n <span\n className=\"mt-1 block overflow-hidden text-sm leading-5 text-muted-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n }}\n >\n {responsePreview}\n </span>\n ) : null}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n\nexport const LatestThreadScroller = {\n Provider: LatestThreadScrollerProvider,\n Root: LatestThreadScrollerRoot,\n Viewport: LatestThreadScrollerViewport,\n Content: LatestThreadScrollerContent,\n Item: LatestThreadScrollerItem,\n Button: LatestThreadScrollerButton,\n Outline: LatestThreadScrollerOutline,\n};\n","import type {\n Agents24ChatRenderOptions,\n ChatMessage,\n ChatPart,\n ChatToolPart,\n} from \"./types\";\n\nexport const DefaultToolPart = ({ part }: { part: ChatToolPart }) => {\n const label =\n typeof part.presentation?.activity === \"string\"\n ? part.presentation.activity\n : typeof part.presentation?.title === \"string\"\n ? part.presentation.title\n : part.toolName;\n const detail =\n typeof part.presentation?.detail === \"string\"\n ? part.presentation.detail\n : part.errorText || part.state;\n\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <div>{label}</div>\n {detail ? <div>{detail}</div> : null}\n </div>\n );\n};\n\nexport const DefaultChatPart = ({\n part,\n message,\n renderOptions,\n}: {\n part: ChatPart;\n message: ChatMessage;\n renderOptions?: Agents24ChatRenderOptions;\n}) => {\n if (renderOptions?.renderPart) {\n return <>{renderOptions.renderPart(part, message)}</>;\n }\n\n if (part.kind === \"text\") return <>{part.text}</>;\n\n if (part.kind === \"tool\") {\n const ToolRenderer =\n renderOptions?.toolRenderers?.[part.type] ||\n renderOptions?.fallbackToolRenderer ||\n DefaultToolPart;\n return <>{ToolRenderer({ part, message })}</>;\n }\n\n if (part.kind === \"reasoning\") {\n return <div data-agents24-reasoning-part>{part.text || part.label}</div>;\n }\n\n if (part.kind === \"ui-blocks\") {\n return <div data-agents24-ui-blocks-part data-state={part.state} />;\n }\n\n if (part.kind === \"hitl\") {\n return <div data-agents24-hitl-part={part.interruptId || \"\"} />;\n }\n\n if (part.kind === \"error\") {\n return <div data-agents24-error-part>{part.errorText}</div>;\n }\n\n if (part.kind === \"data\") {\n return <div data-agents24-data-part={part.name} />;\n }\n\n return null;\n};\n\nexport const renderChatPart = (\n part: ChatPart,\n message: ChatMessage,\n renderOptions?: Agents24ChatRenderOptions\n) => (\n <DefaultChatPart\n key={part.id}\n part={part}\n message={message}\n renderOptions={renderOptions}\n />\n);\n","import type { ChatRuntimeEvent, ChatStreamResult } from \"./types\";\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\") return false;\n const maybe = error as { name?: unknown; message?: unknown };\n return maybe.name === \"AbortError\" || String(maybe.message || \"\").toLowerCase().includes(\"aborted\");\n};\n\nexport const parseSseBlock = (block: string): ChatRuntimeEvent | null => {\n const data = block\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.replace(/^data:\\s?/, \"\"))\n .join(\"\\n\")\n .trim();\n if (!data) return null;\n return JSON.parse(data) as ChatRuntimeEvent;\n};\n\nexport const consumeSseResponse = async (\n response: Response,\n onEvent: (event: ChatRuntimeEvent) => void | Promise<void>,\n options: { signal?: AbortSignal } = {}\n): Promise<ChatStreamResult> => {\n if (!response.ok) {\n let message = response.statusText || \"Failed to open chat stream.\";\n try {\n const errorData = await response.json();\n message = String(errorData.detail || errorData.message || message);\n } catch {\n // Keep the status text.\n }\n throw new Error(message);\n }\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"The chat stream did not return a readable body.\");\n const decoder = new TextDecoder();\n let buffer = \"\";\n let threadId: string | null = response.headers.get(\"X-Thread-ID\") || null;\n let runId: string | null = response.headers.get(\"X-Run-ID\") || null;\n let closed = false;\n const closeReader = () => {\n closed = true;\n queueMicrotask(() => {\n void reader.cancel().catch(() => {\n // Reader cancellation is a normal stream shutdown path.\n });\n });\n };\n if (options.signal?.aborted) {\n closeReader();\n return { threadId, runId };\n }\n options.signal?.addEventListener(\"abort\", closeReader, { once: true });\n try {\n while (!closed) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n const event = parseSseBlock(block);\n if (!event) continue;\n if (event.run_id) runId = event.run_id;\n const payloadThreadId = event.payload?.thread_id;\n if (payloadThreadId) threadId = String(payloadThreadId);\n await onEvent(event);\n }\n }\n } catch (error) {\n if (!isAbortError(error)) throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", closeReader);\n }\n return { threadId, runId };\n};\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { ChatMessage, ChatPart } from \"./types\";\n\nexport type StreamingTextMode = \"streaming\" | \"static\";\n\nexport type StreamingTextCache = {\n get: (id: string) => string | undefined;\n set: (id: string, text: string) => void;\n};\n\nexport type UseStreamingTextOptions = {\n id: string;\n isStreaming: boolean;\n text: string;\n cache?: StreamingTextCache | false;\n charsPerSecond?: number;\n catchupThreshold?: number;\n maxCatchupChars?: number;\n};\n\nexport type UseStreamingTextResult = {\n displayedText: string;\n isAnimating: boolean;\n mode: StreamingTextMode;\n parseIncompleteMarkdown: boolean;\n};\n\nconst DEFAULT_COMPLETED_TEXT_CACHE_SIZE = 200;\nconst defaultCompletedTextCache = new Map<string, string>();\n\nconst defaultStreamingTextCache: StreamingTextCache = {\n get: (id) => defaultCompletedTextCache.get(id),\n set: (id, text) => {\n defaultCompletedTextCache.set(id, text);\n if (defaultCompletedTextCache.size > DEFAULT_COMPLETED_TEXT_CACHE_SIZE) {\n const firstKey = defaultCompletedTextCache.keys().next().value;\n if (firstKey) defaultCompletedTextCache.delete(firstKey);\n }\n },\n};\n\nexport const getActiveStreamingTextPartId = (\n message: ChatMessage,\n streamingMessageId: string | null\n) => {\n if (message.role !== \"assistant\" || streamingMessageId !== message.id) return null;\n return (\n message.parts\n .slice()\n .reverse()\n .find((part) => part.kind === \"text\")?.id || null\n );\n};\n\nexport const isActiveStreamingTextPart = (\n message: ChatMessage,\n part: ChatPart,\n streamingMessageId: string | null\n) => part.kind === \"text\" && part.id === getActiveStreamingTextPartId(message, streamingMessageId);\n\nexport function useStreamingText({\n id,\n isStreaming,\n text,\n cache = defaultStreamingTextCache,\n charsPerSecond = 72,\n catchupThreshold = 40,\n maxCatchupChars = 20,\n}: UseStreamingTextOptions): UseStreamingTextResult {\n const cacheAdapter = cache === false ? null : cache;\n const [displayedText, setDisplayedText] = useState(() => {\n const cachedText = cacheAdapter?.get(id);\n return isStreaming && cachedText !== text ? \"\" : text;\n });\n const targetRef = useRef(text);\n const displayedRef = useRef(displayedText);\n const rafRef = useRef<number | null>(null);\n const lastFrameAtRef = useRef<number | null>(null);\n const idRef = useRef(id);\n const shouldAnimateRef = useRef(isStreaming);\n\n useEffect(() => {\n if (isStreaming || !text) return;\n cacheAdapter?.set(id, text);\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n targetRef.current = text;\n }, [text]);\n\n useEffect(() => {\n if (idRef.current === id) return;\n\n idRef.current = id;\n const cachedText = cacheAdapter?.get(id);\n const initial = isStreaming && cachedText !== text ? \"\" : text;\n shouldAnimateRef.current = isStreaming && initial !== text;\n displayedRef.current = initial;\n setDisplayedText(initial);\n\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n const reduceMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n if (reduceMotion) {\n displayedRef.current = text;\n setDisplayedText(text);\n shouldAnimateRef.current = false;\n return;\n }\n\n const cachedText = cacheAdapter?.get(id);\n if (cachedText === text) {\n displayedRef.current = text;\n setDisplayedText(text);\n shouldAnimateRef.current = false;\n return;\n }\n\n if (isStreaming) {\n shouldAnimateRef.current = true;\n }\n\n if (!shouldAnimateRef.current) {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n if (!text.startsWith(displayedRef.current)) {\n displayedRef.current = \"\";\n setDisplayedText(\"\");\n }\n\n const tick = (timestamp: number) => {\n const previousTimestamp = lastFrameAtRef.current ?? timestamp;\n lastFrameAtRef.current = timestamp;\n\n const target = targetRef.current;\n const current = displayedRef.current;\n\n if (current.length >= target.length) {\n shouldAnimateRef.current = false;\n rafRef.current = null;\n return;\n }\n\n const elapsedMs = Math.max(8, timestamp - previousTimestamp);\n const charsFromTime = Math.max(1, Math.floor((elapsedMs / 1000) * charsPerSecond));\n const gap = target.length - current.length;\n const catchupStep =\n gap > catchupThreshold ? Math.min(maxCatchupChars, Math.ceil(gap / 10)) : charsFromTime;\n const nextLength = Math.min(\n target.length,\n current.length + Math.max(charsFromTime, catchupStep)\n );\n\n const next = target.slice(0, nextLength);\n displayedRef.current = next;\n setDisplayedText(next);\n rafRef.current = window.requestAnimationFrame(tick);\n };\n\n if (rafRef.current === null && displayedRef.current.length < text.length) {\n rafRef.current = window.requestAnimationFrame(tick);\n }\n\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n };\n }, [cacheAdapter, catchupThreshold, charsPerSecond, id, isStreaming, maxCatchupChars, text]);\n\n return {\n displayedText,\n isAnimating: isStreaming,\n mode: isStreaming ? \"streaming\" : \"static\",\n parseIncompleteMarkdown: isStreaming,\n };\n}\n","import { consumeSseResponse } from \"./sse\";\nimport type { ChatSubmitInput, ChatThreadSummaryEvent, ChatTransport } from \"./types\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FetchChatTransportRoutes = {\n listThreads: () => string;\n getThread: (input: {\n threadId: string;\n limit?: number;\n beforeTurnIndex?: number | null;\n includeRunEvents?: boolean;\n }) => string;\n streamMessage: () => string;\n attachRun: (input: { runId: string }) => string;\n cancelRun: (input: { runId: string }) => string;\n deleteThread?: (input: { threadId: string }) => string;\n threadEvents?: (input: { cursor?: number | null }) => string;\n resumeRun?: (input: { runId: string }) => string;\n startMcpAuth?: (input: { runId: string; serverId: string }) => string;\n};\n\nexport type FetchChatTransportOptions = {\n routes: FetchChatTransportRoutes;\n fetchImpl?: typeof fetch;\n headers?: () => MaybePromise<HeadersInit>;\n streamBody?: (input: ChatSubmitInput) => unknown;\n};\n\nconst jsonHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n});\n\nconst streamHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n});\n\nexport class ChatTransportError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"ChatTransportError\";\n this.status = status;\n }\n}\n\nconst transportError = (response: Response, fallback: string) =>\n new ChatTransportError(response.statusText || fallback, response.status);\n\nexport const createFetchChatTransport = ({\n routes,\n fetchImpl = fetch,\n headers,\n streamBody,\n}: FetchChatTransportOptions): ChatTransport => {\n const loadHeaders = async () => headers?.() ?? {};\n return {\n async listThreads(input) {\n const response = await fetchImpl(routes.listThreads(), {\n signal: input?.signal,\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to list chat threads.\");\n return response.json();\n },\n async getThread(input) {\n const response = await fetchImpl(routes.getThread(input), {\n signal: input.signal,\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to load chat thread.\");\n return response.json();\n },\n async streamMessage(input, onEvent) {\n const response = await fetchImpl(routes.streamMessage(), {\n method: \"POST\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n body: JSON.stringify(\n streamBody?.(input) ?? {\n input: input.text,\n thread_id: input.threadId || undefined,\n files: input.files || [],\n }\n ),\n });\n return consumeSseResponse(response, onEvent, { signal: input.signal });\n },\n async attachRun(input, onEvent) {\n const response = await fetchImpl(routes.attachRun(input), {\n method: \"POST\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n body: JSON.stringify({}),\n });\n return consumeSseResponse(response, onEvent, { signal: input.signal });\n },\n async cancelRun(input) {\n const response = await fetchImpl(routes.cancelRun(input), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({ assistant_output_text: input.assistantOutputText || undefined }),\n });\n if (!response.ok) throw transportError(response, \"Failed to cancel chat run.\");\n return response.json();\n },\n async deleteThread(input) {\n if (!routes.deleteThread) return { deleted: false };\n const response = await fetchImpl(routes.deleteThread(input), {\n method: \"DELETE\",\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to delete chat thread.\");\n return response.json();\n },\n async subscribeThreadEvents(input, onEvent) {\n if (!routes.threadEvents) return;\n const response = await fetchImpl(routes.threadEvents({ cursor: input.cursor }), {\n method: \"GET\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n });\n await consumeSseResponse(\n response,\n (event) => onEvent(event as unknown as ChatThreadSummaryEvent),\n { signal: input.signal },\n );\n },\n async resumeHitl(input) {\n if (!routes.resumeRun) throw new ChatTransportError(\"HITL resume is not configured.\", 501);\n const response = await fetchImpl(routes.resumeRun({ runId: input.runId }), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({\n schema_version: \"agents24.hitl.resume.v2\",\n interrupt_id: input.interruptId,\n action: input.action,\n comment: input.comment,\n client: input.client,\n }),\n });\n if (!response.ok) throw transportError(response, \"Failed to resume chat run.\");\n return response.json();\n },\n async startMcpAuth(input) {\n if (!routes.startMcpAuth) throw new ChatTransportError(\"MCP auth is not configured.\", 501);\n const response = await fetchImpl(routes.startMcpAuth({ runId: input.runId, serverId: input.serverId }), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({\n interrupt_id: input.interruptId || undefined,\n principal_type: input.principalType || undefined,\n principal_id: input.principalId || undefined,\n client: input.client,\n }),\n });\n if (!response.ok) throw transportError(response, \"Failed to start MCP authorization.\");\n return response.json();\n },\n };\n};\n","export {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\nexport type {\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollable,\n MessageScrollerScrollOptions,\n MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\n"],"mappings":"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","names":["import_react","import_react","import_react","window","next","options","content","import_jsx_runtime","isAbortError","import_react","import_message_scroller"]}