@agents24/chat-react 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +24 -64
  3. package/compatibility.json +54 -0
  4. package/dist/active-content.d.ts +10 -0
  5. package/dist/{chunk-EWZO4QJI.js → chunk-CHAU7FNW.js} +3 -3
  6. package/dist/chunk-CHAU7FNW.js.map +1 -0
  7. package/dist/{chunk-FFO6KEB4.js → chunk-LI67M74F.js} +98 -12
  8. package/dist/chunk-LI67M74F.js.map +1 -0
  9. package/dist/chunk-R7WFL3YR.js +1327 -0
  10. package/dist/chunk-R7WFL3YR.js.map +1 -0
  11. package/dist/index.cjs +66 -1852
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +0 -6
  14. package/dist/index.js +6 -1841
  15. package/dist/index.js.map +1 -1
  16. package/dist/latest-thread-scroller.d.ts +7 -7
  17. package/dist/mcp-oauth.d.ts +3 -1
  18. package/dist/renderers.d.ts +3 -3
  19. package/dist/styles.css +493 -0
  20. package/dist/templates/agent-chat-app.d.ts +18 -0
  21. package/dist/templates/agent-chat-layout.d.ts +77 -0
  22. package/dist/templates/agent-chat-shell.d.ts +1 -1
  23. package/dist/templates/appearance-control.d.ts +5 -0
  24. package/dist/templates/index.cjs +2028 -18
  25. package/dist/templates/index.cjs.map +1 -1
  26. package/dist/templates/index.d.ts +3 -0
  27. package/dist/templates/index.js +652 -11
  28. package/dist/templates/index.js.map +1 -1
  29. package/dist/types.d.ts +12 -380
  30. package/dist/ui/agent-chat-actions.d.ts +1 -2
  31. package/dist/ui/agent-chat-composer.d.ts +2 -1
  32. package/dist/ui/agent-chat-message.d.ts +3 -3
  33. package/dist/ui/agent-response-timeline.d.ts +2 -2
  34. package/dist/ui/attachment.d.ts +9 -9
  35. package/dist/ui/bubble.d.ts +4 -4
  36. package/dist/ui/index.cjs +138 -44
  37. package/dist/ui/index.cjs.map +1 -1
  38. package/dist/ui/index.js +62 -1220
  39. package/dist/ui/index.js.map +1 -1
  40. package/dist/ui/marker.d.ts +3 -3
  41. package/dist/ui/mcp-connect-required-card.d.ts +1 -1
  42. package/dist/ui/message-response.d.ts +1 -1
  43. package/dist/ui/message.d.ts +6 -6
  44. package/package.json +27 -8
  45. package/dist/chunk-EWZO4QJI.js.map +0 -1
  46. package/dist/chunk-FFO6KEB4.js.map +0 -1
  47. package/dist/chunk-UU7OXHL3.js +0 -11
  48. package/dist/chunk-UU7OXHL3.js.map +0 -1
  49. package/dist/context-window.d.ts +0 -38
  50. package/dist/controller-actions.d.ts +0 -45
  51. package/dist/controller-helpers.d.ts +0 -27
  52. package/dist/controller-hitl.d.ts +0 -22
  53. package/dist/controller-options.d.ts +0 -15
  54. package/dist/controller-thread-events.d.ts +0 -7
  55. package/dist/controller.d.ts +0 -5
  56. package/dist/message-lifecycle.d.ts +0 -15
  57. package/dist/model.d.ts +0 -30
  58. package/dist/sse.d.ts +0 -5
  59. package/dist/transport.d.ts +0 -43
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/controller.ts","../src/controller-actions.ts","../src/controller-hitl.ts","../src/controller-thread-events.ts","../src/context-window.ts","../src/model.ts","../src/controller-helpers.ts","../src/message-lifecycle.ts","../src/mcp-oauth.ts","../src/renderers.tsx","../src/sse.ts","../src/transport.ts","../src/viewport.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useControllerMessageActions } from \"./controller-actions\";\nimport { useControllerHitl } from \"./controller-hitl\";\nimport type { UseAgents24ChatControllerOptions } from \"./controller-options\";\nimport { useControllerThreadEvents } from \"./controller-thread-events\";\nimport { mergeContextWindowUpdate } from \"./context-window\";\nimport { abortDetachedStream, isAbortError, isThreadNotFoundError, mergeStoredThreadsForRefresh, threadSummaryToStored, type FinalizeInput } from \"./controller-helpers\";\nimport { upsertStableAssistantMessage } from \"./message-lifecycle\";\nimport { activeRunIdFromThread, activeRunIdFromThreadDetail, assistantTextFromResponseBlocks, autoAttachRunIdFromThread, createChatId, DEFAULT_THREAD_PAGE_SIZE, hasStaleUnfinishedAssistantCache, latestContextWindowFromThread, mergeReasoningSteps, partsFromResponseBlocks, reasoningStepsFromParts, threadActivityDate, threadDetailToMessages, threadPaging, titleFromMessage } from \"./model\";\nimport type { ChatAttachment, ChatContextWindow, ChatController, ChatMessage, ChatPart, ChatReasoningStep, ChatRuntimeEvent, ChatStorageAdapter, ChatStreamResult, ChatSubmitMessage, ChatTransport } from \"./types\";\nimport type { StoredChatThread } from \"./types\";\nexport { mergeStoredThreadsForRefresh } from \"./controller-helpers\";\nexport type { UseAgents24ChatControllerOptions } from \"./controller-options\";\nexport function useAgents24ChatController(options: UseAgents24ChatControllerOptions): ChatController {\n const { transport, storage, activeThreadId: controlledActiveThreadId, pageSize = DEFAULT_THREAD_PAGE_SIZE,\n storageKey, createId = createChatId, onActiveThreadIdChange, onSourceClick, onStreamErrorMessage,\n onRuntimeEvent, onThreadDetailLoaded } = options;\n const activeThreadId = controlledActiveThreadId ?? storage.getActiveThreadId?.() ?? null;\n const initialCached = activeThreadId ? storage.getThread(activeThreadId) : undefined;\n const [messages, setMessages] = useState<ChatMessage[]>(() => initialCached?.messages || []);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingHistory, setIsLoadingHistory] = useState(() => Boolean(activeThreadId) && !initialCached?.messages?.length);\n const [isLoadingOlder, setIsLoadingOlder] = useState(false);\n const [hasOlderTurns, setHasOlderTurns] = useState(Boolean(initialCached?.hasOlderTurns));\n const [streamingContent, setStreamingContent] = useState(\"\");\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [contextStatus, setContextStatus] = useState<ChatContextWindow | null>(null);\n const [currentReasoning, setCurrentReasoning] = useState<ChatReasoningStep[]>([]);\n const [liked, setLiked] = useState<Record<string, boolean>>({});\n const [disliked, setDisliked] = useState<Record<string, boolean>>({});\n const [copiedMessageId, setCopiedMessageId] = useState<string | null>(null);\n const [lastThinkingDurationMs, setLastThinkingDurationMs] = useState<number | null>(null);\n const [threads, setThreads] = useState<StoredChatThread[]>(() => storage.listThreads());\n const [isRefreshingThreads, setIsRefreshingThreads] = useState(false);\n const [isSelectingThread, setIsSelectingThread] = useState(false);\n const [activeRunId, setActiveRunId] = useState<string | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const activeThreadIdRef = useRef<string | null>(activeThreadId);\n const messagesRef = useRef<ChatMessage[]>(messages);\n const nextBeforeTurnIndexRef = useRef<number | null>(initialCached?.nextBeforeTurnIndex ?? null);\n const hasOlderTurnsRef = useRef(Boolean(initialCached?.hasOlderTurns));\n const isLoadingOlderRef = useRef(false);\n const loadedThreadIdRef = useRef<string | null>(initialCached?.messages?.length ? activeThreadId : null);\n const requestSeqRef = useRef(0);\n const isLoadingHistoryRef = useRef(isLoadingHistory);\n const activeRunIdRef = useRef<string | null>(null);\n const reattachedRunIdRef = useRef<string | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const [lifecycleAbortController] = useState(() => new AbortController());\n const streamingContentRef = useRef(\"\");\n const streamingMessageIdRef = useRef<string | null>(null);\n const reasoningRef = useRef<ChatReasoningStep[]>([]);\n const liveVoiceIdsRef = useRef<{ user?: string; assistant?: string }>({});\n const refreshSeqRef = useRef(0);\n const setActiveRunIdValue = useCallback((runId: string | null) => {\n activeRunIdRef.current = runId;\n setActiveRunId(runId);\n }, []);\n const syncThreadsFromStorage = useCallback(() => {\n setThreads(storage.listThreads());\n }, [storage]);\n const upsertStoredThread = useCallback(\n (thread: StoredChatThread) => {\n storage.upsertThread(thread);\n syncThreadsFromStorage();\n },\n [storage, syncThreadsFromStorage]\n );\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n const persistThread = useCallback(\n (\n threadId: string,\n nextMessages: ChatMessage[],\n paging?: { hasOlderTurns?: boolean; nextBeforeTurnIndex?: number | null },\n options?: { updatedAt?: string; touch?: boolean }\n ) => {\n const existing = storage.getThread(threadId);\n const firstUser = nextMessages.find((message) => message.role === \"user\");\n upsertStoredThread({\n ...(existing || {}),\n id: threadId,\n title: existing?.title || (firstUser ? titleFromMessage(firstUser.content, firstUser.attachments || []) : \"New chat\"),\n updated_at: options?.updatedAt || (options?.touch ? new Date().toISOString() : existing?.updated_at) || new Date().toISOString(),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging?.hasOlderTurns ?? hasOlderTurnsRef.current,\n nextBeforeTurnIndex: paging?.nextBeforeTurnIndex ?? nextBeforeTurnIndexRef.current,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const markThreadRunStatus = useCallback(\n (threadId: string, runId: string, status: string, lastEventSeq?: number | null) => {\n const existing = storage.getThread(threadId);\n if (!existing || !runId) return;\n upsertStoredThread({\n ...existing,\n last_run_id: runId,\n last_run_status: status,\n active_run: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: {\n run_id: runId,\n status,\n created_at: existing.activeRun?.created_at ?? existing.active_run?.created_at ?? new Date().toISOString(),\n },\n lastEventSeq: typeof lastEventSeq === \"number\" ? lastEventSeq : existing.lastEventSeq ?? null,\n isRunning: activeRunIdFromThread({\n lastRunId: runId,\n lastRunStatus: status,\n activeRun: { run_id: runId, status },\n }) !== null,\n });\n },\n [storage, upsertStoredThread]\n );\n\n const refresh = useCallback(async () => {\n const seq = ++refreshSeqRef.current;\n setIsRefreshingThreads(true);\n try {\n const data = await transport.listThreads({ signal: lifecycleAbortController.signal });\n if (lifecycleAbortController.signal.aborted) return;\n if (seq !== refreshSeqRef.current) return;\n const nextThreads = (data.items || []).map((item) => threadSummaryToStored(item));\n storage.setThreads(mergeStoredThreadsForRefresh(storage.listThreads(), nextThreads));\n setThreads(storage.listThreads());\n } finally {\n if (!lifecycleAbortController.signal.aborted && seq === refreshSeqRef.current) setIsRefreshingThreads(false);\n }\n }, [lifecycleAbortController, storage, transport]);\n\n const applyThreadId = useCallback(\n (threadId: string, baseMessages: ChatMessage[]) => {\n if (!threadId || activeThreadIdRef.current === threadId) return;\n activeThreadIdRef.current = threadId;\n persistThread(threadId, messagesRef.current.length > 0 ? messagesRef.current : baseMessages, undefined, { touch: true });\n storage.setActiveThreadId?.(threadId);\n onActiveThreadIdChange?.(threadId);\n },\n [onActiveThreadIdChange, persistThread, storage]\n );\n const setStreamingText = (value: string) => {\n streamingContentRef.current = value;\n setStreamingContent(value);\n };\n const setLoadingHistory = useCallback((value: boolean) => {\n isLoadingHistoryRef.current = value;\n setIsLoadingHistory(value);\n }, []);\n const setReasoningSteps = useCallback((value: ChatReasoningStep[]) => {\n reasoningRef.current = value || [];\n setCurrentReasoning(value || []);\n }, []);\n const detachActiveStream = useCallback(() => {\n const controller = abortControllerRef.current;\n abortControllerRef.current = null;\n abortDetachedStream(controller);\n setActiveRunIdValue(null);\n reattachedRunIdRef.current = null;\n streamingMessageIdRef.current = null;\n streamingContentRef.current = \"\";\n reasoningRef.current = [];\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingContent(\"\");\n setCurrentReasoning([]);\n }, [setActiveRunIdValue]);\n\n const clearMissingThread = useCallback(\n (threadId: string) => {\n storage.deleteThread?.(threadId);\n syncThreadsFromStorage();\n if (activeThreadIdRef.current !== threadId) return;\n\n requestSeqRef.current += 1;\n detachActiveStream();\n activeThreadIdRef.current = null;\n loadedThreadIdRef.current = null;\n nextBeforeTurnIndexRef.current = null;\n hasOlderTurnsRef.current = false;\n storage.setActiveThreadId?.(null);\n onActiveThreadIdChange?.(null);\n setMessages([]);\n messagesRef.current = [];\n setHasOlderTurns(false);\n setIsLoadingOlder(false);\n setContextStatus(null);\n setLoadingHistory(false);\n },\n [detachActiveStream, onActiveThreadIdChange, setLoadingHistory, storage, syncThreadsFromStorage]\n );\n\n const setLiveAssistantMessage = useCallback(\n (input: {\n messageId: string;\n runId?: string | null;\n content: string;\n reasoning: ChatReasoningStep[];\n parts?: ChatPart[];\n baseMessages?: ChatMessage[];\n }) => {\n setMessages((prev) => {\n const next = upsertStableAssistantMessage(prev, {\n baseMessages: input.baseMessages,\n messageId: input.messageId,\n runId: input.runId,\n create: () => ({\n id: input.messageId,\n role: \"assistant\",\n runId: input.runId ?? null,\n content: input.content,\n createdAt: new Date(),\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts || [],\n }),\n update: (message) => ({\n ...message,\n runId: input.runId ?? message.runId ?? null,\n content: input.content,\n reasoningSteps: input.reasoning,\n isFinal: false,\n parts: input.parts ?? message.parts,\n }),\n });\n messagesRef.current = next;\n return next;\n });\n },\n []\n );\n\n const finalizeAssistantMessage = useCallback(\n (input: FinalizeInput) => {\n const content = input.error || input.assistantText.trim();\n if (!content) return input.baseMessages;\n const existingIndex = input.baseMessages.findIndex(\n (message) => (input.messageId && message.id === input.messageId) || (input.runId && message.role === \"assistant\" && message.runId === input.runId)\n );\n const existing = existingIndex >= 0 ? input.baseMessages[existingIndex] : undefined;\n const parts =\n input.parts ||\n existing?.parts ||\n partsFromResponseBlocks(undefined, content);\n const assistant: ChatMessage = {\n id: existing?.id || input.messageId || createId(),\n role: \"assistant\",\n runId: input.runId ?? existing?.runId ?? null,\n content,\n createdAt: new Date(),\n isFinal: true,\n parts,\n reasoningSteps: mergeReasoningSteps(input.reasoning, { finalize: true }),\n thinkingDurationMs: input.thinkingDurationMs,\n };\n const completed = upsertStableAssistantMessage(input.baseMessages, {\n messageId: input.messageId,\n runId: input.runId,\n create: () => assistant,\n update: (message) => ({\n ...message,\n ...assistant,\n id: message.id,\n createdAt: message.createdAt,\n }),\n });\n setMessages(completed);\n messagesRef.current = completed;\n if (input.threadId) {\n persistThread(input.threadId, completed);\n const existingThread = storage.getThread(input.threadId);\n if (existingThread && input.runId) {\n upsertStoredThread({\n ...existingThread,\n messages: completed,\n last_run_id: input.runId,\n last_run_status: input.error ? \"failed\" : \"completed\",\n active_run: null,\n lastRunId: input.runId,\n lastRunStatus: input.error ? \"failed\" : \"completed\",\n activeRun: null,\n isRunning: false,\n });\n }\n }\n return completed;\n },\n [createId, persistThread, storage, upsertStoredThread]\n );\n\n const loadThread = useCallback(\n async (threadId: string) => {\n const seq = ++requestSeqRef.current;\n setLoadingHistory(true);\n setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n includeRunEvents: false,\n signal: lifecycleAbortController.signal,\n });\n if (activeThreadIdRef.current !== threadId || seq !== requestSeqRef.current) return;\n void onThreadDetailLoaded?.(detail);\n const nextMessages = threadDetailToMessages(detail);\n const paging = threadPaging(detail);\n setContextStatus(latestContextWindowFromThread(detail));\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n setHasOlderTurns(paging.hasOlderTurns);\n hasOlderTurnsRef.current = paging.hasOlderTurns;\n nextBeforeTurnIndexRef.current = paging.nextBeforeTurnIndex;\n loadedThreadIdRef.current = threadId;\n upsertStoredThread({\n ...threadSummaryToStored(detail),\n messages: nextMessages,\n isHydrated: true,\n hasOlderTurns: paging.hasOlderTurns,\n nextBeforeTurnIndex: paging.nextBeforeTurnIndex,\n updated_at: threadActivityDate(detail),\n });\n } catch (error) {\n if (isAbortError(error)) return;\n if (isThreadNotFoundError(error)) {\n clearMissingThread(threadId);\n return;\n }\n throw error;\n } finally {\n if (!lifecycleAbortController.signal.aborted && activeThreadIdRef.current === threadId && seq === requestSeqRef.current) setLoadingHistory(false);\n }\n },\n [clearMissingThread, lifecycleAbortController, onThreadDetailLoaded, pageSize, setLoadingHistory, transport, upsertStoredThread]\n );\n\n const loadOlderTurns = useCallback(async () => {\n const threadId = activeThreadIdRef.current;\n const beforeTurnIndex = nextBeforeTurnIndexRef.current;\n if (!threadId || beforeTurnIndex === null || isLoadingOlderRef.current) return;\n isLoadingOlderRef.current = true;\n setIsLoadingOlder(true);\n try {\n const detail = await transport.getThread({\n threadId,\n limit: pageSize,\n beforeTurnIndex,\n includeRunEvents: false,\n signal: lifecycleAbortController.signal,\n });\n if (activeThreadIdRef.current !== threadId) return;\n const older = threadDetailToMessages(detail);\n const paging = threadPaging(detail);\n const next = [...older, ...messagesRef.current];\n setMessages(next);\n messagesRef.current = next;\n setHasOlderTurns(paging.hasOlderTurns);\n hasOlderTurnsRef.current = paging.hasOlderTurns;\n nextBeforeTurnIndexRef.current = paging.nextBeforeTurnIndex;\n persistThread(threadId, next, paging);\n } catch (error) {\n if (isAbortError(error)) return;\n if (isThreadNotFoundError(error)) {\n clearMissingThread(threadId);\n return;\n }\n throw error;\n } finally {\n if (!lifecycleAbortController.signal.aborted && activeThreadIdRef.current === threadId) setIsLoadingOlder(false);\n isLoadingOlderRef.current = false;\n }\n }, [clearMissingThread, lifecycleAbortController, pageSize, persistThread, transport]);\n\n const handleStreamEvent = useCallback(\n (input: { mode: \"submit\" | \"attach\"; event: ChatRuntimeEvent; assistantMessageId: string; startedAt: number; streamThreadIdRef: { current: string | null }; baseMessages: ChatMessage[] }) => {\n const { mode, event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages } = input;\n const payload = event.payload || {};\n const responseBlocks = Array.isArray(payload.response_blocks) ? (payload.response_blocks as Array<Record<string, unknown>>) : null;\n if (event.run_id) setActiveRunIdValue(event.run_id);\n void onRuntimeEvent?.(event, {\n mode,\n assistantMessageId,\n threadId: streamThreadIdRef.current,\n runId: event.run_id || activeRunIdRef.current,\n startedAt,\n });\n setContextStatus((current) => mergeContextWindowUpdate(current, payload.context_window));\n if (responseBlocks) {\n const blockText = String(payload.assistant_output_text || \"\") || assistantTextFromResponseBlocks(responseBlocks) || streamingContentRef.current;\n if (blockText) setStreamingText(blockText);\n const parts = partsFromResponseBlocks(responseBlocks, blockText);\n const reasoning = mergeReasoningSteps([...reasoningRef.current, ...reasoningStepsFromParts(parts)]);\n setReasoningSteps(reasoning);\n setLiveAssistantMessage({\n messageId: assistantMessageId,\n runId: event.run_id || activeRunIdRef.current,\n content: blockText,\n reasoning,\n parts,\n baseMessages,\n });\n }\n if (event.event === \"run.accepted\" || event.event === \"run.snapshot\") {\n const nextThreadId = String(payload.thread_id || streamThreadIdRef.current || \"\");\n if (nextThreadId) {\n streamThreadIdRef.current = nextThreadId;\n applyThreadId(nextThreadId, baseMessages);\n markThreadRunStatus(nextThreadId, event.run_id || activeRunIdRef.current || \"\", String(payload.status || \"running\"), typeof payload.last_event_seq === \"number\" ? payload.last_event_seq : null);\n }\n return;\n }\n const isTerminal = event.event === \"run.completed\" || event.event === \"run.cancelled\" || event.event === \"reshet.stream.result\";\n const isFailed = event.event === \"run.failed\" || event.event.endsWith(\".stream.error\");\n if (!isTerminal && !isFailed) return;\n const terminalThreadId = String(payload.thread_id || \"\");\n if (terminalThreadId && !streamThreadIdRef.current) {\n streamThreadIdRef.current = terminalThreadId;\n applyThreadId(terminalThreadId, baseMessages);\n }\n const finalText = String(payload.assistant_output_text || assistantTextFromResponseBlocks(responseBlocks || []) || streamingContentRef.current || \"\");\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current || activeThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: finalText,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: event.run_id || activeRunIdRef.current,\n parts: responseBlocks ? partsFromResponseBlocks(responseBlocks, finalText) : undefined,\n error: isFailed\n ? String(payload.message || payload.error || event.diagnostics?.[0]?.message || onStreamErrorMessage?.(event) || \"The chat run failed.\")\n : undefined,\n });\n },\n [applyThreadId, finalizeAssistantMessage, markThreadRunStatus, onRuntimeEvent, onStreamErrorMessage, setActiveRunIdValue, setLiveAssistantMessage, setReasoningSteps]\n );\n\n const runStream = useCallback(\n async (input: { mode: \"submit\"; message: ChatSubmitMessage } | { mode: \"attach\"; threadId: string; runId: string }) => {\n const startedAt = Date.now();\n const controller = new AbortController();\n requestSeqRef.current += 1;\n abortControllerRef.current = controller;\n setIsLoading(true);\n setStreamingText(\"\");\n setReasoningSteps([{ label: input.mode === \"attach\" ? \"Reconnecting\" : \"Connecting\", status: \"active\" }]);\n const streamThreadIdRef = { current: input.mode === \"attach\" ? input.threadId : activeThreadIdRef.current };\n const attachAssistantMessage = input.mode === \"attach\"\n ? [...messagesRef.current]\n .reverse()\n .find(\n (message) =>\n message.role === \"assistant\" &&\n (message.runId === input.runId || message.isFinal === false)\n )\n : undefined;\n let assistantMessageId = input.mode === \"attach\"\n ? attachAssistantMessage?.id || `${input.runId}-assistant`\n : createId();\n let baseMessages = messagesRef.current;\n if (input.mode === \"submit\") {\n const userMessage: ChatMessage = {\n id: createId(),\n role: \"user\",\n content: input.message.text,\n createdAt: new Date(),\n parts: input.message.text\n ? [{ id: createId(), type: \"text\", kind: \"text\", text: input.message.text }]\n : [],\n attachments: input.message.files,\n };\n baseMessages = [...messagesRef.current, userMessage];\n }\n if (!messagesRef.current.some((message) => message.id === assistantMessageId)) {\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n isFinal: false,\n parts: [],\n reasoningSteps: [],\n };\n const liveMessages: ChatMessage[] = [...baseMessages, assistantMessage];\n setMessages(liveMessages);\n messagesRef.current = liveMessages;\n } else if (input.mode === \"attach\" && attachAssistantMessage) {\n const nextMessages = messagesRef.current.map((message) =>\n message.id === attachAssistantMessage.id\n ? { ...message, runId: message.runId || input.runId, isFinal: false }\n : message\n );\n setMessages(nextMessages);\n messagesRef.current = nextMessages;\n baseMessages = nextMessages;\n if (streamThreadIdRef.current) persistThread(streamThreadIdRef.current, nextMessages);\n }\n streamingMessageIdRef.current = assistantMessageId;\n setStreamingMessageId(assistantMessageId);\n if (streamThreadIdRef.current) {\n persistThread(\n streamThreadIdRef.current,\n messagesRef.current.length > 0 ? messagesRef.current : baseMessages,\n undefined,\n { touch: input.mode === \"submit\" }\n );\n }\n try {\n let streamResult: ChatStreamResult | null = null;\n if (input.mode === \"attach\") {\n setActiveRunIdValue(input.runId);\n reattachedRunIdRef.current = input.runId;\n streamResult = await transport.attachRun({ runId: input.runId, signal: controller.signal }, (event) =>\n handleStreamEvent({ mode: \"attach\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n } else {\n streamResult = await transport.streamMessage(\n { ...input.message, files: input.message.files || [], threadId: activeThreadIdRef.current, signal: controller.signal },\n (event) => handleStreamEvent({ mode: \"submit\", event, assistantMessageId, startedAt, streamThreadIdRef, baseMessages })\n );\n }\n if (streamResult?.runId) setActiveRunIdValue(streamResult.runId);\n if (streamResult?.threadId) {\n streamThreadIdRef.current = streamResult.threadId;\n applyThreadId(streamResult.threadId, baseMessages);\n if (streamResult.runId) {\n markThreadRunStatus(streamResult.threadId, streamResult.runId, \"running\");\n }\n }\n if (streamingContentRef.current.trim() && streamingMessageIdRef.current) {\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: streamingContentRef.current,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: activeRunIdRef.current,\n });\n }\n await refresh().catch(() => undefined);\n } catch (error) {\n if (!isAbortError(error)) {\n finalizeAssistantMessage({\n threadId: streamThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: streamingContentRef.current,\n reasoning: reasoningRef.current,\n thinkingDurationMs: Date.now() - startedAt,\n messageId: assistantMessageId,\n runId: activeRunIdRef.current,\n error: onStreamErrorMessage?.(error) || (error as Error).message || \"Failed to reach the chat agent.\",\n });\n }\n } finally {\n const isCurrentStream =\n abortControllerRef.current === controller ||\n streamingMessageIdRef.current === assistantMessageId;\n if (abortControllerRef.current === controller) abortControllerRef.current = null;\n if (isCurrentStream) {\n setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n reattachedRunIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n setLastThinkingDurationMs(Date.now() - startedAt);\n }\n }\n },\n [createId, finalizeAssistantMessage, handleStreamEvent, onStreamErrorMessage, persistThread, refresh, setActiveRunIdValue, setReasoningSteps, transport]\n );\n\n const handleSubmit = useCallback(\n async (message: ChatSubmitMessage) => {\n if (!message.text.trim() && !(message.files || []).length) return;\n await runStream({ mode: \"submit\", message });\n },\n [runStream]\n );\n const attachRun = useCallback(async (runId: string, threadId?: string | null) => {\n const resolvedThreadId = threadId ?? activeThreadIdRef.current;\n if (runId && resolvedThreadId) await runStream({ mode: \"attach\", runId, threadId: resolvedThreadId });\n }, [runStream]);\n const { pendingHitl, isResolvingHitl, resumeHitl } = useControllerHitl({\n messages,\n transport,\n activeRunId,\n activeRunIdRef,\n activeThreadIdRef,\n runStream,\n });\n const handleStop = useCallback(() => {\n const runId = activeRunIdRef.current;\n const partial = streamingContentRef.current;\n const liveMessageId = streamingMessageIdRef.current;\n abortDetachedStream(abortControllerRef.current);\n abortControllerRef.current = null;\n setActiveRunIdValue(null);\n streamingMessageIdRef.current = null;\n setStreamingMessageId(null);\n setIsLoading(false);\n setStreamingText(\"\");\n setReasoningSteps([]);\n if (runId) transport.cancelRun({ runId, assistantOutputText: partial }).catch(() => undefined);\n if (partial.trim()) {\n finalizeAssistantMessage({\n threadId: activeThreadIdRef.current,\n baseMessages: messagesRef.current,\n assistantText: partial,\n reasoning: reasoningRef.current,\n thinkingDurationMs: lastThinkingDurationMs || 0,\n messageId: liveMessageId,\n });\n }\n }, [finalizeAssistantMessage, lastThinkingDurationMs, setActiveRunIdValue, setReasoningSteps, transport]);\n\n useEffect(() => {\n refresh().catch((error) => {\n if (!isAbortError(error) && !lifecycleAbortController.signal.aborted) {\n setThreads(storage.listThreads());\n }\n });\n }, [lifecycleAbortController, refresh, storage]);\n\n useEffect(() => {\n return () => {\n lifecycleAbortController.abort();\n abortDetachedStream(abortControllerRef.current);\n abortControllerRef.current = null;\n };\n }, [lifecycleAbortController]);\n\n useControllerThreadEvents({ transport, storage, refresh, setThreads });\n\n useEffect(() => {\n syncThreadsFromStorage();\n }, [storageKey, syncThreadsFromStorage]);\n\n useEffect(() => {\n const previous = activeThreadIdRef.current;\n activeThreadIdRef.current = activeThreadId;\n if (\n activeThreadId &&\n previous === activeThreadId &&\n (activeRunIdRef.current || streamingMessageIdRef.current)\n ) {\n return;\n }\n if (previous && previous !== activeThreadId && abortControllerRef.current) {\n detachActiveStream();\n }\n if (!activeThreadId) {\n if (\n previous === null &&\n loadedThreadIdRef.current === null &&\n messagesRef.current.length === 0 &&\n !hasOlderTurnsRef.current &&\n !isLoadingHistoryRef.current &&\n !isLoadingOlderRef.current &&\n nextBeforeTurnIndexRef.current === null\n ) {\n return;\n }\n requestSeqRef.current += 1;\n loadedThreadIdRef.current = null;\n setMessages([]);\n messagesRef.current = [];\n setHasOlderTurns(false);\n setIsLoadingOlder(false);\n setContextStatus(null);\n nextBeforeTurnIndexRef.current = null;\n setLoadingHistory(false);\n return;\n }\n const cached = storage.getThread(activeThreadId);\n const cachedMessages = cached?.isHydrated && cached.messages?.length ? cached.messages : null;\n const hasCachedMessages = Boolean(cachedMessages);\n const shouldRefreshStaleCache = hasCachedMessages && hasStaleUnfinishedAssistantCache(cached);\n if (cached && cachedMessages) {\n setMessages(cachedMessages);\n messagesRef.current = cachedMessages;\n setHasOlderTurns(Boolean(cached.hasOlderTurns));\n hasOlderTurnsRef.current = Boolean(cached.hasOlderTurns);\n nextBeforeTurnIndexRef.current = cached.nextBeforeTurnIndex ?? null;\n loadedThreadIdRef.current = activeThreadId;\n setLoadingHistory(false);\n if (!shouldRefreshStaleCache) return;\n }\n if (!hasCachedMessages) {\n setMessages([]);\n messagesRef.current = [];\n }\n void loadThread(activeThreadId).catch(() => setLoadingHistory(false));\n }, [activeThreadId, detachActiveStream, loadThread, setLoadingHistory, storage]);\n\n useEffect(() => {\n const threadId = activeThreadId;\n if (!threadId || isLoadingHistory || loadedThreadIdRef.current !== threadId || activeRunIdRef.current) return;\n const runId = autoAttachRunIdFromThread(storage.getThread(threadId));\n if (!runId || reattachedRunIdRef.current === runId) return;\n void runStream({ mode: \"attach\", threadId, runId });\n }, [activeThreadId, isLoadingHistory, runStream, storage, storageKey]);\n\n useEffect(() => {\n const threadId = activeThreadId;\n if (\n !threadId ||\n isLoadingHistoryRef.current ||\n activeRunIdRef.current ||\n streamingMessageIdRef.current\n ) {\n return;\n }\n const cached = storage.getThread(threadId);\n if (!hasStaleUnfinishedAssistantCache(cached)) return;\n void loadThread(threadId).catch(() => setLoadingHistory(false));\n }, [activeThreadId, loadThread, setLoadingHistory, storage, storageKey]);\n\n const {\n handleCopy,\n handleDislike,\n handleLike,\n handleRetry,\n startNewThread,\n upsertLiveVoiceMessage,\n } = useControllerMessageActions({\n activeThreadIdRef,\n createId,\n detachActiveStream,\n disliked,\n handleSubmit,\n hasOlderTurnsRef,\n liked,\n liveVoiceIdsRef,\n loadedThreadIdRef,\n messagesRef,\n nextBeforeTurnIndexRef,\n onActiveThreadIdChange,\n persistThread,\n requestSeqRef,\n setContextStatus,\n setCopiedMessageId,\n setDisliked,\n setHasOlderTurns,\n setIsLoadingOlder,\n setLiked,\n setLoadingHistory,\n setMessages,\n storage,\n });\n\n const loadThreadById = useCallback(\n async (threadId: string) => {\n if (!threadId) return;\n setIsSelectingThread(true);\n if (activeThreadIdRef.current !== threadId) {\n if (abortControllerRef.current) detachActiveStream();\n activeThreadIdRef.current = threadId;\n storage.setActiveThreadId?.(threadId);\n onActiveThreadIdChange?.(threadId);\n }\n try {\n await loadThread(threadId);\n } finally {\n if (activeThreadIdRef.current === threadId) setIsSelectingThread(false);\n }\n },\n [detachActiveStream, loadThread, onActiveThreadIdChange, storage]\n );\n\n const activeThread = activeThreadId\n ? storage.getThread(activeThreadId) || threads.find((thread) => thread.id === activeThreadId) || null\n : null;\n\n return useMemo(() => ({\n threads, activeThreadId, activeThread, messages, streamingContent, streamingMessageId,\n contextStatus, currentReasoning, isLoading, isLoadingHistory, isLoadingOlder,\n isRefreshingThreads, isSelectingThread, hasOlderTurns, liked, disliked, copiedMessageId,\n lastThinkingDurationMs, activeRunId, pendingHitl, isResolvingHitl, handleSubmit, attachRun, resumeHitl, handleStop, handleCopy, handleLike,\n handleDislike, handleRetry, handleSourceClick: (citations: ChatMessage[\"citations\"]) => onSourceClick?.(citations),\n upsertLiveVoiceMessage, startNewThread, loadThreadById, loadOlderTurns, refresh, textareaRef,\n }), [\n copiedMessageId, activeRunId, activeThread, activeThreadId, attachRun, contextStatus, currentReasoning,\n disliked, handleCopy, handleDislike, handleLike, handleRetry, handleStop, handleSubmit,\n hasOlderTurns, isLoading, isLoadingHistory, isLoadingOlder, isRefreshingThreads,\n isSelectingThread, lastThinkingDurationMs, liked, loadThreadById, loadOlderTurns, messages,\n isResolvingHitl, onSourceClick, pendingHitl, refresh, resumeHitl, streamingContent, streamingMessageId, startNewThread, threads, upsertLiveVoiceMessage,\n ]);\n}\n","import { useCallback, type Dispatch, type MutableRefObject, type SetStateAction } from \"react\";\nimport type {\n ChatCitation,\n ChatMessage,\n ChatReasoningStep,\n ChatStorageAdapter,\n ChatSubmitMessage,\n} from \"./types\";\n\ntype PagingRef = MutableRefObject<number | null>;\n\nexport function useControllerMessageActions(input: {\n activeThreadIdRef: MutableRefObject<string | null>;\n createId: () => string;\n detachActiveStream: () => void;\n disliked: Record<string, boolean>;\n handleSubmit: (message: ChatSubmitMessage) => Promise<void>;\n hasOlderTurnsRef: MutableRefObject<boolean>;\n liked: Record<string, boolean>;\n liveVoiceIdsRef: MutableRefObject<{ user?: string; assistant?: string }>;\n loadedThreadIdRef: MutableRefObject<string | null>;\n messagesRef: MutableRefObject<ChatMessage[]>;\n nextBeforeTurnIndexRef: PagingRef;\n onActiveThreadIdChange?: (threadId: string | null) => void;\n persistThread: (threadId: string, nextMessages: ChatMessage[]) => void;\n requestSeqRef: MutableRefObject<number>;\n setContextStatus: Dispatch<SetStateAction<any>>;\n setCopiedMessageId: Dispatch<SetStateAction<string | null>>;\n setDisliked: Dispatch<SetStateAction<Record<string, boolean>>>;\n setHasOlderTurns: Dispatch<SetStateAction<boolean>>;\n setIsLoadingOlder: Dispatch<SetStateAction<boolean>>;\n setLiked: Dispatch<SetStateAction<Record<string, boolean>>>;\n setLoadingHistory: (value: boolean) => void;\n setMessages: Dispatch<SetStateAction<ChatMessage[]>>;\n storage: ChatStorageAdapter;\n}) {\n const handleCopy = useCallback((content: string, messageId: string) => {\n navigator.clipboard?.writeText(content);\n input.setCopiedMessageId(messageId);\n setTimeout(() => input.setCopiedMessageId(null), 200);\n }, [input]);\n\n const handleLike = useCallback(async (msg: ChatMessage) => {\n const nextLiked = !input.liked[msg.id];\n input.setLiked((prev) => ({ ...prev, [msg.id]: nextLiked }));\n if (nextLiked) input.setDisliked((prev) => ({ ...prev, [msg.id]: false }));\n }, [input]);\n\n const handleDislike = useCallback(async (msg: ChatMessage) => {\n const nextDisliked = !input.disliked[msg.id];\n input.setDisliked((prev) => ({ ...prev, [msg.id]: nextDisliked }));\n if (nextDisliked) input.setLiked((prev) => ({ ...prev, [msg.id]: false }));\n }, [input]);\n\n const handleRetry = useCallback(async (msg: ChatMessage) => {\n const index = input.messagesRef.current.findIndex((message) => message.id === msg.id);\n if (index <= 0) return;\n const userMessage = input.messagesRef.current[index - 1];\n if (userMessage.role !== \"user\") return;\n const trimmed = input.messagesRef.current.slice(0, index);\n input.setMessages(trimmed);\n input.messagesRef.current = trimmed;\n if (input.activeThreadIdRef.current) input.persistThread(input.activeThreadIdRef.current, trimmed);\n await input.handleSubmit({ text: userMessage.content, files: userMessage.attachments || [] });\n }, [input]);\n\n const upsertLiveVoiceMessage = useCallback((payload: {\n role: \"user\" | \"assistant\";\n content: string;\n isFinal?: boolean;\n citations?: ChatCitation[];\n reasoningSteps?: ChatReasoningStep[];\n }) => {\n const content = payload.content?.trim() ?? \"\";\n if (!content && !payload.citations?.length && !payload.reasoningSteps?.length) return;\n input.setMessages((prev) => {\n const currentId = input.liveVoiceIdsRef.current[payload.role];\n const index = currentId ? prev.findIndex((message) => message.id === currentId) : -1;\n const nextMessage: ChatMessage = {\n id: currentId || input.createId(),\n role: payload.role,\n content,\n createdAt: new Date(),\n isFinal: Boolean(payload.isFinal),\n isVoice: payload.role === \"user\",\n parts: content ? [{ id: input.createId(), type: \"text\", kind: \"text\", text: content }] : [],\n citations: payload.citations,\n reasoningSteps: payload.reasoningSteps,\n };\n const next = index === -1 ? [...prev, nextMessage] : prev.map((message, itemIndex) => itemIndex === index ? { ...message, ...nextMessage } : message);\n input.liveVoiceIdsRef.current[payload.role] = payload.isFinal ? undefined : nextMessage.id;\n input.messagesRef.current = next;\n if (input.activeThreadIdRef.current) input.persistThread(input.activeThreadIdRef.current, next);\n return next;\n });\n }, [input]);\n\n const startNewThread = useCallback(() => {\n input.detachActiveStream();\n input.requestSeqRef.current += 1;\n input.activeThreadIdRef.current = null;\n input.loadedThreadIdRef.current = null;\n input.nextBeforeTurnIndexRef.current = null;\n input.hasOlderTurnsRef.current = false;\n input.storage.setActiveThreadId?.(null);\n input.onActiveThreadIdChange?.(null);\n input.setMessages([]);\n input.messagesRef.current = [];\n input.setHasOlderTurns(false);\n input.setIsLoadingOlder(false);\n input.setContextStatus(null);\n input.setLoadingHistory(false);\n }, [input]);\n\n return { handleCopy, handleDislike, handleLike, handleRetry, startNewThread, upsertLiveVoiceMessage };\n}\n","import { useCallback, useMemo, useState, type MutableRefObject } from \"react\";\nimport type {\n ChatHitlPart,\n ChatHitlResumeInput,\n ChatHitlResumeResult,\n ChatMessage,\n ChatTransport,\n} from \"./types\";\n\ntype RunStream = (input: {\n mode: \"attach\";\n threadId: string;\n runId: string;\n}) => Promise<void>;\n\nexport function useControllerHitl({\n messages,\n transport,\n activeRunId,\n activeRunIdRef,\n activeThreadIdRef,\n runStream,\n}: {\n messages: ChatMessage[];\n transport: ChatTransport;\n activeRunId: string | null;\n activeRunIdRef: MutableRefObject<string | null>;\n activeThreadIdRef: MutableRefObject<string | null>;\n runStream: RunStream;\n}) {\n const [isResolvingHitl, setIsResolvingHitl] = useState(false);\n const pendingHitl = useMemo<ChatHitlPart | null>(() => {\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const parts = messages[messageIndex]?.parts || [];\n for (let partIndex = parts.length - 1; partIndex >= 0; partIndex -= 1) {\n const part = parts[partIndex];\n if (part?.kind === \"hitl\" && part.status === \"pending\") return part;\n }\n }\n return null;\n }, [messages]);\n\n const resumeHitl = useCallback(async (\n input: Omit<ChatHitlResumeInput, \"runId\"> & { runId?: string },\n ): Promise<ChatHitlResumeResult> => {\n if (!transport.resumeHitl) throw new Error(\"HITL resume is not configured.\");\n const runId = input.runId || activeRunIdRef.current || activeRunId;\n if (!runId) throw new Error(\"No paused run is available to resume.\");\n setIsResolvingHitl(true);\n try {\n const result = await transport.resumeHitl({ ...input, runId });\n const threadId = result.thread_id || activeThreadIdRef.current;\n if (threadId) await runStream({ mode: \"attach\", runId: result.run_id || runId, threadId });\n return result;\n } finally {\n setIsResolvingHitl(false);\n }\n }, [activeRunId, activeRunIdRef, activeThreadIdRef, runStream, transport]);\n\n return { pendingHitl, isResolvingHitl, resumeHitl };\n}\n","import { useEffect, useRef } from \"react\";\nimport { applyThreadSummaryEvent, isAbortError } from \"./controller-helpers\";\nimport type { ChatStorageAdapter, ChatTransport, StoredChatThread } from \"./types\";\n\nexport function useControllerThreadEvents({\n transport,\n storage,\n refresh,\n setThreads,\n}: {\n transport: ChatTransport;\n storage: ChatStorageAdapter;\n refresh: () => Promise<void>;\n setThreads: (threads: StoredChatThread[]) => void;\n}) {\n const cursorRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!transport.subscribeThreadEvents) return;\n let cancelled = false;\n let retryTimeout: ReturnType<typeof setTimeout> | null = null;\n let controller: AbortController | null = null;\n\n const connect = () => {\n if (cancelled) return;\n controller = new AbortController();\n transport.subscribeThreadEvents?.(\n { cursor: cursorRef.current, signal: controller.signal },\n async (event) => {\n if (typeof event.cursor === \"number\") cursorRef.current = event.cursor;\n if (event.event === \"snapshot_required\") {\n await refresh().catch(() => undefined);\n return;\n }\n storage.setThreads(applyThreadSummaryEvent(storage.listThreads(), event));\n setThreads(storage.listThreads());\n }\n ).catch((error) => {\n if (cancelled || isAbortError(error)) return;\n retryTimeout = setTimeout(connect, 1500);\n });\n };\n\n connect();\n return () => {\n cancelled = true;\n if (retryTimeout) clearTimeout(retryTimeout);\n controller?.abort();\n };\n }, [refresh, setThreads, storage, transport]);\n}\n","export type ContextWindowSource =\n | \"exact\"\n | \"estimated\"\n | \"provider_count_api\"\n | \"provider_usage\"\n | \"runtime_tokenizer\"\n | \"hf_tokenizer\"\n | \"multimodal_estimate\"\n | \"text_estimate\"\n | \"tokenizer_estimate\"\n | \"heuristic_estimate\"\n | \"unknown\";\n\nexport type ContextWindowStage = \"preflight\" | \"sent_prompt\" | \"final_usage\";\nexport type ContextWindowConfidence = \"exact\" | \"high\" | \"medium\" | \"low\" | \"unknown\";\n\nexport type ContextCompressionStatus = {\n active: boolean;\n reason?: string | null;\n input_tokens?: number | null;\n max_tokens?: number | null;\n usage_ratio?: number | null;\n full_frame_count?: number | null;\n compact_frame_count?: number | null;\n dropped_frame_count?: number | null;\n artifact_ref_count?: number | null;\n compression_trigger_budget?: number | null;\n compression_target_budget?: number | null;\n compression_target_ratio?: number | null;\n threshold_used?: number | null;\n};\n\nexport type ContextWindow = {\n source: ContextWindowSource;\n run_id?: string | null;\n stage?: ContextWindowStage | null;\n confidence?: ContextWindowConfidence | null;\n counter?: string | null;\n model_id?: string | null;\n max_tokens?: number | null;\n max_tokens_source?: string | null;\n input_tokens?: number | null;\n remaining_tokens?: number | null;\n usage_ratio?: number | null;\n assembly?: Record<string, unknown> | null;\n context_compression?: ContextCompressionStatus | null;\n};\n\nconst SOURCE_PRIORITY: Record<ContextWindowSource, number> = {\n unknown: 0,\n heuristic_estimate: 1,\n tokenizer_estimate: 1,\n text_estimate: 1,\n estimated: 1,\n multimodal_estimate: 2,\n hf_tokenizer: 3,\n runtime_tokenizer: 3,\n provider_count_api: 4,\n provider_usage: 5,\n exact: 5,\n};\n\nconst STAGE_PRIORITY: Record<ContextWindowStage, number> = {\n preflight: 0,\n sent_prompt: 1,\n final_usage: 2,\n};\n\nfunction numberOrNull(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction stagePriority(window: ContextWindow | null | undefined): number {\n return STAGE_PRIORITY[window?.stage || \"sent_prompt\"] ?? STAGE_PRIORITY.sent_prompt;\n}\n\nfunction hasRenderableContextWindow(window: ContextWindow | null | undefined): boolean {\n const maxTokens = window?.max_tokens;\n return typeof maxTokens === \"number\" && Number.isFinite(maxTokens) && maxTokens > 0;\n}\n\nfunction windowWeight(window: ContextWindow | null | undefined): [number, number] {\n if (!window) return [0, 0];\n return [stagePriority(window), SOURCE_PRIORITY[window.source] || 0];\n}\n\nexport function normalizeContextCompression(value: unknown): ContextCompressionStatus | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n return {\n active: Boolean(payload.active),\n reason: typeof payload.reason === \"string\" ? payload.reason : null,\n input_tokens: numberOrNull(payload.input_tokens),\n max_tokens: numberOrNull(payload.max_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n full_frame_count: numberOrNull(payload.full_frame_count),\n compact_frame_count: numberOrNull(payload.compact_frame_count),\n dropped_frame_count: numberOrNull(payload.dropped_frame_count),\n artifact_ref_count: numberOrNull(payload.artifact_ref_count),\n compression_trigger_budget: numberOrNull(payload.compression_trigger_budget),\n compression_target_budget: numberOrNull(payload.compression_target_budget),\n compression_target_ratio: numberOrNull(payload.compression_target_ratio),\n threshold_used: numberOrNull(payload.threshold_used),\n };\n}\n\nexport function normalizeContextWindow(value: unknown): ContextWindow | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const payload = value as Record<string, unknown>;\n const rawSource = String(payload.source || \"\").trim();\n const source: ContextWindowSource =\n rawSource === \"exact\" ||\n rawSource === \"estimated\" ||\n rawSource === \"unknown\" ||\n rawSource === \"provider_count_api\" ||\n rawSource === \"provider_usage\" ||\n rawSource === \"runtime_tokenizer\" ||\n rawSource === \"hf_tokenizer\" ||\n rawSource === \"multimodal_estimate\" ||\n rawSource === \"text_estimate\" ||\n rawSource === \"tokenizer_estimate\" ||\n rawSource === \"heuristic_estimate\"\n ? rawSource\n : rawSource\n ? \"estimated\"\n : \"unknown\";\n const rawStage = String(payload.stage || \"\").trim();\n const stage: ContextWindowStage =\n rawStage === \"preflight\" || rawStage === \"sent_prompt\" || rawStage === \"final_usage\"\n ? rawStage\n : \"sent_prompt\";\n const rawConfidence = String(payload.confidence || \"\").trim();\n const confidence: ContextWindowConfidence | null =\n rawConfidence === \"exact\" ||\n rawConfidence === \"high\" ||\n rawConfidence === \"medium\" ||\n rawConfidence === \"low\" ||\n rawConfidence === \"unknown\"\n ? rawConfidence\n : null;\n\n return {\n source,\n run_id: typeof payload.run_id === \"string\" ? payload.run_id : null,\n stage,\n confidence,\n counter: typeof payload.counter === \"string\" ? payload.counter : null,\n model_id: typeof payload.model_id === \"string\" ? payload.model_id : null,\n max_tokens: numberOrNull(payload.max_tokens),\n max_tokens_source: typeof payload.max_tokens_source === \"string\" ? payload.max_tokens_source : null,\n input_tokens: numberOrNull(payload.input_tokens),\n remaining_tokens: numberOrNull(payload.remaining_tokens),\n usage_ratio: numberOrNull(payload.usage_ratio),\n assembly:\n payload.assembly && typeof payload.assembly === \"object\" && !Array.isArray(payload.assembly)\n ? (payload.assembly as Record<string, unknown>)\n : null,\n context_compression: normalizeContextCompression(payload.context_compression),\n };\n}\n\nexport function mergeContextWindow(\n current: ContextWindow | null | undefined,\n incoming: ContextWindow | null | undefined\n): ContextWindow | null {\n if (!incoming) return current ?? null;\n if (!current) return incoming;\n if (hasRenderableContextWindow(current) && !hasRenderableContextWindow(incoming)) return current;\n\n const currentRunId = current.run_id || null;\n const incomingRunId = incoming.run_id || null;\n if (incomingRunId && currentRunId && incomingRunId !== currentRunId) {\n return stagePriority(incoming) >= STAGE_PRIORITY.sent_prompt ? incoming : current;\n }\n\n const currentWeight = windowWeight(current);\n const incomingWeight = windowWeight(incoming);\n return incomingWeight[0] > currentWeight[0] ||\n (incomingWeight[0] === currentWeight[0] && incomingWeight[1] >= currentWeight[1])\n ? incoming\n : current;\n}\n\nexport function mergeContextWindowUpdate(\n current: ContextWindow | null | undefined,\n incoming: unknown\n): ContextWindow | null {\n return mergeContextWindow(current, normalizeContextWindow(incoming));\n}\n\nexport function compressionFromContextWindow(\n contextWindow: ContextWindow | null | undefined\n): ContextCompressionStatus | null {\n if (!contextWindow) return null;\n if (contextWindow.context_compression) return contextWindow.context_compression;\n const assembly = contextWindow.assembly;\n if (!assembly || typeof assembly !== \"object\" || Array.isArray(assembly)) return null;\n const artifactRefs = Array.isArray(assembly.artifact_refs) ? assembly.artifact_refs : [];\n const compactFrameCount = numberOrNull(assembly.compact_frame_count) ?? 0;\n const droppedFrameCount = numberOrNull(assembly.dropped_frame_count) ?? 0;\n const reason = typeof assembly.compaction_reason === \"string\" ? assembly.compaction_reason : \"none\";\n return {\n active: reason !== \"none\" || compactFrameCount > 0 || droppedFrameCount > 0,\n reason,\n input_tokens: contextWindow.input_tokens ?? null,\n max_tokens: contextWindow.max_tokens ?? null,\n usage_ratio: contextWindow.usage_ratio ?? null,\n full_frame_count: numberOrNull(assembly.full_frame_count),\n compact_frame_count: compactFrameCount,\n dropped_frame_count: droppedFrameCount,\n artifact_ref_count: artifactRefs.length,\n compression_trigger_budget: numberOrNull(assembly.compression_trigger_budget),\n compression_target_budget: numberOrNull(assembly.compression_target_budget),\n compression_target_ratio: numberOrNull(assembly.compression_target_ratio),\n threshold_used: numberOrNull(assembly.threshold_used),\n };\n}\n","import type {\n ChatPart,\n ChatContextWindow,\n ChatDataPart,\n ChatErrorPart,\n ChatMessage,\n ChatReasoningStep,\n ChatRuntimeEvent,\n ChatThreadDetail,\n ChatThreadSummary,\n ChatThreadTurn,\n ChatToolPart,\n ChatToolState,\n ChatHitlAction,\n ChatHitlKind,\n ChatHitlStatus,\n ToolPresentation,\n} from \"./types\";\nimport { normalizeContextWindow } from \"./context-window\";\n\nexport const DEFAULT_THREAD_PAGE_SIZE = 5;\n\nexport const isRunningThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\", \"cancelling\", \"paused\"]).has(String(status || \"\").toLowerCase());\n\nexport const isAutoAttachThreadStatus = (status?: string | null) =>\n new Set([\"queued\", \"running\", \"cancelling\"]).has(String(status || \"\").toLowerCase());\n\nexport const createChatId = () => {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) return crypto.randomUUID();\n return `chat-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n};\n\nexport const titleFromMessage = (text: string, files: Array<{ filename?: string }> = []) => {\n const base = text.trim() || files[0]?.filename || \"New chat\";\n return base.replace(/\\s+/g, \" \").slice(0, 48);\n};\n\nexport const threadActivityDate = (thread: ChatThreadSummary) =>\n String(thread.updated_at || thread.last_activity_at || thread.created_at || new Date().toISOString());\n\nexport const assistantTextFromResponseBlocks = (blocks?: Array<Record<string, unknown>>) =>\n (blocks || [])\n .filter((block) => block.kind === \"assistant_text\" && typeof block.text === \"string\")\n .map((block) => String(block.text))\n .join(\"\\n\\n\")\n .trim();\n\nexport const assistantTextFromParts = (parts?: ChatPart[]) =>\n (parts || [])\n .filter((part): part is Extract<ChatPart, { kind: \"text\" }> => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\\n\\n\")\n .trim();\n\nconst displayTextWithoutInlineAttachments = (text: string, hasAttachments: boolean) => {\n if (!hasAttachments) return text;\n const marker = \"Attached text file (\";\n const trimmed = text.trim();\n if (trimmed.startsWith(marker)) return \"\";\n const markerIndex = text.indexOf(`\\n\\n${marker}`);\n if (markerIndex === -1) return text;\n return text.slice(0, markerIndex).trim();\n};\n\nconst attachmentsFromTurn = (turn: ChatThreadTurn) =>\n (turn.attachments || []).map((attachment, index) => {\n const record = attachment || {};\n return {\n ...record,\n type: \"file\",\n url: String(record.url || \"\"),\n filename: String(record.filename || record.name || `attachment-${index + 1}`),\n mediaType: String(record.mime_type || record.mediaType || record.type || \"application/octet-stream\"),\n };\n });\n\nconst tokenUsageFromTurn = (turn: ChatThreadTurn): ChatMessage[\"tokenUsage\"] | undefined => {\n const usage = turn.run_usage;\n if (!usage || typeof usage !== \"object\") return undefined;\n return {\n inputTokens: usage.input_tokens ?? null,\n outputTokens: usage.output_tokens ?? null,\n totalTokens: usage.total_tokens ?? null,\n usageSource: usage.source ?? null,\n };\n};\n\nconst latestEventPayloadValue = (events: ChatRuntimeEvent[] | undefined, key: string) => {\n for (let index = (events || []).length - 1; index >= 0; index -= 1) {\n const payload = events?.[index]?.payload;\n if (payload && payload[key] !== undefined && payload[key] !== null) return payload[key];\n }\n return undefined;\n};\n\nconst responseBlocksFromTurn = (turn: ChatThreadTurn) => {\n if (Array.isArray(turn.response_blocks) && turn.response_blocks.length > 0) return turn.response_blocks;\n const fromEvents = latestEventPayloadValue(turn.run_events, \"response_blocks\");\n return Array.isArray(fromEvents) ? (fromEvents as Array<Record<string, unknown>>) : [];\n};\n\nconst assistantTextFromEvents = (events?: ChatRuntimeEvent[]) => {\n const assistantText = latestEventPayloadValue(events, \"assistant_output_text\");\n if (typeof assistantText === \"string\" && assistantText.trim()) return assistantText;\n return \"\";\n};\n\nconst asRecord = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n\nconst optionalString = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n\nconst HITL_ACTIONS_BY_KIND: Record<ChatHitlKind, ChatHitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n};\n\nconst HITL_STATUSES: ChatHitlStatus[] = [\"pending\", \"resolved\", \"expired\", \"cancelled\", \"invalidated\"];\n\nfunction exactHitlActions(kind: ChatHitlKind, value: unknown): ChatHitlAction[] {\n if (!Array.isArray(value)) throw new Error(\"Invalid V2 HITL response block.\");\n const actions = value.map((item) => String(item)) as ChatHitlAction[];\n const expected = HITL_ACTIONS_BY_KIND[kind];\n if (actions.length !== expected.length || actions.some((action, index) => action !== expected[index])) {\n throw new Error(\"Invalid V2 HITL response block.\");\n }\n return actions;\n}\n\nexport const toolStateFromStatus = (status?: unknown): ChatToolState => {\n const normalized = String(status || \"\").trim().toLowerCase();\n if ([\"failed\", \"error\"].includes(normalized)) return \"output-error\";\n if ([\"cancelled\", \"canceled\"].includes(normalized)) return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n if ([\"running\", \"active\", \"pending\", \"streaming\"].includes(normalized)) return \"input-available\";\n return \"input-available\";\n};\n\nconst toolNameFromRecord = (tool: Record<string, unknown>) =>\n String(tool.toolName || tool.tool_name || tool.name || tool.slug || tool.action || \"tool\").trim() || \"tool\";\n\nconst toolCallIdFromRecords = (\n block: Record<string, unknown>,\n tool: Record<string, unknown>\n) =>\n optionalString(tool.toolCallId) ||\n optionalString(tool.tool_call_id) ||\n optionalString(block.toolCallId) ||\n optionalString(block.tool_call_id) ||\n optionalString(block.id) ||\n null;\n\nconst presentationFromTool = (tool: Record<string, unknown>): ToolPresentation | null => {\n const presentation = asRecord(tool.presentation);\n const outputView = asRecord(tool.outputView) || asRecord(tool.output_view);\n const next: ToolPresentation = presentation ? { ...presentation } : {};\n ([\n \"title\",\n \"activity\",\n \"detail\",\n \"category\",\n \"groupKey\",\n \"groupLabel\",\n \"showOutput\",\n \"outputView\",\n ] as const).forEach((key) => {\n if (tool[key] !== undefined) {\n (next as Record<string, unknown>)[key] = tool[key];\n }\n });\n if (tool.group_key !== undefined) next.group_key = tool.group_key;\n if (tool.group_label !== undefined) next.group_label = tool.group_label;\n if (tool.show_output !== undefined) next.show_output = tool.show_output;\n if (outputView && next.outputView === undefined) next.outputView = outputView;\n return Object.keys(next).length > 0 ? next : null;\n};\n\nconst createToolPart = (block: Record<string, unknown>, index: number): ChatToolPart => {\n const tool = asRecord(block.tool) || {};\n const toolName = toolNameFromRecord(tool);\n const errorText =\n optionalString(tool.errorText) ||\n optionalString(tool.error) ||\n optionalString(block.error) ||\n null;\n return {\n id: String(block.id || `${block.kind || \"tool\"}-${index}`),\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolCallId: toolCallIdFromRecords(block, tool),\n state: toolStateFromStatus(block.status),\n input: tool.input ?? block.input,\n output: tool.output ?? block.output,\n errorText,\n presentation: presentationFromTool(tool),\n raw: block,\n };\n};\n\nconst createDataPart = (\n block: Record<string, unknown>,\n index: number,\n name = String(block.kind || \"data\")\n): ChatDataPart => ({\n id: String(block.id || `${name}-${index}`),\n type: \"data\",\n kind: \"data\",\n name,\n data: block,\n raw: block,\n});\n\nexport const partsFromResponseBlocks = (\n blocks?: Array<Record<string, unknown>>,\n fallbackText?: string\n): ChatPart[] => {\n const parts: ChatPart[] = [];\n (blocks || []).forEach((block, index) => {\n const id = String(block.id || `${block.kind || \"block\"}-${index}`);\n if (block.kind === \"assistant_text\" && typeof block.text === \"string\") {\n parts.push({ id, type: \"text\", kind: \"text\", text: String(block.text), raw: block });\n return;\n }\n if (block.kind === \"tool_call\") {\n parts.push(createToolPart(block, index));\n return;\n }\n if (block.kind === \"ui_blocks\") {\n parts.push({\n id,\n type: \"ui-blocks\",\n kind: \"ui-blocks\",\n state: toolStateFromStatus(block.status),\n toolCallId: optionalString(block.toolCallId) || optionalString(block.tool_call_id) || null,\n contractVersion: optionalString(block.contractVersion) || optionalString(block.contract_version) || null,\n bundle: asRecord(block.bundle),\n errorText: optionalString(block.error) || null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"reasoning_note\") {\n parts.push({\n id,\n type: \"reasoning\",\n kind: \"reasoning\",\n label: optionalString(block.label) || null,\n text: optionalString(block.text) || optionalString(block.summary) || null,\n status: optionalString(block.status) || null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"hitl_request\") {\n const hitl = asRecord(block.hitl) || block;\n if (hitl.schema_version !== \"agents24.hitl.interrupt.v2\") {\n throw new Error(\"Invalid V2 HITL response block.\");\n }\n const interruptId = optionalString(block.interruptId) || optionalString(hitl.interrupt_id);\n const hitlKind = optionalString(block.hitlKind) || optionalString(hitl.kind);\n const status = optionalString(block.status) || optionalString(hitl.status) || \"pending\";\n if (!interruptId || ![\"tool_review\", \"mcp_auth\", \"user_approval\", \"app_data_permission\"].includes(String(hitlKind)) || !HITL_STATUSES.includes(status as ChatHitlStatus)) {\n throw new Error(\"Invalid V2 HITL response block.\");\n }\n const kind = hitlKind as ChatHitlKind;\n const allowedActions = exactHitlActions(kind, hitl.allowed_actions);\n const resolution = asRecord(block.resolution);\n const resolver = asRecord(resolution?.resolver);\n parts.push({\n id,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId,\n hitlKind: kind,\n message: optionalString(hitl.message) || optionalString(block.text) || \"Input is required to continue.\",\n allowedActions,\n status: status as ChatHitlStatus,\n presentation: asRecord(hitl.presentation) || {},\n resolution: resolution ? {\n action: [\"approve\", \"reject\", \"connect\", \"skip\"].includes(String(resolution.action))\n ? String(resolution.action) as ChatHitlAction\n : null,\n outcome: optionalString(resolution.outcome),\n reason: optionalString(resolution.reason),\n resolvedAt: optionalString(resolution.resolved_at),\n resolver: resolver ? {\n principalType: optionalString(resolver.principal_type) || optionalString(resolver.principalType) || null,\n principalId: optionalString(resolver.principal_id) || optionalString(resolver.principalId) || null,\n } : null,\n } : null,\n raw: block,\n });\n return;\n }\n if (block.kind === \"error\") {\n parts.push({\n id,\n type: \"error\",\n kind: \"error\",\n errorText: optionalString(block.error) || optionalString(block.message) || \"Error\",\n raw: block,\n } satisfies ChatErrorPart);\n return;\n }\n parts.push(createDataPart(block, index));\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText?.trim()) {\n parts.push({ id: \"assistant-fallback-text\", type: \"text\", kind: \"text\", text: fallbackText });\n }\n return parts;\n};\n\nexport const mergeReasoningSteps = (\n steps?: ChatReasoningStep[],\n options?: { finalize?: boolean }\n) => {\n if (!steps?.length) return [];\n const merged: ChatReasoningStep[] = [];\n const indexMap = new Map<string, number>();\n steps.forEach((step) => {\n const key = String(step.label);\n const status = options?.finalize ? \"complete\" : step.status || \"complete\";\n if (indexMap.has(key)) {\n const index = indexMap.get(key)!;\n merged[index] = { ...merged[index], ...step, status };\n } else {\n indexMap.set(key, merged.push({ ...step, status }) - 1);\n }\n });\n return merged;\n};\n\nexport const reasoningStepsFromParts = (parts?: ChatPart[]): ChatReasoningStep[] =>\n (parts || [])\n .map((block) => {\n if (block.kind === \"tool\") {\n const label =\n optionalString(block.presentation?.activity) ||\n optionalString(block.presentation?.title) ||\n block.toolName;\n return {\n label,\n status: block.state === \"input-available\" || block.state === \"input-streaming\" ? \"active\" : \"complete\",\n description: optionalString(block.presentation?.detail) || \"\",\n } satisfies ChatReasoningStep;\n }\n if (block.kind === \"reasoning\") {\n return {\n label: block.label || \"Reasoning\",\n status: block.status === \"running\" ? \"active\" : \"complete\",\n description: block.text || \"\",\n } satisfies ChatReasoningStep;\n }\n return null;\n })\n .filter(Boolean) as ChatReasoningStep[];\n\nconst turnToMessages = (turn: ChatThreadTurn, activeRunId?: string | null): ChatMessage[] => {\n const messages: ChatMessage[] = [];\n const createdAt = turn.created_at ? new Date(turn.created_at) : new Date();\n const baseId = turn.id || turn.run_id || createChatId();\n const responseBlocks = responseBlocksFromTurn(turn);\n const isRunning = isRunningThreadStatus(turn.status) || Boolean(turn.run_id && activeRunId === turn.run_id);\n const attachments = attachmentsFromTurn(turn);\n const userContent = displayTextWithoutInlineAttachments(turn.user_input_text || \"\", attachments.length > 0);\n if (userContent || attachments.length > 0) {\n messages.push({\n id: `${baseId}-user`,\n role: \"user\",\n content: userContent,\n createdAt,\n parts: userContent ? [{ id: `${baseId}-user-text`, type: \"text\", kind: \"text\", text: userContent }] : [],\n attachments,\n });\n }\n const assistantText =\n turn.assistant_output_text ||\n assistantTextFromResponseBlocks(responseBlocks) ||\n assistantTextFromEvents(turn.run_events);\n if (assistantText || responseBlocks.length > 0 || isRunning) {\n const parts = partsFromResponseBlocks(responseBlocks, assistantText);\n messages.push({\n id: `${baseId}-assistant`,\n role: \"assistant\",\n runId: turn.run_id || null,\n content: assistantText || assistantTextFromParts(parts),\n createdAt: turn.completed_at ? new Date(turn.completed_at) : createdAt,\n parts,\n reasoningSteps: mergeReasoningSteps(reasoningStepsFromParts(parts), { finalize: !isRunning }),\n isFinal: !isRunning,\n tokenUsage: tokenUsageFromTurn(turn),\n });\n }\n return messages;\n};\n\nexport const threadDetailToMessages = (thread: ChatThreadDetail) => {\n const activeRun = activeRunIdFromThreadDetail(thread);\n return (thread.turns || []).flatMap((turn) => turnToMessages(turn, activeRun));\n};\n\nexport const threadPaging = (thread: ChatThreadDetail) => {\n const nextBeforeTurnIndex = thread.paging?.next_before_turn_index ?? null;\n return {\n hasOlderTurns: Boolean(thread.paging?.has_more || nextBeforeTurnIndex !== null),\n nextBeforeTurnIndex,\n };\n};\n\nexport const latestContextWindowFromThread = (thread: ChatThreadDetail): ChatContextWindow | null => {\n const threadContextWindow = normalizeContextWindow(thread.context_window);\n if (threadContextWindow) return threadContextWindow;\n for (let index = (thread.turns || []).length - 1; index >= 0; index -= 1) {\n const contextWindow = normalizeContextWindow(thread.turns?.[index]?.context_window);\n if (contextWindow) return contextWindow;\n }\n return null;\n};\n\nexport const activeRunIdFromThread = (thread?: Partial<ChatThreadSummary> | null) => {\n const hasCamelActiveRun = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"activeRun\")\n );\n const hasCamelLastRunStatus = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunStatus\")\n );\n const hasCamelLastRunId = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunId\")\n );\n const activeRun = hasCamelActiveRun ? thread?.activeRun || null : thread?.active_run || null;\n const lastRunStatus = hasCamelLastRunStatus\n ? thread?.lastRunStatus || null\n : thread?.last_run_status || thread?.lastRunStatus || null;\n const activeRunId = activeRun?.run_id ? String(activeRun.run_id) : \"\";\n if (activeRunId && isRunningThreadStatus(activeRun?.status || lastRunStatus)) return activeRunId;\n const lastRunId = hasCamelLastRunId\n ? thread?.lastRunId\n : thread?.last_run_id || thread?.lastRunId;\n return lastRunId && isRunningThreadStatus(lastRunStatus) ? String(lastRunId) : null;\n};\n\nexport const autoAttachRunIdFromThread = (thread?: Partial<ChatThreadSummary> | null) => {\n const hasCamelActiveRun = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"activeRun\")\n );\n const hasCamelLastRunStatus = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunStatus\")\n );\n const hasCamelLastRunId = Boolean(\n thread && Object.prototype.hasOwnProperty.call(thread, \"lastRunId\")\n );\n const activeRun = hasCamelActiveRun ? thread?.activeRun || null : thread?.active_run || null;\n const lastRunStatus = hasCamelLastRunStatus\n ? thread?.lastRunStatus || null\n : thread?.last_run_status || thread?.lastRunStatus || null;\n const activeRunId = activeRun?.run_id ? String(activeRun.run_id) : \"\";\n if (activeRunId && isAutoAttachThreadStatus(activeRun?.status || lastRunStatus)) return activeRunId;\n const lastRunId = hasCamelLastRunId\n ? thread?.lastRunId\n : thread?.last_run_id || thread?.lastRunId;\n return lastRunId && isAutoAttachThreadStatus(lastRunStatus) ? String(lastRunId) : null;\n};\n\nexport const hasUnfinishedAssistantMessage = (messages?: ChatMessage[]) =>\n Boolean(messages?.some((message) => message.role === \"assistant\" && message.isFinal === false));\n\nexport const hasStaleUnfinishedAssistantCache = (\n thread?: (Partial<ChatThreadSummary> & { messages?: ChatMessage[] }) | null\n) => hasUnfinishedAssistantMessage(thread?.messages) && !activeRunIdFromThread(thread);\n\nexport const activeRunIdFromThreadDetail = (thread?: ChatThreadDetail | null) => {\n const summaryRunId = activeRunIdFromThread(thread);\n if (summaryRunId) return summaryRunId;\n const runningTurn = [...(thread?.turns || [])].reverse().find((turn) => turn.run_id && isRunningThreadStatus(turn.status));\n return runningTurn?.run_id ? String(runningTurn.run_id) : null;\n};\n","import type { ChatMessage, ChatReasoningStep, ChatPart, ChatThreadSummaryEvent, StoredChatThread } from \"./types\";\nimport { autoAttachRunIdFromThread } from \"./model\";\n\nexport type ChatRuntimeEventContext = {\n mode: \"submit\" | \"attach\";\n assistantMessageId: string;\n threadId: string | null;\n runId: string | null;\n startedAt: number;\n};\n\nexport type FinalizeInput = {\n threadId: string | null;\n baseMessages: ChatMessage[];\n assistantText: string;\n reasoning: ChatReasoningStep[];\n thinkingDurationMs: number;\n messageId?: string | null;\n runId?: string | null;\n parts?: ChatPart[];\n error?: string;\n};\n\nexport const threadSummaryToStored = (thread: Record<string, unknown>): StoredChatThread => ({\n ...(thread as StoredChatThread),\n id: String(thread.id),\n title: String(thread.title || \"New chat\"),\n updated_at: String(thread.updated_at || thread.last_activity_at || thread.created_at || new Date().toISOString()),\n messages: [],\n isHydrated: false,\n});\n\nexport const isThreadNotFoundError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\" || !(\"status\" in error)) return false;\n return Number((error as { status?: unknown }).status) === 404;\n};\n\nexport const isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\") return false;\n const maybe = error as { name?: unknown; message?: unknown };\n return maybe.name === \"AbortError\" || String(maybe.message || \"\").toLowerCase().includes(\"aborted\");\n};\n\nexport const abortDetachedStream = (controller: AbortController | null) => {\n if (!controller || controller.signal.aborted) return;\n try {\n const reason =\n typeof DOMException !== \"undefined\"\n ? new DOMException(\"Chat stream detached.\", \"AbortError\")\n : new Error(\"Chat stream detached.\");\n controller.abort(reason);\n } catch {\n // Detaching a stream is expected and must not surface as a UI error.\n }\n};\n\nconst hasRunState = (thread: StoredChatThread) =>\n Boolean(\n thread.active_run ||\n thread.activeRun ||\n thread.last_run_id ||\n thread.lastRunId ||\n thread.last_run_status ||\n thread.lastRunStatus ||\n thread.isRunning\n );\n\nexport const mergeStoredThreadsForRefresh = (\n currentThreads: StoredChatThread[],\n serverThreads: StoredChatThread[]\n): StoredChatThread[] => {\n const currentById = new Map(currentThreads.map((thread) => [thread.id, thread]));\n const serverIds = new Set(serverThreads.map((thread) => thread.id));\n const mergedServerThreads = serverThreads.map((serverThread) => {\n const current = currentById.get(serverThread.id);\n if (!current) return serverThread;\n const incomingHasRunState = hasRunState(serverThread);\n return {\n ...current,\n ...serverThread,\n messages: current.messages || [],\n isHydrated: current.isHydrated,\n hasOlderTurns: current.hasOlderTurns,\n nextBeforeTurnIndex: current.nextBeforeTurnIndex,\n active_run: incomingHasRunState ? serverThread.active_run : current.active_run,\n activeRun: incomingHasRunState ? serverThread.activeRun : current.activeRun,\n last_run_id: incomingHasRunState ? serverThread.last_run_id : current.last_run_id,\n lastRunId: incomingHasRunState ? serverThread.lastRunId : current.lastRunId,\n last_run_status: incomingHasRunState ? serverThread.last_run_status : current.last_run_status,\n lastRunStatus: incomingHasRunState ? serverThread.lastRunStatus : current.lastRunStatus,\n lastEventSeq: incomingHasRunState ? serverThread.lastEventSeq : current.lastEventSeq,\n isRunning: incomingHasRunState ? serverThread.isRunning : current.isRunning,\n };\n });\n const localOnlyThreads = currentThreads.filter((thread) => {\n if (serverIds.has(thread.id)) return false;\n return Boolean(thread.isHydrated || thread.messages?.length || thread.isRunning || thread.activeRun || thread.active_run);\n });\n return [...mergedServerThreads, ...localOnlyThreads];\n};\n\nexport const hasRunningStoredThreads = (threads: StoredChatThread[]): boolean =>\n threads.some((thread) => autoAttachRunIdFromThread(thread) !== null);\n\nconst stableStringify = (value: unknown): string => JSON.stringify(value ?? null);\n\nexport const sameStoredThread = (left: StoredChatThread | undefined, right: StoredChatThread | undefined): boolean => {\n if (left === right) return true;\n if (!left || !right) return false;\n return stableStringify(left) === stableStringify(right);\n};\n\nexport const applyThreadSummaryEvent = (\n currentThreads: StoredChatThread[],\n event: ChatThreadSummaryEvent\n): StoredChatThread[] => {\n if (event.event === \"snapshot_required\") return currentThreads;\n if (event.event === \"thread.deleted\") {\n const next = currentThreads.filter((thread) => thread.id !== event.thread_id);\n return next.length === currentThreads.length ? currentThreads : next;\n }\n const incoming = threadSummaryToStored(event.thread as Record<string, unknown>);\n const index = currentThreads.findIndex((thread) => thread.id === incoming.id);\n const sortByActivity = (threads: StoredChatThread[]) =>\n [...threads].sort((a, b) => {\n const left = Date.parse(String(a.updated_at || a.last_activity_at || a.created_at || \"\"));\n const right = Date.parse(String(b.updated_at || b.last_activity_at || b.created_at || \"\"));\n return (Number.isFinite(right) ? right : 0) - (Number.isFinite(left) ? left : 0);\n });\n if (index === -1) return sortByActivity([...currentThreads, incoming]);\n const [merged] = mergeStoredThreadsForRefresh([currentThreads[index]], [incoming]);\n if (sameStoredThread(currentThreads[index], merged)) return currentThreads;\n const next = [...currentThreads];\n next[index] = merged;\n return sortByActivity(next);\n};\n","export type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n update: (message: TMessage) => TMessage;\n};\n\nexport function findStableAssistantMessageIndex<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: Pick<StableAssistantUpsertInput<TMessage>, \"messageId\" | \"runId\">\n) {\n return messages.findIndex(\n (message) =>\n message.role === \"assistant\" &&\n ((input.messageId && message.id === input.messageId) ||\n Boolean(input.runId && message.runId === input.runId))\n );\n}\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage\n) {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) {\n next.push(userMessage);\n }\n if (\n !next.some(\n (message) =>\n message.id === assistantMessage.id ||\n Boolean(\n assistantMessage.runId &&\n message.role === \"assistant\" &&\n message.runId === assistantMessage.runId\n )\n )\n ) {\n next.push(assistantMessage);\n }\n return next;\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>\n) {\n const next = [...messages];\n\n for (const baseMessage of input.baseMessages || []) {\n const matchesTarget =\n baseMessage.role === \"assistant\" &&\n ((input.messageId && baseMessage.id === input.messageId) ||\n Boolean(input.runId && baseMessage.runId === input.runId));\n if (!matchesTarget && !next.some((message) => message.id === baseMessage.id)) {\n next.push(baseMessage);\n }\n }\n\n const index = findStableAssistantMessageIndex(next, input);\n if (index === -1) {\n next.push(input.create());\n return next;\n }\n\n next[index] = input.update(next[index]);\n return next;\n}\n","import type { ChatMcpOauthCompletion, WaitForMcpOauthCompleteInput } from \"./types\";\n\nconst CONNECTION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nfunction normalizedOrigin(value: string): string {\n try {\n return new URL(value).origin;\n } catch {\n throw new Error(\"MCP authorization returned an invalid callback origin.\");\n }\n}\n\nexport function waitForMcpOauthComplete({\n popup,\n callbackOrigin,\n serverId,\n timeoutMs = 120_000,\n}: WaitForMcpOauthCompleteInput): Promise<ChatMcpOauthCompletion> {\n if (!popup) return Promise.reject(new Error(\"Could not open the MCP authorization popup.\"));\n const expectedOrigin = normalizedOrigin(callbackOrigin);\n const expectedServerId = String(serverId || \"\").trim();\n if (!expectedServerId) return Promise.reject(new Error(\"MCP authorization is missing its server identity.\"));\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const finish = (result: ChatMcpOauthCompletion | Error) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timeout);\n window.clearInterval(closeTimer);\n window.removeEventListener(\"message\", onMessage);\n if (result instanceof Error) reject(result);\n else resolve(result);\n };\n const onMessage = (event: MessageEvent) => {\n if (event.source !== popup || event.origin !== expectedOrigin) return;\n const data = event.data as {\n type?: string;\n success?: boolean;\n server_id?: string;\n connection_id?: string;\n } | null;\n if (data?.type !== \"mcp-oauth-complete\" || data.server_id !== expectedServerId) return;\n if (!data.success) {\n finish(new Error(\"MCP authorization failed.\"));\n return;\n }\n const connectionId = String(data.connection_id || \"\").trim();\n if (!CONNECTION_ID_PATTERN.test(connectionId)) return;\n finish({ connectionId });\n };\n const timeout = window.setTimeout(\n () => finish(new Error(\"MCP authorization timed out.\")),\n Math.max(1, timeoutMs),\n );\n const closeTimer = window.setInterval(() => {\n if (popup.closed) finish(new Error(\"MCP authorization window was closed before connecting.\"));\n }, 500);\n window.addEventListener(\"message\", onMessage);\n });\n}\n","import type {\n Agents24ChatRenderOptions,\n ChatMessage,\n ChatPart,\n ChatToolPart,\n} from \"./types\";\n\nexport const DefaultToolPart = ({ part }: { part: ChatToolPart }) => {\n const label =\n typeof part.presentation?.activity === \"string\"\n ? part.presentation.activity\n : typeof part.presentation?.title === \"string\"\n ? part.presentation.title\n : part.toolName;\n const detail =\n typeof part.presentation?.detail === \"string\"\n ? part.presentation.detail\n : part.errorText || part.state;\n\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <div>{label}</div>\n {detail ? <div>{detail}</div> : null}\n </div>\n );\n};\n\nexport const DefaultChatPart = ({\n part,\n message,\n renderOptions,\n}: {\n part: ChatPart;\n message: ChatMessage;\n renderOptions?: Agents24ChatRenderOptions;\n}) => {\n if (renderOptions?.renderPart) {\n return <>{renderOptions.renderPart(part, message)}</>;\n }\n\n if (part.kind === \"text\") return <>{part.text}</>;\n\n if (part.kind === \"tool\") {\n const ToolRenderer =\n renderOptions?.toolRenderers?.[part.type] ||\n renderOptions?.fallbackToolRenderer ||\n DefaultToolPart;\n return <>{ToolRenderer({ part, message })}</>;\n }\n\n if (part.kind === \"reasoning\") {\n return <div data-agents24-reasoning-part>{part.text || part.label}</div>;\n }\n\n if (part.kind === \"ui-blocks\") {\n return <div data-agents24-ui-blocks-part data-state={part.state} />;\n }\n\n if (part.kind === \"hitl\") {\n return <div data-agents24-hitl-part={part.interruptId || \"\"} />;\n }\n\n if (part.kind === \"error\") {\n return <div data-agents24-error-part>{part.errorText}</div>;\n }\n\n if (part.kind === \"data\") {\n return <div data-agents24-data-part={part.name} />;\n }\n\n return null;\n};\n\nexport const renderChatPart = (\n part: ChatPart,\n message: ChatMessage,\n renderOptions?: Agents24ChatRenderOptions\n) => (\n <DefaultChatPart\n key={part.id}\n part={part}\n message={message}\n renderOptions={renderOptions}\n />\n);\n","import type { ChatRuntimeEvent, ChatStreamResult } from \"./types\";\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error || typeof error !== \"object\") return false;\n const maybe = error as { name?: unknown; message?: unknown };\n return maybe.name === \"AbortError\" || String(maybe.message || \"\").toLowerCase().includes(\"aborted\");\n};\n\nexport const parseSseBlock = (block: string): ChatRuntimeEvent | null => {\n const data = block\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.replace(/^data:\\s?/, \"\"))\n .join(\"\\n\")\n .trim();\n if (!data) return null;\n return JSON.parse(data) as ChatRuntimeEvent;\n};\n\nexport const consumeSseResponse = async (\n response: Response,\n onEvent: (event: ChatRuntimeEvent) => void | Promise<void>,\n options: { signal?: AbortSignal } = {}\n): Promise<ChatStreamResult> => {\n if (!response.ok) {\n let message = response.statusText || \"Failed to open chat stream.\";\n try {\n const errorData = await response.json();\n message = String(errorData.detail || errorData.message || message);\n } catch {\n // Keep the status text.\n }\n throw new Error(message);\n }\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"The chat stream did not return a readable body.\");\n const decoder = new TextDecoder();\n let buffer = \"\";\n let threadId: string | null = response.headers.get(\"X-Thread-ID\") || null;\n let runId: string | null = response.headers.get(\"X-Run-ID\") || null;\n let closed = false;\n const closeReader = () => {\n closed = true;\n queueMicrotask(() => {\n void reader.cancel().catch(() => {\n // Reader cancellation is a normal stream shutdown path.\n });\n });\n };\n if (options.signal?.aborted) {\n closeReader();\n return { threadId, runId };\n }\n options.signal?.addEventListener(\"abort\", closeReader, { once: true });\n try {\n while (!closed) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n const event = parseSseBlock(block);\n if (!event) continue;\n if (event.run_id) runId = event.run_id;\n const payloadThreadId = event.payload?.thread_id;\n if (payloadThreadId) threadId = String(payloadThreadId);\n await onEvent(event);\n }\n }\n } catch (error) {\n if (!isAbortError(error)) throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", closeReader);\n }\n return { threadId, runId };\n};\n","import { consumeSseResponse } from \"./sse\";\nimport type { ChatSubmitInput, ChatThreadSummaryEvent, ChatTransport } from \"./types\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FetchChatTransportRoutes = {\n listThreads: () => string;\n getThread: (input: {\n threadId: string;\n limit?: number;\n beforeTurnIndex?: number | null;\n includeRunEvents?: boolean;\n }) => string;\n streamMessage: () => string;\n attachRun: (input: { runId: string }) => string;\n cancelRun: (input: { runId: string }) => string;\n deleteThread?: (input: { threadId: string }) => string;\n threadEvents?: (input: { cursor?: number | null }) => string;\n resumeRun?: (input: { runId: string }) => string;\n startMcpAuth?: (input: { runId: string; serverId: string }) => string;\n};\n\nexport type FetchChatTransportOptions = {\n routes: FetchChatTransportRoutes;\n fetchImpl?: typeof fetch;\n headers?: () => MaybePromise<HeadersInit>;\n streamBody?: (input: ChatSubmitInput) => unknown;\n};\n\nconst jsonHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n});\n\nconst streamHeaders = (headers?: HeadersInit) => ({\n ...(headers || {}),\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n});\n\nexport class ChatTransportError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"ChatTransportError\";\n this.status = status;\n }\n}\n\nconst transportError = (response: Response, fallback: string) =>\n new ChatTransportError(response.statusText || fallback, response.status);\n\nexport const createFetchChatTransport = ({\n routes,\n fetchImpl = fetch,\n headers,\n streamBody,\n}: FetchChatTransportOptions): ChatTransport => {\n const loadHeaders = async () => headers?.() ?? {};\n return {\n async listThreads(input) {\n const response = await fetchImpl(routes.listThreads(), {\n signal: input?.signal,\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to list chat threads.\");\n return response.json();\n },\n async getThread(input) {\n const response = await fetchImpl(routes.getThread(input), {\n signal: input.signal,\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to load chat thread.\");\n return response.json();\n },\n async streamMessage(input, onEvent) {\n const response = await fetchImpl(routes.streamMessage(), {\n method: \"POST\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n body: JSON.stringify(\n streamBody?.(input) ?? {\n input: input.text,\n thread_id: input.threadId || undefined,\n files: input.files || [],\n }\n ),\n });\n return consumeSseResponse(response, onEvent, { signal: input.signal });\n },\n async attachRun(input, onEvent) {\n const response = await fetchImpl(routes.attachRun(input), {\n method: \"POST\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n body: JSON.stringify({}),\n });\n return consumeSseResponse(response, onEvent, { signal: input.signal });\n },\n async cancelRun(input) {\n const response = await fetchImpl(routes.cancelRun(input), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({ assistant_output_text: input.assistantOutputText || undefined }),\n });\n if (!response.ok) throw transportError(response, \"Failed to cancel chat run.\");\n return response.json();\n },\n async deleteThread(input) {\n if (!routes.deleteThread) return { deleted: false };\n const response = await fetchImpl(routes.deleteThread(input), {\n method: \"DELETE\",\n headers: jsonHeaders(await loadHeaders()),\n });\n if (!response.ok) throw transportError(response, \"Failed to delete chat thread.\");\n return response.json();\n },\n async subscribeThreadEvents(input, onEvent) {\n if (!routes.threadEvents) return;\n const response = await fetchImpl(routes.threadEvents({ cursor: input.cursor }), {\n method: \"GET\",\n signal: input.signal,\n headers: streamHeaders(await loadHeaders()),\n });\n await consumeSseResponse(\n response,\n (event) => onEvent(event as unknown as ChatThreadSummaryEvent),\n { signal: input.signal },\n );\n },\n async resumeHitl(input) {\n if (!routes.resumeRun) throw new ChatTransportError(\"HITL resume is not configured.\", 501);\n const response = await fetchImpl(routes.resumeRun({ runId: input.runId }), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({\n schema_version: \"agents24.hitl.resume.v2\",\n interrupt_id: input.interruptId,\n action: input.action,\n comment: input.comment,\n client: input.client,\n }),\n });\n if (!response.ok) throw transportError(response, \"Failed to resume chat run.\");\n return response.json();\n },\n async startMcpAuth(input) {\n if (!routes.startMcpAuth) throw new ChatTransportError(\"MCP auth is not configured.\", 501);\n const response = await fetchImpl(routes.startMcpAuth({ runId: input.runId, serverId: input.serverId }), {\n method: \"POST\",\n headers: jsonHeaders(await loadHeaders()),\n body: JSON.stringify({\n interrupt_id: input.interruptId || undefined,\n principal_type: input.principalType || undefined,\n principal_id: input.principalId || undefined,\n client: input.client,\n }),\n });\n if (!response.ok) throw transportError(response, \"Failed to start MCP authorization.\");\n return response.json();\n },\n };\n};\n","export {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\nexport type {\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollable,\n MessageScrollerScrollOptions,\n MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","useCallback","window","next","useState","useRef","useCallback","useEffect","options","useMemo","isAbortError"]}
1
+ {"version":3,"sources":["../src/renderers.tsx","../src/viewport.ts"],"sourcesContent":["import type {\n Agents24ChatRenderOptions,\n ChatMessage,\n ChatPart,\n ChatToolPart,\n} from \"./types\";\n\nexport const DefaultToolPart = ({ part }: { part: ChatToolPart }) => {\n const label =\n typeof part.presentation?.activity === \"string\"\n ? part.presentation.activity\n : typeof part.presentation?.title === \"string\"\n ? part.presentation.title\n : part.toolName;\n const detail =\n typeof part.presentation?.detail === \"string\"\n ? part.presentation.detail\n : part.errorText || part.state;\n\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <div>{label}</div>\n {detail ? <div>{detail}</div> : null}\n </div>\n );\n};\n\nexport const DefaultChatPart = ({\n part,\n message,\n renderOptions,\n}: {\n part: ChatPart;\n message: ChatMessage;\n renderOptions?: Agents24ChatRenderOptions;\n}) => {\n if (renderOptions?.renderPart) {\n return <>{renderOptions.renderPart(part, message)}</>;\n }\n\n if (part.kind === \"text\") return <>{part.text}</>;\n\n if (part.kind === \"tool\") {\n const ToolRenderer =\n renderOptions?.toolRenderers?.[part.type] ||\n renderOptions?.fallbackToolRenderer ||\n DefaultToolPart;\n return <>{ToolRenderer({ part, message })}</>;\n }\n\n if (part.kind === \"reasoning\") {\n return <div data-agents24-reasoning-part>{part.text || part.label}</div>;\n }\n\n if (part.kind === \"ui-blocks\") {\n return <div data-agents24-ui-blocks-part data-state={part.state} />;\n }\n\n if (part.kind === \"hitl\") {\n return <div data-agents24-hitl-part={part.interruptId || \"\"} />;\n }\n\n if (part.kind === \"error\") {\n return <div data-agents24-error-part>{part.errorText}</div>;\n }\n\n if (part.kind === \"data\") {\n return <div data-agents24-data-part={part.name} />;\n }\n\n return null;\n};\n\nexport const renderChatPart = (\n part: ChatPart,\n message: ChatMessage,\n renderOptions?: Agents24ChatRenderOptions\n) => (\n <DefaultChatPart\n key={part.id}\n part={part}\n message={message}\n renderOptions={renderOptions}\n />\n);\n","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":";;;;;;;;;;;;;;;;;;;AAoBI,SAiBO,UAhBL,KADF;AAbG,IAAM,kBAAkB,CAAC,EAAE,KAAK,MAA8B;AACnE,QAAM,QACJ,OAAO,KAAK,cAAc,aAAa,WACnC,KAAK,aAAa,WAClB,OAAO,KAAK,cAAc,UAAU,WAClC,KAAK,aAAa,QAClB,KAAK;AACb,QAAM,SACJ,OAAO,KAAK,cAAc,WAAW,WACjC,KAAK,aAAa,SAClB,KAAK,aAAa,KAAK;AAE7B,SACE,qBAAC,SAAI,2BAAyB,KAAK,MAAM,cAAY,KAAK,OACxD;AAAA,wBAAC,SAAK,iBAAM;AAAA,IACX,SAAS,oBAAC,SAAK,kBAAO,IAAS;AAAA,KAClC;AAEJ;AAEO,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,MAAI,eAAe,YAAY;AAC7B,WAAO,gCAAG,wBAAc,WAAW,MAAM,OAAO,GAAE;AAAA,EACpD;AAEA,MAAI,KAAK,SAAS,OAAQ,QAAO,gCAAG,eAAK,MAAK;AAE9C,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,eACJ,eAAe,gBAAgB,KAAK,IAAI,KACxC,eAAe,wBACf;AACF,WAAO,gCAAG,uBAAa,EAAE,MAAM,QAAQ,CAAC,GAAE;AAAA,EAC5C;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,oBAAC,SAAI,gCAA4B,MAAE,eAAK,QAAQ,KAAK,OAAM;AAAA,EACpE;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,oBAAC,SAAI,gCAA4B,MAAC,cAAY,KAAK,OAAO;AAAA,EACnE;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,oBAAC,SAAI,2BAAyB,KAAK,eAAe,IAAI;AAAA,EAC/D;AAEA,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,oBAAC,SAAI,4BAAwB,MAAE,eAAK,WAAU;AAAA,EACvD;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,oBAAC,SAAI,2BAAyB,KAAK,MAAM;AAAA,EAClD;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAC5B,MACA,SACA,kBAEA;AAAA,EAAC;AAAA;AAAA,IAEC;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAHK,KAAK;AAIZ;;;ACnFF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
@@ -7,24 +7,24 @@ type MessageScrollerContentProps = React.ComponentProps<typeof MessageScroller.C
7
7
  type MessageScrollerItemProps = React.ComponentProps<typeof MessageScroller.Item>;
8
8
  type MessageScrollerButtonProps = React.ComponentProps<typeof MessageScroller.Button>;
9
9
  export type LatestThreadScrollerProviderProps = MessageScrollerProviderProps;
10
- export declare function LatestThreadScrollerProvider({ autoScroll, defaultScrollPosition, scrollPreviousItemPeek, ...props }: LatestThreadScrollerProviderProps): React.JSX.Element;
10
+ export declare function LatestThreadScrollerProvider({ autoScroll, defaultScrollPosition, scrollPreviousItemPeek, ...props }: LatestThreadScrollerProviderProps): import("react/jsx-runtime").JSX.Element;
11
11
  export type LatestThreadScrollerRootProps = MessageScrollerRootProps;
12
- export declare function LatestThreadScrollerRoot({ className, ref, ...props }: LatestThreadScrollerRootProps): React.JSX.Element;
12
+ export declare function LatestThreadScrollerRoot({ className, ref, ...props }: LatestThreadScrollerRootProps): import("react/jsx-runtime").JSX.Element;
13
13
  export type LatestThreadScrollerViewportProps = MessageScrollerViewportProps & {
14
14
  onViewportChange?: (node: HTMLElement | null) => void;
15
15
  };
16
- export declare function LatestThreadScrollerViewport({ className, onViewportChange, preserveScrollOnPrepend, ref, ...props }: LatestThreadScrollerViewportProps): React.JSX.Element;
16
+ export declare function LatestThreadScrollerViewport({ className, onViewportChange, preserveScrollOnPrepend, ref, ...props }: LatestThreadScrollerViewportProps): import("react/jsx-runtime").JSX.Element;
17
17
  export type LatestThreadScrollerContentProps = MessageScrollerContentProps;
18
- export declare function LatestThreadScrollerContent({ className, ref, ...props }: LatestThreadScrollerContentProps): React.JSX.Element;
18
+ export declare function LatestThreadScrollerContent({ className, ref, ...props }: LatestThreadScrollerContentProps): import("react/jsx-runtime").JSX.Element;
19
19
  export type LatestThreadScrollerItemProps = Omit<MessageScrollerItemProps, "messageId"> & {
20
20
  messageId: string;
21
21
  };
22
- export declare function LatestThreadScrollerItem({ className, messageId, ...props }: LatestThreadScrollerItemProps): React.JSX.Element;
22
+ export declare function LatestThreadScrollerItem({ className, messageId, ...props }: LatestThreadScrollerItemProps): import("react/jsx-runtime").JSX.Element;
23
23
  export type LatestThreadScrollerButtonProps = Omit<MessageScrollerButtonProps, "render"> & {
24
24
  className?: string;
25
25
  render?: MessageScrollerButtonProps["render"];
26
26
  };
27
- export declare function LatestThreadScrollerButton({ children, className, direction, render, ...props }: LatestThreadScrollerButtonProps): React.JSX.Element;
27
+ export declare function LatestThreadScrollerButton({ children, className, direction, render, ...props }: LatestThreadScrollerButtonProps): import("react/jsx-runtime").JSX.Element;
28
28
  export type LatestThreadScrollerOutlineItem = {
29
29
  id: string;
30
30
  label: string;
@@ -41,7 +41,7 @@ export type LatestThreadScrollerOutlineProps = {
41
41
  minSideGutterForRail?: number;
42
42
  side?: "left" | "right";
43
43
  };
44
- export declare function LatestThreadScrollerOutline({ cardClassName, className, contentMaxWidth, dir, items, minContainerWidthForRail, minSideGutterForRail, side, }: LatestThreadScrollerOutlineProps): React.JSX.Element | null;
44
+ export declare function LatestThreadScrollerOutline({ cardClassName, className, contentMaxWidth, dir, items, minContainerWidthForRail, minSideGutterForRail, side, }: LatestThreadScrollerOutlineProps): import("react/jsx-runtime").JSX.Element | null;
45
45
  export declare const LatestThreadScroller: {
46
46
  Provider: typeof LatestThreadScrollerProvider;
47
47
  Root: typeof LatestThreadScrollerRoot;
@@ -1,2 +1,4 @@
1
+ import type { McpCallbackResult } from "@agents24/client";
1
2
  import type { ChatMcpOauthCompletion, WaitForMcpOauthCompleteInput } from "./types";
2
- export declare function waitForMcpOauthComplete({ popup, callbackOrigin, serverId, timeoutMs, }: WaitForMcpOauthCompleteInput): Promise<ChatMcpOauthCompletion>;
3
+ export declare function validateMcpCallbackResult(result: McpCallbackResult, expectedServerId: string): McpCallbackResult;
4
+ export declare function waitForMcpOauthComplete({ popup, callbackOrigin, popupNonce, requireConnectionId, serverId, timeoutMs, }: WaitForMcpOauthCompleteInput): Promise<ChatMcpOauthCompletion>;
@@ -1,10 +1,10 @@
1
1
  import type { Agents24ChatRenderOptions, ChatMessage, ChatPart, ChatToolPart } from "./types";
2
2
  export declare const DefaultToolPart: ({ part }: {
3
3
  part: ChatToolPart;
4
- }) => import("react").JSX.Element;
4
+ }) => import("react/jsx-runtime").JSX.Element;
5
5
  export declare const DefaultChatPart: ({ part, message, renderOptions, }: {
6
6
  part: ChatPart;
7
7
  message: ChatMessage;
8
8
  renderOptions?: Agents24ChatRenderOptions;
9
- }) => import("react").JSX.Element | null;
10
- export declare const renderChatPart: (part: ChatPart, message: ChatMessage, renderOptions?: Agents24ChatRenderOptions) => import("react").JSX.Element;
9
+ }) => import("react/jsx-runtime").JSX.Element | null;
10
+ export declare const renderChatPart: (part: ChatPart, message: ChatMessage, renderOptions?: Agents24ChatRenderOptions) => import("react/jsx-runtime").JSX.Element;