@alquimia-ai/tools 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/alquimia.hook.tsx","../../src/sdk/alquimia-sdk.ts","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["export { useAlquimia } from \"./alquimia.hook\";\nexport { useRatings } from \"./useRatings\";","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';\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 };\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 [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 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 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 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","\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":["axios","sessionId","input","messages","import_react"]}
1
+ {"version":3,"sources":["../../src/hooks/index.ts","../../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":["export { useAlquimia } from \"./alquimia.hook\";\nexport { useRatings } from \"./useRatings\";","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":["import_react","axios","pos","sessionId","input","messages","import_react"]}
@@ -301,6 +301,166 @@ function mergeToolEvents(initial, toolEvents) {
301
301
  );
302
302
  }
303
303
 
304
+ // src/worklog/types.ts
305
+ function initialWorklogState(taskId = null) {
306
+ return { taskId, status: "idle", answer: null, nodes: [], index: {}, raw: [] };
307
+ }
308
+
309
+ // src/worklog/registry.ts
310
+ var asRecord = (data) => data && typeof data === "object" ? data : {};
311
+ var toolTitle = (r) => {
312
+ const name = asRecord(r.data).name;
313
+ return typeof name === "string" && name.length > 0 ? `Tool: ${name}` : "Tool";
314
+ };
315
+ var agentTitle = (r) => {
316
+ const name = asRecord(r.data).name;
317
+ return typeof name === "string" && name.length > 0 ? `Agent: ${name}` : "Agent-to-agent";
318
+ };
319
+ var constTitle = (label) => () => label;
320
+ var EVENT_REGISTRY = {
321
+ // Run envelope
322
+ AssistantInference: { kind: "answer", role: "run-open", title: constTitle("Inference started") },
323
+ AssistantInferenceResponse: { kind: "answer", role: "run-close", title: constTitle("Answer") },
324
+ // Safeguard
325
+ ShieldInference: { kind: "safeguard", role: "open", title: constTitle("Safeguard") },
326
+ ShieldInferenceResponse: { kind: "safeguard", role: "close", title: constTitle("Safeguard") },
327
+ // Reasoning
328
+ ResponseInference: { kind: "reasoning", role: "open", title: constTitle("Reasoning") },
329
+ ResponseInferenceResponse: { kind: "reasoning", role: "close", title: constTitle("Reasoning") },
330
+ // Tools (server + subclasses) and their responses
331
+ ServerToolExecution: { kind: "tool", role: "open", title: toolTitle },
332
+ BuiltinToolExecution: { kind: "tool", role: "open", title: toolTitle },
333
+ UnknownToolExecution: { kind: "tool", role: "open", title: toolTitle },
334
+ ClientToolExecution: { kind: "tool", role: "open", title: toolTitle, pending: true },
335
+ ToolExecutionResponse: { kind: "tool", role: "close", title: toolTitle },
336
+ BuiltinToolExecutionResponse: { kind: "tool", role: "close", title: toolTitle },
337
+ // Tool schema discovery
338
+ ToolSchema: { kind: "tool", role: "open", title: constTitle("Tool schema") },
339
+ ToolSchemaResponse: { kind: "tool", role: "close", title: constTitle("Tool schema") },
340
+ // Agent-to-agent
341
+ A2AInference: { kind: "a2a", role: "open", title: agentTitle },
342
+ AgentDiscovery: { kind: "a2a", role: "open", title: constTitle("Agent discovery") },
343
+ AgentDiscoveryResponse: { kind: "a2a", role: "close", title: constTitle("Agent discovery") },
344
+ // Memory / persistence
345
+ ContextPersistence: { kind: "memory", role: "open", title: constTitle("Memory persistence") },
346
+ ContextFlush: { kind: "memory", role: "open", title: constTitle("Memory flush") },
347
+ ContextFlushResponse: { kind: "memory", role: "close", title: constTitle("Memory flush") },
348
+ // Human approval
349
+ HumanApprovalRequired: {
350
+ kind: "tool",
351
+ role: "open",
352
+ title: constTitle("Human approval required"),
353
+ pending: true
354
+ },
355
+ HumanApprovalRequiredResponse: { kind: "tool", role: "close", title: constTitle("Human approval") }
356
+ };
357
+ function resolveInterpreter(eventClass) {
358
+ if (Object.prototype.hasOwnProperty.call(EVENT_REGISTRY, eventClass)) {
359
+ return EVENT_REGISTRY[eventClass];
360
+ }
361
+ return {
362
+ kind: "unknown",
363
+ role: "open",
364
+ title: (r) => r.event_class
365
+ };
366
+ }
367
+
368
+ // src/worklog/reducer.ts
369
+ var asString = (v) => typeof v === "string" ? v : v == null ? "" : JSON.stringify(v);
370
+ var nodeDepth = (record) => {
371
+ const d = record.data && typeof record.data === "object" ? record.data.depth : void 0;
372
+ return typeof d === "number" ? d : 0;
373
+ };
374
+ var makeOpenNode = (record, interp, id) => ({
375
+ id,
376
+ kind: interp.kind,
377
+ eventClass: record.event_class,
378
+ status: interp.pending ? "pending" : "running",
379
+ title: interp.title(record),
380
+ startedAt: record.date_submitted,
381
+ depth: nodeDepth(record),
382
+ children: [],
383
+ command: record.data,
384
+ raw: [record]
385
+ });
386
+ var makeClosedNode = (record, interp, id) => ({
387
+ id,
388
+ kind: interp.kind,
389
+ eventClass: record.event_class,
390
+ status: record.status === "error" ? "failed" : "completed",
391
+ title: interp.title(record),
392
+ startedAt: record.date_submitted,
393
+ endedAt: record.date_submitted,
394
+ depth: nodeDepth(record),
395
+ children: [],
396
+ response: record.data,
397
+ error: record.status === "error" ? asString(record.data) : void 0,
398
+ raw: [record]
399
+ });
400
+ function reduceWorklog(state, record) {
401
+ const interp = resolveInterpreter(record.event_class);
402
+ const next = {
403
+ ...state,
404
+ nodes: state.nodes.slice(),
405
+ index: { ...state.index },
406
+ raw: [...state.raw, record]
407
+ };
408
+ if (interp.role === "ignore") return next;
409
+ if (interp.role === "run-open") {
410
+ next.status = "running";
411
+ return next;
412
+ }
413
+ if (interp.role === "run-close") {
414
+ next.answer = asString(record.data) || null;
415
+ next.status = record.status === "error" ? "error" : "success";
416
+ return next;
417
+ }
418
+ const key = record.control_id ?? `${record.event_class}-${next.raw.length}`;
419
+ if (interp.role === "close") {
420
+ const pos2 = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : void 0;
421
+ if (pos2 != null) {
422
+ const existing = next.nodes[pos2];
423
+ next.nodes[pos2] = {
424
+ ...existing,
425
+ status: record.status === "error" ? "failed" : "completed",
426
+ endedAt: record.date_submitted,
427
+ response: record.data,
428
+ error: record.status === "error" ? asString(record.data) : existing.error,
429
+ raw: [...existing.raw, record]
430
+ };
431
+ } else {
432
+ next.index[key] = next.nodes.length;
433
+ next.nodes.push(makeClosedNode(record, interp, key));
434
+ }
435
+ if (record.status === "error") next.status = "error";
436
+ return next;
437
+ }
438
+ const pos = Object.prototype.hasOwnProperty.call(next.index, key) ? next.index[key] : void 0;
439
+ if (pos != null) {
440
+ const existing = next.nodes[pos];
441
+ next.nodes[pos] = { ...existing, raw: [...existing.raw, record] };
442
+ } else {
443
+ next.index[key] = next.nodes.length;
444
+ next.nodes.push(makeOpenNode(record, interp, key));
445
+ }
446
+ return next;
447
+ }
448
+
449
+ // src/worklog/use-worklog.ts
450
+ import { useCallback, useReducer } from "react";
451
+
452
+ // src/worklog/from-frame.ts
453
+ function frameToRecord(frame) {
454
+ const status = frame.status === "success" || frame.status === "error" ? frame.status : null;
455
+ return {
456
+ event_class: typeof frame.event_class === "string" && frame.event_class.length > 0 ? frame.event_class : "Unknown",
457
+ control_id: frame.control_id ?? null,
458
+ data: frame.data,
459
+ status,
460
+ date_submitted: typeof frame.date_submitted === "string" ? frame.date_submitted : ""
461
+ };
462
+ }
463
+
304
464
  // src/hooks/alquimia.hook.tsx
305
465
  function useAlquimia(config) {
306
466
  const sdk = useMemo(() => {
@@ -329,6 +489,10 @@ function useAlquimia(config) {
329
489
  const [activeTool, setActiveTool] = useState(null);
330
490
  const [lastRequest, setLastRequest] = useState(null);
331
491
  const [hasThinkings, setHasThinkings] = useState(false);
492
+ const worklogEnabled = config.options?.worklog ?? false;
493
+ const [worklog, setWorklog] = useState(
494
+ worklogEnabled ? initialWorklogState() : void 0
495
+ );
332
496
  const [attachments, setAttachments] = useState([]);
333
497
  const [isUploadingAttachments, setIsUploadingAttachments] = useState(false);
334
498
  const isLoading = isMessageLoading || isStreamingLoading || isUploadingAttachments;
@@ -534,6 +698,7 @@ function useAlquimia(config) {
534
698
  lastMessageAt: null,
535
699
  closedByClient: false
536
700
  };
701
+ if (worklogEnabled) setWorklog(initialWorklogState());
537
702
  const eventSource = new EventSource(streamUrl);
538
703
  eventSourceRef.current = eventSource;
539
704
  eventSource.onopen = () => {
@@ -594,6 +759,9 @@ function useAlquimia(config) {
594
759
  }
595
760
  function handleMessageEvent(event, callBack, eventSource, streamState) {
596
761
  const data = JSON.parse(event.data);
762
+ if (worklogEnabled) {
763
+ setWorklog((prev) => reduceWorklog(prev ?? initialWorklogState(), frameToRecord(data)));
764
+ }
597
765
  const eventTaskId = data.taskid || "";
598
766
  if (data.errors?.length) {
599
767
  for (const error of data.errors) {
@@ -651,6 +819,7 @@ function useAlquimia(config) {
651
819
  setLastRequest,
652
820
  setIsAudioRecording,
653
821
  hasThinkings,
822
+ worklog,
654
823
  attachments,
655
824
  addAttachment,
656
825
  addAttachments,
@@ -661,7 +830,7 @@ function useAlquimia(config) {
661
830
  }
662
831
 
663
832
  // src/hooks/useRatings.ts
664
- import { useState as useState2, useReducer } from "react";
833
+ import { useState as useState2, useReducer as useReducer2 } from "react";
665
834
  var initialState = {
666
835
  ratingStars: 0,
667
836
  ratingThumbs: "",
@@ -682,7 +851,7 @@ function ratingReducer(state, action) {
682
851
  function useRatings({ assistantId, sendRating, topicId }) {
683
852
  const [isLoading, setIsLoading] = useState2(false);
684
853
  const [hasReviewed, setHasReviewed] = useState2(false);
685
- const [state, dispatch] = useReducer(ratingReducer, initialState);
854
+ const [state, dispatch] = useReducer2(ratingReducer, initialState);
686
855
  const setRatingStars = (rating) => {
687
856
  dispatch({ type: "SET_RATING_STARS", payload: rating });
688
857
  };