@alquimia-ai/tools 2.1.0 → 2.3.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.
- package/dist/actions/index.d.mts +1 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/index.mjs.map +1 -1
- package/dist/actions-BebMyGqF.d.ts +16 -0
- package/dist/actions-Ca3ro-hX.d.mts +16 -0
- package/dist/adapters/fetch.d.mts +2 -0
- package/dist/adapters/fetch.d.ts +2 -0
- package/dist/adapters/fetch.js +7 -1
- package/dist/adapters/fetch.js.map +1 -1
- package/dist/adapters/fetch.mjs +7 -1
- package/dist/adapters/fetch.mjs.map +1 -1
- package/dist/adapters/index.d.mts +1 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/next.d.mts +2 -0
- package/dist/adapters/next.d.ts +2 -0
- package/dist/adapters/next.js +7 -1
- package/dist/adapters/next.js.map +1 -1
- package/dist/adapters/next.mjs +7 -1
- package/dist/adapters/next.mjs.map +1 -1
- package/dist/genui/index.d.mts +3027 -0
- package/dist/genui/index.d.ts +3027 -0
- package/dist/genui/index.js +3344 -0
- package/dist/genui/index.js.map +1 -0
- package/dist/genui/index.mjs +3321 -0
- package/dist/genui/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +26 -1
- package/dist/hooks/index.d.ts +26 -1
- package/dist/hooks/index.js +650 -21
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +632 -3
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/next/index.d.mts +7 -0
- package/dist/next/index.d.ts +7 -0
- package/dist/next/index.js +50 -0
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +50 -0
- package/dist/next/index.mjs.map +1 -1
- package/dist/providers/index.d.mts +3 -2
- package/dist/providers/index.d.ts +3 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs.map +1 -1
- package/dist/proxy.d.mts +2 -0
- package/dist/proxy.d.ts +2 -0
- package/dist/proxy.js +41 -0
- package/dist/proxy.js.map +1 -1
- package/dist/proxy.mjs +41 -0
- package/dist/proxy.mjs.map +1 -1
- package/dist/registry-Bcu_ZYL1.d.mts +19 -0
- package/dist/registry-Bcu_ZYL1.d.ts +19 -0
- package/dist/sdk/index.d.mts +10 -0
- package/dist/sdk/index.d.ts +10 -0
- package/dist/sdk/index.js +26 -0
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/index.mjs +26 -0
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/services/index.d.mts +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/types/index.d.mts +10 -1
- package/dist/types/index.d.ts +10 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/types-DnfWUE9V.d.mts +56 -0
- package/dist/types-DnfWUE9V.d.ts +56 -0
- package/dist/types-Dvu9y4WM.d.mts +53 -0
- package/dist/types-Dvu9y4WM.d.ts +53 -0
- package/dist/utils/index.d.mts +6 -2
- package/dist/utils/index.d.ts +6 -2
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +4 -0
- package/dist/utils/index.mjs.map +1 -1
- package/dist/worklog/index.d.mts +29 -0
- package/dist/worklog/index.d.ts +29 -0
- package/dist/worklog/index.js +218 -0
- package/dist/worklog/index.js.map +1 -0
- package/dist/worklog/index.mjs +195 -0
- package/dist/worklog/index.mjs.map +1 -0
- package/package.json +24 -7
package/dist/hooks/index.mjs.map
CHANGED
|
@@ -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 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":["sessionId","input","messages","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/pending-client-tool.ts","../../src/genui/style.ts","../../src/genui/registry.ts","../../src/genui/catalog.ts","../../src/genui/actions.ts","../../src/genui/validate.ts","../../src/genui/tool-schema.ts","../../src/genui/clause.ts","../../src/genui/emit.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["import { useCallback, useEffect, 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 GenuiSurfaceItem,\n} from '../types/type';\nimport { createMessageId, mergeThinkingsByControlId, mergeToolEvents, resolveGenuiAllow } from '../utils';\nimport { reduceWorklog, initialWorklogState, frameToRecord, type WorklogState } from '../worklog';\nimport { extractPendingClientTool, type PendingClientTool } from './pending-client-tool';\nimport type { ToolExecutionResponse, UIAction, CatalogManifest } from '../genui';\nimport { validateSurface, buildRenderUiSchema, buildGenuiClause, coreCatalog } from '../genui';\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 genui?: {\n catalog?: CatalogManifest;\n allow?: string[] | 'all';\n source?: 'client' | 'agent';\n };\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 if (config.genui && (config.genui.source ?? 'client') === 'client') {\n const cat = config.genui.catalog ?? coreCatalog;\n const allow = resolveGenuiAllow(cat, config.genui.allow);\n instance.withTools([buildRenderUiSchema(cat, allow)]);\n instance.withExtraInstructions({\n ...(config.options?.extraInstructions ?? {}),\n genui: buildGenuiClause(cat, allow),\n });\n }\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 const [pendingClientTool, setPendingClientTool] = useState<PendingClientTool | null>(null);\n // Tracks control_ids already completed so a re-render never double-submits.\n const completedToolsRef = useRef<Set<string>>(new Set());\n // GenUI surface lifecycle state.\n const genuiCatalog = config.genui?.catalog ?? coreCatalog;\n const [genuiSurfaces, setGenuiSurfaces] = useState<GenuiSurfaceItem[]>([]);\n const messagesLenRef = useRef(0);\n messagesLenRef.current = messages.length;\n // Anchor a surface right after the last USER message — BEFORE any assistant output\n // (including the streaming placeholder). Otherwise the surface anchors after the\n // placeholder and the agent's reply (and its loader) render ABOVE the surface.\n const genuiAnchorRef = useRef(0);\n {\n let anchor = messages.length;\n for (let i = messages.length - 1; i >= 0; i--) {\n if ((messages[i] as { role?: string }).role === 'user') {\n anchor = i + 1;\n break;\n }\n }\n genuiAnchorRef.current = anchor;\n }\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\n // A client tool (e.g. render_ui) arrived on the stream. Surface it so the UI\n // can render the A2UI surface and complete it via `completeToolExecution`.\n // Inference is paused server-side until the completion POST lands.\n const pending = extractPendingClientTool(data);\n if (pending) {\n setPendingClientTool(pending);\n return;\n }\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 /**\n * Complete a pending client-tool execution. Interactive `render_ui` surfaces\n * pass the user's data as `result`; display-only surfaces pass `{ shown: true }`.\n * Idempotent per `control_id` (a second call for the same id is a no-op) and\n * stable across renders, so consumers can call it from an effect without\n * guarding against double-submits themselves. Clears the pending state on\n * success so inference can resume.\n */\n const completeToolExecution = useCallback(\n async (controlId: string, result: ToolExecutionResponse) => {\n if (completedToolsRef.current.has(controlId)) return;\n completedToolsRef.current.add(controlId);\n try {\n await sdk.submitToolResult({ ...result, control_id: controlId });\n setPendingClientTool((cur) => (cur?.controlId === controlId ? null : cur));\n } catch (err) {\n // Allow a retry if the submit failed.\n completedToolsRef.current.delete(controlId);\n throw err;\n }\n },\n [sdk],\n );\n\n // ---- GenUI surface lifecycle (only active when config.genui is set) ----\n useEffect(() => {\n if (!config.genui) return;\n if (!pendingClientTool || pendingClientTool.toolName !== 'render_ui') return;\n const { controlId } = pendingClientTool;\n // Stamp the active catalog id if the agent omitted it, so the client always knows\n // which catalog version to render against (Tier 2 authoritative catalogId).\n const parameters =\n pendingClientTool.parameters && typeof pendingClientTool.parameters === 'object'\n ? { catalogId: genuiCatalog.id, ...(pendingClientTool.parameters as Record<string, unknown>) }\n : pendingClientTool.parameters;\n\n const res = validateSurface(parameters, genuiCatalog);\n if (!res.ok || !res.value) {\n void completeToolExecution(controlId, {\n control_id: controlId,\n tool_name: 'render_ui',\n status: 'error',\n message:\n 'Surface failed client validation: ' + res.errors.map((e) => `${e.path} ${e.message}`).join('; '),\n result: { errors: res.errors },\n });\n return;\n }\n\n const surface = res.value;\n setGenuiSurfaces((prev) =>\n prev.some((s) => s.controlId === controlId)\n ? prev\n : [...prev, { controlId, surface, afterCount: genuiAnchorRef.current }]\n );\n\n const interactive = surface.components.some((c) => c.action?.wantResponse === true);\n if (!interactive) {\n void completeToolExecution(controlId, {\n control_id: controlId,\n tool_name: 'render_ui',\n status: 'success',\n result: {\n shown: true,\n instruction:\n 'The UI is rendered and visible to the user. Do NOT restate it as text/markdown/ASCII; reply with at most one short sentence.',\n },\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pendingClientTool, completeToolExecution, config.genui]);\n\n const genuiOnAgentAction = useCallback(\n (controlId: string) => (action: UIAction) => {\n setGenuiSurfaces((prev) =>\n prev.map((s) => (s.controlId === controlId ? { ...s, submitted: true } : s)),\n );\n void completeToolExecution(controlId, {\n control_id: controlId,\n tool_name: 'render_ui',\n status: 'success',\n result: { action: action.action, surfaceId: action.surfaceId, data: action.payload },\n });\n },\n [completeToolExecution],\n );\n\n const genuiAwaitingUser = !!(\n pendingClientTool &&\n pendingClientTool.toolName === 'render_ui' &&\n genuiSurfaces.some(\n (s) =>\n s.controlId === pendingClientTool.controlId &&\n s.surface.components.some((c) => c.action?.wantResponse === true),\n )\n );\n\n const genui = config.genui\n ? { surfaces: genuiSurfaces, onAgentAction: genuiOnAgentAction, awaitingUser: genuiAwaitingUser }\n : undefined;\n\n return {\n sdk,\n activeTool,\n pendingClientTool,\n completeToolExecution,\n genui,\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';\nimport type { ToolExecutionResponse } from '../genui/types';\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 /**\n * Complete a pending client-tool execution (the missing \"submit half\" of the\n * client-tool loop). POSTs a {@link ToolExecutionResponse} to the runtime's\n * `/event/tool-completion`. For interactive `render_ui` surfaces `result` is\n * the user's data; for display-only surfaces the SDK sends `{ shown: true }`.\n * The pending call is correlated by `control_id` in the body + the\n * `context-metadata` header (taskid + sessionid).\n */\n async submitToolResult(response: ToolExecutionResponse): Promise<void> {\n const url = this.adapter.resolveToolCompletionUrl?.();\n if (!url) {\n throw new Error(\n 'AlquimiaSDK: adapter does not support tool completion (resolveToolCompletionUrl missing)'\n );\n }\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n assistantid: this.assistantId,\n ...(this.streamId && { taskid: this.streamId }),\n ...(this.conversationId && { sessionid: this.conversationId }),\n ...(this.userId && { userid: this.userId }),\n ...adapterHeaders,\n };\n await this.axiosInstance.post(url, response, { headers });\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\";\nimport { CatalogManifest } from \"../genui\";\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\nexport function resolveGenuiAllow(catalog: CatalogManifest, allow?: string[] | 'all'): string[] {\n return !allow || allow === 'all' ? Object.keys(catalog.components) : allow;\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","export interface PendingClientTool {\n controlId: string;\n toolName: string;\n parameters: unknown;\n}\n\n/** Extract a pending client-tool execution from a raw SSE frame. Returns null if not one. */\nexport function extractPendingClientTool(frame: unknown): PendingClientTool | null {\n if (!frame || typeof frame !== \"object\") return null;\n const f = frame as Record<string, any>;\n if (f.event_class !== \"ClientToolExecution\") return null;\n const name = f.data?.name;\n const parameters = f.data?.parameters;\n const controlId = f.control_id;\n if (typeof name !== \"string\" || parameters === undefined || typeof controlId !== \"string\") return null;\n return { controlId, toolName: name, parameters };\n}\n","import { z } from \"zod\";\n\n/**\n * The agent-facing \"style vocabulary\" — enum-constrained semantic props that let\n * the model style a surface via INTENT, never CSS. Shared across every catalog\n * component; the UI renderer maps these to the consumer's design tokens.\n * See docs/a2ui-approach.md §11.\n */\nexport const TONES = [\"default\", \"muted\", \"primary\", \"success\", \"warning\", \"danger\"] as const;\nexport const SIZES = [\"sm\", \"md\", \"lg\"] as const;\nexport const EMPHASES = [\"low\", \"medium\", \"high\"] as const;\nexport const ALIGNS = [\"start\", \"center\", \"end\"] as const;\nexport const DENSITIES = [\"compact\", \"comfortable\"] as const;\n\nexport type Tone = (typeof TONES)[number];\nexport type Size = (typeof SIZES)[number];\nexport type Emphasis = (typeof EMPHASES)[number];\nexport type Align = (typeof ALIGNS)[number];\nexport type Density = (typeof DENSITIES)[number];\n\nexport interface StyleProps {\n tone?: Tone;\n size?: Size;\n emphasis?: Emphasis;\n align?: Align;\n density?: Density;\n}\n\n/**\n * Raw zod shape merged into every component schema in the catalog.\n * `variant` is component-specific and added per component, not here.\n */\nexport const styleSchemaShape = {\n tone: z.enum(TONES).optional(),\n size: z.enum(SIZES).optional(),\n emphasis: z.enum(EMPHASES).optional(),\n align: z.enum(ALIGNS).optional(),\n density: z.enum(DENSITIES).optional(),\n};\n","import type { ZodType } from \"zod\";\n\nexport interface UIComponentDefinition {\n name: string;\n /** zod schema for the component's presentational props. */\n schema: ZodType;\n /** semantic action names this component may emit. */\n allowedActions?: string[];\n}\n\nexport interface CatalogManifest {\n id: string;\n components: Record<string, UIComponentDefinition>;\n}\n\n/** Marker used by the renderer when a component name is not in the catalog. */\nexport const UNKNOWN_COMPONENT = \"__unknown__\";\n\n/** Resolve a component name against the active catalog. Returns null on miss — never throws. */\nexport function resolveComponent(\n manifest: CatalogManifest,\n name: string,\n): UIComponentDefinition | null {\n if (!name || typeof name !== \"string\") return null;\n return manifest.components[name] ?? null;\n}\n","import { z } from \"zod\";\nimport type { CatalogManifest } from \"./registry\";\nimport { styleSchemaShape } from \"./style\";\n\n/** Versioned catalog id — a URI (A2UI convention). The version lives in the path. */\nexport const CORE_CATALOG_ID = \"https://alquimia.ai/catalogs/core/v1/catalog.json\";\n\n/** Merge shared style vocabulary + an optional component-specific variant enum + own props. */\nconst def = (\n name: string,\n own: z.ZodRawShape,\n opts?: { variant?: readonly [string, ...string[]]; allowedActions?: string[] },\n) => ({\n name,\n schema: z\n .object({\n ...styleSchemaShape,\n ...(opts?.variant ? { variant: z.enum(opts.variant).optional() } : {}),\n ...own,\n })\n .passthrough(),\n allowedActions: opts?.allowedActions,\n});\n\nconst option = z.object({ label: z.string(), value: z.union([z.string(), z.number()]) });\n\n/**\n * The default catalog: ~40 components across layout / content / inputs / data / actions.\n * Prop schemas describe ONLY presentational props; id/component/children/binding/action\n * are structural. Every component also accepts the shared style vocabulary.\n */\nexport const coreCatalog: CatalogManifest = {\n id: CORE_CATALOG_ID,\n components: {\n // ---- layout ----\n Stack: def(\"Stack\", {\n direction: z.enum([\"vertical\", \"horizontal\"]).optional(),\n gap: z.enum([\"sm\", \"md\", \"lg\"]).optional(),\n }),\n Grid: def(\"Grid\", {\n columns: z.number().int().min(1).max(6).optional(),\n gap: z.enum([\"sm\", \"md\", \"lg\"]).optional(),\n }),\n Row: def(\"Row\", { gap: z.enum([\"sm\", \"md\", \"lg\"]).optional(), wrap: z.boolean().optional() }),\n Column: def(\"Column\", { gap: z.enum([\"sm\", \"md\", \"lg\"]).optional() }),\n Divider: def(\"Divider\", { label: z.string().optional() }),\n Spacer: def(\"Spacer\", { size: z.enum([\"sm\", \"md\", \"lg\"]).optional() }),\n Card: def(\"Card\", { title: z.string().optional(), description: z.string().optional() }, {\n variant: [\"elevated\", \"outline\", \"ghost\"],\n }),\n Accordion: def(\"Accordion\", {\n items: z.array(z.object({ title: z.string(), value: z.string() })).optional(),\n }),\n Tabs: def(\"Tabs\", { tabs: z.array(z.object({ label: z.string(), value: z.string() })).min(1) }),\n // ---- content ----\n Text: def(\"Text\", { text: z.string() }, { variant: [\"body\", \"muted\", \"caption\", \"lead\"] }),\n Heading: def(\"Heading\", { text: z.string(), level: z.number().int().min(1).max(4).optional() }),\n Markdown: def(\"Markdown\", { text: z.string() }),\n Image: def(\"Image\", { src: z.string(), alt: z.string().optional() }),\n Icon: def(\"Icon\", { name: z.string() }),\n Badge: def(\"Badge\", { text: z.string() }, { variant: [\"solid\", \"outline\", \"subtle\"] }),\n Avatar: def(\"Avatar\", { src: z.string().optional(), fallback: z.string().optional() }),\n Alert: def(\"Alert\", { text: z.string(), title: z.string().optional() }, {\n variant: [\"info\", \"success\", \"warning\", \"danger\"],\n }),\n Stat: def(\"Stat\", { label: z.string(), value: z.union([z.string(), z.number()]), delta: z.string().optional() }),\n KeyValue: def(\"KeyValue\", {}),\n List: def(\"List\", { ordered: z.boolean().optional() }),\n Quote: def(\"Quote\", { text: z.string(), cite: z.string().optional() }),\n // ---- inputs ----\n TextField: def(\"TextField\", { label: z.string().optional(), placeholder: z.string().optional() }),\n TextArea: def(\"TextArea\", {\n label: z.string().optional(),\n placeholder: z.string().optional(),\n rows: z.number().int().optional(),\n }),\n NumberField: def(\"NumberField\", {\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n }),\n Select: def(\"Select\", {\n label: z.string().optional(),\n placeholder: z.string().optional(),\n options: z.array(option).min(1),\n }),\n MultiSelect: def(\"MultiSelect\", { label: z.string().optional(), options: z.array(option).min(1) }),\n Combobox: def(\"Combobox\", {\n label: z.string().optional(),\n placeholder: z.string().optional(),\n options: z.array(option).min(1),\n }),\n Checkbox: def(\"Checkbox\", { label: z.string().optional() }),\n CheckboxGroup: def(\"CheckboxGroup\", { label: z.string().optional(), options: z.array(option).min(1) }),\n Radio: def(\"Radio\", { label: z.string().optional(), options: z.array(option).min(1) }),\n Switch: def(\"Switch\", { label: z.string().optional() }),\n Slider: def(\"Slider\", {\n label: z.string().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n }),\n DatePicker: def(\"DatePicker\", { label: z.string().optional() }),\n DateRange: def(\"DateRange\", { label: z.string().optional() }),\n FileUpload: def(\"FileUpload\", {\n label: z.string().optional(),\n accept: z.string().optional(),\n multiple: z.boolean().optional(),\n }),\n Rating: def(\"Rating\", { label: z.string().optional(), max: z.number().int().optional() }),\n // ---- data ----\n Table: def(\"Table\", {\n columns: z.array(z.object({ key: z.string(), header: z.string().optional() })).min(1),\n sortable: z.boolean().optional(),\n }, { allowedActions: [\"sort\", \"filter\"] }),\n Chart: def(\"Chart\", {\n kind: z.enum([\"bar\", \"line\", \"area\", \"pie\"]),\n x: z.string().optional(),\n series: z.array(z.object({ key: z.string(), label: z.string().optional() })).min(1),\n title: z.string().optional(),\n }),\n Progress: def(\"Progress\", { value: z.number(), max: z.number().optional(), label: z.string().optional() }),\n Timeline: def(\"Timeline\", {\n items: z\n .array(z.object({ title: z.string(), description: z.string().optional(), timestamp: z.string().optional() }))\n .min(1),\n }),\n // ---- actions ----\n Button: def(\"Button\", { text: z.string() }, {\n variant: [\"solid\", \"outline\", \"ghost\", \"link\"],\n allowedActions: [\"submit\", \"cancel\", \"reset\", \"select\", \"confirm\"],\n }),\n ButtonGroup: def(\"ButtonGroup\", {}),\n Link: def(\"Link\", { text: z.string(), href: z.string().optional() }),\n },\n};\n","import type { SurfaceAction } from \"./types\";\n\nexport type UIActionKind = \"agent-bound\" | \"local\";\n\nexport interface UIAction {\n surfaceId: string;\n componentId: string;\n action: string;\n kind: UIActionKind;\n payload?: Record<string, unknown>;\n}\n\n/** Agent-bound actions (wantResponse) return their payload to the agent; others stay local. */\nexport function classifyAction(action: SurfaceAction): UIActionKind {\n return action.wantResponse === true ? \"agent-bound\" : \"local\";\n}\n\nconst URL_LIKE = /^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\n/** Actions are semantic names, never URLs. Reject anything scheme- or protocol-relative. */\nexport function assertSafeActionName(name: string): void {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error(\"action.name must be a non-empty string\");\n }\n if (URL_LIKE.test(name)) {\n throw new Error(`action.name must be a semantic name, not a URL: ${name}`);\n }\n}\n","import { z } from \"zod\";\nimport type { A2uiComponent, A2uiSurface } from \"./types\";\nimport type { CatalogManifest, UIComponentDefinition } from \"./registry\";\nimport { resolveComponent } from \"./registry\";\nimport { assertSafeActionName } from \"./actions\";\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\nexport interface ValidationResult<T = unknown> {\n ok: boolean;\n value?: T;\n /** Fatal problems — the surface cannot be rendered. */\n errors: ValidationError[];\n /** Non-fatal problems — the surface still renders; these degrade gracefully. */\n warnings?: ValidationError[];\n}\n\nconst surfaceShape = z.object({\n surfaceId: z.string().min(1),\n // Tier 2 canonical id (versioned URI); `catalog` is the legacy alias. Both optional on the\n // wire — the SDK stamps `catalogId` if the agent omits it.\n catalogId: z.string().min(1).optional(),\n catalog: z.string().min(1).optional(),\n // Legacy explicit root. A2UI uses the component with id \"root\"; kept optional for back-compat.\n root: z.string().min(1).optional(),\n components: z.array(\n z\n .object({\n id: z.string().min(1),\n component: z.string().min(1),\n children: z.array(z.string()).optional(),\n child: z.string().optional(),\n binding: z.string().optional(),\n action: z.object({ name: z.string(), wantResponse: z.boolean().optional() }).optional(),\n })\n .passthrough(),\n ),\n dataModel: z.record(z.unknown()).optional(),\n});\n\n/** UAX#31 identifier rule (A2UI): XID_Start/underscore then XID_Continue. */\nconst UAX31_ID = /^[\\p{XID_Start}_][\\p{XID_Continue}]*$/u;\n\n/** Validate one node's presentational props against its catalog definition. */\nexport function validateProps(node: A2uiComponent, def: UIComponentDefinition): ValidationResult {\n const { id, component, children, child, binding, action, ...props } = node;\n void child;\n const parsed = def.schema.safeParse(props);\n if (parsed.success) return { ok: true, value: parsed.data, errors: [] };\n return {\n ok: false,\n errors: parsed.error.issues.map((i) => ({ path: `${id}.${i.path.join(\".\")}`, message: i.message })),\n };\n}\n\n/** Full structural + catalog + prop + action validation of an incoming surface. */\nexport function validateSurface(input: unknown, manifest: CatalogManifest): ValidationResult<A2uiSurface> {\n const shape = surfaceShape.safeParse(input);\n if (!shape.success) {\n return { ok: false, errors: shape.error.issues.map((i) => ({ path: i.path.join(\".\"), message: i.message })) };\n }\n const surface = shape.data as A2uiSurface;\n const errors: ValidationError[] = []; // fatal — cannot render\n const warnings: ValidationError[] = []; // non-fatal — render anyway, degrade gracefully\n const ids = new Set(surface.components.map((c) => c.id));\n\n // Root = the component with id \"root\" (A2UI convention), falling back to the legacy `root` field.\n const rootId = ids.has(\"root\") ? \"root\" : surface.root;\n // Fatal: without a resolvable root node there is nothing to render.\n if (!rootId || !ids.has(rootId)) {\n errors.push({ path: \"root\", message: `no root component (expected a component with id \"root\")` });\n }\n\n // Non-fatal: catalogId should be present (the SDK stamps it if the agent omits it).\n if (!surface.catalogId && !surface.catalog) {\n warnings.push({ path: \"catalogId\", message: \"surface has no catalogId (SDK will stamp the active catalog)\" });\n }\n\n for (const node of surface.components) {\n // Non-fatal: A2UI mandates UAX#31 identifiers; a bad id still renders but is flagged.\n if (!UAX31_ID.test(node.id)) {\n warnings.push({ path: node.id, message: `id \"${node.id}\" is not a valid UAX#31 identifier` });\n }\n\n const def = resolveComponent(manifest, node.component);\n if (!def) {\n // Non-fatal: the renderer falls back to a text placeholder for unknown components.\n warnings.push({ path: node.id, message: `unknown component \"${node.component}\" (renders as text)` });\n continue;\n }\n\n // Non-fatal: invalid presentational props degrade to component defaults.\n warnings.push(...validateProps(node, def).errors);\n\n for (const childId of node.children ?? []) {\n if (!ids.has(childId)) {\n warnings.push({ path: node.id, message: `child \"${childId}\" does not exist (skipped)` });\n }\n }\n if (node.child && !ids.has(node.child)) {\n warnings.push({ path: node.id, message: `child \"${node.child}\" does not exist (skipped)` });\n }\n\n // Fatal (security invariant): an action name must be a semantic string, never a URL.\n if (node.action) {\n try {\n assertSafeActionName(node.action.name);\n } catch (e) {\n errors.push({ path: `${node.id}.action`, message: (e as Error).message });\n }\n }\n }\n\n return errors.length === 0\n ? { ok: true, value: surface, errors: [], warnings }\n : { ok: false, errors, warnings };\n}\n","import type { CatalogManifest } from \"./registry\";\nimport { TONES, SIZES, EMPHASES, ALIGNS, DENSITIES } from \"./style\";\n\n/**\n * The runtime expects each `tool_schemas` entry to be a flat JSON Schema of the\n * tool arguments: `title` is the tool name, `properties` are the arguments.\n * (Not the OpenAI `{ type:\"function\", function:{...} }` wrapper, and not a\n * `{ name, description, parameters }` envelope — both leave the runtime with an\n * empty argument schema.)\n */\nexport interface RenderUiToolSchema {\n title: \"render_ui\";\n name: \"render_ui\";\n description: string;\n type: \"object\";\n properties: Record<string, unknown>;\n required: string[];\n additionalProperties: boolean;\n}\n\nconst DESCRIPTION =\n \"Render a UI using A2UI. The arguments are a UI surface, NOT free-form. Shape: \" +\n \"{ surfaceId, root, components, dataModel? }. `components` is a FLAT array; every item is \" +\n \"{ id, component, children?, ...props } where `component` is one of the allowed names (use \" +\n \"`component`, never `type`) and `children` is an array of string ids referencing other items \" +\n \"(never nested objects). Inputs bind to the data model via `binding` (a JSON Pointer like \" +\n '\"/name\"). To collect input, include a Button with action { name, wantResponse: true } — its ' +\n \"result (the data model) is returned to you; a surface with no such button is display-only. \" +\n 'Example: { \"surfaceId\": \"signup\", \"root\": \"root\", \"components\": [ ' +\n '{ \"id\": \"root\", \"component\": \"Stack\", \"children\": [\"name\", \"desc\", \"submit\"] }, ' +\n '{ \"id\": \"name\", \"component\": \"TextField\", \"label\": \"Username\", \"binding\": \"/name\" }, ' +\n '{ \"id\": \"desc\", \"component\": \"TextField\", \"label\": \"Description\", \"binding\": \"/description\" }, ' +\n '{ \"id\": \"submit\", \"component\": \"Button\", \"text\": \"Save\", \"action\": { \"name\": \"save\", \"wantResponse\": true } } ' +\n '], \"dataModel\": { \"name\": \"\", \"description\": \"\" } }. ' +\n \"IMPORTANT: when you call render_ui, the rendered surface IS your reply — do NOT also \" +\n \"reproduce its content as text, markdown, or ASCII. Any accompanying message must be a brief \" +\n \"one-line intro at most, never a duplicate of the UI.\";\n\n/** Build the render_ui tool schema from a catalog, filtered to an allowlist of component names. */\nexport function buildRenderUiSchema(manifest: CatalogManifest, allowlist: string[]): RenderUiToolSchema {\n const allowed = allowlist.filter((name) => name in manifest.components);\n return {\n title: \"render_ui\",\n name: \"render_ui\",\n description: DESCRIPTION,\n type: \"object\",\n properties: {\n surfaceId: { type: \"string\" },\n // A2UI catalog id — a versioned URI. `const` nudges the model to echo it; the SDK\n // also stamps it if omitted, so the client always knows which catalog version to render.\n catalogId: { type: \"string\", const: manifest.id },\n catalog: { type: \"string\" }, // legacy alias (accepted, ignored)\n root: { type: \"string\" }, // legacy explicit root (accepted; A2UI uses the id:\"root\" component)\n components: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n component: { type: \"string\", enum: allowed },\n children: { type: \"array\", items: { type: \"string\" } },\n child: { type: \"string\" },\n binding: { type: \"string\" },\n action: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n wantResponse: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n tone: { type: \"string\", enum: [...TONES] },\n size: { type: \"string\", enum: [...SIZES] },\n emphasis: { type: \"string\", enum: [...EMPHASES] },\n align: { type: \"string\", enum: [...ALIGNS] },\n density: { type: \"string\", enum: [...DENSITIES] },\n variant: { type: \"string\" },\n text: { type: \"string\" },\n label: { type: \"string\" },\n placeholder: { type: \"string\" },\n title: { type: \"string\" },\n direction: { type: \"string\" },\n gap: { type: \"string\" },\n // Data props for data components. Several are legitimately polymorphic across\n // components — type them as their real unions so the runtime doesn't reject\n // valid output (adapters normalize each shape):\n // data: array (Chart/Table rows) | object (KeyValue)\n // rows: array (Table) | number (TextArea row count)\n // columns: array (Table col defs) | number (Grid column count)\n data: { type: [\"array\", \"object\"] },\n rows: { type: [\"array\", \"number\"] },\n items: { type: \"array\" },\n // Accept string OR object items — models routinely emit the terse string\n // form (e.g. series:[\"revenue\"], options:[\"A\",\"B\"]); adapters normalize.\n columns: { type: [\"array\", \"number\"], items: { type: [\"object\", \"string\"] } },\n series: { type: \"array\", items: { type: [\"object\", \"string\"] } },\n options: { type: \"array\", items: { type: [\"object\", \"string\"] } },\n kind: { type: \"string\" },\n x: { type: \"string\" },\n value: {},\n },\n required: [\"id\", \"component\"],\n },\n },\n dataModel: { type: \"object\" },\n },\n required: [\"surfaceId\", \"root\", \"components\"],\n additionalProperties: false,\n };\n}\n","import type { CatalogManifest } from \"./registry\";\nimport { TONES, SIZES } from \"./style\";\n\n/**\n * Build the compact GenUI prompt clause from the catalog, filtered to an allowlist.\n * Teaches the allowed components, the style vocabulary, the wantResponse round-trip\n * rule, and the \"don't reproduce the UI as text\" rule.\n */\nexport function buildGenuiClause(manifest: CatalogManifest, allowlist: string[]): string {\n const names = allowlist.filter((n) => n in manifest.components);\n return [\n \"You can render UI by calling render_ui with an A2UI surface (a flat components array; each item is { id, component, children?, ...props }; component is one of the allowed names; children are string ids referencing other items).\",\n `Components: ${names.join(\", \")}.`,\n `Style each component via the semantic vocabulary (never CSS, colors, or HTML): tone (${TONES.join(\"/\")}), size (${SIZES.join(\"/\")}), emphasis (low/medium/high), align (start/center/end), density (compact/comfortable), plus a component-specific variant where offered.`,\n \"Data components MUST carry their data: Chart takes `data` (an array of row objects) + `series` (keys to plot) + `x` (the category key); Table takes `rows` (array of row objects) + `columns` ([{ key, header }] matching the row keys); List takes `items` (array); Stat takes `label`+`value`; KeyValue takes `data` (an object). Put the data inline on the component (or in dataModel referenced via `binding`).\",\n \"To collect input, add a Button with an action { name, wantResponse: true }; its result (the data model) is returned to you. A surface with no such button is display-only.\",\n \"IMPORTANT: the rendered surface IS your reply — do NOT reproduce its content as text, markdown, or ASCII; a one-line intro at most.\",\n \"Prefer plain text for simple replies.\",\n ].join(\" \");\n}\n","import { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { CatalogManifest } from \"./registry\";\n\n/**\n * `zodToJsonSchema`'s generic return type triggers TS2589 (excessively deep) during .d.ts\n * generation. Call it through a plain, non-generic signature — we only read properties/required.\n */\nconst toJsonSchema = zodToJsonSchema as unknown as (\n schema: unknown,\n opts?: unknown,\n) => { properties?: Record<string, unknown>; required?: string[] };\n\n/**\n * The A2UI-format catalog JSON — the published, versioned contract. Emitted from the\n * authoring catalog (the zod `CatalogManifest`) so the shipped artifact can never drift\n * from what the SDK validates against (guarded by emit.test.ts).\n */\nexport interface A2uiCatalogJson {\n $schema: string;\n catalogId: string;\n title: string;\n description: string;\n components: Record<string, unknown>;\n $defs: Record<string, unknown>;\n}\n\n/** Shared A2UI type defs referenced by (future, DynamicString-bound) components. */\nconst SHARED_DEFS: Record<string, unknown> = {\n DynamicString: {\n description: \"A literal string OR a data-model path reference { path }.\",\n oneOf: [\n { type: \"string\" },\n { type: \"object\", properties: { path: { type: \"string\" } }, required: [\"path\"], additionalProperties: false },\n ],\n },\n Action: {\n description: \"A semantic action (never a URL). wantResponse:true returns the data model to the agent.\",\n type: \"object\",\n properties: { name: { type: \"string\" }, wantResponse: { type: \"boolean\" } },\n required: [\"name\"],\n additionalProperties: false,\n },\n};\n\n/**\n * Compile the authoring catalog to the A2UI v1.0 catalog format:\n * `{ catalogId, components: { Name: {type:object, properties:{ component:{const}, …}, required, unevaluatedProperties:false } }, $defs }`.\n */\nexport function emitA2uiCatalog(manifest: CatalogManifest, opts: { catalogId: string }): A2uiCatalogJson {\n const components: Record<string, unknown> = {};\n\n for (const [name, def] of Object.entries(manifest.components)) {\n const propsSchema = toJsonSchema(def.schema, { $refStrategy: \"none\", target: \"jsonSchema2020\" });\n const properties: Record<string, unknown> = {\n component: { const: name },\n ...(propsSchema.properties ?? {}),\n };\n const required = Array.from(new Set([\"component\", ...(propsSchema.required ?? [])]));\n components[name] = {\n type: \"object\",\n properties,\n required,\n // Presentational props are open at authoring time (zod .passthrough()); the tool\n // schema is where the model-facing prop set is fixed. Keep the catalog permissive.\n unevaluatedProperties: false,\n };\n }\n\n return {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n catalogId: opts.catalogId,\n title: \"Alquimia Core Catalog\",\n description:\n \"Alquimia's default A2UI catalog. Abstract, framework-agnostic component contract; \" +\n \"consumers map each component to their own (shadcn) renderer. Generated from the SDK authoring catalog.\",\n components,\n $defs: SHARED_DEFS,\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":["useCallback","pos","z","z","z","z","def","sessionId","input","messages","useCallback","useState","useReducer","useState","useReducer"]}
|
package/dist/next/index.d.mts
CHANGED
|
@@ -41,6 +41,13 @@ declare function createNextJsRouteHandlers(config: ProxyConfig): {
|
|
|
41
41
|
* params required.
|
|
42
42
|
*/
|
|
43
43
|
handleBlobUpload: (request: Request) => Promise<Response>;
|
|
44
|
+
/**
|
|
45
|
+
* Use as POST handler in app/api/tool-completion/[...path]/route.ts (the
|
|
46
|
+
* runtime's `POST /event/tool-completion`). The pending call is correlated
|
|
47
|
+
* by `control_id` in the body + the `context-metadata` header — no path
|
|
48
|
+
* params required.
|
|
49
|
+
*/
|
|
50
|
+
handleToolCompletion: (request: Request) => Promise<Response>;
|
|
44
51
|
};
|
|
45
52
|
|
|
46
53
|
export { type ChatRequestConfig, type ChatResponse, type ChatRouteContext, type NextJsRouteContext, ProxyConfig, createNextJsRouteHandlers, handleChatRequest, handleStreamRequest };
|
package/dist/next/index.d.ts
CHANGED
|
@@ -41,6 +41,13 @@ declare function createNextJsRouteHandlers(config: ProxyConfig): {
|
|
|
41
41
|
* params required.
|
|
42
42
|
*/
|
|
43
43
|
handleBlobUpload: (request: Request) => Promise<Response>;
|
|
44
|
+
/**
|
|
45
|
+
* Use as POST handler in app/api/tool-completion/[...path]/route.ts (the
|
|
46
|
+
* runtime's `POST /event/tool-completion`). The pending call is correlated
|
|
47
|
+
* by `control_id` in the body + the `context-metadata` header — no path
|
|
48
|
+
* params required.
|
|
49
|
+
*/
|
|
50
|
+
handleToolCompletion: (request: Request) => Promise<Response>;
|
|
44
51
|
};
|
|
45
52
|
|
|
46
53
|
export { type ChatRequestConfig, type ChatResponse, type ChatRouteContext, type NextJsRouteContext, ProxyConfig, createNextJsRouteHandlers, handleChatRequest, handleStreamRequest };
|
package/dist/next/index.js
CHANGED
|
@@ -51,6 +51,7 @@ function createAlquimiaProxyHandler(config) {
|
|
|
51
51
|
const inferRoute = config.inferRoute ?? "event/infer";
|
|
52
52
|
const streamRoute = config.streamRoute ?? "event/stream";
|
|
53
53
|
const blobUploadRoute = config.blobUploadRoute ?? "context/blob/upload";
|
|
54
|
+
const toolCompletionRoute = config.toolCompletionRoute ?? "event/tool-completion";
|
|
54
55
|
const authHeader = { Authorization: `Bearer ${config.apiKey}` };
|
|
55
56
|
return {
|
|
56
57
|
async handleInfer(request, pathSuffix) {
|
|
@@ -169,6 +170,46 @@ function createAlquimiaProxyHandler(config) {
|
|
|
169
170
|
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
170
171
|
);
|
|
171
172
|
}
|
|
173
|
+
},
|
|
174
|
+
async handleToolCompletion(request) {
|
|
175
|
+
try {
|
|
176
|
+
const body = await request.text();
|
|
177
|
+
const headers2 = {
|
|
178
|
+
"Content-Type": "application/json",
|
|
179
|
+
...authHeader
|
|
180
|
+
};
|
|
181
|
+
const CORRELATION_HEADERS = [
|
|
182
|
+
"taskid",
|
|
183
|
+
"parenttaskid",
|
|
184
|
+
"sessionid",
|
|
185
|
+
"userid",
|
|
186
|
+
"assistantid",
|
|
187
|
+
"agentspaceid",
|
|
188
|
+
"channelid",
|
|
189
|
+
"depth"
|
|
190
|
+
];
|
|
191
|
+
for (const name of CORRELATION_HEADERS) {
|
|
192
|
+
const value = request.headers.get(name);
|
|
193
|
+
if (value) headers2[name] = value;
|
|
194
|
+
}
|
|
195
|
+
const trace = request.headers.get("x-trace-parent");
|
|
196
|
+
if (trace) headers2["x-trace-parent"] = trace;
|
|
197
|
+
const response = await fetch(`${baseUrl}/${toolCompletionRoute}`, {
|
|
198
|
+
method: "POST",
|
|
199
|
+
headers: headers2,
|
|
200
|
+
body
|
|
201
|
+
});
|
|
202
|
+
return new Response(await response.text(), {
|
|
203
|
+
status: response.status,
|
|
204
|
+
headers: { "Content-Type": "application/json" }
|
|
205
|
+
});
|
|
206
|
+
} catch (error) {
|
|
207
|
+
console.error("AlquimiaProxy handleToolCompletion exception:", error);
|
|
208
|
+
return new Response(
|
|
209
|
+
JSON.stringify({ error: "Failed to forward tool-completion request" }),
|
|
210
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
211
|
+
);
|
|
212
|
+
}
|
|
172
213
|
}
|
|
173
214
|
};
|
|
174
215
|
}
|
|
@@ -331,6 +372,15 @@ function createNextJsRouteHandlers(config) {
|
|
|
331
372
|
*/
|
|
332
373
|
handleBlobUpload: async (request) => {
|
|
333
374
|
return handler.handleBlobUpload(request);
|
|
375
|
+
},
|
|
376
|
+
/**
|
|
377
|
+
* Use as POST handler in app/api/tool-completion/[...path]/route.ts (the
|
|
378
|
+
* runtime's `POST /event/tool-completion`). The pending call is correlated
|
|
379
|
+
* by `control_id` in the body + the `context-metadata` header — no path
|
|
380
|
+
* params required.
|
|
381
|
+
*/
|
|
382
|
+
handleToolCompletion: async (request) => {
|
|
383
|
+
return handler.handleToolCompletion(request);
|
|
334
384
|
}
|
|
335
385
|
};
|
|
336
386
|
}
|