@agents24/chat-react 0.1.3 → 0.1.4

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/model.ts","../src/renderers.tsx","../src/sse.ts","../src/transport.ts","../src/viewport.tsx"],"sourcesContent":["export * from \"./controller\";\nexport * from \"./model\";\nexport * from \"./renderers\";\nexport * from \"./sse\";\nexport * from \"./transport\";\nexport * from \"./types\";\nexport * from \"./viewport\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n activeRunIdFromThread,\n activeRunIdFromThreadDetail,\n assistantTextFromResponseBlocks,\n createChatId,\n DEFAULT_THREAD_PAGE_SIZE,\n hasStaleUnfinishedAssistantCache,\n latestContextWindowFromThread,\n mergeReasoningSteps,\n partsFromResponseBlocks,\n reasoningStepsFromParts,\n textFromFinalOutput,\n threadActivityDate,\n threadDetailToMessages,\n threadPaging,\n titleFromMessage,\n} from \"./model\";\nimport type {\n ChatAttachment,\n ChatContextWindow,\n ChatController,\n ChatMessage,\n ChatPart,\n ChatReasoningStep,\n ChatRuntimeEvent,\n ChatStorageAdapter,\n ChatTransport,\n StoredChatThread,\n} from \"./types\";\n\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};\n\ntype 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\nconst mergeContextWindow = (\n current: ChatContextWindow | null,\n incoming: unknown\n): ChatContextWindow | null => {\n if (!incoming || typeof incoming !== \"object\") return current;\n return { ...(current || {}), ...(incoming as ChatContextWindow) };\n};\n\nconst 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 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}: 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\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 streamingContentRef = useRef(\"\");\n const streamingMessageIdRef = useRef<string | null>(null);\n const reasoningRef = useRef<ChatReasoningStep[]>([]);\n const liveVoiceIdsRef = useRef<{ user?: string; assistant?: string }>({});\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 storage.upsertThread({\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]\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 storage.upsertThread({\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: status === \"queued\" || status === \"running\",\n });\n },\n [storage]\n );\n\n const refresh = useCallback(async () => {\n const data = await transport.listThreads();\n storage.setThreads((data.items || []).map((item) => threadSummaryToStored(item)));\n }, [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 controller?.abort();\n activeRunIdRef.current = 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 }, []);\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 index = prev.findIndex(\n (message) => message.id === input.messageId || (input.runId && message.role === \"assistant\" && message.runId === input.runId)\n );\n if (index === -1) {\n const next = [...prev];\n (input.baseMessages || []).forEach((message) => {\n const isSameAssistant =\n message.id === input.messageId ||\n Boolean(input.runId && message.role === \"assistant\" && message.runId === input.runId);\n if (!isSameAssistant && !next.some((item) => item.id === message.id)) {\n next.push(message);\n }\n });\n next.push({\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 messagesRef.current = next;\n return next;\n }\n const next = [...prev];\n next[index] = {\n ...next[index],\n runId: input.runId ?? next[index].runId ?? null,\n content: input.content,\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts ?? next[index].parts,\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 = existingIndex >= 0\n ? input.baseMessages.map((message, index) => (index === existingIndex ? assistant : message))\n : [...input.baseMessages, assistant];\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 storage.upsertThread({\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]\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 });\n if (activeThreadIdRef.current !== threadId || seq !== requestSeqRef.current) return;\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 storage.upsertThread({\n ...threadSummaryToStored(detail),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging.hasOlderTurns,\n nextBeforeTurnIndex: paging.nextBeforeTurnIndex,\n updated_at: threadActivityDate(detail),\n });\n } finally {\n if (activeThreadIdRef.current === threadId) setLoadingHistory(false);\n }\n },\n [pageSize, setLoadingHistory, storage, transport]\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 });\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 } finally {\n if (activeThreadIdRef.current === threadId) setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n }\n }, [pageSize, persistThread, transport]);\n\n const handleStreamEvent = useCallback(\n (input: { event: ChatRuntimeEvent; assistantMessageId: string; startedAt: number; streamThreadIdRef: { current: string | null }; baseMessages: ChatMessage[] }) => {\n const { 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) activeRunIdRef.current = event.run_id;\n setContextStatus((current) => mergeContextWindow(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 || textFromFinalOutput(payload.final_output) || 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, onStreamErrorMessage, setLiveAssistantMessage, setReasoningSteps]\n );\n\n const runStream = useCallback(\n async (input: { mode: \"submit\"; message: { text: string; files?: ChatAttachment[] } } | { 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 if (input.mode === \"attach\") {\n activeRunIdRef.current = input.runId;\n reattachedRunIdRef.current = input.runId;\n await transport.attachRun({ runId: input.runId, signal: controller.signal }, (event) =>\n handleStreamEvent({ event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n } else {\n await transport.streamMessage(\n { text: input.message.text, files: input.message.files || [], threadId: activeThreadIdRef.current, signal: controller.signal },\n (event) => handleStreamEvent({ event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\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 ((error as Error).name !== \"AbortError\") {\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 activeRunIdRef.current = 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, setReasoningSteps, transport]\n );\n\n const handleSubmit = useCallback(\n async (message: { text: string; files?: ChatAttachment[] }) => {\n if (!message.text.trim() && !(message.files || []).length) return;\n await runStream({ mode: \"submit\", message });\n },\n [runStream]\n );\n\n const handleStop = useCallback(() => {\n const runId = activeRunIdRef.current;\n const partial = streamingContentRef.current;\n const liveMessageId = streamingMessageIdRef.current;\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n activeRunIdRef.current = 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, setReasoningSteps, transport]);\n\n useEffect(() => {\n refresh().catch(() => storage.setThreads([]));\n }, [refresh, storage]);\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 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 = activeRunIdFromThread(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 handleCopy = useCallback((content: string, messageId: string) => {\n navigator.clipboard?.writeText(content);\n setCopiedMessageId(messageId);\n setTimeout(() => setCopiedMessageId(null), 200);\n }, []);\n\n const handleLike = useCallback(async (msg: ChatMessage) => {\n const nextLiked = !liked[msg.id];\n setLiked((prev) => ({ ...prev, [msg.id]: nextLiked }));\n if (nextLiked) setDisliked((prev) => ({ ...prev, [msg.id]: false }));\n }, [liked]);\n\n const handleDislike = useCallback(async (msg: ChatMessage) => {\n const nextDisliked = !disliked[msg.id];\n setDisliked((prev) => ({ ...prev, [msg.id]: nextDisliked }));\n if (nextDisliked) setLiked((prev) => ({ ...prev, [msg.id]: false }));\n }, [disliked]);\n\n const handleRetry = useCallback(async (msg: ChatMessage) => {\n const index = messagesRef.current.findIndex((message) => message.id === msg.id);\n if (index <= 0) return;\n const userMessage = messagesRef.current[index - 1];\n if (userMessage.role !== \"user\") return;\n const trimmed = messagesRef.current.slice(0, index);\n setMessages(trimmed);\n messagesRef.current = trimmed;\n if (activeThreadIdRef.current) persistThread(activeThreadIdRef.current, trimmed);\n await handleSubmit({ text: userMessage.content, files: userMessage.attachments || [] });\n }, [handleSubmit, persistThread]);\n\n const upsertLiveVoiceMessage = useCallback((input: {\n role: \"user\" | \"assistant\";\n content: string;\n isFinal?: boolean;\n citations?: ChatMessage[\"citations\"];\n reasoningSteps?: ChatReasoningStep[];\n }) => {\n const content = input.content?.trim() ?? \"\";\n if (!content && !input.citations?.length && !input.reasoningSteps?.length) return;\n setMessages((prev) => {\n const currentId = liveVoiceIdsRef.current[input.role];\n const index = currentId ? prev.findIndex((message) => message.id === currentId) : -1;\n const nextMessage: ChatMessage = {\n id: currentId || createId(),\n role: input.role,\n content,\n createdAt: new Date(),\n isFinal: Boolean(input.isFinal),\n isVoice: input.role === \"user\",\n parts: content ? [{ id: createId(), type: \"text\", kind: \"text\", text: content }] : [],\n citations: input.citations,\n reasoningSteps: input.reasoningSteps,\n };\n const next = index === -1 ? [...prev, nextMessage] : prev.map((message, itemIndex) => itemIndex === index ? { ...message, ...nextMessage } : message);\n liveVoiceIdsRef.current[input.role] = input.isFinal ? undefined : nextMessage.id;\n messagesRef.current = next;\n if (activeThreadIdRef.current) persistThread(activeThreadIdRef.current, next);\n return next;\n });\n }, [createId, persistThread]);\n\n return useMemo(() => ({\n messages,\n streamingContent,\n streamingMessageId,\n contextStatus,\n currentReasoning,\n isLoading,\n isLoadingHistory,\n isLoadingOlder,\n hasOlderTurns,\n liked,\n disliked,\n copiedMessageId,\n lastThinkingDurationMs,\n activeRunId: activeRunIdRef.current,\n handleSubmit,\n handleStop,\n handleCopy,\n handleLike,\n handleDislike,\n handleRetry,\n handleSourceClick: (citations: ChatMessage[\"citations\"]) => onSourceClick?.(citations),\n upsertLiveVoiceMessage,\n loadOlderTurns,\n refresh,\n textareaRef,\n }), [\n copiedMessageId,\n contextStatus,\n currentReasoning,\n disliked,\n handleCopy,\n handleDislike,\n handleLike,\n handleRetry,\n handleStop,\n handleSubmit,\n hasOlderTurns,\n isLoading,\n isLoadingHistory,\n isLoadingOlder,\n lastThinkingDurationMs,\n liked,\n loadOlderTurns,\n messages,\n onSourceClick,\n refresh,\n streamingContent,\n streamingMessageId,\n upsertLiveVoiceMessage,\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\";\n\nexport const DEFAULT_THREAD_PAGE_SIZE = 5;\n\nexport const isRunningThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\"]).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\nexport const textFromFinalOutput = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return \"\";\n const record = value as Record<string, unknown>;\n return String(record.message || record.text || record.answer || \"\");\n};\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 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 textFromFinalOutput(latestEventPayloadValue(events, \"final_output\"));\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 === \"approval_request\") {\n parts.push({ id, type: \"approval\", kind: \"approval\", raw: block });\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 textFromFinalOutput(turn.final_output);\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 });\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 if (thread.context_window && typeof thread.context_window === \"object\") return thread.context_window as ChatContextWindow;\n for (let index = (thread.turns || []).length - 1; index >= 0; index -= 1) {\n const value = thread.turns?.[index]?.context_window;\n if (value && typeof value === \"object\") return value as ChatContextWindow;\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 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 {\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 === \"approval\") {\n return <div data-agents24-approval-part />;\n }\n\n if (part.kind === \"error\") {\n return <div data-agents24-error-part>{part.errorText}</div>;\n }\n\n return <div data-agents24-data-part={part.name} />;\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\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): 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 = null;\n let runId: string | null = null;\n while (true) {\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 return { threadId, runId };\n};\n","import { consumeSseResponse } from \"./sse\";\nimport type { ChatAttachment, 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};\n\nexport type FetchChatTransportOptions = {\n routes: FetchChatTransportRoutes;\n fetchImpl?: typeof fetch;\n headers?: () => MaybePromise<HeadersInit>;\n streamBody?: (input: {\n text: string;\n threadId?: string | null;\n files?: ChatAttachment[];\n }) => 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 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 new Error(response.statusText || \"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 new Error(response.statusText || \"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);\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);\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 new Error(response.statusText || \"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 new Error(response.statusText || \"Failed to delete chat thread.\");\n return response.json();\n },\n };\n};\n","import {\n type ReactNode,\n type RefObject,\n type UIEvent,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nconst LATEST_EDGE_THRESHOLD_PX = 2;\nconst MIN_OLDER_PREFETCH_PX = 320;\nconst MAX_OLDER_PREFETCH_PX = 900;\n\nexport const isScrollable = (element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\">) =>\n element.scrollHeight - element.clientHeight > LATEST_EDGE_THRESHOLD_PX;\n\nexport const isAtTimelineLatestEdge = (\n element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\" | \"scrollTop\">,\n isTopOrigin: boolean\n) => {\n if (!isScrollable(element)) return true;\n return isTopOrigin\n ? element.scrollHeight - element.clientHeight - element.scrollTop <= LATEST_EDGE_THRESHOLD_PX\n : Math.abs(element.scrollTop) <= LATEST_EDGE_THRESHOLD_PX;\n};\n\nexport const shouldPrefetchOlder = (\n element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\" | \"scrollTop\">\n) =>\n Math.abs(element.scrollTop) + element.clientHeight >=\n element.scrollHeight - Math.min(MAX_OLDER_PREFETCH_PX, Math.max(MIN_OLDER_PREFETCH_PX, element.clientHeight * 0.75));\n\nexport const getLatestScrollTop = (\n element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\">,\n isTopOrigin: boolean\n) => isTopOrigin ? Math.max(0, element.scrollHeight - element.clientHeight) : 0;\n\nexport const shouldUseTopOriginTimeline = ({\n hasOlder,\n itemCount,\n topOriginMaxItems = 4,\n}: {\n hasOlder: boolean;\n itemCount: number;\n topOriginMaxItems?: number;\n}) => !hasOlder && itemCount > 0 && itemCount <= topOriginMaxItems;\n\nexport type UseLatestThreadViewportOptions = {\n itemCount: number;\n hasOlder: boolean;\n isLoadingOlder: boolean;\n onLoadOlder: () => Promise<void> | void;\n activeStreamKey?: string | null;\n shouldAutoFollow?: boolean;\n topOriginMaxItems?: number;\n};\n\nexport type LatestThreadViewportState = {\n scrollContainerRef: RefObject<HTMLDivElement | null>;\n isAtLatest: boolean;\n isTopOrigin: boolean;\n shouldShowLatestButton: boolean;\n handleScroll: (event: UIEvent<HTMLDivElement>) => void;\n scrollToLatest: () => void;\n preserveIntrinsicResize: () => void;\n};\n\nexport function useLatestThreadViewport({\n itemCount,\n hasOlder,\n isLoadingOlder,\n onLoadOlder,\n activeStreamKey,\n shouldAutoFollow = true,\n topOriginMaxItems = 4,\n}: UseLatestThreadViewportOptions): LatestThreadViewportState {\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n const olderPagePreserveRef = useRef<{ previousHeight: number; previousTop: number } | null>(null);\n const olderPageRequestInFlightRef = useRef(false);\n const intrinsicResizePreserveRef = useRef<{ lastHeight: number; endAt: number; frame: number | null } | null>(null);\n const autoFollowLatestRef = useRef(true);\n const programmaticScrollRef = useRef(false);\n const programmaticScrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const activeStreamKeyRef = useRef<string | null>(null);\n const [isAtLatest, setIsAtLatest] = useState(true);\n\n const isTopOrigin = shouldUseTopOriginTimeline({ hasOlder, itemCount, topOriginMaxItems });\n\n const markProgrammaticScroll = useCallback(() => {\n programmaticScrollRef.current = true;\n if (programmaticScrollTimeoutRef.current) clearTimeout(programmaticScrollTimeoutRef.current);\n programmaticScrollTimeoutRef.current = setTimeout(() => {\n programmaticScrollRef.current = false;\n programmaticScrollTimeoutRef.current = null;\n }, 80);\n }, []);\n\n const scrollToLatest = useCallback(() => {\n const element = scrollContainerRef.current;\n if (!element) return;\n markProgrammaticScroll();\n element.scrollTop = getLatestScrollTop(element, isTopOrigin);\n setIsAtLatest(true);\n }, [isTopOrigin, markProgrammaticScroll]);\n\n useEffect(() => {\n return () => {\n if (programmaticScrollTimeoutRef.current) clearTimeout(programmaticScrollTimeoutRef.current);\n const preserve = intrinsicResizePreserveRef.current;\n if (preserve?.frame !== null && preserve?.frame !== undefined) cancelAnimationFrame(preserve.frame);\n };\n }, []);\n\n useLayoutEffect(() => {\n const element = scrollContainerRef.current;\n const preserve = olderPagePreserveRef.current;\n if (!element) return;\n if (!preserve) {\n setIsAtLatest(isAtTimelineLatestEdge(element, isTopOrigin));\n return;\n }\n const addedHeight = element.scrollHeight - preserve.previousHeight;\n markProgrammaticScroll();\n element.scrollTop = preserve.previousTop - addedHeight;\n olderPagePreserveRef.current = null;\n olderPageRequestInFlightRef.current = false;\n setIsAtLatest(isAtTimelineLatestEdge(element, isTopOrigin));\n }, [isTopOrigin, itemCount, markProgrammaticScroll]);\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLDivElement>) => {\n const element = event.currentTarget;\n const atLatest = isAtTimelineLatestEdge(element, isTopOrigin);\n setIsAtLatest(atLatest);\n if (!programmaticScrollRef.current) autoFollowLatestRef.current = atLatest;\n if (\n isTopOrigin ||\n !hasOlder ||\n isLoadingOlder ||\n olderPageRequestInFlightRef.current ||\n !shouldPrefetchOlder(element)\n ) {\n return;\n }\n olderPageRequestInFlightRef.current = true;\n olderPagePreserveRef.current = {\n previousHeight: element.scrollHeight,\n previousTop: element.scrollTop,\n };\n void Promise.resolve(onLoadOlder()).finally(() => {\n requestAnimationFrame(() => {\n if (!olderPagePreserveRef.current) return;\n olderPagePreserveRef.current = null;\n olderPageRequestInFlightRef.current = false;\n });\n });\n },\n [hasOlder, isLoadingOlder, isTopOrigin, onLoadOlder]\n );\n\n const preserveIntrinsicResize = useCallback(() => {\n const element = scrollContainerRef.current;\n if (!element || isTopOrigin) return;\n const active = intrinsicResizePreserveRef.current;\n if (active?.frame !== null && active?.frame !== undefined) cancelAnimationFrame(active.frame);\n intrinsicResizePreserveRef.current = {\n lastHeight: element.scrollHeight,\n endAt: Date.now() + 260,\n frame: null,\n };\n const preserveFrame = () => {\n const nextElement = scrollContainerRef.current;\n const preserve = intrinsicResizePreserveRef.current;\n if (!nextElement || !preserve) return;\n const heightDelta = nextElement.scrollHeight - preserve.lastHeight;\n if (Math.abs(heightDelta) >= 1) {\n markProgrammaticScroll();\n nextElement.scrollTop -= heightDelta;\n preserve.lastHeight = nextElement.scrollHeight;\n setIsAtLatest(isAtTimelineLatestEdge(nextElement, isTopOrigin));\n }\n if (Date.now() < preserve.endAt) {\n preserve.frame = requestAnimationFrame(preserveFrame);\n } else {\n intrinsicResizePreserveRef.current = null;\n }\n };\n intrinsicResizePreserveRef.current.frame = requestAnimationFrame(preserveFrame);\n }, [isTopOrigin, markProgrammaticScroll]);\n\n useEffect(() => {\n const key = activeStreamKey || null;\n if (!key || activeStreamKeyRef.current === key) {\n activeStreamKeyRef.current = key;\n return;\n }\n autoFollowLatestRef.current = true;\n if (isTopOrigin) {\n activeStreamKeyRef.current = key;\n return;\n }\n const frame = requestAnimationFrame(scrollToLatest);\n activeStreamKeyRef.current = key;\n return () => cancelAnimationFrame(frame);\n }, [activeStreamKey, isTopOrigin, scrollToLatest]);\n\n useLayoutEffect(() => {\n if (isTopOrigin) return;\n if (!activeStreamKey || !shouldAutoFollow || !autoFollowLatestRef.current) return;\n if (isLoadingOlder || olderPageRequestInFlightRef.current) return;\n const frame = requestAnimationFrame(() => {\n if (autoFollowLatestRef.current && !isLoadingOlder && !olderPageRequestInFlightRef.current) scrollToLatest();\n });\n return () => cancelAnimationFrame(frame);\n }, [activeStreamKey, isLoadingOlder, isTopOrigin, itemCount, scrollToLatest, shouldAutoFollow]);\n\n return {\n scrollContainerRef,\n isAtLatest,\n isTopOrigin,\n shouldShowLatestButton: !isAtLatest,\n handleScroll,\n scrollToLatest,\n preserveIntrinsicResize,\n };\n}\n\nexport type LatestThreadViewportRenderContext = {\n preserveIntrinsicResize: () => void;\n isTopOrigin: boolean;\n};\n\nexport type LatestThreadViewportProps<T> = {\n items: T[];\n hasOlder: boolean;\n isLoadingOlder: boolean;\n onLoadOlder: () => Promise<void> | void;\n activeStreamKey?: string | null;\n className?: string;\n latestSpacer?: ReactNode;\n trailingSpacer?: ReactNode;\n renderItem: (item: T, context: LatestThreadViewportRenderContext) => ReactNode;\n};\n\nexport function LatestThreadViewport<T>({\n items,\n hasOlder,\n isLoadingOlder,\n onLoadOlder,\n activeStreamKey,\n className,\n latestSpacer,\n trailingSpacer,\n renderItem,\n}: LatestThreadViewportProps<T>) {\n const viewport = useLatestThreadViewport({\n itemCount: items.length,\n hasOlder,\n isLoadingOlder,\n onLoadOlder,\n activeStreamKey,\n });\n const timelineItems = useMemo(() => viewport.isTopOrigin ? items : [...items].reverse(), [items, viewport.isTopOrigin]);\n return (\n <div\n ref={viewport.scrollContainerRef}\n className={className}\n onScroll={viewport.handleScroll}\n role=\"log\"\n style={{ overflowAnchor: \"none\" }}\n >\n {!viewport.isTopOrigin && (latestSpacer ?? null)}\n {timelineItems.map((item) => renderItem(item, viewport))}\n {viewport.isTopOrigin && (trailingSpacer ?? latestSpacer ?? null)}\n </div>\n );\n}\n"],"mappings":"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","names":["next","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/controller.ts","../src/model.ts","../src/renderers.tsx","../src/sse.ts","../src/streaming-text.ts","../src/transport.ts","../src/viewport.tsx"],"sourcesContent":["export * from \"./controller\";\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 {\n activeRunIdFromThread,\n activeRunIdFromThreadDetail,\n assistantTextFromResponseBlocks,\n createChatId,\n DEFAULT_THREAD_PAGE_SIZE,\n hasStaleUnfinishedAssistantCache,\n latestContextWindowFromThread,\n mergeReasoningSteps,\n partsFromResponseBlocks,\n reasoningStepsFromParts,\n textFromFinalOutput,\n threadActivityDate,\n threadDetailToMessages,\n threadPaging,\n titleFromMessage,\n} from \"./model\";\nimport type {\n ChatAttachment,\n ChatContextWindow,\n ChatController,\n ChatMessage,\n ChatPart,\n ChatReasoningStep,\n ChatRuntimeEvent,\n ChatStorageAdapter,\n ChatTransport,\n StoredChatThread,\n} from \"./types\";\n\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};\n\ntype 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\nconst mergeContextWindow = (\n current: ChatContextWindow | null,\n incoming: unknown\n): ChatContextWindow | null => {\n if (!incoming || typeof incoming !== \"object\") return current;\n return { ...(current || {}), ...(incoming as ChatContextWindow) };\n};\n\nconst 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 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}: 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\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 streamingContentRef = useRef(\"\");\n const streamingMessageIdRef = useRef<string | null>(null);\n const reasoningRef = useRef<ChatReasoningStep[]>([]);\n const liveVoiceIdsRef = useRef<{ user?: string; assistant?: string }>({});\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 storage.upsertThread({\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]\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 storage.upsertThread({\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: status === \"queued\" || status === \"running\",\n });\n },\n [storage]\n );\n\n const refresh = useCallback(async () => {\n const data = await transport.listThreads();\n storage.setThreads((data.items || []).map((item) => threadSummaryToStored(item)));\n }, [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 controller?.abort();\n activeRunIdRef.current = 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 }, []);\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 index = prev.findIndex(\n (message) => message.id === input.messageId || (input.runId && message.role === \"assistant\" && message.runId === input.runId)\n );\n if (index === -1) {\n const next = [...prev];\n (input.baseMessages || []).forEach((message) => {\n const isSameAssistant =\n message.id === input.messageId ||\n Boolean(input.runId && message.role === \"assistant\" && message.runId === input.runId);\n if (!isSameAssistant && !next.some((item) => item.id === message.id)) {\n next.push(message);\n }\n });\n next.push({\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 messagesRef.current = next;\n return next;\n }\n const next = [...prev];\n next[index] = {\n ...next[index],\n runId: input.runId ?? next[index].runId ?? null,\n content: input.content,\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts ?? next[index].parts,\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 = existingIndex >= 0\n ? input.baseMessages.map((message, index) => (index === existingIndex ? assistant : message))\n : [...input.baseMessages, assistant];\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 storage.upsertThread({\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]\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 });\n if (activeThreadIdRef.current !== threadId || seq !== requestSeqRef.current) return;\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 storage.upsertThread({\n ...threadSummaryToStored(detail),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging.hasOlderTurns,\n nextBeforeTurnIndex: paging.nextBeforeTurnIndex,\n updated_at: threadActivityDate(detail),\n });\n } finally {\n if (activeThreadIdRef.current === threadId) setLoadingHistory(false);\n }\n },\n [pageSize, setLoadingHistory, storage, transport]\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 });\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 } finally {\n if (activeThreadIdRef.current === threadId) setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n }\n }, [pageSize, persistThread, transport]);\n\n const handleStreamEvent = useCallback(\n (input: { event: ChatRuntimeEvent; assistantMessageId: string; startedAt: number; streamThreadIdRef: { current: string | null }; baseMessages: ChatMessage[] }) => {\n const { 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) activeRunIdRef.current = event.run_id;\n setContextStatus((current) => mergeContextWindow(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 || textFromFinalOutput(payload.final_output) || 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, onStreamErrorMessage, setLiveAssistantMessage, setReasoningSteps]\n );\n\n const runStream = useCallback(\n async (input: { mode: \"submit\"; message: { text: string; files?: ChatAttachment[] } } | { 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 if (input.mode === \"attach\") {\n activeRunIdRef.current = input.runId;\n reattachedRunIdRef.current = input.runId;\n await transport.attachRun({ runId: input.runId, signal: controller.signal }, (event) =>\n handleStreamEvent({ event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n } else {\n await transport.streamMessage(\n { text: input.message.text, files: input.message.files || [], threadId: activeThreadIdRef.current, signal: controller.signal },\n (event) => handleStreamEvent({ event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\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 ((error as Error).name !== \"AbortError\") {\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 activeRunIdRef.current = 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, setReasoningSteps, transport]\n );\n\n const handleSubmit = useCallback(\n async (message: { text: string; files?: ChatAttachment[] }) => {\n if (!message.text.trim() && !(message.files || []).length) return;\n await runStream({ mode: \"submit\", message });\n },\n [runStream]\n );\n\n const handleStop = useCallback(() => {\n const runId = activeRunIdRef.current;\n const partial = streamingContentRef.current;\n const liveMessageId = streamingMessageIdRef.current;\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n activeRunIdRef.current = 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, setReasoningSteps, transport]);\n\n useEffect(() => {\n refresh().catch(() => storage.setThreads([]));\n }, [refresh, storage]);\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 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 = activeRunIdFromThread(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 handleCopy = useCallback((content: string, messageId: string) => {\n navigator.clipboard?.writeText(content);\n setCopiedMessageId(messageId);\n setTimeout(() => setCopiedMessageId(null), 200);\n }, []);\n\n const handleLike = useCallback(async (msg: ChatMessage) => {\n const nextLiked = !liked[msg.id];\n setLiked((prev) => ({ ...prev, [msg.id]: nextLiked }));\n if (nextLiked) setDisliked((prev) => ({ ...prev, [msg.id]: false }));\n }, [liked]);\n\n const handleDislike = useCallback(async (msg: ChatMessage) => {\n const nextDisliked = !disliked[msg.id];\n setDisliked((prev) => ({ ...prev, [msg.id]: nextDisliked }));\n if (nextDisliked) setLiked((prev) => ({ ...prev, [msg.id]: false }));\n }, [disliked]);\n\n const handleRetry = useCallback(async (msg: ChatMessage) => {\n const index = messagesRef.current.findIndex((message) => message.id === msg.id);\n if (index <= 0) return;\n const userMessage = messagesRef.current[index - 1];\n if (userMessage.role !== \"user\") return;\n const trimmed = messagesRef.current.slice(0, index);\n setMessages(trimmed);\n messagesRef.current = trimmed;\n if (activeThreadIdRef.current) persistThread(activeThreadIdRef.current, trimmed);\n await handleSubmit({ text: userMessage.content, files: userMessage.attachments || [] });\n }, [handleSubmit, persistThread]);\n\n const upsertLiveVoiceMessage = useCallback((input: {\n role: \"user\" | \"assistant\";\n content: string;\n isFinal?: boolean;\n citations?: ChatMessage[\"citations\"];\n reasoningSteps?: ChatReasoningStep[];\n }) => {\n const content = input.content?.trim() ?? \"\";\n if (!content && !input.citations?.length && !input.reasoningSteps?.length) return;\n setMessages((prev) => {\n const currentId = liveVoiceIdsRef.current[input.role];\n const index = currentId ? prev.findIndex((message) => message.id === currentId) : -1;\n const nextMessage: ChatMessage = {\n id: currentId || createId(),\n role: input.role,\n content,\n createdAt: new Date(),\n isFinal: Boolean(input.isFinal),\n isVoice: input.role === \"user\",\n parts: content ? [{ id: createId(), type: \"text\", kind: \"text\", text: content }] : [],\n citations: input.citations,\n reasoningSteps: input.reasoningSteps,\n };\n const next = index === -1 ? [...prev, nextMessage] : prev.map((message, itemIndex) => itemIndex === index ? { ...message, ...nextMessage } : message);\n liveVoiceIdsRef.current[input.role] = input.isFinal ? undefined : nextMessage.id;\n messagesRef.current = next;\n if (activeThreadIdRef.current) persistThread(activeThreadIdRef.current, next);\n return next;\n });\n }, [createId, persistThread]);\n\n return useMemo(() => ({\n messages,\n streamingContent,\n streamingMessageId,\n contextStatus,\n currentReasoning,\n isLoading,\n isLoadingHistory,\n isLoadingOlder,\n hasOlderTurns,\n liked,\n disliked,\n copiedMessageId,\n lastThinkingDurationMs,\n activeRunId: activeRunIdRef.current,\n handleSubmit,\n handleStop,\n handleCopy,\n handleLike,\n handleDislike,\n handleRetry,\n handleSourceClick: (citations: ChatMessage[\"citations\"]) => onSourceClick?.(citations),\n upsertLiveVoiceMessage,\n loadOlderTurns,\n refresh,\n textareaRef,\n }), [\n copiedMessageId,\n contextStatus,\n currentReasoning,\n disliked,\n handleCopy,\n handleDislike,\n handleLike,\n handleRetry,\n handleStop,\n handleSubmit,\n hasOlderTurns,\n isLoading,\n isLoadingHistory,\n isLoadingOlder,\n lastThinkingDurationMs,\n liked,\n loadOlderTurns,\n messages,\n onSourceClick,\n refresh,\n streamingContent,\n streamingMessageId,\n upsertLiveVoiceMessage,\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\";\n\nexport const DEFAULT_THREAD_PAGE_SIZE = 5;\n\nexport const isRunningThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\"]).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\nexport const textFromFinalOutput = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (!value || typeof value !== \"object\") return \"\";\n const record = value as Record<string, unknown>;\n return String(record.message || record.text || record.answer || \"\");\n};\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 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 textFromFinalOutput(latestEventPayloadValue(events, \"final_output\"));\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 === \"approval_request\") {\n parts.push({ id, type: \"approval\", kind: \"approval\", raw: block });\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 textFromFinalOutput(turn.final_output);\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 });\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 if (thread.context_window && typeof thread.context_window === \"object\") return thread.context_window as ChatContextWindow;\n for (let index = (thread.turns || []).length - 1; index >= 0; index -= 1) {\n const value = thread.turns?.[index]?.context_window;\n if (value && typeof value === \"object\") return value as ChatContextWindow;\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 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 {\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 === \"approval\") {\n return <div data-agents24-approval-part />;\n }\n\n if (part.kind === \"error\") {\n return <div data-agents24-error-part>{part.errorText}</div>;\n }\n\n return <div data-agents24-data-part={part.name} />;\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\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): 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 = null;\n let runId: string | null = null;\n while (true) {\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 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 { ChatAttachment, 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};\n\nexport type FetchChatTransportOptions = {\n routes: FetchChatTransportRoutes;\n fetchImpl?: typeof fetch;\n headers?: () => MaybePromise<HeadersInit>;\n streamBody?: (input: {\n text: string;\n threadId?: string | null;\n files?: ChatAttachment[];\n }) => 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 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 new Error(response.statusText || \"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 new Error(response.statusText || \"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);\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);\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 new Error(response.statusText || \"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 new Error(response.statusText || \"Failed to delete chat thread.\");\n return response.json();\n },\n };\n};\n","import {\n type ReactNode,\n type RefObject,\n type UIEvent,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nconst LATEST_EDGE_THRESHOLD_PX = 2;\nconst MIN_OLDER_PREFETCH_PX = 320;\nconst MAX_OLDER_PREFETCH_PX = 900;\n\nexport const isScrollable = (element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\">) =>\n element.scrollHeight - element.clientHeight > LATEST_EDGE_THRESHOLD_PX;\n\nexport const isAtTimelineLatestEdge = (\n element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\" | \"scrollTop\">,\n isTopOrigin: boolean\n) => {\n if (!isScrollable(element)) return true;\n return isTopOrigin\n ? element.scrollHeight - element.clientHeight - element.scrollTop <= LATEST_EDGE_THRESHOLD_PX\n : Math.abs(element.scrollTop) <= LATEST_EDGE_THRESHOLD_PX;\n};\n\nexport const shouldPrefetchOlder = (\n element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\" | \"scrollTop\">\n) =>\n Math.abs(element.scrollTop) + element.clientHeight >=\n element.scrollHeight - Math.min(MAX_OLDER_PREFETCH_PX, Math.max(MIN_OLDER_PREFETCH_PX, element.clientHeight * 0.75));\n\nexport const getLatestScrollTop = (\n element: Pick<HTMLDivElement, \"scrollHeight\" | \"clientHeight\">,\n isTopOrigin: boolean\n) => isTopOrigin ? Math.max(0, element.scrollHeight - element.clientHeight) : 0;\n\nexport const shouldUseTopOriginTimeline = ({\n hasOlder,\n itemCount,\n topOriginMaxItems = 4,\n}: {\n hasOlder: boolean;\n itemCount: number;\n topOriginMaxItems?: number;\n}) => !hasOlder && itemCount > 0 && itemCount <= topOriginMaxItems;\n\nexport type UseLatestThreadViewportOptions = {\n itemCount: number;\n hasOlder: boolean;\n isLoadingOlder: boolean;\n onLoadOlder: () => Promise<void> | void;\n activeStreamKey?: string | null;\n shouldAutoFollow?: boolean;\n topOriginMaxItems?: number;\n};\n\nexport type LatestThreadViewportState = {\n scrollContainerRef: RefObject<HTMLDivElement | null>;\n isAtLatest: boolean;\n isTopOrigin: boolean;\n shouldShowLatestButton: boolean;\n handleScroll: (event: UIEvent<HTMLDivElement>) => void;\n scrollToLatest: () => void;\n preserveIntrinsicResize: () => void;\n};\n\nexport function useLatestThreadViewport({\n itemCount,\n hasOlder,\n isLoadingOlder,\n onLoadOlder,\n activeStreamKey,\n shouldAutoFollow = true,\n topOriginMaxItems = 4,\n}: UseLatestThreadViewportOptions): LatestThreadViewportState {\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n const olderPagePreserveRef = useRef<{ previousHeight: number; previousTop: number } | null>(null);\n const olderPageRequestInFlightRef = useRef(false);\n const intrinsicResizePreserveRef = useRef<{ lastHeight: number; endAt: number; frame: number | null } | null>(null);\n const autoFollowLatestRef = useRef(true);\n const programmaticScrollRef = useRef(false);\n const programmaticScrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const activeStreamKeyRef = useRef<string | null>(null);\n const [isAtLatest, setIsAtLatest] = useState(true);\n\n const isTopOrigin = shouldUseTopOriginTimeline({ hasOlder, itemCount, topOriginMaxItems });\n\n const markProgrammaticScroll = useCallback(() => {\n programmaticScrollRef.current = true;\n if (programmaticScrollTimeoutRef.current) clearTimeout(programmaticScrollTimeoutRef.current);\n programmaticScrollTimeoutRef.current = setTimeout(() => {\n programmaticScrollRef.current = false;\n programmaticScrollTimeoutRef.current = null;\n }, 80);\n }, []);\n\n const scrollToLatest = useCallback(() => {\n const element = scrollContainerRef.current;\n if (!element) return;\n markProgrammaticScroll();\n element.scrollTop = getLatestScrollTop(element, isTopOrigin);\n setIsAtLatest(true);\n }, [isTopOrigin, markProgrammaticScroll]);\n\n useEffect(() => {\n return () => {\n if (programmaticScrollTimeoutRef.current) clearTimeout(programmaticScrollTimeoutRef.current);\n const preserve = intrinsicResizePreserveRef.current;\n if (preserve?.frame !== null && preserve?.frame !== undefined) cancelAnimationFrame(preserve.frame);\n };\n }, []);\n\n useLayoutEffect(() => {\n const element = scrollContainerRef.current;\n const preserve = olderPagePreserveRef.current;\n if (!element) return;\n if (!preserve) {\n setIsAtLatest(isAtTimelineLatestEdge(element, isTopOrigin));\n return;\n }\n const addedHeight = element.scrollHeight - preserve.previousHeight;\n markProgrammaticScroll();\n element.scrollTop = preserve.previousTop - addedHeight;\n olderPagePreserveRef.current = null;\n olderPageRequestInFlightRef.current = false;\n setIsAtLatest(isAtTimelineLatestEdge(element, isTopOrigin));\n }, [isTopOrigin, itemCount, markProgrammaticScroll]);\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLDivElement>) => {\n const element = event.currentTarget;\n const atLatest = isAtTimelineLatestEdge(element, isTopOrigin);\n setIsAtLatest(atLatest);\n if (!programmaticScrollRef.current) autoFollowLatestRef.current = atLatest;\n if (\n isTopOrigin ||\n !hasOlder ||\n isLoadingOlder ||\n olderPageRequestInFlightRef.current ||\n !shouldPrefetchOlder(element)\n ) {\n return;\n }\n olderPageRequestInFlightRef.current = true;\n olderPagePreserveRef.current = {\n previousHeight: element.scrollHeight,\n previousTop: element.scrollTop,\n };\n void Promise.resolve(onLoadOlder()).finally(() => {\n requestAnimationFrame(() => {\n if (!olderPagePreserveRef.current) return;\n olderPagePreserveRef.current = null;\n olderPageRequestInFlightRef.current = false;\n });\n });\n },\n [hasOlder, isLoadingOlder, isTopOrigin, onLoadOlder]\n );\n\n const preserveIntrinsicResize = useCallback(() => {\n const element = scrollContainerRef.current;\n if (!element || isTopOrigin) return;\n const active = intrinsicResizePreserveRef.current;\n if (active?.frame !== null && active?.frame !== undefined) cancelAnimationFrame(active.frame);\n intrinsicResizePreserveRef.current = {\n lastHeight: element.scrollHeight,\n endAt: Date.now() + 260,\n frame: null,\n };\n const preserveFrame = () => {\n const nextElement = scrollContainerRef.current;\n const preserve = intrinsicResizePreserveRef.current;\n if (!nextElement || !preserve) return;\n const heightDelta = nextElement.scrollHeight - preserve.lastHeight;\n if (Math.abs(heightDelta) >= 1) {\n markProgrammaticScroll();\n nextElement.scrollTop -= heightDelta;\n preserve.lastHeight = nextElement.scrollHeight;\n setIsAtLatest(isAtTimelineLatestEdge(nextElement, isTopOrigin));\n }\n if (Date.now() < preserve.endAt) {\n preserve.frame = requestAnimationFrame(preserveFrame);\n } else {\n intrinsicResizePreserveRef.current = null;\n }\n };\n intrinsicResizePreserveRef.current.frame = requestAnimationFrame(preserveFrame);\n }, [isTopOrigin, markProgrammaticScroll]);\n\n useEffect(() => {\n const key = activeStreamKey || null;\n if (!key || activeStreamKeyRef.current === key) {\n activeStreamKeyRef.current = key;\n return;\n }\n autoFollowLatestRef.current = true;\n if (isTopOrigin) {\n activeStreamKeyRef.current = key;\n return;\n }\n const frame = requestAnimationFrame(scrollToLatest);\n activeStreamKeyRef.current = key;\n return () => cancelAnimationFrame(frame);\n }, [activeStreamKey, isTopOrigin, scrollToLatest]);\n\n useLayoutEffect(() => {\n if (isTopOrigin) return;\n if (!activeStreamKey || !shouldAutoFollow || !autoFollowLatestRef.current) return;\n if (isLoadingOlder || olderPageRequestInFlightRef.current) return;\n const frame = requestAnimationFrame(() => {\n if (autoFollowLatestRef.current && !isLoadingOlder && !olderPageRequestInFlightRef.current) scrollToLatest();\n });\n return () => cancelAnimationFrame(frame);\n }, [activeStreamKey, isLoadingOlder, isTopOrigin, itemCount, scrollToLatest, shouldAutoFollow]);\n\n return {\n scrollContainerRef,\n isAtLatest,\n isTopOrigin,\n shouldShowLatestButton: !isAtLatest,\n handleScroll,\n scrollToLatest,\n preserveIntrinsicResize,\n };\n}\n\nexport type LatestThreadViewportRenderContext = {\n preserveIntrinsicResize: () => void;\n isTopOrigin: boolean;\n};\n\nexport type LatestThreadViewportProps<T> = {\n items: T[];\n hasOlder: boolean;\n isLoadingOlder: boolean;\n onLoadOlder: () => Promise<void> | void;\n activeStreamKey?: string | null;\n className?: string;\n latestSpacer?: ReactNode;\n trailingSpacer?: ReactNode;\n renderItem: (item: T, context: LatestThreadViewportRenderContext) => ReactNode;\n};\n\nexport function LatestThreadViewport<T>({\n items,\n hasOlder,\n isLoadingOlder,\n onLoadOlder,\n activeStreamKey,\n className,\n latestSpacer,\n trailingSpacer,\n renderItem,\n}: LatestThreadViewportProps<T>) {\n const viewport = useLatestThreadViewport({\n itemCount: items.length,\n hasOlder,\n isLoadingOlder,\n onLoadOlder,\n activeStreamKey,\n });\n const timelineItems = useMemo(() => viewport.isTopOrigin ? items : [...items].reverse(), [items, viewport.isTopOrigin]);\n return (\n <div\n ref={viewport.scrollContainerRef}\n className={className}\n onScroll={viewport.handleScroll}\n role=\"log\"\n style={{ overflowAnchor: \"none\" }}\n >\n {!viewport.isTopOrigin && (latestSpacer ?? null)}\n {timelineItems.map((item) => renderItem(item, viewport))}\n {viewport.isTopOrigin && (trailingSpacer ?? latestSpacer ?? null)}\n </div>\n );\n}\n"],"mappings":"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","names":["next","import_react","import_react","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -349,6 +349,30 @@ declare const renderChatPart: (part: ChatPart, message: ChatMessage, renderOptio
349
349
  declare const parseSseBlock: (block: string) => ChatRuntimeEvent | null;
350
350
  declare const consumeSseResponse: (response: Response, onEvent: (event: ChatRuntimeEvent) => void | Promise<void>) => Promise<ChatStreamResult>;
351
351
 
352
+ type StreamingTextMode = "streaming" | "static";
353
+ type StreamingTextCache = {
354
+ get: (id: string) => string | undefined;
355
+ set: (id: string, text: string) => void;
356
+ };
357
+ type UseStreamingTextOptions = {
358
+ id: string;
359
+ isStreaming: boolean;
360
+ text: string;
361
+ cache?: StreamingTextCache | false;
362
+ charsPerSecond?: number;
363
+ catchupThreshold?: number;
364
+ maxCatchupChars?: number;
365
+ };
366
+ type UseStreamingTextResult = {
367
+ displayedText: string;
368
+ isAnimating: boolean;
369
+ mode: StreamingTextMode;
370
+ parseIncompleteMarkdown: boolean;
371
+ };
372
+ declare const getActiveStreamingTextPartId: (message: ChatMessage, streamingMessageId: string | null) => string | null;
373
+ declare const isActiveStreamingTextPart: (message: ChatMessage, part: ChatPart, streamingMessageId: string | null) => boolean;
374
+ declare function useStreamingText({ id, isStreaming, text, cache, charsPerSecond, catchupThreshold, maxCatchupChars, }: UseStreamingTextOptions): UseStreamingTextResult;
375
+
352
376
  type MaybePromise<T> = T | Promise<T>;
353
377
  type FetchChatTransportRoutes = {
354
378
  listThreads: () => string;
@@ -426,4 +450,4 @@ type LatestThreadViewportProps<T> = {
426
450
  };
427
451
  declare function LatestThreadViewport<T>({ items, hasOlder, isLoadingOlder, onLoadOlder, activeStreamKey, className, latestSpacer, trailingSpacer, renderItem, }: LatestThreadViewportProps<T>): react.JSX.Element;
428
452
 
429
- export { type Agents24ChatRenderOptions, type ChatActiveRun, type ChatApprovalPart, type ChatAttachment, type ChatCitation, type ChatContextWindow, type ChatController, type ChatDataPart, type ChatErrorPart, type ChatMessage, type ChatPart, type ChatReasoningPart, type ChatReasoningStep, type ChatRunStatus, type ChatRuntimeEvent, type ChatStorageAdapter, type ChatStreamResult, type ChatTextPart, type ChatThreadDetail, type ChatThreadSummary, type ChatThreadTurn, type ChatToolPart, type ChatToolState, type ChatTransport, type ChatUiBlocksPart, DEFAULT_THREAD_PAGE_SIZE, DefaultChatPart, DefaultToolPart, type FetchChatTransportOptions, type FetchChatTransportRoutes, LatestThreadViewport, type LatestThreadViewportProps, type LatestThreadViewportRenderContext, type LatestThreadViewportState, type StoredChatThread, type ToolPresentation, type ToolRenderer, type UseAgents24ChatControllerOptions, type UseLatestThreadViewportOptions, activeRunIdFromThread, activeRunIdFromThreadDetail, assistantTextFromParts, assistantTextFromResponseBlocks, consumeSseResponse, createChatId, createFetchChatTransport, getLatestScrollTop, hasStaleUnfinishedAssistantCache, hasUnfinishedAssistantMessage, isAtTimelineLatestEdge, isRunningThreadStatus, isScrollable, latestContextWindowFromThread, mergeReasoningSteps, parseSseBlock, partsFromResponseBlocks, reasoningStepsFromParts, renderChatPart, shouldPrefetchOlder, shouldUseTopOriginTimeline, textFromFinalOutput, threadActivityDate, threadDetailToMessages, threadPaging, titleFromMessage, toolStateFromStatus, useAgents24ChatController, useLatestThreadViewport };
453
+ export { type Agents24ChatRenderOptions, type ChatActiveRun, type ChatApprovalPart, type ChatAttachment, type ChatCitation, type ChatContextWindow, type ChatController, type ChatDataPart, type ChatErrorPart, type ChatMessage, type ChatPart, type ChatReasoningPart, type ChatReasoningStep, type ChatRunStatus, type ChatRuntimeEvent, type ChatStorageAdapter, type ChatStreamResult, type ChatTextPart, type ChatThreadDetail, type ChatThreadSummary, type ChatThreadTurn, type ChatToolPart, type ChatToolState, type ChatTransport, type ChatUiBlocksPart, DEFAULT_THREAD_PAGE_SIZE, DefaultChatPart, DefaultToolPart, type FetchChatTransportOptions, type FetchChatTransportRoutes, LatestThreadViewport, type LatestThreadViewportProps, type LatestThreadViewportRenderContext, type LatestThreadViewportState, type StoredChatThread, type StreamingTextCache, type StreamingTextMode, type ToolPresentation, type ToolRenderer, type UseAgents24ChatControllerOptions, type UseLatestThreadViewportOptions, type UseStreamingTextOptions, type UseStreamingTextResult, activeRunIdFromThread, activeRunIdFromThreadDetail, assistantTextFromParts, assistantTextFromResponseBlocks, consumeSseResponse, createChatId, createFetchChatTransport, getActiveStreamingTextPartId, getLatestScrollTop, hasStaleUnfinishedAssistantCache, hasUnfinishedAssistantMessage, isActiveStreamingTextPart, isAtTimelineLatestEdge, isRunningThreadStatus, isScrollable, latestContextWindowFromThread, mergeReasoningSteps, parseSseBlock, partsFromResponseBlocks, reasoningStepsFromParts, renderChatPart, shouldPrefetchOlder, shouldUseTopOriginTimeline, textFromFinalOutput, threadActivityDate, threadDetailToMessages, threadPaging, titleFromMessage, toolStateFromStatus, useAgents24ChatController, useLatestThreadViewport, useStreamingText };
package/dist/index.d.ts CHANGED
@@ -349,6 +349,30 @@ declare const renderChatPart: (part: ChatPart, message: ChatMessage, renderOptio
349
349
  declare const parseSseBlock: (block: string) => ChatRuntimeEvent | null;
350
350
  declare const consumeSseResponse: (response: Response, onEvent: (event: ChatRuntimeEvent) => void | Promise<void>) => Promise<ChatStreamResult>;
351
351
 
352
+ type StreamingTextMode = "streaming" | "static";
353
+ type StreamingTextCache = {
354
+ get: (id: string) => string | undefined;
355
+ set: (id: string, text: string) => void;
356
+ };
357
+ type UseStreamingTextOptions = {
358
+ id: string;
359
+ isStreaming: boolean;
360
+ text: string;
361
+ cache?: StreamingTextCache | false;
362
+ charsPerSecond?: number;
363
+ catchupThreshold?: number;
364
+ maxCatchupChars?: number;
365
+ };
366
+ type UseStreamingTextResult = {
367
+ displayedText: string;
368
+ isAnimating: boolean;
369
+ mode: StreamingTextMode;
370
+ parseIncompleteMarkdown: boolean;
371
+ };
372
+ declare const getActiveStreamingTextPartId: (message: ChatMessage, streamingMessageId: string | null) => string | null;
373
+ declare const isActiveStreamingTextPart: (message: ChatMessage, part: ChatPart, streamingMessageId: string | null) => boolean;
374
+ declare function useStreamingText({ id, isStreaming, text, cache, charsPerSecond, catchupThreshold, maxCatchupChars, }: UseStreamingTextOptions): UseStreamingTextResult;
375
+
352
376
  type MaybePromise<T> = T | Promise<T>;
353
377
  type FetchChatTransportRoutes = {
354
378
  listThreads: () => string;
@@ -426,4 +450,4 @@ type LatestThreadViewportProps<T> = {
426
450
  };
427
451
  declare function LatestThreadViewport<T>({ items, hasOlder, isLoadingOlder, onLoadOlder, activeStreamKey, className, latestSpacer, trailingSpacer, renderItem, }: LatestThreadViewportProps<T>): react.JSX.Element;
428
452
 
429
- export { type Agents24ChatRenderOptions, type ChatActiveRun, type ChatApprovalPart, type ChatAttachment, type ChatCitation, type ChatContextWindow, type ChatController, type ChatDataPart, type ChatErrorPart, type ChatMessage, type ChatPart, type ChatReasoningPart, type ChatReasoningStep, type ChatRunStatus, type ChatRuntimeEvent, type ChatStorageAdapter, type ChatStreamResult, type ChatTextPart, type ChatThreadDetail, type ChatThreadSummary, type ChatThreadTurn, type ChatToolPart, type ChatToolState, type ChatTransport, type ChatUiBlocksPart, DEFAULT_THREAD_PAGE_SIZE, DefaultChatPart, DefaultToolPart, type FetchChatTransportOptions, type FetchChatTransportRoutes, LatestThreadViewport, type LatestThreadViewportProps, type LatestThreadViewportRenderContext, type LatestThreadViewportState, type StoredChatThread, type ToolPresentation, type ToolRenderer, type UseAgents24ChatControllerOptions, type UseLatestThreadViewportOptions, activeRunIdFromThread, activeRunIdFromThreadDetail, assistantTextFromParts, assistantTextFromResponseBlocks, consumeSseResponse, createChatId, createFetchChatTransport, getLatestScrollTop, hasStaleUnfinishedAssistantCache, hasUnfinishedAssistantMessage, isAtTimelineLatestEdge, isRunningThreadStatus, isScrollable, latestContextWindowFromThread, mergeReasoningSteps, parseSseBlock, partsFromResponseBlocks, reasoningStepsFromParts, renderChatPart, shouldPrefetchOlder, shouldUseTopOriginTimeline, textFromFinalOutput, threadActivityDate, threadDetailToMessages, threadPaging, titleFromMessage, toolStateFromStatus, useAgents24ChatController, useLatestThreadViewport };
453
+ export { type Agents24ChatRenderOptions, type ChatActiveRun, type ChatApprovalPart, type ChatAttachment, type ChatCitation, type ChatContextWindow, type ChatController, type ChatDataPart, type ChatErrorPart, type ChatMessage, type ChatPart, type ChatReasoningPart, type ChatReasoningStep, type ChatRunStatus, type ChatRuntimeEvent, type ChatStorageAdapter, type ChatStreamResult, type ChatTextPart, type ChatThreadDetail, type ChatThreadSummary, type ChatThreadTurn, type ChatToolPart, type ChatToolState, type ChatTransport, type ChatUiBlocksPart, DEFAULT_THREAD_PAGE_SIZE, DefaultChatPart, DefaultToolPart, type FetchChatTransportOptions, type FetchChatTransportRoutes, LatestThreadViewport, type LatestThreadViewportProps, type LatestThreadViewportRenderContext, type LatestThreadViewportState, type StoredChatThread, type StreamingTextCache, type StreamingTextMode, type ToolPresentation, type ToolRenderer, type UseAgents24ChatControllerOptions, type UseLatestThreadViewportOptions, type UseStreamingTextOptions, type UseStreamingTextResult, activeRunIdFromThread, activeRunIdFromThreadDetail, assistantTextFromParts, assistantTextFromResponseBlocks, consumeSseResponse, createChatId, createFetchChatTransport, getActiveStreamingTextPartId, getLatestScrollTop, hasStaleUnfinishedAssistantCache, hasUnfinishedAssistantMessage, isActiveStreamingTextPart, isAtTimelineLatestEdge, isRunningThreadStatus, isScrollable, latestContextWindowFromThread, mergeReasoningSteps, parseSseBlock, partsFromResponseBlocks, reasoningStepsFromParts, renderChatPart, shouldPrefetchOlder, shouldUseTopOriginTimeline, textFromFinalOutput, threadActivityDate, threadDetailToMessages, threadPaging, titleFromMessage, toolStateFromStatus, useAgents24ChatController, useLatestThreadViewport, useStreamingText };