@amodalai/chat-widget 0.1.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chat-widget.css +5 -0
  3. package/dist/chat-widget.js +2311 -0
  4. package/dist/chat-widget.js.map +1 -0
  5. package/dist/client/ChatClient.d.ts +76 -0
  6. package/dist/client/ChatClient.d.ts.map +1 -0
  7. package/dist/client/ChatStream.d.ts +63 -0
  8. package/dist/client/ChatStream.d.ts.map +1 -0
  9. package/dist/client/EventEmitter.d.ts +16 -0
  10. package/dist/client/EventEmitter.d.ts.map +1 -0
  11. package/dist/client/index.d.ts +13 -0
  12. package/dist/client/index.d.ts.map +1 -0
  13. package/dist/client.d.ts +85 -0
  14. package/dist/client.d.ts.map +1 -0
  15. package/dist/client.js +9 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/components/AskUserCard.d.ts +8 -0
  18. package/dist/components/AskUserCard.d.ts.map +1 -0
  19. package/dist/components/ChatWidget.d.ts +9 -0
  20. package/dist/components/ChatWidget.d.ts.map +1 -0
  21. package/dist/components/FormattedText.d.ts +12 -0
  22. package/dist/components/FormattedText.d.ts.map +1 -0
  23. package/dist/components/InputBar.d.ts +15 -0
  24. package/dist/components/InputBar.d.ts.map +1 -0
  25. package/dist/components/KBProposalCard.d.ts +7 -0
  26. package/dist/components/KBProposalCard.d.ts.map +1 -0
  27. package/dist/components/MessageList.d.ts +15 -0
  28. package/dist/components/MessageList.d.ts.map +1 -0
  29. package/dist/components/SessionHistory.d.ts +12 -0
  30. package/dist/components/SessionHistory.d.ts.map +1 -0
  31. package/dist/components/SkillPill.d.ts +11 -0
  32. package/dist/components/SkillPill.d.ts.map +1 -0
  33. package/dist/components/StreamingIndicator.d.ts +7 -0
  34. package/dist/components/StreamingIndicator.d.ts.map +1 -0
  35. package/dist/components/TagEditor.d.ts +11 -0
  36. package/dist/components/TagEditor.d.ts.map +1 -0
  37. package/dist/components/ToolCallCard.d.ts +7 -0
  38. package/dist/components/ToolCallCard.d.ts.map +1 -0
  39. package/dist/components/widgets/AlertCard.d.ts +3 -0
  40. package/dist/components/widgets/AlertCard.d.ts.map +1 -0
  41. package/dist/components/widgets/Comparison.d.ts +3 -0
  42. package/dist/components/widgets/Comparison.d.ts.map +1 -0
  43. package/dist/components/widgets/CredentialInput.d.ts +3 -0
  44. package/dist/components/widgets/CredentialInput.d.ts.map +1 -0
  45. package/dist/components/widgets/DataTable.d.ts +3 -0
  46. package/dist/components/widgets/DataTable.d.ts.map +1 -0
  47. package/dist/components/widgets/DocumentPreview.d.ts +3 -0
  48. package/dist/components/widgets/DocumentPreview.d.ts.map +1 -0
  49. package/dist/components/widgets/EntityCard.d.ts +3 -0
  50. package/dist/components/widgets/EntityCard.d.ts.map +1 -0
  51. package/dist/components/widgets/EntityList.d.ts +3 -0
  52. package/dist/components/widgets/EntityList.d.ts.map +1 -0
  53. package/dist/components/widgets/InfoCard.d.ts +3 -0
  54. package/dist/components/widgets/InfoCard.d.ts.map +1 -0
  55. package/dist/components/widgets/Metric.d.ts +3 -0
  56. package/dist/components/widgets/Metric.d.ts.map +1 -0
  57. package/dist/components/widgets/ScopeMap.d.ts +3 -0
  58. package/dist/components/widgets/ScopeMap.d.ts.map +1 -0
  59. package/dist/components/widgets/ScoreBreakdown.d.ts +3 -0
  60. package/dist/components/widgets/ScoreBreakdown.d.ts.map +1 -0
  61. package/dist/components/widgets/StatusBoard.d.ts +3 -0
  62. package/dist/components/widgets/StatusBoard.d.ts.map +1 -0
  63. package/dist/components/widgets/Timeline.d.ts +3 -0
  64. package/dist/components/widgets/Timeline.d.ts.map +1 -0
  65. package/dist/components/widgets/WidgetRenderer.d.ts +28 -0
  66. package/dist/components/widgets/WidgetRenderer.d.ts.map +1 -0
  67. package/dist/events/entity-extractor.d.ts +7 -0
  68. package/dist/events/entity-extractor.d.ts.map +1 -0
  69. package/dist/events/event-bus.d.ts +27 -0
  70. package/dist/events/event-bus.d.ts.map +1 -0
  71. package/dist/events/index.d.ts +9 -0
  72. package/dist/events/index.d.ts.map +1 -0
  73. package/dist/events/types.d.ts +72 -0
  74. package/dist/events/types.d.ts.map +1 -0
  75. package/dist/hooks/useChat.d.ts +52 -0
  76. package/dist/hooks/useChat.d.ts.map +1 -0
  77. package/dist/hooks/useSessionHistory.d.ts +17 -0
  78. package/dist/hooks/useSessionHistory.d.ts.map +1 -0
  79. package/dist/hooks/useWidgetEvents.d.ts +17 -0
  80. package/dist/hooks/useWidgetEvents.d.ts.map +1 -0
  81. package/dist/index-m6lGOMRo.js +641 -0
  82. package/dist/index-m6lGOMRo.js.map +1 -0
  83. package/dist/index.d.ts +25 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/theme.d.ts +11 -0
  86. package/dist/theme.d.ts.map +1 -0
  87. package/dist/types.d.ts +298 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/umd-entry.d.ts +21 -0
  90. package/dist/umd-entry.d.ts.map +1 -0
  91. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-m6lGOMRo.js","sources":["../src/client.ts","../src/client/EventEmitter.ts","../src/events/entity-extractor.ts","../src/events/event-bus.ts","../src/client/ChatStream.ts","../src/client/ChatClient.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { SSEEvent } from './types';\n\nexport interface ChatStreamRequest {\n message: string;\n session_id?: string;\n role?: string;\n session_type?: string;\n deploy_id?: string;\n}\n\nexport interface SessionInfo {\n session_id: string;\n role: string;\n}\n\n/**\n * Parse a single SSE data line into a typed event.\n * Returns null for non-data lines or empty data.\n */\nexport function parseSSELine(line: string): SSEEvent | null {\n if (!line.startsWith('data: ')) return null;\n const json = line.slice(6).trim();\n if (json.length === 0) return null;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- SSE event from server\n return JSON.parse(json) as SSEEvent;\n}\n\n/**\n * Streams chat responses from the API server's SSE endpoint.\n * Uses fetch + ReadableStream (not EventSource, which only supports GET).\n */\nexport async function* streamChat(\n serverUrl: string,\n request: ChatStreamRequest,\n signal?: AbortSignal,\n token?: string,\n): AsyncGenerator<SSEEvent> {\n const url = `${serverUrl}/chat/stream`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Chat request failed: ${String(response.status)} ${response.statusText}`);\n }\n\n const body = response.body;\n if (!body) {\n throw new Error('Response body is null');\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n // Keep the last partial line in the buffer\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n const event = parseSSELine(trimmed);\n if (event) {\n yield event;\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim().length > 0) {\n const event = parseSSELine(buffer.trim());\n if (event) {\n yield event;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Creates a new chat session on the server.\n */\nexport async function createSession(\n serverUrl: string,\n user: { id: string; role?: string },\n token?: string,\n): Promise<SessionInfo> {\n const url = `${serverUrl}/sessions`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const body: Record<string, string> = { user_id: user.id };\n if (user.role) body['role'] = user.role;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(`Session creation failed: ${String(response.status)} ${response.statusText}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionInfo;\n}\n\n// ---------------------------------------------------------------------------\n// Session history API\n// ---------------------------------------------------------------------------\n\nexport interface SessionHistoryItem {\n id: string;\n tenant_id: string;\n app_id?: string;\n title?: string;\n tags: string[];\n status: string;\n session_type?: string;\n message_count: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface SessionDetail extends SessionHistoryItem {\n messages: Array<{\n type: string;\n id: string;\n text: string;\n timestamp: string;\n toolCalls?: Array<Record<string, unknown>>;\n skillActivations?: string[];\n widgets?: Array<Record<string, unknown>>;\n contentBlocks?: Array<Record<string, unknown>>;\n }>;\n}\n\nfunction authHeaders(token?: string | null): Record<string, string> {\n const headers: Record<string, string> = {};\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n}\n\n/**\n * List past sessions for the authenticated tenant.\n */\nexport async function listSessions(\n serverUrl: string,\n token?: string | null,\n tags?: string[],\n): Promise<SessionHistoryItem[]> {\n const qs = tags && tags.length > 0 ? `?tags=${tags.join(',')}` : '';\n const url = `${serverUrl}/sessions/history${qs}`;\n\n const response = await fetch(url, { headers: authHeaders(token) });\n if (!response.ok) {\n throw new Error(`List sessions failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionHistoryItem[];\n}\n\n/**\n * Get a single session with full message history.\n */\nexport async function getSessionHistory(\n serverUrl: string,\n sessionId: string,\n token?: string | null,\n): Promise<SessionDetail> {\n const url = `${serverUrl}/sessions/history/${sessionId}`;\n\n const response = await fetch(url, { headers: authHeaders(token) });\n if (!response.ok) {\n throw new Error(`Get session failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionDetail;\n}\n\n/**\n * Update session title and/or tags.\n */\nexport async function updateSession(\n serverUrl: string,\n sessionId: string,\n updates: { title?: string; tags?: string[] },\n token?: string | null,\n): Promise<SessionDetail> {\n const url = `${serverUrl}/sessions/history/${sessionId}`;\n\n const response = await fetch(url, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders(token),\n },\n body: JSON.stringify(updates),\n });\n if (!response.ok) {\n throw new Error(`Update session failed: ${String(response.status)} ${response.statusText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Server response\n return (await response.json()) as SessionDetail;\n}\n\n/**\n * Creates a configured chat client instance.\n */\nexport function createChatClient(serverUrl: string, token?: string) {\n return {\n stream: (request: ChatStreamRequest, signal?: AbortSignal) =>\n streamChat(serverUrl, request, signal, token),\n createSession: (user: { id: string; role?: string }) =>\n createSession(serverUrl, user, token),\n listSessions: (tags?: string[]) => listSessions(serverUrl, token, tags),\n getSessionHistory: (sessionId: string) => getSessionHistory(serverUrl, sessionId, token),\n updateSession: (sessionId: string, updates: { title?: string; tags?: string[] }) =>\n updateSession(serverUrl, sessionId, updates, token),\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * Minimal typed event emitter with no external dependencies.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic event map constraint\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners = new Map<keyof Events, Set<(data: never) => void>>();\n\n on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): this {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener as (data: never) => void);\n return this;\n }\n\n off<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): this {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as (data: never) => void);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n return this;\n }\n\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const listener of set) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- generic event dispatch\n (listener as (data: Events[K]) => void)(data);\n }\n }\n }\n\n removeAllListeners(): this {\n this.listeners.clear();\n return this;\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { EntityReference, WidgetEvent } from './types';\n\n/**\n * Default entity extractor. Inspects agent-driven events and extracts entity\n * references from known widget data shapes and tool parameters.\n */\nexport function defaultEntityExtractor(event: WidgetEvent): EntityReference[] {\n const entities: EntityReference[] = [];\n\n if (event.type === 'widget_rendered') {\n extractFromWidget(event.widgetType, event.data, entities);\n }\n\n if (event.type === 'tool_executed') {\n extractFromToolParams(event.parameters, entities);\n }\n\n return entities;\n}\n\nfunction extractFromWidget(\n widgetType: string,\n data: Record<string, unknown>,\n entities: EntityReference[],\n): void {\n switch (widgetType) {\n case 'entity-card': {\n if (typeof data['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: data['mac'],\n source: 'widget:entity-card',\n });\n }\n if (typeof data['zone'] === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: data['zone'],\n source: 'widget:entity-card',\n });\n }\n break;\n }\n case 'entity-list': {\n const devices = data['devices'];\n if (Array.isArray(devices)) {\n for (const device of devices) {\n if (typeof device === 'object' && device !== null && 'mac' in device && typeof device['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: device['mac'],\n source: 'widget:entity-list',\n });\n }\n }\n }\n break;\n }\n case 'scope-map': {\n const zones = data['highlight_zones'];\n if (Array.isArray(zones)) {\n for (const zone of zones) {\n if (typeof zone === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: zone,\n source: 'widget:scope-map',\n });\n }\n }\n }\n const devices = data['highlight_devices'];\n if (Array.isArray(devices)) {\n for (const mac of devices) {\n if (typeof mac === 'string') {\n entities.push({\n entityType: 'device',\n entityId: mac,\n source: 'widget:scope-map',\n });\n }\n }\n }\n break;\n }\n case 'alert-card': {\n const alertId = data['alert_id'] ?? data['id'];\n if (typeof alertId === 'string') {\n entities.push({\n entityType: 'alert',\n entityId: alertId,\n source: 'widget:alert-card',\n });\n }\n break;\n }\n default:\n break;\n }\n}\n\nfunction extractFromToolParams(\n parameters: Record<string, unknown>,\n entities: EntityReference[],\n): void {\n if (typeof parameters['zone'] === 'string') {\n entities.push({\n entityType: 'zone',\n entityId: parameters['zone'],\n source: 'tool:parameter',\n });\n }\n if (typeof parameters['mac'] === 'string') {\n entities.push({\n entityType: 'device',\n entityId: parameters['mac'],\n source: 'tool:parameter',\n });\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { TypedEventEmitter } from '../client/EventEmitter';\nimport { defaultEntityExtractor } from './entity-extractor';\nimport type { WidgetEventMap, WidgetEvent, EntityExtractor, EntityReferencedEvent } from './types';\n\n/**\n * Event bus for widget events. Emits both agent-driven events (from SSE stream)\n * and user interaction events (hover/click on entities in the chat).\n *\n * Subscribing to `'*'` receives all events.\n */\nexport class WidgetEventBus extends TypedEventEmitter<WidgetEventMap> {\n private extractors: EntityExtractor[] = [defaultEntityExtractor];\n\n /**\n * Process an agent-driven event: emit on its typed channel + '*',\n * then run entity extractors and emit entity_referenced for each found entity.\n */\n processEvent(event: WidgetEvent): void {\n // Emit on the typed channel\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- event type matches map key\n this.emit(event.type as keyof WidgetEventMap, event as never);\n this.emit('*', event);\n\n // Run entity extractors only for agent-driven events (not interaction events, not entity_referenced)\n if (\n event.type === 'tool_executed' ||\n event.type === 'skill_activated' ||\n event.type === 'widget_rendered' ||\n event.type === 'kb_proposal'\n ) {\n for (const extractor of this.extractors) {\n const entities = extractor(event);\n for (const entity of entities) {\n const refEvent: EntityReferencedEvent = {\n type: 'entity_referenced',\n entity,\n sourceEvent: event,\n timestamp: new Date().toISOString(),\n };\n this.emit('entity_referenced', refEvent);\n this.emit('*', refEvent);\n }\n }\n }\n }\n\n /**\n * Emit an interaction event (entity_hovered, entity_unhovered, entity_clicked).\n * These are emitted on their typed channel + '*' without running extractors,\n * since interaction events already carry their EntityReference.\n */\n emitInteraction(event: WidgetEvent): void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- event type matches map key\n this.emit(event.type as keyof WidgetEventMap, event as never);\n this.emit('*', event);\n }\n\n /** Add a custom entity extractor. */\n addExtractor(fn: EntityExtractor): void {\n this.extractors.push(fn);\n }\n\n /** Replace all entity extractors (including the default). */\n setExtractors(fns: EntityExtractor[]): void {\n this.extractors = [...fns];\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type {\n SSEEvent,\n ToolCallInfo,\n KBProposalInfo,\n AskUserQuestion,\n} from '../types';\nimport type { ChatStreamRequest } from '../client';\nimport { streamChat } from '../client';\n\n/**\n * Full response from a completed chat stream.\n */\nexport interface ChatResponse {\n text: string;\n toolCalls: ToolCallInfo[];\n skillsUsed: string[];\n kbProposals: KBProposalInfo[];\n}\n\ntype StreamEventHandler<T> = (data: T) => void;\n\n/**\n * A streaming chat response handle.\n * Register `.on()` handlers then the stream starts automatically.\n */\nexport class ChatStream {\n private handlers: {\n text: Array<StreamEventHandler<{ text: string }>>;\n tool_call: Array<StreamEventHandler<{ tool: string; params: Record<string, unknown>; toolId: string }>>;\n tool_result: Array<StreamEventHandler<{ tool: string; data: unknown; duration_ms?: number; toolId: string }>>;\n skill_activated: Array<StreamEventHandler<{ name: string }>>;\n kb_proposal: Array<StreamEventHandler<KBProposalInfo>>;\n widget: Array<StreamEventHandler<{ widgetType: string; data: Record<string, unknown> }>>;\n ask_user: Array<StreamEventHandler<{ askId: string; questions: AskUserQuestion[] }>>;\n error: Array<StreamEventHandler<{ message: string }>>;\n done: Array<StreamEventHandler<ChatResponse>>;\n } = {\n text: [],\n tool_call: [],\n tool_result: [],\n skill_activated: [],\n kb_proposal: [],\n widget: [],\n ask_user: [],\n error: [],\n done: [],\n };\n\n private abortController: AbortController;\n private started = false;\n private response: ChatResponse = {\n text: '',\n toolCalls: [],\n skillsUsed: [],\n kbProposals: [],\n };\n private toolCallNames = new Map<string, string>();\n\n private token?: string;\n\n constructor(\n private serverUrl: string,\n private request: ChatStreamRequest,\n token?: string,\n ) {\n this.abortController = new AbortController();\n this.token = token;\n // Start on next microtick so .on() calls can register first\n queueMicrotask(() => this.start());\n }\n\n on(event: 'text', handler: StreamEventHandler<{ text: string }>): this;\n on(event: 'tool_call', handler: StreamEventHandler<{ tool: string; params: Record<string, unknown>; toolId: string }>): this;\n on(event: 'tool_result', handler: StreamEventHandler<{ tool: string; data: unknown; duration_ms?: number; toolId: string }>): this;\n on(event: 'skill_activated', handler: StreamEventHandler<{ name: string }>): this;\n on(event: 'kb_proposal', handler: StreamEventHandler<KBProposalInfo>): this;\n on(event: 'widget', handler: StreamEventHandler<{ widgetType: string; data: Record<string, unknown> }>): this;\n on(event: 'ask_user', handler: StreamEventHandler<{ askId: string; questions: AskUserQuestion[] }>): this;\n on(event: 'error', handler: StreamEventHandler<{ message: string }>): this;\n on(event: 'done', handler: StreamEventHandler<ChatResponse>): this;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- overload implementation requires broad type\n on(event: string, handler: StreamEventHandler<any>): this {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- overload dispatch key narrowing\n const key = event as keyof typeof this.handlers;\n if (key in this.handlers) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- overload dispatch\n (this.handlers[key] as Array<StreamEventHandler<unknown>>).push(handler);\n }\n return this;\n }\n\n /** Cancel the stream. */\n abort(): void {\n this.abortController.abort();\n }\n\n private async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n\n try {\n const stream = streamChat(\n this.serverUrl,\n this.request,\n this.abortController.signal,\n this.token,\n );\n\n for await (const event of stream) {\n this.processEvent(event);\n }\n\n // Emit done\n for (const handler of this.handlers.done) {\n handler(this.response);\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n for (const handler of this.handlers.error) {\n handler({ message });\n }\n }\n }\n }\n\n private processEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text_delta':\n this.response.text += event.content;\n for (const handler of this.handlers.text) {\n handler({ text: event.content });\n }\n break;\n case 'tool_call_start':\n this.toolCallNames.set(event.tool_id, event.tool_name);\n for (const handler of this.handlers.tool_call) {\n handler({ tool: event.tool_name, params: event.parameters, toolId: event.tool_id });\n }\n this.response.toolCalls.push({\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n });\n break;\n case 'tool_call_result': {\n const toolName = this.toolCallNames.get(event.tool_id) ?? '';\n for (const handler of this.handlers.tool_result) {\n handler({ tool: toolName, data: event.result, duration_ms: event.duration_ms, toolId: event.tool_id });\n }\n // Update status in response\n const tc = this.response.toolCalls.find((t) => t.toolId === event.tool_id);\n if (tc) {\n tc.status = event.status;\n tc.result = event.result;\n tc.duration_ms = event.duration_ms;\n tc.error = event.error;\n }\n break;\n }\n case 'skill_activated':\n this.response.skillsUsed.push(event.skill);\n for (const handler of this.handlers.skill_activated) {\n handler({ name: event.skill });\n }\n break;\n case 'kb_proposal': {\n const proposal: KBProposalInfo = {\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n };\n this.response.kbProposals.push(proposal);\n for (const handler of this.handlers.kb_proposal) {\n handler(proposal);\n }\n break;\n }\n case 'ask_user':\n for (const handler of this.handlers.ask_user) {\n handler({ askId: event.ask_id, questions: event.questions });\n }\n break;\n case 'error':\n for (const handler of this.handlers.error) {\n handler({ message: event.message });\n }\n break;\n case 'init':\n case 'done':\n // Init handled by ChatClient, done triggers after loop\n break;\n default: {\n // Handle widget events from extended SSE\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- checking extended SSE event type\n const extEvent = event as unknown as { type: string; widget_type?: string; data?: Record<string, unknown> };\n if (extEvent.type === 'widget' && extEvent.widget_type && extEvent.data) {\n for (const handler of this.handlers.widget) {\n handler({ widgetType: extEvent.widget_type, data: extEvent.data });\n }\n }\n break;\n }\n }\n }\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { TypedEventEmitter } from './EventEmitter';\nimport { ChatStream } from './ChatStream';\nimport type { ChatResponse } from './ChatStream';\nimport { createSession, streamChat } from '../client';\nimport type { ChatUser, ChatMessage, AssistantTextMessage, ToolCallInfo, KBProposalInfo } from '../types';\nimport { WidgetEventBus } from '../events/event-bus';\nimport type { WidgetEvent, EntityExtractor, ToolExecutedEvent, SkillActivatedEvent, WidgetRenderedEvent, KBProposalEvent } from '../events/types';\n\n/**\n * Configuration for the ChatClient.\n */\nexport interface ChatClientConfig {\n serverUrl: string;\n user: ChatUser;\n /** Bearer token (API key or JWT) for authenticated requests. */\n token?: string;\n /** Custom entity extractors. If provided, replaces the default extractor. */\n entityExtractors?: EntityExtractor[];\n}\n\n/**\n * Events emitted by the ChatClient.\n */\nexport interface ClientEvents {\n connected: undefined;\n disconnected: undefined;\n reconnecting: number;\n message: ChatMessage;\n streaming_start: undefined;\n streaming_end: undefined;\n error: Error;\n tool_executed: ToolExecutedEvent;\n skill_activated: SkillActivatedEvent;\n widget_rendered: WidgetRenderedEvent;\n kb_proposal_received: KBProposalEvent;\n entity_referenced: WidgetEvent;\n}\n\nlet msgCounter = 0;\nfunction makeId(): string {\n msgCounter++;\n return `msg-${Date.now()}-${String(msgCounter)}`;\n}\n\n/**\n * Headless chat client for framework-agnostic integrations.\n * Manages session lifecycle, message history, and SSE streaming.\n */\nexport class ChatClient extends TypedEventEmitter<ClientEvents> {\n private config: ChatClientConfig;\n private sessionId: string | null = null;\n private _messages: ChatMessage[] = [];\n private _isConnected = false;\n private _isStreaming = false;\n private connectAttempt = 0;\n private maxReconnectAttempts = 3;\n private _eventBus: WidgetEventBus;\n\n constructor(config: ChatClientConfig) {\n super();\n this.config = config;\n this._eventBus = new WidgetEventBus();\n if (config.entityExtractors) {\n this._eventBus.setExtractors(config.entityExtractors);\n }\n // Forward entity_referenced events from bus to client events\n this._eventBus.on('entity_referenced', (e) => {\n this.emit('entity_referenced', e);\n });\n }\n\n /** The widget event bus. Subscribe to agent-driven events here. */\n get events(): WidgetEventBus {\n return this._eventBus;\n }\n\n /** Whether the client has an active session. */\n get isConnected(): boolean {\n return this._isConnected;\n }\n\n /** Whether a response is currently streaming. */\n get isStreaming(): boolean {\n return this._isStreaming;\n }\n\n /** Current session ID, or null if not connected. */\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n /** Readonly message history. */\n get messages(): readonly ChatMessage[] {\n return this._messages;\n }\n\n /** Establish a session with the server. */\n async connect(): Promise<void> {\n try {\n const session = await createSession(\n this.config.serverUrl,\n this.config.user,\n this.config.token,\n );\n this.sessionId = session.session_id;\n this._isConnected = true;\n this.connectAttempt = 0;\n this.emit('connected', undefined);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit('error', error);\n throw error;\n }\n }\n\n /** Disconnect and clean up. */\n async disconnect(): Promise<void> {\n this.sessionId = null;\n this._isConnected = false;\n this._isStreaming = false;\n this.emit('disconnected', undefined);\n }\n\n /** Clear message history. */\n clearHistory(): void {\n this._messages = [];\n }\n\n /**\n * Send a message and wait for the full response.\n * Auto-connects if not already connected.\n */\n async send(text: string): Promise<ChatResponse> {\n if (!this._isConnected) {\n await this.connect();\n }\n\n // Add user message\n const userMsg: ChatMessage = {\n type: 'user',\n id: makeId(),\n text,\n timestamp: new Date().toISOString(),\n };\n this._messages.push(userMsg);\n this.emit('message', userMsg);\n\n // Create assistant message placeholder\n const assistantMsg: AssistantTextMessage = {\n type: 'assistant_text',\n id: makeId(),\n text: '',\n toolCalls: [],\n skillActivations: [],\n kbProposals: [],\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n this._messages.push(assistantMsg);\n this.emit('message', assistantMsg);\n\n this._isStreaming = true;\n this.emit('streaming_start', undefined);\n\n try {\n const response = await this.streamInternal(text, assistantMsg);\n return response;\n } catch (err) {\n // Try reconnection\n if (this.connectAttempt < this.maxReconnectAttempts) {\n return await this.reconnectAndRetry(text, assistantMsg);\n }\n throw err;\n } finally {\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n }\n }\n\n /**\n * Stream a message, returning a ChatStream handle for event-based consumption.\n */\n stream(text: string): ChatStream {\n // Add user message\n const userMsg: ChatMessage = {\n type: 'user',\n id: makeId(),\n text,\n timestamp: new Date().toISOString(),\n };\n this._messages.push(userMsg);\n this.emit('message', userMsg);\n\n this._isStreaming = true;\n this.emit('streaming_start', undefined);\n\n const chatStream = new ChatStream(this.config.serverUrl, {\n message: text,\n session_id: this.sessionId ?? undefined,\n role: this.config.user.role,\n }, this.config.token);\n\n // Track streaming state\n chatStream.on('done', (response) => {\n // Add assistant message to history\n const assistantMsg: AssistantTextMessage = {\n type: 'assistant_text',\n id: makeId(),\n text: response.text,\n toolCalls: response.toolCalls,\n skillActivations: response.skillsUsed,\n kbProposals: response.kbProposals,\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n this._messages.push(assistantMsg);\n this.emit('message', assistantMsg);\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n });\n\n chatStream.on('error', (err) => {\n this._isStreaming = false;\n this.emit('streaming_end', undefined);\n this.emit('error', new Error(err.message));\n });\n\n return chatStream;\n }\n\n private async streamInternal(\n text: string,\n assistantMsg: AssistantTextMessage,\n ): Promise<ChatResponse> {\n const response: ChatResponse = {\n text: '',\n toolCalls: [],\n skillsUsed: [],\n kbProposals: [],\n };\n\n const pendingToolCalls = new Map<string, { toolName: string; parameters: Record<string, unknown> }>();\n\n const stream = streamChat(\n this.config.serverUrl,\n {\n message: text,\n session_id: this.sessionId ?? undefined,\n role: this.config.user.role,\n },\n undefined,\n this.config.token,\n );\n\n for await (const event of stream) {\n switch (event.type) {\n case 'init':\n this.sessionId = event.session_id;\n break;\n case 'text_delta':\n response.text += event.content;\n assistantMsg.text += event.content;\n break;\n case 'tool_call_start': {\n const tc: ToolCallInfo = {\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n status: 'running',\n };\n response.toolCalls.push(tc);\n assistantMsg.toolCalls = [...assistantMsg.toolCalls, tc];\n pendingToolCalls.set(event.tool_id, {\n toolName: event.tool_name,\n parameters: event.parameters,\n });\n break;\n }\n case 'tool_call_result': {\n const existing = response.toolCalls.find((t) => t.toolId === event.tool_id);\n if (existing) {\n existing.status = event.status;\n existing.result = event.result;\n existing.duration_ms = event.duration_ms;\n existing.error = event.error;\n }\n assistantMsg.toolCalls = assistantMsg.toolCalls.map((t) =>\n t.toolId === event.tool_id\n ? { ...t, status: event.status, result: event.result, duration_ms: event.duration_ms, error: event.error }\n : t,\n );\n\n const pending = pendingToolCalls.get(event.tool_id);\n pendingToolCalls.delete(event.tool_id);\n const toolEvent: ToolExecutedEvent = {\n type: 'tool_executed',\n toolName: pending?.toolName ?? '',\n toolId: event.tool_id,\n parameters: pending?.parameters ?? {},\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(toolEvent);\n this.emit('tool_executed', toolEvent);\n break;\n }\n case 'skill_activated': {\n response.skillsUsed.push(event.skill);\n assistantMsg.skillActivations = [...assistantMsg.skillActivations, event.skill];\n const skillEvent: SkillActivatedEvent = {\n type: 'skill_activated',\n skill: event.skill,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(skillEvent);\n this.emit('skill_activated', skillEvent);\n break;\n }\n case 'kb_proposal': {\n const proposal: KBProposalInfo = {\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n };\n response.kbProposals.push(proposal);\n assistantMsg.kbProposals = [...assistantMsg.kbProposals, proposal];\n const kbEvent: KBProposalEvent = {\n type: 'kb_proposal',\n proposal,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(kbEvent);\n this.emit('kb_proposal_received', kbEvent);\n break;\n }\n case 'widget': {\n const widgetEvent: WidgetRenderedEvent = {\n type: 'widget_rendered',\n widgetType: event.widget_type,\n data: event.data,\n timestamp: event.timestamp,\n };\n this._eventBus.processEvent(widgetEvent);\n this.emit('widget_rendered', widgetEvent);\n break;\n }\n case 'error':\n throw new Error(event.message);\n case 'done':\n break;\n default:\n break;\n }\n }\n\n return response;\n }\n\n private async reconnectAndRetry(\n text: string,\n assistantMsg: AssistantTextMessage,\n ): Promise<ChatResponse> {\n this.connectAttempt++;\n this.emit('reconnecting', this.connectAttempt);\n\n // Exponential backoff: 100ms, 200ms, 400ms\n const delay = 100 * Math.pow(2, this.connectAttempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n try {\n await this.connect();\n return await this.streamInternal(text, assistantMsg);\n } catch (err) {\n if (this.connectAttempt < this.maxReconnectAttempts) {\n return this.reconnectAndRetry(text, assistantMsg);\n }\n throw err;\n }\n }\n}\n"],"names":["parseSSELine","line","json","streamChat","serverUrl","request","signal","token","url","headers","response","body","reader","decoder","buffer","done","value","lines","trimmed","event","createSession","user","authHeaders","listSessions","tags","qs","getSessionHistory","sessionId","updateSession","updates","createChatClient","TypedEventEmitter","__publicField","listener","set","data","defaultEntityExtractor","entities","extractFromWidget","extractFromToolParams","widgetType","devices","device","zones","zone","mac","alertId","parameters","WidgetEventBus","extractor","entity","refEvent","fn","fns","ChatStream","handler","key","stream","err","message","toolName","tc","t","proposal","extEvent","msgCounter","makeId","ChatClient","config","e","session","error","text","userMsg","assistantMsg","chatStream","pendingToolCalls","existing","pending","toolEvent","skillEvent","kbEvent","widgetEvent","delay","resolve"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export { ChatWidget } from './components/ChatWidget';
7
+ export type { ChatWidgetProps } from './components/ChatWidget';
8
+ export { useChat } from './hooks/useChat';
9
+ export type { UseChatOptions, UseChatReturn } from './hooks/useChat';
10
+ export { useWidgetEvents } from './hooks/useWidgetEvents';
11
+ export type { UseWidgetEventsReturn } from './hooks/useWidgetEvents';
12
+ export { useSessionHistory } from './hooks/useSessionHistory';
13
+ export type { UseSessionHistoryOptions, UseSessionHistoryReturn } from './hooks/useSessionHistory';
14
+ export { createChatClient, streamChat, createSession, parseSSELine, listSessions, getSessionHistory, updateSession } from './client';
15
+ export type { ChatStreamRequest, SessionInfo, SessionHistoryItem, SessionDetail } from './client';
16
+ export { ChatClient } from './client/ChatClient';
17
+ export type { ChatClientConfig, ClientEvents } from './client/ChatClient';
18
+ export { ChatStream } from './client/ChatStream';
19
+ export type { ChatResponse } from './client/ChatStream';
20
+ export { TypedEventEmitter } from './client/EventEmitter';
21
+ export { WidgetEventBus, defaultEntityExtractor } from './events';
22
+ export type { WidgetEvent, WidgetEventMap, EntityReference, EntityExtractor, AgentDrivenEvent, InteractionEvent, ToolExecutedEvent, SkillActivatedEvent, WidgetRenderedEvent, KBProposalEvent, EntityReferencedEvent, EntityHoveredEvent, EntityUnhoveredEvent, EntityClickedEvent, } from './events';
23
+ export { defaultTheme, applyTheme, mergeTheme } from './theme';
24
+ export type { ChatMessage, UserMessage, AssistantTextMessage, ErrorMessage, ToolCallInfo, KBProposalInfo, ContentBlock, WidgetInfo, ChatTheme, WidgetConfig, WidgetPosition, ChatUser, SSEEvent, ToolCallStatus, } from './types';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGnG,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrI,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGlG,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClE,YAAY,EACV,WAAW,EACX,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG/D,YAAY,EACV,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { ChatTheme } from './types';
2
+ export declare const defaultTheme: ChatTheme;
3
+ /**
4
+ * Apply theme values as CSS custom properties on a DOM element.
5
+ */
6
+ export declare function applyTheme(element: HTMLElement, theme: ChatTheme): void;
7
+ /**
8
+ * Get the merged theme with defaults filled in.
9
+ */
10
+ export declare function mergeTheme(theme?: ChatTheme): Required<ChatTheme>;
11
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,SAY1B,CAAC;AAgBF;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CASvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAGjE"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export interface SSEInitEvent {
7
+ type: 'init';
8
+ session_id: string;
9
+ timestamp: string;
10
+ }
11
+ export interface SSETextDeltaEvent {
12
+ type: 'text_delta';
13
+ content: string;
14
+ timestamp: string;
15
+ }
16
+ export interface SSEToolCallStartEvent {
17
+ type: 'tool_call_start';
18
+ tool_name: string;
19
+ tool_id: string;
20
+ parameters: Record<string, unknown>;
21
+ timestamp: string;
22
+ }
23
+ export interface SSEToolCallResultEvent {
24
+ type: 'tool_call_result';
25
+ tool_id: string;
26
+ status: 'success' | 'error';
27
+ result?: unknown;
28
+ duration_ms?: number;
29
+ error?: string;
30
+ timestamp: string;
31
+ }
32
+ export interface SSESkillActivatedEvent {
33
+ type: 'skill_activated';
34
+ skill: string;
35
+ timestamp: string;
36
+ }
37
+ export interface SSEKBProposalEvent {
38
+ type: 'kb_proposal';
39
+ proposal_id?: string;
40
+ scope: 'org' | 'segment';
41
+ title: string;
42
+ reasoning: string;
43
+ status?: string;
44
+ timestamp: string;
45
+ }
46
+ export interface SSECredentialSavedEvent {
47
+ type: 'credential_saved';
48
+ connection_name: string;
49
+ timestamp: string;
50
+ }
51
+ export interface SSEApprovedEvent {
52
+ type: 'approved';
53
+ resource_type: string;
54
+ preview_id: string;
55
+ timestamp: string;
56
+ }
57
+ export interface SSEAskUserEvent {
58
+ type: 'ask_user';
59
+ ask_id: string;
60
+ questions: AskUserQuestion[];
61
+ timestamp: string;
62
+ }
63
+ export interface AskUserQuestion {
64
+ question: string;
65
+ header: string;
66
+ type: 'choice' | 'text' | 'yesno';
67
+ options?: AskUserQuestionOption[];
68
+ multiSelect?: boolean;
69
+ placeholder?: string;
70
+ }
71
+ export interface AskUserQuestionOption {
72
+ label: string;
73
+ description: string;
74
+ }
75
+ export interface SSESubagentEvent {
76
+ type: 'subagent_event';
77
+ parent_tool_id: string;
78
+ agent_name: string;
79
+ event_type: 'tool_call_start' | 'tool_call_end' | 'thought' | 'error' | 'complete';
80
+ tool_name?: string;
81
+ tool_args?: Record<string, unknown>;
82
+ result?: string;
83
+ text?: string;
84
+ error?: string;
85
+ timestamp: string;
86
+ }
87
+ export interface SSEErrorEvent {
88
+ type: 'error';
89
+ message: string;
90
+ timestamp: string;
91
+ }
92
+ export interface SSEWidgetEvent {
93
+ type: 'widget';
94
+ widget_type: string;
95
+ data: Record<string, unknown>;
96
+ timestamp: string;
97
+ }
98
+ export interface SSEDoneEvent {
99
+ type: 'done';
100
+ timestamp: string;
101
+ }
102
+ export type SSEEvent = SSEInitEvent | SSETextDeltaEvent | SSEToolCallStartEvent | SSEToolCallResultEvent | SSESubagentEvent | SSESkillActivatedEvent | SSEKBProposalEvent | SSECredentialSavedEvent | SSEApprovedEvent | SSEAskUserEvent | SSEWidgetEvent | SSEErrorEvent | SSEDoneEvent;
103
+ export type ToolCallStatus = 'running' | 'success' | 'error';
104
+ export interface SubagentEventInfo {
105
+ agentName: string;
106
+ eventType: 'tool_call_start' | 'tool_call_end' | 'thought' | 'error' | 'complete';
107
+ toolName?: string;
108
+ toolArgs?: Record<string, unknown>;
109
+ result?: string;
110
+ text?: string;
111
+ error?: string;
112
+ timestamp: string;
113
+ }
114
+ export interface ToolCallInfo {
115
+ toolId: string;
116
+ toolName: string;
117
+ parameters: Record<string, unknown>;
118
+ status: ToolCallStatus;
119
+ result?: unknown;
120
+ duration_ms?: number;
121
+ error?: string;
122
+ subagentEvents?: SubagentEventInfo[];
123
+ }
124
+ export interface UserMessage {
125
+ type: 'user';
126
+ id: string;
127
+ text: string;
128
+ timestamp: string;
129
+ }
130
+ export interface AssistantTextMessage {
131
+ type: 'assistant_text';
132
+ id: string;
133
+ text: string;
134
+ toolCalls: ToolCallInfo[];
135
+ skillActivations: string[];
136
+ kbProposals: KBProposalInfo[];
137
+ widgets: WidgetInfo[];
138
+ contentBlocks: ContentBlock[];
139
+ timestamp: string;
140
+ }
141
+ export interface ErrorMessage {
142
+ type: 'error';
143
+ id: string;
144
+ message: string;
145
+ timestamp: string;
146
+ }
147
+ export type ChatMessage = UserMessage | AssistantTextMessage | ErrorMessage;
148
+ export interface KBProposalInfo {
149
+ scope: 'org' | 'segment';
150
+ title: string;
151
+ reasoning: string;
152
+ }
153
+ export interface WidgetInfo {
154
+ widgetType: string;
155
+ data: Record<string, unknown>;
156
+ }
157
+ export type AskUserStatus = 'pending' | 'submitted';
158
+ export interface AskUserBlock {
159
+ type: 'ask_user';
160
+ askId: string;
161
+ questions: AskUserQuestion[];
162
+ status: AskUserStatus;
163
+ answers?: Record<string, string>;
164
+ }
165
+ export type ContentBlock = {
166
+ type: 'text';
167
+ text: string;
168
+ } | {
169
+ type: 'widget';
170
+ widgetType: string;
171
+ data: Record<string, unknown>;
172
+ } | {
173
+ type: 'tool_calls';
174
+ calls: ToolCallInfo[];
175
+ } | AskUserBlock;
176
+ export interface ChatUser {
177
+ id: string;
178
+ role?: string;
179
+ }
180
+ export interface ChatTheme {
181
+ primaryColor?: string;
182
+ backgroundColor?: string;
183
+ fontFamily?: string;
184
+ fontSize?: string;
185
+ borderRadius?: string;
186
+ userBubbleColor?: string;
187
+ agentBubbleColor?: string;
188
+ toolCallColor?: string;
189
+ headerText?: string;
190
+ placeholder?: string;
191
+ emptyStateText?: string;
192
+ }
193
+ export type WidgetPosition = 'right' | 'bottom' | 'floating' | 'inline';
194
+ export interface WidgetConfig {
195
+ serverUrl: string;
196
+ user: ChatUser;
197
+ /** Return a Bearer token (API key or JWT) for authenticated requests. */
198
+ getToken?: () => string | null | undefined;
199
+ theme?: ChatTheme;
200
+ position?: WidgetPosition;
201
+ defaultOpen?: boolean;
202
+ onToolCall?: (call: ToolCallInfo) => void;
203
+ onKBProposal?: (proposal: KBProposalInfo) => void;
204
+ /** Callback for all widget events (agent-driven + interaction). */
205
+ onEvent?: (event: import('./events/types').WidgetEvent) => void;
206
+ /** Custom entity extractors. If provided, replaces the default extractor. */
207
+ entityExtractors?: Array<import('./events/types').EntityExtractor>;
208
+ /** Enable session history drawer. */
209
+ historyEnabled?: boolean;
210
+ /** Show the message input bar. Defaults to true. */
211
+ showInput?: boolean;
212
+ /** Session type — controls which skills, tools, KB docs load into this session. */
213
+ sessionType?: string;
214
+ /** Specific deployment ID to load instead of the active deployment. */
215
+ deployId?: string;
216
+ /** Auto-send this message when the widget mounts. Sent exactly once. */
217
+ initialMessage?: string;
218
+ /** Load an existing session on mount (read-only history view). Takes precedence over initialMessage. */
219
+ resumeSessionId?: string;
220
+ /** Called when the SSE stream ends (agent finishes responding). */
221
+ onStreamEnd?: () => void;
222
+ /** Called when a session ID is received from the server (first stream init). */
223
+ onSessionCreated?: (sessionId: string) => void;
224
+ }
225
+ export interface ChatState {
226
+ messages: ChatMessage[];
227
+ sessionId: string | null;
228
+ isStreaming: boolean;
229
+ error: string | null;
230
+ activeToolCalls: ToolCallInfo[];
231
+ /** True when viewing a loaded historical session (read-only) */
232
+ isHistorical: boolean;
233
+ }
234
+ export type ChatAction = {
235
+ type: 'SEND_MESSAGE';
236
+ text: string;
237
+ } | {
238
+ type: 'STREAM_INIT';
239
+ sessionId: string;
240
+ } | {
241
+ type: 'STREAM_TEXT_DELTA';
242
+ content: string;
243
+ } | {
244
+ type: 'STREAM_TOOL_CALL_START';
245
+ toolId: string;
246
+ toolName: string;
247
+ parameters: Record<string, unknown>;
248
+ } | {
249
+ type: 'STREAM_TOOL_CALL_RESULT';
250
+ toolId: string;
251
+ status: 'success' | 'error';
252
+ result?: unknown;
253
+ duration_ms?: number;
254
+ error?: string;
255
+ } | {
256
+ type: 'STREAM_SUBAGENT_EVENT';
257
+ parentToolId: string;
258
+ event: SubagentEventInfo;
259
+ } | {
260
+ type: 'STREAM_SKILL_ACTIVATED';
261
+ skill: string;
262
+ } | {
263
+ type: 'STREAM_KB_PROPOSAL';
264
+ scope: 'org' | 'segment';
265
+ title: string;
266
+ reasoning: string;
267
+ } | {
268
+ type: 'STREAM_WIDGET';
269
+ widgetType: string;
270
+ data: Record<string, unknown>;
271
+ } | {
272
+ type: 'STREAM_CREDENTIAL_SAVED';
273
+ connectionName: string;
274
+ } | {
275
+ type: 'STREAM_APPROVED';
276
+ resourceType: string;
277
+ previewId: string;
278
+ } | {
279
+ type: 'STREAM_ASK_USER';
280
+ askId: string;
281
+ questions: AskUserQuestion[];
282
+ } | {
283
+ type: 'ASK_USER_SUBMITTED';
284
+ askId: string;
285
+ answers: Record<string, string>;
286
+ } | {
287
+ type: 'STREAM_ERROR';
288
+ message: string;
289
+ } | {
290
+ type: 'STREAM_DONE';
291
+ } | {
292
+ type: 'LOAD_HISTORY';
293
+ sessionId: string;
294
+ messages: ChatMessage[];
295
+ } | {
296
+ type: 'RESET';
297
+ };
298
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { WidgetConfig } from './types';
2
+ import { ChatClient } from './client/ChatClient';
3
+ /**
4
+ * Initialize the chat widget in a non-React environment.
5
+ * Call PlatformChat.init(config) or PlatformChat.mount(config) to render the widget.
6
+ */
7
+ declare function init(config: WidgetConfig & {
8
+ container?: string;
9
+ }): void;
10
+ /**
11
+ * Destroy the chat widget and clean up.
12
+ */
13
+ declare function destroy(): void;
14
+ export declare const PlatformChat: {
15
+ init: typeof init;
16
+ mount: typeof init;
17
+ destroy: typeof destroy;
18
+ ChatClient: typeof ChatClient;
19
+ };
20
+ export default PlatformChat;
21
+ //# sourceMappingURL=umd-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"umd-entry.d.ts","sourceRoot":"","sources":["../src/umd-entry.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AASjD;;;GAGG;AACH,iBAAS,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsBjE;AAED;;GAEG;AACH,iBAAS,OAAO,IAAI,IAAI,CAOvB;AAED,eAAO,MAAM,YAAY;;;;;CAA6C,CAAC;AACvE,eAAe,YAAY,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@amodalai/chat-widget",
3
+ "version": "0.1.0",
4
+ "description": "Embeddable chat widget for Amodal agents",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/amodalai/amodal.git",
9
+ "directory": "packages/chat-widget"
10
+ },
11
+ "homepage": "https://github.com/amodalai/amodal",
12
+ "bugs": {
13
+ "url": "https://github.com/amodalai/amodal/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "dist/chat-widget.js",
17
+ "module": "dist/chat-widget.js",
18
+ "types": "dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/chat-widget.js",
23
+ "default": "./dist/chat-widget.js"
24
+ },
25
+ "./client": {
26
+ "types": "./dist/client/index.d.ts",
27
+ "import": "./dist/client.js",
28
+ "default": "./dist/client.js"
29
+ },
30
+ "./style.css": "./dist/chat-widget.css"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "peerDependencies": {
36
+ "react": "^18.0.0 || ^19.0.0",
37
+ "react-dom": "^18.0.0 || ^19.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "@testing-library/jest-dom": "^6.6.3",
41
+ "@testing-library/react": "^16.1.0",
42
+ "@testing-library/user-event": "^14.5.2",
43
+ "@types/react": "^19.0.0",
44
+ "@types/react-dom": "^19.0.0",
45
+ "@vitejs/plugin-react": "^4.3.4",
46
+ "jsdom": "^25.0.1",
47
+ "msw": "^2.7.0",
48
+ "react": "^19.0.0",
49
+ "react-dom": "^19.0.0",
50
+ "typescript": "^5.7.3",
51
+ "vite": "^6.0.5",
52
+ "vite-plugin-dts": "^4.3.0",
53
+ "vitest": "^3.1.1"
54
+ },
55
+ "scripts": {
56
+ "dev": "vite",
57
+ "build": "tsc --noEmit && vite build",
58
+ "typecheck": "tsc --noEmit",
59
+ "test": "vitest run",
60
+ "lint": "eslint src/"
61
+ }
62
+ }