dooers-agents-client 0.2.6 → 0.2.7
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 +1 -1
- package/dist/main.cjs.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.cjs
CHANGED
|
@@ -1148,7 +1148,7 @@ function useThreadDetails(threadId) {
|
|
|
1148
1148
|
function useThreadEvents(threadId) {
|
|
1149
1149
|
const { client } = useWorkerContext();
|
|
1150
1150
|
const hasOlderEvents = useStore(
|
|
1151
|
-
(s) => threadId ? s.eventPagination[threadId]?.hasMore ??
|
|
1151
|
+
(s) => threadId ? s.eventPagination[threadId]?.hasMore ?? false : false
|
|
1152
1152
|
);
|
|
1153
1153
|
const loadOlderEvents = react.useCallback(
|
|
1154
1154
|
(limit) => {
|
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 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"]}
|
|
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 ?? false) : false\n )\n\n const loadOlderEvents = useCallback(\n (limit?: number) => {\n if (threadId) client.loadOlderEvents(threadId, limit)\n },\n [threadId, client]\n )\n\n return { hasOlderEvents, loadOlderEvents }\n}\n","import { useCallback, useMemo } from 'react'\nimport { 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.js
CHANGED
|
@@ -1146,7 +1146,7 @@ function useThreadDetails(threadId) {
|
|
|
1146
1146
|
function useThreadEvents(threadId) {
|
|
1147
1147
|
const { client } = useWorkerContext();
|
|
1148
1148
|
const hasOlderEvents = useStore(
|
|
1149
|
-
(s) => threadId ? s.eventPagination[threadId]?.hasMore ??
|
|
1149
|
+
(s) => threadId ? s.eventPagination[threadId]?.hasMore ?? false : false
|
|
1150
1150
|
);
|
|
1151
1151
|
const loadOlderEvents = useCallback(
|
|
1152
1152
|
(limit) => {
|
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 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"]}
|
|
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 ?? false) : false\n )\n\n const loadOlderEvents = useCallback(\n (limit?: number) => {\n if (threadId) client.loadOlderEvents(threadId, limit)\n },\n [threadId, client]\n )\n\n return { hasOlderEvents, loadOlderEvents }\n}\n","import { useCallback, useMemo } from 'react'\nimport { 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"]}
|