dooers-agents-client 0.2.3 → 0.2.5
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 +58 -7
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.cts +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +58 -7
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
package/dist/main.d.ts
CHANGED
package/dist/main.js
CHANGED
|
@@ -157,6 +157,7 @@ var WorkerClient = class {
|
|
|
157
157
|
callbacks;
|
|
158
158
|
onError = null;
|
|
159
159
|
url = "";
|
|
160
|
+
httpBaseUrl = "";
|
|
160
161
|
workerId = "";
|
|
161
162
|
uploadUrl;
|
|
162
163
|
config = {
|
|
@@ -221,6 +222,16 @@ var WorkerClient = class {
|
|
|
221
222
|
this.workerId = workerId;
|
|
222
223
|
this.config = config ?? { organizationId: "", workspaceId: "", userId: "" };
|
|
223
224
|
this.isIntentionallyClosed = false;
|
|
225
|
+
try {
|
|
226
|
+
const parsed = new URL(url);
|
|
227
|
+
parsed.protocol = parsed.protocol === "wss:" ? "https:" : "http:";
|
|
228
|
+
parsed.pathname = "";
|
|
229
|
+
parsed.search = "";
|
|
230
|
+
parsed.hash = "";
|
|
231
|
+
this.httpBaseUrl = parsed.toString().replace(/\/$/, "");
|
|
232
|
+
} catch {
|
|
233
|
+
this.httpBaseUrl = "";
|
|
234
|
+
}
|
|
224
235
|
this.callbacks.setConnectionStatus("connecting");
|
|
225
236
|
this.createConnection();
|
|
226
237
|
}
|
|
@@ -472,7 +483,7 @@ var WorkerClient = class {
|
|
|
472
483
|
}
|
|
473
484
|
case "thread.snapshot": {
|
|
474
485
|
const thread = toThread(frame.payload.thread);
|
|
475
|
-
const events = frame.payload.events.map(toThreadEvent);
|
|
486
|
+
const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent));
|
|
476
487
|
const runs = (frame.payload.runs ?? []).map(toRun);
|
|
477
488
|
const lastEvent = events[events.length - 1];
|
|
478
489
|
if (lastEvent) {
|
|
@@ -486,7 +497,7 @@ var WorkerClient = class {
|
|
|
486
497
|
break;
|
|
487
498
|
}
|
|
488
499
|
case "event.append": {
|
|
489
|
-
const events = frame.payload.events.map(toThreadEvent);
|
|
500
|
+
const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent));
|
|
490
501
|
const resolvedClientEventIds = [];
|
|
491
502
|
for (const event of events) {
|
|
492
503
|
if (event.clientEventId && this.pendingOptimistic.has(event.clientEventId)) {
|
|
@@ -514,7 +525,7 @@ var WorkerClient = class {
|
|
|
514
525
|
break;
|
|
515
526
|
}
|
|
516
527
|
case "event.list.result": {
|
|
517
|
-
const events = frame.payload.events.map(toThreadEvent);
|
|
528
|
+
const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent));
|
|
518
529
|
this.eventPaginationCursors.set(frame.payload.thread_id, frame.payload.cursor);
|
|
519
530
|
this.callbacks.onEventListResult(
|
|
520
531
|
frame.payload.thread_id,
|
|
@@ -580,6 +591,20 @@ var WorkerClient = class {
|
|
|
580
591
|
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;
|
|
581
592
|
this.ws.send(JSON.stringify(frame));
|
|
582
593
|
}
|
|
594
|
+
/** Resolve relative URLs in event content parts against the agent's HTTP base. */
|
|
595
|
+
resolveEventUrls(events) {
|
|
596
|
+
if (!this.httpBaseUrl) return events;
|
|
597
|
+
const base = this.httpBaseUrl;
|
|
598
|
+
return events.map((event) => {
|
|
599
|
+
if (!event.content?.some((p) => "url" in p && p.url?.startsWith("/"))) return event;
|
|
600
|
+
return {
|
|
601
|
+
...event,
|
|
602
|
+
content: event.content.map(
|
|
603
|
+
(part) => "url" in part && part.url?.startsWith("/") ? { ...part, url: `${base}${part.url}` } : part
|
|
604
|
+
)
|
|
605
|
+
};
|
|
606
|
+
});
|
|
607
|
+
}
|
|
583
608
|
};
|
|
584
609
|
function createWorkerStore() {
|
|
585
610
|
return createStore()((set) => ({
|
|
@@ -712,9 +737,18 @@ function createWorkerStore() {
|
|
|
712
737
|
onEventAppend: (threadId, newEvents) => set((s) => {
|
|
713
738
|
const existing = s.events[threadId] ?? [];
|
|
714
739
|
const existingIds = new Set(existing.map((e) => e.id));
|
|
715
|
-
const
|
|
740
|
+
const updates = /* @__PURE__ */ new Map();
|
|
741
|
+
const appends = [];
|
|
742
|
+
for (const e of newEvents) {
|
|
743
|
+
if (existingIds.has(e.id)) {
|
|
744
|
+
updates.set(e.id, e);
|
|
745
|
+
} else {
|
|
746
|
+
appends.push(e);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
const merged = updates.size > 0 ? existing.map((e) => updates.get(e.id) ?? e) : existing;
|
|
716
750
|
return {
|
|
717
|
-
events: { ...s.events, [threadId]: [...
|
|
751
|
+
events: { ...s.events, [threadId]: [...merged, ...appends] }
|
|
718
752
|
};
|
|
719
753
|
}),
|
|
720
754
|
reconcileEvents: (threadId, newEvents, resolvedClientEventIds) => set((s) => {
|
|
@@ -944,12 +978,22 @@ function useAudioRecorder() {
|
|
|
944
978
|
const timerRef = useRef(null);
|
|
945
979
|
const startTimeRef = useRef(0);
|
|
946
980
|
const resolveStopRef = useRef(null);
|
|
981
|
+
const audioContextRef = useRef(null);
|
|
982
|
+
const analyserRef = useRef(null);
|
|
983
|
+
const releaseAudioContext = useCallback(() => {
|
|
984
|
+
analyserRef.current = null;
|
|
985
|
+
if (audioContextRef.current && audioContextRef.current.state !== "closed") {
|
|
986
|
+
audioContextRef.current.close();
|
|
987
|
+
}
|
|
988
|
+
audioContextRef.current = null;
|
|
989
|
+
}, []);
|
|
947
990
|
const releaseStream = useCallback(() => {
|
|
948
991
|
streamRef.current?.getTracks().forEach((t) => {
|
|
949
992
|
t.stop();
|
|
950
993
|
});
|
|
951
994
|
streamRef.current = null;
|
|
952
|
-
|
|
995
|
+
releaseAudioContext();
|
|
996
|
+
}, [releaseAudioContext]);
|
|
953
997
|
const clearTimer = useCallback(() => {
|
|
954
998
|
if (timerRef.current) {
|
|
955
999
|
clearInterval(timerRef.current);
|
|
@@ -968,6 +1012,13 @@ function useAudioRecorder() {
|
|
|
968
1012
|
const start = useCallback(async () => {
|
|
969
1013
|
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
970
1014
|
streamRef.current = stream;
|
|
1015
|
+
const audioContext = new AudioContext();
|
|
1016
|
+
audioContextRef.current = audioContext;
|
|
1017
|
+
const source = audioContext.createMediaStreamSource(stream);
|
|
1018
|
+
const analyser = audioContext.createAnalyser();
|
|
1019
|
+
analyser.fftSize = 256;
|
|
1020
|
+
source.connect(analyser);
|
|
1021
|
+
analyserRef.current = analyser;
|
|
971
1022
|
const mimeType = getPreferredMimeType();
|
|
972
1023
|
const recorder = new MediaRecorder(stream, { mimeType });
|
|
973
1024
|
mediaRecorderRef.current = recorder;
|
|
@@ -1012,7 +1063,7 @@ function useAudioRecorder() {
|
|
|
1012
1063
|
setIsRecording(false);
|
|
1013
1064
|
setDuration(0);
|
|
1014
1065
|
}, [releaseStream, clearTimer]);
|
|
1015
|
-
return { start, stop, cancel, isRecording, duration };
|
|
1066
|
+
return { start, stop, cancel, isRecording, duration, analyserNode: analyserRef.current };
|
|
1016
1067
|
}
|
|
1017
1068
|
function useConnection() {
|
|
1018
1069
|
const { client } = useWorkerContext();
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/store.ts","../src/provider.tsx","../src/hooks/use-analytics.ts","../src/hooks/use-audio-recorder.ts","../src/hooks/use-connection.ts","../src/hooks/use-feedback.ts","../src/hooks/use-message.ts","../src/hooks/use-settings.ts","../src/hooks/use-thread.ts","../src/hooks/use-threads.ts","../src/hooks/use-upload.ts"],"names":["useZustandStore","useRef","useCallback","useEffect","useMemo","useState"],"mappings":"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","file":"main.js","sourcesContent":["// --- Send content parts (client → server, used in send()) ---\n\nexport interface TextSendPart {\n type: 'text'\n text: string\n}\n\nexport interface AudioSendPart {\n type: 'audio'\n refId: string\n duration?: number\n}\n\nexport interface ImageSendPart {\n type: 'image'\n refId: string\n}\n\nexport interface DocumentSendPart {\n type: 'document'\n refId: string\n}\n\nexport type SendContentPart = TextSendPart | AudioSendPart | ImageSendPart | DocumentSendPart\n\n// --- Display content parts (server → client, rendered in chat) ---\n\nexport interface TextDisplayPart {\n type: 'text'\n text: string\n}\n\nexport interface AudioDisplayPart {\n type: 'audio'\n url?: string\n mimeType?: string\n duration?: number\n filename?: string\n}\n\nexport interface ImageDisplayPart {\n type: 'image'\n url?: string\n mimeType?: string\n width?: number\n height?: number\n alt?: string\n filename?: string\n}\n\nexport interface DocumentDisplayPart {\n type: 'document'\n url?: string\n filename?: string\n mimeType?: string\n sizeBytes?: number\n}\n\nexport type DisplayContentPart =\n | TextDisplayPart\n | AudioDisplayPart\n | ImageDisplayPart\n | DocumentDisplayPart\n\n// Backward-compatible aliases\nexport type ContentPart = SendContentPart\nexport type TextPart = TextSendPart\nexport type ImagePart = ImageSendPart\nexport type DocumentPart = DocumentSendPart\nexport type AudioPart = AudioSendPart\n\nexport type Actor = 'user' | 'assistant' | 'system' | 'tool'\nexport type EventType =\n | 'message'\n | 'run.started'\n | 'run.finished'\n | 'tool.call'\n | 'tool.result'\n | 'tool.transaction'\nexport type RunStatus = 'running' | 'succeeded' | 'failed' | 'canceled'\nexport type ConnectionStatus = 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n\nexport interface User {\n userId: string\n userName?: string | null\n userEmail?: string | null\n systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n workerId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | null\n createdAt: string\n updatedAt: string\n lastEventAt: string\n}\n\nexport interface ThreadEvent {\n id: string\n threadId: string\n runId: string | null\n type: EventType\n actor: Actor\n author: string | null\n user?: User\n content?: DisplayContentPart[]\n data?: Record<string, unknown>\n createdAt: string\n clientEventId?: string\n}\n\nexport interface Run {\n id: string\n threadId: string\n agentId: string | null\n status: RunStatus\n startedAt: string\n endedAt: string | null\n error: string | null\n}\n\n// --- Settings ---\n\nexport type SettingsFieldType =\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'password'\n | 'email'\n | 'date'\n | 'image'\n\nexport interface SettingsSelectOption {\n value: string\n label: string\n}\n\nexport interface SettingsField {\n id: string\n type: SettingsFieldType\n label: string\n required: boolean\n readonly: boolean\n value: unknown\n placeholder: string | null\n options: SettingsSelectOption[] | null\n min: number | null\n max: number | null\n rows: number | null\n src: string | null\n width: number | null\n height: number | null\n}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\n}\n\nexport type SettingsItem = SettingsField | SettingsFieldGroup\n\nexport function isSettingsFieldGroup(item: SettingsItem): item is SettingsFieldGroup {\n return 'fields' in item && Array.isArray((item as SettingsFieldGroup).fields)\n}\n\n// --- Feedback ---\n\nexport type FeedbackType = 'like' | 'dislike'\nexport type FeedbackTarget = 'event' | 'run' | 'thread'\n\n// --- Analytics ---\n\nexport interface AnalyticsEvent {\n event: string\n timestamp: string\n workerId: string\n threadId: string | null\n userId: string | null\n runId: string | null\n eventId: string | null\n data: Record<string, unknown> | null\n}\n\nexport interface ThreadState {\n thread: Thread | null\n events: ThreadEvent[]\n runs: Run[]\n isLoading: boolean\n isWaiting: boolean\n}\n\n// --- Wire → Public transforms ---\n\nimport type {\n WireAnalyticsEvent,\n WireC2S_ContentPart,\n WireRun,\n WireS2C_ContentPart,\n WireSettingsField,\n WireSettingsFieldGroup,\n WireSettingsItem,\n WireThread,\n WireThreadEvent,\n WireUser,\n} from './protocol/models'\n\nexport function toUser(w: WireUser): User\nexport function toUser(w: WireUser | undefined): User | undefined\nexport function toUser(w?: WireUser): User | undefined {\n if (!w) return undefined\n return {\n userId: w.user_id,\n userName: w.user_name,\n userEmail: w.user_email,\n systemRole: w.system_role,\n organizationRole: w.organization_role,\n workspaceRole: w.workspace_role,\n }\n}\n\nexport function toThread(w: WireThread): Thread {\n return {\n id: w.id,\n workerId: w.worker_id,\n organizationId: w.organization_id,\n workspaceId: w.workspace_id,\n owner: toUser(w.owner),\n users: w.users.map((u) => toUser(u)),\n title: w.title,\n createdAt: w.created_at,\n updatedAt: w.updated_at,\n lastEventAt: w.last_event_at,\n }\n}\n\nexport function toDisplayContentPart(w: WireS2C_ContentPart): DisplayContentPart {\n switch (w.type) {\n case 'text':\n return { type: 'text', text: w.text }\n case 'audio':\n return {\n type: 'audio',\n url: w.url,\n mimeType: w.mime_type,\n duration: w.duration,\n filename: w.filename,\n }\n case 'image':\n return {\n type: 'image',\n url: w.url,\n mimeType: w.mime_type,\n width: w.width,\n height: w.height,\n alt: w.alt,\n filename: w.filename,\n }\n case 'document':\n return {\n type: 'document',\n url: w.url,\n filename: w.filename,\n mimeType: w.mime_type,\n sizeBytes: w.size_bytes,\n }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\n\nexport function toThreadEvent(w: WireThreadEvent): ThreadEvent {\n return {\n id: w.id,\n threadId: w.thread_id,\n runId: w.run_id,\n type: w.type,\n actor: w.actor,\n author: w.author,\n user: toUser(w.user),\n content: w.content?.map(toDisplayContentPart),\n data: w.data,\n createdAt: w.created_at,\n clientEventId: w.client_event_id,\n }\n}\n\nexport function toRun(w: WireRun): Run {\n return {\n id: w.id,\n threadId: w.thread_id,\n agentId: w.agent_id,\n status: w.status,\n startedAt: w.started_at,\n endedAt: w.ended_at,\n error: w.error,\n }\n}\n\n// --- Settings transforms ---\n\nexport function toSettingsField(w: WireSettingsField): SettingsField {\n return {\n id: w.id,\n type: w.type as SettingsFieldType,\n label: w.label,\n required: w.required,\n readonly: w.readonly,\n value: w.value,\n placeholder: w.placeholder,\n options: w.options,\n min: w.min,\n max: w.max,\n rows: w.rows,\n src: w.src,\n width: w.width,\n height: w.height,\n }\n}\n\nexport function toSettingsItem(w: WireSettingsItem): SettingsItem {\n if ('fields' in w && Array.isArray((w as WireSettingsFieldGroup).fields)) {\n const g = w as WireSettingsFieldGroup\n return {\n id: g.id,\n label: g.label,\n fields: g.fields.map(toSettingsField),\n collapsible: g.collapsible,\n }\n }\n return toSettingsField(w as WireSettingsField)\n}\n\n// --- Analytics transforms ---\n\nexport function toAnalyticsEvent(w: WireAnalyticsEvent): AnalyticsEvent {\n return {\n event: w.event,\n timestamp: w.timestamp,\n workerId: w.worker_id,\n threadId: w.thread_id,\n userId: w.user_id,\n runId: w.run_id,\n eventId: w.event_id,\n data: w.data,\n }\n}\n\n// --- Public → Wire transforms (for sending content) ---\n\nexport function toWireContentPart(p: SendContentPart): WireC2S_ContentPart {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio':\n return { type: 'audio', ref_id: p.refId, duration: p.duration }\n case 'image':\n return { type: 'image', ref_id: p.refId }\n case 'document':\n return { type: 'document', ref_id: p.refId }\n }\n}\n","import type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart } from './protocol/models'\nimport type { WorkerActions } from './store'\nimport type { DisplayContentPart, SendContentPart, ThreadEvent } from './types'\nimport {\n toAnalyticsEvent,\n toRun,\n toSettingsItem,\n toThread,\n toThreadEvent,\n toWireContentPart,\n} from './types'\n\nconst MAX_RECONNECT_ATTEMPTS = 5\nconst RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000]\nconst SEND_MESSAGE_TIMEOUT = 30_000\n\nexport interface WorkerConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n}\n\nexport type OnErrorCallback = (error: { code: string; message: string; frameType: string }) => void\n\nexport interface UploadResult {\n refId: string\n mimeType: string\n filename: string\n sizeBytes: number\n}\n\nexport class WorkerClient {\n private ws: WebSocket | null = null\n private callbacks: WorkerActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private 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 this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n // Clean up pending message promises\n for (const [, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n }\n this.pendingMessages.clear()\n if (this.ws) {\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n this.ws = null\n }\n this.callbacks.setConnectionStatus('disconnected')\n }\n\n retry() {\n this.reconnectAttempts = 0\n this.isIntentionallyClosed = false\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n // --- Thread operations ---\n\n requestThreadList(cursor?: string | null, limit?: number) {\n this.send('thread.list', { cursor, limit })\n }\n\n subscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n this.subscriptionRefs.set(threadId, refs + 1)\n if (refs === 0) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', { thread_id: threadId, after_event_id: afterEventId })\n this.callbacks.addSubscription(threadId)\n }\n }\n\n unsubscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n if (refs <= 1) {\n this.subscriptionRefs.delete(threadId)\n this.lastEventIds.delete(threadId)\n this.eventPaginationCursors.delete(threadId)\n this.send('thread.unsubscribe', { thread_id: threadId })\n this.callbacks.removeSubscription(threadId)\n } else {\n this.subscriptionRefs.set(threadId, refs - 1)\n }\n }\n\n deleteThread(threadId: string) {\n this.send('thread.delete', { thread_id: threadId })\n }\n\n loadMoreThreads(limit?: number) {\n const cursor = this.lastThreadListCursor\n if (!cursor) return\n this.isLoadingMore = true\n this.send('thread.list', { cursor, limit })\n }\n\n loadOlderEvents(threadId: string, limit?: number) {\n const cursor = this.eventPaginationCursors.get(threadId)\n this.send('event.list', {\n thread_id: threadId,\n before_event_id: cursor ?? null,\n limit,\n })\n }\n\n // --- Settings ---\n\n subscribeSettings() {\n this.send('settings.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeSettings() {\n this.send('settings.unsubscribe', { worker_id: this.workerId })\n }\n\n patchSetting(fieldId: string, value: unknown) {\n this.send('settings.patch', { field_id: fieldId, value })\n }\n\n // --- Feedback ---\n\n sendFeedback(\n targetType: string,\n targetId: string,\n feedback: 'like' | 'dislike',\n reason?: string,\n classification?: string\n ) {\n this.send('feedback', {\n target_type: targetType,\n target_id: targetId,\n feedback,\n reason,\n classification,\n })\n }\n\n // --- Analytics ---\n\n subscribeAnalytics() {\n this.send('analytics.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { worker_id: this.workerId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n }): Promise<{ threadId: string }> {\n const clientEventId = crypto.randomUUID()\n const content: WireC2S_ContentPart[] = params.content\n ? params.content.map(toWireContentPart)\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic display content from send parts\n const displayContent: DisplayContentPart[] = params.content\n ? params.content.map((p): DisplayContentPart => {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio':\n return { type: 'audio', duration: p.duration }\n case 'image':\n return { type: 'image' }\n case 'document':\n return { type: 'document' }\n default:\n return { type: 'text', text: '' }\n }\n })\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic event\n const optimisticEvent: ThreadEvent = {\n id: `optimistic-${clientEventId}`,\n threadId: params.threadId ?? '',\n runId: null,\n type: 'message',\n actor: 'user',\n author: null,\n user: {\n userId: this.config.userId ?? '',\n userName: this.config.userName,\n userEmail: this.config.userEmail,\n systemRole: this.config.systemRole ?? 'user',\n organizationRole: this.config.organizationRole ?? 'member',\n workspaceRole: this.config.workspaceRole ?? 'member',\n },\n content: displayContent,\n createdAt: new Date().toISOString(),\n }\n\n if (params.threadId) {\n this.callbacks.addOptimistic(params.threadId, optimisticEvent, clientEventId)\n }\n\n this.pendingOptimistic.set(clientEventId, {\n threadId: params.threadId ?? '',\n clientEventId,\n })\n\n // Create promise that resolves when server confirms with event.append\n const promise = new Promise<{ threadId: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(clientEventId)\n reject(new Error('sendMessage timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, timer })\n })\n\n this.send('event.create', {\n thread_id: params.threadId,\n client_event_id: clientEventId,\n event: {\n type: 'message' as const,\n actor: 'user' as const,\n content,\n },\n })\n\n return promise\n }\n\n // --- Private ---\n\n private createConnection() {\n if (this.ws) {\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n }\n\n this.ws = new WebSocket(this.url)\n\n this.ws.onopen = () => {\n this.authenticate()\n }\n\n this.ws.onmessage = (e: MessageEvent) => {\n try {\n const frame = JSON.parse(e.data as string) as ServerToClient\n this.route(frame)\n } catch {\n // Ignore malformed frames\n }\n }\n\n this.ws.onclose = () => {\n if (!this.isIntentionallyClosed) {\n this.scheduleReconnect()\n }\n }\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n }\n }\n\n private authenticate() {\n this.connectFrameId = crypto.randomUUID()\n this.sendRaw({\n id: this.connectFrameId,\n type: 'connect',\n payload: {\n worker_id: this.workerId,\n organization_id: this.config.organizationId ?? '',\n workspace_id: this.config.workspaceId ?? '',\n user: {\n user_id: this.config.userId ?? '',\n user_name: this.config.userName ?? null,\n user_email: this.config.userEmail ?? null,\n system_role: this.config.systemRole ?? 'user',\n organization_role: this.config.organizationRole ?? 'member',\n workspace_role: this.config.workspaceRole ?? 'member',\n },\n auth_token: this.config.authToken,\n client: { name: 'dooers-agents-client', version: '0.1.0' },\n },\n })\n }\n\n private route(frame: ServerToClient) {\n switch (frame.type) {\n case 'ack': {\n if (frame.payload.ack_id === this.connectFrameId) {\n if (frame.payload.ok) {\n this.callbacks.setConnectionStatus('connected')\n this.callbacks.resetReconnect()\n this.requestThreadList()\n // Re-subscribe to previously tracked threads\n for (const threadId of this.subscriptionRefs.keys()) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', {\n thread_id: threadId,\n after_event_id: afterEventId,\n })\n }\n } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n this.onError?.({\n code: frame.payload.error.code,\n message: frame.payload.error.message,\n frameType: 'ack',\n })\n }\n break\n }\n\n case 'thread.list.result': {\n const threads = frame.payload.threads.map(toThread)\n const cursor = frame.payload.cursor ?? null\n const totalCount = frame.payload.total_count\n this.lastThreadListCursor = cursor\n if (this.isLoadingMore) {\n this.callbacks.onThreadListAppend(threads, cursor, totalCount)\n } else {\n this.callbacks.onThreadList(threads, cursor, totalCount)\n }\n this.isLoadingMore = false\n break\n }\n\n case 'thread.snapshot': {\n const thread = toThread(frame.payload.thread)\n const events = 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 = 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 = 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","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\n ? [...existing, ...newFromSnapshot]\n : 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 const unique = newEvents.filter((e) => !existingIds.has(e.id))\n return {\n events: { ...s.events, [threadId]: [...existing, ...unique] },\n }\n }),\n\n reconcileEvents: (threadId, newEvents, resolvedClientEventIds) =>\n set((s) => {\n // Append confirmed events\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const unique = newEvents.filter((e) => !existingIds.has(e.id))\n\n // Remove reconciled optimistic events\n let optEvents = s.optimistic[threadId] ?? []\n let optKeys = s.optimisticKeys[threadId] ?? []\n for (const clientEventId of resolvedClientEventIds) {\n const idx = optKeys.indexOf(clientEventId)\n if (idx >= 0) {\n optEvents = [...optEvents]\n optEvents.splice(idx, 1)\n optKeys = [...optKeys]\n optKeys.splice(idx, 1)\n }\n }\n\n return {\n events: { ...s.events, [threadId]: [...existing, ...unique] },\n optimistic: { ...s.optimistic, [threadId]: optEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: optKeys },\n }\n }),\n\n onEventListResult: (threadId, olderEvents, cursor, hasMore) =>\n set((s) => {\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const unique = olderEvents.filter((e) => !existingIds.has(e.id))\n return {\n events: { ...s.events, [threadId]: [...unique, ...existing] },\n eventPagination: {\n ...s.eventPagination,\n [threadId]: { cursor, hasMore },\n },\n }\n }),\n\n onRunUpsert: (run) =>\n set((s) => {\n const existing = s.runs[run.threadId] ?? []\n const idx = existing.findIndex((r) => r.id === run.id)\n const updated =\n idx >= 0 ? existing.map((r) => (r.id === run.id ? run : r)) : [...existing, run]\n return { runs: { ...s.runs, [run.threadId]: updated } }\n }),\n\n addOptimistic: (threadId, event, clientEventId) =>\n set((s) => ({\n optimistic: {\n ...s.optimistic,\n [threadId]: [...(s.optimistic[threadId] ?? []), event],\n },\n optimisticKeys: {\n ...s.optimisticKeys,\n [threadId]: [...(s.optimisticKeys[threadId] ?? []), clientEventId],\n },\n })),\n\n removeOptimistic: (threadId, clientEventId) =>\n set((s) => {\n const keys = s.optimisticKeys[threadId] ?? []\n const idx = keys.indexOf(clientEventId)\n if (idx < 0) return s\n const newKeys = [...keys]\n newKeys.splice(idx, 1)\n const newEvents = [...(s.optimistic[threadId] ?? [])]\n newEvents.splice(idx, 1)\n return {\n optimistic: { ...s.optimistic, [threadId]: newEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: newKeys },\n }\n }),\n\n addSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.add(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.add(threadId)\n return { subscriptions, loadingThreads }\n }),\n\n removeSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.delete(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(threadId)\n return { subscriptions, loadingThreads }\n }),\n\n onSettingsSnapshot: (fields, updatedAt) =>\n set(() => ({\n settings: { fields, updatedAt, isLoading: false },\n })),\n\n onSettingsPatch: (fieldId, value, updatedAt) =>\n set((s) => ({\n settings: {\n ...s.settings,\n updatedAt,\n fields: s.settings.fields.map((item) => {\n if (isSettingsFieldGroup(item)) {\n const hasField = item.fields.some((f) => f.id === fieldId)\n if (hasField) {\n return {\n ...item,\n fields: item.fields.map((f) => (f.id === fieldId ? { ...f, value } : f)),\n }\n }\n return item\n }\n return item.id === fieldId ? { ...item, value } : item\n }),\n },\n })),\n\n onFeedbackAck: (targetId, feedback) =>\n set((s) => ({\n feedback: { ...s.feedback, [targetId]: feedback },\n })),\n\n onAnalyticsEvent: (event) =>\n set((s) => {\n const events = [...s.analytics.events, event]\n const trimmed = events.length > 50 ? events.slice(-50) : events\n const counters = { ...s.analytics.counters }\n if (event.event === 'feedback.like') {\n counters.feedbackLikes += 1\n } else if (event.event === 'feedback.dislike') {\n counters.feedbackDislikes += 1\n } else {\n counters.totalRequests += 1\n }\n return { analytics: { events: trimmed, counters } }\n }),\n\n resetAnalytics: () =>\n set(() => ({\n analytics: {\n events: [],\n counters: { totalRequests: 0, feedbackLikes: 0, feedbackDislikes: 0 },\n },\n })),\n },\n }))\n}\n","import { createContext, type ReactNode, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useStore as useZustandStore } from 'zustand'\nimport { useShallow } from 'zustand/shallow'\nimport { type OnErrorCallback, WorkerClient } from './client'\nimport { createWorkerStore, type WorkerState, type WorkerStore } from './store'\n\ninterface WorkerContextValue {\n store: WorkerStore\n client: WorkerClient\n}\n\nconst WorkerContext = createContext<WorkerContextValue | null>(null)\n\nexport interface WorkerProviderProps {\n url?: string\n workerId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n uploadUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function WorkerProvider({\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n uploadUrl,\n onError,\n children,\n}: WorkerProviderProps) {\n const storeRef = useRef<WorkerStore | undefined>(undefined)\n const clientRef = useRef<WorkerClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createWorkerStore()\n clientRef.current = new WorkerClient(storeRef.current.getState().actions)\n }\n\n // Update onError callback\n useEffect(() => {\n clientRef.current?.setOnError(onError ?? null)\n }, [onError])\n\n // Update upload URL\n useEffect(() => {\n clientRef.current?.setUploadUrl(uploadUrl)\n }, [uploadUrl])\n\n // Connect/disconnect lifecycle — skips connection when url or workerId are missing\n useEffect(() => {\n if (!url || !workerId) return\n clientRef.current?.connect(url, workerId, {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n })\n return () => clientRef.current?.disconnect()\n }, [\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n ])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<WorkerContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <WorkerContext.Provider value={contextValue}>{children}</WorkerContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useWorkerContext(): WorkerContextValue {\n const ctx = useContext(WorkerContext)\n if (!ctx) {\n throw new Error('useWorkerContext must be used within a <WorkerProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useWorkerContext } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useWorkerContext()\n\n const events = useShallowStore((s) => s.analytics.events)\n const counters = useShallowStore((s) => s.analytics.counters)\n\n const subscribe = useCallback(() => client.subscribeAnalytics(), [client])\n const unsubscribe = useCallback(() => client.unsubscribeAnalytics(), [client])\n\n return { events, counters, subscribe, unsubscribe }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\nfunction getPreferredMimeType(): string {\n if (typeof MediaRecorder !== 'undefined') {\n if (MediaRecorder.isTypeSupported('audio/webm;codecs=opus')) return 'audio/webm;codecs=opus'\n if (MediaRecorder.isTypeSupported('audio/webm')) return 'audio/webm'\n if (MediaRecorder.isTypeSupported('audio/mp4')) return 'audio/mp4'\n }\n return 'audio/webm'\n}\n\nexport function useAudioRecorder() {\n const [isRecording, setIsRecording] = useState(false)\n const [duration, setDuration] = useState(0)\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const startTimeRef = useRef<number>(0)\n const resolveStopRef = useRef<((blob: Blob) => void) | null>(null)\n\n const releaseStream = useCallback(() => {\n streamRef.current?.getTracks().forEach((t) => {\n t.stop()\n })\n streamRef.current = null\n }, [])\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 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 }\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 systemRole: string\n organizationRole: string\n workspaceRole: string\n}\n\nexport interface Thread {\n id: string\n workerId: string\n organizationId: string\n workspaceId: string\n owner: User\n users: User[]\n title: string | null\n createdAt: string\n updatedAt: string\n lastEventAt: string\n}\n\nexport interface ThreadEvent {\n id: string\n threadId: string\n runId: string | null\n type: EventType\n actor: Actor\n author: string | null\n user?: User\n content?: DisplayContentPart[]\n data?: Record<string, unknown>\n createdAt: string\n clientEventId?: string\n}\n\nexport interface Run {\n id: string\n threadId: string\n agentId: string | null\n status: RunStatus\n startedAt: string\n endedAt: string | null\n error: string | null\n}\n\n// --- Settings ---\n\nexport type SettingsFieldType =\n | 'text'\n | 'number'\n | 'select'\n | 'checkbox'\n | 'textarea'\n | 'password'\n | 'email'\n | 'date'\n | 'image'\n\nexport interface SettingsSelectOption {\n value: string\n label: string\n}\n\nexport interface SettingsField {\n id: string\n type: SettingsFieldType\n label: string\n required: boolean\n readonly: boolean\n value: unknown\n placeholder: string | null\n options: SettingsSelectOption[] | null\n min: number | null\n max: number | null\n rows: number | null\n src: string | null\n width: number | null\n height: number | null\n}\n\nexport interface SettingsFieldGroup {\n id: string\n label: string\n fields: SettingsField[]\n collapsible: 'open' | 'closed' | null\n}\n\nexport type SettingsItem = SettingsField | SettingsFieldGroup\n\nexport function isSettingsFieldGroup(item: SettingsItem): item is SettingsFieldGroup {\n return 'fields' in item && Array.isArray((item as SettingsFieldGroup).fields)\n}\n\n// --- Feedback ---\n\nexport type FeedbackType = 'like' | 'dislike'\nexport type FeedbackTarget = 'event' | 'run' | 'thread'\n\n// --- Analytics ---\n\nexport interface AnalyticsEvent {\n event: string\n timestamp: string\n workerId: string\n threadId: string | null\n userId: string | null\n runId: string | null\n eventId: string | null\n data: Record<string, unknown> | null\n}\n\nexport interface ThreadState {\n thread: Thread | null\n events: ThreadEvent[]\n runs: Run[]\n isLoading: boolean\n isWaiting: boolean\n}\n\n// --- Wire → Public transforms ---\n\nimport type {\n WireAnalyticsEvent,\n WireC2S_ContentPart,\n WireRun,\n WireS2C_ContentPart,\n WireSettingsField,\n WireSettingsFieldGroup,\n WireSettingsItem,\n WireThread,\n WireThreadEvent,\n WireUser,\n} from './protocol/models'\n\nexport function toUser(w: WireUser): User\nexport function toUser(w: WireUser | undefined): User | undefined\nexport function toUser(w?: WireUser): User | undefined {\n if (!w) return undefined\n return {\n userId: w.user_id,\n userName: w.user_name,\n userEmail: w.user_email,\n systemRole: w.system_role,\n organizationRole: w.organization_role,\n workspaceRole: w.workspace_role,\n }\n}\n\nexport function toThread(w: WireThread): Thread {\n return {\n id: w.id,\n workerId: w.worker_id,\n organizationId: w.organization_id,\n workspaceId: w.workspace_id,\n owner: toUser(w.owner),\n users: w.users.map((u) => toUser(u)),\n title: w.title,\n createdAt: w.created_at,\n updatedAt: w.updated_at,\n lastEventAt: w.last_event_at,\n }\n}\n\nexport function toDisplayContentPart(w: WireS2C_ContentPart): DisplayContentPart {\n switch (w.type) {\n case 'text':\n return { type: 'text', text: w.text }\n case 'audio':\n return {\n type: 'audio',\n url: w.url,\n mimeType: w.mime_type,\n duration: w.duration,\n filename: w.filename,\n }\n case 'image':\n return {\n type: 'image',\n url: w.url,\n mimeType: w.mime_type,\n width: w.width,\n height: w.height,\n alt: w.alt,\n filename: w.filename,\n }\n case 'document':\n return {\n type: 'document',\n url: w.url,\n filename: w.filename,\n mimeType: w.mime_type,\n sizeBytes: w.size_bytes,\n }\n }\n}\n\n// Backward-compatible alias\nexport const toContentPart = toDisplayContentPart\n\nexport function toThreadEvent(w: WireThreadEvent): ThreadEvent {\n return {\n id: w.id,\n threadId: w.thread_id,\n runId: w.run_id,\n type: w.type,\n actor: w.actor,\n author: w.author,\n user: toUser(w.user),\n content: w.content?.map(toDisplayContentPart),\n data: w.data,\n createdAt: w.created_at,\n clientEventId: w.client_event_id,\n }\n}\n\nexport function toRun(w: WireRun): Run {\n return {\n id: w.id,\n threadId: w.thread_id,\n agentId: w.agent_id,\n status: w.status,\n startedAt: w.started_at,\n endedAt: w.ended_at,\n error: w.error,\n }\n}\n\n// --- Settings transforms ---\n\nexport function toSettingsField(w: WireSettingsField): SettingsField {\n return {\n id: w.id,\n type: w.type as SettingsFieldType,\n label: w.label,\n required: w.required,\n readonly: w.readonly,\n value: w.value,\n placeholder: w.placeholder,\n options: w.options,\n min: w.min,\n max: w.max,\n rows: w.rows,\n src: w.src,\n width: w.width,\n height: w.height,\n }\n}\n\nexport function toSettingsItem(w: WireSettingsItem): SettingsItem {\n if ('fields' in w && Array.isArray((w as WireSettingsFieldGroup).fields)) {\n const g = w as WireSettingsFieldGroup\n return {\n id: g.id,\n label: g.label,\n fields: g.fields.map(toSettingsField),\n collapsible: g.collapsible,\n }\n }\n return toSettingsField(w as WireSettingsField)\n}\n\n// --- Analytics transforms ---\n\nexport function toAnalyticsEvent(w: WireAnalyticsEvent): AnalyticsEvent {\n return {\n event: w.event,\n timestamp: w.timestamp,\n workerId: w.worker_id,\n threadId: w.thread_id,\n userId: w.user_id,\n runId: w.run_id,\n eventId: w.event_id,\n data: w.data,\n }\n}\n\n// --- Public → Wire transforms (for sending content) ---\n\nexport function toWireContentPart(p: SendContentPart): WireC2S_ContentPart {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio':\n return { type: 'audio', ref_id: p.refId, duration: p.duration }\n case 'image':\n return { type: 'image', ref_id: p.refId }\n case 'document':\n return { type: 'document', ref_id: p.refId }\n }\n}\n","import type { ServerToClient } from './protocol/frames'\nimport type { WireC2S_ContentPart } from './protocol/models'\nimport type { WorkerActions } from './store'\nimport type { DisplayContentPart, SendContentPart, ThreadEvent } from './types'\nimport {\n toAnalyticsEvent,\n toRun,\n toSettingsItem,\n toThread,\n toThreadEvent,\n toWireContentPart,\n} from './types'\n\nconst MAX_RECONNECT_ATTEMPTS = 5\nconst RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000]\nconst SEND_MESSAGE_TIMEOUT = 30_000\n\nexport interface WorkerConnectionConfig {\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n}\n\nexport type OnErrorCallback = (error: { code: string; message: string; frameType: string }) => void\n\nexport interface UploadResult {\n refId: string\n mimeType: string\n filename: string\n sizeBytes: number\n}\n\nexport class WorkerClient {\n private ws: WebSocket | null = null\n private callbacks: WorkerActions\n private onError: OnErrorCallback | null = null\n\n private url = ''\n private httpBaseUrl = ''\n private workerId = ''\n private uploadUrl: string | undefined\n private config: WorkerConnectionConfig = {\n organizationId: '',\n workspaceId: '',\n userId: '',\n }\n\n private connectFrameId = ''\n private isIntentionallyClosed = false\n private reconnectAttempts = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n\n // Refcounted subscriptions\n private subscriptionRefs = new Map<string, number>()\n\n // Track optimistic events for reconciliation\n private pendingOptimistic = new Map<string, { threadId: string; clientEventId: string }>()\n\n // Pending message promises — resolved when event.append arrives with matching clientEventId\n private pendingMessages = new Map<\n string,\n { resolve: (value: { threadId: string }) => void; timer: ReturnType<typeof setTimeout> }\n >()\n\n // Track last event ID per thread for gap recovery on reconnect\n private lastEventIds = new Map<string, string>()\n\n // Pagination\n private lastThreadListCursor: string | null = null\n private isLoadingMore = false\n\n // Event pagination cursors per thread\n private eventPaginationCursors = new Map<string, string | null>()\n\n constructor(callbacks: WorkerActions) {\n this.callbacks = callbacks\n }\n\n setOnError(cb: OnErrorCallback | null) {\n this.onError = cb\n }\n\n setUploadUrl(url: string | undefined) {\n this.uploadUrl = url\n }\n\n async upload(file: File | Blob): Promise<UploadResult> {\n if (!this.uploadUrl) {\n throw new Error('uploadUrl not configured')\n }\n\n const formData = new FormData()\n formData.append('file', file)\n\n const headers: Record<string, string> = {}\n if (this.config.authToken) {\n headers.Authorization = `Bearer ${this.config.authToken}`\n }\n\n const response = await fetch(this.uploadUrl, {\n method: 'POST',\n body: formData,\n headers,\n })\n\n if (!response.ok) {\n throw new Error(`Upload failed: ${response.status} ${response.statusText}`)\n }\n\n const result = await response.json()\n return {\n refId: result.ref_id,\n mimeType: result.mime_type,\n filename: result.filename,\n sizeBytes: result.size_bytes,\n }\n }\n\n connect(url: string, workerId: string, config?: WorkerConnectionConfig) {\n this.url = url\n this.workerId = workerId\n this.config = config ?? { organizationId: '', workspaceId: '', userId: '' }\n this.isIntentionallyClosed = false\n\n // Derive HTTP base URL from WebSocket URL for resolving relative content URLs\n try {\n const parsed = new URL(url)\n parsed.protocol = parsed.protocol === 'wss:' ? 'https:' : 'http:'\n parsed.pathname = ''\n parsed.search = ''\n parsed.hash = ''\n this.httpBaseUrl = parsed.toString().replace(/\\/$/, '')\n } catch {\n this.httpBaseUrl = ''\n }\n\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n disconnect() {\n this.isIntentionallyClosed = true\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n // Clean up pending message promises\n for (const [, pending] of this.pendingMessages) {\n clearTimeout(pending.timer)\n }\n this.pendingMessages.clear()\n if (this.ws) {\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n this.ws = null\n }\n this.callbacks.setConnectionStatus('disconnected')\n }\n\n retry() {\n this.reconnectAttempts = 0\n this.isIntentionallyClosed = false\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }\n\n // --- Thread operations ---\n\n requestThreadList(cursor?: string | null, limit?: number) {\n this.send('thread.list', { cursor, limit })\n }\n\n subscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n this.subscriptionRefs.set(threadId, refs + 1)\n if (refs === 0) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', { thread_id: threadId, after_event_id: afterEventId })\n this.callbacks.addSubscription(threadId)\n }\n }\n\n unsubscribe(threadId: string) {\n const refs = this.subscriptionRefs.get(threadId) ?? 0\n if (refs <= 1) {\n this.subscriptionRefs.delete(threadId)\n this.lastEventIds.delete(threadId)\n this.eventPaginationCursors.delete(threadId)\n this.send('thread.unsubscribe', { thread_id: threadId })\n this.callbacks.removeSubscription(threadId)\n } else {\n this.subscriptionRefs.set(threadId, refs - 1)\n }\n }\n\n deleteThread(threadId: string) {\n this.send('thread.delete', { thread_id: threadId })\n }\n\n loadMoreThreads(limit?: number) {\n const cursor = this.lastThreadListCursor\n if (!cursor) return\n this.isLoadingMore = true\n this.send('thread.list', { cursor, limit })\n }\n\n loadOlderEvents(threadId: string, limit?: number) {\n const cursor = this.eventPaginationCursors.get(threadId)\n this.send('event.list', {\n thread_id: threadId,\n before_event_id: cursor ?? null,\n limit,\n })\n }\n\n // --- Settings ---\n\n subscribeSettings() {\n this.send('settings.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeSettings() {\n this.send('settings.unsubscribe', { worker_id: this.workerId })\n }\n\n patchSetting(fieldId: string, value: unknown) {\n this.send('settings.patch', { field_id: fieldId, value })\n }\n\n // --- Feedback ---\n\n sendFeedback(\n targetType: string,\n targetId: string,\n feedback: 'like' | 'dislike',\n reason?: string,\n classification?: string\n ) {\n this.send('feedback', {\n target_type: targetType,\n target_id: targetId,\n feedback,\n reason,\n classification,\n })\n }\n\n // --- Analytics ---\n\n subscribeAnalytics() {\n this.send('analytics.subscribe', { worker_id: this.workerId })\n }\n\n unsubscribeAnalytics() {\n this.send('analytics.unsubscribe', { worker_id: this.workerId })\n }\n\n // --- Messaging ---\n\n sendMessage(params: {\n text?: string\n threadId?: string\n content?: SendContentPart[]\n }): Promise<{ threadId: string }> {\n const clientEventId = crypto.randomUUID()\n const content: WireC2S_ContentPart[] = params.content\n ? params.content.map(toWireContentPart)\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic display content from send parts\n const displayContent: DisplayContentPart[] = params.content\n ? params.content.map((p): DisplayContentPart => {\n switch (p.type) {\n case 'text':\n return { type: 'text', text: p.text }\n case 'audio':\n return { type: 'audio', duration: p.duration }\n case 'image':\n return { type: 'image' }\n case 'document':\n return { type: 'document' }\n default:\n return { type: 'text', text: '' }\n }\n })\n : [{ type: 'text', text: params.text ?? '' }]\n\n // Build optimistic event\n const optimisticEvent: ThreadEvent = {\n id: `optimistic-${clientEventId}`,\n threadId: params.threadId ?? '',\n runId: null,\n type: 'message',\n actor: 'user',\n author: null,\n user: {\n userId: this.config.userId ?? '',\n userName: this.config.userName,\n userEmail: this.config.userEmail,\n systemRole: this.config.systemRole ?? 'user',\n organizationRole: this.config.organizationRole ?? 'member',\n workspaceRole: this.config.workspaceRole ?? 'member',\n },\n content: displayContent,\n createdAt: new Date().toISOString(),\n }\n\n if (params.threadId) {\n this.callbacks.addOptimistic(params.threadId, optimisticEvent, clientEventId)\n }\n\n this.pendingOptimistic.set(clientEventId, {\n threadId: params.threadId ?? '',\n clientEventId,\n })\n\n // Create promise that resolves when server confirms with event.append\n const promise = new Promise<{ threadId: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(clientEventId)\n reject(new Error('sendMessage timed out waiting for server response'))\n }, SEND_MESSAGE_TIMEOUT)\n\n this.pendingMessages.set(clientEventId, { resolve, timer })\n })\n\n this.send('event.create', {\n thread_id: params.threadId,\n client_event_id: clientEventId,\n event: {\n type: 'message' as const,\n actor: 'user' as const,\n content,\n },\n })\n\n return promise\n }\n\n // --- Private ---\n\n private createConnection() {\n if (this.ws) {\n this.ws.onopen = null\n this.ws.onmessage = null\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.close()\n }\n\n this.ws = new WebSocket(this.url)\n\n this.ws.onopen = () => {\n this.authenticate()\n }\n\n this.ws.onmessage = (e: MessageEvent) => {\n try {\n const frame = JSON.parse(e.data as string) as ServerToClient\n this.route(frame)\n } catch {\n // Ignore malformed frames\n }\n }\n\n this.ws.onclose = () => {\n if (!this.isIntentionallyClosed) {\n this.scheduleReconnect()\n }\n }\n\n this.ws.onerror = () => {\n // onclose will fire after onerror\n }\n }\n\n private authenticate() {\n this.connectFrameId = crypto.randomUUID()\n this.sendRaw({\n id: this.connectFrameId,\n type: 'connect',\n payload: {\n worker_id: this.workerId,\n organization_id: this.config.organizationId ?? '',\n workspace_id: this.config.workspaceId ?? '',\n user: {\n user_id: this.config.userId ?? '',\n user_name: this.config.userName ?? null,\n user_email: this.config.userEmail ?? null,\n system_role: this.config.systemRole ?? 'user',\n organization_role: this.config.organizationRole ?? 'member',\n workspace_role: this.config.workspaceRole ?? 'member',\n },\n auth_token: this.config.authToken,\n client: { name: 'dooers-agents-client', version: '0.1.0' },\n },\n })\n }\n\n private route(frame: ServerToClient) {\n switch (frame.type) {\n case 'ack': {\n if (frame.payload.ack_id === this.connectFrameId) {\n if (frame.payload.ok) {\n this.callbacks.setConnectionStatus('connected')\n this.callbacks.resetReconnect()\n this.requestThreadList()\n // Re-subscribe to previously tracked threads\n for (const threadId of this.subscriptionRefs.keys()) {\n const afterEventId = this.lastEventIds.get(threadId) ?? null\n this.send('thread.subscribe', {\n thread_id: threadId,\n after_event_id: afterEventId,\n })\n }\n } else {\n this.callbacks.setConnectionStatus('error', frame.payload.error?.message)\n }\n } else if (!frame.payload.ok && frame.payload.error) {\n this.onError?.({\n code: frame.payload.error.code,\n message: frame.payload.error.message,\n frameType: 'ack',\n })\n }\n break\n }\n\n case 'thread.list.result': {\n const threads = frame.payload.threads.map(toThread)\n const cursor = frame.payload.cursor ?? null\n const totalCount = frame.payload.total_count\n this.lastThreadListCursor = cursor\n if (this.isLoadingMore) {\n this.callbacks.onThreadListAppend(threads, cursor, totalCount)\n } else {\n this.callbacks.onThreadList(threads, cursor, totalCount)\n }\n this.isLoadingMore = false\n break\n }\n\n case 'thread.snapshot': {\n const thread = toThread(frame.payload.thread)\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n const runs = (frame.payload.runs ?? []).map(toRun)\n // Track last event for gap recovery\n const lastEvent = events[events.length - 1]\n if (lastEvent) {\n this.lastEventIds.set(thread.id, lastEvent.id)\n }\n // Set initial event pagination cursor to oldest event\n const oldestEvent = events[0]\n if (oldestEvent) {\n this.eventPaginationCursors.set(thread.id, oldestEvent.id)\n }\n this.callbacks.onThreadSnapshot(thread, events, runs)\n break\n }\n\n case 'event.append': {\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n // Collect reconciled client event IDs and resolve pending message promises\n const resolvedClientEventIds: string[] = []\n for (const event of events) {\n if (event.clientEventId && this.pendingOptimistic.has(event.clientEventId)) {\n resolvedClientEventIds.push(event.clientEventId)\n this.pendingOptimistic.delete(event.clientEventId)\n }\n if (event.clientEventId && this.pendingMessages.has(event.clientEventId)) {\n const pendingMessage = this.pendingMessages.get(event.clientEventId)\n if (pendingMessage) {\n clearTimeout(pendingMessage.timer)\n pendingMessage.resolve({ threadId: frame.payload.thread_id })\n this.pendingMessages.delete(event.clientEventId)\n }\n }\n }\n // Track last event for gap recovery on reconnect.\n // Only for subscribed threads — new threads receive event.append\n // before subscription exists, and lastEventIds feeds after_event_id\n // in subscribe(), which controls what the server includes in snapshots.\n const lastEvent = events[events.length - 1]\n if (lastEvent && this.subscriptionRefs.has(frame.payload.thread_id)) {\n this.lastEventIds.set(frame.payload.thread_id, lastEvent.id)\n }\n // Atomically append confirmed events and remove reconciled optimistic events\n if (resolvedClientEventIds.length > 0) {\n this.callbacks.reconcileEvents(frame.payload.thread_id, events, resolvedClientEventIds)\n } else {\n this.callbacks.onEventAppend(frame.payload.thread_id, events)\n }\n break\n }\n\n case 'event.list.result': {\n const events = this.resolveEventUrls(frame.payload.events.map(toThreadEvent))\n this.eventPaginationCursors.set(frame.payload.thread_id, frame.payload.cursor)\n this.callbacks.onEventListResult(\n frame.payload.thread_id,\n events,\n frame.payload.cursor,\n frame.payload.has_more\n )\n break\n }\n\n case 'thread.upsert':\n this.callbacks.onThreadUpsert(toThread(frame.payload.thread))\n break\n\n case 'thread.deleted':\n this.callbacks.onThreadDeleted(frame.payload.thread_id)\n this.lastEventIds.delete(frame.payload.thread_id)\n break\n\n case 'run.upsert':\n this.callbacks.onRunUpsert(toRun(frame.payload.run))\n break\n\n case 'settings.snapshot': {\n const fields = frame.payload.fields.map(toSettingsItem)\n this.callbacks.onSettingsSnapshot(fields, frame.payload.updated_at)\n break\n }\n\n case 'settings.patch':\n this.callbacks.onSettingsPatch(\n frame.payload.field_id,\n frame.payload.value,\n frame.payload.updated_at\n )\n break\n\n case 'feedback.ack':\n if (frame.payload.ok) {\n this.callbacks.onFeedbackAck(\n frame.payload.target_id,\n frame.payload.feedback as 'like' | 'dislike'\n )\n }\n break\n\n case 'analytics.event':\n this.callbacks.onAnalyticsEvent(toAnalyticsEvent(frame.payload))\n break\n }\n }\n\n private scheduleReconnect() {\n if (this.reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {\n this.callbacks.setReconnectFailed()\n this.callbacks.setConnectionStatus('error', 'Connection lost after maximum retries')\n return\n }\n this.callbacks.setConnectionStatus('disconnected')\n const delay = RECONNECT_DELAYS[this.reconnectAttempts] ?? 16000\n this.reconnectAttempts++\n this.reconnectTimer = setTimeout(() => {\n this.callbacks.setConnectionStatus('connecting')\n this.createConnection()\n }, delay)\n }\n\n private send(type: string, payload: unknown) {\n this.sendRaw({ id: crypto.randomUUID(), type, payload })\n }\n\n private sendRaw(frame: unknown) {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return\n this.ws.send(JSON.stringify(frame))\n }\n\n /** Resolve relative URLs in event content parts against the agent's HTTP base. */\n private resolveEventUrls(events: ThreadEvent[]): ThreadEvent[] {\n if (!this.httpBaseUrl) return events\n const base = this.httpBaseUrl\n return events.map((event) => {\n if (!event.content?.some((p) => 'url' in p && p.url?.startsWith('/'))) return event\n return {\n ...event,\n content: event.content.map((part) =>\n 'url' in part && part.url?.startsWith('/') ? { ...part, url: `${base}${part.url}` } : part\n ),\n }\n })\n }\n}\n","import { createStore } from 'zustand/vanilla'\nimport type { AnalyticsEvent, Run, SettingsItem, Thread, ThreadEvent } from './types'\nimport { isSettingsFieldGroup } from './types'\n\nexport interface WorkerActions {\n setConnectionStatus: (status: WorkerState['connection']['status'], error?: string) => void\n setReconnectFailed: () => void\n resetReconnect: () => void\n onThreadList: (threads: Thread[], cursor?: string | null, totalCount?: number) => void\n onThreadListAppend: (threads: Thread[], cursor?: string | null, totalCount?: number) => void\n onThreadUpsert: (thread: Thread) => void\n onThreadDeleted: (threadId: string) => void\n onThreadSnapshot: (thread: Thread, events: ThreadEvent[], runs: Run[]) => void\n onEventAppend: (threadId: string, events: ThreadEvent[]) => void\n reconcileEvents: (\n threadId: string,\n events: ThreadEvent[],\n resolvedClientEventIds: string[]\n ) => void\n onEventListResult: (\n threadId: string,\n events: ThreadEvent[],\n cursor: string | null,\n hasMore: boolean\n ) => void\n onRunUpsert: (run: Run) => void\n addOptimistic: (threadId: string, event: ThreadEvent, clientEventId: string) => void\n removeOptimistic: (threadId: string, clientEventId: string) => void\n addSubscription: (threadId: string) => void\n removeSubscription: (threadId: string) => void\n onSettingsSnapshot: (fields: SettingsItem[], updatedAt: string) => void\n onSettingsPatch: (fieldId: string, value: unknown, updatedAt: string) => void\n onFeedbackAck: (targetId: string, feedback: 'like' | 'dislike') => void\n onAnalyticsEvent: (event: AnalyticsEvent) => void\n resetAnalytics: () => void\n}\n\nexport interface WorkerState {\n connection: {\n status: 'idle' | 'connecting' | 'connected' | 'disconnected' | 'error'\n error: string | null\n reconnectAttempts: number\n reconnectFailed: boolean\n }\n threads: Record<string, Thread>\n threadOrder: string[]\n threadListCursor: string | null\n threadListHasMore: boolean\n threadListTotalCount: number\n events: Record<string, ThreadEvent[]>\n eventPagination: Record<string, { cursor: string | null; hasMore: boolean }>\n optimistic: Record<string, ThreadEvent[]>\n optimisticKeys: Record<string, string[]>\n runs: Record<string, Run[]>\n settings: {\n fields: SettingsItem[]\n updatedAt: string | null\n isLoading: boolean\n }\n feedback: Record<string, 'like' | 'dislike'>\n analytics: {\n events: AnalyticsEvent[]\n counters: {\n totalRequests: number\n feedbackLikes: number\n feedbackDislikes: number\n }\n }\n subscriptions: Set<string>\n loadingThreads: Set<string>\n actions: WorkerActions\n}\n\nexport type WorkerStore = ReturnType<typeof createWorkerStore>\n\nexport function createWorkerStore() {\n return createStore<WorkerState>()((set) => ({\n connection: {\n status: 'idle',\n error: null,\n reconnectAttempts: 0,\n reconnectFailed: false,\n },\n threads: {},\n threadOrder: [],\n threadListCursor: null,\n threadListHasMore: false,\n threadListTotalCount: 0,\n events: {},\n eventPagination: {},\n optimistic: {},\n optimisticKeys: {},\n runs: {},\n settings: {\n fields: [],\n updatedAt: null,\n isLoading: true,\n },\n feedback: {},\n analytics: {\n events: [],\n counters: { totalRequests: 0, feedbackLikes: 0, feedbackDislikes: 0 },\n },\n subscriptions: new Set(),\n loadingThreads: new Set(),\n\n actions: {\n setConnectionStatus: (status, error) =>\n set((s) => ({\n connection: { ...s.connection, status, error: error ?? null },\n })),\n\n setReconnectFailed: () =>\n set((s) => ({\n connection: { ...s.connection, reconnectFailed: true },\n })),\n\n resetReconnect: () =>\n set((s) => ({\n connection: { ...s.connection, reconnectAttempts: 0, reconnectFailed: false },\n })),\n\n onThreadList: (threads, cursor, totalCount) =>\n set(() => {\n const map: Record<string, Thread> = {}\n const order: string[] = []\n for (const t of threads) {\n map[t.id] = t\n order.push(t.id)\n }\n return {\n threads: map,\n threadOrder: order,\n threadListCursor: cursor ?? null,\n threadListHasMore: cursor != null,\n threadListTotalCount: totalCount ?? 0,\n }\n }),\n\n onThreadListAppend: (threads, cursor) =>\n set((s) => {\n const map = { ...s.threads }\n const order = [...s.threadOrder]\n for (const t of threads) {\n if (!map[t.id]) {\n order.push(t.id)\n }\n map[t.id] = t\n }\n return {\n threads: map,\n threadOrder: order,\n threadListCursor: cursor ?? null,\n threadListHasMore: cursor != null,\n }\n }),\n\n onThreadUpsert: (thread) =>\n set((s) => {\n const threads = { ...s.threads, [thread.id]: thread }\n const threadOrder = s.threadOrder.includes(thread.id)\n ? s.threadOrder\n : [thread.id, ...s.threadOrder]\n return { threads, threadOrder }\n }),\n\n onThreadDeleted: (threadId) =>\n set((s) => {\n const { [threadId]: _, ...threads } = s.threads\n const { [threadId]: _e, ...events } = s.events\n const { [threadId]: _r, ...runs } = s.runs\n const { [threadId]: _o, ...optimistic } = s.optimistic\n const { [threadId]: _k, ...optimisticKeys } = s.optimisticKeys\n const { [threadId]: _p, ...eventPagination } = s.eventPagination\n const threadOrder = s.threadOrder.filter((id) => id !== threadId)\n const subscriptions = new Set(s.subscriptions)\n subscriptions.delete(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(threadId)\n return {\n threads,\n threadOrder,\n events,\n runs,\n optimistic,\n optimisticKeys,\n eventPagination,\n subscriptions,\n loadingThreads,\n }\n }),\n\n onThreadSnapshot: (thread, snapshotEvents, runs) =>\n set((s) => {\n const threads = { ...s.threads, [thread.id]: thread }\n const threadOrder = s.threadOrder.includes(thread.id)\n ? s.threadOrder\n : [thread.id, ...s.threadOrder]\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(thread.id)\n\n // Events may already exist from event.append arriving before the\n // snapshot (race between the two data paths). Existing array is\n // already in chronological order. Append only snapshot events we\n // don't have yet — never reorder what's already in place.\n const existing = s.events[thread.id] ?? []\n let mergedEvents: ThreadEvent[]\n if (existing.length === 0) {\n mergedEvents = snapshotEvents\n } else {\n const existingIds = new Set(existing.map((e) => e.id))\n const newFromSnapshot = snapshotEvents.filter((e) => !existingIds.has(e.id))\n mergedEvents = newFromSnapshot.length > 0 ? [...existing, ...newFromSnapshot] : existing\n }\n\n // Snapshot is authoritative — clear optimistic state for this thread.\n const optimistic = { ...s.optimistic }\n const optimisticKeys = { ...s.optimisticKeys }\n delete optimistic[thread.id]\n delete optimisticKeys[thread.id]\n\n return {\n threads,\n threadOrder,\n events: { ...s.events, [thread.id]: mergedEvents },\n runs: { ...s.runs, [thread.id]: runs },\n optimistic,\n optimisticKeys,\n loadingThreads,\n }\n }),\n\n onEventAppend: (threadId, newEvents) =>\n set((s) => {\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n // Separate new events from updates to existing events\n const updates = new Map<string, ThreadEvent>()\n const appends: ThreadEvent[] = []\n for (const e of newEvents) {\n if (existingIds.has(e.id)) {\n updates.set(e.id, e)\n } else {\n appends.push(e)\n }\n }\n // Apply in-place updates then append new events\n const merged = updates.size > 0 ? existing.map((e) => updates.get(e.id) ?? e) : existing\n return {\n events: { ...s.events, [threadId]: [...merged, ...appends] },\n }\n }),\n\n reconcileEvents: (threadId, newEvents, resolvedClientEventIds) =>\n set((s) => {\n // Append confirmed events\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const unique = newEvents.filter((e) => !existingIds.has(e.id))\n\n // Remove reconciled optimistic events\n let optEvents = s.optimistic[threadId] ?? []\n let optKeys = s.optimisticKeys[threadId] ?? []\n for (const clientEventId of resolvedClientEventIds) {\n const idx = optKeys.indexOf(clientEventId)\n if (idx >= 0) {\n optEvents = [...optEvents]\n optEvents.splice(idx, 1)\n optKeys = [...optKeys]\n optKeys.splice(idx, 1)\n }\n }\n\n return {\n events: { ...s.events, [threadId]: [...existing, ...unique] },\n optimistic: { ...s.optimistic, [threadId]: optEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: optKeys },\n }\n }),\n\n onEventListResult: (threadId, olderEvents, cursor, hasMore) =>\n set((s) => {\n const existing = s.events[threadId] ?? []\n const existingIds = new Set(existing.map((e) => e.id))\n const unique = olderEvents.filter((e) => !existingIds.has(e.id))\n return {\n events: { ...s.events, [threadId]: [...unique, ...existing] },\n eventPagination: {\n ...s.eventPagination,\n [threadId]: { cursor, hasMore },\n },\n }\n }),\n\n onRunUpsert: (run) =>\n set((s) => {\n const existing = s.runs[run.threadId] ?? []\n const idx = existing.findIndex((r) => r.id === run.id)\n const updated =\n idx >= 0 ? existing.map((r) => (r.id === run.id ? run : r)) : [...existing, run]\n return { runs: { ...s.runs, [run.threadId]: updated } }\n }),\n\n addOptimistic: (threadId, event, clientEventId) =>\n set((s) => ({\n optimistic: {\n ...s.optimistic,\n [threadId]: [...(s.optimistic[threadId] ?? []), event],\n },\n optimisticKeys: {\n ...s.optimisticKeys,\n [threadId]: [...(s.optimisticKeys[threadId] ?? []), clientEventId],\n },\n })),\n\n removeOptimistic: (threadId, clientEventId) =>\n set((s) => {\n const keys = s.optimisticKeys[threadId] ?? []\n const idx = keys.indexOf(clientEventId)\n if (idx < 0) return s\n const newKeys = [...keys]\n newKeys.splice(idx, 1)\n const newEvents = [...(s.optimistic[threadId] ?? [])]\n newEvents.splice(idx, 1)\n return {\n optimistic: { ...s.optimistic, [threadId]: newEvents },\n optimisticKeys: { ...s.optimisticKeys, [threadId]: newKeys },\n }\n }),\n\n addSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.add(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.add(threadId)\n return { subscriptions, loadingThreads }\n }),\n\n removeSubscription: (threadId) =>\n set((s) => {\n const subscriptions = new Set(s.subscriptions)\n subscriptions.delete(threadId)\n const loadingThreads = new Set(s.loadingThreads)\n loadingThreads.delete(threadId)\n return { subscriptions, loadingThreads }\n }),\n\n onSettingsSnapshot: (fields, updatedAt) =>\n set(() => ({\n settings: { fields, updatedAt, isLoading: false },\n })),\n\n onSettingsPatch: (fieldId, value, updatedAt) =>\n set((s) => ({\n settings: {\n ...s.settings,\n updatedAt,\n fields: s.settings.fields.map((item) => {\n if (isSettingsFieldGroup(item)) {\n const hasField = item.fields.some((f) => f.id === fieldId)\n if (hasField) {\n return {\n ...item,\n fields: item.fields.map((f) => (f.id === fieldId ? { ...f, value } : f)),\n }\n }\n return item\n }\n return item.id === fieldId ? { ...item, value } : item\n }),\n },\n })),\n\n onFeedbackAck: (targetId, feedback) =>\n set((s) => ({\n feedback: { ...s.feedback, [targetId]: feedback },\n })),\n\n onAnalyticsEvent: (event) =>\n set((s) => {\n const events = [...s.analytics.events, event]\n const trimmed = events.length > 50 ? events.slice(-50) : events\n const counters = { ...s.analytics.counters }\n if (event.event === 'feedback.like') {\n counters.feedbackLikes += 1\n } else if (event.event === 'feedback.dislike') {\n counters.feedbackDislikes += 1\n } else {\n counters.totalRequests += 1\n }\n return { analytics: { events: trimmed, counters } }\n }),\n\n resetAnalytics: () =>\n set(() => ({\n analytics: {\n events: [],\n counters: { totalRequests: 0, feedbackLikes: 0, feedbackDislikes: 0 },\n },\n })),\n },\n }))\n}\n","import { createContext, type ReactNode, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useStore as useZustandStore } from 'zustand'\nimport { useShallow } from 'zustand/shallow'\nimport { type OnErrorCallback, WorkerClient } from './client'\nimport { createWorkerStore, type WorkerState, type WorkerStore } from './store'\n\ninterface WorkerContextValue {\n store: WorkerStore\n client: WorkerClient\n}\n\nconst WorkerContext = createContext<WorkerContextValue | null>(null)\n\nexport interface WorkerProviderProps {\n url?: string\n workerId?: string\n organizationId?: string\n workspaceId?: string\n userId?: string\n userName?: string\n userEmail?: string\n systemRole?: string\n organizationRole?: string\n workspaceRole?: string\n authToken?: string\n uploadUrl?: string\n onError?: OnErrorCallback\n children: ReactNode\n}\n\nexport function WorkerProvider({\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n uploadUrl,\n onError,\n children,\n}: WorkerProviderProps) {\n const storeRef = useRef<WorkerStore | undefined>(undefined)\n const clientRef = useRef<WorkerClient | undefined>(undefined)\n\n if (!storeRef.current) {\n storeRef.current = createWorkerStore()\n clientRef.current = new WorkerClient(storeRef.current.getState().actions)\n }\n\n // Update onError callback\n useEffect(() => {\n clientRef.current?.setOnError(onError ?? null)\n }, [onError])\n\n // Update upload URL\n useEffect(() => {\n clientRef.current?.setUploadUrl(uploadUrl)\n }, [uploadUrl])\n\n // Connect/disconnect lifecycle — skips connection when url or workerId are missing\n useEffect(() => {\n if (!url || !workerId) return\n clientRef.current?.connect(url, workerId, {\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n })\n return () => clientRef.current?.disconnect()\n }, [\n url,\n workerId,\n organizationId,\n workspaceId,\n userId,\n userName,\n userEmail,\n systemRole,\n organizationRole,\n workspaceRole,\n authToken,\n ])\n\n // Stable context value — refs never change after initial creation\n const contextValue = useMemo<WorkerContextValue>(\n () => ({ store: storeRef.current!, client: clientRef.current! }),\n []\n )\n\n return <WorkerContext.Provider value={contextValue}>{children}</WorkerContext.Provider>\n}\n\n// Internal hook for other hooks to access context\nexport function useWorkerContext(): WorkerContextValue {\n const ctx = useContext(WorkerContext)\n if (!ctx) {\n throw new Error('useWorkerContext must be used within a <WorkerProvider>')\n }\n return ctx\n}\n\n// Selector hook with Object.is equality (for primitives)\nexport function useStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, selector)\n}\n\n// Selector hook with shallow equality (for objects/arrays)\nexport function useShallowStore<T>(selector: (state: WorkerState) => T): T {\n const { store } = useWorkerContext()\n return useZustandStore(store, useShallow(selector))\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useWorkerContext } from '../provider'\n\nexport function useAnalytics() {\n const { client } = useWorkerContext()\n\n const events = useShallowStore((s) => s.analytics.events)\n const counters = useShallowStore((s) => s.analytics.counters)\n\n const subscribe = useCallback(() => client.subscribeAnalytics(), [client])\n const unsubscribe = useCallback(() => client.unsubscribeAnalytics(), [client])\n\n return { events, counters, subscribe, unsubscribe }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\nfunction getPreferredMimeType(): string {\n if (typeof MediaRecorder !== 'undefined') {\n if (MediaRecorder.isTypeSupported('audio/webm;codecs=opus')) return 'audio/webm;codecs=opus'\n if (MediaRecorder.isTypeSupported('audio/webm')) return 'audio/webm'\n if (MediaRecorder.isTypeSupported('audio/mp4')) return 'audio/mp4'\n }\n return 'audio/webm'\n}\n\nexport function useAudioRecorder() {\n const [isRecording, setIsRecording] = useState(false)\n const [duration, setDuration] = useState(0)\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const startTimeRef = useRef<number>(0)\n const resolveStopRef = useRef<((blob: Blob) => void) | null>(null)\n const audioContextRef = useRef<AudioContext | null>(null)\n const analyserRef = useRef<AnalyserNode | null>(null)\n\n const releaseAudioContext = useCallback(() => {\n analyserRef.current = null\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n audioContextRef.current.close()\n }\n audioContextRef.current = null\n }, [])\n\n const releaseStream = useCallback(() => {\n streamRef.current?.getTracks().forEach((t) => {\n t.stop()\n })\n streamRef.current = null\n releaseAudioContext()\n }, [releaseAudioContext])\n\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current)\n timerRef.current = null\n }\n }, [])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (mediaRecorderRef.current?.state === 'recording') {\n mediaRecorderRef.current.stop()\n }\n releaseStream()\n clearTimer()\n }\n }, [releaseStream, clearTimer])\n\n const start = useCallback(async () => {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n streamRef.current = stream\n\n const audioContext = new AudioContext()\n audioContextRef.current = audioContext\n const source = audioContext.createMediaStreamSource(stream)\n const analyser = audioContext.createAnalyser()\n analyser.fftSize = 256\n source.connect(analyser)\n analyserRef.current = analyser\n\n const mimeType = getPreferredMimeType()\n const recorder = new MediaRecorder(stream, { mimeType })\n mediaRecorderRef.current = recorder\n chunksRef.current = []\n\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data)\n }\n\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: mimeType.split(';')[0] })\n releaseStream()\n clearTimer()\n resolveStopRef.current?.(blob)\n resolveStopRef.current = null\n }\n\n startTimeRef.current = Date.now()\n setDuration(0)\n timerRef.current = setInterval(() => {\n setDuration(Math.floor((Date.now() - startTimeRef.current) / 1000))\n }, 1000)\n\n recorder.start()\n setIsRecording(true)\n }, [releaseStream, clearTimer])\n\n const stop = useCallback((): Promise<Blob> => {\n return new Promise((resolve, reject) => {\n if (!mediaRecorderRef.current || mediaRecorderRef.current.state === 'inactive') {\n reject(new Error('No active recording to stop'))\n return\n }\n resolveStopRef.current = resolve\n mediaRecorderRef.current.stop()\n setIsRecording(false)\n setDuration(0)\n })\n }, [])\n\n const cancel = useCallback(() => {\n resolveStopRef.current = null\n if (mediaRecorderRef.current?.state === 'recording') {\n mediaRecorderRef.current.stop()\n }\n releaseStream()\n clearTimer()\n setIsRecording(false)\n setDuration(0)\n }, [releaseStream, clearTimer])\n\n return { start, stop, cancel, isRecording, duration, analyserNode: analyserRef.current }\n}\n","import { useCallback } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\n\nexport function useConnection() {\n const { client } = useWorkerContext()\n\n const status = useStore((s) => s.connection.status)\n const error = useStore((s) => s.connection.error)\n const reconnectFailed = useStore((s) => s.connection.reconnectFailed)\n\n const reconnect = useCallback(() => client.retry(), [client])\n\n return { status, error, reconnectFailed, reconnect }\n}\n","import { useCallback } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\nimport type { FeedbackTarget } from '../types'\n\nexport function useFeedback(targetId: string, targetType: FeedbackTarget = 'event') {\n const { client } = useWorkerContext()\n\n const feedback = useStore((s) => s.feedback[targetId] ?? null)\n\n const like = useCallback(\n (reason?: string, classification?: string) =>\n client.sendFeedback(targetType, targetId, 'like', reason, classification),\n [client, targetType, targetId]\n )\n\n const dislike = useCallback(\n (reason?: string, classification?: string) =>\n client.sendFeedback(targetType, targetId, 'dislike', reason, classification),\n [client, targetType, targetId]\n )\n\n return { feedback, like, dislike }\n}\n","import { useCallback } from 'react'\nimport { useWorkerContext } from '../provider'\nimport type { ContentPart } from '../types'\n\nexport function useMessage() {\n const { client } = useWorkerContext()\n\n const send = useCallback(\n (params: { text?: string; threadId?: string; content?: ContentPart[] }) => {\n return client.sendMessage(params)\n },\n [client]\n )\n\n return { send }\n}\n","import { useCallback } from 'react'\nimport { useShallowStore, useStore, useWorkerContext } from '../provider'\n\nexport function useSettings() {\n const { client } = useWorkerContext()\n\n const fields = useShallowStore((s) => s.settings.fields)\n const updatedAt = useStore((s) => s.settings.updatedAt)\n const isLoading = useStore((s) => s.settings.isLoading)\n\n const subscribe = useCallback(() => client.subscribeSettings(), [client])\n const unsubscribe = useCallback(() => client.unsubscribeSettings(), [client])\n\n const patchField = useCallback(\n (fieldId: string, value: unknown) => client.patchSetting(fieldId, value),\n [client]\n )\n\n return { fields, updatedAt, isLoading, subscribe, unsubscribe, patchField }\n}\n","import { useCallback, useEffect, useMemo } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\nimport type { Run, Thread, ThreadEvent, ThreadState } from '../types'\n\nconst EMPTY_ARRAY: ThreadEvent[] = []\nconst EMPTY_RUNS: Run[] = []\n\nexport function useThreadDetails(threadId: string | null): ThreadState {\n const { client } = useWorkerContext()\n\n // Auto-subscribe/unsubscribe\n useEffect(() => {\n if (!threadId) return\n client.subscribe(threadId)\n return () => client.unsubscribe(threadId)\n }, [threadId, client])\n\n // All selectors return direct store references or constants — Object.is is sufficient\n const thread = useStore((s): Thread | null => (threadId ? (s.threads[threadId] ?? null) : null))\n const isLoading = useStore((s) => (threadId ? s.loadingThreads.has(threadId) : false))\n const isWaiting = useStore((s) => {\n if (!threadId) return false\n const r = s.runs[threadId]\n return r ? r.some((run) => run.status === 'running') : false\n })\n\n const optimistic = useStore((s) =>\n threadId ? (s.optimistic[threadId] ?? EMPTY_ARRAY) : EMPTY_ARRAY\n )\n const confirmed = useStore((s) => (threadId ? (s.events[threadId] ?? EMPTY_ARRAY) : EMPTY_ARRAY))\n const runs = useStore((s) => (threadId ? (s.runs[threadId] ?? EMPTY_RUNS) : EMPTY_RUNS))\n\n // Merge with useMemo — stable ref when inputs are the same arrays\n const events = useMemo(\n () => (optimistic.length ? [...confirmed, ...optimistic] : confirmed),\n [optimistic, confirmed]\n )\n\n return { thread, events, runs, isLoading, isWaiting }\n}\n\nexport function useThreadEvents(threadId: string | null) {\n const { client } = useWorkerContext()\n\n const hasOlderEvents = useStore((s) =>\n threadId ? (s.eventPagination[threadId]?.hasMore ?? true) : false\n )\n\n const loadOlderEvents = useCallback(\n (limit?: number) => {\n if (threadId) client.loadOlderEvents(threadId, limit)\n },\n [threadId, client]\n )\n\n return { hasOlderEvents, loadOlderEvents }\n}\n","import { useCallback, useMemo } from 'react'\nimport { useStore, useWorkerContext } from '../provider'\n\n/** Lightweight read-only hook — thread list, count, and loading state. */\nexport function useThreadsList() {\n const threadOrder = useStore((s) => s.threadOrder)\n const threadMap = useStore((s) => s.threads)\n\n const threads = useMemo(\n () =>\n threadOrder.flatMap((id) => {\n const t = threadMap[id]\n return t ? [t] : []\n }),\n [threadOrder, threadMap]\n )\n\n const isLoading = useStore((s) => s.connection.status !== 'connected')\n const hasMore = useStore((s) => s.threadListHasMore)\n const totalCount = useStore((s) => s.threadListTotalCount)\n\n return { threads, isLoading, hasMore, totalCount }\n}\n\n/** Actions-only hook (delete, load more). */\nexport function useThreadsActions() {\n const { client } = useWorkerContext()\n\n const deleteThread = useCallback((threadId: string) => client.deleteThread(threadId), [client])\n const loadMore = useCallback((limit?: number) => client.loadMoreThreads(limit), [client])\n\n return { deleteThread, loadMore }\n}\n","import { useCallback, useRef, useState } from 'react'\nimport type { UploadResult } from '../client'\nimport { useWorkerContext } from '../provider'\n\nexport function useUpload() {\n const { client } = useWorkerContext()\n const [isUploading, setIsUploading] = useState(false)\n const activeCountRef = useRef(0)\n\n const upload = useCallback(\n async (file: File | Blob): Promise<UploadResult> => {\n activeCountRef.current++\n setIsUploading(true)\n try {\n return await client.upload(file)\n } finally {\n activeCountRef.current--\n if (activeCountRef.current === 0) {\n setIsUploading(false)\n }\n }\n },\n [client]\n )\n\n return { upload, isUploading }\n}\n"]}
|