@alquimia-ai/tools 2.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/actions/index.d.mts +2 -7
  2. package/dist/actions/index.d.ts +2 -7
  3. package/dist/actions/index.js +10 -8
  4. package/dist/actions/index.js.map +1 -1
  5. package/dist/actions/index.mjs +10 -8
  6. package/dist/actions/index.mjs.map +1 -1
  7. package/dist/adapters/fetch.d.mts +2 -1
  8. package/dist/adapters/fetch.d.ts +2 -1
  9. package/dist/adapters/fetch.js +6 -4
  10. package/dist/adapters/fetch.js.map +1 -1
  11. package/dist/adapters/fetch.mjs +6 -4
  12. package/dist/adapters/fetch.mjs.map +1 -1
  13. package/dist/adapters/index.d.mts +1 -1
  14. package/dist/adapters/index.d.ts +1 -1
  15. package/dist/adapters/index.js.map +1 -1
  16. package/dist/adapters/next.d.mts +2 -1
  17. package/dist/adapters/next.d.ts +2 -1
  18. package/dist/adapters/next.js +7 -5
  19. package/dist/adapters/next.js.map +1 -1
  20. package/dist/adapters/next.mjs +7 -5
  21. package/dist/adapters/next.mjs.map +1 -1
  22. package/dist/hooks/index.d.mts +5 -3
  23. package/dist/hooks/index.d.ts +5 -3
  24. package/dist/hooks/index.js +266 -65
  25. package/dist/hooks/index.js.map +1 -1
  26. package/dist/hooks/index.mjs +248 -47
  27. package/dist/hooks/index.mjs.map +1 -1
  28. package/dist/next/index.d.mts +6 -9
  29. package/dist/next/index.d.ts +6 -9
  30. package/dist/next/index.js +69 -64
  31. package/dist/next/index.js.map +1 -1
  32. package/dist/next/index.mjs +69 -64
  33. package/dist/next/index.mjs.map +1 -1
  34. package/dist/proxy.d.mts +2 -2
  35. package/dist/proxy.d.ts +2 -2
  36. package/dist/proxy.js +32 -9
  37. package/dist/proxy.js.map +1 -1
  38. package/dist/proxy.mjs +32 -9
  39. package/dist/proxy.mjs.map +1 -1
  40. package/dist/sdk/index.d.mts +15 -7
  41. package/dist/sdk/index.d.ts +15 -7
  42. package/dist/sdk/index.js +45 -26
  43. package/dist/sdk/index.js.map +1 -1
  44. package/dist/sdk/index.mjs +45 -26
  45. package/dist/sdk/index.mjs.map +1 -1
  46. package/dist/session.action-DirvOWt0.d.mts +3 -0
  47. package/dist/session.action-DirvOWt0.d.ts +3 -0
  48. package/dist/types/index.d.mts +79 -18
  49. package/dist/types/index.d.ts +79 -18
  50. package/dist/types/index.js.map +1 -1
  51. package/dist/types/index.mjs.map +1 -1
  52. package/dist/types-CIqszY3g.d.mts +53 -0
  53. package/dist/types-CIqszY3g.d.ts +53 -0
  54. package/dist/worklog/index.d.mts +29 -0
  55. package/dist/worklog/index.d.ts +29 -0
  56. package/dist/worklog/index.js +218 -0
  57. package/dist/worklog/index.js.map +1 -0
  58. package/dist/worklog/index.mjs +195 -0
  59. package/dist/worklog/index.mjs.map +1 -0
  60. package/package.json +6 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/alquimia.hook.tsx","../../src/sdk/alquimia-sdk.ts","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\nimport AlquimiaSDK from '../sdk/alquimia-sdk';\nimport type { AlquimiaAdapter } from '../adapters';\nimport {\n WhisperProvider,\n StableDiffusionProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport {\n AIMessageChunk,\n AlquimiaMessage,\n AlquimiaEventData,\n ToolEvent,\n} from '../types/type';\nimport { createMessageId, mergeThinkingsByControlId, mergeToolEvents } from '../utils';\n\nexport interface UseAlquimiaConfig {\n assistantId: string;\n adapter: AlquimiaAdapter;\n providers?: {\n whisper?: WhisperProvider;\n stableDiffusion?: StableDiffusionProvider;\n characterization?: CharacterizationProvider;\n ratings?: RatingsProvider;\n logger?: LoggerProvider;\n };\n options?: {\n enforceCharacterization?: boolean;\n userId?: string;\n extraData?: any;\n };\n}\n\nexport function useAlquimia(config: UseAlquimiaConfig) {\n const sdk = useMemo(() => {\n const instance = new AlquimiaSDK(config.assistantId, config.adapter, {\n enforceCharacterization: config.options?.enforceCharacterization,\n });\n\n if (config.providers?.whisper) instance.withWhisperProvider(config.providers.whisper);\n if (config.providers?.stableDiffusion) instance.withStableDiffusionProvider(config.providers.stableDiffusion);\n if (config.providers?.characterization) instance.withAnalyzeCharacterizationProvider(config.providers.characterization);\n if (config.providers?.ratings) instance.withRatingsProvider(config.providers.ratings);\n if (config.providers?.logger) instance.withLoggerProvider(config.providers.logger);\n if (config.options?.userId) instance.withUserId(config.options.userId);\n if (config.options?.extraData) instance.withExtraData(config.options.extraData);\n\n return instance;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.assistantId, config.adapter]);\n\n const [input, setInput] = useState<string>('');\n const [isMessageLoading, setIsMessageLoading] = useState<boolean>(false);\n const [isStreamingLoading, setIsStreamingLoading] = useState<boolean>(false);\n const [isMessageStreaming, setIsMessageStreaming] = useState<boolean>(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [isAudioRecording, setIsAudioRecording] = useState<boolean>(false);\n const [messages, setMessages] = useState<AlquimiaMessage[]>([]);\n const eventSourceRef = useRef<EventSource | null>(null);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [activeTool, setActiveTool] = useState<any | null>(null);\n const [lastRequest, setLastRequest] = useState<string | null>(null);\n const [evaluationStrategy, setEvaluationStrategy] = useState<string>('');\n const [hasThinkings, setHasThinkings] = useState<boolean>(false);\n const [attachments, setAttachments] = useState<File[]>([]);\n const [isUploadingAttachments, setIsUploadingAttachments] = useState<boolean>(false);\n\n const isLoading = isMessageLoading || isStreamingLoading || isUploadingAttachments;\n\n function cleanMessages() {\n setMessages([]);\n setHasThinkings(false);\n }\n\n function addAttachment(file: File) {\n setAttachments((prev) => [...prev, file]);\n }\n\n function addAttachments(files: File[]) {\n setAttachments((prev) => [...prev, ...files]);\n }\n\n function removeAttachment(index: number) {\n setAttachments((prev) => prev.filter((_, i) => i !== index));\n }\n\n function clearAttachments() {\n setAttachments([]);\n }\n\n function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n stream_id?: string,\n additionalInfo?: string,\n loading?: boolean,\n tooler?: ToolEvent[],\n thinkings?: any[]\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex((message) => message?.id === messageId);\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n const updatedMessage: AlquimiaMessage = {\n ...updatedMessages[messageIndex],\n content: `${updatedMessages[messageIndex]?.content || ''}${chunk}`,\n id: updatedMessages[messageIndex]?.id || '',\n role: updatedMessages[messageIndex]?.role || 'assistant',\n error_code,\n error_detail,\n stream_id,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents(updatedMessages[messageIndex]?.tooler || [], tooler),\n thinkings: mergeThinkingsByControlId(\n updatedMessages[messageIndex]?.thinkings || [],\n thinkings || []\n ),\n };\n updatedMessages[messageIndex] = updatedMessage;\n return updatedMessages;\n } else {\n return [\n ...currentMessages,\n {\n content: `${chunk}`,\n role: 'assistant',\n id: messageId,\n error_code,\n error_detail,\n stream_id,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents([], tooler),\n thinkings,\n },\n ];\n }\n });\n }\n\n async function processAndSendMessage(\n message: string,\n options?: {\n messageType?: string;\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n }\n ) {\n addUserMessage(message, options?.messageType);\n\n const messageId = createMessageId();\n setStreamingMessageId(messageId);\n\n await sendMessage(\n message,\n (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.answer || '',\n chunk?.error_code,\n chunk?.error_detail,\n chunk?.stream_id,\n options?.additionalInfo,\n chunk?.loading,\n chunk?.tooler,\n chunk?.thinkings\n );\n },\n options?.traceParentId,\n options?.sessionId\n );\n\n setInput('');\n }\n\n async function handleSubmit(\n event: React.FormEvent<HTMLFormElement>,\n traceParentId?: string,\n sessionId?: string,\n additionalInfo?: string\n ) {\n setIsMessageLoading(true);\n event.preventDefault();\n\n if (input) {\n await processAndSendMessage(input, { traceParentId, sessionId, additionalInfo });\n }\n\n setIsMessageLoading(false);\n }\n\n async function handleSystemMessage(\n message: string,\n options?: {\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n messageType?: string;\n }\n ) {\n setIsMessageLoading(true);\n\n await processAndSendMessage(message, {\n messageType: options?.messageType || 'system',\n traceParentId: options?.traceParentId,\n sessionId: options?.sessionId,\n additionalInfo: options?.additionalInfo,\n });\n\n setIsMessageLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLTextAreaElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: AlquimiaMessage[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n eventSourceRef.current?.close();\n eventSourceRef.current = null;\n setIsMessageLoading(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n setIsUploadingAttachments(false);\n setInput('');\n }\n\n function addUserMessage(message: string, type?: string) {\n setMessages((prevMessages: AlquimiaMessage[]) => [\n ...prevMessages,\n {\n content: message,\n role: 'user',\n type: type,\n id: createMessageId(),\n created_at: new Date().getTime().toString(),\n },\n ]);\n }\n\n function getCookie(name: string): string | null {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split('=');\n if (cookieName === name) {\n return decodeURIComponent(cookieValue as string);\n }\n }\n return null;\n }\n\n function cleanup(isStreaming: boolean, event: EventSource) {\n setIsMessageStreaming(isStreaming);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n event.close();\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n setIsStreamingLoading(true);\n callBack({ type: 'loading', loading: true });\n const conversationId = sessionId || getCookie('alquimia-session');\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n try {\n const hasAttachments = attachments.length > 0;\n const sdkCall = sdk.withConversationId(conversationId || '');\n\n if (hasAttachments) {\n sdkCall.withAttachments(\n attachments.map((f) => ({\n filename: f.name,\n content_type: f.type,\n content_size: f.size,\n }))\n );\n }\n\n const response = await sdkCall.sendMessage(message, traceParentId);\n\n if (hasAttachments) {\n setIsUploadingAttachments(true);\n try {\n const attachmentResponses = response.getAttachmentResponses();\n await Promise.all(\n attachments.map((file, i) => response.uploadAttachment(file, attachmentResponses[i]))\n );\n } catch (uploadError: any) {\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n callBack({\n type: 'error',\n error_code: 'ATTACHMENT_UPLOAD_ERROR',\n error_detail: uploadError.message || 'Failed to upload attachment',\n });\n return;\n }\n setIsUploadingAttachments(false);\n clearAttachments();\n }\n\n const streamUrl = response.getUrlStream();\n const streamId = response.getStreamId() || '';\n const streamState = {\n streamId,\n connectedAt: Date.now(),\n openedAt: null as number | null,\n messagesReceived: 0,\n lastMessageAt: null as number | null,\n closedByClient: false,\n };\n\n const eventSource = new EventSource(streamUrl);\n eventSourceRef.current = eventSource;\n const evaluationStrategy = response.getEvaluationStrategy()!;\n setEvaluationStrategy(evaluationStrategy);\n\n eventSource.onopen = () => {\n streamState.openedAt = Date.now();\n };\n\n eventSource.onmessage = (event) => {\n streamState.messagesReceived++;\n streamState.lastMessageAt = Date.now();\n handleMessageEvent(event, callBack, eventSource, streamState);\n };\n\n eventSource.onerror = () => {\n if (streamState.closedByClient) return;\n streamState.closedByClient = true;\n\n const elapsed = Date.now() - streamState.connectedAt;\n const sinceLastMessage = streamState.lastMessageAt\n ? Date.now() - streamState.lastMessageAt\n : null;\n\n cleanup(false, eventSource);\n\n let errorDetail: string;\n if (!streamState.openedAt) {\n errorDetail = `Stream failed to connect (after ${elapsed}ms). URL: ${streamUrl}`;\n } else if (streamState.messagesReceived === 0) {\n errorDetail = `Stream connected but received no messages before error (open for ${elapsed}ms).`;\n } else {\n errorDetail = `Stream dropped after ${streamState.messagesReceived} message(s), ${sinceLastMessage}ms since last message (total ${elapsed}ms). Possible timeout.`;\n }\n\n callBack({\n type: 'error',\n error_code: 'STREAM_ERROR',\n error_detail: errorDetail,\n stream_id: streamId,\n });\n };\n } catch (error: any) {\n console.error('Error sending message:', error);\n const errMessage =\n error.response?.data?.detail || error.message || 'Error initiating the stream.';\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n callBack({\n type: 'error',\n error_code: error.status?.toString() || 'REQUEST_ERROR',\n error_detail: errMessage,\n });\n }\n }\n\n function handleMessageEvent(\n event: MessageEvent,\n callBack: (chunk: AIMessageChunk) => void,\n eventSource: EventSource,\n streamState?: {\n streamId: string;\n closedByClient: boolean;\n messagesReceived: number;\n }\n ) {\n const data: AlquimiaEventData = JSON.parse(event.data);\n if (data.errors?.length) {\n for (const error of data.errors) {\n const detail =\n error.error_detail ||\n (error.data != null\n ? `${error.data} (controlId: ${error.control_id})`\n : 'Unknown error');\n callBack({\n type: 'error',\n error_code: error.event_class || error.status || 'UNKNOWN_ERROR',\n error_detail: detail,\n stream_id: data.stream_id || '',\n });\n }\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n return;\n }\n\n if (data.tools_output?.length) {\n callBack({ type: 'answer', answer: '', tooler: data.tools_output });\n }\n\n if (data.thinkings?.length) {\n setHasThinkings(true);\n callBack({ type: 'answer', thinkings: data.thinkings });\n }\n\n const response = data.response;\n const content =\n response?.event_class === 'AssistantInferenceResponse' && typeof response.data === 'string'\n ? response.data\n : null;\n\n if (content) {\n callBack({ type: 'answer', answer: content });\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n }\n }\n\n return {\n sdk,\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleSystemMessage,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageLoading,\n isMessageStreaming,\n isStreamingLoading,\n streamingMessageId,\n isAudioRecording,\n lastRequest,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n evaluationStrategy,\n hasThinkings,\n attachments,\n addAttachment,\n addAttachments,\n removeAttachment,\n clearAttachments,\n isUploadingAttachments,\n };\n}\n","import axios, { AxiosInstance } from 'axios';\nimport {\n StableDiffusionProvider,\n WhisperProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport { AttachmentPayload, TTSResult } from '../types';\nimport type { AlquimiaAdapter, AlquimiaSDKOptions } from '../adapters';\n\nclass AlquimiaSDK {\n private adapter: AlquimiaAdapter;\n private assistantId: string;\n private axiosInstance: AxiosInstance;\n private conversationId: string | null = null;\n private sessionId: string | null = null;\n private streamId: string | null = null;\n private evaluationStrategy: string | null = null;\n private tools: any = [];\n private extraData: any = null;\n private assistantConfig: any = null;\n private forceProfile: any = {};\n private userId: string | null = null;\n private whisperProvider?: WhisperProvider;\n private stableDiffusionProvider?: StableDiffusionProvider;\n private analyzeCharacterizationProvider?: CharacterizationProvider;\n private ratingsProvider?: RatingsProvider;\n private loggerProvider?: LoggerProvider;\n private enforceCharacterization?: boolean;\n private attachments: AttachmentPayload[] = [];\n private attachmentResponses: string[] = [];\n\n constructor(\n assistantId: string,\n adapter: AlquimiaAdapter,\n options: AlquimiaSDKOptions = {}\n ) {\n if (!assistantId) {\n throw new Error('AlquimiaSDK: assistantId is required');\n }\n if (!adapter) {\n throw new Error(\n 'AlquimiaSDK: adapter is required. Use createNextJsAdapter() or createFetchAdapter()'\n );\n }\n\n this.assistantId = assistantId;\n this.adapter = adapter;\n this.enforceCharacterization = options.enforceCharacterization ?? true;\n\n this.axiosInstance = axios.create();\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n if (error.response?.status && this.loggerProvider) {\n await this.loggerProvider.logError('Server Error', error, {\n url: error.config.url,\n method: error.config.method,\n data: error.config.data,\n status: error.response.status,\n responseData: error.response.data,\n });\n }\n return Promise.reject(error);\n }\n );\n\n this.textToSpeech = this.textToSpeech.bind(this);\n this.speechToText = this.speechToText.bind(this);\n }\n\n withConversationId(conversationId: string): AlquimiaSDK {\n this.conversationId = conversationId;\n return this;\n }\n\n withAttachments(attachments: AttachmentPayload[]): AlquimiaSDK {\n this.attachments = attachments;\n return this;\n }\n\n withWhisperProvider(provider: WhisperProvider): AlquimiaSDK {\n this.whisperProvider = provider;\n return this;\n }\n\n withStableDiffusionProvider(provider: StableDiffusionProvider): AlquimiaSDK {\n this.stableDiffusionProvider = provider;\n return this;\n }\n\n withAnalyzeCharacterizationProvider(provider: CharacterizationProvider): AlquimiaSDK {\n this.analyzeCharacterizationProvider = provider;\n return this;\n }\n\n withRatingsProvider(provider: RatingsProvider): AlquimiaSDK {\n this.ratingsProvider = provider;\n return this;\n }\n\n withLoggerProvider(provider: LoggerProvider): AlquimiaSDK {\n this.loggerProvider = provider;\n return this;\n }\n\n withTools(tools: any): AlquimiaSDK {\n this.tools = tools;\n return this;\n }\n\n withExtraData(extraData: any): AlquimiaSDK {\n this.extraData = extraData;\n return this;\n }\n\n withForceProfile(forceProfile: any): AlquimiaSDK {\n this.forceProfile = forceProfile;\n return this;\n }\n\n withAssistantConfig(assistantConfig: any): AlquimiaSDK {\n this.assistantConfig = assistantConfig;\n return this;\n }\n\n withUserId(userId: string): AlquimiaSDK {\n this.userId = userId;\n return this;\n }\n\n getEnforceCharacterization(): boolean {\n return this.enforceCharacterization ?? true;\n }\n\n getEvaluationStrategy(): string | null {\n return this.evaluationStrategy;\n }\n\n textToSpeech(text: string): Promise<TTSResult> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.textToSpeech(text);\n }\n\n speechToText(audio: string): Promise<string> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.speechToText(audio);\n }\n\n async sendMessage(query: string, traceParent?: string): Promise<AlquimiaSDK> {\n if (!this.conversationId) {\n throw new Error(\n 'Conversation not initialized. Call withConversationId() before sendMessage()'\n );\n }\n\n const inferUrl = this.adapter.resolveInferUrl(this.assistantId);\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n\n const initMessage = {\n query,\n session_id: this.conversationId,\n ...(this.extraData && { extra_data: this.extraData }),\n force_profile: this.forceProfile,\n ...(this.assistantConfig && { config: this.assistantConfig }),\n tools: this.tools,\n user_id: this.userId,\n attachments: this.attachments,\n };\n\n const result = (\n await this.axiosInstance.post(inferUrl, initMessage, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-trace-parent': traceParent || '',\n ...adapterHeaders,\n },\n })\n ).data;\n\n this.evaluationStrategy =\n result?.config?.dante?.profile?.evaluation_strategy?.evaluation_strategy_id ?? null;\n this.streamId = result.stream_id;\n this.attachmentResponses = result.attachments ?? [];\n this.attachments = [];\n\n return this;\n }\n\n async generateImage(query: string): Promise<string> {\n if (!this.stableDiffusionProvider) {\n throw new Error('Stable Diffusion provider not initialized');\n }\n return this.stableDiffusionProvider.generateImage(query);\n }\n\n async analyzeCharacterization(text: string): Promise<Record<string, any>> {\n if (!this.analyzeCharacterizationProvider) {\n throw new Error('Analyze characterization provider not initialized');\n }\n return this.analyzeCharacterizationProvider.analyzeCharacterization(text);\n }\n\n async rate(data: any): Promise<Record<string, any>> {\n if (!this.ratingsProvider) {\n throw new Error('Ratings provider not initialized');\n }\n return this.ratingsProvider.rate(data);\n }\n\n async logInfo(message: string, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logInfo(message, data);\n }\n\n async logError(message: string, error: Error, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logError(message, error, data);\n }\n\n getAttachmentResponses(): string[] {\n return this.attachmentResponses;\n }\n\n async uploadAttachment(file: File, attachmentId: string): Promise<void> {\n if (!this.streamId || !attachmentId) {\n throw new Error('Stream or attachment ID not initialized');\n }\n const url = this.adapter.resolveAttachmentUrl(this.streamId, attachmentId);\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n const formData = new FormData();\n formData.append('file', file);\n await this.axiosInstance.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', ...adapterHeaders },\n });\n }\n\n getUrlStream(): string {\n if (!this.streamId) {\n throw new Error('Stream ID not initialized. Call sendMessage() first');\n }\n return this.adapter.resolveStreamUrl(this.streamId);\n }\n\n getStreamId(): string | null {\n return this.streamId;\n }\n}\n\nexport default AlquimiaSDK;\n","import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === \"undefined\") return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n const trimmedText = text.trim();\n\n return (\n /^[\\w\\#\\-\\*\\|\\[\\]\\-\\+\\=\\s\\n\\r\\t\\!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^\\!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== \"undefined\" && window.location.pathname === \"/\") {\n const queryAssistantId = getQueryParam(\"talkwith\");\n if (queryAssistantId) {\n localStorage.setItem(\"assistantId\", queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem(\"assistantId\");\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n}\n\nexport function serializeAxiosError(error: unknown) {\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message,\n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: \"Unknown Error\",\n };\n}\n\nexport function parseConversationsMapCookie(\n cookieValue: string\n): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\n );\n}\n","\nimport { useState, useReducer } from \"react\";\nimport { RatingData } from \"../types/type\";\nimport { getTopicSessionId } from \"../utils/utils\";\n\ninterface RatingState {\n ratingStars: number;\n ratingThumbs: \"thumbsUp\" | \"thumbsDown\" | \"\";\n ratingComment: string;\n}\n\ntype RatingAction =\n | { type: \"SET_RATING_STARS\"; payload: number }\n | { type: \"SET_RATING_THUMBS\"; payload: \"thumbsUp\" | \"thumbsDown\" | \"\" }\n | { type: \"SET_RATING_COMMENT\"; payload: string };\n\nconst initialState: RatingState = {\n ratingStars: 0,\n ratingThumbs: \"\",\n ratingComment: \"\",\n};\n\nfunction ratingReducer(state: RatingState, action: RatingAction): RatingState {\n switch (action.type) {\n case \"SET_RATING_STARS\":\n return { ...state, ratingStars: action.payload };\n case \"SET_RATING_THUMBS\":\n return { ...state, ratingThumbs: action.payload };\n case \"SET_RATING_COMMENT\":\n return { ...state, ratingComment: action.payload };\n default:\n return state;\n }\n}\n\ninterface UseRatingsParams {\n assistantId: string;\n topicId: string;\n sendRating: (ratingData: RatingData) => Promise<any>;\n onError?: (componentName: string, error: Error) => void;\n}\n\n\nexport function useRatings({ assistantId, sendRating, topicId }: UseRatingsParams) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [hasReviewed, setHasReviewed] = useState<boolean>(false);\n const [state, dispatch] = useReducer(ratingReducer, initialState);\n\n const setRatingStars = (rating: number) => {\n dispatch({ type: \"SET_RATING_STARS\", payload: rating });\n };\n\n const setRatingThumbs = (rating: \"thumbsUp\" | \"thumbsDown\" | \"\") => {\n dispatch({ type: \"SET_RATING_THUMBS\", payload: rating });\n };\n\n const setRatingComment = (comment: string) => {\n dispatch({ type: \"SET_RATING_COMMENT\", payload: comment });\n };\n\n const thumbsScore = (value: string) => {\n return value === \"thumbsUp\" ? 5 : value === \"thumbsDown\" ? 0 : 0;\n }\n\n const handleRate = async (key: string, value: any | string, onHandleRateSuccess: (success: boolean, err?: string) => void) => {\n setIsLoading(true);\n const sessionId = getTopicSessionId(topicId);\n\n const ratingObj: RatingData = {\n topicId: parseInt(topicId),\n sessionId: sessionId || \"\",\n assistantId: assistantId,\n score: key === \"score\" ? value : thumbsScore(value),\n description: key === \"description\" ? value : state.ratingComment,\n };\n\n try {\n const response = await sendRating(ratingObj);\n if (!response.success) {\n setIsLoading(false);\n onHandleRateSuccess(false, response.error.message);\n return;\n }\n \n if (key === \"score\") {\n setRatingStars(value);\n } else if (key === \"description\") {\n setRatingComment(value);\n }\n setHasReviewed(true);\n setIsLoading(false);\n onHandleRateSuccess(true);\n } catch (err) {\n setIsLoading(false);\n onHandleRateSuccess(false, String(err));\n }\n };\n\n return {\n handleRate,\n ratingStars: state.ratingStars,\n ratingThumbs: state.ratingThumbs,\n ratingComment: state.ratingComment,\n isLoading,\n hasReviewed\n };\n}\n"],"mappings":"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","names":["sessionId","input","messages","evaluationStrategy","useState","useState"]}
1
+ {"version":3,"sources":["../../src/hooks/alquimia.hook.tsx","../../src/sdk/alquimia-sdk.ts","../../src/utils/utils.ts","../../src/worklog/types.ts","../../src/worklog/registry.ts","../../src/worklog/reducer.ts","../../src/worklog/use-worklog.ts","../../src/worklog/from-frame.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\nimport AlquimiaSDK from '../sdk/alquimia-sdk';\nimport type { AlquimiaAdapter } from '../adapters';\nimport {\n WhisperProvider,\n StableDiffusionProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport {\n AIMessageChunk,\n AlquimiaMessage,\n AlquimiaEventData,\n AssistantInferenceResponse,\n ToolEvent,\n} from '../types/type';\nimport { createMessageId, mergeThinkingsByControlId, mergeToolEvents } from '../utils';\nimport { reduceWorklog, initialWorklogState, frameToRecord, type WorklogState } from '../worklog';\n\nexport interface UseAlquimiaConfig {\n assistantId: string;\n adapter: AlquimiaAdapter;\n providers?: {\n whisper?: WhisperProvider;\n stableDiffusion?: StableDiffusionProvider;\n characterization?: CharacterizationProvider;\n ratings?: RatingsProvider;\n logger?: LoggerProvider;\n };\n options?: {\n enforceCharacterization?: boolean;\n userId?: string;\n extraInstructions?: Record<string, string>;\n worklog?: boolean;\n };\n}\n\nexport function useAlquimia(config: UseAlquimiaConfig) {\n const sdk = useMemo(() => {\n const instance = new AlquimiaSDK(config.assistantId, config.adapter, {\n enforceCharacterization: config.options?.enforceCharacterization,\n });\n\n if (config.providers?.whisper) instance.withWhisperProvider(config.providers.whisper);\n if (config.providers?.stableDiffusion) instance.withStableDiffusionProvider(config.providers.stableDiffusion);\n if (config.providers?.characterization) instance.withAnalyzeCharacterizationProvider(config.providers.characterization);\n if (config.providers?.ratings) instance.withRatingsProvider(config.providers.ratings);\n if (config.providers?.logger) instance.withLoggerProvider(config.providers.logger);\n if (config.options?.userId) instance.withUserId(config.options.userId);\n if (config.options?.extraInstructions) instance.withExtraInstructions(config.options.extraInstructions);\n\n return instance;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.assistantId, config.adapter]);\n\n const [input, setInput] = useState<string>('');\n const [isMessageLoading, setIsMessageLoading] = useState<boolean>(false);\n const [isStreamingLoading, setIsStreamingLoading] = useState<boolean>(false);\n const [isMessageStreaming, setIsMessageStreaming] = useState<boolean>(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [isAudioRecording, setIsAudioRecording] = useState<boolean>(false);\n const [messages, setMessages] = useState<AlquimiaMessage[]>([]);\n const eventSourceRef = useRef<EventSource | null>(null);\n const streamUserCancelledRef = useRef(false);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [activeTool, setActiveTool] = useState<any | null>(null);\n const [lastRequest, setLastRequest] = useState<string | null>(null);\n const [hasThinkings, setHasThinkings] = useState<boolean>(false);\n const worklogEnabled = config.options?.worklog ?? false;\n const [worklog, setWorklog] = useState<WorklogState | undefined>(\n worklogEnabled ? initialWorklogState() : undefined\n );\n const [attachments, setAttachments] = useState<File[]>([]);\n const [isUploadingAttachments, setIsUploadingAttachments] = useState<boolean>(false);\n\n const isLoading = isMessageLoading || isStreamingLoading || isUploadingAttachments;\n\n function cleanMessages() {\n setMessages([]);\n setHasThinkings(false);\n }\n\n function addAttachment(file: File) {\n setAttachments((prev) => [...prev, file]);\n }\n\n function addAttachments(files: File[]) {\n setAttachments((prev) => [...prev, ...files]);\n }\n\n function removeAttachment(index: number) {\n setAttachments((prev) => prev.filter((_, i) => i !== index));\n }\n\n function clearAttachments() {\n setAttachments([]);\n }\n\n function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n taskid?: string,\n additionalInfo?: string,\n loading?: boolean,\n tooler?: ToolEvent[],\n thinkings?: any[]\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex((message) => message?.id === messageId);\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n const updatedMessage: AlquimiaMessage = {\n ...updatedMessages[messageIndex],\n content: `${updatedMessages[messageIndex]?.content || ''}${chunk}`,\n id: updatedMessages[messageIndex]?.id || '',\n role: updatedMessages[messageIndex]?.role || 'assistant',\n error_code,\n error_detail,\n taskid,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents(updatedMessages[messageIndex]?.tooler || [], tooler),\n thinkings: mergeThinkingsByControlId(\n updatedMessages[messageIndex]?.thinkings || [],\n thinkings || []\n ),\n };\n updatedMessages[messageIndex] = updatedMessage;\n return updatedMessages;\n } else {\n return [\n ...currentMessages,\n {\n content: `${chunk}`,\n role: 'assistant',\n id: messageId,\n error_code,\n error_detail,\n taskid,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents([], tooler),\n thinkings,\n },\n ];\n }\n });\n }\n\n async function processAndSendMessage(\n message: string,\n options?: {\n messageType?: string;\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n }\n ) {\n addUserMessage(message, options?.messageType);\n\n const messageId = createMessageId();\n setStreamingMessageId(messageId);\n\n await sendMessage(\n message,\n (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.answer || '',\n chunk?.error_code,\n chunk?.error_detail,\n chunk?.taskid,\n options?.additionalInfo,\n chunk?.loading,\n chunk?.tooler,\n chunk?.thinkings\n );\n },\n options?.traceParentId,\n options?.sessionId\n );\n\n setInput('');\n }\n\n async function handleSubmit(\n event: React.FormEvent<HTMLFormElement>,\n traceParentId?: string,\n sessionId?: string,\n additionalInfo?: string\n ) {\n setIsMessageLoading(true);\n event.preventDefault();\n\n if (input) {\n await processAndSendMessage(input, { traceParentId, sessionId, additionalInfo });\n }\n\n setIsMessageLoading(false);\n }\n\n async function handleSystemMessage(\n message: string,\n options?: {\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n messageType?: string;\n }\n ) {\n setIsMessageLoading(true);\n\n await processAndSendMessage(message, {\n messageType: options?.messageType || 'system',\n traceParentId: options?.traceParentId,\n sessionId: options?.sessionId,\n additionalInfo: options?.additionalInfo,\n });\n\n setIsMessageLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLTextAreaElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: AlquimiaMessage[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n streamUserCancelledRef.current = true;\n eventSourceRef.current?.close();\n eventSourceRef.current = null;\n setIsMessageLoading(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n setIsUploadingAttachments(false);\n setInput('');\n }\n\n function addUserMessage(message: string, type?: string) {\n setMessages((prevMessages: AlquimiaMessage[]) => [\n ...prevMessages,\n {\n content: message,\n role: 'user',\n type: type,\n id: createMessageId(),\n created_at: new Date().getTime().toString(),\n },\n ]);\n }\n\n function getCookie(name: string): string | null {\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split('=');\n if (cookieName === name) {\n return decodeURIComponent(cookieValue as string);\n }\n }\n return null;\n }\n\n function cleanup(isStreaming: boolean, event: EventSource) {\n setIsMessageStreaming(isStreaming);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n event.close();\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n setIsStreamingLoading(true);\n callBack({ type: 'loading', loading: true });\n const conversationId = sessionId || getCookie('alquimia-session');\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n try {\n const hasAttachments = attachments.length > 0;\n const sdkCall = sdk.withConversationId(conversationId || '');\n\n if (hasAttachments) {\n sdkCall.withAttachments(\n attachments.map((f) => ({\n filename: f.name,\n content_type: f.type,\n content_size: f.size,\n }))\n );\n }\n\n const response = await sdkCall.sendMessage(message, traceParentId);\n\n if (hasAttachments) {\n setIsUploadingAttachments(true);\n try {\n const attachmentResponses = response.getAttachmentResponses();\n await Promise.all(\n attachments.map((file, i) => response.uploadAttachment(file, attachmentResponses[i]))\n );\n } catch (uploadError: any) {\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n callBack({\n type: 'error',\n error_code: 'ATTACHMENT_UPLOAD_ERROR',\n error_detail: uploadError.message || 'Failed to upload attachment',\n });\n return;\n }\n setIsUploadingAttachments(false);\n clearAttachments();\n }\n\n const streamUrl = response.getUrlStream();\n const streamId = response.getStreamId() || '';\n streamUserCancelledRef.current = false;\n const streamState = {\n streamId,\n connectedAt: Date.now(),\n openedAt: null as number | null,\n messagesReceived: 0,\n lastMessageAt: null as number | null,\n closedByClient: false,\n };\n\n if (worklogEnabled) setWorklog(initialWorklogState());\n\n const eventSource = new EventSource(streamUrl);\n eventSourceRef.current = eventSource;\n\n eventSource.onopen = () => {\n streamState.openedAt = Date.now();\n };\n\n eventSource.onmessage = (event) => {\n streamState.messagesReceived++;\n streamState.lastMessageAt = Date.now();\n handleMessageEvent(event, callBack, eventSource, streamState);\n };\n\n eventSource.onerror = () => {\n if (streamState.closedByClient) return;\n if (streamUserCancelledRef.current) {\n streamUserCancelledRef.current = false;\n return;\n }\n\n streamState.closedByClient = true;\n\n const elapsed = Date.now() - streamState.connectedAt;\n const sinceLastMessage = streamState.lastMessageAt\n ? Date.now() - streamState.lastMessageAt\n : null;\n\n cleanup(false, eventSource);\n\n let errorDetail: string;\n if (!streamState.openedAt) {\n errorDetail =\n 'Could not open the live response. Check your connection and try again.';\n } else if (streamState.messagesReceived === 0) {\n errorDetail = 'No response was received. Try again in a moment.';\n } else {\n errorDetail = 'The response was interrupted. Try again.';\n }\n\n if (typeof console !== 'undefined' && console.debug) {\n console.debug('[Alquimia] SSE transport error', {\n streamUrl,\n taskId: streamId,\n opened: Boolean(streamState.openedAt),\n messagesReceived: streamState.messagesReceived,\n elapsedMs: elapsed,\n sinceLastMessageMs: sinceLastMessage,\n });\n }\n\n callBack({\n type: 'error',\n error_code: 'STREAM_ERROR',\n error_detail: errorDetail,\n taskid: streamId,\n });\n };\n } catch (error: any) {\n console.error('Error sending message:', error);\n const errMessage =\n error.response?.data?.detail || error.message || 'Error initiating the stream.';\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n callBack({\n type: 'error',\n error_code:\n error.response?.status != null\n ? String(error.response.status)\n : 'REQUEST_ERROR',\n error_detail: errMessage,\n });\n }\n }\n\n function handleMessageEvent(\n event: MessageEvent,\n callBack: (chunk: AIMessageChunk) => void,\n eventSource: EventSource,\n streamState?: {\n streamId: string;\n closedByClient: boolean;\n messagesReceived: number;\n }\n ) {\n const data: AlquimiaEventData = JSON.parse(event.data);\n if (worklogEnabled) {\n setWorklog((prev) => reduceWorklog(prev ?? initialWorklogState(), frameToRecord(data)));\n }\n const eventTaskId = data.taskid || '';\n\n if (data.errors?.length) {\n for (const error of data.errors) {\n const detail =\n error.error_detail ||\n (error.data != null\n ? `${error.data} (controlId: ${error.control_id})`\n : 'Unknown error');\n callBack({\n type: 'error',\n error_code: error.event_class || error.status || 'UNKNOWN_ERROR',\n error_detail: detail,\n taskid: eventTaskId,\n });\n }\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n return;\n }\n\n if (data.tools_output?.length) {\n callBack({ type: 'answer', answer: '', tooler: data.tools_output });\n }\n\n if (data.thinkings?.length) {\n setHasThinkings(true);\n callBack({ type: 'answer', thinkings: data.thinkings });\n }\n\n if (data.event_class === 'AssistantInferenceResponse') {\n const final = data as AssistantInferenceResponse;\n callBack({ type: 'answer', answer: final.data });\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n }\n }\n\n return {\n sdk,\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleSystemMessage,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageLoading,\n isMessageStreaming,\n isStreamingLoading,\n streamingMessageId,\n isAudioRecording,\n lastRequest,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n hasThinkings,\n worklog,\n attachments,\n addAttachment,\n addAttachments,\n removeAttachment,\n clearAttachments,\n isUploadingAttachments,\n };\n}\n","import axios, { AxiosInstance } from 'axios';\nimport {\n StableDiffusionProvider,\n WhisperProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport { AttachmentPayload, TTSResult, type CommonAttributes } from '../types';\nimport type { AlquimiaAdapter, AlquimiaSDKOptions } from '../adapters';\n\nclass AlquimiaSDK {\n private adapter: AlquimiaAdapter;\n private assistantId: string;\n private axiosInstance: AxiosInstance;\n private conversationId: string | null = null;\n private sessionId: string | null = null;\n // Internal subscription id from infer (`taskid` on the wire).\n private streamId: string | null = null;\n private tools: any = [];\n private extraInstructions: Record<string, string> | null = null;\n private assistantConfig: any = null;\n private userId: string | null = null;\n private whisperProvider?: WhisperProvider;\n private stableDiffusionProvider?: StableDiffusionProvider;\n private analyzeCharacterizationProvider?: CharacterizationProvider;\n private ratingsProvider?: RatingsProvider;\n private loggerProvider?: LoggerProvider;\n private enforceCharacterization?: boolean;\n private attachments: AttachmentPayload[] = [];\n private attachmentResponses: string[] = [];\n\n constructor(\n assistantId: string,\n adapter: AlquimiaAdapter,\n options: AlquimiaSDKOptions = {}\n ) {\n if (!assistantId) {\n throw new Error('AlquimiaSDK: assistantId is required');\n }\n if (!adapter) {\n throw new Error(\n 'AlquimiaSDK: adapter is required. Use createNextJsAdapter() or createFetchAdapter()'\n );\n }\n\n this.assistantId = assistantId;\n this.adapter = adapter;\n this.enforceCharacterization = options.enforceCharacterization ?? true;\n\n this.axiosInstance = axios.create();\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n if (error.response?.status && this.loggerProvider) {\n await this.loggerProvider.logError('Server Error', error, {\n url: error.config.url,\n method: error.config.method,\n data: error.config.data,\n status: error.response.status,\n responseData: error.response.data,\n });\n }\n return Promise.reject(error);\n }\n );\n\n this.textToSpeech = this.textToSpeech.bind(this);\n this.speechToText = this.speechToText.bind(this);\n }\n\n withConversationId(conversationId: string): AlquimiaSDK {\n this.conversationId = conversationId;\n return this;\n }\n\n withAttachments(attachments: AttachmentPayload[]): AlquimiaSDK {\n this.attachments = attachments;\n return this;\n }\n\n withWhisperProvider(provider: WhisperProvider): AlquimiaSDK {\n this.whisperProvider = provider;\n return this;\n }\n\n withStableDiffusionProvider(provider: StableDiffusionProvider): AlquimiaSDK {\n this.stableDiffusionProvider = provider;\n return this;\n }\n\n withAnalyzeCharacterizationProvider(provider: CharacterizationProvider): AlquimiaSDK {\n this.analyzeCharacterizationProvider = provider;\n return this;\n }\n\n withRatingsProvider(provider: RatingsProvider): AlquimiaSDK {\n this.ratingsProvider = provider;\n return this;\n }\n\n withLoggerProvider(provider: LoggerProvider): AlquimiaSDK {\n this.loggerProvider = provider;\n return this;\n }\n\n withTools(tools: any): AlquimiaSDK {\n this.tools = tools;\n return this;\n }\n\n withExtraInstructions(extraInstructions: Record<string, string>): AlquimiaSDK {\n this.extraInstructions = extraInstructions;\n return this;\n }\n\n withAssistantConfig(assistantConfig: any): AlquimiaSDK {\n this.assistantConfig = assistantConfig;\n return this;\n }\n\n withUserId(userId: string): AlquimiaSDK {\n this.userId = userId;\n return this;\n }\n\n getEnforceCharacterization(): boolean {\n return this.enforceCharacterization ?? true;\n }\n\n textToSpeech(text: string): Promise<TTSResult> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.textToSpeech(text);\n }\n\n speechToText(audio: string): Promise<string> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.speechToText(audio);\n }\n\n async sendMessage(query: string, traceParent?: string): Promise<AlquimiaSDK> {\n if (!this.conversationId) {\n throw new Error(\n 'Conversation not initialized. Call withConversationId() before sendMessage()'\n );\n }\n\n const inferUrl = this.adapter.resolveInferUrl(this.assistantId);\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n\n const hasClientTools = Array.isArray(this.tools) && this.tools.length > 0;\n\n const initMessage: Record<string, unknown> = {\n query,\n session_id: this.conversationId,\n user_id: this.userId,\n ...(this.extraInstructions && { extra_instructions: this.extraInstructions }),\n ...(this.assistantConfig && { config: this.assistantConfig }),\n ...(hasClientTools && {\n evaluation_strategy: {\n evaluation_strategy_id: 'native',\n tool_schemas: this.tools,\n },\n }),\n };\n\n const result = (\n await this.axiosInstance.post(inferUrl, initMessage, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-trace-parent': traceParent || '',\n ...adapterHeaders,\n ...this.buildIdentityHeaders(),\n },\n })\n ).data as CommonAttributes;\n\n this.streamId = result.taskid ?? null;\n this.attachmentResponses = result.attachments ?? [];\n this.attachments = [];\n\n return this;\n }\n\n async generateImage(query: string): Promise<string> {\n if (!this.stableDiffusionProvider) {\n throw new Error('Stable Diffusion provider not initialized');\n }\n return this.stableDiffusionProvider.generateImage(query);\n }\n\n async analyzeCharacterization(text: string): Promise<Record<string, any>> {\n if (!this.analyzeCharacterizationProvider) {\n throw new Error('Analyze characterization provider not initialized');\n }\n return this.analyzeCharacterizationProvider.analyzeCharacterization(text);\n }\n\n async rate(data: any): Promise<Record<string, any>> {\n if (!this.ratingsProvider) {\n throw new Error('Ratings provider not initialized');\n }\n return this.ratingsProvider.rate(data);\n }\n\n async logInfo(message: string, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logInfo(message, data);\n }\n\n async logError(message: string, error: Error, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logError(message, error, data);\n }\n\n /**\n * @deprecated The runtime no longer returns attachment IDs from the infer\n * response — attachments are uploaded as standalone blobs and linked to the\n * session via headers. Always returns `[]`; kept for source compatibility.\n */\n getAttachmentResponses(): string[] {\n return this.attachmentResponses;\n }\n\n async uploadAttachment(file: File, _attachmentId?: string): Promise<void> {\n void _attachmentId;\n const url = this.adapter.resolveBlobUploadUrl();\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n const formData = new FormData();\n formData.append('file', file);\n await this.axiosInstance.post(url, formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n ...adapterHeaders,\n ...this.buildIdentityHeaders(),\n },\n });\n }\n\n /**\n * Identity headers (kebab-case) required by `/context/blob/upload` and\n * the rest of the runtime's internal endpoints introduced in v0.2.0→next.\n */\n private buildIdentityHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'assistant-id': this.assistantId,\n };\n if (this.conversationId) headers['session-id'] = this.conversationId;\n if (this.userId) headers['user-id'] = this.userId;\n if (this.streamId) headers['task-id'] = this.streamId;\n return headers;\n }\n\n getUrlStream(): string {\n if (!this.streamId) {\n throw new Error('Stream ID not initialized. Call sendMessage() first');\n }\n return this.adapter.resolveStreamUrl(this.streamId);\n }\n\n getStreamId(): string | null {\n return this.streamId;\n }\n\n /** Alias for {@link getStreamId} — same value as infer `taskid`. */\n getTaskId(): string | null {\n return this.streamId;\n }\n}\n\nexport default AlquimiaSDK;\n","import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === \"undefined\") return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n const trimmedText = text.trim();\n\n return (\n /^[\\w\\#\\-\\*\\|\\[\\]\\-\\+\\=\\s\\n\\r\\t\\!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^\\!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== \"undefined\") {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== \"undefined\" && window.location.pathname === \"/\") {\n const queryAssistantId = getQueryParam(\"talkwith\");\n if (queryAssistantId) {\n localStorage.setItem(\"assistantId\", queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem(\"assistantId\");\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n}\n\nexport function serializeAxiosError(error: unknown) {\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message,\n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: \"Unknown Error\",\n };\n}\n\nexport function parseConversationsMapCookie(\n cookieValue: string\n): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\n );\n}\n","/** One granular Runtime worklog record (a `bus_mode` SSE frame or a `/worklog/{task_id}/events` item). */\nexport interface WorklogRecord {\n event_class: string;\n control_id: string | null;\n data: unknown;\n status: \"success\" | \"error\" | null;\n date_submitted: string;\n}\n\n/** Semantic bucket a node belongs to. */\nexport type NodeKind =\n | \"safeguard\"\n | \"reasoning\"\n | \"tool\"\n | \"a2a\"\n | \"memory\"\n | \"answer\"\n | \"unknown\";\n\n/** Lifecycle state of a single node. */\nexport type NodeStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"skipped\";\n\n/** Overall run status. */\nexport type RunStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n\n/** A single step in the execution chain (command + its response merged by control_id). */\nexport interface WorklogNode {\n id: string;\n kind: NodeKind;\n eventClass: string;\n status: NodeStatus;\n title: string;\n startedAt?: string;\n endedAt?: string;\n depth: number;\n parentId?: string;\n children: WorklogNode[];\n command?: unknown;\n response?: unknown;\n error?: string;\n raw: WorklogRecord[];\n}\n\n/** Normalized execution model produced by the reducer. */\nexport interface WorklogState {\n taskId: string | null;\n status: RunStatus;\n answer: string | null;\n nodes: WorklogNode[];\n index: Record<string, number>;\n raw: WorklogRecord[];\n}\n\n/** How a record acts on the model. */\nexport type EventRole = \"open\" | \"close\" | \"run-open\" | \"run-close\" | \"ignore\";\n\n/** Registry descriptor for one event_class. */\nexport interface EventInterpreter {\n kind: NodeKind;\n role: EventRole;\n title: (record: WorklogRecord) => string;\n /** If true, an opened node starts in \"pending\" (awaiting external input) rather than \"running\". */\n pending?: boolean;\n}\n\nexport function initialWorklogState(taskId: string | null = null): WorklogState {\n return { taskId, status: \"idle\", answer: null, nodes: [], index: {}, raw: [] };\n}\n","import type { EventInterpreter, WorklogRecord } from \"./types\";\n\nconst asRecord = (data: unknown): Record<string, unknown> =>\n data && typeof data === \"object\" ? (data as Record<string, unknown>) : {};\n\nconst toolTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Tool: ${name}` : \"Tool\";\n};\n\nconst agentTitle = (r: WorklogRecord): string => {\n const name = asRecord(r.data).name;\n return typeof name === \"string\" && name.length > 0 ? `Agent: ${name}` : \"Agent-to-agent\";\n};\n\nconst constTitle = (label: string) => () => label;\n\nexport const EVENT_REGISTRY: Record<string, EventInterpreter> = {\n // Run envelope\n AssistantInference: { kind: \"answer\", role: \"run-open\", title: constTitle(\"Inference started\") },\n AssistantInferenceResponse: { kind: \"answer\", role: \"run-close\", title: constTitle(\"Answer\") },\n\n // Safeguard\n ShieldInference: { kind: \"safeguard\", role: \"open\", title: constTitle(\"Safeguard\") },\n ShieldInferenceResponse: { kind: \"safeguard\", role: \"close\", title: constTitle(\"Safeguard\") },\n\n // Reasoning\n ResponseInference: { kind: \"reasoning\", role: \"open\", title: constTitle(\"Reasoning\") },\n ResponseInferenceResponse: { kind: \"reasoning\", role: \"close\", title: constTitle(\"Reasoning\") },\n\n // Tools (server + subclasses) and their responses\n ServerToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n BuiltinToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n UnknownToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle },\n ClientToolExecution: { kind: \"tool\", role: \"open\", title: toolTitle, pending: true },\n ToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n BuiltinToolExecutionResponse: { kind: \"tool\", role: \"close\", title: toolTitle },\n\n // Tool schema discovery\n ToolSchema: { kind: \"tool\", role: \"open\", title: constTitle(\"Tool schema\") },\n ToolSchemaResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Tool schema\") },\n\n // Agent-to-agent\n A2AInference: { kind: \"a2a\", role: \"open\", title: agentTitle },\n AgentDiscovery: { kind: \"a2a\", role: \"open\", title: constTitle(\"Agent discovery\") },\n AgentDiscoveryResponse: { kind: \"a2a\", role: \"close\", title: constTitle(\"Agent discovery\") },\n\n // Memory / persistence\n ContextPersistence: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory persistence\") },\n ContextFlush: { kind: \"memory\", role: \"open\", title: constTitle(\"Memory flush\") },\n ContextFlushResponse: { kind: \"memory\", role: \"close\", title: constTitle(\"Memory flush\") },\n\n // Human approval\n HumanApprovalRequired: {\n kind: \"tool\",\n role: \"open\",\n title: constTitle(\"Human approval required\"),\n pending: true,\n },\n HumanApprovalRequiredResponse: { kind: \"tool\", role: \"close\", title: constTitle(\"Human approval\") },\n};\n\nexport function resolveInterpreter(eventClass: string): EventInterpreter {\n if (Object.prototype.hasOwnProperty.call(EVENT_REGISTRY, eventClass)) {\n return EVENT_REGISTRY[eventClass];\n }\n return {\n kind: \"unknown\",\n role: \"open\",\n title: (r: WorklogRecord) => r.event_class,\n };\n}\n","import { resolveInterpreter } from \"./registry\";\nimport type { EventInterpreter, WorklogNode, WorklogRecord, WorklogState } from \"./types\";\nimport { initialWorklogState } from \"./types\";\n\nconst asString = (v: unknown): string =>\n typeof v === \"string\" ? v : v == null ? \"\" : JSON.stringify(v);\n\nconst nodeDepth = (record: WorklogRecord): number => {\n const d = record.data && typeof record.data === \"object\"\n ? (record.data as Record<string, unknown>).depth\n : undefined;\n return typeof d === \"number\" ? d : 0;\n};\n\nconst makeOpenNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: interp.pending ? \"pending\" : \"running\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n command: record.data,\n raw: [record],\n});\n\nconst makeClosedNode = (record: WorklogRecord, interp: EventInterpreter, id: string): WorklogNode => ({\n id,\n kind: interp.kind,\n eventClass: record.event_class,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n title: interp.title(record),\n startedAt: record.date_submitted,\n endedAt: record.date_submitted,\n depth: nodeDepth(record),\n children: [],\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : undefined,\n raw: [record],\n});\n\nexport function reduceWorklog(state: WorklogState, record: WorklogRecord): WorklogState {\n const interp = resolveInterpreter(record.event_class);\n const next: WorklogState = {\n ...state,\n nodes: state.nodes.slice(),\n index: { ...state.index },\n raw: [...state.raw, record],\n };\n\n if (interp.role === \"ignore\") return next;\n\n if (interp.role === \"run-open\") {\n next.status = \"running\";\n return next;\n }\n\n if (interp.role === \"run-close\") {\n next.answer = asString(record.data) || null;\n next.status = record.status === \"error\" ? \"error\" : \"success\";\n return next;\n }\n\n const key = record.control_id ?? `${record.event_class}-${next.raw.length}`;\n\n if (interp.role === \"close\") {\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = {\n ...existing,\n status: record.status === \"error\" ? \"failed\" : \"completed\",\n endedAt: record.date_submitted,\n response: record.data,\n error: record.status === \"error\" ? asString(record.data) : existing.error,\n raw: [...existing.raw, record],\n };\n } else {\n // response arrived without a seen command — create it already closed\n next.index[key] = next.nodes.length;\n next.nodes.push(makeClosedNode(record, interp, key));\n }\n if (record.status === \"error\") next.status = \"error\";\n return next;\n }\n\n // role === \"open\"\n const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : undefined;\n if (pos != null) {\n const existing = next.nodes[pos];\n next.nodes[pos] = { ...existing, raw: [...existing.raw, record] };\n } else {\n next.index[key] = next.nodes.length;\n next.nodes.push(makeOpenNode(record, interp, key));\n }\n return next;\n}\n\nexport function foldWorklog(records: WorklogRecord[], taskId: string | null = null): WorklogState {\n return records.reduce(reduceWorklog, initialWorklogState(taskId));\n}\n","import { useCallback, useReducer } from \"react\";\nimport { reduceWorklog } from \"./reducer\";\nimport { initialWorklogState, type WorklogRecord, type WorklogState } from \"./types\";\n\ntype Action =\n | { type: \"ingest\"; record: WorklogRecord }\n | { type: \"ingestMany\"; records: WorklogRecord[] }\n | { type: \"reset\"; taskId: string | null };\n\nfunction hookReducer(state: WorklogState, action: Action): WorklogState {\n switch (action.type) {\n case \"ingest\":\n return reduceWorklog(state, action.record);\n case \"ingestMany\":\n return action.records.reduce(reduceWorklog, state);\n case \"reset\":\n return initialWorklogState(action.taskId);\n }\n}\n\n/** Live worklog accumulator. Feed it `bus_mode` records via `ingest`; use `foldWorklog` for history. */\nexport function useWorklog(taskId: string | null = null) {\n const [worklog, dispatch] = useReducer(hookReducer, taskId, initialWorklogState);\n\n const ingest = useCallback((record: WorklogRecord) => dispatch({ type: \"ingest\", record }), []);\n const ingestMany = useCallback(\n (records: WorklogRecord[]) => dispatch({ type: \"ingestMany\", records }),\n [],\n );\n const reset = useCallback(\n (id: string | null = null) => dispatch({ type: \"reset\", taskId: id }),\n [],\n );\n\n return { worklog, ingest, ingestMany, reset };\n}\n","import type { WorklogRecord } from \"./types\";\n\n/** Loosely-typed shape of a parsed SSE `data:` frame from the granular Runtime stream. */\nexport interface RawFrame {\n event_class?: string;\n control_id?: string | null;\n data?: unknown;\n status?: string | null;\n date_submitted?: string;\n}\n\n/** Normalize a parsed SSE frame into a WorklogRecord (defaults missing fields; never throws). */\nexport function frameToRecord(frame: RawFrame): WorklogRecord {\n const status = frame.status === \"success\" || frame.status === \"error\" ? frame.status : null;\n return {\n event_class: typeof frame.event_class === \"string\" && frame.event_class.length > 0\n ? frame.event_class\n : \"Unknown\",\n control_id: frame.control_id ?? null,\n data: frame.data,\n status,\n date_submitted: typeof frame.date_submitted === \"string\" ? frame.date_submitted : \"\",\n };\n}\n","\nimport { useState, useReducer } from \"react\";\nimport { RatingData } from \"../types/type\";\nimport { getTopicSessionId } from \"../utils/utils\";\n\ninterface RatingState {\n ratingStars: number;\n ratingThumbs: \"thumbsUp\" | \"thumbsDown\" | \"\";\n ratingComment: string;\n}\n\ntype RatingAction =\n | { type: \"SET_RATING_STARS\"; payload: number }\n | { type: \"SET_RATING_THUMBS\"; payload: \"thumbsUp\" | \"thumbsDown\" | \"\" }\n | { type: \"SET_RATING_COMMENT\"; payload: string };\n\nconst initialState: RatingState = {\n ratingStars: 0,\n ratingThumbs: \"\",\n ratingComment: \"\",\n};\n\nfunction ratingReducer(state: RatingState, action: RatingAction): RatingState {\n switch (action.type) {\n case \"SET_RATING_STARS\":\n return { ...state, ratingStars: action.payload };\n case \"SET_RATING_THUMBS\":\n return { ...state, ratingThumbs: action.payload };\n case \"SET_RATING_COMMENT\":\n return { ...state, ratingComment: action.payload };\n default:\n return state;\n }\n}\n\ninterface UseRatingsParams {\n assistantId: string;\n topicId: string;\n sendRating: (ratingData: RatingData) => Promise<any>;\n onError?: (componentName: string, error: Error) => void;\n}\n\n\nexport function useRatings({ assistantId, sendRating, topicId }: UseRatingsParams) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [hasReviewed, setHasReviewed] = useState<boolean>(false);\n const [state, dispatch] = useReducer(ratingReducer, initialState);\n\n const setRatingStars = (rating: number) => {\n dispatch({ type: \"SET_RATING_STARS\", payload: rating });\n };\n\n const setRatingThumbs = (rating: \"thumbsUp\" | \"thumbsDown\" | \"\") => {\n dispatch({ type: \"SET_RATING_THUMBS\", payload: rating });\n };\n\n const setRatingComment = (comment: string) => {\n dispatch({ type: \"SET_RATING_COMMENT\", payload: comment });\n };\n\n const thumbsScore = (value: string) => {\n return value === \"thumbsUp\" ? 5 : value === \"thumbsDown\" ? 0 : 0;\n }\n\n const handleRate = async (key: string, value: any | string, onHandleRateSuccess: (success: boolean, err?: string) => void) => {\n setIsLoading(true);\n const sessionId = getTopicSessionId(topicId);\n\n const ratingObj: RatingData = {\n topicId: parseInt(topicId),\n sessionId: sessionId || \"\",\n assistantId: assistantId,\n score: key === \"score\" ? value : thumbsScore(value),\n description: key === \"description\" ? value : state.ratingComment,\n };\n\n try {\n const response = await sendRating(ratingObj);\n if (!response.success) {\n setIsLoading(false);\n onHandleRateSuccess(false, response.error.message);\n return;\n }\n \n if (key === \"score\") {\n setRatingStars(value);\n } else if (key === \"description\") {\n setRatingComment(value);\n }\n setHasReviewed(true);\n setIsLoading(false);\n onHandleRateSuccess(true);\n } catch (err) {\n setIsLoading(false);\n onHandleRateSuccess(false, String(err));\n }\n };\n\n return {\n handleRate,\n ratingStars: state.ratingStars,\n ratingThumbs: state.ratingThumbs,\n ratingComment: state.ratingComment,\n isLoading,\n hasReviewed\n };\n}\n"],"mappings":"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","names":["pos","sessionId","input","messages","useState","useReducer","useState","useReducer"]}
@@ -1,4 +1,5 @@
1
1
  import { ProxyConfig } from '../proxy.mjs';
2
+ export { i as initConversation } from '../session.action-DirvOWt0.mjs';
2
3
 
3
4
  type ChatRouteContext = {
4
5
  params: {
@@ -19,12 +20,6 @@ declare function handleChatRequest(request: Request, context: ChatRouteContext,
19
20
  * @deprecated Use `createNextJsRouteHandlers()` from `@alquimia-ai/tools/next` instead.
20
21
  */
21
22
  declare function handleStreamRequest(request: Request, context: ChatRouteContext, config: ChatRequestConfig): Promise<Response>;
22
- /**
23
- * Next.js-specific session initializer using cookies().
24
- * For framework-agnostic usage, use `initConversation` from `@alquimia-ai/tools/actions`
25
- * with your own `SessionStorage` implementation.
26
- */
27
- declare function initConversation(reset?: boolean, topicId?: string): Promise<string>;
28
23
 
29
24
  interface NextJsRouteContext {
30
25
  params: Promise<{
@@ -41,9 +36,11 @@ declare function createNextJsRouteHandlers(config: ProxyConfig): {
41
36
  */
42
37
  handleStream: (request: Request, context: NextJsRouteContext) => Promise<Response>;
43
38
  /**
44
- * Use as POST handler in app/api/attachments/[...path]/route.ts
39
+ * Use as POST handler in app/api/blob/upload/route.ts (the runtime's
40
+ * `POST /context/blob/upload`). Identity travels via headers — no path
41
+ * params required.
45
42
  */
46
- handleAttachment: (request: Request, context: NextJsRouteContext) => Promise<Response>;
43
+ handleBlobUpload: (request: Request) => Promise<Response>;
47
44
  };
48
45
 
49
- export { type ChatRequestConfig, type ChatResponse, type ChatRouteContext, type NextJsRouteContext, ProxyConfig, createNextJsRouteHandlers, handleChatRequest, handleStreamRequest, initConversation };
46
+ export { type ChatRequestConfig, type ChatResponse, type ChatRouteContext, type NextJsRouteContext, ProxyConfig, createNextJsRouteHandlers, handleChatRequest, handleStreamRequest };
@@ -1,4 +1,5 @@
1
1
  import { ProxyConfig } from '../proxy.js';
2
+ export { i as initConversation } from '../session.action-DirvOWt0.js';
2
3
 
3
4
  type ChatRouteContext = {
4
5
  params: {
@@ -19,12 +20,6 @@ declare function handleChatRequest(request: Request, context: ChatRouteContext,
19
20
  * @deprecated Use `createNextJsRouteHandlers()` from `@alquimia-ai/tools/next` instead.
20
21
  */
21
22
  declare function handleStreamRequest(request: Request, context: ChatRouteContext, config: ChatRequestConfig): Promise<Response>;
22
- /**
23
- * Next.js-specific session initializer using cookies().
24
- * For framework-agnostic usage, use `initConversation` from `@alquimia-ai/tools/actions`
25
- * with your own `SessionStorage` implementation.
26
- */
27
- declare function initConversation(reset?: boolean, topicId?: string): Promise<string>;
28
23
 
29
24
  interface NextJsRouteContext {
30
25
  params: Promise<{
@@ -41,9 +36,11 @@ declare function createNextJsRouteHandlers(config: ProxyConfig): {
41
36
  */
42
37
  handleStream: (request: Request, context: NextJsRouteContext) => Promise<Response>;
43
38
  /**
44
- * Use as POST handler in app/api/attachments/[...path]/route.ts
39
+ * Use as POST handler in app/api/blob/upload/route.ts (the runtime's
40
+ * `POST /context/blob/upload`). Identity travels via headers — no path
41
+ * params required.
45
42
  */
46
- handleAttachment: (request: Request, context: NextJsRouteContext) => Promise<Response>;
43
+ handleBlobUpload: (request: Request) => Promise<Response>;
47
44
  };
48
45
 
49
- export { type ChatRequestConfig, type ChatResponse, type ChatRouteContext, type NextJsRouteContext, ProxyConfig, createNextJsRouteHandlers, handleChatRequest, handleStreamRequest, initConversation };
46
+ export { type ChatRequestConfig, type ChatResponse, type ChatRouteContext, type NextJsRouteContext, ProxyConfig, createNextJsRouteHandlers, handleChatRequest, handleStreamRequest };
@@ -23,16 +23,34 @@ __export(next_exports, {
23
23
  createNextJsRouteHandlers: () => createNextJsRouteHandlers,
24
24
  handleChatRequest: () => handleChatRequest,
25
25
  handleStreamRequest: () => handleStreamRequest,
26
- initConversation: () => initConversation2
26
+ initConversation: () => initConversation
27
27
  });
28
28
  module.exports = __toCommonJS(next_exports);
29
29
 
30
30
  // src/proxy.ts
31
+ var IDENTITY_HEADER_NAMES = [
32
+ "task-id",
33
+ "parent-task-id",
34
+ "session-id",
35
+ "user-id",
36
+ "assistant-id",
37
+ "agentspace-id",
38
+ "channel-id",
39
+ "depth"
40
+ ];
41
+ function pickIdentityHeaders(request) {
42
+ const out = {};
43
+ for (const name of IDENTITY_HEADER_NAMES) {
44
+ const value = request.headers.get(name);
45
+ if (value) out[name] = value;
46
+ }
47
+ return out;
48
+ }
31
49
  function createAlquimiaProxyHandler(config) {
32
50
  const baseUrl = config.assistantBaseUrl.replace(/\/$/, "");
33
51
  const inferRoute = config.inferRoute ?? "event/infer";
34
52
  const streamRoute = config.streamRoute ?? "event/stream";
35
- const attachmentRoute = config.attachmentRoute ?? "event/attachment";
53
+ const blobUploadRoute = config.blobUploadRoute ?? "context/blob/upload";
36
54
  const authHeader = { Authorization: `Bearer ${config.apiKey}` };
37
55
  return {
38
56
  async handleInfer(request, pathSuffix) {
@@ -40,10 +58,14 @@ function createAlquimiaProxyHandler(config) {
40
58
  const body = await request.json();
41
59
  const url = new URL(request.url);
42
60
  const querySuffix = url.searchParams.toString() ? `?${url.searchParams.toString()}` : "";
43
- const targetUrl = `${baseUrl}/${inferRoute}/${pathSuffix}${querySuffix}`;
61
+ const slug = pathSuffix.replace(/^\/+|\/+$/g, "");
62
+ const targetUrl = `${baseUrl}/${inferRoute}/${slug}${querySuffix}`;
44
63
  const response = await fetch(targetUrl, {
45
64
  method: "POST",
46
- headers: { "Content-Type": "application/json", ...authHeader },
65
+ headers: {
66
+ "Content-Type": "application/json",
67
+ ...authHeader
68
+ },
47
69
  body: JSON.stringify(body)
48
70
  });
49
71
  if (!response.ok) {
@@ -115,22 +137,23 @@ function createAlquimiaProxyHandler(config) {
115
137
  );
116
138
  }
117
139
  },
118
- async handleAttachment(request, streamId, attachmentId) {
140
+ async handleBlobUpload(request) {
119
141
  try {
120
- const targetUrl = `${baseUrl}/${attachmentRoute}/${streamId}/${attachmentId}`;
142
+ const targetUrl = `${baseUrl}/${blobUploadRoute}`;
121
143
  const contentType = request.headers.get("Content-Type") ?? "";
122
144
  const response = await fetch(targetUrl, {
123
145
  method: "POST",
124
146
  headers: {
125
147
  ...authHeader,
126
- ...contentType && { "Content-Type": contentType }
148
+ ...contentType && { "Content-Type": contentType },
149
+ ...pickIdentityHeaders(request)
127
150
  },
128
151
  body: request.body,
129
152
  duplex: "half"
130
153
  });
131
154
  if (!response.ok) {
132
155
  return new Response(
133
- JSON.stringify({ error: "Failed to upload attachment", status: response.status }),
156
+ JSON.stringify({ error: "Failed to upload blob", status: response.status }),
134
157
  { status: response.status, headers: { "Content-Type": "application/json" } }
135
158
  );
136
159
  }
@@ -140,9 +163,9 @@ function createAlquimiaProxyHandler(config) {
140
163
  headers: { "Content-Type": "application/json" }
141
164
  });
142
165
  } catch (error) {
143
- console.error("AlquimiaProxy handleAttachment exception:", error);
166
+ console.error("AlquimiaProxy handleBlobUpload exception:", error);
144
167
  return new Response(
145
- JSON.stringify({ error: "Failed to forward attachment request" }),
168
+ JSON.stringify({ error: "Failed to forward blob upload request" }),
146
169
  { status: 500, headers: { "Content-Type": "application/json" } }
147
170
  );
148
171
  }
@@ -153,39 +176,6 @@ function createAlquimiaProxyHandler(config) {
153
176
  // src/next/actions.ts
154
177
  var import_server = require("next/server");
155
178
  var import_headers = require("next/headers");
156
-
157
- // src/actions/session.action.ts
158
- var import_crypto = require("crypto");
159
- async function initConversation(storage, reset, topicId) {
160
- if (!topicId) {
161
- let conversationId = (0, import_crypto.randomUUID)().toString();
162
- const existing = await storage.get("alquimia-session");
163
- if (!existing || reset) {
164
- await storage.set("alquimia-session", conversationId);
165
- } else {
166
- conversationId = existing;
167
- }
168
- return conversationId;
169
- }
170
- let conversationsMap = {};
171
- const existingConversations = await storage.get("alquimia-sessions");
172
- if (existingConversations) {
173
- try {
174
- const decodedValue = decodeURIComponent(existingConversations);
175
- conversationsMap = JSON.parse(decodedValue);
176
- } catch (e) {
177
- console.error("Error parsing conversations cookie:", e);
178
- conversationsMap = {};
179
- }
180
- }
181
- if (!conversationsMap[topicId] || reset) {
182
- conversationsMap[topicId] = (0, import_crypto.randomUUID)().toString();
183
- }
184
- await storage.set("alquimia-sessions", JSON.stringify(conversationsMap));
185
- return conversationsMap[topicId];
186
- }
187
-
188
- // src/next/actions.ts
189
179
  async function handleChatRequest(request, context, config) {
190
180
  try {
191
181
  const headersList = await (0, import_headers.headers)();
@@ -282,17 +272,38 @@ async function handleStreamRequest(request, context, config) {
282
272
  );
283
273
  }
284
274
  }
285
- async function initConversation2(reset, topicId) {
286
- const cookieStore = await (0, import_headers.cookies)();
287
- const storage = {
288
- get(key) {
289
- return cookieStore.get(key)?.value ?? null;
290
- },
291
- set(key, value) {
292
- cookieStore.set(key, value);
275
+
276
+ // src/actions/session.action.ts
277
+ var import_crypto = require("crypto");
278
+ var import_headers2 = require("next/headers");
279
+ async function initConversation(reset, topicId) {
280
+ const cookieStore = await (0, import_headers2.cookies)();
281
+ if (!topicId) {
282
+ let conversationId = (0, import_crypto.randomUUID)().toString();
283
+ const alquimiaSession = cookieStore.get("alquimia-session");
284
+ if (!alquimiaSession || reset) {
285
+ cookieStore.set("alquimia-session", conversationId);
286
+ } else {
287
+ conversationId = alquimiaSession.value;
293
288
  }
294
- };
295
- return initConversation(storage, reset, topicId);
289
+ return conversationId;
290
+ }
291
+ let conversationsMap = {};
292
+ const existingConversations = cookieStore.get("alquimia-sessions");
293
+ if (existingConversations) {
294
+ try {
295
+ const decodedValue = decodeURIComponent(existingConversations.value);
296
+ conversationsMap = JSON.parse(decodedValue);
297
+ } catch (e) {
298
+ console.error("Error parsing conversations cookie:", e);
299
+ conversationsMap = {};
300
+ }
301
+ }
302
+ if (!conversationsMap[topicId] || reset) {
303
+ conversationsMap[topicId] = (0, import_crypto.randomUUID)().toString();
304
+ }
305
+ cookieStore.set("alquimia-sessions", JSON.stringify(conversationsMap));
306
+ return conversationsMap[topicId];
296
307
  }
297
308
 
298
309
  // src/next/index.ts
@@ -314,18 +325,12 @@ function createNextJsRouteHandlers(config) {
314
325
  return handler.handleStream(request, path.join("/"));
315
326
  },
316
327
  /**
317
- * Use as POST handler in app/api/attachments/[...path]/route.ts
328
+ * Use as POST handler in app/api/blob/upload/route.ts (the runtime's
329
+ * `POST /context/blob/upload`). Identity travels via headers — no path
330
+ * params required.
318
331
  */
319
- handleAttachment: async (request, context) => {
320
- const { path } = await context.params;
321
- const [streamId, attachmentId] = path;
322
- if (!streamId || !attachmentId) {
323
- return new Response(
324
- JSON.stringify({ error: "streamId and attachmentId are required in path" }),
325
- { status: 422, headers: { "Content-Type": "application/json" } }
326
- );
327
- }
328
- return handler.handleAttachment(request, streamId, attachmentId);
332
+ handleBlobUpload: async (request) => {
333
+ return handler.handleBlobUpload(request);
329
334
  }
330
335
  };
331
336
  }