@athenaintel/react 0.17.0 → 0.19.0

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.
Files changed (128) hide show
  1. package/README.md +179 -43
  2. package/dist/AthenaContext-B1QMhIP-.cjs.map +1 -1
  3. package/dist/AthenaContext-MOslgOmE.js.map +1 -1
  4. package/dist/SuperGroupingCard-BsWbHyV_.js +795 -0
  5. package/dist/SuperGroupingCard-BsWbHyV_.js.map +1 -0
  6. package/dist/SuperGroupingCard-CRRFUgjN.cjs +794 -0
  7. package/dist/SuperGroupingCard-CRRFUgjN.cjs.map +1 -0
  8. package/dist/chat/StatewireApprovalCard.d.ts +59 -2
  9. package/dist/chat/StatewireClientToolBridge.d.ts +3 -3
  10. package/dist/chat/StatewireQueuedMessages.d.ts +105 -6
  11. package/dist/chat/statewire-approval.d.ts +1 -1
  12. package/dist/chat/statewire-banners.d.ts +5 -9
  13. package/dist/chat/statewire-client-tools.d.ts +15 -21
  14. package/dist/chat/super-grouping/CollapsibleGroup.d.ts +52 -11
  15. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +78 -21
  16. package/dist/chat/super-grouping/activity-timeline.d.ts +91 -0
  17. package/dist/chat/super-grouping/grouping-function.d.ts +13 -10
  18. package/dist/chat/super-grouping/index.d.ts +12 -0
  19. package/dist/chat/super-grouping/toolkit-map.d.ts +8 -1
  20. package/dist/chat/use-statewire-approval-request.d.ts +44 -0
  21. package/dist/chat-ui/header/conversation-history-panel.d.ts +11 -1
  22. package/dist/chat-ui/index.d.ts +9 -0
  23. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +24 -0
  24. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +5 -0
  25. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +1 -1
  26. package/dist/chat-ui/mentions/suggestions/shims.d.ts +0 -4
  27. package/dist/chat-ui/messages/continue-pill.d.ts +13 -0
  28. package/dist/chat-ui/messages/message-components.d.ts +7 -2
  29. package/dist/chat-ui/messages/runtime-message.d.ts +21 -0
  30. package/dist/chat-ui/messages/statewire-continue-run.d.ts +82 -0
  31. package/dist/chat-ui/messages/user-edit-composer.d.ts +5 -2
  32. package/dist/chat-ui/statewire.d.ts +19 -0
  33. package/dist/chat-ui/thread/chat-composer-dock.d.ts +1 -1
  34. package/dist/chat-ui/thread/chat-thread-shell.d.ts +7 -1
  35. package/dist/chat-ui/thread/statewire-history-edge.d.ts +52 -0
  36. package/dist/chat-ui-statewire.cjs +25 -0
  37. package/dist/chat-ui-statewire.cjs.map +1 -0
  38. package/dist/chat-ui-statewire.js +25 -0
  39. package/dist/chat-ui-statewire.js.map +1 -0
  40. package/dist/chat-ui.cjs +292 -252
  41. package/dist/chat-ui.cjs.map +1 -1
  42. package/dist/chat-ui.js +289 -248
  43. package/dist/chat-ui.js.map +1 -1
  44. package/dist/diagnostics/athena-diagnostics.d.ts +1 -1
  45. package/dist/diagnostics/errors.d.ts +4 -4
  46. package/dist/index.cjs +20237 -26233
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.d.ts +25 -14
  49. package/dist/index.js +18465 -24458
  50. package/dist/index.js.map +1 -1
  51. package/dist/lib/athena-urls.d.ts +0 -2
  52. package/dist/lib/posthog/wrap-posthog-client.d.ts +3 -1
  53. package/dist/misc-tool-uis-B2e0Okkn.cjs +43 -0
  54. package/dist/misc-tool-uis-B2e0Okkn.cjs.map +1 -0
  55. package/dist/misc-tool-uis-gAiQw0Yl.js +44 -0
  56. package/dist/misc-tool-uis-gAiQw0Yl.js.map +1 -0
  57. package/dist/provider/AthenaContext.d.ts +0 -7
  58. package/dist/provider/AthenaProvider.d.ts +28 -52
  59. package/dist/provider/config.d.ts +19 -15
  60. package/dist/provider/statewire-lifecycle-context.d.ts +3 -4
  61. package/dist/provider/statewire-window-context.d.ts +12 -0
  62. package/dist/provider/types.d.ts +0 -1
  63. package/dist/runtime/statewire-auth-headers.d.ts +38 -0
  64. package/dist/runtime/statewire-lifecycle.d.ts +25 -1
  65. package/dist/runtime/statewire-run-config.d.ts +18 -5
  66. package/dist/runtime/statewire-session-key.d.ts +13 -0
  67. package/dist/runtime/useAthenaStatewireRuntime.d.ts +42 -16
  68. package/dist/statewire-continue-run-D34gS7_1.js +132 -0
  69. package/dist/statewire-continue-run-D34gS7_1.js.map +1 -0
  70. package/dist/statewire-continue-run-nE9VCKUh.cjs +131 -0
  71. package/dist/statewire-continue-run-nE9VCKUh.cjs.map +1 -0
  72. package/dist/statewire-history-edge-C8uyTEjX.cjs +1711 -0
  73. package/dist/statewire-history-edge-C8uyTEjX.cjs.map +1 -0
  74. package/dist/statewire-history-edge-CPohUKMt.js +1712 -0
  75. package/dist/statewire-history-edge-CPohUKMt.js.map +1 -0
  76. package/dist/styles.css +1 -1
  77. package/dist/super-grouping.cjs +22 -0
  78. package/dist/super-grouping.cjs.map +1 -0
  79. package/dist/super-grouping.js +22 -0
  80. package/dist/super-grouping.js.map +1 -0
  81. package/dist/threads/ThreadList.d.ts +6 -1
  82. package/dist/threads/mint-thread-id.d.ts +8 -0
  83. package/dist/threads/statewire-thread-list.d.ts +26 -9
  84. package/dist/threads/thread-id-context.d.ts +9 -0
  85. package/dist/threads/use-statewire-conversation-history.d.ts +2 -0
  86. package/dist/threads/useAthenaThreadManager.d.ts +24 -12
  87. package/dist/tool-fallback-DkQ3DLkn.js +4281 -0
  88. package/dist/tool-fallback-DkQ3DLkn.js.map +1 -0
  89. package/dist/tool-fallback-kfhpJQZa.cjs +4297 -0
  90. package/dist/tool-fallback-kfhpJQZa.cjs.map +1 -0
  91. package/dist/tools/index.d.ts +14 -0
  92. package/dist/tools/misc-tool-uis.d.ts +2 -0
  93. package/dist/tools/primitives.d.ts +41 -0
  94. package/dist/tools/tool-fallback.d.ts +78 -6
  95. package/dist/tools/tool-icons.d.ts +10 -0
  96. package/dist/tools/tool-uis.d.ts +1 -23
  97. package/dist/tools.cjs +41 -0
  98. package/dist/tools.cjs.map +1 -0
  99. package/dist/tools.js +41 -0
  100. package/dist/tools.js.map +1 -0
  101. package/dist/trash-2-B5OaNAL7.cjs +5096 -0
  102. package/dist/trash-2-B5OaNAL7.cjs.map +1 -0
  103. package/dist/trash-2-CCwSURL-.js +5081 -0
  104. package/dist/trash-2-CCwSURL-.js.map +1 -0
  105. package/dist/{use-rest-conversation-history-BdnG8jEP.cjs → use-rest-conversation-history-Cm8qMRxp.cjs} +985 -5405
  106. package/dist/use-rest-conversation-history-Cm8qMRxp.cjs.map +1 -0
  107. package/dist/{use-rest-conversation-history-DpEswBqQ.js → use-rest-conversation-history-veDZS-oL.js} +1035 -5455
  108. package/dist/use-rest-conversation-history-veDZS-oL.js.map +1 -0
  109. package/dist/wrench-BEf72cyP.cjs +417 -0
  110. package/dist/wrench-BEf72cyP.cjs.map +1 -0
  111. package/dist/wrench-CbrOlVYm.js +418 -0
  112. package/dist/wrench-CbrOlVYm.js.map +1 -0
  113. package/dist/x-Dfd2NzK0.cjs +42 -0
  114. package/dist/x-Dfd2NzK0.cjs.map +1 -0
  115. package/dist/x-_DntAa_a.js +43 -0
  116. package/dist/x-_DntAa_a.js.map +1 -0
  117. package/package.json +29 -11
  118. package/dist/chat/super-grouping/tool-status-labels.d.ts +0 -1
  119. package/dist/runtime/converter.d.ts +0 -5
  120. package/dist/runtime/external-message-converter.d.ts +0 -21
  121. package/dist/runtime/schemas.d.ts +0 -24
  122. package/dist/runtime/transport.d.ts +0 -39
  123. package/dist/runtime/useAthenaRuntime.d.ts +0 -47
  124. package/dist/threads/adapter.d.ts +0 -42
  125. package/dist/threads/useActiveThreadStateHydration.d.ts +0 -12
  126. package/dist/threads/useThreadTitlePolling.d.ts +0 -14
  127. package/dist/use-rest-conversation-history-BdnG8jEP.cjs.map +0 -1
  128. package/dist/use-rest-conversation-history-DpEswBqQ.js.map +0 -1
@@ -0,0 +1,132 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useAuiState } from "@assistant-ui/react";
3
+ import { useStatewireRuns, useStatewireSendCommand } from "@assistant-ui/react-statewire";
4
+ import { r as readRunMarkerFromSourceMessages, A as ATHENA_RUN_MARKER_CANCELLED, a as ATHENA_RUN_MARKER_FAILED, c as cn } from "./trash-2-CCwSURL-.js";
5
+ import "react";
6
+ import "@assistant-ui/tap";
7
+ import "statewire";
8
+ import { h as hasStatewireThreadExtras, f as useDeepAgentThreadStatus, C as ContinuePill, R as RuntimeMessageCard, r as readRuntimeMessageFromSourceMessages } from "./statewire-history-edge-CPohUKMt.js";
9
+ import "@assistant-ui/store";
10
+ function StatewireContinueRunButton({
11
+ allowReadyFallback = false,
12
+ onContinue
13
+ } = {}) {
14
+ const status = useDeepAgentThreadStatus();
15
+ const { runId } = useStatewireRuns();
16
+ const sendCommand = useStatewireSendCommand();
17
+ const isSettled = status === "stopped" || status === "error";
18
+ if (!isSettled && !(allowReadyFallback && status === "ready")) return null;
19
+ return /* @__PURE__ */ jsx(
20
+ ContinuePill,
21
+ {
22
+ ariaLabel: "Continue this run from where it stopped",
23
+ dataTestId: "statewire-continue-run",
24
+ onClick: () => {
25
+ onContinue == null ? void 0 : onContinue({ status, runId });
26
+ sendCommand({
27
+ type: "run/continue",
28
+ ...runId !== null && { runId }
29
+ });
30
+ }
31
+ }
32
+ );
33
+ }
34
+ function StatewireContinueRunAffordance() {
35
+ const messageId = useAuiState((state) => state.message.id);
36
+ const lastMessageId = useAuiState(
37
+ (state) => {
38
+ var _a;
39
+ return (_a = state.thread.messages.at(-1)) == null ? void 0 : _a.id;
40
+ }
41
+ );
42
+ const runMarker = useAuiState(
43
+ (state) => {
44
+ var _a;
45
+ return (_a = readRunMarkerFromSourceMessages(state.message)) == null ? void 0 : _a.marker;
46
+ }
47
+ );
48
+ const threadExtras = useAuiState((state) => state.thread.extras);
49
+ const isContinuableMarker = runMarker === ATHENA_RUN_MARKER_CANCELLED || runMarker === ATHENA_RUN_MARKER_FAILED;
50
+ if (messageId !== lastMessageId || !isContinuableMarker) return null;
51
+ if (!hasStatewireThreadExtras(threadExtras)) return null;
52
+ return /* @__PURE__ */ jsx("div", { className: "flex w-full justify-center py-1", children: /* @__PURE__ */ jsx(StatewireContinueRunButton, { allowReadyFallback: true }) });
53
+ }
54
+ const readRuntimeTailEnding = (message) => {
55
+ const runtime = readRuntimeMessageFromSourceMessages(message);
56
+ return runtime ? { kind: runtime.kind, silent: runtime.silent } : null;
57
+ };
58
+ function StatewireRunEndedFooter({
59
+ className,
60
+ readTailEnding,
61
+ renderActions
62
+ } = {}) {
63
+ const threadExtras = useAuiState((state) => state.thread.extras);
64
+ if (!hasStatewireThreadExtras(threadExtras)) return null;
65
+ return /* @__PURE__ */ jsx(
66
+ StatewireRunEndedFooterContent,
67
+ {
68
+ className,
69
+ readTailEnding,
70
+ renderActions
71
+ }
72
+ );
73
+ }
74
+ function StatewireRunEndedFooterContent({
75
+ className,
76
+ readTailEnding = readRuntimeTailEnding,
77
+ renderActions
78
+ }) {
79
+ const status = useDeepAgentThreadStatus();
80
+ const { error } = useStatewireRuns();
81
+ const tailEndingKind = useAuiState((state) => {
82
+ var _a;
83
+ const last = state.thread.messages.at(-1);
84
+ return last ? ((_a = readTailEnding(last)) == null ? void 0 : _a.kind) ?? null : null;
85
+ });
86
+ const tailEndingSilent = useAuiState((state) => {
87
+ var _a;
88
+ const last = state.thread.messages.at(-1);
89
+ return last ? ((_a = readTailEnding(last)) == null ? void 0 : _a.silent) ?? false : false;
90
+ });
91
+ if (status !== "stopped" && status !== "error") return null;
92
+ if (status === "stopped" && tailEndingSilent) return null;
93
+ const tailRendersEnding = tailEndingKind !== null && !tailEndingSilent;
94
+ const tailMatchesStatus = status === "error" ? tailEndingKind === "failed" : tailEndingKind === "stopped" || tailEndingKind === "paused";
95
+ if (tailRendersEnding && tailMatchesStatus) return null;
96
+ const tailOwnsContinue = tailRendersEnding && tailEndingKind !== "handoff";
97
+ const action = renderActions ? renderActions({ status, tailEndingKind: tailRendersEnding ? tailEndingKind : null }) : tailOwnsContinue ? void 0 : /* @__PURE__ */ jsx(StatewireContinueRunButton, {});
98
+ const message = status === "error" ? {
99
+ kind: "failed",
100
+ reason: "error",
101
+ severity: "error",
102
+ title: "Run failed",
103
+ detail: void 0,
104
+ text: (error == null ? void 0 : error.message) ? `⚠️ The run failed: ${error.message}` : void 0,
105
+ silent: false,
106
+ isSoleSourceMessage: true
107
+ } : {
108
+ kind: "stopped",
109
+ reason: void 0,
110
+ severity: "info",
111
+ title: "Conversation stopped",
112
+ detail: void 0,
113
+ text: void 0,
114
+ silent: false,
115
+ isSoleSourceMessage: true
116
+ };
117
+ return /* @__PURE__ */ jsx(
118
+ RuntimeMessageCard,
119
+ {
120
+ "data-testid": "statewire-run-ended-footer",
121
+ message,
122
+ action,
123
+ className: cn("mx-auto max-w-[95%]", className)
124
+ }
125
+ );
126
+ }
127
+ export {
128
+ StatewireContinueRunAffordance as S,
129
+ StatewireContinueRunButton as a,
130
+ StatewireRunEndedFooter as b
131
+ };
132
+ //# sourceMappingURL=statewire-continue-run-D34gS7_1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statewire-continue-run-D34gS7_1.js","sources":["../src/chat-ui/messages/statewire-continue-run.tsx"],"sourcesContent":["import { type ThreadMessage, useAuiState } from \"@assistant-ui/react\";\nimport {\n useStatewireRuns,\n useStatewireSendCommand,\n} from \"@assistant-ui/react-statewire\";\nimport {\n ATHENA_RUN_MARKER_CANCELLED,\n ATHENA_RUN_MARKER_FAILED,\n type AthenaRuntimeMessage,\n type AthenaRuntimeMessageKind,\n type DeepAgentThreadStatus,\n hasStatewireThreadExtras,\n readRunMarkerFromSourceMessages,\n readRuntimeMessageFromSourceMessages,\n useDeepAgentThreadStatus,\n} from \"@athenaintel/agent-runtime\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { ContinuePill } from \"./continue-pill\";\nimport { RuntimeMessageCard } from \"./runtime-message\";\n\nexport interface StatewireContinueRunButtonProps {\n /**\n * Also offer Continue while the thread projects `ready`. An old snapshot\n * can report a resting thread whose last persisted ending is still\n * continuable; the marker row that mounts this button knows that.\n */\n allowReadyFallback?: boolean;\n /**\n * Called as the continue dispatches (after the pill's exit animation) —\n * the host's telemetry hook. Receives the settled status and live run id.\n */\n onContinue?: (context: { status: DeepAgentThreadStatus; runId: string | null }) => void;\n}\n\n/**\n * Dispatches the bare `run/continue` for the live Statewire thread — the\n * heal-then-continue recovery for stopped, errored, and pod-drained runs. The\n * command is exactly what the library's `onResume` emits, so it inherits the\n * optimistic running-flip (the pill unmounts once the dispatch is accepted)\n * and routes rejections to the runtime's shared `onError` policy.\n *\n * Gated on the LIVE thread status, never on the persisted marker: markers live\n * in the transcript forever, while continuability is a property of the\n * current run state. Requires `capabilities.continue` on the host thread and\n * a statewire aui scope (throws outside one, like every `useStatewire*` hook).\n */\nexport function StatewireContinueRunButton({\n allowReadyFallback = false,\n onContinue,\n}: StatewireContinueRunButtonProps = {}): ReactElement | null {\n const status = useDeepAgentThreadStatus();\n const { runId } = useStatewireRuns();\n const sendCommand = useStatewireSendCommand();\n\n const isSettled = status === \"stopped\" || status === \"error\";\n if (!isSettled && !(allowReadyFallback && status === \"ready\")) return null;\n\n return (\n <ContinuePill\n ariaLabel=\"Continue this run from where it stopped\"\n dataTestId=\"statewire-continue-run\"\n onClick={() => {\n onContinue?.({ status, runId });\n sendCommand({\n type: \"run/continue\",\n ...(runId !== null && { runId }),\n });\n }}\n />\n );\n}\n\n/**\n * Recovery affordance for the latest persisted stopped/failed run marker,\n * for the `runtimeMessageAction` slot of `createAssistantMessage`.\n *\n * Marker messages remain in history forever, so only the current last message\n * may continue. The extras guard keeps Statewire hooks out of read-only or\n * legacy runtimes where they would throw.\n */\nexport function StatewireContinueRunAffordance(): ReactElement | null {\n const messageId = useAuiState((state) => state.message.id);\n const lastMessageId = useAuiState(\n (state) => state.thread.messages.at(-1)?.id,\n );\n const runMarker = useAuiState(\n (state) => readRunMarkerFromSourceMessages(state.message)?.marker,\n );\n const threadExtras = useAuiState((state) => state.thread.extras);\n\n const isContinuableMarker =\n runMarker === ATHENA_RUN_MARKER_CANCELLED ||\n runMarker === ATHENA_RUN_MARKER_FAILED;\n if (messageId !== lastMessageId || !isContinuableMarker) return null;\n if (!hasStatewireThreadExtras(threadExtras)) return null;\n\n return (\n <div className=\"flex w-full justify-center py-1\">\n <StatewireContinueRunButton allowReadyFallback />\n </div>\n );\n}\n\n/** The ending a transcript row paints, as the footer needs to know it. */\nexport interface StatewireTailEnding {\n kind: AthenaRuntimeMessageKind;\n /** A send-now cancellation: kept in the data, painted as nothing. */\n silent: boolean;\n}\n\n/** Reads the runtime ending (marker or handoff) a message row renders, if any. */\nexport type ReadStatewireTailEnding = (message: ThreadMessage) => StatewireTailEnding | null;\n\nconst readRuntimeTailEnding: ReadStatewireTailEnding = (message) => {\n const runtime = readRuntimeMessageFromSourceMessages(message);\n return runtime ? { kind: runtime.kind, silent: runtime.silent } : null;\n};\n\nexport interface StatewireRunEndedFooterActionsContext {\n /** The live settled status the footer describes. */\n status: \"stopped\" | \"error\";\n /** The ending the tail row renders, when it renders one (silent markers read as none). */\n tailEndingKind: AthenaRuntimeMessageKind | null;\n}\n\nexport interface StatewireRunEndedFooterProps {\n /** Merged onto the recovery card's default classes. */\n className?: string;\n /**\n * How the host's assistant row paints the transcript tail. The default reads\n * the runtime ending only (a persisted marker or handoff); a host whose row\n * also styles an assistant-ui error status as a failed ending passes a\n * reader that reports it, so the footer never doubles that row's recovery.\n */\n readTailEnding?: ReadStatewireTailEnding;\n /**\n * The recovery controls. The default renders Continue unless the tail row\n * (a marker of another kind) already carries it; hosts with richer recovery\n * (Retry + Continue) supply their own and decide ownership from the context.\n */\n renderActions?: (context: StatewireRunEndedFooterActionsContext) => ReactNode;\n}\n\n/**\n * Recovery row for a settled run whose persisted ending is no longer the\n * transcript tail — rendered after the messages (`renderMessages`). Rewinds,\n * compaction, and older snapshots can all leave the durable run state\n * recoverable without a marker row that owns the action. The failure copy\n * comes from the replicated run error (`runs.error.message`) — the same text\n * the marker would have carried. Renders nothing on legacy (non-statewire)\n * threads.\n */\nexport function StatewireRunEndedFooter({\n className,\n readTailEnding,\n renderActions,\n}: StatewireRunEndedFooterProps = {}): ReactElement | null {\n const threadExtras = useAuiState((state) => state.thread.extras);\n if (!hasStatewireThreadExtras(threadExtras)) return null;\n return (\n <StatewireRunEndedFooterContent\n className={className}\n readTailEnding={readTailEnding}\n renderActions={renderActions}\n />\n );\n}\n\nfunction StatewireRunEndedFooterContent({\n className,\n readTailEnding = readRuntimeTailEnding,\n renderActions,\n}: StatewireRunEndedFooterProps): ReactElement | null {\n const status = useDeepAgentThreadStatus();\n const { error } = useStatewireRuns();\n // The reader builds a fresh object per call; select primitives so the\n // snapshots stay stable under `Object.is` comparison.\n const tailEndingKind = useAuiState((state) => {\n const last = state.thread.messages.at(-1);\n return last ? (readTailEnding(last)?.kind ?? null) : null;\n });\n const tailEndingSilent = useAuiState((state) => {\n const last = state.thread.messages.at(-1);\n return last ? (readTailEnding(last)?.silent ?? false) : false;\n });\n\n if (status !== \"stopped\" && status !== \"error\") return null;\n\n // A send-now promotion intentionally cancels the superseded run without a\n // visible ending. Statewire can briefly report that cancellation as stopped;\n // preserve the silent contract instead of presenting a false recovery state.\n // A genuine error still wins and remains recoverable below.\n if (status === \"stopped\" && tailEndingSilent) return null;\n\n const tailRendersEnding = tailEndingKind !== null && !tailEndingSilent;\n const tailMatchesStatus =\n status === \"error\"\n ? tailEndingKind === \"failed\"\n : tailEndingKind === \"stopped\" || tailEndingKind === \"paused\";\n if (tailRendersEnding && tailMatchesStatus) return null;\n\n // An older run's marker at the tail still carries its own Continue (the\n // marker-row affordance); a handoff banner does not.\n const tailOwnsContinue = tailRendersEnding && tailEndingKind !== \"handoff\";\n const action = renderActions ? (\n renderActions({ status, tailEndingKind: tailRendersEnding ? tailEndingKind : null })\n ) : tailOwnsContinue ? undefined : (\n <StatewireContinueRunButton />\n );\n const message: AthenaRuntimeMessage =\n status === \"error\"\n ? {\n kind: \"failed\",\n reason: \"error\",\n severity: \"error\",\n title: \"Run failed\",\n detail: undefined,\n text: error?.message ? `⚠️ The run failed: ${error.message}` : undefined,\n silent: false,\n isSoleSourceMessage: true,\n }\n : {\n kind: \"stopped\",\n reason: undefined,\n severity: \"info\",\n title: \"Conversation stopped\",\n detail: undefined,\n text: undefined,\n silent: false,\n isSoleSourceMessage: true,\n };\n\n return (\n <RuntimeMessageCard\n data-testid=\"statewire-run-ended-footer\"\n message={message}\n action={action}\n className={cn(\"mx-auto max-w-[95%]\", className)}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AA+CO,SAAS,2BAA2B;AAAA,EACzC,qBAAqB;AAAA,EACrB;AACF,IAAqC,IAAyB;AAC5D,QAAM,SAAS,yBAAA;AACf,QAAM,EAAE,MAAA,IAAU,iBAAA;AAClB,QAAM,cAAc,wBAAA;AAEpB,QAAM,YAAY,WAAW,aAAa,WAAW;AACrD,MAAI,CAAC,aAAa,EAAE,sBAAsB,WAAW,SAAU,QAAO;AAEtE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,YAAW;AAAA,MACX,SAAS,MAAM;AACb,iDAAa,EAAE,QAAQ;AACvB,oBAAY;AAAA,UACV,MAAM;AAAA,UACN,GAAI,UAAU,QAAQ,EAAE,MAAA;AAAA,QAAM,CAC/B;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAUO,SAAS,iCAAsD;AACpE,QAAM,YAAY,YAAY,CAAC,UAAU,MAAM,QAAQ,EAAE;AACzD,QAAM,gBAAgB;AAAA,IACpB,CAAC,UAAA;;AAAU,yBAAM,OAAO,SAAS,GAAG,EAAE,MAA3B,mBAA8B;AAAA;AAAA,EAAA;AAE3C,QAAM,YAAY;AAAA,IAChB,CAAC,UAAA;;AAAU,mDAAgC,MAAM,OAAO,MAA7C,mBAAgD;AAAA;AAAA,EAAA;AAE7D,QAAM,eAAe,YAAY,CAAC,UAAU,MAAM,OAAO,MAAM;AAE/D,QAAM,sBACJ,cAAc,+BACd,cAAc;AAChB,MAAI,cAAc,iBAAiB,CAAC,oBAAqB,QAAO;AAChE,MAAI,CAAC,yBAAyB,YAAY,EAAG,QAAO;AAEpD,SACE,oBAAC,SAAI,WAAU,mCACb,8BAAC,4BAAA,EAA2B,oBAAkB,MAAC,EAAA,CACjD;AAEJ;AAYA,MAAM,wBAAiD,CAAC,YAAY;AAClE,QAAM,UAAU,qCAAqC,OAAO;AAC5D,SAAO,UAAU,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,WAAW;AACpE;AAoCO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,IAAkC,IAAyB;AACzD,QAAM,eAAe,YAAY,CAAC,UAAU,MAAM,OAAO,MAAM;AAC/D,MAAI,CAAC,yBAAyB,YAAY,EAAG,QAAO;AACpD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,+BAA+B;AAAA,EACtC;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAAsD;AACpD,QAAM,SAAS,yBAAA;AACf,QAAM,EAAE,MAAA,IAAU,iBAAA;AAGlB,QAAM,iBAAiB,YAAY,CAAC,UAAU;;AAC5C,UAAM,OAAO,MAAM,OAAO,SAAS,GAAG,EAAE;AACxC,WAAO,SAAQ,oBAAe,IAAI,MAAnB,mBAAsB,SAAQ,OAAQ;AAAA,EACvD,CAAC;AACD,QAAM,mBAAmB,YAAY,CAAC,UAAU;;AAC9C,UAAM,OAAO,MAAM,OAAO,SAAS,GAAG,EAAE;AACxC,WAAO,SAAQ,oBAAe,IAAI,MAAnB,mBAAsB,WAAU,QAAS;AAAA,EAC1D,CAAC;AAED,MAAI,WAAW,aAAa,WAAW,QAAS,QAAO;AAMvD,MAAI,WAAW,aAAa,iBAAkB,QAAO;AAErD,QAAM,oBAAoB,mBAAmB,QAAQ,CAAC;AACtD,QAAM,oBACJ,WAAW,UACP,mBAAmB,WACnB,mBAAmB,aAAa,mBAAmB;AACzD,MAAI,qBAAqB,kBAAmB,QAAO;AAInD,QAAM,mBAAmB,qBAAqB,mBAAmB;AACjE,QAAM,SAAS,gBACb,cAAc,EAAE,QAAQ,gBAAgB,oBAAoB,iBAAiB,KAAA,CAAM,IACjF,mBAAmB,6BACpB,4BAAA,EAA2B;AAE9B,QAAM,UACJ,WAAW,UACP;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAM,+BAAO,WAAU,sBAAsB,MAAM,OAAO,KAAK;AAAA,IAC/D,QAAQ;AAAA,IACR,qBAAqB;AAAA,EAAA,IAEvB;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,qBAAqB;AAAA,EAAA;AAG7B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW,GAAG,uBAAuB,SAAS;AAAA,IAAA;AAAA,EAAA;AAGpD;"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ const jsxRuntime = require("react/jsx-runtime");
3
+ const react = require("@assistant-ui/react");
4
+ const reactStatewire = require("@assistant-ui/react-statewire");
5
+ const trash2 = require("./trash-2-B5OaNAL7.cjs");
6
+ require("react");
7
+ require("@assistant-ui/tap");
8
+ require("statewire");
9
+ const statewireHistoryEdge = require("./statewire-history-edge-C8uyTEjX.cjs");
10
+ require("@assistant-ui/store");
11
+ function StatewireContinueRunButton({
12
+ allowReadyFallback = false,
13
+ onContinue
14
+ } = {}) {
15
+ const status = statewireHistoryEdge.useDeepAgentThreadStatus();
16
+ const { runId } = reactStatewire.useStatewireRuns();
17
+ const sendCommand = reactStatewire.useStatewireSendCommand();
18
+ const isSettled = status === "stopped" || status === "error";
19
+ if (!isSettled && !(allowReadyFallback && status === "ready")) return null;
20
+ return /* @__PURE__ */ jsxRuntime.jsx(
21
+ statewireHistoryEdge.ContinuePill,
22
+ {
23
+ ariaLabel: "Continue this run from where it stopped",
24
+ dataTestId: "statewire-continue-run",
25
+ onClick: () => {
26
+ onContinue == null ? void 0 : onContinue({ status, runId });
27
+ sendCommand({
28
+ type: "run/continue",
29
+ ...runId !== null && { runId }
30
+ });
31
+ }
32
+ }
33
+ );
34
+ }
35
+ function StatewireContinueRunAffordance() {
36
+ const messageId = react.useAuiState((state) => state.message.id);
37
+ const lastMessageId = react.useAuiState(
38
+ (state) => {
39
+ var _a;
40
+ return (_a = state.thread.messages.at(-1)) == null ? void 0 : _a.id;
41
+ }
42
+ );
43
+ const runMarker = react.useAuiState(
44
+ (state) => {
45
+ var _a;
46
+ return (_a = trash2.readRunMarkerFromSourceMessages(state.message)) == null ? void 0 : _a.marker;
47
+ }
48
+ );
49
+ const threadExtras = react.useAuiState((state) => state.thread.extras);
50
+ const isContinuableMarker = runMarker === trash2.ATHENA_RUN_MARKER_CANCELLED || runMarker === trash2.ATHENA_RUN_MARKER_FAILED;
51
+ if (messageId !== lastMessageId || !isContinuableMarker) return null;
52
+ if (!statewireHistoryEdge.hasStatewireThreadExtras(threadExtras)) return null;
53
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-full justify-center py-1", children: /* @__PURE__ */ jsxRuntime.jsx(StatewireContinueRunButton, { allowReadyFallback: true }) });
54
+ }
55
+ const readRuntimeTailEnding = (message) => {
56
+ const runtime = statewireHistoryEdge.readRuntimeMessageFromSourceMessages(message);
57
+ return runtime ? { kind: runtime.kind, silent: runtime.silent } : null;
58
+ };
59
+ function StatewireRunEndedFooter({
60
+ className,
61
+ readTailEnding,
62
+ renderActions
63
+ } = {}) {
64
+ const threadExtras = react.useAuiState((state) => state.thread.extras);
65
+ if (!statewireHistoryEdge.hasStatewireThreadExtras(threadExtras)) return null;
66
+ return /* @__PURE__ */ jsxRuntime.jsx(
67
+ StatewireRunEndedFooterContent,
68
+ {
69
+ className,
70
+ readTailEnding,
71
+ renderActions
72
+ }
73
+ );
74
+ }
75
+ function StatewireRunEndedFooterContent({
76
+ className,
77
+ readTailEnding = readRuntimeTailEnding,
78
+ renderActions
79
+ }) {
80
+ const status = statewireHistoryEdge.useDeepAgentThreadStatus();
81
+ const { error } = reactStatewire.useStatewireRuns();
82
+ const tailEndingKind = react.useAuiState((state) => {
83
+ var _a;
84
+ const last = state.thread.messages.at(-1);
85
+ return last ? ((_a = readTailEnding(last)) == null ? void 0 : _a.kind) ?? null : null;
86
+ });
87
+ const tailEndingSilent = react.useAuiState((state) => {
88
+ var _a;
89
+ const last = state.thread.messages.at(-1);
90
+ return last ? ((_a = readTailEnding(last)) == null ? void 0 : _a.silent) ?? false : false;
91
+ });
92
+ if (status !== "stopped" && status !== "error") return null;
93
+ if (status === "stopped" && tailEndingSilent) return null;
94
+ const tailRendersEnding = tailEndingKind !== null && !tailEndingSilent;
95
+ const tailMatchesStatus = status === "error" ? tailEndingKind === "failed" : tailEndingKind === "stopped" || tailEndingKind === "paused";
96
+ if (tailRendersEnding && tailMatchesStatus) return null;
97
+ const tailOwnsContinue = tailRendersEnding && tailEndingKind !== "handoff";
98
+ const action = renderActions ? renderActions({ status, tailEndingKind: tailRendersEnding ? tailEndingKind : null }) : tailOwnsContinue ? void 0 : /* @__PURE__ */ jsxRuntime.jsx(StatewireContinueRunButton, {});
99
+ const message = status === "error" ? {
100
+ kind: "failed",
101
+ reason: "error",
102
+ severity: "error",
103
+ title: "Run failed",
104
+ detail: void 0,
105
+ text: (error == null ? void 0 : error.message) ? `⚠️ The run failed: ${error.message}` : void 0,
106
+ silent: false,
107
+ isSoleSourceMessage: true
108
+ } : {
109
+ kind: "stopped",
110
+ reason: void 0,
111
+ severity: "info",
112
+ title: "Conversation stopped",
113
+ detail: void 0,
114
+ text: void 0,
115
+ silent: false,
116
+ isSoleSourceMessage: true
117
+ };
118
+ return /* @__PURE__ */ jsxRuntime.jsx(
119
+ statewireHistoryEdge.RuntimeMessageCard,
120
+ {
121
+ "data-testid": "statewire-run-ended-footer",
122
+ message,
123
+ action,
124
+ className: trash2.cn("mx-auto max-w-[95%]", className)
125
+ }
126
+ );
127
+ }
128
+ exports.StatewireContinueRunAffordance = StatewireContinueRunAffordance;
129
+ exports.StatewireContinueRunButton = StatewireContinueRunButton;
130
+ exports.StatewireRunEndedFooter = StatewireRunEndedFooter;
131
+ //# sourceMappingURL=statewire-continue-run-nE9VCKUh.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statewire-continue-run-nE9VCKUh.cjs","sources":["../src/chat-ui/messages/statewire-continue-run.tsx"],"sourcesContent":["import { type ThreadMessage, useAuiState } from \"@assistant-ui/react\";\nimport {\n useStatewireRuns,\n useStatewireSendCommand,\n} from \"@assistant-ui/react-statewire\";\nimport {\n ATHENA_RUN_MARKER_CANCELLED,\n ATHENA_RUN_MARKER_FAILED,\n type AthenaRuntimeMessage,\n type AthenaRuntimeMessageKind,\n type DeepAgentThreadStatus,\n hasStatewireThreadExtras,\n readRunMarkerFromSourceMessages,\n readRuntimeMessageFromSourceMessages,\n useDeepAgentThreadStatus,\n} from \"@athenaintel/agent-runtime\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { ContinuePill } from \"./continue-pill\";\nimport { RuntimeMessageCard } from \"./runtime-message\";\n\nexport interface StatewireContinueRunButtonProps {\n /**\n * Also offer Continue while the thread projects `ready`. An old snapshot\n * can report a resting thread whose last persisted ending is still\n * continuable; the marker row that mounts this button knows that.\n */\n allowReadyFallback?: boolean;\n /**\n * Called as the continue dispatches (after the pill's exit animation) —\n * the host's telemetry hook. Receives the settled status and live run id.\n */\n onContinue?: (context: { status: DeepAgentThreadStatus; runId: string | null }) => void;\n}\n\n/**\n * Dispatches the bare `run/continue` for the live Statewire thread — the\n * heal-then-continue recovery for stopped, errored, and pod-drained runs. The\n * command is exactly what the library's `onResume` emits, so it inherits the\n * optimistic running-flip (the pill unmounts once the dispatch is accepted)\n * and routes rejections to the runtime's shared `onError` policy.\n *\n * Gated on the LIVE thread status, never on the persisted marker: markers live\n * in the transcript forever, while continuability is a property of the\n * current run state. Requires `capabilities.continue` on the host thread and\n * a statewire aui scope (throws outside one, like every `useStatewire*` hook).\n */\nexport function StatewireContinueRunButton({\n allowReadyFallback = false,\n onContinue,\n}: StatewireContinueRunButtonProps = {}): ReactElement | null {\n const status = useDeepAgentThreadStatus();\n const { runId } = useStatewireRuns();\n const sendCommand = useStatewireSendCommand();\n\n const isSettled = status === \"stopped\" || status === \"error\";\n if (!isSettled && !(allowReadyFallback && status === \"ready\")) return null;\n\n return (\n <ContinuePill\n ariaLabel=\"Continue this run from where it stopped\"\n dataTestId=\"statewire-continue-run\"\n onClick={() => {\n onContinue?.({ status, runId });\n sendCommand({\n type: \"run/continue\",\n ...(runId !== null && { runId }),\n });\n }}\n />\n );\n}\n\n/**\n * Recovery affordance for the latest persisted stopped/failed run marker,\n * for the `runtimeMessageAction` slot of `createAssistantMessage`.\n *\n * Marker messages remain in history forever, so only the current last message\n * may continue. The extras guard keeps Statewire hooks out of read-only or\n * legacy runtimes where they would throw.\n */\nexport function StatewireContinueRunAffordance(): ReactElement | null {\n const messageId = useAuiState((state) => state.message.id);\n const lastMessageId = useAuiState(\n (state) => state.thread.messages.at(-1)?.id,\n );\n const runMarker = useAuiState(\n (state) => readRunMarkerFromSourceMessages(state.message)?.marker,\n );\n const threadExtras = useAuiState((state) => state.thread.extras);\n\n const isContinuableMarker =\n runMarker === ATHENA_RUN_MARKER_CANCELLED ||\n runMarker === ATHENA_RUN_MARKER_FAILED;\n if (messageId !== lastMessageId || !isContinuableMarker) return null;\n if (!hasStatewireThreadExtras(threadExtras)) return null;\n\n return (\n <div className=\"flex w-full justify-center py-1\">\n <StatewireContinueRunButton allowReadyFallback />\n </div>\n );\n}\n\n/** The ending a transcript row paints, as the footer needs to know it. */\nexport interface StatewireTailEnding {\n kind: AthenaRuntimeMessageKind;\n /** A send-now cancellation: kept in the data, painted as nothing. */\n silent: boolean;\n}\n\n/** Reads the runtime ending (marker or handoff) a message row renders, if any. */\nexport type ReadStatewireTailEnding = (message: ThreadMessage) => StatewireTailEnding | null;\n\nconst readRuntimeTailEnding: ReadStatewireTailEnding = (message) => {\n const runtime = readRuntimeMessageFromSourceMessages(message);\n return runtime ? { kind: runtime.kind, silent: runtime.silent } : null;\n};\n\nexport interface StatewireRunEndedFooterActionsContext {\n /** The live settled status the footer describes. */\n status: \"stopped\" | \"error\";\n /** The ending the tail row renders, when it renders one (silent markers read as none). */\n tailEndingKind: AthenaRuntimeMessageKind | null;\n}\n\nexport interface StatewireRunEndedFooterProps {\n /** Merged onto the recovery card's default classes. */\n className?: string;\n /**\n * How the host's assistant row paints the transcript tail. The default reads\n * the runtime ending only (a persisted marker or handoff); a host whose row\n * also styles an assistant-ui error status as a failed ending passes a\n * reader that reports it, so the footer never doubles that row's recovery.\n */\n readTailEnding?: ReadStatewireTailEnding;\n /**\n * The recovery controls. The default renders Continue unless the tail row\n * (a marker of another kind) already carries it; hosts with richer recovery\n * (Retry + Continue) supply their own and decide ownership from the context.\n */\n renderActions?: (context: StatewireRunEndedFooterActionsContext) => ReactNode;\n}\n\n/**\n * Recovery row for a settled run whose persisted ending is no longer the\n * transcript tail — rendered after the messages (`renderMessages`). Rewinds,\n * compaction, and older snapshots can all leave the durable run state\n * recoverable without a marker row that owns the action. The failure copy\n * comes from the replicated run error (`runs.error.message`) — the same text\n * the marker would have carried. Renders nothing on legacy (non-statewire)\n * threads.\n */\nexport function StatewireRunEndedFooter({\n className,\n readTailEnding,\n renderActions,\n}: StatewireRunEndedFooterProps = {}): ReactElement | null {\n const threadExtras = useAuiState((state) => state.thread.extras);\n if (!hasStatewireThreadExtras(threadExtras)) return null;\n return (\n <StatewireRunEndedFooterContent\n className={className}\n readTailEnding={readTailEnding}\n renderActions={renderActions}\n />\n );\n}\n\nfunction StatewireRunEndedFooterContent({\n className,\n readTailEnding = readRuntimeTailEnding,\n renderActions,\n}: StatewireRunEndedFooterProps): ReactElement | null {\n const status = useDeepAgentThreadStatus();\n const { error } = useStatewireRuns();\n // The reader builds a fresh object per call; select primitives so the\n // snapshots stay stable under `Object.is` comparison.\n const tailEndingKind = useAuiState((state) => {\n const last = state.thread.messages.at(-1);\n return last ? (readTailEnding(last)?.kind ?? null) : null;\n });\n const tailEndingSilent = useAuiState((state) => {\n const last = state.thread.messages.at(-1);\n return last ? (readTailEnding(last)?.silent ?? false) : false;\n });\n\n if (status !== \"stopped\" && status !== \"error\") return null;\n\n // A send-now promotion intentionally cancels the superseded run without a\n // visible ending. Statewire can briefly report that cancellation as stopped;\n // preserve the silent contract instead of presenting a false recovery state.\n // A genuine error still wins and remains recoverable below.\n if (status === \"stopped\" && tailEndingSilent) return null;\n\n const tailRendersEnding = tailEndingKind !== null && !tailEndingSilent;\n const tailMatchesStatus =\n status === \"error\"\n ? tailEndingKind === \"failed\"\n : tailEndingKind === \"stopped\" || tailEndingKind === \"paused\";\n if (tailRendersEnding && tailMatchesStatus) return null;\n\n // An older run's marker at the tail still carries its own Continue (the\n // marker-row affordance); a handoff banner does not.\n const tailOwnsContinue = tailRendersEnding && tailEndingKind !== \"handoff\";\n const action = renderActions ? (\n renderActions({ status, tailEndingKind: tailRendersEnding ? tailEndingKind : null })\n ) : tailOwnsContinue ? undefined : (\n <StatewireContinueRunButton />\n );\n const message: AthenaRuntimeMessage =\n status === \"error\"\n ? {\n kind: \"failed\",\n reason: \"error\",\n severity: \"error\",\n title: \"Run failed\",\n detail: undefined,\n text: error?.message ? `⚠️ The run failed: ${error.message}` : undefined,\n silent: false,\n isSoleSourceMessage: true,\n }\n : {\n kind: \"stopped\",\n reason: undefined,\n severity: \"info\",\n title: \"Conversation stopped\",\n detail: undefined,\n text: undefined,\n silent: false,\n isSoleSourceMessage: true,\n };\n\n return (\n <RuntimeMessageCard\n data-testid=\"statewire-run-ended-footer\"\n message={message}\n action={action}\n className={cn(\"mx-auto max-w-[95%]\", className)}\n />\n );\n}\n"],"names":["useDeepAgentThreadStatus","useStatewireRuns","useStatewireSendCommand","jsx","ContinuePill","useAuiState","readRunMarkerFromSourceMessages","ATHENA_RUN_MARKER_CANCELLED","ATHENA_RUN_MARKER_FAILED","hasStatewireThreadExtras","readRuntimeMessageFromSourceMessages","RuntimeMessageCard","cn"],"mappings":";;;;;;;;;;AA+CO,SAAS,2BAA2B;AAAA,EACzC,qBAAqB;AAAA,EACrB;AACF,IAAqC,IAAyB;AAC5D,QAAM,SAASA,qBAAAA,yBAAA;AACf,QAAM,EAAE,MAAA,IAAUC,gCAAA;AAClB,QAAM,cAAcC,eAAAA,wBAAA;AAEpB,QAAM,YAAY,WAAW,aAAa,WAAW;AACrD,MAAI,CAAC,aAAa,EAAE,sBAAsB,WAAW,SAAU,QAAO;AAEtE,SACEC,2BAAAA;AAAAA,IAACC,qBAAAA;AAAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,YAAW;AAAA,MACX,SAAS,MAAM;AACb,iDAAa,EAAE,QAAQ;AACvB,oBAAY;AAAA,UACV,MAAM;AAAA,UACN,GAAI,UAAU,QAAQ,EAAE,MAAA;AAAA,QAAM,CAC/B;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAUO,SAAS,iCAAsD;AACpE,QAAM,YAAYC,MAAAA,YAAY,CAAC,UAAU,MAAM,QAAQ,EAAE;AACzD,QAAM,gBAAgBA,MAAAA;AAAAA,IACpB,CAAC,UAAA;;AAAU,yBAAM,OAAO,SAAS,GAAG,EAAE,MAA3B,mBAA8B;AAAA;AAAA,EAAA;AAE3C,QAAM,YAAYA,MAAAA;AAAAA,IAChB,CAAC,UAAA;;AAAUC,0BAAAA,gCAAgC,MAAM,OAAO,MAA7CA,mBAAgD;AAAA;AAAA,EAAA;AAE7D,QAAM,eAAeD,MAAAA,YAAY,CAAC,UAAU,MAAM,OAAO,MAAM;AAE/D,QAAM,sBACJ,cAAcE,OAAAA,+BACd,cAAcC,OAAAA;AAChB,MAAI,cAAc,iBAAiB,CAAC,oBAAqB,QAAO;AAChE,MAAI,CAACC,qBAAAA,yBAAyB,YAAY,EAAG,QAAO;AAEpD,SACEN,+BAAC,SAAI,WAAU,mCACb,yCAAC,4BAAA,EAA2B,oBAAkB,MAAC,EAAA,CACjD;AAEJ;AAYA,MAAM,wBAAiD,CAAC,YAAY;AAClE,QAAM,UAAUO,qBAAAA,qCAAqC,OAAO;AAC5D,SAAO,UAAU,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,WAAW;AACpE;AAoCO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,IAAkC,IAAyB;AACzD,QAAM,eAAeL,MAAAA,YAAY,CAAC,UAAU,MAAM,OAAO,MAAM;AAC/D,MAAI,CAACI,qBAAAA,yBAAyB,YAAY,EAAG,QAAO;AACpD,SACEN,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,+BAA+B;AAAA,EACtC;AAAA,EACA,iBAAiB;AAAA,EACjB;AACF,GAAsD;AACpD,QAAM,SAASH,qBAAAA,yBAAA;AACf,QAAM,EAAE,MAAA,IAAUC,gCAAA;AAGlB,QAAM,iBAAiBI,kBAAY,CAAC,UAAU;;AAC5C,UAAM,OAAO,MAAM,OAAO,SAAS,GAAG,EAAE;AACxC,WAAO,SAAQ,oBAAe,IAAI,MAAnB,mBAAsB,SAAQ,OAAQ;AAAA,EACvD,CAAC;AACD,QAAM,mBAAmBA,kBAAY,CAAC,UAAU;;AAC9C,UAAM,OAAO,MAAM,OAAO,SAAS,GAAG,EAAE;AACxC,WAAO,SAAQ,oBAAe,IAAI,MAAnB,mBAAsB,WAAU,QAAS;AAAA,EAC1D,CAAC;AAED,MAAI,WAAW,aAAa,WAAW,QAAS,QAAO;AAMvD,MAAI,WAAW,aAAa,iBAAkB,QAAO;AAErD,QAAM,oBAAoB,mBAAmB,QAAQ,CAAC;AACtD,QAAM,oBACJ,WAAW,UACP,mBAAmB,WACnB,mBAAmB,aAAa,mBAAmB;AACzD,MAAI,qBAAqB,kBAAmB,QAAO;AAInD,QAAM,mBAAmB,qBAAqB,mBAAmB;AACjE,QAAM,SAAS,gBACb,cAAc,EAAE,QAAQ,gBAAgB,oBAAoB,iBAAiB,KAAA,CAAM,IACjF,mBAAmB,wCACpB,4BAAA,EAA2B;AAE9B,QAAM,UACJ,WAAW,UACP;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAM,+BAAO,WAAU,sBAAsB,MAAM,OAAO,KAAK;AAAA,IAC/D,QAAQ;AAAA,IACR,qBAAqB;AAAA,EAAA,IAEvB;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,qBAAqB;AAAA,EAAA;AAG7B,SACEF,2BAAAA;AAAAA,IAACQ,qBAAAA;AAAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAWC,OAAAA,GAAG,uBAAuB,SAAS;AAAA,IAAA;AAAA,EAAA;AAGpD;;;;"}