@agents24/chat-react 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -12
- package/dist/chunk-E3TJ3I6G.js +358 -0
- package/dist/chunk-E3TJ3I6G.js.map +1 -0
- package/dist/chunk-EWZO4QJI.js +140 -0
- package/dist/chunk-EWZO4QJI.js.map +1 -0
- package/dist/chunk-UU7OXHL3.js +11 -0
- package/dist/chunk-UU7OXHL3.js.map +1 -0
- package/dist/context-window.d.ts +38 -0
- package/dist/controller.d.ts +22 -0
- package/dist/index.cjs +653 -336
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -466
- package/dist/index.js +290 -455
- package/dist/index.js.map +1 -1
- package/dist/latest-thread-scroller.d.ts +54 -0
- package/dist/model.d.ts +29 -0
- package/dist/renderers.d.ts +10 -0
- package/dist/sse.d.ts +3 -0
- package/dist/streaming-text.d.ts +24 -0
- package/dist/templates/agent-chat-shell.d.ts +25 -0
- package/dist/templates/index.cjs +523 -0
- package/dist/templates/index.cjs.map +1 -0
- package/dist/templates/index.d.ts +1 -0
- package/dist/templates/index.js +140 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/transport.d.ts +29 -0
- package/dist/types.d.ts +312 -0
- package/dist/ui/adapters.d.ts +36 -0
- package/dist/ui/attachment.d.ts +23 -0
- package/dist/ui/bubble.d.ts +17 -0
- package/dist/ui/index.cjs +943 -0
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.d.ts +7 -0
- package/dist/ui/index.js +734 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/marker.d.ts +11 -0
- package/dist/ui/message-response.d.ts +7 -0
- package/dist/ui/message.d.ts +10 -0
- package/dist/ui/utils.d.ts +2 -0
- package/dist/viewport.d.ts +2 -0
- package/package.json +22 -4
- package/dist/index.d.cts +0 -466
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/controller.ts","../src/model.ts","../src/renderers.tsx","../src/sse.ts","../src/streaming-text.ts","../src/transport.ts","../src/viewport.tsx"],"sourcesContent":["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 type LatestFollowState = \"following\" | \"detached\";\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 const nextLatestFollowStateOnScroll = ({\n atLatest,\n current,\n isProgrammatic,\n}: {\n atLatest: boolean;\n current: LatestFollowState;\n isProgrammatic: boolean;\n}): LatestFollowState => {\n if (isProgrammatic) return current;\n return atLatest ? \"following\" : \"detached\";\n};\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 isFollowingLatest: boolean;\n isTopOrigin: boolean;\n shouldShowLatestButton: boolean;\n handleScroll: (event: UIEvent<HTMLDivElement>) => void;\n handleUserScrollIntent: () => void;\n scrollToLatest: (options?: { reattach?: boolean }) => void;\n detachFromLatest: () => void;\n reattachToLatest: () => 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 followStateRef = useRef<LatestFollowState>(\"following\");\n const programmaticScrollRef = useRef(false);\n const programmaticScrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const activeStreamKeyRef = useRef<string | null>(null);\n const observedScrollHeightRef = useRef<number | null>(null);\n const [isAtLatest, setIsAtLatest] = useState(true);\n const [followState, setFollowState] = useState<LatestFollowState>(\"following\");\n\n const isTopOrigin = shouldUseTopOriginTimeline({ hasOlder, itemCount, topOriginMaxItems });\n\n const setLatestFollowState = useCallback((next: LatestFollowState) => {\n if (followStateRef.current === next) return;\n followStateRef.current = next;\n setFollowState(next);\n }, []);\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((options?: { reattach?: boolean }) => {\n const element = scrollContainerRef.current;\n if (!element) return;\n if (options?.reattach !== false) setLatestFollowState(\"following\");\n markProgrammaticScroll();\n element.scrollTop = getLatestScrollTop(element, isTopOrigin);\n setIsAtLatest(true);\n observedScrollHeightRef.current = element.scrollHeight;\n }, [isTopOrigin, markProgrammaticScroll, setLatestFollowState]);\n\n const detachFromLatest = useCallback(() => {\n setLatestFollowState(\"detached\");\n }, [setLatestFollowState]);\n\n const reattachToLatest = useCallback(() => {\n scrollToLatest({ reattach: true });\n }, [scrollToLatest]);\n\n const handleUserScrollIntent = useCallback(() => {\n const element = scrollContainerRef.current;\n if (!activeStreamKey || !element) return;\n if (!isAtTimelineLatestEdge(element, isTopOrigin)) detachFromLatest();\n }, [activeStreamKey, detachFromLatest, isTopOrigin]);\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 observedScrollHeightRef.current = element.scrollHeight;\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 setLatestFollowState(\n nextLatestFollowStateOnScroll({\n atLatest,\n current: followStateRef.current,\n isProgrammatic: programmaticScrollRef.current,\n })\n );\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, setLatestFollowState]\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 useLayoutEffect(() => {\n const key = activeStreamKey || null;\n const previousKey = activeStreamKeyRef.current;\n if (!key) {\n activeStreamKeyRef.current = null;\n if (\n previousKey &&\n shouldAutoFollow &&\n followStateRef.current === \"following\" &&\n !isLoadingOlder &&\n !olderPageRequestInFlightRef.current\n ) {\n const frame = requestAnimationFrame(() => {\n if (\n followStateRef.current === \"following\" &&\n !isLoadingOlder &&\n !olderPageRequestInFlightRef.current\n ) {\n scrollToLatest({ reattach: false });\n }\n });\n return () => cancelAnimationFrame(frame);\n }\n return;\n }\n if (previousKey === key) {\n activeStreamKeyRef.current = key;\n return;\n }\n setLatestFollowState(\"following\");\n const frame = requestAnimationFrame(() => scrollToLatest());\n activeStreamKeyRef.current = key;\n return () => cancelAnimationFrame(frame);\n }, [activeStreamKey, isLoadingOlder, scrollToLatest, setLatestFollowState, shouldAutoFollow]);\n\n useLayoutEffect(() => {\n if (!activeStreamKey || !shouldAutoFollow || followStateRef.current !== \"following\") return;\n if (isLoadingOlder || olderPageRequestInFlightRef.current) return;\n const frame = requestAnimationFrame(() => {\n if (followStateRef.current === \"following\" && !isLoadingOlder && !olderPageRequestInFlightRef.current) {\n scrollToLatest({ reattach: false });\n }\n });\n return () => cancelAnimationFrame(frame);\n }, [activeStreamKey, isLoadingOlder, itemCount, scrollToLatest, shouldAutoFollow]);\n\n useEffect(() => {\n if (!activeStreamKey) {\n observedScrollHeightRef.current = scrollContainerRef.current?.scrollHeight ?? null;\n return;\n }\n\n let frame: number | null = null;\n const watchStreamResize = () => {\n const element = scrollContainerRef.current;\n if (!element) return;\n const previousHeight = observedScrollHeightRef.current;\n const nextHeight = element.scrollHeight;\n observedScrollHeightRef.current = nextHeight;\n if (\n previousHeight !== null &&\n Math.abs(nextHeight - previousHeight) >= 1 &&\n shouldAutoFollow &&\n followStateRef.current === \"following\" &&\n !isLoadingOlder &&\n !olderPageRequestInFlightRef.current\n ) {\n scrollToLatest({ reattach: false });\n }\n frame = requestAnimationFrame(watchStreamResize);\n };\n\n frame = requestAnimationFrame(watchStreamResize);\n return () => {\n if (frame !== null) cancelAnimationFrame(frame);\n };\n }, [activeStreamKey, isLoadingOlder, scrollToLatest, shouldAutoFollow]);\n\n return {\n scrollContainerRef,\n isAtLatest,\n isFollowingLatest: followState === \"following\",\n isTopOrigin,\n shouldShowLatestButton: !isAtLatest,\n handleScroll,\n handleUserScrollIntent,\n scrollToLatest,\n detachFromLatest,\n reattachToLatest,\n preserveIntrinsicResize,\n };\n}\n\nexport type LatestThreadViewportRenderContext = {\n preserveIntrinsicResize: () => void;\n isFollowingLatest: boolean;\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 onKeyDown={viewport.handleUserScrollIntent}\n onScroll={viewport.handleScroll}\n onTouchMove={viewport.handleUserScrollIntent}\n onWheel={viewport.handleUserScrollIntent}\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","useEffect","useRef","useState","useCallback","useEffect","useMemo","useRef","useState","jsxs","frame"]}
|
|
1
|
+
{"version":3,"sources":["../src/controller.ts","../src/context-window.ts","../src/model.ts","../src/renderers.tsx","../src/sse.ts","../src/transport.ts","../src/viewport.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { mergeContextWindowUpdate } from \"./context-window\";\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 ChatSubmitMessage,\n ChatTransport,\n StoredChatThread,\n} from \"./types\";\n\nexport type ChatRuntimeEventContext = {\n mode: \"submit\" | \"attach\";\n assistantMessageId: string;\n threadId: string | null;\n runId: string | null;\n startedAt: number;\n};\n\nexport type UseAgents24ChatControllerOptions = {\n transport: ChatTransport;\n storage: ChatStorageAdapter;\n activeThreadId?: string | null;\n pageSize?: number;\n storageKey?: unknown;\n createId?: () => string;\n onActiveThreadIdChange?: (threadId: string | null) => void;\n onSourceClick?: (citations: ChatMessage[\"citations\"]) => void;\n onStreamErrorMessage?: (error: unknown) => string;\n onRuntimeEvent?: (\n event: ChatRuntimeEvent,\n context: ChatRuntimeEventContext\n ) => void | Promise<void>;\n onThreadDetailLoaded?: (detail: unknown) => void | Promise<void>;\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 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 onRuntimeEvent,\n onThreadDetailLoaded,\n}: UseAgents24ChatControllerOptions): ChatController {\n const activeThreadId = controlledActiveThreadId ?? storage.getActiveThreadId?.() ?? null;\n const initialCached = activeThreadId ? storage.getThread(activeThreadId) : undefined;\n const [messages, setMessages] = useState<ChatMessage[]>(() => initialCached?.messages || []);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingHistory, setIsLoadingHistory] = useState(() => Boolean(activeThreadId) && !initialCached?.messages?.length);\n const [isLoadingOlder, setIsLoadingOlder] = useState(false);\n const [hasOlderTurns, setHasOlderTurns] = useState(Boolean(initialCached?.hasOlderTurns));\n const [streamingContent, setStreamingContent] = useState(\"\");\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [contextStatus, setContextStatus] = useState<ChatContextWindow | null>(null);\n const [currentReasoning, setCurrentReasoning] = useState<ChatReasoningStep[]>([]);\n const [liked, setLiked] = useState<Record<string, boolean>>({});\n const [disliked, setDisliked] = useState<Record<string, boolean>>({});\n const [copiedMessageId, setCopiedMessageId] = useState<string | null>(null);\n const [lastThinkingDurationMs, setLastThinkingDurationMs] = useState<number | null>(null);\n const [threads, setThreads] = useState<StoredChatThread[]>(() => storage.listThreads());\n const [isRefreshingThreads, setIsRefreshingThreads] = useState(false);\n const [activeRunId, setActiveRunId] = useState<string | 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 const setActiveRunIdValue = useCallback((runId: string | null) => {\n activeRunIdRef.current = runId;\n setActiveRunId(runId);\n }, []);\n\n const syncThreadsFromStorage = useCallback(() => {\n setThreads(storage.listThreads());\n }, [storage]);\n\n const upsertStoredThread = useCallback(\n (thread: StoredChatThread) => {\n storage.upsertThread(thread);\n syncThreadsFromStorage();\n },\n [storage, syncThreadsFromStorage]\n );\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n const persistThread = useCallback(\n (\n threadId: string,\n nextMessages: ChatMessage[],\n paging?: { hasOlderTurns?: boolean; nextBeforeTurnIndex?: number | null },\n options?: { updatedAt?: string; touch?: boolean }\n ) => {\n const existing = storage.getThread(threadId);\n const firstUser = nextMessages.find((message) => message.role === \"user\");\n upsertStoredThread({\n ...(existing || {}),\n id: threadId,\n title: existing?.title || (firstUser ? titleFromMessage(firstUser.content, firstUser.attachments || []) : \"New chat\"),\n updated_at: options?.updatedAt || (options?.touch ? new Date().toISOString() : existing?.updated_at) || new Date().toISOString(),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging?.hasOlderTurns ?? hasOlderTurnsRef.current,\n nextBeforeTurnIndex: paging?.nextBeforeTurnIndex ?? nextBeforeTurnIndexRef.current,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const markThreadRunStatus = useCallback(\n (threadId: string, runId: string, status: string, lastEventSeq?: number | null) => {\n const existing = storage.getThread(threadId);\n if (!existing || !runId) return;\n upsertStoredThread({\n ...existing,\n last_run_id: runId,\n last_run_status: status,\n active_run: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastEventSeq: typeof lastEventSeq === \"number\" ? lastEventSeq : existing.lastEventSeq ?? null,\n isRunning: activeRunIdFromThread({\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: { run_id: runId, status },\n }) !== null,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const refresh = useCallback(async () => {\n setIsRefreshingThreads(true);\n try {\n const data = await transport.listThreads();\n const nextThreads = (data.items || []).map((item) => threadSummaryToStored(item));\n storage.setThreads(nextThreads);\n setThreads(storage.listThreads());\n } finally {\n setIsRefreshingThreads(false);\n }\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 setActiveRunIdValue(null);\n reattachedRunIdRef.current = null;\n streamingMessageIdRef.current = null;\n streamingContentRef.current = \"\";\n reasoningRef.current = [];\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingContent(\"\");\n setCurrentReasoning([]);\n }, [setActiveRunIdValue]);\n\n const 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 upsertStoredThread({\n ...existingThread,\n messages: completed,\n last_run_id: input.runId,\n last_run_status: input.error ? \"failed\" : \"completed\",\n active_run: null,\n lastRunId: input.runId,\n lastRunStatus: input.error ? \"failed\" : \"completed\",\n activeRun: null,\n isRunning: false,\n });\n }\n }\n return completed;\n },\n [createId, persistThread, storage, upsertStoredThread]\n );\n\n const loadThread = useCallback(\n async (threadId: string) => {\n const seq = ++requestSeqRef.current;\n setLoadingHistory(true);\n setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n includeRunEvents: false,\n });\n if (activeThreadIdRef.current !== threadId || seq !== requestSeqRef.current) return;\n void onThreadDetailLoaded?.(detail);\n const nextMessages = threadDetailToMessages(detail);\n const paging = threadPaging(detail);\n setContextStatus(latestContextWindowFromThread(detail));\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n setHasOlderTurns(paging.hasOlderTurns);\n hasOlderTurnsRef.current = paging.hasOlderTurns;\n nextBeforeTurnIndexRef.current = paging.nextBeforeTurnIndex;\n loadedThreadIdRef.current = threadId;\n upsertStoredThread({\n ...threadSummaryToStored(detail),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging.hasOlderTurns,\n nextBeforeTurnIndex: paging.nextBeforeTurnIndex,\n updated_at: threadActivityDate(detail),\n });\n } finally {\n if (activeThreadIdRef.current === threadId) setLoadingHistory(false);\n }\n },\n [onThreadDetailLoaded, pageSize, setLoadingHistory, transport, upsertStoredThread]\n );\n\n const loadOlderTurns = useCallback(async () => {\n const threadId = activeThreadIdRef.current;\n const beforeTurnIndex = nextBeforeTurnIndexRef.current;\n if (!threadId || beforeTurnIndex === null || isLoadingOlderRef.current) return;\n isLoadingOlderRef.current = true;\n setIsLoadingOlder(true);\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n beforeTurnIndex,\n includeRunEvents: false,\n });\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: { mode: \"submit\" | \"attach\"; event: ChatRuntimeEvent; assistantMessageId: string; startedAt: number; streamThreadIdRef: { current: string | null }; baseMessages: ChatMessage[] }) => {\n const { mode, event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages } = input;\n const payload = event.payload || {};\n const responseBlocks = Array.isArray(payload.response_blocks) ? (payload.response_blocks as Array<Record<string, unknown>>) : null;\n if (event.run_id) setActiveRunIdValue(event.run_id);\n void onRuntimeEvent?.(event, {\n mode,\n assistantMessageId,\n threadId: streamThreadIdRef.current,\n runId: event.run_id || activeRunIdRef.current,\n startedAt,\n });\n setContextStatus((current) => mergeContextWindowUpdate(current, payload.context_window));\n if (responseBlocks) {\n const blockText = String(payload.assistant_output_text || \"\") || assistantTextFromResponseBlocks(responseBlocks) || streamingContentRef.current;\n if (blockText) setStreamingText(blockText);\n const parts = partsFromResponseBlocks(responseBlocks, blockText);\n const reasoning = mergeReasoningSteps([...reasoningRef.current, ...reasoningStepsFromParts(parts)]);\n setReasoningSteps(reasoning);\n setLiveAssistantMessage({\n messageId: assistantMessageId,\n runId: event.run_id || activeRunIdRef.current,\n content: blockText,\n reasoning,\n parts,\n baseMessages,\n });\n }\n if (event.event === \"run.accepted\" || event.event === \"run.snapshot\") {\n const nextThreadId = String(payload.thread_id || streamThreadIdRef.current || \"\");\n if (nextThreadId) {\n streamThreadIdRef.current = nextThreadId;\n applyThreadId(nextThreadId, baseMessages);\n markThreadRunStatus(nextThreadId, event.run_id || activeRunIdRef.current || \"\", String(payload.status || \"running\"), typeof payload.last_event_seq === \"number\" ? payload.last_event_seq : null);\n }\n return;\n }\n const isTerminal = event.event === \"run.completed\" || event.event === \"run.cancelled\" || event.event === \"reshet.stream.result\";\n const isFailed = event.event === \"run.failed\" || event.event.endsWith(\".stream.error\");\n if (!isTerminal && !isFailed) return;\n const terminalThreadId = String(payload.thread_id || \"\");\n if (terminalThreadId && !streamThreadIdRef.current) {\n streamThreadIdRef.current = terminalThreadId;\n applyThreadId(terminalThreadId, baseMessages);\n }\n const finalText = String(payload.assistant_output_text || 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, onRuntimeEvent, onStreamErrorMessage, setActiveRunIdValue, setLiveAssistantMessage, setReasoningSteps]\n );\n\n const runStream = useCallback(\n async (input: { mode: \"submit\"; message: ChatSubmitMessage } | { mode: \"attach\"; threadId: string; runId: string }) => {\n const startedAt = Date.now();\n const controller = new AbortController();\n requestSeqRef.current += 1;\n abortControllerRef.current = controller;\n setIsLoading(true);\n setStreamingText(\"\");\n setReasoningSteps([{ label: input.mode === \"attach\" ? \"Reconnecting\" : \"Connecting\", status: \"active\" }]);\n const streamThreadIdRef = { current: input.mode === \"attach\" ? input.threadId : activeThreadIdRef.current };\n const attachAssistantMessage = input.mode === \"attach\"\n ? [...messagesRef.current]\n .reverse()\n .find(\n (message) =>\n message.role === \"assistant\" &&\n (message.runId === input.runId || message.isFinal === false)\n )\n : undefined;\n let assistantMessageId = input.mode === \"attach\"\n ? attachAssistantMessage?.id || `${input.runId}-assistant`\n : createId();\n let baseMessages = messagesRef.current;\n if (input.mode === \"submit\") {\n const userMessage: ChatMessage = {\n id: createId(),\n role: \"user\",\n content: input.message.text,\n createdAt: new Date(),\n parts: input.message.text\n ? [{ id: createId(), type: \"text\", kind: \"text\", text: input.message.text }]\n : [],\n attachments: input.message.files,\n };\n baseMessages = [...messagesRef.current, userMessage];\n }\n if (!messagesRef.current.some((message) => message.id === assistantMessageId)) {\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n isFinal: false,\n parts: [],\n reasoningSteps: [],\n };\n const liveMessages: ChatMessage[] = [...baseMessages, assistantMessage];\n setMessages(liveMessages);\n messagesRef.current = liveMessages;\n } else if (input.mode === \"attach\" && attachAssistantMessage) {\n const nextMessages = messagesRef.current.map((message) =>\n message.id === attachAssistantMessage.id\n ? { ...message, runId: message.runId || input.runId, isFinal: false }\n : message\n );\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n baseMessages = nextMessages;\n if (streamThreadIdRef.current) persistThread(streamThreadIdRef.current, nextMessages);\n }\n streamingMessageIdRef.current = assistantMessageId;\n setStreamingMessageId(assistantMessageId);\n if (streamThreadIdRef.current) {\n persistThread(\n streamThreadIdRef.current,\n messagesRef.current.length > 0 ? messagesRef.current : baseMessages,\n undefined,\n { touch: input.mode === \"submit\" }\n );\n }\n try {\n if (input.mode === \"attach\") {\n setActiveRunIdValue(input.runId);\n reattachedRunIdRef.current = input.runId;\n await transport.attachRun({ runId: input.runId, signal: controller.signal }, (event) =>\n handleStreamEvent({ mode: \"attach\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n } else {\n await transport.streamMessage(\n { ...input.message, files: input.message.files || [], threadId: activeThreadIdRef.current, signal: controller.signal },\n (event) => handleStreamEvent({ mode: \"submit\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n }\n if (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 setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n reattachedRunIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n setLastThinkingDurationMs(Date.now() - startedAt);\n }\n }\n },\n [createId, finalizeAssistantMessage, handleStreamEvent, onStreamErrorMessage, persistThread, refresh, setActiveRunIdValue, setReasoningSteps, transport]\n );\n\n const handleSubmit = useCallback(\n async (message: ChatSubmitMessage) => {\n if (!message.text.trim() && !(message.files || []).length) return;\n await runStream({ mode: \"submit\", message });\n },\n [runStream]\n );\n\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 setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n if (runId) transport.cancelRun({ runId, assistantOutputText: partial }).catch(() => undefined);\n if (partial.trim()) {\n finalizeAssistantMessage({\n threadId: activeThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: partial,\n reasoning: reasoningRef.current,\n thinkingDurationMs: lastThinkingDurationMs || 0,\n messageId: liveMessageId,\n });\n }\n }, [finalizeAssistantMessage, lastThinkingDurationMs, setActiveRunIdValue, setReasoningSteps, transport]);\n\n useEffect(() => {\n refresh().catch(() => {\n storage.setThreads([]);\n setThreads([]);\n });\n }, [refresh, storage]);\n\n useEffect(() => {\n syncThreadsFromStorage();\n }, [storageKey, syncThreadsFromStorage]);\n\n useEffect(() => {\n const previous = activeThreadIdRef.current;\n activeThreadIdRef.current = activeThreadId;\n if (\n activeThreadId &&\n previous === activeThreadId &&\n (activeRunIdRef.current || streamingMessageIdRef.current)\n ) {\n return;\n }\n if (previous && previous !== activeThreadId && abortControllerRef.current) {\n detachActiveStream();\n }\n if (!activeThreadId) {\n 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 const startNewThread = useCallback(() => {\n detachActiveStream();\n requestSeqRef.current += 1;\n activeThreadIdRef.current = null;\n loadedThreadIdRef.current = null;\n nextBeforeTurnIndexRef.current = null;\n hasOlderTurnsRef.current = false;\n storage.setActiveThreadId?.(null);\n onActiveThreadIdChange?.(null);\n setMessages([]);\n messagesRef.current = [];\n setHasOlderTurns(false);\n setIsLoadingOlder(false);\n setContextStatus(null);\n setLoadingHistory(false);\n }, [detachActiveStream, onActiveThreadIdChange, setLoadingHistory, storage]);\n\n const loadThreadById = useCallback(\n async (threadId: string) => {\n if (!threadId) return;\n if (activeThreadIdRef.current !== threadId) {\n if (abortControllerRef.current) detachActiveStream();\n activeThreadIdRef.current = threadId;\n storage.setActiveThreadId?.(threadId);\n onActiveThreadIdChange?.(threadId);\n }\n await loadThread(threadId);\n },\n [detachActiveStream, loadThread, onActiveThreadIdChange, storage]\n );\n\n const activeThread = activeThreadId\n ? storage.getThread(activeThreadId) || threads.find((thread) => thread.id === activeThreadId) || null\n : null;\n\n return useMemo(() => ({\n threads,\n activeThreadId,\n activeThread,\n messages,\n streamingContent,\n streamingMessageId,\n contextStatus,\n currentReasoning,\n isLoading,\n isLoadingHistory,\n isLoadingOlder,\n isRefreshingThreads,\n hasOlderTurns,\n liked,\n disliked,\n copiedMessageId,\n lastThinkingDurationMs,\n activeRunId,\n handleSubmit,\n handleStop,\n handleCopy,\n handleLike,\n handleDislike,\n handleRetry,\n handleSourceClick: (citations: ChatMessage[\"citations\"]) => onSourceClick?.(citations),\n upsertLiveVoiceMessage,\n startNewThread,\n loadThreadById,\n loadOlderTurns,\n refresh,\n textareaRef,\n }), [\n copiedMessageId,\n activeRunId,\n activeThread,\n activeThreadId,\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 isRefreshingThreads,\n lastThinkingDurationMs,\n liked,\n loadThreadById,\n loadOlderTurns,\n messages,\n onSourceClick,\n refresh,\n streamingContent,\n streamingMessageId,\n startNewThread,\n threads,\n upsertLiveVoiceMessage,\n ]);\n}\n","export type ContextWindowSource =\n | \"exact\"\n | \"estimated\"\n | \"provider_count_api\"\n | \"provider_usage\"\n | \"runtime_tokenizer\"\n | \"hf_tokenizer\"\n | \"multimodal_estimate\"\n | \"text_estimate\"\n | \"tokenizer_estimate\"\n | \"heuristic_estimate\"\n | \"unknown\";\n\nexport type ContextWindowStage = \"preflight\" | \"sent_prompt\" | \"final_usage\";\nexport type ContextWindowConfidence = \"exact\" | \"high\" | \"medium\" | \"low\" | \"unknown\";\n\nexport type ContextCompressionStatus = {\n active: boolean;\n reason?: string | null;\n input_tokens?: number | null;\n max_tokens?: number | null;\n usage_ratio?: number | null;\n full_frame_count?: number | null;\n compact_frame_count?: number | null;\n dropped_frame_count?: number | null;\n artifact_ref_count?: number | null;\n compression_trigger_budget?: number | null;\n compression_target_budget?: number | null;\n compression_target_ratio?: number | null;\n threshold_used?: number | null;\n};\n\nexport type ContextWindow = {\n source: ContextWindowSource;\n run_id?: string | null;\n stage?: ContextWindowStage | null;\n confidence?: ContextWindowConfidence | null;\n counter?: string | null;\n model_id?: string | null;\n max_tokens?: number | null;\n max_tokens_source?: string | null;\n input_tokens?: number | null;\n remaining_tokens?: number | null;\n usage_ratio?: number | null;\n assembly?: Record<string, unknown> | null;\n context_compression?: ContextCompressionStatus | null;\n};\n\nconst SOURCE_PRIORITY: Record<ContextWindowSource, number> = {\n unknown: 0,\n heuristic_estimate: 1,\n tokenizer_estimate: 1,\n text_estimate: 1,\n estimated: 1,\n multimodal_estimate: 2,\n hf_tokenizer: 3,\n runtime_tokenizer: 3,\n provider_count_api: 4,\n provider_usage: 5,\n exact: 5,\n};\n\nconst STAGE_PRIORITY: Record<ContextWindowStage, number> = {\n preflight: 0,\n sent_prompt: 1,\n final_usage: 2,\n};\n\nfunction numberOrNull(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction stagePriority(window: ContextWindow | null | undefined): number {\n return STAGE_PRIORITY[window?.stage || \"sent_prompt\"] ?? STAGE_PRIORITY.sent_prompt;\n}\n\nfunction hasRenderableContextWindow(window: ContextWindow | null | undefined): boolean {\n const maxTokens = window?.max_tokens;\n return typeof maxTokens === \"number\" && Number.isFinite(maxTokens) && maxTokens > 0;\n}\n\nfunction windowWeight(window: ContextWindow | null | undefined): [number, number] {\n if (!window) return [0, 0];\n return [stagePriority(window), SOURCE_PRIORITY[window.source] || 0];\n}\n\nexport function normalizeContextCompression(value: unknown): ContextCompressionStatus | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n return {\n active: Boolean(payload.active),\n reason: typeof payload.reason === \"string\" ? payload.reason : null,\n input_tokens: numberOrNull(payload.input_tokens),\n max_tokens: numberOrNull(payload.max_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n full_frame_count: numberOrNull(payload.full_frame_count),\n compact_frame_count: numberOrNull(payload.compact_frame_count),\n dropped_frame_count: numberOrNull(payload.dropped_frame_count),\n artifact_ref_count: numberOrNull(payload.artifact_ref_count),\n compression_trigger_budget: numberOrNull(payload.compression_trigger_budget),\n compression_target_budget: numberOrNull(payload.compression_target_budget),\n compression_target_ratio: numberOrNull(payload.compression_target_ratio),\n threshold_used: numberOrNull(payload.threshold_used),\n };\n}\n\nexport function normalizeContextWindow(value: unknown): ContextWindow | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n const rawSource = String(payload.source || \"\").trim();\n const source: ContextWindowSource =\n rawSource === \"exact\" ||\n rawSource === \"estimated\" ||\n rawSource === \"unknown\" ||\n rawSource === \"provider_count_api\" ||\n rawSource === \"provider_usage\" ||\n rawSource === \"runtime_tokenizer\" ||\n rawSource === \"hf_tokenizer\" ||\n rawSource === \"multimodal_estimate\" ||\n rawSource === \"text_estimate\" ||\n rawSource === \"tokenizer_estimate\" ||\n rawSource === \"heuristic_estimate\"\n ? rawSource\n : rawSource\n ? \"estimated\"\n : \"unknown\";\n const rawStage = String(payload.stage || \"\").trim();\n const stage: ContextWindowStage =\n rawStage === \"preflight\" || rawStage === \"sent_prompt\" || rawStage === \"final_usage\"\n ? rawStage\n : \"sent_prompt\";\n const rawConfidence = String(payload.confidence || \"\").trim();\n const confidence: ContextWindowConfidence | null =\n rawConfidence === \"exact\" ||\n rawConfidence === \"high\" ||\n rawConfidence === \"medium\" ||\n rawConfidence === \"low\" ||\n rawConfidence === \"unknown\"\n ? rawConfidence\n : null;\n\n return {\n source,\n run_id: typeof payload.run_id === \"string\" ? payload.run_id : null,\n stage,\n confidence,\n counter: typeof payload.counter === \"string\" ? payload.counter : null,\n model_id: typeof payload.model_id === \"string\" ? payload.model_id : null,\n max_tokens: numberOrNull(payload.max_tokens),\n max_tokens_source: typeof payload.max_tokens_source === \"string\" ? payload.max_tokens_source : null,\n input_tokens: numberOrNull(payload.input_tokens),\n remaining_tokens: numberOrNull(payload.remaining_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n assembly:\n payload.assembly && typeof payload.assembly === \"object\" && !Array.isArray(payload.assembly)\n ? (payload.assembly as Record<string, unknown>)\n : null,\n context_compression: normalizeContextCompression(payload.context_compression),\n };\n}\n\nexport function mergeContextWindow(\n current: ContextWindow | null | undefined,\n incoming: ContextWindow | null | undefined\n): ContextWindow | null {\n if (!incoming) return current ?? null;\n if (!current) return incoming;\n if (hasRenderableContextWindow(current) && !hasRenderableContextWindow(incoming)) return current;\n\n const currentRunId = current.run_id || null;\n const incomingRunId = incoming.run_id || null;\n if (incomingRunId && currentRunId && incomingRunId !== currentRunId) {\n return stagePriority(incoming) >= STAGE_PRIORITY.sent_prompt ? incoming : current;\n }\n\n const currentWeight = windowWeight(current);\n const incomingWeight = windowWeight(incoming);\n return incomingWeight[0] > currentWeight[0] ||\n (incomingWeight[0] === currentWeight[0] && incomingWeight[1] >= currentWeight[1])\n ? incoming\n : current;\n}\n\nexport function mergeContextWindowUpdate(\n current: ContextWindow | null | undefined,\n incoming: unknown\n): ContextWindow | null {\n return mergeContextWindow(current, normalizeContextWindow(incoming));\n}\n\nexport function compressionFromContextWindow(\n contextWindow: ContextWindow | null | undefined\n): ContextCompressionStatus | null {\n if (!contextWindow) return null;\n if (contextWindow.context_compression) return contextWindow.context_compression;\n const assembly = contextWindow.assembly;\n if (!assembly || typeof assembly !== \"object\" || Array.isArray(assembly)) return null;\n const artifactRefs = Array.isArray(assembly.artifact_refs) ? assembly.artifact_refs : [];\n const compactFrameCount = numberOrNull(assembly.compact_frame_count) ?? 0;\n const droppedFrameCount = numberOrNull(assembly.dropped_frame_count) ?? 0;\n const reason = typeof assembly.compaction_reason === \"string\" ? assembly.compaction_reason : \"none\";\n return {\n active: reason !== \"none\" || compactFrameCount > 0 || droppedFrameCount > 0,\n reason,\n input_tokens: contextWindow.input_tokens ?? null,\n max_tokens: contextWindow.max_tokens ?? null,\n usage_ratio: contextWindow.usage_ratio ?? null,\n full_frame_count: numberOrNull(assembly.full_frame_count),\n compact_frame_count: compactFrameCount,\n dropped_frame_count: droppedFrameCount,\n artifact_ref_count: artifactRefs.length,\n compression_trigger_budget: numberOrNull(assembly.compression_trigger_budget),\n compression_target_budget: numberOrNull(assembly.compression_target_budget),\n compression_target_ratio: numberOrNull(assembly.compression_target_ratio),\n threshold_used: numberOrNull(assembly.threshold_used),\n };\n}\n","import type {\n ChatPart,\n ChatContextWindow,\n ChatDataPart,\n ChatErrorPart,\n ChatMessage,\n ChatReasoningStep,\n ChatRuntimeEvent,\n ChatThreadDetail,\n ChatThreadSummary,\n ChatThreadTurn,\n ChatToolPart,\n ChatToolState,\n ToolPresentation,\n} from \"./types\";\nimport { normalizeContextWindow } from \"./context-window\";\n\nexport const DEFAULT_THREAD_PAGE_SIZE = 5;\n\nexport const isRunningThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\", \"cancelling\"]).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 tokenUsageFromTurn = (turn: ChatThreadTurn): ChatMessage[\"tokenUsage\"] | undefined => {\n const usage = turn.run_usage;\n if (!usage || typeof usage !== \"object\") return undefined;\n return {\n inputTokens: usage.input_tokens ?? null,\n outputTokens: usage.output_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n usageSource: usage.source ?? null,\n };\n};\n\nconst latestEventPayloadValue = (events: ChatRuntimeEvent[] | undefined, key: string) => {\n for (let index = (events || []).length - 1; index >= 0; index -= 1) {\n const payload = events?.[index]?.payload;\n if (payload && payload[key] !== undefined && payload[key] !== null) return payload[key];\n }\n return undefined;\n};\n\nconst responseBlocksFromTurn = (turn: ChatThreadTurn) => {\n if (Array.isArray(turn.response_blocks) && turn.response_blocks.length > 0) return turn.response_blocks;\n const fromEvents = latestEventPayloadValue(turn.run_events, \"response_blocks\");\n return Array.isArray(fromEvents) ? (fromEvents as Array<Record<string, unknown>>) : [];\n};\n\nconst assistantTextFromEvents = (events?: ChatRuntimeEvent[]) => {\n const assistantText = latestEventPayloadValue(events, \"assistant_output_text\");\n if (typeof assistantText === \"string\" && assistantText.trim()) return assistantText;\n return 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 tokenUsage: tokenUsageFromTurn(turn),\n });\n }\n return messages;\n};\n\nexport const threadDetailToMessages = (thread: ChatThreadDetail) => {\n const activeRun = activeRunIdFromThreadDetail(thread);\n return (thread.turns || []).flatMap((turn) => turnToMessages(turn, activeRun));\n};\n\nexport const threadPaging = (thread: ChatThreadDetail) => {\n const nextBeforeTurnIndex = thread.paging?.next_before_turn_index ?? null;\n return {\n hasOlderTurns: Boolean(thread.paging?.has_more || nextBeforeTurnIndex !== null),\n nextBeforeTurnIndex,\n };\n};\n\nexport const latestContextWindowFromThread = (thread: ChatThreadDetail): ChatContextWindow | null => {\n const threadContextWindow = normalizeContextWindow(thread.context_window);\n if (threadContextWindow) return threadContextWindow;\n for (let index = (thread.turns || []).length - 1; index >= 0; index -= 1) {\n const contextWindow = normalizeContextWindow(thread.turns?.[index]?.context_window);\n if (contextWindow) return contextWindow;\n }\n return null;\n};\n\nexport const activeRunIdFromThread = (thread?: Partial<ChatThreadSummary> | null) => {\n const hasCamelActiveRun = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"activeRun\")\n );\n const hasCamelLastRunStatus = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunStatus\")\n );\n const hasCamelLastRunId = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunId\")\n );\n const activeRun = hasCamelActiveRun ? thread?.activeRun || null : thread?.active_run || null;\n const lastRunStatus = hasCamelLastRunStatus\n ? thread?.lastRunStatus || null\n : thread?.last_run_status || thread?.lastRunStatus || null;\n const activeRunId = activeRun?.run_id ? String(activeRun.run_id) : \"\";\n if (activeRunId && isRunningThreadStatus(activeRun?.status || lastRunStatus)) return activeRunId;\n const lastRunId = hasCamelLastRunId\n ? thread?.lastRunId\n : thread?.last_run_id || thread?.lastRunId;\n return lastRunId && isRunningThreadStatus(lastRunStatus) ? String(lastRunId) : null;\n};\n\nexport const 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 { ChatSubmitInput, 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: ChatSubmitInput) => unknown;\n};\n\nconst jsonHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n});\n\nconst streamHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n});\n\nexport 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","export {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\nexport type {\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollable,\n MessageScrollerScrollOptions,\n MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\n"],"mappings":"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","names":["next"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { MessageScroller } from "@shadcn/react/message-scroller";
|
|
3
|
+
type MessageScrollerProviderProps = React.ComponentProps<typeof MessageScroller.Provider>;
|
|
4
|
+
type MessageScrollerRootProps = React.ComponentProps<typeof MessageScroller.Root>;
|
|
5
|
+
type MessageScrollerViewportProps = React.ComponentProps<typeof MessageScroller.Viewport>;
|
|
6
|
+
type MessageScrollerContentProps = React.ComponentProps<typeof MessageScroller.Content>;
|
|
7
|
+
type MessageScrollerItemProps = React.ComponentProps<typeof MessageScroller.Item>;
|
|
8
|
+
type MessageScrollerButtonProps = React.ComponentProps<typeof MessageScroller.Button>;
|
|
9
|
+
export type LatestThreadScrollerProviderProps = MessageScrollerProviderProps;
|
|
10
|
+
export declare function LatestThreadScrollerProvider({ autoScroll, defaultScrollPosition, scrollPreviousItemPeek, ...props }: LatestThreadScrollerProviderProps): React.JSX.Element;
|
|
11
|
+
export type LatestThreadScrollerRootProps = MessageScrollerRootProps;
|
|
12
|
+
export declare function LatestThreadScrollerRoot({ className, ref, ...props }: LatestThreadScrollerRootProps): React.JSX.Element;
|
|
13
|
+
export type LatestThreadScrollerViewportProps = MessageScrollerViewportProps & {
|
|
14
|
+
onViewportChange?: (node: HTMLElement | null) => void;
|
|
15
|
+
};
|
|
16
|
+
export declare function LatestThreadScrollerViewport({ className, onViewportChange, preserveScrollOnPrepend, ref, ...props }: LatestThreadScrollerViewportProps): React.JSX.Element;
|
|
17
|
+
export type LatestThreadScrollerContentProps = MessageScrollerContentProps;
|
|
18
|
+
export declare function LatestThreadScrollerContent({ className, ref, ...props }: LatestThreadScrollerContentProps): React.JSX.Element;
|
|
19
|
+
export type LatestThreadScrollerItemProps = Omit<MessageScrollerItemProps, "messageId"> & {
|
|
20
|
+
messageId: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function LatestThreadScrollerItem({ className, messageId, ...props }: LatestThreadScrollerItemProps): React.JSX.Element;
|
|
23
|
+
export type LatestThreadScrollerButtonProps = Omit<MessageScrollerButtonProps, "render"> & {
|
|
24
|
+
className?: string;
|
|
25
|
+
render?: MessageScrollerButtonProps["render"];
|
|
26
|
+
};
|
|
27
|
+
export declare function LatestThreadScrollerButton({ children, className, direction, render, ...props }: LatestThreadScrollerButtonProps): React.JSX.Element;
|
|
28
|
+
export type LatestThreadScrollerOutlineItem = {
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
messageIds?: string[];
|
|
32
|
+
responsePreview?: string;
|
|
33
|
+
};
|
|
34
|
+
export type LatestThreadScrollerOutlineProps = {
|
|
35
|
+
cardClassName?: string;
|
|
36
|
+
className?: string;
|
|
37
|
+
contentMaxWidth?: number;
|
|
38
|
+
dir?: "ltr" | "rtl";
|
|
39
|
+
items: LatestThreadScrollerOutlineItem[];
|
|
40
|
+
minContainerWidthForRail?: number;
|
|
41
|
+
minSideGutterForRail?: number;
|
|
42
|
+
side?: "left" | "right";
|
|
43
|
+
};
|
|
44
|
+
export declare function LatestThreadScrollerOutline({ cardClassName, className, contentMaxWidth, dir, items, minContainerWidthForRail, minSideGutterForRail, side, }: LatestThreadScrollerOutlineProps): React.JSX.Element | null;
|
|
45
|
+
export declare const LatestThreadScroller: {
|
|
46
|
+
Provider: typeof LatestThreadScrollerProvider;
|
|
47
|
+
Root: typeof LatestThreadScrollerRoot;
|
|
48
|
+
Viewport: typeof LatestThreadScrollerViewport;
|
|
49
|
+
Content: typeof LatestThreadScrollerContent;
|
|
50
|
+
Item: typeof LatestThreadScrollerItem;
|
|
51
|
+
Button: typeof LatestThreadScrollerButton;
|
|
52
|
+
Outline: typeof LatestThreadScrollerOutline;
|
|
53
|
+
};
|
|
54
|
+
export {};
|