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.d.ts CHANGED
@@ -187,6 +187,7 @@ declare function useAudioRecorder(): {
187
187
  cancel: () => void;
188
188
  isRecording: boolean;
189
189
  duration: number;
190
+ analyserNode: AnalyserNode | null;
190
191
  };
191
192
 
192
193
  declare function useConnection(): {
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 unique = newEvents.filter((e) => !existingIds.has(e.id));
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]: [...existing, ...unique] }
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":";;;;;;;;;AA4KO,SAAS,qBAAqB,IAAA,EAAgD;AACnF,EAAA,OAAO,QAAA,IAAY,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAS,KAA4B,MAAM,CAAA;AAC9E;AA6CO,SAAS,OAAO,CAAA,EAAgC;AACrD,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,OAAO;AAAA,IACL,QAAQ,CAAA,CAAE,OAAA;AAAA,IACV,UAAU,CAAA,CAAE,SAAA;AAAA,IACZ,WAAW,CAAA,CAAE,UAAA;AAAA,IACb,YAAY,CAAA,CAAE,WAAA;AAAA,IACd,kBAAkB,CAAA,CAAE,iBAAA;AAAA,IACpB,eAAe,CAAA,CAAE;AAAA,GACnB;AACF;AAEO,SAAS,SAAS,CAAA,EAAuB;AAC9C,EAAA,OAAO;AAAA,IACL,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,UAAU,CAAA,CAAE,SAAA;AAAA,IACZ,gBAAgB,CAAA,CAAE,eAAA;AAAA,IAClB,aAAa,CAAA,CAAE,YAAA;AAAA,IACf,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AAAA,IACrB,KAAA,EAAO,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACnC,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,WAAW,CAAA,CAAE,UAAA;AAAA,IACb,WAAW,CAAA,CAAE,UAAA;AAAA,IACb,aAAa,CAAA,CAAE;AAAA,GACjB;AACF;AAEO,SAAS,qBAAqB,CAAA,EAA4C;AAC/E,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,IACtC,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,UAAU,CAAA,CAAE,SAAA;AAAA,QACZ,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,UAAU,CAAA,CAAE;AAAA,OACd;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,UAAU,CAAA,CAAE,SAAA;AAAA,QACZ,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,UAAU,CAAA,CAAE;AAAA,OACd;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,KAAK,CAAA,CAAE,GAAA;AAAA,QACP,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,UAAU,CAAA,CAAE,SAAA;AAAA,QACZ,WAAW,CAAA,CAAE;AAAA,OACf;AAAA;AAEN;AAKO,SAAS,cAAc,CAAA,EAAiC;AAC7D,EAAA,OAAO;AAAA,IACL,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,UAAU,CAAA,CAAE,SAAA;AAAA,IACZ,OAAO,CAAA,CAAE,MAAA;AAAA,IACT,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,IAAA,EAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA;AAAA,IACnB,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,GAAA,CAAI,oBAAoB,CAAA;AAAA,IAC5C,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,WAAW,CAAA,CAAE,UAAA;AAAA,IACb,eAAe,CAAA,CAAE;AAAA,GACnB;AACF;AAEO,SAAS,MAAM,CAAA,EAAiB;AACrC,EAAA,OAAO;AAAA,IACL,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,UAAU,CAAA,CAAE,SAAA;AAAA,IACZ,SAAS,CAAA,CAAE,QAAA;AAAA,IACX,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,WAAW,CAAA,CAAE,UAAA;AAAA,IACb,SAAS,CAAA,CAAE,QAAA;AAAA,IACX,OAAO,CAAA,CAAE;AAAA,GACX;AACF;AAIO,SAAS,gBAAgB,CAAA,EAAqC;AACnE,EAAA,OAAO;AAAA,IACL,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,KAAK,CAAA,CAAE,GAAA;AAAA,IACP,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE;AAAA,GACZ;AACF;AAEO,SAAS,eAAe,CAAA,EAAmC;AAChE,EAAA,IAAI,YAAY,CAAA,IAAK,KAAA,CAAM,OAAA,CAAS,CAAA,CAA6B,MAAM,CAAA,EAAG;AACxE,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AAAA,MACpC,aAAa,CAAA,CAAE;AAAA,KACjB;AAAA,EACF;AACA,EAAA,OAAO,gBAAgB,CAAsB,CAAA;AAC/C;AAIO,SAAS,iBAAiB,CAAA,EAAuC;AACtE,EAAA,OAAO;AAAA,IACL,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,UAAU,CAAA,CAAE,SAAA;AAAA,IACZ,UAAU,CAAA,CAAE,SAAA;AAAA,IACZ,QAAQ,CAAA,CAAE,OAAA;AAAA,IACV,OAAO,CAAA,CAAE,MAAA;AAAA,IACT,SAAS,CAAA,CAAE,QAAA;AAAA,IACX,MAAM,CAAA,CAAE;AAAA,GACV;AACF;AAIO,SAAS,kBAAkB,CAAA,EAAyC;AACzE,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,IACtC,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,IAChE,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAM;AAAA,IAC1C,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,EAAE,KAAA,EAAM;AAAA;AAEjD;;;ACvWA,IAAM,sBAAA,GAAyB,CAAA;AAC/B,IAAM,mBAAmB,CAAC,GAAA,EAAM,GAAA,EAAM,GAAA,EAAM,KAAM,IAAK,CAAA;AACvD,IAAM,oBAAA,GAAuB,GAAA;AAuBtB,IAAM,eAAN,MAAmB;AAAA,EAChB,EAAA,GAAuB,IAAA;AAAA,EACvB,SAAA;AAAA,EACA,OAAA,GAAkC,IAAA;AAAA,EAElC,GAAA,GAAM,EAAA;AAAA,EACN,WAAA,GAAc,EAAA;AAAA,EACd,QAAA,GAAW,EAAA;AAAA,EACX,SAAA;AAAA,EACA,MAAA,GAAiC;AAAA,IACvC,cAAA,EAAgB,EAAA;AAAA,IAChB,WAAA,EAAa,EAAA;AAAA,IACb,MAAA,EAAQ;AAAA,GACV;AAAA,EAEQ,cAAA,GAAiB,EAAA;AAAA,EACjB,qBAAA,GAAwB,KAAA;AAAA,EACxB,iBAAA,GAAoB,CAAA;AAAA,EACpB,cAAA,GAAuD,IAAA;AAAA;AAAA,EAGvD,gBAAA,uBAAuB,GAAA,EAAoB;AAAA;AAAA,EAG3C,iBAAA,uBAAwB,GAAA,EAAyD;AAAA;AAAA,EAGjF,eAAA,uBAAsB,GAAA,EAG5B;AAAA;AAAA,EAGM,YAAA,uBAAmB,GAAA,EAAoB;AAAA;AAAA,EAGvC,oBAAA,GAAsC,IAAA;AAAA,EACtC,aAAA,GAAgB,KAAA;AAAA;AAAA,EAGhB,sBAAA,uBAA6B,GAAA,EAA2B;AAAA,EAEhE,YAAY,SAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,WAAW,EAAA,EAA4B;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,EACjB;AAAA,EAEA,aAAa,GAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AAAA,EACnB;AAAA,EAEA,MAAM,OAAO,IAAA,EAA0C;AACrD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,IAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAE5B,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,MAAA,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,UAAU,MAAA,CAAO,SAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,GAAA,EAAa,QAAA,EAAkB,MAAA,EAAiC;AACtE,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,EAAE,cAAA,EAAgB,IAAI,WAAA,EAAa,EAAA,EAAI,QAAQ,EAAA,EAAG;AAC1E,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAG7B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,MAAA,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,QAAA,KAAa,MAAA,GAAS,QAAA,GAAW,OAAA;AAC1D,MAAA,MAAA,CAAO,QAAA,GAAW,EAAA;AAClB,MAAA,MAAA,CAAO,MAAA,GAAS,EAAA;AAChB,MAAA,MAAA,CAAO,IAAA,GAAO,EAAA;AACd,MAAA,IAAA,CAAK,cAAc,MAAA,CAAO,QAAA,EAAS,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,oBAAoB,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAEA,IAAA,KAAA,MAAW,GAAG,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC9C,MAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,MAAA,GAAS,IAAA;AACjB,MAAA,IAAA,CAAK,GAAG,SAAA,GAAY,IAAA;AACpB,MAAA,IAAA,CAAK,GAAG,OAAA,GAAU,IAAA;AAClB,MAAA,IAAA,CAAK,GAAG,OAAA,GAAU,IAAA;AAClB,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,oBAAoB,cAAc,CAAA;AAAA,EACnD;AAAA,EAEA,KAAA,GAAQ;AACN,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,oBAAoB,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA;AAAA,EAIA,iBAAA,CAAkB,QAAwB,KAAA,EAAgB;AACxD,IAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,UAAU,QAAA,EAAkB;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AACpD,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,IAAA,GAAO,CAAC,CAAA;AAC5C,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA;AACxD,MAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,WAAW,QAAA,EAAU,cAAA,EAAgB,cAAc,CAAA;AACnF,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,QAAQ,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,YAAY,QAAA,EAAkB;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AACpD,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,QAAQ,CAAA;AACjC,MAAA,IAAA,CAAK,sBAAA,CAAuB,OAAO,QAAQ,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,oBAAA,EAAsB,EAAE,SAAA,EAAW,UAAU,CAAA;AACvD,MAAA,IAAA,CAAK,SAAA,CAAU,mBAAmB,QAAQ,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,IAAA,GAAO,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,aAAa,QAAA,EAAkB;AAC7B,IAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,EAAE,SAAA,EAAW,UAAU,CAAA;AAAA,EACpD;AAAA,EAEA,gBAAgB,KAAA,EAAgB;AAC9B,IAAA,MAAM,SAAS,IAAA,CAAK,oBAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,eAAA,CAAgB,UAAkB,KAAA,EAAgB;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,QAAQ,CAAA;AACvD,IAAA,IAAA,CAAK,KAAK,YAAA,EAAc;AAAA,MACtB,SAAA,EAAW,QAAA;AAAA,MACX,iBAAiB,MAAA,IAAU,IAAA;AAAA,MAC3B;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,iBAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,KAAK,oBAAA,EAAsB,EAAE,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EAC9D;AAAA,EAEA,mBAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,KAAK,sBAAA,EAAwB,EAAE,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EAChE;AAAA,EAEA,YAAA,CAAa,SAAiB,KAAA,EAAgB;AAC5C,IAAA,IAAA,CAAK,KAAK,gBAAA,EAAkB,EAAE,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA,EAIA,YAAA,CACE,UAAA,EACA,QAAA,EACA,QAAA,EACA,QACA,cAAA,EACA;AACA,IAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,MACpB,WAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAW,QAAA;AAAA,MACX,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,kBAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,KAAK,qBAAA,EAAuB,EAAE,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/D;AAAA,EAEA,oBAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,KAAK,uBAAA,EAAyB,EAAE,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EACjE;AAAA;AAAA,EAIA,YAAY,MAAA,EAIsB;AAChC,IAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AACxC,IAAA,MAAM,UAAiC,MAAA,CAAO,OAAA,GAC1C,MAAA,CAAO,OAAA,CAAQ,IAAI,iBAAiB,CAAA,GACpC,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,IAAI,CAAA;AAG9C,IAAA,MAAM,iBAAuC,MAAA,CAAO,OAAA,GAChD,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAA0B;AAC5C,MAAA,QAAQ,EAAE,IAAA;AAAM,QACd,KAAK,MAAA;AACH,UAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,QACtC,KAAK,OAAA;AACH,UAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,QAC/C,KAAK,OAAA;AACH,UAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AAAA,QACzB,KAAK,UAAA;AACH,UAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAAA,QAC5B;AACE,UAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAG;AAAA;AACpC,IACF,CAAC,CAAA,GACD,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,EAAA,EAAI,CAAA;AAG9C,IAAA,MAAM,eAAA,GAA+B;AAAA,MACnC,EAAA,EAAI,cAAc,aAAa,CAAA,CAAA;AAAA,MAC/B,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,MAC7B,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,EAAA;AAAA,QAC9B,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,QACtB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,QACvB,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,MAAA;AAAA,QACtC,gBAAA,EAAkB,IAAA,CAAK,MAAA,CAAO,gBAAA,IAAoB,QAAA;AAAA,QAClD,aAAA,EAAe,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB;AAAA,OAC9C;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAEA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,MAAA,CAAO,QAAA,EAAU,iBAAiB,aAAa,CAAA;AAAA,IAC9E;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,aAAA,EAAe;AAAA,MACxC,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,MAC7B;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAA8B,CAAC,SAAS,MAAA,KAAW;AACrE,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,aAAa,CAAA;AACzC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mDAAmD,CAAC,CAAA;AAAA,MACvE,GAAG,oBAAoB,CAAA;AAEvB,MAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,aAAA,EAAe,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,KAAK,cAAA,EAAgB;AAAA,MACxB,WAAW,MAAA,CAAO,QAAA;AAAA,MAClB,eAAA,EAAiB,aAAA;AAAA,MACjB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP;AAAA;AACF,KACD,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAIQ,gBAAA,GAAmB;AACzB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,MAAA,GAAS,IAAA;AACjB,MAAA,IAAA,CAAK,GAAG,SAAA,GAAY,IAAA;AACpB,MAAA,IAAA,CAAK,GAAG,OAAA,GAAU,IAAA;AAClB,MAAA,IAAA,CAAK,GAAG,OAAA,GAAU,IAAA;AAClB,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AAEhC,IAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AACrB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,GAAY,CAAC,CAAA,KAAoB;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAc,CAAA;AACzC,QAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,MAClB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,MAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,MACzB;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AAAA,IAExB,CAAA;AAAA,EACF;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,UAAA,EAAW;AACxC,IAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,MACX,IAAI,IAAA,CAAK,cAAA;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,WAAW,IAAA,CAAK,QAAA;AAAA,QAChB,eAAA,EAAiB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,EAAA;AAAA,QAC/C,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,EAAA;AAAA,QACzC,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,EAAA;AAAA,UAC/B,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,IAAA;AAAA,UACnC,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA;AAAA,UACrC,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,MAAA;AAAA,UACvC,iBAAA,EAAmB,IAAA,CAAK,MAAA,CAAO,gBAAA,IAAoB,QAAA;AAAA,UACnD,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB;AAAA,SAC/C;AAAA,QACA,UAAA,EAAY,KAAK,MAAA,CAAO,SAAA;AAAA,QACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,sBAAA,EAAwB,SAAS,OAAA;AAAQ;AAC3D,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,MAAM,KAAA,EAAuB;AACnC,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,KAAA,EAAO;AACV,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,IAAA,CAAK,cAAA,EAAgB;AAChD,UAAA,IAAI,KAAA,CAAM,QAAQ,EAAA,EAAI;AACpB,YAAA,IAAA,CAAK,SAAA,CAAU,oBAAoB,WAAW,CAAA;AAC9C,YAAA,IAAA,CAAK,UAAU,cAAA,EAAe;AAC9B,YAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,YAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK,EAAG;AACnD,cAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA;AACxD,cAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB;AAAA,gBAC5B,SAAA,EAAW,QAAA;AAAA,gBACX,cAAA,EAAgB;AAAA,eACjB,CAAA;AAAA,YACH;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,UAAU,mBAAA,CAAoB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,UAC1E;AAAA,QACF,WAAW,CAAC,KAAA,CAAM,QAAQ,EAAA,IAAM,KAAA,CAAM,QAAQ,KAAA,EAAO;AACnD,UAAA,IAAA,CAAK,OAAA,GAAU;AAAA,YACb,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,YAC1B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAA;AAAA,YAC7B,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,oBAAA,EAAsB;AACzB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAClD,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,IAAU,IAAA;AACvC,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,WAAA;AACjC,QAAA,IAAA,CAAK,oBAAA,GAAuB,MAAA;AAC5B,QAAA,IAAI,KAAK,aAAA,EAAe;AACtB,UAAA,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,QAC/D,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,QACzD;AACA,QAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,iBAAA,EAAmB;AACtB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAC5C,QAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,CAAiB,KAAA,CAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,aAAa,CAAC,CAAA;AAC5E,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,EAAC,EAAG,IAAI,KAAK,CAAA;AAEjD,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAC1C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,UAAU,EAAE,CAAA;AAAA,QAC/C;AAEA,QAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAC5B,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,YAAY,EAAE,CAAA;AAAA,QAC3D;AACA,QAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AACpD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,CAAiB,KAAA,CAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,aAAa,CAAC,CAAA;AAE5E,QAAA,MAAM,yBAAmC,EAAC;AAC1C,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,IAAI,MAAM,aAAA,IAAiB,IAAA,CAAK,kBAAkB,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AAC1E,YAAA,sBAAA,CAAuB,IAAA,CAAK,MAAM,aAAa,CAAA;AAC/C,YAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA;AAAA,UACnD;AACA,UAAA,IAAI,MAAM,aAAA,IAAiB,IAAA,CAAK,gBAAgB,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACxE,YAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,aAAa,CAAA;AACnE,YAAA,IAAI,cAAA,EAAgB;AAClB,cAAA,YAAA,CAAa,eAAe,KAAK,CAAA;AACjC,cAAA,cAAA,CAAe,QAAQ,EAAE,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAC5D,cAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAKA,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAC1C,QAAA,IAAI,aAAa,IAAA,CAAK,gBAAA,CAAiB,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACnE,UAAA,IAAA,CAAK,aAAa,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,UAAU,EAAE,CAAA;AAAA,QAC7D;AAEA,QAAA,IAAI,sBAAA,CAAuB,SAAS,CAAA,EAAG;AACrC,UAAA,IAAA,CAAK,UAAU,eAAA,CAAgB,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,QAAQ,sBAAsB,CAAA;AAAA,QACxF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,OAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,QAC9D;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,mBAAA,EAAqB;AACxB,QAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,CAAiB,KAAA,CAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,aAAa,CAAC,CAAA;AAC5E,QAAA,IAAA,CAAK,uBAAuB,GAAA,CAAI,KAAA,CAAM,QAAQ,SAAA,EAAW,KAAA,CAAM,QAAQ,MAAM,CAAA;AAC7E,QAAA,IAAA,CAAK,SAAA,CAAU,iBAAA;AAAA,UACb,MAAM,OAAA,CAAQ,SAAA;AAAA,UACd,MAAA;AAAA,UACA,MAAM,OAAA,CAAQ,MAAA;AAAA,UACd,MAAM,OAAA,CAAQ;AAAA,SAChB;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,eAAA;AACH,QAAA,IAAA,CAAK,UAAU,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC5D,QAAA;AAAA,MAEF,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AACtD,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAChD,QAAA;AAAA,MAEF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,UAAU,WAAA,CAAY,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAC,CAAA;AACnD,QAAA;AAAA,MAEF,KAAK,mBAAA,EAAqB;AACxB,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,cAAc,CAAA;AACtD,QAAA,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,MAAA,EAAQ,KAAA,CAAM,QAAQ,UAAU,CAAA;AAClE,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,SAAA,CAAU,eAAA;AAAA,UACb,MAAM,OAAA,CAAQ,QAAA;AAAA,UACd,MAAM,OAAA,CAAQ,KAAA;AAAA,UACd,MAAM,OAAA,CAAQ;AAAA,SAChB;AACA,QAAA;AAAA,MAEF,KAAK,cAAA;AACH,QAAA,IAAI,KAAA,CAAM,QAAQ,EAAA,EAAI;AACpB,UAAA,IAAA,CAAK,SAAA,CAAU,aAAA;AAAA,YACb,MAAM,OAAA,CAAQ,SAAA;AAAA,YACd,MAAM,OAAA,CAAQ;AAAA,WAChB;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAC,CAAA;AAC/D,QAAA;AAAA;AACJ,EACF;AAAA,EAEQ,iBAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,qBAAqB,sBAAA,EAAwB;AACpD,MAAA,IAAA,CAAK,UAAU,kBAAA,EAAmB;AAClC,MAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,OAAA,EAAS,uCAAuC,CAAA;AACnF,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,oBAAoB,cAAc,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,iBAAiB,CAAA,IAAK,IAAA;AAC1D,IAAA,IAAA,CAAK,iBAAA,EAAA;AACL,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,SAAA,CAAU,oBAAoB,YAAY,CAAA;AAC/C,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEQ,IAAA,CAAK,MAAc,OAAA,EAAkB;AAC3C,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,EAAA,EAAI,MAAA,CAAO,YAAW,EAAG,IAAA,EAAM,SAAS,CAAA;AAAA,EACzD;AAAA,EAEQ,QAAQ,KAAA,EAAgB;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACvD,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACpC;AAAA;AAAA,EAGQ,iBAAiB,MAAA,EAAsC;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,MAAA;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAClB,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,IAAS,CAAA,IAAK,CAAA,CAAE,GAAA,EAAK,UAAA,CAAW,GAAG,CAAC,GAAG,OAAO,KAAA;AAC9E,MAAA,OAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,OAAA,EAAS,MAAM,OAAA,CAAQ,GAAA;AAAA,UAAI,CAAC,IAAA,KAC1B,KAAA,IAAS,QAAQ,IAAA,CAAK,GAAA,EAAK,WAAW,GAAG,CAAA,GAAI,EAAE,GAAG,IAAA,EAAM,KAAK,CAAA,EAAG,IAAI,GAAG,IAAA,CAAK,GAAG,IAAG,GAAI;AAAA;AACxF,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF,CAAA;ACzgBO,SAAS,iBAAA,GAAoB;AAClC,EAAA,OAAO,WAAA,EAAyB,CAAE,CAAC,GAAA,MAAS;AAAA,IAC1C,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,iBAAA,EAAmB,CAAA;AAAA,MACnB,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,SAAS,EAAC;AAAA,IACV,aAAa,EAAC;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,iBAAA,EAAmB,KAAA;AAAA,IACnB,oBAAA,EAAsB,CAAA;AAAA,IACtB,QAAQ,EAAC;AAAA,IACT,iBAAiB,EAAC;AAAA,IAClB,YAAY,EAAC;AAAA,IACb,gBAAgB,EAAC;AAAA,IACjB,MAAM,EAAC;AAAA,IACP,QAAA,EAAU;AAAA,MACR,QAAQ,EAAC;AAAA,MACT,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,IACA,UAAU,EAAC;AAAA,IACX,SAAA,EAAW;AAAA,MACT,QAAQ,EAAC;AAAA,MACT,UAAU,EAAE,aAAA,EAAe,GAAG,aAAA,EAAe,CAAA,EAAG,kBAAkB,CAAA;AAAE,KACtE;AAAA,IACA,aAAA,sBAAmB,GAAA,EAAI;AAAA,IACvB,cAAA,sBAAoB,GAAA,EAAI;AAAA,IAExB,OAAA,EAAS;AAAA,MACP,qBAAqB,CAAC,MAAA,EAAQ,KAAA,KAC5B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACV,UAAA,EAAY,EAAE,GAAG,CAAA,CAAE,YAAY,MAAA,EAAQ,KAAA,EAAO,SAAS,IAAA;AAAK,OAC9D,CAAE,CAAA;AAAA,MAEJ,kBAAA,EAAoB,MAClB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACV,YAAY,EAAE,GAAG,CAAA,CAAE,UAAA,EAAY,iBAAiB,IAAA;AAAK,OACvD,CAAE,CAAA;AAAA,MAEJ,cAAA,EAAgB,MACd,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACV,UAAA,EAAY,EAAE,GAAG,CAAA,CAAE,YAAY,iBAAA,EAAmB,CAAA,EAAG,iBAAiB,KAAA;AAAM,OAC9E,CAAE,CAAA;AAAA,MAEJ,cAAc,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAA,KAC9B,IAAI,MAAM;AACR,QAAA,MAAM,MAA8B,EAAC;AACrC,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,GAAI,CAAA;AACZ,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAE,CAAA;AAAA,QACjB;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,GAAA;AAAA,UACT,WAAA,EAAa,KAAA;AAAA,UACb,kBAAkB,MAAA,IAAU,IAAA;AAAA,UAC5B,mBAAmB,MAAA,IAAU,IAAA;AAAA,UAC7B,sBAAsB,UAAA,IAAc;AAAA,SACtC;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,oBAAoB,CAAC,OAAA,EAAS,MAAA,KAC5B,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,GAAA,GAAM,EAAE,GAAG,CAAA,CAAE,OAAA,EAAQ;AAC3B,QAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,CAAA,CAAE,WAAW,CAAA;AAC/B,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,IAAI,CAAC,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACd,YAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAE,CAAA;AAAA,UACjB;AACA,UAAA,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,GAAI,CAAA;AAAA,QACd;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,GAAA;AAAA,UACT,WAAA,EAAa,KAAA;AAAA,UACb,kBAAkB,MAAA,IAAU,IAAA;AAAA,UAC5B,mBAAmB,MAAA,IAAU;AAAA,SAC/B;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,cAAA,EAAgB,CAAC,MAAA,KACf,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,CAAA,CAAE,SAAS,CAAC,MAAA,CAAO,EAAE,GAAG,MAAA,EAAO;AACpD,QAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,CAAY,QAAA,CAAS,OAAO,EAAE,CAAA,GAChD,CAAA,CAAE,WAAA,GACF,CAAC,MAAA,CAAO,EAAA,EAAI,GAAG,EAAE,WAAW,CAAA;AAChC,QAAA,OAAO,EAAE,SAAS,WAAA,EAAY;AAAA,MAChC,CAAC,CAAA;AAAA,MAEH,eAAA,EAAiB,CAAC,QAAA,KAChB,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,EAAE,CAAC,QAAQ,GAAG,GAAG,GAAG,OAAA,KAAY,CAAA,CAAE,OAAA;AACxC,QAAA,MAAM,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,MAAA,KAAW,CAAA,CAAE,MAAA;AACxC,QAAA,MAAM,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAA,KAAS,CAAA,CAAE,IAAA;AACtC,QAAA,MAAM,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,UAAA,KAAe,CAAA,CAAE,UAAA;AAC5C,QAAA,MAAM,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,cAAA,KAAmB,CAAA,CAAE,cAAA;AAChD,QAAA,MAAM,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,eAAA,KAAoB,CAAA,CAAE,eAAA;AACjD,QAAA,MAAM,cAAc,CAAA,CAAE,WAAA,CAAY,OAAO,CAAC,EAAA,KAAO,OAAO,QAAQ,CAAA;AAChE,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAC7C,QAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAC7B,QAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,CAAA,CAAE,cAAc,CAAA;AAC/C,QAAA,cAAA,CAAe,OAAO,QAAQ,CAAA;AAC9B,QAAA,OAAO;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA,cAAA;AAAA,UACA,eAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,kBAAkB,CAAC,MAAA,EAAQ,gBAAgB,IAAA,KACzC,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,CAAA,CAAE,SAAS,CAAC,MAAA,CAAO,EAAE,GAAG,MAAA,EAAO;AACpD,QAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,CAAY,QAAA,CAAS,OAAO,EAAE,CAAA,GAChD,CAAA,CAAE,WAAA,GACF,CAAC,MAAA,CAAO,EAAA,EAAI,GAAG,EAAE,WAAW,CAAA;AAChC,QAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,CAAA,CAAE,cAAc,CAAA;AAC/C,QAAA,cAAA,CAAe,MAAA,CAAO,OAAO,EAAE,CAAA;AAM/B,QAAA,MAAM,WAAW,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,EAAE,KAAK,EAAC;AACzC,QAAA,IAAI,YAAA;AACJ,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,UAAA,YAAA,GAAe,cAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACrD,UAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC3E,UAAA,YAAA,GAAe,eAAA,CAAgB,SAAS,CAAA,GAAI,CAAC,GAAG,QAAA,EAAU,GAAG,eAAe,CAAA,GAAI,QAAA;AAAA,QAClF;AAGA,QAAA,MAAM,UAAA,GAAa,EAAE,GAAG,CAAA,CAAE,UAAA,EAAW;AACrC,QAAA,MAAM,cAAA,GAAiB,EAAE,GAAG,CAAA,CAAE,cAAA,EAAe;AAC7C,QAAA,OAAO,UAAA,CAAW,OAAO,EAAE,CAAA;AAC3B,QAAA,OAAO,cAAA,CAAe,OAAO,EAAE,CAAA;AAE/B,QAAA,OAAO;AAAA,UACL,OAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA,EAAQ,EAAE,GAAG,CAAA,CAAE,QAAQ,CAAC,MAAA,CAAO,EAAE,GAAG,YAAA,EAAa;AAAA,UACjD,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,MAAM,CAAC,MAAA,CAAO,EAAE,GAAG,IAAA,EAAK;AAAA,UACrC,UAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,eAAe,CAAC,QAAA,EAAU,SAAA,KACxB,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,QAAQ,KAAK,EAAC;AACxC,QAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAErD,QAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAC7C,QAAA,MAAM,UAAyB,EAAC;AAChC,QAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,UAAA,IAAI,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACzB,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,UACrB,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAChB;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,GAAO,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,CAAC,CAAA,GAAI,QAAA;AAChF,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,EAAE,GAAG,CAAA,CAAE,MAAA,EAAQ,CAAC,QAAQ,GAAG,CAAC,GAAG,MAAA,EAAQ,GAAG,OAAO,CAAA;AAAE,SAC7D;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,iBAAiB,CAAC,QAAA,EAAU,WAAW,sBAAA,KACrC,GAAA,CAAI,CAAC,CAAA,KAAM;AAET,QAAA,MAAM,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,QAAQ,KAAK,EAAC;AACxC,QAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACrD,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAG7D,QAAA,IAAI,SAAA,GAAY,CAAA,CAAE,UAAA,CAAW,QAAQ,KAAK,EAAC;AAC3C,QAAA,IAAI,OAAA,GAAU,CAAA,CAAE,cAAA,CAAe,QAAQ,KAAK,EAAC;AAC7C,QAAA,KAAA,MAAW,iBAAiB,sBAAA,EAAwB;AAClD,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA;AACzC,UAAA,IAAI,OAAO,CAAA,EAAG;AACZ,YAAA,SAAA,GAAY,CAAC,GAAG,SAAS,CAAA;AACzB,YAAA,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AACvB,YAAA,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA;AACrB,YAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACvB;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,EAAE,GAAG,CAAA,CAAE,MAAA,EAAQ,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAA,EAAU,GAAG,MAAM,CAAA,EAAE;AAAA,UAC5D,UAAA,EAAY,EAAE,GAAG,CAAA,CAAE,YAAY,CAAC,QAAQ,GAAG,SAAA,EAAU;AAAA,UACrD,cAAA,EAAgB,EAAE,GAAG,CAAA,CAAE,gBAAgB,CAAC,QAAQ,GAAG,OAAA;AAAQ,SAC7D;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,iBAAA,EAAmB,CAAC,QAAA,EAAU,WAAA,EAAa,QAAQ,OAAA,KACjD,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,QAAQ,KAAK,EAAC;AACxC,QAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACrD,QAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/D,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,EAAE,GAAG,CAAA,CAAE,MAAA,EAAQ,CAAC,QAAQ,GAAG,CAAC,GAAG,MAAA,EAAQ,GAAG,QAAQ,CAAA,EAAE;AAAA,UAC5D,eAAA,EAAiB;AAAA,YACf,GAAG,CAAA,CAAE,eAAA;AAAA,YACL,CAAC,QAAQ,GAAG,EAAE,QAAQ,OAAA;AAAQ;AAChC,SACF;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,WAAA,EAAa,CAAC,GAAA,KACZ,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,WAAW,CAAA,CAAE,IAAA,CAAK,GAAA,CAAI,QAAQ,KAAK,EAAC;AAC1C,QAAA,MAAM,GAAA,GAAM,SAAS,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,IAAI,EAAE,CAAA;AACrD,QAAA,MAAM,UACJ,GAAA,IAAO,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,GAAA,CAAI,KAAK,GAAA,GAAM,CAAE,IAAI,CAAC,GAAG,UAAU,GAAG,CAAA;AACjF,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,IAAA,EAAM,CAAC,GAAA,CAAI,QAAQ,GAAG,OAAA,EAAQ,EAAE;AAAA,MACxD,CAAC,CAAA;AAAA,MAEH,eAAe,CAAC,QAAA,EAAU,OAAO,aAAA,KAC/B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACV,UAAA,EAAY;AAAA,UACV,GAAG,CAAA,CAAE,UAAA;AAAA,UACL,CAAC,QAAQ,GAAG,CAAC,GAAI,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA,IAAK,EAAC,EAAI,KAAK;AAAA,SACvD;AAAA,QACA,cAAA,EAAgB;AAAA,UACd,GAAG,CAAA,CAAE,cAAA;AAAA,UACL,CAAC,QAAQ,GAAG,CAAC,GAAI,CAAA,CAAE,cAAA,CAAe,QAAQ,CAAA,IAAK,EAAC,EAAI,aAAa;AAAA;AACnE,OACF,CAAE,CAAA;AAAA,MAEJ,kBAAkB,CAAC,QAAA,EAAU,aAAA,KAC3B,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,cAAA,CAAe,QAAQ,KAAK,EAAC;AAC5C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AACtC,QAAA,IAAI,GAAA,GAAM,GAAG,OAAO,CAAA;AACpB,QAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,CAAA;AACxB,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AACrB,QAAA,MAAM,SAAA,GAAY,CAAC,GAAI,CAAA,CAAE,WAAW,QAAQ,CAAA,IAAK,EAAG,CAAA;AACpD,QAAA,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AACvB,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,EAAE,GAAG,CAAA,CAAE,YAAY,CAAC,QAAQ,GAAG,SAAA,EAAU;AAAA,UACrD,cAAA,EAAgB,EAAE,GAAG,CAAA,CAAE,gBAAgB,CAAC,QAAQ,GAAG,OAAA;AAAQ,SAC7D;AAAA,MACF,CAAC,CAAA;AAAA,MAEH,eAAA,EAAiB,CAAC,QAAA,KAChB,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAC7C,QAAA,aAAA,CAAc,IAAI,QAAQ,CAAA;AAC1B,QAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,CAAA,CAAE,cAAc,CAAA;AAC/C,QAAA,cAAA,CAAe,IAAI,QAAQ,CAAA;AAC3B,QAAA,OAAO,EAAE,eAAe,cAAA,EAAe;AAAA,MACzC,CAAC,CAAA;AAAA,MAEH,kBAAA,EAAoB,CAAC,QAAA,KACnB,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,CAAA,CAAE,aAAa,CAAA;AAC7C,QAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAC7B,QAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,CAAA,CAAE,cAAc,CAAA;AAC/C,QAAA,cAAA,CAAe,OAAO,QAAQ,CAAA;AAC9B,QAAA,OAAO,EAAE,eAAe,cAAA,EAAe;AAAA,MACzC,CAAC,CAAA;AAAA,MAEH,kBAAA,EAAoB,CAAC,MAAA,EAAQ,SAAA,KAC3B,IAAI,OAAO;AAAA,QACT,QAAA,EAAU,EAAE,MAAA,EAAQ,SAAA,EAAW,WAAW,KAAA;AAAM,OAClD,CAAE,CAAA;AAAA,MAEJ,iBAAiB,CAAC,OAAA,EAAS,OAAO,SAAA,KAChC,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACV,QAAA,EAAU;AAAA,UACR,GAAG,CAAA,CAAE,QAAA;AAAA,UACL,SAAA;AAAA,UACA,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAS;AACtC,YAAA,IAAI,oBAAA,CAAqB,IAAI,CAAA,EAAG;AAC9B,cAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACzD,cAAA,IAAI,QAAA,EAAU;AACZ,gBAAA,OAAO;AAAA,kBACL,GAAG,IAAA;AAAA,kBACH,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,OAAA,GAAU,EAAE,GAAG,CAAA,EAAG,KAAA,KAAU,CAAE;AAAA,iBACzE;AAAA,cACF;AACA,cAAA,OAAO,IAAA;AAAA,YACT;AACA,YAAA,OAAO,KAAK,EAAA,KAAO,OAAA,GAAU,EAAE,GAAG,IAAA,EAAM,OAAM,GAAI,IAAA;AAAA,UACpD,CAAC;AAAA;AACH,OACF,CAAE,CAAA;AAAA,MAEJ,eAAe,CAAC,QAAA,EAAU,QAAA,KACxB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACV,QAAA,EAAU,EAAE,GAAG,CAAA,CAAE,UAAU,CAAC,QAAQ,GAAG,QAAA;AAAS,OAClD,CAAE,CAAA;AAAA,MAEJ,gBAAA,EAAkB,CAAC,KAAA,KACjB,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,QAAA,MAAM,SAAS,CAAC,GAAG,CAAA,CAAE,SAAA,CAAU,QAAQ,KAAK,CAAA;AAC5C,QAAA,MAAM,UAAU,MAAA,CAAO,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA;AACzD,QAAA,MAAM,QAAA,GAAW,EAAE,GAAG,CAAA,CAAE,UAAU,QAAA,EAAS;AAC3C,QAAA,IAAI,KAAA,CAAM,UAAU,eAAA,EAAiB;AACnC,UAAA,QAAA,CAAS,aAAA,IAAiB,CAAA;AAAA,QAC5B,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,KAAU,kBAAA,EAAoB;AAC7C,UAAA,QAAA,CAAS,gBAAA,IAAoB,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,aAAA,IAAiB,CAAA;AAAA,QAC5B;AACA,QAAA,OAAO,EAAE,SAAA,EAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAS,EAAE;AAAA,MACpD,CAAC,CAAA;AAAA,MAEH,cAAA,EAAgB,MACd,GAAA,CAAI,OAAO;AAAA,QACT,SAAA,EAAW;AAAA,UACT,QAAQ,EAAC;AAAA,UACT,UAAU,EAAE,aAAA,EAAe,GAAG,aAAA,EAAe,CAAA,EAAG,kBAAkB,CAAA;AAAE;AACtE,OACF,CAAE;AAAA;AACN,GACF,CAAE,CAAA;AACJ;ACxYA,IAAM,aAAA,GAAgB,cAAyC,IAAI,CAAA;AAmB5D,SAAS,cAAA,CAAe;AAAA,EAC7B,GAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,QAAA,GAAW,OAAgC,MAAS,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAY,OAAiC,MAAS,CAAA;AAE5D,EAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,IAAA,QAAA,CAAS,UAAU,iBAAA,EAAkB;AACrC,IAAA,SAAA,CAAU,UAAU,IAAI,YAAA,CAAa,SAAS,OAAA,CAAQ,QAAA,GAAW,OAAO,CAAA;AAAA,EAC1E;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,IAAI,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,aAAa,SAAS,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,QAAA,EAAU;AACvB,IAAA,SAAA,CAAU,OAAA,EAAS,OAAA,CAAQ,GAAA,EAAK,QAAA,EAAU;AAAA,MACxC,cAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,MAAM,SAAA,CAAU,OAAA,EAAS,UAAA,EAAW;AAAA,EAC7C,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO,EAAE,KAAA,EAAO,SAAS,OAAA,EAAU,MAAA,EAAQ,UAAU,OAAA,EAAS,CAAA;AAAA,IAC9D;AAAC,GACH;AAEA,EAAA,2BAAQ,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,cAAe,QAAA,EAAS,CAAA;AAChE;AAGO,SAAS,gBAAA,GAAuC;AACrD,EAAA,MAAM,GAAA,GAAM,WAAW,aAAa,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,SAAY,QAAA,EAAwC;AAClE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,gBAAA,EAAiB;AACnC,EAAA,OAAOA,UAAA,CAAgB,OAAO,QAAQ,CAAA;AACxC;AAGO,SAAS,gBAAmB,QAAA,EAAwC;AACzE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,gBAAA,EAAiB;AACnC,EAAA,OAAOA,UAAA,CAAgB,KAAA,EAAO,UAAA,CAAW,QAAQ,CAAC,CAAA;AACpD;;;ACtHO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAEpC,EAAA,MAAM,SAAS,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,CAAA;AACxD,EAAA,MAAM,WAAW,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,QAAQ,CAAA;AAE5D,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM,MAAA,CAAO,oBAAmB,EAAG,CAAC,MAAM,CAAC,CAAA;AACzE,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM,MAAA,CAAO,sBAAqB,EAAG,CAAC,MAAM,CAAC,CAAA;AAE7E,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,WAAA,EAAY;AACpD;ACXA,SAAS,oBAAA,GAA+B;AACtC,EAAA,IAAI,OAAO,kBAAkB,WAAA,EAAa;AACxC,IAAA,IAAI,aAAA,CAAc,eAAA,CAAgB,wBAAwB,CAAA,EAAG,OAAO,wBAAA;AACpE,IAAA,IAAI,aAAA,CAAc,eAAA,CAAgB,YAAY,CAAA,EAAG,OAAO,YAAA;AACxD,IAAA,IAAI,aAAA,CAAc,eAAA,CAAgB,WAAW,CAAA,EAAG,OAAO,WAAA;AAAA,EACzD;AACA,EAAA,OAAO,YAAA;AACT;AAEO,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,gBAAA,GAAmBC,OAA6B,IAAI,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAYA,OAA2B,IAAI,CAAA;AACjD,EAAA,MAAM,SAAA,GAAYA,MAAAA,CAAe,EAAE,CAAA;AACnC,EAAA,MAAM,QAAA,GAAWA,OAA8C,IAAI,CAAA;AACnE,EAAA,MAAM,YAAA,GAAeA,OAAe,CAAC,CAAA;AACrC,EAAA,MAAM,cAAA,GAAiBA,OAAsC,IAAI,CAAA;AACjE,EAAA,MAAM,eAAA,GAAkBA,OAA4B,IAAI,CAAA;AACxD,EAAA,MAAM,WAAA,GAAcA,OAA4B,IAAI,CAAA;AAEpD,EAAA,MAAM,mBAAA,GAAsBC,YAAY,MAAM;AAC5C,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,IAAI,eAAA,CAAgB,OAAA,IAAW,eAAA,CAAgB,OAAA,CAAQ,UAAU,QAAA,EAAU;AACzE,MAAA,eAAA,CAAgB,QAAQ,KAAA,EAAM;AAAA,IAChC;AACA,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,SAAA,CAAU,OAAA,EAAS,SAAA,EAAU,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC5C,MAAA,CAAA,CAAE,IAAA,EAAK;AAAA,IACT,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,mBAAA,EAAoB;AAAA,EACtB,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAExB,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,aAAA,CAAc,SAAS,OAAO,CAAA;AAC9B,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,gBAAA,CAAiB,OAAA,EAAS,KAAA,KAAU,WAAA,EAAa;AACnD,QAAA,gBAAA,CAAiB,QAAQ,IAAA,EAAK;AAAA,MAChC;AACA,MAAA,aAAA,EAAc;AACd,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,UAAU,CAAC,CAAA;AAE9B,EAAA,MAAM,KAAA,GAAQD,YAAY,YAAY;AACpC,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,YAAA,CAAa,aAAa,EAAE,KAAA,EAAO,MAAM,CAAA;AACxE,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,IAAA,MAAM,YAAA,GAAe,IAAI,YAAA,EAAa;AACtC,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,uBAAA,CAAwB,MAAM,CAAA;AAC1D,IAAA,MAAM,QAAA,GAAW,aAAa,cAAA,EAAe;AAC7C,IAAA,QAAA,CAAS,OAAA,GAAU,GAAA;AACnB,IAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACvB,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,IAAA,MAAM,WAAW,oBAAA,EAAqB;AACtC,IAAA,MAAM,WAAW,IAAI,aAAA,CAAc,MAAA,EAAQ,EAAE,UAAU,CAAA;AACvD,IAAA,gBAAA,CAAiB,OAAA,GAAU,QAAA;AAC3B,IAAA,SAAA,CAAU,UAAU,EAAC;AAErB,IAAA,QAAA,CAAS,eAAA,GAAkB,CAAC,CAAA,KAAM;AAChC,MAAA,IAAI,CAAA,CAAE,KAAK,IAAA,GAAO,CAAA,YAAa,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IACpD,CAAA;AAEA,IAAA,QAAA,CAAS,SAAS,MAAM;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,CAAA;AACzE,MAAA,aAAA,EAAc;AACd,MAAA,UAAA,EAAW;AACX,MAAA,cAAA,CAAe,UAAU,IAAI,CAAA;AAC7B,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAChC,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,QAAA,CAAS,OAAA,GAAU,YAAY,MAAM;AACnC,MAAA,WAAA,CAAY,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,KAAQ,YAAA,CAAa,OAAA,IAAW,GAAI,CAAC,CAAA;AAAA,IACpE,GAAG,GAAI,CAAA;AAEP,IAAA,QAAA,CAAS,KAAA,EAAM;AACf,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,aAAA,EAAe,UAAU,CAAC,CAAA;AAE9B,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAqB;AAC5C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,CAAC,gBAAA,CAAiB,OAAA,IAAW,gBAAA,CAAiB,OAAA,CAAQ,UAAU,UAAA,EAAY;AAC9E,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,6BAA6B,CAAC,CAAA;AAC/C,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,OAAA,GAAU,OAAA;AACzB,MAAA,gBAAA,CAAiB,QAAQ,IAAA,EAAK;AAC9B,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,IAAA,IAAI,gBAAA,CAAiB,OAAA,EAAS,KAAA,KAAU,WAAA,EAAa;AACnD,MAAA,gBAAA,CAAiB,QAAQ,IAAA,EAAK;AAAA,IAChC;AACA,IAAA,aAAA,EAAc;AACd,IAAA,UAAA,EAAW;AACX,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,WAAA,CAAY,CAAC,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,aAAA,EAAe,UAAU,CAAC,CAAA;AAE9B,EAAA,OAAO,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,aAAa,QAAA,EAAU,YAAA,EAAc,YAAY,OAAA,EAAQ;AACzF;ACtHO,SAAS,aAAA,GAAgB;AAC9B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAEpC,EAAA,MAAM,SAAS,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAM,CAAA;AAClD,EAAA,MAAM,QAAQ,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,KAAK,CAAA;AAChD,EAAA,MAAM,kBAAkB,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,eAAe,CAAA;AAEpE,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM,MAAA,CAAO,OAAM,EAAG,CAAC,MAAM,CAAC,CAAA;AAE5D,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,eAAA,EAAiB,SAAA,EAAU;AACrD;ACTO,SAAS,WAAA,CAAY,QAAA,EAAkB,UAAA,GAA6B,OAAA,EAAS;AAClF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAEpC,EAAA,MAAM,QAAA,GAAW,SAAS,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,QAAQ,KAAK,IAAI,CAAA;AAE7D,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,CAAC,QAAiB,cAAA,KAChB,MAAA,CAAO,aAAa,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,cAAc,CAAA;AAAA,IAC1E,CAAC,MAAA,EAAQ,UAAA,EAAY,QAAQ;AAAA,GAC/B;AAEA,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,CAAC,QAAiB,cAAA,KAChB,MAAA,CAAO,aAAa,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,cAAc,CAAA;AAAA,IAC7E,CAAC,MAAA,EAAQ,UAAA,EAAY,QAAQ;AAAA,GAC/B;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,OAAA,EAAQ;AACnC;AClBO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAEpC,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,CAAC,MAAA,KAA0E;AACzE,MAAA,OAAO,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB;ACZO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAEpC,EAAA,MAAM,SAAS,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AACvD,EAAA,MAAM,YAAY,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACtD,EAAA,MAAM,YAAY,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM,MAAA,CAAO,mBAAkB,EAAG,CAAC,MAAM,CAAC,CAAA;AACxE,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM,MAAA,CAAO,qBAAoB,EAAG,CAAC,MAAM,CAAC,CAAA;AAE5E,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,OAAA,EAAiB,KAAA,KAAmB,MAAA,CAAO,YAAA,CAAa,SAAS,KAAK,CAAA;AAAA,IACvE,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,aAAa,UAAA,EAAW;AAC5E;ACfA,IAAM,cAA6B,EAAC;AACpC,IAAM,aAAoB,EAAC;AAEpB,SAAS,iBAAiB,QAAA,EAAsC;AACrE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAGpC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAA,CAAO,UAAU,QAAQ,CAAA;AACzB,IAAA,OAAO,MAAM,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAGrB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA,KAAsB,QAAA,GAAY,EAAE,OAAA,CAAQ,QAAQ,CAAA,IAAK,IAAA,GAAQ,IAAK,CAAA;AAC/F,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,CAAC,CAAA,KAAO,QAAA,GAAW,EAAE,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,GAAI,KAAM,CAAA;AACrF,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,CAAC,CAAA,KAAM;AAChC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AACzB,IAAA,OAAO,CAAA,GAAI,EAAE,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,MAAA,KAAW,SAAS,CAAA,GAAI,KAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,QAAA;AAAA,IAAS,CAAC,CAAA,KAC3B,QAAA,GAAY,EAAE,UAAA,CAAW,QAAQ,KAAK,WAAA,GAAe;AAAA,GACvD;AACA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,CAAC,CAAA,KAAO,QAAA,GAAY,EAAE,MAAA,CAAO,QAAQ,CAAA,IAAK,WAAA,GAAe,WAAY,CAAA;AAChG,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAC,CAAA,KAAO,QAAA,GAAY,EAAE,IAAA,CAAK,QAAQ,CAAA,IAAK,UAAA,GAAc,UAAW,CAAA;AAGvF,EAAA,MAAM,MAAA,GAASC,OAAAA;AAAA,IACb,MAAO,WAAW,MAAA,GAAS,CAAC,GAAG,SAAA,EAAW,GAAG,UAAU,CAAA,GAAI,SAAA;AAAA,IAC3D,CAAC,YAAY,SAAS;AAAA,GACxB;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,WAAW,SAAA,EAAU;AACtD;AAEO,SAAS,gBAAgB,QAAA,EAAyB;AACvD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAEpC,EAAA,MAAM,cAAA,GAAiB,QAAA;AAAA,IAAS,CAAC,MAC/B,QAAA,GAAY,CAAA,CAAE,gBAAgB,QAAQ,CAAA,EAAG,WAAW,IAAA,GAAQ;AAAA,GAC9D;AAEA,EAAA,MAAM,eAAA,GAAkBF,WAAAA;AAAA,IACtB,CAAC,KAAA,KAAmB;AAClB,MAAA,IAAI,QAAA,EAAU,MAAA,CAAO,eAAA,CAAgB,QAAA,EAAU,KAAK,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,CAAC,UAAU,MAAM;AAAA,GACnB;AAEA,EAAA,OAAO,EAAE,gBAAgB,eAAA,EAAgB;AAC3C;ACpDO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAUE,OAAAA;AAAA,IACd,MACE,WAAA,CAAY,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC1B,MAAA,MAAM,CAAA,GAAI,UAAU,EAAE,CAAA;AACtB,MAAA,OAAO,CAAA,GAAI,CAAC,CAAC,CAAA,GAAI,EAAC;AAAA,IACpB,CAAC,CAAA;AAAA,IACH,CAAC,aAAa,SAAS;AAAA,GACzB;AAEA,EAAA,MAAM,YAAY,QAAA,CAAS,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,WAAW,WAAW,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,oBAAoB,CAAA;AAEzD,EAAA,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,UAAA,EAAW;AACnD;AAGO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AAEpC,EAAA,MAAM,YAAA,GAAeF,WAAAA,CAAY,CAAC,QAAA,KAAqB,MAAA,CAAO,aAAa,QAAQ,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC9F,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,CAAC,KAAA,KAAmB,MAAA,CAAO,gBAAgB,KAAK,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAExF,EAAA,OAAO,EAAE,cAAc,QAAA,EAAS;AAClC;AC5BO,SAAS,SAAA,GAAY;AAC1B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,gBAAA,EAAiB;AACpC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIG,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,cAAA,GAAiBJ,OAAO,CAAC,CAAA;AAE/B,EAAA,MAAM,MAAA,GAASC,WAAAA;AAAA,IACb,OAAO,IAAA,KAA6C;AAClD,MAAA,cAAA,CAAe,OAAA,EAAA;AACf,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,MACjC,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,OAAA,EAAA;AACf,QAAA,IAAI,cAAA,CAAe,YAAY,CAAA,EAAG;AAChC,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B","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"]}