@devicai/ui 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/cjs/api/client.js +49 -0
  2. package/dist/cjs/api/client.js.map +1 -1
  3. package/dist/cjs/api/types.js.map +1 -1
  4. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js +334 -0
  5. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js.map +1 -0
  6. package/dist/cjs/components/AIElementWrapper/activeWrapperRegistry.js +30 -0
  7. package/dist/cjs/components/AIElementWrapper/activeWrapperRegistry.js.map +1 -0
  8. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js +161 -0
  9. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js.map +1 -0
  10. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +52 -6
  11. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  12. package/dist/cjs/components/ChatDrawer/ChatInput.js +122 -7
  13. package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
  14. package/dist/cjs/components/ChatDrawer/ChatMessages.js +29 -2
  15. package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
  16. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js +1 -1
  17. package/dist/cjs/hooks/useDevicChat.js +3 -1
  18. package/dist/cjs/hooks/useDevicChat.js.map +1 -1
  19. package/dist/cjs/hooks/useSpeechRecording.js +227 -0
  20. package/dist/cjs/hooks/useSpeechRecording.js.map +1 -0
  21. package/dist/cjs/index.js +6 -0
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/provider/DevicProvider.js +53 -14
  24. package/dist/cjs/provider/DevicProvider.js.map +1 -1
  25. package/dist/cjs/styles.css +1 -1
  26. package/dist/esm/api/client.d.ts +14 -1
  27. package/dist/esm/api/client.js +49 -0
  28. package/dist/esm/api/client.js.map +1 -1
  29. package/dist/esm/api/types.d.ts +20 -0
  30. package/dist/esm/api/types.js.map +1 -1
  31. package/dist/esm/components/AIElementWrapper/AIElementWrapper.d.ts +14 -0
  32. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js +332 -0
  33. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js.map +1 -0
  34. package/dist/esm/components/AIElementWrapper/AIElementWrapper.types.d.ts +185 -0
  35. package/dist/esm/components/AIElementWrapper/activeWrapperRegistry.d.ts +10 -0
  36. package/dist/esm/components/AIElementWrapper/activeWrapperRegistry.js +26 -0
  37. package/dist/esm/components/AIElementWrapper/activeWrapperRegistry.js.map +1 -0
  38. package/dist/esm/components/AIElementWrapper/index.d.ts +3 -0
  39. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.d.ts +26 -0
  40. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js +159 -0
  41. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js.map +1 -0
  42. package/dist/esm/components/ChatDrawer/ChatDrawer.js +52 -6
  43. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  44. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +55 -4
  45. package/dist/esm/components/ChatDrawer/ChatInput.d.ts +1 -1
  46. package/dist/esm/components/ChatDrawer/ChatInput.js +123 -8
  47. package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
  48. package/dist/esm/components/ChatDrawer/ChatMessages.js +29 -2
  49. package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
  50. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js +1 -1
  51. package/dist/esm/hooks/index.d.ts +2 -0
  52. package/dist/esm/hooks/useDevicChat.d.ts +2 -0
  53. package/dist/esm/hooks/useDevicChat.js +3 -1
  54. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  55. package/dist/esm/hooks/useSpeechRecording.d.ts +44 -0
  56. package/dist/esm/hooks/useSpeechRecording.js +225 -0
  57. package/dist/esm/hooks/useSpeechRecording.js.map +1 -0
  58. package/dist/esm/index.d.ts +6 -4
  59. package/dist/esm/index.js +3 -0
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/provider/DevicProvider.js +54 -15
  62. package/dist/esm/provider/DevicProvider.js.map +1 -1
  63. package/dist/esm/provider/index.d.ts +1 -1
  64. package/dist/esm/provider/types.d.ts +50 -0
  65. package/dist/esm/styles.css +1 -1
  66. package/package.json +1 -1
@@ -232,6 +232,55 @@ class DevicApiClient {
232
232
  }
233
233
  return data;
234
234
  }
235
+ /**
236
+ * Transcribe audio to text using the /whisper endpoint.
237
+ * Accepts either an audio binary (Blob/File, sent as multipart/form-data) or
238
+ * a download URL string (sent as `audioUrl`). The backend stores the binary
239
+ * and runs speech-to-text with Devic's own OpenAI key. Returns the text and a
240
+ * `transcriptId` to attach to the resulting message.
241
+ */
242
+ async transcribeAudio(audio, options) {
243
+ const url = `${this.config.baseUrl}/api/v1/whisper`;
244
+ const formData = new FormData();
245
+ if (typeof audio === "string") {
246
+ formData.append("audioUrl", audio);
247
+ }
248
+ else {
249
+ formData.append("audio", audio, options?.fileName || "recording.webm");
250
+ }
251
+ if (options?.language)
252
+ formData.append("language", options.language);
253
+ if (options?.messageUid)
254
+ formData.append("messageUid", options.messageUid);
255
+ if (options?.chatUid)
256
+ formData.append("chatUid", options.chatUid);
257
+ const response = await fetch(url, {
258
+ method: "POST",
259
+ headers: {
260
+ Authorization: `Bearer ${this.config.apiKey}`,
261
+ "devic-api-source": "ui",
262
+ },
263
+ body: formData,
264
+ });
265
+ if (!response.ok) {
266
+ let errorData;
267
+ try {
268
+ errorData = await response.json();
269
+ }
270
+ catch {
271
+ errorData = {
272
+ statusCode: response.status,
273
+ message: response.statusText,
274
+ };
275
+ }
276
+ throw new DevicApiError(errorData);
277
+ }
278
+ const data = await response.json();
279
+ if (data && typeof data === "object" && "data" in data) {
280
+ return data.data;
281
+ }
282
+ return data;
283
+ }
235
284
  /**
236
285
  * Get chat history content (full conversation after handoff)
237
286
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../../../../src/api/client.ts"],"sourcesContent":["import type {\n ProcessMessageDto,\n ChatMessage,\n AsyncResponse,\n RealtimeChatHistory,\n ChatHistory,\n AssistantSpecialization,\n ApiError,\n ToolCallResponse,\n ConversationSummary,\n ListConversationsResponse,\n FeedbackSubmission,\n FeedbackEntry,\n AgentThreadDto,\n AgentDto,\n} from \"./types\";\n\nexport interface DevicApiClientConfig {\n apiKey: string;\n baseUrl: string;\n}\n\n/**\n * Devic API client using native fetch\n */\nexport class DevicApiClient {\n private config: DevicApiClientConfig;\n\n constructor(config: DevicApiClientConfig) {\n this.config = config;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<DevicApiClientConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n \"devic-api-source\": \"ui\",\n ...options.headers,\n };\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorData: ApiError;\n try {\n errorData = await response.json();\n } catch {\n errorData = {\n statusCode: response.status,\n message: response.statusText,\n };\n }\n throw new DevicApiError(errorData);\n }\n\n // Handle responses that may have a wrapper structure\n const data = await response.json();\n\n // If the response has a data property, extract it (common wrapper pattern)\n if (data && typeof data === \"object\" && \"data\" in data) {\n return data.data as T;\n }\n\n return data as T;\n }\n\n /**\n * Get all assistant specializations\n */\n async getAssistants(external = false): Promise<AssistantSpecialization[]> {\n const query = external ? \"?external=true\" : \"\";\n return this.request<AssistantSpecialization[]>(\n `/api/v1/assistants${query}`,\n );\n }\n\n /**\n * Get a specific assistant specialization\n */\n async getAssistant(identifier: string): Promise<AssistantSpecialization> {\n return this.request<AssistantSpecialization>(\n `/api/v1/assistants/${identifier}`,\n );\n }\n\n /**\n * Send a message to an assistant (sync mode)\n */\n async sendMessage(\n assistantId: string,\n dto: ProcessMessageDto,\n signal?: AbortSignal,\n ): Promise<ChatMessage[]> {\n return this.request<ChatMessage[]>(\n `/api/v1/assistants/${assistantId}/messages${dto.skipSummarization ? \"?skipSummarization=true\" : \"\"}`,\n {\n method: \"POST\",\n body: JSON.stringify(dto),\n signal,\n },\n );\n }\n\n /**\n * Send a message to an assistant (async mode)\n */\n async sendMessageAsync(\n assistantId: string,\n dto: ProcessMessageDto,\n ): Promise<AsyncResponse> {\n return this.request<AsyncResponse>(\n `/api/v1/assistants/${assistantId}/messages?async=true${dto.skipSummarization ? \"&skipSummarization=true\" : \"\"}`,\n {\n method: \"POST\",\n body: JSON.stringify(dto),\n },\n );\n }\n\n /**\n * Get real-time chat history (for polling in async mode)\n */\n async getRealtimeHistory(\n assistantId: string,\n chatUid: string,\n ): Promise<RealtimeChatHistory> {\n return this.request<RealtimeChatHistory>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/realtime`,\n );\n }\n\n /**\n * Get chat history for a specific conversation\n */\n async getChatHistory(\n assistantId: string,\n chatUid: string,\n options?: { tenantId?: string },\n ): Promise<ChatHistory> {\n const params = new URLSearchParams();\n if (options?.tenantId) {\n params.set(\"tenantId\", options.tenantId);\n }\n const query = params.toString();\n return this.request<ChatHistory>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}${query ? `?${query}` : \"\"}`,\n );\n }\n\n /**\n * List conversations for an assistant\n */\n async listConversations(\n assistantId: string,\n options?: { tenantId?: string; offset?: number; limit?: number },\n ): Promise<ListConversationsResponse> {\n const params = new URLSearchParams();\n if (options?.tenantId) {\n params.set(\"tenantId\", options.tenantId);\n }\n if (options?.offset != null) {\n params.set(\"offset\", String(options.offset));\n }\n if (options?.limit != null) {\n params.set(\"limit\", String(options.limit));\n }\n params.set(\"omitContent\", \"true\");\n const query = params.toString();\n return this.request<ListConversationsResponse>(\n `/api/v1/assistants/${assistantId}/chats${query ? `?${query}` : \"\"}`,\n );\n }\n\n /**\n * Send tool call responses back to the assistant\n */\n async sendToolResponses(\n assistantId: string,\n chatUid: string,\n responses: ToolCallResponse[],\n ): Promise<AsyncResponse> {\n return this.request<AsyncResponse>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/tool-response`,\n {\n method: \"POST\",\n body: JSON.stringify({ responses }),\n },\n );\n }\n\n /**\n * Submit feedback for a chat message\n */\n async submitChatFeedback(\n assistantId: string,\n chatUid: string,\n data: FeedbackSubmission,\n ): Promise<FeedbackEntry> {\n return this.request<FeedbackEntry>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/feedback`,\n {\n method: \"POST\",\n body: JSON.stringify(data),\n },\n );\n }\n\n /**\n * Get all feedback for a chat\n */\n async getChatFeedback(\n assistantId: string,\n chatUid: string,\n ): Promise<FeedbackEntry[]> {\n return this.request<FeedbackEntry[]>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/feedback`,\n );\n }\n\n /**\n * Get an agent thread by ID\n */\n async getThreadById(\n threadId: string,\n withTasks = false,\n ): Promise<AgentThreadDto> {\n const query = withTasks ? \"?withTasks=true\" : \"\";\n return this.request<AgentThreadDto>(\n `/api/v1/agents/threads/${threadId}${query}`,\n );\n }\n\n /**\n * Get agent details\n */\n async getAgentDetails(agentId: string): Promise<AgentDto> {\n return this.request<AgentDto>(`/api/v1/agents/${agentId}`);\n }\n\n /**\n * Get an AI-generated explanation of a thread's execution\n */\n async explainAgentThread(threadId: string): Promise<string> {\n return this.request<string>(\n `/api/v1/agents/threads/${threadId}/explain`,\n );\n }\n\n /**\n * Pause or resume a thread\n */\n async pauseResumeThread(\n threadId: string,\n action: \"paused\" | \"queued\",\n ): Promise<void> {\n return this.request<void>(\n `/api/v1/agents/threads/${threadId}/pause-resume`,\n {\n method: \"POST\",\n body: JSON.stringify({ action }),\n },\n );\n }\n\n /**\n * Handle thread approval (approve/reject)\n */\n async handleThreadApproval(\n threadId: string,\n approved: boolean,\n retry: boolean,\n message: string,\n ): Promise<void> {\n return this.request<void>(\n `/api/v1/agents/threads/${threadId}/approval`,\n {\n method: \"POST\",\n body: JSON.stringify({\n action: approved ? \"approved\" : \"rejected\",\n message,\n retry,\n }),\n },\n );\n }\n\n /**\n * Manually complete a thread\n */\n async completeThread(\n threadId: string,\n completionState: string,\n ): Promise<void> {\n return this.request<void>(\n `/api/v1/agents/threads/${threadId}/complete`,\n {\n method: \"POST\",\n body: JSON.stringify({ state: completionState }),\n },\n );\n }\n\n /**\n * Stop an in-progress async chat.\n * The current LLM call or tool execution will finish, then the chat\n * will be marked as completed with the history accumulated so far.\n */\n async stopChat(\n assistantId: string,\n chatUid: string,\n ): Promise<{ chatUid: string; message: string }> {\n return this.request<{ chatUid: string; message: string }>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/stop`,\n { method: \"POST\" },\n );\n }\n\n /**\n * Upload a file and get a download URL\n */\n async uploadFile(\n file: File,\n ): Promise<{ name: string; downloadUrl: string; fileType: string }> {\n const url = `${this.config.baseUrl}/api/v1/files/upload`;\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n \"devic-api-source\": \"ui\",\n },\n body: formData,\n });\n\n if (!response.ok) {\n let errorData: { statusCode: number; message: string };\n try {\n errorData = await response.json();\n } catch {\n errorData = {\n statusCode: response.status,\n message: response.statusText,\n };\n }\n throw new DevicApiError(errorData);\n }\n\n const data = await response.json();\n if (data && typeof data === \"object\" && \"data\" in data) {\n return data.data;\n }\n return data;\n }\n\n /**\n * Get chat history content (full conversation after handoff)\n */\n async getChatHistoryContent(\n assistantId: string,\n chatUid: string,\n ): Promise<ChatMessage[]> {\n return this.request<ChatMessage[]>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/content`,\n );\n }\n}\n\n/**\n * Custom error class for API errors\n */\nexport class DevicApiError extends Error {\n public statusCode: number;\n public errorType?: string;\n\n constructor(error: ApiError) {\n super(error.message);\n this.name = \"DevicApiError\";\n this.statusCode = error.statusCode;\n this.errorType = error.error;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sources":["../../../../src/api/client.ts"],"sourcesContent":["import type {\n ProcessMessageDto,\n ChatMessage,\n AsyncResponse,\n RealtimeChatHistory,\n ChatHistory,\n AssistantSpecialization,\n ApiError,\n ToolCallResponse,\n ConversationSummary,\n ListConversationsResponse,\n FeedbackSubmission,\n FeedbackEntry,\n AgentThreadDto,\n AgentDto,\n WhisperTranscriptionResponse,\n} from \"./types\";\n\nexport interface DevicApiClientConfig {\n apiKey: string;\n baseUrl: string;\n}\n\n/**\n * Devic API client using native fetch\n */\nexport class DevicApiClient {\n private config: DevicApiClientConfig;\n\n constructor(config: DevicApiClientConfig) {\n this.config = config;\n }\n\n /**\n * Update client configuration\n */\n setConfig(config: Partial<DevicApiClientConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n \"devic-api-source\": \"ui\",\n ...options.headers,\n };\n\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorData: ApiError;\n try {\n errorData = await response.json();\n } catch {\n errorData = {\n statusCode: response.status,\n message: response.statusText,\n };\n }\n throw new DevicApiError(errorData);\n }\n\n // Handle responses that may have a wrapper structure\n const data = await response.json();\n\n // If the response has a data property, extract it (common wrapper pattern)\n if (data && typeof data === \"object\" && \"data\" in data) {\n return data.data as T;\n }\n\n return data as T;\n }\n\n /**\n * Get all assistant specializations\n */\n async getAssistants(external = false): Promise<AssistantSpecialization[]> {\n const query = external ? \"?external=true\" : \"\";\n return this.request<AssistantSpecialization[]>(\n `/api/v1/assistants${query}`,\n );\n }\n\n /**\n * Get a specific assistant specialization\n */\n async getAssistant(identifier: string): Promise<AssistantSpecialization> {\n return this.request<AssistantSpecialization>(\n `/api/v1/assistants/${identifier}`,\n );\n }\n\n /**\n * Send a message to an assistant (sync mode)\n */\n async sendMessage(\n assistantId: string,\n dto: ProcessMessageDto,\n signal?: AbortSignal,\n ): Promise<ChatMessage[]> {\n return this.request<ChatMessage[]>(\n `/api/v1/assistants/${assistantId}/messages${dto.skipSummarization ? \"?skipSummarization=true\" : \"\"}`,\n {\n method: \"POST\",\n body: JSON.stringify(dto),\n signal,\n },\n );\n }\n\n /**\n * Send a message to an assistant (async mode)\n */\n async sendMessageAsync(\n assistantId: string,\n dto: ProcessMessageDto,\n ): Promise<AsyncResponse> {\n return this.request<AsyncResponse>(\n `/api/v1/assistants/${assistantId}/messages?async=true${dto.skipSummarization ? \"&skipSummarization=true\" : \"\"}`,\n {\n method: \"POST\",\n body: JSON.stringify(dto),\n },\n );\n }\n\n /**\n * Get real-time chat history (for polling in async mode)\n */\n async getRealtimeHistory(\n assistantId: string,\n chatUid: string,\n ): Promise<RealtimeChatHistory> {\n return this.request<RealtimeChatHistory>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/realtime`,\n );\n }\n\n /**\n * Get chat history for a specific conversation\n */\n async getChatHistory(\n assistantId: string,\n chatUid: string,\n options?: { tenantId?: string },\n ): Promise<ChatHistory> {\n const params = new URLSearchParams();\n if (options?.tenantId) {\n params.set(\"tenantId\", options.tenantId);\n }\n const query = params.toString();\n return this.request<ChatHistory>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}${query ? `?${query}` : \"\"}`,\n );\n }\n\n /**\n * List conversations for an assistant\n */\n async listConversations(\n assistantId: string,\n options?: { tenantId?: string; offset?: number; limit?: number },\n ): Promise<ListConversationsResponse> {\n const params = new URLSearchParams();\n if (options?.tenantId) {\n params.set(\"tenantId\", options.tenantId);\n }\n if (options?.offset != null) {\n params.set(\"offset\", String(options.offset));\n }\n if (options?.limit != null) {\n params.set(\"limit\", String(options.limit));\n }\n params.set(\"omitContent\", \"true\");\n const query = params.toString();\n return this.request<ListConversationsResponse>(\n `/api/v1/assistants/${assistantId}/chats${query ? `?${query}` : \"\"}`,\n );\n }\n\n /**\n * Send tool call responses back to the assistant\n */\n async sendToolResponses(\n assistantId: string,\n chatUid: string,\n responses: ToolCallResponse[],\n ): Promise<AsyncResponse> {\n return this.request<AsyncResponse>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/tool-response`,\n {\n method: \"POST\",\n body: JSON.stringify({ responses }),\n },\n );\n }\n\n /**\n * Submit feedback for a chat message\n */\n async submitChatFeedback(\n assistantId: string,\n chatUid: string,\n data: FeedbackSubmission,\n ): Promise<FeedbackEntry> {\n return this.request<FeedbackEntry>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/feedback`,\n {\n method: \"POST\",\n body: JSON.stringify(data),\n },\n );\n }\n\n /**\n * Get all feedback for a chat\n */\n async getChatFeedback(\n assistantId: string,\n chatUid: string,\n ): Promise<FeedbackEntry[]> {\n return this.request<FeedbackEntry[]>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/feedback`,\n );\n }\n\n /**\n * Get an agent thread by ID\n */\n async getThreadById(\n threadId: string,\n withTasks = false,\n ): Promise<AgentThreadDto> {\n const query = withTasks ? \"?withTasks=true\" : \"\";\n return this.request<AgentThreadDto>(\n `/api/v1/agents/threads/${threadId}${query}`,\n );\n }\n\n /**\n * Get agent details\n */\n async getAgentDetails(agentId: string): Promise<AgentDto> {\n return this.request<AgentDto>(`/api/v1/agents/${agentId}`);\n }\n\n /**\n * Get an AI-generated explanation of a thread's execution\n */\n async explainAgentThread(threadId: string): Promise<string> {\n return this.request<string>(\n `/api/v1/agents/threads/${threadId}/explain`,\n );\n }\n\n /**\n * Pause or resume a thread\n */\n async pauseResumeThread(\n threadId: string,\n action: \"paused\" | \"queued\",\n ): Promise<void> {\n return this.request<void>(\n `/api/v1/agents/threads/${threadId}/pause-resume`,\n {\n method: \"POST\",\n body: JSON.stringify({ action }),\n },\n );\n }\n\n /**\n * Handle thread approval (approve/reject)\n */\n async handleThreadApproval(\n threadId: string,\n approved: boolean,\n retry: boolean,\n message: string,\n ): Promise<void> {\n return this.request<void>(\n `/api/v1/agents/threads/${threadId}/approval`,\n {\n method: \"POST\",\n body: JSON.stringify({\n action: approved ? \"approved\" : \"rejected\",\n message,\n retry,\n }),\n },\n );\n }\n\n /**\n * Manually complete a thread\n */\n async completeThread(\n threadId: string,\n completionState: string,\n ): Promise<void> {\n return this.request<void>(\n `/api/v1/agents/threads/${threadId}/complete`,\n {\n method: \"POST\",\n body: JSON.stringify({ state: completionState }),\n },\n );\n }\n\n /**\n * Stop an in-progress async chat.\n * The current LLM call or tool execution will finish, then the chat\n * will be marked as completed with the history accumulated so far.\n */\n async stopChat(\n assistantId: string,\n chatUid: string,\n ): Promise<{ chatUid: string; message: string }> {\n return this.request<{ chatUid: string; message: string }>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/stop`,\n { method: \"POST\" },\n );\n }\n\n /**\n * Upload a file and get a download URL\n */\n async uploadFile(\n file: File,\n ): Promise<{ name: string; downloadUrl: string; fileType: string }> {\n const url = `${this.config.baseUrl}/api/v1/files/upload`;\n\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n \"devic-api-source\": \"ui\",\n },\n body: formData,\n });\n\n if (!response.ok) {\n let errorData: { statusCode: number; message: string };\n try {\n errorData = await response.json();\n } catch {\n errorData = {\n statusCode: response.status,\n message: response.statusText,\n };\n }\n throw new DevicApiError(errorData);\n }\n\n const data = await response.json();\n if (data && typeof data === \"object\" && \"data\" in data) {\n return data.data;\n }\n return data;\n }\n\n /**\n * Transcribe audio to text using the /whisper endpoint.\n * Accepts either an audio binary (Blob/File, sent as multipart/form-data) or\n * a download URL string (sent as `audioUrl`). The backend stores the binary\n * and runs speech-to-text with Devic's own OpenAI key. Returns the text and a\n * `transcriptId` to attach to the resulting message.\n */\n async transcribeAudio(\n audio: Blob | string,\n options?: { language?: string; messageUid?: string; chatUid?: string; fileName?: string },\n ): Promise<WhisperTranscriptionResponse> {\n const url = `${this.config.baseUrl}/api/v1/whisper`;\n\n const formData = new FormData();\n if (typeof audio === \"string\") {\n formData.append(\"audioUrl\", audio);\n } else {\n formData.append(\"audio\", audio, options?.fileName || \"recording.webm\");\n }\n if (options?.language) formData.append(\"language\", options.language);\n if (options?.messageUid) formData.append(\"messageUid\", options.messageUid);\n if (options?.chatUid) formData.append(\"chatUid\", options.chatUid);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n \"devic-api-source\": \"ui\",\n },\n body: formData,\n });\n\n if (!response.ok) {\n let errorData: { statusCode: number; message: string };\n try {\n errorData = await response.json();\n } catch {\n errorData = {\n statusCode: response.status,\n message: response.statusText,\n };\n }\n throw new DevicApiError(errorData);\n }\n\n const data = await response.json();\n if (data && typeof data === \"object\" && \"data\" in data) {\n return data.data;\n }\n return data;\n }\n\n /**\n * Get chat history content (full conversation after handoff)\n */\n async getChatHistoryContent(\n assistantId: string,\n chatUid: string,\n ): Promise<ChatMessage[]> {\n return this.request<ChatMessage[]>(\n `/api/v1/assistants/${assistantId}/chats/${chatUid}/content`,\n );\n }\n}\n\n/**\n * Custom error class for API errors\n */\nexport class DevicApiError extends Error {\n public statusCode: number;\n public errorType?: string;\n\n constructor(error: ApiError) {\n super(error.message);\n this.name = \"DevicApiError\";\n this.statusCode = error.statusCode;\n this.errorType = error.error;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../src/api/types.ts"],"sourcesContent":["import type React from 'react';\n\n/**\n * File attachment for messages\n */\nexport interface ChatFile {\n name: string;\n downloadUrl?: string;\n fileType?: 'image' | 'document' | 'audio' | 'video' | 'other';\n}\n\n/**\n * Message content structure\n */\nexport interface MessageContent {\n message?: string;\n data?: any;\n files?: Array<{\n name: string;\n url: string;\n type: string;\n }>;\n}\n\n/**\n * Tool call from the model\n */\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Chat message structure\n */\nexport interface ChatMessage {\n uid: string;\n role: 'user' | 'assistant' | 'developer' | 'system' | 'tool';\n content: MessageContent;\n timestamp: number;\n chatUid?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n summary?: string;\n}\n\n/**\n * Previous conversation message for initialization\n */\nexport interface PreviousMessage {\n message: string;\n role: 'user' | 'assistant';\n}\n\n/**\n * Model interface tool schema following OpenAI function calling format\n */\nexport interface ModelInterfaceToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\n/**\n * Props passed to a response widget component.\n * The widget is responsible for collecting the user's response and\n * calling `submit` with the payload to resolve the tool call.\n */\nexport interface ResponseWidgetProps {\n /** The tool call this widget is responding to */\n toolCall: ToolCall;\n /** Parsed arguments from the tool call */\n params: any;\n /** Submit the tool response payload (sent as the tool call result to the model) */\n submit: (response: any) => void;\n /** Cancel the tool call. Sends an error response so the model can continue. */\n cancel?: (reason?: string) => void;\n /** Whether the widget is currently submitting */\n isSubmitting?: boolean;\n}\n\n/**\n * Interactive response widget configuration for a client-side tool.\n *\n * When the model calls a tool configured with a `responseWidget`, the\n * widget is rendered in the chat UI instead of executing a callback.\n * The user interacts with the widget, which calls `submit(response)` to\n * define the tool response sent back to the model.\n *\n * - `render: 'inline'` renders the widget in the message thread at the\n * position of the tool call. The text input remains enabled.\n * - `render: 'input'` replaces the chat input area with the widget\n * while it is pending. The text input is disabled until submission.\n */\nexport interface ResponseWidgetConfig {\n /** Where to render the widget */\n render: 'inline' | 'input';\n /** The widget component */\n component: React.ComponentType<ResponseWidgetProps>;\n}\n\n/**\n * Model interface tool definition for client-side tools.\n *\n * A tool must provide either a `callback` (executed automatically when\n * the model invokes the tool) or a `responseWidget` (renders UI for\n * the user to produce the tool response). Providing both is an error.\n */\nexport interface ModelInterfaceTool {\n toolName: string;\n schema: ModelInterfaceToolSchema;\n /** Executed automatically when the model calls this tool */\n callback?: (params: any) => Promise<any> | any;\n /** Interactive widget that collects the user's tool response */\n responseWidget?: ResponseWidgetConfig;\n}\n\n/**\n * Tool call response to send back to the API\n */\nexport interface ToolCallResponse {\n tool_call_id: string;\n content: any;\n role: 'tool';\n}\n\n/**\n * DTO for sending messages to the assistant\n */\nexport interface ProcessMessageDto {\n message: string;\n chatUid?: string;\n userName?: string;\n files?: ChatFile[];\n metadata?: {\n promptTemplateParams?: Record<string, any>;\n tenantToken?: string;\n [key: string]: any;\n };\n tenantId?: string;\n previousConversation?: PreviousMessage[];\n enabledTools?: string[];\n provider?: string;\n model?: string;\n // Model interface protocol fields\n tools?: ModelInterfaceToolSchema[];\n applicationState?: Record<string, any>;\n skipSummarization?: boolean;\n}\n\n/**\n * Response from the assistant\n */\nexport interface AssistantResponse {\n messages: ChatMessage[];\n chatUid: string;\n inputTokens?: number;\n outputTokens?: number;\n}\n\n/**\n * Async mode response\n */\nexport interface AsyncResponse {\n chatUid: string;\n message?: string;\n error?: string;\n}\n\n/**\n * Real-time chat history status\n */\nexport type RealtimeStatus = 'processing' | 'completed' | 'error' | 'waiting_for_tool_response' | 'handed_off';\n\n/**\n * Real-time chat history response\n */\nexport interface RealtimeChatHistory {\n chatUID: string;\n clientUID: string;\n chatHistory: ChatMessage[];\n status: RealtimeStatus;\n lastUpdatedAt: number;\n pendingToolCalls?: ToolCall[];\n handedOffSubThreadId?: string;\n}\n\n/**\n * Chat history structure\n */\nexport interface ChatHistory {\n chatUID: string;\n clientUID: string;\n userUID: string;\n chatContent: ChatMessage[];\n name?: string;\n assistantSpecializationIdentifier: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n llm?: string;\n inputTokens?: number;\n outputTokens?: number;\n metadata?: Record<string, any>;\n tenantId?: string;\n handedOff?: boolean;\n handedOffSubThreadId?: string;\n handedOffToolCallId?: string;\n}\n\n/**\n * Assistant specialization info\n */\nexport interface AssistantSpecialization {\n identifier: string;\n name: string;\n description: string;\n state: 'active' | 'inactive' | 'coming_soon';\n imgUrl?: string;\n availableToolsGroups?: Array<{\n name: string;\n description?: string;\n uid?: string;\n iconUrl?: string;\n tools?: Array<{\n name: string;\n description: string;\n }>;\n }>;\n model?: string;\n isCustom?: boolean;\n creationTimestampMs?: number;\n}\n\n/**\n * Summary of a conversation for listing\n */\nexport interface ConversationSummary {\n chatUID: string;\n name?: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n}\n\nexport interface ListConversationsResponse {\n histories: ConversationSummary[];\n total: number;\n offset: number;\n limit: number;\n}\n\n/**\n * API error response\n */\nexport interface ApiError {\n statusCode: number;\n message: string;\n error?: string;\n}\n\n/**\n * Feedback submission request\n */\nexport interface FeedbackSubmission {\n messageId: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n}\n\n/**\n * Feedback entry response\n */\nexport interface FeedbackEntry {\n _id: string;\n requestId: string;\n chatUID?: string;\n threadId?: string;\n agentId?: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n creationTimestamp: string;\n lastEditTimestamp?: string;\n}\n\n/**\n * Agent thread states\n */\nexport enum AgentThreadState {\n QUEUED = 'queued',\n PROCESSING = 'processing',\n COMPLETED = 'completed',\n FAILED = 'failed',\n TERMINATED = 'terminated',\n PAUSED = 'paused',\n PAUSED_FOR_APPROVAL = 'paused_for_approval',\n APPROVAL_REJECTED = 'approval_rejected',\n WAITING_FOR_RESPONSE = 'waiting_for_response',\n PAUSED_FOR_RESUME = 'paused_for_resume',\n HANDED_OFF = 'handed_off',\n GUARDRAIL_TRIGGER = 'guardrail_trigger',\n}\n\n/**\n * Task within an agent thread\n */\nexport interface AgentTaskDto {\n _id?: string;\n title?: string;\n description?: string;\n completed: boolean;\n}\n\n/**\n * Agent thread DTO\n */\nexport interface AgentThreadDto {\n _id?: string;\n agentId: string;\n state: AgentThreadState;\n threadContent: ChatMessage[];\n tasks?: AgentTaskDto[];\n finishReason?: string;\n pausedReason?: string;\n name?: string;\n creationTimestampMs?: number;\n lastEditTimestampMs?: number;\n pauseUntil?: number;\n isSubthread?: boolean;\n parentThreadId?: string;\n subThreadToolCallId?: string;\n parentAgentId?: string;\n}\n\n/**\n * Agent details\n */\nexport interface AgentDto {\n _id?: string;\n name: string;\n description?: string;\n imgUrl?: string;\n agentId?: string;\n}\n\n/**\n * Hand-off tool response content\n */\nexport interface HandOffToolResponse {\n response: string;\n subthreadId: string;\n}\n\n/**\n * Represents a single tool call within a tool group\n */\nexport interface ToolGroupCall {\n name: string;\n input: any;\n output: any;\n toolCallId: string;\n}\n\n/**\n * Configuration for grouping consecutive tool calls under a single renderer\n */\nexport interface ToolGroupConfig {\n tools: string[];\n renderer: (calls: ToolGroupCall[]) => React.ReactNode;\n}\n"],"names":["AgentThreadState"],"mappings":";;AAwSA;;AAEG;AACSA;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C;AAC3C,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,gBAAA,CAAA,sBAAA,CAAA,GAAA,sBAA6C;AAC7C,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACzC,CAAC,EAbWA,wBAAgB,KAAhBA,wBAAgB,GAAA,EAAA,CAAA,CAAA;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../../src/api/types.ts"],"sourcesContent":["import type React from 'react';\n\n/**\n * File attachment for messages\n */\nexport interface ChatFile {\n name: string;\n downloadUrl?: string;\n fileType?: 'image' | 'document' | 'audio' | 'video' | 'other';\n}\n\n/**\n * Message content structure\n */\nexport interface MessageContent {\n message?: string;\n data?: any;\n files?: Array<{\n name: string;\n url: string;\n type: string;\n }>;\n}\n\n/**\n * Tool call from the model\n */\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Chat message structure\n */\nexport interface ChatMessage {\n uid: string;\n role: 'user' | 'assistant' | 'developer' | 'system' | 'tool';\n content: MessageContent;\n timestamp: number;\n chatUid?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n summary?: string;\n}\n\n/**\n * Previous conversation message for initialization\n */\nexport interface PreviousMessage {\n message: string;\n role: 'user' | 'assistant';\n}\n\n/**\n * Model interface tool schema following OpenAI function calling format\n */\nexport interface ModelInterfaceToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, any>;\n required?: string[];\n };\n };\n}\n\n/**\n * Props passed to a response widget component.\n * The widget is responsible for collecting the user's response and\n * calling `submit` with the payload to resolve the tool call.\n */\nexport interface ResponseWidgetProps {\n /** The tool call this widget is responding to */\n toolCall: ToolCall;\n /** Parsed arguments from the tool call */\n params: any;\n /** Submit the tool response payload (sent as the tool call result to the model) */\n submit: (response: any) => void;\n /** Cancel the tool call. Sends an error response so the model can continue. */\n cancel?: (reason?: string) => void;\n /** Whether the widget is currently submitting */\n isSubmitting?: boolean;\n}\n\n/**\n * Interactive response widget configuration for a client-side tool.\n *\n * When the model calls a tool configured with a `responseWidget`, the\n * widget is rendered in the chat UI instead of executing a callback.\n * The user interacts with the widget, which calls `submit(response)` to\n * define the tool response sent back to the model.\n *\n * - `render: 'inline'` renders the widget in the message thread at the\n * position of the tool call. The text input remains enabled.\n * - `render: 'input'` replaces the chat input area with the widget\n * while it is pending. The text input is disabled until submission.\n */\nexport interface ResponseWidgetConfig {\n /** Where to render the widget */\n render: 'inline' | 'input';\n /** The widget component */\n component: React.ComponentType<ResponseWidgetProps>;\n}\n\n/**\n * Model interface tool definition for client-side tools.\n *\n * A tool must provide either a `callback` (executed automatically when\n * the model invokes the tool) or a `responseWidget` (renders UI for\n * the user to produce the tool response). Providing both is an error.\n */\nexport interface ModelInterfaceTool {\n toolName: string;\n schema: ModelInterfaceToolSchema;\n /** Executed automatically when the model calls this tool */\n callback?: (params: any) => Promise<any> | any;\n /** Interactive widget that collects the user's tool response */\n responseWidget?: ResponseWidgetConfig;\n}\n\n/**\n * Tool call response to send back to the API\n */\nexport interface ToolCallResponse {\n tool_call_id: string;\n content: any;\n role: 'tool';\n}\n\n/**\n * DTO for sending messages to the assistant\n */\nexport interface ProcessMessageDto {\n message: string;\n chatUid?: string;\n userName?: string;\n files?: ChatFile[];\n metadata?: {\n promptTemplateParams?: Record<string, any>;\n tenantToken?: string;\n [key: string]: any;\n };\n tenantId?: string;\n previousConversation?: PreviousMessage[];\n enabledTools?: string[];\n provider?: string;\n model?: string;\n // Model interface protocol fields\n tools?: ModelInterfaceToolSchema[];\n applicationState?: Record<string, any>;\n skipSummarization?: boolean;\n /**\n * Id of a speech-to-text transcript (from POST /api/v1/whisper) that seeded\n * this message. Sent so the conversation keeps a link to the original audio.\n */\n transcriptId?: string;\n}\n\n/**\n * Response from the /whisper speech-to-text endpoint.\n */\nexport interface WhisperTranscriptionResponse {\n /** Public id of the transcript; send it back as ProcessMessageDto.transcriptId. */\n transcriptId: string;\n /** Transcribed text. */\n text: string;\n /** Language hint used, if any. */\n language?: string;\n /** Download URL of the source audio. */\n audioUrl?: string;\n /** Transcription model used. */\n model?: string;\n}\n\n/**\n * Response from the assistant\n */\nexport interface AssistantResponse {\n messages: ChatMessage[];\n chatUid: string;\n inputTokens?: number;\n outputTokens?: number;\n}\n\n/**\n * Async mode response\n */\nexport interface AsyncResponse {\n chatUid: string;\n message?: string;\n error?: string;\n}\n\n/**\n * Real-time chat history status\n */\nexport type RealtimeStatus = 'processing' | 'completed' | 'error' | 'waiting_for_tool_response' | 'handed_off';\n\n/**\n * Real-time chat history response\n */\nexport interface RealtimeChatHistory {\n chatUID: string;\n clientUID: string;\n chatHistory: ChatMessage[];\n status: RealtimeStatus;\n lastUpdatedAt: number;\n pendingToolCalls?: ToolCall[];\n handedOffSubThreadId?: string;\n}\n\n/**\n * Chat history structure\n */\nexport interface ChatHistory {\n chatUID: string;\n clientUID: string;\n userUID: string;\n chatContent: ChatMessage[];\n name?: string;\n assistantSpecializationIdentifier: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n llm?: string;\n inputTokens?: number;\n outputTokens?: number;\n metadata?: Record<string, any>;\n tenantId?: string;\n handedOff?: boolean;\n handedOffSubThreadId?: string;\n handedOffToolCallId?: string;\n}\n\n/**\n * Assistant specialization info\n */\nexport interface AssistantSpecialization {\n identifier: string;\n name: string;\n description: string;\n state: 'active' | 'inactive' | 'coming_soon';\n imgUrl?: string;\n availableToolsGroups?: Array<{\n name: string;\n description?: string;\n uid?: string;\n iconUrl?: string;\n tools?: Array<{\n name: string;\n description: string;\n }>;\n }>;\n model?: string;\n isCustom?: boolean;\n creationTimestampMs?: number;\n}\n\n/**\n * Summary of a conversation for listing\n */\nexport interface ConversationSummary {\n chatUID: string;\n name?: string;\n creationTimestampMs: number;\n lastEditTimestampMs?: number;\n}\n\nexport interface ListConversationsResponse {\n histories: ConversationSummary[];\n total: number;\n offset: number;\n limit: number;\n}\n\n/**\n * API error response\n */\nexport interface ApiError {\n statusCode: number;\n message: string;\n error?: string;\n}\n\n/**\n * Feedback submission request\n */\nexport interface FeedbackSubmission {\n messageId: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n}\n\n/**\n * Feedback entry response\n */\nexport interface FeedbackEntry {\n _id: string;\n requestId: string;\n chatUID?: string;\n threadId?: string;\n agentId?: string;\n feedback?: boolean;\n feedbackComment?: string;\n feedbackData?: Record<string, any>;\n creationTimestamp: string;\n lastEditTimestamp?: string;\n}\n\n/**\n * Agent thread states\n */\nexport enum AgentThreadState {\n QUEUED = 'queued',\n PROCESSING = 'processing',\n COMPLETED = 'completed',\n FAILED = 'failed',\n TERMINATED = 'terminated',\n PAUSED = 'paused',\n PAUSED_FOR_APPROVAL = 'paused_for_approval',\n APPROVAL_REJECTED = 'approval_rejected',\n WAITING_FOR_RESPONSE = 'waiting_for_response',\n PAUSED_FOR_RESUME = 'paused_for_resume',\n HANDED_OFF = 'handed_off',\n GUARDRAIL_TRIGGER = 'guardrail_trigger',\n}\n\n/**\n * Task within an agent thread\n */\nexport interface AgentTaskDto {\n _id?: string;\n title?: string;\n description?: string;\n completed: boolean;\n}\n\n/**\n * Agent thread DTO\n */\nexport interface AgentThreadDto {\n _id?: string;\n agentId: string;\n state: AgentThreadState;\n threadContent: ChatMessage[];\n tasks?: AgentTaskDto[];\n finishReason?: string;\n pausedReason?: string;\n name?: string;\n creationTimestampMs?: number;\n lastEditTimestampMs?: number;\n pauseUntil?: number;\n isSubthread?: boolean;\n parentThreadId?: string;\n subThreadToolCallId?: string;\n parentAgentId?: string;\n}\n\n/**\n * Agent details\n */\nexport interface AgentDto {\n _id?: string;\n name: string;\n description?: string;\n imgUrl?: string;\n agentId?: string;\n}\n\n/**\n * Hand-off tool response content\n */\nexport interface HandOffToolResponse {\n response: string;\n subthreadId: string;\n}\n\n/**\n * Represents a single tool call within a tool group\n */\nexport interface ToolGroupCall {\n name: string;\n input: any;\n output: any;\n toolCallId: string;\n}\n\n/**\n * Configuration for grouping consecutive tool calls under a single renderer\n */\nexport interface ToolGroupConfig {\n tools: string[];\n renderer: (calls: ToolGroupCall[]) => React.ReactNode;\n}\n"],"names":["AgentThreadState"],"mappings":";;AA6TA;;AAEG;AACSA;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C;AAC3C,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,gBAAA,CAAA,sBAAA,CAAA,GAAA,sBAA6C;AAC7C,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,gBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,gBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACzC,CAAC,EAbWA,wBAAgB,KAAhBA,wBAAgB,GAAA,EAAA,CAAA,CAAA;;"}
@@ -0,0 +1,334 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var reactDom = require('react-dom');
6
+ var DevicContext = require('../../provider/DevicContext.js');
7
+ var index = require('../../utils/index.js');
8
+ var useAIElementWrapper = require('./useAIElementWrapper.js');
9
+ var activeWrapperRegistry = require('./activeWrapperRegistry.js');
10
+
11
+ const DEFAULT_OPTIONS = {
12
+ showOn: 'hover',
13
+ triggerPlacement: 'bottom',
14
+ tooltipPlacement: 'bottom',
15
+ tooltipWidth: 360,
16
+ triggerLabel: 'Preguntar a IA',
17
+ highlightOnInteract: true,
18
+ zIndex: 2147483000,
19
+ triggerBorderRadius: 999,
20
+ color: undefined,
21
+ drawerPromptPrefix: undefined,
22
+ defaultInlinePrompt: undefined,
23
+ };
24
+ function rectFromDom(rect) {
25
+ return { top: rect.top, left: rect.left, width: rect.width, height: rect.height };
26
+ }
27
+ function placementStyle(placement, anchor, offset = 8) {
28
+ const cx = anchor.left + anchor.width / 2;
29
+ const cy = anchor.top + anchor.height / 2;
30
+ switch (placement) {
31
+ case 'top':
32
+ return { position: 'fixed', top: anchor.top - offset, left: cx, transform: 'translate(-50%, -100%)' };
33
+ case 'bottom':
34
+ return { position: 'fixed', top: anchor.top + anchor.height + offset, left: cx, transform: 'translateX(-50%)' };
35
+ case 'left':
36
+ return { position: 'fixed', top: cy, left: anchor.left - offset, transform: 'translate(-100%, -50%)' };
37
+ case 'right':
38
+ return { position: 'fixed', top: cy, left: anchor.left + anchor.width + offset, transform: 'translateY(-50%)' };
39
+ }
40
+ }
41
+ /**
42
+ * AIElementWrapper wraps an arbitrary React node and exposes an AI trigger
43
+ * that can either show an inline floating tooltip with the assistant's
44
+ * answer (`behavior='inline'`) or push a reference to the registered
45
+ * ChatDrawer (`behavior='drawer'`).
46
+ *
47
+ * The trigger and inline tooltip are rendered through a React portal anchored
48
+ * to the wrapped element, so they always sit above other UI (including the
49
+ * ChatDrawer) regardless of stacking context.
50
+ */
51
+ const AIElementWrapper = React.forwardRef(function AIElementWrapper(props, ref) {
52
+ const { label, data, referenceContent, behavior = 'inline', trigger, options = {}, assistantId, getPrompt, apiKey, baseUrl, tenantId, tenantMetadata, modelInterfaceTools, inlineRenderer, onActivate, onInlineResponse, onError, className, style, children, } = props;
53
+ const merged = React.useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);
54
+ // Stable instance ID used by the active-wrapper registry (singleton)
55
+ const wrapperIdRef = React.useRef('');
56
+ if (!wrapperIdRef.current)
57
+ wrapperIdRef.current = index.generateId();
58
+ const [activeWrapperId, setActiveWrapperLocal] = React.useState(activeWrapperRegistry.getActiveWrapper());
59
+ React.useEffect(() => activeWrapperRegistry.subscribeActiveWrapper(setActiveWrapperLocal), []);
60
+ const context = DevicContext.useOptionalDevicContext();
61
+ const containerRef = React.useRef(null);
62
+ const tooltipRef = React.useRef(null);
63
+ const triggerRef = React.useRef(null);
64
+ const [isHovered, setIsHovered] = React.useState(false);
65
+ const hoverTimerRef = React.useRef(null);
66
+ const setHoveredImmediately = React.useCallback((v) => {
67
+ if (hoverTimerRef.current) {
68
+ clearTimeout(hoverTimerRef.current);
69
+ hoverTimerRef.current = null;
70
+ }
71
+ if (v) {
72
+ setIsHovered(true);
73
+ }
74
+ else {
75
+ // Grace period so the cursor can travel from the wrapper to the
76
+ // portal-rendered trigger without the trigger disappearing mid-flight.
77
+ hoverTimerRef.current = setTimeout(() => setIsHovered(false), 200);
78
+ }
79
+ }, []);
80
+ React.useEffect(() => () => {
81
+ if (hoverTimerRef.current)
82
+ clearTimeout(hoverTimerRef.current);
83
+ }, []);
84
+ const [isInlineOpen, setIsInlineOpen] = React.useState(false);
85
+ const [containerRect, setContainerRect] = React.useState(null);
86
+ const [selectionRect, setSelectionRect] = React.useState(null);
87
+ const inline = useAIElementWrapper.useAIElementWrapper({
88
+ assistantId,
89
+ apiKey,
90
+ baseUrl,
91
+ tenantId,
92
+ tenantMetadata,
93
+ modelInterfaceTools,
94
+ onResponse: onInlineResponse,
95
+ onError,
96
+ });
97
+ // What this wrapper would show if there were no coordination.
98
+ const wantsTriggerVisible = merged.showOn === 'always' ||
99
+ (merged.showOn === 'hover' && isHovered) ||
100
+ (merged.showOn === 'click' && isInlineOpen) ||
101
+ (merged.showOn === 'select' && selectionRect !== null);
102
+ // Coordinate via the singleton registry so only one wrapper shows the
103
+ // floating trigger at a time. The most recent wrapper to want visibility
104
+ // wins; others hide until they are activated again.
105
+ const isActive = activeWrapperId === wrapperIdRef.current;
106
+ const triggerVisible = wantsTriggerVisible && (activeWrapperId === null || isActive);
107
+ React.useEffect(() => {
108
+ const id = wrapperIdRef.current;
109
+ if (wantsTriggerVisible) {
110
+ activeWrapperRegistry.setActiveWrapper(id);
111
+ }
112
+ else if (activeWrapperRegistry.getActiveWrapper() === id) {
113
+ activeWrapperRegistry.setActiveWrapper(null);
114
+ }
115
+ }, [wantsTriggerVisible]);
116
+ // Release the registry slot if the component unmounts while active.
117
+ React.useEffect(() => () => {
118
+ if (activeWrapperRegistry.getActiveWrapper() === wrapperIdRef.current) {
119
+ activeWrapperRegistry.setActiveWrapper(null);
120
+ }
121
+ }, []);
122
+ // Track container rect (for hover/click/always trigger and tooltip anchor)
123
+ const updateContainerRect = React.useCallback(() => {
124
+ const el = containerRef.current;
125
+ if (!el)
126
+ return;
127
+ setContainerRect(rectFromDom(el.getBoundingClientRect()));
128
+ }, []);
129
+ React.useLayoutEffect(() => {
130
+ if (!triggerVisible && !isInlineOpen)
131
+ return;
132
+ updateContainerRect();
133
+ const onScrollOrResize = () => updateContainerRect();
134
+ window.addEventListener('scroll', onScrollOrResize, true);
135
+ window.addEventListener('resize', onScrollOrResize);
136
+ return () => {
137
+ window.removeEventListener('scroll', onScrollOrResize, true);
138
+ window.removeEventListener('resize', onScrollOrResize);
139
+ };
140
+ }, [triggerVisible, isInlineOpen, updateContainerRect]);
141
+ // selectionchange listener for showOn='select'
142
+ React.useEffect(() => {
143
+ if (merged.showOn !== 'select') {
144
+ setSelectionRect(null);
145
+ return;
146
+ }
147
+ const isInside = (node, cont) => {
148
+ if (!node)
149
+ return false;
150
+ if (node === cont)
151
+ return true;
152
+ return cont.contains(node);
153
+ };
154
+ const recompute = () => {
155
+ const sel = window.getSelection();
156
+ const cont = containerRef.current;
157
+ if (!sel || sel.isCollapsed || !cont || sel.rangeCount === 0) {
158
+ setSelectionRect(null);
159
+ return;
160
+ }
161
+ // Don't react to selections happening elsewhere — but tolerate the
162
+ // case where anchor or focus are inside our container.
163
+ if (!isInside(sel.anchorNode, cont) && !isInside(sel.focusNode, cont)) {
164
+ setSelectionRect(null);
165
+ return;
166
+ }
167
+ const range = sel.getRangeAt(0);
168
+ const rect = range.getBoundingClientRect();
169
+ if (rect.width === 0 && rect.height === 0) {
170
+ setSelectionRect(null);
171
+ return;
172
+ }
173
+ setSelectionRect(rectFromDom(rect));
174
+ };
175
+ const onMouseUp = () => {
176
+ // Run on next tick so the browser commits the final selection state.
177
+ setTimeout(recompute, 0);
178
+ };
179
+ document.addEventListener('selectionchange', recompute);
180
+ document.addEventListener('mouseup', onMouseUp);
181
+ return () => {
182
+ document.removeEventListener('selectionchange', recompute);
183
+ document.removeEventListener('mouseup', onMouseUp);
184
+ };
185
+ }, [merged.showOn]);
186
+ const buildPrompt = React.useCallback(() => {
187
+ if (getPrompt)
188
+ return getPrompt({ data, label });
189
+ if (merged.defaultInlinePrompt)
190
+ return merged.defaultInlinePrompt;
191
+ // Use selected text if available, otherwise fall back to label
192
+ if (merged.showOn === 'select') {
193
+ const sel = window.getSelection();
194
+ const txt = sel?.toString().trim();
195
+ if (txt)
196
+ return `Cuéntame más sobre: "${txt}"`;
197
+ }
198
+ return `Cuéntame más sobre: ${label}`;
199
+ }, [getPrompt, data, label, merged.defaultInlinePrompt, merged.showOn]);
200
+ const handleActivate = React.useCallback(() => {
201
+ onActivate?.();
202
+ if (behavior === 'inline') {
203
+ if (!assistantId) {
204
+ const err = new Error('assistantId is required for behavior="inline"');
205
+ onError?.(err);
206
+ // eslint-disable-next-line no-console
207
+ console.warn('[AIElementWrapper]', err.message);
208
+ return;
209
+ }
210
+ setIsInlineOpen(true);
211
+ inline.reset();
212
+ inline.sendInlinePrompt(buildPrompt());
213
+ return;
214
+ }
215
+ // drawer behavior
216
+ if (!context) {
217
+ // eslint-disable-next-line no-console
218
+ console.warn('[AIElementWrapper] behavior="drawer" requires a DevicProvider ancestor.');
219
+ return;
220
+ }
221
+ // For 'select' showOn, prefer selected text as label content fallback
222
+ let finalLabel = label;
223
+ if (merged.showOn === 'select') {
224
+ const txt = window.getSelection()?.toString().trim();
225
+ if (txt)
226
+ finalLabel = txt;
227
+ }
228
+ context.addReference({ label: finalLabel, content: referenceContent, data });
229
+ context.openDrawer();
230
+ }, [
231
+ onActivate,
232
+ behavior,
233
+ assistantId,
234
+ onError,
235
+ inline,
236
+ buildPrompt,
237
+ context,
238
+ label,
239
+ referenceContent,
240
+ data,
241
+ merged.showOn,
242
+ ]);
243
+ const closeInline = React.useCallback(() => {
244
+ setIsInlineOpen(false);
245
+ inline.reset();
246
+ }, [inline]);
247
+ React.useImperativeHandle(ref, () => ({
248
+ activate: handleActivate,
249
+ close: closeInline,
250
+ }), [handleActivate, closeInline]);
251
+ // Click outside to close inline tooltip
252
+ React.useEffect(() => {
253
+ if (!isInlineOpen)
254
+ return;
255
+ const handler = (e) => {
256
+ const t = tooltipRef.current;
257
+ const c = containerRef.current;
258
+ const tr = triggerRef.current;
259
+ const target = e.target;
260
+ if (t && !t.contains(target) &&
261
+ c && !c.contains(target) &&
262
+ (!tr || !tr.contains(target))) {
263
+ closeInline();
264
+ }
265
+ };
266
+ document.addEventListener('mousedown', handler);
267
+ return () => document.removeEventListener('mousedown', handler);
268
+ }, [isInlineOpen, closeInline]);
269
+ // Anchor for trigger: selection rect (when showOn='select') else container rect
270
+ const triggerAnchor = merged.showOn === 'select' ? selectionRect : containerRect;
271
+ // Tooltip anchor: container rect (or selection if select mode)
272
+ const tooltipAnchor = merged.showOn === 'select' && selectionRect ? selectionRect : containerRect;
273
+ const triggerStyle = React.useMemo(() => {
274
+ if (!triggerAnchor)
275
+ return { display: 'none' };
276
+ return {
277
+ ...placementStyle(merged.triggerPlacement, triggerAnchor),
278
+ zIndex: merged.zIndex + 1,
279
+ pointerEvents: 'auto',
280
+ };
281
+ }, [triggerAnchor, merged.triggerPlacement, merged.zIndex]);
282
+ const tooltipStyle = React.useMemo(() => {
283
+ const w = typeof merged.tooltipWidth === 'number' ? `${merged.tooltipWidth}px` : merged.tooltipWidth;
284
+ if (!tooltipAnchor)
285
+ return { display: 'none' };
286
+ return {
287
+ ...placementStyle(merged.tooltipPlacement, tooltipAnchor),
288
+ width: w,
289
+ zIndex: merged.zIndex,
290
+ };
291
+ }, [tooltipAnchor, merged.tooltipPlacement, merged.tooltipWidth, merged.zIndex]);
292
+ const renderInlineContent = () => {
293
+ if (inline.error) {
294
+ return jsxRuntime.jsx("div", { className: "devic-aiwrap-error", children: inline.error.message });
295
+ }
296
+ if (inline.isProcessing) {
297
+ return (jsxRuntime.jsxs("div", { className: "devic-aiwrap-processing", children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-spinner", "aria-hidden": "true" }), jsxRuntime.jsx("span", { children: "Pensando\u2026" })] }));
298
+ }
299
+ if (inline.response) {
300
+ if (inlineRenderer)
301
+ return inlineRenderer(inline.response);
302
+ const text = typeof inline.response.content === 'string'
303
+ ? inline.response.content
304
+ : inline.response.content?.message || '';
305
+ return jsxRuntime.jsx("div", { className: "devic-aiwrap-answer", children: text });
306
+ }
307
+ return null;
308
+ };
309
+ const triggerNode = trigger ?? (jsxRuntime.jsxs("button", { type: "button", className: "devic-aiwrap-trigger", style: {
310
+ borderRadius: typeof merged.triggerBorderRadius === 'number'
311
+ ? `${merged.triggerBorderRadius}px`
312
+ : merged.triggerBorderRadius,
313
+ ...(merged.color ? { ['--devic-aiwrap-color']: merged.color } : {}),
314
+ }, children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-trigger-icon", "aria-hidden": "true", children: jsxRuntime.jsx(SparklesIcon, {}) }), jsxRuntime.jsx("span", { className: "devic-aiwrap-trigger-label", children: merged.triggerLabel })] }));
315
+ const portalTarget = typeof document !== 'undefined' ? document.body : null;
316
+ return (jsxRuntime.jsxs("span", { ref: containerRef, className: `devic-aiwrap-container ${className || ''}`, style: { position: 'relative', display: 'inline-block', ...style }, "data-highlight": merged.highlightOnInteract && (isHovered || isInlineOpen) ? 'true' : 'false', onMouseEnter: () => setHoveredImmediately(true), onMouseLeave: () => setHoveredImmediately(false), children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-content", children: children }), portalTarget && triggerVisible &&
317
+ reactDom.createPortal(jsxRuntime.jsx("div", { ref: triggerRef, className: "devic-aiwrap-trigger-wrapper", style: triggerStyle, onMouseEnter: () => setHoveredImmediately(true), onMouseLeave: () => setHoveredImmediately(false), onMouseDown: (e) => {
318
+ // Prevent losing the text selection when interacting with trigger
319
+ e.preventDefault();
320
+ }, onClick: (e) => {
321
+ e.stopPropagation();
322
+ handleActivate();
323
+ }, children: triggerNode }), portalTarget), portalTarget && behavior === 'inline' && isInlineOpen &&
324
+ reactDom.createPortal(jsxRuntime.jsxs("div", { ref: tooltipRef, className: "devic-aiwrap-tooltip", style: tooltipStyle, "data-placement": merged.tooltipPlacement, children: [jsxRuntime.jsxs("div", { className: "devic-aiwrap-tooltip-header", children: [jsxRuntime.jsx("span", { className: "devic-aiwrap-tooltip-label", children: label }), jsxRuntime.jsx("button", { type: "button", className: "devic-aiwrap-tooltip-close", onClick: closeInline, "aria-label": "Cerrar", children: jsxRuntime.jsx(CloseIcon, {}) })] }), jsxRuntime.jsx("div", { className: "devic-aiwrap-tooltip-body", children: renderInlineContent() })] }), portalTarget)] }));
325
+ });
326
+ function SparklesIcon() {
327
+ return (jsxRuntime.jsxs("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: [jsxRuntime.jsx("path", { d: "M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z", opacity: "0.95" }), jsxRuntime.jsx("path", { d: "M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z", opacity: "0.6" })] }));
328
+ }
329
+ function CloseIcon() {
330
+ return (jsxRuntime.jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }));
331
+ }
332
+
333
+ exports.AIElementWrapper = AIElementWrapper;
334
+ //# sourceMappingURL=AIElementWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIElementWrapper.js","sources":["../../../../../src/components/AIElementWrapper/AIElementWrapper.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalDevicContext } from '../../provider';\nimport { useAIElementWrapper } from './useAIElementWrapper';\nimport {\n getActiveWrapper,\n setActiveWrapper,\n subscribeActiveWrapper,\n} from './activeWrapperRegistry';\nimport { generateId } from '../../utils';\nimport type {\n AIElementWrapperHandle,\n AIElementWrapperOptions,\n AIElementWrapperPlacement,\n AIElementWrapperProps,\n} from './AIElementWrapper.types';\nimport './AIElementWrapper.css';\n\nconst DEFAULT_OPTIONS: Required<\n Omit<AIElementWrapperOptions, 'color' | 'drawerPromptPrefix' | 'defaultInlinePrompt'>\n> & {\n color?: string;\n drawerPromptPrefix?: AIElementWrapperOptions['drawerPromptPrefix'];\n defaultInlinePrompt?: string;\n} = {\n showOn: 'hover',\n triggerPlacement: 'bottom',\n tooltipPlacement: 'bottom',\n tooltipWidth: 360,\n triggerLabel: 'Preguntar a IA',\n highlightOnInteract: true,\n zIndex: 2147483000,\n triggerBorderRadius: 999,\n color: undefined,\n drawerPromptPrefix: undefined,\n defaultInlinePrompt: undefined,\n};\n\ninterface AnchorRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nfunction rectFromDom(rect: DOMRect): AnchorRect {\n return { top: rect.top, left: rect.left, width: rect.width, height: rect.height };\n}\n\nfunction placementStyle(\n placement: AIElementWrapperPlacement,\n anchor: AnchorRect,\n offset = 8\n): React.CSSProperties {\n const cx = anchor.left + anchor.width / 2;\n const cy = anchor.top + anchor.height / 2;\n switch (placement) {\n case 'top':\n return { position: 'fixed', top: anchor.top - offset, left: cx, transform: 'translate(-50%, -100%)' };\n case 'bottom':\n return { position: 'fixed', top: anchor.top + anchor.height + offset, left: cx, transform: 'translateX(-50%)' };\n case 'left':\n return { position: 'fixed', top: cy, left: anchor.left - offset, transform: 'translate(-100%, -50%)' };\n case 'right':\n return { position: 'fixed', top: cy, left: anchor.left + anchor.width + offset, transform: 'translateY(-50%)' };\n }\n}\n\n/**\n * AIElementWrapper wraps an arbitrary React node and exposes an AI trigger\n * that can either show an inline floating tooltip with the assistant's\n * answer (`behavior='inline'`) or push a reference to the registered\n * ChatDrawer (`behavior='drawer'`).\n *\n * The trigger and inline tooltip are rendered through a React portal anchored\n * to the wrapped element, so they always sit above other UI (including the\n * ChatDrawer) regardless of stacking context.\n */\nexport const AIElementWrapper = forwardRef<AIElementWrapperHandle, AIElementWrapperProps>(\n function AIElementWrapper(props, ref) {\n const {\n label,\n data,\n referenceContent,\n behavior = 'inline',\n trigger,\n options = {},\n assistantId,\n getPrompt,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n modelInterfaceTools,\n inlineRenderer,\n onActivate,\n onInlineResponse,\n onError,\n className,\n style,\n children,\n } = props;\n\n const merged = useMemo(() => ({ ...DEFAULT_OPTIONS, ...options }), [options]);\n\n // Stable instance ID used by the active-wrapper registry (singleton)\n const wrapperIdRef = useRef<string>('');\n if (!wrapperIdRef.current) wrapperIdRef.current = generateId();\n\n const [activeWrapperId, setActiveWrapperLocal] = useState<string | null>(getActiveWrapper());\n useEffect(() => subscribeActiveWrapper(setActiveWrapperLocal), []);\n\n const context = useOptionalDevicContext();\n const containerRef = useRef<HTMLSpanElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const [isHovered, setIsHovered] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const setHoveredImmediately = useCallback((v: boolean) => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n if (v) {\n setIsHovered(true);\n } else {\n // Grace period so the cursor can travel from the wrapper to the\n // portal-rendered trigger without the trigger disappearing mid-flight.\n hoverTimerRef.current = setTimeout(() => setIsHovered(false), 200);\n }\n }, []);\n useEffect(() => () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n }, []);\n const [isInlineOpen, setIsInlineOpen] = useState(false);\n const [containerRect, setContainerRect] = useState<AnchorRect | null>(null);\n const [selectionRect, setSelectionRect] = useState<AnchorRect | null>(null);\n\n const inline = useAIElementWrapper({\n assistantId,\n apiKey,\n baseUrl,\n tenantId,\n tenantMetadata,\n modelInterfaceTools,\n onResponse: onInlineResponse,\n onError,\n });\n\n // What this wrapper would show if there were no coordination.\n const wantsTriggerVisible =\n merged.showOn === 'always' ||\n (merged.showOn === 'hover' && isHovered) ||\n (merged.showOn === 'click' && isInlineOpen) ||\n (merged.showOn === 'select' && selectionRect !== null);\n\n // Coordinate via the singleton registry so only one wrapper shows the\n // floating trigger at a time. The most recent wrapper to want visibility\n // wins; others hide until they are activated again.\n const isActive = activeWrapperId === wrapperIdRef.current;\n const triggerVisible = wantsTriggerVisible && (activeWrapperId === null || isActive);\n\n useEffect(() => {\n const id = wrapperIdRef.current;\n if (wantsTriggerVisible) {\n setActiveWrapper(id);\n } else if (getActiveWrapper() === id) {\n setActiveWrapper(null);\n }\n }, [wantsTriggerVisible]);\n\n // Release the registry slot if the component unmounts while active.\n useEffect(\n () => () => {\n if (getActiveWrapper() === wrapperIdRef.current) {\n setActiveWrapper(null);\n }\n },\n []\n );\n\n // Track container rect (for hover/click/always trigger and tooltip anchor)\n const updateContainerRect = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n setContainerRect(rectFromDom(el.getBoundingClientRect()));\n }, []);\n\n useLayoutEffect(() => {\n if (!triggerVisible && !isInlineOpen) return;\n updateContainerRect();\n const onScrollOrResize = () => updateContainerRect();\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n return () => {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n };\n }, [triggerVisible, isInlineOpen, updateContainerRect]);\n\n // selectionchange listener for showOn='select'\n useEffect(() => {\n if (merged.showOn !== 'select') {\n setSelectionRect(null);\n return;\n }\n const isInside = (node: Node | null, cont: HTMLElement) => {\n if (!node) return false;\n if (node === cont) return true;\n return cont.contains(node);\n };\n const recompute = () => {\n const sel = window.getSelection();\n const cont = containerRef.current;\n if (!sel || sel.isCollapsed || !cont || sel.rangeCount === 0) {\n setSelectionRect(null);\n return;\n }\n // Don't react to selections happening elsewhere — but tolerate the\n // case where anchor or focus are inside our container.\n if (!isInside(sel.anchorNode, cont) && !isInside(sel.focusNode, cont)) {\n setSelectionRect(null);\n return;\n }\n const range = sel.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n setSelectionRect(null);\n return;\n }\n setSelectionRect(rectFromDom(rect));\n };\n const onMouseUp = () => {\n // Run on next tick so the browser commits the final selection state.\n setTimeout(recompute, 0);\n };\n document.addEventListener('selectionchange', recompute);\n document.addEventListener('mouseup', onMouseUp);\n return () => {\n document.removeEventListener('selectionchange', recompute);\n document.removeEventListener('mouseup', onMouseUp);\n };\n }, [merged.showOn]);\n\n const buildPrompt = useCallback((): string => {\n if (getPrompt) return getPrompt({ data, label });\n if (merged.defaultInlinePrompt) return merged.defaultInlinePrompt;\n // Use selected text if available, otherwise fall back to label\n if (merged.showOn === 'select') {\n const sel = window.getSelection();\n const txt = sel?.toString().trim();\n if (txt) return `Cuéntame más sobre: \"${txt}\"`;\n }\n return `Cuéntame más sobre: ${label}`;\n }, [getPrompt, data, label, merged.defaultInlinePrompt, merged.showOn]);\n\n const handleActivate = useCallback(() => {\n onActivate?.();\n\n if (behavior === 'inline') {\n if (!assistantId) {\n const err = new Error('assistantId is required for behavior=\"inline\"');\n onError?.(err);\n // eslint-disable-next-line no-console\n console.warn('[AIElementWrapper]', err.message);\n return;\n }\n setIsInlineOpen(true);\n inline.reset();\n inline.sendInlinePrompt(buildPrompt());\n return;\n }\n\n // drawer behavior\n if (!context) {\n // eslint-disable-next-line no-console\n console.warn(\n '[AIElementWrapper] behavior=\"drawer\" requires a DevicProvider ancestor.'\n );\n return;\n }\n // For 'select' showOn, prefer selected text as label content fallback\n let finalLabel = label;\n if (merged.showOn === 'select') {\n const txt = window.getSelection()?.toString().trim();\n if (txt) finalLabel = txt;\n }\n context.addReference({ label: finalLabel, content: referenceContent, data });\n context.openDrawer();\n }, [\n onActivate,\n behavior,\n assistantId,\n onError,\n inline,\n buildPrompt,\n context,\n label,\n referenceContent,\n data,\n merged.showOn,\n ]);\n\n const closeInline = useCallback(() => {\n setIsInlineOpen(false);\n inline.reset();\n }, [inline]);\n\n useImperativeHandle(\n ref,\n () => ({\n activate: handleActivate,\n close: closeInline,\n }),\n [handleActivate, closeInline]\n );\n\n // Click outside to close inline tooltip\n useEffect(() => {\n if (!isInlineOpen) return;\n const handler = (e: MouseEvent) => {\n const t = tooltipRef.current;\n const c = containerRef.current;\n const tr = triggerRef.current;\n const target = e.target as Node;\n if (\n t && !t.contains(target) &&\n c && !c.contains(target) &&\n (!tr || !tr.contains(target))\n ) {\n closeInline();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [isInlineOpen, closeInline]);\n\n // Anchor for trigger: selection rect (when showOn='select') else container rect\n const triggerAnchor = merged.showOn === 'select' ? selectionRect : containerRect;\n // Tooltip anchor: container rect (or selection if select mode)\n const tooltipAnchor = merged.showOn === 'select' && selectionRect ? selectionRect : containerRect;\n\n const triggerStyle = useMemo<React.CSSProperties>(() => {\n if (!triggerAnchor) return { display: 'none' };\n return {\n ...placementStyle(merged.triggerPlacement, triggerAnchor),\n zIndex: merged.zIndex + 1,\n pointerEvents: 'auto',\n };\n }, [triggerAnchor, merged.triggerPlacement, merged.zIndex]);\n\n const tooltipStyle = useMemo<React.CSSProperties>(() => {\n const w = typeof merged.tooltipWidth === 'number' ? `${merged.tooltipWidth}px` : merged.tooltipWidth;\n if (!tooltipAnchor) return { display: 'none' };\n return {\n ...placementStyle(merged.tooltipPlacement, tooltipAnchor),\n width: w,\n zIndex: merged.zIndex,\n };\n }, [tooltipAnchor, merged.tooltipPlacement, merged.tooltipWidth, merged.zIndex]);\n\n const renderInlineContent = () => {\n if (inline.error) {\n return <div className=\"devic-aiwrap-error\">{inline.error.message}</div>;\n }\n if (inline.isProcessing) {\n return (\n <div className=\"devic-aiwrap-processing\">\n <span className=\"devic-aiwrap-spinner\" aria-hidden=\"true\" />\n <span>Pensando…</span>\n </div>\n );\n }\n if (inline.response) {\n if (inlineRenderer) return inlineRenderer(inline.response);\n const text =\n typeof inline.response.content === 'string'\n ? inline.response.content\n : (inline.response.content as any)?.message || '';\n return <div className=\"devic-aiwrap-answer\">{text}</div>;\n }\n return null;\n };\n\n const triggerNode = trigger ?? (\n <button\n type=\"button\"\n className=\"devic-aiwrap-trigger\"\n style={{\n borderRadius:\n typeof merged.triggerBorderRadius === 'number'\n ? `${merged.triggerBorderRadius}px`\n : merged.triggerBorderRadius,\n ...(merged.color ? { ['--devic-aiwrap-color' as any]: merged.color } : {}),\n }}\n >\n <span className=\"devic-aiwrap-trigger-icon\" aria-hidden=\"true\">\n <SparklesIcon />\n </span>\n <span className=\"devic-aiwrap-trigger-label\">{merged.triggerLabel}</span>\n </button>\n );\n\n const portalTarget = typeof document !== 'undefined' ? document.body : null;\n\n return (\n <span\n ref={containerRef}\n className={`devic-aiwrap-container ${className || ''}`}\n style={{ position: 'relative', display: 'inline-block', ...style }}\n data-highlight={merged.highlightOnInteract && (isHovered || isInlineOpen) ? 'true' : 'false'}\n onMouseEnter={() => setHoveredImmediately(true)}\n onMouseLeave={() => setHoveredImmediately(false)}\n >\n <span className=\"devic-aiwrap-content\">{children}</span>\n\n {portalTarget && triggerVisible &&\n createPortal(\n <div\n ref={triggerRef}\n className=\"devic-aiwrap-trigger-wrapper\"\n style={triggerStyle}\n onMouseEnter={() => setHoveredImmediately(true)}\n onMouseLeave={() => setHoveredImmediately(false)}\n onMouseDown={(e) => {\n // Prevent losing the text selection when interacting with trigger\n e.preventDefault();\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleActivate();\n }}\n >\n {triggerNode}\n </div>,\n portalTarget\n )}\n\n {portalTarget && behavior === 'inline' && isInlineOpen &&\n createPortal(\n <div\n ref={tooltipRef}\n className=\"devic-aiwrap-tooltip\"\n style={tooltipStyle}\n data-placement={merged.tooltipPlacement}\n >\n <div className=\"devic-aiwrap-tooltip-header\">\n <span className=\"devic-aiwrap-tooltip-label\">{label}</span>\n <button\n type=\"button\"\n className=\"devic-aiwrap-tooltip-close\"\n onClick={closeInline}\n aria-label=\"Cerrar\"\n >\n <CloseIcon />\n </button>\n </div>\n <div className=\"devic-aiwrap-tooltip-body\">{renderInlineContent()}</div>\n </div>,\n portalTarget\n )}\n </span>\n );\n }\n);\n\nfunction SparklesIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 2L11.5 8.5L18 10L11.5 11.5L10 18L8.5 11.5L2 10L8.5 8.5L10 2Z\" opacity=\"0.95\" />\n <path d=\"M16 3L16.5 5L18.5 5.5L16.5 6L16 8L15.5 6L13.5 5.5L15.5 5L16 3Z\" opacity=\"0.6\" />\n </svg>\n );\n}\n\nfunction CloseIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n"],"names":["forwardRef","useMemo","useRef","generateId","useState","getActiveWrapper","useEffect","subscribeActiveWrapper","useOptionalDevicContext","useCallback","useAIElementWrapper","setActiveWrapper","useLayoutEffect","useImperativeHandle","_jsx","_jsxs","createPortal"],"mappings":"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"}