dooers-agents-client 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.
- package/dist/main.cjs +176 -3
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.cts +65 -3
- package/dist/main.d.ts +65 -3
- package/dist/main.js +175 -4
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers/api-messages-url-to-ws.ts","../src/version.ts","../src/types.ts","../src/client.ts","../src/store.ts","../src/provider.tsx","../src/hooks/use-analytics.ts","../src/hooks/use-audio-recorder.ts","../src/hooks/use-connection.ts","../src/hooks/use-feedback.ts","../src/hooks/use-form.ts","../src/hooks/use-form-file-upload.ts","../src/hooks/use-message.ts","../src/hooks/use-settings.ts","../src/hooks/use-settings-file-upload.ts","../src/hooks/use-thread.ts","../src/hooks/use-threads.ts","../src/hooks/use-upload.ts"],"names":["createStore","createContext","useRef","useEffect","useMemo","useContext","useZustandStore","useShallow","useCallback","useState"],"mappings":"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","file":"main.cjs","sourcesContent":["/**\n * Browser `WebSocket` and Node's `WebSocket` require `ws:` / `wss:` URLs.\n * Agent \"API Messages URL\" is often stored as `https://host/ws` — normalize before connecting.\n */\nexport function apiMessagesUrlToWebSocketUrl(url: string): string {\n const t = url.trim()\n if (!t) {\n throw new Error('API Messages URL is empty')\n }\n if (/^wss:\\/\\//i.test(t) || /^ws:\\/\\//i.test(t)) {\n return t\n }\n if (/^https:\\/\\//i.test(t)) {\n return `wss://${t.slice('https://'.length)}`\n }\n if (/^http:\\/\\//i.test(t)) {\n return `ws://${t.slice('http://'.length)}`\n }\n throw new Error('API Messages URL must start with http://, https://, ws://, or wss://')\n}\n","/** Must match `package.json` `\"version\"` (connect frame telemetry). */\nexport const PACKAGE_VERSION = '0.13.0' as const\n","// --- Send content parts (client → server, used in send()) ---\n\nexport interface TextSendPart {\n type: 'text'\n text: string\n}\n\nexport interface AudioSendPart {\n type: 'audio'\n refId: string\n duration?: number\n /** Original name from upload; required for durable blob keys when the server resolves ``ref_id`` from storage. */\n filename?: string\n mimeType?: string\n /** When the upload response included a URL (persisted attachment). */\n url?: string\n}\n\nexport interface ImageSendPart {\n type: 'image'\n refId: string\n filename?: string\n mimeType?: string\n /** When the upload response included a fetchable URL (persisted chat attachment). */\n url?: string\n}\n\nexport interface DocumentSendPart {\n type: 'document'\n refId: string\n filename?: string\n mimeType?: string\n /** When the upload response included a URL (persisted attachment). */\n url?: string\n}\n\nexport type SendContentPart = TextSendPart | AudioSendPart | ImageSendPart | DocumentSendPart\n\n// --- Display content parts (server → client, rendered in chat) ---\n\nexport interface TextDisplayPart {\n type: 'text'\n text: string\n}\n\nexport interface AudioDisplayPart {\n type: 'audio'\n url?: string\n mimeType?: string\n duration?: number\n filename?: string\n /** Upload ref when present on the wire (replay / blob key correlation). */\n refId?: string\n}\n\nexport interface ImageDisplayPart {\n type: 'image'\n url?: string\n mimeType?: string\n width?: number\n height?: number\n alt?: string\n filename?: string\n refId?: string\n}\n\nexport interface DocumentDisplayPart {\n type: 'document'\n url?: string\n filename?: string\n mimeType?: string\n sizeBytes?: number\n refId?: string\n}\n\nexport type DisplayContentPart =\n | TextDisplayPart\n | AudioDisplayPart\n | ImageDisplayPart\n | DocumentDisplayPart\n\n// Backward-compatible aliases\nexport type ContentPart = SendContentPart\nexport type TextPart = TextSendPart\nexport type ImagePart = ImageSendPart\nexport type DocumentPart = DocumentSendPart\nexport type AudioPart = AudioSendPart\n\n// --- Form element types (content parts for form events) ---\n\nexport interface FormOption {\n value: string\n label: string\n}\n\nexport interface FormTextElement {\n type: 'text_input'\n name: string\n label: string\n order: number\n required: boolean\n disabled: boolean\n placeholder: string | null\n default: string | null\n inputType: 'text' | 'password' | 'email' | 'number'\n}\n\nexport interface FormTextareaElement {\n type: 'textarea_input'\n name: string\n label: string\n order: number\n required: boolean\n disabled: boolean\n placeholder: string | null\n default: string | null\n rows: number | null\n}\n\nexport interface FormSelectElement {\n type: 'select_input'\n name: string\n label: string\n options: FormOption[]\n order: number\n required: boolean\n disabled: boolean\n default: string | null\n placeholder: string | null\n}\n\nexport interface FormRadioElement {\n type: 'radio_input'\n name: string\n label: string\n options: FormOption[]\n order: number\n required: boolean\n disabled: boolean\n default: string | null\n variant: 'native' | 'button'\n}\n\nexport interface FormCheckboxElement {\n type: 'checkbox_input'\n name: string\n label: string\n options: FormOption[]\n order: number\n required: boolean\n disabled: boolean\n default: string[] | null\n variant: 'native' | 'button'\n}\n\nexport interface FormFileElement {\n type: 'file_input'\n name: string\n label: string\n uploadUrl: string\n order: number\n required: boolean\n disabled: boolean\n accept: string | null\n multiple: boolean\n}\n\nexport type FormElement =\n | FormTextElement\n | FormTextareaElement\n | FormSelectElement\n | FormRadioElement\n | FormCheckboxElement\n | FormFileElement\n\nexport type FormSize = 'small' | 'medium' | 'large'\n\nexport interface FormEventData {\n message: string\n elements: FormElement[]\n submitLabel: string\n cancelLabel: string\n size: FormSize\n}\n\nexport interface FormResponseEventData {\n formEventId: string\n cancelled: boolean\n values: Record<string, unknown>\n}\n\nexport type Actor = 'user' | 'assistant' | 'system' | 'tool'\nexport type EventType =\n | 'message'\n | 'reasoning'\n | 'run.started'\n | 'run.finished'\n | 'tool.call'\n | 'tool.result'\n | 'tool.transaction'\n | 'form'\n | 'form.response'\nexport type RunStatus = 'running' | 'succeeded' | 'failed' | 'canceled'\nexport type ConnectionStatus = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n\nexport interface User {\n userId: string\n userName?: string | null\n userEmail?: string | null\n userMobileNumber?: string | null\n userWhatsappNumber?: string | null\n identityIds?: string[]\n systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n agentId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | null\n metadata: Record<string, unknown> | null\n createdAt: string\n updatedAt: string\n lastEventAt: string\n}\n\nexport interface ThreadEvent {\n id: string\n threadId: string\n runId: string | null\n type: EventType\n actor: Actor\n author: string | null\n user?: User\n content?: DisplayContentPart[]\n data?: Record<string, unknown>\n createdAt: string\n clientEventId?: string\n}\n\nexport interface Run {\n id: string\n threadId: string\n agentId: string | null\n status: RunStatus\n startedAt: string\n endedAt: string | null\n error: string | null\n}\n\n// --- Settings ---\n\nexport type SettingsFieldType =\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'password'\n | 'email'\n | 'date'\n | 'image'\n | 'file'\n | 'file_multi'\n\nexport type SettingsFieldVisibility = 'internal' | 'creator' | 'user'\n\nexport interface SettingsSelectOption {\n value: string\n label: string\n}\n\nexport interface SettingsField {\n id: string\n type: SettingsFieldType\n label: string\n required: boolean\n readonly: boolean\n user_editable?: boolean\n visibility: SettingsFieldVisibility\n value: unknown\n placeholder: string | null\n options: SettingsSelectOption[] | null\n min: number | null\n max: number | null\n rows: number | null\n src: string | null\n width: number | null\n height: number | null\n uploadUrl: string | null\n accept: string | null\n}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\n visibility: SettingsFieldVisibility\n}\n\nexport type SettingsItem = SettingsField | SettingsFieldGroup\n\nexport function isSettingsFieldGroup(item: SettingsItem): item is SettingsFieldGroup {\n return 'fields' in item && Array.isArray((item as SettingsFieldGroup).fields)\n}\n\n// --- Feedback ---\n\nexport type FeedbackType = 'like' | 'dislike'\nexport type FeedbackTarget = 'event' | 'run' | 'thread'\n\n// --- Analytics ---\n\nexport interface AnalyticsEvent {\n event: string\n timestamp: string\n agentId: string\n threadId: string | null\n userId: string | null\n runId: string | null\n eventId: string | null\n data: Record<string, unknown> | null\n}\n\nexport interface ThreadState {\n thread: Thread | null\n events: ThreadEvent[]\n runs: Run[]\n isLoading: boolean\n isWaiting: boolean\n}\n\n// --- Wire → Public transforms ---\n\nimport type {\n WireAnalyticsEvent,\n WireC2S_ContentPart,\n WireRun,\n WireS2C_ContentPart,\n WireS2C_FormElement,\n WireSettingsField,\n WireSettingsFieldGroup,\n WireSettingsItem,\n WireThread,\n WireThreadEvent,\n WireUser,\n} from './protocol/models'\n\nexport function toUser(w: WireUser): User\nexport function toUser(w: WireUser | undefined): User | undefined\nexport function toUser(w?: WireUser): User | undefined {\n if (!w) return undefined\n return {\n userId: w.user_id,\n userName: w.user_name,\n userEmail: w.user_email,\n userMobileNumber: w.user_mobile_number,\n userWhatsappNumber: w.user_whatsapp_number,\n identityIds: w.identity_ids,\n systemRole: w.system_role,\n organizationRole: w.organization_role,\n workspaceRole: w.workspace_role,\n }\n}\n\nexport function toThread(w: WireThread): Thread {\n return {\n id: w.id,\n agentId: w.agent_id,\n organizationId: w.organization_id,\n workspaceId: w.workspace_id,\n owner: toUser(w.owner),\n users: w.users.map((u) => toUser(u)),\n title: w.title,\n metadata: w.metadata ?? null,\n createdAt: w.created_at,\n updatedAt: w.updated_at,\n lastEventAt: w.last_event_at,\n }\n}\n\nexport function toDisplayContentPart(w: WireS2C_ContentPart): DisplayContentPart {\n switch (w.type) {\n case 'text':\n return { type: 'text', text: w.text }\n case 'audio':\n return {\n type: 'audio',\n url: w.url,\n mimeType: w.mime_type,\n duration: w.duration,\n filename: w.filename,\n ...(w.ref_id ? { refId: w.ref_id } : {}),\n }\n case 'image':\n return {\n type: 'image',\n url: w.url,\n mimeType: w.mime_type,\n width: w.width,\n height: w.height,\n alt: w.alt,\n filename: w.filename,\n ...(w.ref_id ? { refId: w.ref_id } : {}),\n }\n case 'document':\n return {\n type: 'document',\n url: w.url,\n filename: w.filename,\n mimeType: w.mime_type,\n sizeBytes: w.size_bytes,\n ...(w.ref_id ? { refId: w.ref_id } : {}),\n }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\n\nexport function toFormElement(w: WireS2C_FormElement): FormElement {\n const base = {\n name: w.name,\n label: w.label,\n order: w.order ?? 0,\n required: w.required ?? false,\n disabled: w.disabled ?? false,\n }\n switch (w.type) {\n case 'text_input':\n return {\n ...base,\n type: 'text_input',\n placeholder: w.placeholder ?? null,\n default: w.default ?? null,\n inputType: w.input_type ?? 'text',\n }\n case 'textarea_input':\n return {\n ...base,\n type: 'textarea_input',\n placeholder: w.placeholder ?? null,\n default: w.default ?? null,\n rows: w.rows ?? null,\n }\n case 'select_input':\n return {\n ...base,\n type: 'select_input',\n options: w.options,\n default: w.default ?? null,\n placeholder: w.placeholder ?? null,\n }\n case 'radio_input':\n return {\n ...base,\n type: 'radio_input',\n options: w.options,\n default: w.default ?? null,\n variant: w.variant ?? 'native',\n }\n case 'checkbox_input':\n return {\n ...base,\n type: 'checkbox_input',\n options: w.options,\n default: w.default ?? null,\n variant: w.variant ?? 'native',\n }\n case 'file_input':\n return {\n ...base,\n type: 'file_input',\n uploadUrl: w.upload_url,\n accept: w.accept ?? null,\n multiple: w.multiple ?? false,\n }\n }\n}\n\nexport function toFormEventData(data: Record<string, unknown>): FormEventData {\n const elements = (data.elements as WireS2C_FormElement[]) ?? []\n return {\n message: (data.message as string) ?? '',\n elements: elements.map(toFormElement),\n submitLabel: (data.submit_label as string) ?? 'Send',\n cancelLabel: (data.cancel_label as string) ?? 'Cancel',\n size: ((data.size as string) ?? 'medium') as FormSize,\n }\n}\n\nexport function toFormResponseEventData(data: Record<string, unknown>): FormResponseEventData {\n return {\n formEventId: (data.form_event_id as string) ?? '',\n cancelled: (data.cancelled as boolean) ?? false,\n values: (data.values as Record<string, unknown>) ?? {},\n }\n}\n\nexport function toThreadEvent(w: WireThreadEvent): ThreadEvent {\n return {\n id: w.id,\n threadId: w.thread_id,\n runId: w.run_id,\n type: w.type,\n actor: w.actor,\n author: w.author,\n user: toUser(w.user),\n content: w.content?.map(toDisplayContentPart),\n data: w.data,\n createdAt: w.created_at,\n clientEventId: w.client_event_id,\n }\n}\n\nexport function toRun(w: WireRun): Run {\n return {\n id: w.id,\n threadId: w.thread_id,\n agentId: w.agent_id,\n status: w.status,\n startedAt: w.started_at,\n endedAt: w.ended_at,\n error: w.error,\n }\n}\n\n// --- Settings transforms ---\n\nexport function toSettingsField(w: WireSettingsField): SettingsField {\n return {\n id: w.id,\n type: w.type as SettingsFieldType,\n label: w.label,\n required: w.required,\n readonly: w.readonly,\n user_editable: w.user_editable ?? true,\n visibility: w.visibility ?? 'user',\n value: w.value,\n placeholder: w.placeholder,\n options: w.options,\n min: w.min,\n max: w.max,\n rows: w.rows,\n src: w.src,\n width: w.width,\n height: w.height,\n uploadUrl: w.upload_url,\n accept: w.accept,\n }\n}\n\nexport function toSettingsItem(w: WireSettingsItem): SettingsItem {\n if ('fields' in w && Array.isArray((w as WireSettingsFieldGroup).fields)) {\n const g = w as WireSettingsFieldGroup\n return {\n id: g.id,\n label: g.label,\n fields: g.fields.map(toSettingsField),\n collapsible: g.collapsible,\n visibility: g.visibility ?? 'user',\n }\n }\n return toSettingsField(w as WireSettingsField)\n}\n\n// --- Analytics transforms ---\n\nexport function toAnalyticsEvent(w: WireAnalyticsEvent): AnalyticsEvent {\n return {\n event: w.event,\n timestamp: w.timestamp,\n agentId: w.agent_id,\n threadId: w.thread_id,\n userId: w.user_id,\n runId: w.run_id,\n eventId: w.event_id,\n data: w.data,\n }\n}\n\n// --- Public → Wire transforms (for sending content) ---\n\nexport function toWireContentPart(p: SendContentPart): WireC2S_ContentPart {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio': {\n const w: {\n type: 'audio'\n ref_id: string\n duration?: number\n filename?: string\n mime_type?: string\n url?: string\n } = {\n type: 'audio',\n ref_id: p.refId,\n }\n if (p.duration != null) w.duration = p.duration\n if (p.filename?.trim()) w.filename = p.filename.trim()\n if (p.mimeType?.trim()) w.mime_type = p.mimeType.trim()\n if (p.url) w.url = p.url\n return w\n }\n case 'image': {\n const w: {\n type: 'image'\n ref_id: string\n filename?: string\n mime_type?: string\n url?: string\n } = {\n type: 'image',\n ref_id: p.refId,\n }\n if (p.filename?.trim()) w.filename = p.filename.trim()\n if (p.mimeType?.trim()) w.mime_type = p.mimeType.trim()\n if (p.url) w.url = p.url\n return w\n }\n case 'document': {\n const w: {\n type: 'document'\n ref_id: string\n filename?: string\n mime_type?: string\n url?: string\n } = {\n type: 'document',\n ref_id: p.refId,\n }\n if (p.filename?.trim()) w.filename = p.filename.trim()\n if (p.mimeType?.trim()) w.mime_type = p.mimeType.trim()\n if (p.url) w.url = p.url\n return w\n }\n }\n}\n","import { apiMessagesUrlToWebSocketUrl } from './helpers/api-messages-url-to-ws'\nimport { PACKAGE_VERSION } from './version'\nimport type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart, WireSettingsItem } from './protocol/models'\nimport type { AgentActions } from './store'\nimport type { DisplayContentPart, SendContentPart, SettingsItem, ThreadEvent } from './types'\nimport {\n toAnalyticsEvent,\n toRun,\n toSettingsItem,\n toThread,\n toThreadEvent,\n toWireContentPart,\n} from './types'\n\nconst MAX_RECONNECT_ATTEMPTS = 5\nconst RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000]\nconst SEND_MESSAGE_TIMEOUT = 30_000\nconst PING_INTERVAL_MS = 30_000\n\n/** Multipart filename for ``Blob`` uploads so server blob keys match WebSocket ``filename``. */\nfunction blobPartFilename(blob: Blob, override?: string): string {\n const o = (override ?? '').trim()\n if (o) return o\n const t = (blob.type || '').toLowerCase()\n if (t.includes('webm')) return 'recording.webm'\n if (t.includes('ogg')) return 'recording.ogg'\n if (t.includes('mpeg') || t.includes('mp3')) return 'recording.mp3'\n if (t.includes('mp4') || t.includes('m4a') || t.includes('aac')) return 'recording.m4a'\n if (t.startsWith('audio/')) return `recording.${t.split('/')[1]?.split('+')[0] || 'bin'}`\n return 'recording.bin'\n}\n\nasync function readHttpErrorMessage(response: Response): Promise<string> {\n const raw = (await response.text().catch(() => '')) || ''\n const trimmed = raw.trim()\n if (!trimmed) {\n return `Upload failed: ${response.status} ${response.statusText}`.trim()\n }\n try {\n const j = JSON.parse(trimmed) as { detail?: unknown }\n const d = j.detail\n if (typeof d === 'string') return d\n if (Array.isArray(d) && d.length > 0) {\n const first = d[0] as { msg?: string }\n if (first && typeof first.msg === 'string') return first.msg\n }\n } catch {\n /* use body */\n }\n return trimmed.length > 300 ? `${trimmed.slice(0, 300)}…` : trimmed\n}\n\nexport interface AgentConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n userMobileNumber?: string\n userWhatsappNumber?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n channel?: string\n channelMeta?: Record<string, unknown>\n}\n\nexport type OnErrorCallback = (error: { code: string; message: string; frameType: string }) => void\n\nexport interface UploadResult {\n refId: string\n mimeType: string\n filename: string\n sizeBytes: number\n /** Present when the template persisted the file (HTTP(S) or null if not applicable). */\n publicUrl?: string | null\n}\n\nexport interface PublicSettingsSchemaResult {\n version: string\n fields: SettingsItem[]\n}\n\n/**\n * Talks to the agent messages server without an agent session (no `connect` frame).\n * Use for public/bootstrap operations allowed before an {@link AgentClient} is connected.\n */\nexport class AgentServerClient {\n private readonly wsUrl: string\n\n constructor(apiMessagesUrl: string) {\n this.wsUrl = apiMessagesUrlToWebSocketUrl(apiMessagesUrl)\n }\n\n /**\n * Opens a short-lived WebSocket, requests `settings.public_schema`, and returns the public field\n * list. Closes the socket when done.\n */\n fetchPublicSettingsSchema(options?: { timeoutMs?: number }): Promise<PublicSettingsSchemaResult> {\n const timeoutMs = options?.timeoutMs ?? 15_000\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(this.wsUrl)\n const frameId = crypto.randomUUID()\n let settled = false\n\n const finish = (fn: () => void) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n try {\n ws.close()\n } catch {\n /* ignore */\n }\n fn()\n }\n\n const timer = setTimeout(() => {\n finish(() => reject(new Error('AgentServerClient.fetchPublicSettingsSchema: timeout')))\n }, timeoutMs)\n\n ws.onopen = () => {\n ws.send(\n JSON.stringify({\n id: frameId,\n type: 'settings.public_schema',\n payload: {},\n })\n )\n }\n\n ws.onmessage = (ev: MessageEvent) => {\n let msg: {\n id?: string\n type?: string\n payload?: {\n ack_id?: string\n ok?: boolean\n error?: { code?: string; message?: string }\n schema?: { version?: string; fields?: WireSettingsItem[] }\n }\n }\n try {\n msg = JSON.parse(ev.data as string)\n } catch {\n return\n }\n\n if (msg.type === 'ack' && msg.payload?.ack_id === frameId) {\n if (msg.payload?.ok === false) {\n finish(() =>\n reject(\n new Error(\n msg.payload?.error?.message ??\n 'AgentServerClient.fetchPublicSettingsSchema: request rejected'\n )\n )\n )\n }\n return\n }\n\n if (msg.type === 'settings.public_schema.result' && msg.id === frameId) {\n const raw = msg.payload?.schema as\n | { version?: string; fields?: WireSettingsItem[] }\n | undefined\n const fieldsWire = raw?.fields ?? []\n const fields = fieldsWire.map((w) => toSettingsItem(w))\n finish(() =>\n resolve({\n version: typeof raw?.version === 'string' ? raw.version : '1.0',\n fields,\n })\n )\n }\n }\n\n ws.onerror = () => {\n finish(() =>\n reject(new Error('AgentServerClient.fetchPublicSettingsSchema: WebSocket error'))\n )\n }\n\n ws.onclose = (ev) => {\n if (settled) return\n finish(() =>\n reject(\n new Error(\n `AgentServerClient.fetchPublicSettingsSchema: connection closed (${ev.code})${ev.reason ? ` ${ev.reason}` : ''}`\n )\n )\n )\n }\n })\n }\n}\n\nexport class AgentClient {\n private ws: WebSocket | null = null\n private callbacks: AgentActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private httpBaseUrl = ''\n /**\n * Explicit HTTP base for resolving relative content URLs (e.g. `/audio/<id>`).\n * When set (from the agent's canonical `hostUrl`), it takes precedence over\n * deriving the base from the WS URL — which cannot know the Load Balancer\n * path prefix (`/<agent-seg>`) and would otherwise drop it.\n */\n private httpBaseUrlOverride: string | undefined\n private agentId = ''\n /** Mirrors ``AgentProvider`` ``agentId`` so HTTP uploads work before WS ``connect`` completes. */\n private uploadAgentId = ''\n /** Current chat thread id for ``POST /uploads`` (aligns GCS path with ``hydrate_thread_events``). */\n private uploadThreadId = ''\n /** Optional run id for ``POST /uploads`` (metadata only). */\n private uploadRunId = ''\n private uploadUrl: string | undefined\n private config: AgentConnectionConfig = {\n organizationId: '',\n workspaceId: '',\n userId: '',\n channel: 'dooers-platform',\n }\n\n private connectFrameId = ''\n private isIntentionallyClosed = false\n private reconnectAttempts = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n\n // Refcounted subscriptions\n private subscriptionRefs = new Map<string, number>()\n\n // Track optimistic events for reconciliation\n private pendingOptimistic = new Map<string, { threadId: string; clientEventId: string }>()\n\n // Pending message promises — keyed by outbound frame id (same as client_event_id for sends).\n private pendingMessages = new Map<\n string,\n {\n resolve: (value: { threadId: string }) => void\n reject: (reason: Error) => void\n timer: ReturnType<typeof setTimeout>\n }\n >()\n\n // Track last event ID per thread for gap recovery on reconnect\n private lastEventIds = new Map<string, string>()\n\n // Pagination\n private lastThreadListCursor: string | null = null\n private isLoadingMore = false\n\n // Event pagination cursors per thread\n private eventPaginationCursors = new Map<string, string | null>()\n\n /** Active settings subscription — restored after reconnect. */\n private settingsSubscription: {\n audience: 'creator' | 'user'\n agentOwnerUserId: string | null\n } | null = null\n\n private pingTimer: ReturnType<typeof setInterval> | null = null\n\n constructor(callbacks: AgentActions) {\n this.callbacks = callbacks\n }\n\n setOnError(cb: OnErrorCallback | null) {\n this.onError = cb\n }\n\n setUploadUrl(url: string | undefined) {\n this.uploadUrl = url\n }\n\n /**\n * Set (or clear) the explicit HTTP base used to resolve relative content URLs.\n * Pass the agent's canonical `hostUrl` (base incl. LB seg, no message path).\n * Takes effect immediately and persists across reconnects.\n */\n setHttpBaseUrl(url: string | undefined) {\n const normalized = url?.trim().replace(/\\/+$/, '')\n this.httpBaseUrlOverride = normalized || undefined\n if (this.httpBaseUrlOverride) {\n this.httpBaseUrl = this.httpBaseUrlOverride\n }\n }\n\n /** Sync from ``AgentProvider`` ``agentId``; used for ``POST /uploads`` ``agent_id`` (non-WS). */\n setUploadAgentId(agentId: string | undefined) {\n this.uploadAgentId = (agentId ?? '').trim()\n }\n\n /** Sync active thread id for chat uploads (must match persisted thread for signed URL keys). */\n setUploadThreadId(threadId: string | undefined) {\n this.uploadThreadId = (threadId ?? '').trim()\n }\n\n setUploadRunId(runId: string | undefined) {\n this.uploadRunId = (runId ?? '').trim()\n }\n\n /**\n * Merge connection metadata without tearing down the WebSocket.\n * Use for handshake token refresh and identity/role updates on an open session.\n */\n updateConnectionConfig(config: Partial<AgentConnectionConfig>) {\n this.config = { ...this.config, ...config }\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN\n }\n\n async upload(file: File | Blob, options?: { filename?: string }): Promise<UploadResult> {\n if (!this.uploadUrl) {\n throw new Error('uploadUrl not configured')\n }\n\n const aid = (this.uploadAgentId || this.agentId || '').trim()\n if (!aid) {\n throw new Error('agentId is required for upload (set AgentProvider agentId)')\n }\n\n const formData = new FormData()\n if (file instanceof File) {\n const partName = options?.filename?.trim() || file.name.trim() || 'upload'\n formData.append('file', file, partName)\n } else {\n formData.append('file', file, blobPartFilename(file, options?.filename))\n }\n formData.append('agent_id', aid)\n const tid = this.uploadThreadId.trim()\n if (tid) {\n formData.append('thread_id', tid)\n }\n const rid = this.uploadRunId.trim()\n if (rid) {\n formData.append('run_id', rid)\n }\n\n const headers: Record<string, string> = {}\n if (this.config.authToken) {\n headers.Authorization = `Bearer ${this.config.authToken}`\n }\n\n const response = await fetch(this.uploadUrl, {\n method: 'POST',\n body: formData,\n headers,\n })\n\n if (!response.ok) {\n const detail = await readHttpErrorMessage(response)\n throw new Error(detail)\n }\n\n const result = await response.json()\n return {\n refId: result.ref_id,\n mimeType: result.mime_type,\n filename: result.filename,\n sizeBytes: result.size_bytes ?? result.size ?? 0,\n publicUrl: result.public_url ?? undefined,\n }\n }\n\n connect(url: string, agentId: string, config?: AgentConnectionConfig) {\n this.url = apiMessagesUrlToWebSocketUrl(url)\n this.agentId = agentId\n this.uploadAgentId = agentId.trim()\n this.config = config ?? { organizationId: '', workspaceId: '', userId: '' }\n this.isIntentionallyClosed = false\n\n // Derive HTTP base URL from WebSocket URL for resolving relative content URLs\n if (this.httpBaseUrlOverride) {\n // Caller provided the canonical base (hostUrl); trust it verbatim so the\n // LB path prefix is preserved when resolving relative content URLs.\n this.httpBaseUrl = this.httpBaseUrlOverride\n } else {\n try {\n const parsed = new URL(this.url)\n parsed.protocol = parsed.protocol === 'wss:' ? 'https:' : 'http:'\n parsed.pathname = ''\n parsed.search = ''\n parsed.hash = ''\n this.httpBaseUrl = parsed.toString().replace(/\\/$/, '')\n } catch {\n this.httpBaseUrl = ''\n }\n }\n\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n /** Clear the last in-chat send error banner (see ``connection.sendError``). */\n clearSendError() {\n this.callbacks.setSendError(null)\n }\n\n private abortPendingMessages(reason: string) {\n for (const [clientEventId, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n const opt = this.pendingOptimistic.get(clientEventId)\n if (opt?.threadId) {\n this.callbacks.removeOptimistic(opt.threadId, clientEventId)\n }\n this.pendingOptimistic.delete(clientEventId)\n pending.reject(new Error(reason))\n }\n this.pendingMessages.clear()\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n this.stopHeartbeat()\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n this.abortPendingMessages('Disconnected')\n if (this.ws) {\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n this.ws = null\n }\n this.callbacks.setConnectionStatus('disconnected')\n }\n\n retry() {\n this.reconnectAttempts = 0\n this.isIntentionallyClosed = false\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n // --- Thread operations ---\n\n requestThreadList(cursor?: string | null, limit?: number) {\n this.send('thread.list', { cursor, limit })\n }\n\n subscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n this.subscriptionRefs.set(threadId, refs + 1)\n if (refs === 0) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', { thread_id: threadId, after_event_id: afterEventId })\n this.callbacks.addSubscription(threadId)\n }\n }\n\n unsubscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n if (refs <= 1) {\n this.subscriptionRefs.delete(threadId)\n this.lastEventIds.delete(threadId)\n this.eventPaginationCursors.delete(threadId)\n this.send('thread.unsubscribe', { thread_id: threadId })\n this.callbacks.removeSubscription(threadId)\n } else {\n this.subscriptionRefs.set(threadId, refs - 1)\n }\n }\n\n deleteThread(threadId: string) {\n this.send('thread.delete', { thread_id: threadId })\n }\n\n loadMoreThreads(limit?: number) {\n const cursor = this.lastThreadListCursor\n if (!cursor || this.isLoadingMore) return\n this.isLoadingMore = true\n this.send('thread.list', { cursor, limit })\n }\n\n loadOlderEvents(threadId: string, limit?: number) {\n const cursor = this.eventPaginationCursors.get(threadId)\n this.send('event.list', {\n thread_id: threadId,\n before_event_id: cursor ?? null,\n limit,\n })\n }\n\n // --- Settings ---\n\n subscribeSettings(options?: { audience?: 'creator' | 'user'; agentOwnerUserId?: string | null }) {\n const audience = options?.audience ?? 'user'\n const agentOwnerUserId = options?.agentOwnerUserId ?? null\n this.settingsSubscription = { audience, agentOwnerUserId }\n this.send('settings.subscribe', {\n agent_id: this.agentId,\n audience,\n agent_owner_user_id: agentOwnerUserId,\n })\n }\n\n unsubscribeSettings() {\n this.settingsSubscription = null\n this.send('settings.unsubscribe', { agent_id: this.agentId })\n }\n\n patchSetting(fieldId: string, value: unknown) {\n this.send('settings.patch', { field_id: fieldId, value })\n }\n\n // --- Feedback ---\n\n sendFeedback(\n targetType: string,\n targetId: string,\n feedback: 'like' | 'dislike',\n reason?: string,\n classification?: string\n ) {\n this.send('feedback', {\n target_type: targetType,\n target_id: targetId,\n feedback,\n reason,\n classification,\n })\n }\n\n // --- Analytics ---\n\n subscribeAnalytics() {\n this.send('analytics.subscribe', { agent_id: this.agentId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { agent_id: this.agentId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n metadata?: Record<string, unknown>\n }): Promise<{ threadId: string }> {\n this.callbacks.setSendError(null)\n const clientEventId = crypto.randomUUID()\n const content: WireC2S_ContentPart[] = params.content\n ? params.content.map(toWireContentPart)\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic display content from send parts\n const displayContent: DisplayContentPart[] = params.content\n ? params.content.map((p): DisplayContentPart => {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio':\n return {\n type: 'audio',\n duration: p.duration,\n ...(p.url ? { url: p.url } : {}),\n ...(p.mimeType ? { mimeType: p.mimeType } : {}),\n ...(p.filename ? { filename: p.filename } : {}),\n }\n case 'image':\n return {\n type: 'image',\n ...(p.url ? { url: p.url } : {}),\n ...(p.mimeType ? { mimeType: p.mimeType } : {}),\n ...(p.filename ? { filename: p.filename } : {}),\n }\n case 'document':\n return {\n type: 'document',\n ...(p.url ? { url: p.url } : {}),\n ...(p.mimeType ? { mimeType: p.mimeType } : {}),\n ...(p.filename ? { filename: p.filename } : {}),\n }\n default:\n return { type: 'text', text: '' }\n }\n })\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic event\n const optimisticEvent: ThreadEvent = {\n id: `optimistic-${clientEventId}`,\n threadId: params.threadId ?? '',\n runId: null,\n type: 'message',\n actor: 'user',\n author: null,\n user: {\n userId: this.config.userId ?? '',\n userName: this.config.userName,\n userEmail: this.config.userEmail,\n identityIds: this.config.identityIds,\n systemRole: this.config.systemRole ?? 'user',\n organizationRole: this.config.organizationRole ?? 'member',\n workspaceRole: this.config.workspaceRole ?? 'member',\n },\n content: displayContent,\n createdAt: new Date().toISOString(),\n }\n\n if (params.threadId) {\n this.callbacks.addOptimistic(params.threadId, optimisticEvent, clientEventId)\n }\n\n this.pendingOptimistic.set(clientEventId, {\n threadId: params.threadId ?? '',\n clientEventId,\n })\n\n const promise = this.createPendingPromise(clientEventId)\n\n const payload: Record<string, unknown> = {\n thread_id: params.threadId,\n client_event_id: clientEventId,\n event: {\n type: 'message' as const,\n actor: 'user' as const,\n content,\n },\n }\n payload.metadata = this.withChannelMetadata(params.metadata)\n\n this.sendRaw({\n id: clientEventId,\n type: 'event.create',\n payload,\n })\n\n return promise\n }\n\n sendFormResponse(params: {\n threadId: string\n formEventId: string\n cancelled: boolean\n values: Record<string, unknown>\n metadata?: Record<string, unknown>\n }): Promise<{ threadId: string }> {\n this.callbacks.setSendError(null)\n const clientEventId = crypto.randomUUID()\n const promise = this.createPendingPromise(clientEventId)\n\n this.sendRaw({\n id: clientEventId,\n type: 'event.create',\n payload: {\n thread_id: params.threadId,\n client_event_id: clientEventId,\n event: {\n type: 'form.response' as const,\n actor: 'user' as const,\n content: [],\n data: {\n form_event_id: params.formEventId,\n cancelled: params.cancelled,\n values: params.values,\n },\n },\n },\n metadata: this.withChannelMetadata(params.metadata),\n })\n\n return promise\n }\n\n // --- Private ---\n\n private createPendingPromise(clientEventId: string): Promise<{ threadId: string }> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n const opt = this.pendingOptimistic.get(clientEventId)\n if (opt?.threadId) {\n this.callbacks.removeOptimistic(opt.threadId, clientEventId)\n }\n this.pendingOptimistic.delete(clientEventId)\n this.pendingMessages.delete(clientEventId)\n reject(new Error('Request timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, reject, timer })\n })\n }\n\n private createConnection() {\n this.stopHeartbeat()\n if (this.ws) {\n this.abortPendingMessages('Connection lost; reconnecting')\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n }\n\n this.ws = new WebSocket(this.url)\n\n this.ws.onopen = () => {\n this.authenticate()\n }\n\n this.ws.onmessage = (e: MessageEvent) => {\n try {\n const frame = JSON.parse(e.data as string) as ServerToClient\n this.route(frame)\n } catch {\n // Ignore malformed frames\n }\n }\n\n this.ws.onclose = () => {\n if (!this.isIntentionallyClosed) {\n this.scheduleReconnect()\n }\n }\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n }\n }\n\n private authenticate() {\n this.connectFrameId = crypto.randomUUID()\n this.sendRaw({\n id: this.connectFrameId,\n type: 'connect',\n payload: {\n agent_id: this.agentId,\n organization_id: this.config.organizationId ?? '',\n workspace_id: this.config.workspaceId ?? '',\n user: {\n user_id: this.config.userId ?? '',\n user_name: this.config.userName ?? null,\n user_email: this.config.userEmail ?? null,\n user_mobile_number: this.config.userMobileNumber ?? null,\n user_whatsapp_number: this.config.userWhatsappNumber ?? null,\n identity_ids: this.config.identityIds ?? [],\n system_role: this.config.systemRole ?? 'user',\n organization_role: this.config.organizationRole ?? 'member',\n workspace_role: this.config.workspaceRole ?? 'member',\n },\n auth_token: this.config.authToken,\n client: { name: 'dooers-agents-client', version: PACKAGE_VERSION },\n },\n })\n }\n\n private route(frame: ServerToClient) {\n switch (frame.type) {\n case 'ack': {\n if (frame.payload.ack_id === this.connectFrameId) {\n if (frame.payload.ok) {\n this.callbacks.setConnectionStatus('connected')\n this.callbacks.resetReconnect()\n this.requestThreadList()\n // Re-subscribe to previously tracked threads\n for (const threadId of this.subscriptionRefs.keys()) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', {\n thread_id: threadId,\n after_event_id: afterEventId,\n })\n }\n this.resubscribeSettings()\n this.startHeartbeat()\n } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n const ackId = frame.payload.ack_id\n const err = frame.payload.error\n if (ackId) {\n const pending = this.pendingMessages.get(ackId)\n if (pending) {\n clearTimeout(pending.timer)\n this.pendingMessages.delete(ackId)\n const msg = err.message || 'Request rejected'\n const opt = this.pendingOptimistic.get(ackId)\n if (opt?.threadId) {\n this.callbacks.removeOptimistic(opt.threadId, ackId)\n }\n this.pendingOptimistic.delete(ackId)\n pending.reject(new Error(msg))\n this.callbacks.setSendError(msg)\n }\n }\n this.onError?.({\n code: err.code,\n message: err.message,\n frameType: 'ack',\n })\n }\n break\n }\n\n case 'thread.list.result': {\n const threads = frame.payload.threads.map(toThread)\n const cursor = frame.payload.cursor ?? null\n const totalCount = frame.payload.total_count\n this.lastThreadListCursor = cursor\n if (this.isLoadingMore) {\n this.callbacks.onThreadListAppend(threads, cursor, totalCount)\n } else {\n this.callbacks.onThreadList(threads, cursor, totalCount)\n }\n this.isLoadingMore = false\n break\n }\n\n case 'thread.snapshot': {\n const thread = toThread(frame.payload.thread)\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n const runs = (frame.payload.runs ?? []).map(toRun)\n // Track last event for gap recovery\n const lastEvent = events[events.length - 1]\n if (lastEvent) {\n this.lastEventIds.set(thread.id, lastEvent.id)\n }\n // Set initial event pagination cursor to oldest event\n const oldestEvent = events[0]\n if (oldestEvent) {\n this.eventPaginationCursors.set(thread.id, oldestEvent.id)\n }\n this.callbacks.onThreadSnapshot(thread, events, runs)\n break\n }\n\n case 'event.append': {\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n // Collect reconciled client event IDs; resolve sends only after store update\n const resolvedClientEventIds: string[] = []\n const pendingIdsToResolve: string[] = []\n for (const event of events) {\n if (event.clientEventId && this.pendingOptimistic.has(event.clientEventId)) {\n resolvedClientEventIds.push(event.clientEventId)\n this.pendingOptimistic.delete(event.clientEventId)\n }\n if (event.clientEventId && this.pendingMessages.has(event.clientEventId)) {\n const pendingMessage = this.pendingMessages.get(event.clientEventId)\n if (pendingMessage) {\n clearTimeout(pendingMessage.timer)\n pendingIdsToResolve.push(event.clientEventId)\n }\n }\n }\n // Track last event for gap recovery on reconnect.\n // Only for subscribed threads — new threads receive event.append\n // before subscription exists, and lastEventIds feeds after_event_id\n // in subscribe(), which controls what the server includes in snapshots.\n const lastEvent = events[events.length - 1]\n if (lastEvent && this.subscriptionRefs.has(frame.payload.thread_id)) {\n this.lastEventIds.set(frame.payload.thread_id, lastEvent.id)\n }\n // Atomically append confirmed events and remove reconciled optimistic events\n if (resolvedClientEventIds.length > 0) {\n this.callbacks.reconcileEvents(frame.payload.thread_id, events, resolvedClientEventIds)\n } else {\n this.callbacks.onEventAppend(frame.payload.thread_id, events)\n }\n const tid = frame.payload.thread_id\n for (const id of pendingIdsToResolve) {\n const pending = this.pendingMessages.get(id)\n if (pending) {\n pending.resolve({ threadId: tid })\n this.pendingMessages.delete(id)\n }\n }\n break\n }\n\n case 'event.list.result': {\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n this.eventPaginationCursors.set(frame.payload.thread_id, frame.payload.cursor)\n this.callbacks.onEventListResult(\n frame.payload.thread_id,\n events,\n frame.payload.cursor,\n frame.payload.has_more\n )\n break\n }\n\n case 'thread.upsert':\n this.callbacks.onThreadUpsert(toThread(frame.payload.thread))\n break\n\n case 'thread.deleted':\n this.callbacks.onThreadDeleted(frame.payload.thread_id)\n this.lastEventIds.delete(frame.payload.thread_id)\n break\n\n case 'run.upsert':\n this.callbacks.onRunUpsert(toRun(frame.payload.run))\n break\n\n case 'settings.snapshot': {\n const fields = frame.payload.fields.map(toSettingsItem)\n this.callbacks.onSettingsSnapshot(fields, frame.payload.updated_at)\n break\n }\n\n case 'settings.patch':\n this.callbacks.onSettingsPatch(\n frame.payload.field_id,\n frame.payload.value,\n frame.payload.updated_at\n )\n break\n\n case 'settings.public_schema.result':\n break\n\n case 'feedback.ack':\n if (frame.payload.ok) {\n this.callbacks.onFeedbackAck(\n frame.payload.target_id,\n frame.payload.feedback as 'like' | 'dislike'\n )\n }\n break\n\n case 'analytics.event':\n this.callbacks.onAnalyticsEvent(toAnalyticsEvent(frame.payload))\n break\n\n case 'pong':\n break\n }\n }\n\n private resubscribeSettings() {\n if (!this.settingsSubscription) return\n this.send('settings.subscribe', {\n agent_id: this.agentId,\n audience: this.settingsSubscription.audience,\n agent_owner_user_id: this.settingsSubscription.agentOwnerUserId,\n })\n }\n\n private startHeartbeat() {\n this.stopHeartbeat()\n this.pingTimer = setInterval(() => {\n this.send('ping', {})\n }, PING_INTERVAL_MS)\n }\n\n private stopHeartbeat() {\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n }\n\n private scheduleReconnect() {\n this.stopHeartbeat()\n if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\n this.abortPendingMessages('Connection lost after maximum retries')\n this.callbacks.setReconnectFailed()\n this.callbacks.setConnectionStatus('error', 'Connection lost after maximum retries')\n return\n }\n this.callbacks.setConnectionStatus('disconnected')\n const delay = RECONNECT_DELAYS[this.reconnectAttempts] ?? 16000\n this.reconnectAttempts++\n this.reconnectTimer = setTimeout(() => {\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }, delay)\n }\n\n private send(type: string, payload: unknown) {\n this.sendRaw({ id: crypto.randomUUID(), type, payload })\n }\n\n private withChannelMetadata(\n metadata: Record<string, unknown> | undefined\n ): Record<string, unknown> | undefined {\n const channel = (this.config.channel || 'dooers-platform').trim() || 'dooers-platform'\n const base = metadata ? { ...metadata } : {}\n if (!('channel' in base)) {\n base.channel = channel\n }\n if (this.config.channelMeta && !('channel_meta' in base)) {\n base.channel_meta = this.config.channelMeta\n }\n return Object.keys(base).length > 0 ? base : undefined\n }\n\n private sendRaw(frame: unknown) {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return\n this.ws.send(JSON.stringify(frame))\n }\n\n /** Resolve relative URLs in event content parts against the agent's HTTP base. */\n private resolveEventUrls(events: ThreadEvent[]): ThreadEvent[] {\n if (!this.httpBaseUrl) return events\n const base = this.httpBaseUrl\n return events.map((event) => {\n if (!event.content?.some((p) => 'url' in p && p.url?.startsWith('/'))) return event\n return {\n ...event,\n content: event.content.map((part) =>\n 'url' in part && part.url?.startsWith('/') ? { ...part, url: `${base}${part.url}` } : part\n ),\n }\n })\n }\n}\n","import { createStore } from 'zustand/vanilla'\nimport type {\n AnalyticsEvent,\n DisplayContentPart,\n Run,\n SettingsItem,\n Thread,\n ThreadEvent,\n} from './types'\nimport { isSettingsFieldGroup } from './types'\n\ntype FormState = {\n values: Record<string, unknown>\n submitting: boolean\n submitted: boolean\n cancelled: boolean\n}\n\n/** Extract form states from form.response events to restore submitted/cancelled state. */\n/** Merge wire content so a later frame (e.g. run_id patch) does not drop a hydrated ``url``. */\nfunction mergeDisplayContentParts(\n prev: DisplayContentPart[] | undefined,\n next: DisplayContentPart[] | undefined\n): DisplayContentPart[] | undefined {\n if (!next?.length) return prev\n if (!prev?.length) return next\n const out: DisplayContentPart[] = []\n const len = Math.max(prev.length, next.length)\n for (let i = 0; i < len; i++) {\n const p = prev[i]\n const n = next[i]\n if (!n) {\n if (p) out.push(p)\n continue\n }\n if (!p) {\n out.push(n)\n continue\n }\n if (p.type !== n.type) {\n out.push(n)\n continue\n }\n if (n.type === 'image' || n.type === 'audio' || n.type === 'document') {\n const url = n.url ?? ('url' in p ? p.url : undefined)\n out.push({ ...p, ...n, ...(url ? { url } : {}) } as DisplayContentPart)\n continue\n }\n out.push(n)\n }\n return out\n}\n\nfunction mergeThreadEventById(prev: ThreadEvent, next: ThreadEvent): ThreadEvent {\n const content = mergeDisplayContentParts(prev.content, next.content)\n return {\n ...prev,\n ...next,\n ...(content !== undefined ? { content } : {}),\n }\n}\n\nfunction extractFormStates(\n events: ThreadEvent[],\n existing: Record<string, FormState>\n): Record<string, FormState> {\n let result = existing\n for (const e of events) {\n if (e.type === 'form.response' && e.data) {\n const formEventId = e.data.form_event_id as string\n if (formEventId && !result[formEventId]) {\n const cancelled = (e.data.cancelled as boolean) ?? false\n const values = (e.data.values as Record<string, unknown>) ?? {}\n result = {\n ...result,\n [formEventId]: { values, submitting: false, submitted: !cancelled, cancelled },\n }\n }\n }\n }\n return result\n}\n\nexport interface AgentActions {\n setConnectionStatus: (status: AgentState['connection']['status'], error?: string) => void\n setSendError: (message: string | null) => void\n setReconnectFailed: () => void\n resetReconnect: () => void\n onThreadList: (threads: Thread[], cursor?: string | null, totalCount?: number) => void\n onThreadListAppend: (threads: Thread[], cursor?: string | null, totalCount?: number) => void\n onThreadUpsert: (thread: Thread) => void\n onThreadDeleted: (threadId: string) => void\n onThreadSnapshot: (thread: Thread, events: ThreadEvent[], runs: Run[]) => void\n onEventAppend: (threadId: string, events: ThreadEvent[]) => void\n reconcileEvents: (\n threadId: string,\n events: ThreadEvent[],\n resolvedClientEventIds: string[]\n ) => void\n onEventListResult: (\n threadId: string,\n events: ThreadEvent[],\n cursor: string | null,\n hasMore: boolean\n ) => void\n onRunUpsert: (run: Run) => void\n addOptimistic: (threadId: string, event: ThreadEvent, clientEventId: string) => void\n removeOptimistic: (threadId: string, clientEventId: string) => void\n addSubscription: (threadId: string) => void\n removeSubscription: (threadId: string) => void\n onSettingsSnapshot: (fields: SettingsItem[], updatedAt: string) => void\n onSettingsPatch: (fieldId: string, value: unknown, updatedAt: string) => void\n onFeedbackAck: (targetId: string, feedback: 'like' | 'dislike') => void\n onAnalyticsEvent: (event: AnalyticsEvent) => void\n resetAnalytics: () => void\n initFormState: (formEventId: string, defaults: Record<string, unknown>) => void\n setFormValue: (formEventId: string, fieldName: string, value: unknown) => void\n setFormSubmitting: (formEventId: string, submitting: boolean) => void\n setFormSubmitted: (formEventId: string) => void\n setFormCancelled: (formEventId: string) => void\n}\n\nexport interface AgentState {\n connection: {\n status: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n error: string | null\n /** Last server rejection for ``event.create`` / send (e.g. upload ref not found). */\n sendError: string | null\n reconnectAttempts: number\n reconnectFailed: boolean\n }\n threads: Record<string, Thread>\n threadOrder: string[]\n threadListCursor: string | null\n threadListHasMore: boolean\n threadListTotalCount: number\n events: Record<string, ThreadEvent[]>\n eventPagination: Record<string, { cursor: string | null; hasMore: boolean }>\n optimistic: Record<string, ThreadEvent[]>\n optimisticKeys: Record<string, string[]>\n runs: Record<string, Run[]>\n settings: {\n fields: SettingsItem[]\n updatedAt: string | null\n isLoading: boolean\n }\n feedback: Record<string, 'like' | 'dislike'>\n analytics: {\n events: AnalyticsEvent[]\n counters: {\n totalRequests: number\n feedbackLikes: number\n feedbackDislikes: number\n }\n }\n formStates: Record<string, FormState>\n subscriptions: Set<string>\n loadingThreads: Set<string>\n actions: AgentActions\n}\n\nexport type AgentStore = ReturnType<typeof createAgentStore>\n\nexport function createAgentStore() {\n return createStore<AgentState>()((set) => ({\n connection: {\n status: 'idle',\n error: null,\n sendError: null,\n reconnectAttempts: 0,\n reconnectFailed: false,\n },\n threads: {},\n threadOrder: [],\n threadListCursor: null,\n threadListHasMore: false,\n threadListTotalCount: 0,\n events: {},\n eventPagination: {},\n optimistic: {},\n optimisticKeys: {},\n runs: {},\n settings: {\n fields: [],\n updatedAt: null,\n isLoading: true,\n },\n feedback: {},\n formStates: {},\n analytics: {\n events: [],\n counters: { totalRequests: 0, feedbackLikes: 0, feedbackDislikes: 0 },\n },\n subscriptions: new Set(),\n loadingThreads: new Set(),\n\n actions: {\n setConnectionStatus: (status, error) =>\n set((s) => ({\n connection: {\n ...s.connection,\n status,\n error: error ?? null,\n ...(status === 'connected' ? { sendError: null } : {}),\n },\n })),\n\n setSendError: (message) =>\n set((s) => ({\n connection: { ...s.connection, sendError: message },\n })),\n\n setReconnectFailed: () =>\n set((s) => ({\n connection: { ...s.connection, reconnectFailed: true },\n })),\n\n resetReconnect: () =>\n set((s) => ({\n connection: { ...s.connection, reconnectAttempts: 0, reconnectFailed: false },\n })),\n\n onThreadList: (threads, cursor, totalCount) =>\n set(() => {\n const map: Record<string, Thread> = {}\n const order: string[] = []\n for (const t of threads) {\n map[t.id] = t\n order.push(t.id)\n }\n return {\n threads: map,\n threadOrder: order,\n threadListCursor: cursor ?? null,\n threadListHasMore: cursor != null,\n threadListTotalCount: totalCount ?? 0,\n }\n }),\n\n onThreadListAppend: (threads, cursor) =>\n set((s) => {\n const map = { ...s.threads }\n const order = [...s.threadOrder]\n for (const t of threads) {\n if (!map[t.id]) {\n order.push(t.id)\n }\n map[t.id] = t\n }\n return {\n threads: map,\n threadOrder: order,\n threadListCursor: cursor ?? null,\n threadListHasMore: cursor != null,\n }\n }),\n\n onThreadUpsert: (thread) =>\n set((s) => {\n const threads = { ...s.threads, [thread.id]: thread }\n const threadOrder = s.threadOrder.includes(thread.id)\n ? s.threadOrder\n : [thread.id, ...s.threadOrder]\n return { threads, threadOrder }\n }),\n\n onThreadDeleted: (threadId) =>\n set((s) => {\n const { [threadId]: _, ...threads } = s.threads\n const { [threadId]: _e, ...events } = s.events\n const { [threadId]: _r, ...runs } = s.runs\n const { [threadId]: _o, ...optimistic } = s.optimistic\n const { [threadId]: _k, ...optimisticKeys } = s.optimisticKeys\n const { [threadId]: _p, ...eventPagination } = s.eventPagination\n const threadOrder = s.threadOrder.filter((id) => id !== threadId)\n const subscriptions = new Set(s.subscriptions)\n subscriptions.delete(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(threadId)\n // Clean up form states for events belonging to this thread\n const deletedEvents = s.events[threadId] ?? []\n const deletedEventIds = new Set(deletedEvents.map((e) => e.id))\n const formStates = { ...s.formStates }\n for (const key of Object.keys(formStates)) {\n if (deletedEventIds.has(key)) {\n delete formStates[key]\n }\n }\n return {\n threads,\n threadOrder,\n events,\n runs,\n optimistic,\n optimisticKeys,\n eventPagination,\n subscriptions,\n loadingThreads,\n formStates,\n }\n }),\n\n onThreadSnapshot: (thread, snapshotEvents, runs) =>\n set((s) => {\n const threads = { ...s.threads, [thread.id]: thread }\n const threadOrder = s.threadOrder.includes(thread.id)\n ? s.threadOrder\n : [thread.id, ...s.threadOrder]\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(thread.id)\n\n // Events may already exist from event.append arriving before the\n // snapshot (race between the two data paths). Existing array is\n // already in chronological order. Append only snapshot events we\n // don't have yet — never reorder what's already in place.\n const existing = s.events[thread.id] ?? []\n let mergedEvents: ThreadEvent[]\n if (existing.length === 0) {\n mergedEvents = snapshotEvents\n } else {\n const existingIds = new Set(existing.map((e) => e.id))\n const snapById = new Map(snapshotEvents.map((e) => [e.id, e]))\n const mergedExisting = existing.map((e) => {\n const snap = snapById.get(e.id)\n return snap ? mergeThreadEventById(e, snap) : e\n })\n const newFromSnapshot = snapshotEvents.filter((e) => !existingIds.has(e.id))\n mergedEvents =\n newFromSnapshot.length > 0 ? [...mergedExisting, ...newFromSnapshot] : mergedExisting\n }\n\n // Snapshot is authoritative — clear optimistic state for this thread.\n const optimistic = { ...s.optimistic }\n const optimisticKeys = { ...s.optimisticKeys }\n delete optimistic[thread.id]\n delete optimisticKeys[thread.id]\n\n return {\n threads,\n threadOrder,\n events: { ...s.events, [thread.id]: mergedEvents },\n runs: { ...s.runs, [thread.id]: runs },\n optimistic,\n optimisticKeys,\n loadingThreads,\n formStates: extractFormStates(mergedEvents, s.formStates),\n }\n }),\n\n onEventAppend: (threadId, newEvents) =>\n set((s) => {\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n // Separate new events from updates to existing events\n const updates = new Map<string, ThreadEvent>()\n const appends: ThreadEvent[] = []\n for (const e of newEvents) {\n if (existingIds.has(e.id)) {\n const prev = existing.find((x) => x.id === e.id)!\n updates.set(e.id, mergeThreadEventById(prev, e))\n } else {\n appends.push(e)\n }\n }\n // Apply in-place updates then append new events\n const merged = updates.size > 0 ? existing.map((e) => updates.get(e.id) ?? e) : existing\n return {\n events: { ...s.events, [threadId]: [...merged, ...appends] },\n formStates: extractFormStates(appends, s.formStates),\n }\n }),\n\n reconcileEvents: (threadId, newEvents, resolvedClientEventIds) =>\n set((s) => {\n // Append confirmed events\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const mergedExisting =\n newEvents.length > 0\n ? existing.map((e) => {\n const up = newEvents.find((n) => n.id === e.id)\n return up ? mergeThreadEventById(e, up) : e\n })\n : existing\n const unique = newEvents.filter((e) => !existingIds.has(e.id))\n\n // Remove reconciled optimistic events\n let optEvents = s.optimistic[threadId] ?? []\n let optKeys = s.optimisticKeys[threadId] ?? []\n for (const clientEventId of resolvedClientEventIds) {\n const idx = optKeys.indexOf(clientEventId)\n if (idx >= 0) {\n optEvents = [...optEvents]\n optEvents.splice(idx, 1)\n optKeys = [...optKeys]\n optKeys.splice(idx, 1)\n }\n }\n\n return {\n events: { ...s.events, [threadId]: [...mergedExisting, ...unique] },\n optimistic: { ...s.optimistic, [threadId]: optEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: optKeys },\n }\n }),\n\n onEventListResult: (threadId, olderEvents, cursor, hasMore) =>\n set((s) => {\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const unique = olderEvents.filter((e) => !existingIds.has(e.id))\n return {\n events: { ...s.events, [threadId]: [...unique, ...existing] },\n eventPagination: {\n ...s.eventPagination,\n [threadId]: { cursor, hasMore },\n },\n }\n }),\n\n onRunUpsert: (run) =>\n set((s) => {\n const existing = s.runs[run.threadId] ?? []\n const idx = existing.findIndex((r) => r.id === run.id)\n const updated =\n idx >= 0 ? existing.map((r) => (r.id === run.id ? run : r)) : [...existing, run]\n return { runs: { ...s.runs, [run.threadId]: updated } }\n }),\n\n addOptimistic: (threadId, event, clientEventId) =>\n set((s) => ({\n optimistic: {\n ...s.optimistic,\n [threadId]: [...(s.optimistic[threadId] ?? []), event],\n },\n optimisticKeys: {\n ...s.optimisticKeys,\n [threadId]: [...(s.optimisticKeys[threadId] ?? []), clientEventId],\n },\n })),\n\n removeOptimistic: (threadId, clientEventId) =>\n set((s) => {\n const keys = s.optimisticKeys[threadId] ?? []\n const idx = keys.indexOf(clientEventId)\n if (idx < 0) return s\n const newKeys = [...keys]\n newKeys.splice(idx, 1)\n const newEvents = [...(s.optimistic[threadId] ?? [])]\n newEvents.splice(idx, 1)\n return {\n optimistic: { ...s.optimistic, [threadId]: newEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: newKeys },\n }\n }),\n\n addSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.add(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n const alreadyHadEvents = (s.events[threadId]?.length ?? 0) > 0\n if (!alreadyHadEvents) {\n loadingThreads.add(threadId)\n }\n return { subscriptions, loadingThreads }\n }),\n\n removeSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.delete(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(threadId)\n return { subscriptions, loadingThreads }\n }),\n\n onSettingsSnapshot: (fields, updatedAt) =>\n set(() => ({\n settings: { fields, updatedAt, isLoading: false },\n })),\n\n onSettingsPatch: (fieldId, value, updatedAt) =>\n set((s) => ({\n settings: {\n ...s.settings,\n updatedAt,\n fields: s.settings.fields.map((item) => {\n if (isSettingsFieldGroup(item)) {\n const hasField = item.fields.some((f) => f.id === fieldId)\n if (hasField) {\n return {\n ...item,\n fields: item.fields.map((f) => (f.id === fieldId ? { ...f, value } : f)),\n }\n }\n return item\n }\n return item.id === fieldId ? { ...item, value } : item\n }),\n },\n })),\n\n onFeedbackAck: (targetId, feedback) =>\n set((s) => ({\n feedback: { ...s.feedback, [targetId]: feedback },\n })),\n\n onAnalyticsEvent: (event) =>\n set((s) => {\n const events = [...s.analytics.events, event]\n const trimmed = events.length > 50 ? events.slice(-50) : events\n const counters = { ...s.analytics.counters }\n if (event.event === 'feedback.like') {\n counters.feedbackLikes += 1\n } else if (event.event === 'feedback.dislike') {\n counters.feedbackDislikes += 1\n } else {\n counters.totalRequests += 1\n }\n return { analytics: { events: trimmed, counters } }\n }),\n\n resetAnalytics: () =>\n set(() => ({\n analytics: {\n events: [],\n counters: { totalRequests: 0, feedbackLikes: 0, feedbackDislikes: 0 },\n },\n })),\n initFormState: (formEventId, defaults) =>\n set((s) => {\n if (s.formStates[formEventId]) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: {\n values: defaults,\n submitting: false,\n submitted: false,\n cancelled: false,\n },\n },\n }\n }),\n setFormSubmitting: (formEventId, submitting) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: { ...existing, submitting },\n },\n }\n }),\n setFormValue: (formEventId, fieldName, value) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing || existing.submitted || existing.cancelled) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: {\n ...existing,\n values: { ...existing.values, [fieldName]: value },\n },\n },\n }\n }),\n setFormSubmitted: (formEventId) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: { ...existing, submitting: false, submitted: true },\n },\n }\n }),\n setFormCancelled: (formEventId) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: { ...existing, submitting: false, cancelled: true },\n },\n }\n }),\n },\n }))\n}\n","import { createContext, type ReactNode, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useStore as useZustandStore } from 'zustand'\nimport { useShallow } from 'zustand/shallow'\nimport { AgentClient, type AgentConnectionConfig, type OnErrorCallback } from './client'\nimport { type AgentState, type AgentStore, createAgentStore } from './store'\n\ninterface AgentContextValue {\n store: AgentStore\n client: AgentClient\n}\n\nconst AgentContext = createContext<AgentContextValue | null>(null)\n\nexport interface AgentProviderProps {\n url?: string\n agentId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n userMobileNumber?: string\n userWhatsappNumber?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n channel?: string\n channelMeta?: Record<string, unknown>\n uploadUrl?: string\n /**\n * Explicit HTTP base (agent `hostUrl`: scheme+host+seg, no message path) used\n * to resolve relative content URLs like `/audio/<id>`. When omitted, the base\n * is derived from `url` — which cannot preserve the Load Balancer path prefix.\n */\n httpBaseUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function AgentProvider({\n url,\n agentId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n userMobileNumber,\n userWhatsappNumber,\n identityIds,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n channel,\n channelMeta,\n uploadUrl,\n httpBaseUrl,\n onError,\n children,\n}: AgentProviderProps) {\n const storeRef = useRef<AgentStore | undefined>(undefined)\n const clientRef = useRef<AgentClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createAgentStore()\n clientRef.current = new AgentClient(storeRef.current.getState().actions)\n }\n\n // Update onError callback\n useEffect(() => {\n clientRef.current?.setOnError(onError ?? null)\n }, [onError])\n\n // Update upload URL\n useEffect(() => {\n clientRef.current?.setUploadUrl(uploadUrl)\n }, [uploadUrl])\n\n // Set the explicit HTTP base (hostUrl) before connect derives one from the WS URL.\n useEffect(() => {\n clientRef.current?.setHttpBaseUrl(httpBaseUrl)\n }, [httpBaseUrl])\n\n // HTTP uploads require agent_id before WS connect completes\n useEffect(() => {\n clientRef.current?.setUploadAgentId(agentId)\n }, [agentId])\n\n // Stable key for identityIds to avoid reference-equality churn\n const identityIdsKey = identityIds?.join(',') ?? ''\n const channelMetaKey = channelMeta ? JSON.stringify(channelMeta) : ''\n\n const connectionConfig = useMemo((): AgentConnectionConfig => {\n let parsedChannelMeta: Record<string, unknown> | undefined\n if (channelMetaKey) {\n try {\n parsedChannelMeta = JSON.parse(channelMetaKey) as Record<string, unknown>\n } catch {\n parsedChannelMeta = channelMeta\n }\n }\n return {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n userMobileNumber,\n userWhatsappNumber,\n identityIds: identityIdsKey ? identityIdsKey.split(',') : undefined,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n channel,\n channelMeta: parsedChannelMeta,\n }\n }, [\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n userMobileNumber,\n userWhatsappNumber,\n identityIdsKey,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n channel,\n channelMetaKey,\n channelMeta,\n ])\n\n const connectionConfigRef = useRef(connectionConfig)\n connectionConfigRef.current = connectionConfig\n\n // Hard reconnect only when endpoint or agent identity changes.\n useEffect(() => {\n if (!url || !agentId) {\n clientRef.current?.disconnect()\n return\n }\n clientRef.current?.connect(url, agentId, connectionConfigRef.current)\n return () => clientRef.current?.disconnect()\n }, [url, agentId])\n\n // Hot-update metadata (handshake token refresh, roles, user fields) without reconnecting.\n useEffect(() => {\n if (!url || !agentId) return\n clientRef.current?.updateConnectionConfig(connectionConfig)\n }, [url, agentId, connectionConfig])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<AgentContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <AgentContext.Provider value={contextValue}>{children}</AgentContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useAgentContext(): AgentContextValue {\n const ctx = useContext(AgentContext)\n if (!ctx) {\n throw new Error('useAgentContext must be used within a <AgentProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: AgentState) => T): T {\n const { store } = useAgentContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: AgentState) => T): T {\n const { store } = useAgentContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useShallowStore } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useAgentContext()\n\n const events = useShallowStore((s) => s.analytics.events)\n const counters = useShallowStore((s) => s.analytics.counters)\n\n const subscribe = useCallback(() => client.subscribeAnalytics(), [client])\n const unsubscribe = useCallback(() => client.unsubscribeAnalytics(), [client])\n\n return { events, counters, subscribe, unsubscribe }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\nfunction getPreferredMimeType(): string {\n if (typeof MediaRecorder !== 'undefined') {\n if (MediaRecorder.isTypeSupported('audio/webm;codecs=opus')) return 'audio/webm;codecs=opus'\n if (MediaRecorder.isTypeSupported('audio/webm')) return 'audio/webm'\n if (MediaRecorder.isTypeSupported('audio/mp4')) return 'audio/mp4'\n }\n return 'audio/webm'\n}\n\nexport function useAudioRecorder() {\n const [isRecording, setIsRecording] = useState(false)\n const [duration, setDuration] = useState(0)\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const startTimeRef = useRef<number>(0)\n const resolveStopRef = useRef<((blob: Blob) => void) | null>(null)\n const audioContextRef = useRef<AudioContext | null>(null)\n const analyserRef = useRef<AnalyserNode | null>(null)\n\n const releaseAudioContext = useCallback(() => {\n analyserRef.current = null\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n audioContextRef.current.close()\n }\n audioContextRef.current = null\n }, [])\n\n const releaseStream = useCallback(() => {\n streamRef.current?.getTracks().forEach((t) => {\n t.stop()\n })\n streamRef.current = null\n releaseAudioContext()\n }, [releaseAudioContext])\n\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (mediaRecorderRef.current?.state === 'recording') {\n mediaRecorderRef.current.stop()\n }\n releaseStream()\n clearTimer()\n }\n }, [releaseStream, clearTimer])\n\n const start = useCallback(async () => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n streamRef.current = stream\n\n const audioContext = new AudioContext()\n audioContextRef.current = audioContext\n const source = audioContext.createMediaStreamSource(stream)\n const analyser = audioContext.createAnalyser()\n analyser.fftSize = 256\n source.connect(analyser)\n analyserRef.current = analyser\n\n const mimeType = getPreferredMimeType()\n const recorder = new MediaRecorder(stream, { mimeType })\n mediaRecorderRef.current = recorder\n chunksRef.current = []\n\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data)\n }\n\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: mimeType.split(';')[0] })\n releaseStream()\n clearTimer()\n resolveStopRef.current?.(blob)\n resolveStopRef.current = null\n }\n\n startTimeRef.current = Date.now()\n setDuration(0)\n timerRef.current = setInterval(() => {\n setDuration(Math.floor((Date.now() - startTimeRef.current) / 1000))\n }, 1000)\n\n recorder.start()\n setIsRecording(true)\n }, [releaseStream, clearTimer])\n\n const stop = useCallback((): Promise<Blob> => {\n return new Promise((resolve, reject) => {\n if (!mediaRecorderRef.current || mediaRecorderRef.current.state === 'inactive') {\n reject(new Error('No active recording to stop'))\n return\n }\n resolveStopRef.current = resolve\n mediaRecorderRef.current.stop()\n setIsRecording(false)\n setDuration(0)\n })\n }, [])\n\n const cancel = useCallback(() => {\n resolveStopRef.current = null\n if (mediaRecorderRef.current?.state === 'recording') {\n mediaRecorderRef.current.stop()\n }\n releaseStream()\n clearTimer()\n setIsRecording(false)\n setDuration(0)\n }, [releaseStream, clearTimer])\n\n return { start, stop, cancel, isRecording, duration, analyserNode: analyserRef.current }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useStore } from '../provider'\n\nexport function useConnection() {\n const { client } = useAgentContext()\n\n const status = useStore((s) => s.connection.status)\n const error = useStore((s) => s.connection.error)\n const sendError = useStore((s) => s.connection.sendError)\n const reconnectFailed = useStore((s) => s.connection.reconnectFailed)\n\n const reconnect = useCallback(() => client.retry(), [client])\n const dismissSendError = useCallback(() => {\n client.clearSendError()\n }, [client])\n\n return { status, error, sendError, dismissSendError, reconnectFailed, reconnect }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useStore } from '../provider'\nimport type { FeedbackTarget } from '../types'\n\nexport function useFeedback(targetId: string, targetType: FeedbackTarget = 'event') {\n const { client } = useAgentContext()\n\n const feedback = useStore((s) => s.feedback[targetId] ?? null)\n\n const like = useCallback(\n (reason?: string, classification?: string) =>\n client.sendFeedback(targetType, targetId, 'like', reason, classification),\n [client, targetType, targetId]\n )\n\n const dislike = useCallback(\n (reason?: string, classification?: string) =>\n client.sendFeedback(targetType, targetId, 'dislike', reason, classification),\n [client, targetType, targetId]\n )\n\n return { feedback, like, dislike }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useAgentContext, useStore } from '../provider'\nimport type { FormElement, FormEventData } from '../types'\n\nexport function useForm(formEventId: string, formData: FormEventData, threadId?: string) {\n const { client, store } = useAgentContext()\n const formState = useStore((s) => s.formStates[formEventId])\n const [errors, setErrors] = useState<Record<string, string>>({})\n\n // Initialize form state with defaults\n useEffect(() => {\n const defaults: Record<string, unknown> = {}\n for (const el of formData.elements) {\n if ('default' in el && el.default != null) {\n defaults[el.name] = el.default\n }\n }\n store.getState().actions.initFormState(formEventId, defaults)\n }, [formEventId, formData.elements, store])\n\n const values = formState?.values ?? {}\n const isSubmitting = formState?.submitting ?? false\n const isSubmitted = formState?.submitted ?? false\n const isCancelled = formState?.cancelled ?? false\n const isDisabled = isSubmitting || isSubmitted || isCancelled\n\n const setValue = useCallback(\n (fieldName: string, value: unknown) => {\n store.getState().actions.setFormValue(formEventId, fieldName, value)\n setErrors((prev) => {\n if (!prev[fieldName]) return prev\n const next = { ...prev }\n delete next[fieldName]\n return next\n })\n },\n [formEventId, store]\n )\n\n const validate = useCallback((): boolean => {\n const currentValues = store.getState().formStates[formEventId]?.values ?? {}\n const newErrors: Record<string, string> = {}\n\n for (const el of formData.elements) {\n if (!el.required) continue\n const val = currentValues[el.name]\n if (isEmptyValue(el, val)) {\n newErrors[el.name] = 'Required'\n }\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [formEventId, formData.elements, store])\n\n const submit = useCallback(async () => {\n const state = store.getState()\n const fs = state.formStates[formEventId]\n if (!fs || fs.submitting || fs.submitted || fs.cancelled) return\n if (!validate()) return\n\n state.actions.setFormSubmitting(formEventId, true)\n const currentValues = state.formStates[formEventId]?.values ?? {}\n\n if (!threadId) {\n state.actions.setFormSubmitted(formEventId)\n return\n }\n\n try {\n await client.sendFormResponse({\n threadId,\n formEventId,\n cancelled: false,\n values: currentValues,\n })\n store.getState().actions.setFormSubmitted(formEventId)\n } catch {\n store.getState().actions.setFormSubmitting(formEventId, false)\n }\n }, [formEventId, threadId, validate, client, store])\n\n const cancel = useCallback(async () => {\n const state = store.getState()\n const fs = state.formStates[formEventId]\n if (!fs || fs.submitting || fs.submitted || fs.cancelled) return\n\n state.actions.setFormSubmitting(formEventId, true)\n\n if (!threadId) {\n state.actions.setFormCancelled(formEventId)\n return\n }\n\n try {\n await client.sendFormResponse({\n threadId,\n formEventId,\n cancelled: true,\n values: {},\n })\n store.getState().actions.setFormCancelled(formEventId)\n } catch {\n store.getState().actions.setFormSubmitting(formEventId, false)\n }\n }, [formEventId, threadId, client, store])\n\n return {\n values,\n errors,\n setValue,\n validate,\n submit,\n cancel,\n isSubmitting,\n isSubmitted,\n isCancelled,\n isDisabled,\n }\n}\n\nfunction isEmptyValue(element: FormElement, val: unknown): boolean {\n if (val == null) return true\n if (typeof val === 'string' && val.trim() === '') return true\n if (element.type === 'checkbox_input' && Array.isArray(val) && val.length === 0) return true\n return false\n}\n","import { useCallback, useState } from 'react'\n\nexport interface FormFileMetadata {\n id?: string\n filename: string\n public_url?: string\n mime_type?: string\n size?: number\n [key: string]: unknown\n}\n\nexport function useFormFileUpload() {\n const [isUploading, setIsUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const upload = useCallback(\n async (params: {\n file: File\n uploadUrl: string\n fieldId: string\n agentId: string\n runId: string\n threadId: string\n }): Promise<FormFileMetadata> => {\n setIsUploading(true)\n setError(null)\n try {\n const aid = (params.agentId || '').trim()\n if (!aid) {\n throw new Error('agentId is required for upload')\n }\n const formData = new FormData()\n formData.append('file', params.file)\n formData.append('field_id', params.fieldId)\n formData.append('source', 'chat')\n formData.append('agent_id', aid)\n formData.append('run_id', params.runId)\n formData.append('thread_id', params.threadId)\n\n const response = await fetch(params.uploadUrl, {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '')\n throw new Error(detail || `Upload failed (${response.status})`)\n }\n\n return await response.json()\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Upload failed'\n setError(message)\n throw err\n } finally {\n setIsUploading(false)\n }\n },\n []\n )\n\n const clearError = useCallback(() => setError(null), [])\n\n return { upload, isUploading, error, clearError }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext } from '../provider'\nimport type { ContentPart } from '../types'\n\nexport function useMessage() {\n const { client } = useAgentContext()\n\n const send = useCallback(\n (params: {\n text?: string\n threadId?: string\n content?: ContentPart[]\n metadata?: Record<string, unknown>\n }) => {\n return client.sendMessage(params)\n },\n [client]\n )\n\n return { send }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useShallowStore, useStore } from '../provider'\n\nexport function useSettings() {\n const { client } = useAgentContext()\n\n const fields = useShallowStore((s) => s.settings.fields)\n const updatedAt = useStore((s) => s.settings.updatedAt)\n const isLoading = useStore((s) => s.settings.isLoading)\n\n const subscribe = useCallback(\n (options?: { audience?: 'creator' | 'user'; agentOwnerUserId?: string | null }) =>\n client.subscribeSettings(options),\n [client]\n )\n const unsubscribe = useCallback(() => client.unsubscribeSettings(), [client])\n\n const patchField = useCallback(\n (fieldId: string, value: unknown) => client.patchSetting(fieldId, value),\n [client]\n )\n\n return { fields, updatedAt, isLoading, subscribe, unsubscribe, patchField }\n}\n","import { useCallback, useState } from 'react'\n\nexport interface SettingsFileMetadata {\n id?: string\n filename: string\n public_url?: string\n mime_type?: string\n size?: number\n [key: string]: unknown\n}\n\nexport function useSettingsFileUpload() {\n const [isUploading, setIsUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const upload = useCallback(\n async (params: {\n file: File\n uploadUrl: string\n fieldId: string\n agentId: string\n }): Promise<SettingsFileMetadata> => {\n setIsUploading(true)\n setError(null)\n try {\n const formData = new FormData()\n formData.append('file', params.file)\n formData.append('source', 'settings')\n formData.append('field_id', params.fieldId)\n formData.append('agent_id', params.agentId)\n\n const response = await fetch(params.uploadUrl, {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '')\n throw new Error(detail || `Upload failed (${response.status})`)\n }\n\n return await response.json()\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Upload failed'\n setError(message)\n throw err\n } finally {\n setIsUploading(false)\n }\n },\n []\n )\n\n const clearError = useCallback(() => setError(null), [])\n\n return { upload, isUploading, error, clearError }\n}\n","import { useCallback, useEffect, useMemo } from 'react'\nimport { useAgentContext, useStore } from '../provider'\nimport type { Run, Thread, ThreadEvent, ThreadState } from '../types'\n\nconst EMPTY_ARRAY: ThreadEvent[] = []\nconst EMPTY_RUNS: Run[] = []\n\nexport function useThreadDetails(threadId: string | null): ThreadState {\n const { client } = useAgentContext()\n\n // Auto-subscribe/unsubscribe\n useEffect(() => {\n if (!threadId) return\n client.subscribe(threadId)\n return () => client.unsubscribe(threadId)\n }, [threadId, client])\n\n // All selectors return direct store references or constants — Object.is is sufficient\n const thread = useStore((s): Thread | null => (threadId ? (s.threads[threadId] ?? null) : null))\n const isLoading = useStore((s) => (threadId ? s.loadingThreads.has(threadId) : false))\n const isWaiting = useStore((s) => {\n if (!threadId) return false\n const r = s.runs[threadId]\n return r ? r.some((run) => run.status === 'running') : false\n })\n\n const optimistic = useStore((s) =>\n threadId ? (s.optimistic[threadId] ?? EMPTY_ARRAY) : EMPTY_ARRAY\n )\n const confirmed = useStore((s) => (threadId ? (s.events[threadId] ?? EMPTY_ARRAY) : EMPTY_ARRAY))\n const runs = useStore((s) => (threadId ? (s.runs[threadId] ?? EMPTY_RUNS) : EMPTY_RUNS))\n\n // Merge with useMemo — stable ref when inputs are the same arrays\n const events = useMemo(\n () => (optimistic.length ? [...confirmed, ...optimistic] : confirmed),\n [optimistic, confirmed]\n )\n\n return { thread, events, runs, isLoading, isWaiting }\n}\n\nexport function useThreadEvents(threadId: string | null) {\n const { client } = useAgentContext()\n\n const hasOlderEvents = useStore((s) =>\n threadId ? (s.eventPagination[threadId]?.hasMore ?? false) : false\n )\n\n const loadOlderEvents = useCallback(\n (limit?: number) => {\n if (threadId) client.loadOlderEvents(threadId, limit)\n },\n [threadId, client]\n )\n\n return { hasOlderEvents, loadOlderEvents }\n}\n","import { useCallback, useMemo } from 'react'\nimport { useAgentContext, useStore } from '../provider'\n\n/** Lightweight read-only hook — thread list, count, and loading state. */\nexport function useThreadsList() {\n const threadOrder = useStore((s) => s.threadOrder)\n const threadMap = useStore((s) => s.threads)\n\n const threads = useMemo(\n () =>\n threadOrder.flatMap((id) => {\n const t = threadMap[id]\n return t ? [t] : []\n }),\n [threadOrder, threadMap]\n )\n\n const isLoading = useStore((s) => s.connection.status !== 'connected')\n const hasMore = useStore((s) => s.threadListHasMore)\n const totalCount = useStore((s) => s.threadListTotalCount)\n\n return { threads, isLoading, hasMore, totalCount }\n}\n\n/** Actions-only hook (delete, load more). */\nexport function useThreadsActions() {\n const { client } = useAgentContext()\n\n const deleteThread = useCallback((threadId: string) => client.deleteThread(threadId), [client])\n const loadMore = useCallback((limit?: number) => client.loadMoreThreads(limit), [client])\n\n return { deleteThread, loadMore }\n}\n","import { useCallback, useRef, useState } from 'react'\nimport type { UploadResult } from '../client'\nimport { useAgentContext } from '../provider'\n\nexport function useUpload() {\n const { client } = useAgentContext()\n const [isUploading, setIsUploading] = useState(false)\n const activeCountRef = useRef(0)\n\n const upload = useCallback(\n async (file: File | Blob, options?: { filename?: string }): Promise<UploadResult> => {\n activeCountRef.current++\n setIsUploading(true)\n try {\n return await client.upload(file, options)\n } finally {\n activeCountRef.current--\n if (activeCountRef.current === 0) {\n setIsUploading(false)\n }\n }\n },\n [client]\n )\n\n return { upload, isUploading }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/helpers/api-messages-url-to-ws.ts","../src/types.ts","../src/version.ts","../src/client.ts","../src/store.ts","../src/provider.tsx","../src/hooks/use-analytics.ts","../src/hooks/use-audio-recorder.ts","../src/hooks/use-connection.ts","../src/hooks/use-feedback.ts","../src/hooks/use-form.ts","../src/hooks/use-form-file-upload.ts","../src/hooks/use-message.ts","../src/hooks/use-settings.ts","../src/hooks/use-settings-file-upload.ts","../src/hooks/use-thread.ts","../src/hooks/use-thread-artifacts.ts","../src/hooks/use-threads.ts","../src/hooks/use-upload.ts"],"names":["createStore","createContext","useRef","useEffect","useMemo","useContext","useZustandStore","useShallow","useCallback","useState"],"mappings":"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","file":"main.cjs","sourcesContent":["/**\n * Browser `WebSocket` and Node's `WebSocket` require `ws:` / `wss:` URLs.\n * Agent \"API Messages URL\" is often stored as `https://host/ws` — normalize before connecting.\n */\nexport function apiMessagesUrlToWebSocketUrl(url: string): string {\n const t = url.trim()\n if (!t) {\n throw new Error('API Messages URL is empty')\n }\n if (/^wss:\\/\\//i.test(t) || /^ws:\\/\\//i.test(t)) {\n return t\n }\n if (/^https:\\/\\//i.test(t)) {\n return `wss://${t.slice('https://'.length)}`\n }\n if (/^http:\\/\\//i.test(t)) {\n return `ws://${t.slice('http://'.length)}`\n }\n throw new Error('API Messages URL must start with http://, https://, ws://, or wss://')\n}\n","// --- Send content parts (client → server, used in send()) ---\n\nexport interface TextSendPart {\n type: 'text'\n text: string\n}\n\nexport interface AudioSendPart {\n type: 'audio'\n refId: string\n duration?: number\n /** Original name from upload; required for durable blob keys when the server resolves ``ref_id`` from storage. */\n filename?: string\n mimeType?: string\n /** When the upload response included a URL (persisted attachment). */\n url?: string\n}\n\nexport interface ImageSendPart {\n type: 'image'\n refId: string\n filename?: string\n mimeType?: string\n /** When the upload response included a fetchable URL (persisted chat attachment). */\n url?: string\n}\n\nexport interface DocumentSendPart {\n type: 'document'\n refId: string\n filename?: string\n mimeType?: string\n /** When the upload response included a URL (persisted attachment). */\n url?: string\n}\n\nexport type SendContentPart = TextSendPart | AudioSendPart | ImageSendPart | DocumentSendPart\n\n// --- Display content parts (server → client, rendered in chat) ---\n\nexport interface TextDisplayPart {\n type: 'text'\n text: string\n}\n\nexport interface AudioDisplayPart {\n type: 'audio'\n url?: string\n mimeType?: string\n duration?: number\n filename?: string\n /** Upload ref when present on the wire (replay / blob key correlation). */\n refId?: string\n}\n\nexport interface ImageDisplayPart {\n type: 'image'\n url?: string\n mimeType?: string\n width?: number\n height?: number\n alt?: string\n filename?: string\n refId?: string\n}\n\nexport interface DocumentDisplayPart {\n type: 'document'\n url?: string\n filename?: string\n mimeType?: string\n sizeBytes?: number\n refId?: string\n}\n\nexport type DisplayContentPart =\n | TextDisplayPart\n | AudioDisplayPart\n | ImageDisplayPart\n | DocumentDisplayPart\n\n// Backward-compatible aliases\nexport type ContentPart = SendContentPart\nexport type TextPart = TextSendPart\nexport type ImagePart = ImageSendPart\nexport type DocumentPart = DocumentSendPart\nexport type AudioPart = AudioSendPart\n\n// --- Form element types (content parts for form events) ---\n\nexport interface FormOption {\n value: string\n label: string\n}\n\nexport interface FormTextElement {\n type: 'text_input'\n name: string\n label: string\n order: number\n required: boolean\n disabled: boolean\n placeholder: string | null\n default: string | null\n inputType: 'text' | 'password' | 'email' | 'number'\n}\n\nexport interface FormTextareaElement {\n type: 'textarea_input'\n name: string\n label: string\n order: number\n required: boolean\n disabled: boolean\n placeholder: string | null\n default: string | null\n rows: number | null\n}\n\nexport interface FormSelectElement {\n type: 'select_input'\n name: string\n label: string\n options: FormOption[]\n order: number\n required: boolean\n disabled: boolean\n default: string | null\n placeholder: string | null\n}\n\nexport interface FormRadioElement {\n type: 'radio_input'\n name: string\n label: string\n options: FormOption[]\n order: number\n required: boolean\n disabled: boolean\n default: string | null\n variant: 'native' | 'button'\n}\n\nexport interface FormCheckboxElement {\n type: 'checkbox_input'\n name: string\n label: string\n options: FormOption[]\n order: number\n required: boolean\n disabled: boolean\n default: string[] | null\n variant: 'native' | 'button'\n}\n\nexport interface FormFileElement {\n type: 'file_input'\n name: string\n label: string\n uploadUrl: string\n order: number\n required: boolean\n disabled: boolean\n accept: string | null\n multiple: boolean\n}\n\nexport type FormElement =\n | FormTextElement\n | FormTextareaElement\n | FormSelectElement\n | FormRadioElement\n | FormCheckboxElement\n | FormFileElement\n\nexport type FormSize = 'small' | 'medium' | 'large'\n\nexport interface FormEventData {\n message: string\n elements: FormElement[]\n submitLabel: string\n cancelLabel: string\n size: FormSize\n}\n\nexport interface FormResponseEventData {\n formEventId: string\n cancelled: boolean\n values: Record<string, unknown>\n}\n\nexport type ChartType =\n | 'bar'\n | 'bar_horizontal'\n | 'stacked_bar'\n | 'line'\n | 'area'\n | 'pie'\n | 'donut'\n | 'scatter'\n\nexport type ChartSize = 'small' | 'medium' | 'large'\n\nexport interface ChartSeries {\n key: string\n label: string | null\n color: string | null\n}\n\nexport type ChartDataRow = Record<string, string | number | null>\n\nexport interface ChartEventData {\n title: string\n message: string\n chartType: ChartType\n size: ChartSize\n xKey: string\n yKeys: string[]\n data: ChartDataRow[]\n series: ChartSeries[]\n xLabel: string | null\n yLabel: string | null\n}\n\nexport type Actor = 'user' | 'assistant' | 'system' | 'tool'\nexport type EventType =\n | 'message'\n | 'reasoning'\n | 'run.started'\n | 'run.finished'\n | 'tool.call'\n | 'tool.result'\n | 'tool.transaction'\n | 'form'\n | 'form.response'\n | 'chart'\nexport type RunStatus = 'running' | 'succeeded' | 'failed' | 'canceled'\nexport type ConnectionStatus = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n\nexport interface User {\n userId: string\n userName?: string | null\n userEmail?: string | null\n userMobileNumber?: string | null\n userWhatsappNumber?: string | null\n identityIds?: string[]\n systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n agentId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | null\n metadata: Record<string, unknown> | null\n createdAt: string\n updatedAt: string\n lastEventAt: string\n}\n\nexport type ArtifactDirection = 'in' | 'out'\nexport type ArtifactKind = 'audio' | 'image' | 'document'\n\nexport interface ThreadArtifact {\n eventId: string\n direction: ArtifactDirection\n kind: ArtifactKind\n filename?: string | null\n mimeType?: string | null\n url?: string | null\n refId?: string | null\n createdAt: string\n userId?: string | null\n userName?: string | null\n}\n\nexport interface ThreadEvent {\n id: string\n threadId: string\n runId: string | null\n type: EventType\n actor: Actor\n author: string | null\n user?: User\n content?: DisplayContentPart[]\n data?: Record<string, unknown>\n createdAt: string\n clientEventId?: string\n}\n\nexport interface Run {\n id: string\n threadId: string\n agentId: string | null\n status: RunStatus\n startedAt: string\n endedAt: string | null\n error: string | null\n}\n\n// --- Settings ---\n\nexport type SettingsFieldType =\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'password'\n | 'email'\n | 'date'\n | 'image'\n | 'file'\n | 'file_multi'\n\nexport type SettingsFieldVisibility = 'internal' | 'creator' | 'user'\n\nexport interface SettingsSelectOption {\n value: string\n label: string\n}\n\nexport interface SettingsField {\n id: string\n type: SettingsFieldType\n label: string\n required: boolean\n readonly: boolean\n user_editable?: boolean\n visibility: SettingsFieldVisibility\n value: unknown\n placeholder: string | null\n options: SettingsSelectOption[] | null\n min: number | null\n max: number | null\n rows: number | null\n src: string | null\n width: number | null\n height: number | null\n uploadUrl: string | null\n accept: string | null\n}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\n visibility: SettingsFieldVisibility\n}\n\nexport type SettingsItem = SettingsField | SettingsFieldGroup\n\nexport function isSettingsFieldGroup(item: SettingsItem): item is SettingsFieldGroup {\n return 'fields' in item && Array.isArray((item as SettingsFieldGroup).fields)\n}\n\n// --- Feedback ---\n\nexport type FeedbackType = 'like' | 'dislike'\nexport type FeedbackTarget = 'event' | 'run' | 'thread'\n\n// --- Analytics ---\n\nexport interface AnalyticsEvent {\n event: string\n timestamp: string\n agentId: string\n threadId: string | null\n userId: string | null\n runId: string | null\n eventId: string | null\n data: Record<string, unknown> | null\n}\n\nexport interface ThreadState {\n thread: Thread | null\n events: ThreadEvent[]\n runs: Run[]\n isLoading: boolean\n isWaiting: boolean\n}\n\n// --- Wire → Public transforms ---\n\nimport type {\n WireAnalyticsEvent,\n WireC2S_ContentPart,\n WireRun,\n WireS2C_ContentPart,\n WireS2C_FormElement,\n WireSettingsField,\n WireSettingsFieldGroup,\n WireSettingsItem,\n WireThread,\n WireThreadArtifact,\n WireThreadEvent,\n WireUser,\n} from './protocol/models'\n\nexport function toUser(w: WireUser): User\nexport function toUser(w: WireUser | undefined): User | undefined\nexport function toUser(w?: WireUser): User | undefined {\n if (!w) return undefined\n return {\n userId: w.user_id,\n userName: w.user_name,\n userEmail: w.user_email,\n userMobileNumber: w.user_mobile_number,\n userWhatsappNumber: w.user_whatsapp_number,\n identityIds: w.identity_ids,\n systemRole: w.system_role,\n organizationRole: w.organization_role,\n workspaceRole: w.workspace_role,\n }\n}\n\nexport function toThread(w: WireThread): Thread {\n return {\n id: w.id,\n agentId: w.agent_id,\n organizationId: w.organization_id,\n workspaceId: w.workspace_id,\n owner: toUser(w.owner),\n users: w.users.map((u) => toUser(u)),\n title: w.title,\n metadata: w.metadata ?? null,\n createdAt: w.created_at,\n updatedAt: w.updated_at,\n lastEventAt: w.last_event_at,\n }\n}\n\nexport function toDisplayContentPart(w: WireS2C_ContentPart): DisplayContentPart {\n switch (w.type) {\n case 'text':\n return { type: 'text', text: w.text }\n case 'audio':\n return {\n type: 'audio',\n url: w.url,\n mimeType: w.mime_type,\n duration: w.duration,\n filename: w.filename,\n ...(w.ref_id ? { refId: w.ref_id } : {}),\n }\n case 'image':\n return {\n type: 'image',\n url: w.url,\n mimeType: w.mime_type,\n width: w.width,\n height: w.height,\n alt: w.alt,\n filename: w.filename,\n ...(w.ref_id ? { refId: w.ref_id } : {}),\n }\n case 'document':\n return {\n type: 'document',\n url: w.url,\n filename: w.filename,\n mimeType: w.mime_type,\n sizeBytes: w.size_bytes,\n ...(w.ref_id ? { refId: w.ref_id } : {}),\n }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\n\nexport function toFormElement(w: WireS2C_FormElement): FormElement {\n const base = {\n name: w.name,\n label: w.label,\n order: w.order ?? 0,\n required: w.required ?? false,\n disabled: w.disabled ?? false,\n }\n switch (w.type) {\n case 'text_input':\n return {\n ...base,\n type: 'text_input',\n placeholder: w.placeholder ?? null,\n default: w.default ?? null,\n inputType: w.input_type ?? 'text',\n }\n case 'textarea_input':\n return {\n ...base,\n type: 'textarea_input',\n placeholder: w.placeholder ?? null,\n default: w.default ?? null,\n rows: w.rows ?? null,\n }\n case 'select_input':\n return {\n ...base,\n type: 'select_input',\n options: w.options,\n default: w.default ?? null,\n placeholder: w.placeholder ?? null,\n }\n case 'radio_input':\n return {\n ...base,\n type: 'radio_input',\n options: w.options,\n default: w.default ?? null,\n variant: w.variant ?? 'native',\n }\n case 'checkbox_input':\n return {\n ...base,\n type: 'checkbox_input',\n options: w.options,\n default: w.default ?? null,\n variant: w.variant ?? 'native',\n }\n case 'file_input':\n return {\n ...base,\n type: 'file_input',\n uploadUrl: w.upload_url,\n accept: w.accept ?? null,\n multiple: w.multiple ?? false,\n }\n }\n}\n\nexport function toFormEventData(data: Record<string, unknown>): FormEventData {\n const elements = (data.elements as WireS2C_FormElement[]) ?? []\n return {\n message: (data.message as string) ?? '',\n elements: elements.map(toFormElement),\n submitLabel: (data.submit_label as string) ?? 'Send',\n cancelLabel: (data.cancel_label as string) ?? 'Cancel',\n size: ((data.size as string) ?? 'medium') as FormSize,\n }\n}\n\nexport function toFormResponseEventData(data: Record<string, unknown>): FormResponseEventData {\n return {\n formEventId: (data.form_event_id as string) ?? '',\n cancelled: (data.cancelled as boolean) ?? false,\n values: (data.values as Record<string, unknown>) ?? {},\n }\n}\n\nexport function toChartSeries(w: {\n key: string\n label?: string | null\n color?: string | null\n}): ChartSeries {\n return {\n key: w.key,\n label: w.label ?? null,\n color: w.color ?? null,\n }\n}\n\nexport function toChartEventData(data: Record<string, unknown>): ChartEventData {\n const series = (data.series as Array<Record<string, unknown>>) ?? []\n return {\n title: (data.title as string) ?? '',\n message: (data.message as string) ?? '',\n chartType: (data.chart_type as ChartType) ?? 'bar',\n size: ((data.size as string) ?? 'medium') as ChartSize,\n xKey: (data.x_key as string) ?? '',\n yKeys: (data.y_keys as string[]) ?? [],\n data: (data.data as ChartDataRow[]) ?? [],\n series: series.map((item) =>\n toChartSeries({\n key: (item.key as string) ?? '',\n label: (item.label as string | null) ?? null,\n color: (item.color as string | null) ?? null,\n })\n ),\n xLabel: (data.x_label as string | null) ?? null,\n yLabel: (data.y_label as string | null) ?? null,\n }\n}\n\nexport function toThreadEvent(w: WireThreadEvent): ThreadEvent {\n return {\n id: w.id,\n threadId: w.thread_id,\n runId: w.run_id,\n type: w.type,\n actor: w.actor,\n author: w.author,\n user: toUser(w.user),\n content: w.content?.map(toDisplayContentPart),\n data: w.data,\n createdAt: w.created_at,\n clientEventId: w.client_event_id,\n }\n}\n\nexport function toThreadArtifact(w: WireThreadArtifact): ThreadArtifact {\n return {\n eventId: w.event_id,\n direction: w.direction,\n kind: w.kind,\n filename: w.filename,\n mimeType: w.mime_type,\n url: w.url,\n refId: w.ref_id,\n createdAt: w.created_at,\n userId: w.user_id,\n userName: w.user_name,\n }\n}\n\nexport function toRun(w: WireRun): Run {\n return {\n id: w.id,\n threadId: w.thread_id,\n agentId: w.agent_id,\n status: w.status,\n startedAt: w.started_at,\n endedAt: w.ended_at,\n error: w.error,\n }\n}\n\n// --- Settings transforms ---\n\nexport function toSettingsField(w: WireSettingsField): SettingsField {\n return {\n id: w.id,\n type: w.type as SettingsFieldType,\n label: w.label,\n required: w.required,\n readonly: w.readonly,\n user_editable: w.user_editable ?? true,\n visibility: w.visibility ?? 'user',\n value: w.value,\n placeholder: w.placeholder,\n options: w.options,\n min: w.min,\n max: w.max,\n rows: w.rows,\n src: w.src,\n width: w.width,\n height: w.height,\n uploadUrl: w.upload_url,\n accept: w.accept,\n }\n}\n\nexport function toSettingsItem(w: WireSettingsItem): SettingsItem {\n if ('fields' in w && Array.isArray((w as WireSettingsFieldGroup).fields)) {\n const g = w as WireSettingsFieldGroup\n return {\n id: g.id,\n label: g.label,\n fields: g.fields.map(toSettingsField),\n collapsible: g.collapsible,\n visibility: g.visibility ?? 'user',\n }\n }\n return toSettingsField(w as WireSettingsField)\n}\n\n// --- Analytics transforms ---\n\nexport function toAnalyticsEvent(w: WireAnalyticsEvent): AnalyticsEvent {\n return {\n event: w.event,\n timestamp: w.timestamp,\n agentId: w.agent_id,\n threadId: w.thread_id,\n userId: w.user_id,\n runId: w.run_id,\n eventId: w.event_id,\n data: w.data,\n }\n}\n\n// --- Public → Wire transforms (for sending content) ---\n\nexport function toWireContentPart(p: SendContentPart): WireC2S_ContentPart {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio': {\n const w: {\n type: 'audio'\n ref_id: string\n duration?: number\n filename?: string\n mime_type?: string\n url?: string\n } = {\n type: 'audio',\n ref_id: p.refId,\n }\n if (p.duration != null) w.duration = p.duration\n if (p.filename?.trim()) w.filename = p.filename.trim()\n if (p.mimeType?.trim()) w.mime_type = p.mimeType.trim()\n if (p.url) w.url = p.url\n return w\n }\n case 'image': {\n const w: {\n type: 'image'\n ref_id: string\n filename?: string\n mime_type?: string\n url?: string\n } = {\n type: 'image',\n ref_id: p.refId,\n }\n if (p.filename?.trim()) w.filename = p.filename.trim()\n if (p.mimeType?.trim()) w.mime_type = p.mimeType.trim()\n if (p.url) w.url = p.url\n return w\n }\n case 'document': {\n const w: {\n type: 'document'\n ref_id: string\n filename?: string\n mime_type?: string\n url?: string\n } = {\n type: 'document',\n ref_id: p.refId,\n }\n if (p.filename?.trim()) w.filename = p.filename.trim()\n if (p.mimeType?.trim()) w.mime_type = p.mimeType.trim()\n if (p.url) w.url = p.url\n return w\n }\n }\n}\n","/** Must match `package.json` `\"version\"` (connect frame telemetry). */\nexport const PACKAGE_VERSION = '0.15.0' as const\n","import { apiMessagesUrlToWebSocketUrl } from './helpers/api-messages-url-to-ws'\nimport type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart, WireSettingsItem } from './protocol/models'\nimport type { AgentActions } from './store'\nimport type { DisplayContentPart, SendContentPart, SettingsItem, ThreadArtifact, ThreadEvent } from './types'\nimport {\n toAnalyticsEvent,\n toRun,\n toSettingsItem,\n toThread,\n toThreadArtifact,\n toThreadEvent,\n toWireContentPart,\n} from './types'\nimport { PACKAGE_VERSION } from './version'\n\nconst MAX_RECONNECT_ATTEMPTS = 5\nconst RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000]\nconst SEND_MESSAGE_TIMEOUT = 30_000\nconst ARTIFACTS_LIST_TIMEOUT = 30_000\nconst PING_INTERVAL_MS = 30_000\n\n/** Multipart filename for ``Blob`` uploads so server blob keys match WebSocket ``filename``. */\nfunction blobPartFilename(blob: Blob, override?: string): string {\n const o = (override ?? '').trim()\n if (o) return o\n const t = (blob.type || '').toLowerCase()\n if (t.includes('webm')) return 'recording.webm'\n if (t.includes('ogg')) return 'recording.ogg'\n if (t.includes('mpeg') || t.includes('mp3')) return 'recording.mp3'\n if (t.includes('mp4') || t.includes('m4a') || t.includes('aac')) return 'recording.m4a'\n if (t.startsWith('audio/')) return `recording.${t.split('/')[1]?.split('+')[0] || 'bin'}`\n return 'recording.bin'\n}\n\nasync function readHttpErrorMessage(response: Response): Promise<string> {\n const raw = (await response.text().catch(() => '')) || ''\n const trimmed = raw.trim()\n if (!trimmed) {\n return `Upload failed: ${response.status} ${response.statusText}`.trim()\n }\n try {\n const j = JSON.parse(trimmed) as { detail?: unknown }\n const d = j.detail\n if (typeof d === 'string') return d\n if (Array.isArray(d) && d.length > 0) {\n const first = d[0] as { msg?: string }\n if (first && typeof first.msg === 'string') return first.msg\n }\n } catch {\n /* use body */\n }\n return trimmed.length > 300 ? `${trimmed.slice(0, 300)}…` : trimmed\n}\n\nexport interface AgentConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n userMobileNumber?: string\n userWhatsappNumber?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n channel?: string\n channelMeta?: Record<string, unknown>\n}\n\nexport type OnErrorCallback = (error: { code: string; message: string; frameType: string }) => void\n\nexport interface UploadResult {\n refId: string\n mimeType: string\n filename: string\n sizeBytes: number\n /** Present when the template persisted the file (HTTP(S) or null if not applicable). */\n publicUrl?: string | null\n}\n\nexport interface PublicSettingsSchemaResult {\n version: string\n fields: SettingsItem[]\n}\n\n/**\n * Talks to the agent messages server without an agent session (no `connect` frame).\n * Use for public/bootstrap operations allowed before an {@link AgentClient} is connected.\n */\nexport class AgentServerClient {\n private readonly wsUrl: string\n\n constructor(apiMessagesUrl: string) {\n this.wsUrl = apiMessagesUrlToWebSocketUrl(apiMessagesUrl)\n }\n\n /**\n * Opens a short-lived WebSocket, requests `settings.public_schema`, and returns the public field\n * list. Closes the socket when done.\n */\n fetchPublicSettingsSchema(options?: { timeoutMs?: number }): Promise<PublicSettingsSchemaResult> {\n const timeoutMs = options?.timeoutMs ?? 15_000\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(this.wsUrl)\n const frameId = crypto.randomUUID()\n let settled = false\n\n const finish = (fn: () => void) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n try {\n ws.close()\n } catch {\n /* ignore */\n }\n fn()\n }\n\n const timer = setTimeout(() => {\n finish(() => reject(new Error('AgentServerClient.fetchPublicSettingsSchema: timeout')))\n }, timeoutMs)\n\n ws.onopen = () => {\n ws.send(\n JSON.stringify({\n id: frameId,\n type: 'settings.public_schema',\n payload: {},\n })\n )\n }\n\n ws.onmessage = (ev: MessageEvent) => {\n let msg: {\n id?: string\n type?: string\n payload?: {\n ack_id?: string\n ok?: boolean\n error?: { code?: string; message?: string }\n schema?: { version?: string; fields?: WireSettingsItem[] }\n }\n }\n try {\n msg = JSON.parse(ev.data as string)\n } catch {\n return\n }\n\n if (msg.type === 'ack' && msg.payload?.ack_id === frameId) {\n if (msg.payload?.ok === false) {\n finish(() =>\n reject(\n new Error(\n msg.payload?.error?.message ??\n 'AgentServerClient.fetchPublicSettingsSchema: request rejected'\n )\n )\n )\n }\n return\n }\n\n if (msg.type === 'settings.public_schema.result' && msg.id === frameId) {\n const raw = msg.payload?.schema as\n | { version?: string; fields?: WireSettingsItem[] }\n | undefined\n const fieldsWire = raw?.fields ?? []\n const fields = fieldsWire.map((w) => toSettingsItem(w))\n finish(() =>\n resolve({\n version: typeof raw?.version === 'string' ? raw.version : '1.0',\n fields,\n })\n )\n }\n }\n\n ws.onerror = () => {\n finish(() =>\n reject(new Error('AgentServerClient.fetchPublicSettingsSchema: WebSocket error'))\n )\n }\n\n ws.onclose = (ev) => {\n if (settled) return\n finish(() =>\n reject(\n new Error(\n `AgentServerClient.fetchPublicSettingsSchema: connection closed (${ev.code})${ev.reason ? ` ${ev.reason}` : ''}`\n )\n )\n )\n }\n })\n }\n}\n\nexport class AgentClient {\n private ws: WebSocket | null = null\n private callbacks: AgentActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private httpBaseUrl = ''\n /**\n * Explicit HTTP base for resolving relative content URLs (e.g. `/audio/<id>`).\n * When set (from the agent's canonical `hostUrl`), it takes precedence over\n * deriving the base from the WS URL — which cannot know the Load Balancer\n * path prefix (`/<agent-seg>`) and would otherwise drop it.\n */\n private httpBaseUrlOverride: string | undefined\n private agentId = ''\n /** Mirrors ``AgentProvider`` ``agentId`` so HTTP uploads work before WS ``connect`` completes. */\n private uploadAgentId = ''\n /** Current chat thread id for ``POST /uploads`` (aligns GCS path with ``hydrate_thread_events``). */\n private uploadThreadId = ''\n /** Optional run id for ``POST /uploads`` (metadata only). */\n private uploadRunId = ''\n private uploadUrl: string | undefined\n private config: AgentConnectionConfig = {\n organizationId: '',\n workspaceId: '',\n userId: '',\n channel: 'dooers-platform',\n }\n\n private connectFrameId = ''\n private isIntentionallyClosed = false\n private reconnectAttempts = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n\n // Refcounted subscriptions\n private subscriptionRefs = new Map<string, number>()\n\n // Track optimistic events for reconciliation\n private pendingOptimistic = new Map<string, { threadId: string; clientEventId: string }>()\n\n // Pending message promises — keyed by outbound frame id (same as client_event_id for sends).\n private pendingMessages = new Map<\n string,\n {\n resolve: (value: { threadId: string }) => void\n reject: (reason: Error) => void\n timer: ReturnType<typeof setTimeout>\n }\n >()\n\n private pendingArtifactsRequests = new Map<\n string,\n {\n threadId: string\n resolve: (value: {\n artifacts: ThreadArtifact[]\n cursor: string | null\n hasMore: boolean\n }) => void\n reject: (reason: Error) => void\n timer: ReturnType<typeof setTimeout>\n }\n >()\n\n // Track last event ID per thread for gap recovery on reconnect\n private lastEventIds = new Map<string, string>()\n\n // Pagination\n private lastThreadListCursor: string | null = null\n private isLoadingMore = false\n\n // Event pagination cursors per thread\n private eventPaginationCursors = new Map<string, string | null>()\n\n /** Active settings subscription — restored after reconnect. */\n private settingsSubscription: {\n audience: 'creator' | 'user'\n agentOwnerUserId: string | null\n } | null = null\n\n private pingTimer: ReturnType<typeof setInterval> | null = null\n\n constructor(callbacks: AgentActions) {\n this.callbacks = callbacks\n }\n\n setOnError(cb: OnErrorCallback | null) {\n this.onError = cb\n }\n\n setUploadUrl(url: string | undefined) {\n this.uploadUrl = url\n }\n\n /**\n * Set (or clear) the explicit HTTP base used to resolve relative content URLs.\n * Pass the agent's canonical `hostUrl` (base incl. LB seg, no message path).\n * Takes effect immediately and persists across reconnects.\n */\n setHttpBaseUrl(url: string | undefined) {\n const normalized = url?.trim().replace(/\\/+$/, '')\n this.httpBaseUrlOverride = normalized || undefined\n if (this.httpBaseUrlOverride) {\n this.httpBaseUrl = this.httpBaseUrlOverride\n }\n }\n\n /** Sync from ``AgentProvider`` ``agentId``; used for ``POST /uploads`` ``agent_id`` (non-WS). */\n setUploadAgentId(agentId: string | undefined) {\n this.uploadAgentId = (agentId ?? '').trim()\n }\n\n /** Sync active thread id for chat uploads (must match persisted thread for signed URL keys). */\n setUploadThreadId(threadId: string | undefined) {\n this.uploadThreadId = (threadId ?? '').trim()\n }\n\n setUploadRunId(runId: string | undefined) {\n this.uploadRunId = (runId ?? '').trim()\n }\n\n /**\n * Merge connection metadata without tearing down the WebSocket.\n * Use for handshake token refresh and identity/role updates on an open session.\n */\n updateConnectionConfig(config: Partial<AgentConnectionConfig>) {\n this.config = { ...this.config, ...config }\n }\n\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN\n }\n\n async upload(file: File | Blob, options?: { filename?: string }): Promise<UploadResult> {\n if (!this.uploadUrl) {\n throw new Error('uploadUrl not configured')\n }\n\n const aid = (this.uploadAgentId || this.agentId || '').trim()\n if (!aid) {\n throw new Error('agentId is required for upload (set AgentProvider agentId)')\n }\n\n const formData = new FormData()\n if (file instanceof File) {\n const partName = options?.filename?.trim() || file.name.trim() || 'upload'\n formData.append('file', file, partName)\n } else {\n formData.append('file', file, blobPartFilename(file, options?.filename))\n }\n formData.append('agent_id', aid)\n const tid = this.uploadThreadId.trim()\n if (tid) {\n formData.append('thread_id', tid)\n }\n const rid = this.uploadRunId.trim()\n if (rid) {\n formData.append('run_id', rid)\n }\n\n const headers: Record<string, string> = {}\n if (this.config.authToken) {\n headers.Authorization = `Bearer ${this.config.authToken}`\n }\n\n const response = await fetch(this.uploadUrl, {\n method: 'POST',\n body: formData,\n headers,\n })\n\n if (!response.ok) {\n const detail = await readHttpErrorMessage(response)\n throw new Error(detail)\n }\n\n const result = await response.json()\n return {\n refId: result.ref_id,\n mimeType: result.mime_type,\n filename: result.filename,\n sizeBytes: result.size_bytes ?? result.size ?? 0,\n publicUrl: result.public_url ?? undefined,\n }\n }\n\n connect(url: string, agentId: string, config?: AgentConnectionConfig) {\n this.url = apiMessagesUrlToWebSocketUrl(url)\n this.agentId = agentId\n this.uploadAgentId = agentId.trim()\n this.config = config ?? { organizationId: '', workspaceId: '', userId: '' }\n this.isIntentionallyClosed = false\n\n // Derive HTTP base URL from WebSocket URL for resolving relative content URLs\n if (this.httpBaseUrlOverride) {\n // Caller provided the canonical base (hostUrl); trust it verbatim so the\n // LB path prefix is preserved when resolving relative content URLs.\n this.httpBaseUrl = this.httpBaseUrlOverride\n } else {\n try {\n const parsed = new URL(this.url)\n parsed.protocol = parsed.protocol === 'wss:' ? 'https:' : 'http:'\n parsed.pathname = ''\n parsed.search = ''\n parsed.hash = ''\n this.httpBaseUrl = parsed.toString().replace(/\\/$/, '')\n } catch {\n this.httpBaseUrl = ''\n }\n }\n\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n /** Clear the last in-chat send error banner (see ``connection.sendError``). */\n clearSendError() {\n this.callbacks.setSendError(null)\n }\n\n private abortPendingMessages(reason: string) {\n for (const [clientEventId, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n const opt = this.pendingOptimistic.get(clientEventId)\n if (opt?.threadId) {\n this.callbacks.removeOptimistic(opt.threadId, clientEventId)\n }\n this.pendingOptimistic.delete(clientEventId)\n pending.reject(new Error(reason))\n }\n this.pendingMessages.clear()\n }\n\n private abortPendingArtifacts(reason: string) {\n for (const [frameId, pending] of this.pendingArtifactsRequests) {\n clearTimeout(pending.timer)\n this.pendingArtifactsRequests.delete(frameId)\n pending.reject(new Error(reason))\n }\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n this.stopHeartbeat()\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n this.abortPendingMessages('Disconnected')\n this.abortPendingArtifacts('Disconnected')\n if (this.ws) {\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n this.ws = null\n }\n this.callbacks.setConnectionStatus('disconnected')\n }\n\n retry() {\n this.reconnectAttempts = 0\n this.isIntentionallyClosed = false\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n // --- Thread operations ---\n\n requestThreadList(cursor?: string | null, limit?: number) {\n this.send('thread.list', { cursor, limit })\n }\n\n subscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n this.subscriptionRefs.set(threadId, refs + 1)\n if (refs === 0) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', { thread_id: threadId, after_event_id: afterEventId })\n this.callbacks.addSubscription(threadId)\n }\n }\n\n unsubscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n if (refs <= 1) {\n this.subscriptionRefs.delete(threadId)\n this.lastEventIds.delete(threadId)\n this.eventPaginationCursors.delete(threadId)\n this.send('thread.unsubscribe', { thread_id: threadId })\n this.callbacks.removeSubscription(threadId)\n } else {\n this.subscriptionRefs.set(threadId, refs - 1)\n }\n }\n\n deleteThread(threadId: string) {\n this.send('thread.delete', { thread_id: threadId })\n }\n\n loadMoreThreads(limit?: number) {\n const cursor = this.lastThreadListCursor\n if (!cursor || this.isLoadingMore) return\n this.isLoadingMore = true\n this.send('thread.list', { cursor, limit })\n }\n\n loadOlderEvents(threadId: string, limit?: number) {\n const cursor = this.eventPaginationCursors.get(threadId)\n this.send('event.list', {\n thread_id: threadId,\n before_event_id: cursor ?? null,\n limit,\n })\n }\n\n requestThreadArtifactsList(\n threadId: string,\n options?: {\n cursor?: string | null\n limit?: number\n direction?: 'in' | 'out' | 'all'\n }\n ): Promise<{ artifacts: ThreadArtifact[]; cursor: string | null; hasMore: boolean }> {\n if (!this.isConnected()) {\n return Promise.reject(new Error('Not connected'))\n }\n\n const frameId = crypto.randomUUID()\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingArtifactsRequests.delete(frameId)\n reject(new Error('thread.artifacts.list timed out'))\n }, ARTIFACTS_LIST_TIMEOUT)\n\n this.pendingArtifactsRequests.set(frameId, {\n threadId,\n resolve: (value) => {\n clearTimeout(timer)\n resolve(value)\n },\n reject: (err) => {\n clearTimeout(timer)\n reject(err)\n },\n timer,\n })\n\n this.sendRaw({\n id: frameId,\n type: 'thread.artifacts.list',\n payload: {\n thread_id: threadId,\n cursor: options?.cursor ?? null,\n limit: options?.limit,\n direction: options?.direction ?? 'all',\n },\n })\n })\n }\n\n // --- Settings ---\n\n subscribeSettings(options?: { audience?: 'creator' | 'user'; agentOwnerUserId?: string | null }) {\n const audience = options?.audience ?? 'user'\n const agentOwnerUserId = options?.agentOwnerUserId ?? null\n this.settingsSubscription = { audience, agentOwnerUserId }\n this.send('settings.subscribe', {\n agent_id: this.agentId,\n audience,\n agent_owner_user_id: agentOwnerUserId,\n })\n }\n\n unsubscribeSettings() {\n this.settingsSubscription = null\n this.send('settings.unsubscribe', { agent_id: this.agentId })\n }\n\n patchSetting(fieldId: string, value: unknown) {\n this.send('settings.patch', { field_id: fieldId, value })\n }\n\n // --- Feedback ---\n\n sendFeedback(\n targetType: string,\n targetId: string,\n feedback: 'like' | 'dislike',\n reason?: string,\n classification?: string\n ) {\n this.send('feedback', {\n target_type: targetType,\n target_id: targetId,\n feedback,\n reason,\n classification,\n })\n }\n\n // --- Analytics ---\n\n subscribeAnalytics() {\n this.send('analytics.subscribe', { agent_id: this.agentId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { agent_id: this.agentId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n metadata?: Record<string, unknown>\n }): Promise<{ threadId: string }> {\n this.callbacks.setSendError(null)\n const clientEventId = crypto.randomUUID()\n const content: WireC2S_ContentPart[] = params.content\n ? params.content.map(toWireContentPart)\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic display content from send parts\n const displayContent: DisplayContentPart[] = params.content\n ? params.content.map((p): DisplayContentPart => {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio':\n return {\n type: 'audio',\n duration: p.duration,\n ...(p.url ? { url: p.url } : {}),\n ...(p.mimeType ? { mimeType: p.mimeType } : {}),\n ...(p.filename ? { filename: p.filename } : {}),\n }\n case 'image':\n return {\n type: 'image',\n ...(p.url ? { url: p.url } : {}),\n ...(p.mimeType ? { mimeType: p.mimeType } : {}),\n ...(p.filename ? { filename: p.filename } : {}),\n }\n case 'document':\n return {\n type: 'document',\n ...(p.url ? { url: p.url } : {}),\n ...(p.mimeType ? { mimeType: p.mimeType } : {}),\n ...(p.filename ? { filename: p.filename } : {}),\n }\n default:\n return { type: 'text', text: '' }\n }\n })\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic event\n const optimisticEvent: ThreadEvent = {\n id: `optimistic-${clientEventId}`,\n threadId: params.threadId ?? '',\n runId: null,\n type: 'message',\n actor: 'user',\n author: null,\n user: {\n userId: this.config.userId ?? '',\n userName: this.config.userName,\n userEmail: this.config.userEmail,\n identityIds: this.config.identityIds,\n systemRole: this.config.systemRole ?? 'user',\n organizationRole: this.config.organizationRole ?? 'member',\n workspaceRole: this.config.workspaceRole ?? 'member',\n },\n content: displayContent,\n createdAt: new Date().toISOString(),\n }\n\n if (params.threadId) {\n this.callbacks.addOptimistic(params.threadId, optimisticEvent, clientEventId)\n }\n\n this.pendingOptimistic.set(clientEventId, {\n threadId: params.threadId ?? '',\n clientEventId,\n })\n\n const promise = this.createPendingPromise(clientEventId)\n\n const payload: Record<string, unknown> = {\n thread_id: params.threadId,\n client_event_id: clientEventId,\n event: {\n type: 'message' as const,\n actor: 'user' as const,\n content,\n },\n }\n payload.metadata = this.withChannelMetadata(params.metadata)\n\n this.sendRaw({\n id: clientEventId,\n type: 'event.create',\n payload,\n })\n\n return promise\n }\n\n sendFormResponse(params: {\n threadId: string\n formEventId: string\n cancelled: boolean\n values: Record<string, unknown>\n metadata?: Record<string, unknown>\n }): Promise<{ threadId: string }> {\n this.callbacks.setSendError(null)\n const clientEventId = crypto.randomUUID()\n const promise = this.createPendingPromise(clientEventId)\n\n this.sendRaw({\n id: clientEventId,\n type: 'event.create',\n payload: {\n thread_id: params.threadId,\n client_event_id: clientEventId,\n event: {\n type: 'form.response' as const,\n actor: 'user' as const,\n content: [],\n data: {\n form_event_id: params.formEventId,\n cancelled: params.cancelled,\n values: params.values,\n },\n },\n },\n metadata: this.withChannelMetadata(params.metadata),\n })\n\n return promise\n }\n\n // --- Private ---\n\n private createPendingPromise(clientEventId: string): Promise<{ threadId: string }> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n const opt = this.pendingOptimistic.get(clientEventId)\n if (opt?.threadId) {\n this.callbacks.removeOptimistic(opt.threadId, clientEventId)\n }\n this.pendingOptimistic.delete(clientEventId)\n this.pendingMessages.delete(clientEventId)\n reject(new Error('Request timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, reject, timer })\n })\n }\n\n private createConnection() {\n this.stopHeartbeat()\n if (this.ws) {\n this.abortPendingMessages('Connection lost; reconnecting')\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n }\n\n this.ws = new WebSocket(this.url)\n\n this.ws.onopen = () => {\n this.authenticate()\n }\n\n this.ws.onmessage = (e: MessageEvent) => {\n try {\n const frame = JSON.parse(e.data as string) as ServerToClient\n this.route(frame)\n } catch {\n // Ignore malformed frames\n }\n }\n\n this.ws.onclose = () => {\n if (!this.isIntentionallyClosed) {\n this.scheduleReconnect()\n }\n }\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n }\n }\n\n private authenticate() {\n this.connectFrameId = crypto.randomUUID()\n this.sendRaw({\n id: this.connectFrameId,\n type: 'connect',\n payload: {\n agent_id: this.agentId,\n organization_id: this.config.organizationId ?? '',\n workspace_id: this.config.workspaceId ?? '',\n user: {\n user_id: this.config.userId ?? '',\n user_name: this.config.userName ?? null,\n user_email: this.config.userEmail ?? null,\n user_mobile_number: this.config.userMobileNumber ?? null,\n user_whatsapp_number: this.config.userWhatsappNumber ?? null,\n identity_ids: this.config.identityIds ?? [],\n system_role: this.config.systemRole ?? 'user',\n organization_role: this.config.organizationRole ?? 'member',\n workspace_role: this.config.workspaceRole ?? 'member',\n },\n auth_token: this.config.authToken,\n client: { name: 'dooers-agents-client', version: PACKAGE_VERSION },\n },\n })\n }\n\n private route(frame: ServerToClient) {\n switch (frame.type) {\n case 'ack': {\n if (frame.payload.ack_id === this.connectFrameId) {\n if (frame.payload.ok) {\n this.callbacks.setConnectionStatus('connected')\n this.callbacks.resetReconnect()\n this.requestThreadList()\n // Re-subscribe to previously tracked threads\n for (const threadId of this.subscriptionRefs.keys()) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', {\n thread_id: threadId,\n after_event_id: afterEventId,\n })\n }\n this.resubscribeSettings()\n this.startHeartbeat()\n } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n const ackId = frame.payload.ack_id\n const err = frame.payload.error\n if (ackId) {\n const pending = this.pendingMessages.get(ackId)\n if (pending) {\n clearTimeout(pending.timer)\n this.pendingMessages.delete(ackId)\n const msg = err.message || 'Request rejected'\n const opt = this.pendingOptimistic.get(ackId)\n if (opt?.threadId) {\n this.callbacks.removeOptimistic(opt.threadId, ackId)\n }\n this.pendingOptimistic.delete(ackId)\n pending.reject(new Error(msg))\n this.callbacks.setSendError(msg)\n }\n const artifactsPending = this.pendingArtifactsRequests.get(ackId)\n if (artifactsPending) {\n clearTimeout(artifactsPending.timer)\n this.pendingArtifactsRequests.delete(ackId)\n const msg = err.message || 'Request rejected'\n artifactsPending.reject(new Error(msg))\n }\n }\n this.onError?.({\n code: err.code,\n message: err.message,\n frameType: 'ack',\n })\n }\n break\n }\n\n case 'thread.list.result': {\n const threads = frame.payload.threads.map(toThread)\n const cursor = frame.payload.cursor ?? null\n const totalCount = frame.payload.total_count\n this.lastThreadListCursor = cursor\n if (this.isLoadingMore) {\n this.callbacks.onThreadListAppend(threads, cursor, totalCount)\n } else {\n this.callbacks.onThreadList(threads, cursor, totalCount)\n }\n this.isLoadingMore = false\n break\n }\n\n case 'thread.snapshot': {\n const thread = toThread(frame.payload.thread)\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n const runs = (frame.payload.runs ?? []).map(toRun)\n // Track last event for gap recovery\n const lastEvent = events[events.length - 1]\n if (lastEvent) {\n this.lastEventIds.set(thread.id, lastEvent.id)\n }\n // Set initial event pagination cursor to oldest event\n const oldestEvent = events[0]\n if (oldestEvent) {\n this.eventPaginationCursors.set(thread.id, oldestEvent.id)\n }\n this.callbacks.onThreadSnapshot(thread, events, runs)\n break\n }\n\n case 'event.append': {\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n // Collect reconciled client event IDs; resolve sends only after store update\n const resolvedClientEventIds: string[] = []\n const pendingIdsToResolve: string[] = []\n for (const event of events) {\n if (event.clientEventId && this.pendingOptimistic.has(event.clientEventId)) {\n resolvedClientEventIds.push(event.clientEventId)\n this.pendingOptimistic.delete(event.clientEventId)\n }\n if (event.clientEventId && this.pendingMessages.has(event.clientEventId)) {\n const pendingMessage = this.pendingMessages.get(event.clientEventId)\n if (pendingMessage) {\n clearTimeout(pendingMessage.timer)\n pendingIdsToResolve.push(event.clientEventId)\n }\n }\n }\n // Track last event for gap recovery on reconnect.\n // Only for subscribed threads — new threads receive event.append\n // before subscription exists, and lastEventIds feeds after_event_id\n // in subscribe(), which controls what the server includes in snapshots.\n const lastEvent = events[events.length - 1]\n if (lastEvent && this.subscriptionRefs.has(frame.payload.thread_id)) {\n this.lastEventIds.set(frame.payload.thread_id, lastEvent.id)\n }\n // Atomically append confirmed events and remove reconciled optimistic events\n if (resolvedClientEventIds.length > 0) {\n this.callbacks.reconcileEvents(frame.payload.thread_id, events, resolvedClientEventIds)\n } else {\n this.callbacks.onEventAppend(frame.payload.thread_id, events)\n }\n const tid = frame.payload.thread_id\n for (const id of pendingIdsToResolve) {\n const pending = this.pendingMessages.get(id)\n if (pending) {\n pending.resolve({ threadId: tid })\n this.pendingMessages.delete(id)\n }\n }\n break\n }\n\n case 'event.list.result': {\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n this.eventPaginationCursors.set(frame.payload.thread_id, frame.payload.cursor)\n this.callbacks.onEventListResult(\n frame.payload.thread_id,\n events,\n frame.payload.cursor,\n frame.payload.has_more\n )\n break\n }\n\n case 'thread.artifacts.list.result': {\n const threadId = frame.payload.thread_id\n for (const [frameId, pending] of this.pendingArtifactsRequests) {\n if (pending.threadId !== threadId) continue\n clearTimeout(pending.timer)\n this.pendingArtifactsRequests.delete(frameId)\n pending.resolve({\n artifacts: this.resolveArtifactUrls(frame.payload.artifacts.map(toThreadArtifact)),\n cursor: frame.payload.cursor,\n hasMore: frame.payload.has_more,\n })\n break\n }\n break\n }\n\n case 'thread.upsert':\n this.callbacks.onThreadUpsert(toThread(frame.payload.thread))\n break\n\n case 'thread.deleted':\n this.callbacks.onThreadDeleted(frame.payload.thread_id)\n this.lastEventIds.delete(frame.payload.thread_id)\n break\n\n case 'run.upsert':\n this.callbacks.onRunUpsert(toRun(frame.payload.run))\n break\n\n case 'settings.snapshot': {\n const fields = frame.payload.fields.map(toSettingsItem)\n this.callbacks.onSettingsSnapshot(fields, frame.payload.updated_at)\n break\n }\n\n case 'settings.patch':\n this.callbacks.onSettingsPatch(\n frame.payload.field_id,\n frame.payload.value,\n frame.payload.updated_at\n )\n break\n\n case 'settings.public_schema.result':\n break\n\n case 'feedback.ack':\n if (frame.payload.ok) {\n this.callbacks.onFeedbackAck(\n frame.payload.target_id,\n frame.payload.feedback as 'like' | 'dislike'\n )\n }\n break\n\n case 'analytics.event':\n this.callbacks.onAnalyticsEvent(toAnalyticsEvent(frame.payload))\n break\n\n case 'pong':\n break\n }\n }\n\n private resubscribeSettings() {\n if (!this.settingsSubscription) return\n this.send('settings.subscribe', {\n agent_id: this.agentId,\n audience: this.settingsSubscription.audience,\n agent_owner_user_id: this.settingsSubscription.agentOwnerUserId,\n })\n }\n\n private startHeartbeat() {\n this.stopHeartbeat()\n this.pingTimer = setInterval(() => {\n this.send('ping', {})\n }, PING_INTERVAL_MS)\n }\n\n private stopHeartbeat() {\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n }\n\n private scheduleReconnect() {\n this.stopHeartbeat()\n if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\n this.abortPendingMessages('Connection lost after maximum retries')\n this.abortPendingArtifacts('Connection lost after maximum retries')\n this.callbacks.setReconnectFailed()\n this.callbacks.setConnectionStatus('error', 'Connection lost after maximum retries')\n return\n }\n this.callbacks.setConnectionStatus('disconnected')\n const delay = RECONNECT_DELAYS[this.reconnectAttempts] ?? 16000\n this.reconnectAttempts++\n this.reconnectTimer = setTimeout(() => {\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }, delay)\n }\n\n private send(type: string, payload: unknown) {\n this.sendRaw({ id: crypto.randomUUID(), type, payload })\n }\n\n private withChannelMetadata(\n metadata: Record<string, unknown> | undefined\n ): Record<string, unknown> | undefined {\n const channel = (this.config.channel || 'dooers-platform').trim() || 'dooers-platform'\n const base = metadata ? { ...metadata } : {}\n if (!('channel' in base)) {\n base.channel = channel\n }\n if (this.config.channelMeta && !('channel_meta' in base)) {\n base.channel_meta = this.config.channelMeta\n }\n return Object.keys(base).length > 0 ? base : undefined\n }\n\n private sendRaw(frame: unknown) {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return\n this.ws.send(JSON.stringify(frame))\n }\n\n /** Resolve relative URLs in event content parts against the agent's HTTP base. */\n private resolveEventUrls(events: ThreadEvent[]): ThreadEvent[] {\n if (!this.httpBaseUrl) return events\n const base = this.httpBaseUrl\n return events.map((event) => {\n if (!event.content?.some((p) => 'url' in p && p.url?.startsWith('/'))) return event\n return {\n ...event,\n content: event.content.map((part) =>\n 'url' in part && part.url?.startsWith('/') ? { ...part, url: `${base}${part.url}` } : part\n ),\n }\n })\n }\n\n private resolveArtifactUrls(artifacts: ThreadArtifact[]): ThreadArtifact[] {\n if (!this.httpBaseUrl) return artifacts\n const base = this.httpBaseUrl\n return artifacts.map((artifact) => {\n if (!artifact.url?.startsWith('/')) return artifact\n return { ...artifact, url: `${base}${artifact.url}` }\n })\n }\n}\n","import { createStore } from 'zustand/vanilla'\nimport type {\n AnalyticsEvent,\n DisplayContentPart,\n Run,\n SettingsItem,\n Thread,\n ThreadEvent,\n} from './types'\nimport { isSettingsFieldGroup } from './types'\n\ntype FormState = {\n values: Record<string, unknown>\n submitting: boolean\n submitted: boolean\n cancelled: boolean\n}\n\n/** Extract form states from form.response events to restore submitted/cancelled state. */\n/** Merge wire content so a later frame (e.g. run_id patch) does not drop a hydrated ``url``. */\nfunction mergeDisplayContentParts(\n prev: DisplayContentPart[] | undefined,\n next: DisplayContentPart[] | undefined\n): DisplayContentPart[] | undefined {\n if (!next?.length) return prev\n if (!prev?.length) return next\n const out: DisplayContentPart[] = []\n const len = Math.max(prev.length, next.length)\n for (let i = 0; i < len; i++) {\n const p = prev[i]\n const n = next[i]\n if (!n) {\n if (p) out.push(p)\n continue\n }\n if (!p) {\n out.push(n)\n continue\n }\n if (p.type !== n.type) {\n out.push(n)\n continue\n }\n if (n.type === 'image' || n.type === 'audio' || n.type === 'document') {\n const url = n.url ?? ('url' in p ? p.url : undefined)\n out.push({ ...p, ...n, ...(url ? { url } : {}) } as DisplayContentPart)\n continue\n }\n out.push(n)\n }\n return out\n}\n\nfunction mergeThreadEventById(prev: ThreadEvent, next: ThreadEvent): ThreadEvent {\n const content = mergeDisplayContentParts(prev.content, next.content)\n return {\n ...prev,\n ...next,\n ...(content !== undefined ? { content } : {}),\n }\n}\n\nfunction extractFormStates(\n events: ThreadEvent[],\n existing: Record<string, FormState>\n): Record<string, FormState> {\n let result = existing\n for (const e of events) {\n if (e.type === 'form.response' && e.data) {\n const formEventId = e.data.form_event_id as string\n if (formEventId && !result[formEventId]) {\n const cancelled = (e.data.cancelled as boolean) ?? false\n const values = (e.data.values as Record<string, unknown>) ?? {}\n result = {\n ...result,\n [formEventId]: { values, submitting: false, submitted: !cancelled, cancelled },\n }\n }\n }\n }\n return result\n}\n\nexport interface AgentActions {\n setConnectionStatus: (status: AgentState['connection']['status'], error?: string) => void\n setSendError: (message: string | null) => void\n setReconnectFailed: () => void\n resetReconnect: () => void\n onThreadList: (threads: Thread[], cursor?: string | null, totalCount?: number) => void\n onThreadListAppend: (threads: Thread[], cursor?: string | null, totalCount?: number) => void\n onThreadUpsert: (thread: Thread) => void\n onThreadDeleted: (threadId: string) => void\n onThreadSnapshot: (thread: Thread, events: ThreadEvent[], runs: Run[]) => void\n onEventAppend: (threadId: string, events: ThreadEvent[]) => void\n reconcileEvents: (\n threadId: string,\n events: ThreadEvent[],\n resolvedClientEventIds: string[]\n ) => void\n onEventListResult: (\n threadId: string,\n events: ThreadEvent[],\n cursor: string | null,\n hasMore: boolean\n ) => void\n onRunUpsert: (run: Run) => void\n addOptimistic: (threadId: string, event: ThreadEvent, clientEventId: string) => void\n removeOptimistic: (threadId: string, clientEventId: string) => void\n addSubscription: (threadId: string) => void\n removeSubscription: (threadId: string) => void\n onSettingsSnapshot: (fields: SettingsItem[], updatedAt: string) => void\n onSettingsPatch: (fieldId: string, value: unknown, updatedAt: string) => void\n onFeedbackAck: (targetId: string, feedback: 'like' | 'dislike') => void\n onAnalyticsEvent: (event: AnalyticsEvent) => void\n resetAnalytics: () => void\n initFormState: (formEventId: string, defaults: Record<string, unknown>) => void\n setFormValue: (formEventId: string, fieldName: string, value: unknown) => void\n setFormSubmitting: (formEventId: string, submitting: boolean) => void\n setFormSubmitted: (formEventId: string) => void\n setFormCancelled: (formEventId: string) => void\n}\n\nexport interface AgentState {\n connection: {\n status: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n error: string | null\n /** Last server rejection for ``event.create`` / send (e.g. upload ref not found). */\n sendError: string | null\n reconnectAttempts: number\n reconnectFailed: boolean\n }\n threads: Record<string, Thread>\n threadOrder: string[]\n threadListCursor: string | null\n threadListHasMore: boolean\n threadListTotalCount: number\n events: Record<string, ThreadEvent[]>\n eventPagination: Record<string, { cursor: string | null; hasMore: boolean }>\n optimistic: Record<string, ThreadEvent[]>\n optimisticKeys: Record<string, string[]>\n runs: Record<string, Run[]>\n settings: {\n fields: SettingsItem[]\n updatedAt: string | null\n isLoading: boolean\n }\n feedback: Record<string, 'like' | 'dislike'>\n analytics: {\n events: AnalyticsEvent[]\n counters: {\n totalRequests: number\n feedbackLikes: number\n feedbackDislikes: number\n }\n }\n formStates: Record<string, FormState>\n subscriptions: Set<string>\n loadingThreads: Set<string>\n actions: AgentActions\n}\n\nexport type AgentStore = ReturnType<typeof createAgentStore>\n\nexport function createAgentStore() {\n return createStore<AgentState>()((set) => ({\n connection: {\n status: 'idle',\n error: null,\n sendError: null,\n reconnectAttempts: 0,\n reconnectFailed: false,\n },\n threads: {},\n threadOrder: [],\n threadListCursor: null,\n threadListHasMore: false,\n threadListTotalCount: 0,\n events: {},\n eventPagination: {},\n optimistic: {},\n optimisticKeys: {},\n runs: {},\n settings: {\n fields: [],\n updatedAt: null,\n isLoading: true,\n },\n feedback: {},\n formStates: {},\n analytics: {\n events: [],\n counters: { totalRequests: 0, feedbackLikes: 0, feedbackDislikes: 0 },\n },\n subscriptions: new Set(),\n loadingThreads: new Set(),\n\n actions: {\n setConnectionStatus: (status, error) =>\n set((s) => ({\n connection: {\n ...s.connection,\n status,\n error: error ?? null,\n ...(status === 'connected' ? { sendError: null } : {}),\n },\n })),\n\n setSendError: (message) =>\n set((s) => ({\n connection: { ...s.connection, sendError: message },\n })),\n\n setReconnectFailed: () =>\n set((s) => ({\n connection: { ...s.connection, reconnectFailed: true },\n })),\n\n resetReconnect: () =>\n set((s) => ({\n connection: { ...s.connection, reconnectAttempts: 0, reconnectFailed: false },\n })),\n\n onThreadList: (threads, cursor, totalCount) =>\n set(() => {\n const map: Record<string, Thread> = {}\n const order: string[] = []\n for (const t of threads) {\n map[t.id] = t\n order.push(t.id)\n }\n return {\n threads: map,\n threadOrder: order,\n threadListCursor: cursor ?? null,\n threadListHasMore: cursor != null,\n threadListTotalCount: totalCount ?? 0,\n }\n }),\n\n onThreadListAppend: (threads, cursor) =>\n set((s) => {\n const map = { ...s.threads }\n const order = [...s.threadOrder]\n for (const t of threads) {\n if (!map[t.id]) {\n order.push(t.id)\n }\n map[t.id] = t\n }\n return {\n threads: map,\n threadOrder: order,\n threadListCursor: cursor ?? null,\n threadListHasMore: cursor != null,\n }\n }),\n\n onThreadUpsert: (thread) =>\n set((s) => {\n const threads = { ...s.threads, [thread.id]: thread }\n const threadOrder = s.threadOrder.includes(thread.id)\n ? s.threadOrder\n : [thread.id, ...s.threadOrder]\n return { threads, threadOrder }\n }),\n\n onThreadDeleted: (threadId) =>\n set((s) => {\n const { [threadId]: _, ...threads } = s.threads\n const { [threadId]: _e, ...events } = s.events\n const { [threadId]: _r, ...runs } = s.runs\n const { [threadId]: _o, ...optimistic } = s.optimistic\n const { [threadId]: _k, ...optimisticKeys } = s.optimisticKeys\n const { [threadId]: _p, ...eventPagination } = s.eventPagination\n const threadOrder = s.threadOrder.filter((id) => id !== threadId)\n const subscriptions = new Set(s.subscriptions)\n subscriptions.delete(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(threadId)\n // Clean up form states for events belonging to this thread\n const deletedEvents = s.events[threadId] ?? []\n const deletedEventIds = new Set(deletedEvents.map((e) => e.id))\n const formStates = { ...s.formStates }\n for (const key of Object.keys(formStates)) {\n if (deletedEventIds.has(key)) {\n delete formStates[key]\n }\n }\n return {\n threads,\n threadOrder,\n events,\n runs,\n optimistic,\n optimisticKeys,\n eventPagination,\n subscriptions,\n loadingThreads,\n formStates,\n }\n }),\n\n onThreadSnapshot: (thread, snapshotEvents, runs) =>\n set((s) => {\n const threads = { ...s.threads, [thread.id]: thread }\n const threadOrder = s.threadOrder.includes(thread.id)\n ? s.threadOrder\n : [thread.id, ...s.threadOrder]\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(thread.id)\n\n // Events may already exist from event.append arriving before the\n // snapshot (race between the two data paths). Existing array is\n // already in chronological order. Append only snapshot events we\n // don't have yet — never reorder what's already in place.\n const existing = s.events[thread.id] ?? []\n let mergedEvents: ThreadEvent[]\n if (existing.length === 0) {\n mergedEvents = snapshotEvents\n } else {\n const existingIds = new Set(existing.map((e) => e.id))\n const snapById = new Map(snapshotEvents.map((e) => [e.id, e]))\n const mergedExisting = existing.map((e) => {\n const snap = snapById.get(e.id)\n return snap ? mergeThreadEventById(e, snap) : e\n })\n const newFromSnapshot = snapshotEvents.filter((e) => !existingIds.has(e.id))\n mergedEvents =\n newFromSnapshot.length > 0 ? [...mergedExisting, ...newFromSnapshot] : mergedExisting\n }\n\n // Snapshot is authoritative — clear optimistic state for this thread.\n const optimistic = { ...s.optimistic }\n const optimisticKeys = { ...s.optimisticKeys }\n delete optimistic[thread.id]\n delete optimisticKeys[thread.id]\n\n return {\n threads,\n threadOrder,\n events: { ...s.events, [thread.id]: mergedEvents },\n runs: { ...s.runs, [thread.id]: runs },\n optimistic,\n optimisticKeys,\n loadingThreads,\n formStates: extractFormStates(mergedEvents, s.formStates),\n }\n }),\n\n onEventAppend: (threadId, newEvents) =>\n set((s) => {\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n // Separate new events from updates to existing events\n const updates = new Map<string, ThreadEvent>()\n const appends: ThreadEvent[] = []\n for (const e of newEvents) {\n if (existingIds.has(e.id)) {\n const prev = existing.find((x) => x.id === e.id)!\n updates.set(e.id, mergeThreadEventById(prev, e))\n } else {\n appends.push(e)\n }\n }\n // Apply in-place updates then append new events\n const merged = updates.size > 0 ? existing.map((e) => updates.get(e.id) ?? e) : existing\n return {\n events: { ...s.events, [threadId]: [...merged, ...appends] },\n formStates: extractFormStates(appends, s.formStates),\n }\n }),\n\n reconcileEvents: (threadId, newEvents, resolvedClientEventIds) =>\n set((s) => {\n // Append confirmed events\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const mergedExisting =\n newEvents.length > 0\n ? existing.map((e) => {\n const up = newEvents.find((n) => n.id === e.id)\n return up ? mergeThreadEventById(e, up) : e\n })\n : existing\n const unique = newEvents.filter((e) => !existingIds.has(e.id))\n\n // Remove reconciled optimistic events\n let optEvents = s.optimistic[threadId] ?? []\n let optKeys = s.optimisticKeys[threadId] ?? []\n for (const clientEventId of resolvedClientEventIds) {\n const idx = optKeys.indexOf(clientEventId)\n if (idx >= 0) {\n optEvents = [...optEvents]\n optEvents.splice(idx, 1)\n optKeys = [...optKeys]\n optKeys.splice(idx, 1)\n }\n }\n\n return {\n events: { ...s.events, [threadId]: [...mergedExisting, ...unique] },\n optimistic: { ...s.optimistic, [threadId]: optEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: optKeys },\n }\n }),\n\n onEventListResult: (threadId, olderEvents, cursor, hasMore) =>\n set((s) => {\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const unique = olderEvents.filter((e) => !existingIds.has(e.id))\n return {\n events: { ...s.events, [threadId]: [...unique, ...existing] },\n eventPagination: {\n ...s.eventPagination,\n [threadId]: { cursor, hasMore },\n },\n }\n }),\n\n onRunUpsert: (run) =>\n set((s) => {\n const existing = s.runs[run.threadId] ?? []\n const idx = existing.findIndex((r) => r.id === run.id)\n const updated =\n idx >= 0 ? existing.map((r) => (r.id === run.id ? run : r)) : [...existing, run]\n return { runs: { ...s.runs, [run.threadId]: updated } }\n }),\n\n addOptimistic: (threadId, event, clientEventId) =>\n set((s) => ({\n optimistic: {\n ...s.optimistic,\n [threadId]: [...(s.optimistic[threadId] ?? []), event],\n },\n optimisticKeys: {\n ...s.optimisticKeys,\n [threadId]: [...(s.optimisticKeys[threadId] ?? []), clientEventId],\n },\n })),\n\n removeOptimistic: (threadId, clientEventId) =>\n set((s) => {\n const keys = s.optimisticKeys[threadId] ?? []\n const idx = keys.indexOf(clientEventId)\n if (idx < 0) return s\n const newKeys = [...keys]\n newKeys.splice(idx, 1)\n const newEvents = [...(s.optimistic[threadId] ?? [])]\n newEvents.splice(idx, 1)\n return {\n optimistic: { ...s.optimistic, [threadId]: newEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: newKeys },\n }\n }),\n\n addSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.add(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n const alreadyHadEvents = (s.events[threadId]?.length ?? 0) > 0\n if (!alreadyHadEvents) {\n loadingThreads.add(threadId)\n }\n return { subscriptions, loadingThreads }\n }),\n\n removeSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.delete(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(threadId)\n return { subscriptions, loadingThreads }\n }),\n\n onSettingsSnapshot: (fields, updatedAt) =>\n set(() => ({\n settings: { fields, updatedAt, isLoading: false },\n })),\n\n onSettingsPatch: (fieldId, value, updatedAt) =>\n set((s) => ({\n settings: {\n ...s.settings,\n updatedAt,\n fields: s.settings.fields.map((item) => {\n if (isSettingsFieldGroup(item)) {\n const hasField = item.fields.some((f) => f.id === fieldId)\n if (hasField) {\n return {\n ...item,\n fields: item.fields.map((f) => (f.id === fieldId ? { ...f, value } : f)),\n }\n }\n return item\n }\n return item.id === fieldId ? { ...item, value } : item\n }),\n },\n })),\n\n onFeedbackAck: (targetId, feedback) =>\n set((s) => ({\n feedback: { ...s.feedback, [targetId]: feedback },\n })),\n\n onAnalyticsEvent: (event) =>\n set((s) => {\n const events = [...s.analytics.events, event]\n const trimmed = events.length > 50 ? events.slice(-50) : events\n const counters = { ...s.analytics.counters }\n if (event.event === 'feedback.like') {\n counters.feedbackLikes += 1\n } else if (event.event === 'feedback.dislike') {\n counters.feedbackDislikes += 1\n } else {\n counters.totalRequests += 1\n }\n return { analytics: { events: trimmed, counters } }\n }),\n\n resetAnalytics: () =>\n set(() => ({\n analytics: {\n events: [],\n counters: { totalRequests: 0, feedbackLikes: 0, feedbackDislikes: 0 },\n },\n })),\n initFormState: (formEventId, defaults) =>\n set((s) => {\n if (s.formStates[formEventId]) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: {\n values: defaults,\n submitting: false,\n submitted: false,\n cancelled: false,\n },\n },\n }\n }),\n setFormSubmitting: (formEventId, submitting) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: { ...existing, submitting },\n },\n }\n }),\n setFormValue: (formEventId, fieldName, value) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing || existing.submitted || existing.cancelled) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: {\n ...existing,\n values: { ...existing.values, [fieldName]: value },\n },\n },\n }\n }),\n setFormSubmitted: (formEventId) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: { ...existing, submitting: false, submitted: true },\n },\n }\n }),\n setFormCancelled: (formEventId) =>\n set((s) => {\n const existing = s.formStates[formEventId]\n if (!existing) return s\n return {\n formStates: {\n ...s.formStates,\n [formEventId]: { ...existing, submitting: false, cancelled: true },\n },\n }\n }),\n },\n }))\n}\n","import { createContext, type ReactNode, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useStore as useZustandStore } from 'zustand'\nimport { useShallow } from 'zustand/shallow'\nimport { AgentClient, type AgentConnectionConfig, type OnErrorCallback } from './client'\nimport { type AgentState, type AgentStore, createAgentStore } from './store'\n\ninterface AgentContextValue {\n store: AgentStore\n client: AgentClient\n}\n\nconst AgentContext = createContext<AgentContextValue | null>(null)\n\nexport interface AgentProviderProps {\n url?: string\n agentId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n userMobileNumber?: string\n userWhatsappNumber?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n channel?: string\n channelMeta?: Record<string, unknown>\n uploadUrl?: string\n /**\n * Explicit HTTP base (agent `hostUrl`: scheme+host+seg, no message path) used\n * to resolve relative content URLs like `/audio/<id>`. When omitted, the base\n * is derived from `url` — which cannot preserve the Load Balancer path prefix.\n */\n httpBaseUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function AgentProvider({\n url,\n agentId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n userMobileNumber,\n userWhatsappNumber,\n identityIds,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n channel,\n channelMeta,\n uploadUrl,\n httpBaseUrl,\n onError,\n children,\n}: AgentProviderProps) {\n const storeRef = useRef<AgentStore | undefined>(undefined)\n const clientRef = useRef<AgentClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createAgentStore()\n clientRef.current = new AgentClient(storeRef.current.getState().actions)\n }\n\n // Update onError callback\n useEffect(() => {\n clientRef.current?.setOnError(onError ?? null)\n }, [onError])\n\n // Update upload URL\n useEffect(() => {\n clientRef.current?.setUploadUrl(uploadUrl)\n }, [uploadUrl])\n\n // Set the explicit HTTP base (hostUrl) before connect derives one from the WS URL.\n useEffect(() => {\n clientRef.current?.setHttpBaseUrl(httpBaseUrl)\n }, [httpBaseUrl])\n\n // HTTP uploads require agent_id before WS connect completes\n useEffect(() => {\n clientRef.current?.setUploadAgentId(agentId)\n }, [agentId])\n\n // Stable key for identityIds to avoid reference-equality churn\n const identityIdsKey = identityIds?.join(',') ?? ''\n const channelMetaKey = channelMeta ? JSON.stringify(channelMeta) : ''\n\n const connectionConfig = useMemo((): AgentConnectionConfig => {\n let parsedChannelMeta: Record<string, unknown> | undefined\n if (channelMetaKey) {\n try {\n parsedChannelMeta = JSON.parse(channelMetaKey) as Record<string, unknown>\n } catch {\n parsedChannelMeta = channelMeta\n }\n }\n return {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n userMobileNumber,\n userWhatsappNumber,\n identityIds: identityIdsKey ? identityIdsKey.split(',') : undefined,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n channel,\n channelMeta: parsedChannelMeta,\n }\n }, [\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n userMobileNumber,\n userWhatsappNumber,\n identityIdsKey,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n channel,\n channelMetaKey,\n channelMeta,\n ])\n\n const connectionConfigRef = useRef(connectionConfig)\n connectionConfigRef.current = connectionConfig\n\n // Hard reconnect only when endpoint or agent identity changes.\n useEffect(() => {\n if (!url || !agentId) {\n clientRef.current?.disconnect()\n return\n }\n clientRef.current?.connect(url, agentId, connectionConfigRef.current)\n return () => clientRef.current?.disconnect()\n }, [url, agentId])\n\n // Hot-update metadata (handshake token refresh, roles, user fields) without reconnecting.\n useEffect(() => {\n if (!url || !agentId) return\n clientRef.current?.updateConnectionConfig(connectionConfig)\n }, [url, agentId, connectionConfig])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<AgentContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <AgentContext.Provider value={contextValue}>{children}</AgentContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useAgentContext(): AgentContextValue {\n const ctx = useContext(AgentContext)\n if (!ctx) {\n throw new Error('useAgentContext must be used within a <AgentProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: AgentState) => T): T {\n const { store } = useAgentContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: AgentState) => T): T {\n const { store } = useAgentContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useShallowStore } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useAgentContext()\n\n const events = useShallowStore((s) => s.analytics.events)\n const counters = useShallowStore((s) => s.analytics.counters)\n\n const subscribe = useCallback(() => client.subscribeAnalytics(), [client])\n const unsubscribe = useCallback(() => client.unsubscribeAnalytics(), [client])\n\n return { events, counters, subscribe, unsubscribe }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\nfunction getPreferredMimeType(): string {\n if (typeof MediaRecorder !== 'undefined') {\n if (MediaRecorder.isTypeSupported('audio/webm;codecs=opus')) return 'audio/webm;codecs=opus'\n if (MediaRecorder.isTypeSupported('audio/webm')) return 'audio/webm'\n if (MediaRecorder.isTypeSupported('audio/mp4')) return 'audio/mp4'\n }\n return 'audio/webm'\n}\n\nexport function useAudioRecorder() {\n const [isRecording, setIsRecording] = useState(false)\n const [duration, setDuration] = useState(0)\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const startTimeRef = useRef<number>(0)\n const resolveStopRef = useRef<((blob: Blob) => void) | null>(null)\n const audioContextRef = useRef<AudioContext | null>(null)\n const analyserRef = useRef<AnalyserNode | null>(null)\n\n const releaseAudioContext = useCallback(() => {\n analyserRef.current = null\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n audioContextRef.current.close()\n }\n audioContextRef.current = null\n }, [])\n\n const releaseStream = useCallback(() => {\n streamRef.current?.getTracks().forEach((t) => {\n t.stop()\n })\n streamRef.current = null\n releaseAudioContext()\n }, [releaseAudioContext])\n\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (mediaRecorderRef.current?.state === 'recording') {\n mediaRecorderRef.current.stop()\n }\n releaseStream()\n clearTimer()\n }\n }, [releaseStream, clearTimer])\n\n const start = useCallback(async () => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n streamRef.current = stream\n\n const audioContext = new AudioContext()\n audioContextRef.current = audioContext\n const source = audioContext.createMediaStreamSource(stream)\n const analyser = audioContext.createAnalyser()\n analyser.fftSize = 256\n source.connect(analyser)\n analyserRef.current = analyser\n\n const mimeType = getPreferredMimeType()\n const recorder = new MediaRecorder(stream, { mimeType })\n mediaRecorderRef.current = recorder\n chunksRef.current = []\n\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data)\n }\n\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: mimeType.split(';')[0] })\n releaseStream()\n clearTimer()\n resolveStopRef.current?.(blob)\n resolveStopRef.current = null\n }\n\n startTimeRef.current = Date.now()\n setDuration(0)\n timerRef.current = setInterval(() => {\n setDuration(Math.floor((Date.now() - startTimeRef.current) / 1000))\n }, 1000)\n\n recorder.start()\n setIsRecording(true)\n }, [releaseStream, clearTimer])\n\n const stop = useCallback((): Promise<Blob> => {\n return new Promise((resolve, reject) => {\n if (!mediaRecorderRef.current || mediaRecorderRef.current.state === 'inactive') {\n reject(new Error('No active recording to stop'))\n return\n }\n resolveStopRef.current = resolve\n mediaRecorderRef.current.stop()\n setIsRecording(false)\n setDuration(0)\n })\n }, [])\n\n const cancel = useCallback(() => {\n resolveStopRef.current = null\n if (mediaRecorderRef.current?.state === 'recording') {\n mediaRecorderRef.current.stop()\n }\n releaseStream()\n clearTimer()\n setIsRecording(false)\n setDuration(0)\n }, [releaseStream, clearTimer])\n\n return { start, stop, cancel, isRecording, duration, analyserNode: analyserRef.current }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useStore } from '../provider'\n\nexport function useConnection() {\n const { client } = useAgentContext()\n\n const status = useStore((s) => s.connection.status)\n const error = useStore((s) => s.connection.error)\n const sendError = useStore((s) => s.connection.sendError)\n const reconnectFailed = useStore((s) => s.connection.reconnectFailed)\n\n const reconnect = useCallback(() => client.retry(), [client])\n const dismissSendError = useCallback(() => {\n client.clearSendError()\n }, [client])\n\n return { status, error, sendError, dismissSendError, reconnectFailed, reconnect }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useStore } from '../provider'\nimport type { FeedbackTarget } from '../types'\n\nexport function useFeedback(targetId: string, targetType: FeedbackTarget = 'event') {\n const { client } = useAgentContext()\n\n const feedback = useStore((s) => s.feedback[targetId] ?? null)\n\n const like = useCallback(\n (reason?: string, classification?: string) =>\n client.sendFeedback(targetType, targetId, 'like', reason, classification),\n [client, targetType, targetId]\n )\n\n const dislike = useCallback(\n (reason?: string, classification?: string) =>\n client.sendFeedback(targetType, targetId, 'dislike', reason, classification),\n [client, targetType, targetId]\n )\n\n return { feedback, like, dislike }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useAgentContext, useStore } from '../provider'\nimport type { FormElement, FormEventData } from '../types'\n\nexport function useForm(formEventId: string, formData: FormEventData, threadId?: string) {\n const { client, store } = useAgentContext()\n const formState = useStore((s) => s.formStates[formEventId])\n const [errors, setErrors] = useState<Record<string, string>>({})\n\n // Initialize form state with defaults\n useEffect(() => {\n const defaults: Record<string, unknown> = {}\n for (const el of formData.elements) {\n if ('default' in el && el.default != null) {\n defaults[el.name] = el.default\n }\n }\n store.getState().actions.initFormState(formEventId, defaults)\n }, [formEventId, formData.elements, store])\n\n const values = formState?.values ?? {}\n const isSubmitting = formState?.submitting ?? false\n const isSubmitted = formState?.submitted ?? false\n const isCancelled = formState?.cancelled ?? false\n const isDisabled = isSubmitting || isSubmitted || isCancelled\n\n const setValue = useCallback(\n (fieldName: string, value: unknown) => {\n store.getState().actions.setFormValue(formEventId, fieldName, value)\n setErrors((prev) => {\n if (!prev[fieldName]) return prev\n const next = { ...prev }\n delete next[fieldName]\n return next\n })\n },\n [formEventId, store]\n )\n\n const validate = useCallback((): boolean => {\n const currentValues = store.getState().formStates[formEventId]?.values ?? {}\n const newErrors: Record<string, string> = {}\n\n for (const el of formData.elements) {\n if (!el.required) continue\n const val = currentValues[el.name]\n if (isEmptyValue(el, val)) {\n newErrors[el.name] = 'Required'\n }\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [formEventId, formData.elements, store])\n\n const submit = useCallback(async () => {\n const state = store.getState()\n const fs = state.formStates[formEventId]\n if (!fs || fs.submitting || fs.submitted || fs.cancelled) return\n if (!validate()) return\n\n state.actions.setFormSubmitting(formEventId, true)\n const currentValues = state.formStates[formEventId]?.values ?? {}\n\n if (!threadId) {\n state.actions.setFormSubmitted(formEventId)\n return\n }\n\n try {\n await client.sendFormResponse({\n threadId,\n formEventId,\n cancelled: false,\n values: currentValues,\n })\n store.getState().actions.setFormSubmitted(formEventId)\n } catch {\n store.getState().actions.setFormSubmitting(formEventId, false)\n }\n }, [formEventId, threadId, validate, client, store])\n\n const cancel = useCallback(async () => {\n const state = store.getState()\n const fs = state.formStates[formEventId]\n if (!fs || fs.submitting || fs.submitted || fs.cancelled) return\n\n state.actions.setFormSubmitting(formEventId, true)\n\n if (!threadId) {\n state.actions.setFormCancelled(formEventId)\n return\n }\n\n try {\n await client.sendFormResponse({\n threadId,\n formEventId,\n cancelled: true,\n values: {},\n })\n store.getState().actions.setFormCancelled(formEventId)\n } catch {\n store.getState().actions.setFormSubmitting(formEventId, false)\n }\n }, [formEventId, threadId, client, store])\n\n return {\n values,\n errors,\n setValue,\n validate,\n submit,\n cancel,\n isSubmitting,\n isSubmitted,\n isCancelled,\n isDisabled,\n }\n}\n\nfunction isEmptyValue(element: FormElement, val: unknown): boolean {\n if (val == null) return true\n if (typeof val === 'string' && val.trim() === '') return true\n if (element.type === 'checkbox_input' && Array.isArray(val) && val.length === 0) return true\n return false\n}\n","import { useCallback, useState } from 'react'\n\nexport interface FormFileMetadata {\n id?: string\n filename: string\n public_url?: string\n mime_type?: string\n size?: number\n [key: string]: unknown\n}\n\nexport function useFormFileUpload() {\n const [isUploading, setIsUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const upload = useCallback(\n async (params: {\n file: File\n uploadUrl: string\n fieldId: string\n agentId: string\n runId: string\n threadId: string\n }): Promise<FormFileMetadata> => {\n setIsUploading(true)\n setError(null)\n try {\n const aid = (params.agentId || '').trim()\n if (!aid) {\n throw new Error('agentId is required for upload')\n }\n const formData = new FormData()\n formData.append('file', params.file)\n formData.append('field_id', params.fieldId)\n formData.append('source', 'chat')\n formData.append('agent_id', aid)\n formData.append('run_id', params.runId)\n formData.append('thread_id', params.threadId)\n\n const response = await fetch(params.uploadUrl, {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '')\n throw new Error(detail || `Upload failed (${response.status})`)\n }\n\n return await response.json()\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Upload failed'\n setError(message)\n throw err\n } finally {\n setIsUploading(false)\n }\n },\n []\n )\n\n const clearError = useCallback(() => setError(null), [])\n\n return { upload, isUploading, error, clearError }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext } from '../provider'\nimport type { ContentPart } from '../types'\n\nexport function useMessage() {\n const { client } = useAgentContext()\n\n const send = useCallback(\n (params: {\n text?: string\n threadId?: string\n content?: ContentPart[]\n metadata?: Record<string, unknown>\n }) => {\n return client.sendMessage(params)\n },\n [client]\n )\n\n return { send }\n}\n","import { useCallback } from 'react'\nimport { useAgentContext, useShallowStore, useStore } from '../provider'\n\nexport function useSettings() {\n const { client } = useAgentContext()\n\n const fields = useShallowStore((s) => s.settings.fields)\n const updatedAt = useStore((s) => s.settings.updatedAt)\n const isLoading = useStore((s) => s.settings.isLoading)\n\n const subscribe = useCallback(\n (options?: { audience?: 'creator' | 'user'; agentOwnerUserId?: string | null }) =>\n client.subscribeSettings(options),\n [client]\n )\n const unsubscribe = useCallback(() => client.unsubscribeSettings(), [client])\n\n const patchField = useCallback(\n (fieldId: string, value: unknown) => client.patchSetting(fieldId, value),\n [client]\n )\n\n return { fields, updatedAt, isLoading, subscribe, unsubscribe, patchField }\n}\n","import { useCallback, useState } from 'react'\n\nexport interface SettingsFileMetadata {\n id?: string\n filename: string\n public_url?: string\n mime_type?: string\n size?: number\n [key: string]: unknown\n}\n\nexport function useSettingsFileUpload() {\n const [isUploading, setIsUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const upload = useCallback(\n async (params: {\n file: File\n uploadUrl: string\n fieldId: string\n agentId: string\n }): Promise<SettingsFileMetadata> => {\n setIsUploading(true)\n setError(null)\n try {\n const formData = new FormData()\n formData.append('file', params.file)\n formData.append('source', 'settings')\n formData.append('field_id', params.fieldId)\n formData.append('agent_id', params.agentId)\n\n const response = await fetch(params.uploadUrl, {\n method: 'POST',\n body: formData,\n })\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '')\n throw new Error(detail || `Upload failed (${response.status})`)\n }\n\n return await response.json()\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Upload failed'\n setError(message)\n throw err\n } finally {\n setIsUploading(false)\n }\n },\n []\n )\n\n const clearError = useCallback(() => setError(null), [])\n\n return { upload, isUploading, error, clearError }\n}\n","import { useCallback, useEffect, useMemo } from 'react'\nimport { useAgentContext, useStore } from '../provider'\nimport type { Run, Thread, ThreadEvent, ThreadState } from '../types'\n\nconst EMPTY_ARRAY: ThreadEvent[] = []\nconst EMPTY_RUNS: Run[] = []\n\nexport function useThreadDetails(threadId: string | null): ThreadState {\n const { client } = useAgentContext()\n\n // Auto-subscribe/unsubscribe\n useEffect(() => {\n if (!threadId) return\n client.subscribe(threadId)\n return () => client.unsubscribe(threadId)\n }, [threadId, client])\n\n // All selectors return direct store references or constants — Object.is is sufficient\n const thread = useStore((s): Thread | null => (threadId ? (s.threads[threadId] ?? null) : null))\n const isLoading = useStore((s) => (threadId ? s.loadingThreads.has(threadId) : false))\n const isWaiting = useStore((s) => {\n if (!threadId) return false\n const r = s.runs[threadId]\n return r ? r.some((run) => run.status === 'running') : false\n })\n\n const optimistic = useStore((s) =>\n threadId ? (s.optimistic[threadId] ?? EMPTY_ARRAY) : EMPTY_ARRAY\n )\n const confirmed = useStore((s) => (threadId ? (s.events[threadId] ?? EMPTY_ARRAY) : EMPTY_ARRAY))\n const runs = useStore((s) => (threadId ? (s.runs[threadId] ?? EMPTY_RUNS) : EMPTY_RUNS))\n\n // Merge with useMemo — stable ref when inputs are the same arrays\n const events = useMemo(\n () => (optimistic.length ? [...confirmed, ...optimistic] : confirmed),\n [optimistic, confirmed]\n )\n\n return { thread, events, runs, isLoading, isWaiting }\n}\n\nexport function useThreadEvents(threadId: string | null) {\n const { client } = useAgentContext()\n\n const hasOlderEvents = useStore((s) =>\n threadId ? (s.eventPagination[threadId]?.hasMore ?? false) : false\n )\n\n const loadOlderEvents = useCallback(\n (limit?: number) => {\n if (threadId) client.loadOlderEvents(threadId, limit)\n },\n [threadId, client]\n )\n\n return { hasOlderEvents, loadOlderEvents }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { useAgentContext } from '../provider'\nimport type { ArtifactDirection, ThreadArtifact } from '../types'\n\nexport interface UseThreadArtifactsOptions {\n direction?: ArtifactDirection | 'all'\n enabled?: boolean\n limit?: number\n}\n\nexport function useThreadArtifacts(\n threadId: string | null,\n options?: UseThreadArtifactsOptions\n) {\n const { client } = useAgentContext()\n const direction = options?.direction ?? 'all'\n const enabled = options?.enabled !== false\n const limit = options?.limit\n\n const [artifacts, setArtifacts] = useState<ThreadArtifact[]>([])\n const [cursor, setCursor] = useState<string | null>(null)\n const [hasMore, setHasMore] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const cursorRef = useRef<string | null>(null)\n\n const load = useCallback(\n async (append: boolean) => {\n if (!threadId) return\n setIsLoading(true)\n setError(null)\n try {\n const result = await client.requestThreadArtifactsList(threadId, {\n cursor: append ? cursorRef.current : null,\n limit,\n direction,\n })\n cursorRef.current = result.cursor\n setCursor(result.cursor)\n setHasMore(result.hasMore)\n setArtifacts((prev) => (append ? [...prev, ...result.artifacts] : result.artifacts))\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load artifacts')\n } finally {\n setIsLoading(false)\n }\n },\n [threadId, client, limit, direction]\n )\n\n useEffect(() => {\n if (!threadId || !enabled) {\n setArtifacts([])\n setCursor(null)\n cursorRef.current = null\n setHasMore(false)\n setError(null)\n return\n }\n void load(false)\n }, [threadId, enabled, direction, load])\n\n const loadMore = useCallback(() => {\n if (!hasMore || isLoading) return\n void load(true)\n }, [hasMore, isLoading, load])\n\n const refresh = useCallback(() => {\n void load(false)\n }, [load])\n\n return { artifacts, cursor, hasMore, isLoading, error, loadMore, refresh }\n}\n","import { useCallback, useMemo } from 'react'\nimport { useAgentContext, useStore } from '../provider'\n\n/** Lightweight read-only hook — thread list, count, and loading state. */\nexport function useThreadsList() {\n const threadOrder = useStore((s) => s.threadOrder)\n const threadMap = useStore((s) => s.threads)\n\n const threads = useMemo(\n () =>\n threadOrder.flatMap((id) => {\n const t = threadMap[id]\n return t ? [t] : []\n }),\n [threadOrder, threadMap]\n )\n\n const isLoading = useStore((s) => s.connection.status !== 'connected')\n const hasMore = useStore((s) => s.threadListHasMore)\n const totalCount = useStore((s) => s.threadListTotalCount)\n\n return { threads, isLoading, hasMore, totalCount }\n}\n\n/** Actions-only hook (delete, load more). */\nexport function useThreadsActions() {\n const { client } = useAgentContext()\n\n const deleteThread = useCallback((threadId: string) => client.deleteThread(threadId), [client])\n const loadMore = useCallback((limit?: number) => client.loadMoreThreads(limit), [client])\n\n return { deleteThread, loadMore }\n}\n","import { useCallback, useRef, useState } from 'react'\nimport type { UploadResult } from '../client'\nimport { useAgentContext } from '../provider'\n\nexport function useUpload() {\n const { client } = useAgentContext()\n const [isUploading, setIsUploading] = useState(false)\n const activeCountRef = useRef(0)\n\n const upload = useCallback(\n async (file: File | Blob, options?: { filename?: string }): Promise<UploadResult> => {\n activeCountRef.current++\n setIsUploading(true)\n try {\n return await client.upload(file, options)\n } finally {\n activeCountRef.current--\n if (activeCountRef.current === 0) {\n setIsUploading(false)\n }\n }\n },\n [client]\n )\n\n return { upload, isUploading }\n}\n"]}
|