@gravity-ui/aikit 2.1.0 → 2.2.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 (51) hide show
  1. package/build/cjs/adapters/openai/helpers/applyContentUpdate.js +6 -1
  2. package/build/cjs/adapters/openai/helpers/applyContentUpdate.js.map +1 -1
  3. package/build/cjs/adapters/openai/helpers/getStreamEventContentUpdate.d.ts +6 -0
  4. package/build/cjs/adapters/openai/helpers/getStreamEventContentUpdate.js +9 -14
  5. package/build/cjs/adapters/openai/helpers/getStreamEventContentUpdate.js.map +1 -1
  6. package/build/cjs/adapters/openai/helpers/mapOutputToContent.js +4 -1
  7. package/build/cjs/adapters/openai/helpers/mapOutputToContent.js.map +1 -1
  8. package/build/cjs/adapters/openai/helpers/prettyPrintJson.d.ts +5 -0
  9. package/build/cjs/adapters/openai/helpers/prettyPrintJson.js +18 -0
  10. package/build/cjs/adapters/openai/helpers/prettyPrintJson.js.map +1 -0
  11. package/build/cjs/components/atoms/MarkdownRenderer/MarkdownRenderer.css +80 -1
  12. package/build/cjs/components/pages/AIStudioChat/AIStudioChat.js +19 -6
  13. package/build/cjs/components/pages/AIStudioChat/AIStudioChat.js.map +1 -1
  14. package/build/cjs/components/pages/AIStudioChat/McpToolRenderer.css +14 -0
  15. package/build/cjs/components/pages/AIStudioChat/McpToolRenderer.d.ts +5 -0
  16. package/build/cjs/components/pages/AIStudioChat/McpToolRenderer.js +21 -0
  17. package/build/cjs/components/pages/AIStudioChat/McpToolRenderer.js.map +1 -0
  18. package/build/cjs/components/pages/AIStudioChat/i18n/en.json +4 -0
  19. package/build/cjs/components/pages/AIStudioChat/i18n/index.d.ts +13 -0
  20. package/build/cjs/components/pages/AIStudioChat/i18n/index.js +10 -0
  21. package/build/cjs/components/pages/AIStudioChat/i18n/index.js.map +1 -0
  22. package/build/cjs/components/pages/AIStudioChat/i18n/ru.json +4 -0
  23. package/build/cjs/package.json +1 -1
  24. package/build/cjs/types/messages.d.ts +6 -1
  25. package/build/cjs/types/messages.js.map +1 -1
  26. package/build/esm/adapters/openai/helpers/applyContentUpdate.js +6 -1
  27. package/build/esm/adapters/openai/helpers/applyContentUpdate.js.map +1 -1
  28. package/build/esm/adapters/openai/helpers/getStreamEventContentUpdate.d.ts +6 -0
  29. package/build/esm/adapters/openai/helpers/getStreamEventContentUpdate.js +9 -14
  30. package/build/esm/adapters/openai/helpers/getStreamEventContentUpdate.js.map +1 -1
  31. package/build/esm/adapters/openai/helpers/mapOutputToContent.js +4 -1
  32. package/build/esm/adapters/openai/helpers/mapOutputToContent.js.map +1 -1
  33. package/build/esm/adapters/openai/helpers/prettyPrintJson.d.ts +5 -0
  34. package/build/esm/adapters/openai/helpers/prettyPrintJson.js +15 -0
  35. package/build/esm/adapters/openai/helpers/prettyPrintJson.js.map +1 -0
  36. package/build/esm/components/atoms/MarkdownRenderer/MarkdownRenderer.css +80 -1
  37. package/build/esm/components/pages/AIStudioChat/AIStudioChat.js +19 -6
  38. package/build/esm/components/pages/AIStudioChat/AIStudioChat.js.map +1 -1
  39. package/build/esm/components/pages/AIStudioChat/McpToolRenderer.css +14 -0
  40. package/build/esm/components/pages/AIStudioChat/McpToolRenderer.d.ts +5 -0
  41. package/build/esm/components/pages/AIStudioChat/McpToolRenderer.js +18 -0
  42. package/build/esm/components/pages/AIStudioChat/McpToolRenderer.js.map +1 -0
  43. package/build/esm/components/pages/AIStudioChat/i18n/en.json +4 -0
  44. package/build/esm/components/pages/AIStudioChat/i18n/index.d.ts +13 -0
  45. package/build/esm/components/pages/AIStudioChat/i18n/index.js +6 -0
  46. package/build/esm/components/pages/AIStudioChat/i18n/index.js.map +1 -0
  47. package/build/esm/components/pages/AIStudioChat/i18n/ru.json +4 -0
  48. package/build/esm/package.json +1 -1
  49. package/build/esm/types/messages.d.ts +6 -1
  50. package/build/esm/types/messages.js.map +1 -1
  51. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AIStudioChat.js","sourceRoot":"../../../../../src","sources":["components/pages/AIStudioChat/AIStudioChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from 'react';\n\nimport {v4 as uuidv4} from 'uuid';\n\nimport {fetchResponseToStreamEvents, useOpenAIStreamAdapter} from '../../../adapters/openai';\nimport type {OpenAIStreamSource} from '../../../adapters/openai';\nimport {BaseMessageActionType} from '../../../types';\nimport type {\n ChatStatus,\n ChatType,\n DefaultMessageAction,\n FileAttachment,\n TAssistantMessage,\n TChatMessage,\n TSubmitData,\n TUserMessage,\n UserRating,\n} from '../../../types';\nimport {InputContextProvider, useInputContext} from '../../molecules/InputContext';\nimport type {MessageListConfig} from '../ChatContainer';\nimport {ChatContainer} from '../ChatContainer';\n\nimport {normalizeMcpCallIds, omitMcpListToolsEvents} from './transforms';\nimport type {AIStudioChatProps} from './types';\n\nfunction isFileAttachment(value: unknown): value is FileAttachment {\n if (!value || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return typeof v.id === 'string' && typeof v.name === 'string';\n}\n\nfunction resolveFileAttachments(\n attachments: FileAttachment[] | undefined,\n fileIds: string[] | undefined,\n): FileAttachment[] | undefined {\n if (attachments && attachments.length > 0) return attachments;\n if (fileIds && fileIds.length > 0) return fileIds.map((id) => ({id, name: id}));\n return undefined;\n}\n\ntype ApiMessageContentPart =\n | {type: 'text'; text: string}\n | {type: 'image_url'; image_url: {url: string}};\n\ntype ApiMessage = {\n role: 'user' | 'assistant' | 'system';\n content: string | ApiMessageContentPart[];\n};\n\ntype StreamOptions = {\n initialMessages: TChatMessage[];\n assistantMessageId: string;\n};\n\n/**\n * Extracts plain text content from any TChatMessage variant.\n */\nfunction getMessageTextContent(message: TChatMessage): string {\n if (message.role === 'user') {\n return typeof message.content === 'string' ? message.content : '';\n }\n\n const {content} = message as TAssistantMessage;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .map((item) => {\n if (typeof item === 'string') return item;\n if (item.type === 'text' && item.data?.text) return item.data.text;\n return '';\n })\n .join('\\n');\n }\n\n if (content && typeof content === 'object' && 'type' in content) {\n if (content.type === 'text' && content.data?.text) {\n return content.data.text;\n }\n }\n\n return '';\n}\n\n/**\n * Derives a human-readable chat name from the first user message.\n */\nfunction deriveChatName(content: string): string {\n const trimmed = content.trim();\n return trimmed.length > 40 ? `${trimmed.slice(0, 40)}...` : trimmed || 'New chat';\n}\n\ntype AIStudioChatInnerProps = Omit<AIStudioChatProps, 'fileUpload' | 'fileDialogTitle'>;\n\n/**\n * AIStudioChat - a ready-to-use chat component with built-in OpenAI streaming support.\n *\n * Wraps ChatContainer and handles all state internally: streaming, message history,\n * multi-chat management, and cancellation. Requires only an `apiUrl` to start working.\n *\n * @param props - component props\n * @returns React component\n */\nexport function AIStudioChat(props: AIStudioChatProps) {\n const {fileUpload, fileDialogTitle, ...rest} = props;\n return (\n <InputContextProvider fileUpload={fileUpload} fileDialogTitle={fileDialogTitle}>\n <AIStudioChatInner {...rest} />\n </InputContextProvider>\n );\n}\n\nfunction AIStudioChatInner(props: AIStudioChatInnerProps) {\n const {\n apiUrl,\n initialMessages = [],\n showHistory = false,\n showNewChat = showHistory,\n systemPrompt,\n requestInit,\n extraRequestParams,\n trackTokenUsage = true,\n onBeforeSend,\n ...chatContainerProps\n } = props;\n\n const {prepareFilesForSend, reset, contextItems, attachmentContent} = useInputContext();\n\n // Current chat messages\n const [messages, setMessages] = useState<TChatMessage[]>(initialMessages);\n\n // Multi-chat state (used when showHistory=true)\n const [chats, setChats] = useState<ChatType[]>([]);\n const [activeChat, setActiveChat] = useState<ChatType | null>(null);\n\n // Per-chat message store (ref to avoid unnecessary re-renders on switch)\n const chatMessagesRef = useRef<Record<string, TChatMessage[]>>({});\n\n // Always-current reference to activeChat for use inside async callbacks\n // (intentionally mutable ref — not a forgotten dependency)\n const activeChatRef = useRef<ChatType | null>(null);\n activeChatRef.current = activeChat;\n\n // Tracks the last response id for conversation continuity (previous_response_id)\n const responseIdRef = useRef<string | null>(null);\n\n // Streaming state\n const [controller, setController] = useState<AbortController | null>(null);\n const [isFetching, setIsFetching] = useState(false);\n const [streamSource, setStreamSource] = useState<OpenAIStreamSource | null>(null);\n const [streamOptions, setStreamOptions] = useState<StreamOptions | null>(null);\n\n const handleStreamEnd = useCallback((finalMessages: TChatMessage[]) => {\n const committed = finalMessages.filter(\n (msg) => msg.role !== 'assistant' || getMessageTextContent(msg) !== '',\n );\n\n setMessages(committed);\n setStreamSource(null);\n setStreamOptions(null);\n\n // Persist messages and update the last message preview in history\n const chat = activeChatRef.current;\n if (chat) {\n chatMessagesRef.current[chat.id] = committed;\n\n const lastMsg = committed[committed.length - 1];\n if (lastMsg) {\n setChats((prev) =>\n prev.map((c) =>\n c.id === chat.id ? {...c, lastMessage: getMessageTextContent(lastMsg)} : c,\n ),\n );\n }\n }\n }, []);\n\n const streamResult = useOpenAIStreamAdapter(streamSource, {\n initialMessages: streamOptions?.initialMessages ?? [],\n assistantMessageId: streamOptions?.assistantMessageId ?? 'assistant-idle',\n onStreamEnd: handleStreamEnd,\n trackTokenUsage,\n });\n\n // Sync latest responseId to ref so next request can use it as previousResponseId\n useEffect(() => {\n if (streamResult.responseId) {\n responseIdRef.current = streamResult.responseId;\n }\n }, [streamResult.responseId]);\n\n const hasSource = Boolean(streamSource);\n\n const displayMessages =\n hasSource && streamResult.messages.length > 0 ? streamResult.messages : messages;\n\n const status = useMemo((): ChatStatus => {\n if (!hasSource) {\n return isFetching ? 'submitted' : 'ready';\n }\n if (streamResult.status === 'streaming') return 'streaming';\n if (streamResult.status === 'error') return 'error';\n return 'ready';\n }, [hasSource, isFetching, streamResult.status]);\n\n /**\n * Core send function. Takes an already-resolved set of previous messages and\n * pre-converted base64 images so it can be called both from handleSendMessage\n * (which converts File objects) and from handleRetry (which reuses stored images).\n */\n const performSend = useCallback(\n async ({\n previousMessages,\n content,\n base64Images = [],\n perSendParams = {},\n }: {\n previousMessages: TChatMessage[];\n content: string;\n base64Images?: string[];\n perSendParams?: Record<string, unknown>;\n }) => {\n // Auto-create a chat when history is enabled and no chat is active yet\n if (showHistory && !activeChatRef.current) {\n const newChat: ChatType = {\n id: uuidv4(),\n name: deriveChatName(content),\n createTime: new Date().toISOString(),\n };\n chatMessagesRef.current[newChat.id] = [];\n activeChatRef.current = newChat;\n setActiveChat(newChat);\n setChats((prev) => [newChat, ...prev]);\n }\n\n const rawFileIds = Array.isArray(perSendParams.fileIds)\n ? (perSendParams.fileIds as string[])\n : undefined;\n const rawFileAttachments = Array.isArray(perSendParams.fileAttachments)\n ? (perSendParams.fileAttachments as unknown[]).filter(isFileAttachment)\n : undefined;\n const userMessage: TUserMessage = {\n id: uuidv4(),\n role: 'user',\n content,\n images: base64Images.length > 0 ? base64Images : undefined,\n fileAttachments: resolveFileAttachments(rawFileAttachments, rawFileIds),\n };\n const messagesWithUser: TChatMessage[] = [...previousMessages, userMessage];\n const assistantMessageId = uuidv4();\n\n setMessages(messagesWithUser);\n setIsFetching(true);\n\n const abortController = new AbortController();\n setController(abortController);\n\n try {\n // Last user message: plain text or multipart (text + images)\n const lastUserContent: ApiMessage['content'] =\n base64Images.length > 0\n ? [\n {type: 'text', text: content},\n ...base64Images.map((url) => ({\n type: 'image_url' as const,\n image_url: {url},\n })),\n ]\n : content;\n\n const apiMessages: ApiMessage[] = [\n ...(systemPrompt ? [{role: 'system' as const, content: systemPrompt}] : []),\n ...previousMessages\n .filter(\n (msg) => msg.role !== 'assistant' || getMessageTextContent(msg) !== '',\n )\n .map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: getMessageTextContent(msg),\n })),\n {role: 'user' as const, content: lastUserContent},\n ];\n\n const response = await fetch(apiUrl, {\n ...requestInit,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...requestInit?.headers,\n },\n body: JSON.stringify({\n messages: apiMessages,\n ...extraRequestParams,\n ...perSendParams,\n ...(responseIdRef.current\n ? {previousResponseId: responseIdRef.current}\n : {}),\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`API error: ${response.status} ${response.statusText}`);\n }\n\n setStreamSource(\n normalizeMcpCallIds(\n omitMcpListToolsEvents(fetchResponseToStreamEvents(response)),\n ),\n );\n setStreamOptions({initialMessages: messagesWithUser, assistantMessageId});\n } catch (error) {\n if ((error as Error).name !== 'AbortError') {\n const errorMessage: TAssistantMessage = {\n id: uuidv4(),\n role: 'assistant',\n content: (error as Error).message,\n };\n setMessages((prev) => {\n const filtered = prev.filter(\n (msg) => msg.role !== 'assistant' || getMessageTextContent(msg) !== '',\n );\n return [...filtered, errorMessage];\n });\n }\n setStreamSource(null);\n setStreamOptions(null);\n } finally {\n setIsFetching(false);\n setController(null);\n }\n },\n [showHistory, systemPrompt, requestInit, apiUrl, extraRequestParams],\n );\n\n const handleSendMessage = useCallback(\n async (data: TSubmitData) => {\n // Call onBeforeSend hook — allows caller to inject per-request params or cancel send\n let perSendParams: Record<string, unknown> = {};\n if (onBeforeSend) {\n const result = await onBeforeSend({content: data.content});\n if (result === false || result === null) return;\n if (result) perSendParams = result;\n }\n\n const {base64Images, perSendFileParams} = await prepareFilesForSend(data.attachments);\n\n await performSend({\n previousMessages: messages,\n content: data.content,\n base64Images,\n perSendParams: {\n ...perSendParams,\n ...perSendFileParams,\n },\n });\n\n reset();\n },\n [messages, onBeforeSend, performSend, prepareFilesForSend, reset],\n );\n\n const handleCancel = useCallback(async () => {\n controller?.abort();\n setStreamSource(null);\n setStreamOptions(null);\n }, [controller]);\n\n const handleRetry = useCallback(async () => {\n const lastUserMsg = [...messages]\n .reverse()\n .find((m): m is TUserMessage => m.role === 'user');\n if (!lastUserMsg) return;\n\n const lastUserIndex = messages.lastIndexOf(lastUserMsg);\n const trimmedMessages = messages.slice(0, lastUserIndex);\n\n await performSend({\n previousMessages: trimmedMessages,\n content: lastUserMsg.content,\n // Reuse images stored on the original message — no FileReader needed\n base64Images: lastUserMsg.images ?? [],\n });\n }, [messages, performSend]);\n\n const handleCreateChat = useCallback(() => {\n const current = activeChatRef.current;\n if (current) {\n chatMessagesRef.current[current.id] = messages;\n }\n\n responseIdRef.current = null;\n\n const newChat: ChatType = {\n id: uuidv4(),\n name: 'New chat',\n createTime: new Date().toISOString(),\n };\n chatMessagesRef.current[newChat.id] = [];\n setChats((prev) => [newChat, ...prev]);\n setActiveChat(newChat);\n setMessages([]);\n reset();\n }, [messages, reset]);\n\n const handleSelectChat = useCallback(\n (chat: ChatType) => {\n const current = activeChatRef.current;\n if (current) {\n chatMessagesRef.current[current.id] = messages;\n }\n\n responseIdRef.current = null;\n setActiveChat(chat);\n setMessages(chatMessagesRef.current[chat.id] ?? []);\n reset();\n },\n [messages, reset],\n );\n\n const handleDeleteChat = useCallback(\n async (chat: ChatType) => {\n delete chatMessagesRef.current[chat.id];\n setChats((prev) => prev.filter((c) => c.id !== chat.id));\n\n if (activeChatRef.current?.id === chat.id) {\n responseIdRef.current = null;\n setActiveChat(null);\n setMessages([]);\n reset();\n }\n },\n [reset],\n );\n\n /**\n * Update `userRating` on an assistant message inside the internal store.\n * Mirrors the change into the per-chat history map so it survives chat switches.\n */\n const setUserRating = useCallback((messageId: string, rating: UserRating | undefined) => {\n const updateRating = (msgs: TChatMessage[]): TChatMessage[] =>\n msgs.map((msg) =>\n msg.role === 'assistant' && msg.id === messageId\n ? {...msg, userRating: rating}\n : msg,\n );\n\n setMessages(updateRating);\n\n const chat = activeChatRef.current;\n if (chat && chatMessagesRef.current[chat.id]) {\n chatMessagesRef.current[chat.id] = updateRating(chatMessagesRef.current[chat.id]);\n }\n }, []);\n\n /**\n * Wrap consumer-provided Like/Unlike actions so the library toggles `userRating`\n * automatically before delegating to the original `onClick`. Other actions and\n * non-default (ReactNode) entries pass through unchanged.\n */\n const messageListConfig = useMemo<MessageListConfig | undefined>(() => {\n const original = chatContainerProps.messageListConfig;\n const originalAssistantActions = original?.assistantActions;\n if (!originalAssistantActions) return original;\n\n const wrappedAssistantActions = originalAssistantActions.map((action) => {\n const typed = action as DefaultMessageAction<TAssistantMessage>;\n const isLike = typed.type === BaseMessageActionType.Like;\n const isDislike = typed.type === BaseMessageActionType.Dislike;\n if (!isLike && !isDislike) return action;\n\n const targetRating: UserRating = isLike ? 'like' : 'dislike';\n const originalOnClick = typed.onClick;\n\n return {\n ...typed,\n onClick: (message: TAssistantMessage) => {\n if (message.id) {\n const nextRating =\n message.userRating === targetRating ? undefined : targetRating;\n setUserRating(message.id, nextRating);\n }\n originalOnClick(message);\n },\n };\n });\n\n return {\n ...original,\n assistantActions: wrappedAssistantActions,\n };\n }, [chatContainerProps.messageListConfig, setUserRating]);\n\n return (\n <ChatContainer\n {...chatContainerProps}\n messageListConfig={messageListConfig}\n messages={displayMessages}\n status={status}\n error={streamResult.error}\n onSendMessage={handleSendMessage}\n onCancel={handleCancel}\n onRetry={handleRetry}\n chats={showHistory ? chats : undefined}\n activeChat={showHistory ? activeChat : undefined}\n onSelectChat={showHistory ? handleSelectChat : undefined}\n onCreateChat={showHistory ? handleCreateChat : undefined}\n onDeleteChat={showHistory ? handleDeleteChat : undefined}\n showHistory={showHistory}\n showNewChat={showNewChat}\n promptInputProps={{\n ...chatContainerProps.promptInputProps,\n view: 'full',\n headerProps: {\n ...chatContainerProps.promptInputProps?.headerProps,\n contextItems:\n chatContainerProps.promptInputProps?.headerProps?.contextItems ??\n contextItems,\n },\n footerProps: {\n ...chatContainerProps.promptInputProps?.footerProps,\n attachmentContent:\n chatContainerProps.promptInputProps?.footerProps?.attachmentContent ??\n attachmentContent,\n },\n }}\n />\n );\n}\n"]}
1
+ {"version":3,"file":"AIStudioChat.js","sourceRoot":"../../../../../src","sources":["components/pages/AIStudioChat/AIStudioChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from 'react';\n\nimport {v4 as uuidv4} from 'uuid';\n\nimport {fetchResponseToStreamEvents, useOpenAIStreamAdapter} from '../../../adapters/openai';\nimport type {OpenAIStreamSource} from '../../../adapters/openai';\nimport {BaseMessageActionType} from '../../../types';\nimport type {\n ChatStatus,\n ChatType,\n DefaultMessageAction,\n FileAttachment,\n TAssistantMessage,\n TChatMessage,\n TSubmitData,\n TUserMessage,\n UserRating,\n} from '../../../types';\nimport type {ToolMessageContent} from '../../../types/messages';\nimport {\n createMessageRendererRegistry,\n mergeMessageRendererRegistries,\n registerMessageRenderer,\n} from '../../../utils/messageTypeRegistry';\nimport {InputContextProvider, useInputContext} from '../../molecules/InputContext';\nimport type {MessageListConfig} from '../ChatContainer';\nimport {ChatContainer} from '../ChatContainer';\n\nimport {McpToolRenderer} from './McpToolRenderer';\nimport {normalizeMcpCallIds, omitMcpListToolsEvents} from './transforms';\nimport type {AIStudioChatProps} from './types';\n\nfunction isFileAttachment(value: unknown): value is FileAttachment {\n if (!value || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return typeof v.id === 'string' && typeof v.name === 'string';\n}\n\nfunction resolveFileAttachments(\n attachments: FileAttachment[] | undefined,\n fileIds: string[] | undefined,\n): FileAttachment[] | undefined {\n if (attachments && attachments.length > 0) return attachments;\n if (fileIds && fileIds.length > 0) return fileIds.map((id) => ({id, name: id}));\n return undefined;\n}\n\ntype ApiMessageContentPart =\n | {type: 'text'; text: string}\n | {type: 'image_url'; image_url: {url: string}};\n\ntype ApiMessage = {\n role: 'user' | 'assistant' | 'system';\n content: string | ApiMessageContentPart[];\n};\n\ntype StreamOptions = {\n initialMessages: TChatMessage[];\n assistantMessageId: string;\n};\n\n/**\n * Extracts plain text content from any TChatMessage variant.\n */\nfunction getMessageTextContent(message: TChatMessage): string {\n if (message.role === 'user') {\n return typeof message.content === 'string' ? message.content : '';\n }\n\n const {content} = message as TAssistantMessage;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .map((item) => {\n if (typeof item === 'string') return item;\n if (item.type === 'text' && item.data?.text) return item.data.text;\n return '';\n })\n .join('\\n');\n }\n\n if (content && typeof content === 'object' && 'type' in content) {\n if (content.type === 'text' && content.data?.text) {\n return content.data.text;\n }\n }\n\n return '';\n}\n\n/**\n * Derives a human-readable chat name from the first user message.\n */\nfunction deriveChatName(content: string): string {\n const trimmed = content.trim();\n return trimmed.length > 40 ? `${trimmed.slice(0, 40)}...` : trimmed || 'New chat';\n}\n\ntype AIStudioChatInnerProps = Omit<AIStudioChatProps, 'fileUpload' | 'fileDialogTitle'>;\n\n/**\n * AIStudioChat - a ready-to-use chat component with built-in OpenAI streaming support.\n *\n * Wraps ChatContainer and handles all state internally: streaming, message history,\n * multi-chat management, and cancellation. Requires only an `apiUrl` to start working.\n *\n * @param props - component props\n * @returns React component\n */\nexport function AIStudioChat(props: AIStudioChatProps) {\n const {fileUpload, fileDialogTitle, ...rest} = props;\n return (\n <InputContextProvider fileUpload={fileUpload} fileDialogTitle={fileDialogTitle}>\n <AIStudioChatInner {...rest} />\n </InputContextProvider>\n );\n}\n\nfunction AIStudioChatInner(props: AIStudioChatInnerProps) {\n const {\n apiUrl,\n initialMessages = [],\n showHistory = false,\n showNewChat = showHistory,\n systemPrompt,\n requestInit,\n extraRequestParams,\n trackTokenUsage = true,\n onBeforeSend,\n ...chatContainerProps\n } = props;\n\n const {prepareFilesForSend, reset, contextItems, attachmentContent} = useInputContext();\n\n // Current chat messages\n const [messages, setMessages] = useState<TChatMessage[]>(initialMessages);\n\n // Multi-chat state (used when showHistory=true)\n const [chats, setChats] = useState<ChatType[]>([]);\n const [activeChat, setActiveChat] = useState<ChatType | null>(null);\n\n // Per-chat message store (ref to avoid unnecessary re-renders on switch)\n const chatMessagesRef = useRef<Record<string, TChatMessage[]>>({});\n\n // Always-current reference to activeChat for use inside async callbacks\n // (intentionally mutable ref — not a forgotten dependency)\n const activeChatRef = useRef<ChatType | null>(null);\n activeChatRef.current = activeChat;\n\n // Tracks the last response id for conversation continuity (previous_response_id)\n const responseIdRef = useRef<string | null>(null);\n\n // Streaming state\n const [controller, setController] = useState<AbortController | null>(null);\n const [isFetching, setIsFetching] = useState(false);\n const [streamSource, setStreamSource] = useState<OpenAIStreamSource | null>(null);\n const [streamOptions, setStreamOptions] = useState<StreamOptions | null>(null);\n\n const handleStreamEnd = useCallback((finalMessages: TChatMessage[]) => {\n const committed = finalMessages.filter(\n (msg) => msg.role !== 'assistant' || getMessageTextContent(msg) !== '',\n );\n\n setMessages(committed);\n setStreamSource(null);\n setStreamOptions(null);\n\n // Persist messages and update the last message preview in history\n const chat = activeChatRef.current;\n if (chat) {\n chatMessagesRef.current[chat.id] = committed;\n\n const lastMsg = committed[committed.length - 1];\n if (lastMsg) {\n setChats((prev) =>\n prev.map((c) =>\n c.id === chat.id ? {...c, lastMessage: getMessageTextContent(lastMsg)} : c,\n ),\n );\n }\n }\n }, []);\n\n const streamResult = useOpenAIStreamAdapter(streamSource, {\n initialMessages: streamOptions?.initialMessages ?? [],\n assistantMessageId: streamOptions?.assistantMessageId ?? 'assistant-idle',\n onStreamEnd: handleStreamEnd,\n trackTokenUsage,\n });\n\n // Sync latest responseId to ref so next request can use it as previousResponseId\n useEffect(() => {\n if (streamResult.responseId) {\n responseIdRef.current = streamResult.responseId;\n }\n }, [streamResult.responseId]);\n\n const hasSource = Boolean(streamSource);\n\n const displayMessages =\n hasSource && streamResult.messages.length > 0 ? streamResult.messages : messages;\n\n const status = useMemo((): ChatStatus => {\n if (!hasSource) {\n return isFetching ? 'submitted' : 'ready';\n }\n if (streamResult.status === 'streaming') return 'streaming';\n if (streamResult.status === 'error') return 'error';\n return 'ready';\n }, [hasSource, isFetching, streamResult.status]);\n\n /**\n * Core send function. Takes an already-resolved set of previous messages and\n * pre-converted base64 images so it can be called both from handleSendMessage\n * (which converts File objects) and from handleRetry (which reuses stored images).\n */\n const performSend = useCallback(\n async ({\n previousMessages,\n content,\n base64Images = [],\n perSendParams = {},\n }: {\n previousMessages: TChatMessage[];\n content: string;\n base64Images?: string[];\n perSendParams?: Record<string, unknown>;\n }) => {\n // Auto-create a chat when history is enabled and no chat is active yet\n if (showHistory && !activeChatRef.current) {\n const newChat: ChatType = {\n id: uuidv4(),\n name: deriveChatName(content),\n createTime: new Date().toISOString(),\n };\n chatMessagesRef.current[newChat.id] = [];\n activeChatRef.current = newChat;\n setActiveChat(newChat);\n setChats((prev) => [newChat, ...prev]);\n }\n\n const rawFileIds = Array.isArray(perSendParams.fileIds)\n ? (perSendParams.fileIds as string[])\n : undefined;\n const rawFileAttachments = Array.isArray(perSendParams.fileAttachments)\n ? (perSendParams.fileAttachments as unknown[]).filter(isFileAttachment)\n : undefined;\n const userMessage: TUserMessage = {\n id: uuidv4(),\n role: 'user',\n content,\n images: base64Images.length > 0 ? base64Images : undefined,\n fileAttachments: resolveFileAttachments(rawFileAttachments, rawFileIds),\n };\n const messagesWithUser: TChatMessage[] = [...previousMessages, userMessage];\n const assistantMessageId = uuidv4();\n\n setMessages(messagesWithUser);\n setIsFetching(true);\n\n const abortController = new AbortController();\n setController(abortController);\n\n try {\n // Last user message: plain text or multipart (text + images)\n const lastUserContent: ApiMessage['content'] =\n base64Images.length > 0\n ? [\n {type: 'text', text: content},\n ...base64Images.map((url) => ({\n type: 'image_url' as const,\n image_url: {url},\n })),\n ]\n : content;\n\n const apiMessages: ApiMessage[] = [\n ...(systemPrompt ? [{role: 'system' as const, content: systemPrompt}] : []),\n ...previousMessages\n .filter(\n (msg) => msg.role !== 'assistant' || getMessageTextContent(msg) !== '',\n )\n .map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: getMessageTextContent(msg),\n })),\n {role: 'user' as const, content: lastUserContent},\n ];\n\n const response = await fetch(apiUrl, {\n ...requestInit,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...requestInit?.headers,\n },\n body: JSON.stringify({\n messages: apiMessages,\n ...extraRequestParams,\n ...perSendParams,\n ...(responseIdRef.current\n ? {previousResponseId: responseIdRef.current}\n : {}),\n }),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`API error: ${response.status} ${response.statusText}`);\n }\n\n setStreamSource(\n normalizeMcpCallIds(\n omitMcpListToolsEvents(fetchResponseToStreamEvents(response)),\n ),\n );\n setStreamOptions({initialMessages: messagesWithUser, assistantMessageId});\n } catch (error) {\n if ((error as Error).name !== 'AbortError') {\n const errorMessage: TAssistantMessage = {\n id: uuidv4(),\n role: 'assistant',\n content: (error as Error).message,\n };\n setMessages((prev) => {\n const filtered = prev.filter(\n (msg) => msg.role !== 'assistant' || getMessageTextContent(msg) !== '',\n );\n return [...filtered, errorMessage];\n });\n }\n setStreamSource(null);\n setStreamOptions(null);\n } finally {\n setIsFetching(false);\n setController(null);\n }\n },\n [showHistory, systemPrompt, requestInit, apiUrl, extraRequestParams],\n );\n\n const handleSendMessage = useCallback(\n async (data: TSubmitData) => {\n // Call onBeforeSend hook — allows caller to inject per-request params or cancel send\n let perSendParams: Record<string, unknown> = {};\n if (onBeforeSend) {\n const result = await onBeforeSend({content: data.content});\n if (result === false || result === null) return;\n if (result) perSendParams = result;\n }\n\n const {base64Images, perSendFileParams} = await prepareFilesForSend(data.attachments);\n\n await performSend({\n previousMessages: messages,\n content: data.content,\n base64Images,\n perSendParams: {\n ...perSendParams,\n ...perSendFileParams,\n },\n });\n\n reset();\n },\n [messages, onBeforeSend, performSend, prepareFilesForSend, reset],\n );\n\n const handleCancel = useCallback(async () => {\n controller?.abort();\n setStreamSource(null);\n setStreamOptions(null);\n }, [controller]);\n\n const handleRetry = useCallback(async () => {\n const lastUserMsg = [...messages]\n .reverse()\n .find((m): m is TUserMessage => m.role === 'user');\n if (!lastUserMsg) return;\n\n const lastUserIndex = messages.lastIndexOf(lastUserMsg);\n const trimmedMessages = messages.slice(0, lastUserIndex);\n\n await performSend({\n previousMessages: trimmedMessages,\n content: lastUserMsg.content,\n // Reuse images stored on the original message — no FileReader needed\n base64Images: lastUserMsg.images ?? [],\n });\n }, [messages, performSend]);\n\n const handleCreateChat = useCallback(() => {\n const current = activeChatRef.current;\n if (current) {\n chatMessagesRef.current[current.id] = messages;\n }\n\n responseIdRef.current = null;\n\n const newChat: ChatType = {\n id: uuidv4(),\n name: 'New chat',\n createTime: new Date().toISOString(),\n };\n chatMessagesRef.current[newChat.id] = [];\n setChats((prev) => [newChat, ...prev]);\n setActiveChat(newChat);\n setMessages([]);\n reset();\n }, [messages, reset]);\n\n const handleSelectChat = useCallback(\n (chat: ChatType) => {\n const current = activeChatRef.current;\n if (current) {\n chatMessagesRef.current[current.id] = messages;\n }\n\n responseIdRef.current = null;\n setActiveChat(chat);\n setMessages(chatMessagesRef.current[chat.id] ?? []);\n reset();\n },\n [messages, reset],\n );\n\n const handleDeleteChat = useCallback(\n async (chat: ChatType) => {\n delete chatMessagesRef.current[chat.id];\n setChats((prev) => prev.filter((c) => c.id !== chat.id));\n\n if (activeChatRef.current?.id === chat.id) {\n responseIdRef.current = null;\n setActiveChat(null);\n setMessages([]);\n reset();\n }\n },\n [reset],\n );\n\n /**\n * Update `userRating` on an assistant message inside the internal store.\n * Mirrors the change into the per-chat history map so it survives chat switches.\n */\n const setUserRating = useCallback((messageId: string, rating: UserRating | undefined) => {\n const updateRating = (msgs: TChatMessage[]): TChatMessage[] =>\n msgs.map((msg) =>\n msg.role === 'assistant' && msg.id === messageId\n ? {...msg, userRating: rating}\n : msg,\n );\n\n setMessages(updateRating);\n\n const chat = activeChatRef.current;\n if (chat && chatMessagesRef.current[chat.id]) {\n chatMessagesRef.current[chat.id] = updateRating(chatMessagesRef.current[chat.id]);\n }\n }, []);\n\n /**\n * Build the final messageListConfig:\n * - Wrap consumer-provided Like/Dislike actions so the library toggles `userRating`\n * automatically before delegating to the original `onClick`. Other actions and\n * non-default (ReactNode) entries pass through unchanged.\n * - Inject a custom 'tool' renderer that renders MCP request/response sections when\n * `mcpRequest`/`mcpResponse` are present in the tool content. A consumer-provided\n * `messageRendererRegistry` wins on overlap.\n */\n const messageListConfig = useMemo<MessageListConfig | undefined>(() => {\n const original = chatContainerProps.messageListConfig;\n\n const baseRegistry = createMessageRendererRegistry();\n registerMessageRenderer<ToolMessageContent>(baseRegistry, 'tool', {\n component: McpToolRenderer,\n });\n const messageRendererRegistry = mergeMessageRendererRegistries(\n baseRegistry,\n original?.messageRendererRegistry ?? {},\n );\n\n const originalAssistantActions = original?.assistantActions;\n if (!originalAssistantActions) {\n return {...original, messageRendererRegistry};\n }\n\n const wrappedAssistantActions = originalAssistantActions.map((action) => {\n const typed = action as DefaultMessageAction<TAssistantMessage>;\n const isLike = typed.type === BaseMessageActionType.Like;\n const isDislike = typed.type === BaseMessageActionType.Dislike;\n if (!isLike && !isDislike) return action;\n\n const targetRating: UserRating = isLike ? 'like' : 'dislike';\n const originalOnClick = typed.onClick;\n\n return {\n ...typed,\n onClick: (message: TAssistantMessage) => {\n if (message.id) {\n const nextRating =\n message.userRating === targetRating ? undefined : targetRating;\n setUserRating(message.id, nextRating);\n }\n originalOnClick(message);\n },\n };\n });\n\n return {\n ...original,\n assistantActions: wrappedAssistantActions,\n messageRendererRegistry,\n };\n }, [chatContainerProps.messageListConfig, setUserRating]);\n\n return (\n <ChatContainer\n {...chatContainerProps}\n messageListConfig={messageListConfig}\n messages={displayMessages}\n status={status}\n error={streamResult.error}\n onSendMessage={handleSendMessage}\n onCancel={handleCancel}\n onRetry={handleRetry}\n chats={showHistory ? chats : undefined}\n activeChat={showHistory ? activeChat : undefined}\n onSelectChat={showHistory ? handleSelectChat : undefined}\n onCreateChat={showHistory ? handleCreateChat : undefined}\n onDeleteChat={showHistory ? handleDeleteChat : undefined}\n showHistory={showHistory}\n showNewChat={showNewChat}\n promptInputProps={{\n ...chatContainerProps.promptInputProps,\n view: 'full',\n headerProps: {\n ...chatContainerProps.promptInputProps?.headerProps,\n contextItems:\n chatContainerProps.promptInputProps?.headerProps?.contextItems ??\n contextItems,\n },\n footerProps: {\n ...chatContainerProps.promptInputProps?.footerProps,\n attachmentContent:\n chatContainerProps.promptInputProps?.footerProps?.attachmentContent ??\n attachmentContent,\n },\n }}\n />\n );\n}\n"]}
@@ -0,0 +1,14 @@
1
+ .g-aikit-aistudio-mcp-tool {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--g-spacing-2);
5
+ }
6
+ .g-aikit-aistudio-mcp-tool__section {
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--g-spacing-1);
10
+ }
11
+ .g-aikit-aistudio-mcp-tool__section-label {
12
+ color: var(--g-color-text-secondary);
13
+ font-weight: 500;
14
+ }
@@ -0,0 +1,5 @@
1
+ import type { ToolMessageContent } from "../../../types/messages.js";
2
+ import "./McpToolRenderer.css";
3
+ export declare function McpToolRenderer({ part }: {
4
+ part: ToolMessageContent;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.McpToolRenderer = McpToolRenderer;
4
+ const tslib_1 = require("tslib");
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const cn_1 = require("../../../utils/cn.js");
7
+ const MarkdownRenderer_1 = require("../../atoms/MarkdownRenderer/index.js");
8
+ const ToolMessage_1 = require("../../organisms/ToolMessage/index.js");
9
+ const i18n_1 = require("./i18n/index.js");
10
+ require("./McpToolRenderer.css");
11
+ const b = (0, cn_1.block)('aistudio-mcp-tool');
12
+ function McpToolRenderer({ part }) {
13
+ const _a = part.data, { mcpRequest, mcpResponse } = _a, rest = tslib_1.__rest(_a, ["mcpRequest", "mcpResponse"]);
14
+ const hasMcp = Boolean(mcpRequest || mcpResponse);
15
+ if (!hasMcp) {
16
+ return (0, jsx_runtime_1.jsx)(ToolMessage_1.ToolMessage, Object.assign({}, rest));
17
+ }
18
+ const body = ((0, jsx_runtime_1.jsxs)("div", { className: b(), children: [mcpRequest && ((0, jsx_runtime_1.jsxs)("div", { className: b('section'), children: [(0, jsx_runtime_1.jsx)("div", { className: b('section-label'), children: (0, i18n_1.i18n)('mcp_request') }), (0, jsx_runtime_1.jsx)(MarkdownRenderer_1.MarkdownRenderer, { content: `\`\`\`json\n${mcpRequest}\n\`\`\`` })] })), mcpResponse && ((0, jsx_runtime_1.jsxs)("div", { className: b('section'), children: [(0, jsx_runtime_1.jsx)("div", { className: b('section-label'), children: (0, i18n_1.i18n)('mcp_response') }), (0, jsx_runtime_1.jsx)(MarkdownRenderer_1.MarkdownRenderer, { content: `\`\`\`json\n${mcpResponse}\n\`\`\`` })] }))] }));
19
+ return (0, jsx_runtime_1.jsx)(ToolMessage_1.ToolMessage, Object.assign({}, rest, { bodyContent: body }));
20
+ }
21
+ //# sourceMappingURL=McpToolRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpToolRenderer.js","sourceRoot":"../../../../../src","sources":["components/pages/AIStudioChat/McpToolRenderer.tsx"],"names":[],"mappings":";;AAWA,0CA0BC;;;AApCD,6CAAwC;AACxC,4EAA8D;AAC9D,sEAAwD;AAExD,0CAA4B;AAE5B,iCAAgC;AAEhC,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,mBAAmB,CAAC,CAAC;AAErC,SAAgB,eAAe,CAAC,EAAC,IAAI,EAA6B;IAC9D,MAAM,KAAqC,IAAI,CAAC,IAAI,EAA9C,EAAC,UAAU,EAAE,WAAW,OAAsB,EAAjB,IAAI,sBAAjC,6BAAkC,CAAY,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,uBAAC,yBAAW,oBAAK,IAAI,EAAI,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,CACT,iCAAK,SAAS,EAAE,CAAC,EAAE,aACd,UAAU,IAAI,CACX,iCAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,aACxB,gCAAK,SAAS,EAAE,CAAC,CAAC,eAAe,CAAC,YAAG,IAAA,WAAI,EAAC,aAAa,CAAC,GAAO,EAC/D,uBAAC,mCAAgB,IAAC,OAAO,EAAE,eAAe,UAAU,UAAU,GAAI,IAChE,CACT,EACA,WAAW,IAAI,CACZ,iCAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,aACxB,gCAAK,SAAS,EAAE,CAAC,CAAC,eAAe,CAAC,YAAG,IAAA,WAAI,EAAC,cAAc,CAAC,GAAO,EAChE,uBAAC,mCAAgB,IAAC,OAAO,EAAE,eAAe,WAAW,UAAU,GAAI,IACjE,CACT,IACC,CACT,CAAC;IAEF,OAAO,uBAAC,yBAAW,oBAAK,IAAI,IAAE,WAAW,EAAE,IAAI,IAAI,CAAC;AACxD,CAAC","sourcesContent":["import type {ToolMessageContent} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {MarkdownRenderer} from '../../atoms/MarkdownRenderer';\nimport {ToolMessage} from '../../organisms/ToolMessage';\n\nimport {i18n} from './i18n';\n\nimport './McpToolRenderer.scss';\n\nconst b = block('aistudio-mcp-tool');\n\nexport function McpToolRenderer({part}: {part: ToolMessageContent}) {\n const {mcpRequest, mcpResponse, ...rest} = part.data;\n const hasMcp = Boolean(mcpRequest || mcpResponse);\n\n if (!hasMcp) {\n return <ToolMessage {...rest} />;\n }\n\n const body = (\n <div className={b()}>\n {mcpRequest && (\n <div className={b('section')}>\n <div className={b('section-label')}>{i18n('mcp_request')}</div>\n <MarkdownRenderer content={`\\`\\`\\`json\\n${mcpRequest}\\n\\`\\`\\``} />\n </div>\n )}\n {mcpResponse && (\n <div className={b('section')}>\n <div className={b('section-label')}>{i18n('mcp_response')}</div>\n <MarkdownRenderer content={`\\`\\`\\`json\\n${mcpResponse}\\n\\`\\`\\``} />\n </div>\n )}\n </div>\n );\n\n return <ToolMessage {...rest} bodyContent={body} />;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ {
2
+ "mcp_request": "Request",
3
+ "mcp_response": "Response"
4
+ }
@@ -0,0 +1,13 @@
1
+ export declare const i18n: ((key: "mcp_request" | "mcp_response", params?: import("@gravity-ui/i18n").Params) => string) & {
2
+ Translation: import("react").ComponentType<{
3
+ children: (props: {
4
+ t: (key: "mcp_request" | "mcp_response", params?: import("@gravity-ui/i18n").Params) => string;
5
+ }) => React.ReactNode;
6
+ }>;
7
+ useTranslation: () => {
8
+ t: (key: "mcp_request" | "mcp_response", params?: import("@gravity-ui/i18n").Params) => string;
9
+ };
10
+ keysetData: {
11
+ "g-aikit-AIStudioChat": Record<"mcp_request" | "mcp_response", import("@gravity-ui/i18n").KeyData>;
12
+ };
13
+ };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.i18n = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const i18n_1 = require("@gravity-ui/uikit/i18n");
6
+ const cn_1 = require("../../../../utils/cn.js");
7
+ const en_json_1 = tslib_1.__importDefault(require("./en.json"));
8
+ const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
9
+ exports.i18n = (0, i18n_1.addComponentKeysets)({ en: en_json_1.default, ru: ru_json_1.default }, `${cn_1.NAMESPACE}AIStudioChat`);
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["components/pages/AIStudioChat/i18n/index.ts"],"names":[],"mappings":";;;;AAAA,iDAA2D;AAE3D,gDAA+C;AAE/C,gEAA2B;AAC3B,gEAA2B;AAEd,QAAA,IAAI,GAAG,IAAA,0BAAmB,EAAC,EAAC,EAAE,EAAF,iBAAE,EAAE,EAAE,EAAF,iBAAE,EAAC,EAAE,GAAG,cAAS,cAAc,CAAC,CAAC","sourcesContent":["import {addComponentKeysets} from '@gravity-ui/uikit/i18n';\n\nimport {NAMESPACE} from '../../../../utils/cn';\n\nimport en from './en.json';\nimport ru from './ru.json';\n\nexport const i18n = addComponentKeysets({en, ru}, `${NAMESPACE}AIStudioChat`);\n"]}
@@ -0,0 +1,4 @@
1
+ {
2
+ "mcp_request": "Запрос",
3
+ "mcp_response": "Ответ"
4
+ }
@@ -1 +1 @@
1
- {"version":"2.1.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
1
+ {"version":"2.2.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
@@ -117,7 +117,12 @@ export type ThinkingMessageContentData = {
117
117
  qa?: string;
118
118
  };
119
119
  export type ThinkingMessageContent = TMessageContent<'thinking', ThinkingMessageContentData>;
120
- export type ToolMessageContentData = ToolMessageProps;
120
+ export type ToolMessageContentData = ToolMessageProps & {
121
+ /** MCP arguments, pretty-printed JSON. Read by AIStudioChat's tool renderer. */
122
+ mcpRequest?: string;
123
+ /** MCP output (or error), pretty-printed JSON. Read by AIStudioChat's tool renderer. */
124
+ mcpResponse?: string;
125
+ };
121
126
  export type ToolMessageContent = TMessageContent<'tool', ToolMessageContentData>;
122
127
  export type TDefaultMessageContent = TextMessageContent | ThinkingMessageContent | ToolMessageContent;
123
128
  export type TMessageContentUnion<TCustomMessageContent extends TMessageContent = never> = TDefaultMessageContent | TCustomMessageContent;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"../../../src","sources":["types/messages.ts"],"names":[],"mappings":";;;AAmDA,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,sCAAa,CAAA;IACb,sCAAa,CAAA;IACb,wCAAe,CAAA;IACf,sCAAa,CAAA;IACb,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,qCAArB,qBAAqB,QAOhC","sourcesContent":["import type React from 'react';\n\nimport type {ButtonView, PopupPlacement} from '@gravity-ui/uikit';\n\nimport {ActionConfig} from './common';\nimport {ToolMessageProps} from './tool';\n\n/**\n * Context object passed to popup content generator function\n */\nexport interface ActionPopupContext {\n /** Update popup content without closing it */\n setContent: (content: React.ReactNode) => void;\n /** Update popup title dynamically */\n setTitle: (title: string | undefined) => void;\n /** Update popup subtitle dynamically */\n setSubtitle: (subtitle: string | undefined) => void;\n /** Programmatically close the popup */\n closePopup: () => void;\n}\n\n/**\n * Configuration for action popup\n */\nexport interface ActionPopupConfig<TMessage> {\n /** Function that generates popup content */\n getContent: (message: TMessage, context: ActionPopupContext) => React.ReactNode;\n /** Optional popup title (can be overridden by actionPopupProps) */\n title?: string;\n /** Optional popup subtitle (can be overridden by actionPopupProps) */\n subtitle?: string;\n /** Optional popup placement (can be overridden by actionPopupProps) */\n placement?: PopupPlacement;\n}\n\nexport type BaseMessageActionConfig<TMessage = unknown> = ActionConfig & {\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * BaseMessage action can be either:\n * - BaseMessageActionConfig object with properties (including type for default icons)\n * - React.ReactNode for fully custom content\n */\nexport type BaseMessageAction<TMessage = unknown> =\n | BaseMessageActionConfig<TMessage>\n | React.ReactNode;\n\nexport type UserRating = 'like' | 'dislike';\n\nexport enum BaseMessageActionType {\n Copy = 'copy',\n Edit = 'edit',\n Retry = 'retry',\n Like = 'like',\n Dislike = 'dislike',\n Delete = 'delete',\n}\n\n/**\n * Default action descriptor for message action buttons.\n * Generic over the message type to provide typed onClick handler.\n */\nexport type DefaultMessageAction<TMessage> = {\n type?: string;\n onClick: (message: TMessage) => void;\n icon?: React.ReactNode;\n /**\n * Arbitrary button content (text, badges, or any ReactNode).\n * Takes precedence over `icon` when both are provided.\n * Can be a static ReactNode or a render function that receives the message,\n * allowing dynamic content based on message data (e.g. token count from metadata).\n */\n children?: React.ReactNode | ((message: TMessage) => React.ReactNode);\n label?: string;\n view?: ButtonView;\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * React component used to render extra contextual info for a message\n * (e.g. token count, latency). Receives the message as a `message` prop.\n */\nexport type MessageExtraInfoComponent<TMessage> = React.ComponentType<{message: TMessage}>;\n\nexport type BaseMessageProps<TMessage = unknown> = {\n children: React.ReactNode;\n role: TMessageRole;\n actions?: BaseMessageAction<TMessage>[];\n /** Extra info node rendered alongside the action buttons (e.g. token count). */\n extraInfo?: React.ReactNode;\n userRating?: UserRating;\n timestamp?: string;\n showTimestamp?: boolean;\n showActionsOnHover?: boolean;\n className?: string;\n qa?: string;\n /** Callback when action with popup config is clicked */\n onActionPopup?: (action: BaseMessageActionConfig<TMessage>, anchorElement: HTMLElement) => void;\n};\n\nexport type TMessageMetadata = Record<string, unknown>;\n\nexport type TSubmitData = {\n content: string;\n attachments?: File[];\n metadata?: TMessageMetadata;\n};\n\nexport type TMessageRole = 'user' | 'assistant' | 'system';\n\nexport type TMessageContent<Type extends string = string, Data = unknown> = {\n id?: string;\n type: Type;\n data: Data;\n};\n\nexport type TextMessageContentData = {\n text: string;\n};\n\nexport type TextMessageContent = TMessageContent<'text', TextMessageContentData>;\n\nexport type ThinkingMessageContentData = {\n title?: string;\n content: string | string[];\n status: 'thinking' | 'thought';\n defaultExpanded?: boolean;\n showStatusIndicator?: boolean;\n onCopyClick?: () => void;\n enabledCopy?: boolean;\n className?: string;\n qa?: string;\n};\n\nexport type ThinkingMessageContent = TMessageContent<'thinking', ThinkingMessageContentData>;\n\nexport type ToolMessageContentData = ToolMessageProps;\n\nexport type ToolMessageContent = TMessageContent<'tool', ToolMessageContentData>;\n\nexport type TDefaultMessageContent =\n | TextMessageContent\n | ThinkingMessageContent\n | ToolMessageContent;\n\nexport type TMessageContentUnion<TCustomMessageContent extends TMessageContent = never> =\n | TDefaultMessageContent\n | TCustomMessageContent;\n\nexport type TAssistantMessageContent<TCustomMessageContent extends TMessageContent = never> =\n | string\n | TMessageContentUnion<TCustomMessageContent>\n | TMessageContentUnion<TCustomMessageContent>[];\n\nexport type TBaseMessage<Metadata = TMessageMetadata> = Pick<\n BaseMessageProps,\n 'actions' | 'timestamp'\n> & {\n id?: string;\n error?: unknown;\n metadata?: Metadata;\n};\n\nexport type FileAttachment = {\n id: string;\n name: string;\n mimeType?: string;\n};\n\nexport type TUserMessage<Metadata = TMessageMetadata> = TBaseMessage<Metadata> & {\n role: 'user';\n content: string;\n format?: 'plain' | 'markdown';\n avatarUrl?: string;\n /** Base64 data URLs or regular image URLs attached to the message */\n images?: string[];\n /** File attachments sent with this message */\n fileAttachments?: FileAttachment[];\n};\n\nexport type TAssistantMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TBaseMessage<Metadata> & {\n role: 'assistant';\n content: TAssistantMessageContent<TCustomMessageContent>;\n userRating?: UserRating;\n};\n\nexport type TChatMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TUserMessage<Metadata> | TAssistantMessage<TCustomMessageContent, Metadata>;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"../../../src","sources":["types/messages.ts"],"names":[],"mappings":";;;AAmDA,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,sCAAa,CAAA;IACb,sCAAa,CAAA;IACb,wCAAe,CAAA;IACf,sCAAa,CAAA;IACb,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,qCAArB,qBAAqB,QAOhC","sourcesContent":["import type React from 'react';\n\nimport type {ButtonView, PopupPlacement} from '@gravity-ui/uikit';\n\nimport {ActionConfig} from './common';\nimport {ToolMessageProps} from './tool';\n\n/**\n * Context object passed to popup content generator function\n */\nexport interface ActionPopupContext {\n /** Update popup content without closing it */\n setContent: (content: React.ReactNode) => void;\n /** Update popup title dynamically */\n setTitle: (title: string | undefined) => void;\n /** Update popup subtitle dynamically */\n setSubtitle: (subtitle: string | undefined) => void;\n /** Programmatically close the popup */\n closePopup: () => void;\n}\n\n/**\n * Configuration for action popup\n */\nexport interface ActionPopupConfig<TMessage> {\n /** Function that generates popup content */\n getContent: (message: TMessage, context: ActionPopupContext) => React.ReactNode;\n /** Optional popup title (can be overridden by actionPopupProps) */\n title?: string;\n /** Optional popup subtitle (can be overridden by actionPopupProps) */\n subtitle?: string;\n /** Optional popup placement (can be overridden by actionPopupProps) */\n placement?: PopupPlacement;\n}\n\nexport type BaseMessageActionConfig<TMessage = unknown> = ActionConfig & {\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * BaseMessage action can be either:\n * - BaseMessageActionConfig object with properties (including type for default icons)\n * - React.ReactNode for fully custom content\n */\nexport type BaseMessageAction<TMessage = unknown> =\n | BaseMessageActionConfig<TMessage>\n | React.ReactNode;\n\nexport type UserRating = 'like' | 'dislike';\n\nexport enum BaseMessageActionType {\n Copy = 'copy',\n Edit = 'edit',\n Retry = 'retry',\n Like = 'like',\n Dislike = 'dislike',\n Delete = 'delete',\n}\n\n/**\n * Default action descriptor for message action buttons.\n * Generic over the message type to provide typed onClick handler.\n */\nexport type DefaultMessageAction<TMessage> = {\n type?: string;\n onClick: (message: TMessage) => void;\n icon?: React.ReactNode;\n /**\n * Arbitrary button content (text, badges, or any ReactNode).\n * Takes precedence over `icon` when both are provided.\n * Can be a static ReactNode or a render function that receives the message,\n * allowing dynamic content based on message data (e.g. token count from metadata).\n */\n children?: React.ReactNode | ((message: TMessage) => React.ReactNode);\n label?: string;\n view?: ButtonView;\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * React component used to render extra contextual info for a message\n * (e.g. token count, latency). Receives the message as a `message` prop.\n */\nexport type MessageExtraInfoComponent<TMessage> = React.ComponentType<{message: TMessage}>;\n\nexport type BaseMessageProps<TMessage = unknown> = {\n children: React.ReactNode;\n role: TMessageRole;\n actions?: BaseMessageAction<TMessage>[];\n /** Extra info node rendered alongside the action buttons (e.g. token count). */\n extraInfo?: React.ReactNode;\n userRating?: UserRating;\n timestamp?: string;\n showTimestamp?: boolean;\n showActionsOnHover?: boolean;\n className?: string;\n qa?: string;\n /** Callback when action with popup config is clicked */\n onActionPopup?: (action: BaseMessageActionConfig<TMessage>, anchorElement: HTMLElement) => void;\n};\n\nexport type TMessageMetadata = Record<string, unknown>;\n\nexport type TSubmitData = {\n content: string;\n attachments?: File[];\n metadata?: TMessageMetadata;\n};\n\nexport type TMessageRole = 'user' | 'assistant' | 'system';\n\nexport type TMessageContent<Type extends string = string, Data = unknown> = {\n id?: string;\n type: Type;\n data: Data;\n};\n\nexport type TextMessageContentData = {\n text: string;\n};\n\nexport type TextMessageContent = TMessageContent<'text', TextMessageContentData>;\n\nexport type ThinkingMessageContentData = {\n title?: string;\n content: string | string[];\n status: 'thinking' | 'thought';\n defaultExpanded?: boolean;\n showStatusIndicator?: boolean;\n onCopyClick?: () => void;\n enabledCopy?: boolean;\n className?: string;\n qa?: string;\n};\n\nexport type ThinkingMessageContent = TMessageContent<'thinking', ThinkingMessageContentData>;\n\nexport type ToolMessageContentData = ToolMessageProps & {\n /** MCP arguments, pretty-printed JSON. Read by AIStudioChat's tool renderer. */\n mcpRequest?: string;\n /** MCP output (or error), pretty-printed JSON. Read by AIStudioChat's tool renderer. */\n mcpResponse?: string;\n};\n\nexport type ToolMessageContent = TMessageContent<'tool', ToolMessageContentData>;\n\nexport type TDefaultMessageContent =\n | TextMessageContent\n | ThinkingMessageContent\n | ToolMessageContent;\n\nexport type TMessageContentUnion<TCustomMessageContent extends TMessageContent = never> =\n | TDefaultMessageContent\n | TCustomMessageContent;\n\nexport type TAssistantMessageContent<TCustomMessageContent extends TMessageContent = never> =\n | string\n | TMessageContentUnion<TCustomMessageContent>\n | TMessageContentUnion<TCustomMessageContent>[];\n\nexport type TBaseMessage<Metadata = TMessageMetadata> = Pick<\n BaseMessageProps,\n 'actions' | 'timestamp'\n> & {\n id?: string;\n error?: unknown;\n metadata?: Metadata;\n};\n\nexport type FileAttachment = {\n id: string;\n name: string;\n mimeType?: string;\n};\n\nexport type TUserMessage<Metadata = TMessageMetadata> = TBaseMessage<Metadata> & {\n role: 'user';\n content: string;\n format?: 'plain' | 'markdown';\n avatarUrl?: string;\n /** Base64 data URLs or regular image URLs attached to the message */\n images?: string[];\n /** File attachments sent with this message */\n fileAttachments?: FileAttachment[];\n};\n\nexport type TAssistantMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TBaseMessage<Metadata> & {\n role: 'assistant';\n content: TAssistantMessageContent<TCustomMessageContent>;\n userRating?: UserRating;\n};\n\nexport type TChatMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TUserMessage<Metadata> | TAssistantMessage<TCustomMessageContent, Metadata>;\n"]}
@@ -39,6 +39,9 @@ function applyToolAdd(parts, update) {
39
39
  if (update.headerContent !== undefined) {
40
40
  data.headerContent = update.headerContent;
41
41
  }
42
+ if (update.mcpRequest !== undefined) {
43
+ data.mcpRequest = update.mcpRequest;
44
+ }
42
45
  return [
43
46
  ...parts,
44
47
  {
@@ -66,7 +69,9 @@ function applyToolUpdate(parts, update) {
66
69
  return partsToUpdate;
67
70
  const bodyText = update.error || update.output || undefined;
68
71
  return partsToUpdate.map((p, i) => i === idx
69
- ? Object.assign(Object.assign({}, prev), { data: Object.assign(Object.assign(Object.assign(Object.assign({}, prev.data), (update.toolName && { toolName: update.toolName })), { status: update.status }), (bodyText ? { bodyContent: bodyText } : {})) }) : p);
72
+ ? Object.assign(Object.assign({}, prev), { data: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, prev.data), (update.toolName && { toolName: update.toolName })), { status: update.status }), (bodyText ? { bodyContent: bodyText } : {})), (update.mcpRequest === undefined ? {} : { mcpRequest: update.mcpRequest })), (update.mcpResponse === undefined
73
+ ? {}
74
+ : { mcpResponse: update.mcpResponse })) }) : p);
70
75
  }
71
76
  function applyThinkingAdd(parts, update) {
72
77
  return [
@@ -1 +1 @@
1
- {"version":3,"file":"applyContentUpdate.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/applyContentUpdate.ts"],"names":[],"mappings":"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","sourcesContent":["import type {TMessageContentUnion} from '../../../types';\n\nimport type {\n StreamEventContentUpdate,\n StreamEventTextDelta,\n StreamEventThinkingDelta,\n StreamEventThinkingDone,\n StreamEventToolAdd,\n StreamEventToolUpdate,\n} from './getStreamEventContentUpdate';\n\nfunction findContentPartIndex(\n parts: TMessageContentUnion[],\n partType: 'tool' | 'thinking',\n id: string,\n): number {\n return parts.findIndex((p) => p.type === partType && (p as {id?: string}).id === id);\n}\n\nexport function applyContentUpdate(\n parts: TMessageContentUnion[],\n update: StreamEventContentUpdate,\n): TMessageContentUnion[] | null {\n switch (update.kind) {\n case 'text_delta':\n return applyTextDelta(parts, update);\n case 'tool_add':\n return applyToolAdd(parts, update);\n case 'tool_update':\n return applyToolUpdate(parts, update);\n case 'thinking_add':\n return applyThinkingAdd(parts, update);\n case 'thinking_delta':\n return applyThinkingDelta(parts, update);\n case 'thinking_done':\n return applyThinkingDone(parts, update);\n default:\n return null;\n }\n}\n\nfunction applyTextDelta(\n parts: TMessageContentUnion[],\n update: StreamEventTextDelta,\n): TMessageContentUnion[] {\n const last = parts[parts.length - 1];\n if (last?.type === 'text') {\n return [\n ...parts.slice(0, -1),\n {type: 'text' as const, data: {text: last.data.text + update.delta}},\n ];\n }\n return [...parts, {type: 'text' as const, data: {text: update.delta}}];\n}\n\nfunction applyToolAdd(\n parts: TMessageContentUnion[],\n update: StreamEventToolAdd,\n): TMessageContentUnion[] {\n const status = update.status ?? 'loading';\n const data: {toolName: string; status: typeof status; headerContent?: string} = {\n toolName: update.toolName,\n status,\n };\n if (update.headerContent !== undefined) {\n data.headerContent = update.headerContent;\n }\n return [\n ...parts,\n {\n type: 'tool' as const,\n id: update.id,\n data,\n },\n ];\n}\n\nfunction applyToolUpdate(\n parts: TMessageContentUnion[],\n update: StreamEventToolUpdate,\n): TMessageContentUnion[] {\n let idx = findContentPartIndex(parts, 'tool', update.item_id);\n let partsToUpdate = parts;\n if (idx < 0) {\n partsToUpdate = applyToolAdd(parts, {\n kind: 'tool_add',\n id: update.item_id,\n toolName: update.toolName ?? '',\n status: update.status,\n });\n idx = partsToUpdate.length - 1;\n }\n const prev = partsToUpdate[idx];\n if (prev.type !== 'tool') return partsToUpdate;\n\n const bodyText = update.error || update.output || undefined;\n\n return partsToUpdate.map((p, i) =>\n i === idx\n ? {\n ...prev,\n data: {\n ...prev.data,\n ...(update.toolName && {toolName: update.toolName}),\n status: update.status,\n ...(bodyText ? {bodyContent: bodyText} : {}),\n },\n }\n : p,\n );\n}\n\nfunction applyThinkingAdd(\n parts: TMessageContentUnion[],\n update: {kind: 'thinking_add'; item_id: string},\n): TMessageContentUnion[] {\n return [\n ...parts,\n {\n type: 'thinking' as const,\n id: update.item_id,\n data: {\n content: '',\n status: 'thinking' as const,\n defaultExpanded: false,\n },\n },\n ];\n}\n\nfunction applyThinkingDelta(\n parts: TMessageContentUnion[],\n update: StreamEventThinkingDelta,\n): TMessageContentUnion[] | null {\n const idx = findContentPartIndex(parts, 'thinking', update.item_id);\n if (idx < 0 || parts[idx].type !== 'thinking') {\n return null;\n }\n const prev = parts[idx];\n const prevContent = prev.data.content;\n let prevText = '';\n if (typeof prevContent === 'string') {\n prevText = prevContent;\n } else if (Array.isArray(prevContent)) {\n prevText = prevContent.join('');\n }\n const newContent = prevText + update.delta;\n return parts.map((p, i) =>\n i === idx ? {...prev, data: {...prev.data, content: newContent}} : p,\n );\n}\n\nfunction applyThinkingDone(\n parts: TMessageContentUnion[],\n update: StreamEventThinkingDone,\n): TMessageContentUnion[] | null {\n const idx = findContentPartIndex(parts, 'thinking', update.item_id);\n if (idx < 0 || parts[idx].type !== 'thinking') {\n return null;\n }\n const prev = parts[idx];\n return parts.map((p, i) =>\n i === idx\n ? {\n ...prev,\n data: {\n ...prev.data,\n content: update.text,\n status: 'thought' as const,\n },\n }\n : p,\n );\n}\n"]}
1
+ {"version":3,"file":"applyContentUpdate.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/applyContentUpdate.ts"],"names":[],"mappings":"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","sourcesContent":["import type {TMessageContentUnion} from '../../../types';\n\nimport type {\n StreamEventContentUpdate,\n StreamEventTextDelta,\n StreamEventThinkingDelta,\n StreamEventThinkingDone,\n StreamEventToolAdd,\n StreamEventToolUpdate,\n} from './getStreamEventContentUpdate';\n\nfunction findContentPartIndex(\n parts: TMessageContentUnion[],\n partType: 'tool' | 'thinking',\n id: string,\n): number {\n return parts.findIndex((p) => p.type === partType && (p as {id?: string}).id === id);\n}\n\nexport function applyContentUpdate(\n parts: TMessageContentUnion[],\n update: StreamEventContentUpdate,\n): TMessageContentUnion[] | null {\n switch (update.kind) {\n case 'text_delta':\n return applyTextDelta(parts, update);\n case 'tool_add':\n return applyToolAdd(parts, update);\n case 'tool_update':\n return applyToolUpdate(parts, update);\n case 'thinking_add':\n return applyThinkingAdd(parts, update);\n case 'thinking_delta':\n return applyThinkingDelta(parts, update);\n case 'thinking_done':\n return applyThinkingDone(parts, update);\n default:\n return null;\n }\n}\n\nfunction applyTextDelta(\n parts: TMessageContentUnion[],\n update: StreamEventTextDelta,\n): TMessageContentUnion[] {\n const last = parts[parts.length - 1];\n if (last?.type === 'text') {\n return [\n ...parts.slice(0, -1),\n {type: 'text' as const, data: {text: last.data.text + update.delta}},\n ];\n }\n return [...parts, {type: 'text' as const, data: {text: update.delta}}];\n}\n\nfunction applyToolAdd(\n parts: TMessageContentUnion[],\n update: StreamEventToolAdd,\n): TMessageContentUnion[] {\n const status = update.status ?? 'loading';\n const data: {\n toolName: string;\n status: typeof status;\n headerContent?: string;\n mcpRequest?: string;\n } = {\n toolName: update.toolName,\n status,\n };\n if (update.headerContent !== undefined) {\n data.headerContent = update.headerContent;\n }\n if (update.mcpRequest !== undefined) {\n data.mcpRequest = update.mcpRequest;\n }\n return [\n ...parts,\n {\n type: 'tool' as const,\n id: update.id,\n data,\n },\n ];\n}\n\nfunction applyToolUpdate(\n parts: TMessageContentUnion[],\n update: StreamEventToolUpdate,\n): TMessageContentUnion[] {\n let idx = findContentPartIndex(parts, 'tool', update.item_id);\n let partsToUpdate = parts;\n if (idx < 0) {\n partsToUpdate = applyToolAdd(parts, {\n kind: 'tool_add',\n id: update.item_id,\n toolName: update.toolName ?? '',\n status: update.status,\n });\n idx = partsToUpdate.length - 1;\n }\n const prev = partsToUpdate[idx];\n if (prev.type !== 'tool') return partsToUpdate;\n\n const bodyText = update.error || update.output || undefined;\n\n return partsToUpdate.map((p, i) =>\n i === idx\n ? {\n ...prev,\n data: {\n ...prev.data,\n ...(update.toolName && {toolName: update.toolName}),\n status: update.status,\n ...(bodyText ? {bodyContent: bodyText} : {}),\n ...(update.mcpRequest === undefined ? {} : {mcpRequest: update.mcpRequest}),\n ...(update.mcpResponse === undefined\n ? {}\n : {mcpResponse: update.mcpResponse}),\n },\n }\n : p,\n );\n}\n\nfunction applyThinkingAdd(\n parts: TMessageContentUnion[],\n update: {kind: 'thinking_add'; item_id: string},\n): TMessageContentUnion[] {\n return [\n ...parts,\n {\n type: 'thinking' as const,\n id: update.item_id,\n data: {\n content: '',\n status: 'thinking' as const,\n defaultExpanded: false,\n },\n },\n ];\n}\n\nfunction applyThinkingDelta(\n parts: TMessageContentUnion[],\n update: StreamEventThinkingDelta,\n): TMessageContentUnion[] | null {\n const idx = findContentPartIndex(parts, 'thinking', update.item_id);\n if (idx < 0 || parts[idx].type !== 'thinking') {\n return null;\n }\n const prev = parts[idx];\n const prevContent = prev.data.content;\n let prevText = '';\n if (typeof prevContent === 'string') {\n prevText = prevContent;\n } else if (Array.isArray(prevContent)) {\n prevText = prevContent.join('');\n }\n const newContent = prevText + update.delta;\n return parts.map((p, i) =>\n i === idx ? {...prev, data: {...prev.data, content: newContent}} : p,\n );\n}\n\nfunction applyThinkingDone(\n parts: TMessageContentUnion[],\n update: StreamEventThinkingDone,\n): TMessageContentUnion[] | null {\n const idx = findContentPartIndex(parts, 'thinking', update.item_id);\n if (idx < 0 || parts[idx].type !== 'thinking') {\n return null;\n }\n const prev = parts[idx];\n return parts.map((p, i) =>\n i === idx\n ? {\n ...prev,\n data: {\n ...prev.data,\n content: update.text,\n status: 'thought' as const,\n },\n }\n : p,\n );\n}\n"]}
@@ -13,6 +13,8 @@ export type StreamEventToolAdd = {
13
13
  status?: TToolStatus;
14
14
  /** Optional payload to show in tool card (e.g. approval request arguments). */
15
15
  headerContent?: string;
16
+ /** MCP request arguments, pretty-printed JSON. Surfaced for AIStudioChat's tool renderer. */
17
+ mcpRequest?: string;
16
18
  };
17
19
  export type StreamEventToolUpdate = {
18
20
  kind: 'tool_update';
@@ -21,6 +23,10 @@ export type StreamEventToolUpdate = {
21
23
  toolName?: string;
22
24
  output?: string;
23
25
  error?: string;
26
+ /** MCP request arguments, pretty-printed JSON. */
27
+ mcpRequest?: string;
28
+ /** MCP response or error, pretty-printed JSON. */
29
+ mcpResponse?: string;
24
30
  };
25
31
  export type StreamEventThinkingAdd = {
26
32
  kind: 'thinking_add';
@@ -1,4 +1,5 @@
1
1
  import { getTextDeltaFromStreamEvent } from "./getTextDeltaFromStreamEvent.js";
2
+ import { prettyPrintJson } from "./prettyPrintJson.js";
2
3
  const TOOL_PROGRESS_EVENTS = [
3
4
  ['response.file_search_call.completed', 'success'],
4
5
  ['response.file_search_call.in_progress', 'loading'],
@@ -37,12 +38,9 @@ function addUpdateForMcpCall(item, id) {
37
38
  var _a;
38
39
  const name = typeof item.name === 'string' ? item.name : undefined;
39
40
  const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;
40
- return {
41
- kind: 'tool_add',
42
- id,
43
- toolName: (_a = name !== null && name !== void 0 ? name : serverLabel) !== null && _a !== void 0 ? _a : 'MCP',
44
- serverLabel,
45
- };
41
+ const args = typeof item.arguments === 'string' ? item.arguments : undefined;
42
+ const mcpRequest = prettyPrintJson(args);
43
+ return Object.assign({ kind: 'tool_add', id, toolName: (_a = name !== null && name !== void 0 ? name : serverLabel) !== null && _a !== void 0 ? _a : 'MCP', serverLabel }, (mcpRequest ? { mcpRequest } : {}));
46
44
  }
47
45
  function addUpdateForFunctionCall(item) {
48
46
  var _a;
@@ -123,6 +121,7 @@ function getMcpCallDoneUpdate(item) {
123
121
  const st = (_a = mcp.status) !== null && _a !== void 0 ? _a : '';
124
122
  const outputStr = typeof mcp.output === 'string' ? mcp.output : undefined;
125
123
  const errStr = typeof mcp.error === 'string' ? mcp.error : undefined;
124
+ const argsStr = typeof mcp.arguments === 'string' ? mcp.arguments : undefined;
126
125
  let status = 'loading';
127
126
  if (st === 'failed' || st === 'incomplete') {
128
127
  status = 'error';
@@ -143,14 +142,10 @@ function getMcpCallDoneUpdate(item) {
143
142
  toolName = mcp.server_label;
144
143
  else
145
144
  toolName = undefined;
146
- return {
147
- kind: 'tool_update',
148
- item_id: mcp.id,
149
- status,
150
- toolName,
151
- output: outputStr,
152
- error: errStr,
153
- };
145
+ const mcpRequest = prettyPrintJson(argsStr);
146
+ const mcpResponse = prettyPrintJson(errStr !== null && errStr !== void 0 ? errStr : outputStr);
147
+ return Object.assign(Object.assign({ kind: 'tool_update', item_id: mcp.id, status,
148
+ toolName, output: outputStr, error: errStr }, (mcpRequest ? { mcpRequest } : {})), (mcpResponse ? { mcpResponse } : {}));
154
149
  }
155
150
  function getFunctionCallDoneUpdate(item) {
156
151
  if (item.type !== 'function_call')
@@ -1 +1 @@
1
- {"version":3,"file":"getStreamEventContentUpdate.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/getStreamEventContentUpdate.ts"],"names":[],"mappings":"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","sourcesContent":["import type {TToolStatus} from '../../../types';\nimport {OpenAIStreamEventLike, OpenAIStreamOutputItemLike} from '../types/openAiTypes';\n\nimport {getTextDeltaFromStreamEvent} from './getTextDeltaFromStreamEvent';\n\ntype EventRecord = Record<string, unknown>;\n\nexport type StreamEventTextDelta = {kind: 'text_delta'; delta: string};\nexport type StreamEventToolAdd = {\n kind: 'tool_add';\n id: string;\n toolName: string;\n serverLabel?: string;\n /** Initial status; use 'waitingConfirmation' for mcp_approval_request, 'waitingSubmission' if API defines such. Default 'loading'. */\n status?: TToolStatus;\n /** Optional payload to show in tool card (e.g. approval request arguments). */\n headerContent?: string;\n};\nexport type StreamEventToolUpdate = {\n kind: 'tool_update';\n item_id: string;\n status: TToolStatus;\n toolName?: string;\n output?: string;\n error?: string;\n};\nexport type StreamEventThinkingAdd = {kind: 'thinking_add'; item_id: string};\nexport type StreamEventThinkingDelta = {kind: 'thinking_delta'; item_id: string; delta: string};\nexport type StreamEventThinkingDone = {kind: 'thinking_done'; item_id: string; text: string};\nexport type StreamEventContentUpdate =\n | StreamEventTextDelta\n | StreamEventToolAdd\n | StreamEventToolUpdate\n | StreamEventThinkingAdd\n | StreamEventThinkingDelta\n | StreamEventThinkingDone;\n\nconst TOOL_PROGRESS_EVENTS: Array<[string, TToolStatus]> = [\n ['response.file_search_call.completed', 'success'],\n ['response.file_search_call.in_progress', 'loading'],\n ['response.file_search_call.searching', 'loading'],\n ['response.web_search_call.completed', 'success'],\n ['response.web_search_call.in_progress', 'loading'],\n ['response.web_search_call.searching', 'loading'],\n ['response.code_interpreter_call.completed', 'success'],\n ['response.code_interpreter_call.in_progress', 'loading'],\n ['response.code_interpreter_call.interpreting', 'loading'],\n ['response.image_generation_call.completed', 'success'],\n ['response.image_generation_call.in_progress', 'loading'],\n ['response.image_generation_call.generating', 'loading'],\n ['response.mcp_list_tools.completed', 'success'],\n ['response.mcp_list_tools.in_progress', 'loading'],\n];\n\nfunction getReasoningUpdate(\n e: EventRecord,\n data: EventRecord | undefined,\n type: unknown,\n itemId: string,\n): StreamEventContentUpdate | null {\n if (\n type === 'response.reasoning_text.delta' ||\n type === 'response.reasoning_summary_text.delta'\n ) {\n const d = (e.delta ?? data?.delta) as string | undefined;\n return typeof d === 'string' ? {kind: 'thinking_delta', item_id: itemId, delta: d} : null;\n }\n if (\n type === 'response.reasoning_text.done' ||\n type === 'response.reasoning_summary_text.done'\n ) {\n const text = (e.text ?? data?.text) as string | undefined;\n return typeof text === 'string' ? {kind: 'thinking_done', item_id: itemId, text} : null;\n }\n return null;\n}\n\nfunction addUpdateForReasoning(\n id: string,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const effectiveId = id || (itemId ?? '');\n return effectiveId ? {kind: 'thinking_add', item_id: effectiveId} : null;\n}\n\nfunction addUpdateForMcpCall(\n item: OpenAIStreamOutputItemLike,\n id: string,\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n };\n}\n\nfunction addUpdateForFunctionCall(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n const callId = typeof item.call_id === 'string' ? item.call_id : ((item.id as string) ?? '');\n const name = typeof item.name === 'string' ? item.name : 'Tool';\n return {kind: 'tool_add', id: callId, toolName: name};\n}\n\nfunction addUpdateForMcpRequest(\n item: OpenAIStreamOutputItemLike,\n id: string,\n status: 'waitingConfirmation' | 'waitingSubmission',\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n const args = typeof item.arguments === 'string' ? item.arguments : undefined;\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n status,\n headerContent: args,\n };\n}\n\nfunction addUpdateForSimpleTool(id: string, toolName: string): StreamEventContentUpdate | null {\n return id ? {kind: 'tool_add', id, toolName} : null;\n}\n\nconst OUTPUT_ITEM_TYPE_TO_TOOL_NAME: Record<string, string> = {\n file_search_call: 'File Search',\n web_search_call: 'Web Search',\n code_interpreter_call: 'Code Interpreter',\n image_generation_call: 'Image Generation',\n mcp_list_tools: 'MCP List Tools',\n};\n\nfunction getUpdateFromOutputItemAdded(\n e: EventRecord,\n data: EventRecord | undefined,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n const id = typeof item.id === 'string' ? item.id : '';\n\n if (item.type === 'reasoning') return addUpdateForReasoning(id, itemId);\n if (item.type === 'mcp_call') return addUpdateForMcpCall(item, id);\n if (item.type === 'function_call') return addUpdateForFunctionCall(item);\n if (item.type === 'mcp_approval_request')\n return addUpdateForMcpRequest(item, id, 'waitingConfirmation');\n if (item.type === 'mcp_submission_request')\n return addUpdateForMcpRequest(item, id, 'waitingSubmission');\n\n const toolName = item.type ? OUTPUT_ITEM_TYPE_TO_TOOL_NAME[item.type] : undefined;\n if (toolName) return addUpdateForSimpleTool(id, toolName);\n\n return null;\n}\n\nfunction getReasoningDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'reasoning' || typeof item.id !== 'string') return null;\n const reasoning = item as {\n id: string;\n content?: Array<{type: string; text?: string}>;\n summary?: Array<{type: string; text?: string}>;\n };\n const texts =\n reasoning.content?.map((c) => c.text).filter((t): t is string => typeof t === 'string') ??\n reasoning.summary?.map((s) => s.text).filter((t): t is string => typeof t === 'string') ??\n [];\n const text = texts.length <= 1 ? (texts[0] ?? '') : texts.join('\\n\\n');\n return {kind: 'thinking_done', item_id: reasoning.id, text};\n}\n\nfunction mcpOutputIndicatesApplicationError(output: string | undefined): boolean {\n if (!output) return false;\n return /\\berror\\s*=\\s*[\"']true[\"']/.test(output);\n}\n\nfunction mcpTerminalToolStatus(\n errStr: string | undefined,\n outputStr: string | undefined,\n): 'success' | 'error' {\n if (errStr || mcpOutputIndicatesApplicationError(outputStr)) {\n return 'error';\n }\n return 'success';\n}\n\nfunction getMcpCallDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'mcp_call' || typeof item.id !== 'string') return null;\n const mcp = item as {\n id: string;\n name?: string;\n server_label?: string;\n status?: string;\n output?: string;\n error?: string;\n };\n const st = mcp.status ?? '';\n const outputStr = typeof mcp.output === 'string' ? mcp.output : undefined;\n const errStr = typeof mcp.error === 'string' ? mcp.error : undefined;\n\n let status: TToolStatus = 'loading';\n if (st === 'failed' || st === 'incomplete') {\n status = 'error';\n } else if (st === 'completed' || st === 'complete') {\n status = mcpTerminalToolStatus(errStr, outputStr);\n } else if (errStr) {\n status = 'error';\n } else if (outputStr !== undefined) {\n status = mcpTerminalToolStatus(errStr, outputStr);\n }\n let toolName: string | undefined;\n if (typeof mcp.name === 'string') toolName = mcp.name;\n else if (typeof mcp.server_label === 'string') toolName = mcp.server_label;\n else toolName = undefined;\n return {\n kind: 'tool_update',\n item_id: mcp.id,\n status,\n toolName,\n output: outputStr,\n error: errStr,\n };\n}\n\nfunction getFunctionCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n if (item.type !== 'function_call') return null;\n const fn = item as {\n call_id: string;\n name?: string;\n output?: string;\n result?: string;\n status?: string;\n error?: string;\n };\n const fnCallId = fn.call_id ? fn.call_id : '';\n\n if (!fnCallId) return null;\n\n let fnStatus: TToolStatus = 'loading';\n if (fn.status === 'completed') {\n fnStatus = 'success';\n } else if (fn.status === 'failed') {\n fnStatus = 'error';\n }\n\n let output: string | undefined;\n if (typeof fn.output === 'string') {\n output = fn.output;\n } else if (typeof fn.result === 'string') {\n output = fn.result;\n } else {\n output = undefined;\n }\n\n return {\n kind: 'tool_update',\n item_id: fnCallId,\n status: fnStatus,\n toolName: typeof fn.name === 'string' ? fn.name : undefined,\n output,\n error: typeof fn.error === 'string' ? fn.error : undefined,\n };\n}\n\nfunction getToolCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n toolName: string,\n): StreamEventContentUpdate | null {\n if (typeof item.id !== 'string') return null;\n const t = item as {\n id: string;\n status?: string;\n error?: string;\n output?: string;\n results?: unknown;\n };\n let status: TToolStatus = 'loading';\n if (t.status === 'completed') status = 'success';\n else if (t.status === 'failed' || t.status === 'incomplete') status = 'error';\n\n let output: string | undefined;\n if (typeof t.output === 'string') {\n output = t.output;\n } else if (typeof t.results === 'string') {\n output = t.results;\n } else if (Array.isArray(t.results)) {\n output = JSON.stringify(t.results);\n } else {\n output = undefined;\n }\n return {\n kind: 'tool_update',\n item_id: t.id,\n status,\n toolName,\n output,\n error: typeof t.error === 'string' ? t.error : undefined,\n };\n}\n\nfunction getUpdateFromOutputItemDone(\n e: EventRecord,\n data: EventRecord | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n return (\n getReasoningDoneUpdate(item) ??\n getMcpCallDoneUpdate(item) ??\n getFunctionCallDoneUpdate(item) ??\n (item.type === 'file_search_call' ? getToolCallDoneUpdate(item, 'File Search') : null) ??\n (item.type === 'web_search_call' ? getToolCallDoneUpdate(item, 'Web Search') : null) ??\n (item.type === 'code_interpreter_call'\n ? getToolCallDoneUpdate(item, 'Code Interpreter')\n : null) ??\n (item.type === 'image_generation_call'\n ? getToolCallDoneUpdate(item, 'Image Generation')\n : null) ??\n (item.type === 'mcp_list_tools' ? getToolCallDoneUpdate(item, 'MCP List Tools') : null)\n );\n}\n\n/** Stream event → content update (text delta, tool add/update, thinking add/delta/done) or null. */\n\nexport function getStreamEventContentUpdate(\n event: OpenAIStreamEventLike | null | undefined,\n): StreamEventContentUpdate | null {\n if (!event) return null;\n const e = event as EventRecord;\n const type = e.type ?? (e.data as {type?: string})?.type ?? e.event;\n const data = e.data as EventRecord | undefined;\n const itemId =\n typeof e.item_id === 'string' ? e.item_id : (data?.item_id as string | undefined);\n\n const delta = getTextDeltaFromStreamEvent(event);\n if (delta) return {kind: 'text_delta', delta};\n\n if (itemId) {\n const reasoningUpdate = getReasoningUpdate(e, data, type, itemId);\n if (reasoningUpdate) return reasoningUpdate;\n }\n\n if (type === 'response.output_item.added') {\n return getUpdateFromOutputItemAdded(e, data, itemId);\n }\n if (type === 'response.mcp_call.completed' && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: 'success'};\n }\n if (type === 'response.mcp_call.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n\n const progressMatch = TOOL_PROGRESS_EVENTS.find(([t]) => t === type);\n if (progressMatch && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: progressMatch[1]};\n }\n if (type === 'response.mcp_list_tools.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n\n if (type === 'response.output_item.done') {\n return getUpdateFromOutputItemDone(e, data);\n }\n return null;\n}\n"]}
1
+ {"version":3,"file":"getStreamEventContentUpdate.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/getStreamEventContentUpdate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,2BAA2B,EAAC,yCAAsC;AAC1E,OAAO,EAAC,eAAe,EAAC,6BAA0B;AAwClD,MAAM,oBAAoB,GAAiC;IACvD,CAAC,qCAAqC,EAAE,SAAS,CAAC;IAClD,CAAC,uCAAuC,EAAE,SAAS,CAAC;IACpD,CAAC,qCAAqC,EAAE,SAAS,CAAC;IAClD,CAAC,oCAAoC,EAAE,SAAS,CAAC;IACjD,CAAC,sCAAsC,EAAE,SAAS,CAAC;IACnD,CAAC,oCAAoC,EAAE,SAAS,CAAC;IACjD,CAAC,0CAA0C,EAAE,SAAS,CAAC;IACvD,CAAC,4CAA4C,EAAE,SAAS,CAAC;IACzD,CAAC,6CAA6C,EAAE,SAAS,CAAC;IAC1D,CAAC,0CAA0C,EAAE,SAAS,CAAC;IACvD,CAAC,4CAA4C,EAAE,SAAS,CAAC;IACzD,CAAC,2CAA2C,EAAE,SAAS,CAAC;IACxD,CAAC,mCAAmC,EAAE,SAAS,CAAC;IAChD,CAAC,qCAAqC,EAAE,SAAS,CAAC;CACrD,CAAC;AAEF,SAAS,kBAAkB,CACvB,CAAc,EACd,IAA6B,EAC7B,IAAa,EACb,MAAc;;IAEd,IACI,IAAI,KAAK,+BAA+B;QACxC,IAAI,KAAK,uCAAuC,EAClD,CAAC;QACC,MAAM,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,KAAK,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAuB,CAAC;QACzD,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,CAAC;IACD,IACI,IAAI,KAAK,8BAA8B;QACvC,IAAI,KAAK,sCAAsC,EACjD,CAAC;QACC,MAAM,IAAI,GAAG,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAuB,CAAC;QAC1D,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5F,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAC1B,EAAU,EACV,MAA0B;IAE1B,MAAM,WAAW,GAAG,EAAE,IAAI,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;IACzC,OAAO,WAAW,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CACxB,IAAgC,EAChC,EAAU;;IAEV,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,uBACI,IAAI,EAAE,UAAU,EAChB,EAAE,EACF,QAAQ,EAAE,MAAA,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,WAAW,mCAAI,KAAK,EACtC,WAAW,IACR,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACrC;AACN,CAAC;AAED,SAAS,wBAAwB,CAC7B,IAAgC;;IAEhC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAC,IAAI,CAAC,EAAa,mCAAI,EAAE,CAAC,CAAC;IAC7F,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAChE,OAAO,EAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;AAC1D,CAAC;AAED,SAAS,sBAAsB,CAC3B,IAAgC,EAChC,EAAU,EACV,MAAmD;;IAEnD,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,OAAO;QACH,IAAI,EAAE,UAAU;QAChB,EAAE;QACF,QAAQ,EAAE,MAAA,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,WAAW,mCAAI,KAAK;QACtC,WAAW;QACX,MAAM;QACN,aAAa,EAAE,IAAI;KACtB,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,EAAU,EAAE,QAAgB;IACxD,OAAO,EAAE,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,6BAA6B,GAA2B;IAC1D,gBAAgB,EAAE,aAAa;IAC/B,eAAe,EAAE,YAAY;IAC7B,qBAAqB,EAAE,kBAAkB;IACzC,qBAAqB,EAAE,kBAAkB;IACzC,cAAc,EAAE,gBAAgB;CACnC,CAAC;AAEF,SAAS,4BAA4B,CACjC,CAAc,EACd,IAA6B,EAC7B,MAA0B;;IAE1B,MAAM,IAAI,GAAG,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAmC,CAEnD,CAAC;IAChB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACzE,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB;QACpC,OAAO,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB;QACtC,OAAO,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,IAAI,QAAQ;QAAE,OAAO,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE1D,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAgC;;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1E,MAAM,SAAS,GAAG,IAIjB,CAAC;IACF,MAAM,KAAK,GACP,MAAA,MAAA,MAAA,SAAS,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,mCACvF,MAAA,SAAS,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,mCACvF,EAAE,CAAC;IACP,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,KAAK,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAC,CAAC;AAChE,CAAC;AAED,SAAS,kCAAkC,CAAC,MAA0B;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,qBAAqB,CAC1B,MAA0B,EAC1B,SAA6B;IAE7B,IAAI,MAAM,IAAI,kCAAkC,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAgC;;IAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzE,MAAM,GAAG,GAAG,IAQX,CAAC;IACF,MAAM,EAAE,GAAG,MAAA,GAAG,CAAC,MAAM,mCAAI,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,IAAI,MAAM,GAAgB,SAAS,CAAC;IACpC,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,YAAY,EAAE,CAAC;QACzC,MAAM,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,IAAI,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QACjD,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,MAAM,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;SACjD,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;;QACtE,QAAQ,GAAG,SAAS,CAAC;IAE1B,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,SAAS,CAAC,CAAC;IAEzD,qCACI,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,GAAG,CAAC,EAAE,EACf,MAAM;QACN,QAAQ,EACR,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,IACV,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAChC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAC,WAAW,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACvC;AACN,CAAC;AAED,SAAS,yBAAyB,CAC9B,IAAgC;IAEhC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,EAAE,GAAG,IAOV,CAAC;IACF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,QAAQ,GAAgB,SAAS,CAAC;IACtC,IAAI,EAAE,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5B,QAAQ,GAAG,SAAS,CAAC;IACzB,CAAC;SAAM,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,QAAQ,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,MAA0B,CAAC;IAC/B,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IACvB,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IACvB,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,OAAO;QACH,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAC3D,MAAM;QACN,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACN,CAAC;AAED,SAAS,qBAAqB,CAC1B,IAAgC,EAChC,QAAgB;IAEhB,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,CAAC,GAAG,IAMT,CAAC;IACF,IAAI,MAAM,GAAgB,SAAS,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;QAAE,MAAM,GAAG,SAAS,CAAC;SAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY;QAAE,MAAM,GAAG,OAAO,CAAC;IAE9E,IAAI,MAA0B,CAAC;IAC/B,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,CAAC;SAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;IACvB,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,SAAS,CAAC;IACvB,CAAC;IACD,OAAO;QACH,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,CAAC,CAAC,EAAE;QACb,MAAM;QACN,QAAQ;QACR,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KAC3D,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAChC,CAAc,EACd,IAA6B;;IAE7B,MAAM,IAAI,GAAG,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAmC,CAEnD,CAAC;IAChB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CACH,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,sBAAsB,CAAC,IAAI,CAAC,mCAC5B,oBAAoB,CAAC,IAAI,CAAC,mCAC1B,yBAAyB,CAAC,IAAI,CAAC,mCAC/B,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mCACtF,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mCACpF,CAAC,IAAI,CAAC,IAAI,KAAK,uBAAuB;QAClC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,mCACX,CAAC,IAAI,CAAC,IAAI,KAAK,uBAAuB;QAClC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,mCACX,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC1F,CAAC;AACN,CAAC;AAED,oGAAoG;AAEpG,MAAM,UAAU,2BAA2B,CACvC,KAA+C;;IAE/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,KAAoB,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAA,MAAA,CAAC,CAAC,IAAI,mCAAI,MAAC,CAAC,CAAC,IAAwB,0CAAE,IAAI,mCAAI,CAAC,CAAC,KAAK,CAAC;IACpE,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAC;IAC/C,MAAM,MAAM,GACR,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAA8B,CAAC;IAEtF,MAAM,KAAK,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,KAAK;QAAE,OAAO,EAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC;IAE9C,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,eAAe,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC;IAChD,CAAC;IAED,IAAI,IAAI,KAAK,4BAA4B,EAAE,CAAC;QACxC,OAAO,4BAA4B,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,KAAK,6BAA6B,IAAI,MAAM,EAAE,CAAC;QACnD,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;IACrE,CAAC;IACD,IAAI,IAAI,KAAK,0BAA0B,IAAI,MAAM,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC;IAC/E,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrE,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;QAC1B,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,KAAK,gCAAgC,IAAI,MAAM,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC;IAC/E,CAAC;IAED,IAAI,IAAI,KAAK,2BAA2B,EAAE,CAAC;QACvC,OAAO,2BAA2B,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import type {TToolStatus} from '../../../types';\nimport {OpenAIStreamEventLike, OpenAIStreamOutputItemLike} from '../types/openAiTypes';\n\nimport {getTextDeltaFromStreamEvent} from './getTextDeltaFromStreamEvent';\nimport {prettyPrintJson} from './prettyPrintJson';\n\ntype EventRecord = Record<string, unknown>;\n\nexport type StreamEventTextDelta = {kind: 'text_delta'; delta: string};\nexport type StreamEventToolAdd = {\n kind: 'tool_add';\n id: string;\n toolName: string;\n serverLabel?: string;\n /** Initial status; use 'waitingConfirmation' for mcp_approval_request, 'waitingSubmission' if API defines such. Default 'loading'. */\n status?: TToolStatus;\n /** Optional payload to show in tool card (e.g. approval request arguments). */\n headerContent?: string;\n /** MCP request arguments, pretty-printed JSON. Surfaced for AIStudioChat's tool renderer. */\n mcpRequest?: string;\n};\nexport type StreamEventToolUpdate = {\n kind: 'tool_update';\n item_id: string;\n status: TToolStatus;\n toolName?: string;\n output?: string;\n error?: string;\n /** MCP request arguments, pretty-printed JSON. */\n mcpRequest?: string;\n /** MCP response or error, pretty-printed JSON. */\n mcpResponse?: string;\n};\nexport type StreamEventThinkingAdd = {kind: 'thinking_add'; item_id: string};\nexport type StreamEventThinkingDelta = {kind: 'thinking_delta'; item_id: string; delta: string};\nexport type StreamEventThinkingDone = {kind: 'thinking_done'; item_id: string; text: string};\nexport type StreamEventContentUpdate =\n | StreamEventTextDelta\n | StreamEventToolAdd\n | StreamEventToolUpdate\n | StreamEventThinkingAdd\n | StreamEventThinkingDelta\n | StreamEventThinkingDone;\n\nconst TOOL_PROGRESS_EVENTS: Array<[string, TToolStatus]> = [\n ['response.file_search_call.completed', 'success'],\n ['response.file_search_call.in_progress', 'loading'],\n ['response.file_search_call.searching', 'loading'],\n ['response.web_search_call.completed', 'success'],\n ['response.web_search_call.in_progress', 'loading'],\n ['response.web_search_call.searching', 'loading'],\n ['response.code_interpreter_call.completed', 'success'],\n ['response.code_interpreter_call.in_progress', 'loading'],\n ['response.code_interpreter_call.interpreting', 'loading'],\n ['response.image_generation_call.completed', 'success'],\n ['response.image_generation_call.in_progress', 'loading'],\n ['response.image_generation_call.generating', 'loading'],\n ['response.mcp_list_tools.completed', 'success'],\n ['response.mcp_list_tools.in_progress', 'loading'],\n];\n\nfunction getReasoningUpdate(\n e: EventRecord,\n data: EventRecord | undefined,\n type: unknown,\n itemId: string,\n): StreamEventContentUpdate | null {\n if (\n type === 'response.reasoning_text.delta' ||\n type === 'response.reasoning_summary_text.delta'\n ) {\n const d = (e.delta ?? data?.delta) as string | undefined;\n return typeof d === 'string' ? {kind: 'thinking_delta', item_id: itemId, delta: d} : null;\n }\n if (\n type === 'response.reasoning_text.done' ||\n type === 'response.reasoning_summary_text.done'\n ) {\n const text = (e.text ?? data?.text) as string | undefined;\n return typeof text === 'string' ? {kind: 'thinking_done', item_id: itemId, text} : null;\n }\n return null;\n}\n\nfunction addUpdateForReasoning(\n id: string,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const effectiveId = id || (itemId ?? '');\n return effectiveId ? {kind: 'thinking_add', item_id: effectiveId} : null;\n}\n\nfunction addUpdateForMcpCall(\n item: OpenAIStreamOutputItemLike,\n id: string,\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n const args = typeof item.arguments === 'string' ? item.arguments : undefined;\n const mcpRequest = prettyPrintJson(args);\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n ...(mcpRequest ? {mcpRequest} : {}),\n };\n}\n\nfunction addUpdateForFunctionCall(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n const callId = typeof item.call_id === 'string' ? item.call_id : ((item.id as string) ?? '');\n const name = typeof item.name === 'string' ? item.name : 'Tool';\n return {kind: 'tool_add', id: callId, toolName: name};\n}\n\nfunction addUpdateForMcpRequest(\n item: OpenAIStreamOutputItemLike,\n id: string,\n status: 'waitingConfirmation' | 'waitingSubmission',\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n const args = typeof item.arguments === 'string' ? item.arguments : undefined;\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n status,\n headerContent: args,\n };\n}\n\nfunction addUpdateForSimpleTool(id: string, toolName: string): StreamEventContentUpdate | null {\n return id ? {kind: 'tool_add', id, toolName} : null;\n}\n\nconst OUTPUT_ITEM_TYPE_TO_TOOL_NAME: Record<string, string> = {\n file_search_call: 'File Search',\n web_search_call: 'Web Search',\n code_interpreter_call: 'Code Interpreter',\n image_generation_call: 'Image Generation',\n mcp_list_tools: 'MCP List Tools',\n};\n\nfunction getUpdateFromOutputItemAdded(\n e: EventRecord,\n data: EventRecord | undefined,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n const id = typeof item.id === 'string' ? item.id : '';\n\n if (item.type === 'reasoning') return addUpdateForReasoning(id, itemId);\n if (item.type === 'mcp_call') return addUpdateForMcpCall(item, id);\n if (item.type === 'function_call') return addUpdateForFunctionCall(item);\n if (item.type === 'mcp_approval_request')\n return addUpdateForMcpRequest(item, id, 'waitingConfirmation');\n if (item.type === 'mcp_submission_request')\n return addUpdateForMcpRequest(item, id, 'waitingSubmission');\n\n const toolName = item.type ? OUTPUT_ITEM_TYPE_TO_TOOL_NAME[item.type] : undefined;\n if (toolName) return addUpdateForSimpleTool(id, toolName);\n\n return null;\n}\n\nfunction getReasoningDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'reasoning' || typeof item.id !== 'string') return null;\n const reasoning = item as {\n id: string;\n content?: Array<{type: string; text?: string}>;\n summary?: Array<{type: string; text?: string}>;\n };\n const texts =\n reasoning.content?.map((c) => c.text).filter((t): t is string => typeof t === 'string') ??\n reasoning.summary?.map((s) => s.text).filter((t): t is string => typeof t === 'string') ??\n [];\n const text = texts.length <= 1 ? (texts[0] ?? '') : texts.join('\\n\\n');\n return {kind: 'thinking_done', item_id: reasoning.id, text};\n}\n\nfunction mcpOutputIndicatesApplicationError(output: string | undefined): boolean {\n if (!output) return false;\n return /\\berror\\s*=\\s*[\"']true[\"']/.test(output);\n}\n\nfunction mcpTerminalToolStatus(\n errStr: string | undefined,\n outputStr: string | undefined,\n): 'success' | 'error' {\n if (errStr || mcpOutputIndicatesApplicationError(outputStr)) {\n return 'error';\n }\n return 'success';\n}\n\nfunction getMcpCallDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'mcp_call' || typeof item.id !== 'string') return null;\n const mcp = item as {\n id: string;\n name?: string;\n server_label?: string;\n status?: string;\n arguments?: string;\n output?: string;\n error?: string;\n };\n const st = mcp.status ?? '';\n const outputStr = typeof mcp.output === 'string' ? mcp.output : undefined;\n const errStr = typeof mcp.error === 'string' ? mcp.error : undefined;\n const argsStr = typeof mcp.arguments === 'string' ? mcp.arguments : undefined;\n\n let status: TToolStatus = 'loading';\n if (st === 'failed' || st === 'incomplete') {\n status = 'error';\n } else if (st === 'completed' || st === 'complete') {\n status = mcpTerminalToolStatus(errStr, outputStr);\n } else if (errStr) {\n status = 'error';\n } else if (outputStr !== undefined) {\n status = mcpTerminalToolStatus(errStr, outputStr);\n }\n let toolName: string | undefined;\n if (typeof mcp.name === 'string') toolName = mcp.name;\n else if (typeof mcp.server_label === 'string') toolName = mcp.server_label;\n else toolName = undefined;\n\n const mcpRequest = prettyPrintJson(argsStr);\n const mcpResponse = prettyPrintJson(errStr ?? outputStr);\n\n return {\n kind: 'tool_update',\n item_id: mcp.id,\n status,\n toolName,\n output: outputStr,\n error: errStr,\n ...(mcpRequest ? {mcpRequest} : {}),\n ...(mcpResponse ? {mcpResponse} : {}),\n };\n}\n\nfunction getFunctionCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n if (item.type !== 'function_call') return null;\n const fn = item as {\n call_id: string;\n name?: string;\n output?: string;\n result?: string;\n status?: string;\n error?: string;\n };\n const fnCallId = fn.call_id ? fn.call_id : '';\n\n if (!fnCallId) return null;\n\n let fnStatus: TToolStatus = 'loading';\n if (fn.status === 'completed') {\n fnStatus = 'success';\n } else if (fn.status === 'failed') {\n fnStatus = 'error';\n }\n\n let output: string | undefined;\n if (typeof fn.output === 'string') {\n output = fn.output;\n } else if (typeof fn.result === 'string') {\n output = fn.result;\n } else {\n output = undefined;\n }\n\n return {\n kind: 'tool_update',\n item_id: fnCallId,\n status: fnStatus,\n toolName: typeof fn.name === 'string' ? fn.name : undefined,\n output,\n error: typeof fn.error === 'string' ? fn.error : undefined,\n };\n}\n\nfunction getToolCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n toolName: string,\n): StreamEventContentUpdate | null {\n if (typeof item.id !== 'string') return null;\n const t = item as {\n id: string;\n status?: string;\n error?: string;\n output?: string;\n results?: unknown;\n };\n let status: TToolStatus = 'loading';\n if (t.status === 'completed') status = 'success';\n else if (t.status === 'failed' || t.status === 'incomplete') status = 'error';\n\n let output: string | undefined;\n if (typeof t.output === 'string') {\n output = t.output;\n } else if (typeof t.results === 'string') {\n output = t.results;\n } else if (Array.isArray(t.results)) {\n output = JSON.stringify(t.results);\n } else {\n output = undefined;\n }\n return {\n kind: 'tool_update',\n item_id: t.id,\n status,\n toolName,\n output,\n error: typeof t.error === 'string' ? t.error : undefined,\n };\n}\n\nfunction getUpdateFromOutputItemDone(\n e: EventRecord,\n data: EventRecord | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n return (\n getReasoningDoneUpdate(item) ??\n getMcpCallDoneUpdate(item) ??\n getFunctionCallDoneUpdate(item) ??\n (item.type === 'file_search_call' ? getToolCallDoneUpdate(item, 'File Search') : null) ??\n (item.type === 'web_search_call' ? getToolCallDoneUpdate(item, 'Web Search') : null) ??\n (item.type === 'code_interpreter_call'\n ? getToolCallDoneUpdate(item, 'Code Interpreter')\n : null) ??\n (item.type === 'image_generation_call'\n ? getToolCallDoneUpdate(item, 'Image Generation')\n : null) ??\n (item.type === 'mcp_list_tools' ? getToolCallDoneUpdate(item, 'MCP List Tools') : null)\n );\n}\n\n/** Stream event → content update (text delta, tool add/update, thinking add/delta/done) or null. */\n\nexport function getStreamEventContentUpdate(\n event: OpenAIStreamEventLike | null | undefined,\n): StreamEventContentUpdate | null {\n if (!event) return null;\n const e = event as EventRecord;\n const type = e.type ?? (e.data as {type?: string})?.type ?? e.event;\n const data = e.data as EventRecord | undefined;\n const itemId =\n typeof e.item_id === 'string' ? e.item_id : (data?.item_id as string | undefined);\n\n const delta = getTextDeltaFromStreamEvent(event);\n if (delta) return {kind: 'text_delta', delta};\n\n if (itemId) {\n const reasoningUpdate = getReasoningUpdate(e, data, type, itemId);\n if (reasoningUpdate) return reasoningUpdate;\n }\n\n if (type === 'response.output_item.added') {\n return getUpdateFromOutputItemAdded(e, data, itemId);\n }\n if (type === 'response.mcp_call.completed' && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: 'success'};\n }\n if (type === 'response.mcp_call.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n\n const progressMatch = TOOL_PROGRESS_EVENTS.find(([t]) => t === type);\n if (progressMatch && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: progressMatch[1]};\n }\n if (type === 'response.mcp_list_tools.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n\n if (type === 'response.output_item.done') {\n return getUpdateFromOutputItemDone(e, data);\n }\n return null;\n}\n"]}