dooers-agents-client 0.2.5 → 0.2.6

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 CHANGED
@@ -18,6 +18,7 @@ function toUser(w) {
18
18
  userId: w.user_id,
19
19
  userName: w.user_name,
20
20
  userEmail: w.user_email,
21
+ identityIds: w.identity_ids,
21
22
  systemRole: w.system_role,
22
23
  organizationRole: w.organization_role,
23
24
  workspaceRole: w.workspace_role
@@ -293,7 +294,7 @@ var WorkerClient = class {
293
294
  }
294
295
  loadMoreThreads(limit) {
295
296
  const cursor = this.lastThreadListCursor;
296
- if (!cursor) return;
297
+ if (!cursor || this.isLoadingMore) return;
297
298
  this.isLoadingMore = true;
298
299
  this.send("thread.list", { cursor, limit });
299
300
  }
@@ -361,6 +362,7 @@ var WorkerClient = class {
361
362
  userId: this.config.userId ?? "",
362
363
  userName: this.config.userName,
363
364
  userEmail: this.config.userEmail,
365
+ identityIds: this.config.identityIds,
364
366
  systemRole: this.config.systemRole ?? "user",
365
367
  organizationRole: this.config.organizationRole ?? "member",
366
368
  workspaceRole: this.config.workspaceRole ?? "member"
@@ -434,6 +436,7 @@ var WorkerClient = class {
434
436
  user_id: this.config.userId ?? "",
435
437
  user_name: this.config.userName ?? null,
436
438
  user_email: this.config.userEmail ?? null,
439
+ identity_ids: this.config.identityIds ?? [],
437
440
  system_role: this.config.systemRole ?? "user",
438
441
  organization_role: this.config.organizationRole ?? "member",
439
442
  workspace_role: this.config.workspaceRole ?? "member"
@@ -885,6 +888,7 @@ function WorkerProvider({
885
888
  userId,
886
889
  userName,
887
890
  userEmail,
891
+ identityIds,
888
892
  systemRole,
889
893
  organizationRole,
890
894
  workspaceRole,
@@ -905,6 +909,7 @@ function WorkerProvider({
905
909
  react.useEffect(() => {
906
910
  clientRef.current?.setUploadUrl(uploadUrl);
907
911
  }, [uploadUrl]);
912
+ const identityIdsKey = identityIds?.join(",") ?? "";
908
913
  react.useEffect(() => {
909
914
  if (!url || !workerId) return;
910
915
  clientRef.current?.connect(url, workerId, {
@@ -913,6 +918,7 @@ function WorkerProvider({
913
918
  userId,
914
919
  userName,
915
920
  userEmail,
921
+ identityIds: identityIdsKey ? identityIdsKey.split(",") : void 0,
916
922
  systemRole,
917
923
  organizationRole,
918
924
  workspaceRole,
@@ -927,6 +933,7 @@ function WorkerProvider({
927
933
  userId,
928
934
  userName,
929
935
  userEmail,
936
+ identityIdsKey,
930
937
  systemRole,
931
938
  organizationRole,
932
939
  workspaceRole,
package/dist/main.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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-message.ts","../src/hooks/use-settings.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":["// --- 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}\n\nexport interface ImageSendPart {\n type: 'image'\n refId: string\n}\n\nexport interface DocumentSendPart {\n type: 'document'\n refId: 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}\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}\n\nexport interface DocumentDisplayPart {\n type: 'document'\n url?: string\n filename?: string\n mimeType?: string\n sizeBytes?: number\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\nexport type Actor = 'user' | 'assistant' | 'system' | 'tool'\nexport type EventType =\n | 'message'\n | 'run.started'\n | 'run.finished'\n | 'tool.call'\n | 'tool.result'\n | 'tool.transaction'\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 systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n workerId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | 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\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 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}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\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 workerId: 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 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 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 workerId: w.worker_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 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 }\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 }\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 }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\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 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 }\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 }\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 workerId: w.worker_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 return { type: 'audio', ref_id: p.refId, duration: p.duration }\n case 'image':\n return { type: 'image', ref_id: p.refId }\n case 'document':\n return { type: 'document', ref_id: p.refId }\n }\n}\n","import type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart } from './protocol/models'\nimport type { WorkerActions } from './store'\nimport type { DisplayContentPart, SendContentPart, 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\n\nexport interface WorkerConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\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}\n\nexport class WorkerClient {\n private ws: WebSocket | null = null\n private callbacks: WorkerActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private httpBaseUrl = ''\n private workerId = ''\n private uploadUrl: string | undefined\n private config: WorkerConnectionConfig = {\n organizationId: '',\n workspaceId: '',\n userId: '',\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 — resolved when event.append arrives with matching clientEventId\n private pendingMessages = new Map<\n string,\n { resolve: (value: { threadId: string }) => void; timer: ReturnType<typeof setTimeout> }\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 constructor(callbacks: WorkerActions) {\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 async upload(file: File | Blob): Promise<UploadResult> {\n if (!this.uploadUrl) {\n throw new Error('uploadUrl not configured')\n }\n\n const formData = new FormData()\n formData.append('file', file)\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 throw new Error(`Upload failed: ${response.status} ${response.statusText}`)\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,\n }\n }\n\n connect(url: string, workerId: string, config?: WorkerConnectionConfig) {\n this.url = url\n this.workerId = workerId\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 try {\n const parsed = new URL(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 this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n // Clean up pending message promises\n for (const [, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n }\n this.pendingMessages.clear()\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) 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() {\n this.send('settings.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeSettings() {\n this.send('settings.unsubscribe', { worker_id: this.workerId })\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', { worker_id: this.workerId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { worker_id: this.workerId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n }): Promise<{ threadId: string }> {\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 { type: 'audio', duration: p.duration }\n case 'image':\n return { type: 'image' }\n case 'document':\n return { type: 'document' }\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 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 // Create promise that resolves when server confirms with event.append\n const promise = new Promise<{ threadId: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(clientEventId)\n reject(new Error('sendMessage timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, timer })\n })\n\n this.send('event.create', {\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\n return promise\n }\n\n // --- Private ---\n\n private createConnection() {\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 }\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 worker_id: this.workerId,\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 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: '0.1.0' },\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 } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n this.onError?.({\n code: frame.payload.error.code,\n message: frame.payload.error.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 and resolve pending message promises\n const resolvedClientEventIds: 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 pendingMessage.resolve({ threadId: frame.payload.thread_id })\n this.pendingMessages.delete(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 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 '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 }\n\n private scheduleReconnect() {\n if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\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 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 { AnalyticsEvent, Run, SettingsItem, Thread, ThreadEvent } from './types'\nimport { isSettingsFieldGroup } from './types'\n\nexport interface WorkerActions {\n setConnectionStatus: (status: WorkerState['connection']['status'], error?: string) => 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}\n\nexport interface WorkerState {\n connection: {\n status: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n error: 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 subscriptions: Set<string>\n loadingThreads: Set<string>\n actions: WorkerActions\n}\n\nexport type WorkerStore = ReturnType<typeof createWorkerStore>\n\nexport function createWorkerStore() {\n return createStore<WorkerState>()((set) => ({\n connection: {\n status: 'idle',\n error: 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 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: { ...s.connection, status, error: error ?? null },\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 return {\n threads,\n threadOrder,\n events,\n runs,\n optimistic,\n optimisticKeys,\n eventPagination,\n subscriptions,\n loadingThreads,\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 newFromSnapshot = snapshotEvents.filter((e) => !existingIds.has(e.id))\n mergedEvents = newFromSnapshot.length > 0 ? [...existing, ...newFromSnapshot] : existing\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 }\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 updates.set(e.id, 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 }\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 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]: [...existing, ...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 loadingThreads.add(threadId)\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 },\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 { type OnErrorCallback, WorkerClient } from './client'\nimport { createWorkerStore, type WorkerState, type WorkerStore } from './store'\n\ninterface WorkerContextValue {\n store: WorkerStore\n client: WorkerClient\n}\n\nconst WorkerContext = createContext<WorkerContextValue | null>(null)\n\nexport interface WorkerProviderProps {\n url?: string\n workerId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n uploadUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function WorkerProvider({\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n uploadUrl,\n onError,\n children,\n}: WorkerProviderProps) {\n const storeRef = useRef<WorkerStore | undefined>(undefined)\n const clientRef = useRef<WorkerClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createWorkerStore()\n clientRef.current = new WorkerClient(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 // Connect/disconnect lifecycle — skips connection when url or workerId are missing\n useEffect(() => {\n if (!url || !workerId) return\n clientRef.current?.connect(url, workerId, {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n })\n return () => clientRef.current?.disconnect()\n }, [\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n ])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<WorkerContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <WorkerContext.Provider value={contextValue}>{children}</WorkerContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useWorkerContext(): WorkerContextValue {\n const ctx = useContext(WorkerContext)\n if (!ctx) {\n throw new Error('useWorkerContext must be used within a <WorkerProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useWorkerContext } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useWorkerContext()\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 { useStore, useWorkerContext } from '../provider'\n\nexport function useConnection() {\n const { client } = useWorkerContext()\n\n const status = useStore((s) => s.connection.status)\n const error = useStore((s) => s.connection.error)\n const reconnectFailed = useStore((s) => s.connection.reconnectFailed)\n\n const reconnect = useCallback(() => client.retry(), [client])\n\n return { status, error, reconnectFailed, reconnect }\n}\n","import { useCallback } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\nimport type { FeedbackTarget } from '../types'\n\nexport function useFeedback(targetId: string, targetType: FeedbackTarget = 'event') {\n const { client } = useWorkerContext()\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 } from 'react'\nimport { useWorkerContext } from '../provider'\nimport type { ContentPart } from '../types'\n\nexport function useMessage() {\n const { client } = useWorkerContext()\n\n const send = useCallback(\n (params: { text?: string; threadId?: string; content?: ContentPart[] }) => {\n return client.sendMessage(params)\n },\n [client]\n )\n\n return { send }\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useStore, useWorkerContext } from '../provider'\n\nexport function useSettings() {\n const { client } = useWorkerContext()\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(() => client.subscribeSettings(), [client])\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, useEffect, useMemo } from 'react'\nimport { useStore, useWorkerContext } 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 } = useWorkerContext()\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 } = useWorkerContext()\n\n const hasOlderEvents = useStore((s) =>\n threadId ? (s.eventPagination[threadId]?.hasMore ?? true) : 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 { useStore, useWorkerContext } 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 } = useWorkerContext()\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 { useWorkerContext } from '../provider'\n\nexport function useUpload() {\n const { client } = useWorkerContext()\n const [isUploading, setIsUploading] = useState(false)\n const activeCountRef = useRef(0)\n\n const upload = useCallback(\n async (file: File | Blob): Promise<UploadResult> => {\n activeCountRef.current++\n setIsUploading(true)\n try {\n return await client.upload(file)\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/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-message.ts","../src/hooks/use-settings.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":["// --- 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}\n\nexport interface ImageSendPart {\n type: 'image'\n refId: string\n}\n\nexport interface DocumentSendPart {\n type: 'document'\n refId: 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}\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}\n\nexport interface DocumentDisplayPart {\n type: 'document'\n url?: string\n filename?: string\n mimeType?: string\n sizeBytes?: number\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\nexport type Actor = 'user' | 'assistant' | 'system' | 'tool'\nexport type EventType =\n | 'message'\n | 'run.started'\n | 'run.finished'\n | 'tool.call'\n | 'tool.result'\n | 'tool.transaction'\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 identityIds?: string[]\n systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n workerId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | 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\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 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}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\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 workerId: 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 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 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 workerId: w.worker_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 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 }\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 }\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 }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\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 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 }\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 }\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 workerId: w.worker_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 return { type: 'audio', ref_id: p.refId, duration: p.duration }\n case 'image':\n return { type: 'image', ref_id: p.refId }\n case 'document':\n return { type: 'document', ref_id: p.refId }\n }\n}\n","import type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart } from './protocol/models'\nimport type { WorkerActions } from './store'\nimport type { DisplayContentPart, SendContentPart, 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\n\nexport interface WorkerConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\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}\n\nexport class WorkerClient {\n private ws: WebSocket | null = null\n private callbacks: WorkerActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private httpBaseUrl = ''\n private workerId = ''\n private uploadUrl: string | undefined\n private config: WorkerConnectionConfig = {\n organizationId: '',\n workspaceId: '',\n userId: '',\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 — resolved when event.append arrives with matching clientEventId\n private pendingMessages = new Map<\n string,\n { resolve: (value: { threadId: string }) => void; timer: ReturnType<typeof setTimeout> }\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 constructor(callbacks: WorkerActions) {\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 async upload(file: File | Blob): Promise<UploadResult> {\n if (!this.uploadUrl) {\n throw new Error('uploadUrl not configured')\n }\n\n const formData = new FormData()\n formData.append('file', file)\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 throw new Error(`Upload failed: ${response.status} ${response.statusText}`)\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,\n }\n }\n\n connect(url: string, workerId: string, config?: WorkerConnectionConfig) {\n this.url = url\n this.workerId = workerId\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 try {\n const parsed = new URL(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 this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n // Clean up pending message promises\n for (const [, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n }\n this.pendingMessages.clear()\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() {\n this.send('settings.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeSettings() {\n this.send('settings.unsubscribe', { worker_id: this.workerId })\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', { worker_id: this.workerId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { worker_id: this.workerId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n }): Promise<{ threadId: string }> {\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 { type: 'audio', duration: p.duration }\n case 'image':\n return { type: 'image' }\n case 'document':\n return { type: 'document' }\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 // Create promise that resolves when server confirms with event.append\n const promise = new Promise<{ threadId: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(clientEventId)\n reject(new Error('sendMessage timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, timer })\n })\n\n this.send('event.create', {\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\n return promise\n }\n\n // --- Private ---\n\n private createConnection() {\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 }\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 worker_id: this.workerId,\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 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: '0.1.0' },\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 } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n this.onError?.({\n code: frame.payload.error.code,\n message: frame.payload.error.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 and resolve pending message promises\n const resolvedClientEventIds: 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 pendingMessage.resolve({ threadId: frame.payload.thread_id })\n this.pendingMessages.delete(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 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 '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 }\n\n private scheduleReconnect() {\n if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\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 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 { AnalyticsEvent, Run, SettingsItem, Thread, ThreadEvent } from './types'\nimport { isSettingsFieldGroup } from './types'\n\nexport interface WorkerActions {\n setConnectionStatus: (status: WorkerState['connection']['status'], error?: string) => 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}\n\nexport interface WorkerState {\n connection: {\n status: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n error: 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 subscriptions: Set<string>\n loadingThreads: Set<string>\n actions: WorkerActions\n}\n\nexport type WorkerStore = ReturnType<typeof createWorkerStore>\n\nexport function createWorkerStore() {\n return createStore<WorkerState>()((set) => ({\n connection: {\n status: 'idle',\n error: 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 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: { ...s.connection, status, error: error ?? null },\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 return {\n threads,\n threadOrder,\n events,\n runs,\n optimistic,\n optimisticKeys,\n eventPagination,\n subscriptions,\n loadingThreads,\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 newFromSnapshot = snapshotEvents.filter((e) => !existingIds.has(e.id))\n mergedEvents = newFromSnapshot.length > 0 ? [...existing, ...newFromSnapshot] : existing\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 }\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 updates.set(e.id, 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 }\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 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]: [...existing, ...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 loadingThreads.add(threadId)\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 },\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 { type OnErrorCallback, WorkerClient } from './client'\nimport { createWorkerStore, type WorkerState, type WorkerStore } from './store'\n\ninterface WorkerContextValue {\n store: WorkerStore\n client: WorkerClient\n}\n\nconst WorkerContext = createContext<WorkerContextValue | null>(null)\n\nexport interface WorkerProviderProps {\n url?: string\n workerId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n uploadUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function WorkerProvider({\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n identityIds,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n uploadUrl,\n onError,\n children,\n}: WorkerProviderProps) {\n const storeRef = useRef<WorkerStore | undefined>(undefined)\n const clientRef = useRef<WorkerClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createWorkerStore()\n clientRef.current = new WorkerClient(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 // Stable key for identityIds to avoid reference-equality churn\n const identityIdsKey = identityIds?.join(',') ?? ''\n\n // Connect/disconnect lifecycle — skips connection when url or workerId are missing\n useEffect(() => {\n if (!url || !workerId) return\n clientRef.current?.connect(url, workerId, {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n identityIds: identityIdsKey ? identityIdsKey.split(',') : undefined,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n })\n return () => clientRef.current?.disconnect()\n }, [\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n identityIdsKey,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n ])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<WorkerContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <WorkerContext.Provider value={contextValue}>{children}</WorkerContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useWorkerContext(): WorkerContextValue {\n const ctx = useContext(WorkerContext)\n if (!ctx) {\n throw new Error('useWorkerContext must be used within a <WorkerProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useWorkerContext } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useWorkerContext()\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 { useStore, useWorkerContext } from '../provider'\n\nexport function useConnection() {\n const { client } = useWorkerContext()\n\n const status = useStore((s) => s.connection.status)\n const error = useStore((s) => s.connection.error)\n const reconnectFailed = useStore((s) => s.connection.reconnectFailed)\n\n const reconnect = useCallback(() => client.retry(), [client])\n\n return { status, error, reconnectFailed, reconnect }\n}\n","import { useCallback } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\nimport type { FeedbackTarget } from '../types'\n\nexport function useFeedback(targetId: string, targetType: FeedbackTarget = 'event') {\n const { client } = useWorkerContext()\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 } from 'react'\nimport { useWorkerContext } from '../provider'\nimport type { ContentPart } from '../types'\n\nexport function useMessage() {\n const { client } = useWorkerContext()\n\n const send = useCallback(\n (params: { text?: string; threadId?: string; content?: ContentPart[] }) => {\n return client.sendMessage(params)\n },\n [client]\n )\n\n return { send }\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useStore, useWorkerContext } from '../provider'\n\nexport function useSettings() {\n const { client } = useWorkerContext()\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(() => client.subscribeSettings(), [client])\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, useEffect, useMemo } from 'react'\nimport { useStore, useWorkerContext } 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 } = useWorkerContext()\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 } = useWorkerContext()\n\n const hasOlderEvents = useStore((s) =>\n threadId ? (s.eventPagination[threadId]?.hasMore ?? true) : 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 { useStore, useWorkerContext } 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 } = useWorkerContext()\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 { useWorkerContext } from '../provider'\n\nexport function useUpload() {\n const { client } = useWorkerContext()\n const [isUploading, setIsUploading] = useState(false)\n const activeCountRef = useRef(0)\n\n const upload = useCallback(\n async (file: File | Blob): Promise<UploadResult> => {\n activeCountRef.current++\n setIsUploading(true)\n try {\n return await client.upload(file)\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"]}
package/dist/main.d.cts CHANGED
@@ -60,6 +60,7 @@ interface User {
60
60
  userId: string;
61
61
  userName?: string | null;
62
62
  userEmail?: string | null;
63
+ identityIds?: string[];
63
64
  systemRole: string;
64
65
  organizationRole: string;
65
66
  workspaceRole: string;
@@ -153,6 +154,7 @@ interface WorkerConnectionConfig {
153
154
  userId?: string;
154
155
  userName?: string;
155
156
  userEmail?: string;
157
+ identityIds?: string[];
156
158
  systemRole?: string;
157
159
  organizationRole?: string;
158
160
  workspaceRole?: string;
@@ -254,6 +256,7 @@ interface WorkerProviderProps {
254
256
  userId?: string;
255
257
  userName?: string;
256
258
  userEmail?: string;
259
+ identityIds?: string[];
257
260
  systemRole?: string;
258
261
  organizationRole?: string;
259
262
  workspaceRole?: string;
@@ -262,6 +265,6 @@ interface WorkerProviderProps {
262
265
  onError?: OnErrorCallback;
263
266
  children: ReactNode;
264
267
  }
265
- declare function WorkerProvider({ url, workerId, organizationId, workspaceId, userId, userName, userEmail, systemRole, organizationRole, workspaceRole, authToken, uploadUrl, onError, children, }: WorkerProviderProps): react_jsx_runtime.JSX.Element;
268
+ declare function WorkerProvider({ url, workerId, organizationId, workspaceId, userId, userName, userEmail, identityIds, systemRole, organizationRole, workspaceRole, authToken, uploadUrl, onError, children, }: WorkerProviderProps): react_jsx_runtime.JSX.Element;
266
269
 
267
270
  export { type Actor, type AnalyticsEvent, type AudioDisplayPart, type AudioPart, type AudioSendPart, type ConnectionStatus, type ContentPart, type DisplayContentPart, type DocumentDisplayPart, type DocumentPart, type DocumentSendPart, type EventType, type FeedbackTarget, type FeedbackType, type ImageDisplayPart, type ImagePart, type ImageSendPart, type OnErrorCallback, type Run, type RunStatus, type SendContentPart, type SettingsField, type SettingsFieldGroup, type SettingsFieldType, type SettingsItem, type SettingsSelectOption, type TextDisplayPart, type TextPart, type TextSendPart, type Thread, type ThreadEvent, type ThreadState, type UploadResult, type User, type WorkerConnectionConfig, WorkerProvider, type WorkerProviderProps, isSettingsFieldGroup, useAnalytics, useAudioRecorder, useConnection, useFeedback, useMessage, useSettings, useThreadDetails, useThreadEvents, useThreadsActions, useThreadsList, useUpload };
package/dist/main.d.ts CHANGED
@@ -60,6 +60,7 @@ interface User {
60
60
  userId: string;
61
61
  userName?: string | null;
62
62
  userEmail?: string | null;
63
+ identityIds?: string[];
63
64
  systemRole: string;
64
65
  organizationRole: string;
65
66
  workspaceRole: string;
@@ -153,6 +154,7 @@ interface WorkerConnectionConfig {
153
154
  userId?: string;
154
155
  userName?: string;
155
156
  userEmail?: string;
157
+ identityIds?: string[];
156
158
  systemRole?: string;
157
159
  organizationRole?: string;
158
160
  workspaceRole?: string;
@@ -254,6 +256,7 @@ interface WorkerProviderProps {
254
256
  userId?: string;
255
257
  userName?: string;
256
258
  userEmail?: string;
259
+ identityIds?: string[];
257
260
  systemRole?: string;
258
261
  organizationRole?: string;
259
262
  workspaceRole?: string;
@@ -262,6 +265,6 @@ interface WorkerProviderProps {
262
265
  onError?: OnErrorCallback;
263
266
  children: ReactNode;
264
267
  }
265
- declare function WorkerProvider({ url, workerId, organizationId, workspaceId, userId, userName, userEmail, systemRole, organizationRole, workspaceRole, authToken, uploadUrl, onError, children, }: WorkerProviderProps): react_jsx_runtime.JSX.Element;
268
+ declare function WorkerProvider({ url, workerId, organizationId, workspaceId, userId, userName, userEmail, identityIds, systemRole, organizationRole, workspaceRole, authToken, uploadUrl, onError, children, }: WorkerProviderProps): react_jsx_runtime.JSX.Element;
266
269
 
267
270
  export { type Actor, type AnalyticsEvent, type AudioDisplayPart, type AudioPart, type AudioSendPart, type ConnectionStatus, type ContentPart, type DisplayContentPart, type DocumentDisplayPart, type DocumentPart, type DocumentSendPart, type EventType, type FeedbackTarget, type FeedbackType, type ImageDisplayPart, type ImagePart, type ImageSendPart, type OnErrorCallback, type Run, type RunStatus, type SendContentPart, type SettingsField, type SettingsFieldGroup, type SettingsFieldType, type SettingsItem, type SettingsSelectOption, type TextDisplayPart, type TextPart, type TextSendPart, type Thread, type ThreadEvent, type ThreadState, type UploadResult, type User, type WorkerConnectionConfig, WorkerProvider, type WorkerProviderProps, isSettingsFieldGroup, useAnalytics, useAudioRecorder, useConnection, useFeedback, useMessage, useSettings, useThreadDetails, useThreadEvents, useThreadsActions, useThreadsList, useUpload };
package/dist/main.js CHANGED
@@ -16,6 +16,7 @@ function toUser(w) {
16
16
  userId: w.user_id,
17
17
  userName: w.user_name,
18
18
  userEmail: w.user_email,
19
+ identityIds: w.identity_ids,
19
20
  systemRole: w.system_role,
20
21
  organizationRole: w.organization_role,
21
22
  workspaceRole: w.workspace_role
@@ -291,7 +292,7 @@ var WorkerClient = class {
291
292
  }
292
293
  loadMoreThreads(limit) {
293
294
  const cursor = this.lastThreadListCursor;
294
- if (!cursor) return;
295
+ if (!cursor || this.isLoadingMore) return;
295
296
  this.isLoadingMore = true;
296
297
  this.send("thread.list", { cursor, limit });
297
298
  }
@@ -359,6 +360,7 @@ var WorkerClient = class {
359
360
  userId: this.config.userId ?? "",
360
361
  userName: this.config.userName,
361
362
  userEmail: this.config.userEmail,
363
+ identityIds: this.config.identityIds,
362
364
  systemRole: this.config.systemRole ?? "user",
363
365
  organizationRole: this.config.organizationRole ?? "member",
364
366
  workspaceRole: this.config.workspaceRole ?? "member"
@@ -432,6 +434,7 @@ var WorkerClient = class {
432
434
  user_id: this.config.userId ?? "",
433
435
  user_name: this.config.userName ?? null,
434
436
  user_email: this.config.userEmail ?? null,
437
+ identity_ids: this.config.identityIds ?? [],
435
438
  system_role: this.config.systemRole ?? "user",
436
439
  organization_role: this.config.organizationRole ?? "member",
437
440
  workspace_role: this.config.workspaceRole ?? "member"
@@ -883,6 +886,7 @@ function WorkerProvider({
883
886
  userId,
884
887
  userName,
885
888
  userEmail,
889
+ identityIds,
886
890
  systemRole,
887
891
  organizationRole,
888
892
  workspaceRole,
@@ -903,6 +907,7 @@ function WorkerProvider({
903
907
  useEffect(() => {
904
908
  clientRef.current?.setUploadUrl(uploadUrl);
905
909
  }, [uploadUrl]);
910
+ const identityIdsKey = identityIds?.join(",") ?? "";
906
911
  useEffect(() => {
907
912
  if (!url || !workerId) return;
908
913
  clientRef.current?.connect(url, workerId, {
@@ -911,6 +916,7 @@ function WorkerProvider({
911
916
  userId,
912
917
  userName,
913
918
  userEmail,
919
+ identityIds: identityIdsKey ? identityIdsKey.split(",") : void 0,
914
920
  systemRole,
915
921
  organizationRole,
916
922
  workspaceRole,
@@ -925,6 +931,7 @@ function WorkerProvider({
925
931
  userId,
926
932
  userName,
927
933
  userEmail,
934
+ identityIdsKey,
928
935
  systemRole,
929
936
  organizationRole,
930
937
  workspaceRole,
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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-message.ts","../src/hooks/use-settings.ts","../src/hooks/use-thread.ts","../src/hooks/use-threads.ts","../src/hooks/use-upload.ts"],"names":["useZustandStore","useRef","useCallback","useEffect","useMemo","useState"],"mappings":"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","file":"main.js","sourcesContent":["// --- 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}\n\nexport interface ImageSendPart {\n type: 'image'\n refId: string\n}\n\nexport interface DocumentSendPart {\n type: 'document'\n refId: 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}\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}\n\nexport interface DocumentDisplayPart {\n type: 'document'\n url?: string\n filename?: string\n mimeType?: string\n sizeBytes?: number\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\nexport type Actor = 'user' | 'assistant' | 'system' | 'tool'\nexport type EventType =\n | 'message'\n | 'run.started'\n | 'run.finished'\n | 'tool.call'\n | 'tool.result'\n | 'tool.transaction'\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 systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n workerId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | 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\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 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}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\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 workerId: 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 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 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 workerId: w.worker_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 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 }\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 }\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 }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\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 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 }\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 }\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 workerId: w.worker_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 return { type: 'audio', ref_id: p.refId, duration: p.duration }\n case 'image':\n return { type: 'image', ref_id: p.refId }\n case 'document':\n return { type: 'document', ref_id: p.refId }\n }\n}\n","import type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart } from './protocol/models'\nimport type { WorkerActions } from './store'\nimport type { DisplayContentPart, SendContentPart, 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\n\nexport interface WorkerConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\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}\n\nexport class WorkerClient {\n private ws: WebSocket | null = null\n private callbacks: WorkerActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private httpBaseUrl = ''\n private workerId = ''\n private uploadUrl: string | undefined\n private config: WorkerConnectionConfig = {\n organizationId: '',\n workspaceId: '',\n userId: '',\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 — resolved when event.append arrives with matching clientEventId\n private pendingMessages = new Map<\n string,\n { resolve: (value: { threadId: string }) => void; timer: ReturnType<typeof setTimeout> }\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 constructor(callbacks: WorkerActions) {\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 async upload(file: File | Blob): Promise<UploadResult> {\n if (!this.uploadUrl) {\n throw new Error('uploadUrl not configured')\n }\n\n const formData = new FormData()\n formData.append('file', file)\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 throw new Error(`Upload failed: ${response.status} ${response.statusText}`)\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,\n }\n }\n\n connect(url: string, workerId: string, config?: WorkerConnectionConfig) {\n this.url = url\n this.workerId = workerId\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 try {\n const parsed = new URL(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 this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n // Clean up pending message promises\n for (const [, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n }\n this.pendingMessages.clear()\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) 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() {\n this.send('settings.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeSettings() {\n this.send('settings.unsubscribe', { worker_id: this.workerId })\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', { worker_id: this.workerId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { worker_id: this.workerId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n }): Promise<{ threadId: string }> {\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 { type: 'audio', duration: p.duration }\n case 'image':\n return { type: 'image' }\n case 'document':\n return { type: 'document' }\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 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 // Create promise that resolves when server confirms with event.append\n const promise = new Promise<{ threadId: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(clientEventId)\n reject(new Error('sendMessage timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, timer })\n })\n\n this.send('event.create', {\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\n return promise\n }\n\n // --- Private ---\n\n private createConnection() {\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 }\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 worker_id: this.workerId,\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 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: '0.1.0' },\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 } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n this.onError?.({\n code: frame.payload.error.code,\n message: frame.payload.error.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 and resolve pending message promises\n const resolvedClientEventIds: 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 pendingMessage.resolve({ threadId: frame.payload.thread_id })\n this.pendingMessages.delete(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 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 '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 }\n\n private scheduleReconnect() {\n if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\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 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 { AnalyticsEvent, Run, SettingsItem, Thread, ThreadEvent } from './types'\nimport { isSettingsFieldGroup } from './types'\n\nexport interface WorkerActions {\n setConnectionStatus: (status: WorkerState['connection']['status'], error?: string) => 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}\n\nexport interface WorkerState {\n connection: {\n status: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n error: 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 subscriptions: Set<string>\n loadingThreads: Set<string>\n actions: WorkerActions\n}\n\nexport type WorkerStore = ReturnType<typeof createWorkerStore>\n\nexport function createWorkerStore() {\n return createStore<WorkerState>()((set) => ({\n connection: {\n status: 'idle',\n error: 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 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: { ...s.connection, status, error: error ?? null },\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 return {\n threads,\n threadOrder,\n events,\n runs,\n optimistic,\n optimisticKeys,\n eventPagination,\n subscriptions,\n loadingThreads,\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 newFromSnapshot = snapshotEvents.filter((e) => !existingIds.has(e.id))\n mergedEvents = newFromSnapshot.length > 0 ? [...existing, ...newFromSnapshot] : existing\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 }\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 updates.set(e.id, 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 }\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 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]: [...existing, ...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 loadingThreads.add(threadId)\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 },\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 { type OnErrorCallback, WorkerClient } from './client'\nimport { createWorkerStore, type WorkerState, type WorkerStore } from './store'\n\ninterface WorkerContextValue {\n store: WorkerStore\n client: WorkerClient\n}\n\nconst WorkerContext = createContext<WorkerContextValue | null>(null)\n\nexport interface WorkerProviderProps {\n url?: string\n workerId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n uploadUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function WorkerProvider({\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n uploadUrl,\n onError,\n children,\n}: WorkerProviderProps) {\n const storeRef = useRef<WorkerStore | undefined>(undefined)\n const clientRef = useRef<WorkerClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createWorkerStore()\n clientRef.current = new WorkerClient(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 // Connect/disconnect lifecycle — skips connection when url or workerId are missing\n useEffect(() => {\n if (!url || !workerId) return\n clientRef.current?.connect(url, workerId, {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n })\n return () => clientRef.current?.disconnect()\n }, [\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n ])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<WorkerContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <WorkerContext.Provider value={contextValue}>{children}</WorkerContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useWorkerContext(): WorkerContextValue {\n const ctx = useContext(WorkerContext)\n if (!ctx) {\n throw new Error('useWorkerContext must be used within a <WorkerProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useWorkerContext } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useWorkerContext()\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 { useStore, useWorkerContext } from '../provider'\n\nexport function useConnection() {\n const { client } = useWorkerContext()\n\n const status = useStore((s) => s.connection.status)\n const error = useStore((s) => s.connection.error)\n const reconnectFailed = useStore((s) => s.connection.reconnectFailed)\n\n const reconnect = useCallback(() => client.retry(), [client])\n\n return { status, error, reconnectFailed, reconnect }\n}\n","import { useCallback } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\nimport type { FeedbackTarget } from '../types'\n\nexport function useFeedback(targetId: string, targetType: FeedbackTarget = 'event') {\n const { client } = useWorkerContext()\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 } from 'react'\nimport { useWorkerContext } from '../provider'\nimport type { ContentPart } from '../types'\n\nexport function useMessage() {\n const { client } = useWorkerContext()\n\n const send = useCallback(\n (params: { text?: string; threadId?: string; content?: ContentPart[] }) => {\n return client.sendMessage(params)\n },\n [client]\n )\n\n return { send }\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useStore, useWorkerContext } from '../provider'\n\nexport function useSettings() {\n const { client } = useWorkerContext()\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(() => client.subscribeSettings(), [client])\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, useEffect, useMemo } from 'react'\nimport { useStore, useWorkerContext } 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 } = useWorkerContext()\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 } = useWorkerContext()\n\n const hasOlderEvents = useStore((s) =>\n threadId ? (s.eventPagination[threadId]?.hasMore ?? true) : 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 { useStore, useWorkerContext } 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 } = useWorkerContext()\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 { useWorkerContext } from '../provider'\n\nexport function useUpload() {\n const { client } = useWorkerContext()\n const [isUploading, setIsUploading] = useState(false)\n const activeCountRef = useRef(0)\n\n const upload = useCallback(\n async (file: File | Blob): Promise<UploadResult> => {\n activeCountRef.current++\n setIsUploading(true)\n try {\n return await client.upload(file)\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/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-message.ts","../src/hooks/use-settings.ts","../src/hooks/use-thread.ts","../src/hooks/use-threads.ts","../src/hooks/use-upload.ts"],"names":["useZustandStore","useRef","useCallback","useEffect","useMemo","useState"],"mappings":"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","file":"main.js","sourcesContent":["// --- 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}\n\nexport interface ImageSendPart {\n type: 'image'\n refId: string\n}\n\nexport interface DocumentSendPart {\n type: 'document'\n refId: 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}\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}\n\nexport interface DocumentDisplayPart {\n type: 'document'\n url?: string\n filename?: string\n mimeType?: string\n sizeBytes?: number\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\nexport type Actor = 'user' | 'assistant' | 'system' | 'tool'\nexport type EventType =\n | 'message'\n | 'run.started'\n | 'run.finished'\n | 'tool.call'\n | 'tool.result'\n | 'tool.transaction'\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 identityIds?: string[]\n systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n workerId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | 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\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 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}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\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 workerId: 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 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 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 workerId: w.worker_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 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 }\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 }\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 }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\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 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 }\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 }\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 workerId: w.worker_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 return { type: 'audio', ref_id: p.refId, duration: p.duration }\n case 'image':\n return { type: 'image', ref_id: p.refId }\n case 'document':\n return { type: 'document', ref_id: p.refId }\n }\n}\n","import type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart } from './protocol/models'\nimport type { WorkerActions } from './store'\nimport type { DisplayContentPart, SendContentPart, 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\n\nexport interface WorkerConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\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}\n\nexport class WorkerClient {\n private ws: WebSocket | null = null\n private callbacks: WorkerActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private httpBaseUrl = ''\n private workerId = ''\n private uploadUrl: string | undefined\n private config: WorkerConnectionConfig = {\n organizationId: '',\n workspaceId: '',\n userId: '',\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 — resolved when event.append arrives with matching clientEventId\n private pendingMessages = new Map<\n string,\n { resolve: (value: { threadId: string }) => void; timer: ReturnType<typeof setTimeout> }\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 constructor(callbacks: WorkerActions) {\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 async upload(file: File | Blob): Promise<UploadResult> {\n if (!this.uploadUrl) {\n throw new Error('uploadUrl not configured')\n }\n\n const formData = new FormData()\n formData.append('file', file)\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 throw new Error(`Upload failed: ${response.status} ${response.statusText}`)\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,\n }\n }\n\n connect(url: string, workerId: string, config?: WorkerConnectionConfig) {\n this.url = url\n this.workerId = workerId\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 try {\n const parsed = new URL(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 this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n // Clean up pending message promises\n for (const [, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n }\n this.pendingMessages.clear()\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() {\n this.send('settings.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeSettings() {\n this.send('settings.unsubscribe', { worker_id: this.workerId })\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', { worker_id: this.workerId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { worker_id: this.workerId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n }): Promise<{ threadId: string }> {\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 { type: 'audio', duration: p.duration }\n case 'image':\n return { type: 'image' }\n case 'document':\n return { type: 'document' }\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 // Create promise that resolves when server confirms with event.append\n const promise = new Promise<{ threadId: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(clientEventId)\n reject(new Error('sendMessage timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, timer })\n })\n\n this.send('event.create', {\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\n return promise\n }\n\n // --- Private ---\n\n private createConnection() {\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 }\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 worker_id: this.workerId,\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 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: '0.1.0' },\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 } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n this.onError?.({\n code: frame.payload.error.code,\n message: frame.payload.error.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 and resolve pending message promises\n const resolvedClientEventIds: 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 pendingMessage.resolve({ threadId: frame.payload.thread_id })\n this.pendingMessages.delete(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 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 '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 }\n\n private scheduleReconnect() {\n if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\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 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 { AnalyticsEvent, Run, SettingsItem, Thread, ThreadEvent } from './types'\nimport { isSettingsFieldGroup } from './types'\n\nexport interface WorkerActions {\n setConnectionStatus: (status: WorkerState['connection']['status'], error?: string) => 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}\n\nexport interface WorkerState {\n connection: {\n status: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n error: 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 subscriptions: Set<string>\n loadingThreads: Set<string>\n actions: WorkerActions\n}\n\nexport type WorkerStore = ReturnType<typeof createWorkerStore>\n\nexport function createWorkerStore() {\n return createStore<WorkerState>()((set) => ({\n connection: {\n status: 'idle',\n error: 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 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: { ...s.connection, status, error: error ?? null },\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 return {\n threads,\n threadOrder,\n events,\n runs,\n optimistic,\n optimisticKeys,\n eventPagination,\n subscriptions,\n loadingThreads,\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 newFromSnapshot = snapshotEvents.filter((e) => !existingIds.has(e.id))\n mergedEvents = newFromSnapshot.length > 0 ? [...existing, ...newFromSnapshot] : existing\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 }\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 updates.set(e.id, 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 }\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 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]: [...existing, ...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 loadingThreads.add(threadId)\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 },\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 { type OnErrorCallback, WorkerClient } from './client'\nimport { createWorkerStore, type WorkerState, type WorkerStore } from './store'\n\ninterface WorkerContextValue {\n store: WorkerStore\n client: WorkerClient\n}\n\nconst WorkerContext = createContext<WorkerContextValue | null>(null)\n\nexport interface WorkerProviderProps {\n url?: string\n workerId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n identityIds?: string[]\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n uploadUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function WorkerProvider({\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n identityIds,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n uploadUrl,\n onError,\n children,\n}: WorkerProviderProps) {\n const storeRef = useRef<WorkerStore | undefined>(undefined)\n const clientRef = useRef<WorkerClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createWorkerStore()\n clientRef.current = new WorkerClient(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 // Stable key for identityIds to avoid reference-equality churn\n const identityIdsKey = identityIds?.join(',') ?? ''\n\n // Connect/disconnect lifecycle — skips connection when url or workerId are missing\n useEffect(() => {\n if (!url || !workerId) return\n clientRef.current?.connect(url, workerId, {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n identityIds: identityIdsKey ? identityIdsKey.split(',') : undefined,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n })\n return () => clientRef.current?.disconnect()\n }, [\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n identityIdsKey,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n ])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<WorkerContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <WorkerContext.Provider value={contextValue}>{children}</WorkerContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useWorkerContext(): WorkerContextValue {\n const ctx = useContext(WorkerContext)\n if (!ctx) {\n throw new Error('useWorkerContext must be used within a <WorkerProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useWorkerContext } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useWorkerContext()\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 { useStore, useWorkerContext } from '../provider'\n\nexport function useConnection() {\n const { client } = useWorkerContext()\n\n const status = useStore((s) => s.connection.status)\n const error = useStore((s) => s.connection.error)\n const reconnectFailed = useStore((s) => s.connection.reconnectFailed)\n\n const reconnect = useCallback(() => client.retry(), [client])\n\n return { status, error, reconnectFailed, reconnect }\n}\n","import { useCallback } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\nimport type { FeedbackTarget } from '../types'\n\nexport function useFeedback(targetId: string, targetType: FeedbackTarget = 'event') {\n const { client } = useWorkerContext()\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 } from 'react'\nimport { useWorkerContext } from '../provider'\nimport type { ContentPart } from '../types'\n\nexport function useMessage() {\n const { client } = useWorkerContext()\n\n const send = useCallback(\n (params: { text?: string; threadId?: string; content?: ContentPart[] }) => {\n return client.sendMessage(params)\n },\n [client]\n )\n\n return { send }\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useStore, useWorkerContext } from '../provider'\n\nexport function useSettings() {\n const { client } = useWorkerContext()\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(() => client.subscribeSettings(), [client])\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, useEffect, useMemo } from 'react'\nimport { useStore, useWorkerContext } 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 } = useWorkerContext()\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 } = useWorkerContext()\n\n const hasOlderEvents = useStore((s) =>\n threadId ? (s.eventPagination[threadId]?.hasMore ?? true) : 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 { useStore, useWorkerContext } 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 } = useWorkerContext()\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 { useWorkerContext } from '../provider'\n\nexport function useUpload() {\n const { client } = useWorkerContext()\n const [isUploading, setIsUploading] = useState(false)\n const activeCountRef = useRef(0)\n\n const upload = useCallback(\n async (file: File | Blob): Promise<UploadResult> => {\n activeCountRef.current++\n setIsUploading(true)\n try {\n return await client.upload(file)\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dooers-agents-client",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "agents-client — react sdk for agents-server",
5
5
  "type": "module",
6
6
  "main": "./dist/main.cjs",