@sqlrooms/ai-core 0.27.0-rc.1 → 0.27.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/AiSlice.d.ts +1 -0
  2. package/dist/AiSlice.d.ts.map +1 -1
  3. package/dist/AiSlice.js +48 -0
  4. package/dist/AiSlice.js.map +1 -1
  5. package/dist/components/AnalysisResult.d.ts +1 -1
  6. package/dist/components/AnalysisResult.d.ts.map +1 -1
  7. package/dist/components/AnalysisResult.js +1 -1
  8. package/dist/components/AnalysisResult.js.map +1 -1
  9. package/dist/components/AnalysisResultsContainer.d.ts +1 -1
  10. package/dist/components/AnalysisResultsContainer.d.ts.map +1 -1
  11. package/dist/components/AnalysisResultsContainer.js +2 -2
  12. package/dist/components/AnalysisResultsContainer.js.map +1 -1
  13. package/dist/components/Chat.d.ts +7 -0
  14. package/dist/components/Chat.d.ts.map +1 -1
  15. package/dist/components/Chat.js +8 -0
  16. package/dist/components/Chat.js.map +1 -1
  17. package/dist/components/ErrorMessage.d.ts +2 -0
  18. package/dist/components/ErrorMessage.d.ts.map +1 -1
  19. package/dist/components/ErrorMessage.js +1 -1
  20. package/dist/components/ErrorMessage.js.map +1 -1
  21. package/dist/components/GroupedMessageParts.d.ts.map +1 -1
  22. package/dist/components/GroupedMessageParts.js +6 -0
  23. package/dist/components/GroupedMessageParts.js.map +1 -1
  24. package/dist/components/MessageContainer.js +1 -1
  25. package/dist/components/MessageContainer.js.map +1 -1
  26. package/dist/components/PromptSuggestions.d.ts +2 -0
  27. package/dist/components/PromptSuggestions.d.ts.map +1 -1
  28. package/dist/components/PromptSuggestions.js +15 -8
  29. package/dist/components/PromptSuggestions.js.map +1 -1
  30. package/dist/components/QueryControls.d.ts.map +1 -1
  31. package/dist/components/QueryControls.js +3 -13
  32. package/dist/components/QueryControls.js.map +1 -1
  33. package/dist/components/SessionControls.d.ts.map +1 -1
  34. package/dist/components/SessionControls.js +19 -29
  35. package/dist/components/SessionControls.js.map +1 -1
  36. package/dist/components/ToolPartRenderer.d.ts.map +1 -1
  37. package/dist/components/ToolPartRenderer.js +8 -5
  38. package/dist/components/ToolPartRenderer.js.map +1 -1
  39. package/dist/components/tools/ToolErrorMessage.d.ts +1 -30
  40. package/dist/components/tools/ToolErrorMessage.d.ts.map +1 -1
  41. package/dist/components/tools/ToolErrorMessage.js +18 -14
  42. package/dist/components/tools/ToolErrorMessage.js.map +1 -1
  43. package/package.json +7 -7
package/dist/AiSlice.d.ts CHANGED
@@ -44,6 +44,7 @@ export type AiSliceState = {
44
44
  switchSession: (sessionId: string) => void;
45
45
  renameSession: (sessionId: string, name: string) => void;
46
46
  deleteSession: (sessionId: string) => void;
47
+ setOpenSessionTabs: (tabs: string[]) => void;
47
48
  getCurrentSession: () => AnalysisSessionSchema | undefined;
48
49
  setSessionUiMessages: (sessionId: string, uiMessages: UIMessage[]) => void;
49
50
  setSessionToolAdditionalData: (sessionId: string, toolCallId: string, additionalData: unknown) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AiSlice.d.ts","sourceRoot":"","sources":["../src/AiSlice.ts"],"names":[],"mappings":"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"}
package/dist/AiSlice.js CHANGED
@@ -45,6 +45,18 @@ export function createAiSlice(params) {
45
45
  firstSession.isRunning = false;
46
46
  }
47
47
  }
48
+ // Clean up openSessionTabs for sessions that no longer exist and ensure it's initialized
49
+ const sessionIdSet = new Set(baseConfig.sessions.map((s) => s.id));
50
+ if (baseConfig.openSessionTabs && baseConfig.openSessionTabs.length > 0) {
51
+ baseConfig.openSessionTabs = baseConfig.openSessionTabs.filter((id) => sessionIdSet.has(id));
52
+ }
53
+ // Ensure openSessionTabs is initialized with current session if empty/missing
54
+ if (!baseConfig.openSessionTabs ||
55
+ baseConfig.openSessionTabs.length === 0) {
56
+ baseConfig.openSessionTabs = baseConfig.currentSessionId
57
+ ? [baseConfig.currentSessionId]
58
+ : [];
59
+ }
48
60
  return {
49
61
  ai: {
50
62
  config: baseConfig,
@@ -241,6 +253,7 @@ export function createAiSlice(params) {
241
253
  sessionName = `Session ${formattedDate} at ${formattedTime}`;
242
254
  }
243
255
  set((state) => produce(state, (draft) => {
256
+ const now = Date.now();
244
257
  // Add to AI sessions with per-session state
245
258
  draft.ai.config.sessions.unshift({
246
259
  id: newSessionId,
@@ -256,8 +269,14 @@ export function createAiSlice(params) {
256
269
  messagesRevision: 0,
257
270
  prompt: '',
258
271
  isRunning: false,
272
+ lastOpenedAt: now,
259
273
  });
260
274
  draft.ai.config.currentSessionId = newSessionId;
275
+ // Add new session to open tabs
276
+ if (!draft.ai.config.openSessionTabs) {
277
+ draft.ai.config.openSessionTabs = [];
278
+ }
279
+ draft.ai.config.openSessionTabs.push(newSessionId);
261
280
  }));
262
281
  },
263
282
  /**
@@ -265,7 +284,29 @@ export function createAiSlice(params) {
265
284
  */
266
285
  switchSession: (sessionId) => {
267
286
  set((state) => produce(state, (draft) => {
287
+ const now = Date.now();
268
288
  draft.ai.config.currentSessionId = sessionId;
289
+ // Ensure current session is always in openSessionTabs
290
+ if (!draft.ai.config.openSessionTabs) {
291
+ draft.ai.config.openSessionTabs = [];
292
+ }
293
+ if (!draft.ai.config.openSessionTabs.includes(sessionId)) {
294
+ draft.ai.config.openSessionTabs.push(sessionId);
295
+ }
296
+ const session = draft.ai.config.sessions.find((s) => s.id === sessionId);
297
+ if (session) {
298
+ session.lastOpenedAt = now;
299
+ }
300
+ }));
301
+ },
302
+ /**
303
+ * Set the list of open session tab IDs
304
+ */
305
+ setOpenSessionTabs: (tabs) => {
306
+ set((state) => produce(state, (draft) => {
307
+ // Filter out any tabs for sessions that no longer exist
308
+ const sessionIdSet = new Set(draft.ai.config.sessions.map((s) => s.id));
309
+ draft.ai.config.openSessionTabs = tabs.filter((id) => sessionIdSet.has(id));
269
310
  }));
270
311
  },
271
312
  /**
@@ -292,12 +333,18 @@ export function createAiSlice(params) {
292
333
  sessionChatStops.delete(sessionId);
293
334
  sessionChatSendMessages.delete(sessionId);
294
335
  sessionAddToolResults.delete(sessionId);
336
+ const now = Date.now();
295
337
  set((state) => produce(state, (draft) => {
296
338
  const sessionIndex = draft.ai.config.sessions.findIndex((s) => s.id === sessionId);
297
339
  if (sessionIndex !== -1) {
298
340
  // Don't delete the last session
299
341
  if (draft.ai.config.sessions.length > 1) {
300
342
  draft.ai.config.sessions.splice(sessionIndex, 1);
343
+ // Remove from open tabs
344
+ if (draft.ai.config.openSessionTabs) {
345
+ draft.ai.config.openSessionTabs =
346
+ draft.ai.config.openSessionTabs.filter((id) => id !== sessionId);
347
+ }
301
348
  // If we deleted the current session, switch to another one
302
349
  if (draft.ai.config.currentSessionId === sessionId) {
303
350
  // Make sure there's at least one session before accessing its id
@@ -305,6 +352,7 @@ export function createAiSlice(params) {
305
352
  const firstSession = draft.ai.config.sessions[0];
306
353
  if (firstSession) {
307
354
  draft.ai.config.currentSessionId = firstSession.id;
355
+ firstSession.lastOpenedAt = now;
308
356
  }
309
357
  }
310
358
  }
@@ -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 ChatOnDataCallback,\n generateText,\n} from 'ai';\nimport {\n createChatHandlers,\n createLocalChatTransportFactory,\n createRemoteChatTransportFactory,\n ToolCall,\n convertToAiSDKTools,\n} from './chatTransport';\nimport {\n ABORT_EVENT,\n AI_DEFAULT_TEMPERATURE,\n ANALYSIS_CANCELLED,\n ANALYSIS_PENDING_ID,\n SESSION_DELETED,\n TOOL_CALL_CANCELLED,\n} from './constants';\nimport {hasAiSettingsConfig} from './hasAiSettingsConfig';\nimport {OpenAssistantToolSet} from '@openassistant/utils';\nimport type {\n AddToolResult,\n AiChatSendMessage,\n GetProviderOptions,\n} from './types';\nimport {\n cleanupPendingAnalysisResults,\n ToolAbortError,\n fixIncompleteToolCalls,\n} from './utils';\nimport {createOpenAICompatible} from '@ai-sdk/openai-compatible';\n\nexport type AiSliceState = {\n ai: {\n config: AiSliceConfig;\n promptSuggestionsVisible: boolean;\n tools: OpenAssistantToolSet;\n getProviderOptions?: GetProviderOptions;\n setConfig: (config: AiSliceConfig) => void;\n setPromptSuggestionsVisible: (visible: boolean) => void;\n getAbortController: (sessionId: string) => AbortController | undefined;\n setAbortController: (\n sessionId: string,\n controller: AbortController | undefined,\n ) => void;\n setChatStop: (sessionId: string, stop: (() => void) | undefined) => void;\n getChatStop: (sessionId: string) => (() => void) | undefined;\n setChatSendMessage: (\n sessionId: string,\n sendMessage: AiChatSendMessage | undefined,\n ) => void;\n getChatSendMessage: (sessionId: string) => AiChatSendMessage | undefined;\n setAddToolResult: (\n sessionId: string,\n addToolResult: AddToolResult | undefined,\n ) => void;\n getAddToolResult: (sessionId: string) => AddToolResult | undefined;\n waitForToolResult: (\n sessionId: string,\n toolCallId: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n /** Map toolCallId -> sessionId for long-running tool streams (e.g. agent tools) */\n setToolCallSession: (\n toolCallId: string,\n sessionId: string | undefined,\n ) => void;\n getToolCallSession: (toolCallId: string) => string | undefined;\n setPrompt: (sessionId: string, prompt: string) => void;\n getPrompt: (sessionId: string) => string;\n setIsRunning: (sessionId: string, isRunning: boolean) => void;\n getIsRunning: (sessionId: string) => boolean;\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: (sessionId: string) => Promise<void>;\n cancelAnalysis: (sessionId: string) => 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[] | undefined;\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 getLocalChatTransport: (\n sessionId: string,\n ) => 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 sessionId: string,\n endpoint: string,\n headers?: Record<string, string>,\n ) => DefaultChatTransport<UIMessage>;\n onChatFinish: (args: {\n sessionId: string;\n messages: UIMessage[];\n isError?: boolean;\n }) => void;\n onChatToolCall: (args: {\n sessionId: string;\n toolCall: ToolCall;\n addToolResult?: AddToolResult;\n }) => Promise<void> | void;\n onChatData: (\n sessionId: string,\n dataPart: Parameters<ChatOnDataCallback<UIMessage>>[0],\n ) => void;\n onChatError: (sessionId: string, error: unknown) => void;\n };\n};\n\n/**\n * Configuration options for creating an AI slice\n */\nexport interface AiSliceOptions {\n config?: Partial<AiSliceConfig>;\n initialPrompt?: string;\n tools: OpenAssistantToolSet;\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 getProviderOptions?: GetProviderOptions;\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 initialPrompt = '',\n tools,\n getApiKey,\n getBaseUrl,\n maxSteps = 50,\n getInstructions,\n defaultProvider = 'openai',\n defaultModel = 'gpt-4.1',\n getCustomModel,\n getProviderOptions,\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 ? fixIncompleteToolCalls(\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 persistent Maps (outside of immer draft)\n const pendingToolCallResolvers = new Map<\n string,\n {resolve: () => void; reject: (error: Error) => void}\n >();\n\n const toolCallToSessionId = new Map<string, string>();\n const sessionAbortControllers = new Map<string, AbortController>();\n const sessionChatStops = new Map<string, () => void>();\n const sessionChatSendMessages = new Map<string, AiChatSendMessage>();\n const sessionAddToolResults = new Map<string, AddToolResult>();\n\n // Initialize base config and ensure the initial session respects default provider/model\n const baseConfig = createDefaultAiConfig(cleanedConfig);\n if (!cleanedConfig?.sessions || cleanedConfig.sessions.length === 0) {\n const firstSession = baseConfig.sessions[0];\n if (firstSession) {\n firstSession.modelProvider = defaultProvider;\n firstSession.model = defaultModel;\n firstSession.prompt = initialPrompt;\n firstSession.isRunning = false;\n }\n }\n\n return {\n ai: {\n config: baseConfig,\n promptSuggestionsVisible: true,\n tools,\n getProviderOptions,\n waitForToolResult: (\n sessionId: string,\n toolCallId: string,\n abortSignal?: AbortSignal,\n ) => {\n const key = `${sessionId}:${toolCallId}`;\n return new Promise<void>((resolve, reject) => {\n // Set up abort handler\n const abortHandler = () => {\n const resolver = pendingToolCallResolvers.get(key);\n if (resolver) {\n pendingToolCallResolvers.delete(key);\n resolver.reject(new Error(TOOL_CALL_CANCELLED));\n }\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n reject(new Error(TOOL_CALL_CANCELLED));\n return;\n }\n abortSignal.addEventListener(ABORT_EVENT, abortHandler, {\n once: true,\n });\n }\n\n // Store resolver (overwrites any existing one, which is fine for our use case)\n pendingToolCallResolvers.set(key, {\n resolve: () => {\n if (abortSignal) {\n abortSignal.removeEventListener(ABORT_EVENT, abortHandler);\n }\n pendingToolCallResolvers.delete(key);\n resolve();\n },\n reject: (error: Error) => {\n if (abortSignal) {\n abortSignal.removeEventListener(ABORT_EVENT, abortHandler);\n }\n pendingToolCallResolvers.delete(key);\n reject(error);\n },\n });\n });\n },\n\n setToolCallSession: (\n toolCallId: string,\n sessionId: string | undefined,\n ) => {\n if (!toolCallId) return;\n if (sessionId) {\n toolCallToSessionId.set(toolCallId, sessionId);\n } else {\n toolCallToSessionId.delete(toolCallId);\n }\n },\n getToolCallSession: (toolCallId: string) => {\n if (!toolCallId) return undefined;\n return toolCallToSessionId.get(toolCallId);\n },\n\n getAbortController: (sessionId: string) => {\n return sessionAbortControllers.get(sessionId);\n },\n setAbortController: (\n sessionId: string,\n controller: AbortController | undefined,\n ) => {\n if (controller) {\n sessionAbortControllers.set(sessionId, controller);\n } else {\n sessionAbortControllers.delete(sessionId);\n }\n },\n\n setChatStop: (sessionId: string, stopFn: (() => void) | undefined) => {\n if (stopFn) {\n sessionChatStops.set(sessionId, stopFn);\n } else {\n sessionChatStops.delete(sessionId);\n }\n },\n getChatStop: (sessionId: string) => {\n return sessionChatStops.get(sessionId);\n },\n\n setChatSendMessage: (\n sessionId: string,\n sendMessageFn: AiChatSendMessage | undefined,\n ) => {\n if (sendMessageFn) {\n sessionChatSendMessages.set(sessionId, sendMessageFn);\n } else {\n sessionChatSendMessages.delete(sessionId);\n }\n },\n getChatSendMessage: (sessionId: string) => {\n return sessionChatSendMessages.get(sessionId);\n },\n\n setAddToolResult: (\n sessionId: string,\n addToolResultFn: AddToolResult | undefined,\n ) => {\n if (addToolResultFn) {\n // Wrap addToolResult to intercept calls and resolve pending promises\n const wrappedAddToolResult: AddToolResult = (options) => {\n addToolResultFn(options);\n const key = `${sessionId}:${options.toolCallId}`;\n const resolver = pendingToolCallResolvers.get(key);\n if (resolver) {\n resolver.resolve();\n }\n // Tool is complete (success or error), we can drop toolCall->session mapping.\n toolCallToSessionId.delete(options.toolCallId);\n };\n sessionAddToolResults.set(sessionId, wrappedAddToolResult);\n } else {\n sessionAddToolResults.delete(sessionId);\n }\n },\n getAddToolResult: (sessionId: string) => {\n return sessionAddToolResults.get(sessionId);\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 setPrompt: (sessionId: string, prompt: 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.prompt = prompt;\n }\n }),\n );\n },\n getPrompt: (sessionId: string) => {\n const state = get();\n const session = state.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n return session?.prompt || '';\n },\n\n setIsRunning: (sessionId: string, isRunning: boolean) => {\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.isRunning = isRunning;\n }\n }),\n );\n },\n getIsRunning: (sessionId: string) => {\n const state = get();\n const session = state.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n return session?.isRunning || false;\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 with per-session state\n draft.ai.config.sessions.unshift({\n id: newSessionId,\n name: sessionName,\n modelProvider:\n modelProvider ||\n currentSession?.modelProvider ||\n defaultProvider,\n model: model || currentSession?.model || defaultModel,\n analysisResults: [],\n createdAt: new Date(),\n uiMessages: [],\n toolAdditionalData: {},\n messagesRevision: 0,\n prompt: '',\n isRunning: false,\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 and clean up its resources\n */\n deleteSession: (sessionId: string) => {\n // Clean up per-session state\n const abortController = sessionAbortControllers.get(sessionId);\n if (abortController) {\n abortController.abort(SESSION_DELETED);\n }\n sessionAbortControllers.delete(sessionId);\n sessionChatStops.delete(sessionId);\n sessionChatSendMessages.delete(sessionId);\n sessionAddToolResults.delete(sessionId);\n\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(); // only used when no model provider is provided\n const {\n systemInstructions,\n modelProvider,\n modelName,\n baseUrl,\n abortSignal,\n useTools = false,\n } = options;\n\n if (abortSignal?.aborted) {\n throw new ToolAbortError(TOOL_CALL_CANCELLED);\n }\n\n const provider =\n modelProvider || currentSession?.modelProvider || defaultProvider;\n const modelId = modelName || currentSession?.model || defaultModel;\n const baseURL = baseUrl ?? state.ai.getBaseUrlFromSettings() ?? '';\n const tools = state.ai.tools;\n\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 temperature: AI_DEFAULT_TEMPERATURE,\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 const errorName =\n typeof error === 'object' && error && 'name' in error\n ? String((error as {name?: unknown}).name)\n : '';\n if (abortSignal?.aborted || errorName === 'AbortError') {\n throw new ToolAbortError(TOOL_CALL_CANCELLED);\n }\n console.error('Error generating text:', error);\n return 'error: can not generate response';\n }\n },\n\n /**\n * Start the analysis for a specific session\n */\n startAnalysis: async (sessionId: string) => {\n const state = get();\n const session = state.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n\n if (!session) {\n console.error('Session not found:', sessionId);\n return;\n }\n\n const sendMessage = state.ai.getChatSendMessage(sessionId);\n if (!sendMessage) {\n console.error(\n 'No sendMessage function found for session:',\n sessionId,\n );\n return;\n }\n\n const abortController = new AbortController();\n const promptText = session.prompt || '';\n\n // Store abort controller for this session\n state.ai.setAbortController(sessionId, abortController);\n\n set((stateToUpdate) =>\n produce(stateToUpdate, (draft) => {\n const draftSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (draftSession) {\n draftSession.isRunning = true;\n draftSession.prompt = '';\n draft.ai.promptSuggestionsVisible = false;\n\n // Remove any existing pending results\n draftSession.analysisResults =\n draftSession.analysisResults.filter(\n (result: AnalysisResultSchema) =>\n result.id !== ANALYSIS_PENDING_ID,\n );\n\n // Add incomplete analysis result with a temporary ID\n draftSession.analysisResults.push({\n id: ANALYSIS_PENDING_ID,\n prompt: promptText,\n isCompleted: false,\n });\n }\n }),\n );\n\n // Send the message through the session's chat instance\n sendMessage({text: promptText});\n },\n\n cancelAnalysis: (sessionId: string) => {\n const state = get();\n const abortController = state.ai.getAbortController(sessionId);\n const stopFn = state.ai.getChatStop(sessionId);\n\n // Stop local chat streaming immediately if available\n stopFn?.();\n\n abortController?.abort(ANALYSIS_CANCELLED);\n\n set((stateToUpdate) =>\n produce(stateToUpdate, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.isRunning = false;\n }\n // Keep abort controller so handlers can check signal.aborted\n // It will be cleared by onChatFinish\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: () => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return undefined;\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: (sessionId: string) => {\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 sessionId,\n })();\n },\n\n getRemoteChatTransport: (\n sessionId: string,\n endpoint: string,\n headers?: Record<string, string>,\n ) =>\n createRemoteChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n sessionId,\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 ChatOnDataCallback,\n generateText,\n} from 'ai';\nimport {\n createChatHandlers,\n createLocalChatTransportFactory,\n createRemoteChatTransportFactory,\n ToolCall,\n convertToAiSDKTools,\n} from './chatTransport';\nimport {\n ABORT_EVENT,\n AI_DEFAULT_TEMPERATURE,\n ANALYSIS_CANCELLED,\n ANALYSIS_PENDING_ID,\n SESSION_DELETED,\n TOOL_CALL_CANCELLED,\n} from './constants';\nimport {hasAiSettingsConfig} from './hasAiSettingsConfig';\nimport {OpenAssistantToolSet} from '@openassistant/utils';\nimport type {\n AddToolResult,\n AiChatSendMessage,\n GetProviderOptions,\n} from './types';\nimport {\n cleanupPendingAnalysisResults,\n ToolAbortError,\n fixIncompleteToolCalls,\n} from './utils';\nimport {createOpenAICompatible} from '@ai-sdk/openai-compatible';\n\nexport type AiSliceState = {\n ai: {\n config: AiSliceConfig;\n promptSuggestionsVisible: boolean;\n tools: OpenAssistantToolSet;\n getProviderOptions?: GetProviderOptions;\n setConfig: (config: AiSliceConfig) => void;\n setPromptSuggestionsVisible: (visible: boolean) => void;\n getAbortController: (sessionId: string) => AbortController | undefined;\n setAbortController: (\n sessionId: string,\n controller: AbortController | undefined,\n ) => void;\n setChatStop: (sessionId: string, stop: (() => void) | undefined) => void;\n getChatStop: (sessionId: string) => (() => void) | undefined;\n setChatSendMessage: (\n sessionId: string,\n sendMessage: AiChatSendMessage | undefined,\n ) => void;\n getChatSendMessage: (sessionId: string) => AiChatSendMessage | undefined;\n setAddToolResult: (\n sessionId: string,\n addToolResult: AddToolResult | undefined,\n ) => void;\n getAddToolResult: (sessionId: string) => AddToolResult | undefined;\n waitForToolResult: (\n sessionId: string,\n toolCallId: string,\n abortSignal?: AbortSignal,\n ) => Promise<void>;\n /** Map toolCallId -> sessionId for long-running tool streams (e.g. agent tools) */\n setToolCallSession: (\n toolCallId: string,\n sessionId: string | undefined,\n ) => void;\n getToolCallSession: (toolCallId: string) => string | undefined;\n setPrompt: (sessionId: string, prompt: string) => void;\n getPrompt: (sessionId: string) => string;\n setIsRunning: (sessionId: string, isRunning: boolean) => void;\n getIsRunning: (sessionId: string) => boolean;\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: (sessionId: string) => Promise<void>;\n cancelAnalysis: (sessionId: string) => 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 setOpenSessionTabs: (tabs: 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[] | undefined;\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 getLocalChatTransport: (\n sessionId: string,\n ) => 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 sessionId: string,\n endpoint: string,\n headers?: Record<string, string>,\n ) => DefaultChatTransport<UIMessage>;\n onChatFinish: (args: {\n sessionId: string;\n messages: UIMessage[];\n isError?: boolean;\n }) => void;\n onChatToolCall: (args: {\n sessionId: string;\n toolCall: ToolCall;\n addToolResult?: AddToolResult;\n }) => Promise<void> | void;\n onChatData: (\n sessionId: string,\n dataPart: Parameters<ChatOnDataCallback<UIMessage>>[0],\n ) => void;\n onChatError: (sessionId: string, error: unknown) => void;\n };\n};\n\n/**\n * Configuration options for creating an AI slice\n */\nexport interface AiSliceOptions {\n config?: Partial<AiSliceConfig>;\n initialPrompt?: string;\n tools: OpenAssistantToolSet;\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 getProviderOptions?: GetProviderOptions;\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 initialPrompt = '',\n tools,\n getApiKey,\n getBaseUrl,\n maxSteps = 50,\n getInstructions,\n defaultProvider = 'openai',\n defaultModel = 'gpt-4.1',\n getCustomModel,\n getProviderOptions,\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 ? fixIncompleteToolCalls(\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 persistent Maps (outside of immer draft)\n const pendingToolCallResolvers = new Map<\n string,\n {resolve: () => void; reject: (error: Error) => void}\n >();\n\n const toolCallToSessionId = new Map<string, string>();\n const sessionAbortControllers = new Map<string, AbortController>();\n const sessionChatStops = new Map<string, () => void>();\n const sessionChatSendMessages = new Map<string, AiChatSendMessage>();\n const sessionAddToolResults = new Map<string, AddToolResult>();\n\n // Initialize base config and ensure the initial session respects default provider/model\n const baseConfig = createDefaultAiConfig(cleanedConfig);\n if (!cleanedConfig?.sessions || cleanedConfig.sessions.length === 0) {\n const firstSession = baseConfig.sessions[0];\n if (firstSession) {\n firstSession.modelProvider = defaultProvider;\n firstSession.model = defaultModel;\n firstSession.prompt = initialPrompt;\n firstSession.isRunning = false;\n }\n }\n\n // Clean up openSessionTabs for sessions that no longer exist and ensure it's initialized\n const sessionIdSet = new Set(baseConfig.sessions.map((s) => s.id));\n if (baseConfig.openSessionTabs && baseConfig.openSessionTabs.length > 0) {\n baseConfig.openSessionTabs = baseConfig.openSessionTabs.filter((id) =>\n sessionIdSet.has(id),\n );\n }\n // Ensure openSessionTabs is initialized with current session if empty/missing\n if (\n !baseConfig.openSessionTabs ||\n baseConfig.openSessionTabs.length === 0\n ) {\n baseConfig.openSessionTabs = baseConfig.currentSessionId\n ? [baseConfig.currentSessionId]\n : [];\n }\n\n return {\n ai: {\n config: baseConfig,\n promptSuggestionsVisible: true,\n tools,\n getProviderOptions,\n waitForToolResult: (\n sessionId: string,\n toolCallId: string,\n abortSignal?: AbortSignal,\n ) => {\n const key = `${sessionId}:${toolCallId}`;\n return new Promise<void>((resolve, reject) => {\n // Set up abort handler\n const abortHandler = () => {\n const resolver = pendingToolCallResolvers.get(key);\n if (resolver) {\n pendingToolCallResolvers.delete(key);\n resolver.reject(new Error(TOOL_CALL_CANCELLED));\n }\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n reject(new Error(TOOL_CALL_CANCELLED));\n return;\n }\n abortSignal.addEventListener(ABORT_EVENT, abortHandler, {\n once: true,\n });\n }\n\n // Store resolver (overwrites any existing one, which is fine for our use case)\n pendingToolCallResolvers.set(key, {\n resolve: () => {\n if (abortSignal) {\n abortSignal.removeEventListener(ABORT_EVENT, abortHandler);\n }\n pendingToolCallResolvers.delete(key);\n resolve();\n },\n reject: (error: Error) => {\n if (abortSignal) {\n abortSignal.removeEventListener(ABORT_EVENT, abortHandler);\n }\n pendingToolCallResolvers.delete(key);\n reject(error);\n },\n });\n });\n },\n\n setToolCallSession: (\n toolCallId: string,\n sessionId: string | undefined,\n ) => {\n if (!toolCallId) return;\n if (sessionId) {\n toolCallToSessionId.set(toolCallId, sessionId);\n } else {\n toolCallToSessionId.delete(toolCallId);\n }\n },\n getToolCallSession: (toolCallId: string) => {\n if (!toolCallId) return undefined;\n return toolCallToSessionId.get(toolCallId);\n },\n\n getAbortController: (sessionId: string) => {\n return sessionAbortControllers.get(sessionId);\n },\n setAbortController: (\n sessionId: string,\n controller: AbortController | undefined,\n ) => {\n if (controller) {\n sessionAbortControllers.set(sessionId, controller);\n } else {\n sessionAbortControllers.delete(sessionId);\n }\n },\n\n setChatStop: (sessionId: string, stopFn: (() => void) | undefined) => {\n if (stopFn) {\n sessionChatStops.set(sessionId, stopFn);\n } else {\n sessionChatStops.delete(sessionId);\n }\n },\n getChatStop: (sessionId: string) => {\n return sessionChatStops.get(sessionId);\n },\n\n setChatSendMessage: (\n sessionId: string,\n sendMessageFn: AiChatSendMessage | undefined,\n ) => {\n if (sendMessageFn) {\n sessionChatSendMessages.set(sessionId, sendMessageFn);\n } else {\n sessionChatSendMessages.delete(sessionId);\n }\n },\n getChatSendMessage: (sessionId: string) => {\n return sessionChatSendMessages.get(sessionId);\n },\n\n setAddToolResult: (\n sessionId: string,\n addToolResultFn: AddToolResult | undefined,\n ) => {\n if (addToolResultFn) {\n // Wrap addToolResult to intercept calls and resolve pending promises\n const wrappedAddToolResult: AddToolResult = (options) => {\n addToolResultFn(options);\n const key = `${sessionId}:${options.toolCallId}`;\n const resolver = pendingToolCallResolvers.get(key);\n if (resolver) {\n resolver.resolve();\n }\n // Tool is complete (success or error), we can drop toolCall->session mapping.\n toolCallToSessionId.delete(options.toolCallId);\n };\n sessionAddToolResults.set(sessionId, wrappedAddToolResult);\n } else {\n sessionAddToolResults.delete(sessionId);\n }\n },\n getAddToolResult: (sessionId: string) => {\n return sessionAddToolResults.get(sessionId);\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 setPrompt: (sessionId: string, prompt: 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.prompt = prompt;\n }\n }),\n );\n },\n getPrompt: (sessionId: string) => {\n const state = get();\n const session = state.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n return session?.prompt || '';\n },\n\n setIsRunning: (sessionId: string, isRunning: boolean) => {\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.isRunning = isRunning;\n }\n }),\n );\n },\n getIsRunning: (sessionId: string) => {\n const state = get();\n const session = state.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n return session?.isRunning || false;\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 const now = Date.now();\n // Add to AI sessions with per-session state\n draft.ai.config.sessions.unshift({\n id: newSessionId,\n name: sessionName,\n modelProvider:\n modelProvider ||\n currentSession?.modelProvider ||\n defaultProvider,\n model: model || currentSession?.model || defaultModel,\n analysisResults: [],\n createdAt: new Date(),\n uiMessages: [],\n toolAdditionalData: {},\n messagesRevision: 0,\n prompt: '',\n isRunning: false,\n lastOpenedAt: now,\n });\n draft.ai.config.currentSessionId = newSessionId;\n // Add new session to open tabs\n if (!draft.ai.config.openSessionTabs) {\n draft.ai.config.openSessionTabs = [];\n }\n draft.ai.config.openSessionTabs.push(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 const now = Date.now();\n draft.ai.config.currentSessionId = sessionId;\n // Ensure current session is always in openSessionTabs\n if (!draft.ai.config.openSessionTabs) {\n draft.ai.config.openSessionTabs = [];\n }\n if (!draft.ai.config.openSessionTabs.includes(sessionId)) {\n draft.ai.config.openSessionTabs.push(sessionId);\n }\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.lastOpenedAt = now;\n }\n }),\n );\n },\n\n /**\n * Set the list of open session tab IDs\n */\n setOpenSessionTabs: (tabs: string[]) => {\n set((state) =>\n produce(state, (draft) => {\n // Filter out any tabs for sessions that no longer exist\n const sessionIdSet = new Set(\n draft.ai.config.sessions.map((s) => s.id),\n );\n draft.ai.config.openSessionTabs = tabs.filter((id) =>\n sessionIdSet.has(id),\n );\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 and clean up its resources\n */\n deleteSession: (sessionId: string) => {\n // Clean up per-session state\n const abortController = sessionAbortControllers.get(sessionId);\n if (abortController) {\n abortController.abort(SESSION_DELETED);\n }\n sessionAbortControllers.delete(sessionId);\n sessionChatStops.delete(sessionId);\n sessionChatSendMessages.delete(sessionId);\n sessionAddToolResults.delete(sessionId);\n const now = Date.now();\n\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 // Remove from open tabs\n if (draft.ai.config.openSessionTabs) {\n draft.ai.config.openSessionTabs =\n draft.ai.config.openSessionTabs.filter(\n (id) => id !== sessionId,\n );\n }\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 firstSession.lastOpenedAt = now;\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(); // only used when no model provider is provided\n const {\n systemInstructions,\n modelProvider,\n modelName,\n baseUrl,\n abortSignal,\n useTools = false,\n } = options;\n\n if (abortSignal?.aborted) {\n throw new ToolAbortError(TOOL_CALL_CANCELLED);\n }\n\n const provider =\n modelProvider || currentSession?.modelProvider || defaultProvider;\n const modelId = modelName || currentSession?.model || defaultModel;\n const baseURL = baseUrl ?? state.ai.getBaseUrlFromSettings() ?? '';\n const tools = state.ai.tools;\n\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 temperature: AI_DEFAULT_TEMPERATURE,\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 const errorName =\n typeof error === 'object' && error && 'name' in error\n ? String((error as {name?: unknown}).name)\n : '';\n if (abortSignal?.aborted || errorName === 'AbortError') {\n throw new ToolAbortError(TOOL_CALL_CANCELLED);\n }\n console.error('Error generating text:', error);\n return 'error: can not generate response';\n }\n },\n\n /**\n * Start the analysis for a specific session\n */\n startAnalysis: async (sessionId: string) => {\n const state = get();\n const session = state.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n\n if (!session) {\n console.error('Session not found:', sessionId);\n return;\n }\n\n const sendMessage = state.ai.getChatSendMessage(sessionId);\n if (!sendMessage) {\n console.error(\n 'No sendMessage function found for session:',\n sessionId,\n );\n return;\n }\n\n const abortController = new AbortController();\n const promptText = session.prompt || '';\n\n // Store abort controller for this session\n state.ai.setAbortController(sessionId, abortController);\n\n set((stateToUpdate) =>\n produce(stateToUpdate, (draft) => {\n const draftSession = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (draftSession) {\n draftSession.isRunning = true;\n draftSession.prompt = '';\n draft.ai.promptSuggestionsVisible = false;\n\n // Remove any existing pending results\n draftSession.analysisResults =\n draftSession.analysisResults.filter(\n (result: AnalysisResultSchema) =>\n result.id !== ANALYSIS_PENDING_ID,\n );\n\n // Add incomplete analysis result with a temporary ID\n draftSession.analysisResults.push({\n id: ANALYSIS_PENDING_ID,\n prompt: promptText,\n isCompleted: false,\n });\n }\n }),\n );\n\n // Send the message through the session's chat instance\n sendMessage({text: promptText});\n },\n\n cancelAnalysis: (sessionId: string) => {\n const state = get();\n const abortController = state.ai.getAbortController(sessionId);\n const stopFn = state.ai.getChatStop(sessionId);\n\n // Stop local chat streaming immediately if available\n stopFn?.();\n\n abortController?.abort(ANALYSIS_CANCELLED);\n\n set((stateToUpdate) =>\n produce(stateToUpdate, (draft) => {\n const session = draft.ai.config.sessions.find(\n (s: AnalysisSessionSchema) => s.id === sessionId,\n );\n if (session) {\n session.isRunning = false;\n }\n // Keep abort controller so handlers can check signal.aborted\n // It will be cleared by onChatFinish\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: () => {\n const currentSession = get().ai.getCurrentSession();\n if (!currentSession) return undefined;\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: (sessionId: string) => {\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 sessionId,\n })();\n },\n\n getRemoteChatTransport: (\n sessionId: string,\n endpoint: string,\n headers?: Record<string, string>,\n ) =>\n createRemoteChatTransportFactory({\n store,\n defaultProvider,\n defaultModel,\n sessionId,\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"]}
@@ -12,7 +12,7 @@ type AnalysisResultProps = {
12
12
  analysisResult: AnalysisResultSchema;
13
13
  enableReasoningBox?: boolean;
14
14
  customMarkdownComponents?: Partial<Components>;
15
- userTools?: string[];
15
+ excludeFromGrouping?: string[];
16
16
  ErrorMessageComponent?: React.ComponentType<ErrorMessageComponentProps>;
17
17
  };
18
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AnalysisResult.d.ts","sourceRoot":"","sources":["../../src/components/AnalysisResult.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAI1C,OAAO,EAAe,KAAK,0BAA0B,EAAC,MAAM,gBAAgB,CAAC;AAI7E;;;;;;GAMG;AACH,KAAK,mBAAmB,GAAG;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,qBAAqB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;CACzE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAiGxD,CAAC"}
1
+ {"version":3,"file":"AnalysisResult.d.ts","sourceRoot":"","sources":["../../src/components/AnalysisResult.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAI1C,OAAO,EAAe,KAAK,0BAA0B,EAAC,MAAM,gBAAgB,CAAC;AAI7E;;;;;;GAMG;AACH,KAAK,mBAAmB,GAAG;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;CACzE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAiGxD,CAAC"}
@@ -18,7 +18,7 @@ import { MessagePartsList } from './MessagePartsList';
18
18
  * @param props.result - The analysis result data to display
19
19
  * @returns A React component displaying the analysis results
20
20
  */
21
- export const AnalysisResult = ({ analysisResult, enableReasoningBox = false, customMarkdownComponents, userTools, ErrorMessageComponent, }) => {
21
+ export const AnalysisResult = ({ analysisResult, enableReasoningBox = false, customMarkdownComponents, excludeFromGrouping: userTools, ErrorMessageComponent, }) => {
22
22
  const uiMessages = useStoreWithAi((s) => s.ai.getCurrentSession()?.uiMessages);
23
23
  const toolAdditionalData = useStoreWithAi((s) => s.ai.getCurrentSession()?.toolAdditionalData || {});
24
24
  const [divWidth, setDivWidth] = useState(0);
@@ -1 +1 @@
1
- {"version":3,"file":"AnalysisResult.js","sourceRoot":"","sources":["../../src/components/AnalysisResult.tsx"],"names":[],"mappings":"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","sourcesContent":["import {AnalysisResultSchema} from '@sqlrooms/ai-config';\nimport {CopyButton} from '@sqlrooms/ui';\nimport type {UIMessage} from 'ai';\nimport {SquareTerminalIcon} from 'lucide-react';\nimport {useEffect, useRef, useState} from 'react';\nimport {Components} from 'react-markdown';\nimport {useStoreWithAi} from '../AiSlice';\nimport {useAssistantMessageParts} from '../hooks/useAssistantMessageParts';\nimport {useToolGrouping} from '../hooks/useToolGrouping';\nimport {ErrorMessage, type ErrorMessageComponentProps} from './ErrorMessage';\nimport {GroupedMessageParts} from './GroupedMessageParts';\nimport {MessagePartsList} from './MessagePartsList';\n\n/**\n * Props for the AnalysisResult component\n * @property {AnalysisResultSchema} result - The result of the analysis containing prompt, tool calls, and analysis data\n * @property {boolean} enableReasoningBox - Whether to group consecutive tool parts into a collapsible ReasoningBox\n * @property {Partial<Components>} customMarkdownComponents - Optional custom components for markdown rendering\n * @property {string[]} userTools - Array of tool names that should not be grouped and must be rendered separately\n */\ntype AnalysisResultProps = {\n analysisResult: AnalysisResultSchema;\n enableReasoningBox?: boolean;\n customMarkdownComponents?: Partial<Components>;\n userTools?: string[];\n ErrorMessageComponent?: React.ComponentType<ErrorMessageComponentProps>;\n};\n\n/**\n * Component that displays the results of an AI analysis.\n * Shows the original prompt, intermediate tool calls, final analysis text,\n * and any tool results.\n *\n * @component\n * @param props - Component props\n * @param props.result - The analysis result data to display\n * @returns A React component displaying the analysis results\n */\nexport const AnalysisResult: React.FC<AnalysisResultProps> = ({\n analysisResult,\n enableReasoningBox = false,\n customMarkdownComponents,\n userTools,\n ErrorMessageComponent,\n}) => {\n const uiMessages = useStoreWithAi(\n (s) => s.ai.getCurrentSession()?.uiMessages as UIMessage[] | undefined,\n );\n const toolAdditionalData = useStoreWithAi(\n (s) => s.ai.getCurrentSession()?.toolAdditionalData || {},\n );\n const [divWidth, setDivWidth] = useState<number>(0);\n const divRef = useRef<HTMLDivElement>(null);\n\n const uiMessageParts = useAssistantMessageParts(\n uiMessages,\n analysisResult.id,\n );\n\n // Measure div width using ResizeObserver\n useEffect(() => {\n const element = divRef.current;\n if (!element) return;\n\n // Set initial width immediately\n setDivWidth(element.getBoundingClientRect().width);\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n // Use borderBoxSize if available (modern API), fallback to contentRect\n const width =\n entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n setDivWidth(width);\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n // Group consecutive tool parts together for rendering in ReasoningBox (only if enabled)\n const groupedParts = useToolGrouping(\n uiMessageParts,\n divWidth,\n userTools,\n toolAdditionalData,\n );\n\n return (\n <div className=\"group flex w-full flex-col gap-2 pb-2 text-sm\">\n <div className=\"mb-2 flex items-center gap-2 rounded-md text-gray-700 dark:text-gray-100\">\n <div className=\"bg-muted flex w-full items-center gap-2 rounded-md border p-2 text-sm\">\n <SquareTerminalIcon className=\"h-4 w-4\" />\n {/** render prompt */}\n <div className=\"flex-1\">{analysisResult.prompt}</div>\n <div className=\"flex gap-2 opacity-0 transition-opacity group-hover:opacity-100\">\n <CopyButton\n text={analysisResult.prompt}\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n ariaLabel=\"Copy prompt\"\n />\n </div>\n </div>\n </div>\n <div ref={divRef} className=\"flex w-full flex-col gap-4\">\n {enableReasoningBox ? (\n <GroupedMessageParts\n groupedParts={groupedParts}\n totalPartsCount={uiMessageParts.length}\n toolAdditionalData={toolAdditionalData}\n customMarkdownComponents={customMarkdownComponents}\n />\n ) : (\n <MessagePartsList\n parts={uiMessageParts}\n toolAdditionalData={toolAdditionalData}\n customMarkdownComponents={customMarkdownComponents}\n />\n )}\n {analysisResult.errorMessage &&\n (ErrorMessageComponent ? (\n <ErrorMessageComponent\n errorMessage={analysisResult.errorMessage.error}\n />\n ) : (\n <ErrorMessage errorMessage={analysisResult.errorMessage.error} />\n ))}\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"AnalysisResult.js","sourceRoot":"","sources":["../../src/components/AnalysisResult.tsx"],"names":[],"mappings":"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","sourcesContent":["import {AnalysisResultSchema} from '@sqlrooms/ai-config';\nimport {CopyButton} from '@sqlrooms/ui';\nimport type {UIMessage} from 'ai';\nimport {SquareTerminalIcon} from 'lucide-react';\nimport {useEffect, useRef, useState} from 'react';\nimport {Components} from 'react-markdown';\nimport {useStoreWithAi} from '../AiSlice';\nimport {useAssistantMessageParts} from '../hooks/useAssistantMessageParts';\nimport {useToolGrouping} from '../hooks/useToolGrouping';\nimport {ErrorMessage, type ErrorMessageComponentProps} from './ErrorMessage';\nimport {GroupedMessageParts} from './GroupedMessageParts';\nimport {MessagePartsList} from './MessagePartsList';\n\n/**\n * Props for the AnalysisResult component\n * @property {AnalysisResultSchema} result - The result of the analysis containing prompt, tool calls, and analysis data\n * @property {boolean} enableReasoningBox - Whether to group consecutive tool parts into a collapsible ReasoningBox\n * @property {Partial<Components>} customMarkdownComponents - Optional custom components for markdown rendering\n * @property {string[]} userTools - Array of tool names that should not be grouped and must be rendered separately\n */\ntype AnalysisResultProps = {\n analysisResult: AnalysisResultSchema;\n enableReasoningBox?: boolean;\n customMarkdownComponents?: Partial<Components>;\n excludeFromGrouping?: string[];\n ErrorMessageComponent?: React.ComponentType<ErrorMessageComponentProps>;\n};\n\n/**\n * Component that displays the results of an AI analysis.\n * Shows the original prompt, intermediate tool calls, final analysis text,\n * and any tool results.\n *\n * @component\n * @param props - Component props\n * @param props.result - The analysis result data to display\n * @returns A React component displaying the analysis results\n */\nexport const AnalysisResult: React.FC<AnalysisResultProps> = ({\n analysisResult,\n enableReasoningBox = false,\n customMarkdownComponents,\n excludeFromGrouping: userTools,\n ErrorMessageComponent,\n}) => {\n const uiMessages = useStoreWithAi(\n (s) => s.ai.getCurrentSession()?.uiMessages as UIMessage[] | undefined,\n );\n const toolAdditionalData = useStoreWithAi(\n (s) => s.ai.getCurrentSession()?.toolAdditionalData || {},\n );\n const [divWidth, setDivWidth] = useState<number>(0);\n const divRef = useRef<HTMLDivElement>(null);\n\n const uiMessageParts = useAssistantMessageParts(\n uiMessages,\n analysisResult.id,\n );\n\n // Measure div width using ResizeObserver\n useEffect(() => {\n const element = divRef.current;\n if (!element) return;\n\n // Set initial width immediately\n setDivWidth(element.getBoundingClientRect().width);\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n // Use borderBoxSize if available (modern API), fallback to contentRect\n const width =\n entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n setDivWidth(width);\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n // Group consecutive tool parts together for rendering in ReasoningBox (only if enabled)\n const groupedParts = useToolGrouping(\n uiMessageParts,\n divWidth,\n userTools,\n toolAdditionalData,\n );\n\n return (\n <div className=\"group flex w-full flex-col gap-2 pb-2 text-sm\">\n <div className=\"mb-2 flex items-center gap-2 rounded-md text-gray-700 dark:text-gray-100\">\n <div className=\"bg-muted flex w-full items-center gap-2 rounded-md border p-2 text-sm\">\n <SquareTerminalIcon className=\"h-4 w-4\" />\n {/** render prompt */}\n <div className=\"flex-1\">{analysisResult.prompt}</div>\n <div className=\"flex gap-2 opacity-0 transition-opacity group-hover:opacity-100\">\n <CopyButton\n text={analysisResult.prompt}\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n ariaLabel=\"Copy prompt\"\n />\n </div>\n </div>\n </div>\n <div ref={divRef} className=\"flex w-full flex-col gap-4\">\n {enableReasoningBox ? (\n <GroupedMessageParts\n groupedParts={groupedParts}\n totalPartsCount={uiMessageParts.length}\n toolAdditionalData={toolAdditionalData}\n customMarkdownComponents={customMarkdownComponents}\n />\n ) : (\n <MessagePartsList\n parts={uiMessageParts}\n toolAdditionalData={toolAdditionalData}\n customMarkdownComponents={customMarkdownComponents}\n />\n )}\n {analysisResult.errorMessage &&\n (ErrorMessageComponent ? (\n <ErrorMessageComponent\n errorMessage={analysisResult.errorMessage.error}\n />\n ) : (\n <ErrorMessage errorMessage={analysisResult.errorMessage.error} />\n ))}\n </div>\n </div>\n );\n};\n"]}
@@ -5,7 +5,7 @@ export declare const AnalysisResultsContainer: React.FC<{
5
5
  className?: string;
6
6
  enableReasoningBox?: boolean;
7
7
  customMarkdownComponents?: Partial<Components>;
8
- userTools?: string[];
8
+ excludeFromGrouping?: string[];
9
9
  ErrorMessageComponent?: React.ComponentType<ErrorMessageComponentProps>;
10
10
  }>;
11
11
  //# sourceMappingURL=AnalysisResultsContainer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalysisResultsContainer.d.ts","sourceRoot":"","sources":["../../src/components/AnalysisResultsContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAK1C,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,gBAAgB,CAAC;AAE/D,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,qBAAqB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;CACzE,CAyEA,CAAC"}
1
+ {"version":3,"file":"AnalysisResultsContainer.d.ts","sourceRoot":"","sources":["../../src/components/AnalysisResultsContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAK1C,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,gBAAgB,CAAC;AAE/D,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;CACzE,CAyEA,CAAC"}
@@ -6,7 +6,7 @@ import { useStoreWithAi } from '../AiSlice';
6
6
  import { useScrollToBottom } from '../hooks/useScrollToBottom';
7
7
  import { AnalysisResult } from './AnalysisResult';
8
8
  import { AiThinkingDots } from './AiThinkingDots';
9
- export const AnalysisResultsContainer = ({ className, enableReasoningBox = false, customMarkdownComponents, userTools, ErrorMessageComponent, }) => {
9
+ export const AnalysisResultsContainer = ({ className, enableReasoningBox = false, customMarkdownComponents, excludeFromGrouping: excludeFromGrouping, ErrorMessageComponent, }) => {
10
10
  const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());
11
11
  const sessionId = currentSession?.id;
12
12
  const isRunning = useStoreWithAi((s) => sessionId ? s.ai.getIsRunning(sessionId) : false);
@@ -25,6 +25,6 @@ export const AnalysisResultsContainer = ({ className, enableReasoningBox = false
25
25
  scrollToBottom();
26
26
  }
27
27
  }, [isRunning, scrollToBottom]);
28
- return (_jsxs("div", { className: cn('relative flex h-full w-full flex-col', className), children: [_jsxs(ScrollArea, { viewportRef: containerRef, className: "flex w-full flex-grow flex-col gap-5", children: [currentAnalysisResults?.map((analysisResult) => (_jsx(AnalysisResult, { analysisResult: analysisResult, enableReasoningBox: enableReasoningBox, customMarkdownComponents: customMarkdownComponents, userTools: userTools, ErrorMessageComponent: ErrorMessageComponent }, analysisResult.id))), isRunning && (_jsx(AiThinkingDots, { className: "text-muted-foreground p-4" })), _jsx("div", { ref: endRef, className: "h-10 w-full shrink-0" }), _jsx(ScrollBar, { orientation: "vertical" }), _jsx(ScrollBar, { orientation: "horizontal" })] }), _jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 flex justify-center", children: _jsx("button", { onClick: scrollToBottom, className: cn('bg-primary hover:bg-primary/90 text-primary-foreground pointer-events-auto z-50', 'mb-6 translate-y-4 rounded-full p-2 opacity-0 shadow-md transition-all duration-200', showScrollButton && 'translate-y-0 opacity-100'), "aria-label": "Scroll to bottom", children: _jsx(ChevronDown, { className: "h-5 w-5" }) }) })] }));
28
+ return (_jsxs("div", { className: cn('relative flex h-full w-full flex-col', className), children: [_jsxs(ScrollArea, { viewportRef: containerRef, className: "flex w-full flex-grow flex-col gap-5", children: [currentAnalysisResults?.map((analysisResult) => (_jsx(AnalysisResult, { analysisResult: analysisResult, enableReasoningBox: enableReasoningBox, customMarkdownComponents: customMarkdownComponents, excludeFromGrouping: excludeFromGrouping, ErrorMessageComponent: ErrorMessageComponent }, analysisResult.id))), isRunning && (_jsx(AiThinkingDots, { className: "text-muted-foreground p-4" })), _jsx("div", { ref: endRef, className: "h-10 w-full shrink-0" }), _jsx(ScrollBar, { orientation: "vertical" }), _jsx(ScrollBar, { orientation: "horizontal" })] }), _jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 flex justify-center", children: _jsx("button", { onClick: scrollToBottom, className: cn('bg-primary hover:bg-primary/90 text-primary-foreground pointer-events-auto z-50', 'mb-6 translate-y-4 rounded-full p-2 opacity-0 shadow-md transition-all duration-200', showScrollButton && 'translate-y-0 opacity-100'), "aria-label": "Scroll to bottom", children: _jsx(ChevronDown, { className: "h-5 w-5" }) }) })] }));
29
29
  };
30
30
  //# sourceMappingURL=AnalysisResultsContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalysisResultsContainer.js","sourceRoot":"","sources":["../../src/components/AnalysisResultsContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {cn, ScrollArea, ScrollBar} from '@sqlrooms/ui';\nimport {ChevronDown} from 'lucide-react';\nimport React, {useEffect, useRef} from 'react';\nimport {Components} from 'react-markdown';\nimport {useStoreWithAi} from '../AiSlice';\nimport {useScrollToBottom} from '../hooks/useScrollToBottom';\nimport {AnalysisResult} from './AnalysisResult';\nimport {AiThinkingDots} from './AiThinkingDots';\nimport type {ErrorMessageComponentProps} from './ErrorMessage';\n\nexport const AnalysisResultsContainer: React.FC<{\n className?: string;\n enableReasoningBox?: boolean;\n customMarkdownComponents?: Partial<Components>;\n userTools?: string[];\n ErrorMessageComponent?: React.ComponentType<ErrorMessageComponentProps>;\n}> = ({\n className,\n enableReasoningBox = false,\n customMarkdownComponents,\n userTools,\n ErrorMessageComponent,\n}) => {\n const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());\n const sessionId = currentSession?.id;\n const isRunning = useStoreWithAi((s) =>\n sessionId ? s.ai.getIsRunning(sessionId) : false,\n );\n const currentAnalysisResults = useStoreWithAi((s) =>\n s.ai.getAnalysisResults(),\n );\n const uiMessages = useStoreWithAi(\n (s) => s.ai.getCurrentSession()?.uiMessages,\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const endRef = useRef<HTMLDivElement>(null);\n const {showScrollButton, scrollToBottom} = useScrollToBottom({\n containerRef,\n endRef,\n dataToObserve: uiMessages,\n });\n\n // Scroll to bottom when analysis starts\n useEffect(() => {\n if (isRunning) {\n scrollToBottom();\n }\n }, [isRunning, scrollToBottom]);\n\n return (\n <div className={cn('relative flex h-full w-full flex-col', className)}>\n <ScrollArea\n viewportRef={containerRef}\n className=\"flex w-full flex-grow flex-col gap-5\"\n >\n {/* Render analysis results */}\n {currentAnalysisResults?.map((analysisResult) => (\n <AnalysisResult\n key={analysisResult.id}\n analysisResult={analysisResult}\n enableReasoningBox={enableReasoningBox}\n customMarkdownComponents={customMarkdownComponents}\n userTools={userTools}\n ErrorMessageComponent={ErrorMessageComponent}\n />\n ))}\n {isRunning && (\n <AiThinkingDots className=\"text-muted-foreground p-4\" />\n )}\n <div ref={endRef} className=\"h-10 w-full shrink-0\" />\n <ScrollBar orientation=\"vertical\" />\n <ScrollBar orientation=\"horizontal\" />\n </ScrollArea>\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 flex justify-center\">\n <button\n onClick={scrollToBottom}\n className={cn(\n 'bg-primary hover:bg-primary/90 text-primary-foreground pointer-events-auto z-50',\n 'mb-6 translate-y-4 rounded-full p-2 opacity-0 shadow-md transition-all duration-200',\n showScrollButton && 'translate-y-0 opacity-100',\n )}\n aria-label=\"Scroll to bottom\"\n >\n <ChevronDown className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"AnalysisResultsContainer.js","sourceRoot":"","sources":["../../src/components/AnalysisResultsContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {cn, ScrollArea, ScrollBar} from '@sqlrooms/ui';\nimport {ChevronDown} from 'lucide-react';\nimport React, {useEffect, useRef} from 'react';\nimport {Components} from 'react-markdown';\nimport {useStoreWithAi} from '../AiSlice';\nimport {useScrollToBottom} from '../hooks/useScrollToBottom';\nimport {AnalysisResult} from './AnalysisResult';\nimport {AiThinkingDots} from './AiThinkingDots';\nimport type {ErrorMessageComponentProps} from './ErrorMessage';\n\nexport const AnalysisResultsContainer: React.FC<{\n className?: string;\n enableReasoningBox?: boolean;\n customMarkdownComponents?: Partial<Components>;\n excludeFromGrouping?: string[];\n ErrorMessageComponent?: React.ComponentType<ErrorMessageComponentProps>;\n}> = ({\n className,\n enableReasoningBox = false,\n customMarkdownComponents,\n excludeFromGrouping: excludeFromGrouping,\n ErrorMessageComponent,\n}) => {\n const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());\n const sessionId = currentSession?.id;\n const isRunning = useStoreWithAi((s) =>\n sessionId ? s.ai.getIsRunning(sessionId) : false,\n );\n const currentAnalysisResults = useStoreWithAi((s) =>\n s.ai.getAnalysisResults(),\n );\n const uiMessages = useStoreWithAi(\n (s) => s.ai.getCurrentSession()?.uiMessages,\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const endRef = useRef<HTMLDivElement>(null);\n const {showScrollButton, scrollToBottom} = useScrollToBottom({\n containerRef,\n endRef,\n dataToObserve: uiMessages,\n });\n\n // Scroll to bottom when analysis starts\n useEffect(() => {\n if (isRunning) {\n scrollToBottom();\n }\n }, [isRunning, scrollToBottom]);\n\n return (\n <div className={cn('relative flex h-full w-full flex-col', className)}>\n <ScrollArea\n viewportRef={containerRef}\n className=\"flex w-full flex-grow flex-col gap-5\"\n >\n {/* Render analysis results */}\n {currentAnalysisResults?.map((analysisResult) => (\n <AnalysisResult\n key={analysisResult.id}\n analysisResult={analysisResult}\n enableReasoningBox={enableReasoningBox}\n customMarkdownComponents={customMarkdownComponents}\n excludeFromGrouping={excludeFromGrouping}\n ErrorMessageComponent={ErrorMessageComponent}\n />\n ))}\n {isRunning && (\n <AiThinkingDots className=\"text-muted-foreground p-4\" />\n )}\n <div ref={endRef} className=\"h-10 w-full shrink-0\" />\n <ScrollBar orientation=\"vertical\" />\n <ScrollBar orientation=\"horizontal\" />\n </ScrollArea>\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 flex justify-center\">\n <button\n onClick={scrollToBottom}\n className={cn(\n 'bg-primary hover:bg-primary/90 text-primary-foreground pointer-events-auto z-50',\n 'mb-6 translate-y-4 rounded-full p-2 opacity-0 shadow-md transition-all duration-200',\n showScrollButton && 'translate-y-0 opacity-100',\n )}\n aria-label=\"Scroll to bottom\"\n >\n <ChevronDown className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n );\n};\n"]}
@@ -1,12 +1,19 @@
1
1
  import type { FC, PropsWithChildren } from 'react';
2
2
  import { AnalysisResultsContainer } from './AnalysisResultsContainer';
3
+ import { PromptSuggestions } from './PromptSuggestions';
3
4
  import { QueryControls } from './QueryControls';
4
5
  import { SessionControls } from './SessionControls';
6
+ import { ModelSelector } from './ModelSelector';
5
7
  type ChatComponent = FC<PropsWithChildren> & {
6
8
  Root: FC<PropsWithChildren>;
7
9
  Sessions: typeof SessionControls;
8
10
  Messages: typeof AnalysisResultsContainer;
9
11
  Composer: typeof QueryControls;
12
+ PromptSuggestions: typeof PromptSuggestions.Container & {
13
+ Item: typeof PromptSuggestions.Item;
14
+ VisibilityToggle: typeof PromptSuggestions.VisibilityToggle;
15
+ };
16
+ ModelSelector: typeof ModelSelector;
10
17
  };
11
18
  export declare const Chat: ChatComponent;
12
19
  export {};