@agents24/react 0.2.8 → 0.2.9

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/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./lifecycle";
2
2
  export * from "./model";
3
3
  export * from "./provider";
4
+ export * from "./runtime-event-buffer";
4
5
  export * from "./state";
5
6
  export * from "./thread-message-queue";
6
7
  export * from "./use-agent-chat";
package/dist/index.js CHANGED
@@ -399,7 +399,10 @@ function threadTimelineToMessages(items, detail) {
399
399
  createdAt: item.created_at,
400
400
  isFinal: item.status === "completed" || item.status === "delivered",
401
401
  parts: item.role === "assistant" ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`) : item.text ? [{ id: `${item.id}-text`, type: "text", kind: "text", text: item.text }] : [],
402
- attachments: item.role === "user" ? item.attachment_ids.map((id) => ({ id, filename: "Attachment" })) : void 0,
402
+ attachments: item.role === "user" ? item.attachment_ids.map((id) => {
403
+ const descriptor = item.attachments?.find((attachment) => attachment.id === id);
404
+ return { id, filename: descriptor?.filename || "Attachment", mediaType: descriptor?.mime_type || "application/octet-stream" };
405
+ }) : void 0,
403
406
  feedback: item.role === "assistant" && item.run_id ? feedbackByRun.get(item.run_id) : void 0
404
407
  }));
405
408
  }
@@ -449,6 +452,54 @@ function useAgentClient() {
449
452
  return useAgents24Runtime().client;
450
453
  }
451
454
 
455
+ // src/runtime-event-buffer.ts
456
+ function runtimeEventFrameScheduler() {
457
+ const runtime = globalThis;
458
+ if (typeof runtime.requestAnimationFrame !== "function") return void 0;
459
+ return (callback) => {
460
+ const handle = runtime.requestAnimationFrame?.(callback);
461
+ return () => {
462
+ if (handle !== void 0) runtime.cancelAnimationFrame?.(handle);
463
+ };
464
+ };
465
+ }
466
+ function createRuntimeEventFrameBuffer(apply, scheduleFrame) {
467
+ let pending = [];
468
+ let cancelFrame = null;
469
+ const flush = () => {
470
+ cancelFrame?.();
471
+ cancelFrame = null;
472
+ if (!pending.length) return;
473
+ const events = pending;
474
+ pending = [];
475
+ apply(events);
476
+ };
477
+ return {
478
+ dispose() {
479
+ cancelFrame?.();
480
+ cancelFrame = null;
481
+ pending = [];
482
+ },
483
+ flush,
484
+ push(event) {
485
+ if (event.event !== "assistant.delta" || !scheduleFrame) {
486
+ pending.push(event);
487
+ flush();
488
+ return;
489
+ }
490
+ pending.push(event);
491
+ if (cancelFrame) return;
492
+ cancelFrame = scheduleFrame(() => {
493
+ cancelFrame = null;
494
+ if (!pending.length) return;
495
+ const events = pending;
496
+ pending = [];
497
+ apply(events);
498
+ });
499
+ }
500
+ };
501
+ }
502
+
452
503
  // src/state.ts
453
504
  import {
454
505
  compressionFromContextWindow as compressionFromContextWindow2,
@@ -555,6 +606,22 @@ function preserveMountedMessageIds(canonical, current) {
555
606
  return mounted && mounted.id !== message.id ? { ...message, id: mounted.id, durableId: message.id } : message;
556
607
  });
557
608
  }
609
+ function reconcileThreadTimeline(current, canonical, activeRunId, streamingMessageId) {
610
+ const mounted = preserveMountedMessageIds(canonical, current);
611
+ const canonicalIds = new Set(mounted.map((message) => message.id));
612
+ const retained = current.filter((message) => !canonicalIds.has(message.id) && (message.isFinal || activeRunId && (!message.runId || message.runId === activeRunId)));
613
+ const reconciled = mounted.map((message) => {
614
+ const live = current.find((item) => item.id === message.id);
615
+ return activeRunId && live?.role === "assistant" && live.runId === activeRunId && (live.id === streamingMessageId || !live.isFinal) ? { ...message, ...live, durableId: message.durableId || live.durableId } : message;
616
+ });
617
+ return [...retained, ...reconciled];
618
+ }
619
+ function promoteThreadMessage(current, message, runId) {
620
+ const promoted = { ...message, runId, isFinal: true };
621
+ const index = current.findIndex((item) => item.id === message.id || item.durableId === message.id);
622
+ if (index < 0) return [...current, promoted];
623
+ return current.map((item, itemIndex) => itemIndex === index ? { ...item, ...promoted, id: item.id, durableId: item.id === message.id ? item.durableId : message.id } : item);
624
+ }
558
625
  function upsertStableAssistantMessage(messages, input) {
559
626
  const next = [...messages];
560
627
  for (const baseMessage of input.baseMessages || []) {
@@ -605,9 +672,23 @@ function reconcileModelTurnParts(parts, event) {
605
672
  return active ? upsertResponseBlockParts(next, [active]) : next;
606
673
  }
607
674
  function applyRuntimeEvent(state, event) {
675
+ if (event.event === "run.accepted" && typeof event.payload?.message_id === "string") {
676
+ const messageId2 = event.payload.message_id;
677
+ let optimisticIndex = -1;
678
+ for (let index = state.messages.length - 1; index >= 0; index -= 1) {
679
+ const message = state.messages[index];
680
+ if (message.role === "user" && !message.runId && !message.durableId) {
681
+ optimisticIndex = index;
682
+ break;
683
+ }
684
+ }
685
+ if (optimisticIndex >= 0) {
686
+ state = { ...state, messages: state.messages.map((message, index) => index === optimisticIndex ? { ...message, durableId: messageId2, runId: event.run_id } : message.role === "assistant" && !message.runId ? { ...message, runId: event.run_id } : message) };
687
+ }
688
+ }
608
689
  const projection = assistantProjectionFromEvent(event);
609
690
  const eventName = String(event.event || "");
610
- const runId = event.run_id || state.activeRunId;
691
+ const runId = state.activeRunId && event.event !== "run.accepted" ? state.activeRunId : event.run_id || state.activeRunId;
611
692
  const segmentId = typeof event.payload?.segment_id === "string" ? event.payload.segment_id : null;
612
693
  const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);
613
694
  const messageId = distinctSegment ? `${runId || "run"}-assistant-${segmentId}` : state.streamingMessageId || `${runId || "run"}-assistant`;
@@ -619,12 +700,13 @@ function applyRuntimeEvent(state, event) {
619
700
  const payload = event.payload || {};
620
701
  const eventThreadId = typeof payload.thread_id === "string" && payload.thread_id.trim() ? payload.thread_id.trim() : null;
621
702
  const contextApplies = (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId) && (!state.activeRunId || !runId || runId === state.activeRunId);
622
- const contextWindow = contextApplies ? mergeContextWindowUpdate2(state.contextWindow, payload.context_window) : state.contextWindow;
703
+ const contextPayload = payload.context_window && typeof payload.context_window === "object" ? { ...payload.context_window, run_id: runId } : payload.context_window;
704
+ const contextWindow = contextApplies ? mergeContextWindowUpdate2(state.contextWindow, contextPayload) : state.contextWindow;
623
705
  const explicitCompression = contextApplies ? normalizeContextCompression2(payload.context_compression) : null;
624
706
  const contextCompression = contextApplies ? explicitCompression || compressionFromContextWindow2(contextWindow) || state.contextCompression : state.contextCompression;
625
707
  const hasLiveCompressionUpdate = Boolean(
626
708
  contextApplies && (explicitCompression?.active || compressionFromContextWindow2(
627
- mergeContextWindowUpdate2(null, payload.context_window)
709
+ mergeContextWindowUpdate2(null, contextPayload)
628
710
  )?.active)
629
711
  );
630
712
  const delta = eventName === "assistant.delta" && typeof payload.content === "string" ? payload.content : "";
@@ -741,7 +823,11 @@ function useThreadMessageQueue({ threadId, transport, onPromoted }) {
741
823
  onPromotedRef.current = onPromoted;
742
824
  const hydrate = React2.useCallback((page, selectedThreadId) => {
743
825
  if (threadRef.current !== selectedThreadId) return;
744
- const pending = page.pending.filter((message) => !promotedRef.current.has(message.id));
826
+ const pending = page.pending.filter((message) => !promotedRef.current.has(message.id)).map((message) => {
827
+ const known = pendingRef.current.get(message.id);
828
+ if (message.attachments?.length || !known?.attachments?.length) return message;
829
+ return { ...message, attachments: known.attachments.filter((attachment) => message.attachment_ids.includes(attachment.id)) };
830
+ });
745
831
  for (const message of pending) pendingRef.current.set(message.id, message);
746
832
  setPendingMessages(pending);
747
833
  setMessageQueue(page.queue);
@@ -757,7 +843,11 @@ function useThreadMessageQueue({ threadId, transport, onPromoted }) {
757
843
  if (pending && !promotedRef.current.has(item.id)) {
758
844
  promotedRef.current.add(item.id);
759
845
  pendingRef.current.delete(item.id);
760
- onPromotedRef.current(pending, item.run_id);
846
+ onPromotedRef.current({
847
+ ...pending,
848
+ ...item,
849
+ attachments: item.attachments?.length ? item.attachments : pending.attachments
850
+ }, item.run_id);
761
851
  }
762
852
  }
763
853
  }
@@ -782,7 +872,8 @@ function useThreadMessageQueue({ threadId, transport, onPromoted }) {
782
872
  const submit = React2.useCallback(async (input) => {
783
873
  const selectedThreadId = threadRef.current;
784
874
  if (!selectedThreadId) throw new Error("No active Agent thread is available.");
785
- const result = await transportRef.current.submit({ ...input, threadId: selectedThreadId });
875
+ const { attachments, ...submission } = input;
876
+ const result = await transportRef.current.submit({ ...submission, threadId: selectedThreadId });
786
877
  if (threadRef.current !== selectedThreadId) return result;
787
878
  versionRef.current += 1;
788
879
  if (!result.run_id && ["queued", "steer_pending", "blocked"].includes(result.status)) {
@@ -799,6 +890,7 @@ function useThreadMessageQueue({ threadId, transport, onPromoted }) {
799
890
  requested_mode: input.mode,
800
891
  text: input.input,
801
892
  attachment_ids: input.attachmentIds || [],
893
+ attachments,
802
894
  response_blocks: [],
803
895
  revision: 1,
804
896
  created_at: now,
@@ -863,54 +955,6 @@ function useThreadMessageQueue({ threadId, transport, onPromoted }) {
863
955
  // src/use-agent-chat.ts
864
956
  import * as React6 from "react";
865
957
 
866
- // src/runtime-event-buffer.ts
867
- function runtimeEventFrameScheduler() {
868
- const runtime = globalThis;
869
- if (typeof runtime.requestAnimationFrame !== "function") return void 0;
870
- return (callback) => {
871
- const handle = runtime.requestAnimationFrame?.(callback);
872
- return () => {
873
- if (handle !== void 0) runtime.cancelAnimationFrame?.(handle);
874
- };
875
- };
876
- }
877
- function createRuntimeEventFrameBuffer(apply, scheduleFrame) {
878
- let pending = [];
879
- let cancelFrame = null;
880
- const flush = () => {
881
- cancelFrame?.();
882
- cancelFrame = null;
883
- if (!pending.length) return;
884
- const events = pending;
885
- pending = [];
886
- apply(events);
887
- };
888
- return {
889
- dispose() {
890
- cancelFrame?.();
891
- cancelFrame = null;
892
- pending = [];
893
- },
894
- flush,
895
- push(event) {
896
- if (event.event !== "assistant.delta" || !scheduleFrame) {
897
- pending.push(event);
898
- flush();
899
- return;
900
- }
901
- pending.push(event);
902
- if (cancelFrame) return;
903
- cancelFrame = scheduleFrame(() => {
904
- cancelFrame = null;
905
- if (!pending.length) return;
906
- const events = pending;
907
- pending = [];
908
- apply(events);
909
- });
910
- }
911
- };
912
- }
913
-
914
958
  // src/thread-summary-subscription.ts
915
959
  function waitForReconnect(signal, delay) {
916
960
  return new Promise((resolve) => {
@@ -1202,7 +1246,7 @@ function useAgentChat(options = {}) {
1202
1246
  if (stateRef.current.activeThreadId !== message.thread_id) return;
1203
1247
  promotedRunHintRef.current = runId;
1204
1248
  const userMessage = threadTimelineToMessages([{ ...message, run_id: runId, status: "delivered" }])[0];
1205
- update((current) => current.activeThreadId === message.thread_id && !current.messages.some((item) => item.id === userMessage.id) ? { ...current, messages: [...current.messages, userMessage] } : current);
1249
+ update((current) => current.activeThreadId === message.thread_id ? { ...current, messages: promoteThreadMessage(current.messages, userMessage, runId) } : current);
1206
1250
  if (stateRef.current.activeRunId !== runId && promotedAttachRef.current !== runId) {
1207
1251
  promotedAttachRef.current = runId;
1208
1252
  void attachRunRef.current(runId).catch(() => {
@@ -1260,14 +1304,9 @@ function useAgentChat(options = {}) {
1260
1304
  promotedRunHintRef.current = null;
1261
1305
  update((current) => {
1262
1306
  if (current.activeThreadId !== target) return current;
1263
- const canonical = preserveMountedMessageIds(threadTimelineToMessages(page.items), current.messages);
1264
- const canonicalIds = new Set(canonical.map((message) => message.id));
1265
- const older = current.messages.filter((message) => !canonicalIds.has(message.id) && message.id !== current.streamingMessageId);
1266
- const live = current.activeRunId === promoted ? current.messages.filter((message) => message.id === current.streamingMessageId) : [];
1267
1307
  return {
1268
1308
  ...current,
1269
- messages: [...older, ...canonical, ...live.filter((message) => !canonicalIds.has(message.id))],
1270
- streamingMessageId: live.length ? current.streamingMessageId : null
1309
+ messages: reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), current.activeRunId, current.streamingMessageId)
1271
1310
  };
1272
1311
  });
1273
1312
  return;
@@ -1282,7 +1321,7 @@ function useAgentChat(options = {}) {
1282
1321
  }
1283
1322
  if (!stateRef.current.activeRunId && page.items.length) {
1284
1323
  update((current) => current.activeThreadId === target && !current.activeRunId ? (() => {
1285
- const messages = preserveMountedMessageIds(threadTimelineToMessages(page.items), current.messages);
1324
+ const messages = reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), null, null);
1286
1325
  return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };
1287
1326
  })() : current);
1288
1327
  }
@@ -1387,13 +1426,6 @@ function useAgentChat(options = {}) {
1387
1426
  }
1388
1427
  }, [clearOperationError, client, detach, failOperation, pageSize, queue.hydrate, runtime, update]);
1389
1428
  const consumeEvent = React6.useCallback((event) => {
1390
- if (event.event === "run.accepted" && !stateRef.current.activeThreadId && typeof event.payload?.message_id === "string") {
1391
- const durableId = event.payload.message_id;
1392
- update((current) => ({
1393
- ...current,
1394
- messages: current.messages.map((message) => message.role === "user" && !message.runId && !message.durableId ? { ...message, durableId, runId: event.run_id } : message.role === "assistant" && !message.runId ? { ...message, runId: event.run_id } : message)
1395
- }));
1396
- }
1397
1429
  const eventThreadId = typeof event.payload?.thread_id === "string" ? event.payload.thread_id.trim() : "";
1398
1430
  if (eventThreadId && !stateRef.current.activeThreadId) {
1399
1431
  update((current) => adoptStreamingThread(current, eventThreadId));
@@ -2008,6 +2040,7 @@ export {
2008
2040
  computerResourceTargets,
2009
2041
  contextCompressionPartFromEvent,
2010
2042
  createPortableId,
2043
+ createRuntimeEventFrameBuffer,
2011
2044
  getThreadActivity,
2012
2045
  initialAgentChatState,
2013
2046
  isAbortLike,
@@ -2016,8 +2049,11 @@ export {
2016
2049
  partsFromResponseBlocks,
2017
2050
  preferNewestThreadSummary,
2018
2051
  preserveMountedMessageIds,
2052
+ promoteThreadMessage,
2019
2053
  reconcileRefreshedThreads,
2054
+ reconcileThreadTimeline,
2020
2055
  restoreAgentChatThreadSelection,
2056
+ runtimeEventFrameScheduler,
2021
2057
  threadDetailToMessages,
2022
2058
  threadTimelineToMessages,
2023
2059
  upsertStableAssistantMessage,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/state.ts","../src/thread-message-queue.ts","../src/use-agent-chat.ts","../src/runtime-event-buffer.ts","../src/thread-summary-subscription.ts","../src/use-agent-chat-thread-list.ts","../src/use-agent-chat-feedback.ts","../src/use-agent-chat-queue-actions.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"waiting\"\n | \"interrupted\"\n | \"cancelling\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ChatCitation = {\n title: string;\n url: string;\n description?: string;\n sourceRef?: string;\n [key: string]: unknown;\n};\n\nexport type ChatAttachment = {\n id?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n contentType?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nexport function chatAttachmentIds(attachments?: readonly ChatAttachment[]): string[] {\n return (attachments || []).flatMap((attachment) => typeof attachment.id === \"string\" && attachment.id.trim()\n ? [attachment.id.trim()]\n : []);\n}\n\nexport type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatPartMetadata = {\n id: string;\n runId?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n raw?: Record<string, unknown>;\n};\n\nexport type ChatToolChildRun = {\n runId?: string | null;\n agentId?: string | null;\n agentName?: string | null;\n status?: string | null;\n error?: string | null;\n};\n\nexport type ChatToolChild = {\n id: string;\n runId?: string | null;\n toolCallId?: string | null;\n toolName: string;\n title: string;\n status: string;\n detail?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n};\n\nexport type ChatToolPresentation = Record<string, unknown> & {\n title?: string | null;\n activity?: string | null;\n detail?: string | null;\n category?: string | null;\n groupKey?: string | null;\n groupLabel?: string | null;\n path?: string | null;\n threadId?: string | null;\n isExploration?: boolean;\n childRun?: ChatToolChildRun | null;\n childTools?: ChatToolChild[];\n activeChildToolId?: string | null;\n};\n\nexport type ChatTextPart = ChatPartMetadata & { type: \"text\"; kind: \"text\"; text: string };\nexport type ChatComputerResourceTarget = {\n type: \"computer\";\n thread_id: string;\n computer_id: string;\n path: string;\n kind: \"file\" | \"directory\";\n};\nexport type ChatToolPart = ChatPartMetadata & {\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolKey?: string | null;\n action?: string | null;\n displayName?: string | null;\n summary?: string | null;\n toolCallId?: string | null;\n sourceKind?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n resourceTargets?: readonly ChatComputerResourceTarget[];\n errorText?: string | null;\n failure?: FailureView | null;\n presentation: ChatToolPresentation;\n};\nexport type ChatReasoningPart = ChatPartMetadata & { type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null };\nexport type ChatModelTurnPart = ChatPartMetadata & {\n type: \"model-turn\";\n kind: \"model-turn\";\n modelTurnId: string;\n turnKind: \"agent\" | \"model\";\n status: \"running\";\n iteration?: number | null;\n};\nexport type ChatContextCompressionPart = ChatPartMetadata & {\n type: \"context-compression\";\n kind: \"context-compression\";\n status: \"started\" | \"completed\" | \"failed\";\n compression: ContextCompression;\n};\nexport type ChatNodeActivityState = \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"skipped\";\nexport type ChatNodeSkipReason = \"missing_required_input\" | \"upstream_input_unavailable\" | \"empty_optional_source\";\nconst chatNodeSkipReason = (value: unknown): ChatNodeSkipReason | null => {\n const normalized = text(value);\n return normalized === \"missing_required_input\"\n || normalized === \"upstream_input_unavailable\"\n || normalized === \"empty_optional_source\"\n ? normalized\n : null;\n};\nexport type ChatNodeActivityPart = ChatPartMetadata & {\n type: \"node-activity\";\n kind: \"node-activity\";\n activityId: string;\n /** Opaque trusted-host trace selector; absent from public projections. */\n traceStepId?: string | null;\n label: string;\n nodeKind: string;\n status: ChatNodeActivityState;\n defaultChatVisible: boolean;\n reason?: ChatNodeSkipReason | null;\n failure?: FailureView | null;\n};\nexport type ChatUiBlocksPart = ChatPartMetadata & { type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\" | \"user_input\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlQuestion = {\n id: string;\n header: string;\n question: string;\n options: Array<{ id: string; label: string }>;\n multiSelect: boolean;\n};\nexport type ChatHitlAnswer = {\n questionId: string;\n selectedOptionIds: string[];\n customText?: string;\n};\nexport type ChatHitlResolution = Record<string, unknown> & {\n answers?: ChatHitlAnswer[];\n outcome?: string;\n status?: string;\n};\nexport type ChatHitlPart = ChatPartMetadata & {\n type: \"hitl\";\n kind: \"hitl\";\n interruptId: string;\n hitlKind: ChatHitlKind;\n message: string;\n allowedActions: HitlAction[];\n status: ChatHitlStatus;\n presentation: Record<string, unknown>;\n questions: ChatHitlQuestion[];\n resolution?: ChatHitlResolution | null;\n};\nexport type ChatErrorPart = ChatPartMetadata & { type: \"error\"; kind: \"error\"; errorText: string; failure?: FailureView | null };\nexport type ChatDataPart = ChatPartMetadata & { type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown> };\nexport type ChatSourcePart = ChatPartMetadata & { type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null };\nexport type ChatCitationPart = ChatPartMetadata & { type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null };\nexport type ChatAttachmentPart = ChatPartMetadata & { type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatModelTurnPart | ChatContextCompressionPart | ChatNodeActivityPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;\n\nexport type ChatMessage = {\n id: string;\n /** Durable timeline identity when a mounted optimistic turn keeps its display key. */\n durableId?: string;\n segmentIndex?: number | null;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n parts: ChatPart[];\n attachments?: ChatAttachment[];\n citations?: ChatCitation[];\n feedback?: ResponseFeedback | null;\n messageIndex?: number;\n reasoningSteps?: Array<Record<string, unknown>>;\n thinkingDurationMs?: number;\n tokenUsage?: { inputTokens?: number | null; outputTokens?: number | null; totalTokens?: number | null; usageSource?: string | null };\n isVoice?: boolean;\n};\n\nexport type StoredChatThread = ThreadSummary & {\n taskNotifications?: Array<Record<string, unknown> & { handle: string }>;\n messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\n contextWindow?: ContextWindow | null;\n contextCompression?: ContextCompression | null;\n};\n\nexport type ThreadActivity = {\n status: string | null;\n runId: string | null;\n isSpinning: boolean;\n isPaused: boolean;\n isFailed: boolean;\n isCompleted: boolean;\n isCancelled: boolean;\n};\n\nexport function getThreadActivity(thread: Pick<ThreadSummary, \"active_run\" | \"last_run_id\" | \"last_run_status\">): ThreadActivity {\n const activeRun = thread.active_run || null;\n const status = String(activeRun?.status || thread.last_run_status || \"\").trim().toLowerCase() || null;\n return {\n status,\n runId: activeRun?.run_id || thread.last_run_id || null,\n isSpinning: Boolean(activeRun) && ![\"waiting\", \"interrupted\"].includes(status || \"\"),\n isPaused: status === \"paused\",\n isFailed: status === \"failed\",\n isCompleted: status === \"completed\",\n isCancelled: status === \"cancelled\" || status === \"canceled\",\n };\n}\n\nconst record = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : null;\nexport function computerResourceTargets(value: unknown): ChatComputerResourceTarget[] {\n const output = record(value);\n if (!output) return [];\n const candidates = [output.resource_target,\n ...(Array.isArray(output.resource_targets) ? output.resource_targets : []),\n ...(Array.isArray(output.files) ? output.files.map(file => record(file)?.resource_target) : [])];\n const seen = new Set<string>();\n return candidates.flatMap(candidate => {\n const target = record(candidate);\n if (target?.type !== \"computer\" || typeof target.thread_id !== \"string\"\n || typeof target.computer_id !== \"string\" || typeof target.path !== \"string\"\n || !target.path.startsWith(\"/workspace\")\n || (target.kind !== \"file\" && target.kind !== \"directory\")) return [];\n const key = `${target.thread_id}:${target.computer_id}:${target.path}:${target.kind}`;\n if (seen.has(key)) return [];\n seen.add(key);\n return [target as ChatComputerResourceTarget];\n });\n}\nconst text = (value: unknown): string | null => typeof value === \"string\" && value.trim() ? value : null;\nconst finiteNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\nconst statusToToolState = (value: unknown): ChatToolState => {\n const normalized = String(value || \"\").toLowerCase();\n if (normalized === \"failed\" || normalized === \"error\") return \"output-error\";\n if (normalized === \"cancelled\" || normalized === \"canceled\") return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n return normalized === \"streaming\" ? \"input-streaming\" : \"input-available\";\n};\n\nfunction failureView(value: unknown): FailureView | null {\n const candidate = record(value);\n return candidate?.schema_version === \"agents24.failure.v1\"\n && text(candidate.failure_id)\n && text(candidate.code)\n && text(candidate.message)\n && typeof candidate.retryable === \"boolean\"\n && record(candidate.details)\n ? candidate as unknown as FailureView\n : null;\n}\n\nconst allowedActions: Record<ChatHitlKind, HitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n user_input: [\"respond\"],\n};\n\nfunction hitlQuestions(presentation: Record<string, unknown>): ChatHitlQuestion[] {\n return (Array.isArray(presentation.questions) ? presentation.questions : []).flatMap((value) => {\n const question = record(value);\n if (!question || !Array.isArray(question.options)) return [];\n const options = question.options.flatMap((rawOption) => {\n const option = record(rawOption);\n return option && text(option.id) && text(option.label)\n ? [{ id: String(option.id), label: String(option.label) }]\n : [];\n });\n return text(question.id) && text(question.header) && text(question.question) && options.length >= 2\n ? [{\n id: String(question.id),\n header: String(question.header),\n question: String(question.question),\n options,\n multiSelect: question.multi_select === true,\n }]\n : [];\n });\n}\n\nfunction hitlResolution(value: unknown): ChatHitlResolution | null {\n const resolution = record(value);\n if (!resolution) return null;\n const answers = (Array.isArray(resolution.answers) ? resolution.answers : []).flatMap((value) => {\n const answer = record(value);\n if (!answer || !text(answer.question_id) || !Array.isArray(answer.selected_option_ids)) return [];\n return [{\n questionId: String(answer.question_id),\n selectedOptionIds: answer.selected_option_ids.map(String),\n ...(text(answer.custom_text) ? { customText: String(answer.custom_text) } : {}),\n }];\n });\n return { ...resolution, ...(answers.length ? { answers } : {}) };\n}\n\nfunction partMetadata(block: Record<string, unknown>, id: string): ChatPartMetadata {\n return {\n id,\n runId: text(block.runId) || text(block.run_id),\n sequence: finiteNumber(block.seq),\n timestamp: text(block.ts),\n raw: block,\n };\n}\n\nfunction toolPresentation(tool: Record<string, unknown>): ChatToolPresentation {\n const nested = record(tool.presentation) || {};\n const childRunValue = record(tool.childRun) || record(tool.child_run);\n const childRun = childRunValue && (\n text(childRunValue.runId || childRunValue.run_id)\n || text(childRunValue.agentName || childRunValue.agent_name)\n || text(childRunValue.status)\n )\n ? {\n runId: text(childRunValue.runId) || text(childRunValue.run_id),\n agentId: text(childRunValue.agentId) || text(childRunValue.agent_id),\n agentName: text(childRunValue.agentName) || text(childRunValue.agent_name),\n status: text(childRunValue.status),\n error: text(childRunValue.error),\n }\n : null;\n const childTools = (Array.isArray(tool.childTools) ? tool.childTools : Array.isArray(tool.child_tools) ? tool.child_tools : [])\n .flatMap((value): ChatToolChild[] => {\n const child = record(value);\n if (!child || !text(child.id) || !text(child.title)) return [];\n return [{\n id: String(child.id),\n runId: text(child.runId) || text(child.run_id),\n toolCallId: text(child.toolCallId) || text(child.tool_call_id),\n toolName: String(child.toolName || child.tool_name || child.title),\n title: String(child.title),\n status: String(child.status || \"\"),\n detail: text(child.detail),\n sequence: finiteNumber(child.seq),\n timestamp: text(child.ts),\n }];\n });\n return {\n ...nested,\n title: text(tool.title) || text(nested.title),\n activity: text(tool.activity) || text(nested.activity),\n detail: text(tool.detail) || text(nested.detail),\n category: text(tool.category) || text(nested.category),\n groupKey: text(tool.groupKey) || text(tool.group_key) || text(nested.groupKey) || text(nested.group_key),\n groupLabel: text(tool.groupLabel) || text(tool.group_label) || text(nested.groupLabel) || text(nested.group_label),\n path: text(tool.path),\n threadId: text(tool.threadId) || text(tool.thread_id),\n isExploration: tool.isExploration === true || tool.is_exploration === true,\n childRun,\n childTools,\n activeChildToolId: text(tool.activeChildToolId) || text(tool.active_child_tool_id),\n };\n}\n\nexport function partsFromResponseBlocks(\n blocks: unknown,\n fallbackText = \"\",\n fallbackPartId = \"assistant-text\",\n): ChatPart[] {\n const input = Array.isArray(blocks) ? blocks : [];\n const parts = input.flatMap((item, index): ChatPart[] => {\n const block = record(item);\n if (!block) return [];\n const kind = String(block.kind || \"data\");\n const id = String(block.id || `${kind}-${index}`);\n const metadata = partMetadata(block, id);\n if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ ...metadata, type: \"text\", kind: \"text\", text: value }] : [];\n }\n if (kind === \"context_compression\") {\n const compression = normalizeContextCompression(block.compression);\n if (!compression?.active) return [];\n const status = compression.status === \"started\" || compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : block.status === \"complete\"\n ? \"completed\"\n : block.status === \"error\"\n ? \"failed\"\n : \"started\";\n return [{\n ...metadata,\n type: \"context-compression\",\n kind: \"context-compression\",\n status,\n compression: { ...compression, status },\n }];\n }\n if (kind === \"node_activity\") {\n const node = record(block.node);\n const activityId = text(node?.activityId) || text(node?.activity_id) || id;\n const statusValue = String(node?.status || \"\").toLowerCase();\n const status: ChatNodeActivityState = [\"completed\", \"failed\", \"cancelled\", \"skipped\"].includes(statusValue)\n ? statusValue as ChatNodeActivityState\n : \"running\";\n const label = text(node?.label) || \"Working\";\n const nodeKind = text(node?.kind) || \"node\";\n return [{\n ...metadata,\n type: \"node-activity\",\n kind: \"node-activity\",\n activityId,\n traceStepId: text(node?.traceStepId) || text(node?.trace_step_id) || null,\n label,\n nodeKind,\n status,\n defaultChatVisible: node?.defaultChatVisible === true,\n reason: chatNodeSkipReason(node?.reason),\n failure: failureView(node?.failure),\n }];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.toolName || tool.tool_name || tool.action || tool.title || \"tool\");\n return [{\n ...metadata,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolKey: text(tool.toolKey) || text(tool.tool_key),\n action: text(tool.action),\n displayName: text(tool.displayName) || text(tool.display_name),\n summary: text(tool.summary),\n toolCallId: text(tool.toolCallId) || text(tool.tool_call_id),\n sourceKind: text(tool.sourceKind) || text(tool.source_kind),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n resourceTargets: computerResourceTargets(tool.output),\n errorText: text(tool.error || block.error),\n failure: failureView(tool.failure),\n presentation: toolPresentation(tool),\n }];\n }\n if (kind === \"reasoning_note\") return [{ ...metadata, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status) }];\n if (kind === \"ui_blocks\") return [{ ...metadata, type: \"ui-blocks\", kind: \"ui-blocks\", state: statusToToolState(block.status), toolCallId: text(block.toolCallId), contractVersion: text(block.contractVersion), bundle: record(block.bundle), errorText: text(block.error) }];\n if (kind === \"hitl_request\") {\n const hitl = record(block.hitl) || {};\n const hitlKind = String(block.hitlKind || hitl.kind || \"\") as ChatHitlKind;\n if (!(hitlKind in allowedActions)) return [];\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n const expected = allowedActions[hitlKind];\n if (actions.length !== expected.length || actions.some((action, actionIndex) => action !== expected[actionIndex])) return [];\n return [{\n ...metadata,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId: String(block.interruptId || hitl.interrupt_id || \"\"),\n hitlKind,\n message: String(block.text || hitl.message || \"\"),\n allowedActions: actions,\n status: String(block.status || \"pending\") as ChatHitlStatus,\n presentation: record(hitl.presentation) || hitl,\n questions: hitlQuestions(record(hitl.presentation) || {}),\n resolution: hitlResolution(block.resolution),\n }];\n }\n if (kind === \"error\") {\n const failure = failureView(block.failure) || failureView(block.error);\n return [{\n ...metadata,\n type: \"error\",\n kind: \"error\",\n errorText: failure?.message || String(block.text || \"The run failed.\"),\n failure,\n }];\n }\n if (kind === \"source\") return [{ ...metadata, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description) }];\n if (kind === \"citation\") return [{ ...metadata, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url) }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ ...metadata, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined } }];\n }\n return [{ ...metadata, type: \"data\", kind: \"data\", name: kind, data: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: fallbackText.trim() });\n }\n return parts;\n}\n\nexport function assistantProjectionFromEvent(event: RuntimeEvent): { content: string; parts: ChatPart[] } {\n const payload = record(event.payload) || {};\n const content = text(payload.assistant_output_text) || \"\";\n const fromBlocks = partsFromResponseBlocks(\n payload.response_blocks,\n content,\n `${event.run_id}:assistant-text`,\n );\n if (fromBlocks.length) return {\n content: content || fromBlocks\n .filter((part): part is ChatTextPart => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n parts: fromBlocks,\n };\n const fromPatch = partsFromResponseBlocks(\n payload.response_block === undefined ? undefined : [payload.response_block],\n );\n if (fromPatch.length) return { content, parts: fromPatch };\n return { content, parts: [] };\n}\n\nexport function modelTurnPartFromEvent(event: RuntimeEvent): ChatModelTurnPart | null {\n const eventName = String(event.event || \"\");\n const payload = record(event.payload) || {};\n const source = eventName === \"run.snapshot\" ? record(payload.active_model_turn) : payload;\n if (\n !source\n || (eventName !== \"model.turn.started\" && eventName !== \"run.snapshot\")\n || source.status !== \"running\"\n || !text(source.model_turn_id)\n ) return null;\n const modelTurnId = String(source.model_turn_id);\n const iteration = finiteNumber(source.iteration);\n return {\n id: `model-turn:${modelTurnId}`,\n type: \"model-turn\",\n kind: \"model-turn\",\n modelTurnId,\n turnKind: source.kind === \"agent\" ? \"agent\" : \"model\",\n status: \"running\",\n runId: event.run_id || null,\n sequence: finiteNumber(event.seq),\n timestamp: text(event.ts),\n ...(iteration === null ? {} : { iteration }),\n raw: source,\n };\n}\n\nexport function contextCompressionPartFromEvent(\n event: RuntimeEvent,\n existingParts: readonly ChatPart[] = [],\n): ChatContextCompressionPart | null {\n if (String(event.event || \"\") !== \"context.compression.updated\") return null;\n const payload = record(event.payload) || {};\n const compression = normalizeContextCompression(payload.context_compression);\n if (!compression?.active) return null;\n const status = compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : \"started\";\n const activePart = [...existingParts].reverse().find(\n (part): part is ChatContextCompressionPart => (\n part.kind === \"context-compression\" && part.status === \"started\"\n ),\n );\n const sequence = finiteNumber(event.seq);\n const id = status === \"started\"\n ? `context-compression:${event.run_id || \"run\"}:${sequence ?? \"active\"}`\n : activePart?.id || `context-compression:${event.run_id || \"run\"}:${sequence ?? \"terminal\"}`;\n return {\n id,\n type: \"context-compression\",\n kind: \"context-compression\",\n runId: event.run_id || null,\n sequence,\n timestamp: text(event.ts),\n status,\n compression,\n };\n}\n\nexport function threadDetailToMessages(detail: ThreadDetail): ChatMessage[] {\n return (detail.turns || []).flatMap((item, index) => {\n const turn = record(item) || {};\n const userText = text(turn.user_input_text) || \"\";\n const assistantText = text(turn.assistant_output_text) || \"\";\n const runId = text(turn.run_id);\n const createdAt = text(turn.created_at) || new Date(0).toISOString();\n const rawFeedback = record(turn.feedback);\n const feedback: ResponseFeedback | null = rawFeedback\n && (rawFeedback.rating === \"like\" || rawFeedback.rating === \"dislike\")\n && text(rawFeedback.created_at)\n && text(rawFeedback.updated_at)\n ? {\n rating: rawFeedback.rating === \"like\" ? \"like\" : \"dislike\",\n reason: [\n \"incorrect\",\n \"irrelevant\",\n \"incomplete\",\n \"unsafe\",\n \"citation_issue\",\n \"other\",\n ].includes(String(rawFeedback.reason || \"\"))\n ? rawFeedback.reason as ResponseFeedback[\"reason\"]\n : null,\n comment: text(rawFeedback.comment),\n created_at: String(rawFeedback.created_at),\n updated_at: String(rawFeedback.updated_at),\n }\n : null;\n const attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => {\n const value = record(attachment);\n return value ? [attachmentResultToChatAttachment(value as AttachmentResult)] : [];\n })\n : [];\n const output: ChatMessage[] = [];\n if (userText || attachments.length) output.push({\n id: String(turn.id || `${runId || index}-user`),\n role: \"user\",\n content: userText,\n createdAt,\n parts: userText ? [{ id: `${runId || index}-user-text`, type: \"text\", kind: \"text\", text: userText }] : [],\n attachments,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n if (assistantText || Array.isArray(turn.response_blocks)) {\n const assistantParts = partsFromResponseBlocks(\n turn.response_blocks,\n assistantText,\n `${runId || turn.id || index}-assistant-text`,\n );\n output.push({\n id: `${runId || turn.id || index}-assistant`,\n role: \"assistant\",\n runId,\n content: assistantText,\n createdAt: text(turn.completed_at) || createdAt,\n isFinal: ![\"queued\", \"running\", \"paused\", \"cancelling\"].includes(String(turn.status || \"\").toLowerCase()),\n feedback,\n parts: assistantParts,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n }\n return output;\n });\n}\n\nexport function threadTimelineToMessages(\n items: readonly import(\"@agents24/client\").ThreadMessage[],\n detail?: ThreadDetail,\n): ChatMessage[] {\n const feedbackByRun = new Map((detail?.turns || []).flatMap((turn) =>\n turn.run_id && turn.feedback ? [[turn.run_id, turn.feedback] as const] : []));\n return items.map((item) => ({\n id: item.id,\n role: item.role,\n runId: item.run_id,\n segmentIndex: item.segment_index,\n content: item.text,\n createdAt: item.created_at,\n isFinal: item.status === \"completed\" || item.status === \"delivered\",\n parts: item.role === \"assistant\"\n ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`)\n : item.text ? [{ id: `${item.id}-text`, type: \"text\" as const, kind: \"text\" as const, text: item.text }] : [],\n attachments: item.role === \"user\" ? item.attachment_ids.map((id) => ({ id, filename: \"Attachment\" })) : undefined,\n feedback: item.role === \"assistant\" && item.run_id ? feedbackByRun.get(item.run_id) as ResponseFeedback | undefined : undefined,\n }));\n}\n\nexport function latestThreadContext(detail: ThreadDetail): {\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n} {\n let contextWindow: ContextWindow | null = null;\n for (const turn of detail.turns || []) {\n contextWindow = mergeContextWindowUpdate(contextWindow, turn.context_window);\n }\n return {\n contextWindow,\n contextCompression: compressionFromContextWindow(contextWindow),\n };\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return {\n ...result,\n id: result.id,\n filename: result.filename,\n mediaType: result.mime_type,\n status: result.processing_status,\n };\n}\n","import type { AgentClient } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AbortControllerFactory } from \"./lifecycle\";\nimport { createPortableId } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\n\nexport type AgentChatStorage = {\n loadThreads(): StoredChatThread[];\n saveThreads(threads: readonly StoredChatThread[]): void;\n loadActiveThreadId?(): string | null;\n saveActiveThreadId?(threadId: string | null): void;\n};\n\nexport type Agents24ReactRuntime = {\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId: () => string;\n storage?: AgentChatStorage;\n};\n\nconst Agents24Context = React.createContext<Agents24ReactRuntime | null>(null);\n\nexport type Agents24ProviderProps = {\n children: React.ReactNode;\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId?: () => string;\n storage?: AgentChatStorage;\n};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage }),\n [client, createAbortController, createId, storage],\n );\n return <Agents24Context.Provider value={value}>{children}</Agents24Context.Provider>;\n}\n\nexport function useAgents24Runtime(): Agents24ReactRuntime {\n const value = React.useContext(Agents24Context);\n if (!value) throw new Error(\"Agents24 hooks must be rendered inside Agents24Provider.\");\n return value;\n}\n\nexport function useAgentClient(): AgentClient {\n return useAgents24Runtime().client;\n}\n","import type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { AgentChatRunState, ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: AgentChatRunState;\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n concurrentEvents: readonly ThreadSummaryEvent[] = [],\n): StoredChatThread[] {\n const currentById = new Map(current.map((thread) => [thread.id, thread]));\n const newest = incoming.map((thread) => preferNewestThreadSummary(currentById.get(thread.id), thread));\n const active = activeThreadId && !incoming.some((thread) => thread.id === activeThreadId)\n ? current.find((thread) => thread.id === activeThreadId)\n : null;\n const base = active?.isHydrated ? [active, ...newest] : newest;\n return concurrentEvents.reduce(applyThreadSummaryEvent, base);\n}\n\nexport function preferNewestThreadSummary(\n current: StoredChatThread | undefined,\n incoming: StoredChatThread,\n): StoredChatThread {\n if (!current?.updated_at || !incoming.updated_at) return incoming;\n const currentTime = Date.parse(current.updated_at);\n const incomingTime = Date.parse(incoming.updated_at);\n return Number.isFinite(currentTime) && Number.isFinite(incomingTime) && currentTime > incomingTime\n ? current : incoming;\n}\n\n/** Adopt the server-created thread without reloading the in-memory transcript. */\nexport function adoptStreamingThread(\n state: AgentChatState,\n threadId: string,\n): AgentChatState {\n const normalizedThreadId = threadId.trim();\n if (!normalizedThreadId || state.activeThreadId) return state;\n const existing = state.threads.find((thread) => thread.id === normalizedThreadId);\n const adopted: StoredChatThread = existing\n ? { ...existing, messages: state.messages, isHydrated: true }\n : {\n id: normalizedThreadId,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages: state.messages,\n isHydrated: true,\n };\n return {\n ...state,\n activeThreadId: normalizedThreadId,\n threads: existing\n ? state.threads.map((thread) => thread.id === normalizedThreadId ? adopted : thread)\n : [adopted, ...state.threads],\n };\n}\n\nexport type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n strictMessageId?: boolean;\n update: (message: TMessage) => TMessage;\n};\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage,\n): TMessage[] {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);\n if (!next.some((message) => message.id === assistantMessage.id || Boolean(\n assistantMessage.runId && message.role === \"assistant\" && message.runId === assistantMessage.runId,\n ))) next.push(assistantMessage);\n return next;\n}\n\n/** Keep mounted display keys while matching only durable IDs and run linkage. */\nexport function preserveMountedMessageIds(\n canonical: ChatMessage[],\n current: ChatMessage[],\n): ChatMessage[] {\n return canonical.map((message) => {\n const mounted = current.find((item) => item.role === message.role && (\n item.durableId === message.id || item.id === message.id\n || (message.role === \"assistant\" && message.segmentIndex === 1 && item.runId\n && item.runId === message.runId && !item.durableId)\n ));\n return mounted && mounted.id !== message.id\n ? { ...message, id: mounted.id, durableId: message.id }\n : message;\n });\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>,\n): TMessage[] {\n const next = [...messages];\n for (const baseMessage of input.baseMessages || []) {\n const isTarget = baseMessage.role === \"assistant\" && (\n Boolean(input.messageId && baseMessage.id === input.messageId)\n || Boolean(!input.strictMessageId && input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const exactIndex = next.findIndex((message) => message.role === \"assistant\" && Boolean(input.messageId && message.id === input.messageId));\n const index = exactIndex >= 0 ? exactIndex : input.strictMessageId ? -1 : next.findIndex((message) =>\n message.role === \"assistant\" && Boolean(input.runId && message.runId === input.runId));\n if (index === -1) next.push(input.create());\n else next[index] = input.update(next[index]);\n return next;\n}\n\nfunction appendAssistantDelta(\n parts: ChatMessage[\"parts\"],\n delta: string,\n fallbackPartId: string,\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n const trailing = next[next.length - 1];\n if (trailing?.kind === \"text\") {\n next[next.length - 1] = { ...trailing, text: `${trailing.text}${delta}` };\n return next;\n }\n next.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: delta });\n return next;\n}\n\nfunction upsertResponseBlockParts(\n parts: ChatMessage[\"parts\"],\n incoming: ChatMessage[\"parts\"],\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n for (const part of incoming) {\n const index = next.findIndex((current) => current.id === part.id);\n if (index === -1) next.push(part);\n else next[index] = part;\n }\n return next;\n}\n\nfunction reconcileModelTurnParts(\n parts: ChatMessage[\"parts\"],\n event: RuntimeEvent,\n): ChatMessage[\"parts\"] {\n const eventName = String(event.event || \"\");\n const payload = event.payload || {};\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const modelTurnId = typeof payload.model_turn_id === \"string\" ? payload.model_turn_id : null;\n let next = parts;\n\n if (eventName === \"run.snapshot\" || terminal) {\n next = next.filter((part) => part.kind !== \"model-turn\");\n } else if (eventName === \"assistant.delta\" && typeof payload.content === \"string\" && payload.content) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (eventName.startsWith(\"tool.\") || eventName === \"node.status.updated\") {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (\n (eventName === \"model.turn.failed\" || (eventName === \"model.turn.completed\" && payload.outcome !== \"tool_calls\"))\n && modelTurnId\n ) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.modelTurnId !== modelTurnId);\n }\n\n const active = modelTurnPartFromEvent(event);\n return active ? upsertResponseBlockParts(next, [active]) : next;\n}\n\nexport function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const runId = event.run_id || state.activeRunId;\n const segmentId = typeof event.payload?.segment_id === \"string\" ? event.payload.segment_id : null;\n const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);\n const messageId = distinctSegment\n ? `${runId || \"run\"}-assistant-${segmentId}`\n : state.streamingMessageId || `${runId || \"run\"}-assistant`;\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const paused = eventName === \"run.paused\" || projection.parts.some((part) => part.kind === \"hitl\" && part.status === \"pending\");\n const suspension = eventName === \"run.waiting\" ? \"waiting\" : eventName === \"run.interrupted\" ? \"interrupted\" : null;\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && message.id === messageId)\n || (!distinctSegment ? state.messages.find((message) => message.role === \"assistant\" && Boolean(runId && message.runId === runId)) : undefined);\n const payload = event.payload || {};\n const eventThreadId = typeof payload.thread_id === \"string\" && payload.thread_id.trim()\n ? payload.thread_id.trim()\n : null;\n const contextApplies = (\n (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId)\n && (!state.activeRunId || !runId || runId === state.activeRunId)\n );\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, payload.context_window)\n : state.contextWindow;\n const explicitCompression = contextApplies\n ? normalizeContextCompression(payload.context_compression)\n : null;\n const contextCompression = contextApplies\n ? explicitCompression || compressionFromContextWindow(contextWindow) || state.contextCompression\n : state.contextCompression;\n const hasLiveCompressionUpdate = Boolean(\n contextApplies\n && (\n explicitCompression?.active\n || compressionFromContextWindow(\n mergeContextWindowUpdate(null, payload.context_window),\n )?.active\n )\n );\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const hasCanonicalResponseBlocks = Array.isArray(payload.response_blocks);\n const content = hasCanonicalResponseBlocks\n ? projection.content\n : delta\n ? `${existing?.content || \"\"}${delta}`\n : projection.content || existing?.content || \"\";\n const projectedParts = hasCanonicalResponseBlocks\n ? projection.parts\n : delta\n ? appendAssistantDelta(\n existing?.parts || [],\n delta,\n `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(projectedParts, event);\n const compressionPart = contextApplies && explicitCompression?.active\n ? contextCompressionPartFromEvent(event, lifecycleParts)\n : null;\n const parts = compressionPart\n ? upsertResponseBlockParts(lifecycleParts, [compressionPart])\n : lifecycleParts;\n const activeThreadId = eventThreadId || state.activeThreadId;\n const messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n strictMessageId: distinctSegment,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || message.isFinal,\n }),\n });\n const threads = activeThreadId\n ? state.threads.some((thread) => thread.id === activeThreadId)\n ? state.threads.map((thread) => thread.id === activeThreadId\n ? {\n ...thread,\n messages,\n isHydrated: true,\n last_run_id: runId ?? thread.last_run_id,\n contextWindow,\n contextCompression,\n }\n : thread)\n : [{\n id: activeThreadId,\n title: null,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages,\n isHydrated: true,\n last_run_id: runId,\n contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n messages,\n threads,\n contextWindow,\n contextCompression,\n contextCompressionRevision: hasLiveCompressionUpdate\n ? state.contextCompressionRevision + 1\n : state.contextCompressionRevision,\n runState: suspension || (paused\n ? \"paused\"\n : cancelling\n ? \"cancelling\"\n : terminal\n ? eventName === \"run.completed\"\n ? \"completed\"\n : eventName === \"run.cancelled\"\n ? \"cancelled\"\n : \"failed\"\n : \"streaming\"),\n streamingMessageId: terminal || paused || suspension ? null : messageId,\n };\n}\n\nexport function applyRuntimeEvents(\n state: AgentChatState,\n events: readonly RuntimeEvent[],\n): AgentChatState {\n return events.reduce(applyRuntimeEvent, state);\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\n if (String(event.event) === \"thread.task.updated\") {\n const value = event as unknown as { thread_id: string; task: Record<string, unknown> };\n const handle = value.task?.handle;\n if (typeof handle !== \"string\") return threads;\n return threads.map(thread => thread.id === value.thread_id ? { ...thread,\n taskNotifications: [...(thread.taskNotifications || []).filter(task => task.handle !== handle),\n { ...value.task, handle }].slice(-1000) } : thread);\n }\n if (event.event === \"snapshot_required\") return threads;\n if (event.event === \"thread.deleted\") return threads.filter((thread) => thread.id !== event.thread_id);\n if (event.event !== \"thread.summary.updated\") return threads;\n const incoming = event.thread as StoredChatThread;\n const index = threads.findIndex((thread) => thread.id === incoming.id);\n if (index === -1) return [{ ...incoming, messages: incoming.messages || [], isHydrated: false }, ...threads];\n const next = [...threads];\n next[index] = preferNewestThreadSummary(next[index], {\n ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated,\n });\n return next;\n}\n","import * as React from \"react\";\nimport type {\n ThreadMessage, ThreadMessageInput, ThreadMessageQueueState,\n ThreadMessageSubmission, ThreadMessagesPage,\n} from \"@agents24/client\";\n\nexport type ThreadMessageNotice = {\n messageId: string;\n status: string;\n runId: string | null;\n cursor?: number;\n};\n\nexport type ThreadMessageQueueTransport = {\n list(threadId: string): Promise<ThreadMessagesPage>;\n submit(input: ThreadMessageInput): Promise<ThreadMessageSubmission>;\n edit(message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }): Promise<ThreadMessage>;\n remove(message: ThreadMessage): Promise<void>;\n resume(threadId: string): Promise<{ run_id: string | null }>;\n};\n\nexport type RetractedMessageDraft = Pick<ThreadMessage, \"text\" | \"attachment_ids\" | \"attachments\">;\n\nexport function useThreadMessageQueue({ threadId, transport, onPromoted }: {\n threadId: string | null;\n transport: ThreadMessageQueueTransport;\n onPromoted: (message: ThreadMessage, runId: string) => void;\n}) {\n const [pendingMessages, setPendingMessages] = React.useState<readonly ThreadMessage[]>([]);\n const [messageQueue, setMessageQueue] = React.useState<ThreadMessageQueueState | null>(null);\n const pendingRef = React.useRef(new Map<string, ThreadMessage>());\n const versionRef = React.useRef(0);\n const cursorRef = React.useRef(0);\n const promotedRef = React.useRef(new Set<string>());\n const threadRef = React.useRef(threadId);\n const transportRef = React.useRef(transport);\n const onPromotedRef = React.useRef(onPromoted);\n threadRef.current = threadId;\n transportRef.current = transport;\n onPromotedRef.current = onPromoted;\n\n const hydrate = React.useCallback((page: ThreadMessagesPage, selectedThreadId: string) => {\n if (threadRef.current !== selectedThreadId) return;\n const pending = page.pending.filter((message) => !promotedRef.current.has(message.id));\n for (const message of pending) pendingRef.current.set(message.id, message);\n setPendingMessages(pending);\n setMessageQueue(page.queue);\n }, []);\n\n const refresh = React.useCallback(async (selectedThreadId = threadRef.current) => {\n if (!selectedThreadId) return null;\n const version = ++versionRef.current;\n const page = await transportRef.current.list(selectedThreadId);\n if (version !== versionRef.current || threadRef.current !== selectedThreadId) return null;\n for (const item of page.items) {\n if (item.role === \"user\" && item.status === \"delivered\" && item.run_id) {\n const pending = pendingRef.current.get(item.id);\n if (pending && !promotedRef.current.has(item.id)) {\n promotedRef.current.add(item.id);\n pendingRef.current.delete(item.id);\n onPromotedRef.current(pending, item.run_id);\n }\n }\n }\n hydrate(page, selectedThreadId);\n return page;\n }, [hydrate]);\n\n const acceptNotice = React.useCallback((notice: ThreadMessageNotice) => {\n if (notice.cursor && notice.cursor <= cursorRef.current) return false;\n if (notice.cursor) cursorRef.current = notice.cursor;\n const pending = pendingRef.current.get(notice.messageId);\n if (notice.status === \"delivered\" && notice.runId && pending && !promotedRef.current.has(pending.id)) {\n promotedRef.current.add(pending.id);\n pendingRef.current.delete(pending.id);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((message) => message.id !== pending.id));\n onPromotedRef.current(pending, notice.runId);\n }\n if (notice.status === \"removed\") pendingRef.current.delete(notice.messageId);\n void refresh().catch(() => undefined);\n return true;\n }, [refresh]);\n\n const submit = React.useCallback(async (input: Omit<ThreadMessageInput, \"threadId\">) => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) throw new Error(\"No active Agent thread is available.\");\n const result = await transportRef.current.submit({ ...input, threadId: selectedThreadId });\n if (threadRef.current !== selectedThreadId) return result;\n versionRef.current += 1;\n if (!result.run_id && [\"queued\", \"steer_pending\", \"blocked\"].includes(result.status)) {\n const now = new Date().toISOString();\n const pending: ThreadMessage = {\n id: result.message_id, thread_id: selectedThreadId, sequence: Number.MAX_SAFE_INTEGER,\n run_id: null, turn_id: null, segment_index: null, role: \"user\", status: result.status,\n requested_mode: input.mode, text: input.input, attachment_ids: input.attachmentIds || [],\n response_blocks: [], revision: 1, created_at: now, updated_at: now,\n };\n pendingRef.current.set(pending.id, pending);\n setPendingMessages((current) => current.some((message) => message.id === pending.id)\n ? current : [...current, pending]);\n setMessageQueue((current) => ({ pending_count: Math.max(current?.pending_count || 0, result.queue_position || 1),\n paused: current?.paused || false, reason: current?.reason || null }));\n }\n void refresh().catch(() => undefined);\n return result;\n }, [refresh]);\n\n const edit = React.useCallback(async (message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }) => {\n const updated = await transportRef.current.edit(message, input);\n versionRef.current += 1;\n pendingRef.current.set(updated.id, updated);\n await refresh(message.thread_id);\n return updated;\n }, [refresh]);\n\n const remove = React.useCallback(async (message: ThreadMessage) => {\n await transportRef.current.remove(message);\n versionRef.current += 1;\n pendingRef.current.delete(message.id);\n setPendingMessages((current) => current.filter((item) => item.id !== message.id));\n await refresh(message.thread_id);\n }, [refresh]);\n\n const retractForEdit = React.useCallback(async (message: ThreadMessage): Promise<RetractedMessageDraft> => {\n await remove(message);\n return { text: message.text, attachment_ids: message.attachment_ids, attachments: message.attachments };\n }, [remove]);\n\n const resume = React.useCallback(async () => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) return null;\n const result = await transportRef.current.resume(selectedThreadId);\n await refresh(selectedThreadId);\n return result;\n }, [refresh]);\n\n React.useEffect(() => {\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n pendingRef.current.clear();\n setPendingMessages([]);\n setMessageQueue(null);\n if (threadId) void refresh(threadId).catch(() => undefined);\n }, [threadId, refresh]);\n\n React.useEffect(() => {\n if (!threadId || !pendingMessages.length || messageQueue?.paused) return;\n const clock = globalThis as typeof globalThis & {\n setInterval(callback: () => void, interval: number): unknown;\n clearInterval(timer: unknown): void;\n };\n const timer = clock.setInterval(() => { void refresh(threadId).catch(() => undefined); }, 3000);\n return () => clock.clearInterval(timer);\n }, [threadId, pendingMessages.length, messageQueue?.paused, refresh]);\n\n return { pendingMessages, messageQueue, refresh, hydrate, acceptNotice, submit, edit, remove, retractForEdit, resume };\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n RuntimeEvent,\n ThreadMessage,\n ThreadMessageQueueState,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadDetailToMessages,\n threadTimelineToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport { subscribeToThreadSummaries } from \"./thread-summary-subscription\";\nimport { summaryToStored, useAgentChatThreadList } from \"./use-agent-chat-thread-list\";\nimport { useAgentChatFeedback } from \"./use-agent-chat-feedback\";\nimport { useAgentChatQueueActions } from \"./use-agent-chat-queue-actions\";\nimport { useThreadMessageQueue, type RetractedMessageDraft, type ThreadMessageQueueTransport } from \"./thread-message-queue\";\nimport {\n isCurrentThreadOpenRequest,\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n appendStableStreamingTurn,\n preserveMountedMessageIds,\n adoptStreamingThread,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n uploads?: readonly PortableUpload[];\n requestedModelId?: string;\n requestedAgentId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n};\n\nexport type AgentChatController = AgentChatState & {\n pendingMessages: readonly ThreadMessage[];\n messageQueue: ThreadMessageQueueState | null;\n activeThread: StoredChatThread | null;\n hasOlderTurns: boolean;\n hasMoreThreads: boolean;\n isLoadingHistory: boolean;\n isLoadingMoreThreads: boolean;\n isLoadingOlder: boolean;\n isLoadingThreads: boolean;\n isSubmitting: boolean;\n attachRun(runId: string, cursor?: number): Promise<void>;\n cancelRun(): Promise<void>;\n clearBackgroundError(): void;\n clearOperationError(operation?: AgentChatOperation): void;\n deleteThread(threadId: string): Promise<void>;\n detach(): void;\n loadOlder(): Promise<void>;\n loadMoreThreads(): Promise<void>;\n openThread(threadId: string): Promise<void>;\n refreshThreads(): Promise<void>;\n regenerate(message: ChatMessage): Promise<void>;\n refreshMessages(threadId?: string): Promise<void>;\n editPendingMessage(message: ThreadMessage, input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">): Promise<void>;\n steerPendingMessage(message: ThreadMessage): Promise<void>;\n removePendingMessage(message: ThreadMessage): Promise<void>;\n retractPendingMessage(message: ThreadMessage): Promise<RetractedMessageDraft>;\n resumeQueue(): Promise<void>;\n steer(text: string): Promise<void>;\n resumeHitl(part: ChatHitlPart, response: HitlResponse): Promise<void>;\n setFeedback(\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ): Promise<void>;\n startNewThread(): void;\n submit(input: AgentChatSubmitInput): Promise<void>;\n};\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const activity = getThreadActivity(thread);\n return activity.isSpinning ? activity.runId : null;\n}\n\nexport function useAgentChat(options: UseAgentChatOptions = {}): AgentChatController {\n const runtime = useAgents24Runtime();\n const client = options.client || runtime.client;\n const pageSize = options.pageSize ?? 30;\n const threadPageSize = options.threadPageSize ?? 50;\n const [state, setState] = React.useState<AgentChatState>(() => ({\n ...initialAgentChatState,\n activeThreadId: resolveInitialActiveThreadId(\n options,\n runtime.storage?.loadActiveThreadId?.() ?? null,\n ),\n threads: runtime.storage?.loadThreads() ?? [],\n }));\n const [isLoadingHistory, setIsLoadingHistory] = React.useState(false);\n const [isLoadingOlder, setIsLoadingOlder] = React.useState(false);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const streamControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenGenerationRef = React.useRef(0);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const messageRefreshVersionRef = React.useRef(0);\n const promotedRunHintRef = React.useRef<string | null>(null);\n const promotedAttachRef = React.useRef<string | null>(null);\n const firstSubmissionRef = React.useRef<Promise<void> | null>(null);\n const firstSubmissionAdmittedRef = React.useRef<(() => void) | null>(null);\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const persist = React.useCallback((next: AgentChatState) => {\n runtime.storage?.saveThreads(next.threads);\n runtime.storage?.saveActiveThreadId?.(next.activeThreadId);\n }, [runtime.storage]);\n\n const update = React.useCallback((updater: (current: AgentChatState) => AgentChatState) => {\n setState((current) => {\n const next = updater(current);\n stateRef.current = next;\n persist(next);\n return next;\n });\n }, [persist]);\n\n const queueTransport = React.useMemo<ThreadMessageQueueTransport>(() => ({\n list: (threadId) => client.threads.messages.list({ threadId, limit: pageSize }),\n submit: (input) => client.threads.messages.submit(input),\n edit: (message, input) => client.threads.messages.edit({\n threadId: message.thread_id, messageId: message.id, revision: message.revision,\n input: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids, mode: input.mode,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n }),\n remove: async (message) => {\n await client.threads.messages.remove({ threadId: message.thread_id, messageId: message.id, revision: message.revision });\n },\n resume: (threadId) => client.threads.resumeQueue({ threadId }),\n }), [client, pageSize]);\n const onQueuePromotion = React.useCallback((message: ThreadMessage, runId: string) => {\n if (stateRef.current.activeThreadId !== message.thread_id) return;\n promotedRunHintRef.current = runId;\n const userMessage = threadTimelineToMessages([{ ...message, run_id: runId, status: \"delivered\" }])[0];\n update((current) => current.activeThreadId === message.thread_id\n && !current.messages.some((item) => item.id === userMessage.id)\n ? { ...current, messages: [...current.messages, userMessage] } : current);\n if (stateRef.current.activeRunId !== runId && promotedAttachRef.current !== runId) {\n promotedAttachRef.current = runId;\n void attachRunRef.current(runId).catch(() => { promotedAttachRef.current = null; });\n }\n }, [update]);\n const queue = useThreadMessageQueue({ threadId: state.activeThreadId, transport: queueTransport, onPromoted: onQueuePromotion });\n const { pendingMessages, messageQueue } = queue;\n\n const eventBuffer = React.useMemo(\n () => createRuntimeEventFrameBuffer(\n (events) => update((current) => applyRuntimeEvents(current, events)),\n runtimeEventFrameScheduler(),\n ),\n [update],\n );\n\n const clearOperationError = React.useCallback((operation?: AgentChatOperation) => {\n update((current) => clearAgentChatOperationError(current, operation));\n }, [update]);\n\n const clearBackgroundError = React.useCallback(() => {\n update(clearAgentChatBackgroundError);\n }, [update]);\n\n const failOperation = React.useCallback((operation: AgentChatOperation, cause: unknown) => {\n update((current) => withAgentChatOperationError(current, operation, cause));\n }, [update]);\n\n const { isLoadingThreads, isLoadingMoreThreads, threadTotal,\n eventsDuringRefreshRef: threadEventsDuringRefreshRef, refreshThreads, loadMoreThreads,\n } = useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation });\n\n const invalidateThreadOpen = React.useCallback(() => {\n threadOpenGenerationRef.current += 1;\n threadOpenControllerRef.current?.abort(\"Thread selection changed.\");\n threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }, []);\n\n const detach = React.useCallback(() => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [eventBuffer, update]);\n\n const refreshMessages = React.useCallback(async (threadId?: string, promotedRunId?: string) => {\n const target = threadId || stateRef.current.activeThreadId;\n if (!target) return;\n const version = ++messageRefreshVersionRef.current;\n const page = await client.threads.messages.list({ threadId: target, limit: pageSize });\n if (stateRef.current.activeThreadId !== target || version !== messageRefreshVersionRef.current) return;\n queue.hydrate(page, target);\n const promoted = promotedRunId || promotedRunHintRef.current;\n if (promoted && page.items.some((message) => message.role === \"user\" && message.run_id === promoted)) {\n promotedRunHintRef.current = null;\n update((current) => {\n if (current.activeThreadId !== target) return current;\n const canonical = preserveMountedMessageIds(threadTimelineToMessages(page.items), current.messages);\n const canonicalIds = new Set(canonical.map((message) => message.id));\n const older = current.messages.filter((message) => !canonicalIds.has(message.id)\n && message.id !== current.streamingMessageId);\n const live = current.activeRunId === promoted\n ? current.messages.filter((message) => message.id === current.streamingMessageId)\n : [];\n return {\n ...current,\n messages: [...older, ...canonical, ...live.filter((message) => !canonicalIds.has(message.id))],\n streamingMessageId: live.length ? current.streamingMessageId : null,\n };\n });\n return;\n }\n if (stateRef.current.activeRunId) {\n const delivered = threadTimelineToMessages(page.items.filter((item) =>\n item.role === \"user\" && item.run_id === stateRef.current.activeRunId && (item.segment_index ?? 0) > 0));\n if (delivered.length) update((current) => {\n if (current.activeThreadId !== target) return current;\n const additions = delivered.filter((item) => !current.messages.some((existing) => existing.id === item.id));\n return additions.length ? { ...current, messages: [...current.messages, ...additions] } : current;\n });\n }\n if (!stateRef.current.activeRunId && page.items.length) {\n update((current) => current.activeThreadId === target && !current.activeRunId\n ? (() => {\n const messages = preserveMountedMessageIds(threadTimelineToMessages(page.items), current.messages);\n return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };\n })()\n : current);\n }\n }, [client, pageSize, queue.hydrate, update]);\n\n React.useEffect(() => () => {\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n threadOpenControllerRef.current?.abort();\n const requestController = runtime.createAbortController();\n threadOpenControllerRef.current = requestController;\n const requestGeneration = threadOpenGenerationRef.current + 1;\n threadOpenGenerationRef.current = requestGeneration;\n detach();\n clearOperationError();\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n activeRunId: null,\n cursor: null,\n error: null,\n messages: current.threads.find((thread) => thread.id === threadId)?.messages || [],\n contextWindow: current.threads.find((thread) => thread.id === threadId)?.contextWindow || null,\n contextCompression: current.threads.find((thread) => thread.id === threadId)?.contextCompression || null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n streamingMessageId: null,\n }));\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n const timeline = await client.threads.messages.list({ threadId, limit: pageSize, signal: requestController.signal });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n queue.hydrate(timeline, threadId);\n const messages = timeline.items.length ? threadTimelineToMessages(timeline.items, detail) : threadDetailToMessages(detail);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(detail.paging?.has_more),\n nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null,\n ...context,\n };\n update((current) => isCurrentThreadOpenRequest({\n activeThreadId: current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n }) ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\n threads: current.threads.some((thread) => thread.id === threadId)\n ? current.threads.map((thread) => thread.id === threadId ? stored : thread)\n : [stored, ...current.threads],\n } : current);\n const activeRunId = activeRunIdFromThread(stored);\n if (\n activeRunId\n && isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })\n ) await attachRunRef.current(activeRunId).catch(() => undefined);\n } catch (error) {\n if (!requestController.signal.aborted && !isAbortLike(error) && requestGeneration === threadOpenGenerationRef.current) {\n failOperation(\"open_thread\", error);\n update((current) => restoreAgentChatThreadSelection(current, previousSelection));\n if (previousSelection.activeRunId) {\n void attachRunRef.current(previousSelection.activeRunId, previousSelection.cursor ?? undefined).catch(() => undefined);\n }\n throw error;\n }\n } finally {\n if (requestGeneration === threadOpenGenerationRef.current) {\n if (threadOpenControllerRef.current === requestController) threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }\n }\n }, [clearOperationError, client, detach, failOperation, pageSize, queue.hydrate, runtime, update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n if (event.event === \"run.accepted\" && !stateRef.current.activeThreadId\n && typeof event.payload?.message_id === \"string\") {\n const durableId = event.payload.message_id;\n update((current) => ({ ...current, messages: current.messages.map((message) =>\n message.role === \"user\" && !message.runId && !message.durableId\n ? { ...message, durableId, runId: event.run_id }\n : message.role === \"assistant\" && !message.runId\n ? { ...message, runId: event.run_id }\n : message),\n }));\n }\n const eventThreadId = typeof event.payload?.thread_id === \"string\"\n ? event.payload.thread_id.trim()\n : \"\";\n if (eventThreadId && !stateRef.current.activeThreadId) {\n update((current) => adoptStreamingThread(current, eventThreadId));\n firstSubmissionAdmittedRef.current?.();\n }\n eventBuffer.push(event);\n }, [eventBuffer, update]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n clearOperationError();\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, signal: controller.signal }, consumeEvent);\n eventBuffer.flush();\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (!result.detached && result.threadId) await refreshMessages(result.threadId);\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", streamingMessageId: null }));\n failOperation(\"attach_run\", error);\n throw error;\n }\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, eventBuffer, failOperation, refreshMessages, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;\n if (firstSubmissionRef.current && !stateRef.current.activeThreadId) {\n await firstSubmissionRef.current;\n }\n const existingThreadId = stateRef.current.activeThreadId;\n if (existingThreadId) {\n clearOperationError();\n setIsSubmitting(true);\n try {\n const uploaded = input.uploads?.length\n ? await client.attachments.uploadBatch({\n uploads: input.uploads,\n threadId: existingThreadId,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n })\n : [];\n const result = await queue.submit({\n mode: \"queue\",\n input: input.text.trim(),\n attachmentIds: uploaded.length ? uploaded.map((item) => item.id) : input.attachmentIds,\n requestedAgentId: input.requestedAgentId,\n requestedModelId: input.requestedModelId,\n idempotencyKey: runtime.createId(),\n });\n if (stateRef.current.activeThreadId !== existingThreadId) return;\n if (result.run_id) {\n const userMessage: ChatMessage = {\n id: result.message_id, role: \"user\", runId: result.run_id,\n content: input.text.trim(), createdAt: new Date().toISOString(),\n isFinal: true,\n parts: input.text.trim() ? [{ id: `${result.message_id}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [],\n attachments: input.attachments || [],\n };\n update((current) => current.activeThreadId !== existingThreadId\n || current.messages.some((message) => message.id === userMessage.id)\n ? current : { ...current, messages: [...current.messages, userMessage] });\n }\n void refreshMessages(existingThreadId).catch(() => undefined);\n if (result.run_id && promotedAttachRef.current !== result.run_id\n && stateRef.current.activeRunId !== result.run_id) {\n void attachRunRef.current(result.run_id).catch(() => undefined);\n }\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n return;\n }\n const admission = new Promise<void>((resolve) => { firstSubmissionAdmittedRef.current = resolve; });\n const stream = (async () => {\n invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const userId = runtime.createId();\n const assistantId = runtime.createId();\n const idempotencyKey = runtime.createId();\n const optimisticAttachments = input.attachments?.length\n ? input.attachments\n : input.uploads?.map((upload, index) => ({\n id: `${userId}-attachment-${index}`,\n filename: upload.name,\n mediaType: upload.mediaType,\n status: \"uploading\",\n }));\n const userMessage: ChatMessage = { id: userId, role: \"user\", content: input.text.trim(), createdAt: new Date().toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [], attachments: optimisticAttachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n update((current) => ({\n ...current,\n messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage),\n streamingMessageId: assistantId,\n runState: hasPendingUploads ? \"uploading\" : \"streaming\",\n error: null,\n }));\n setIsSubmitting(true);\n let streamStarted = false;\n try {\n const uploaded = hasPendingUploads\n ? await client.attachments.uploadBatch({\n uploads: input.uploads || [],\n threadId: stateRef.current.activeThreadId || undefined,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n signal: controller.signal,\n })\n : [];\n if (hasPendingUploads && uploaded.length !== input.uploads?.length) {\n throw new Error(\"Attachment upload returned an incomplete batch\");\n }\n const resolvedAttachments = uploaded.length\n ? uploaded.map(attachmentResultToChatAttachment)\n : input.attachments;\n const attachmentIds = uploaded.length\n ? uploaded.map((attachment) => attachment.id)\n : input.attachmentIds;\n if (uploaded.length) {\n update((current) => ({\n ...current,\n messages: current.messages.map((message) => message.id === userId\n ? { ...message, attachments: resolvedAttachments }\n : message),\n runState: \"streaming\",\n }));\n }\n streamStarted = true;\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);\n eventBuffer.flush();\n update((current) => {\n const threadId = result.threadId || current.activeThreadId;\n return {\n ...current,\n activeThreadId: threadId,\n activeRunId: result.detached ? result.runId : current.activeRunId,\n cursor: result.cursor,\n runState: result.detached ? \"reconnecting\" : current.runState,\n threads: threadId\n ? current.threads.map((thread) => thread.id === threadId\n ? { ...thread, messages: current.messages, isHydrated: true }\n : thread)\n : current.threads,\n };\n });\n if (result.threadId) await refreshThreads().catch(() => undefined);\n if (result.threadId && !result.detached) await refreshMessages(result.threadId);\n } catch (error) {\n if (isAbortLike(error) && !streamStarted) {\n update((current) => current.streamingMessageId === assistantId\n ? {\n ...current,\n messages: current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"idle\",\n streamingMessageId: null,\n }\n : current);\n } else if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n messages: streamStarted\n ? current.messages\n : current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"failed\",\n streamingMessageId: null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n })();\n const accepted = Promise.race([stream, admission]);\n firstSubmissionRef.current = accepted;\n try {\n await accepted;\n } finally {\n if (firstSubmissionRef.current === accepted) firstSubmissionRef.current = null;\n firstSubmissionAdmittedRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, queue.submit, refreshMessages, refreshThreads, runtime, update]);\n\n const { steer, editPendingMessage, steerPendingMessage, removePendingMessage, resumeQueue } =\n useAgentChatQueueActions({ queue, stateRef, createId: runtime.createId, clearOperationError,\n failOperation, refreshMessages, attachRun });\n\n const startNewThread = React.useCallback(() => {\n invalidateThreadOpen();\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, invalidateThreadOpen, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n if (stateRef.current.activeThreadId === threadId) invalidateThreadOpen();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({\n ...current,\n activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId,\n messages: current.activeThreadId === threadId ? [] : current.messages,\n contextWindow: current.activeThreadId === threadId ? null : current.contextWindow,\n contextCompression: current.activeThreadId === threadId ? null : current.contextCompression,\n contextCompressionRevision: current.activeThreadId === threadId ? 0 : current.contextCompressionRevision,\n threads: current.threads.filter((thread) => thread.id !== threadId),\n }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, invalidateThreadOpen, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\n const previousRunState = stateRef.current.runState;\n clearOperationError();\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: \"cancelling\" }\n : current\n ));\n try {\n const result = await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n if (result.status === \"cancelled\") {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: \"cancelled\",\n streamingMessageId: null,\n }));\n } else if (result.status === \"cancelling\") {\n update((current) => ({\n ...current,\n activeRunId: runId,\n runState: \"cancelling\",\n }));\n } else {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: result.status === \"completed\" ? \"completed\" : \"failed\",\n streamingMessageId: null,\n }));\n }\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: previousRunState }\n : current\n ));\n failOperation(\"cancel_run\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, detach, failOperation, runtime, update]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n clearOperationError();\n if (!runId) {\n const error = new Error(\"No paused run is available to resume.\");\n failOperation(\"resume_hitl\", error);\n throw error;\n }\n try {\n const result = await client.hitl.resume({\n runId,\n interruptId: part.interruptId,\n ...response,\n idempotencyKey: runtime.createId(),\n });\n await attachRun(result.run_id || runId);\n } catch (error) {\n if (!isAbortLike(error)) failOperation(\"resume_hitl\", error);\n throw error;\n }\n }, [attachRun, clearOperationError, client, failOperation, runtime]);\n\n const setFeedback = useAgentChatFeedback({ client, update, clearOperationError, failOperation });\n\n const loadOlder = React.useCallback(async () => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (!thread?.nextBeforeTurnIndex) return;\n clearOperationError();\n setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex });\n const older = threadDetailToMessages(detail);\n update((current) => ({ ...current, messages: [...older, ...current.messages.filter((message) => !older.some((item) => item.id === message.id))], threads: current.threads.map((item) => item.id === thread.id ? { ...item, hasOlderTurns: Boolean(detail.paging?.has_more), nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null } : item) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_older_turns\", error);\n throw error;\n }\n } finally { setIsLoadingOlder(false); }\n }, [clearOperationError, client, failOperation, pageSize, update]);\n\n const regenerate = React.useCallback(async (message: ChatMessage) => {\n const index = stateRef.current.messages.findIndex((item) => item.id === message.id);\n const user = stateRef.current.messages.slice(0, index).reverse().find((item) => item.role === \"user\");\n if (user) await submit({\n text: user.content,\n attachmentIds: chatAttachmentIds(user.attachments),\n attachments: user.attachments,\n });\n }, [submit]);\n\n React.useEffect(() => {\n const controller = runtime.createAbortController();\n clearBackgroundError();\n void subscribeToThreadSummaries({\n client,\n signal: controller.signal,\n refresh: refreshThreads,\n onEvent(event) {\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n if (event.event === \"thread.message.updated\" && event.thread_id === stateRef.current.activeThreadId) {\n const wasQueued = queue.acceptNotice({ messageId: event.message_id,\n status: event.status, runId: event.run_id, cursor: event.cursor });\n if (wasQueued) void refreshMessages(event.thread_id, event.run_id || undefined).catch(() => undefined);\n }\n if (event.event === \"thread.summary.updated\" && event.thread.id === stateRef.current.activeThreadId) {\n if (streamControllerRef.current && stateRef.current.messages.some((message) =>\n message.role === \"user\" && !message.runId)) return;\n const promotedRunId = activeRunIdFromThread(summaryToStored(event.thread));\n void (async () => {\n await refreshMessages(String(event.thread.id), promotedRunId || undefined);\n if (promotedRunId && stateRef.current.activeRunId !== promotedRunId\n && stateRef.current.activeThreadId === String(event.thread.id)\n && promotedAttachRef.current !== promotedRunId) {\n promotedAttachRef.current = promotedRunId;\n await attachRunRef.current(promotedRunId);\n }\n })().catch(() => undefined);\n }\n },\n onError(error) {\n update((current) => withAgentChatBackgroundError(current, error));\n },\n onRecovered() {\n clearBackgroundError();\n },\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, queue.acceptNotice, refreshMessages, refreshThreads, runtime.createAbortController, update]);\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n const activeThread = stateRef.current.threads.find((thread) => thread.id === stateRef.current.activeThreadId);\n if (shouldHydrateSelectedThread(threadId, stateRef.current.activeThreadId, Boolean(activeThread?.isHydrated))) {\n void openThread(threadId as string).catch(() => undefined);\n }\n }, [openThread, options.activeThreadId]);\n\n const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId) || null;\n const hasMoreThreads = threadTotal === undefined\n ? state.threads.length >= threadPageSize\n : state.threads.length < threadTotal;\n return {\n ...state,\n activeThread,\n pendingMessages,\n messageQueue,\n hasOlderTurns: Boolean(activeThread?.hasOlderTurns),\n hasMoreThreads,\n isLoadingHistory,\n isLoadingMoreThreads,\n isLoadingOlder,\n isLoadingThreads,\n isSubmitting,\n attachRun,\n cancelRun,\n clearBackgroundError,\n clearOperationError,\n deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n refreshMessages,\n editPendingMessage,\n steerPendingMessage,\n removePendingMessage,\n retractPendingMessage: queue.retractForEdit,\n resumeQueue,\n steer,\n resumeHitl,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { RuntimeEvent } from \"@agents24/client\";\n\nexport type RuntimeEventFrameScheduler = (callback: () => void) => () => void;\n\nexport type RuntimeEventFrameBuffer = {\n dispose(): void;\n flush(): void;\n push(event: RuntimeEvent): void;\n};\n\ntype AnimationFrameRuntime = {\n cancelAnimationFrame?: (handle: number) => void;\n requestAnimationFrame?: (callback: () => void) => number;\n};\n\nexport function runtimeEventFrameScheduler(): RuntimeEventFrameScheduler | undefined {\n const runtime = globalThis as AnimationFrameRuntime;\n if (typeof runtime.requestAnimationFrame !== \"function\") return undefined;\n return (callback) => {\n const handle = runtime.requestAnimationFrame?.(callback);\n return () => {\n if (handle !== undefined) runtime.cancelAnimationFrame?.(handle);\n };\n };\n}\n\nexport function createRuntimeEventFrameBuffer(\n apply: (events: readonly RuntimeEvent[]) => void,\n scheduleFrame?: RuntimeEventFrameScheduler,\n): RuntimeEventFrameBuffer {\n let pending: RuntimeEvent[] = [];\n let cancelFrame: (() => void) | null = null;\n\n const flush = () => {\n cancelFrame?.();\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n };\n\n return {\n dispose() {\n cancelFrame?.();\n cancelFrame = null;\n pending = [];\n },\n flush,\n push(event) {\n if (event.event !== \"assistant.delta\" || !scheduleFrame) {\n pending.push(event);\n flush();\n return;\n }\n pending.push(event);\n if (cancelFrame) return;\n cancelFrame = scheduleFrame(() => {\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n });\n },\n };\n}\n","import type { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport { isAbortLike } from \"./lifecycle\";\n\ntype ThreadSummarySubscription = {\n client: AgentClient;\n signal: AbortSignalLike;\n onEvent(event: ThreadSummaryEvent): Promise<void> | void;\n onError(error: unknown): void;\n onRecovered(): void;\n refresh(): Promise<void>;\n};\n\nfunction waitForReconnect(signal: AbortSignalLike, delay: number): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, delay: number): unknown;\n clearTimeout(handle: unknown): void;\n };\n const finish = () => {\n clock.clearTimeout(timer);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timer = clock.setTimeout(finish, delay);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\n/** Keep the thread list connected across clean EOFs and transient stream failures. */\nexport async function subscribeToThreadSummaries(input: ThreadSummarySubscription): Promise<void> {\n let cursor: number | undefined;\n let failures = 0;\n while (!input.signal.aborted) {\n let refreshedFromSnapshot = false;\n try {\n await input.client.threads.events({ cursor, signal: input.signal }, async (event) => {\n if (event.event === \"snapshot_required\") {\n await input.refresh();\n cursor = undefined;\n refreshedFromSnapshot = true;\n return;\n }\n cursor = event.cursor;\n failures = 0;\n await input.onEvent(event);\n });\n if (input.signal.aborted) break;\n // A clean EOF can be an expired stream authorization. Reconcile before reconnecting.\n if (!refreshedFromSnapshot) await input.refresh();\n input.onRecovered();\n failures = 0;\n } catch (error) {\n if (input.signal.aborted || isAbortLike(error)) break;\n input.onError(error);\n failures += 1;\n try {\n await input.refresh();\n input.onRecovered();\n } catch (refreshError) {\n if (!input.signal.aborted && !isAbortLike(refreshError)) input.onError(refreshError);\n }\n }\n if (!input.signal.aborted) {\n await waitForReconnect(input.signal, Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5)));\n }\n }\n}\n","import type { AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\nimport { preferNewestThreadSummary, reconcileRefreshedThreads, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nexport function useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation }: {\n client: AgentClient;\n threadPageSize: number;\n stateRef: React.RefObject<AgentChatState>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n const [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\n const refreshPromiseRef = React.useRef<Promise<void> | null>(null);\n const eventsDuringRefreshRef = React.useRef<ThreadSummaryEvent[] | null>(null);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshPromiseRef.current) return refreshPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n eventsDuringRefreshRef.current = [];\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n const concurrentEvents = eventsDuringRefreshRef.current || [];\n eventsDuringRefreshRef.current = null;\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const incoming = result.items.map((item) => {\n const existing = byId.get(item.id);\n return { ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated };\n });\n return { ...current, threads: reconcileRefreshedThreads(current.threads, incoming, current.activeThreadId, concurrentEvents) };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n eventsDuringRefreshRef.current = null;\n setIsLoadingThreads(false);\n }\n })();\n refreshPromiseRef.current = request;\n void request.finally(() => {\n if (refreshPromiseRef.current === request) refreshPromiseRef.current = null;\n }).catch(() => undefined);\n return request;\n }, [clearOperationError, client, failOperation, threadPageSize, update]);\n\n const loadMoreThreads = React.useCallback(async () => {\n if (isLoadingMoreThreads) return;\n const skip = stateRef.current.threads.length;\n if (threadTotal !== undefined && skip >= threadTotal) return;\n clearOperationError();\n setIsLoadingMoreThreads(true);\n try {\n const result = await client.threads.list({ skip, limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n for (const item of result.items) {\n const existing = byId.get(item.id);\n byId.set(item.id, preferNewestThreadSummary(existing, {\n ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated,\n }));\n }\n return { ...current, threads: [...byId.values()] };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_more_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [clearOperationError, client, failOperation, isLoadingMoreThreads, stateRef, threadPageSize, threadTotal, update]);\n\n return { isLoadingThreads, isLoadingMoreThreads, threadTotal, eventsDuringRefreshRef, refreshThreads, loadMoreThreads };\n}\n","import type { AgentClient, FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { withAgentChatOperationError, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function useAgentChatFeedback({ client, update, clearOperationError, failOperation }: {\n client: AgentClient;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n return React.useCallback(async (message: ChatMessage, input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n }) => {\n const runId = message.runId;\n if (!runId || message.role !== \"assistant\" || message.isFinal === false) {\n const error = new Error(\"Only persisted final responses can receive feedback.\");\n failOperation(\"set_feedback\", error);\n throw error;\n }\n const previous = message.feedback ?? null;\n const timestamp = new Date().toISOString();\n const optimistic: ResponseFeedback | null = input.rating ? {\n rating: input.rating,\n reason: input.rating === \"dislike\" ? input.reason ?? null : null,\n comment: input.rating === \"dislike\" ? input.comment?.trim() || null : null,\n created_at: previous?.created_at || timestamp,\n updated_at: timestamp,\n } : null;\n const replaceFeedback = (current: AgentChatState, feedback: ResponseFeedback | null): AgentChatState => ({\n ...current,\n messages: current.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\n threads: current.threads.map((thread) => ({ ...thread,\n messages: thread.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\n })),\n });\n clearOperationError();\n update((current) => replaceFeedback(current, optimistic));\n try {\n const result = await client.runs.setFeedback({ runId, ...input });\n update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n update((current) => withAgentChatOperationError(replaceFeedback(current, previous), \"set_feedback\", error));\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\n}\n","import type { ThreadMessage } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AgentChatSubmitInput } from \"./use-agent-chat\";\nimport { useThreadMessageQueue } from \"./thread-message-queue\";\nimport type { AgentChatOperation, AgentChatState } from \"./state\";\n\nexport function useAgentChatQueueActions({ queue, stateRef, createId, clearOperationError,\n failOperation, refreshMessages, attachRun }: {\n queue: ReturnType<typeof useThreadMessageQueue>;\n stateRef: React.RefObject<AgentChatState>;\n createId: () => string;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n refreshMessages: (threadId: string) => Promise<void>;\n attachRun: (runId: string) => Promise<void>;\n}) {\n const steer = React.useCallback(async (text: string) => {\n const threadId = stateRef.current.activeThreadId;\n if (!threadId || !text.trim()) throw new Error(\"An active thread and text are required to steer.\");\n clearOperationError();\n try {\n await queue.submit({ mode: \"steer\", input: text.trim(), idempotencyKey: createId() });\n await refreshMessages(threadId);\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n }\n }, [clearOperationError, createId, failOperation, queue.submit, refreshMessages, stateRef]);\n\n const editPendingMessage = React.useCallback(async (message: ThreadMessage,\n input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">) => {\n await queue.edit(message, { text: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId });\n }, [queue.edit]);\n const steerPendingMessage = React.useCallback(async (message: ThreadMessage) => {\n await queue.edit(message, { text: message.text, attachmentIds: message.attachment_ids, mode: \"steer\" });\n }, [queue.edit]);\n const resumeQueue = React.useCallback(async () => {\n if (!stateRef.current.activeThreadId) return;\n const result = await queue.resume();\n if (result?.run_id) void attachRun(result.run_id).catch(() => undefined);\n }, [attachRun, queue.resume, stateRef]);\n return { steer, editPendingMessage, steerPendingMessage, removePendingMessage: queue.remove, resumeQueue };\n}\n","export function resolveInitialActiveThreadId(\n options: { activeThreadId?: string | null },\n storedThreadId: string | null,\n): string | null {\n return Object.prototype.hasOwnProperty.call(options, \"activeThreadId\")\n ? options.activeThreadId ?? null\n : storedThreadId;\n}\n\nexport function shouldHydrateSelectedThread(\n selectedThreadId: string | null | undefined,\n activeThreadId: string | null,\n activeThreadIsHydrated: boolean,\n): boolean {\n return Boolean(selectedThreadId) && (\n selectedThreadId !== activeThreadId || !activeThreadIsHydrated\n );\n}\n\nexport function isCurrentThreadOpenRequest(input: {\n activeThreadId: string | null;\n currentGeneration: number;\n requestGeneration: number;\n requestedThreadId: string;\n signalAborted: boolean;\n}): boolean {\n return !input.signalAborted\n && input.requestGeneration === input.currentGeneration\n && input.requestedThreadId === input.activeThreadId;\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n ThreadComputerStatus,\n ThreadSummary,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { attachmentResultToChatAttachment } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\n\nexport function useAgentThreads(options: { limit?: number; skip?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [threads, setThreads] = React.useState<ThreadSummary[]>([]);\n const [total, setTotal] = React.useState<number | undefined>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.list({ ...options, signal: controller.signal });\n setThreads(result.items);\n setTotal(result.total);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.limit, options.skip]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, threads, total };\n}\n\nexport function useAgentThread(threadId: string | null, options: { limit?: number; beforeTurnIndex?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [thread, setThread] = React.useState<ThreadDetail | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n if (!threadId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setThread(null);\n setIsLoading(false);\n return null;\n }\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.get({ threadId, ...options, signal: controller.signal });\n setThread(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.beforeTurnIndex, options.limit, threadId]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, thread };\n}\n\nexport function useThreadComputer(threadId: string | null) {\n const { client, createAbortController } = useAgents24Runtime();\n const [computer, setComputer] = React.useState<ThreadComputerStatus | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const refresh = React.useCallback(async () => {\n controllerRef.current?.abort();\n if (!threadId) {\n setComputer(null);\n setIsLoading(false);\n return null;\n }\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.computer.get({ threadId, signal: controller.signal });\n setComputer(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, threadId]);\n React.useEffect(() => {\n void refresh();\n return () => controllerRef.current?.abort();\n }, [refresh]);\n const list = React.useCallback((input: { path?: string; cursor?: number; limit?: number }) => {\n if (!threadId) throw new Error(\"A thread is required to list computer files\");\n return client.threads.computer.list({ threadId, ...input });\n }, [client, threadId]);\n const read = React.useCallback((path: string) => {\n if (!threadId) throw new Error(\"A thread is required to read a computer file\");\n return client.threads.computer.read({ threadId, path });\n }, [client, threadId]);\n const createContentAccess = React.useCallback((path: string, download = false) => {\n if (!threadId) throw new Error(\"A thread is required to access a computer file\");\n return client.threads.computer.createContentAccess({ threadId, path, download });\n }, [client, threadId]);\n return { computer, error, isLoading, list, read, createContentAccess, refresh };\n}\n\nexport function useAgentRun() {\n const { client, createAbortController, createId } = useAgents24Runtime();\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const [isAttached, setIsAttached] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n React.useEffect(() => () => controllerRef.current?.abort(), []);\n const detach = React.useCallback(() => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setIsAttached(false);\n }, []);\n const attach = React.useCallback(async (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => {\n detach();\n const controller = createAbortController();\n controllerRef.current = controller;\n setError(null);\n setIsAttached(true);\n try {\n return await client.runs.attach({ runId, cursor, signal: controller.signal }, onEvent);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n throw nextError;\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n setIsAttached(false);\n }\n }, [client, createAbortController, detach]);\n const cancel = React.useCallback(async (runId: string) => {\n const result = await client.runs.cancel({ runId, idempotencyKey: createId() });\n detach();\n return result;\n }, [client, createId, detach]);\n return { attach, cancel, detach, error, isAttached };\n}\n\nexport function useAgentAttachments() {\n const { client, createId } = useAgents24Runtime();\n const [uploads, setUploads] = React.useState<Record<string, AttachmentResult>>({});\n const [isUploading, setIsUploading] = React.useState(false);\n const uploadBatch = React.useCallback(async (input: { uploads: readonly { data: BinaryUploadData; name: string; mediaType: string }[]; threadId?: string; requestedAgentId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const results = await client.attachments.uploadBatch({ uploads: input.uploads as readonly PortableUpload[], threadId: input.threadId, requestedAgentId: input.requestedAgentId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => Object.fromEntries([\n ...Object.entries(current),\n ...results.map((result) => [result.id, result]),\n ]));\n return results.map(attachmentResultToChatAttachment);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n const createContentAccess = React.useCallback(\n (input: { attachmentId: string; disposition: \"inline\" | \"attachment\"; signal?: AbortSignalLike }) =>\n client.attachments.createContentAccess(input),\n [client],\n );\n return { createContentAccess, isUploading, uploadBatch, uploads };\n}\n\nexport function useAgentHitl() {\n const { client, createId } = useAgents24Runtime();\n const [isResolving, setIsResolving] = React.useState(false);\n const [lastResult, setLastResult] = React.useState<HitlResumeResult | null>(null);\n const resume = React.useCallback(async (input: { runId: string; interruptId: string; action: HitlAction; comment?: string; answers?: import(\"@agents24/client\").HitlAnswer[]; signal?: AbortSignalLike }) => {\n setIsResolving(true);\n try {\n const result = await client.hitl.resume({ ...input, idempotencyKey: createId() });\n setLastResult(result);\n return result;\n } finally {\n setIsResolving(false);\n }\n }, [client, createId]);\n return { isResolving, lastResult, resume };\n}\n\nexport function useAgentMcp() {\n const { client, createId } = useAgents24Runtime();\n const [isAuthorizing, setIsAuthorizing] = React.useState(false);\n const startAuthorization = React.useCallback(async (input: { runId: string; serverId: string; interruptId: string; redirectUri: string; popupNonce: string; codeChallenge: string; signal?: AbortSignalLike }): Promise<McpAuthorizationResult> => {\n setIsAuthorizing(true);\n try { return await client.mcp.startAuthorization({ ...input, idempotencyKey: createId() }); }\n finally { setIsAuthorizing(false); }\n }, [client, createId]);\n const redeemCallback = React.useCallback(async (input: { code: string; codeVerifier: string; signal?: AbortSignalLike }): Promise<McpCallbackResult> =>\n client.mcp.redeemCallback({ ...input, idempotencyKey: createId() }), [client, createId]);\n return { isAuthorizing, redeemCallback, startAuthorization };\n}\n"],"mappings":"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","names":["value","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","React","React","React","React","text","activeThread","React"]}
1
+ {"version":3,"sources":["../src/lifecycle.ts","../src/model.ts","../src/provider.tsx","../src/runtime-event-buffer.ts","../src/state.ts","../src/thread-message-queue.ts","../src/use-agent-chat.ts","../src/thread-summary-subscription.ts","../src/use-agent-chat-thread-list.ts","../src/use-agent-chat-feedback.ts","../src/use-agent-chat-queue-actions.ts","../src/initial-thread.ts","../src/use-agent-resources.ts"],"sourcesContent":["import type { AbortSignalLike } from \"@agents24/client\";\n\nexport type AbortControllerLike = {\n readonly signal: AbortSignalLike;\n abort(reason?: unknown): void;\n};\n\nexport type AbortControllerFactory = () => AbortControllerLike;\n\nexport function createPortableId(): string {\n const cryptoLike = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n if (cryptoLike?.randomUUID) return cryptoLike.randomUUID();\n return `a24-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function isAbortLike(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const input = error as { code?: unknown; kind?: unknown; name?: unknown };\n return input.name === \"AbortError\" || input.kind === \"aborted\" || input.code === \"ABORTED\";\n}\n","import type {\n AttachmentResult,\n FailureView,\n HitlAction,\n ResponseFeedback,\n RuntimeEvent,\n ThreadDetail,\n ThreadSummary,\n} from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\n\nexport type AgentChatMessageRole = \"user\" | \"assistant\";\nexport type AgentChatRunState =\n | \"idle\"\n | \"uploading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"waiting\"\n | \"interrupted\"\n | \"cancelling\"\n | \"completed\"\n | \"cancelled\"\n | \"failed\";\n\nexport type ChatCitation = {\n title: string;\n url: string;\n description?: string;\n sourceRef?: string;\n [key: string]: unknown;\n};\n\nexport type ChatAttachment = {\n id?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n contentType?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nexport function chatAttachmentIds(attachments?: readonly ChatAttachment[]): string[] {\n return (attachments || []).flatMap((attachment) => typeof attachment.id === \"string\" && attachment.id.trim()\n ? [attachment.id.trim()]\n : []);\n}\n\nexport type ChatToolState = \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\" | \"cancelled\";\n\nexport type ChatPartMetadata = {\n id: string;\n runId?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n raw?: Record<string, unknown>;\n};\n\nexport type ChatToolChildRun = {\n runId?: string | null;\n agentId?: string | null;\n agentName?: string | null;\n status?: string | null;\n error?: string | null;\n};\n\nexport type ChatToolChild = {\n id: string;\n runId?: string | null;\n toolCallId?: string | null;\n toolName: string;\n title: string;\n status: string;\n detail?: string | null;\n sequence?: number | null;\n timestamp?: string | null;\n};\n\nexport type ChatToolPresentation = Record<string, unknown> & {\n title?: string | null;\n activity?: string | null;\n detail?: string | null;\n category?: string | null;\n groupKey?: string | null;\n groupLabel?: string | null;\n path?: string | null;\n threadId?: string | null;\n isExploration?: boolean;\n childRun?: ChatToolChildRun | null;\n childTools?: ChatToolChild[];\n activeChildToolId?: string | null;\n};\n\nexport type ChatTextPart = ChatPartMetadata & { type: \"text\"; kind: \"text\"; text: string };\nexport type ChatComputerResourceTarget = {\n type: \"computer\";\n thread_id: string;\n computer_id: string;\n path: string;\n kind: \"file\" | \"directory\";\n};\nexport type ChatToolPart = ChatPartMetadata & {\n type: `tool-${string}`;\n kind: \"tool\";\n toolName: string;\n toolKey?: string | null;\n action?: string | null;\n displayName?: string | null;\n summary?: string | null;\n toolCallId?: string | null;\n sourceKind?: string | null;\n state: ChatToolState;\n input?: unknown;\n output?: unknown;\n resourceTargets?: readonly ChatComputerResourceTarget[];\n errorText?: string | null;\n failure?: FailureView | null;\n presentation: ChatToolPresentation;\n};\nexport type ChatReasoningPart = ChatPartMetadata & { type: \"reasoning\"; kind: \"reasoning\"; label?: string | null; text?: string | null; status?: string | null };\nexport type ChatModelTurnPart = ChatPartMetadata & {\n type: \"model-turn\";\n kind: \"model-turn\";\n modelTurnId: string;\n turnKind: \"agent\" | \"model\";\n status: \"running\";\n iteration?: number | null;\n};\nexport type ChatContextCompressionPart = ChatPartMetadata & {\n type: \"context-compression\";\n kind: \"context-compression\";\n status: \"started\" | \"completed\" | \"failed\";\n compression: ContextCompression;\n};\nexport type ChatNodeActivityState = \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"skipped\";\nexport type ChatNodeSkipReason = \"missing_required_input\" | \"upstream_input_unavailable\" | \"empty_optional_source\";\nconst chatNodeSkipReason = (value: unknown): ChatNodeSkipReason | null => {\n const normalized = text(value);\n return normalized === \"missing_required_input\"\n || normalized === \"upstream_input_unavailable\"\n || normalized === \"empty_optional_source\"\n ? normalized\n : null;\n};\nexport type ChatNodeActivityPart = ChatPartMetadata & {\n type: \"node-activity\";\n kind: \"node-activity\";\n activityId: string;\n /** Opaque trusted-host trace selector; absent from public projections. */\n traceStepId?: string | null;\n label: string;\n nodeKind: string;\n status: ChatNodeActivityState;\n defaultChatVisible: boolean;\n reason?: ChatNodeSkipReason | null;\n failure?: FailureView | null;\n};\nexport type ChatUiBlocksPart = ChatPartMetadata & { type: \"ui-blocks\"; kind: \"ui-blocks\"; state: ChatToolState; toolCallId?: string | null; contractVersion?: string | null; bundle?: Record<string, unknown> | null; errorText?: string | null };\nexport type ChatHitlKind = \"tool_review\" | \"mcp_auth\" | \"user_approval\" | \"app_data_permission\" | \"user_input\";\nexport type ChatHitlStatus = \"pending\" | \"resolved\" | \"expired\" | \"cancelled\" | \"invalidated\";\nexport type ChatHitlQuestion = {\n id: string;\n header: string;\n question: string;\n options: Array<{ id: string; label: string }>;\n multiSelect: boolean;\n};\nexport type ChatHitlAnswer = {\n questionId: string;\n selectedOptionIds: string[];\n customText?: string;\n};\nexport type ChatHitlResolution = Record<string, unknown> & {\n answers?: ChatHitlAnswer[];\n outcome?: string;\n status?: string;\n};\nexport type ChatHitlPart = ChatPartMetadata & {\n type: \"hitl\";\n kind: \"hitl\";\n interruptId: string;\n hitlKind: ChatHitlKind;\n message: string;\n allowedActions: HitlAction[];\n status: ChatHitlStatus;\n presentation: Record<string, unknown>;\n questions: ChatHitlQuestion[];\n resolution?: ChatHitlResolution | null;\n};\nexport type ChatErrorPart = ChatPartMetadata & { type: \"error\"; kind: \"error\"; errorText: string; failure?: FailureView | null };\nexport type ChatDataPart = ChatPartMetadata & { type: \"data\"; kind: \"data\"; name: string; data: Record<string, unknown> };\nexport type ChatSourcePart = ChatPartMetadata & { type: \"source\"; kind: \"source\"; title: string; url?: string | null; description?: string | null };\nexport type ChatCitationPart = ChatPartMetadata & { type: \"citation\"; kind: \"citation\"; sourceId?: string | null; label?: string | null; url?: string | null };\nexport type ChatAttachmentPart = ChatPartMetadata & { type: \"attachment\"; kind: \"attachment\"; attachment: ChatAttachment };\nexport type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatModelTurnPart | ChatContextCompressionPart | ChatNodeActivityPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart | ChatSourcePart | ChatCitationPart | ChatAttachmentPart;\n\nexport type ChatMessage = {\n id: string;\n /** Durable timeline identity when a mounted optimistic turn keeps its display key. */\n durableId?: string;\n segmentIndex?: number | null;\n role: AgentChatMessageRole;\n runId?: string | null;\n content: string;\n createdAt: Date | string;\n isFinal?: boolean;\n parts: ChatPart[];\n attachments?: ChatAttachment[];\n citations?: ChatCitation[];\n feedback?: ResponseFeedback | null;\n messageIndex?: number;\n reasoningSteps?: Array<Record<string, unknown>>;\n thinkingDurationMs?: number;\n tokenUsage?: { inputTokens?: number | null; outputTokens?: number | null; totalTokens?: number | null; usageSource?: string | null };\n isVoice?: boolean;\n};\n\nexport type StoredChatThread = ThreadSummary & {\n taskNotifications?: Array<Record<string, unknown> & { handle: string }>;\n messages: ChatMessage[];\n isHydrated?: boolean;\n hasOlderTurns?: boolean;\n nextBeforeTurnIndex?: number | null;\n contextWindow?: ContextWindow | null;\n contextCompression?: ContextCompression | null;\n};\n\nexport type ThreadActivity = {\n status: string | null;\n runId: string | null;\n isSpinning: boolean;\n isPaused: boolean;\n isFailed: boolean;\n isCompleted: boolean;\n isCancelled: boolean;\n};\n\nexport function getThreadActivity(thread: Pick<ThreadSummary, \"active_run\" | \"last_run_id\" | \"last_run_status\">): ThreadActivity {\n const activeRun = thread.active_run || null;\n const status = String(activeRun?.status || thread.last_run_status || \"\").trim().toLowerCase() || null;\n return {\n status,\n runId: activeRun?.run_id || thread.last_run_id || null,\n isSpinning: Boolean(activeRun) && ![\"waiting\", \"interrupted\"].includes(status || \"\"),\n isPaused: status === \"paused\",\n isFailed: status === \"failed\",\n isCompleted: status === \"completed\",\n isCancelled: status === \"cancelled\" || status === \"canceled\",\n };\n}\n\nconst record = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : null;\nexport function computerResourceTargets(value: unknown): ChatComputerResourceTarget[] {\n const output = record(value);\n if (!output) return [];\n const candidates = [output.resource_target,\n ...(Array.isArray(output.resource_targets) ? output.resource_targets : []),\n ...(Array.isArray(output.files) ? output.files.map(file => record(file)?.resource_target) : [])];\n const seen = new Set<string>();\n return candidates.flatMap(candidate => {\n const target = record(candidate);\n if (target?.type !== \"computer\" || typeof target.thread_id !== \"string\"\n || typeof target.computer_id !== \"string\" || typeof target.path !== \"string\"\n || !target.path.startsWith(\"/workspace\")\n || (target.kind !== \"file\" && target.kind !== \"directory\")) return [];\n const key = `${target.thread_id}:${target.computer_id}:${target.path}:${target.kind}`;\n if (seen.has(key)) return [];\n seen.add(key);\n return [target as ChatComputerResourceTarget];\n });\n}\nconst text = (value: unknown): string | null => typeof value === \"string\" && value.trim() ? value : null;\nconst finiteNumber = (value: unknown): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\nconst statusToToolState = (value: unknown): ChatToolState => {\n const normalized = String(value || \"\").toLowerCase();\n if (normalized === \"failed\" || normalized === \"error\") return \"output-error\";\n if (normalized === \"cancelled\" || normalized === \"canceled\") return \"cancelled\";\n if ([\"complete\", \"completed\", \"done\", \"success\"].includes(normalized)) return \"output-available\";\n return normalized === \"streaming\" ? \"input-streaming\" : \"input-available\";\n};\n\nfunction failureView(value: unknown): FailureView | null {\n const candidate = record(value);\n return candidate?.schema_version === \"agents24.failure.v1\"\n && text(candidate.failure_id)\n && text(candidate.code)\n && text(candidate.message)\n && typeof candidate.retryable === \"boolean\"\n && record(candidate.details)\n ? candidate as unknown as FailureView\n : null;\n}\n\nconst allowedActions: Record<ChatHitlKind, HitlAction[]> = {\n tool_review: [\"approve\", \"reject\"],\n mcp_auth: [\"connect\", \"skip\"],\n user_approval: [\"approve\", \"reject\"],\n app_data_permission: [\"approve\", \"reject\"],\n user_input: [\"respond\"],\n};\n\nfunction hitlQuestions(presentation: Record<string, unknown>): ChatHitlQuestion[] {\n return (Array.isArray(presentation.questions) ? presentation.questions : []).flatMap((value) => {\n const question = record(value);\n if (!question || !Array.isArray(question.options)) return [];\n const options = question.options.flatMap((rawOption) => {\n const option = record(rawOption);\n return option && text(option.id) && text(option.label)\n ? [{ id: String(option.id), label: String(option.label) }]\n : [];\n });\n return text(question.id) && text(question.header) && text(question.question) && options.length >= 2\n ? [{\n id: String(question.id),\n header: String(question.header),\n question: String(question.question),\n options,\n multiSelect: question.multi_select === true,\n }]\n : [];\n });\n}\n\nfunction hitlResolution(value: unknown): ChatHitlResolution | null {\n const resolution = record(value);\n if (!resolution) return null;\n const answers = (Array.isArray(resolution.answers) ? resolution.answers : []).flatMap((value) => {\n const answer = record(value);\n if (!answer || !text(answer.question_id) || !Array.isArray(answer.selected_option_ids)) return [];\n return [{\n questionId: String(answer.question_id),\n selectedOptionIds: answer.selected_option_ids.map(String),\n ...(text(answer.custom_text) ? { customText: String(answer.custom_text) } : {}),\n }];\n });\n return { ...resolution, ...(answers.length ? { answers } : {}) };\n}\n\nfunction partMetadata(block: Record<string, unknown>, id: string): ChatPartMetadata {\n return {\n id,\n runId: text(block.runId) || text(block.run_id),\n sequence: finiteNumber(block.seq),\n timestamp: text(block.ts),\n raw: block,\n };\n}\n\nfunction toolPresentation(tool: Record<string, unknown>): ChatToolPresentation {\n const nested = record(tool.presentation) || {};\n const childRunValue = record(tool.childRun) || record(tool.child_run);\n const childRun = childRunValue && (\n text(childRunValue.runId || childRunValue.run_id)\n || text(childRunValue.agentName || childRunValue.agent_name)\n || text(childRunValue.status)\n )\n ? {\n runId: text(childRunValue.runId) || text(childRunValue.run_id),\n agentId: text(childRunValue.agentId) || text(childRunValue.agent_id),\n agentName: text(childRunValue.agentName) || text(childRunValue.agent_name),\n status: text(childRunValue.status),\n error: text(childRunValue.error),\n }\n : null;\n const childTools = (Array.isArray(tool.childTools) ? tool.childTools : Array.isArray(tool.child_tools) ? tool.child_tools : [])\n .flatMap((value): ChatToolChild[] => {\n const child = record(value);\n if (!child || !text(child.id) || !text(child.title)) return [];\n return [{\n id: String(child.id),\n runId: text(child.runId) || text(child.run_id),\n toolCallId: text(child.toolCallId) || text(child.tool_call_id),\n toolName: String(child.toolName || child.tool_name || child.title),\n title: String(child.title),\n status: String(child.status || \"\"),\n detail: text(child.detail),\n sequence: finiteNumber(child.seq),\n timestamp: text(child.ts),\n }];\n });\n return {\n ...nested,\n title: text(tool.title) || text(nested.title),\n activity: text(tool.activity) || text(nested.activity),\n detail: text(tool.detail) || text(nested.detail),\n category: text(tool.category) || text(nested.category),\n groupKey: text(tool.groupKey) || text(tool.group_key) || text(nested.groupKey) || text(nested.group_key),\n groupLabel: text(tool.groupLabel) || text(tool.group_label) || text(nested.groupLabel) || text(nested.group_label),\n path: text(tool.path),\n threadId: text(tool.threadId) || text(tool.thread_id),\n isExploration: tool.isExploration === true || tool.is_exploration === true,\n childRun,\n childTools,\n activeChildToolId: text(tool.activeChildToolId) || text(tool.active_child_tool_id),\n };\n}\n\nexport function partsFromResponseBlocks(\n blocks: unknown,\n fallbackText = \"\",\n fallbackPartId = \"assistant-text\",\n): ChatPart[] {\n const input = Array.isArray(blocks) ? blocks : [];\n const parts = input.flatMap((item, index): ChatPart[] => {\n const block = record(item);\n if (!block) return [];\n const kind = String(block.kind || \"data\");\n const id = String(block.id || `${kind}-${index}`);\n const metadata = partMetadata(block, id);\n if (kind === \"assistant_text\") {\n const value = text(block.text);\n return value ? [{ ...metadata, type: \"text\", kind: \"text\", text: value }] : [];\n }\n if (kind === \"context_compression\") {\n const compression = normalizeContextCompression(block.compression);\n if (!compression?.active) return [];\n const status = compression.status === \"started\" || compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : block.status === \"complete\"\n ? \"completed\"\n : block.status === \"error\"\n ? \"failed\"\n : \"started\";\n return [{\n ...metadata,\n type: \"context-compression\",\n kind: \"context-compression\",\n status,\n compression: { ...compression, status },\n }];\n }\n if (kind === \"node_activity\") {\n const node = record(block.node);\n const activityId = text(node?.activityId) || text(node?.activity_id) || id;\n const statusValue = String(node?.status || \"\").toLowerCase();\n const status: ChatNodeActivityState = [\"completed\", \"failed\", \"cancelled\", \"skipped\"].includes(statusValue)\n ? statusValue as ChatNodeActivityState\n : \"running\";\n const label = text(node?.label) || \"Working\";\n const nodeKind = text(node?.kind) || \"node\";\n return [{\n ...metadata,\n type: \"node-activity\",\n kind: \"node-activity\",\n activityId,\n traceStepId: text(node?.traceStepId) || text(node?.trace_step_id) || null,\n label,\n nodeKind,\n status,\n defaultChatVisible: node?.defaultChatVisible === true,\n reason: chatNodeSkipReason(node?.reason),\n failure: failureView(node?.failure),\n }];\n }\n if (kind === \"tool\" || kind === \"tool_call\" || kind === \"tool_result\") {\n const tool = record(block.tool) || block;\n const toolName = String(tool.toolName || tool.tool_name || tool.action || tool.title || \"tool\");\n return [{\n ...metadata,\n type: `tool-${toolName}`,\n kind: \"tool\",\n toolName,\n toolKey: text(tool.toolKey) || text(tool.tool_key),\n action: text(tool.action),\n displayName: text(tool.displayName) || text(tool.display_name),\n summary: text(tool.summary),\n toolCallId: text(tool.toolCallId) || text(tool.tool_call_id),\n sourceKind: text(tool.sourceKind) || text(tool.source_kind),\n state: statusToToolState(block.status),\n input: tool.input,\n output: tool.output,\n resourceTargets: computerResourceTargets(tool.output),\n errorText: text(tool.error || block.error),\n failure: failureView(tool.failure),\n presentation: toolPresentation(tool),\n }];\n }\n if (kind === \"reasoning_note\") return [{ ...metadata, type: \"reasoning\", kind: \"reasoning\", label: text(block.label), text: text(block.description), status: text(block.status) }];\n if (kind === \"ui_blocks\") return [{ ...metadata, type: \"ui-blocks\", kind: \"ui-blocks\", state: statusToToolState(block.status), toolCallId: text(block.toolCallId), contractVersion: text(block.contractVersion), bundle: record(block.bundle), errorText: text(block.error) }];\n if (kind === \"hitl_request\") {\n const hitl = record(block.hitl) || {};\n const hitlKind = String(block.hitlKind || hitl.kind || \"\") as ChatHitlKind;\n if (!(hitlKind in allowedActions)) return [];\n const actions = Array.isArray(hitl.allowed_actions) ? hitl.allowed_actions.map(String) as HitlAction[] : [];\n const expected = allowedActions[hitlKind];\n if (actions.length !== expected.length || actions.some((action, actionIndex) => action !== expected[actionIndex])) return [];\n return [{\n ...metadata,\n type: \"hitl\",\n kind: \"hitl\",\n interruptId: String(block.interruptId || hitl.interrupt_id || \"\"),\n hitlKind,\n message: String(block.text || hitl.message || \"\"),\n allowedActions: actions,\n status: String(block.status || \"pending\") as ChatHitlStatus,\n presentation: record(hitl.presentation) || hitl,\n questions: hitlQuestions(record(hitl.presentation) || {}),\n resolution: hitlResolution(block.resolution),\n }];\n }\n if (kind === \"error\") {\n const failure = failureView(block.failure) || failureView(block.error);\n return [{\n ...metadata,\n type: \"error\",\n kind: \"error\",\n errorText: failure?.message || String(block.text || \"The run failed.\"),\n failure,\n }];\n }\n if (kind === \"source\") return [{ ...metadata, type: \"source\", kind: \"source\", title: String(block.title || \"Source\"), url: text(block.url), description: text(block.description) }];\n if (kind === \"citation\") return [{ ...metadata, type: \"citation\", kind: \"citation\", sourceId: text(block.sourceId), label: text(block.label), url: text(block.url) }];\n if (kind === \"attachment\") {\n const attachment = record(block.attachment) || {};\n return [{ ...metadata, type: \"attachment\", kind: \"attachment\", attachment: { ...attachment, id: text(attachment.id) || undefined, filename: text(attachment.name) || \"Attachment\", mediaType: text(attachment.mime_type) || undefined } }];\n }\n return [{ ...metadata, type: \"data\", kind: \"data\", name: kind, data: block }];\n });\n if (!parts.some((part) => part.kind === \"text\") && fallbackText.trim()) {\n parts.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: fallbackText.trim() });\n }\n return parts;\n}\n\nexport function assistantProjectionFromEvent(event: RuntimeEvent): { content: string; parts: ChatPart[] } {\n const payload = record(event.payload) || {};\n const content = text(payload.assistant_output_text) || \"\";\n const fromBlocks = partsFromResponseBlocks(\n payload.response_blocks,\n content,\n `${event.run_id}:assistant-text`,\n );\n if (fromBlocks.length) return {\n content: content || fromBlocks\n .filter((part): part is ChatTextPart => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\"),\n parts: fromBlocks,\n };\n const fromPatch = partsFromResponseBlocks(\n payload.response_block === undefined ? undefined : [payload.response_block],\n );\n if (fromPatch.length) return { content, parts: fromPatch };\n return { content, parts: [] };\n}\n\nexport function modelTurnPartFromEvent(event: RuntimeEvent): ChatModelTurnPart | null {\n const eventName = String(event.event || \"\");\n const payload = record(event.payload) || {};\n const source = eventName === \"run.snapshot\" ? record(payload.active_model_turn) : payload;\n if (\n !source\n || (eventName !== \"model.turn.started\" && eventName !== \"run.snapshot\")\n || source.status !== \"running\"\n || !text(source.model_turn_id)\n ) return null;\n const modelTurnId = String(source.model_turn_id);\n const iteration = finiteNumber(source.iteration);\n return {\n id: `model-turn:${modelTurnId}`,\n type: \"model-turn\",\n kind: \"model-turn\",\n modelTurnId,\n turnKind: source.kind === \"agent\" ? \"agent\" : \"model\",\n status: \"running\",\n runId: event.run_id || null,\n sequence: finiteNumber(event.seq),\n timestamp: text(event.ts),\n ...(iteration === null ? {} : { iteration }),\n raw: source,\n };\n}\n\nexport function contextCompressionPartFromEvent(\n event: RuntimeEvent,\n existingParts: readonly ChatPart[] = [],\n): ChatContextCompressionPart | null {\n if (String(event.event || \"\") !== \"context.compression.updated\") return null;\n const payload = record(event.payload) || {};\n const compression = normalizeContextCompression(payload.context_compression);\n if (!compression?.active) return null;\n const status = compression.status === \"completed\" || compression.status === \"failed\"\n ? compression.status\n : \"started\";\n const activePart = [...existingParts].reverse().find(\n (part): part is ChatContextCompressionPart => (\n part.kind === \"context-compression\" && part.status === \"started\"\n ),\n );\n const sequence = finiteNumber(event.seq);\n const id = status === \"started\"\n ? `context-compression:${event.run_id || \"run\"}:${sequence ?? \"active\"}`\n : activePart?.id || `context-compression:${event.run_id || \"run\"}:${sequence ?? \"terminal\"}`;\n return {\n id,\n type: \"context-compression\",\n kind: \"context-compression\",\n runId: event.run_id || null,\n sequence,\n timestamp: text(event.ts),\n status,\n compression,\n };\n}\n\nexport function threadDetailToMessages(detail: ThreadDetail): ChatMessage[] {\n return (detail.turns || []).flatMap((item, index) => {\n const turn = record(item) || {};\n const userText = text(turn.user_input_text) || \"\";\n const assistantText = text(turn.assistant_output_text) || \"\";\n const runId = text(turn.run_id);\n const createdAt = text(turn.created_at) || new Date(0).toISOString();\n const rawFeedback = record(turn.feedback);\n const feedback: ResponseFeedback | null = rawFeedback\n && (rawFeedback.rating === \"like\" || rawFeedback.rating === \"dislike\")\n && text(rawFeedback.created_at)\n && text(rawFeedback.updated_at)\n ? {\n rating: rawFeedback.rating === \"like\" ? \"like\" : \"dislike\",\n reason: [\n \"incorrect\",\n \"irrelevant\",\n \"incomplete\",\n \"unsafe\",\n \"citation_issue\",\n \"other\",\n ].includes(String(rawFeedback.reason || \"\"))\n ? rawFeedback.reason as ResponseFeedback[\"reason\"]\n : null,\n comment: text(rawFeedback.comment),\n created_at: String(rawFeedback.created_at),\n updated_at: String(rawFeedback.updated_at),\n }\n : null;\n const attachments = Array.isArray(turn.attachments)\n ? turn.attachments.flatMap((attachment) => {\n const value = record(attachment);\n return value ? [attachmentResultToChatAttachment(value as AttachmentResult)] : [];\n })\n : [];\n const output: ChatMessage[] = [];\n if (userText || attachments.length) output.push({\n id: String(turn.id || `${runId || index}-user`),\n role: \"user\",\n content: userText,\n createdAt,\n parts: userText ? [{ id: `${runId || index}-user-text`, type: \"text\", kind: \"text\", text: userText }] : [],\n attachments,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n if (assistantText || Array.isArray(turn.response_blocks)) {\n const assistantParts = partsFromResponseBlocks(\n turn.response_blocks,\n assistantText,\n `${runId || turn.id || index}-assistant-text`,\n );\n output.push({\n id: `${runId || turn.id || index}-assistant`,\n role: \"assistant\",\n runId,\n content: assistantText,\n createdAt: text(turn.completed_at) || createdAt,\n isFinal: ![\"queued\", \"running\", \"paused\", \"cancelling\"].includes(String(turn.status || \"\").toLowerCase()),\n feedback,\n parts: assistantParts,\n messageIndex: typeof turn.turn_index === \"number\" ? turn.turn_index : index,\n });\n }\n return output;\n });\n}\n\nexport function threadTimelineToMessages(\n items: readonly import(\"@agents24/client\").ThreadMessage[],\n detail?: ThreadDetail,\n): ChatMessage[] {\n const feedbackByRun = new Map((detail?.turns || []).flatMap((turn) =>\n turn.run_id && turn.feedback ? [[turn.run_id, turn.feedback] as const] : []));\n return items.map((item) => ({\n id: item.id,\n role: item.role,\n runId: item.run_id,\n segmentIndex: item.segment_index,\n content: item.text,\n createdAt: item.created_at,\n isFinal: item.status === \"completed\" || item.status === \"delivered\",\n parts: item.role === \"assistant\"\n ? partsFromResponseBlocks(item.response_blocks, item.text, `${item.id}-text`)\n : item.text ? [{ id: `${item.id}-text`, type: \"text\" as const, kind: \"text\" as const, text: item.text }] : [],\n attachments: item.role === \"user\" ? item.attachment_ids.map((id) => {\n const descriptor = item.attachments?.find((attachment) => attachment.id === id);\n return { id, filename: descriptor?.filename || \"Attachment\", mediaType: descriptor?.mime_type || \"application/octet-stream\" };\n }) : undefined,\n feedback: item.role === \"assistant\" && item.run_id ? feedbackByRun.get(item.run_id) as ResponseFeedback | undefined : undefined,\n }));\n}\n\nexport function latestThreadContext(detail: ThreadDetail): {\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n} {\n let contextWindow: ContextWindow | null = null;\n for (const turn of detail.turns || []) {\n contextWindow = mergeContextWindowUpdate(contextWindow, turn.context_window);\n }\n return {\n contextWindow,\n contextCompression: compressionFromContextWindow(contextWindow),\n };\n}\n\nexport function attachmentResultToChatAttachment(result: AttachmentResult): ChatAttachment {\n return {\n ...result,\n id: result.id,\n filename: result.filename,\n mediaType: result.mime_type,\n status: result.processing_status,\n };\n}\n","import type { AgentClient } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AbortControllerFactory } from \"./lifecycle\";\nimport { createPortableId } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\n\nexport type AgentChatStorage = {\n loadThreads(): StoredChatThread[];\n saveThreads(threads: readonly StoredChatThread[]): void;\n loadActiveThreadId?(): string | null;\n saveActiveThreadId?(threadId: string | null): void;\n};\n\nexport type Agents24ReactRuntime = {\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId: () => string;\n storage?: AgentChatStorage;\n};\n\nconst Agents24Context = React.createContext<Agents24ReactRuntime | null>(null);\n\nexport type Agents24ProviderProps = {\n children: React.ReactNode;\n client: AgentClient;\n createAbortController: AbortControllerFactory;\n createId?: () => string;\n storage?: AgentChatStorage;\n};\n\nexport function Agents24Provider({\n children,\n client,\n createAbortController,\n createId = createPortableId,\n storage,\n}: Agents24ProviderProps) {\n const value = React.useMemo<Agents24ReactRuntime>(\n () => ({ client, createAbortController, createId, storage }),\n [client, createAbortController, createId, storage],\n );\n return <Agents24Context.Provider value={value}>{children}</Agents24Context.Provider>;\n}\n\nexport function useAgents24Runtime(): Agents24ReactRuntime {\n const value = React.useContext(Agents24Context);\n if (!value) throw new Error(\"Agents24 hooks must be rendered inside Agents24Provider.\");\n return value;\n}\n\nexport function useAgentClient(): AgentClient {\n return useAgents24Runtime().client;\n}\n","import type { RuntimeEvent } from \"@agents24/client\";\n\nexport type RuntimeEventFrameScheduler = (callback: () => void) => () => void;\n\nexport type RuntimeEventFrameBuffer = {\n dispose(): void;\n flush(): void;\n push(event: RuntimeEvent): void;\n};\n\ntype AnimationFrameRuntime = {\n cancelAnimationFrame?: (handle: number) => void;\n requestAnimationFrame?: (callback: () => void) => number;\n};\n\nexport function runtimeEventFrameScheduler(): RuntimeEventFrameScheduler | undefined {\n const runtime = globalThis as AnimationFrameRuntime;\n if (typeof runtime.requestAnimationFrame !== \"function\") return undefined;\n return (callback) => {\n const handle = runtime.requestAnimationFrame?.(callback);\n return () => {\n if (handle !== undefined) runtime.cancelAnimationFrame?.(handle);\n };\n };\n}\n\nexport function createRuntimeEventFrameBuffer(\n apply: (events: readonly RuntimeEvent[]) => void,\n scheduleFrame?: RuntimeEventFrameScheduler,\n): RuntimeEventFrameBuffer {\n let pending: RuntimeEvent[] = [];\n let cancelFrame: (() => void) | null = null;\n\n const flush = () => {\n cancelFrame?.();\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n };\n\n return {\n dispose() {\n cancelFrame?.();\n cancelFrame = null;\n pending = [];\n },\n flush,\n push(event) {\n if (event.event !== \"assistant.delta\" || !scheduleFrame) {\n pending.push(event);\n flush();\n return;\n }\n pending.push(event);\n if (cancelFrame) return;\n cancelFrame = scheduleFrame(() => {\n cancelFrame = null;\n if (!pending.length) return;\n const events = pending;\n pending = [];\n apply(events);\n });\n },\n };\n}\n","import type { RuntimeEvent, ThreadSummaryEvent } from \"@agents24/client\";\nimport {\n compressionFromContextWindow,\n mergeContextWindowUpdate,\n normalizeContextCompression,\n type ContextCompression,\n type ContextWindow,\n} from \"@agents24/client/protocol\";\nimport type { AgentChatRunState, ChatMessage, StoredChatThread } from \"./model\";\nimport { assistantProjectionFromEvent, contextCompressionPartFromEvent, modelTurnPartFromEvent } from \"./model\";\n\nexport type AgentChatOperation =\n | \"attach_run\"\n | \"cancel_run\"\n | \"delete_thread\"\n | \"load_more_threads\"\n | \"load_older_turns\"\n | \"open_thread\"\n | \"refresh_threads\"\n | \"resume_hitl\"\n | \"set_feedback\"\n | \"submit\";\n\nexport type AgentChatOperationError = {\n kind: \"operation\";\n operation: AgentChatOperation;\n cause: unknown;\n};\n\nexport type AgentChatBackgroundError = {\n kind: \"background\";\n source: \"thread_events\";\n cause: unknown;\n};\n\nexport type AgentChatState = {\n threads: StoredChatThread[];\n activeThreadId: string | null;\n messages: ChatMessage[];\n activeRunId: string | null;\n cursor: number | null;\n streamingMessageId: string | null;\n contextWindow: ContextWindow | null;\n contextCompression: ContextCompression | null;\n contextCompressionRevision: number;\n runState: AgentChatRunState;\n /** Fatal chat initialization/session failures only. */\n error: unknown;\n /** The latest user-visible operation failure. It must not replace the transcript. */\n operationError: AgentChatOperationError | null;\n /** Failure of a non-blocking background synchronization lane. */\n backgroundError: AgentChatBackgroundError | null;\n};\n\nexport const initialAgentChatState: AgentChatState = {\n threads: [],\n activeThreadId: null,\n messages: [],\n activeRunId: null,\n cursor: null,\n streamingMessageId: null,\n contextWindow: null,\n contextCompression: null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n error: null,\n operationError: null,\n backgroundError: null,\n};\n\nexport type AgentChatThreadSelectionSnapshot = Pick<\n AgentChatState,\n | \"activeRunId\"\n | \"activeThreadId\"\n | \"cursor\"\n | \"messages\"\n | \"runState\"\n | \"streamingMessageId\"\n | \"contextWindow\"\n | \"contextCompression\"\n | \"contextCompressionRevision\"\n>;\n\nexport function captureAgentChatThreadSelection(\n state: AgentChatState,\n): AgentChatThreadSelectionSnapshot {\n return {\n activeRunId: state.activeRunId,\n activeThreadId: state.activeThreadId,\n cursor: state.cursor,\n messages: state.messages,\n runState: state.runState,\n streamingMessageId: state.streamingMessageId,\n contextWindow: state.contextWindow,\n contextCompression: state.contextCompression,\n contextCompressionRevision: state.contextCompressionRevision,\n };\n}\n\nexport function restoreAgentChatThreadSelection(\n state: AgentChatState,\n snapshot: AgentChatThreadSelectionSnapshot,\n): AgentChatState {\n return {\n ...state,\n ...snapshot,\n runState: snapshot.activeRunId ? \"reconnecting\" : snapshot.runState,\n };\n}\n\nexport function withAgentChatOperationError(\n state: AgentChatState,\n operation: AgentChatOperation,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n operationError: { kind: \"operation\", operation, cause },\n };\n}\n\nexport function clearAgentChatOperationError(\n state: AgentChatState,\n operation?: AgentChatOperation,\n): AgentChatState {\n if (!state.operationError || (operation && state.operationError.operation !== operation)) {\n return state;\n }\n return { ...state, operationError: null };\n}\n\nexport function withAgentChatBackgroundError(\n state: AgentChatState,\n cause: unknown,\n): AgentChatState {\n return {\n ...state,\n backgroundError: { kind: \"background\", source: \"thread_events\", cause },\n };\n}\n\nexport function clearAgentChatBackgroundError(state: AgentChatState): AgentChatState {\n return state.backgroundError ? { ...state, backgroundError: null } : state;\n}\n\n/**\n * Reconcile the authoritative first page without dropping a locally-created\n * active thread before it becomes visible in the server's list projection.\n */\nexport function reconcileRefreshedThreads(\n current: StoredChatThread[],\n incoming: StoredChatThread[],\n activeThreadId: string | null,\n concurrentEvents: readonly ThreadSummaryEvent[] = [],\n): StoredChatThread[] {\n const currentById = new Map(current.map((thread) => [thread.id, thread]));\n const newest = incoming.map((thread) => preferNewestThreadSummary(currentById.get(thread.id), thread));\n const active = activeThreadId && !incoming.some((thread) => thread.id === activeThreadId)\n ? current.find((thread) => thread.id === activeThreadId)\n : null;\n const base = active?.isHydrated ? [active, ...newest] : newest;\n return concurrentEvents.reduce(applyThreadSummaryEvent, base);\n}\n\nexport function preferNewestThreadSummary(\n current: StoredChatThread | undefined,\n incoming: StoredChatThread,\n): StoredChatThread {\n if (!current?.updated_at || !incoming.updated_at) return incoming;\n const currentTime = Date.parse(current.updated_at);\n const incomingTime = Date.parse(incoming.updated_at);\n return Number.isFinite(currentTime) && Number.isFinite(incomingTime) && currentTime > incomingTime\n ? current : incoming;\n}\n\n/** Adopt the server-created thread without reloading the in-memory transcript. */\nexport function adoptStreamingThread(\n state: AgentChatState,\n threadId: string,\n): AgentChatState {\n const normalizedThreadId = threadId.trim();\n if (!normalizedThreadId || state.activeThreadId) return state;\n const existing = state.threads.find((thread) => thread.id === normalizedThreadId);\n const adopted: StoredChatThread = existing\n ? { ...existing, messages: state.messages, isHydrated: true }\n : {\n id: normalizedThreadId,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages: state.messages,\n isHydrated: true,\n };\n return {\n ...state,\n activeThreadId: normalizedThreadId,\n threads: existing\n ? state.threads.map((thread) => thread.id === normalizedThreadId ? adopted : thread)\n : [adopted, ...state.threads],\n };\n}\n\nexport type StableChatMessageBase = {\n id: string;\n role: \"user\" | \"assistant\";\n runId?: string | null;\n};\n\nexport type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> = {\n baseMessages?: TMessage[];\n create: () => TMessage;\n messageId?: string | null;\n runId?: string | null;\n strictMessageId?: boolean;\n update: (message: TMessage) => TMessage;\n};\n\nexport function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n userMessage: TMessage,\n assistantMessage: TMessage,\n): TMessage[] {\n const next = [...messages];\n if (!next.some((message) => message.id === userMessage.id)) next.push(userMessage);\n if (!next.some((message) => message.id === assistantMessage.id || Boolean(\n assistantMessage.runId && message.role === \"assistant\" && message.runId === assistantMessage.runId,\n ))) next.push(assistantMessage);\n return next;\n}\n\n/** Keep mounted display keys while matching only durable IDs and run linkage. */\nexport function preserveMountedMessageIds(\n canonical: ChatMessage[],\n current: ChatMessage[],\n): ChatMessage[] {\n return canonical.map((message) => {\n const mounted = current.find((item) => item.role === message.role && (\n item.durableId === message.id || item.id === message.id\n || (message.role === \"assistant\" && message.segmentIndex === 1 && item.runId\n && item.runId === message.runId && !item.durableId)\n ));\n return mounted && mounted.id !== message.id\n ? { ...message, id: mounted.id, durableId: message.id }\n : message;\n });\n}\n\n/** Reconcile a durable timeline without replacing a newer live assistant segment. */\nexport function reconcileThreadTimeline(\n current: ChatMessage[],\n canonical: ChatMessage[],\n activeRunId: string | null,\n streamingMessageId: string | null,\n): ChatMessage[] {\n const mounted = preserveMountedMessageIds(canonical, current);\n const canonicalIds = new Set(mounted.map((message) => message.id));\n const retained = current.filter((message) => !canonicalIds.has(message.id) && (\n message.isFinal || (activeRunId && (!message.runId || message.runId === activeRunId))\n ));\n const reconciled = mounted.map((message) => {\n const live = current.find((item) => item.id === message.id);\n return activeRunId && live?.role === \"assistant\" && live.runId === activeRunId\n && (live.id === streamingMessageId || !live.isFinal)\n ? { ...message, ...live, durableId: message.durableId || live.durableId }\n : message;\n });\n return [...retained, ...reconciled];\n}\n\n/** A promoted queue item enters the transcript under its durable message ID. */\nexport function promoteThreadMessage(\n current: ChatMessage[],\n message: ChatMessage,\n runId: string,\n): ChatMessage[] {\n const promoted = { ...message, runId, isFinal: true };\n const index = current.findIndex((item) => item.id === message.id || item.durableId === message.id);\n if (index < 0) return [...current, promoted];\n return current.map((item, itemIndex) => itemIndex === index\n ? { ...item, ...promoted, id: item.id, durableId: item.id === message.id ? item.durableId : message.id }\n : item);\n}\n\nexport function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(\n messages: TMessage[],\n input: StableAssistantUpsertInput<TMessage>,\n): TMessage[] {\n const next = [...messages];\n for (const baseMessage of input.baseMessages || []) {\n const isTarget = baseMessage.role === \"assistant\" && (\n Boolean(input.messageId && baseMessage.id === input.messageId)\n || Boolean(!input.strictMessageId && input.runId && baseMessage.runId === input.runId)\n );\n if (!isTarget && !next.some((message) => message.id === baseMessage.id)) next.push(baseMessage);\n }\n const exactIndex = next.findIndex((message) => message.role === \"assistant\" && Boolean(input.messageId && message.id === input.messageId));\n const index = exactIndex >= 0 ? exactIndex : input.strictMessageId ? -1 : next.findIndex((message) =>\n message.role === \"assistant\" && Boolean(input.runId && message.runId === input.runId));\n if (index === -1) next.push(input.create());\n else next[index] = input.update(next[index]);\n return next;\n}\n\nfunction appendAssistantDelta(\n parts: ChatMessage[\"parts\"],\n delta: string,\n fallbackPartId: string,\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n const trailing = next[next.length - 1];\n if (trailing?.kind === \"text\") {\n next[next.length - 1] = { ...trailing, text: `${trailing.text}${delta}` };\n return next;\n }\n next.push({ id: fallbackPartId, type: \"text\", kind: \"text\", text: delta });\n return next;\n}\n\nfunction upsertResponseBlockParts(\n parts: ChatMessage[\"parts\"],\n incoming: ChatMessage[\"parts\"],\n): ChatMessage[\"parts\"] {\n const next = [...parts];\n for (const part of incoming) {\n const index = next.findIndex((current) => current.id === part.id);\n if (index === -1) next.push(part);\n else next[index] = part;\n }\n return next;\n}\n\nfunction reconcileModelTurnParts(\n parts: ChatMessage[\"parts\"],\n event: RuntimeEvent,\n): ChatMessage[\"parts\"] {\n const eventName = String(event.event || \"\");\n const payload = event.payload || {};\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const modelTurnId = typeof payload.model_turn_id === \"string\" ? payload.model_turn_id : null;\n let next = parts;\n\n if (eventName === \"run.snapshot\" || terminal) {\n next = next.filter((part) => part.kind !== \"model-turn\");\n } else if (eventName === \"assistant.delta\" && typeof payload.content === \"string\" && payload.content) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (eventName.startsWith(\"tool.\") || eventName === \"node.status.updated\") {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.turnKind !== \"agent\");\n } else if (\n (eventName === \"model.turn.failed\" || (eventName === \"model.turn.completed\" && payload.outcome !== \"tool_calls\"))\n && modelTurnId\n ) {\n next = next.filter((part) => part.kind !== \"model-turn\" || part.modelTurnId !== modelTurnId);\n }\n\n const active = modelTurnPartFromEvent(event);\n return active ? upsertResponseBlockParts(next, [active]) : next;\n}\n\nexport function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState {\n if (event.event === \"run.accepted\" && typeof event.payload?.message_id === \"string\") {\n const messageId = event.payload.message_id;\n let optimisticIndex = -1;\n for (let index = state.messages.length - 1; index >= 0; index -= 1) {\n const message = state.messages[index];\n if (message.role === \"user\" && !message.runId && !message.durableId) {\n optimisticIndex = index;\n break;\n }\n }\n if (optimisticIndex >= 0) {\n state = { ...state, messages: state.messages.map((message, index) => index === optimisticIndex\n ? { ...message, durableId: messageId, runId: event.run_id }\n : message.role === \"assistant\" && !message.runId\n ? { ...message, runId: event.run_id }\n : message) };\n }\n }\n const projection = assistantProjectionFromEvent(event);\n const eventName = String(event.event || \"\");\n const runId = state.activeRunId && event.event !== \"run.accepted\"\n ? state.activeRunId : event.run_id || state.activeRunId;\n const segmentId = typeof event.payload?.segment_id === \"string\" ? event.payload.segment_id : null;\n const distinctSegment = Boolean(segmentId && segmentId !== `${runId}:0`);\n const messageId = distinctSegment\n ? `${runId || \"run\"}-assistant-${segmentId}`\n : state.streamingMessageId || `${runId || \"run\"}-assistant`;\n const terminal = eventName === \"run.completed\" || eventName === \"run.failed\" || eventName === \"run.cancelled\";\n const paused = eventName === \"run.paused\" || projection.parts.some((part) => part.kind === \"hitl\" && part.status === \"pending\");\n const suspension = eventName === \"run.waiting\" ? \"waiting\" : eventName === \"run.interrupted\" ? \"interrupted\" : null;\n const cancelling = eventName === \"run.cancelling\" || String(event.payload?.status || \"\") === \"cancelling\";\n const existing = state.messages.find((message) => message.role === \"assistant\" && message.id === messageId)\n || (!distinctSegment ? state.messages.find((message) => message.role === \"assistant\" && Boolean(runId && message.runId === runId)) : undefined);\n const payload = event.payload || {};\n const eventThreadId = typeof payload.thread_id === \"string\" && payload.thread_id.trim()\n ? payload.thread_id.trim()\n : null;\n const contextApplies = (\n (!state.activeThreadId || !eventThreadId || eventThreadId === state.activeThreadId)\n && (!state.activeRunId || !runId || runId === state.activeRunId)\n );\n const contextPayload = payload.context_window && typeof payload.context_window === \"object\"\n ? { ...payload.context_window as Record<string, unknown>, run_id: runId }\n : payload.context_window;\n const contextWindow = contextApplies\n ? mergeContextWindowUpdate(state.contextWindow, contextPayload)\n : state.contextWindow;\n const explicitCompression = contextApplies\n ? normalizeContextCompression(payload.context_compression)\n : null;\n const contextCompression = contextApplies\n ? explicitCompression || compressionFromContextWindow(contextWindow) || state.contextCompression\n : state.contextCompression;\n const hasLiveCompressionUpdate = Boolean(\n contextApplies\n && (\n explicitCompression?.active\n || compressionFromContextWindow(\n mergeContextWindowUpdate(null, contextPayload),\n )?.active\n )\n );\n const delta = eventName === \"assistant.delta\" && typeof payload.content === \"string\" ? payload.content : \"\";\n const hasCanonicalResponseBlocks = Array.isArray(payload.response_blocks);\n const content = hasCanonicalResponseBlocks\n ? projection.content\n : delta\n ? `${existing?.content || \"\"}${delta}`\n : projection.content || existing?.content || \"\";\n const projectedParts = hasCanonicalResponseBlocks\n ? projection.parts\n : delta\n ? appendAssistantDelta(\n existing?.parts || [],\n delta,\n `${runId || \"run\"}-assistant-text-${event.seq}`,\n )\n : projection.parts.length\n ? upsertResponseBlockParts(existing?.parts || [], projection.parts)\n : existing?.parts || [];\n const lifecycleParts = reconcileModelTurnParts(projectedParts, event);\n const compressionPart = contextApplies && explicitCompression?.active\n ? contextCompressionPartFromEvent(event, lifecycleParts)\n : null;\n const parts = compressionPart\n ? upsertResponseBlockParts(lifecycleParts, [compressionPart])\n : lifecycleParts;\n const activeThreadId = eventThreadId || state.activeThreadId;\n const messages = upsertStableAssistantMessage(state.messages, {\n messageId,\n runId,\n strictMessageId: distinctSegment,\n create: () => ({\n id: messageId,\n role: \"assistant\",\n runId,\n content,\n createdAt: new Date().toISOString(),\n isFinal: terminal,\n parts,\n }),\n update: (message) => ({\n ...message,\n runId: runId ?? message.runId,\n content,\n parts,\n isFinal: terminal || message.isFinal,\n }),\n });\n const threads = activeThreadId\n ? state.threads.some((thread) => thread.id === activeThreadId)\n ? state.threads.map((thread) => thread.id === activeThreadId\n ? {\n ...thread,\n messages,\n isHydrated: true,\n last_run_id: runId ?? thread.last_run_id,\n contextWindow,\n contextCompression,\n }\n : thread)\n : [{\n id: activeThreadId,\n title: null,\n runtime_selection: { agent_id: null, agent_alias: null, model_id: null },\n participant_agents: [],\n messages,\n isHydrated: true,\n last_run_id: runId,\n contextWindow,\n contextCompression,\n }, ...state.threads]\n : state.threads;\n return {\n ...state,\n activeThreadId,\n activeRunId: terminal ? null : runId,\n cursor: typeof event.seq === \"number\" ? event.seq : state.cursor,\n messages,\n threads,\n contextWindow,\n contextCompression,\n contextCompressionRevision: hasLiveCompressionUpdate\n ? state.contextCompressionRevision + 1\n : state.contextCompressionRevision,\n runState: suspension || (paused\n ? \"paused\"\n : cancelling\n ? \"cancelling\"\n : terminal\n ? eventName === \"run.completed\"\n ? \"completed\"\n : eventName === \"run.cancelled\"\n ? \"cancelled\"\n : \"failed\"\n : \"streaming\"),\n streamingMessageId: terminal || paused || suspension ? null : messageId,\n };\n}\n\nexport function applyRuntimeEvents(\n state: AgentChatState,\n events: readonly RuntimeEvent[],\n): AgentChatState {\n return events.reduce(applyRuntimeEvent, state);\n}\n\nexport function applyThreadSummaryEvent(threads: StoredChatThread[], event: ThreadSummaryEvent): StoredChatThread[] {\n if (String(event.event) === \"thread.task.updated\") {\n const value = event as unknown as { thread_id: string; task: Record<string, unknown> };\n const handle = value.task?.handle;\n if (typeof handle !== \"string\") return threads;\n return threads.map(thread => thread.id === value.thread_id ? { ...thread,\n taskNotifications: [...(thread.taskNotifications || []).filter(task => task.handle !== handle),\n { ...value.task, handle }].slice(-1000) } : thread);\n }\n if (event.event === \"snapshot_required\") return threads;\n if (event.event === \"thread.deleted\") return threads.filter((thread) => thread.id !== event.thread_id);\n if (event.event !== \"thread.summary.updated\") return threads;\n const incoming = event.thread as StoredChatThread;\n const index = threads.findIndex((thread) => thread.id === incoming.id);\n if (index === -1) return [{ ...incoming, messages: incoming.messages || [], isHydrated: false }, ...threads];\n const next = [...threads];\n next[index] = preferNewestThreadSummary(next[index], {\n ...next[index], ...incoming, messages: next[index].messages, isHydrated: next[index].isHydrated,\n });\n return next;\n}\n","import * as React from \"react\";\nimport type {\n ThreadMessage, ThreadMessageInput, ThreadMessageQueueState,\n ThreadMessageSubmission, ThreadMessagesPage,\n} from \"@agents24/client\";\n\nexport type ThreadMessageNotice = {\n messageId: string;\n status: string;\n runId: string | null;\n cursor?: number;\n};\n\nexport type ThreadMessageQueueTransport = {\n list(threadId: string): Promise<ThreadMessagesPage>;\n submit(input: ThreadMessageInput): Promise<ThreadMessageSubmission>;\n edit(message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }): Promise<ThreadMessage>;\n remove(message: ThreadMessage): Promise<void>;\n resume(threadId: string): Promise<{ run_id: string | null }>;\n};\n\nexport type RetractedMessageDraft = Pick<ThreadMessage, \"text\" | \"attachment_ids\" | \"attachments\">;\n\nexport function useThreadMessageQueue({ threadId, transport, onPromoted }: {\n threadId: string | null;\n transport: ThreadMessageQueueTransport;\n onPromoted: (message: ThreadMessage, runId: string) => void;\n}) {\n const [pendingMessages, setPendingMessages] = React.useState<readonly ThreadMessage[]>([]);\n const [messageQueue, setMessageQueue] = React.useState<ThreadMessageQueueState | null>(null);\n const pendingRef = React.useRef(new Map<string, ThreadMessage>());\n const versionRef = React.useRef(0);\n const cursorRef = React.useRef(0);\n const promotedRef = React.useRef(new Set<string>());\n const threadRef = React.useRef(threadId);\n const transportRef = React.useRef(transport);\n const onPromotedRef = React.useRef(onPromoted);\n threadRef.current = threadId;\n transportRef.current = transport;\n onPromotedRef.current = onPromoted;\n\n const hydrate = React.useCallback((page: ThreadMessagesPage, selectedThreadId: string) => {\n if (threadRef.current !== selectedThreadId) return;\n const pending = page.pending.filter((message) => !promotedRef.current.has(message.id)).map((message) => {\n const known = pendingRef.current.get(message.id);\n if (message.attachments?.length || !known?.attachments?.length) return message;\n return { ...message, attachments: known.attachments.filter((attachment) =>\n message.attachment_ids.includes(attachment.id)) };\n });\n for (const message of pending) pendingRef.current.set(message.id, message);\n setPendingMessages(pending);\n setMessageQueue(page.queue);\n }, []);\n\n const refresh = React.useCallback(async (selectedThreadId = threadRef.current) => {\n if (!selectedThreadId) return null;\n const version = ++versionRef.current;\n const page = await transportRef.current.list(selectedThreadId);\n if (version !== versionRef.current || threadRef.current !== selectedThreadId) return null;\n for (const item of page.items) {\n if (item.role === \"user\" && item.status === \"delivered\" && item.run_id) {\n const pending = pendingRef.current.get(item.id);\n if (pending && !promotedRef.current.has(item.id)) {\n promotedRef.current.add(item.id);\n pendingRef.current.delete(item.id);\n onPromotedRef.current({ ...pending, ...item,\n attachments: item.attachments?.length ? item.attachments : pending.attachments }, item.run_id);\n }\n }\n }\n hydrate(page, selectedThreadId);\n return page;\n }, [hydrate]);\n\n const acceptNotice = React.useCallback((notice: ThreadMessageNotice) => {\n if (notice.cursor && notice.cursor <= cursorRef.current) return false;\n if (notice.cursor) cursorRef.current = notice.cursor;\n const pending = pendingRef.current.get(notice.messageId);\n if (notice.status === \"delivered\" && notice.runId && pending && !promotedRef.current.has(pending.id)) {\n promotedRef.current.add(pending.id);\n pendingRef.current.delete(pending.id);\n versionRef.current += 1;\n setPendingMessages((current) => current.filter((message) => message.id !== pending.id));\n onPromotedRef.current(pending, notice.runId);\n }\n if (notice.status === \"removed\") pendingRef.current.delete(notice.messageId);\n void refresh().catch(() => undefined);\n return true;\n }, [refresh]);\n\n const submit = React.useCallback(async (input: Omit<ThreadMessageInput, \"threadId\"> & {\n attachments?: ThreadMessage[\"attachments\"];\n }) => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) throw new Error(\"No active Agent thread is available.\");\n const { attachments, ...submission } = input;\n const result = await transportRef.current.submit({ ...submission, threadId: selectedThreadId });\n if (threadRef.current !== selectedThreadId) return result;\n versionRef.current += 1;\n if (!result.run_id && [\"queued\", \"steer_pending\", \"blocked\"].includes(result.status)) {\n const now = new Date().toISOString();\n const pending: ThreadMessage = {\n id: result.message_id, thread_id: selectedThreadId, sequence: Number.MAX_SAFE_INTEGER,\n run_id: null, turn_id: null, segment_index: null, role: \"user\", status: result.status,\n requested_mode: input.mode, text: input.input, attachment_ids: input.attachmentIds || [],\n attachments,\n response_blocks: [], revision: 1, created_at: now, updated_at: now,\n };\n pendingRef.current.set(pending.id, pending);\n setPendingMessages((current) => current.some((message) => message.id === pending.id)\n ? current : [...current, pending]);\n setMessageQueue((current) => ({ pending_count: Math.max(current?.pending_count || 0, result.queue_position || 1),\n paused: current?.paused || false, reason: current?.reason || null }));\n }\n void refresh().catch(() => undefined);\n return result;\n }, [refresh]);\n\n const edit = React.useCallback(async (message: ThreadMessage, input: { text: string; attachmentIds?: readonly string[]; requestedAgentId?: string; requestedModelId?: string; mode?: \"steer\" }) => {\n const updated = await transportRef.current.edit(message, input);\n versionRef.current += 1;\n pendingRef.current.set(updated.id, updated);\n await refresh(message.thread_id);\n return updated;\n }, [refresh]);\n\n const remove = React.useCallback(async (message: ThreadMessage) => {\n await transportRef.current.remove(message);\n versionRef.current += 1;\n pendingRef.current.delete(message.id);\n setPendingMessages((current) => current.filter((item) => item.id !== message.id));\n await refresh(message.thread_id);\n }, [refresh]);\n\n const retractForEdit = React.useCallback(async (message: ThreadMessage): Promise<RetractedMessageDraft> => {\n await remove(message);\n return { text: message.text, attachment_ids: message.attachment_ids, attachments: message.attachments };\n }, [remove]);\n\n const resume = React.useCallback(async () => {\n const selectedThreadId = threadRef.current;\n if (!selectedThreadId) return null;\n const result = await transportRef.current.resume(selectedThreadId);\n await refresh(selectedThreadId);\n return result;\n }, [refresh]);\n\n React.useEffect(() => {\n versionRef.current += 1;\n cursorRef.current = 0;\n promotedRef.current.clear();\n pendingRef.current.clear();\n setPendingMessages([]);\n setMessageQueue(null);\n if (threadId) void refresh(threadId).catch(() => undefined);\n }, [threadId, refresh]);\n\n React.useEffect(() => {\n if (!threadId || !pendingMessages.length || messageQueue?.paused) return;\n const clock = globalThis as typeof globalThis & {\n setInterval(callback: () => void, interval: number): unknown;\n clearInterval(timer: unknown): void;\n };\n const timer = clock.setInterval(() => { void refresh(threadId).catch(() => undefined); }, 3000);\n return () => clock.clearInterval(timer);\n }, [threadId, pendingMessages.length, messageQueue?.paused, refresh]);\n\n return { pendingMessages, messageQueue, refresh, hydrate, acceptNotice, submit, edit, remove, retractForEdit, resume };\n}\n","import type {\n AgentClient,\n FeedbackReason,\n HitlResponse,\n PortableUpload,\n RuntimeEvent,\n ThreadMessage,\n ThreadMessageQueueState,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport {\n attachmentResultToChatAttachment,\n chatAttachmentIds,\n getThreadActivity,\n latestThreadContext,\n threadDetailToMessages,\n threadTimelineToMessages,\n} from \"./model\";\nimport type { ChatAttachment, ChatHitlPart, ChatMessage, StoredChatThread } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\nimport { createRuntimeEventFrameBuffer, runtimeEventFrameScheduler } from \"./runtime-event-buffer\";\nimport { subscribeToThreadSummaries } from \"./thread-summary-subscription\";\nimport { summaryToStored, useAgentChatThreadList } from \"./use-agent-chat-thread-list\";\nimport { useAgentChatFeedback } from \"./use-agent-chat-feedback\";\nimport { useAgentChatQueueActions } from \"./use-agent-chat-queue-actions\";\nimport { useThreadMessageQueue, type RetractedMessageDraft, type ThreadMessageQueueTransport } from \"./thread-message-queue\";\nimport {\n isCurrentThreadOpenRequest,\n resolveInitialActiveThreadId,\n shouldHydrateSelectedThread,\n} from \"./initial-thread\";\nimport {\n appendStableStreamingTurn,\n adoptStreamingThread,\n applyRuntimeEvents,\n applyThreadSummaryEvent,\n clearAgentChatBackgroundError,\n clearAgentChatOperationError,\n captureAgentChatThreadSelection,\n initialAgentChatState,\n promoteThreadMessage,\n reconcileThreadTimeline,\n restoreAgentChatThreadSelection,\n withAgentChatBackgroundError,\n withAgentChatOperationError,\n type AgentChatOperation,\n type AgentChatState,\n} from \"./state\";\n\nexport type AgentChatSubmitInput = {\n text: string;\n attachmentIds?: readonly string[];\n attachments?: ChatAttachment[];\n uploads?: readonly PortableUpload[];\n requestedModelId?: string;\n requestedAgentId?: string;\n};\n\nexport type UseAgentChatOptions = {\n activeThreadId?: string | null;\n client?: AgentClient;\n pageSize?: number;\n threadPageSize?: number;\n};\n\nexport type AgentChatController = AgentChatState & {\n pendingMessages: readonly ThreadMessage[];\n messageQueue: ThreadMessageQueueState | null;\n activeThread: StoredChatThread | null;\n hasOlderTurns: boolean;\n hasMoreThreads: boolean;\n isLoadingHistory: boolean;\n isLoadingMoreThreads: boolean;\n isLoadingOlder: boolean;\n isLoadingThreads: boolean;\n isSubmitting: boolean;\n attachRun(runId: string, cursor?: number): Promise<void>;\n cancelRun(): Promise<void>;\n clearBackgroundError(): void;\n clearOperationError(operation?: AgentChatOperation): void;\n deleteThread(threadId: string): Promise<void>;\n detach(): void;\n loadOlder(): Promise<void>;\n loadMoreThreads(): Promise<void>;\n openThread(threadId: string): Promise<void>;\n refreshThreads(): Promise<void>;\n regenerate(message: ChatMessage): Promise<void>;\n refreshMessages(threadId?: string): Promise<void>;\n editPendingMessage(message: ThreadMessage, input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">): Promise<void>;\n steerPendingMessage(message: ThreadMessage): Promise<void>;\n removePendingMessage(message: ThreadMessage): Promise<void>;\n retractPendingMessage(message: ThreadMessage): Promise<RetractedMessageDraft>;\n resumeQueue(): Promise<void>;\n steer(text: string): Promise<void>;\n resumeHitl(part: ChatHitlPart, response: HitlResponse): Promise<void>;\n setFeedback(\n message: ChatMessage,\n input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n },\n ): Promise<void>;\n startNewThread(): void;\n submit(input: AgentChatSubmitInput): Promise<void>;\n};\n\nfunction activeRunIdFromThread(thread: StoredChatThread | null): string | null {\n if (!thread) return null;\n const activity = getThreadActivity(thread);\n return activity.isSpinning ? activity.runId : null;\n}\n\nexport function useAgentChat(options: UseAgentChatOptions = {}): AgentChatController {\n const runtime = useAgents24Runtime();\n const client = options.client || runtime.client;\n const pageSize = options.pageSize ?? 30;\n const threadPageSize = options.threadPageSize ?? 50;\n const [state, setState] = React.useState<AgentChatState>(() => ({\n ...initialAgentChatState,\n activeThreadId: resolveInitialActiveThreadId(\n options,\n runtime.storage?.loadActiveThreadId?.() ?? null,\n ),\n threads: runtime.storage?.loadThreads() ?? [],\n }));\n const [isLoadingHistory, setIsLoadingHistory] = React.useState(false);\n const [isLoadingOlder, setIsLoadingOlder] = React.useState(false);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const streamControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenControllerRef = React.useRef<ReturnType<typeof runtime.createAbortController> | null>(null);\n const threadOpenGenerationRef = React.useRef(0);\n const attachRunRef = React.useRef<(runId: string, cursor?: number) => Promise<void>>(async () => undefined);\n const messageRefreshVersionRef = React.useRef(0);\n const promotedRunHintRef = React.useRef<string | null>(null);\n const promotedAttachRef = React.useRef<string | null>(null);\n const firstSubmissionRef = React.useRef<Promise<void> | null>(null);\n const firstSubmissionAdmittedRef = React.useRef<(() => void) | null>(null);\n const stateRef = React.useRef(state);\n stateRef.current = state;\n\n const persist = React.useCallback((next: AgentChatState) => {\n runtime.storage?.saveThreads(next.threads);\n runtime.storage?.saveActiveThreadId?.(next.activeThreadId);\n }, [runtime.storage]);\n\n const update = React.useCallback((updater: (current: AgentChatState) => AgentChatState) => {\n setState((current) => {\n const next = updater(current);\n stateRef.current = next;\n persist(next);\n return next;\n });\n }, [persist]);\n\n const queueTransport = React.useMemo<ThreadMessageQueueTransport>(() => ({\n list: (threadId) => client.threads.messages.list({ threadId, limit: pageSize }),\n submit: (input) => client.threads.messages.submit(input),\n edit: (message, input) => client.threads.messages.edit({\n threadId: message.thread_id, messageId: message.id, revision: message.revision,\n input: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids, mode: input.mode,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId,\n }),\n remove: async (message) => {\n await client.threads.messages.remove({ threadId: message.thread_id, messageId: message.id, revision: message.revision });\n },\n resume: (threadId) => client.threads.resumeQueue({ threadId }),\n }), [client, pageSize]);\n const onQueuePromotion = React.useCallback((message: ThreadMessage, runId: string) => {\n if (stateRef.current.activeThreadId !== message.thread_id) return;\n promotedRunHintRef.current = runId;\n const userMessage = threadTimelineToMessages([{ ...message, run_id: runId, status: \"delivered\" }])[0];\n update((current) => current.activeThreadId === message.thread_id\n ? { ...current, messages: promoteThreadMessage(current.messages, userMessage, runId) } : current);\n if (stateRef.current.activeRunId !== runId && promotedAttachRef.current !== runId) {\n promotedAttachRef.current = runId;\n void attachRunRef.current(runId).catch(() => { promotedAttachRef.current = null; });\n }\n }, [update]);\n const queue = useThreadMessageQueue({ threadId: state.activeThreadId, transport: queueTransport, onPromoted: onQueuePromotion });\n const { pendingMessages, messageQueue } = queue;\n\n const eventBuffer = React.useMemo(\n () => createRuntimeEventFrameBuffer(\n (events) => update((current) => applyRuntimeEvents(current, events)),\n runtimeEventFrameScheduler(),\n ),\n [update],\n );\n\n const clearOperationError = React.useCallback((operation?: AgentChatOperation) => {\n update((current) => clearAgentChatOperationError(current, operation));\n }, [update]);\n\n const clearBackgroundError = React.useCallback(() => {\n update(clearAgentChatBackgroundError);\n }, [update]);\n\n const failOperation = React.useCallback((operation: AgentChatOperation, cause: unknown) => {\n update((current) => withAgentChatOperationError(current, operation, cause));\n }, [update]);\n\n const { isLoadingThreads, isLoadingMoreThreads, threadTotal,\n eventsDuringRefreshRef: threadEventsDuringRefreshRef, refreshThreads, loadMoreThreads,\n } = useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation });\n\n const invalidateThreadOpen = React.useCallback(() => {\n threadOpenGenerationRef.current += 1;\n threadOpenControllerRef.current?.abort(\"Thread selection changed.\");\n threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }, []);\n\n const detach = React.useCallback(() => {\n eventBuffer.flush();\n streamControllerRef.current?.abort();\n streamControllerRef.current = null;\n update((current) => ({ ...current, streamingMessageId: null, runState: current.activeRunId ? \"reconnecting\" : \"idle\" }));\n }, [eventBuffer, update]);\n\n const refreshMessages = React.useCallback(async (threadId?: string, promotedRunId?: string) => {\n const target = threadId || stateRef.current.activeThreadId;\n if (!target) return;\n const version = ++messageRefreshVersionRef.current;\n const page = await client.threads.messages.list({ threadId: target, limit: pageSize });\n if (stateRef.current.activeThreadId !== target || version !== messageRefreshVersionRef.current) return;\n queue.hydrate(page, target);\n const promoted = promotedRunId || promotedRunHintRef.current;\n if (promoted && page.items.some((message) => message.role === \"user\" && message.run_id === promoted)) {\n promotedRunHintRef.current = null;\n update((current) => {\n if (current.activeThreadId !== target) return current;\n return {\n ...current,\n messages: reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), current.activeRunId, current.streamingMessageId),\n };\n });\n return;\n }\n if (stateRef.current.activeRunId) {\n const delivered = threadTimelineToMessages(page.items.filter((item) =>\n item.role === \"user\" && item.run_id === stateRef.current.activeRunId && (item.segment_index ?? 0) > 0));\n if (delivered.length) update((current) => {\n if (current.activeThreadId !== target) return current;\n const additions = delivered.filter((item) => !current.messages.some((existing) => existing.id === item.id));\n return additions.length ? { ...current, messages: [...current.messages, ...additions] } : current;\n });\n }\n if (!stateRef.current.activeRunId && page.items.length) {\n update((current) => current.activeThreadId === target && !current.activeRunId\n ? (() => {\n const messages = reconcileThreadTimeline(current.messages, threadTimelineToMessages(page.items), null, null);\n return { ...current, messages, threads: current.threads.map((thread) => thread.id === target ? { ...thread, messages } : thread) };\n })()\n : current);\n }\n }, [client, pageSize, queue.hydrate, update]);\n\n React.useEffect(() => () => {\n eventBuffer.dispose();\n streamControllerRef.current?.abort();\n threadOpenControllerRef.current?.abort();\n }, [eventBuffer]);\n\n const openThread = React.useCallback(async (threadId: string) => {\n const previousSelection = captureAgentChatThreadSelection(stateRef.current);\n threadOpenControllerRef.current?.abort();\n const requestController = runtime.createAbortController();\n threadOpenControllerRef.current = requestController;\n const requestGeneration = threadOpenGenerationRef.current + 1;\n threadOpenGenerationRef.current = requestGeneration;\n detach();\n clearOperationError();\n update((current) => ({\n ...current,\n activeThreadId: threadId,\n activeRunId: null,\n cursor: null,\n error: null,\n messages: current.threads.find((thread) => thread.id === threadId)?.messages || [],\n contextWindow: current.threads.find((thread) => thread.id === threadId)?.contextWindow || null,\n contextCompression: current.threads.find((thread) => thread.id === threadId)?.contextCompression || null,\n contextCompressionRevision: 0,\n runState: \"idle\",\n streamingMessageId: null,\n }));\n setIsLoadingHistory(true);\n try {\n const detail = await client.threads.get({\n threadId,\n limit: pageSize,\n signal: requestController.signal,\n });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n const timeline = await client.threads.messages.list({ threadId, limit: pageSize, signal: requestController.signal });\n if (!isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })) return;\n queue.hydrate(timeline, threadId);\n const messages = timeline.items.length ? threadTimelineToMessages(timeline.items, detail) : threadDetailToMessages(detail);\n const context = latestThreadContext(detail);\n const stored: StoredChatThread = {\n ...detail,\n messages,\n isHydrated: true,\n hasOlderTurns: Boolean(detail.paging?.has_more),\n nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null,\n ...context,\n };\n update((current) => isCurrentThreadOpenRequest({\n activeThreadId: current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n }) ? {\n ...current,\n activeThreadId: threadId,\n messages,\n ...context,\n contextCompressionRevision: 0,\n activeRunId: activeRunIdFromThread(stored),\n threads: current.threads.some((thread) => thread.id === threadId)\n ? current.threads.map((thread) => thread.id === threadId ? stored : thread)\n : [stored, ...current.threads],\n } : current);\n const activeRunId = activeRunIdFromThread(stored);\n if (\n activeRunId\n && isCurrentThreadOpenRequest({\n activeThreadId: stateRef.current.activeThreadId,\n currentGeneration: threadOpenGenerationRef.current,\n requestGeneration,\n requestedThreadId: threadId,\n signalAborted: requestController.signal.aborted,\n })\n ) await attachRunRef.current(activeRunId).catch(() => undefined);\n } catch (error) {\n if (!requestController.signal.aborted && !isAbortLike(error) && requestGeneration === threadOpenGenerationRef.current) {\n failOperation(\"open_thread\", error);\n update((current) => restoreAgentChatThreadSelection(current, previousSelection));\n if (previousSelection.activeRunId) {\n void attachRunRef.current(previousSelection.activeRunId, previousSelection.cursor ?? undefined).catch(() => undefined);\n }\n throw error;\n }\n } finally {\n if (requestGeneration === threadOpenGenerationRef.current) {\n if (threadOpenControllerRef.current === requestController) threadOpenControllerRef.current = null;\n setIsLoadingHistory(false);\n }\n }\n }, [clearOperationError, client, detach, failOperation, pageSize, queue.hydrate, runtime, update]);\n\n const consumeEvent = React.useCallback((event: RuntimeEvent) => {\n const eventThreadId = typeof event.payload?.thread_id === \"string\"\n ? event.payload.thread_id.trim()\n : \"\";\n if (eventThreadId && !stateRef.current.activeThreadId) {\n update((current) => adoptStreamingThread(current, eventThreadId));\n firstSubmissionAdmittedRef.current?.();\n }\n eventBuffer.push(event);\n }, [eventBuffer, update]);\n\n const attachRun = React.useCallback(async (runId: string, cursor?: number) => {\n streamControllerRef.current?.abort();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n clearOperationError();\n update((current) => ({ ...current, activeRunId: runId, runState: \"reconnecting\", error: null }));\n try {\n const result = await client.runs.attach({ runId, cursor, signal: controller.signal }, consumeEvent);\n eventBuffer.flush();\n update((current) => ({ ...current, activeRunId: result.detached ? runId : current.activeRunId, cursor: result.cursor ?? current.cursor, runState: result.detached ? \"reconnecting\" : current.runState }));\n if (!result.detached && result.threadId) await refreshMessages(result.threadId);\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => ({ ...current, runState: \"failed\", streamingMessageId: null }));\n failOperation(\"attach_run\", error);\n throw error;\n }\n } finally {\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, eventBuffer, failOperation, refreshMessages, runtime, update]);\n attachRunRef.current = attachRun;\n\n const submit = React.useCallback(async (input: AgentChatSubmitInput) => {\n if (!input.text.trim() && !input.attachmentIds?.length && !input.uploads?.length) return;\n if (firstSubmissionRef.current && !stateRef.current.activeThreadId) {\n await firstSubmissionRef.current;\n }\n const existingThreadId = stateRef.current.activeThreadId;\n if (existingThreadId) {\n clearOperationError();\n setIsSubmitting(true);\n try {\n const uploaded = input.uploads?.length\n ? await client.attachments.uploadBatch({\n uploads: input.uploads,\n threadId: existingThreadId,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n })\n : [];\n const result = await queue.submit({\n mode: \"queue\",\n input: input.text.trim(),\n attachmentIds: uploaded.length ? uploaded.map((item) => item.id) : input.attachmentIds,\n requestedAgentId: input.requestedAgentId,\n requestedModelId: input.requestedModelId,\n idempotencyKey: runtime.createId(),\n });\n if (stateRef.current.activeThreadId !== existingThreadId) return;\n if (result.run_id) {\n const userMessage: ChatMessage = {\n id: result.message_id, role: \"user\", runId: result.run_id,\n content: input.text.trim(), createdAt: new Date().toISOString(),\n isFinal: true,\n parts: input.text.trim() ? [{ id: `${result.message_id}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [],\n attachments: input.attachments || [],\n };\n update((current) => current.activeThreadId !== existingThreadId\n || current.messages.some((message) => message.id === userMessage.id)\n ? current : { ...current, messages: [...current.messages, userMessage] });\n }\n void refreshMessages(existingThreadId).catch(() => undefined);\n if (result.run_id && promotedAttachRef.current !== result.run_id\n && stateRef.current.activeRunId !== result.run_id) {\n void attachRunRef.current(result.run_id).catch(() => undefined);\n }\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n } finally {\n setIsSubmitting(false);\n }\n return;\n }\n const admission = new Promise<void>((resolve) => { firstSubmissionAdmittedRef.current = resolve; });\n const stream = (async () => {\n invalidateThreadOpen();\n detach();\n const controller = runtime.createAbortController();\n streamControllerRef.current = controller;\n const userId = runtime.createId();\n const assistantId = runtime.createId();\n const idempotencyKey = runtime.createId();\n const optimisticAttachments = input.attachments?.length\n ? input.attachments\n : input.uploads?.map((upload, index) => ({\n id: `${userId}-attachment-${index}`,\n filename: upload.name,\n mediaType: upload.mediaType,\n status: \"uploading\",\n }));\n const userMessage: ChatMessage = { id: userId, role: \"user\", content: input.text.trim(), createdAt: new Date().toISOString(), parts: input.text.trim() ? [{ id: `${userId}-text`, type: \"text\", kind: \"text\", text: input.text.trim() }] : [], attachments: optimisticAttachments };\n const assistantMessage: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\", createdAt: new Date().toISOString(), isFinal: false, parts: [] };\n clearOperationError();\n const hasPendingUploads = Boolean(input.uploads?.length);\n update((current) => ({\n ...current,\n messages: appendStableStreamingTurn(current.messages, userMessage, assistantMessage),\n streamingMessageId: assistantId,\n runState: hasPendingUploads ? \"uploading\" : \"streaming\",\n error: null,\n }));\n setIsSubmitting(true);\n let streamStarted = false;\n try {\n const uploaded = hasPendingUploads\n ? await client.attachments.uploadBatch({\n uploads: input.uploads || [],\n threadId: stateRef.current.activeThreadId || undefined,\n requestedAgentId: input.requestedAgentId,\n idempotencyKey: runtime.createId(),\n signal: controller.signal,\n })\n : [];\n if (hasPendingUploads && uploaded.length !== input.uploads?.length) {\n throw new Error(\"Attachment upload returned an incomplete batch\");\n }\n const resolvedAttachments = uploaded.length\n ? uploaded.map(attachmentResultToChatAttachment)\n : input.attachments;\n const attachmentIds = uploaded.length\n ? uploaded.map((attachment) => attachment.id)\n : input.attachmentIds;\n if (uploaded.length) {\n update((current) => ({\n ...current,\n messages: current.messages.map((message) => message.id === userId\n ? { ...message, attachments: resolvedAttachments }\n : message),\n runState: \"streaming\",\n }));\n }\n streamStarted = true;\n const result = await client.chat.stream({ input: input.text.trim(), threadId: stateRef.current.activeThreadId || undefined, attachmentIds, requestedModelId: input.requestedModelId, requestedAgentId: input.requestedAgentId, idempotencyKey, signal: controller.signal }, consumeEvent);\n eventBuffer.flush();\n update((current) => {\n const threadId = result.threadId || current.activeThreadId;\n return {\n ...current,\n activeThreadId: threadId,\n activeRunId: result.detached ? result.runId : current.activeRunId,\n cursor: result.cursor,\n runState: result.detached ? \"reconnecting\" : current.runState,\n threads: threadId\n ? current.threads.map((thread) => thread.id === threadId\n ? { ...thread, messages: current.messages, isHydrated: true }\n : thread)\n : current.threads,\n };\n });\n if (result.threadId) await refreshThreads().catch(() => undefined);\n if (result.threadId && !result.detached) await refreshMessages(result.threadId);\n } catch (error) {\n if (isAbortLike(error) && !streamStarted) {\n update((current) => current.streamingMessageId === assistantId\n ? {\n ...current,\n messages: current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"idle\",\n streamingMessageId: null,\n }\n : current);\n } else if (!isAbortLike(error)) {\n update((current) => ({\n ...current,\n messages: streamStarted\n ? current.messages\n : current.messages.filter((message) => message.id !== userId && message.id !== assistantId),\n runState: \"failed\",\n streamingMessageId: null,\n }));\n failOperation(\"submit\", error);\n throw error;\n }\n } finally {\n setIsSubmitting(false);\n if (streamControllerRef.current === controller) streamControllerRef.current = null;\n }\n })();\n const accepted = Promise.race([stream, admission]);\n firstSubmissionRef.current = accepted;\n try {\n await accepted;\n } finally {\n if (firstSubmissionRef.current === accepted) firstSubmissionRef.current = null;\n firstSubmissionAdmittedRef.current = null;\n }\n }, [clearOperationError, client, consumeEvent, detach, eventBuffer, failOperation, invalidateThreadOpen, queue.submit, refreshMessages, refreshThreads, runtime, update]);\n\n const { steer, editPendingMessage, steerPendingMessage, removePendingMessage, resumeQueue } =\n useAgentChatQueueActions({ queue, stateRef, createId: runtime.createId, clearOperationError,\n failOperation, refreshMessages, attachRun });\n\n const startNewThread = React.useCallback(() => {\n invalidateThreadOpen();\n detach();\n update((current) => ({ ...initialAgentChatState, threads: current.threads }));\n }, [detach, invalidateThreadOpen, update]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n if (stateRef.current.activeThreadId === threadId) invalidateThreadOpen();\n clearOperationError();\n try {\n await client.threads.delete({ threadId, idempotencyKey: runtime.createId() });\n update((current) => ({\n ...current,\n activeThreadId: current.activeThreadId === threadId ? null : current.activeThreadId,\n messages: current.activeThreadId === threadId ? [] : current.messages,\n contextWindow: current.activeThreadId === threadId ? null : current.contextWindow,\n contextCompression: current.activeThreadId === threadId ? null : current.contextCompression,\n contextCompressionRevision: current.activeThreadId === threadId ? 0 : current.contextCompressionRevision,\n threads: current.threads.filter((thread) => thread.id !== threadId),\n }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"delete_thread\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, failOperation, invalidateThreadOpen, runtime, update]);\n\n const cancelRun = React.useCallback(async () => {\n const runId = stateRef.current.activeRunId;\n if (!runId || stateRef.current.runState === \"cancelling\") return;\n const previousRunState = stateRef.current.runState;\n clearOperationError();\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: \"cancelling\" }\n : current\n ));\n try {\n const result = await client.runs.cancel({ runId, idempotencyKey: runtime.createId() });\n if (result.status === \"cancelled\") {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: \"cancelled\",\n streamingMessageId: null,\n }));\n } else if (result.status === \"cancelling\") {\n update((current) => ({\n ...current,\n activeRunId: runId,\n runState: \"cancelling\",\n }));\n } else {\n detach();\n update((current) => ({\n ...current,\n activeRunId: null,\n runState: result.status === \"completed\" ? \"completed\" : \"failed\",\n streamingMessageId: null,\n }));\n }\n } catch (error) {\n if (!isAbortLike(error)) {\n update((current) => (\n current.activeRunId === runId\n ? { ...current, runState: previousRunState }\n : current\n ));\n failOperation(\"cancel_run\", error);\n throw error;\n }\n }\n }, [clearOperationError, client, detach, failOperation, runtime, update]);\n\n const resumeHitl = React.useCallback(async (part: ChatHitlPart, response: HitlResponse) => {\n const runId = stateRef.current.activeRunId || stateRef.current.messages.find((message) => message.parts.includes(part))?.runId;\n clearOperationError();\n if (!runId) {\n const error = new Error(\"No paused run is available to resume.\");\n failOperation(\"resume_hitl\", error);\n throw error;\n }\n try {\n const result = await client.hitl.resume({\n runId,\n interruptId: part.interruptId,\n ...response,\n idempotencyKey: runtime.createId(),\n });\n await attachRun(result.run_id || runId);\n } catch (error) {\n if (!isAbortLike(error)) failOperation(\"resume_hitl\", error);\n throw error;\n }\n }, [attachRun, clearOperationError, client, failOperation, runtime]);\n\n const setFeedback = useAgentChatFeedback({ client, update, clearOperationError, failOperation });\n\n const loadOlder = React.useCallback(async () => {\n const thread = stateRef.current.threads.find((item) => item.id === stateRef.current.activeThreadId);\n if (!thread?.nextBeforeTurnIndex) return;\n clearOperationError();\n setIsLoadingOlder(true);\n try {\n const detail = await client.threads.get({ threadId: thread.id, limit: pageSize, beforeTurnIndex: thread.nextBeforeTurnIndex });\n const older = threadDetailToMessages(detail);\n update((current) => ({ ...current, messages: [...older, ...current.messages.filter((message) => !older.some((item) => item.id === message.id))], threads: current.threads.map((item) => item.id === thread.id ? { ...item, hasOlderTurns: Boolean(detail.paging?.has_more), nextBeforeTurnIndex: detail.paging?.next_before_turn_index ?? null } : item) }));\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_older_turns\", error);\n throw error;\n }\n } finally { setIsLoadingOlder(false); }\n }, [clearOperationError, client, failOperation, pageSize, update]);\n\n const regenerate = React.useCallback(async (message: ChatMessage) => {\n const index = stateRef.current.messages.findIndex((item) => item.id === message.id);\n const user = stateRef.current.messages.slice(0, index).reverse().find((item) => item.role === \"user\");\n if (user) await submit({\n text: user.content,\n attachmentIds: chatAttachmentIds(user.attachments),\n attachments: user.attachments,\n });\n }, [submit]);\n\n React.useEffect(() => {\n const controller = runtime.createAbortController();\n clearBackgroundError();\n void subscribeToThreadSummaries({\n client,\n signal: controller.signal,\n refresh: refreshThreads,\n onEvent(event) {\n threadEventsDuringRefreshRef.current?.push(event);\n update((current) => ({\n ...clearAgentChatBackgroundError(current),\n threads: applyThreadSummaryEvent(current.threads, event),\n }));\n if (event.event === \"thread.message.updated\" && event.thread_id === stateRef.current.activeThreadId) {\n const wasQueued = queue.acceptNotice({ messageId: event.message_id,\n status: event.status, runId: event.run_id, cursor: event.cursor });\n if (wasQueued) void refreshMessages(event.thread_id, event.run_id || undefined).catch(() => undefined);\n }\n if (event.event === \"thread.summary.updated\" && event.thread.id === stateRef.current.activeThreadId) {\n if (streamControllerRef.current && stateRef.current.messages.some((message) =>\n message.role === \"user\" && !message.runId)) return;\n const promotedRunId = activeRunIdFromThread(summaryToStored(event.thread));\n void (async () => {\n await refreshMessages(String(event.thread.id), promotedRunId || undefined);\n if (promotedRunId && stateRef.current.activeRunId !== promotedRunId\n && stateRef.current.activeThreadId === String(event.thread.id)\n && promotedAttachRef.current !== promotedRunId) {\n promotedAttachRef.current = promotedRunId;\n await attachRunRef.current(promotedRunId);\n }\n })().catch(() => undefined);\n }\n },\n onError(error) {\n update((current) => withAgentChatBackgroundError(current, error));\n },\n onRecovered() {\n clearBackgroundError();\n },\n });\n return () => controller.abort();\n }, [clearBackgroundError, client, queue.acceptNotice, refreshMessages, refreshThreads, runtime.createAbortController, update]);\n React.useEffect(() => {\n const threadId = options.activeThreadId;\n const activeThread = stateRef.current.threads.find((thread) => thread.id === stateRef.current.activeThreadId);\n if (shouldHydrateSelectedThread(threadId, stateRef.current.activeThreadId, Boolean(activeThread?.isHydrated))) {\n void openThread(threadId as string).catch(() => undefined);\n }\n }, [openThread, options.activeThreadId]);\n\n const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId) || null;\n const hasMoreThreads = threadTotal === undefined\n ? state.threads.length >= threadPageSize\n : state.threads.length < threadTotal;\n return {\n ...state,\n activeThread,\n pendingMessages,\n messageQueue,\n hasOlderTurns: Boolean(activeThread?.hasOlderTurns),\n hasMoreThreads,\n isLoadingHistory,\n isLoadingMoreThreads,\n isLoadingOlder,\n isLoadingThreads,\n isSubmitting,\n attachRun,\n cancelRun,\n clearBackgroundError,\n clearOperationError,\n deleteThread,\n detach,\n loadOlder,\n loadMoreThreads,\n openThread,\n refreshThreads,\n regenerate,\n refreshMessages,\n editPendingMessage,\n steerPendingMessage,\n removePendingMessage,\n retractPendingMessage: queue.retractForEdit,\n resumeQueue,\n steer,\n resumeHitl,\n setFeedback,\n startNewThread,\n submit,\n };\n}\n","import type { AbortSignalLike, AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport { isAbortLike } from \"./lifecycle\";\n\ntype ThreadSummarySubscription = {\n client: AgentClient;\n signal: AbortSignalLike;\n onEvent(event: ThreadSummaryEvent): Promise<void> | void;\n onError(error: unknown): void;\n onRecovered(): void;\n refresh(): Promise<void>;\n};\n\nfunction waitForReconnect(signal: AbortSignalLike, delay: number): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const clock = globalThis as unknown as {\n setTimeout(callback: () => void, delay: number): unknown;\n clearTimeout(handle: unknown): void;\n };\n const finish = () => {\n clock.clearTimeout(timer);\n signal.removeEventListener(\"abort\", finish);\n resolve();\n };\n const timer = clock.setTimeout(finish, delay);\n signal.addEventListener(\"abort\", finish, { once: true });\n });\n}\n\n/** Keep the thread list connected across clean EOFs and transient stream failures. */\nexport async function subscribeToThreadSummaries(input: ThreadSummarySubscription): Promise<void> {\n let cursor: number | undefined;\n let failures = 0;\n while (!input.signal.aborted) {\n let refreshedFromSnapshot = false;\n try {\n await input.client.threads.events({ cursor, signal: input.signal }, async (event) => {\n if (event.event === \"snapshot_required\") {\n await input.refresh();\n cursor = undefined;\n refreshedFromSnapshot = true;\n return;\n }\n cursor = event.cursor;\n failures = 0;\n await input.onEvent(event);\n });\n if (input.signal.aborted) break;\n // A clean EOF can be an expired stream authorization. Reconcile before reconnecting.\n if (!refreshedFromSnapshot) await input.refresh();\n input.onRecovered();\n failures = 0;\n } catch (error) {\n if (input.signal.aborted || isAbortLike(error)) break;\n input.onError(error);\n failures += 1;\n try {\n await input.refresh();\n input.onRecovered();\n } catch (refreshError) {\n if (!input.signal.aborted && !isAbortLike(refreshError)) input.onError(refreshError);\n }\n }\n if (!input.signal.aborted) {\n await waitForReconnect(input.signal, Math.min(30_000, 1_000 * 2 ** Math.min(failures, 5)));\n }\n }\n}\n","import type { AgentClient, ThreadSummaryEvent } from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport type { StoredChatThread } from \"./model\";\nimport { preferNewestThreadSummary, reconcileRefreshedThreads, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function summaryToStored(thread: Record<string, unknown>): StoredChatThread {\n return { ...(thread as StoredChatThread), id: String(thread.id), messages: [], isHydrated: false };\n}\n\nexport function useAgentChatThreadList({ client, threadPageSize, stateRef, update, clearOperationError, failOperation }: {\n client: AgentClient;\n threadPageSize: number;\n stateRef: React.RefObject<AgentChatState>;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n const [isLoadingThreads, setIsLoadingThreads] = React.useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = React.useState(false);\n const [threadTotal, setThreadTotal] = React.useState<number | undefined>();\n const refreshPromiseRef = React.useRef<Promise<void> | null>(null);\n const eventsDuringRefreshRef = React.useRef<ThreadSummaryEvent[] | null>(null);\n\n const refreshThreads = React.useCallback((): Promise<void> => {\n if (refreshPromiseRef.current) return refreshPromiseRef.current;\n clearOperationError();\n setIsLoadingThreads(true);\n eventsDuringRefreshRef.current = [];\n const request = (async () => {\n try {\n const result = await client.threads.list({ limit: threadPageSize });\n const concurrentEvents = eventsDuringRefreshRef.current || [];\n eventsDuringRefreshRef.current = null;\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n const incoming = result.items.map((item) => {\n const existing = byId.get(item.id);\n return { ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated };\n });\n return { ...current, threads: reconcileRefreshedThreads(current.threads, incoming, current.activeThreadId, concurrentEvents) };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"refresh_threads\", error);\n throw error;\n }\n } finally {\n eventsDuringRefreshRef.current = null;\n setIsLoadingThreads(false);\n }\n })();\n refreshPromiseRef.current = request;\n void request.finally(() => {\n if (refreshPromiseRef.current === request) refreshPromiseRef.current = null;\n }).catch(() => undefined);\n return request;\n }, [clearOperationError, client, failOperation, threadPageSize, update]);\n\n const loadMoreThreads = React.useCallback(async () => {\n if (isLoadingMoreThreads) return;\n const skip = stateRef.current.threads.length;\n if (threadTotal !== undefined && skip >= threadTotal) return;\n clearOperationError();\n setIsLoadingMoreThreads(true);\n try {\n const result = await client.threads.list({ skip, limit: threadPageSize });\n setThreadTotal(result.total);\n update((current) => {\n const byId = new Map(current.threads.map((thread) => [thread.id, thread]));\n for (const item of result.items) {\n const existing = byId.get(item.id);\n byId.set(item.id, preferNewestThreadSummary(existing, {\n ...existing, ...summaryToStored(item), messages: existing?.messages || [], isHydrated: existing?.isHydrated,\n }));\n }\n return { ...current, threads: [...byId.values()] };\n });\n } catch (error) {\n if (!isAbortLike(error)) {\n failOperation(\"load_more_threads\", error);\n throw error;\n }\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [clearOperationError, client, failOperation, isLoadingMoreThreads, stateRef, threadPageSize, threadTotal, update]);\n\n return { isLoadingThreads, isLoadingMoreThreads, threadTotal, eventsDuringRefreshRef, refreshThreads, loadMoreThreads };\n}\n","import type { AgentClient, FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { ChatMessage } from \"./model\";\nimport { withAgentChatOperationError, type AgentChatOperation, type AgentChatState } from \"./state\";\n\nexport function useAgentChatFeedback({ client, update, clearOperationError, failOperation }: {\n client: AgentClient;\n update: (updater: (current: AgentChatState) => AgentChatState) => void;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n}) {\n return React.useCallback(async (message: ChatMessage, input: {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n }) => {\n const runId = message.runId;\n if (!runId || message.role !== \"assistant\" || message.isFinal === false) {\n const error = new Error(\"Only persisted final responses can receive feedback.\");\n failOperation(\"set_feedback\", error);\n throw error;\n }\n const previous = message.feedback ?? null;\n const timestamp = new Date().toISOString();\n const optimistic: ResponseFeedback | null = input.rating ? {\n rating: input.rating,\n reason: input.rating === \"dislike\" ? input.reason ?? null : null,\n comment: input.rating === \"dislike\" ? input.comment?.trim() || null : null,\n created_at: previous?.created_at || timestamp,\n updated_at: timestamp,\n } : null;\n const replaceFeedback = (current: AgentChatState, feedback: ResponseFeedback | null): AgentChatState => ({\n ...current,\n messages: current.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\n threads: current.threads.map((thread) => ({ ...thread,\n messages: thread.messages.map((item) => item.id === message.id ? { ...item, feedback } : item),\n })),\n });\n clearOperationError();\n update((current) => replaceFeedback(current, optimistic));\n try {\n const result = await client.runs.setFeedback({ runId, ...input });\n update((current) => replaceFeedback(current, result.feedback));\n } catch (error) {\n update((current) => withAgentChatOperationError(replaceFeedback(current, previous), \"set_feedback\", error));\n throw error;\n }\n }, [clearOperationError, client, failOperation, update]);\n}\n","import type { ThreadMessage } from \"@agents24/client\";\nimport * as React from \"react\";\nimport type { AgentChatSubmitInput } from \"./use-agent-chat\";\nimport { useThreadMessageQueue } from \"./thread-message-queue\";\nimport type { AgentChatOperation, AgentChatState } from \"./state\";\n\nexport function useAgentChatQueueActions({ queue, stateRef, createId, clearOperationError,\n failOperation, refreshMessages, attachRun }: {\n queue: ReturnType<typeof useThreadMessageQueue>;\n stateRef: React.RefObject<AgentChatState>;\n createId: () => string;\n clearOperationError: () => void;\n failOperation: (operation: AgentChatOperation, cause: unknown) => void;\n refreshMessages: (threadId: string) => Promise<void>;\n attachRun: (runId: string) => Promise<void>;\n}) {\n const steer = React.useCallback(async (text: string) => {\n const threadId = stateRef.current.activeThreadId;\n if (!threadId || !text.trim()) throw new Error(\"An active thread and text are required to steer.\");\n clearOperationError();\n try {\n await queue.submit({ mode: \"steer\", input: text.trim(), idempotencyKey: createId() });\n await refreshMessages(threadId);\n } catch (error) {\n failOperation(\"submit\", error);\n throw error;\n }\n }, [clearOperationError, createId, failOperation, queue.submit, refreshMessages, stateRef]);\n\n const editPendingMessage = React.useCallback(async (message: ThreadMessage,\n input: Pick<AgentChatSubmitInput, \"text\" | \"attachmentIds\" | \"requestedAgentId\" | \"requestedModelId\">) => {\n await queue.edit(message, { text: input.text, attachmentIds: input.attachmentIds ?? message.attachment_ids,\n requestedAgentId: input.requestedAgentId, requestedModelId: input.requestedModelId });\n }, [queue.edit]);\n const steerPendingMessage = React.useCallback(async (message: ThreadMessage) => {\n await queue.edit(message, { text: message.text, attachmentIds: message.attachment_ids, mode: \"steer\" });\n }, [queue.edit]);\n const resumeQueue = React.useCallback(async () => {\n if (!stateRef.current.activeThreadId) return;\n const result = await queue.resume();\n if (result?.run_id) void attachRun(result.run_id).catch(() => undefined);\n }, [attachRun, queue.resume, stateRef]);\n return { steer, editPendingMessage, steerPendingMessage, removePendingMessage: queue.remove, resumeQueue };\n}\n","export function resolveInitialActiveThreadId(\n options: { activeThreadId?: string | null },\n storedThreadId: string | null,\n): string | null {\n return Object.prototype.hasOwnProperty.call(options, \"activeThreadId\")\n ? options.activeThreadId ?? null\n : storedThreadId;\n}\n\nexport function shouldHydrateSelectedThread(\n selectedThreadId: string | null | undefined,\n activeThreadId: string | null,\n activeThreadIsHydrated: boolean,\n): boolean {\n return Boolean(selectedThreadId) && (\n selectedThreadId !== activeThreadId || !activeThreadIsHydrated\n );\n}\n\nexport function isCurrentThreadOpenRequest(input: {\n activeThreadId: string | null;\n currentGeneration: number;\n requestGeneration: number;\n requestedThreadId: string;\n signalAborted: boolean;\n}): boolean {\n return !input.signalAborted\n && input.requestGeneration === input.currentGeneration\n && input.requestedThreadId === input.activeThreadId;\n}\n","import type {\n AbortSignalLike,\n AttachmentResult,\n BinaryUploadData,\n HitlAction,\n HitlResumeResult,\n McpAuthorizationResult,\n McpCallbackResult,\n PortableUpload,\n RuntimeEvent,\n ThreadDetail,\n ThreadComputerStatus,\n ThreadSummary,\n} from \"@agents24/client\";\nimport * as React from \"react\";\nimport { isAbortLike } from \"./lifecycle\";\nimport { attachmentResultToChatAttachment } from \"./model\";\nimport { useAgents24Runtime } from \"./provider\";\n\nexport function useAgentThreads(options: { limit?: number; skip?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [threads, setThreads] = React.useState<ThreadSummary[]>([]);\n const [total, setTotal] = React.useState<number | undefined>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.list({ ...options, signal: controller.signal });\n setThreads(result.items);\n setTotal(result.total);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.limit, options.skip]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, threads, total };\n}\n\nexport function useAgentThread(threadId: string | null, options: { limit?: number; beforeTurnIndex?: number } = {}) {\n const { client, createAbortController } = useAgents24Runtime();\n const [thread, setThread] = React.useState<ThreadDetail | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const load = React.useCallback(async () => {\n if (!threadId) {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setThread(null);\n setIsLoading(false);\n return null;\n }\n controllerRef.current?.abort();\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.get({ threadId, ...options, signal: controller.signal });\n setThread(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, options.beforeTurnIndex, options.limit, threadId]);\n React.useEffect(() => {\n void load();\n return () => controllerRef.current?.abort();\n }, [load]);\n return { error, isLoading, refresh: load, thread };\n}\n\nexport function useThreadComputer(threadId: string | null) {\n const { client, createAbortController } = useAgents24Runtime();\n const [computer, setComputer] = React.useState<ThreadComputerStatus | null>(null);\n const [isLoading, setIsLoading] = React.useState(Boolean(threadId));\n const [error, setError] = React.useState<unknown>(null);\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const refresh = React.useCallback(async () => {\n controllerRef.current?.abort();\n if (!threadId) {\n setComputer(null);\n setIsLoading(false);\n return null;\n }\n const controller = createAbortController();\n controllerRef.current = controller;\n setIsLoading(true);\n setError(null);\n try {\n const result = await client.threads.computer.get({ threadId, signal: controller.signal });\n setComputer(result);\n return result;\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n return null;\n } finally {\n if (controllerRef.current === controller) {\n controllerRef.current = null;\n setIsLoading(false);\n }\n }\n }, [client, createAbortController, threadId]);\n React.useEffect(() => {\n void refresh();\n return () => controllerRef.current?.abort();\n }, [refresh]);\n const list = React.useCallback((input: { path?: string; cursor?: number; limit?: number }) => {\n if (!threadId) throw new Error(\"A thread is required to list computer files\");\n return client.threads.computer.list({ threadId, ...input });\n }, [client, threadId]);\n const read = React.useCallback((path: string) => {\n if (!threadId) throw new Error(\"A thread is required to read a computer file\");\n return client.threads.computer.read({ threadId, path });\n }, [client, threadId]);\n const createContentAccess = React.useCallback((path: string, download = false) => {\n if (!threadId) throw new Error(\"A thread is required to access a computer file\");\n return client.threads.computer.createContentAccess({ threadId, path, download });\n }, [client, threadId]);\n return { computer, error, isLoading, list, read, createContentAccess, refresh };\n}\n\nexport function useAgentRun() {\n const { client, createAbortController, createId } = useAgents24Runtime();\n const controllerRef = React.useRef<ReturnType<typeof createAbortController> | null>(null);\n const [isAttached, setIsAttached] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n React.useEffect(() => () => controllerRef.current?.abort(), []);\n const detach = React.useCallback(() => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setIsAttached(false);\n }, []);\n const attach = React.useCallback(async (runId: string, onEvent: (event: RuntimeEvent) => void | Promise<void>, cursor?: number) => {\n detach();\n const controller = createAbortController();\n controllerRef.current = controller;\n setError(null);\n setIsAttached(true);\n try {\n return await client.runs.attach({ runId, cursor, signal: controller.signal }, onEvent);\n } catch (nextError) {\n if (!isAbortLike(nextError)) setError(nextError);\n throw nextError;\n } finally {\n if (controllerRef.current === controller) controllerRef.current = null;\n setIsAttached(false);\n }\n }, [client, createAbortController, detach]);\n const cancel = React.useCallback(async (runId: string) => {\n const result = await client.runs.cancel({ runId, idempotencyKey: createId() });\n detach();\n return result;\n }, [client, createId, detach]);\n return { attach, cancel, detach, error, isAttached };\n}\n\nexport function useAgentAttachments() {\n const { client, createId } = useAgents24Runtime();\n const [uploads, setUploads] = React.useState<Record<string, AttachmentResult>>({});\n const [isUploading, setIsUploading] = React.useState(false);\n const uploadBatch = React.useCallback(async (input: { uploads: readonly { data: BinaryUploadData; name: string; mediaType: string }[]; threadId?: string; requestedAgentId?: string; signal?: AbortSignalLike }) => {\n setIsUploading(true);\n try {\n const results = await client.attachments.uploadBatch({ uploads: input.uploads as readonly PortableUpload[], threadId: input.threadId, requestedAgentId: input.requestedAgentId, idempotencyKey: createId(), signal: input.signal });\n setUploads((current) => Object.fromEntries([\n ...Object.entries(current),\n ...results.map((result) => [result.id, result]),\n ]));\n return results.map(attachmentResultToChatAttachment);\n } finally {\n setIsUploading(false);\n }\n }, [client, createId]);\n const createContentAccess = React.useCallback(\n (input: { attachmentId: string; disposition: \"inline\" | \"attachment\"; signal?: AbortSignalLike }) =>\n client.attachments.createContentAccess(input),\n [client],\n );\n return { createContentAccess, isUploading, uploadBatch, uploads };\n}\n\nexport function useAgentHitl() {\n const { client, createId } = useAgents24Runtime();\n const [isResolving, setIsResolving] = React.useState(false);\n const [lastResult, setLastResult] = React.useState<HitlResumeResult | null>(null);\n const resume = React.useCallback(async (input: { runId: string; interruptId: string; action: HitlAction; comment?: string; answers?: import(\"@agents24/client\").HitlAnswer[]; signal?: AbortSignalLike }) => {\n setIsResolving(true);\n try {\n const result = await client.hitl.resume({ ...input, idempotencyKey: createId() });\n setLastResult(result);\n return result;\n } finally {\n setIsResolving(false);\n }\n }, [client, createId]);\n return { isResolving, lastResult, resume };\n}\n\nexport function useAgentMcp() {\n const { client, createId } = useAgents24Runtime();\n const [isAuthorizing, setIsAuthorizing] = React.useState(false);\n const startAuthorization = React.useCallback(async (input: { runId: string; serverId: string; interruptId: string; redirectUri: string; popupNonce: string; codeChallenge: string; signal?: AbortSignalLike }): Promise<McpAuthorizationResult> => {\n setIsAuthorizing(true);\n try { return await client.mcp.startAuthorization({ ...input, idempotencyKey: createId() }); }\n finally { setIsAuthorizing(false); }\n }, [client, createId]);\n const redeemCallback = React.useCallback(async (input: { code: string; codeVerifier: string; signal?: AbortSignalLike }): Promise<McpCallbackResult> =>\n client.mcp.redeemCallback({ ...input, idempotencyKey: createId() }), [client, createId]);\n return { isAuthorizing, redeemCallback, startAuthorization };\n}\n"],"mappings":";AASO,SAAS,mBAA2B;AACzC,QAAM,aAAc,WAAqE;AACzF,MAAI,YAAY,WAAY,QAAO,WAAW,WAAW;AACzD,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC9E;AAEO,SAAS,YAAY,OAAyB;AACnD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,QAAQ;AACd,SAAO,MAAM,SAAS,gBAAgB,MAAM,SAAS,aAAa,MAAM,SAAS;AACnF;;;ACVA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAkCA,SAAS,kBAAkB,aAAmD;AACnF,UAAQ,eAAe,CAAC,GAAG,QAAQ,CAAC,eAAe,OAAO,WAAW,OAAO,YAAY,WAAW,GAAG,KAAK,IACvG,CAAC,WAAW,GAAG,KAAK,CAAC,IACrB,CAAC,CAAC;AACR;AA0FA,IAAM,qBAAqB,CAAC,UAA8C;AACxE,QAAM,aAAa,KAAK,KAAK;AAC7B,SAAO,eAAe,4BACjB,eAAe,gCACf,eAAe,0BAChB,aACA;AACN;AA8FO,SAAS,kBAAkB,QAA+F;AAC/H,QAAM,YAAY,OAAO,cAAc;AACvC,QAAM,SAAS,OAAO,WAAW,UAAU,OAAO,mBAAmB,EAAE,EAAE,KAAK,EAAE,YAAY,KAAK;AACjG,SAAO;AAAA,IACL;AAAA,IACA,OAAO,WAAW,UAAU,OAAO,eAAe;AAAA,IAClD,YAAY,QAAQ,SAAS,KAAK,CAAC,CAAC,WAAW,aAAa,EAAE,SAAS,UAAU,EAAE;AAAA,IACnF,UAAU,WAAW;AAAA,IACrB,UAAU,WAAW;AAAA,IACrB,aAAa,WAAW;AAAA,IACxB,aAAa,WAAW,eAAe,WAAW;AAAA,EACpD;AACF;AAEA,IAAM,SAAS,CAAC,UACd,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AAC5F,SAAS,wBAAwB,OAA8C;AACpF,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,aAAa;AAAA,IAAC,OAAO;AAAA,IACzB,GAAI,MAAM,QAAQ,OAAO,gBAAgB,IAAI,OAAO,mBAAmB,CAAC;AAAA,IACxE,GAAI,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,MAAM,IAAI,UAAQ,OAAO,IAAI,GAAG,eAAe,IAAI,CAAC;AAAA,EAAE;AACjG,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,WAAW,QAAQ,eAAa;AACrC,UAAM,SAAS,OAAO,SAAS;AAC/B,QAAI,QAAQ,SAAS,cAAc,OAAO,OAAO,cAAc,YAC1D,OAAO,OAAO,gBAAgB,YAAY,OAAO,OAAO,SAAS,YACjE,CAAC,OAAO,KAAK,WAAW,YAAY,KACnC,OAAO,SAAS,UAAU,OAAO,SAAS,YAAc,QAAO,CAAC;AACtE,UAAM,MAAM,GAAG,OAAO,SAAS,IAAI,OAAO,WAAW,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI;AACnF,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO,CAAC;AAC3B,SAAK,IAAI,GAAG;AACZ,WAAO,CAAC,MAAoC;AAAA,EAC9C,CAAC;AACH;AACA,IAAM,OAAO,CAAC,UAAkC,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AACpG,IAAM,eAAe,CAAC,UACpB,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AAChE,IAAM,oBAAoB,CAAC,UAAkC;AAC3D,QAAM,aAAa,OAAO,SAAS,EAAE,EAAE,YAAY;AACnD,MAAI,eAAe,YAAY,eAAe,QAAS,QAAO;AAC9D,MAAI,eAAe,eAAe,eAAe,WAAY,QAAO;AACpE,MAAI,CAAC,YAAY,aAAa,QAAQ,SAAS,EAAE,SAAS,UAAU,EAAG,QAAO;AAC9E,SAAO,eAAe,cAAc,oBAAoB;AAC1D;AAEA,SAAS,YAAY,OAAoC;AACvD,QAAM,YAAY,OAAO,KAAK;AAC9B,SAAO,WAAW,mBAAmB,yBAChC,KAAK,UAAU,UAAU,KACzB,KAAK,UAAU,IAAI,KACnB,KAAK,UAAU,OAAO,KACtB,OAAO,UAAU,cAAc,aAC/B,OAAO,UAAU,OAAO,IACzB,YACA;AACN;AAEA,IAAM,iBAAqD;AAAA,EACzD,aAAa,CAAC,WAAW,QAAQ;AAAA,EACjC,UAAU,CAAC,WAAW,MAAM;AAAA,EAC5B,eAAe,CAAC,WAAW,QAAQ;AAAA,EACnC,qBAAqB,CAAC,WAAW,QAAQ;AAAA,EACzC,YAAY,CAAC,SAAS;AACxB;AAEA,SAAS,cAAc,cAA2D;AAChF,UAAQ,MAAM,QAAQ,aAAa,SAAS,IAAI,aAAa,YAAY,CAAC,GAAG,QAAQ,CAAC,UAAU;AAC9F,UAAM,WAAW,OAAO,KAAK;AAC7B,QAAI,CAAC,YAAY,CAAC,MAAM,QAAQ,SAAS,OAAO,EAAG,QAAO,CAAC;AAC3D,UAAM,UAAU,SAAS,QAAQ,QAAQ,CAAC,cAAc;AACtD,YAAM,SAAS,OAAO,SAAS;AAC/B,aAAO,UAAU,KAAK,OAAO,EAAE,KAAK,KAAK,OAAO,KAAK,IACjD,CAAC,EAAE,IAAI,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,OAAO,KAAK,EAAE,CAAC,IACvD,CAAC;AAAA,IACP,CAAC;AACD,WAAO,KAAK,SAAS,EAAE,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,QAAQ,KAAK,QAAQ,UAAU,IAC9F,CAAC;AAAA,MACC,IAAI,OAAO,SAAS,EAAE;AAAA,MACtB,QAAQ,OAAO,SAAS,MAAM;AAAA,MAC9B,UAAU,OAAO,SAAS,QAAQ;AAAA,MAClC;AAAA,MACA,aAAa,SAAS,iBAAiB;AAAA,IACzC,CAAC,IACD,CAAC;AAAA,EACP,CAAC;AACH;AAEA,SAAS,eAAe,OAA2C;AACjE,QAAM,aAAa,OAAO,KAAK;AAC/B,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,WAAW,MAAM,QAAQ,WAAW,OAAO,IAAI,WAAW,UAAU,CAAC,GAAG,QAAQ,CAACA,WAAU;AAC/F,UAAM,SAAS,OAAOA,MAAK;AAC3B,QAAI,CAAC,UAAU,CAAC,KAAK,OAAO,WAAW,KAAK,CAAC,MAAM,QAAQ,OAAO,mBAAmB,EAAG,QAAO,CAAC;AAChG,WAAO,CAAC;AAAA,MACN,YAAY,OAAO,OAAO,WAAW;AAAA,MACrC,mBAAmB,OAAO,oBAAoB,IAAI,MAAM;AAAA,MACxD,GAAI,KAAK,OAAO,WAAW,IAAI,EAAE,YAAY,OAAO,OAAO,WAAW,EAAE,IAAI,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH,CAAC;AACD,SAAO,EAAE,GAAG,YAAY,GAAI,QAAQ,SAAS,EAAE,QAAQ,IAAI,CAAC,EAAG;AACjE;AAEA,SAAS,aAAa,OAAgC,IAA8B;AAClF,SAAO;AAAA,IACL;AAAA,IACA,OAAO,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM;AAAA,IAC7C,UAAU,aAAa,MAAM,GAAG;AAAA,IAChC,WAAW,KAAK,MAAM,EAAE;AAAA,IACxB,KAAK;AAAA,EACP;AACF;AAEA,SAAS,iBAAiB,MAAqD;AAC7E,QAAM,SAAS,OAAO,KAAK,YAAY,KAAK,CAAC;AAC7C,QAAM,gBAAgB,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS;AACpE,QAAM,WAAW,kBACf,KAAK,cAAc,SAAS,cAAc,MAAM,KAC7C,KAAK,cAAc,aAAa,cAAc,UAAU,KACxD,KAAK,cAAc,MAAM,KAE1B;AAAA,IACE,OAAO,KAAK,cAAc,KAAK,KAAK,KAAK,cAAc,MAAM;AAAA,IAC7D,SAAS,KAAK,cAAc,OAAO,KAAK,KAAK,cAAc,QAAQ;AAAA,IACnE,WAAW,KAAK,cAAc,SAAS,KAAK,KAAK,cAAc,UAAU;AAAA,IACzE,QAAQ,KAAK,cAAc,MAAM;AAAA,IACjC,OAAO,KAAK,cAAc,KAAK;AAAA,EACjC,IACA;AACJ,QAAM,cAAc,MAAM,QAAQ,KAAK,UAAU,IAAI,KAAK,aAAa,MAAM,QAAQ,KAAK,WAAW,IAAI,KAAK,cAAc,CAAC,GAC1H,QAAQ,CAAC,UAA2B;AACnC,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,CAAC,SAAS,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,MAAM,KAAK,EAAG,QAAO,CAAC;AAC7D,WAAO,CAAC;AAAA,MACN,IAAI,OAAO,MAAM,EAAE;AAAA,MACnB,OAAO,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM;AAAA,MAC7C,YAAY,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,YAAY;AAAA,MAC7D,UAAU,OAAO,MAAM,YAAY,MAAM,aAAa,MAAM,KAAK;AAAA,MACjE,OAAO,OAAO,MAAM,KAAK;AAAA,MACzB,QAAQ,OAAO,MAAM,UAAU,EAAE;AAAA,MACjC,QAAQ,KAAK,MAAM,MAAM;AAAA,MACzB,UAAU,aAAa,MAAM,GAAG;AAAA,MAChC,WAAW,KAAK,MAAM,EAAE;AAAA,IAC1B,CAAC;AAAA,EACH,CAAC;AACH,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK;AAAA,IAC5C,UAAU,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,QAAQ;AAAA,IACrD,QAAQ,KAAK,KAAK,MAAM,KAAK,KAAK,OAAO,MAAM;AAAA,IAC/C,UAAU,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,QAAQ;AAAA,IACrD,UAAU,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,OAAO,SAAS;AAAA,IACvG,YAAY,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,WAAW,KAAK,KAAK,OAAO,UAAU,KAAK,KAAK,OAAO,WAAW;AAAA,IACjH,MAAM,KAAK,KAAK,IAAI;AAAA,IACpB,UAAU,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,SAAS;AAAA,IACpD,eAAe,KAAK,kBAAkB,QAAQ,KAAK,mBAAmB;AAAA,IACtE;AAAA,IACA;AAAA,IACA,mBAAmB,KAAK,KAAK,iBAAiB,KAAK,KAAK,KAAK,oBAAoB;AAAA,EACnF;AACF;AAEO,SAAS,wBACd,QACA,eAAe,IACf,iBAAiB,kBACL;AACZ,QAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAChD,QAAM,QAAQ,MAAM,QAAQ,CAAC,MAAM,UAAsB;AACvD,UAAM,QAAQ,OAAO,IAAI;AACzB,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,UAAM,OAAO,OAAO,MAAM,QAAQ,MAAM;AACxC,UAAM,KAAK,OAAO,MAAM,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE;AAChD,UAAM,WAAW,aAAa,OAAO,EAAE;AACvC,QAAI,SAAS,kBAAkB;AAC7B,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,aAAO,QAAQ,CAAC,EAAE,GAAG,UAAU,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,CAAC,IAAI,CAAC;AAAA,IAC/E;AACA,QAAI,SAAS,uBAAuB;AAClC,YAAM,cAAc,4BAA4B,MAAM,WAAW;AACjE,UAAI,CAAC,aAAa,OAAQ,QAAO,CAAC;AAClC,YAAM,SAAS,YAAY,WAAW,aAAa,YAAY,WAAW,eAAe,YAAY,WAAW,WAC5G,YAAY,SACZ,MAAM,WAAW,aACf,cACA,MAAM,WAAW,UACf,WACA;AACR,aAAO,CAAC;AAAA,QACN,GAAG;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,aAAa,EAAE,GAAG,aAAa,OAAO;AAAA,MACxC,CAAC;AAAA,IACH;AACA,QAAI,SAAS,iBAAiB;AAC5B,YAAM,OAAO,OAAO,MAAM,IAAI;AAC9B,YAAM,aAAa,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,WAAW,KAAK;AACxE,YAAM,cAAc,OAAO,MAAM,UAAU,EAAE,EAAE,YAAY;AAC3D,YAAM,SAAgC,CAAC,aAAa,UAAU,aAAa,SAAS,EAAE,SAAS,WAAW,IACtG,cACA;AACJ,YAAM,QAAQ,KAAK,MAAM,KAAK,KAAK;AACnC,YAAM,WAAW,KAAK,MAAM,IAAI,KAAK;AACrC,aAAO,CAAC;AAAA,QACN,GAAG;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,aAAa,KAAK,MAAM,WAAW,KAAK,KAAK,MAAM,aAAa,KAAK;AAAA,QACrE;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoB,MAAM,uBAAuB;AAAA,QACjD,QAAQ,mBAAmB,MAAM,MAAM;AAAA,QACvC,SAAS,YAAY,MAAM,OAAO;AAAA,MACpC,CAAC;AAAA,IACH;AACA,QAAI,SAAS,UAAU,SAAS,eAAe,SAAS,eAAe;AACrE,YAAM,OAAO,OAAO,MAAM,IAAI,KAAK;AACnC,YAAM,WAAW,OAAO,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU,KAAK,SAAS,MAAM;AAC9F,aAAO,CAAC;AAAA,QACN,GAAG;AAAA,QACH,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,QACA,SAAS,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,QAAQ;AAAA,QACjD,QAAQ,KAAK,KAAK,MAAM;AAAA,QACxB,aAAa,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,YAAY;AAAA,QAC7D,SAAS,KAAK,KAAK,OAAO;AAAA,QAC1B,YAAY,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,YAAY;AAAA,QAC3D,YAAY,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,WAAW;AAAA,QAC1D,OAAO,kBAAkB,MAAM,MAAM;AAAA,QACrC,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,iBAAiB,wBAAwB,KAAK,MAAM;AAAA,QACpD,WAAW,KAAK,KAAK,SAAS,MAAM,KAAK;AAAA,QACzC,SAAS,YAAY,KAAK,OAAO;AAAA,QACjC,cAAc,iBAAiB,IAAI;AAAA,MACrC,CAAC;AAAA,IACH;AACA,QAAI,SAAS,iBAAkB,QAAO,CAAC,EAAE,GAAG,UAAU,MAAM,aAAa,MAAM,aAAa,OAAO,KAAK,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM,WAAW,GAAG,QAAQ,KAAK,MAAM,MAAM,EAAE,CAAC;AACjL,QAAI,SAAS,YAAa,QAAO,CAAC,EAAE,GAAG,UAAU,MAAM,aAAa,MAAM,aAAa,OAAO,kBAAkB,MAAM,MAAM,GAAG,YAAY,KAAK,MAAM,UAAU,GAAG,iBAAiB,KAAK,MAAM,eAAe,GAAG,QAAQ,OAAO,MAAM,MAAM,GAAG,WAAW,KAAK,MAAM,KAAK,EAAE,CAAC;AAC7Q,QAAI,SAAS,gBAAgB;AAC3B,YAAM,OAAO,OAAO,MAAM,IAAI,KAAK,CAAC;AACpC,YAAM,WAAW,OAAO,MAAM,YAAY,KAAK,QAAQ,EAAE;AACzD,UAAI,EAAE,YAAY,gBAAiB,QAAO,CAAC;AAC3C,YAAM,UAAU,MAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,gBAAgB,IAAI,MAAM,IAAoB,CAAC;AAC1G,YAAM,WAAW,eAAe,QAAQ;AACxC,UAAI,QAAQ,WAAW,SAAS,UAAU,QAAQ,KAAK,CAAC,QAAQ,gBAAgB,WAAW,SAAS,WAAW,CAAC,EAAG,QAAO,CAAC;AAC3H,aAAO,CAAC;AAAA,QACN,GAAG;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,OAAO,MAAM,eAAe,KAAK,gBAAgB,EAAE;AAAA,QAChE;AAAA,QACA,SAAS,OAAO,MAAM,QAAQ,KAAK,WAAW,EAAE;AAAA,QAChD,gBAAgB;AAAA,QAChB,QAAQ,OAAO,MAAM,UAAU,SAAS;AAAA,QACxC,cAAc,OAAO,KAAK,YAAY,KAAK;AAAA,QAC3C,WAAW,cAAc,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,QACxD,YAAY,eAAe,MAAM,UAAU;AAAA,MAC7C,CAAC;AAAA,IACH;AACA,QAAI,SAAS,SAAS;AACpB,YAAM,UAAU,YAAY,MAAM,OAAO,KAAK,YAAY,MAAM,KAAK;AACrE,aAAO,CAAC;AAAA,QACN,GAAG;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,SAAS,WAAW,OAAO,MAAM,QAAQ,iBAAiB;AAAA,QACrE;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,SAAS,SAAU,QAAO,CAAC,EAAE,GAAG,UAAU,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO,MAAM,SAAS,QAAQ,GAAG,KAAK,KAAK,MAAM,GAAG,GAAG,aAAa,KAAK,MAAM,WAAW,EAAE,CAAC;AAClL,QAAI,SAAS,WAAY,QAAO,CAAC,EAAE,GAAG,UAAU,MAAM,YAAY,MAAM,YAAY,UAAU,KAAK,MAAM,QAAQ,GAAG,OAAO,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC;AACpK,QAAI,SAAS,cAAc;AACzB,YAAM,aAAa,OAAO,MAAM,UAAU,KAAK,CAAC;AAChD,aAAO,CAAC,EAAE,GAAG,UAAU,MAAM,cAAc,MAAM,cAAc,YAAY,EAAE,GAAG,YAAY,IAAI,KAAK,WAAW,EAAE,KAAK,QAAW,UAAU,KAAK,WAAW,IAAI,KAAK,cAAc,WAAW,KAAK,WAAW,SAAS,KAAK,OAAU,EAAE,CAAC;AAAA,IAC3O;AACA,WAAO,CAAC,EAAE,GAAG,UAAU,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,CAAC;AAAA,EAC9E,CAAC;AACD,MAAI,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM,KAAK,aAAa,KAAK,GAAG;AACtE,UAAM,KAAK,EAAE,IAAI,gBAAgB,MAAM,QAAQ,MAAM,QAAQ,MAAM,aAAa,KAAK,EAAE,CAAC;AAAA,EAC1F;AACA,SAAO;AACT;AAEO,SAAS,6BAA6B,OAA6D;AACxG,QAAM,UAAU,OAAO,MAAM,OAAO,KAAK,CAAC;AAC1C,QAAM,UAAU,KAAK,QAAQ,qBAAqB,KAAK;AACvD,QAAM,aAAa;AAAA,IACjB,QAAQ;AAAA,IACR;AAAA,IACA,GAAG,MAAM,MAAM;AAAA,EACjB;AACA,MAAI,WAAW,OAAQ,QAAO;AAAA,IAC5B,SAAS,WAAW,WACjB,OAAO,CAAC,SAA+B,KAAK,SAAS,MAAM,EAC3D,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,EAAE;AAAA,IACV,OAAO;AAAA,EACT;AACA,QAAM,YAAY;AAAA,IAChB,QAAQ,mBAAmB,SAAY,SAAY,CAAC,QAAQ,cAAc;AAAA,EAC5E;AACA,MAAI,UAAU,OAAQ,QAAO,EAAE,SAAS,OAAO,UAAU;AACzD,SAAO,EAAE,SAAS,OAAO,CAAC,EAAE;AAC9B;AAEO,SAAS,uBAAuB,OAA+C;AACpF,QAAM,YAAY,OAAO,MAAM,SAAS,EAAE;AAC1C,QAAM,UAAU,OAAO,MAAM,OAAO,KAAK,CAAC;AAC1C,QAAM,SAAS,cAAc,iBAAiB,OAAO,QAAQ,iBAAiB,IAAI;AAClF,MACE,CAAC,UACG,cAAc,wBAAwB,cAAc,kBACrD,OAAO,WAAW,aAClB,CAAC,KAAK,OAAO,aAAa,EAC7B,QAAO;AACT,QAAM,cAAc,OAAO,OAAO,aAAa;AAC/C,QAAM,YAAY,aAAa,OAAO,SAAS;AAC/C,SAAO;AAAA,IACL,IAAI,cAAc,WAAW;AAAA,IAC7B,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,UAAU,OAAO,SAAS,UAAU,UAAU;AAAA,IAC9C,QAAQ;AAAA,IACR,OAAO,MAAM,UAAU;AAAA,IACvB,UAAU,aAAa,MAAM,GAAG;AAAA,IAChC,WAAW,KAAK,MAAM,EAAE;AAAA,IACxB,GAAI,cAAc,OAAO,CAAC,IAAI,EAAE,UAAU;AAAA,IAC1C,KAAK;AAAA,EACP;AACF;AAEO,SAAS,gCACd,OACA,gBAAqC,CAAC,GACH;AACnC,MAAI,OAAO,MAAM,SAAS,EAAE,MAAM,8BAA+B,QAAO;AACxE,QAAM,UAAU,OAAO,MAAM,OAAO,KAAK,CAAC;AAC1C,QAAM,cAAc,4BAA4B,QAAQ,mBAAmB;AAC3E,MAAI,CAAC,aAAa,OAAQ,QAAO;AACjC,QAAM,SAAS,YAAY,WAAW,eAAe,YAAY,WAAW,WACxE,YAAY,SACZ;AACJ,QAAM,aAAa,CAAC,GAAG,aAAa,EAAE,QAAQ,EAAE;AAAA,IAC9C,CAAC,SACC,KAAK,SAAS,yBAAyB,KAAK,WAAW;AAAA,EAE3D;AACA,QAAM,WAAW,aAAa,MAAM,GAAG;AACvC,QAAM,KAAK,WAAW,YAClB,uBAAuB,MAAM,UAAU,KAAK,IAAI,YAAY,QAAQ,KACpE,YAAY,MAAM,uBAAuB,MAAM,UAAU,KAAK,IAAI,YAAY,UAAU;AAC5F,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO,MAAM,UAAU;AAAA,IACvB;AAAA,IACA,WAAW,KAAK,MAAM,EAAE;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,QAAqC;AAC1E,UAAQ,OAAO,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,UAAU;AACnD,UAAM,OAAO,OAAO,IAAI,KAAK,CAAC;AAC9B,UAAM,WAAW,KAAK,KAAK,eAAe,KAAK;AAC/C,UAAM,gBAAgB,KAAK,KAAK,qBAAqB,KAAK;AAC1D,UAAM,QAAQ,KAAK,KAAK,MAAM;AAC9B,UAAM,YAAY,KAAK,KAAK,UAAU,MAAK,oBAAI,KAAK,CAAC,GAAE,YAAY;AACnE,UAAM,cAAc,OAAO,KAAK,QAAQ;AACxC,UAAM,WAAoC,gBACpC,YAAY,WAAW,UAAU,YAAY,WAAW,cACzD,KAAK,YAAY,UAAU,KAC3B,KAAK,YAAY,UAAU,IAC5B;AAAA,MACE,QAAQ,YAAY,WAAW,SAAS,SAAS;AAAA,MACjD,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,OAAO,YAAY,UAAU,EAAE,CAAC,IACvC,YAAY,SACZ;AAAA,MACJ,SAAS,KAAK,YAAY,OAAO;AAAA,MACjC,YAAY,OAAO,YAAY,UAAU;AAAA,MACzC,YAAY,OAAO,YAAY,UAAU;AAAA,IAC3C,IACA;AACJ,UAAM,cAAc,MAAM,QAAQ,KAAK,WAAW,IAC9C,KAAK,YAAY,QAAQ,CAAC,eAAe;AACvC,YAAM,QAAQ,OAAO,UAAU;AAC/B,aAAO,QAAQ,CAAC,iCAAiC,KAAyB,CAAC,IAAI,CAAC;AAAA,IAClF,CAAC,IACD,CAAC;AACL,UAAM,SAAwB,CAAC;AAC/B,QAAI,YAAY,YAAY,OAAQ,QAAO,KAAK;AAAA,MAC9C,IAAI,OAAO,KAAK,MAAM,GAAG,SAAS,KAAK,OAAO;AAAA,MAC9C,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,OAAO,WAAW,CAAC,EAAE,IAAI,GAAG,SAAS,KAAK,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS,CAAC,IAAI,CAAC;AAAA,MACzG;AAAA,MACA,cAAc,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IACxE,CAAC;AACD,QAAI,iBAAiB,MAAM,QAAQ,KAAK,eAAe,GAAG;AACxD,YAAM,iBAAiB;AAAA,QACrB,KAAK;AAAA,QACL;AAAA,QACA,GAAG,SAAS,KAAK,MAAM,KAAK;AAAA,MAC9B;AACA,aAAO,KAAK;AAAA,QACV,IAAI,GAAG,SAAS,KAAK,MAAM,KAAK;AAAA,QAChC,MAAM;AAAA,QACN;AAAA,QACA,SAAS;AAAA,QACT,WAAW,KAAK,KAAK,YAAY,KAAK;AAAA,QACtC,SAAS,CAAC,CAAC,UAAU,WAAW,UAAU,YAAY,EAAE,SAAS,OAAO,KAAK,UAAU,EAAE,EAAE,YAAY,CAAC;AAAA,QACxG;AAAA,QACA,OAAO;AAAA,QACP,cAAc,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,MACxE,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,yBACd,OACA,QACe;AACf,QAAM,gBAAgB,IAAI,KAAK,QAAQ,SAAS,CAAC,GAAG,QAAQ,CAAC,SAC3D,KAAK,UAAU,KAAK,WAAW,CAAC,CAAC,KAAK,QAAQ,KAAK,QAAQ,CAAU,IAAI,CAAC,CAAC,CAAC;AAC9E,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,cAAc,KAAK;AAAA,IACnB,SAAS,KAAK;AAAA,IACd,WAAW,KAAK;AAAA,IAChB,SAAS,KAAK,WAAW,eAAe,KAAK,WAAW;AAAA,IACxD,OAAO,KAAK,SAAS,cACjB,wBAAwB,KAAK,iBAAiB,KAAK,MAAM,GAAG,KAAK,EAAE,OAAO,IAC1E,KAAK,OAAO,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,SAAS,MAAM,QAAiB,MAAM,QAAiB,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC;AAAA,IAC9G,aAAa,KAAK,SAAS,SAAS,KAAK,eAAe,IAAI,CAAC,OAAO;AAClE,YAAM,aAAa,KAAK,aAAa,KAAK,CAAC,eAAe,WAAW,OAAO,EAAE;AAC9E,aAAO,EAAE,IAAI,UAAU,YAAY,YAAY,cAAc,WAAW,YAAY,aAAa,2BAA2B;AAAA,IAC9H,CAAC,IAAI;AAAA,IACL,UAAU,KAAK,SAAS,eAAe,KAAK,SAAS,cAAc,IAAI,KAAK,MAAM,IAAoC;AAAA,EACxH,EAAE;AACJ;AAEO,SAAS,oBAAoB,QAGlC;AACA,MAAI,gBAAsC;AAC1C,aAAW,QAAQ,OAAO,SAAS,CAAC,GAAG;AACrC,oBAAgB,yBAAyB,eAAe,KAAK,cAAc;AAAA,EAC7E;AACA,SAAO;AAAA,IACL;AAAA,IACA,oBAAoB,6BAA6B,aAAa;AAAA,EAChE;AACF;AAEO,SAAS,iCAAiC,QAA0C;AACzF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,OAAO;AAAA,IACX,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,EACjB;AACF;;;ACvtBA,YAAY,WAAW;AAwCd;AArBT,IAAM,kBAAwB,oBAA2C,IAAI;AAUtE,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAA0B;AACxB,QAAM,QAAc;AAAA,IAClB,OAAO,EAAE,QAAQ,uBAAuB,UAAU,QAAQ;AAAA,IAC1D,CAAC,QAAQ,uBAAuB,UAAU,OAAO;AAAA,EACnD;AACA,SAAO,oBAAC,gBAAgB,UAAhB,EAAyB,OAAe,UAAS;AAC3D;AAEO,SAAS,qBAA2C;AACzD,QAAM,QAAc,iBAAW,eAAe;AAC9C,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,0DAA0D;AACtF,SAAO;AACT;AAEO,SAAS,iBAA8B;AAC5C,SAAO,mBAAmB,EAAE;AAC9B;;;ACrCO,SAAS,6BAAqE;AACnF,QAAM,UAAU;AAChB,MAAI,OAAO,QAAQ,0BAA0B,WAAY,QAAO;AAChE,SAAO,CAAC,aAAa;AACnB,UAAM,SAAS,QAAQ,wBAAwB,QAAQ;AACvD,WAAO,MAAM;AACX,UAAI,WAAW,OAAW,SAAQ,uBAAuB,MAAM;AAAA,IACjE;AAAA,EACF;AACF;AAEO,SAAS,8BACd,OACA,eACyB;AACzB,MAAI,UAA0B,CAAC;AAC/B,MAAI,cAAmC;AAEvC,QAAM,QAAQ,MAAM;AAClB,kBAAc;AACd,kBAAc;AACd,QAAI,CAAC,QAAQ,OAAQ;AACrB,UAAM,SAAS;AACf,cAAU,CAAC;AACX,UAAM,MAAM;AAAA,EACd;AAEA,SAAO;AAAA,IACL,UAAU;AACR,oBAAc;AACd,oBAAc;AACd,gBAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,IACA,KAAK,OAAO;AACV,UAAI,MAAM,UAAU,qBAAqB,CAAC,eAAe;AACvD,gBAAQ,KAAK,KAAK;AAClB,cAAM;AACN;AAAA,MACF;AACA,cAAQ,KAAK,KAAK;AAClB,UAAI,YAAa;AACjB,oBAAc,cAAc,MAAM;AAChC,sBAAc;AACd,YAAI,CAAC,QAAQ,OAAQ;AACrB,cAAM,SAAS;AACf,kBAAU,CAAC;AACX,cAAM,MAAM;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACjEA;AAAA,EACE,gCAAAC;AAAA,EACA,4BAAAC;AAAA,EACA,+BAAAC;AAAA,OAGK;AA+CA,IAAM,wBAAwC;AAAA,EACnD,SAAS,CAAC;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU,CAAC;AAAA,EACX,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,4BAA4B;AAAA,EAC5B,UAAU;AAAA,EACV,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAeO,SAAS,gCACd,OACkC;AAClC,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,gBAAgB,MAAM;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,oBAAoB,MAAM;AAAA,IAC1B,eAAe,MAAM;AAAA,IACrB,oBAAoB,MAAM;AAAA,IAC1B,4BAA4B,MAAM;AAAA,EACpC;AACF;AAEO,SAAS,gCACd,OACA,UACgB;AAChB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,UAAU,SAAS,cAAc,iBAAiB,SAAS;AAAA,EAC7D;AACF;AAEO,SAAS,4BACd,OACA,WACA,OACgB;AAChB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB,EAAE,MAAM,aAAa,WAAW,MAAM;AAAA,EACxD;AACF;AAEO,SAAS,6BACd,OACA,WACgB;AAChB,MAAI,CAAC,MAAM,kBAAmB,aAAa,MAAM,eAAe,cAAc,WAAY;AACxF,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,OAAO,gBAAgB,KAAK;AAC1C;AAEO,SAAS,6BACd,OACA,OACgB;AAChB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB,EAAE,MAAM,cAAc,QAAQ,iBAAiB,MAAM;AAAA,EACxE;AACF;AAEO,SAAS,8BAA8B,OAAuC;AACnF,SAAO,MAAM,kBAAkB,EAAE,GAAG,OAAO,iBAAiB,KAAK,IAAI;AACvE;AAMO,SAAS,0BACd,SACA,UACA,gBACA,mBAAkD,CAAC,GAC/B;AACpB,QAAM,cAAc,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACxE,QAAM,SAAS,SAAS,IAAI,CAAC,WAAW,0BAA0B,YAAY,IAAI,OAAO,EAAE,GAAG,MAAM,CAAC;AACrG,QAAM,SAAS,kBAAkB,CAAC,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,cAAc,IACpF,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,cAAc,IACrD;AACJ,QAAM,OAAO,QAAQ,aAAa,CAAC,QAAQ,GAAG,MAAM,IAAI;AACxD,SAAO,iBAAiB,OAAO,yBAAyB,IAAI;AAC9D;AAEO,SAAS,0BACd,SACA,UACkB;AAClB,MAAI,CAAC,SAAS,cAAc,CAAC,SAAS,WAAY,QAAO;AACzD,QAAM,cAAc,KAAK,MAAM,QAAQ,UAAU;AACjD,QAAM,eAAe,KAAK,MAAM,SAAS,UAAU;AACnD,SAAO,OAAO,SAAS,WAAW,KAAK,OAAO,SAAS,YAAY,KAAK,cAAc,eAClF,UAAU;AAChB;AAGO,SAAS,qBACd,OACA,UACgB;AAChB,QAAM,qBAAqB,SAAS,KAAK;AACzC,MAAI,CAAC,sBAAsB,MAAM,eAAgB,QAAO;AACxD,QAAM,WAAW,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,kBAAkB;AAChF,QAAM,UAA4B,WAC9B,EAAE,GAAG,UAAU,UAAU,MAAM,UAAU,YAAY,KAAK,IAC1D;AAAA,IACE,IAAI;AAAA,IACJ,mBAAmB,EAAE,UAAU,MAAM,aAAa,MAAM,UAAU,KAAK;AAAA,IACvE,oBAAoB,CAAC;AAAA,IACrB,UAAU,MAAM;AAAA,IAChB,YAAY;AAAA,EACd;AACJ,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB;AAAA,IAChB,SAAS,WACL,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,qBAAqB,UAAU,MAAM,IACjF,CAAC,SAAS,GAAG,MAAM,OAAO;AAAA,EAChC;AACF;AAiBO,SAAS,0BACd,UACA,aACA,kBACY;AACZ,QAAM,OAAO,CAAC,GAAG,QAAQ;AACzB,MAAI,CAAC,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,YAAY,EAAE,EAAG,MAAK,KAAK,WAAW;AACjF,MAAI,CAAC,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,iBAAiB,MAAM;AAAA,IAChE,iBAAiB,SAAS,QAAQ,SAAS,eAAe,QAAQ,UAAU,iBAAiB;AAAA,EAC/F,CAAC,EAAG,MAAK,KAAK,gBAAgB;AAC9B,SAAO;AACT;AAGO,SAAS,0BACd,WACA,SACe;AACf,SAAO,UAAU,IAAI,CAAC,YAAY;AAChC,UAAM,UAAU,QAAQ,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,SAC3D,KAAK,cAAc,QAAQ,MAAM,KAAK,OAAO,QAAQ,MACjD,QAAQ,SAAS,eAAe,QAAQ,iBAAiB,KAAK,KAAK,SAClE,KAAK,UAAU,QAAQ,SAAS,CAAC,KAAK,UAC5C;AACD,WAAO,WAAW,QAAQ,OAAO,QAAQ,KACrC,EAAE,GAAG,SAAS,IAAI,QAAQ,IAAI,WAAW,QAAQ,GAAG,IACpD;AAAA,EACN,CAAC;AACH;AAGO,SAAS,wBACd,SACA,WACA,aACA,oBACe;AACf,QAAM,UAAU,0BAA0B,WAAW,OAAO;AAC5D,QAAM,eAAe,IAAI,IAAI,QAAQ,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;AACjE,QAAM,WAAW,QAAQ,OAAO,CAAC,YAAY,CAAC,aAAa,IAAI,QAAQ,EAAE,MACvE,QAAQ,WAAY,gBAAgB,CAAC,QAAQ,SAAS,QAAQ,UAAU,aACzE;AACD,QAAM,aAAa,QAAQ,IAAI,CAAC,YAAY;AAC1C,UAAM,OAAO,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC1D,WAAO,eAAe,MAAM,SAAS,eAAe,KAAK,UAAU,gBAC7D,KAAK,OAAO,sBAAsB,CAAC,KAAK,WAC1C,EAAE,GAAG,SAAS,GAAG,MAAM,WAAW,QAAQ,aAAa,KAAK,UAAU,IACtE;AAAA,EACN,CAAC;AACD,SAAO,CAAC,GAAG,UAAU,GAAG,UAAU;AACpC;AAGO,SAAS,qBACd,SACA,SACA,OACe;AACf,QAAM,WAAW,EAAE,GAAG,SAAS,OAAO,SAAS,KAAK;AACpD,QAAM,QAAQ,QAAQ,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,MAAM,KAAK,cAAc,QAAQ,EAAE;AACjG,MAAI,QAAQ,EAAG,QAAO,CAAC,GAAG,SAAS,QAAQ;AAC3C,SAAO,QAAQ,IAAI,CAAC,MAAM,cAAc,cAAc,QAClD,EAAE,GAAG,MAAM,GAAG,UAAU,IAAI,KAAK,IAAI,WAAW,KAAK,OAAO,QAAQ,KAAK,KAAK,YAAY,QAAQ,GAAG,IACrG,IAAI;AACV;AAEO,SAAS,6BACd,UACA,OACY;AACZ,QAAM,OAAO,CAAC,GAAG,QAAQ;AACzB,aAAW,eAAe,MAAM,gBAAgB,CAAC,GAAG;AAClD,UAAM,WAAW,YAAY,SAAS,gBACpC,QAAQ,MAAM,aAAa,YAAY,OAAO,MAAM,SAAS,KAC1D,QAAQ,CAAC,MAAM,mBAAmB,MAAM,SAAS,YAAY,UAAU,MAAM,KAAK;AAEvF,QAAI,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,YAAY,QAAQ,OAAO,YAAY,EAAE,EAAG,MAAK,KAAK,WAAW;AAAA,EAChG;AACA,QAAM,aAAa,KAAK,UAAU,CAAC,YAAY,QAAQ,SAAS,eAAe,QAAQ,MAAM,aAAa,QAAQ,OAAO,MAAM,SAAS,CAAC;AACzI,QAAM,QAAQ,cAAc,IAAI,aAAa,MAAM,kBAAkB,KAAK,KAAK,UAAU,CAAC,YACxF,QAAQ,SAAS,eAAe,QAAQ,MAAM,SAAS,QAAQ,UAAU,MAAM,KAAK,CAAC;AACvF,MAAI,UAAU,GAAI,MAAK,KAAK,MAAM,OAAO,CAAC;AAAA,MACrC,MAAK,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,CAAC;AAC3C,SAAO;AACT;AAEA,SAAS,qBACP,OACA,OACA,gBACsB;AACtB,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,QAAM,WAAW,KAAK,KAAK,SAAS,CAAC;AACrC,MAAI,UAAU,SAAS,QAAQ;AAC7B,SAAK,KAAK,SAAS,CAAC,IAAI,EAAE,GAAG,UAAU,MAAM,GAAG,SAAS,IAAI,GAAG,KAAK,GAAG;AACxE,WAAO;AAAA,EACT;AACA,OAAK,KAAK,EAAE,IAAI,gBAAgB,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,CAAC;AACzE,SAAO;AACT;AAEA,SAAS,yBACP,OACA,UACsB;AACtB,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,aAAW,QAAQ,UAAU;AAC3B,UAAM,QAAQ,KAAK,UAAU,CAAC,YAAY,QAAQ,OAAO,KAAK,EAAE;AAChE,QAAI,UAAU,GAAI,MAAK,KAAK,IAAI;AAAA,QAC3B,MAAK,KAAK,IAAI;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,wBACP,OACA,OACsB;AACtB,QAAM,YAAY,OAAO,MAAM,SAAS,EAAE;AAC1C,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,WAAW,cAAc,mBAAmB,cAAc,gBAAgB,cAAc;AAC9F,QAAM,cAAc,OAAO,QAAQ,kBAAkB,WAAW,QAAQ,gBAAgB;AACxF,MAAI,OAAO;AAEX,MAAI,cAAc,kBAAkB,UAAU;AAC5C,WAAO,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,YAAY;AAAA,EACzD,WAAW,cAAc,qBAAqB,OAAO,QAAQ,YAAY,YAAY,QAAQ,SAAS;AACpG,WAAO,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,gBAAgB,KAAK,aAAa,OAAO;AAAA,EACtF,WAAW,UAAU,WAAW,OAAO,KAAK,cAAc,uBAAuB;AAC/E,WAAO,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,gBAAgB,KAAK,aAAa,OAAO;AAAA,EACtF,YACG,cAAc,uBAAwB,cAAc,0BAA0B,QAAQ,YAAY,iBAChG,aACH;AACA,WAAO,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,gBAAgB,KAAK,gBAAgB,WAAW;AAAA,EAC7F;AAEA,QAAM,SAAS,uBAAuB,KAAK;AAC3C,SAAO,SAAS,yBAAyB,MAAM,CAAC,MAAM,CAAC,IAAI;AAC7D;AAEO,SAAS,kBAAkB,OAAuB,OAAqC;AAC5F,MAAI,MAAM,UAAU,kBAAkB,OAAO,MAAM,SAAS,eAAe,UAAU;AACnF,UAAMC,aAAY,MAAM,QAAQ;AAChC,QAAI,kBAAkB;AACtB,aAAS,QAAQ,MAAM,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAClE,YAAM,UAAU,MAAM,SAAS,KAAK;AACpC,UAAI,QAAQ,SAAS,UAAU,CAAC,QAAQ,SAAS,CAAC,QAAQ,WAAW;AACnE,0BAAkB;AAClB;AAAA,MACF;AAAA,IACF;AACA,QAAI,mBAAmB,GAAG;AACxB,cAAQ,EAAE,GAAG,OAAO,UAAU,MAAM,SAAS,IAAI,CAAC,SAAS,UAAU,UAAU,kBAC3E,EAAE,GAAG,SAAS,WAAWA,YAAW,OAAO,MAAM,OAAO,IACxD,QAAQ,SAAS,eAAe,CAAC,QAAQ,QACvC,EAAE,GAAG,SAAS,OAAO,MAAM,OAAO,IAClC,OAAO,EAAE;AAAA,IACjB;AAAA,EACF;AACA,QAAM,aAAa,6BAA6B,KAAK;AACrD,QAAM,YAAY,OAAO,MAAM,SAAS,EAAE;AAC1C,QAAM,QAAQ,MAAM,eAAe,MAAM,UAAU,iBAC/C,MAAM,cAAc,MAAM,UAAU,MAAM;AAC9C,QAAM,YAAY,OAAO,MAAM,SAAS,eAAe,WAAW,MAAM,QAAQ,aAAa;AAC7F,QAAM,kBAAkB,QAAQ,aAAa,cAAc,GAAG,KAAK,IAAI;AACvE,QAAM,YAAY,kBACd,GAAG,SAAS,KAAK,cAAc,SAAS,KACxC,MAAM,sBAAsB,GAAG,SAAS,KAAK;AACjD,QAAM,WAAW,cAAc,mBAAmB,cAAc,gBAAgB,cAAc;AAC9F,QAAM,SAAS,cAAc,gBAAgB,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU,KAAK,WAAW,SAAS;AAC9H,QAAM,aAAa,cAAc,gBAAgB,YAAY,cAAc,oBAAoB,gBAAgB;AAC/G,QAAM,aAAa,cAAc,oBAAoB,OAAO,MAAM,SAAS,UAAU,EAAE,MAAM;AAC7F,QAAM,WAAW,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,eAAe,QAAQ,OAAO,SAAS,MACpG,CAAC,kBAAkB,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,eAAe,QAAQ,SAAS,QAAQ,UAAU,KAAK,CAAC,IAAI;AACvI,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,gBAAgB,OAAO,QAAQ,cAAc,YAAY,QAAQ,UAAU,KAAK,IAClF,QAAQ,UAAU,KAAK,IACvB;AACJ,QAAM,kBACH,CAAC,MAAM,kBAAkB,CAAC,iBAAiB,kBAAkB,MAAM,oBAChE,CAAC,MAAM,eAAe,CAAC,SAAS,UAAU,MAAM;AAEtD,QAAM,iBAAiB,QAAQ,kBAAkB,OAAO,QAAQ,mBAAmB,WAC/E,EAAE,GAAG,QAAQ,gBAA2C,QAAQ,MAAM,IACtE,QAAQ;AACZ,QAAM,gBAAgB,iBAClBC,0BAAyB,MAAM,eAAe,cAAc,IAC5D,MAAM;AACV,QAAM,sBAAsB,iBACxBC,6BAA4B,QAAQ,mBAAmB,IACvD;AACJ,QAAM,qBAAqB,iBACvB,uBAAuBC,8BAA6B,aAAa,KAAK,MAAM,qBAC5E,MAAM;AACV,QAAM,2BAA2B;AAAA,IAC/B,mBAEE,qBAAqB,UAClBA;AAAA,MACDF,0BAAyB,MAAM,cAAc;AAAA,IAC/C,GAAG;AAAA,EAEP;AACA,QAAM,QAAQ,cAAc,qBAAqB,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AACzG,QAAM,6BAA6B,MAAM,QAAQ,QAAQ,eAAe;AACxE,QAAM,UAAU,6BACZ,WAAW,UACX,QACE,GAAG,UAAU,WAAW,EAAE,GAAG,KAAK,KAClC,WAAW,WAAW,UAAU,WAAW;AACjD,QAAM,iBAAiB,6BACnB,WAAW,QACX,QACE;AAAA,IACE,UAAU,SAAS,CAAC;AAAA,IACpB;AAAA,IACA,GAAG,SAAS,KAAK,mBAAmB,MAAM,GAAG;AAAA,EAC/C,IACA,WAAW,MAAM,SACf,yBAAyB,UAAU,SAAS,CAAC,GAAG,WAAW,KAAK,IAChE,UAAU,SAAS,CAAC;AAC5B,QAAM,iBAAiB,wBAAwB,gBAAgB,KAAK;AACpE,QAAM,kBAAkB,kBAAkB,qBAAqB,SAC3D,gCAAgC,OAAO,cAAc,IACrD;AACJ,QAAM,QAAQ,kBACV,yBAAyB,gBAAgB,CAAC,eAAe,CAAC,IAC1D;AACJ,QAAM,iBAAiB,iBAAiB,MAAM;AAC9C,QAAM,WAAW,6BAA6B,MAAM,UAAU;AAAA,IAC5D;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,QAAQ,OAAO;AAAA,MACb,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,SAAS;AAAA,MACT;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,aAAa;AAAA,MACpB,GAAG;AAAA,MACH,OAAO,SAAS,QAAQ;AAAA,MACxB;AAAA,MACA;AAAA,MACA,SAAS,YAAY,QAAQ;AAAA,IAC/B;AAAA,EACF,CAAC;AACD,QAAM,UAAU,iBACZ,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,cAAc,IACzD,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,iBAC1C;AAAA,IACE,GAAG;AAAA,IACH;AAAA,IACA,YAAY;AAAA,IACZ,aAAa,SAAS,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,IACA,MAAM,IACR,CAAC;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,mBAAmB,EAAE,UAAU,MAAM,aAAa,MAAM,UAAU,KAAK;AAAA,IACvE,oBAAoB,CAAC;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF,GAAG,GAAG,MAAM,OAAO,IACrB,MAAM;AACV,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,aAAa,WAAW,OAAO;AAAA,IAC/B,QAAQ,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM,MAAM;AAAA,IAC1D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,4BAA4B,2BACxB,MAAM,6BAA6B,IACnC,MAAM;AAAA,IACV,UAAU,eAAe,SACrB,WACA,aACE,eACA,WACE,cAAc,kBACZ,cACA,cAAc,kBACZ,cACA,WACJ;AAAA,IACR,oBAAoB,YAAY,UAAU,aAAa,OAAO;AAAA,EAChE;AACF;AAEO,SAAS,mBACd,OACA,QACgB;AAChB,SAAO,OAAO,OAAO,mBAAmB,KAAK;AAC/C;AAEO,SAAS,wBAAwB,SAA6B,OAA+C;AAClH,MAAI,OAAO,MAAM,KAAK,MAAM,uBAAuB;AACjD,UAAM,QAAQ;AACd,UAAM,SAAS,MAAM,MAAM;AAC3B,QAAI,OAAO,WAAW,SAAU,QAAO;AACvC,WAAO,QAAQ,IAAI,YAAU,OAAO,OAAO,MAAM,YAAY;AAAA,MAAE,GAAG;AAAA,MAChE,mBAAmB;AAAA,QAAC,IAAI,OAAO,qBAAqB,CAAC,GAAG,OAAO,UAAQ,KAAK,WAAW,MAAM;AAAA,QACzE,EAAE,GAAG,MAAM,MAAM,OAAO;AAAA,MAAC,EAAE,MAAM,IAAK;AAAA,IAAE,IAAI,MAAM;AAAA,EAC1E;AACA,MAAI,MAAM,UAAU,oBAAqB,QAAO;AAChD,MAAI,MAAM,UAAU,iBAAkB,QAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,OAAO,MAAM,SAAS;AACrG,MAAI,MAAM,UAAU,yBAA0B,QAAO;AACrD,QAAM,WAAW,MAAM;AACvB,QAAM,QAAQ,QAAQ,UAAU,CAAC,WAAW,OAAO,OAAO,SAAS,EAAE;AACrE,MAAI,UAAU,GAAI,QAAO,CAAC,EAAE,GAAG,UAAU,UAAU,SAAS,YAAY,CAAC,GAAG,YAAY,MAAM,GAAG,GAAG,OAAO;AAC3G,QAAM,OAAO,CAAC,GAAG,OAAO;AACxB,OAAK,KAAK,IAAI,0BAA0B,KAAK,KAAK,GAAG;AAAA,IACnD,GAAG,KAAK,KAAK;AAAA,IAAG,GAAG;AAAA,IAAU,UAAU,KAAK,KAAK,EAAE;AAAA,IAAU,YAAY,KAAK,KAAK,EAAE;AAAA,EACvF,CAAC;AACD,SAAO;AACT;;;ACjiBA,YAAYG,YAAW;AAuBhB,SAAS,sBAAsB,EAAE,UAAU,WAAW,WAAW,GAIrE;AACD,QAAM,CAAC,iBAAiB,kBAAkB,IAAU,gBAAmC,CAAC,CAAC;AACzF,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAyC,IAAI;AAC3F,QAAM,aAAmB,cAAO,oBAAI,IAA2B,CAAC;AAChE,QAAM,aAAmB,cAAO,CAAC;AACjC,QAAM,YAAkB,cAAO,CAAC;AAChC,QAAM,cAAoB,cAAO,oBAAI,IAAY,CAAC;AAClD,QAAM,YAAkB,cAAO,QAAQ;AACvC,QAAM,eAAqB,cAAO,SAAS;AAC3C,QAAM,gBAAsB,cAAO,UAAU;AAC7C,YAAU,UAAU;AACpB,eAAa,UAAU;AACvB,gBAAc,UAAU;AAExB,QAAM,UAAgB,mBAAY,CAAC,MAA0B,qBAA6B;AACxF,QAAI,UAAU,YAAY,iBAAkB;AAC5C,UAAM,UAAU,KAAK,QAAQ,OAAO,CAAC,YAAY,CAAC,YAAY,QAAQ,IAAI,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY;AACtG,YAAM,QAAQ,WAAW,QAAQ,IAAI,QAAQ,EAAE;AAC/C,UAAI,QAAQ,aAAa,UAAU,CAAC,OAAO,aAAa,OAAQ,QAAO;AACvE,aAAO,EAAE,GAAG,SAAS,aAAa,MAAM,YAAY,OAAO,CAAC,eAC1D,QAAQ,eAAe,SAAS,WAAW,EAAE,CAAC,EAAE;AAAA,IACpD,CAAC;AACD,eAAW,WAAW,QAAS,YAAW,QAAQ,IAAI,QAAQ,IAAI,OAAO;AACzE,uBAAmB,OAAO;AAC1B,oBAAgB,KAAK,KAAK;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,UAAgB,mBAAY,OAAO,mBAAmB,UAAU,YAAY;AAChF,QAAI,CAAC,iBAAkB,QAAO;AAC9B,UAAM,UAAU,EAAE,WAAW;AAC7B,UAAM,OAAO,MAAM,aAAa,QAAQ,KAAK,gBAAgB;AAC7D,QAAI,YAAY,WAAW,WAAW,UAAU,YAAY,iBAAkB,QAAO;AACrF,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,KAAK,SAAS,UAAU,KAAK,WAAW,eAAe,KAAK,QAAQ;AACtE,cAAM,UAAU,WAAW,QAAQ,IAAI,KAAK,EAAE;AAC9C,YAAI,WAAW,CAAC,YAAY,QAAQ,IAAI,KAAK,EAAE,GAAG;AAChD,sBAAY,QAAQ,IAAI,KAAK,EAAE;AAC/B,qBAAW,QAAQ,OAAO,KAAK,EAAE;AACjC,wBAAc,QAAQ;AAAA,YAAE,GAAG;AAAA,YAAS,GAAG;AAAA,YACrC,aAAa,KAAK,aAAa,SAAS,KAAK,cAAc,QAAQ;AAAA,UAAY,GAAG,KAAK,MAAM;AAAA,QACjG;AAAA,MACF;AAAA,IACF;AACA,YAAQ,MAAM,gBAAgB;AAC9B,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,eAAqB,mBAAY,CAAC,WAAgC;AACtE,QAAI,OAAO,UAAU,OAAO,UAAU,UAAU,QAAS,QAAO;AAChE,QAAI,OAAO,OAAQ,WAAU,UAAU,OAAO;AAC9C,UAAM,UAAU,WAAW,QAAQ,IAAI,OAAO,SAAS;AACvD,QAAI,OAAO,WAAW,eAAe,OAAO,SAAS,WAAW,CAAC,YAAY,QAAQ,IAAI,QAAQ,EAAE,GAAG;AACpG,kBAAY,QAAQ,IAAI,QAAQ,EAAE;AAClC,iBAAW,QAAQ,OAAO,QAAQ,EAAE;AACpC,iBAAW,WAAW;AACtB,yBAAmB,CAAC,YAAY,QAAQ,OAAO,CAAC,YAAY,QAAQ,OAAO,QAAQ,EAAE,CAAC;AACtF,oBAAc,QAAQ,SAAS,OAAO,KAAK;AAAA,IAC7C;AACA,QAAI,OAAO,WAAW,UAAW,YAAW,QAAQ,OAAO,OAAO,SAAS;AAC3E,SAAK,QAAQ,EAAE,MAAM,MAAM,MAAS;AACpC,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,SAAe,mBAAY,OAAO,UAElC;AACJ,UAAM,mBAAmB,UAAU;AACnC,QAAI,CAAC,iBAAkB,OAAM,IAAI,MAAM,sCAAsC;AAC7E,UAAM,EAAE,aAAa,GAAG,WAAW,IAAI;AACvC,UAAM,SAAS,MAAM,aAAa,QAAQ,OAAO,EAAE,GAAG,YAAY,UAAU,iBAAiB,CAAC;AAC9F,QAAI,UAAU,YAAY,iBAAkB,QAAO;AACnD,eAAW,WAAW;AACtB,QAAI,CAAC,OAAO,UAAU,CAAC,UAAU,iBAAiB,SAAS,EAAE,SAAS,OAAO,MAAM,GAAG;AACpF,YAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,YAAM,UAAyB;AAAA,QAC7B,IAAI,OAAO;AAAA,QAAY,WAAW;AAAA,QAAkB,UAAU,OAAO;AAAA,QACrE,QAAQ;AAAA,QAAM,SAAS;AAAA,QAAM,eAAe;AAAA,QAAM,MAAM;AAAA,QAAQ,QAAQ,OAAO;AAAA,QAC/E,gBAAgB,MAAM;AAAA,QAAM,MAAM,MAAM;AAAA,QAAO,gBAAgB,MAAM,iBAAiB,CAAC;AAAA,QACvF;AAAA,QACA,iBAAiB,CAAC;AAAA,QAAG,UAAU;AAAA,QAAG,YAAY;AAAA,QAAK,YAAY;AAAA,MACjE;AACA,iBAAW,QAAQ,IAAI,QAAQ,IAAI,OAAO;AAC1C,yBAAmB,CAAC,YAAY,QAAQ,KAAK,CAAC,YAAY,QAAQ,OAAO,QAAQ,EAAE,IAC/E,UAAU,CAAC,GAAG,SAAS,OAAO,CAAC;AACnC,sBAAgB,CAAC,aAAa;AAAA,QAAE,eAAe,KAAK,IAAI,SAAS,iBAAiB,GAAG,OAAO,kBAAkB,CAAC;AAAA,QAC7G,QAAQ,SAAS,UAAU;AAAA,QAAO,QAAQ,SAAS,UAAU;AAAA,MAAK,EAAE;AAAA,IACxE;AACA,SAAK,QAAQ,EAAE,MAAM,MAAM,MAAS;AACpC,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,OAAa,mBAAY,OAAO,SAAwB,UAAqI;AACjM,UAAM,UAAU,MAAM,aAAa,QAAQ,KAAK,SAAS,KAAK;AAC9D,eAAW,WAAW;AACtB,eAAW,QAAQ,IAAI,QAAQ,IAAI,OAAO;AAC1C,UAAM,QAAQ,QAAQ,SAAS;AAC/B,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,SAAe,mBAAY,OAAO,YAA2B;AACjE,UAAM,aAAa,QAAQ,OAAO,OAAO;AACzC,eAAW,WAAW;AACtB,eAAW,QAAQ,OAAO,QAAQ,EAAE;AACpC,uBAAmB,CAAC,YAAY,QAAQ,OAAO,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE,CAAC;AAChF,UAAM,QAAQ,QAAQ,SAAS;AAAA,EACjC,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,iBAAuB,mBAAY,OAAO,YAA2D;AACzG,UAAM,OAAO,OAAO;AACpB,WAAO,EAAE,MAAM,QAAQ,MAAM,gBAAgB,QAAQ,gBAAgB,aAAa,QAAQ,YAAY;AAAA,EACxG,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,SAAe,mBAAY,YAAY;AAC3C,UAAM,mBAAmB,UAAU;AACnC,QAAI,CAAC,iBAAkB,QAAO;AAC9B,UAAM,SAAS,MAAM,aAAa,QAAQ,OAAO,gBAAgB;AACjE,UAAM,QAAQ,gBAAgB;AAC9B,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,EAAM,iBAAU,MAAM;AACpB,eAAW,WAAW;AACtB,cAAU,UAAU;AACpB,gBAAY,QAAQ,MAAM;AAC1B,eAAW,QAAQ,MAAM;AACzB,uBAAmB,CAAC,CAAC;AACrB,oBAAgB,IAAI;AACpB,QAAI,SAAU,MAAK,QAAQ,QAAQ,EAAE,MAAM,MAAM,MAAS;AAAA,EAC5D,GAAG,CAAC,UAAU,OAAO,CAAC;AAEtB,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,YAAY,CAAC,gBAAgB,UAAU,cAAc,OAAQ;AAClE,UAAM,QAAQ;AAId,UAAM,QAAQ,MAAM,YAAY,MAAM;AAAE,WAAK,QAAQ,QAAQ,EAAE,MAAM,MAAM,MAAS;AAAA,IAAG,GAAG,GAAI;AAC9F,WAAO,MAAM,MAAM,cAAc,KAAK;AAAA,EACxC,GAAG,CAAC,UAAU,gBAAgB,QAAQ,cAAc,QAAQ,OAAO,CAAC;AAEpE,SAAO,EAAE,iBAAiB,cAAc,SAAS,SAAS,cAAc,QAAQ,MAAM,QAAQ,gBAAgB,OAAO;AACvH;;;AC/JA,YAAYC,YAAW;;;ACGvB,SAAS,iBAAiB,QAAyB,OAA8B;AAC/E,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,OAAO,QAAS,QAAO,QAAQ;AACnC,UAAM,QAAQ;AAId,UAAM,SAAS,MAAM;AACnB,YAAM,aAAa,KAAK;AACxB,aAAO,oBAAoB,SAAS,MAAM;AAC1C,cAAQ;AAAA,IACV;AACA,UAAM,QAAQ,MAAM,WAAW,QAAQ,KAAK;AAC5C,WAAO,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AAAA,EACzD,CAAC;AACH;AAGA,eAAsB,2BAA2B,OAAiD;AAChG,MAAI;AACJ,MAAI,WAAW;AACf,SAAO,CAAC,MAAM,OAAO,SAAS;AAC5B,QAAI,wBAAwB;AAC5B,QAAI;AACF,YAAM,MAAM,OAAO,QAAQ,OAAO,EAAE,QAAQ,QAAQ,MAAM,OAAO,GAAG,OAAO,UAAU;AACnF,YAAI,MAAM,UAAU,qBAAqB;AACvC,gBAAM,MAAM,QAAQ;AACpB,mBAAS;AACT,kCAAwB;AACxB;AAAA,QACF;AACA,iBAAS,MAAM;AACf,mBAAW;AACX,cAAM,MAAM,QAAQ,KAAK;AAAA,MAC3B,CAAC;AACD,UAAI,MAAM,OAAO,QAAS;AAE1B,UAAI,CAAC,sBAAuB,OAAM,MAAM,QAAQ;AAChD,YAAM,YAAY;AAClB,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,UAAI,MAAM,OAAO,WAAW,YAAY,KAAK,EAAG;AAChD,YAAM,QAAQ,KAAK;AACnB,kBAAY;AACZ,UAAI;AACF,cAAM,MAAM,QAAQ;AACpB,cAAM,YAAY;AAAA,MACpB,SAAS,cAAc;AACrB,YAAI,CAAC,MAAM,OAAO,WAAW,CAAC,YAAY,YAAY,EAAG,OAAM,QAAQ,YAAY;AAAA,MACrF;AAAA,IACF;AACA,QAAI,CAAC,MAAM,OAAO,SAAS;AACzB,YAAM,iBAAiB,MAAM,QAAQ,KAAK,IAAI,KAAQ,MAAQ,KAAK,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC;AAAA,IAC3F;AAAA,EACF;AACF;;;AClEA,YAAYC,YAAW;AAKhB,SAAS,gBAAgB,QAAmD;AACjF,SAAO,EAAE,GAAI,QAA6B,IAAI,OAAO,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,YAAY,MAAM;AACnG;AAEO,SAAS,uBAAuB,EAAE,QAAQ,gBAAgB,UAAU,QAAQ,qBAAqB,cAAc,GAOnH;AACD,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAS,KAAK;AACpE,QAAM,CAAC,sBAAsB,uBAAuB,IAAU,gBAAS,KAAK;AAC5E,QAAM,CAAC,aAAa,cAAc,IAAU,gBAA6B;AACzE,QAAM,oBAA0B,cAA6B,IAAI;AACjE,QAAM,yBAA+B,cAAoC,IAAI;AAE7E,QAAM,iBAAuB,mBAAY,MAAqB;AAC5D,QAAI,kBAAkB,QAAS,QAAO,kBAAkB;AACxD,wBAAoB;AACpB,wBAAoB,IAAI;AACxB,2BAAuB,UAAU,CAAC;AAClC,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,QAAQ,KAAK,EAAE,OAAO,eAAe,CAAC;AAClE,cAAM,mBAAmB,uBAAuB,WAAW,CAAC;AAC5D,+BAAuB,UAAU;AACjC,uBAAe,OAAO,KAAK;AAC3B,eAAO,CAAC,YAAY;AAClB,gBAAM,OAAO,IAAI,IAAI,QAAQ,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACzE,gBAAM,WAAW,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1C,kBAAM,WAAW,KAAK,IAAI,KAAK,EAAE;AACjC,mBAAO,EAAE,GAAG,UAAU,GAAG,gBAAgB,IAAI,GAAG,UAAU,UAAU,YAAY,CAAC,GAAG,YAAY,UAAU,WAAW;AAAA,UACvH,CAAC;AACD,iBAAO,EAAE,GAAG,SAAS,SAAS,0BAA0B,QAAQ,SAAS,UAAU,QAAQ,gBAAgB,gBAAgB,EAAE;AAAA,QAC/H,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,CAAC,YAAY,KAAK,GAAG;AACvB,wBAAc,mBAAmB,KAAK;AACtC,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA,+BAAuB,UAAU;AACjC,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF,GAAG;AACH,sBAAkB,UAAU;AAC5B,SAAK,QAAQ,QAAQ,MAAM;AACzB,UAAI,kBAAkB,YAAY,QAAS,mBAAkB,UAAU;AAAA,IACzE,CAAC,EAAE,MAAM,MAAM,MAAS;AACxB,WAAO;AAAA,EACT,GAAG,CAAC,qBAAqB,QAAQ,eAAe,gBAAgB,MAAM,CAAC;AAEvE,QAAM,kBAAwB,mBAAY,YAAY;AACpD,QAAI,qBAAsB;AAC1B,UAAM,OAAO,SAAS,QAAQ,QAAQ;AACtC,QAAI,gBAAgB,UAAa,QAAQ,YAAa;AACtD,wBAAoB;AACpB,4BAAwB,IAAI;AAC5B,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,KAAK,EAAE,MAAM,OAAO,eAAe,CAAC;AACxE,qBAAe,OAAO,KAAK;AAC3B,aAAO,CAAC,YAAY;AAClB,cAAM,OAAO,IAAI,IAAI,QAAQ,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACzE,mBAAW,QAAQ,OAAO,OAAO;AAC/B,gBAAM,WAAW,KAAK,IAAI,KAAK,EAAE;AACjC,eAAK,IAAI,KAAK,IAAI,0BAA0B,UAAU;AAAA,YACpD,GAAG;AAAA,YAAU,GAAG,gBAAgB,IAAI;AAAA,YAAG,UAAU,UAAU,YAAY,CAAC;AAAA,YAAG,YAAY,UAAU;AAAA,UACnG,CAAC,CAAC;AAAA,QACJ;AACA,eAAO,EAAE,GAAG,SAAS,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE;AAAA,MACnD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,sBAAc,qBAAqB,KAAK;AACxC,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,8BAAwB,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,qBAAqB,QAAQ,eAAe,sBAAsB,UAAU,gBAAgB,aAAa,MAAM,CAAC;AAEpH,SAAO,EAAE,kBAAkB,sBAAsB,aAAa,wBAAwB,gBAAgB,gBAAgB;AACxH;;;ACzFA,YAAYC,YAAW;AAIhB,SAAS,qBAAqB,EAAE,QAAQ,QAAQ,qBAAqB,cAAc,GAKvF;AACD,SAAa,mBAAY,OAAO,SAAsB,UAIhD;AACJ,UAAM,QAAQ,QAAQ;AACtB,QAAI,CAAC,SAAS,QAAQ,SAAS,eAAe,QAAQ,YAAY,OAAO;AACvE,YAAM,QAAQ,IAAI,MAAM,sDAAsD;AAC9E,oBAAc,gBAAgB,KAAK;AACnC,YAAM;AAAA,IACR;AACA,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAM,aAAsC,MAAM,SAAS;AAAA,MACzD,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM,WAAW,YAAY,MAAM,UAAU,OAAO;AAAA,MAC5D,SAAS,MAAM,WAAW,YAAY,MAAM,SAAS,KAAK,KAAK,OAAO;AAAA,MACtE,YAAY,UAAU,cAAc;AAAA,MACpC,YAAY;AAAA,IACd,IAAI;AACJ,UAAM,kBAAkB,CAAC,SAAyB,cAAuD;AAAA,MACvG,GAAG;AAAA,MACH,UAAU,QAAQ,SAAS,IAAI,CAAC,SAAS,KAAK,OAAO,QAAQ,KAAK,EAAE,GAAG,MAAM,SAAS,IAAI,IAAI;AAAA,MAC9F,SAAS,QAAQ,QAAQ,IAAI,CAAC,YAAY;AAAA,QAAE,GAAG;AAAA,QAC7C,UAAU,OAAO,SAAS,IAAI,CAAC,SAAS,KAAK,OAAO,QAAQ,KAAK,EAAE,GAAG,MAAM,SAAS,IAAI,IAAI;AAAA,MAC/F,EAAE;AAAA,IACJ;AACA,wBAAoB;AACpB,WAAO,CAAC,YAAY,gBAAgB,SAAS,UAAU,CAAC;AACxD,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,YAAY,EAAE,OAAO,GAAG,MAAM,CAAC;AAChE,aAAO,CAAC,YAAY,gBAAgB,SAAS,OAAO,QAAQ,CAAC;AAAA,IAC/D,SAAS,OAAO;AACd,aAAO,CAAC,YAAY,4BAA4B,gBAAgB,SAAS,QAAQ,GAAG,gBAAgB,KAAK,CAAC;AAC1G,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,qBAAqB,QAAQ,eAAe,MAAM,CAAC;AACzD;;;AC/CA,YAAYC,YAAW;AAKhB,SAAS,yBAAyB;AAAA,EAAE;AAAA,EAAO;AAAA,EAAU;AAAA,EAAU;AAAA,EACpE;AAAA,EAAe;AAAA,EAAiB;AAAU,GAQzC;AACD,QAAM,QAAc,mBAAY,OAAOC,UAAiB;AACtD,UAAM,WAAW,SAAS,QAAQ;AAClC,QAAI,CAAC,YAAY,CAACA,MAAK,KAAK,EAAG,OAAM,IAAI,MAAM,kDAAkD;AACjG,wBAAoB;AACpB,QAAI;AACF,YAAM,MAAM,OAAO,EAAE,MAAM,SAAS,OAAOA,MAAK,KAAK,GAAG,gBAAgB,SAAS,EAAE,CAAC;AACpF,YAAM,gBAAgB,QAAQ;AAAA,IAChC,SAAS,OAAO;AACd,oBAAc,UAAU,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,qBAAqB,UAAU,eAAe,MAAM,QAAQ,iBAAiB,QAAQ,CAAC;AAE1F,QAAM,qBAA2B,mBAAY,OAAO,SAClD,UAA0G;AAC1G,UAAM,MAAM,KAAK,SAAS;AAAA,MAAE,MAAM,MAAM;AAAA,MAAM,eAAe,MAAM,iBAAiB,QAAQ;AAAA,MAC1F,kBAAkB,MAAM;AAAA,MAAkB,kBAAkB,MAAM;AAAA,IAAiB,CAAC;AAAA,EACxF,GAAG,CAAC,MAAM,IAAI,CAAC;AACf,QAAM,sBAA4B,mBAAY,OAAO,YAA2B;AAC9E,UAAM,MAAM,KAAK,SAAS,EAAE,MAAM,QAAQ,MAAM,eAAe,QAAQ,gBAAgB,MAAM,QAAQ,CAAC;AAAA,EACxG,GAAG,CAAC,MAAM,IAAI,CAAC;AACf,QAAM,cAAoB,mBAAY,YAAY;AAChD,QAAI,CAAC,SAAS,QAAQ,eAAgB;AACtC,UAAM,SAAS,MAAM,MAAM,OAAO;AAClC,QAAI,QAAQ,OAAQ,MAAK,UAAU,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EACzE,GAAG,CAAC,WAAW,MAAM,QAAQ,QAAQ,CAAC;AACtC,SAAO,EAAE,OAAO,oBAAoB,qBAAqB,sBAAsB,MAAM,QAAQ,YAAY;AAC3G;;;AC3CO,SAAS,6BACd,SACA,gBACe;AACf,SAAO,OAAO,UAAU,eAAe,KAAK,SAAS,gBAAgB,IACjE,QAAQ,kBAAkB,OAC1B;AACN;AAEO,SAAS,4BACd,kBACA,gBACA,wBACS;AACT,SAAO,QAAQ,gBAAgB,MAC7B,qBAAqB,kBAAkB,CAAC;AAE5C;AAEO,SAAS,2BAA2B,OAM/B;AACV,SAAO,CAAC,MAAM,iBACT,MAAM,sBAAsB,MAAM,qBAClC,MAAM,sBAAsB,MAAM;AACzC;;;AL+EA,SAAS,sBAAsB,QAAgD;AAC7E,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,WAAW,kBAAkB,MAAM;AACzC,SAAO,SAAS,aAAa,SAAS,QAAQ;AAChD;AAEO,SAAS,aAAa,UAA+B,CAAC,GAAwB;AACnF,QAAM,UAAU,mBAAmB;AACnC,QAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAyB,OAAO;AAAA,IAC9D,GAAG;AAAA,IACH,gBAAgB;AAAA,MACd;AAAA,MACA,QAAQ,SAAS,qBAAqB,KAAK;AAAA,IAC7C;AAAA,IACA,SAAS,QAAQ,SAAS,YAAY,KAAK,CAAC;AAAA,EAC9C,EAAE;AACF,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAS,KAAK;AACpE,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,gBAAS,KAAK;AAChE,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAS,KAAK;AAC5D,QAAM,sBAA4B,cAAgE,IAAI;AACtG,QAAM,0BAAgC,cAAgE,IAAI;AAC1G,QAAM,0BAAgC,cAAO,CAAC;AAC9C,QAAM,eAAqB,cAA0D,YAAY,MAAS;AAC1G,QAAM,2BAAiC,cAAO,CAAC;AAC/C,QAAM,qBAA2B,cAAsB,IAAI;AAC3D,QAAM,oBAA0B,cAAsB,IAAI;AAC1D,QAAM,qBAA2B,cAA6B,IAAI;AAClE,QAAM,6BAAmC,cAA4B,IAAI;AACzE,QAAM,WAAiB,cAAO,KAAK;AACnC,WAAS,UAAU;AAEnB,QAAM,UAAgB,mBAAY,CAAC,SAAyB;AAC1D,YAAQ,SAAS,YAAY,KAAK,OAAO;AACzC,YAAQ,SAAS,qBAAqB,KAAK,cAAc;AAAA,EAC3D,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,QAAM,SAAe,mBAAY,CAAC,YAAyD;AACzF,aAAS,CAAC,YAAY;AACpB,YAAM,OAAO,QAAQ,OAAO;AAC5B,eAAS,UAAU;AACnB,cAAQ,IAAI;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,iBAAuB,eAAqC,OAAO;AAAA,IACvE,MAAM,CAAC,aAAa,OAAO,QAAQ,SAAS,KAAK,EAAE,UAAU,OAAO,SAAS,CAAC;AAAA,IAC9E,QAAQ,CAAC,UAAU,OAAO,QAAQ,SAAS,OAAO,KAAK;AAAA,IACvD,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,SAAS,KAAK;AAAA,MACrD,UAAU,QAAQ;AAAA,MAAW,WAAW,QAAQ;AAAA,MAAI,UAAU,QAAQ;AAAA,MACtE,OAAO,MAAM;AAAA,MAAM,eAAe,MAAM,iBAAiB,QAAQ;AAAA,MAAgB,MAAM,MAAM;AAAA,MAC7F,kBAAkB,MAAM;AAAA,MAAkB,kBAAkB,MAAM;AAAA,IACpE,CAAC;AAAA,IACD,QAAQ,OAAO,YAAY;AACzB,YAAM,OAAO,QAAQ,SAAS,OAAO,EAAE,UAAU,QAAQ,WAAW,WAAW,QAAQ,IAAI,UAAU,QAAQ,SAAS,CAAC;AAAA,IACzH;AAAA,IACA,QAAQ,CAAC,aAAa,OAAO,QAAQ,YAAY,EAAE,SAAS,CAAC;AAAA,EAC/D,IAAI,CAAC,QAAQ,QAAQ,CAAC;AACtB,QAAM,mBAAyB,mBAAY,CAAC,SAAwB,UAAkB;AACpF,QAAI,SAAS,QAAQ,mBAAmB,QAAQ,UAAW;AAC3D,uBAAmB,UAAU;AAC7B,UAAM,cAAc,yBAAyB,CAAC,EAAE,GAAG,SAAS,QAAQ,OAAO,QAAQ,YAAY,CAAC,CAAC,EAAE,CAAC;AACpG,WAAO,CAAC,YAAY,QAAQ,mBAAmB,QAAQ,YACnD,EAAE,GAAG,SAAS,UAAU,qBAAqB,QAAQ,UAAU,aAAa,KAAK,EAAE,IAAI,OAAO;AAClG,QAAI,SAAS,QAAQ,gBAAgB,SAAS,kBAAkB,YAAY,OAAO;AACjF,wBAAkB,UAAU;AAC5B,WAAK,aAAa,QAAQ,KAAK,EAAE,MAAM,MAAM;AAAE,0BAAkB,UAAU;AAAA,MAAM,CAAC;AAAA,IACpF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AACX,QAAM,QAAQ,sBAAsB,EAAE,UAAU,MAAM,gBAAgB,WAAW,gBAAgB,YAAY,iBAAiB,CAAC;AAC/H,QAAM,EAAE,iBAAiB,aAAa,IAAI;AAE1C,QAAM,cAAoB;AAAA,IACxB,MAAM;AAAA,MACJ,CAAC,WAAW,OAAO,CAAC,YAAY,mBAAmB,SAAS,MAAM,CAAC;AAAA,MACnE,2BAA2B;AAAA,IAC7B;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,sBAA4B,mBAAY,CAAC,cAAmC;AAChF,WAAO,CAAC,YAAY,6BAA6B,SAAS,SAAS,CAAC;AAAA,EACtE,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,uBAA6B,mBAAY,MAAM;AACnD,WAAO,6BAA6B;AAAA,EACtC,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,gBAAsB,mBAAY,CAAC,WAA+B,UAAmB;AACzF,WAAO,CAAC,YAAY,4BAA4B,SAAS,WAAW,KAAK,CAAC;AAAA,EAC5E,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM;AAAA,IAAE;AAAA,IAAkB;AAAA,IAAsB;AAAA,IAC9C,wBAAwB;AAAA,IAA8B;AAAA,IAAgB;AAAA,EACxE,IAAI,uBAAuB,EAAE,QAAQ,gBAAgB,UAAU,QAAQ,qBAAqB,cAAc,CAAC;AAE3G,QAAM,uBAA6B,mBAAY,MAAM;AACnD,4BAAwB,WAAW;AACnC,4BAAwB,SAAS,MAAM,2BAA2B;AAClE,4BAAwB,UAAU;AAClC,wBAAoB,KAAK;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,SAAe,mBAAY,MAAM;AACrC,gBAAY,MAAM;AAClB,wBAAoB,SAAS,MAAM;AACnC,wBAAoB,UAAU;AAC9B,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,oBAAoB,MAAM,UAAU,QAAQ,cAAc,iBAAiB,OAAO,EAAE;AAAA,EACzH,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,kBAAwB,mBAAY,OAAO,UAAmB,kBAA2B;AAC7F,UAAM,SAAS,YAAY,SAAS,QAAQ;AAC5C,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,EAAE,yBAAyB;AAC3C,UAAM,OAAO,MAAM,OAAO,QAAQ,SAAS,KAAK,EAAE,UAAU,QAAQ,OAAO,SAAS,CAAC;AACrF,QAAI,SAAS,QAAQ,mBAAmB,UAAU,YAAY,yBAAyB,QAAS;AAChG,UAAM,QAAQ,MAAM,MAAM;AAC1B,UAAM,WAAW,iBAAiB,mBAAmB;AACrD,QAAI,YAAY,KAAK,MAAM,KAAK,CAAC,YAAY,QAAQ,SAAS,UAAU,QAAQ,WAAW,QAAQ,GAAG;AACpG,yBAAmB,UAAU;AAC7B,aAAO,CAAC,YAAY;AAClB,YAAI,QAAQ,mBAAmB,OAAQ,QAAO;AAC9C,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU,wBAAwB,QAAQ,UAAU,yBAAyB,KAAK,KAAK,GAAG,QAAQ,aAAa,QAAQ,kBAAkB;AAAA,QAC3I;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,QAAI,SAAS,QAAQ,aAAa;AAChC,YAAM,YAAY,yBAAyB,KAAK,MAAM,OAAO,CAAC,SAC5D,KAAK,SAAS,UAAU,KAAK,WAAW,SAAS,QAAQ,gBAAgB,KAAK,iBAAiB,KAAK,CAAC,CAAC;AACxG,UAAI,UAAU,OAAQ,QAAO,CAAC,YAAY;AACxC,YAAI,QAAQ,mBAAmB,OAAQ,QAAO;AAC9C,cAAM,YAAY,UAAU,OAAO,CAAC,SAAS,CAAC,QAAQ,SAAS,KAAK,CAAC,aAAa,SAAS,OAAO,KAAK,EAAE,CAAC;AAC1G,eAAO,UAAU,SAAS,EAAE,GAAG,SAAS,UAAU,CAAC,GAAG,QAAQ,UAAU,GAAG,SAAS,EAAE,IAAI;AAAA,MAC5F,CAAC;AAAA,IACH;AACA,QAAI,CAAC,SAAS,QAAQ,eAAe,KAAK,MAAM,QAAQ;AACtD,aAAO,CAAC,YAAY,QAAQ,mBAAmB,UAAU,CAAC,QAAQ,eAC7D,MAAM;AACL,cAAM,WAAW,wBAAwB,QAAQ,UAAU,yBAAyB,KAAK,KAAK,GAAG,MAAM,IAAI;AAC3G,eAAO,EAAE,GAAG,SAAS,UAAU,SAAS,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,SAAS,EAAE,GAAG,QAAQ,SAAS,IAAI,MAAM,EAAE;AAAA,MACnI,GAAG,IACH,OAAO;AAAA,IACb;AAAA,EACF,GAAG,CAAC,QAAQ,UAAU,MAAM,SAAS,MAAM,CAAC;AAE5C,EAAM,iBAAU,MAAM,MAAM;AAC1B,gBAAY,QAAQ;AACpB,wBAAoB,SAAS,MAAM;AACnC,4BAAwB,SAAS,MAAM;AAAA,EACzC,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,aAAmB,mBAAY,OAAO,aAAqB;AAC/D,UAAM,oBAAoB,gCAAgC,SAAS,OAAO;AAC1E,4BAAwB,SAAS,MAAM;AACvC,UAAM,oBAAoB,QAAQ,sBAAsB;AACxD,4BAAwB,UAAU;AAClC,UAAM,oBAAoB,wBAAwB,UAAU;AAC5D,4BAAwB,UAAU;AAClC,WAAO;AACP,wBAAoB;AACpB,WAAO,CAAC,aAAa;AAAA,MACnB,GAAG;AAAA,MACH,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,GAAG,YAAY,CAAC;AAAA,MACjF,eAAe,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,GAAG,iBAAiB;AAAA,MAC1F,oBAAoB,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,GAAG,sBAAsB;AAAA,MACpG,4BAA4B;AAAA,MAC5B,UAAU;AAAA,MACV,oBAAoB;AAAA,IACtB,EAAE;AACF,wBAAoB,IAAI;AACxB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,IAAI;AAAA,QACtC;AAAA,QACA,OAAO;AAAA,QACP,QAAQ,kBAAkB;AAAA,MAC5B,CAAC;AACD,UAAI,CAAC,2BAA2B;AAAA,QAC9B,gBAAgB,SAAS,QAAQ;AAAA,QACjC,mBAAmB,wBAAwB;AAAA,QAC3C;AAAA,QACA,mBAAmB;AAAA,QACnB,eAAe,kBAAkB,OAAO;AAAA,MAC1C,CAAC,EAAG;AACJ,YAAM,WAAW,MAAM,OAAO,QAAQ,SAAS,KAAK,EAAE,UAAU,OAAO,UAAU,QAAQ,kBAAkB,OAAO,CAAC;AACnH,UAAI,CAAC,2BAA2B;AAAA,QAC9B,gBAAgB,SAAS,QAAQ;AAAA,QACjC,mBAAmB,wBAAwB;AAAA,QAC3C;AAAA,QACA,mBAAmB;AAAA,QACnB,eAAe,kBAAkB,OAAO;AAAA,MAC1C,CAAC,EAAG;AACJ,YAAM,QAAQ,UAAU,QAAQ;AAChC,YAAM,WAAW,SAAS,MAAM,SAAS,yBAAyB,SAAS,OAAO,MAAM,IAAI,uBAAuB,MAAM;AACzH,YAAM,UAAU,oBAAoB,MAAM;AAC1C,YAAM,SAA2B;AAAA,QAC/B,GAAG;AAAA,QACH;AAAA,QACA,YAAY;AAAA,QACZ,eAAe,QAAQ,OAAO,QAAQ,QAAQ;AAAA,QAC9C,qBAAqB,OAAO,QAAQ,0BAA0B;AAAA,QAC9D,GAAG;AAAA,MACL;AACA,aAAO,CAAC,YAAY,2BAA2B;AAAA,QAC7C,gBAAgB,QAAQ;AAAA,QACxB,mBAAmB,wBAAwB;AAAA,QAC3C;AAAA,QACA,mBAAmB;AAAA,QACnB,eAAe,kBAAkB,OAAO;AAAA,MAC1C,CAAC,IAAI;AAAA,QACH,GAAG;AAAA,QACH,gBAAgB;AAAA,QAChB;AAAA,QACA,GAAG;AAAA,QACH,4BAA4B;AAAA,QAC5B,aAAa,sBAAsB,MAAM;AAAA,QACzC,SAAS,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ,IAC5D,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,WAAW,SAAS,MAAM,IACxE,CAAC,QAAQ,GAAG,QAAQ,OAAO;AAAA,MACjC,IAAI,OAAO;AACX,YAAM,cAAc,sBAAsB,MAAM;AAChD,UACE,eACG,2BAA2B;AAAA,QAC5B,gBAAgB,SAAS,QAAQ;AAAA,QACjC,mBAAmB,wBAAwB;AAAA,QAC3C;AAAA,QACA,mBAAmB;AAAA,QACnB,eAAe,kBAAkB,OAAO;AAAA,MAC1C,CAAC,EACD,OAAM,aAAa,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAS;AAAA,IACjE,SAAS,OAAO;AACd,UAAI,CAAC,kBAAkB,OAAO,WAAW,CAAC,YAAY,KAAK,KAAK,sBAAsB,wBAAwB,SAAS;AACrH,sBAAc,eAAe,KAAK;AAClC,eAAO,CAAC,YAAY,gCAAgC,SAAS,iBAAiB,CAAC;AAC/E,YAAI,kBAAkB,aAAa;AACjC,eAAK,aAAa,QAAQ,kBAAkB,aAAa,kBAAkB,UAAU,MAAS,EAAE,MAAM,MAAM,MAAS;AAAA,QACvH;AACA,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,UAAI,sBAAsB,wBAAwB,SAAS;AACzD,YAAI,wBAAwB,YAAY,kBAAmB,yBAAwB,UAAU;AAC7F,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,qBAAqB,QAAQ,QAAQ,eAAe,UAAU,MAAM,SAAS,SAAS,MAAM,CAAC;AAEjG,QAAM,eAAqB,mBAAY,CAAC,UAAwB;AAC9D,UAAM,gBAAgB,OAAO,MAAM,SAAS,cAAc,WACtD,MAAM,QAAQ,UAAU,KAAK,IAC7B;AACJ,QAAI,iBAAiB,CAAC,SAAS,QAAQ,gBAAgB;AACrD,aAAO,CAAC,YAAY,qBAAqB,SAAS,aAAa,CAAC;AAChE,iCAA2B,UAAU;AAAA,IACvC;AACA,gBAAY,KAAK,KAAK;AAAA,EACxB,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,YAAkB,mBAAY,OAAO,OAAe,WAAoB;AAC5E,wBAAoB,SAAS,MAAM;AACnC,UAAM,aAAa,QAAQ,sBAAsB;AACjD,wBAAoB,UAAU;AAC9B,wBAAoB;AACpB,WAAO,CAAC,aAAa,EAAE,GAAG,SAAS,aAAa,OAAO,UAAU,gBAAgB,OAAO,KAAK,EAAE;AAC/F,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,OAAO,GAAG,YAAY;AAClG,kBAAY,MAAM;AAClB,aAAO,CAAC,aAAa,EAAE,GAAG,SAAS,aAAa,OAAO,WAAW,QAAQ,QAAQ,aAAa,QAAQ,OAAO,UAAU,QAAQ,QAAQ,UAAU,OAAO,WAAW,iBAAiB,QAAQ,SAAS,EAAE;AACxM,UAAI,CAAC,OAAO,YAAY,OAAO,SAAU,OAAM,gBAAgB,OAAO,QAAQ;AAAA,IAChF,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,eAAO,CAAC,aAAa,EAAE,GAAG,SAAS,UAAU,UAAU,oBAAoB,KAAK,EAAE;AAClF,sBAAc,cAAc,KAAK;AACjC,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,UAAI,oBAAoB,YAAY,WAAY,qBAAoB,UAAU;AAAA,IAChF;AAAA,EACF,GAAG,CAAC,qBAAqB,QAAQ,cAAc,aAAa,eAAe,iBAAiB,SAAS,MAAM,CAAC;AAC5G,eAAa,UAAU;AAEvB,QAAM,SAAe,mBAAY,OAAO,UAAgC;AACtE,QAAI,CAAC,MAAM,KAAK,KAAK,KAAK,CAAC,MAAM,eAAe,UAAU,CAAC,MAAM,SAAS,OAAQ;AAClF,QAAI,mBAAmB,WAAW,CAAC,SAAS,QAAQ,gBAAgB;AAClE,YAAM,mBAAmB;AAAA,IAC3B;AACA,UAAM,mBAAmB,SAAS,QAAQ;AAC1C,QAAI,kBAAkB;AACpB,0BAAoB;AACpB,sBAAgB,IAAI;AACpB,UAAI;AACF,cAAM,WAAW,MAAM,SAAS,SAC5B,MAAM,OAAO,YAAY,YAAY;AAAA,UACnC,SAAS,MAAM;AAAA,UACf,UAAU;AAAA,UACV,kBAAkB,MAAM;AAAA,UACxB,gBAAgB,QAAQ,SAAS;AAAA,QACnC,CAAC,IACD,CAAC;AACL,cAAM,SAAS,MAAM,MAAM,OAAO;AAAA,UAChC,MAAM;AAAA,UACN,OAAO,MAAM,KAAK,KAAK;AAAA,UACvB,eAAe,SAAS,SAAS,SAAS,IAAI,CAAC,SAAS,KAAK,EAAE,IAAI,MAAM;AAAA,UACzE,kBAAkB,MAAM;AAAA,UACxB,kBAAkB,MAAM;AAAA,UACxB,gBAAgB,QAAQ,SAAS;AAAA,QACnC,CAAC;AACD,YAAI,SAAS,QAAQ,mBAAmB,iBAAkB;AAC1D,YAAI,OAAO,QAAQ;AACjB,gBAAM,cAA2B;AAAA,YAC/B,IAAI,OAAO;AAAA,YAAY,MAAM;AAAA,YAAQ,OAAO,OAAO;AAAA,YACnD,SAAS,MAAM,KAAK,KAAK;AAAA,YAAG,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAC9D,SAAS;AAAA,YACT,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,UAAU,SAAS,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC;AAAA,YACzH,aAAa,MAAM,eAAe,CAAC;AAAA,UACrC;AACA,iBAAO,CAAC,YAAY,QAAQ,mBAAmB,oBAC1C,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,YAAY,EAAE,IACjE,UAAU,EAAE,GAAG,SAAS,UAAU,CAAC,GAAG,QAAQ,UAAU,WAAW,EAAE,CAAC;AAAA,QAC5E;AACA,aAAK,gBAAgB,gBAAgB,EAAE,MAAM,MAAM,MAAS;AAC5D,YAAI,OAAO,UAAU,kBAAkB,YAAY,OAAO,UACnD,SAAS,QAAQ,gBAAgB,OAAO,QAAQ;AACrD,eAAK,aAAa,QAAQ,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,QAChE;AAAA,MACF,SAAS,OAAO;AACd,sBAAc,UAAU,KAAK;AAC7B,cAAM;AAAA,MACR,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AACA;AAAA,IACF;AACA,UAAM,YAAY,IAAI,QAAc,CAAC,YAAY;AAAE,iCAA2B,UAAU;AAAA,IAAS,CAAC;AAClG,UAAM,UAAU,YAAY;AAC5B,2BAAqB;AACrB,aAAO;AACP,YAAM,aAAa,QAAQ,sBAAsB;AACjD,0BAAoB,UAAU;AAC9B,YAAM,SAAS,QAAQ,SAAS;AAChC,YAAM,cAAc,QAAQ,SAAS;AACrC,YAAM,iBAAiB,QAAQ,SAAS;AACxC,YAAM,wBAAwB,MAAM,aAAa,SAC7C,MAAM,cACN,MAAM,SAAS,IAAI,CAAC,QAAQ,WAAW;AAAA,QACrC,IAAI,GAAG,MAAM,eAAe,KAAK;AAAA,QACjC,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,QAClB,QAAQ;AAAA,MACV,EAAE;AACN,YAAM,cAA2B,EAAE,IAAI,QAAQ,MAAM,QAAQ,SAAS,MAAM,KAAK,KAAK,GAAG,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,SAAS,MAAM,QAAQ,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,aAAa,sBAAsB;AAClR,YAAM,mBAAgC,EAAE,IAAI,aAAa,MAAM,aAAa,SAAS,IAAI,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,SAAS,OAAO,OAAO,CAAC,EAAE;AACxJ,0BAAoB;AACpB,YAAM,oBAAoB,QAAQ,MAAM,SAAS,MAAM;AACvD,aAAO,CAAC,aAAa;AAAA,QACnB,GAAG;AAAA,QACH,UAAU,0BAA0B,QAAQ,UAAU,aAAa,gBAAgB;AAAA,QACnF,oBAAoB;AAAA,QACpB,UAAU,oBAAoB,cAAc;AAAA,QAC5C,OAAO;AAAA,MACT,EAAE;AACF,sBAAgB,IAAI;AACpB,UAAI,gBAAgB;AACpB,UAAI;AACF,cAAM,WAAW,oBACb,MAAM,OAAO,YAAY,YAAY;AAAA,UACnC,SAAS,MAAM,WAAW,CAAC;AAAA,UAC3B,UAAU,SAAS,QAAQ,kBAAkB;AAAA,UAC7C,kBAAkB,MAAM;AAAA,UACxB,gBAAgB,QAAQ,SAAS;AAAA,UACjC,QAAQ,WAAW;AAAA,QACrB,CAAC,IACD,CAAC;AACL,YAAI,qBAAqB,SAAS,WAAW,MAAM,SAAS,QAAQ;AAClE,gBAAM,IAAI,MAAM,gDAAgD;AAAA,QAClE;AACA,cAAM,sBAAsB,SAAS,SACjC,SAAS,IAAI,gCAAgC,IAC7C,MAAM;AACV,cAAM,gBAAgB,SAAS,SAC3B,SAAS,IAAI,CAAC,eAAe,WAAW,EAAE,IAC1C,MAAM;AACV,YAAI,SAAS,QAAQ;AACnB,iBAAO,CAAC,aAAa;AAAA,YACnB,GAAG;AAAA,YACH,UAAU,QAAQ,SAAS,IAAI,CAAC,YAAY,QAAQ,OAAO,SACvD,EAAE,GAAG,SAAS,aAAa,oBAAoB,IAC/C,OAAO;AAAA,YACX,UAAU;AAAA,UACZ,EAAE;AAAA,QACJ;AACA,wBAAgB;AAChB,cAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,MAAM,KAAK,KAAK,GAAG,UAAU,SAAS,QAAQ,kBAAkB,QAAW,eAAe,kBAAkB,MAAM,kBAAkB,kBAAkB,MAAM,kBAAkB,gBAAgB,QAAQ,WAAW,OAAO,GAAG,YAAY;AACxR,oBAAY,MAAM;AAClB,eAAO,CAAC,YAAY;AAClB,gBAAM,WAAW,OAAO,YAAY,QAAQ;AAC5C,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,gBAAgB;AAAA,YAChB,aAAa,OAAO,WAAW,OAAO,QAAQ,QAAQ;AAAA,YACtD,QAAQ,OAAO;AAAA,YACf,UAAU,OAAO,WAAW,iBAAiB,QAAQ;AAAA,YACrD,SAAS,WACL,QAAQ,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,WAC5C,EAAE,GAAG,QAAQ,UAAU,QAAQ,UAAU,YAAY,KAAK,IAC1D,MAAM,IACR,QAAQ;AAAA,UACd;AAAA,QACF,CAAC;AACD,YAAI,OAAO,SAAU,OAAM,eAAe,EAAE,MAAM,MAAM,MAAS;AACjE,YAAI,OAAO,YAAY,CAAC,OAAO,SAAU,OAAM,gBAAgB,OAAO,QAAQ;AAAA,MAChF,SAAS,OAAO;AACd,YAAI,YAAY,KAAK,KAAK,CAAC,eAAe;AACxC,iBAAO,CAAC,YAAY,QAAQ,uBAAuB,cAC/C;AAAA,YACE,GAAG;AAAA,YACH,UAAU,QAAQ,SAAS,OAAO,CAAC,YAAY,QAAQ,OAAO,UAAU,QAAQ,OAAO,WAAW;AAAA,YAClG,UAAU;AAAA,YACV,oBAAoB;AAAA,UACtB,IACA,OAAO;AAAA,QACb,WAAW,CAAC,YAAY,KAAK,GAAG;AAC9B,iBAAO,CAAC,aAAa;AAAA,YACnB,GAAG;AAAA,YACH,UAAU,gBACN,QAAQ,WACR,QAAQ,SAAS,OAAO,CAAC,YAAY,QAAQ,OAAO,UAAU,QAAQ,OAAO,WAAW;AAAA,YAC5F,UAAU;AAAA,YACV,oBAAoB;AAAA,UACtB,EAAE;AACF,wBAAc,UAAU,KAAK;AAC7B,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA,wBAAgB,KAAK;AACrB,YAAI,oBAAoB,YAAY,WAAY,qBAAoB,UAAU;AAAA,MAChF;AAAA,IACA,GAAG;AACH,UAAM,WAAW,QAAQ,KAAK,CAAC,QAAQ,SAAS,CAAC;AACjD,uBAAmB,UAAU;AAC7B,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,UAAI,mBAAmB,YAAY,SAAU,oBAAmB,UAAU;AAC1E,iCAA2B,UAAU;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,qBAAqB,QAAQ,cAAc,QAAQ,aAAa,eAAe,sBAAsB,MAAM,QAAQ,iBAAiB,gBAAgB,SAAS,MAAM,CAAC;AAExK,QAAM,EAAE,OAAO,oBAAoB,qBAAqB,sBAAsB,YAAY,IACxF,yBAAyB;AAAA,IAAE;AAAA,IAAO;AAAA,IAAU,UAAU,QAAQ;AAAA,IAAU;AAAA,IACtE;AAAA,IAAe;AAAA,IAAiB;AAAA,EAAU,CAAC;AAE/C,QAAM,iBAAuB,mBAAY,MAAM;AAC7C,yBAAqB;AACrB,WAAO;AACP,WAAO,CAAC,aAAa,EAAE,GAAG,uBAAuB,SAAS,QAAQ,QAAQ,EAAE;AAAA,EAC9E,GAAG,CAAC,QAAQ,sBAAsB,MAAM,CAAC;AAEzC,QAAM,eAAqB,mBAAY,OAAO,aAAqB;AACjE,QAAI,SAAS,QAAQ,mBAAmB,SAAU,sBAAqB;AACvE,wBAAoB;AACpB,QAAI;AACF,YAAM,OAAO,QAAQ,OAAO,EAAE,UAAU,gBAAgB,QAAQ,SAAS,EAAE,CAAC;AAC5E,aAAO,CAAC,aAAa;AAAA,QACnB,GAAG;AAAA,QACH,gBAAgB,QAAQ,mBAAmB,WAAW,OAAO,QAAQ;AAAA,QACrE,UAAU,QAAQ,mBAAmB,WAAW,CAAC,IAAI,QAAQ;AAAA,QAC7D,eAAe,QAAQ,mBAAmB,WAAW,OAAO,QAAQ;AAAA,QACpE,oBAAoB,QAAQ,mBAAmB,WAAW,OAAO,QAAQ;AAAA,QACzE,4BAA4B,QAAQ,mBAAmB,WAAW,IAAI,QAAQ;AAAA,QAC9E,SAAS,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,OAAO,QAAQ;AAAA,MACpE,EAAE;AAAA,IACJ,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,sBAAc,iBAAiB,KAAK;AACpC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,GAAG,CAAC,qBAAqB,QAAQ,eAAe,sBAAsB,SAAS,MAAM,CAAC;AAEtF,QAAM,YAAkB,mBAAY,YAAY;AAC9C,UAAM,QAAQ,SAAS,QAAQ;AAC/B,QAAI,CAAC,SAAS,SAAS,QAAQ,aAAa,aAAc;AAC1D,UAAM,mBAAmB,SAAS,QAAQ;AAC1C,wBAAoB;AACpB,WAAO,CAAC,YACN,QAAQ,gBAAgB,QACpB,EAAE,GAAG,SAAS,UAAU,aAAa,IACrC,OACL;AACD,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAgB,QAAQ,SAAS,EAAE,CAAC;AACrF,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO;AACP,eAAO,CAAC,aAAa;AAAA,UACnB,GAAG;AAAA,UACH,aAAa;AAAA,UACb,UAAU;AAAA,UACV,oBAAoB;AAAA,QACtB,EAAE;AAAA,MACJ,WAAW,OAAO,WAAW,cAAc;AACzC,eAAO,CAAC,aAAa;AAAA,UACnB,GAAG;AAAA,UACH,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,EAAE;AAAA,MACJ,OAAO;AACL,eAAO;AACP,eAAO,CAAC,aAAa;AAAA,UACnB,GAAG;AAAA,UACH,aAAa;AAAA,UACb,UAAU,OAAO,WAAW,cAAc,cAAc;AAAA,UACxD,oBAAoB;AAAA,QACtB,EAAE;AAAA,MACJ;AAAA,IACF,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,eAAO,CAAC,YACN,QAAQ,gBAAgB,QACpB,EAAE,GAAG,SAAS,UAAU,iBAAiB,IACzC,OACL;AACD,sBAAc,cAAc,KAAK;AACjC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,GAAG,CAAC,qBAAqB,QAAQ,QAAQ,eAAe,SAAS,MAAM,CAAC;AAExE,QAAM,aAAmB,mBAAY,OAAO,MAAoB,aAA2B;AACzF,UAAM,QAAQ,SAAS,QAAQ,eAAe,SAAS,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,MAAM,SAAS,IAAI,CAAC,GAAG;AACzH,wBAAoB;AACpB,QAAI,CAAC,OAAO;AACV,YAAM,QAAQ,IAAI,MAAM,uCAAuC;AAC/D,oBAAc,eAAe,KAAK;AAClC,YAAM;AAAA,IACR;AACA,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO;AAAA,QACtC;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,GAAG;AAAA,QACH,gBAAgB,QAAQ,SAAS;AAAA,MACnC,CAAC;AACD,YAAM,UAAU,OAAO,UAAU,KAAK;AAAA,IACxC,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,EAAG,eAAc,eAAe,KAAK;AAC3D,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,WAAW,qBAAqB,QAAQ,eAAe,OAAO,CAAC;AAEnE,QAAM,cAAc,qBAAqB,EAAE,QAAQ,QAAQ,qBAAqB,cAAc,CAAC;AAE/F,QAAM,YAAkB,mBAAY,YAAY;AAC9C,UAAM,SAAS,SAAS,QAAQ,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS,QAAQ,cAAc;AAClG,QAAI,CAAC,QAAQ,oBAAqB;AAClC,wBAAoB;AACpB,sBAAkB,IAAI;AACtB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,IAAI,EAAE,UAAU,OAAO,IAAI,OAAO,UAAU,iBAAiB,OAAO,oBAAoB,CAAC;AAC7H,YAAM,QAAQ,uBAAuB,MAAM;AAC3C,aAAO,CAAC,aAAa,EAAE,GAAG,SAAS,UAAU,CAAC,GAAG,OAAO,GAAG,QAAQ,SAAS,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE,CAAC,CAAC,GAAG,SAAS,QAAQ,QAAQ,IAAI,CAAC,SAAS,KAAK,OAAO,OAAO,KAAK,EAAE,GAAG,MAAM,eAAe,QAAQ,OAAO,QAAQ,QAAQ,GAAG,qBAAqB,OAAO,QAAQ,0BAA0B,KAAK,IAAI,IAAI,EAAE,EAAE;AAAA,IAC7V,SAAS,OAAO;AACd,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,sBAAc,oBAAoB,KAAK;AACvC,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AAAU,wBAAkB,KAAK;AAAA,IAAG;AAAA,EACxC,GAAG,CAAC,qBAAqB,QAAQ,eAAe,UAAU,MAAM,CAAC;AAEjE,QAAM,aAAmB,mBAAY,OAAO,YAAyB;AACnE,UAAM,QAAQ,SAAS,QAAQ,SAAS,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAClF,UAAM,OAAO,SAAS,QAAQ,SAAS,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AACpG,QAAI,KAAM,OAAM,OAAO;AAAA,MACrB,MAAM,KAAK;AAAA,MACX,eAAe,kBAAkB,KAAK,WAAW;AAAA,MACjD,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,CAAC;AAEX,EAAM,iBAAU,MAAM;AACpB,UAAM,aAAa,QAAQ,sBAAsB;AACjD,yBAAqB;AACrB,SAAK,2BAA2B;AAAA,MAC9B;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,SAAS;AAAA,MACT,QAAQ,OAAO;AACb,qCAA6B,SAAS,KAAK,KAAK;AAChD,eAAO,CAAC,aAAa;AAAA,UACnB,GAAG,8BAA8B,OAAO;AAAA,UACxC,SAAS,wBAAwB,QAAQ,SAAS,KAAK;AAAA,QACzD,EAAE;AACF,YAAI,MAAM,UAAU,4BAA4B,MAAM,cAAc,SAAS,QAAQ,gBAAgB;AACnG,gBAAM,YAAY,MAAM,aAAa;AAAA,YAAE,WAAW,MAAM;AAAA,YACtD,QAAQ,MAAM;AAAA,YAAQ,OAAO,MAAM;AAAA,YAAQ,QAAQ,MAAM;AAAA,UAAO,CAAC;AACnE,cAAI,UAAW,MAAK,gBAAgB,MAAM,WAAW,MAAM,UAAU,MAAS,EAAE,MAAM,MAAM,MAAS;AAAA,QACvG;AACA,YAAI,MAAM,UAAU,4BAA4B,MAAM,OAAO,OAAO,SAAS,QAAQ,gBAAgB;AACnG,cAAI,oBAAoB,WAAW,SAAS,QAAQ,SAAS,KAAK,CAAC,YACjE,QAAQ,SAAS,UAAU,CAAC,QAAQ,KAAK,EAAG;AAC9C,gBAAM,gBAAgB,sBAAsB,gBAAgB,MAAM,MAAM,CAAC;AACzE,gBAAM,YAAY;AAChB,kBAAM,gBAAgB,OAAO,MAAM,OAAO,EAAE,GAAG,iBAAiB,MAAS;AACzE,gBAAI,iBAAiB,SAAS,QAAQ,gBAAgB,iBAC/C,SAAS,QAAQ,mBAAmB,OAAO,MAAM,OAAO,EAAE,KAC1D,kBAAkB,YAAY,eAAe;AAClD,gCAAkB,UAAU;AAC5B,oBAAM,aAAa,QAAQ,aAAa;AAAA,YAC1C;AAAA,UACF,GAAG,EAAE,MAAM,MAAM,MAAS;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,QAAQ,OAAO;AACb,eAAO,CAAC,YAAY,6BAA6B,SAAS,KAAK,CAAC;AAAA,MAClE;AAAA,MACA,cAAc;AACZ,6BAAqB;AAAA,MACvB;AAAA,IACF,CAAC;AACD,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,sBAAsB,QAAQ,MAAM,cAAc,iBAAiB,gBAAgB,QAAQ,uBAAuB,MAAM,CAAC;AAC7H,EAAM,iBAAU,MAAM;AACpB,UAAM,WAAW,QAAQ;AACzB,UAAMC,gBAAe,SAAS,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,SAAS,QAAQ,cAAc;AAC5G,QAAI,4BAA4B,UAAU,SAAS,QAAQ,gBAAgB,QAAQA,eAAc,UAAU,CAAC,GAAG;AAC7G,WAAK,WAAW,QAAkB,EAAE,MAAM,MAAM,MAAS;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,YAAY,QAAQ,cAAc,CAAC;AAEvC,QAAM,eAAe,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,cAAc,KAAK;AAC3F,QAAM,iBAAiB,gBAAgB,SACnC,MAAM,QAAQ,UAAU,iBACxB,MAAM,QAAQ,SAAS;AAC3B,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,QAAQ,cAAc,aAAa;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB,MAAM;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AMpwBA,YAAYC,YAAW;AAKhB,SAAS,gBAAgB,UAA6C,CAAC,GAAG;AAC/E,QAAM,EAAE,QAAQ,sBAAsB,IAAI,mBAAmB;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAU,gBAA0B,CAAC,CAAC;AAChE,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAA6B;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkB,IAAI;AACtD,QAAM,gBAAsB,cAAwD,IAAI;AACxF,QAAM,OAAa,mBAAY,YAAY;AACzC,kBAAc,SAAS,MAAM;AAC7B,UAAM,aAAa,sBAAsB;AACzC,kBAAc,UAAU;AACxB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,KAAK,EAAE,GAAG,SAAS,QAAQ,WAAW,OAAO,CAAC;AAClF,iBAAW,OAAO,KAAK;AACvB,eAAS,OAAO,KAAK;AAAA,IACvB,SAAS,WAAW;AAClB,UAAI,CAAC,YAAY,SAAS,EAAG,UAAS,SAAS;AAAA,IACjD,UAAE;AACA,UAAI,cAAc,YAAY,YAAY;AACxC,sBAAc,UAAU;AACxB,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAC/D,EAAM,iBAAU,MAAM;AACpB,SAAK,KAAK;AACV,WAAO,MAAM,cAAc,SAAS,MAAM;AAAA,EAC5C,GAAG,CAAC,IAAI,CAAC;AACT,SAAO,EAAE,OAAO,WAAW,SAAS,MAAM,SAAS,MAAM;AAC3D;AAEO,SAAS,eAAe,UAAyB,UAAwD,CAAC,GAAG;AAClH,QAAM,EAAE,QAAQ,sBAAsB,IAAI,mBAAmB;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAU,gBAA8B,IAAI;AACpE,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,QAAQ,QAAQ,CAAC;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkB,IAAI;AACtD,QAAM,gBAAsB,cAAwD,IAAI;AACxF,QAAM,OAAa,mBAAY,YAAY;AACzC,QAAI,CAAC,UAAU;AACb,oBAAc,SAAS,MAAM;AAC7B,oBAAc,UAAU;AACxB,gBAAU,IAAI;AACd,mBAAa,KAAK;AAClB,aAAO;AAAA,IACT;AACA,kBAAc,SAAS,MAAM;AAC7B,UAAM,aAAa,sBAAsB;AACzC,kBAAc,UAAU;AACxB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,IAAI,EAAE,UAAU,GAAG,SAAS,QAAQ,WAAW,OAAO,CAAC;AAC3F,gBAAU,MAAM;AAChB,aAAO;AAAA,IACT,SAAS,WAAW;AAClB,UAAI,CAAC,YAAY,SAAS,EAAG,UAAS,SAAS;AAC/C,aAAO;AAAA,IACT,UAAE;AACA,UAAI,cAAc,YAAY,YAAY;AACxC,sBAAc,UAAU;AACxB,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,QAAQ,iBAAiB,QAAQ,OAAO,QAAQ,CAAC;AACpF,EAAM,iBAAU,MAAM;AACpB,SAAK,KAAK;AACV,WAAO,MAAM,cAAc,SAAS,MAAM;AAAA,EAC5C,GAAG,CAAC,IAAI,CAAC;AACT,SAAO,EAAE,OAAO,WAAW,SAAS,MAAM,OAAO;AACnD;AAEO,SAAS,kBAAkB,UAAyB;AACzD,QAAM,EAAE,QAAQ,sBAAsB,IAAI,mBAAmB;AAC7D,QAAM,CAAC,UAAU,WAAW,IAAU,gBAAsC,IAAI;AAChF,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,QAAQ,QAAQ,CAAC;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkB,IAAI;AACtD,QAAM,gBAAsB,cAAwD,IAAI;AACxF,QAAM,UAAgB,mBAAY,YAAY;AAC5C,kBAAc,SAAS,MAAM;AAC7B,QAAI,CAAC,UAAU;AACb,kBAAY,IAAI;AAChB,mBAAa,KAAK;AAClB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,sBAAsB;AACzC,kBAAc,UAAU;AACxB,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ,SAAS,IAAI,EAAE,UAAU,QAAQ,WAAW,OAAO,CAAC;AACxF,kBAAY,MAAM;AAClB,aAAO;AAAA,IACT,SAAS,WAAW;AAClB,UAAI,CAAC,YAAY,SAAS,EAAG,UAAS,SAAS;AAC/C,aAAO;AAAA,IACT,UAAE;AACA,UAAI,cAAc,YAAY,YAAY;AACxC,sBAAc,UAAU;AACxB,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,QAAQ,CAAC;AAC5C,EAAM,iBAAU,MAAM;AACpB,SAAK,QAAQ;AACb,WAAO,MAAM,cAAc,SAAS,MAAM;AAAA,EAC5C,GAAG,CAAC,OAAO,CAAC;AACZ,QAAM,OAAa,mBAAY,CAAC,UAA8D;AAC5F,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,6CAA6C;AAC5E,WAAO,OAAO,QAAQ,SAAS,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC;AAAA,EAC5D,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,QAAM,OAAa,mBAAY,CAAC,SAAiB;AAC/C,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,8CAA8C;AAC7E,WAAO,OAAO,QAAQ,SAAS,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,EACxD,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,QAAM,sBAA4B,mBAAY,CAAC,MAAc,WAAW,UAAU;AAChF,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,gDAAgD;AAC/E,WAAO,OAAO,QAAQ,SAAS,oBAAoB,EAAE,UAAU,MAAM,SAAS,CAAC;AAAA,EACjF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,SAAO,EAAE,UAAU,OAAO,WAAW,MAAM,MAAM,qBAAqB,QAAQ;AAChF;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,QAAQ,uBAAuB,SAAS,IAAI,mBAAmB;AACvE,QAAM,gBAAsB,cAAwD,IAAI;AACxF,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAS,KAAK;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkB,IAAI;AACtD,EAAM,iBAAU,MAAM,MAAM,cAAc,SAAS,MAAM,GAAG,CAAC,CAAC;AAC9D,QAAM,SAAe,mBAAY,MAAM;AACrC,kBAAc,SAAS,MAAM;AAC7B,kBAAc,UAAU;AACxB,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AACL,QAAM,SAAe,mBAAY,OAAO,OAAe,SAAwD,WAAoB;AACjI,WAAO;AACP,UAAM,aAAa,sBAAsB;AACzC,kBAAc,UAAU;AACxB,aAAS,IAAI;AACb,kBAAc,IAAI;AAClB,QAAI;AACF,aAAO,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,OAAO,GAAG,OAAO;AAAA,IACvF,SAAS,WAAW;AAClB,UAAI,CAAC,YAAY,SAAS,EAAG,UAAS,SAAS;AAC/C,YAAM;AAAA,IACR,UAAE;AACA,UAAI,cAAc,YAAY,WAAY,eAAc,UAAU;AAClE,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,QAAQ,uBAAuB,MAAM,CAAC;AAC1C,QAAM,SAAe,mBAAY,OAAO,UAAkB;AACxD,UAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAgB,SAAS,EAAE,CAAC;AAC7E,WAAO;AACP,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,UAAU,MAAM,CAAC;AAC7B,SAAO,EAAE,QAAQ,QAAQ,QAAQ,OAAO,WAAW;AACrD;AAEO,SAAS,sBAAsB;AACpC,QAAM,EAAE,QAAQ,SAAS,IAAI,mBAAmB;AAChD,QAAM,CAAC,SAAS,UAAU,IAAU,gBAA2C,CAAC,CAAC;AACjF,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAS,KAAK;AAC1D,QAAM,cAAoB,mBAAY,OAAO,UAAuK;AAClN,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,UAAU,MAAM,OAAO,YAAY,YAAY,EAAE,SAAS,MAAM,SAAsC,UAAU,MAAM,UAAU,kBAAkB,MAAM,kBAAkB,gBAAgB,SAAS,GAAG,QAAQ,MAAM,OAAO,CAAC;AAClO,iBAAW,CAAC,YAAY,OAAO,YAAY;AAAA,QACzC,GAAG,OAAO,QAAQ,OAAO;AAAA,QACzB,GAAG,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC;AAAA,MAChD,CAAC,CAAC;AACF,aAAO,QAAQ,IAAI,gCAAgC;AAAA,IACrD,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,QAAM,sBAA4B;AAAA,IAChC,CAAC,UACC,OAAO,YAAY,oBAAoB,KAAK;AAAA,IAC9C,CAAC,MAAM;AAAA,EACT;AACA,SAAO,EAAE,qBAAqB,aAAa,aAAa,QAAQ;AAClE;AAEO,SAAS,eAAe;AAC7B,QAAM,EAAE,QAAQ,SAAS,IAAI,mBAAmB;AAChD,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAS,KAAK;AAC1D,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAkC,IAAI;AAChF,QAAM,SAAe,mBAAY,OAAO,UAAqK;AAC3M,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,KAAK,OAAO,EAAE,GAAG,OAAO,gBAAgB,SAAS,EAAE,CAAC;AAChF,oBAAc,MAAM;AACpB,aAAO;AAAA,IACT,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,SAAO,EAAE,aAAa,YAAY,OAAO;AAC3C;AAEO,SAAS,cAAc;AAC5B,QAAM,EAAE,QAAQ,SAAS,IAAI,mBAAmB;AAChD,QAAM,CAAC,eAAe,gBAAgB,IAAU,gBAAS,KAAK;AAC9D,QAAM,qBAA2B,mBAAY,OAAO,UAA+L;AACjP,qBAAiB,IAAI;AACrB,QAAI;AAAE,aAAO,MAAM,OAAO,IAAI,mBAAmB,EAAE,GAAG,OAAO,gBAAgB,SAAS,EAAE,CAAC;AAAA,IAAG,UAC5F;AAAU,uBAAiB,KAAK;AAAA,IAAG;AAAA,EACrC,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACrB,QAAM,iBAAuB,mBAAY,OAAO,UAC9C,OAAO,IAAI,eAAe,EAAE,GAAG,OAAO,gBAAgB,SAAS,EAAE,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC;AACzF,SAAO,EAAE,eAAe,gBAAgB,mBAAmB;AAC7D;","names":["value","compressionFromContextWindow","mergeContextWindowUpdate","normalizeContextCompression","messageId","mergeContextWindowUpdate","normalizeContextCompression","compressionFromContextWindow","React","React","React","React","React","text","activeThread","React"]}
package/dist/state.d.ts CHANGED
@@ -62,6 +62,10 @@ export type StableAssistantUpsertInput<TMessage extends StableChatMessageBase> =
62
62
  export declare function appendStableStreamingTurn<TMessage extends StableChatMessageBase>(messages: TMessage[], userMessage: TMessage, assistantMessage: TMessage): TMessage[];
63
63
  /** Keep mounted display keys while matching only durable IDs and run linkage. */
64
64
  export declare function preserveMountedMessageIds(canonical: ChatMessage[], current: ChatMessage[]): ChatMessage[];
65
+ /** Reconcile a durable timeline without replacing a newer live assistant segment. */
66
+ export declare function reconcileThreadTimeline(current: ChatMessage[], canonical: ChatMessage[], activeRunId: string | null, streamingMessageId: string | null): ChatMessage[];
67
+ /** A promoted queue item enters the transcript under its durable message ID. */
68
+ export declare function promoteThreadMessage(current: ChatMessage[], message: ChatMessage, runId: string): ChatMessage[];
65
69
  export declare function upsertStableAssistantMessage<TMessage extends StableChatMessageBase>(messages: TMessage[], input: StableAssistantUpsertInput<TMessage>): TMessage[];
66
70
  export declare function applyRuntimeEvent(state: AgentChatState, event: RuntimeEvent): AgentChatState;
67
71
  export declare function applyRuntimeEvents(state: AgentChatState, events: readonly RuntimeEvent[]): AgentChatState;
@@ -31,7 +31,9 @@ export declare function useThreadMessageQueue({ threadId, transport, onPromoted
31
31
  refresh: (selectedThreadId?: string | null) => Promise<ThreadMessagesPage | null>;
32
32
  hydrate: (page: ThreadMessagesPage, selectedThreadId: string) => void;
33
33
  acceptNotice: (notice: ThreadMessageNotice) => boolean;
34
- submit: (input: Omit<ThreadMessageInput, "threadId">) => Promise<ThreadMessageSubmission>;
34
+ submit: (input: Omit<ThreadMessageInput, "threadId"> & {
35
+ attachments?: ThreadMessage["attachments"];
36
+ }) => Promise<ThreadMessageSubmission>;
35
37
  edit: (message: ThreadMessage, input: {
36
38
  text: string;
37
39
  attachmentIds?: readonly string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents24/react",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "DOM-free React state and hooks for Agents24 client applications.",
5
5
  "license": "MIT",
6
6
  "repository": {