@sqlrooms/ai-core 0.26.1-rc.1 → 0.26.1-rc.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AiSlice.d.ts +1 -1
- package/dist/AiSlice.d.ts.map +1 -1
- package/dist/AiSlice.js.map +1 -1
- package/dist/chatTransport.d.ts +6 -6
- package/dist/chatTransport.d.ts.map +1 -1
- package/dist/chatTransport.js +1 -1
- package/dist/chatTransport.js.map +1 -1
- package/dist/components/AnalysisAnswer.d.ts.map +1 -1
- package/dist/components/AnalysisAnswer.js +0 -1
- package/dist/components/AnalysisAnswer.js.map +1 -1
- package/dist/components/SessionControls.d.ts +1 -1
- package/dist/components/SessionControls.d.ts.map +1 -1
- package/dist/components/SessionControls.js +77 -5
- package/dist/components/SessionControls.js.map +1 -1
- package/dist/components/ToolPartRenderer.d.ts.map +1 -1
- package/dist/components/ToolPartRenderer.js +3 -2
- package/dist/components/ToolPartRenderer.js.map +1 -1
- package/dist/components/session/RenameSessionDialog.d.ts +13 -0
- package/dist/components/session/RenameSessionDialog.d.ts.map +1 -0
- package/dist/components/session/RenameSessionDialog.js +33 -0
- package/dist/components/session/RenameSessionDialog.js.map +1 -0
- package/dist/components/session/index.d.ts +7 -6
- package/dist/components/session/index.d.ts.map +1 -1
- package/dist/components/session/index.js +6 -6
- package/dist/components/session/index.js.map +1 -1
- package/dist/components/tools/ToolResult.d.ts.map +1 -1
- package/dist/components/tools/ToolResult.js +4 -1
- package/dist/components/tools/ToolResult.js.map +1 -1
- package/dist/hooks/useAiChat.d.ts +12 -35
- package/dist/hooks/useAiChat.d.ts.map +1 -1
- package/dist/hooks/useAiChat.js +1 -0
- package/dist/hooks/useAiChat.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +11 -12
package/dist/AiSlice.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { type StateCreator } from '@sqlrooms/room-store';
|
|
|
3
3
|
import { UIMessage, DefaultChatTransport, LanguageModel, UITools, ChatOnDataCallback, UIDataTypes } from 'ai';
|
|
4
4
|
import { ToolCall } from './chatTransport';
|
|
5
5
|
import { OpenAssistantToolSet } from '@openassistant/utils';
|
|
6
|
-
import { AddToolResult } from './
|
|
6
|
+
import { AddToolResult } from './types';
|
|
7
7
|
type ExtendedChatOnToolCallCallback = (args: {
|
|
8
8
|
toolCall: ToolCall;
|
|
9
9
|
addToolResult?: AddToolResult;
|
package/dist/AiSlice.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,WAAW,EAEZ,MAAM,IAAI,CAAC;AACZ,OAAO,EAIL,QAAQ,EAGT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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"}
|
package/dist/AiSlice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiSlice.js","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceConfig,\n AnalysisResultSchema,\n AnalysisSessionSchema,\n createDefaultAiConfig,\n} from '@sqlrooms/ai-config';\nimport {\n createSlice,\n useBaseRoomStore,\n type StateCreator,\n} from '@sqlrooms/room-store';\nimport {produce} from 'immer';\nimport {\n UIMessage,\n DefaultChatTransport,\n LanguageModel,\n UITools,\n ChatOnDataCallback,\n UIDataTypes,\n generateText,\n} from 'ai';\nimport {\n createChatHandlers,\n createLocalChatTransportFactory,\n createRemoteChatTransportFactory,\n ToolCall,\n convertToAiSDKTools,\n completeIncompleteToolCalls,\n} from './chatTransport';\nimport {hasAiSettingsConfig} from './hasAiSettingsConfig';\nimport {OpenAssistantToolSet} from '@openassistant/utils';\nimport {AddToolResult} from './hooks/useAiChat';\nimport {cleanupPendingAnalysisResults} from './utils';\nimport {createOpenAICompatible} from '@ai-sdk/openai-compatible';\n\n// Custom type for onChatToolCall that includes addToolResult\ntype ExtendedChatOnToolCallCallback = (args: {\n toolCall: ToolCall;\n addToolResult?: AddToolResult;\n}) => Promise<void> | void;\n\nexport type AiSliceState = {\n ai: {\n config: AiSliceConfig;\n analysisPrompt: string;\n isRunningAnalysis: boolean;\n promptSuggestionsVisible: boolean;\n tools: OpenAssistantToolSet;\n analysisAbortController?: AbortController;\n setConfig: (config: AiSliceConfig) => void;\n setPromptSuggestionsVisible: (visible: boolean) => void;\n /** Latest stop function from useChat to immediately halt local streaming */\n chatStop?: () => void;\n /** Register/replace the current chat stop function */\n setChatStop: (stop: (() => void) | undefined) => void;\n /** Latest sendMessage function from useChat to send messages */\n chatSendMessage?: (message: {text: string}) => void;\n /** Register/replace the current chat sendMessage function */\n setChatSendMessage: (\n sendMessage: ((message: {text: string}) => void) | undefined,\n ) => void;\n /** Latest addToolResult function from useChat to add tool results */\n addToolResult?: AddToolResult;\n /** Register/replace the current addToolResult function */\n setAddToolResult: (addToolResult: AddToolResult | undefined) => void;\n /** Wait for a tool result to be added by UI component */\n waitForToolResult: (\n toolCallId: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n setAnalysisPrompt: (prompt: string) => void;\n addAnalysisResult: (message: UIMessage) => void;\n sendPrompt: (\n prompt: string,\n options?: {\n systemInstructions?: string;\n modelProvider?: string;\n modelName?: string;\n baseUrl?: string;\n abortSignal?: AbortSignal;\n useTools?: boolean;\n },\n ) => Promise<string>;\n startAnalysis: (\n sendMessage: (message: {text: string}) => void,\n ) => Promise<void>;\n cancelAnalysis: () => void;\n setAiModel: (modelProvider: string, model: string) => void;\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => void;\n switchSession: (sessionId: string) => void;\n renameSession: (sessionId: string, name: string) => void;\n deleteSession: (sessionId: string) => void;\n getCurrentSession: () => AnalysisSessionSchema | undefined;\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => void;\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => void;\n getAnalysisResults: () => AnalysisResultSchema[];\n deleteAnalysisResult: (sessionId: string, resultId: string) => void;\n getAssistantMessageParts: (analysisResultId: string) => UIMessage['parts'];\n findToolComponent: (toolName: string) => React.ComponentType | undefined;\n getApiKeyFromSettings: () => string;\n getBaseUrlFromSettings: () => string | undefined;\n getMaxStepsFromSettings: () => number;\n getFullInstructions: () => string;\n // Chat transport for useChat hook\n getLocalChatTransport: () => DefaultChatTransport<UIMessage>;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint: string;\n chatHeaders: Record<string, string>;\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) => DefaultChatTransport<UIMessage>;\n onChatToolCall: ExtendedChatOnToolCallCallback;\n onChatData: ChatOnDataCallback<UIMessage<unknown, UIDataTypes, UITools>>;\n onChatFinish: (args: {\n message: UIMessage;\n messages: UIMessage[];\n isError?: boolean;\n }) => void;\n onChatError: (error: unknown) => void;\n };\n};\n\n/**\n * Configuration options for creating an AI slice\n */\nexport interface AiSliceOptions {\n config?: Partial<AiSliceConfig>;\n /** Initial prompt to display in the analysis input */\n initialAnalysisPrompt?: string;\n /** Tools to add to the AI assistant */\n tools: OpenAssistantToolSet;\n\n /**\n * Function to get custom instructions for the AI assistant\n * @returns The instructions string to use\n */\n getInstructions: () => string;\n defaultProvider?: string;\n defaultModel?: string;\n /** Provide a pre-configured model client for a provider (e.g., Azure). */\n getCustomModel?: () => LanguageModel | undefined;\n maxSteps?: number;\n getApiKey?: (modelProvider: string) => string;\n getBaseUrl?: () => string;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint?: string;\n /** Optional headers to send with remote endpoint */\n chatHeaders?: Record<string, string>;\n}\n\nexport function createAiSlice(\n params: AiSliceOptions,\n): StateCreator<AiSliceState> {\n const {\n initialAnalysisPrompt = '',\n tools,\n getApiKey,\n getBaseUrl,\n maxSteps = 50,\n getInstructions,\n defaultProvider = 'openai',\n defaultModel = 'gpt-4.1',\n getCustomModel,\n chatEndPoint = '',\n chatHeaders = {},\n } = params;\n\n return createSlice<AiSliceState>((set, get, store) => {\n // Clean up pending analysis results from persisted config\n const cleanedConfig = params.config?.sessions\n ? {\n ...params.config,\n sessions: params.config.sessions.map((session) => {\n const cleaned = cleanupPendingAnalysisResults(session);\n const completedUiMessages = Array.isArray(cleaned.uiMessages)\n ? completeIncompleteToolCalls(\n (cleaned.uiMessages as unknown as UIMessage[]) || [],\n )\n : [];\n return {\n ...cleaned,\n uiMessages:\n completedUiMessages as unknown as AnalysisSessionSchema['uiMessages'],\n };\n }),\n }\n : params.config;\n\n // Create a persistent Map for pending tool call resolvers (outside of immer draft)\n const pendingToolCallResolvers = new Map<\n string,\n {resolve: () => void; reject: (error: Error) => void}\n >();\n\n return {\n ai: {\n config: createDefaultAiConfig(cleanedConfig),\n analysisPrompt: initialAnalysisPrompt,\n isRunningAnalysis: false,\n promptSuggestionsVisible: true,\n tools,\n waitForToolResult: (toolCallId: string, abortSignal?: AbortSignal) => {\n return new Promise<void>((resolve, reject) => {\n // Set up abort handler\n const abortHandler = () => {\n const resolver = pendingToolCallResolvers.get(toolCallId);\n if (resolver) {\n pendingToolCallResolvers.delete(toolCallId);\n resolver.reject(new Error('Tool call cancelled by user'));\n }\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n reject(new Error('Tool call cancelled by user'));\n return;\n }\n abortSignal.addEventListener('abort', abortHandler, {once: true});\n }\n\n // Store resolver (overwrites any existing one, which is fine for our use case)\n pendingToolCallResolvers.set(toolCallId, {\n resolve: () => {\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler);\n }\n pendingToolCallResolvers.delete(toolCallId);\n resolve();\n },\n reject: (error: Error) => {\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler);\n }\n pendingToolCallResolvers.delete(toolCallId);\n reject(error);\n },\n });\n });\n },\n setChatStop: (stopFn: (() => void) | undefined) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.chatStop = stopFn;\n }),\n );\n },\n\n setConfig: (config: AiSliceConfig) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.config = config;\n }),\n );\n },\n\n setPromptSuggestionsVisible: (visible: boolean) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.promptSuggestionsVisible = visible;\n }),\n );\n },\n\n setChatSendMessage: (\n sendMessageFn: ((message: {text: string}) => void) | undefined,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.chatSendMessage = sendMessageFn;\n }),\n );\n },\n\n setAddToolResult: (addToolResultFn: AddToolResult | undefined) => {\n // Wrap addToolResult to intercept calls and resolve pending promises\n const wrappedAddToolResult: AddToolResult | undefined =\n addToolResultFn\n ? (options) => {\n // Call the original addToolResult\n addToolResultFn(options);\n\n // Resolve the promise if there's a pending waiter for this toolCallId\n const resolver = pendingToolCallResolvers.get(\n options.toolCallId,\n );\n if (resolver) {\n resolver.resolve();\n }\n }\n : undefined;\n\n set((state) =>\n produce(state, (draft) => {\n draft.ai.addToolResult = wrappedAddToolResult;\n }),\n );\n },\n\n setAnalysisPrompt: (prompt: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisPrompt = prompt;\n }),\n );\n },\n\n /**\n * Set the AI model for the current session\n * @param model - The model to set\n */\n setAiModel: (modelProvider: string, model: string) => {\n set((state) =>\n produce(state, (draft) => {\n const currentSession = getCurrentSessionFromState(draft);\n if (currentSession) {\n currentSession.modelProvider = modelProvider;\n currentSession.model = model;\n }\n }),\n );\n },\n\n /**\n * Get the current active session\n */\n getCurrentSession: () => {\n const state = get();\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n },\n\n /**\n * Create a new session with the given name and model settings\n */\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => {\n const currentSession = get().ai.getCurrentSession();\n const newSessionId = createId();\n\n // Generate a default name if none is provided\n let sessionName = name;\n if (!sessionName) {\n // Generate a human-readable date and time for the session name\n const now = new Date();\n const formattedDate = now.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n const formattedTime = now.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n });\n sessionName = `Session ${formattedDate} at ${formattedTime}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n // Add to AI sessions\n draft.ai.config.sessions.unshift({\n id: newSessionId,\n name: sessionName,\n modelProvider:\n modelProvider || currentSession?.modelProvider || 'openai',\n model: model || currentSession?.model || 'gpt-4.1',\n analysisResults: [],\n createdAt: new Date(),\n uiMessages: [],\n toolAdditionalData: {},\n messagesRevision: 0,\n });\n draft.ai.config.currentSessionId = newSessionId;\n }),\n );\n },\n\n /**\n * Switch to a different session\n */\n switchSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.config.currentSessionId = sessionId;\n }),\n );\n },\n\n /**\n * Rename an existing session\n */\n renameSession: (sessionId: string, name: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.name = name;\n }\n }),\n );\n },\n\n /**\n * Delete a session\n */\n deleteSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const sessionIndex = draft.ai.config.sessions.findIndex(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (sessionIndex !== -1) {\n // Don't delete the last session\n if (draft.ai.config.sessions.length > 1) {\n draft.ai.config.sessions.splice(sessionIndex, 1);\n // If we deleted the current session, switch to another one\n if (draft.ai.config.currentSessionId === sessionId) {\n // Make sure there's at least one session before accessing its id\n if (draft.ai.config.sessions.length > 0) {\n const firstSession = draft.ai.config.sessions[0];\n if (firstSession) {\n draft.ai.config.currentSessionId = firstSession.id;\n }\n }\n }\n }\n }\n }),\n );\n },\n\n /**\n * Save the Ai SDK UI messages for a session\n */\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n // store the latest UI messages from the chat hook\n // Create a deep copy to avoid read-only property issues\n session.uiMessages = JSON.parse(JSON.stringify(uiMessages));\n }\n }),\n );\n },\n\n /**\n * Save additional data for a session\n */\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s) => s.id === sessionId,\n );\n if (session) {\n if (!session.toolAdditionalData) {\n session.toolAdditionalData = {};\n }\n session.toolAdditionalData[toolCallId] = additionalData;\n }\n }),\n );\n },\n\n findToolComponent: (toolName: string) => {\n return get().ai.tools[toolName]?.component as React.ComponentType;\n },\n\n getBaseUrlFromSettings: () => {\n // First try the getBaseUrl function if provided\n const baseUrlFromFunction = getBaseUrl?.();\n if (baseUrlFromFunction) {\n return baseUrlFromFunction;\n }\n\n // Fall back to settings\n const store = get();\n if (hasAiSettingsConfig(store)) {\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.baseUrl;\n }\n const provider =\n store.aiSettings.config.providers[currentSession.modelProvider];\n return provider?.baseUrl;\n }\n }\n return undefined;\n },\n\n getApiKeyFromSettings: () => {\n const store = get();\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n // First try the getApiKey function if provided\n const apiKeyFromFunction = getApiKey?.(\n currentSession.modelProvider || 'openai',\n );\n if (apiKeyFromFunction) {\n return apiKeyFromFunction;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.apiKey || '';\n } else {\n const provider =\n store.aiSettings.config.providers?.[\n currentSession.modelProvider\n ];\n return provider?.apiKey || '';\n }\n }\n }\n return '';\n },\n\n getMaxStepsFromSettings: () => {\n const store = get();\n // First try the maxSteps parameter if provided\n if (maxSteps && Number.isFinite(maxSteps) && maxSteps > 0) {\n return maxSteps;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n const settingsMaxSteps =\n store.aiSettings.config.modelParameters.maxSteps;\n if (Number.isFinite(settingsMaxSteps) && settingsMaxSteps > 0) {\n return settingsMaxSteps;\n }\n }\n return 50;\n },\n\n getFullInstructions: () => {\n const store = get();\n\n let instructions = getInstructions();\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n // get additional instructions from settings\n const {additionalInstruction} =\n store.aiSettings.config.modelParameters;\n if (additionalInstruction) {\n instructions = `${instructions}\\n\\nAdditional Instructions:\\n\\n${additionalInstruction}`;\n }\n }\n return instructions;\n },\n\n sendPrompt: async (\n prompt: string,\n options: {\n systemInstructions?: string;\n modelProvider?: string;\n modelName?: string;\n baseUrl?: string;\n useTools?: boolean;\n abortSignal?: AbortSignal;\n } = {},\n ) => {\n // One-shot generateText path with explicit abort lifecycle management\n const state = get();\n const currentSession = state.ai.getCurrentSession();\n const {\n systemInstructions,\n modelProvider,\n modelName,\n baseUrl,\n abortSignal,\n useTools = false,\n } = options;\n const provider =\n modelProvider || currentSession?.modelProvider || defaultProvider;\n const modelId = modelName || currentSession?.model || defaultModel;\n const baseURL =\n baseUrl ||\n state.ai.getBaseUrlFromSettings() ||\n 'https://api.openai.com/v1';\n const tools = state.ai.tools;\n\n // remove execute from tools\n const toolsWithoutExecute = Object.fromEntries(\n Object.entries(tools).filter(([, tool]) => !tool.execute),\n );\n\n const model = createOpenAICompatible({\n apiKey: state.ai.getApiKeyFromSettings(),\n name: provider,\n baseURL,\n }).chatModel(modelId);\n\n try {\n const response = await generateText({\n model,\n messages: [{role: 'user', content: prompt}],\n system: systemInstructions || state.ai.getFullInstructions(),\n abortSignal: abortSignal,\n ...(useTools\n ? {tools: convertToAiSDKTools(toolsWithoutExecute)}\n : {}),\n });\n return response.text;\n } catch (error) {\n console.error('Error generating text:', error);\n return 'error: can not generate response';\n }\n },\n\n /**\n * Start the analysis\n * TODO: how to pass the history analysisResults?\n */\n startAnalysis: async (\n sendMessage: (message: {text: string}) => void,\n ) => {\n const abortController = new AbortController();\n const currentSession = get().ai.getCurrentSession();\n\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n\n const promptText = get().ai.analysisPrompt;\n\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisAbortController = abortController;\n draft.ai.isRunningAnalysis = true;\n draft.ai.analysisPrompt = '';\n draft.ai.promptSuggestionsVisible = false;\n\n // Add incomplete analysis result to session immediately for instant UI rendering\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSession.id,\n );\n if (session) {\n // Remove any existing pending results (safety check for page refresh scenarios)\n session.analysisResults = session.analysisResults.filter(\n (result: AnalysisResultSchema) => result.id !== '__pending__',\n );\n\n // Add incomplete analysis result with a temporary ID\n // This will be updated in onChatFinish with the actual user message ID\n session.analysisResults.push({\n id: '__pending__',\n prompt: promptText,\n isCompleted: false,\n });\n }\n }),\n );\n\n // The pending analysis result will be updated in onChatFinish with the correct message ID\n sendMessage({text: promptText});\n },\n\n cancelAnalysis: () => {\n const abortController = get().ai.analysisAbortController;\n\n // Stop local chat streaming immediately if available\n try {\n get().ai.chatStop?.();\n } catch {\n // no-op\n }\n\n // Call abort to signal cancellation\n // Keep the abort controller in state so that async handlers (onChatToolCall, onChatFinish)\n // can check if it was aborted. The onChatFinish handler will clean it up.\n abortController?.abort('Analysis cancelled');\n\n set((state) =>\n produce(state, (draft) => {\n // Set isRunningAnalysis to false to update UI\n draft.ai.isRunningAnalysis = false;\n // Keep analysisAbortController so handlers can check signal.aborted\n // It will be cleared by onChatFinish\n\n // Intentionally preserve any pending analysis result so the\n // conversation row remains visible until onChatFinish runs.\n }),\n );\n },\n\n /**\n * Get the assistant message parts for a given analysis result ID\n * @param analysisResultId - The ID of the analysis result (user message ID)\n * @returns Array of message parts from the assistant's response\n */\n getAssistantMessageParts: (analysisResultId: string) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n const uiMessages = currentSession.uiMessages as UIMessage[];\n // Find the user message with analysisResultId\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === analysisResultId && msg.role === 'user',\n );\n if (userMessageIndex === -1) return [];\n\n // Find the next assistant message after this user message\n for (let i = userMessageIndex + 1; i < uiMessages.length; i++) {\n const msg = uiMessages[i];\n if (msg?.role === 'assistant') {\n return msg.parts;\n }\n if (msg?.role === 'user') {\n // Hit next user message without finding assistant response\n break;\n }\n }\n return [];\n },\n\n /**\n * Delete an analysis result from a session\n * - remove the corresponding prompt-response pair from uiMessages\n * - remove the associated toolAdditionalData\n */\n deleteAnalysisResult: (sessionId: string, resultId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.analysisResults = session.analysisResults.filter(\n (r: AnalysisResultSchema) => r.id !== resultId,\n );\n // Remove corresponding prompt-response pair from uiMessages\n const uiMessages = session.uiMessages as UIMessage[];\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === resultId && msg.role === 'user',\n );\n\n if (userMessageIndex !== -1) {\n // Find the next user message (or end of array) to determine response boundary\n let nextUserIndex = userMessageIndex + 1;\n const toolCallIdsToDelete: Set<string> = new Set();\n\n while (\n nextUserIndex < uiMessages.length &&\n uiMessages[nextUserIndex]?.role !== 'user'\n ) {\n const msg = uiMessages[nextUserIndex];\n // Extract toolCallId from message parts\n if (msg?.parts) {\n for (const part of msg.parts) {\n // Check for tool-* or dynamic-tool parts that have toolCallId\n if (\n 'toolCallId' in part &&\n typeof part.toolCallId === 'string'\n ) {\n toolCallIdsToDelete.add(part.toolCallId);\n }\n }\n }\n nextUserIndex++;\n }\n\n // Remove the user message and all assistant messages until the next user message\n session.uiMessages.splice(\n userMessageIndex,\n nextUserIndex - userMessageIndex,\n );\n\n // Increment messagesRevision to force useChat reset\n session.messagesRevision =\n (session.messagesRevision || 0) + 1;\n\n // Clean up toolAdditionalData for deleted messages\n if (session.toolAdditionalData) {\n // Remove data keyed by the toolCallId from the deleted messages\n toolCallIdsToDelete.forEach((toolCallId) => {\n if (session.toolAdditionalData![toolCallId]) {\n delete session.toolAdditionalData![toolCallId];\n }\n });\n }\n }\n }\n }),\n );\n },\n\n /**\n * Get analysis results for the current session by transforming UI messages\n * into structured analysis results (user prompt → AI response pairs).\n *\n * @returns Array of analysis results for the current session\n */\n getAnalysisResults: (): AnalysisResultSchema[] => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n return currentSession.analysisResults;\n },\n\n /**\n * Add an analysis result to the current session\n * - add the message to the uiMessages\n * - add the analysis result to the analysisResults\n */\n addAnalysisResult: (message: UIMessage) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n set((state) =>\n produce(state, (draft) => {\n // Extract text content from message parts\n const textContent =\n message.parts\n ?.filter((part) => part.type === 'text')\n ?.map((part) => (part as {text: string}).text)\n ?.join('') || '';\n\n draft.ai.config.sessions\n .find((s: AnalysisSessionSchema) => s.id === currentSession?.id)\n ?.analysisResults.push({\n id: message.id,\n prompt: textContent,\n isCompleted: true,\n });\n }),\n );\n },\n\n // Chat transport configuration\n chatEndPoint,\n chatHeaders,\n\n getLocalChatTransport: () => {\n const state = get();\n return createLocalChatTransportFactory({\n store,\n defaultProvider: defaultProvider,\n defaultModel: defaultModel,\n apiKey: state.ai.getApiKeyFromSettings(),\n baseUrl: state.ai.getBaseUrlFromSettings(),\n getInstructions: () => store.getState().ai.getFullInstructions(),\n getCustomModel,\n })();\n },\n\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) =>\n createRemoteChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n })(endpoint, headers),\n\n ...createChatHandlers({store}),\n },\n };\n });\n}\n\n/**\n * Helper function to get the current session from state\n */\nfunction getCurrentSessionFromState(\n state: AiSliceState,\n): AnalysisSessionSchema | undefined {\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n}\n\nexport function useStoreWithAi<T>(selector: (state: AiSliceState) => T): T {\n return useBaseRoomStore<AiSliceState, T>((state) => selector(state));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AiSlice.js","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceConfig,\n AnalysisResultSchema,\n AnalysisSessionSchema,\n createDefaultAiConfig,\n} from '@sqlrooms/ai-config';\nimport {\n createSlice,\n useBaseRoomStore,\n type StateCreator,\n} from '@sqlrooms/room-store';\nimport {produce} from 'immer';\nimport {\n UIMessage,\n DefaultChatTransport,\n LanguageModel,\n UITools,\n ChatOnDataCallback,\n UIDataTypes,\n generateText,\n} from 'ai';\nimport {\n createChatHandlers,\n createLocalChatTransportFactory,\n createRemoteChatTransportFactory,\n ToolCall,\n convertToAiSDKTools,\n completeIncompleteToolCalls,\n} from './chatTransport';\nimport {hasAiSettingsConfig} from './hasAiSettingsConfig';\nimport {OpenAssistantToolSet} from '@openassistant/utils';\nimport {AddToolResult} from './types';\nimport {cleanupPendingAnalysisResults} from './utils';\nimport {createOpenAICompatible} from '@ai-sdk/openai-compatible';\n\n// Custom type for onChatToolCall that includes addToolResult\ntype ExtendedChatOnToolCallCallback = (args: {\n toolCall: ToolCall;\n addToolResult?: AddToolResult;\n}) => Promise<void> | void;\n\nexport type AiSliceState = {\n ai: {\n config: AiSliceConfig;\n analysisPrompt: string;\n isRunningAnalysis: boolean;\n promptSuggestionsVisible: boolean;\n tools: OpenAssistantToolSet;\n analysisAbortController?: AbortController;\n setConfig: (config: AiSliceConfig) => void;\n setPromptSuggestionsVisible: (visible: boolean) => void;\n /** Latest stop function from useChat to immediately halt local streaming */\n chatStop?: () => void;\n /** Register/replace the current chat stop function */\n setChatStop: (stop: (() => void) | undefined) => void;\n /** Latest sendMessage function from useChat to send messages */\n chatSendMessage?: (message: {text: string}) => void;\n /** Register/replace the current chat sendMessage function */\n setChatSendMessage: (\n sendMessage: ((message: {text: string}) => void) | undefined,\n ) => void;\n /** Latest addToolResult function from useChat to add tool results */\n addToolResult?: AddToolResult;\n /** Register/replace the current addToolResult function */\n setAddToolResult: (addToolResult: AddToolResult | undefined) => void;\n /** Wait for a tool result to be added by UI component */\n waitForToolResult: (\n toolCallId: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n setAnalysisPrompt: (prompt: string) => void;\n addAnalysisResult: (message: UIMessage) => void;\n sendPrompt: (\n prompt: string,\n options?: {\n systemInstructions?: string;\n modelProvider?: string;\n modelName?: string;\n baseUrl?: string;\n abortSignal?: AbortSignal;\n useTools?: boolean;\n },\n ) => Promise<string>;\n startAnalysis: (\n sendMessage: (message: {text: string}) => void,\n ) => Promise<void>;\n cancelAnalysis: () => void;\n setAiModel: (modelProvider: string, model: string) => void;\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => void;\n switchSession: (sessionId: string) => void;\n renameSession: (sessionId: string, name: string) => void;\n deleteSession: (sessionId: string) => void;\n getCurrentSession: () => AnalysisSessionSchema | undefined;\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => void;\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => void;\n getAnalysisResults: () => AnalysisResultSchema[];\n deleteAnalysisResult: (sessionId: string, resultId: string) => void;\n getAssistantMessageParts: (analysisResultId: string) => UIMessage['parts'];\n findToolComponent: (toolName: string) => React.ComponentType | undefined;\n getApiKeyFromSettings: () => string;\n getBaseUrlFromSettings: () => string | undefined;\n getMaxStepsFromSettings: () => number;\n getFullInstructions: () => string;\n // Chat transport for useChat hook\n getLocalChatTransport: () => DefaultChatTransport<UIMessage>;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint: string;\n chatHeaders: Record<string, string>;\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) => DefaultChatTransport<UIMessage>;\n onChatToolCall: ExtendedChatOnToolCallCallback;\n onChatData: ChatOnDataCallback<UIMessage<unknown, UIDataTypes, UITools>>;\n onChatFinish: (args: {\n message: UIMessage;\n messages: UIMessage[];\n isError?: boolean;\n }) => void;\n onChatError: (error: unknown) => void;\n };\n};\n\n/**\n * Configuration options for creating an AI slice\n */\nexport interface AiSliceOptions {\n config?: Partial<AiSliceConfig>;\n /** Initial prompt to display in the analysis input */\n initialAnalysisPrompt?: string;\n /** Tools to add to the AI assistant */\n tools: OpenAssistantToolSet;\n\n /**\n * Function to get custom instructions for the AI assistant\n * @returns The instructions string to use\n */\n getInstructions: () => string;\n defaultProvider?: string;\n defaultModel?: string;\n /** Provide a pre-configured model client for a provider (e.g., Azure). */\n getCustomModel?: () => LanguageModel | undefined;\n maxSteps?: number;\n getApiKey?: (modelProvider: string) => string;\n getBaseUrl?: () => string;\n /** Optional remote endpoint to use for chat; if empty, local transport is used */\n chatEndPoint?: string;\n /** Optional headers to send with remote endpoint */\n chatHeaders?: Record<string, string>;\n}\n\nexport function createAiSlice(\n params: AiSliceOptions,\n): StateCreator<AiSliceState> {\n const {\n initialAnalysisPrompt = '',\n tools,\n getApiKey,\n getBaseUrl,\n maxSteps = 50,\n getInstructions,\n defaultProvider = 'openai',\n defaultModel = 'gpt-4.1',\n getCustomModel,\n chatEndPoint = '',\n chatHeaders = {},\n } = params;\n\n return createSlice<AiSliceState>((set, get, store) => {\n // Clean up pending analysis results from persisted config\n const cleanedConfig = params.config?.sessions\n ? {\n ...params.config,\n sessions: params.config.sessions.map((session) => {\n const cleaned = cleanupPendingAnalysisResults(session);\n const completedUiMessages = Array.isArray(cleaned.uiMessages)\n ? completeIncompleteToolCalls(\n (cleaned.uiMessages as unknown as UIMessage[]) || [],\n )\n : [];\n return {\n ...cleaned,\n uiMessages:\n completedUiMessages as unknown as AnalysisSessionSchema['uiMessages'],\n };\n }),\n }\n : params.config;\n\n // Create a persistent Map for pending tool call resolvers (outside of immer draft)\n const pendingToolCallResolvers = new Map<\n string,\n {resolve: () => void; reject: (error: Error) => void}\n >();\n\n return {\n ai: {\n config: createDefaultAiConfig(cleanedConfig),\n analysisPrompt: initialAnalysisPrompt,\n isRunningAnalysis: false,\n promptSuggestionsVisible: true,\n tools,\n waitForToolResult: (toolCallId: string, abortSignal?: AbortSignal) => {\n return new Promise<void>((resolve, reject) => {\n // Set up abort handler\n const abortHandler = () => {\n const resolver = pendingToolCallResolvers.get(toolCallId);\n if (resolver) {\n pendingToolCallResolvers.delete(toolCallId);\n resolver.reject(new Error('Tool call cancelled by user'));\n }\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n reject(new Error('Tool call cancelled by user'));\n return;\n }\n abortSignal.addEventListener('abort', abortHandler, {once: true});\n }\n\n // Store resolver (overwrites any existing one, which is fine for our use case)\n pendingToolCallResolvers.set(toolCallId, {\n resolve: () => {\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler);\n }\n pendingToolCallResolvers.delete(toolCallId);\n resolve();\n },\n reject: (error: Error) => {\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler);\n }\n pendingToolCallResolvers.delete(toolCallId);\n reject(error);\n },\n });\n });\n },\n setChatStop: (stopFn: (() => void) | undefined) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.chatStop = stopFn;\n }),\n );\n },\n\n setConfig: (config: AiSliceConfig) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.config = config;\n }),\n );\n },\n\n setPromptSuggestionsVisible: (visible: boolean) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.promptSuggestionsVisible = visible;\n }),\n );\n },\n\n setChatSendMessage: (\n sendMessageFn: ((message: {text: string}) => void) | undefined,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.chatSendMessage = sendMessageFn;\n }),\n );\n },\n\n setAddToolResult: (addToolResultFn: AddToolResult | undefined) => {\n // Wrap addToolResult to intercept calls and resolve pending promises\n const wrappedAddToolResult: AddToolResult | undefined =\n addToolResultFn\n ? (options) => {\n // Call the original addToolResult\n addToolResultFn(options);\n\n // Resolve the promise if there's a pending waiter for this toolCallId\n const resolver = pendingToolCallResolvers.get(\n options.toolCallId,\n );\n if (resolver) {\n resolver.resolve();\n }\n }\n : undefined;\n\n set((state) =>\n produce(state, (draft) => {\n draft.ai.addToolResult = wrappedAddToolResult;\n }),\n );\n },\n\n setAnalysisPrompt: (prompt: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisPrompt = prompt;\n }),\n );\n },\n\n /**\n * Set the AI model for the current session\n * @param model - The model to set\n */\n setAiModel: (modelProvider: string, model: string) => {\n set((state) =>\n produce(state, (draft) => {\n const currentSession = getCurrentSessionFromState(draft);\n if (currentSession) {\n currentSession.modelProvider = modelProvider;\n currentSession.model = model;\n }\n }),\n );\n },\n\n /**\n * Get the current active session\n */\n getCurrentSession: () => {\n const state = get();\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n },\n\n /**\n * Create a new session with the given name and model settings\n */\n createSession: (\n name?: string,\n modelProvider?: string,\n model?: string,\n ) => {\n const currentSession = get().ai.getCurrentSession();\n const newSessionId = createId();\n\n // Generate a default name if none is provided\n let sessionName = name;\n if (!sessionName) {\n // Generate a human-readable date and time for the session name\n const now = new Date();\n const formattedDate = now.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n const formattedTime = now.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n });\n sessionName = `Session ${formattedDate} at ${formattedTime}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n // Add to AI sessions\n draft.ai.config.sessions.unshift({\n id: newSessionId,\n name: sessionName,\n modelProvider:\n modelProvider || currentSession?.modelProvider || 'openai',\n model: model || currentSession?.model || 'gpt-4.1',\n analysisResults: [],\n createdAt: new Date(),\n uiMessages: [],\n toolAdditionalData: {},\n messagesRevision: 0,\n });\n draft.ai.config.currentSessionId = newSessionId;\n }),\n );\n },\n\n /**\n * Switch to a different session\n */\n switchSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n draft.ai.config.currentSessionId = sessionId;\n }),\n );\n },\n\n /**\n * Rename an existing session\n */\n renameSession: (sessionId: string, name: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.name = name;\n }\n }),\n );\n },\n\n /**\n * Delete a session\n */\n deleteSession: (sessionId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const sessionIndex = draft.ai.config.sessions.findIndex(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (sessionIndex !== -1) {\n // Don't delete the last session\n if (draft.ai.config.sessions.length > 1) {\n draft.ai.config.sessions.splice(sessionIndex, 1);\n // If we deleted the current session, switch to another one\n if (draft.ai.config.currentSessionId === sessionId) {\n // Make sure there's at least one session before accessing its id\n if (draft.ai.config.sessions.length > 0) {\n const firstSession = draft.ai.config.sessions[0];\n if (firstSession) {\n draft.ai.config.currentSessionId = firstSession.id;\n }\n }\n }\n }\n }\n }),\n );\n },\n\n /**\n * Save the Ai SDK UI messages for a session\n */\n setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n // store the latest UI messages from the chat hook\n // Create a deep copy to avoid read-only property issues\n session.uiMessages = JSON.parse(JSON.stringify(uiMessages));\n }\n }),\n );\n },\n\n /**\n * Save additional data for a session\n */\n setSessionToolAdditionalData: (\n sessionId: string,\n toolCallId: string,\n additionalData: unknown,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s) => s.id === sessionId,\n );\n if (session) {\n if (!session.toolAdditionalData) {\n session.toolAdditionalData = {};\n }\n session.toolAdditionalData[toolCallId] = additionalData;\n }\n }),\n );\n },\n\n findToolComponent: (toolName: string) => {\n return get().ai.tools[toolName]?.component as React.ComponentType;\n },\n\n getBaseUrlFromSettings: () => {\n // First try the getBaseUrl function if provided\n const baseUrlFromFunction = getBaseUrl?.();\n if (baseUrlFromFunction) {\n return baseUrlFromFunction;\n }\n\n // Fall back to settings\n const store = get();\n if (hasAiSettingsConfig(store)) {\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.baseUrl;\n }\n const provider =\n store.aiSettings.config.providers[currentSession.modelProvider];\n return provider?.baseUrl;\n }\n }\n return undefined;\n },\n\n getApiKeyFromSettings: () => {\n const store = get();\n const currentSession = getCurrentSessionFromState(store);\n if (currentSession) {\n // First try the getApiKey function if provided\n const apiKeyFromFunction = getApiKey?.(\n currentSession.modelProvider || 'openai',\n );\n if (apiKeyFromFunction) {\n return apiKeyFromFunction;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n if (currentSession.modelProvider === 'custom') {\n const customModel = store.aiSettings.config.customModels.find(\n (m: {modelName: string}) =>\n m.modelName === currentSession.model,\n );\n return customModel?.apiKey || '';\n } else {\n const provider =\n store.aiSettings.config.providers?.[\n currentSession.modelProvider\n ];\n return provider?.apiKey || '';\n }\n }\n }\n return '';\n },\n\n getMaxStepsFromSettings: () => {\n const store = get();\n // First try the maxSteps parameter if provided\n if (maxSteps && Number.isFinite(maxSteps) && maxSteps > 0) {\n return maxSteps;\n }\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n const settingsMaxSteps =\n store.aiSettings.config.modelParameters.maxSteps;\n if (Number.isFinite(settingsMaxSteps) && settingsMaxSteps > 0) {\n return settingsMaxSteps;\n }\n }\n return 50;\n },\n\n getFullInstructions: () => {\n const store = get();\n\n let instructions = getInstructions();\n\n // Fall back to settings\n if (hasAiSettingsConfig(store)) {\n // get additional instructions from settings\n const {additionalInstruction} =\n store.aiSettings.config.modelParameters;\n if (additionalInstruction) {\n instructions = `${instructions}\\n\\nAdditional Instructions:\\n\\n${additionalInstruction}`;\n }\n }\n return instructions;\n },\n\n sendPrompt: async (\n prompt: string,\n options: {\n systemInstructions?: string;\n modelProvider?: string;\n modelName?: string;\n baseUrl?: string;\n useTools?: boolean;\n abortSignal?: AbortSignal;\n } = {},\n ) => {\n // One-shot generateText path with explicit abort lifecycle management\n const state = get();\n const currentSession = state.ai.getCurrentSession();\n const {\n systemInstructions,\n modelProvider,\n modelName,\n baseUrl,\n abortSignal,\n useTools = false,\n } = options;\n const provider =\n modelProvider || currentSession?.modelProvider || defaultProvider;\n const modelId = modelName || currentSession?.model || defaultModel;\n const baseURL =\n baseUrl ||\n state.ai.getBaseUrlFromSettings() ||\n 'https://api.openai.com/v1';\n const tools = state.ai.tools;\n\n // remove execute from tools\n const toolsWithoutExecute = Object.fromEntries(\n Object.entries(tools).filter(([, tool]) => !tool.execute),\n );\n\n const model = createOpenAICompatible({\n apiKey: state.ai.getApiKeyFromSettings(),\n name: provider,\n baseURL,\n }).chatModel(modelId);\n\n try {\n const response = await generateText({\n model,\n messages: [{role: 'user', content: prompt}],\n system: systemInstructions || state.ai.getFullInstructions(),\n abortSignal: abortSignal,\n ...(useTools\n ? {tools: convertToAiSDKTools(toolsWithoutExecute)}\n : {}),\n });\n return response.text;\n } catch (error) {\n console.error('Error generating text:', error);\n return 'error: can not generate response';\n }\n },\n\n /**\n * Start the analysis\n * TODO: how to pass the history analysisResults?\n */\n startAnalysis: async (\n sendMessage: (message: {text: string}) => void,\n ) => {\n const abortController = new AbortController();\n const currentSession = get().ai.getCurrentSession();\n\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n\n const promptText = get().ai.analysisPrompt;\n\n set((state) =>\n produce(state, (draft) => {\n draft.ai.analysisAbortController = abortController;\n draft.ai.isRunningAnalysis = true;\n draft.ai.analysisPrompt = '';\n draft.ai.promptSuggestionsVisible = false;\n\n // Add incomplete analysis result to session immediately for instant UI rendering\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSession.id,\n );\n if (session) {\n // Remove any existing pending results (safety check for page refresh scenarios)\n session.analysisResults = session.analysisResults.filter(\n (result: AnalysisResultSchema) => result.id !== '__pending__',\n );\n\n // Add incomplete analysis result with a temporary ID\n // This will be updated in onChatFinish with the actual user message ID\n session.analysisResults.push({\n id: '__pending__',\n prompt: promptText,\n isCompleted: false,\n });\n }\n }),\n );\n\n // The pending analysis result will be updated in onChatFinish with the correct message ID\n sendMessage({text: promptText});\n },\n\n cancelAnalysis: () => {\n const abortController = get().ai.analysisAbortController;\n\n // Stop local chat streaming immediately if available\n try {\n get().ai.chatStop?.();\n } catch {\n // no-op\n }\n\n // Call abort to signal cancellation\n // Keep the abort controller in state so that async handlers (onChatToolCall, onChatFinish)\n // can check if it was aborted. The onChatFinish handler will clean it up.\n abortController?.abort('Analysis cancelled');\n\n set((state) =>\n produce(state, (draft) => {\n // Set isRunningAnalysis to false to update UI\n draft.ai.isRunningAnalysis = false;\n // Keep analysisAbortController so handlers can check signal.aborted\n // It will be cleared by onChatFinish\n\n // Intentionally preserve any pending analysis result so the\n // conversation row remains visible until onChatFinish runs.\n }),\n );\n },\n\n /**\n * Get the assistant message parts for a given analysis result ID\n * @param analysisResultId - The ID of the analysis result (user message ID)\n * @returns Array of message parts from the assistant's response\n */\n getAssistantMessageParts: (analysisResultId: string) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n const uiMessages = currentSession.uiMessages as UIMessage[];\n // Find the user message with analysisResultId\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === analysisResultId && msg.role === 'user',\n );\n if (userMessageIndex === -1) return [];\n\n // Find the next assistant message after this user message\n for (let i = userMessageIndex + 1; i < uiMessages.length; i++) {\n const msg = uiMessages[i];\n if (msg?.role === 'assistant') {\n return msg.parts;\n }\n if (msg?.role === 'user') {\n // Hit next user message without finding assistant response\n break;\n }\n }\n return [];\n },\n\n /**\n * Delete an analysis result from a session\n * - remove the corresponding prompt-response pair from uiMessages\n * - remove the associated toolAdditionalData\n */\n deleteAnalysisResult: (sessionId: string, resultId: string) => {\n set((state) =>\n produce(state, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.analysisResults = session.analysisResults.filter(\n (r: AnalysisResultSchema) => r.id !== resultId,\n );\n // Remove corresponding prompt-response pair from uiMessages\n const uiMessages = session.uiMessages as UIMessage[];\n const userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === resultId && msg.role === 'user',\n );\n\n if (userMessageIndex !== -1) {\n // Find the next user message (or end of array) to determine response boundary\n let nextUserIndex = userMessageIndex + 1;\n const toolCallIdsToDelete: Set<string> = new Set();\n\n while (\n nextUserIndex < uiMessages.length &&\n uiMessages[nextUserIndex]?.role !== 'user'\n ) {\n const msg = uiMessages[nextUserIndex];\n // Extract toolCallId from message parts\n if (msg?.parts) {\n for (const part of msg.parts) {\n // Check for tool-* or dynamic-tool parts that have toolCallId\n if (\n 'toolCallId' in part &&\n typeof part.toolCallId === 'string'\n ) {\n toolCallIdsToDelete.add(part.toolCallId);\n }\n }\n }\n nextUserIndex++;\n }\n\n // Remove the user message and all assistant messages until the next user message\n session.uiMessages.splice(\n userMessageIndex,\n nextUserIndex - userMessageIndex,\n );\n\n // Increment messagesRevision to force useChat reset\n session.messagesRevision =\n (session.messagesRevision || 0) + 1;\n\n // Clean up toolAdditionalData for deleted messages\n if (session.toolAdditionalData) {\n // Remove data keyed by the toolCallId from the deleted messages\n toolCallIdsToDelete.forEach((toolCallId) => {\n if (session.toolAdditionalData![toolCallId]) {\n delete session.toolAdditionalData![toolCallId];\n }\n });\n }\n }\n }\n }),\n );\n },\n\n /**\n * Get analysis results for the current session by transforming UI messages\n * into structured analysis results (user prompt → AI response pairs).\n *\n * @returns Array of analysis results for the current session\n */\n getAnalysisResults: (): AnalysisResultSchema[] => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return [];\n\n return currentSession.analysisResults;\n },\n\n /**\n * Add an analysis result to the current session\n * - add the message to the uiMessages\n * - add the analysis result to the analysisResults\n */\n addAnalysisResult: (message: UIMessage) => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) {\n console.error('No current session found');\n return;\n }\n set((state) =>\n produce(state, (draft) => {\n // Extract text content from message parts\n const textContent =\n message.parts\n ?.filter((part) => part.type === 'text')\n ?.map((part) => (part as {text: string}).text)\n ?.join('') || '';\n\n draft.ai.config.sessions\n .find((s: AnalysisSessionSchema) => s.id === currentSession?.id)\n ?.analysisResults.push({\n id: message.id,\n prompt: textContent,\n isCompleted: true,\n });\n }),\n );\n },\n\n // Chat transport configuration\n chatEndPoint,\n chatHeaders,\n\n getLocalChatTransport: () => {\n const state = get();\n return createLocalChatTransportFactory({\n store,\n defaultProvider: defaultProvider,\n defaultModel: defaultModel,\n apiKey: state.ai.getApiKeyFromSettings(),\n baseUrl: state.ai.getBaseUrlFromSettings(),\n getInstructions: () => store.getState().ai.getFullInstructions(),\n getCustomModel,\n })();\n },\n\n getRemoteChatTransport: (\n endpoint: string,\n headers?: Record<string, string>,\n ) =>\n createRemoteChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n })(endpoint, headers),\n\n ...createChatHandlers({store}),\n },\n };\n });\n}\n\n/**\n * Helper function to get the current session from state\n */\nfunction getCurrentSessionFromState(\n state: AiSliceState,\n): AnalysisSessionSchema | undefined {\n const {currentSessionId, sessions} = state.ai.config;\n return sessions.find((session) => session.id === currentSessionId);\n}\n\nexport function useStoreWithAi<T>(selector: (state: AiSliceState) => T): T {\n return useBaseRoomStore<AiSliceState, T>((state) => selector(state));\n}\n"]}
|
package/dist/chatTransport.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { DefaultChatTransport, UIMessage } from 'ai';
|
|
2
2
|
import type { DataUIPart, LanguageModel, ToolSet } from 'ai';
|
|
3
3
|
import { OpenAssistantTool } from '@openassistant/utils';
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
4
|
+
import { AddToolResult } from './types';
|
|
5
|
+
import type { AiSliceStateForTransport } from './types';
|
|
6
6
|
import type { StoreApi } from '@sqlrooms/room-store';
|
|
7
7
|
/**
|
|
8
8
|
* Validates and completes UIMessages to ensure all tool-call parts have corresponding tool-result parts.
|
|
@@ -20,7 +20,7 @@ export type ToolCall = {
|
|
|
20
20
|
type: 'tool-input-available';
|
|
21
21
|
};
|
|
22
22
|
export type ChatTransportConfig = {
|
|
23
|
-
store: StoreApi<
|
|
23
|
+
store: StoreApi<AiSliceStateForTransport>;
|
|
24
24
|
defaultProvider: string;
|
|
25
25
|
defaultModel: string;
|
|
26
26
|
apiKey: string;
|
|
@@ -41,12 +41,12 @@ export type ChatTransportConfig = {
|
|
|
41
41
|
export declare function convertToAiSDKTools(tools: Record<string, OpenAssistantTool>, onToolCompleted?: (toolCallId: string, additionalData: unknown) => void): ToolSet;
|
|
42
42
|
export declare function createLocalChatTransportFactory({ store, defaultProvider, defaultModel, apiKey, baseUrl, headers, getInstructions, getCustomModel, }: ChatTransportConfig): () => DefaultChatTransport<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>;
|
|
43
43
|
export declare function createRemoteChatTransportFactory(params: {
|
|
44
|
-
store: StoreApi<
|
|
44
|
+
store: StoreApi<AiSliceStateForTransport>;
|
|
45
45
|
defaultProvider: string;
|
|
46
46
|
defaultModel: string;
|
|
47
47
|
}): (endpoint: string, headers?: Record<string, string>) => DefaultChatTransport<UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>>;
|
|
48
|
-
export declare function createChatHandlers({ store }: {
|
|
49
|
-
store: StoreApi<
|
|
48
|
+
export declare function createChatHandlers({ store, }: {
|
|
49
|
+
store: StoreApi<AiSliceStateForTransport>;
|
|
50
50
|
}): {
|
|
51
51
|
onChatToolCall: ({ toolCall, addToolResult, }: {
|
|
52
52
|
toolCall: ToolCall;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatTransport.d.ts","sourceRoot":"","sources":["../src/chatTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,SAAS,EAIV,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAC,MAAM,IAAI,CAAC;AAE3D,OAAO,EAA0B,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"chatTransport.d.ts","sourceRoot":"","sources":["../src/chatTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,SAAS,EAIV,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAC,MAAM,IAAI,CAAC;AAE3D,OAAO,EAA0B,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAGnD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,SAAS,EAAE,GACpB,SAAS,EAAE,CAwEb;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,sBAAsB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;CAClD,CAAC;AAkBF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACxC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,IAAI,GACtE,OAAO,CAWT;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,KAAK,EACL,eAAe,EACf,YAAY,EACZ,MAAM,EACN,OAAO,EACP,OAAO,EACP,eAAe,EACf,cAAc,GACf,EAAE,mBAAmB,kGA8DrB;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE;IACvD,KAAK,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IAC1C,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,IACS,UAAU,MAAM,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,8FA0C3D;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,GACN,EAAE;IACD,KAAK,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC;CAC3C;mDAKM;QACD,QAAQ,EAAE,QAAQ,CAAC;QACnB,aAAa,CAAC,EAAE,aAAa,CAAC;KAC/B;2BA0FsB,UAAU,CAAC,GAAG,CAAC;iCAyBX;QAAC,QAAQ,EAAE,SAAS,EAAE,CAAA;KAAC;yBAgL7B,OAAO;EA8E/B"}
|
package/dist/chatTransport.js
CHANGED
|
@@ -187,7 +187,7 @@ export function createRemoteChatTransportFactory(params) {
|
|
|
187
187
|
});
|
|
188
188
|
};
|
|
189
189
|
}
|
|
190
|
-
export function createChatHandlers({ store }) {
|
|
190
|
+
export function createChatHandlers({ store, }) {
|
|
191
191
|
return {
|
|
192
192
|
onChatToolCall: async ({ toolCall, addToolResult, }) => {
|
|
193
193
|
const { input, toolCallId, toolName } = toolCall;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatTransport.js","sourceRoot":"","sources":["../src/chatTransport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DefaultChatTransport,\n UIMessage,\n convertToModelMessages,\n streamText,\n lastAssistantMessageIsCompleteWithToolCalls,\n} from 'ai';\nimport type {DataUIPart, LanguageModel, ToolSet} from 'ai';\nimport {createOpenAICompatible} from '@ai-sdk/openai-compatible';\nimport {convertToVercelAiToolV5, OpenAssistantTool} from '@openassistant/utils';\nimport {produce} from 'immer';\nimport {getErrorMessageForDisplay} from '@sqlrooms/utils';\nimport type {AiSliceState} from './AiSlice';\nimport type {AnalysisSessionSchema} from '@sqlrooms/ai-config';\nimport {AddToolResult} from './hooks/useAiChat';\nimport type {StoreApi} from '@sqlrooms/room-store';\nimport {ToolAbortError} from './utils';\n\n/**\n * Validates and completes UIMessages to ensure all tool-call parts have corresponding tool-result parts.\n * This is important when canceling with AbortController, which may leave incomplete tool-calls.\n * Assumes sequential tool execution (only one tool runs at a time).\n *\n * @param messages - The messages to validate and complete\n * @returns Cleaned messages with completed tool-call/result pairs\n */\nexport function completeIncompleteToolCalls(\n messages: UIMessage[],\n): UIMessage[] {\n return messages.map((message) => {\n if (message.role !== 'assistant' || !message.parts) {\n return message;\n }\n\n // Walk backward and complete any TRAILING tool parts that lack output.\n // This covers multi-tool-step aborts where several tool calls were started\n // but the stream was cancelled before the outputs were emitted.\n type ToolPart = {\n type: string;\n toolCallId: string;\n toolName?: string;\n input?: unknown;\n state?: string;\n };\n const isToolPart = (part: unknown): part is ToolPart => {\n if (typeof part !== 'object' || part === null) return false;\n const p = part as Record<string, unknown> & {type?: unknown};\n const typeVal =\n typeof p.type === 'string' ? (p.type as string) : undefined;\n return (\n !!typeVal &&\n 'toolCallId' in p &&\n (typeVal === 'dynamic-tool' || typeVal.startsWith('tool-'))\n );\n };\n\n const updatedParts = [...message.parts];\n let sawAnyTool = false;\n for (let i = updatedParts.length - 1; i >= 0; i--) {\n const current = updatedParts[i] as unknown;\n if (!isToolPart(current)) {\n // Stop once we exit the trailing tool region\n if (sawAnyTool) break;\n continue;\n }\n sawAnyTool = true;\n const toolPart = current as ToolPart;\n const hasOutput = toolPart.state?.startsWith('output');\n if (hasOutput) {\n // Completed tool; continue checking earlier parts just in case\n continue;\n }\n\n // Synthesize a completed error result for the incomplete tool call\n const base = {\n toolCallId: toolPart.toolCallId,\n state: 'output-error' as const,\n input: toolPart.input ?? {},\n errorText: 'Operation cancelled by user',\n providerExecuted: false,\n };\n\n const syntheticPart =\n toolPart.type === 'dynamic-tool'\n ? {\n type: 'dynamic-tool' as const,\n toolName: toolPart.toolName || 'unknown',\n ...base,\n }\n : {type: toolPart.type as string, ...base};\n\n updatedParts[i] =\n syntheticPart as unknown as (typeof message.parts)[number];\n }\n\n return {\n ...message,\n parts: updatedParts,\n };\n });\n}\n\nexport type ToolCall = {\n input: string;\n toolCallId: string;\n toolName: string;\n type: 'tool-input-available';\n};\n\nexport type ChatTransportConfig = {\n store: StoreApi<AiSliceState>;\n defaultProvider: string;\n defaultModel: string;\n apiKey: string;\n baseUrl?: string;\n headers?: Record<string, string>;\n getInstructions: () => string;\n /**\n * Optional: supply a pre-configured custom model.\n * e.g. import {xai} from \"@ai-sdk/xai\";\n * getCustomModel: () => xai('grok-4')\n * If provided, this model will be used instead of the default OpenAI-compatible client.\n */\n getCustomModel?: () => LanguageModel | undefined;\n};\n\n/**\n * Creates a handler for tool completion that updates the tool additional data in the store\n */\nfunction createOnToolCompletedHandler(store: StoreApi<AiSliceState>) {\n return (toolCallId: string, additionalData: unknown) => {\n const sessionId = store.getState().ai.config.currentSessionId;\n if (!sessionId) return;\n\n store\n .getState()\n .ai.setSessionToolAdditionalData(sessionId, toolCallId, additionalData);\n };\n}\n\n/**\n * Converts OpenAssistant tools to Vercel AI SDK tools with onToolCompleted handler\n */\nexport function convertToAiSDKTools(\n tools: Record<string, OpenAssistantTool>,\n onToolCompleted?: (toolCallId: string, additionalData: unknown) => void,\n): ToolSet {\n return Object.entries(tools || {}).reduce(\n (acc: ToolSet, [name, tool]: [string, OpenAssistantTool]) => {\n acc[name] = convertToVercelAiToolV5({\n ...tool,\n onToolCompleted,\n });\n return acc;\n },\n {},\n );\n}\n\nexport function createLocalChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n apiKey,\n baseUrl,\n headers,\n getInstructions,\n getCustomModel,\n}: ChatTransportConfig) {\n return () => {\n const fetchImpl = async (_input: RequestInfo | URL, init?: RequestInit) => {\n // Resolve provider/model and client at call time to pick up latest settings\n const state = store.getState();\n const currentSession = state.ai.getCurrentSession();\n const provider = currentSession?.modelProvider || defaultProvider;\n const modelId = currentSession?.model || defaultModel;\n\n // Prefer a user-supplied model if available\n let model: LanguageModel | undefined = getCustomModel?.();\n\n // Fallback to OpenAI-compatible if no custom model provided\n if (!model) {\n const openai = createOpenAICompatible({\n apiKey,\n name: provider,\n baseURL: baseUrl || 'https://api.openai.com/v1',\n headers,\n });\n model = openai.chatModel(modelId);\n }\n\n // Parse caller-supplied body defensively to avoid breaking the stream\n const body = init?.body as string;\n let parsed: unknown = {};\n try {\n parsed = body ? JSON.parse(body) : {};\n } catch {\n parsed = {};\n }\n const parsedObj = (parsed as {messages?: unknown}) || {};\n const messagesCopy = Array.isArray(parsedObj.messages)\n ? (parsedObj.messages as UIMessage[])\n : [];\n\n const onToolCompleted = createOnToolCompletedHandler(store);\n const tools = convertToAiSDKTools(state.ai.tools || {}, onToolCompleted);\n // Remove execute from tools for the model call so tool invocations are\n // handled exclusively by onChatToolCall. convertToAiSDKTools is expected\n // to return fresh tool objects; if that ever changes, clone before mutate.\n Object.values(tools).forEach((tool) => {\n tool.execute = undefined;\n });\n\n // get system instructions dynamically at request time to ensure fresh table schema\n const systemInstructions = getInstructions();\n\n const result = streamText({\n model,\n // Ensure we always pass an array of messages\n messages: convertToModelMessages(messagesCopy),\n tools,\n system: systemInstructions,\n abortSignal: state.ai.analysisAbortController?.signal,\n });\n\n return result.toUIMessageStreamResponse();\n };\n\n return new DefaultChatTransport({fetch: fetchImpl});\n };\n}\n\nexport function createRemoteChatTransportFactory(params: {\n store: StoreApi<AiSliceState>;\n defaultProvider: string;\n defaultModel: string;\n}) {\n return (endpoint: string, headers?: Record<string, string>) => {\n const fetchImpl = async (input: RequestInfo | URL, init?: RequestInit) => {\n // Get current session's model and provider at request time\n const state = params.store.getState();\n const currentSession = state.ai.getCurrentSession();\n const modelProvider =\n currentSession?.modelProvider || params.defaultProvider;\n const model = currentSession?.model || params.defaultModel;\n\n // Parse the existing body and add model information (defensive parsing)\n const body = init?.body as string;\n let parsed: unknown = {};\n try {\n parsed = body ? JSON.parse(body) : {};\n } catch {\n parsed = {};\n }\n\n const parsedObj =\n typeof parsed === 'object' && parsed !== null\n ? (parsed as Record<string, unknown>)\n : {};\n const enhancedBody = {\n ...parsedObj,\n modelProvider,\n model,\n };\n\n // Make the request with enhanced body\n return fetch(input, {\n ...init,\n body: JSON.stringify(enhancedBody),\n });\n };\n\n return new DefaultChatTransport({\n api: endpoint,\n credentials: 'include',\n headers,\n fetch: fetchImpl,\n });\n };\n}\n\nexport function createChatHandlers({store}: {store: StoreApi<AiSliceState>}) {\n return {\n onChatToolCall: async ({\n toolCall,\n addToolResult,\n }: {\n toolCall: ToolCall;\n addToolResult?: AddToolResult;\n }) => {\n const {input, toolCallId, toolName} = toolCall;\n try {\n // handle client tools\n const state = store.getState();\n\n // Check if the stream was aborted before executing tool\n if (state.ai.analysisAbortController?.signal.aborted) {\n if (addToolResult) {\n addToolResult({\n tool: toolName,\n toolCallId,\n state: 'output-error',\n errorText: 'Operation cancelled by user',\n });\n }\n return;\n }\n\n const onToolCompleted = createOnToolCompletedHandler(store);\n const tools = convertToAiSDKTools(\n state.ai.tools || {},\n onToolCompleted,\n );\n\n // find tool from tools using toolName\n const tool = tools[toolName];\n if (tool && state.ai.tools[toolName]?.execute && tool.execute) {\n // Always provide a defined messages array to the tool runtime\n const sessionMessages = (state.ai.getCurrentSession()?.uiMessages ??\n []) as UIMessage[];\n const llmResult = await tool.execute(input, {\n toolCallId,\n messages: convertToModelMessages(sessionMessages),\n abortSignal: state.ai.analysisAbortController?.signal,\n });\n\n if (addToolResult) {\n // Note: When using sendAutomaticallyWhen, avoid awaiting addToolResult to prevent deadlocks\n addToolResult({\n tool: toolName,\n toolCallId,\n output: llmResult,\n });\n }\n } else {\n // Tool has no execute function - wait for UI component to call addToolResult\n // Check if there's a ToolComponent for this tool\n const hasToolComponent = !!state.ai.findToolComponent(toolName);\n if (hasToolComponent && state.ai.waitForToolResult) {\n try {\n // Wait for the UI component to call addToolResult\n await state.ai.waitForToolResult(\n toolCallId,\n state.ai.analysisAbortController?.signal,\n );\n } catch (error) {\n // If waiting was cancelled or failed, ensure we add an error result\n if (addToolResult && error instanceof Error) {\n addToolResult({\n tool: toolName,\n toolCallId,\n state: 'output-error',\n errorText: error.message,\n });\n }\n // Re-throw to let the outer catch handle it\n throw error;\n }\n }\n // If no ToolComponent, we still return (no-op) - the UI won't render anything\n // and the tool call will remain incomplete, which is fine for error handling\n }\n } catch (error) {\n // Check if this is an abort error\n const isAbortError = error instanceof ToolAbortError;\n\n if (addToolResult) {\n addToolResult({\n tool: toolName,\n toolCallId,\n state: 'output-error',\n errorText: isAbortError\n ? 'Operation cancelled by user'\n : getErrorMessageForDisplay(error),\n });\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChatData: (dataPart: DataUIPart<any>) => {\n // Handle additional tool output data from the backend (defensive guards)\n if (\n dataPart.type === 'data-tool-additional-output' &&\n dataPart.data &&\n (dataPart.data as {toolCallId?: unknown}).toolCallId != null\n ) {\n const {toolCallId, output} = dataPart.data as {\n toolCallId: string;\n output: unknown;\n };\n\n // Store the additional data in the session\n const currentSessionId = store.getState().ai.config.currentSessionId;\n if (currentSessionId) {\n store\n .getState()\n .ai.setSessionToolAdditionalData(\n currentSessionId,\n toolCallId,\n output,\n );\n }\n }\n },\n onChatFinish: ({messages}: {messages: UIMessage[]}) => {\n try {\n const currentSessionId = store.getState().ai.config.currentSessionId;\n if (!currentSessionId) return;\n\n // If the analysis has been aborted, force-complete and clean up immediately\n const aborted =\n !!store.getState().ai.analysisAbortController?.signal.aborted;\n if (aborted) {\n // If messages are empty (possible when stopping immediately), fall back to existing session messages\n const sessionMessages =\n (store.getState().ai.getCurrentSession()\n ?.uiMessages as UIMessage[]) || [];\n const sourceMessages =\n messages && messages.length > 0 ? messages : sessionMessages;\n\n const completedMessages = completeIncompleteToolCalls(sourceMessages);\n store\n .getState()\n .ai.setSessionUiMessages(currentSessionId, completedMessages);\n\n // Ensure an analysis result exists and is marked as cancelled\n store.setState((state: AiSliceState) =>\n produce(state, (draft: AiSliceState) => {\n draft.ai.isRunningAnalysis = false;\n draft.ai.analysisAbortController = undefined;\n\n const targetSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSessionId,\n );\n if (!targetSession) return;\n\n // Find the last user message\n const lastUserMessage = completedMessages\n .filter((msg) => msg.role === 'user')\n .slice(-1)[0];\n if (!lastUserMessage) return;\n\n const promptText = lastUserMessage.parts\n .filter((part) => part.type === 'text')\n .map((part) => (part as {text: string}).text)\n .join('');\n\n const pendingIndex = targetSession.analysisResults.findIndex(\n (result) => result.id === '__pending__',\n );\n\n if (pendingIndex !== -1) {\n targetSession.analysisResults[pendingIndex] = {\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: 'Operation cancelled by user'},\n isCompleted: true,\n };\n } else {\n const existing = targetSession.analysisResults.find(\n (r) => r.id === lastUserMessage.id,\n );\n if (!existing) {\n targetSession.analysisResults.push({\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: 'Operation cancelled by user'},\n isCompleted: true,\n });\n }\n }\n }),\n );\n return;\n }\n\n // Complete any incomplete tool-calls before saving (can happen with AbortController)\n const completedMessages = completeIncompleteToolCalls(messages);\n\n store\n .getState()\n .ai.setSessionUiMessages(currentSessionId, completedMessages);\n\n // Create or update analysis result with the user message ID for proper correlation\n store.setState((state: AiSliceState) =>\n produce(state, (draft: AiSliceState) => {\n const targetSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSessionId,\n );\n if (!targetSession) return;\n\n // Find the last user message to get its ID and prompt\n const lastUserMessage = completedMessages\n .filter((msg) => msg.role === 'user')\n .slice(-1)[0];\n\n if (lastUserMessage) {\n // Extract text content from user message\n const promptText = lastUserMessage.parts\n .filter((part) => part.type === 'text')\n .map((part) => (part as {text: string}).text)\n .join('');\n\n // Check if there's a pending analysis result\n const pendingIndex = targetSession.analysisResults.findIndex(\n (result) => result.id === '__pending__',\n );\n\n if (pendingIndex !== -1) {\n // Update the pending result with actual data\n targetSession.analysisResults[pendingIndex] = {\n id: lastUserMessage.id,\n prompt: promptText,\n isCompleted: true,\n };\n } else {\n // Check if analysis result already exists for this user message\n const existingResult = targetSession.analysisResults.find(\n (result) => result.id === lastUserMessage.id,\n );\n\n if (!existingResult) {\n // Create analysis result with the same ID as the user message\n targetSession.analysisResults.push({\n id: lastUserMessage.id,\n prompt: promptText,\n isCompleted: true,\n });\n }\n }\n }\n }),\n );\n\n // Determine if SDK wants to auto-send a follow-up turn (i.e., more steps pending)\n const shouldAutoSendNext = lastAssistantMessageIsCompleteWithToolCalls({\n messages: completedMessages,\n });\n\n // Step-aware completion: look only at parts after the most recent step-start\n const lastMessage = completedMessages[completedMessages.length - 1];\n const isLastMessageAssistant = lastMessage?.role === 'assistant';\n let tailHasTool = false;\n if (isLastMessageAssistant) {\n const parts = lastMessage?.parts ?? [];\n let lastStepStartIndex = -1;\n for (let i = parts.length - 1; i >= 0; i--) {\n if (parts[i]?.type === 'step-start') {\n lastStepStartIndex = i;\n break;\n }\n }\n const tailParts = parts.slice(lastStepStartIndex + 1);\n tailHasTool = tailParts.some(\n (part) =>\n typeof part?.type === 'string' &&\n (part.type.startsWith('tool-') || part.type === 'dynamic-tool'),\n );\n }\n\n // End analysis when there is no autosend and there are no pending tool parts\n // even if the assistant didn't emit additional text (e.g., tool-only tails).\n const shouldEndAnalysis =\n (isLastMessageAssistant && !shouldAutoSendNext && !tailHasTool) ||\n (!shouldAutoSendNext && !isLastMessageAssistant);\n\n if (shouldEndAnalysis) {\n store.setState((state: AiSliceState) =>\n produce(state, (draft: AiSliceState) => {\n draft.ai.isRunningAnalysis = false;\n draft.ai.analysisPrompt = '';\n draft.ai.analysisAbortController = undefined;\n }),\n );\n }\n } catch (err) {\n console.error('onChatFinish error:', err);\n throw err;\n }\n },\n onChatError: (error: unknown) => {\n try {\n let errMsg = getErrorMessageForDisplay(error);\n if (!errMsg || errMsg.trim().length === 0) {\n errMsg = 'Unknown error';\n }\n const currentSessionId = store.getState().ai.config.currentSessionId;\n store.setState((state: AiSliceState) =>\n produce(state, (draft: AiSliceState) => {\n if (!currentSessionId) return;\n const targetSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSessionId,\n );\n if (targetSession) {\n // Ensure message structure is valid even on errors\n const existingMessages = (targetSession.uiMessages ||\n []) as UIMessage[];\n targetSession.uiMessages = completeIncompleteToolCalls(\n existingMessages,\n ) as unknown as AnalysisSessionSchema['uiMessages'];\n\n // Find the last user message to create analysis result with correct ID\n const uiMessages = targetSession.uiMessages as UIMessage[];\n const lastUserMessage = uiMessages\n .filter((msg) => msg.role === 'user')\n .slice(-1)[0];\n\n if (lastUserMessage) {\n // Extract text content from user message\n const promptText = lastUserMessage.parts\n .filter((part) => part.type === 'text')\n .map((part) => (part as {text: string}).text)\n .join('');\n\n // Check if there's a pending analysis result\n const pendingIndex = targetSession.analysisResults.findIndex(\n (result) => result.id === '__pending__',\n );\n\n if (pendingIndex !== -1) {\n // Update the pending result with error\n targetSession.analysisResults[pendingIndex] = {\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: errMsg},\n isCompleted: true,\n };\n } else {\n // Check if analysis result already exists for this user message\n const existingResult = targetSession.analysisResults.find(\n (result) => result.id === lastUserMessage.id,\n );\n\n if (!existingResult) {\n // Create analysis result with the same ID as the user message\n targetSession.analysisResults.push({\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: errMsg},\n isCompleted: true,\n });\n } else {\n // Update existing result with error message\n existingResult.errorMessage = {error: errMsg};\n }\n }\n }\n }\n draft.ai.isRunningAnalysis = false;\n draft.ai.analysisAbortController = undefined;\n }),\n );\n } catch (err) {\n console.error('Failed to store chat error:', err);\n throw err;\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chatTransport.js","sourceRoot":"","sources":["../src/chatTransport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DefaultChatTransport,\n UIMessage,\n convertToModelMessages,\n streamText,\n lastAssistantMessageIsCompleteWithToolCalls,\n} from 'ai';\nimport type {DataUIPart, LanguageModel, ToolSet} from 'ai';\nimport {createOpenAICompatible} from '@ai-sdk/openai-compatible';\nimport {convertToVercelAiToolV5, OpenAssistantTool} from '@openassistant/utils';\nimport {produce} from 'immer';\nimport {getErrorMessageForDisplay} from '@sqlrooms/utils';\nimport type {AnalysisSessionSchema} from '@sqlrooms/ai-config';\nimport {AddToolResult} from './types';\nimport type {AiSliceStateForTransport} from './types';\nimport type {StoreApi} from '@sqlrooms/room-store';\nimport {ToolAbortError} from './utils';\n\n/**\n * Validates and completes UIMessages to ensure all tool-call parts have corresponding tool-result parts.\n * This is important when canceling with AbortController, which may leave incomplete tool-calls.\n * Assumes sequential tool execution (only one tool runs at a time).\n *\n * @param messages - The messages to validate and complete\n * @returns Cleaned messages with completed tool-call/result pairs\n */\nexport function completeIncompleteToolCalls(\n messages: UIMessage[],\n): UIMessage[] {\n return messages.map((message) => {\n if (message.role !== 'assistant' || !message.parts) {\n return message;\n }\n\n // Walk backward and complete any TRAILING tool parts that lack output.\n // This covers multi-tool-step aborts where several tool calls were started\n // but the stream was cancelled before the outputs were emitted.\n type ToolPart = {\n type: string;\n toolCallId: string;\n toolName?: string;\n input?: unknown;\n state?: string;\n };\n const isToolPart = (part: unknown): part is ToolPart => {\n if (typeof part !== 'object' || part === null) return false;\n const p = part as Record<string, unknown> & {type?: unknown};\n const typeVal =\n typeof p.type === 'string' ? (p.type as string) : undefined;\n return (\n !!typeVal &&\n 'toolCallId' in p &&\n (typeVal === 'dynamic-tool' || typeVal.startsWith('tool-'))\n );\n };\n\n const updatedParts = [...message.parts];\n let sawAnyTool = false;\n for (let i = updatedParts.length - 1; i >= 0; i--) {\n const current = updatedParts[i] as unknown;\n if (!isToolPart(current)) {\n // Stop once we exit the trailing tool region\n if (sawAnyTool) break;\n continue;\n }\n sawAnyTool = true;\n const toolPart = current as ToolPart;\n const hasOutput = toolPart.state?.startsWith('output');\n if (hasOutput) {\n // Completed tool; continue checking earlier parts just in case\n continue;\n }\n\n // Synthesize a completed error result for the incomplete tool call\n const base = {\n toolCallId: toolPart.toolCallId,\n state: 'output-error' as const,\n input: toolPart.input ?? {},\n errorText: 'Operation cancelled by user',\n providerExecuted: false,\n };\n\n const syntheticPart =\n toolPart.type === 'dynamic-tool'\n ? {\n type: 'dynamic-tool' as const,\n toolName: toolPart.toolName || 'unknown',\n ...base,\n }\n : {type: toolPart.type as string, ...base};\n\n updatedParts[i] =\n syntheticPart as unknown as (typeof message.parts)[number];\n }\n\n return {\n ...message,\n parts: updatedParts,\n };\n });\n}\n\nexport type ToolCall = {\n input: string;\n toolCallId: string;\n toolName: string;\n type: 'tool-input-available';\n};\n\nexport type ChatTransportConfig = {\n store: StoreApi<AiSliceStateForTransport>;\n defaultProvider: string;\n defaultModel: string;\n apiKey: string;\n baseUrl?: string;\n headers?: Record<string, string>;\n getInstructions: () => string;\n /**\n * Optional: supply a pre-configured custom model.\n * e.g. import {xai} from \"@ai-sdk/xai\";\n * getCustomModel: () => xai('grok-4')\n * If provided, this model will be used instead of the default OpenAI-compatible client.\n */\n getCustomModel?: () => LanguageModel | undefined;\n};\n\n/**\n * Creates a handler for tool completion that updates the tool additional data in the store\n */\nfunction createOnToolCompletedHandler(\n store: StoreApi<AiSliceStateForTransport>,\n) {\n return (toolCallId: string, additionalData: unknown) => {\n const sessionId = store.getState().ai.config.currentSessionId;\n if (!sessionId) return;\n\n store\n .getState()\n .ai.setSessionToolAdditionalData(sessionId, toolCallId, additionalData);\n };\n}\n\n/**\n * Converts OpenAssistant tools to Vercel AI SDK tools with onToolCompleted handler\n */\nexport function convertToAiSDKTools(\n tools: Record<string, OpenAssistantTool>,\n onToolCompleted?: (toolCallId: string, additionalData: unknown) => void,\n): ToolSet {\n return Object.entries(tools || {}).reduce(\n (acc: ToolSet, [name, tool]: [string, OpenAssistantTool]) => {\n acc[name] = convertToVercelAiToolV5({\n ...tool,\n onToolCompleted,\n });\n return acc;\n },\n {},\n );\n}\n\nexport function createLocalChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n apiKey,\n baseUrl,\n headers,\n getInstructions,\n getCustomModel,\n}: ChatTransportConfig) {\n return () => {\n const fetchImpl = async (_input: RequestInfo | URL, init?: RequestInit) => {\n // Resolve provider/model and client at call time to pick up latest settings\n const state = store.getState();\n const currentSession = state.ai.getCurrentSession();\n const provider = currentSession?.modelProvider || defaultProvider;\n const modelId = currentSession?.model || defaultModel;\n\n // Prefer a user-supplied model if available\n let model: LanguageModel | undefined = getCustomModel?.();\n\n // Fallback to OpenAI-compatible if no custom model provided\n if (!model) {\n const openai = createOpenAICompatible({\n apiKey,\n name: provider,\n baseURL: baseUrl || 'https://api.openai.com/v1',\n headers,\n });\n model = openai.chatModel(modelId);\n }\n\n // Parse caller-supplied body defensively to avoid breaking the stream\n const body = init?.body as string;\n let parsed: unknown = {};\n try {\n parsed = body ? JSON.parse(body) : {};\n } catch {\n parsed = {};\n }\n const parsedObj = (parsed as {messages?: unknown}) || {};\n const messagesCopy = Array.isArray(parsedObj.messages)\n ? (parsedObj.messages as UIMessage[])\n : [];\n\n const onToolCompleted = createOnToolCompletedHandler(store);\n const tools = convertToAiSDKTools(state.ai.tools || {}, onToolCompleted);\n // Remove execute from tools for the model call so tool invocations are\n // handled exclusively by onChatToolCall. convertToAiSDKTools is expected\n // to return fresh tool objects; if that ever changes, clone before mutate.\n Object.values(tools).forEach((tool) => {\n tool.execute = undefined;\n });\n\n // get system instructions dynamically at request time to ensure fresh table schema\n const systemInstructions = getInstructions();\n\n const result = streamText({\n model,\n // Ensure we always pass an array of messages\n messages: convertToModelMessages(messagesCopy),\n tools,\n system: systemInstructions,\n abortSignal: state.ai.analysisAbortController?.signal,\n });\n\n return result.toUIMessageStreamResponse();\n };\n\n return new DefaultChatTransport({fetch: fetchImpl});\n };\n}\n\nexport function createRemoteChatTransportFactory(params: {\n store: StoreApi<AiSliceStateForTransport>;\n defaultProvider: string;\n defaultModel: string;\n}) {\n return (endpoint: string, headers?: Record<string, string>) => {\n const fetchImpl = async (input: RequestInfo | URL, init?: RequestInit) => {\n // Get current session's model and provider at request time\n const state = params.store.getState();\n const currentSession = state.ai.getCurrentSession();\n const modelProvider =\n currentSession?.modelProvider || params.defaultProvider;\n const model = currentSession?.model || params.defaultModel;\n\n // Parse the existing body and add model information (defensive parsing)\n const body = init?.body as string;\n let parsed: unknown = {};\n try {\n parsed = body ? JSON.parse(body) : {};\n } catch {\n parsed = {};\n }\n\n const parsedObj =\n typeof parsed === 'object' && parsed !== null\n ? (parsed as Record<string, unknown>)\n : {};\n const enhancedBody = {\n ...parsedObj,\n modelProvider,\n model,\n };\n\n // Make the request with enhanced body\n return fetch(input, {\n ...init,\n body: JSON.stringify(enhancedBody),\n });\n };\n\n return new DefaultChatTransport({\n api: endpoint,\n credentials: 'include',\n headers,\n fetch: fetchImpl,\n });\n };\n}\n\nexport function createChatHandlers({\n store,\n}: {\n store: StoreApi<AiSliceStateForTransport>;\n}) {\n return {\n onChatToolCall: async ({\n toolCall,\n addToolResult,\n }: {\n toolCall: ToolCall;\n addToolResult?: AddToolResult;\n }) => {\n const {input, toolCallId, toolName} = toolCall;\n try {\n // handle client tools\n const state = store.getState();\n\n // Check if the stream was aborted before executing tool\n if (state.ai.analysisAbortController?.signal.aborted) {\n if (addToolResult) {\n addToolResult({\n tool: toolName,\n toolCallId,\n state: 'output-error',\n errorText: 'Operation cancelled by user',\n });\n }\n return;\n }\n\n const onToolCompleted = createOnToolCompletedHandler(store);\n const tools = convertToAiSDKTools(\n state.ai.tools || {},\n onToolCompleted,\n );\n\n // find tool from tools using toolName\n const tool = tools[toolName];\n if (tool && state.ai.tools[toolName]?.execute && tool.execute) {\n // Always provide a defined messages array to the tool runtime\n const sessionMessages = (state.ai.getCurrentSession()?.uiMessages ??\n []) as UIMessage[];\n const llmResult = await tool.execute(input, {\n toolCallId,\n messages: convertToModelMessages(sessionMessages),\n abortSignal: state.ai.analysisAbortController?.signal,\n });\n\n if (addToolResult) {\n // Note: When using sendAutomaticallyWhen, avoid awaiting addToolResult to prevent deadlocks\n addToolResult({\n tool: toolName,\n toolCallId,\n output: llmResult,\n });\n }\n } else {\n // Tool has no execute function - wait for UI component to call addToolResult\n // Check if there's a ToolComponent for this tool\n const hasToolComponent = !!state.ai.findToolComponent(toolName);\n if (hasToolComponent && state.ai.waitForToolResult) {\n try {\n // Wait for the UI component to call addToolResult\n await state.ai.waitForToolResult(\n toolCallId,\n state.ai.analysisAbortController?.signal,\n );\n } catch (error) {\n // If waiting was cancelled or failed, ensure we add an error result\n if (addToolResult && error instanceof Error) {\n addToolResult({\n tool: toolName,\n toolCallId,\n state: 'output-error',\n errorText: error.message,\n });\n }\n // Re-throw to let the outer catch handle it\n throw error;\n }\n }\n // If no ToolComponent, we still return (no-op) - the UI won't render anything\n // and the tool call will remain incomplete, which is fine for error handling\n }\n } catch (error) {\n // Check if this is an abort error\n const isAbortError = error instanceof ToolAbortError;\n\n if (addToolResult) {\n addToolResult({\n tool: toolName,\n toolCallId,\n state: 'output-error',\n errorText: isAbortError\n ? 'Operation cancelled by user'\n : getErrorMessageForDisplay(error),\n });\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChatData: (dataPart: DataUIPart<any>) => {\n // Handle additional tool output data from the backend (defensive guards)\n if (\n dataPart.type === 'data-tool-additional-output' &&\n dataPart.data &&\n (dataPart.data as {toolCallId?: unknown}).toolCallId != null\n ) {\n const {toolCallId, output} = dataPart.data as {\n toolCallId: string;\n output: unknown;\n };\n\n // Store the additional data in the session\n const currentSessionId = store.getState().ai.config.currentSessionId;\n if (currentSessionId) {\n store\n .getState()\n .ai.setSessionToolAdditionalData(\n currentSessionId,\n toolCallId,\n output,\n );\n }\n }\n },\n onChatFinish: ({messages}: {messages: UIMessage[]}) => {\n try {\n const currentSessionId = store.getState().ai.config.currentSessionId;\n if (!currentSessionId) return;\n\n // If the analysis has been aborted, force-complete and clean up immediately\n const aborted =\n !!store.getState().ai.analysisAbortController?.signal.aborted;\n if (aborted) {\n // If messages are empty (possible when stopping immediately), fall back to existing session messages\n const sessionMessages =\n (store.getState().ai.getCurrentSession()\n ?.uiMessages as UIMessage[]) || [];\n const sourceMessages =\n messages && messages.length > 0 ? messages : sessionMessages;\n\n const completedMessages = completeIncompleteToolCalls(sourceMessages);\n store\n .getState()\n .ai.setSessionUiMessages(currentSessionId, completedMessages);\n\n // Ensure an analysis result exists and is marked as cancelled\n store.setState((state: AiSliceStateForTransport) =>\n produce(state, (draft: AiSliceStateForTransport) => {\n draft.ai.isRunningAnalysis = false;\n draft.ai.analysisAbortController = undefined;\n\n const targetSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSessionId,\n );\n if (!targetSession) return;\n\n // Find the last user message\n const lastUserMessage = completedMessages\n .filter((msg) => msg.role === 'user')\n .slice(-1)[0];\n if (!lastUserMessage) return;\n\n const promptText = lastUserMessage.parts\n .filter((part) => part.type === 'text')\n .map((part) => (part as {text: string}).text)\n .join('');\n\n const pendingIndex = targetSession.analysisResults.findIndex(\n (result) => result.id === '__pending__',\n );\n\n if (pendingIndex !== -1) {\n targetSession.analysisResults[pendingIndex] = {\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: 'Operation cancelled by user'},\n isCompleted: true,\n };\n } else {\n const existing = targetSession.analysisResults.find(\n (r) => r.id === lastUserMessage.id,\n );\n if (!existing) {\n targetSession.analysisResults.push({\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: 'Operation cancelled by user'},\n isCompleted: true,\n });\n }\n }\n }),\n );\n return;\n }\n\n // Complete any incomplete tool-calls before saving (can happen with AbortController)\n const completedMessages = completeIncompleteToolCalls(messages);\n\n store\n .getState()\n .ai.setSessionUiMessages(currentSessionId, completedMessages);\n\n // Create or update analysis result with the user message ID for proper correlation\n store.setState((state: AiSliceStateForTransport) =>\n produce(state, (draft: AiSliceStateForTransport) => {\n const targetSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSessionId,\n );\n if (!targetSession) return;\n\n // Find the last user message to get its ID and prompt\n const lastUserMessage = completedMessages\n .filter((msg) => msg.role === 'user')\n .slice(-1)[0];\n\n if (lastUserMessage) {\n // Extract text content from user message\n const promptText = lastUserMessage.parts\n .filter((part) => part.type === 'text')\n .map((part) => (part as {text: string}).text)\n .join('');\n\n // Check if there's a pending analysis result\n const pendingIndex = targetSession.analysisResults.findIndex(\n (result) => result.id === '__pending__',\n );\n\n if (pendingIndex !== -1) {\n // Update the pending result with actual data\n targetSession.analysisResults[pendingIndex] = {\n id: lastUserMessage.id,\n prompt: promptText,\n isCompleted: true,\n };\n } else {\n // Check if analysis result already exists for this user message\n const existingResult = targetSession.analysisResults.find(\n (result) => result.id === lastUserMessage.id,\n );\n\n if (!existingResult) {\n // Create analysis result with the same ID as the user message\n targetSession.analysisResults.push({\n id: lastUserMessage.id,\n prompt: promptText,\n isCompleted: true,\n });\n }\n }\n }\n }),\n );\n\n // Determine if SDK wants to auto-send a follow-up turn (i.e., more steps pending)\n const shouldAutoSendNext = lastAssistantMessageIsCompleteWithToolCalls({\n messages: completedMessages,\n });\n\n // Step-aware completion: look only at parts after the most recent step-start\n const lastMessage = completedMessages[completedMessages.length - 1];\n const isLastMessageAssistant = lastMessage?.role === 'assistant';\n let tailHasTool = false;\n if (isLastMessageAssistant) {\n const parts = lastMessage?.parts ?? [];\n let lastStepStartIndex = -1;\n for (let i = parts.length - 1; i >= 0; i--) {\n if (parts[i]?.type === 'step-start') {\n lastStepStartIndex = i;\n break;\n }\n }\n const tailParts = parts.slice(lastStepStartIndex + 1);\n tailHasTool = tailParts.some(\n (part) =>\n typeof part?.type === 'string' &&\n (part.type.startsWith('tool-') || part.type === 'dynamic-tool'),\n );\n }\n\n // End analysis when there is no autosend and there are no pending tool parts\n // even if the assistant didn't emit additional text (e.g., tool-only tails).\n const shouldEndAnalysis =\n (isLastMessageAssistant && !shouldAutoSendNext && !tailHasTool) ||\n (!shouldAutoSendNext && !isLastMessageAssistant);\n\n if (shouldEndAnalysis) {\n store.setState((state: AiSliceStateForTransport) =>\n produce(state, (draft: AiSliceStateForTransport) => {\n draft.ai.isRunningAnalysis = false;\n draft.ai.analysisPrompt = '';\n draft.ai.analysisAbortController = undefined;\n }),\n );\n }\n } catch (err) {\n console.error('onChatFinish error:', err);\n throw err;\n }\n },\n onChatError: (error: unknown) => {\n try {\n let errMsg = getErrorMessageForDisplay(error);\n if (!errMsg || errMsg.trim().length === 0) {\n errMsg = 'Unknown error';\n }\n const currentSessionId = store.getState().ai.config.currentSessionId;\n store.setState((state: AiSliceStateForTransport) =>\n produce(state, (draft: AiSliceStateForTransport) => {\n if (!currentSessionId) return;\n const targetSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === currentSessionId,\n );\n if (targetSession) {\n // Ensure message structure is valid even on errors\n const existingMessages = (targetSession.uiMessages ||\n []) as UIMessage[];\n targetSession.uiMessages = completeIncompleteToolCalls(\n existingMessages,\n ) as unknown as AnalysisSessionSchema['uiMessages'];\n\n // Find the last user message to create analysis result with correct ID\n const uiMessages = targetSession.uiMessages as UIMessage[];\n const lastUserMessage = uiMessages\n .filter((msg) => msg.role === 'user')\n .slice(-1)[0];\n\n if (lastUserMessage) {\n // Extract text content from user message\n const promptText = lastUserMessage.parts\n .filter((part) => part.type === 'text')\n .map((part) => (part as {text: string}).text)\n .join('');\n\n // Check if there's a pending analysis result\n const pendingIndex = targetSession.analysisResults.findIndex(\n (result) => result.id === '__pending__',\n );\n\n if (pendingIndex !== -1) {\n // Update the pending result with error\n targetSession.analysisResults[pendingIndex] = {\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: errMsg},\n isCompleted: true,\n };\n } else {\n // Check if analysis result already exists for this user message\n const existingResult = targetSession.analysisResults.find(\n (result) => result.id === lastUserMessage.id,\n );\n\n if (!existingResult) {\n // Create analysis result with the same ID as the user message\n targetSession.analysisResults.push({\n id: lastUserMessage.id,\n prompt: promptText,\n errorMessage: {error: errMsg},\n isCompleted: true,\n });\n } else {\n // Update existing result with error message\n existingResult.errorMessage = {error: errMsg};\n }\n }\n }\n }\n draft.ai.isRunningAnalysis = false;\n draft.ai.analysisAbortController = undefined;\n }),\n );\n } catch (err) {\n console.error('Failed to store chat error:', err);\n throw err;\n }\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalysisAnswer.d.ts","sourceRoot":"","sources":["../../src/components/AnalysisAnswer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAiB,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAQpD,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAChD,CAAC;AA6GF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"AnalysisAnswer.d.ts","sourceRoot":"","sources":["../../src/components/AnalysisAnswer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAiB,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAQpD,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,wBAAwB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAChD,CAAC;AA6GF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,iDA6EzB,CAAC"}
|
|
@@ -96,7 +96,6 @@ export const AnalysisAnswer = React.memo(function AnalysisAnswer(props) {
|
|
|
96
96
|
}
|
|
97
97
|
}, [thinkContents, expandedThink, toggleThinkExpansion]);
|
|
98
98
|
return (_jsx("div", { className: "flex flex-col gap-5", children: _jsx(MessageContainer, { isSuccess: true, type: isAnswer ? 'answer' : 'thinking', content: { content, isAnswer }, children: _jsx("div", { className: "prose dark:prose-invert max-w-none text-sm", children: _jsx(Markdown, { remarkPlugins: [remarkGfm], rehypePlugins: [rehypeRaw], components: {
|
|
99
|
-
// @ts-expect-error - Custom HTML element not in react-markdown types
|
|
100
99
|
'think-block': thinkBlockComponent,
|
|
101
100
|
...customMarkdownComponents,
|
|
102
101
|
}, children: processedContent }) }) }) }));
|