@cntyclub/agent-react 0.7.0 → 0.8.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.
- package/dist/components/agent-panel.d.ts.map +1 -1
- package/dist/components/thinking-indicator.d.ts +14 -0
- package/dist/components/thinking-indicator.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +130 -61
- package/dist/index.js.map +1 -1
- package/dist/use-agent-chat.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-panel.d.ts","sourceRoot":"","sources":["../../src/components/agent-panel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-panel.d.ts","sourceRoot":"","sources":["../../src/components/agent-panel.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAO5C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,cAAc,GAAG,gBAAgB,CAAC;IACxC,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iEAAiE;IACjE,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,kBAAkB,EAClB,IAAI,EACJ,SAAS,EACT,MAAM,EACN,eAAe,EACf,OAAO,EACP,iBAAiB,GAClB,EAAE,eAAe,qBA2SjB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface ThinkingIndicatorProps {
|
|
3
|
+
/** Override the rotating phrases. */
|
|
4
|
+
phrases?: string[];
|
|
5
|
+
/** Milliseconds each phrase stays before rotating. Default 1800. */
|
|
6
|
+
intervalMs?: number;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A muted "typing" bubble: three bouncing dots plus a phrase that rotates every
|
|
11
|
+
* ~1.8s, so a long tool run reads as active progress instead of a frozen "…".
|
|
12
|
+
*/
|
|
13
|
+
export declare function ThinkingIndicator({ className, intervalMs, phrases }: ThinkingIndicatorProps): React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=thinking-indicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-indicator.d.ts","sourceRoot":"","sources":["../../src/components/thinking-indicator.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,MAAM,WAAW,sBAAsB;IACrC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,UAAiB,EAAE,OAAO,EAAE,EAAE,sBAAsB,qBAqClG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export { AgentWidget, type AgentWidgetProps } from "./components/agent-widget";
|
|
|
5
5
|
export { DocumentCard } from "./components/document-card";
|
|
6
6
|
export { MessageItem } from "./components/message-item";
|
|
7
7
|
export { TaskChecklist } from "./components/task-checklist";
|
|
8
|
+
export { ThinkingIndicator, type ThinkingIndicatorProps } from "./components/thinking-indicator";
|
|
8
9
|
export { ToolActivityGroup, type ToolActivityGroupProps } from "./components/tool-activity-group";
|
|
9
10
|
export { ToolApprovalCard, type ToolApprovalCardProps } from "./components/tool-approval-card";
|
|
10
11
|
export { defineAgentConfig } from "./config";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACjF,YAAY,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,UAAU,IAAI,mBAAmB,EACjC,UAAU,IAAI,mBAAmB,EACjC,KAAK,IAAI,cAAc,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACjF,YAAY,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,UAAU,IAAI,mBAAmB,EACjC,UAAU,IAAI,mBAAmB,EACjC,KAAK,IAAI,cAAc,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Button, cn, ChatMessage, ChatMessageBubble, Markdown, Spinner, Checkbox, Collapsible, CollapsibleTrigger, ChatToolChip, CollapsiblePanel, ChatToolCard, ChatToolCardHeader, ChatToolCardActions, Group, Menu, MenuTrigger, MenuPopup, MenuItem, ChatHeader, ChatHeaderAvatar, ChatHeaderTitle, ChatHeaderActions, Tooltip, TooltipTrigger, TooltipContent, Chat, ChatMessages, ChatEmptyState, ChatEmptyStateIcon, ChatEmptyStateTitle, ChatEmptyStateDescription, ChatSuggestions, ChatSuggestion,
|
|
1
|
+
import { Button, cn, ChatMessage, ChatMessageBubble, Markdown, Spinner, Checkbox, Collapsible, CollapsibleTrigger, ChatToolChip, CollapsiblePanel, ChatToolCard, ChatToolCardHeader, ChatToolCardActions, Group, Menu, MenuTrigger, MenuPopup, MenuItem, ChatHeader, ChatHeaderAvatar, ChatHeaderTitle, ChatHeaderActions, Tooltip, TooltipTrigger, TooltipContent, Chat, ChatMessages, ChatEmptyState, ChatEmptyStateIcon, ChatEmptyStateTitle, ChatEmptyStateDescription, ChatSuggestions, ChatSuggestion, useMediaQuery, TooltipProvider, Fab, DataTablePaged } from '@cntyclub/ui-react';
|
|
2
2
|
import { FileTextIcon, XIcon, PaperclipIcon, ArrowUpIcon, Maximize2Icon, ListChecksIcon, ChevronDownIcon, CheckIcon, ShieldAlertIcon, CheckCheckIcon, UploadCloudIcon, HistoryIcon, SquarePenIcon, Minimize2Icon, Trash2Icon, SparklesIcon, DownloadIcon, CodeIcon } from 'lucide-react';
|
|
3
|
-
import * as
|
|
3
|
+
import * as React6 from 'react';
|
|
4
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
// src/api-client.ts
|
|
@@ -137,14 +137,14 @@ function AgentComposer({
|
|
|
137
137
|
placeholder = "Ask anything\u2026",
|
|
138
138
|
value
|
|
139
139
|
}) {
|
|
140
|
-
const textareaRef =
|
|
141
|
-
const inputRef =
|
|
140
|
+
const textareaRef = React6.useRef(null);
|
|
141
|
+
const inputRef = React6.useRef(null);
|
|
142
142
|
const canSubmit = !disabled && (value.trim().length > 0 || files.length > 0);
|
|
143
|
-
const submit =
|
|
143
|
+
const submit = React6.useCallback(() => {
|
|
144
144
|
if (!canSubmit) return;
|
|
145
145
|
onSubmit(value.trim());
|
|
146
146
|
}, [canSubmit, onSubmit, value]);
|
|
147
|
-
|
|
147
|
+
React6.useEffect(() => {
|
|
148
148
|
const textarea = textareaRef.current;
|
|
149
149
|
if (!textarea) return;
|
|
150
150
|
textarea.style.height = "auto";
|
|
@@ -211,7 +211,7 @@ function AgentComposer({
|
|
|
211
211
|
Button,
|
|
212
212
|
{
|
|
213
213
|
"aria-label": "Attach files",
|
|
214
|
-
className: "shrink-0",
|
|
214
|
+
className: "shrink-0 self-center",
|
|
215
215
|
disabled,
|
|
216
216
|
onClick: () => inputRef.current?.click(),
|
|
217
217
|
size: "icon-sm",
|
|
@@ -349,6 +349,55 @@ function MessageItem({ message }) {
|
|
|
349
349
|
}
|
|
350
350
|
return null;
|
|
351
351
|
}
|
|
352
|
+
var DEFAULT_PHRASES = [
|
|
353
|
+
"Thinking",
|
|
354
|
+
"Working on it",
|
|
355
|
+
"Looking that up",
|
|
356
|
+
"Reading the data",
|
|
357
|
+
"Putting it together",
|
|
358
|
+
"Almost there"
|
|
359
|
+
];
|
|
360
|
+
function ThinkingIndicator({ className, intervalMs = 1800, phrases }) {
|
|
361
|
+
const words = phrases && phrases.length ? phrases : DEFAULT_PHRASES;
|
|
362
|
+
const [index, setIndex] = React6.useState(0);
|
|
363
|
+
React6.useEffect(() => {
|
|
364
|
+
setIndex(0);
|
|
365
|
+
const timer = setInterval(() => {
|
|
366
|
+
setIndex((current) => (current + 1) % words.length);
|
|
367
|
+
}, intervalMs);
|
|
368
|
+
return () => clearInterval(timer);
|
|
369
|
+
}, [intervalMs, words]);
|
|
370
|
+
return /* @__PURE__ */ jsxs(
|
|
371
|
+
"div",
|
|
372
|
+
{
|
|
373
|
+
"aria-label": "Assistant is working",
|
|
374
|
+
className: cn(
|
|
375
|
+
"fade-in-0 flex w-fit animate-in items-center gap-2 rounded-2xl rounded-bl-md bg-muted px-3.5 py-2.5 duration-200",
|
|
376
|
+
className
|
|
377
|
+
),
|
|
378
|
+
"data-slot": "thinking-indicator",
|
|
379
|
+
role: "status",
|
|
380
|
+
children: [
|
|
381
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
|
|
382
|
+
/* @__PURE__ */ jsx("span", { className: "size-1.5 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:0ms]" }),
|
|
383
|
+
/* @__PURE__ */ jsx("span", { className: "size-1.5 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:150ms]" }),
|
|
384
|
+
/* @__PURE__ */ jsx("span", { className: "size-1.5 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:300ms]" })
|
|
385
|
+
] }),
|
|
386
|
+
/* @__PURE__ */ jsxs(
|
|
387
|
+
"span",
|
|
388
|
+
{
|
|
389
|
+
className: "fade-in-0 animate-in text-muted-foreground text-xs duration-300",
|
|
390
|
+
children: [
|
|
391
|
+
words[index],
|
|
392
|
+
"\u2026"
|
|
393
|
+
]
|
|
394
|
+
},
|
|
395
|
+
index
|
|
396
|
+
)
|
|
397
|
+
]
|
|
398
|
+
}
|
|
399
|
+
);
|
|
400
|
+
}
|
|
352
401
|
var NOISE_KEYS = /* @__PURE__ */ new Set([
|
|
353
402
|
"id",
|
|
354
403
|
"pk",
|
|
@@ -573,7 +622,7 @@ function DownloadButton({ block, size = "sm" }) {
|
|
|
573
622
|
);
|
|
574
623
|
}
|
|
575
624
|
function DocumentViewer({ block, onClose }) {
|
|
576
|
-
|
|
625
|
+
React6.useEffect(() => {
|
|
577
626
|
const onKey = (event) => event.key === "Escape" && onClose();
|
|
578
627
|
window.addEventListener("keydown", onKey);
|
|
579
628
|
return () => window.removeEventListener("keydown", onKey);
|
|
@@ -598,7 +647,7 @@ function DocumentViewer({ block, onClose }) {
|
|
|
598
647
|
] });
|
|
599
648
|
}
|
|
600
649
|
function DocumentCard({ block }) {
|
|
601
|
-
const [open, setOpen] =
|
|
650
|
+
const [open, setOpen] = React6.useState(false);
|
|
602
651
|
const previewLines = (block.preview || "").split("\n").slice(0, 6).join("\n");
|
|
603
652
|
return /* @__PURE__ */ jsxs("div", { className: "w-full max-w-full overflow-hidden rounded-xl border border-border bg-card shadow-xs", children: [
|
|
604
653
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-border/72 border-b px-3 py-2", children: [
|
|
@@ -720,7 +769,7 @@ function StepDetail({
|
|
|
720
769
|
] });
|
|
721
770
|
}
|
|
722
771
|
function ToolActivityGroup({ describeToolCall, steps }) {
|
|
723
|
-
const [open, setOpen] =
|
|
772
|
+
const [open, setOpen] = React6.useState(false);
|
|
724
773
|
if (steps.length === 0) return null;
|
|
725
774
|
const last = steps[steps.length - 1];
|
|
726
775
|
const anyRunning = steps.some((step) => step.status === "running");
|
|
@@ -823,19 +872,19 @@ function AgentPanel({
|
|
|
823
872
|
onClose,
|
|
824
873
|
onToggleAgentMode
|
|
825
874
|
}) {
|
|
826
|
-
const [draft, setDraft] =
|
|
827
|
-
const [view, setView] =
|
|
828
|
-
const [files, setFiles] =
|
|
829
|
-
const [uploadError, setUploadError] =
|
|
830
|
-
const [dragging, setDragging] =
|
|
831
|
-
const dragDepth =
|
|
875
|
+
const [draft, setDraft] = React6.useState("");
|
|
876
|
+
const [view, setView] = React6.useState("chat");
|
|
877
|
+
const [files, setFiles] = React6.useState([]);
|
|
878
|
+
const [uploadError, setUploadError] = React6.useState(null);
|
|
879
|
+
const [dragging, setDragging] = React6.useState(false);
|
|
880
|
+
const dragDepth = React6.useRef(0);
|
|
832
881
|
const agentName = config.agentName ?? chat.agentInfo?.name ?? "Assistant";
|
|
833
882
|
const uploadEnabled = fileUploadEnabled(config);
|
|
834
883
|
const suggestions = config.suggestions ?? [
|
|
835
884
|
"What can you help me with?",
|
|
836
885
|
"Give me a quick summary of my data."
|
|
837
886
|
];
|
|
838
|
-
const addFiles =
|
|
887
|
+
const addFiles = React6.useCallback(
|
|
839
888
|
(incoming) => {
|
|
840
889
|
const accepted = [];
|
|
841
890
|
let rejection = null;
|
|
@@ -852,10 +901,10 @@ function AgentPanel({
|
|
|
852
901
|
},
|
|
853
902
|
[config]
|
|
854
903
|
);
|
|
855
|
-
const removeFile =
|
|
904
|
+
const removeFile = React6.useCallback((index) => {
|
|
856
905
|
setFiles((current) => current.filter((_, i) => i !== index));
|
|
857
906
|
}, []);
|
|
858
|
-
const handleSubmit =
|
|
907
|
+
const handleSubmit = React6.useCallback(
|
|
859
908
|
(text) => {
|
|
860
909
|
const staged = files;
|
|
861
910
|
setDraft("");
|
|
@@ -865,7 +914,7 @@ function AgentPanel({
|
|
|
865
914
|
},
|
|
866
915
|
[chat, files]
|
|
867
916
|
);
|
|
868
|
-
const onDragEnter =
|
|
917
|
+
const onDragEnter = React6.useCallback(
|
|
869
918
|
(event) => {
|
|
870
919
|
if (!uploadEnabled || !event.dataTransfer?.types?.includes("Files")) return;
|
|
871
920
|
dragDepth.current += 1;
|
|
@@ -873,12 +922,12 @@ function AgentPanel({
|
|
|
873
922
|
},
|
|
874
923
|
[uploadEnabled]
|
|
875
924
|
);
|
|
876
|
-
const onDragLeave =
|
|
925
|
+
const onDragLeave = React6.useCallback((event) => {
|
|
877
926
|
if (!event.dataTransfer?.types?.includes("Files")) return;
|
|
878
927
|
dragDepth.current = Math.max(0, dragDepth.current - 1);
|
|
879
928
|
if (dragDepth.current === 0) setDragging(false);
|
|
880
929
|
}, []);
|
|
881
|
-
const onDrop =
|
|
930
|
+
const onDrop = React6.useCallback(
|
|
882
931
|
(event) => {
|
|
883
932
|
if (!uploadEnabled) return;
|
|
884
933
|
event.preventDefault();
|
|
@@ -889,7 +938,7 @@ function AgentPanel({
|
|
|
889
938
|
},
|
|
890
939
|
[addFiles, uploadEnabled]
|
|
891
940
|
);
|
|
892
|
-
const openHistory =
|
|
941
|
+
const openHistory = React6.useCallback(() => {
|
|
893
942
|
setView("history");
|
|
894
943
|
void chat.refreshConversations();
|
|
895
944
|
}, [chat]);
|
|
@@ -1050,7 +1099,7 @@ function AgentPanel({
|
|
|
1050
1099
|
},
|
|
1051
1100
|
approval.id
|
|
1052
1101
|
)),
|
|
1053
|
-
busy ? /* @__PURE__ */ jsx(
|
|
1102
|
+
busy ? /* @__PURE__ */ jsx(ThinkingIndicator, {}) : null
|
|
1054
1103
|
] }) }),
|
|
1055
1104
|
chat.error || uploadError ? /* @__PURE__ */ jsxs("div", { className: "mx-3 mb-1 flex items-center justify-between gap-2 rounded-lg bg-destructive/10 px-3 py-2 text-destructive text-xs", children: [
|
|
1056
1105
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: chat.error ?? uploadError }),
|
|
@@ -1087,17 +1136,35 @@ function AgentPanel({
|
|
|
1087
1136
|
}
|
|
1088
1137
|
);
|
|
1089
1138
|
}
|
|
1139
|
+
var OPTIMISTIC_ID_PREFIX = "optimistic-";
|
|
1140
|
+
var optimisticCounter = 0;
|
|
1141
|
+
function buildOptimisticUserMessage(text, files) {
|
|
1142
|
+
optimisticCounter += 1;
|
|
1143
|
+
const attachments = (files ?? []).map((file, index) => ({
|
|
1144
|
+
id: `${OPTIMISTIC_ID_PREFIX}att-${optimisticCounter}-${index}`,
|
|
1145
|
+
filename: file.name,
|
|
1146
|
+
format: file.name.split(".").pop()?.toLowerCase() ?? "file",
|
|
1147
|
+
size_bytes: file.size
|
|
1148
|
+
}));
|
|
1149
|
+
return {
|
|
1150
|
+
id: `${OPTIMISTIC_ID_PREFIX}${optimisticCounter}`,
|
|
1151
|
+
role: "user",
|
|
1152
|
+
content: text,
|
|
1153
|
+
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1154
|
+
...attachments.length ? { attachments } : {}
|
|
1155
|
+
};
|
|
1156
|
+
}
|
|
1090
1157
|
function useAgentChat(config) {
|
|
1091
|
-
const client =
|
|
1092
|
-
const [agentInfo, setAgentInfo] =
|
|
1093
|
-
const [conversationId, setConversationId] =
|
|
1094
|
-
const [conversations, setConversations] =
|
|
1095
|
-
const [messages, setMessages] =
|
|
1096
|
-
const [pendingApprovals, setPendingApprovals] =
|
|
1097
|
-
const [sending, setSending] =
|
|
1098
|
-
const [resolvingApprovalId, setResolvingApprovalId] =
|
|
1099
|
-
const [error, setError] =
|
|
1100
|
-
|
|
1158
|
+
const client = React6.useMemo(() => new AgentApiClient(config), [config]);
|
|
1159
|
+
const [agentInfo, setAgentInfo] = React6.useState(null);
|
|
1160
|
+
const [conversationId, setConversationId] = React6.useState(null);
|
|
1161
|
+
const [conversations, setConversations] = React6.useState([]);
|
|
1162
|
+
const [messages, setMessages] = React6.useState([]);
|
|
1163
|
+
const [pendingApprovals, setPendingApprovals] = React6.useState([]);
|
|
1164
|
+
const [sending, setSending] = React6.useState(false);
|
|
1165
|
+
const [resolvingApprovalId, setResolvingApprovalId] = React6.useState(null);
|
|
1166
|
+
const [error, setError] = React6.useState(null);
|
|
1167
|
+
React6.useEffect(() => {
|
|
1101
1168
|
let cancelled = false;
|
|
1102
1169
|
client.getConfig().then((info) => {
|
|
1103
1170
|
if (!cancelled) setAgentInfo(info);
|
|
@@ -1107,11 +1174,11 @@ function useAgentChat(config) {
|
|
|
1107
1174
|
cancelled = true;
|
|
1108
1175
|
};
|
|
1109
1176
|
}, [client]);
|
|
1110
|
-
const handleFailure =
|
|
1177
|
+
const handleFailure = React6.useCallback((err) => {
|
|
1111
1178
|
const message = err instanceof AgentApiError ? err.message : "Something went wrong. Please try again.";
|
|
1112
1179
|
setError(message);
|
|
1113
1180
|
}, []);
|
|
1114
|
-
const applyResponse =
|
|
1181
|
+
const applyResponse = React6.useCallback(
|
|
1115
1182
|
(response) => {
|
|
1116
1183
|
if (response.status === "error" && !response.messages?.length) {
|
|
1117
1184
|
setError(response.message ?? "The assistant could not answer.");
|
|
@@ -1120,9 +1187,10 @@ function useAgentChat(config) {
|
|
|
1120
1187
|
if (response.conversation_id) setConversationId(response.conversation_id);
|
|
1121
1188
|
if (response.messages?.length) {
|
|
1122
1189
|
setMessages((current) => {
|
|
1123
|
-
const
|
|
1190
|
+
const settled = current.filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX));
|
|
1191
|
+
const seen = new Set(settled.map((message) => message.id));
|
|
1124
1192
|
const fresh = response.messages?.filter((message) => !seen.has(message.id)) ?? [];
|
|
1125
|
-
return [...
|
|
1193
|
+
return [...settled, ...fresh];
|
|
1126
1194
|
});
|
|
1127
1195
|
}
|
|
1128
1196
|
setPendingApprovals(response.pending_approvals ?? []);
|
|
@@ -1132,12 +1200,13 @@ function useAgentChat(config) {
|
|
|
1132
1200
|
},
|
|
1133
1201
|
[]
|
|
1134
1202
|
);
|
|
1135
|
-
const send =
|
|
1203
|
+
const send = React6.useCallback(
|
|
1136
1204
|
async (text, files) => {
|
|
1137
1205
|
if (sending) return;
|
|
1138
1206
|
if (!text.trim() && !(files && files.length)) return;
|
|
1139
1207
|
setSending(true);
|
|
1140
1208
|
setError(null);
|
|
1209
|
+
setMessages((current) => [...current, buildOptimisticUserMessage(text, files)]);
|
|
1141
1210
|
try {
|
|
1142
1211
|
const response = await client.sendMessage(text, conversationId, files);
|
|
1143
1212
|
applyResponse(response);
|
|
@@ -1149,7 +1218,7 @@ function useAgentChat(config) {
|
|
|
1149
1218
|
},
|
|
1150
1219
|
[applyResponse, client, conversationId, handleFailure, sending]
|
|
1151
1220
|
);
|
|
1152
|
-
const resolveApproval =
|
|
1221
|
+
const resolveApproval = React6.useCallback(
|
|
1153
1222
|
async (callId, approve) => {
|
|
1154
1223
|
if (resolvingApprovalId) return;
|
|
1155
1224
|
setResolvingApprovalId(callId);
|
|
@@ -1165,13 +1234,13 @@ function useAgentChat(config) {
|
|
|
1165
1234
|
},
|
|
1166
1235
|
[applyResponse, client, handleFailure, resolvingApprovalId]
|
|
1167
1236
|
);
|
|
1168
|
-
const newChat =
|
|
1237
|
+
const newChat = React6.useCallback(() => {
|
|
1169
1238
|
setConversationId(null);
|
|
1170
1239
|
setMessages([]);
|
|
1171
1240
|
setPendingApprovals([]);
|
|
1172
1241
|
setError(null);
|
|
1173
1242
|
}, []);
|
|
1174
|
-
const refreshConversations =
|
|
1243
|
+
const refreshConversations = React6.useCallback(async () => {
|
|
1175
1244
|
try {
|
|
1176
1245
|
const { conversations: list } = await client.listConversations();
|
|
1177
1246
|
setConversations(list);
|
|
@@ -1179,7 +1248,7 @@ function useAgentChat(config) {
|
|
|
1179
1248
|
handleFailure(err);
|
|
1180
1249
|
}
|
|
1181
1250
|
}, [client, handleFailure]);
|
|
1182
|
-
const openConversation =
|
|
1251
|
+
const openConversation = React6.useCallback(
|
|
1183
1252
|
async (id) => {
|
|
1184
1253
|
setError(null);
|
|
1185
1254
|
try {
|
|
@@ -1193,7 +1262,7 @@ function useAgentChat(config) {
|
|
|
1193
1262
|
},
|
|
1194
1263
|
[client, handleFailure]
|
|
1195
1264
|
);
|
|
1196
|
-
const deleteConversation =
|
|
1265
|
+
const deleteConversation = React6.useCallback(
|
|
1197
1266
|
async (id) => {
|
|
1198
1267
|
try {
|
|
1199
1268
|
await client.deleteConversation(id);
|
|
@@ -1205,7 +1274,7 @@ function useAgentChat(config) {
|
|
|
1205
1274
|
},
|
|
1206
1275
|
[client, conversationId, handleFailure, newChat]
|
|
1207
1276
|
);
|
|
1208
|
-
const clearError =
|
|
1277
|
+
const clearError = React6.useCallback(() => setError(null), []);
|
|
1209
1278
|
return {
|
|
1210
1279
|
agentInfo,
|
|
1211
1280
|
clearError,
|
|
@@ -1240,11 +1309,11 @@ function readStored(clientId) {
|
|
|
1240
1309
|
}
|
|
1241
1310
|
}
|
|
1242
1311
|
function useAlwaysApprove(clientId) {
|
|
1243
|
-
const [approved, setApproved] =
|
|
1244
|
-
|
|
1312
|
+
const [approved, setApproved] = React6.useState(() => /* @__PURE__ */ new Set());
|
|
1313
|
+
React6.useEffect(() => {
|
|
1245
1314
|
setApproved(readStored(clientId));
|
|
1246
1315
|
}, [clientId]);
|
|
1247
|
-
const persist =
|
|
1316
|
+
const persist = React6.useCallback(
|
|
1248
1317
|
(next) => {
|
|
1249
1318
|
setApproved(next);
|
|
1250
1319
|
if (typeof window === "undefined") return;
|
|
@@ -1255,8 +1324,8 @@ function useAlwaysApprove(clientId) {
|
|
|
1255
1324
|
},
|
|
1256
1325
|
[clientId]
|
|
1257
1326
|
);
|
|
1258
|
-
const isAlwaysApproved =
|
|
1259
|
-
const setAlwaysApprove =
|
|
1327
|
+
const isAlwaysApproved = React6.useCallback((toolName) => approved.has(toolName), [approved]);
|
|
1328
|
+
const setAlwaysApprove = React6.useCallback(
|
|
1260
1329
|
(toolName) => {
|
|
1261
1330
|
if (approved.has(toolName)) return;
|
|
1262
1331
|
const next = new Set(approved);
|
|
@@ -1265,7 +1334,7 @@ function useAlwaysApprove(clientId) {
|
|
|
1265
1334
|
},
|
|
1266
1335
|
[approved, persist]
|
|
1267
1336
|
);
|
|
1268
|
-
const clearAlwaysApprove =
|
|
1337
|
+
const clearAlwaysApprove = React6.useCallback(
|
|
1269
1338
|
(toolName) => {
|
|
1270
1339
|
if (!approved.has(toolName)) return;
|
|
1271
1340
|
const next = new Set(approved);
|
|
@@ -1277,16 +1346,16 @@ function useAlwaysApprove(clientId) {
|
|
|
1277
1346
|
return { clearAlwaysApprove, isAlwaysApproved, setAlwaysApprove };
|
|
1278
1347
|
}
|
|
1279
1348
|
function AgentWidget({ config, onOpenChange, open: controlledOpen }) {
|
|
1280
|
-
const [uncontrolledOpen, setUncontrolledOpen] =
|
|
1349
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React6.useState(false);
|
|
1281
1350
|
const open = controlledOpen ?? uncontrolledOpen;
|
|
1282
|
-
const setOpen =
|
|
1351
|
+
const setOpen = React6.useCallback(
|
|
1283
1352
|
(next) => {
|
|
1284
1353
|
setUncontrolledOpen(next);
|
|
1285
1354
|
onOpenChange?.(next);
|
|
1286
1355
|
},
|
|
1287
1356
|
[onOpenChange]
|
|
1288
1357
|
);
|
|
1289
|
-
const [agentMode, setAgentMode] =
|
|
1358
|
+
const [agentMode, setAgentMode] = React6.useState(false);
|
|
1290
1359
|
const isDesktop = useMediaQuery("(min-width: 640px)", {
|
|
1291
1360
|
defaultSSRValue: true,
|
|
1292
1361
|
ssr: true
|
|
@@ -1296,14 +1365,14 @@ function AgentWidget({ config, onOpenChange, open: controlledOpen }) {
|
|
|
1296
1365
|
const alwaysApprove = useAlwaysApprove(config.clientId);
|
|
1297
1366
|
const { pendingApprovals, resolveApproval, resolvingApprovalId } = chat;
|
|
1298
1367
|
const { isAlwaysApproved } = alwaysApprove;
|
|
1299
|
-
|
|
1368
|
+
React6.useEffect(() => {
|
|
1300
1369
|
if (!open || resolvingApprovalId) return;
|
|
1301
1370
|
const target = pendingApprovals.find((approval) => isAlwaysApproved(approval.tool_name));
|
|
1302
1371
|
if (target) void resolveApproval(target.id, true);
|
|
1303
1372
|
}, [open, pendingApprovals, resolvingApprovalId, isAlwaysApproved, resolveApproval]);
|
|
1304
|
-
const firedWriteIds =
|
|
1373
|
+
const firedWriteIds = React6.useRef(/* @__PURE__ */ new Set());
|
|
1305
1374
|
const { onWriteSuccess } = config;
|
|
1306
|
-
|
|
1375
|
+
React6.useEffect(() => {
|
|
1307
1376
|
if (!onWriteSuccess) return;
|
|
1308
1377
|
for (const message of chat.messages) {
|
|
1309
1378
|
if (message.role !== "tool" || !message.is_write || message.tool_status !== "success") continue;
|
|
@@ -1313,9 +1382,9 @@ function AgentWidget({ config, onOpenChange, open: controlledOpen }) {
|
|
|
1313
1382
|
onWriteSuccess({ arguments: args, toolName: message.tool_name ?? "" });
|
|
1314
1383
|
}
|
|
1315
1384
|
}, [chat.messages, onWriteSuccess]);
|
|
1316
|
-
const lastNavigatedMessageId =
|
|
1385
|
+
const lastNavigatedMessageId = React6.useRef(null);
|
|
1317
1386
|
const { messages } = chat;
|
|
1318
|
-
|
|
1387
|
+
React6.useEffect(() => {
|
|
1319
1388
|
if (!open || fullscreen || !config.navigate || !config.pages?.length) return;
|
|
1320
1389
|
const toolMessages = messages.filter((message) => message.role === "tool");
|
|
1321
1390
|
const latest = toolMessages[toolMessages.length - 1];
|
|
@@ -1327,7 +1396,7 @@ function AgentWidget({ config, onOpenChange, open: controlledOpen }) {
|
|
|
1327
1396
|
const path = mapping.buildRoute ? mapping.buildRoute(args) : mapping.route;
|
|
1328
1397
|
if (path) config.navigate(path);
|
|
1329
1398
|
}, [config, fullscreen, messages, open]);
|
|
1330
|
-
const closePanel =
|
|
1399
|
+
const closePanel = React6.useCallback(() => {
|
|
1331
1400
|
setOpen(false);
|
|
1332
1401
|
setAgentMode(false);
|
|
1333
1402
|
}, [setOpen]);
|
|
@@ -1406,6 +1475,6 @@ function defineAgentConfig(config) {
|
|
|
1406
1475
|
return config;
|
|
1407
1476
|
}
|
|
1408
1477
|
|
|
1409
|
-
export { AgentApiClient, AgentApiError, AgentComposer, AgentPanel, AgentWidget, DEFAULT_ACCEPT, DocumentCard, MessageItem, TaskChecklist, ToolActivityGroup, ToolApprovalCard, acceptAttribute, acceptedExtensions, defineAgentConfig, deriveDetails, fileUploadEnabled, formatBytes, groupMessages, humanizeToolName, resolveToolPresentation, useAgentChat, useAlwaysApprove, validateFile };
|
|
1478
|
+
export { AgentApiClient, AgentApiError, AgentComposer, AgentPanel, AgentWidget, DEFAULT_ACCEPT, DocumentCard, MessageItem, TaskChecklist, ThinkingIndicator, ToolActivityGroup, ToolApprovalCard, acceptAttribute, acceptedExtensions, defineAgentConfig, deriveDetails, fileUploadEnabled, formatBytes, groupMessages, humanizeToolName, resolveToolPresentation, useAgentChat, useAlwaysApprove, validateFile };
|
|
1410
1479
|
//# sourceMappingURL=index.js.map
|
|
1411
1480
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api-client.ts","../src/file-support.ts","../src/components/agent-composer.tsx","../src/message-group.ts","../src/components/message-item.tsx","../src/table-format.tsx","../src/tool-presentation.ts","../src/components/document-card.tsx","../src/components/task-checklist.tsx","../src/components/tool-activity-group.tsx","../src/components/tool-approval-card.tsx","../src/components/agent-panel.tsx","../src/use-agent-chat.ts","../src/use-always-approve.ts","../src/components/agent-widget.tsx","../src/config.ts"],"names":["acceptAttribute","React","callId","jsxs","jsx","FileTextIcon","UUID_RE","Button","Fragment","React2","XIcon","cn","React3","Spinner","ChevronDownIcon","React4","Maximize2Icon","ChatMessage","React6","React7"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AgentConfig,\n AgentPublicConfig,\n ChatResponse,\n ConversationSummary,\n} from \"./types\";\n\nexport class AgentApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"AgentApiError\";\n this.status = status;\n }\n}\n\n/**\n * Thin fetch client for the Country Club Agent Mode API.\n *\n * Every request carries the agent client_id (query param — also used by the\n * backend's per-agent CORS middleware, including on preflights) and the\n * logged-in user's bearer token.\n */\nexport class AgentApiClient {\n private config: AgentConfig;\n\n constructor(config: AgentConfig) {\n this.config = config;\n }\n\n private async request<T>(\n path: string,\n options: { method?: string; body?: unknown } = {},\n ): Promise<T> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n // FormData bodies (file uploads) must not carry a manual Content-Type — the\n // browser sets the multipart boundary itself.\n const isFormData = typeof FormData !== \"undefined\" && options.body instanceof FormData;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"X-Agent-Client-Id\": this.config.clientId,\n };\n if (!isFormData) headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(url, {\n body:\n options.body === undefined\n ? undefined\n : isFormData\n ? (options.body as FormData)\n : JSON.stringify(options.body),\n headers,\n method: options.method ?? \"GET\",\n });\n\n if (response.status === 204) return undefined as T;\n\n let payload: Record<string, unknown> = {};\n try {\n payload = (await response.json()) as Record<string, unknown>;\n } catch {\n // Non-JSON error body — fall through to the status check.\n }\n\n if (!response.ok) {\n const detail =\n (payload.detail as string) ||\n (payload.message as string) ||\n `Request failed (${response.status})`;\n throw new AgentApiError(detail, response.status);\n }\n return payload as T;\n }\n\n getConfig(): Promise<AgentPublicConfig> {\n return this.request<AgentPublicConfig>(\"/agent-mode/config/\");\n }\n\n sendMessage(\n message: string,\n conversationId?: string | null,\n files?: File[],\n ): Promise<ChatResponse> {\n if (files && files.length > 0) {\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"message\", message);\n if (conversationId) form.append(\"conversation_id\", conversationId);\n for (const file of files) form.append(\"files\", file, file.name);\n return this.request<ChatResponse>(\"/agent-mode/chat/\", { body: form, method: \"POST\" });\n }\n return this.request<ChatResponse>(\"/agent-mode/chat/\", {\n body: {\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n },\n method: \"POST\",\n });\n }\n\n resolveApproval(callId: string, approve: boolean): Promise<ChatResponse> {\n return this.request<ChatResponse>(`/agent-mode/approvals/${callId}/resolve/`, {\n body: { approve, client_id: this.config.clientId },\n method: \"POST\",\n });\n }\n\n listConversations(): Promise<{ conversations: ConversationSummary[] }> {\n return this.request(\"/agent-mode/conversations/\");\n }\n\n getConversation(conversationId: string): Promise<{\n conversation: ConversationSummary;\n messages: ChatResponse[\"messages\"];\n pending_approvals: ChatResponse[\"pending_approvals\"];\n }> {\n return this.request(`/agent-mode/conversations/${conversationId}/`);\n }\n\n deleteConversation(conversationId: string): Promise<void> {\n return this.request(`/agent-mode/conversations/${conversationId}/`, {\n method: \"DELETE\",\n });\n }\n}\n","import type { AgentConfig } from \"./types\";\n\n/** Text formats the model can actually read. Images are never accepted. */\nexport const DEFAULT_ACCEPT = [\".txt\", \".md\", \".markdown\", \".csv\", \".tsv\", \".log\", \".docx\"];\n\nexport const DEFAULT_MAX_SIZE_MB = 5;\n\nexport function fileUploadEnabled(config: AgentConfig): boolean {\n return config.fileUpload?.enabled !== false;\n}\n\nexport function acceptedExtensions(config: AgentConfig): string[] {\n const accept = config.fileUpload?.accept;\n return accept && accept.length > 0 ? accept.map((ext) => ext.toLowerCase()) : DEFAULT_ACCEPT;\n}\n\nexport function maxSizeMb(config: AgentConfig): number {\n return config.fileUpload?.maxSizeMb ?? DEFAULT_MAX_SIZE_MB;\n}\n\n/** The `accept` attribute value for a native file input. */\nexport function acceptAttribute(config: AgentConfig): string {\n return acceptedExtensions(config).join(\",\");\n}\n\nfunction extensionOf(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot >= 0 ? filename.slice(dot).toLowerCase() : \"\";\n}\n\n/** Validate a picked/dropped file against the accepted formats and size. */\nexport function validateFile(config: AgentConfig, file: File): string | null {\n const extensions = acceptedExtensions(config);\n if (!extensions.includes(extensionOf(file.name))) {\n return `“${file.name}” isn’t a supported text file. Allowed: ${extensions.join(\", \")}.`;\n }\n const limit = maxSizeMb(config);\n if (file.size > limit * 1024 * 1024) {\n return `“${file.name}” is too large (max ${limit} MB).`;\n }\n return null;\n}\n\nexport function formatBytes(bytes: number | undefined): string {\n if (!bytes && bytes !== 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { ArrowUpIcon, FileTextIcon, PaperclipIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes } from \"../file-support\";\n\nexport interface AgentComposerProps {\n value: string;\n onValueChange: (value: string) => void;\n /** Submit the trimmed text plus any staged files. */\n onSubmit: (text: string) => void;\n disabled?: boolean;\n placeholder?: string;\n className?: string;\n /** File upload wiring. Omit `onPickFiles` to hide the attach button. */\n files: File[];\n onPickFiles?: (files: File[]) => void;\n onRemoveFile?: (index: number) => void;\n acceptAttribute?: string;\n}\n\n/**\n * Chat composer with attachment support: auto-growing textarea, an attach\n * (paperclip) button, staged-file chips, and a send button. Enter submits,\n * Shift+Enter inserts a newline. Submitting is allowed when there is text OR at\n * least one staged file.\n */\nexport function AgentComposer({\n acceptAttribute,\n className,\n disabled,\n files,\n onPickFiles,\n onRemoveFile,\n onSubmit,\n onValueChange,\n placeholder = \"Ask anything…\",\n value,\n}: AgentComposerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const canSubmit = !disabled && (value.trim().length > 0 || files.length > 0);\n\n const submit = React.useCallback(() => {\n if (!canSubmit) return;\n onSubmit(value.trim());\n }, [canSubmit, onSubmit, value]);\n\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = \"auto\";\n textarea.style.height = `${Math.min(textarea.scrollHeight, 144)}px`;\n }, [value]);\n\n const handlePick = (event: React.ChangeEvent<HTMLInputElement>) => {\n const picked = Array.from(event.target.files ?? []);\n if (picked.length) onPickFiles?.(picked);\n event.target.value = \"\"; // allow re-picking the same file\n };\n\n return (\n <form\n className={cn(\"shrink-0 bg-background p-3 pt-1.5\", className)}\n data-slot=\"agent-composer\"\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n >\n <div\n className={cn(\n \"flex flex-col gap-1.5 rounded-2xl border border-input bg-popover p-1.5 shadow-xs transition-[border-color,box-shadow] duration-150 focus-within:border-ring/64 focus-within:ring-2 focus-within:ring-ring/24 dark:bg-input/32\",\n disabled && \"opacity-64\",\n )}\n >\n {files.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5 px-1 pt-1\">\n {files.map((file, index) => (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 py-1 pr-1 pl-2 text-xs\"\n key={`${file.name}-${index}`}\n >\n <FileTextIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 truncate\">{file.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatBytes(file.size)}</span>\n {onRemoveFile ? (\n <button\n aria-label={`Remove ${file.name}`}\n className=\"flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground hover:bg-background hover:text-foreground [&_svg]:size-3\"\n onClick={() => onRemoveFile(index)}\n type=\"button\"\n >\n <XIcon />\n </button>\n ) : null}\n </span>\n ))}\n </div>\n ) : null}\n\n <div className=\"flex items-end gap-1.5\">\n {onPickFiles ? (\n <>\n <input\n accept={acceptAttribute}\n className=\"hidden\"\n multiple\n onChange={handlePick}\n ref={inputRef}\n type=\"file\"\n />\n <Button\n aria-label=\"Attach files\"\n className=\"shrink-0\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <PaperclipIcon />\n </Button>\n </>\n ) : null}\n\n <textarea\n className=\"max-h-36 min-h-8 flex-1 resize-none self-center bg-transparent py-1.5 pl-1.5 text-sm outline-none placeholder:text-muted-foreground\"\n disabled={disabled}\n onChange={(event) => onValueChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n }}\n placeholder={placeholder}\n ref={textareaRef}\n rows={1}\n value={value}\n />\n\n <Button\n aria-label=\"Send message\"\n className=\"shrink-0 rounded-full before:rounded-full\"\n disabled={!canSubmit}\n size=\"icon-sm\"\n type=\"submit\"\n >\n <ArrowUpIcon />\n </Button>\n </div>\n </div>\n </form>\n );\n}\n","import type { AgentMessage, MessageBlock } from \"./types\";\n\n/** One tool invocation inside a tool-activity group. */\nexport interface ToolStep {\n /** Provider tool-call id (matches assistant tool_call ↔ tool result). */\n callId: string;\n name: string;\n args: Record<string, unknown>;\n status: \"running\" | \"done\";\n /** Capped, pretty-printed raw result (for the JSON detail view). */\n result?: string;\n /** Structured blocks (tables) derived from the result. */\n blocks?: MessageBlock[];\n}\n\nexport type RenderItem =\n | { kind: \"user\"; key: string; message: AgentMessage }\n | { kind: \"assistant-text\"; key: string; message: AgentMessage }\n | { kind: \"tool-activity\"; key: string; steps: ToolStep[] };\n\n/**\n * Collapse the raw message stream into render items: user bubbles, assistant\n * text bubbles, and *grouped* tool activity. Consecutive tool calls (assistant\n * tool_calls + their tool results) fold into a single group so a run of ten\n * lookups shows as one collapsible block instead of ten stacked chips.\n *\n * An assistant message that carries visible text flushes the current group and\n * emits a text bubble before starting any new tool steps.\n */\nexport function groupMessages(messages: AgentMessage[]): RenderItem[] {\n const items: RenderItem[] = [];\n\n let group: ToolStep[] | null = null;\n let groupKey = \"\";\n const stepIndexByCallId = new Map<string, number>();\n\n const flush = () => {\n if (group && group.length > 0) {\n items.push({ key: `tools-${groupKey}`, kind: \"tool-activity\", steps: group });\n }\n group = null;\n groupKey = \"\";\n stepIndexByCallId.clear();\n };\n\n for (const message of messages) {\n if (message.role === \"user\") {\n flush();\n items.push({ key: message.id, kind: \"user\", message });\n continue;\n }\n\n if (message.role === \"assistant\") {\n const hasText = Boolean(message.content && message.content.trim());\n if (hasText) {\n flush();\n items.push({ key: message.id, kind: \"assistant-text\", message });\n }\n for (const toolCall of message.tool_calls ?? []) {\n const callId = toolCall.id ?? `${message.id}-${toolCall.name}`;\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n stepIndexByCallId.set(callId, group.length);\n group.push({\n args: (toolCall.arguments ?? {}) as Record<string, unknown>,\n callId,\n name: toolCall.name ?? \"tool\",\n status: \"running\",\n });\n }\n continue;\n }\n\n // Tool result: attach to its pending step, or open a group if orphaned.\n const callId = message.tool_call_id ?? \"\";\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n const existingIndex = callId ? stepIndexByCallId.get(callId) : undefined;\n if (existingIndex !== undefined) {\n const step = group[existingIndex];\n step.status = \"done\";\n step.result = message.result || step.result;\n step.blocks = message.blocks ?? step.blocks;\n } else {\n group.push({\n args: {},\n blocks: message.blocks,\n callId: callId || message.id,\n name: message.tool_name ?? \"tool\",\n result: message.result,\n status: \"done\",\n });\n }\n }\n\n flush();\n return items;\n}\n","\"use client\";\n\nimport { ChatMessage, ChatMessageBubble, Markdown } from \"@cntyclub/ui-react\";\nimport { FileTextIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentMessage } from \"../types\";\n\n/**\n * Renders a user or assistant *text* message. Tool activity (assistant\n * tool_calls and tool results) is grouped and rendered by `ToolActivityGroup`\n * via `groupMessages`, so this component ignores tool messages.\n */\nexport function MessageItem({ message }: { message: AgentMessage }) {\n if (message.role === \"user\") {\n const attachments = message.attachments ?? [];\n return (\n <ChatMessage from=\"user\">\n {attachments.length > 0 ? (\n <div className=\"flex flex-wrap justify-end gap-1.5\">\n {attachments.map((attachment) => (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 px-2 py-1 text-muted-foreground text-xs\"\n key={attachment.id}\n >\n <FileTextIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{attachment.filename}</span>\n </span>\n ))}\n </div>\n ) : null}\n {message.content ? <ChatMessageBubble from=\"user\">{message.content}</ChatMessageBubble> : null}\n </ChatMessage>\n );\n }\n\n if (message.role === \"assistant\") {\n if (!message.content || !message.content.trim()) return null;\n return (\n <ChatMessage from=\"assistant\">\n <ChatMessageBubble from=\"assistant\">\n <Markdown>{message.content}</Markdown>\n </ChatMessageBubble>\n </ChatMessage>\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport type { TableBlock } from \"./types\";\n\n/**\n * Turns a raw result-table block from the backend into something a person\n * actually wants to read:\n *\n * - drops plumbing columns (ids, slugs, foreign-key refs, s3 keys, embeddings)\n * that mean nothing to a human,\n * - renders image URLs as thumbnails and other URLs as links,\n * - flattens nested objects/arrays (e.g. `{\"total\": 247, \"customer\": 0}` or\n * `[{\"id\": …, \"name\": \"SaaS\"}]`) into a readable phrase instead of raw JSON,\n * - surfaces the identity columns (name/title/email) first.\n *\n * All of this is presentation-only and lives in the widget on purpose: the\n * backend still keeps the full payload (ids and all) in the model's tool\n * context so follow-up actions can reference rows by id.\n */\n\n/** A column ready for `DataTablePaged`: stable key + human-facing label. */\nexport interface DisplayColumn {\n key: string;\n label: string;\n}\n\nexport interface DisplayTable {\n columns: DisplayColumn[];\n rows: Record<string, React.ReactNode>[];\n}\n\n// Exact column names that are plumbing, never information a person reads.\nconst NOISE_KEYS = new Set([\n \"id\",\n \"pk\",\n \"uuid\",\n \"slug\",\n \"object_id\",\n \"external_id\",\n \"client_id\",\n \"content_type\",\n \"provider_call_id\",\n \"tool_call_id\",\n]);\n\n// Column-name shapes that are always internal references or secrets.\nconst NOISE_PATTERNS = [\n /_id$/i,\n /_ids$/i,\n /_key$/i,\n /_hash$/i,\n /embedding/i,\n /vector/i,\n /password/i,\n /secret/i,\n /(^|_)token(_|$)/i,\n];\n\nconst IMAGE_KEY = /(image|logo|avatar|photo|picture|icon|thumbnail|banner|cover|headshot)/i;\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg|avif)(\\?|$)/i;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T|$)/;\nconst URL_RE = /^https?:\\/\\//i;\n// Identity columns worth reading first, in priority order.\nconst PRIORITY_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\"];\n// Keys checked when reducing an object/array-of-objects to a single label.\nconst LABEL_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\", \"code\"];\n\nfunction isUuid(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value);\n}\n\nfunction humanize(key: string): string {\n const text = key.replace(/_/g, \" \").trim();\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** A column is noise if its name looks internal or every value is a UUID. */\nfunction isNoiseColumn(key: string, rows: Record<string, unknown>[]): boolean {\n if (NOISE_KEYS.has(key.toLowerCase())) return true;\n if (NOISE_PATTERNS.some((pattern) => pattern.test(key))) return true;\n const values = rows\n .map((row) => row[key])\n .filter((value) => value !== null && value !== undefined && value !== \"\");\n return values.length > 0 && values.every(isUuid);\n}\n\nfunction pickLabel(obj: Record<string, unknown>): string | null {\n for (const key of LABEL_KEYS) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value;\n if (typeof value === \"number\") return String(value);\n }\n return null;\n}\n\n/** `{total: 247, customer: 0}` → \"Total 247 · Customer 0\"; prefers a name/title. */\nfunction formatObject(obj: Record<string, unknown>): string {\n const label = pickLabel(obj);\n if (label) return label;\n const parts: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined || value === \"\") continue;\n if (typeof value === \"object\") continue; // keep it shallow and readable\n parts.push(`${humanize(key)} ${value}`);\n if (parts.length >= 6) break;\n }\n return parts.join(\" · \") || \"—\";\n}\n\n/** `[{name: \"SaaS\"}, {name: \"Fintech\"}]` → \"SaaS, Fintech (+N more)\". */\nfunction formatArray(arr: unknown[]): string {\n const items = arr\n .map((item) => {\n if (item === null || item === undefined) return \"\";\n if (Array.isArray(item)) return \"\";\n if (typeof item === \"object\") return pickLabel(item as Record<string, unknown>) ?? \"\";\n return String(item);\n })\n .filter(Boolean);\n if (items.length === 0) return \"—\";\n const shown = items.slice(0, 8);\n const extra = items.length - shown.length;\n return shown.join(\", \") + (extra > 0 ? ` +${extra} more` : \"\");\n}\n\nfunction renderScalar(key: string, value: string | number | boolean): React.ReactNode {\n if (typeof value !== \"string\") return value; // number | boolean → table handles\n\n const text = value.trim();\n if (URL_RE.test(text) && (IMAGE_EXT.test(text) || IMAGE_KEY.test(key))) {\n return (\n <img\n alt={humanize(key)}\n className=\"h-9 w-9 rounded-md border border-border object-cover\"\n loading=\"lazy\"\n src={text}\n />\n );\n }\n if (URL_RE.test(text)) {\n let label = text;\n try {\n label = new URL(text).hostname.replace(/^www\\./, \"\");\n } catch {\n // keep the full string if it isn't a parseable URL\n }\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={text}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n );\n }\n if (ISO_DATE_RE.test(text)) {\n const date = new Date(text);\n if (!Number.isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return text;\n}\n\nfunction formatCellValue(key: string, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === \"\") return value; // table → \"—\"\n if (Array.isArray(value)) return formatArray(value);\n if (typeof value === \"object\") return formatObject(value as Record<string, unknown>);\n return renderScalar(key, value as string | number | boolean);\n}\n\n/** Build clean, human-facing columns + rows from a raw result-table block. */\nexport function toDisplayTable(block: TableBlock): DisplayTable {\n const rows = block.rows ?? [];\n const kept = (block.columns ?? []).filter((key) => !isNoiseColumn(key, rows));\n // If filtering wiped everything (e.g. a table of pure ids), keep the original\n // columns rather than render an empty table.\n const columnKeys = kept.length > 0 ? kept : block.columns ?? [];\n\n const ordered = [...columnKeys].sort((a, b) => {\n const ra = PRIORITY_KEYS.indexOf(a.toLowerCase());\n const rb = PRIORITY_KEYS.indexOf(b.toLowerCase());\n const pa = ra === -1 ? PRIORITY_KEYS.length : ra;\n const pb = rb === -1 ? PRIORITY_KEYS.length : rb;\n if (pa !== pb) return pa - pb;\n return columnKeys.indexOf(a) - columnKeys.indexOf(b); // stable otherwise\n });\n\n const columns: DisplayColumn[] = ordered.map((key) => ({ key, label: humanize(key) }));\n const displayRows = rows.map((row) => {\n const out: Record<string, React.ReactNode> = {};\n for (const key of ordered) out[key] = formatCellValue(key, row[key]);\n return out;\n });\n\n return { columns, rows: displayRows };\n}\n","import type { DescribeToolCall, ToolCallDescription, ToolCallDetail } from \"./types\";\n\n/** \"business_target_company_tags_apply\" → \"target company tags apply\". */\nexport function humanizeToolName(toolName: string): string {\n return toolName.replace(/^[a-z]+_/, \"\").replaceAll(\"_\", \" \");\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Keys that are meaningless to a human reader — identifiers and storage keys.\n * These are hidden from the default argument facts (the user complained that\n * \"company_id\" / \"slug\" tell them nothing).\n */\nfunction isTechnicalKey(key: string): boolean {\n const lower = key.toLowerCase();\n return (\n lower === \"id\" ||\n lower === \"client_id\" ||\n lower === \"slug\" ||\n lower.endsWith(\"_id\") ||\n lower.endsWith(\"_ids\") ||\n lower.endsWith(\"_key\") ||\n lower.endsWith(\"_slug\") ||\n lower.endsWith(\"_uuid\") ||\n lower === \"uuid\" ||\n lower.endsWith(\"_s3_key\") ||\n lower === \"embedding\"\n );\n}\n\n/** A value that is itself just an identifier (bare UUID) carries no meaning. */\nfunction isTechnicalValue(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value.trim());\n}\n\n/** \"target_company\" → \"Target company\". */\nfunction humanizeKey(key: string): string {\n const spaced = key.replaceAll(\"_\", \" \").trim();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (Array.isArray(value)) {\n const items = value\n .filter((item) => !isTechnicalValue(item))\n .map((item) => formatValue(item));\n return items.length ? items.join(\", \") : `${value.length} item${value.length === 1 ? \"\" : \"s\"}`;\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"name\", \"title\", \"label\", \"email\"]) {\n if (typeof record[key] === \"string\") return record[key] as string;\n }\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Derive human-readable facts from raw arguments, dropping technical keys and\n * bare-identifier values. Long strings are truncated for the card.\n */\nexport function deriveDetails(args: Record<string, unknown>): ToolCallDetail[] {\n const details: ToolCallDetail[] = [];\n for (const [key, value] of Object.entries(args ?? {})) {\n if (isTechnicalKey(key)) continue;\n if (isTechnicalValue(value)) continue;\n if (value === \"\" || value === null || value === undefined) continue;\n const formatted = formatValue(value);\n if (!formatted || formatted === \"—\") continue;\n details.push({ label: humanizeKey(key), value: formatted.length > 140 ? `${formatted.slice(0, 140)}…` : formatted });\n }\n return details;\n}\n\nexport interface ResolvedToolPresentation {\n title: string;\n summary: string | null;\n details: ToolCallDetail[];\n}\n\n/**\n * Resolve how a tool call should be shown: prefer the host app's\n * `describeToolCall`, then fall back to a humanized name plus the non-technical\n * arguments so approvals and the tool log always read conceptually.\n */\nexport function resolveToolPresentation(\n describe: DescribeToolCall | undefined,\n toolName: string,\n args: Record<string, unknown>,\n): ResolvedToolPresentation {\n let description: ToolCallDescription | null | undefined;\n try {\n description = describe?.(toolName, args ?? {});\n } catch {\n description = null;\n }\n\n const title = description?.title?.trim() || humanizeToolName(toolName);\n const summary = description?.summary?.trim() || null;\n\n let details = description?.details ?? [];\n const wantsDerived = description?.showDerivedDetails ?? description?.details === undefined;\n if (details.length === 0 && wantsDerived) {\n details = deriveDetails(args ?? {});\n }\n\n return { details, summary, title };\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { DownloadIcon, FileTextIcon, Maximize2Icon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes } from \"../file-support\";\nimport type { DocumentBlock } from \"../types\";\n\nfunction DownloadButton({ block, size = \"sm\" }: { block: DocumentBlock; size?: \"sm\" | \"icon-sm\" }) {\n if (!block.download_url) {\n return (\n <Button disabled size={size} variant=\"outline\">\n {size === \"icon-sm\" ? <DownloadIcon /> : <><DownloadIcon /> Download</>}\n </Button>\n );\n }\n return (\n <Button\n render={\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a download={block.filename} href={block.download_url} rel=\"noopener noreferrer\" target=\"_blank\" />\n }\n size={size}\n variant={size === \"icon-sm\" ? \"outline\" : \"default\"}\n >\n <DownloadIcon />\n {size === \"icon-sm\" ? null : \"Download\"}\n </Button>\n );\n}\n\n/** Fullscreen preview overlay (viewport-fixed) with a download action. */\nfunction DocumentViewer({ block, onClose }: { block: DocumentBlock; onClose: () => void }) {\n React.useEffect(() => {\n const onKey = (event: KeyboardEvent) => event.key === \"Escape\" && onClose();\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n return (\n <div aria-modal=\"true\" className=\"fixed inset-0 z-[60] flex flex-col bg-background\" role=\"dialog\">\n <div className=\"flex shrink-0 items-center gap-2 border-border/72 border-b px-4 py-3\">\n <FileTextIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <DownloadButton block={block} />\n <Button aria-label=\"Close preview\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n <pre className=\"mx-auto max-w-3xl whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-foreground\">\n {block.preview || \"(no preview available — download to view)\"}\n {block.preview_truncated ? \"\\n\\n… preview truncated. Download for the full file.\" : \"\"}\n </pre>\n </div>\n </div>\n );\n}\n\n/**\n * Renders a generated document: a compact card with a short preview, an\n * expand-to-fullscreen button, and a download button. Clicking the preview or\n * expand opens the fullscreen viewer (download sits top-right there too).\n */\nexport function DocumentCard({ block }: { block: DocumentBlock }) {\n const [open, setOpen] = React.useState(false);\n const previewLines = (block.preview || \"\").split(\"\\n\").slice(0, 6).join(\"\\n\");\n\n return (\n <div className=\"w-full max-w-full overflow-hidden rounded-xl border border-border bg-card shadow-xs\">\n <div className=\"flex items-center gap-2 border-border/72 border-b px-3 py-2\">\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-lg bg-primary/8 text-primary [&_svg]:size-4\">\n <FileTextIcon />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <Button aria-label=\"Preview\" onClick={() => setOpen(true)} size=\"icon-sm\" variant=\"ghost\">\n <Maximize2Icon />\n </Button>\n <DownloadButton block={block} size=\"icon-sm\" />\n </div>\n {previewLines ? (\n <button\n className={cn(\n \"block w-full cursor-pointer px-3 py-2 text-left transition-colors hover:bg-accent/40\",\n )}\n onClick={() => setOpen(true)}\n type=\"button\"\n >\n <pre className=\"max-h-28 overflow-hidden whitespace-pre-wrap break-words font-mono text-[11px] leading-snug text-muted-foreground\">\n {previewLines}\n </pre>\n </button>\n ) : null}\n {open ? <DocumentViewer block={block} onClose={() => setOpen(false)} /> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { Checkbox, cn, Spinner } from \"@cntyclub/ui-react\";\nimport { ListChecksIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { TaskItem } from \"../types\";\n\n/**\n * A read-only checklist of the steps the agent is working through (Claude-style\n * to-dos). The user cannot toggle items — the agent drives the state via the\n * `update_tasks` tool.\n */\nexport function TaskChecklist({ tasks }: { tasks: TaskItem[] }) {\n if (!tasks || tasks.length === 0) return null;\n const done = tasks.filter((task) => task.status === \"done\").length;\n\n return (\n <div className=\"w-full max-w-full rounded-xl border border-border bg-card p-3 shadow-xs\">\n <div className=\"mb-2 flex items-center gap-1.5 font-medium text-sm\">\n <ListChecksIcon className=\"size-4 text-muted-foreground\" />\n Tasks\n <span className=\"ml-auto text-muted-foreground text-xs\">\n {done}/{tasks.length}\n </span>\n </div>\n <ul className=\"flex flex-col gap-1.5\">\n {tasks.map((task, index) => (\n <li className=\"flex items-center gap-2 text-sm\" key={`${index}-${task.title}`}>\n {task.status === \"in_progress\" ? (\n <span className=\"flex size-4 shrink-0 items-center justify-center [&_svg]:size-3.5\">\n <Spinner />\n </span>\n ) : (\n <Checkbox\n aria-hidden\n checked={task.status === \"done\"}\n className=\"pointer-events-none shrink-0\"\n readOnly\n tabIndex={-1}\n />\n )}\n <span\n className={cn(\n \"min-w-0\",\n task.status === \"done\" && \"text-muted-foreground line-through\",\n task.status === \"in_progress\" && \"font-medium\",\n )}\n >\n {task.title}\n </span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsiblePanel,\n CollapsibleTrigger,\n ChatToolChip,\n DataTablePaged,\n cn,\n} from \"@cntyclub/ui-react\";\nimport { CheckIcon, ChevronDownIcon, CodeIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { toDisplayTable } from \"../table-format\";\nimport { humanizeToolName, resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, MessageBlock, TableBlock } from \"../types\";\nimport type { ToolStep } from \"../message-group\";\nimport { DocumentCard } from \"./document-card\";\nimport { TaskChecklist } from \"./task-checklist\";\n\n/** Renders the visible output blocks of a step (tables, documents, checklists). */\nfunction StepBlocks({ blocks, stepKey }: { blocks: MessageBlock[] | undefined; stepKey: string }) {\n const visible = (blocks ?? []).filter(\n (block) => block.type === \"table\" || block.type === \"document\" || block.type === \"tasks\",\n );\n if (visible.length === 0) return null;\n return (\n <>\n {visible.map((block, index) => {\n const key = `${stepKey}-block-${index}`;\n if (block.type === \"document\") {\n return <DocumentCard block={block} key={key} />;\n }\n if (block.type === \"tasks\") {\n return <TaskChecklist key={key} tasks={block.tasks} />;\n }\n const table = block as TableBlock;\n const { columns, rows } = toDisplayTable(table);\n return (\n <div className=\"w-full max-w-full\" key={key}>\n <DataTablePaged\n columns={columns}\n pageSize={8}\n rows={rows}\n totalCount={\n typeof table.pagination?.count === \"number\" ? (table.pagination.count as number) : table.row_count\n }\n />\n </div>\n );\n })}\n </>\n );\n}\n\nfunction RawJsonDisclosure({ result }: { result: string }) {\n return (\n <Collapsible className=\"mt-1.5\">\n <CollapsibleTrigger className=\"group flex items-center gap-1 text-muted-foreground text-xs hover:text-foreground\">\n <CodeIcon className=\"size-3\" />\n <span>Raw JSON</span>\n <ChevronDownIcon className=\"size-3 transition-transform group-data-[panel-open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsiblePanel>\n <pre className=\"mt-1 max-h-64 overflow-auto rounded-lg bg-muted p-2 font-mono text-[11px] leading-snug text-muted-foreground\">\n {result}\n </pre>\n </CollapsiblePanel>\n </Collapsible>\n );\n}\n\nfunction StepDetail({\n describeToolCall,\n step,\n}: {\n describeToolCall?: DescribeToolCall;\n step: ToolStep;\n}) {\n const { details, summary, title } = resolveToolPresentation(describeToolCall, step.name, step.args);\n return (\n <div className=\"rounded-lg border border-border/72 bg-card p-2.5\">\n <div className=\"flex items-center gap-1.5 font-medium text-sm\">\n {step.status === \"running\" ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon className=\"size-3.5 text-success\" />\n )}\n {title}\n </div>\n {summary ? <p className=\"mt-0.5 text-muted-foreground text-xs\">{summary}</p> : null}\n {details.length > 0 ? (\n <dl className=\"mt-1.5 space-y-0.5 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {step.result ? <RawJsonDisclosure result={step.result} /> : null}\n </div>\n );\n}\n\nexport interface ToolActivityGroupProps {\n steps: ToolStep[];\n describeToolCall?: DescribeToolCall;\n}\n\n/**\n * A collapsed run of tool activity. Normally shows just the latest step as a\n * chip with a disclosure toggle; expanding reveals every step in plain language\n * with a per-step raw-JSON dropdown. Result tables always render below so the\n * data the user asked for is never hidden behind the toggle.\n */\nexport function ToolActivityGroup({ describeToolCall, steps }: ToolActivityGroupProps) {\n const [open, setOpen] = React.useState(false);\n if (steps.length === 0) return null;\n\n const last = steps[steps.length - 1];\n const anyRunning = steps.some((step) => step.status === \"running\");\n const lastTitle =\n resolveToolPresentation(describeToolCall, last.name, last.args).title || humanizeToolName(last.name);\n const chipLabel = anyRunning ? `${lastTitle}…` : steps.length > 1 ? lastTitle : `${lastTitle} finished`;\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <Collapsible onOpenChange={setOpen} open={open}>\n <CollapsibleTrigger\n render={\n <ChatToolChip\n className=\"cursor-pointer pr-2 hover:bg-muted\"\n icon={\n anyRunning ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon />\n )\n }\n >\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"truncate\">{chipLabel}</span>\n {steps.length > 1 ? (\n <span className=\"rounded-full bg-background px-1.5 text-[10px] text-foreground/72\">\n {steps.length} steps\n </span>\n ) : null}\n <ChevronDownIcon className={cn(\"size-3 transition-transform\", open && \"rotate-180\")} />\n </span>\n </ChatToolChip>\n }\n />\n <CollapsiblePanel>\n <div className=\"mt-2 flex flex-col gap-1.5\">\n {steps.map((step) => (\n <StepDetail describeToolCall={describeToolCall} key={step.callId} step={step} />\n ))}\n </div>\n </CollapsiblePanel>\n </Collapsible>\n\n {steps.map((step) => (\n <StepBlocks blocks={step.blocks} key={`${step.callId}-blocks`} stepKey={step.callId} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n ChatToolCard,\n ChatToolCardActions,\n ChatToolCardHeader,\n Group,\n Menu,\n MenuItem,\n MenuPopup,\n MenuTrigger,\n Spinner,\n} from \"@cntyclub/ui-react\";\nimport { CheckCheckIcon, ChevronDownIcon, ShieldAlertIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, PendingApproval } from \"../types\";\n\nexport interface ToolApprovalCardProps {\n approval: PendingApproval;\n resolving: boolean;\n onResolve: (callId: string, approve: boolean) => void;\n /** Host-app hook that turns the tool call into plain language. */\n describeToolCall?: DescribeToolCall;\n /** Remember this tool and auto-approve it from now on. */\n onAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Approval prompt for a write action the agent wants to perform. Arguments are\n * shown in plain language (technical ids/keys hidden, or a host-provided\n * description) so the user understands exactly what will change. The primary\n * action is a split button: \"Approve\" once, or \"Always approve\" this tool.\n */\nexport function ToolApprovalCard({\n approval,\n describeToolCall,\n onAlwaysApprove,\n onResolve,\n resolving,\n}: ToolApprovalCardProps) {\n const { details, summary, title } = resolveToolPresentation(\n describeToolCall,\n approval.tool_name,\n (approval.arguments ?? {}) as Record<string, unknown>,\n );\n\n return (\n <ChatToolCard className=\"border-warning/40\">\n <ChatToolCardHeader>\n <ShieldAlertIcon className=\"size-4 text-warning\" />\n Approval needed\n </ChatToolCardHeader>\n <p className=\"mt-1 text-muted-foreground\">\n {summary ?? (\n <>\n The assistant wants to <span className=\"font-medium text-foreground\">{title.toLowerCase()}</span> — this\n will change your data.\n </>\n )}\n </p>\n {details.length > 0 && (\n <dl className=\"mt-2 space-y-1 rounded-lg bg-muted p-2 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words font-medium text-foreground\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n )}\n <ChatToolCardActions>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, false)} size=\"sm\" variant=\"outline\">\n Decline\n </Button>\n <Group>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, true)} size=\"sm\">\n {resolving ? <Spinner /> : null}\n Approve\n </Button>\n <Menu>\n <MenuTrigger\n render={\n <Button aria-label=\"More approve options\" disabled={resolving} size=\"icon-sm\" variant=\"default\">\n <ChevronDownIcon />\n </Button>\n }\n />\n <MenuPopup align=\"end\">\n <MenuItem\n onClick={() => {\n onAlwaysApprove(approval.tool_name);\n onResolve(approval.id, true);\n }}\n >\n <CheckCheckIcon />\n Always approve “{title}”\n </MenuItem>\n </MenuPopup>\n </Menu>\n </Group>\n </ChatToolCardActions>\n </ChatToolCard>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n Chat,\n ChatEmptyState,\n ChatEmptyStateDescription,\n ChatEmptyStateIcon,\n ChatEmptyStateTitle,\n ChatMessage,\n ChatHeader,\n ChatHeaderActions,\n ChatHeaderAvatar,\n ChatHeaderTitle,\n ChatMessages,\n ChatSuggestion,\n ChatSuggestions,\n ChatTypingIndicator,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@cntyclub/ui-react\";\nimport {\n HistoryIcon,\n Maximize2Icon,\n Minimize2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadCloudIcon,\n XIcon,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { acceptAttribute, fileUploadEnabled, validateFile } from \"../file-support\";\nimport { groupMessages } from \"../message-group\";\nimport type { AgentChatActions, AgentChatState } from \"../use-agent-chat\";\nimport type { AgentConfig } from \"../types\";\nimport { AgentComposer } from \"./agent-composer\";\nimport { MessageItem } from \"./message-item\";\nimport { ToolActivityGroup } from \"./tool-activity-group\";\nimport { ToolApprovalCard } from \"./tool-approval-card\";\n\nexport interface AgentPanelProps {\n config: AgentConfig;\n chat: AgentChatState & AgentChatActions;\n /** Fullscreen \"Agent Mode\" is active. */\n agentMode: boolean;\n /** Hide the expand button (mobile is always fullscreen). */\n canToggleAgentMode: boolean;\n onToggleAgentMode: () => void;\n onClose: () => void;\n /** Remember a write tool and auto-approve its future prompts. */\n onAlwaysApprove: (toolName: string) => void;\n className?: string;\n}\n\n/**\n * The chat surface shared by the popup panel and fullscreen Agent Mode.\n * Header (title, history, new chat, expand/collapse, close) + messages + input.\n */\nexport function AgentPanel({\n agentMode,\n canToggleAgentMode,\n chat,\n className,\n config,\n onAlwaysApprove,\n onClose,\n onToggleAgentMode,\n}: AgentPanelProps) {\n const [draft, setDraft] = React.useState(\"\");\n const [view, setView] = React.useState<\"chat\" | \"history\">(\"chat\");\n const [files, setFiles] = React.useState<File[]>([]);\n const [uploadError, setUploadError] = React.useState<string | null>(null);\n const [dragging, setDragging] = React.useState(false);\n const dragDepth = React.useRef(0);\n\n const agentName = config.agentName ?? chat.agentInfo?.name ?? \"Assistant\";\n const uploadEnabled = fileUploadEnabled(config);\n const suggestions = config.suggestions ?? [\n \"What can you help me with?\",\n \"Give me a quick summary of my data.\",\n ];\n\n const addFiles = React.useCallback(\n (incoming: File[]) => {\n const accepted: File[] = [];\n let rejection: string | null = null;\n for (const file of incoming) {\n const error = validateFile(config, file);\n if (error) {\n rejection = error;\n continue;\n }\n accepted.push(file);\n }\n setUploadError(rejection);\n if (accepted.length) setFiles((current) => [...current, ...accepted].slice(0, 10));\n },\n [config],\n );\n\n const removeFile = React.useCallback((index: number) => {\n setFiles((current) => current.filter((_, i) => i !== index));\n }, []);\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n const staged = files;\n setDraft(\"\");\n setFiles([]);\n setUploadError(null);\n void chat.send(text, staged);\n },\n [chat, files],\n );\n\n // ----- drag-and-drop file upload -----\n const onDragEnter = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled || !event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current += 1;\n setDragging(true);\n },\n [uploadEnabled],\n );\n const onDragLeave = React.useCallback((event: React.DragEvent) => {\n if (!event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current = Math.max(0, dragDepth.current - 1);\n if (dragDepth.current === 0) setDragging(false);\n }, []);\n const onDrop = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled) return;\n event.preventDefault();\n dragDepth.current = 0;\n setDragging(false);\n const dropped = Array.from(event.dataTransfer?.files ?? []);\n if (dropped.length) addFiles(dropped);\n },\n [addFiles, uploadEnabled],\n );\n\n const openHistory = React.useCallback(() => {\n setView(\"history\");\n void chat.refreshConversations();\n }, [chat]);\n\n const busy = chat.sending || chat.resolvingApprovalId !== null;\n\n return (\n <div\n className={cn(\n \"relative flex min-h-0 flex-col overflow-hidden bg-background text-foreground\",\n className,\n )}\n data-slot=\"agent-panel\"\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={uploadEnabled ? (event) => event.preventDefault() : undefined}\n onDrop={onDrop}\n >\n {dragging && view === \"chat\" ? (\n <div className=\"pointer-events-none absolute inset-0 z-40 flex flex-col items-center justify-center gap-2 bg-background/85 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-2 rounded-2xl border-2 border-primary/40 border-dashed px-8 py-6 text-center\">\n <UploadCloudIcon className=\"size-8 text-primary\" />\n <div className=\"font-medium text-sm\">Drop text files to attach</div>\n <div className=\"text-muted-foreground text-xs\">{acceptAttribute(config).replaceAll(\",\", \" · \")}</div>\n </div>\n </div>\n ) : null}\n {/* Header */}\n <ChatHeader>\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n <ChatHeaderAvatar />\n <ChatHeaderTitle>\n <div className=\"truncate font-medium text-sm\">{agentName}</div>\n {config.tagline ? (\n <div className=\"truncate text-muted-foreground text-xs\">{config.tagline}</div>\n ) : null}\n </ChatHeaderTitle>\n </div>\n\n <ChatHeaderActions>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Conversation history\"\n onClick={view === \"history\" ? () => setView(\"chat\") : openHistory}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <HistoryIcon />\n </Button>\n }\n />\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"New chat\"\n onClick={() => {\n chat.newChat();\n setView(\"chat\");\n }}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <SquarePenIcon />\n </Button>\n }\n />\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n\n {canToggleAgentMode ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={agentMode ? \"Exit Agent Mode\" : \"Enter Agent Mode\"}\n onClick={onToggleAgentMode}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {agentMode ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n }\n />\n <TooltipContent>{agentMode ? \"Exit Agent Mode\" : \"Agent Mode\"}</TooltipContent>\n </Tooltip>\n ) : null}\n\n <Button aria-label=\"Close\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </ChatHeaderActions>\n </ChatHeader>\n\n {view === \"history\" ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto p-2\">\n {chat.conversations.length === 0 ? (\n <p className=\"p-4 text-center text-muted-foreground text-sm\">\n No conversations yet.\n </p>\n ) : (\n chat.conversations.map((conversation) => (\n <div\n className=\"group flex items-center gap-1 rounded-lg hover:bg-accent\"\n key={conversation.id}\n >\n <button\n className=\"min-w-0 flex-1 cursor-pointer px-3 py-2 text-left\"\n onClick={() => {\n void chat.openConversation(conversation.id);\n setView(\"chat\");\n }}\n type=\"button\"\n >\n <span className=\"block truncate text-sm\">{conversation.title || \"Untitled\"}</span>\n <span className=\"block text-muted-foreground text-xs\">\n {new Date(conversation.updated_at).toLocaleString()}\n </span>\n </button>\n <Button\n aria-label=\"Delete conversation\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => void chat.deleteConversation(conversation.id)}\n size=\"icon-xs\"\n variant=\"destructive-ghost\"\n >\n <Trash2Icon />\n </Button>\n </div>\n ))\n )}\n </div>\n ) : (\n <Chat>\n <ChatMessages className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}>\n {chat.messages.length === 0 && !chat.sending ? (\n <ChatEmptyState>\n <ChatEmptyStateIcon />\n <div>\n <ChatEmptyStateTitle>Hi! I'm {agentName}.</ChatEmptyStateTitle>\n <ChatEmptyStateDescription className=\"mt-1\">\n Ask me anything about your data — I can look things up and take actions\n (with your approval).\n </ChatEmptyStateDescription>\n </div>\n <ChatSuggestions>\n {suggestions.slice(0, 4).map((suggestion, index) => (\n <ChatSuggestion\n index={index}\n key={suggestion}\n onClick={() => handleSubmit(suggestion)}\n >\n {suggestion}\n </ChatSuggestion>\n ))}\n </ChatSuggestions>\n </ChatEmptyState>\n ) : (\n <>\n {groupMessages(chat.messages).map((item) =>\n item.kind === \"tool-activity\" ? (\n <ChatMessage from=\"assistant\" key={item.key}>\n <ToolActivityGroup describeToolCall={config.describeToolCall} steps={item.steps} />\n </ChatMessage>\n ) : (\n <MessageItem key={item.key} message={item.message} />\n ),\n )}\n {chat.pendingApprovals.map((approval) => (\n <ToolApprovalCard\n approval={approval}\n describeToolCall={config.describeToolCall}\n key={approval.id}\n onAlwaysApprove={onAlwaysApprove}\n onResolve={(callId, approve) => void chat.resolveApproval(callId, approve)}\n resolving={chat.resolvingApprovalId === approval.id}\n />\n ))}\n {busy ? <ChatTypingIndicator /> : null}\n </>\n )}\n </ChatMessages>\n\n {chat.error || uploadError ? (\n <div className=\"mx-3 mb-1 flex items-center justify-between gap-2 rounded-lg bg-destructive/10 px-3 py-2 text-destructive text-xs\">\n <span className=\"min-w-0 truncate\">{chat.error ?? uploadError}</span>\n <button\n className=\"shrink-0 cursor-pointer font-medium\"\n onClick={() => {\n chat.clearError();\n setUploadError(null);\n }}\n type=\"button\"\n >\n Dismiss\n </button>\n </div>\n ) : null}\n\n <AgentComposer\n acceptAttribute={acceptAttribute(config)}\n className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}\n disabled={busy || chat.pendingApprovals.length > 0}\n files={files}\n onPickFiles={uploadEnabled ? addFiles : undefined}\n onRemoveFile={removeFile}\n onSubmit={handleSubmit}\n onValueChange={setDraft}\n placeholder={\n chat.pendingApprovals.length > 0\n ? \"Approve or decline the pending action first…\"\n : `Ask ${agentName}…`\n }\n value={draft}\n />\n </Chat>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { AgentApiClient, AgentApiError } from \"./api-client\";\nimport type {\n AgentConfig,\n AgentMessage,\n AgentPublicConfig,\n ConversationSummary,\n PendingApproval,\n} from \"./types\";\n\nexport interface AgentChatState {\n agentInfo: AgentPublicConfig | null;\n conversationId: string | null;\n conversations: ConversationSummary[];\n messages: AgentMessage[];\n pendingApprovals: PendingApproval[];\n sending: boolean;\n resolvingApprovalId: string | null;\n error: string | null;\n}\n\nexport interface AgentChatActions {\n send: (text: string, files?: File[]) => Promise<void>;\n resolveApproval: (callId: string, approve: boolean) => Promise<void>;\n newChat: () => void;\n openConversation: (conversationId: string) => Promise<void>;\n refreshConversations: () => Promise<void>;\n deleteConversation: (conversationId: string) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * Headless chat state for an Agent Mode agent: message history, sending,\n * pending write-tool approvals, and conversation management. UI-agnostic.\n */\nexport function useAgentChat(config: AgentConfig): AgentChatState & AgentChatActions {\n const client = React.useMemo(() => new AgentApiClient(config), [config]);\n\n const [agentInfo, setAgentInfo] = React.useState<AgentPublicConfig | null>(null);\n const [conversationId, setConversationId] = React.useState<string | null>(null);\n const [conversations, setConversations] = React.useState<ConversationSummary[]>([]);\n const [messages, setMessages] = React.useState<AgentMessage[]>([]);\n const [pendingApprovals, setPendingApprovals] = React.useState<PendingApproval[]>([]);\n const [sending, setSending] = React.useState(false);\n const [resolvingApprovalId, setResolvingApprovalId] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n client\n .getConfig()\n .then((info) => {\n if (!cancelled) setAgentInfo(info);\n })\n .catch(() => {\n // Non-fatal: the panel falls back to config-provided naming.\n });\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n const handleFailure = React.useCallback((err: unknown) => {\n const message =\n err instanceof AgentApiError\n ? err.message\n : \"Something went wrong. Please try again.\";\n setError(message);\n }, []);\n\n const applyResponse = React.useCallback(\n (response: {\n status?: string;\n message?: string;\n conversation_id?: string;\n messages?: AgentMessage[];\n pending_approvals?: PendingApproval[];\n }) => {\n if (response.status === \"error\" && !response.messages?.length) {\n setError(response.message ?? \"The assistant could not answer.\");\n return;\n }\n if (response.conversation_id) setConversationId(response.conversation_id);\n if (response.messages?.length) {\n setMessages((current) => {\n const seen = new Set(current.map((message) => message.id));\n const fresh = response.messages?.filter((message) => !seen.has(message.id)) ?? [];\n return [...current, ...fresh];\n });\n }\n setPendingApprovals(response.pending_approvals ?? []);\n if (response.status === \"error\" && response.message) {\n setError(response.message);\n }\n },\n [],\n );\n\n const send = React.useCallback(\n async (text: string, files?: File[]) => {\n if (sending) return;\n if (!text.trim() && !(files && files.length)) return;\n setSending(true);\n setError(null);\n try {\n const response = await client.sendMessage(text, conversationId, files);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setSending(false);\n }\n },\n [applyResponse, client, conversationId, handleFailure, sending],\n );\n\n const resolveApproval = React.useCallback(\n async (callId: string, approve: boolean) => {\n if (resolvingApprovalId) return;\n setResolvingApprovalId(callId);\n setError(null);\n try {\n const response = await client.resolveApproval(callId, approve);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setResolvingApprovalId(null);\n }\n },\n [applyResponse, client, handleFailure, resolvingApprovalId],\n );\n\n const newChat = React.useCallback(() => {\n setConversationId(null);\n setMessages([]);\n setPendingApprovals([]);\n setError(null);\n }, []);\n\n const refreshConversations = React.useCallback(async () => {\n try {\n const { conversations: list } = await client.listConversations();\n setConversations(list);\n } catch (err) {\n handleFailure(err);\n }\n }, [client, handleFailure]);\n\n const openConversation = React.useCallback(\n async (id: string) => {\n setError(null);\n try {\n const payload = await client.getConversation(id);\n setConversationId(id);\n setMessages(payload.messages ?? []);\n setPendingApprovals(payload.pending_approvals ?? []);\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, handleFailure],\n );\n\n const deleteConversation = React.useCallback(\n async (id: string) => {\n try {\n await client.deleteConversation(id);\n setConversations((current) => current.filter((c) => c.id !== id));\n if (conversationId === id) newChat();\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, conversationId, handleFailure, newChat],\n );\n\n const clearError = React.useCallback(() => setError(null), []);\n\n return {\n agentInfo,\n clearError,\n conversationId,\n conversations,\n deleteConversation,\n error,\n messages,\n newChat,\n openConversation,\n pendingApprovals,\n refreshConversations,\n resolveApproval,\n resolvingApprovalId,\n send,\n sending,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nconst STORAGE_PREFIX = \"cc-agent-always-approve:\";\n\nfunction storageKey(clientId: string): string {\n return `${STORAGE_PREFIX}${clientId || \"default\"}`;\n}\n\nfunction readStored(clientId: string): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = window.localStorage.getItem(storageKey(clientId));\n if (!raw) return new Set();\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? new Set(parsed.filter((v): v is string => typeof v === \"string\")) : new Set();\n } catch {\n return new Set();\n }\n}\n\nexport interface AlwaysApproveStore {\n /** Whether the user chose to always approve this tool for this agent. */\n isAlwaysApproved: (toolName: string) => boolean;\n /** Remember to auto-approve this tool from now on (persisted per agent). */\n setAlwaysApprove: (toolName: string) => void;\n /** Stop auto-approving this tool. */\n clearAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Per-agent \"always approve\" memory for write tools, persisted in localStorage\n * (keyed by client id). Once a tool is trusted the panel auto-resolves its\n * future approval prompts instead of asking again.\n */\nexport function useAlwaysApprove(clientId: string): AlwaysApproveStore {\n const [approved, setApproved] = React.useState<Set<string>>(() => new Set());\n\n // Load once mounted (localStorage is unavailable during SSR).\n React.useEffect(() => {\n setApproved(readStored(clientId));\n }, [clientId]);\n\n const persist = React.useCallback(\n (next: Set<string>) => {\n setApproved(next);\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey(clientId), JSON.stringify([...next]));\n } catch {\n // Ignore quota/availability errors — trust simply won't persist.\n }\n },\n [clientId],\n );\n\n const isAlwaysApproved = React.useCallback((toolName: string) => approved.has(toolName), [approved]);\n\n const setAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (approved.has(toolName)) return;\n const next = new Set(approved);\n next.add(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n const clearAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (!approved.has(toolName)) return;\n const next = new Set(approved);\n next.delete(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n return { clearAlwaysApprove, isAlwaysApproved, setAlwaysApprove };\n}\n","\"use client\";\n\nimport { cn, Fab, TooltipProvider, useMediaQuery } from \"@cntyclub/ui-react\";\nimport { SparklesIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentConfig, AgentMessage } from \"../types\";\nimport { useAgentChat } from \"../use-agent-chat\";\nimport { useAlwaysApprove } from \"../use-always-approve\";\nimport { AgentPanel } from \"./agent-panel\";\n\nexport interface AgentWidgetProps {\n config: AgentConfig;\n /** Controlled open state (optional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * The embeddable Agent Mode widget.\n *\n * - Closed: a floating round button (bottom-right by default).\n * - Open on desktop: a popup panel anchored to the button, with an\n * \"Agent Mode\" button that expands to a fullscreen chat. While in the popup,\n * the widget can navigate the host app to pages related to the tools the\n * agent uses (via `config.pages` + `config.navigate`).\n * - Open on mobile: fullscreen from the start.\n *\n * All colors come from the host app's UI-kit theme tokens, so light/dark mode\n * follows the dashboard automatically.\n */\nexport function AgentWidget({ config, onOpenChange, open: controlledOpen }: AgentWidgetProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = React.useCallback(\n (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const [agentMode, setAgentMode] = React.useState(false);\n const isDesktop = useMediaQuery(\"(min-width: 640px)\", {\n defaultSSRValue: true,\n ssr: true,\n });\n const fullscreen = !isDesktop || agentMode;\n\n const chat = useAgentChat(config);\n const alwaysApprove = useAlwaysApprove(config.clientId);\n\n // ----- auto-approve trusted write tools -----\n // When the user has chosen \"Always approve\" for a tool, resolve its pending\n // prompts automatically (one at a time — the backend waits for siblings).\n const { pendingApprovals, resolveApproval, resolvingApprovalId } = chat;\n const { isAlwaysApproved } = alwaysApprove;\n React.useEffect(() => {\n if (!open || resolvingApprovalId) return;\n const target = pendingApprovals.find((approval) => isAlwaysApproved(approval.tool_name));\n if (target) void resolveApproval(target.id, true);\n }, [open, pendingApprovals, resolvingApprovalId, isAlwaysApproved, resolveApproval]);\n\n // ----- live page refresh after successful writes -----\n // When a write tool the agent ran succeeds, tell the host app so it can\n // refetch the affected data instead of the user having to reload the page.\n const firedWriteIds = React.useRef<Set<string>>(new Set());\n const { onWriteSuccess } = config;\n React.useEffect(() => {\n if (!onWriteSuccess) return;\n for (const message of chat.messages) {\n if (message.role !== \"tool\" || !message.is_write || message.tool_status !== \"success\") continue;\n if (firedWriteIds.current.has(message.id)) continue;\n firedWriteIds.current.add(message.id);\n const args = findToolArguments(chat.messages, message);\n onWriteSuccess({ arguments: args, toolName: message.tool_name ?? \"\" });\n }\n }, [chat.messages, onWriteSuccess]);\n\n // ----- page-follow navigation (popup mode only) -----\n const lastNavigatedMessageId = React.useRef<string | null>(null);\n const { messages } = chat;\n React.useEffect(() => {\n if (!open || fullscreen || !config.navigate || !config.pages?.length) return;\n const toolMessages = messages.filter((message) => message.role === \"tool\");\n const latest = toolMessages[toolMessages.length - 1];\n if (!latest || latest.id === lastNavigatedMessageId.current) return;\n lastNavigatedMessageId.current = latest.id;\n\n const mapping = config.pages.find((page) => page.tools.includes(latest.tool_name ?? \"\"));\n if (!mapping) return;\n\n const args = findToolArguments(messages, latest);\n const path = mapping.buildRoute ? mapping.buildRoute(args) : mapping.route;\n if (path) config.navigate(path);\n }, [config, fullscreen, messages, open]);\n\n const closePanel = React.useCallback(() => {\n setOpen(false);\n setAgentMode(false);\n }, [setOpen]);\n\n return (\n <TooltipProvider>\n {!open && !config.appearance?.hideLauncher ? (\n <Fab\n aria-label=\"Open assistant\"\n onClick={() => setOpen(true)}\n position={config.appearance?.position ?? \"bottom-right\"}\n >\n <SparklesIcon />\n </Fab>\n ) : null}\n\n {open ? (\n fullscreen ? (\n <div\n aria-modal=\"true\"\n className=\"fixed inset-0 z-50 flex flex-col bg-background\"\n role=\"dialog\"\n >\n <AgentPanel\n agentMode={agentMode}\n canToggleAgentMode={isDesktop}\n chat={chat}\n className=\"flex-1\"\n config={config}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode((value) => !value)}\n />\n </div>\n ) : (\n <div\n className={cn(\n \"fixed z-50 flex flex-col overflow-hidden rounded-2xl border border-border shadow-2xl\",\n (config.appearance?.position ?? \"bottom-right\") === \"bottom-left\"\n ? \"bottom-4 left-4 sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n )}\n role=\"dialog\"\n style={{\n height: `min(${config.appearance?.panelHeight ?? 640}px, calc(100dvh - 3rem))`,\n width: `min(${config.appearance?.panelWidth ?? 400}px, calc(100vw - 2rem))`,\n }}\n >\n <AgentPanel\n agentMode={false}\n canToggleAgentMode\n chat={chat}\n className=\"flex-1\"\n config={config}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode(true)}\n />\n </div>\n )\n ) : null}\n </TooltipProvider>\n );\n}\n\n/** Look up the arguments of the assistant tool_call a tool message answers. */\nfunction findToolArguments(\n messages: AgentMessage[],\n toolMessage: AgentMessage,\n): Record<string, unknown> {\n if (!toolMessage.tool_call_id) return {};\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role !== \"assistant\" || !message.tool_calls) continue;\n const match = message.tool_calls.find((call) => call.id === toolMessage.tool_call_id);\n if (match) return match.arguments ?? {};\n }\n return {};\n}\n","import type { AgentConfig } from \"./types\";\n\n/**\n * Identity helper that gives host apps full type inference/checking when\n * declaring their agent config file.\n */\nexport function defineAgentConfig(config: AgentConfig): AgentConfig {\n return config;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api-client.ts","../src/file-support.ts","../src/components/agent-composer.tsx","../src/message-group.ts","../src/components/message-item.tsx","../src/components/thinking-indicator.tsx","../src/table-format.tsx","../src/tool-presentation.ts","../src/components/document-card.tsx","../src/components/task-checklist.tsx","../src/components/tool-activity-group.tsx","../src/components/tool-approval-card.tsx","../src/components/agent-panel.tsx","../src/use-agent-chat.ts","../src/use-always-approve.ts","../src/components/agent-widget.tsx","../src/config.ts"],"names":["acceptAttribute","React","callId","jsxs","jsx","FileTextIcon","React2","cn","UUID_RE","Button","Fragment","React3","XIcon","React4","Spinner","ChevronDownIcon","React5","Maximize2Icon","ChatMessage","React7","React8"],"mappings":";;;;;;AAOO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,MAAA;AAAA,EAEA,WAAA,CAAY,SAAiB,MAAA,EAAgB;AAC3C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AASO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EAER,YAAY,MAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAc,OAAA,CACZ,IAAA,EACA,OAAA,GAA+C,EAAC,EACpC;AACZ,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,EAAe;AAC/C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,aAAA,CAAc,gDAAA,EAAkD,GAAG,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,EAAG,SAAS,CAAA,UAAA,EAAa,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAI3F,IAAA,MAAM,UAAA,GAAa,OAAO,QAAA,KAAa,WAAA,IAAe,QAAQ,IAAA,YAAgB,QAAA;AAC9E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA;AAAA,MAC9B,mBAAA,EAAqB,KAAK,MAAA,CAAO;AAAA,KACnC;AACA,IAAA,IAAI,CAAC,UAAA,EAAY,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAE3C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,IAAA,EACE,OAAA,CAAQ,IAAA,KAAS,MAAA,GACb,MAAA,GACA,UAAA,GACG,OAAA,CAAQ,IAAA,GACT,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,MACnC,OAAA;AAAA,MACA,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC3B,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAEpC,IAAA,IAAI,UAAmC,EAAC;AACxC,IAAA,IAAI;AACF,MAAA,OAAA,GAAW,MAAM,SAAS,IAAA,EAAK;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SACH,OAAA,CAAQ,MAAA,IACR,QAAQ,OAAA,IACT,CAAA,gBAAA,EAAmB,SAAS,MAAM,CAAA,CAAA,CAAA;AACpC,MAAA,MAAM,IAAI,aAAA,CAAc,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAwC;AACtC,IAAA,OAAO,IAAA,CAAK,QAA2B,qBAAqB,CAAA;AAAA,EAC9D;AAAA,EAEA,WAAA,CACE,OAAA,EACA,cAAA,EACA,KAAA,EACuB;AACvB,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,CAAO,WAAW,OAAO,CAAA;AAC9B,MAAA,IAAI,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAmB,cAAc,CAAA;AACjE,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO,IAAA,CAAK,OAAO,OAAA,EAAS,IAAA,EAAM,KAAK,IAAI,CAAA;AAC9D,MAAA,OAAO,IAAA,CAAK,QAAsB,mBAAA,EAAqB,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACvF;AACA,IAAA,OAAO,IAAA,CAAK,QAAsB,mBAAA,EAAqB;AAAA,MACrD,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,KAAK,MAAA,CAAO,QAAA;AAAA,QACvB,iBAAiB,cAAA,IAAkB,IAAA;AAAA,QACnC;AAAA,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEA,eAAA,CAAgB,QAAgB,OAAA,EAAyC;AACvE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAsB,CAAA,sBAAA,EAAyB,MAAM,CAAA,SAAA,CAAA,EAAa;AAAA,MAC5E,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,IAAA,CAAK,OAAO,QAAA,EAAS;AAAA,MACjD,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEA,iBAAA,GAAuE;AACrE,IAAA,OAAO,IAAA,CAAK,QAAQ,4BAA4B,CAAA;AAAA,EAClD;AAAA,EAEA,gBAAgB,cAAA,EAIb;AACD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,0BAAA,EAA6B,cAAc,CAAA,CAAA,CAAG,CAAA;AAAA,EACpE;AAAA,EAEA,mBAAmB,cAAA,EAAuC;AACxD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,0BAAA,EAA6B,cAAc,CAAA,CAAA,CAAA,EAAK;AAAA,MAClE,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AACF;;;ACnIO,IAAM,cAAA,GAAiB,CAAC,MAAA,EAAQ,KAAA,EAAO,aAAa,MAAA,EAAQ,MAAA,EAAQ,QAAQ,OAAO;AAEnF,IAAM,mBAAA,GAAsB,CAAA;AAE5B,SAAS,kBAAkB,MAAA,EAA8B;AAC9D,EAAA,OAAO,MAAA,CAAO,YAAY,OAAA,KAAY,KAAA;AACxC;AAEO,SAAS,mBAAmB,MAAA,EAA+B;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAY,MAAA;AAClC,EAAA,OAAO,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,cAAA;AAChF;AAEO,SAAS,UAAU,MAAA,EAA6B;AACrD,EAAA,OAAO,MAAA,CAAO,YAAY,SAAA,IAAa,mBAAA;AACzC;AAGO,SAAS,gBAAgB,MAAA,EAA6B;AAC3D,EAAA,OAAO,kBAAA,CAAmB,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC5C;AAEA,SAAS,YAAY,QAAA,EAA0B;AAC7C,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,OAAO,OAAO,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,aAAY,GAAI,EAAA;AACxD;AAGO,SAAS,YAAA,CAAa,QAAqB,IAAA,EAA2B;AAC3E,EAAA,MAAM,UAAA,GAAa,mBAAmB,MAAM,CAAA;AAC5C,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG;AAChD,IAAA,OAAO,SAAI,IAAA,CAAK,IAAI,qDAA2C,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,KAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,EAAA,IAAI,IAAA,CAAK,IAAA,GAAO,KAAA,GAAQ,IAAA,GAAO,IAAA,EAAM;AACnC,IAAA,OAAO,CAAA,MAAA,EAAI,IAAA,CAAK,IAAI,CAAA,yBAAA,EAAuB,KAAK,CAAA,KAAA,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,YAAY,KAAA,EAAmC;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,KAAU,CAAA,EAAG,OAAO,EAAA;AAClC,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAC,CAAA,GAAA,CAAA;AAC3D,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;ACnBO,SAAS,aAAA,CAAc;AAAA,EAC5B,eAAA,EAAAA,gBAAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA,GAAc,oBAAA;AAAA,EACd;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,WAAA,GAAoBC,cAA4B,IAAI,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAiBA,cAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,KAAa,KAAA,CAAM,MAAK,CAAE,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,MAAA,GAAS,CAAA,CAAA;AAE1E,EAAA,MAAM,MAAA,GAAeA,mBAAY,MAAM;AACrC,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,SAAA,EAAW,QAAA,EAAU,KAAK,CAAC,CAAA;AAE/B,EAAMA,iBAAU,MAAM;AACpB,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AACxB,IAAA,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,CAAS,YAAA,EAAc,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAA+C;AACjE,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,MAAM,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAClD,IAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,WAAA,GAAc,MAAM,CAAA;AACvC,IAAA,KAAA,CAAM,OAAO,KAAA,GAAQ,EAAA;AAAA,EACvB,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,mCAAA,EAAqC,SAAS,CAAA;AAAA,MAC5D,WAAA,EAAU,gBAAA;AAAA,MACV,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAA,EAAO;AAAA,MACT,CAAA;AAAA,MAEA,QAAA,kBAAA,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT,+NAAA;AAAA,YACA,QAAA,IAAY;AAAA,WACd;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,MAAA,GAAS,CAAA,mBACd,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChB,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,0GAAA;AAAA,gBAGV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,YAAA,EAAA,EAAa,WAAU,yCAAA,EAA0C,CAAA;AAAA,kCAClE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,eAAK,IAAA,EAAK,CAAA;AAAA,sCAC7C,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAkC,QAAA,EAAA,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAE,CAAA;AAAA,kBACxE,YAAA,mBACC,GAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,YAAA,EAAY,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,sBAC/B,SAAA,EAAU,6JAAA;AAAA,sBACV,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,sBACjC,IAAA,EAAK,QAAA;AAAA,sBAEL,8BAAC,KAAA,EAAA,EAAM;AAAA;AAAA,mBACT,GACE;AAAA;AAAA,eAAA;AAAA,cAdC,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,aAgB7B,GACH,CAAA,GACE,IAAA;AAAA,4BAEJ,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,cAAA,WAAA,mBACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,MAAA,EAAQD,gBAAAA;AAAA,oBACR,SAAA,EAAU,QAAA;AAAA,oBACV,QAAA,EAAQ,IAAA;AAAA,oBACR,QAAA,EAAU,UAAA;AAAA,oBACV,GAAA,EAAK,QAAA;AAAA,oBACL,IAAA,EAAK;AAAA;AAAA,iBACP;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,YAAA,EAAW,cAAA;AAAA,oBACX,SAAA,EAAU,sBAAA;AAAA,oBACV,QAAA;AAAA,oBACA,OAAA,EAAS,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,EAAM;AAAA,oBACvC,IAAA,EAAK,SAAA;AAAA,oBACL,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBAER,8BAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AACjB,eAAA,EACF,CAAA,GACE,IAAA;AAAA,8BAEJ,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,qIAAA;AAAA,kBACV,QAAA;AAAA,kBACA,UAAU,CAAC,KAAA,KAAU,aAAA,CAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,kBACrD,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,oBAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,CAAC,MAAM,QAAA,EAAU;AAC5C,sBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,sBAAA,MAAA,EAAO;AAAA,oBACT;AAAA,kBACF,CAAA;AAAA,kBACA,WAAA;AAAA,kBACA,GAAA,EAAK,WAAA;AAAA,kBACL,IAAA,EAAM,CAAA;AAAA,kBACN;AAAA;AAAA,eACF;AAAA,8BAEA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,YAAA,EAAW,cAAA;AAAA,kBACX,SAAA,EAAU,2CAAA;AAAA,kBACV,UAAU,CAAC,SAAA;AAAA,kBACX,IAAA,EAAK,SAAA;AAAA,kBACL,IAAA,EAAK,QAAA;AAAA,kBAEL,8BAAC,WAAA,EAAA,EAAY;AAAA;AAAA;AACf,aAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;AChIO,SAAS,cAAc,QAAA,EAAwC;AACpE,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,IAAI,KAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAElD,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,MAAA,EAAS,QAAQ,IAAI,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,IAC9E;AACA,IAAA,KAAA,GAAQ,IAAA;AACR,IAAA,QAAA,GAAW,EAAA;AACX,IAAA,iBAAA,CAAkB,KAAA,EAAM;AAAA,EAC1B,CAAA;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,MAAA,KAAA,EAAM;AACN,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,OAAA,CAAQ,IAAI,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,MAAA,MAAM,UAAU,OAAA,CAAQ,OAAA,CAAQ,WAAW,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACjE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,EAAM;AACN,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,OAAA,CAAQ,IAAI,IAAA,EAAM,gBAAA,EAAkB,SAAS,CAAA;AAAA,MACjE;AACA,MAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,UAAA,IAAc,EAAC,EAAG;AAC/C,QAAA,MAAME,OAAAA,GAAS,SAAS,EAAA,IAAM,CAAA,EAAG,QAAQ,EAAE,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,CAAA;AAC5D,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,KAAA,GAAQ,EAAC;AACT,UAAA,QAAA,GAAW,OAAA,CAAQ,EAAA;AAAA,QACrB;AACA,QAAA,iBAAA,CAAkB,GAAA,CAAIA,OAAAA,EAAQ,KAAA,CAAM,MAAM,CAAA;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAO,QAAA,CAAS,SAAA,IAAa,EAAC;AAAA,UAC9B,MAAA,EAAAA,OAAAA;AAAA,UACA,IAAA,EAAM,SAAS,IAAA,IAAQ,MAAA;AAAA,UACvB,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,QAAQ,YAAA,IAAgB,EAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,EAAC;AACT,MAAA,QAAA,GAAW,OAAA,CAAQ,EAAA;AAAA,IACrB;AACA,IAAA,MAAM,aAAA,GAAgB,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA;AAC/D,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAM,aAAa,CAAA;AAChC,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AACrC,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,MAAM,EAAC;AAAA,QACP,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,MAAA,EAAQ,UAAU,OAAA,CAAQ,EAAA;AAAA,QAC1B,IAAA,EAAM,QAAQ,SAAA,IAAa,MAAA;AAAA,QAC3B,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,EAAM;AACN,EAAA,OAAO,KAAA;AACT;ACxFO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAQ,EAA8B;AAClE,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,EAAC;AAC5C,IAAA,uBACEC,IAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,MAAA,EACf,QAAA,EAAA;AAAA,MAAA,WAAA,CAAY,MAAA,GAAS,CAAA,mBACpBC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACZ,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,qBAChBD,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,2HAAA;AAAA,UAGV,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAACC,YAAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EAAoB,CAAA;AAAA,4BAC5CD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,qBAAW,QAAA,EAAS;AAAA;AAAA,SAAA;AAAA,QAHnD,UAAA,CAAW;AAAA,OAKnB,GACH,CAAA,GACE,IAAA;AAAA,MACH,OAAA,CAAQ,0BAAUA,GAAAA,CAAC,qBAAkB,IAAA,EAAK,MAAA,EAAQ,QAAA,EAAA,OAAA,CAAQ,OAAA,EAAQ,CAAA,GAAuB;AAAA,KAAA,EAC5F,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,IAAA,IAAI,CAAC,QAAQ,OAAA,IAAW,CAAC,QAAQ,OAAA,CAAQ,IAAA,IAAQ,OAAO,IAAA;AACxD,IAAA,uBACEA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAK,WAAA,EAChB,0BAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAK,WAAA,EACtB,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAU,QAAA,EAAA,OAAA,CAAQ,OAAA,EAAQ,GAC7B,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT;AC1CA,IAAM,eAAA,GAAkB;AAAA,EACtB,UAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAcO,SAAS,kBAAkB,EAAE,SAAA,EAAW,UAAA,GAAa,IAAA,EAAM,SAAQ,EAA2B;AACnG,EAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,OAAA,GAAU,eAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUE,gBAAS,CAAC,CAAA;AAE1C,EAAMA,iBAAU,MAAM;AAEpB,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,QAAA,CAAS,CAAC,OAAA,KAAA,CAAa,OAAA,GAAU,CAAA,IAAK,MAAM,MAAM,CAAA;AAAA,IACpD,GAAG,UAAU,CAAA;AACb,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,UAAA,EAAY,KAAK,CAAC,CAAA;AAEtB,EAAA,uBACEH,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,sBAAA;AAAA,MACX,SAAA,EAAWI,EAAAA;AAAA,QACT,kHAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,WAAA,EAAU,oBAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAJ,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mFAAA,EAAoF,CAAA;AAAA,0BACpGA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qFAAA,EAAsF,CAAA;AAAA,0BACtGA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qFAAA,EAAsF;AAAA,SAAA,EACxG,CAAA;AAAA,wBACAD,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iEAAA;AAAA,YAIT,QAAA,EAAA;AAAA,cAAA,KAAA,CAAM,KAAK,CAAA;AAAA,cAAE;AAAA;AAAA,WAAA;AAAA,UAFT;AAAA;AAGP;AAAA;AAAA,GACF;AAEJ;AC9BA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,cAAA,GAAiB;AAAA,EACrB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,SAAA,GAAY,yEAAA;AAClB,IAAM,SAAA,GAAY,wCAAA;AAClB,IAAM,OAAA,GAAU,iEAAA;AAChB,IAAM,WAAA,GAAc,yBAAA;AACpB,IAAM,MAAA,GAAS,eAAA;AAEf,IAAM,gBAAgB,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,aAAa,OAAO,CAAA;AAErE,IAAM,aAAa,CAAC,MAAA,EAAQ,SAAS,OAAA,EAAS,WAAA,EAAa,SAAS,MAAM,CAAA;AAE1E,SAAS,OAAO,KAAA,EAAyB;AACvC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAA,CAAQ,KAAK,KAAK,CAAA;AACxD;AAEA,SAAS,SAAS,GAAA,EAAqB;AACrC,EAAA,MAAM,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,GAAG,EAAE,IAAA,EAAK;AACzC,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AACpD;AAGA,SAAS,aAAA,CAAc,KAAa,IAAA,EAA0C;AAC5E,EAAA,IAAI,WAAW,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,GAAG,OAAO,IAAA;AAC9C,EAAA,IAAI,cAAA,CAAe,KAAK,CAAC,OAAA,KAAY,QAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,OAAO,IAAA;AAChE,EAAA,MAAM,SAAS,IAAA,CACZ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,GAAG,CAAC,CAAA,CACrB,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA,IAAa,UAAU,EAAE,CAAA;AAC1E,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AACjD;AAEA,SAAS,UAAU,GAAA,EAA6C;AAC9D,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,IAAQ,OAAO,KAAA;AACtD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,OAAO,KAAK,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,aAAa,GAAA,EAAsC;AAC1D,EAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,UAAU,EAAA,EAAI;AAC3D,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC/B,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,GAAG,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AAAA,EACzB;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,IAAK,QAAA;AAC9B;AAGA,SAAS,YAAY,GAAA,EAAwB;AAC3C,EAAA,MAAM,KAAA,GAAQ,GAAA,CACX,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,EAAA;AAChD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,EAAA;AAChC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,SAAA,CAAU,IAA+B,CAAA,IAAK,EAAA;AACnF,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACpB,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AACnC,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA,IAAK,QAAQ,CAAA,GAAI,CAAA,EAAA,EAAK,KAAK,CAAA,KAAA,CAAA,GAAU,EAAA,CAAA;AAC7D;AAEA,SAAS,YAAA,CAAa,KAAa,KAAA,EAAmD;AACpF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAEtC,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,KAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI;AACtE,IAAA,uBACEC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAS,GAAG,CAAA;AAAA,QACjB,SAAA,EAAU,sDAAA;AAAA,QACV,OAAA,EAAQ,MAAA;AAAA,QACR,GAAA,EAAK;AAAA;AAAA,KACP;AAAA,EAEJ;AACA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACrB,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAI,GAAA,CAAI,IAAI,EAAE,QAAA,CAAS,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,uBACEA,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,2CAAA;AAAA,QACV,IAAA,EAAM,IAAA;AAAA,QACN,GAAA,EAAI,YAAA;AAAA,QACJ,MAAA,EAAO,QAAA;AAAA,QAEN,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AAC1B,IAAA,IAAI,CAAC,OAAO,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG,OAAO,IAAA,CAAK,kBAAA,EAAmB;AAAA,EACpE;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAa,KAAA,EAAiC;AACrE,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,OAAO,KAAA;AAClE,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,YAAY,KAAK,CAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,aAAa,KAAgC,CAAA;AACnF,EAAA,OAAO,YAAA,CAAa,KAAK,KAAkC,CAAA;AAC7D;AAGO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAC5B,EAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,OAAA,IAAW,EAAC,EAAG,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,aAAA,CAAc,GAAA,EAAK,IAAI,CAAC,CAAA;AAG5E,EAAA,MAAM,aAAa,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,GAAO,KAAA,CAAM,WAAW,EAAC;AAE9D,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,UAAU,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC7C,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA;AAChD,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA;AAChD,IAAA,MAAM,EAAA,GAAK,EAAA,KAAO,EAAA,GAAK,aAAA,CAAc,MAAA,GAAS,EAAA;AAC9C,IAAA,MAAM,EAAA,GAAK,EAAA,KAAO,EAAA,GAAK,aAAA,CAAc,MAAA,GAAS,EAAA;AAC9C,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,IAAA,OAAO,WAAW,OAAA,CAAQ,CAAC,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAA2B,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,GAAA,EAAK,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,EAAE,CAAE,CAAA;AACrF,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpC,IAAA,MAAM,MAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,GAAA,CAAI,GAAG,IAAI,eAAA,CAAgB,GAAA,EAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACnE,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,WAAA,EAAY;AACtC;;;ACpMO,SAAS,iBAAiB,QAAA,EAA0B;AACzD,EAAA,OAAO,SAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,UAAA,CAAW,KAAK,GAAG,CAAA;AAC7D;AAEA,IAAMI,QAAAA,GAAU,iEAAA;AAOhB,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,EAAA,OACE,KAAA,KAAU,IAAA,IACV,KAAA,KAAU,WAAA,IACV,UAAU,MAAA,IACV,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IACpB,KAAA,CAAM,QAAA,CAAS,MAAM,KACrB,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IACrB,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IACtB,MAAM,QAAA,CAAS,OAAO,CAAA,IACtB,KAAA,KAAU,MAAA,IACV,KAAA,CAAM,QAAA,CAAS,SAAS,KACxB,KAAA,KAAU,WAAA;AAEd;AAGA,SAAS,iBAAiB,KAAA,EAAyB;AACjD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAYA,SAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/D;AAGA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,MAAM,SAAS,GAAA,CAAI,UAAA,CAAW,GAAA,EAAK,GAAG,EAAE,IAAA,EAAK;AAC7C,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AACxD;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,QAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,QAAQ,KAAA,GAAQ,IAAA;AACvD,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU,OAAO,OAAO,KAAK,CAAA;AAC/E,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAA,CACX,MAAA,CAAO,CAAC,SAAS,CAAC,gBAAA,CAAiB,IAAI,CAAC,EACxC,GAAA,CAAI,CAAC,IAAA,KAAS,WAAA,CAAY,IAAI,CAAC,CAAA;AAClC,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,KAAA,EAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,EAC/F;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,KAAA,MAAW,OAAO,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA,EAAG;AACrD,MAAA,IAAI,OAAO,MAAA,CAAO,GAAG,MAAM,QAAA,EAAU,OAAO,OAAO,GAAG,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAMO,SAAS,cAAc,IAAA,EAAiD;AAC7E,EAAA,MAAM,UAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA,EAAG;AACrD,IAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG;AACzB,IAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC7B,IAAA,IAAI,KAAA,KAAU,EAAA,IAAM,KAAA,KAAU,IAAA,IAAQ,UAAU,MAAA,EAAW;AAC3D,IAAA,MAAM,SAAA,GAAY,YAAY,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,QAAA,EAAK;AACrC,IAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,YAAY,GAAG,CAAA,EAAG,OAAO,SAAA,CAAU,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,UAAU,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,WAAW,CAAA;AAAA,EACrH;AACA,EAAA,OAAO,OAAA;AACT;AAaO,SAAS,uBAAA,CACd,QAAA,EACA,QAAA,EACA,IAAA,EAC0B;AAC1B,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI;AACF,IAAA,WAAA,GAAc,QAAA,GAAW,QAAA,EAAU,IAAA,IAAQ,EAAE,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB;AAEA,EAAA,MAAM,QAAQ,WAAA,EAAa,KAAA,EAAO,IAAA,EAAK,IAAK,iBAAiB,QAAQ,CAAA;AACrE,EAAA,MAAM,OAAA,GAAU,WAAA,EAAa,OAAA,EAAS,IAAA,EAAK,IAAK,IAAA;AAEhD,EAAA,IAAI,OAAA,GAAU,WAAA,EAAa,OAAA,IAAW,EAAC;AACvC,EAAA,MAAM,YAAA,GAAe,WAAA,EAAa,kBAAA,IAAsB,WAAA,EAAa,OAAA,KAAY,MAAA;AACjF,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,YAAA,EAAc;AACxC,IAAA,OAAA,GAAU,aAAA,CAAc,IAAA,IAAQ,EAAE,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AACnC;ACvGA,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,IAAA,GAAO,MAAK,EAAsD;AACjG,EAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,IAAA,uBACEJ,GAAAA,CAACK,MAAAA,EAAA,EAAO,QAAA,EAAQ,IAAA,EAAC,MAAY,OAAA,EAAQ,SAAA,EAClC,QAAA,EAAA,IAAA,KAAS,SAAA,mBAAYL,GAAAA,CAAC,YAAA,EAAA,EAAa,oBAAKD,IAAAA,CAAAO,UAAA,EAAE,QAAA,EAAA;AAAA,sBAAAN,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA,MAAE;AAAA,KAAA,EAAS,CAAA,EACtE,CAAA;AAAA,EAEJ;AACA,EAAA,uBACED,IAAAA;AAAA,IAACM,MAAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA;AAAA,wBAEEL,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,KAAA,CAAM,YAAA,EAAc,GAAA,EAAI,qBAAA,EAAsB,MAAA,EAAO,QAAA,EAAS;AAAA,OAAA;AAAA,MAEnG,IAAA;AAAA,MACA,OAAA,EAAS,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,MAE1C,QAAA,EAAA;AAAA,wBAAAA,IAAC,YAAA,EAAA,EAAa,CAAA;AAAA,QACb,IAAA,KAAS,YAAY,IAAA,GAAO;AAAA;AAAA;AAAA,GAC/B;AAEJ;AAGA,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,OAAA,EAAQ,EAAkD;AACzF,EAAMO,iBAAU,MAAM;AACpB,IAAA,MAAM,QAAQ,CAAC,KAAA,KAAyB,KAAA,CAAM,GAAA,KAAQ,YAAY,OAAA,EAAQ;AAC1E,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACER,KAAC,KAAA,EAAA,EAAI,YAAA,EAAW,QAAO,SAAA,EAAU,kDAAA,EAAmD,MAAK,QAAA,EACvF,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAACC,YAAAA,EAAA,EAAa,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,sBAChEF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAgC,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,MAAM,QAAA,EAAS,CAAA;AAAA,wBAC7ED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,MAAA;AAAA,UACN,MAAM,UAAA,GAAa,CAAA,MAAA,EAAM,YAAY,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,GAAK;AAAA,SAAA,EAC9D;AAAA,OAAA,EACF,CAAA;AAAA,sBACAC,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAc,CAAA;AAAA,sBAC9BA,GAAAA,CAACK,MAAAA,EAAA,EAAO,YAAA,EAAW,iBAAgB,OAAA,EAAS,OAAA,EAAS,IAAA,EAAK,SAAA,EAAU,SAAQ,OAAA,EAC1E,QAAA,kBAAAL,GAAAA,CAACQ,KAAAA,EAAA,EAAM,CAAA,EACT;AAAA,KAAA,EACF,CAAA;AAAA,oBACAR,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qGAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,OAAA,IAAW,gDAAA;AAAA,MACjB,KAAA,CAAM,oBAAoB,2DAAA,GAAyD;AAAA,KAAA,EACtF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAM,EAA6B;AAChE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUQ,gBAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,YAAA,GAAA,CAAgB,KAAA,CAAM,OAAA,IAAW,EAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5E,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAK,SAAA,EAAU,sGAAA,EACd,0BAAAA,GAAAA,CAACC,YAAAA,EAAA,EAAa,CAAA,EAChB,CAAA;AAAA,sBACAF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAgC,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,MAAM,QAAA,EAAS,CAAA;AAAA,wBAC7ED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,MAAA;AAAA,UACN,MAAM,UAAA,GAAa,CAAA,MAAA,EAAM,YAAY,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,GAAK;AAAA,SAAA,EAC9D;AAAA,OAAA,EACF,CAAA;AAAA,sBACAC,GAAAA,CAACK,MAAAA,EAAA,EAAO,YAAA,EAAW,SAAA,EAAU,SAAS,MAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAK,SAAA,EAAU,OAAA,EAAQ,SAChF,QAAA,kBAAAL,GAAAA,CAAC,iBAAc,CAAA,EACjB,CAAA;AAAA,sBACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAc,MAAK,SAAA,EAAU;AAAA,KAAA,EAC/C,CAAA;AAAA,IACC,+BACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,EAAAA;AAAA,UACT;AAAA,SACF;AAAA,QACA,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC3B,IAAA,EAAK,QAAA;AAAA,QAEL,QAAA,kBAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHACZ,QAAA,EAAA,YAAA,EACH;AAAA;AAAA,KACF,GACE,IAAA;AAAA,IACH,IAAA,mBAAOA,GAAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAc,SAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAA,GAAK;AAAA,GAAA,EAC5E,CAAA;AAEJ;AChGO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAM,EAA0B;AAC9D,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,MAAA,KAAW,MAAM,CAAA,CAAE,MAAA;AAE5D,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,8BAAA,EAA+B,CAAA;AAAA,MAAE,OAAA;AAAA,sBAE3DD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAK,GAAA;AAAA,QAAE,KAAA,CAAM;AAAA,OAAA,EAChB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBD,IAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,iCAAA,EACX,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,MAAA,KAAW,aAAA,mBACfC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mEAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA,EACX,CAAA,mBAEAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAW,IAAA;AAAA,UACX,OAAA,EAAS,KAAK,MAAA,KAAW,MAAA;AAAA,UACzB,SAAA,EAAU,8BAAA;AAAA,UACV,QAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBAEFA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWG,EAAAA;AAAA,YACT,SAAA;AAAA,YACA,IAAA,CAAK,WAAW,MAAA,IAAU,oCAAA;AAAA,YAC1B,IAAA,CAAK,WAAW,aAAA,IAAiB;AAAA,WACnC;AAAA,UAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR,KAAA,EAAA,EAtBmD,GAAG,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAuB3E,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACnCA,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAA4D;AAChG,EAAA,MAAM,OAAA,GAAA,CAAW,MAAA,IAAU,EAAC,EAAG,MAAA;AAAA,IAC7B,CAAC,UAAU,KAAA,CAAM,IAAA,KAAS,WAAW,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,IAAA,KAAS;AAAA,GACnF;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,uBACEH,IAAAM,QAAAA,EAAA,EACG,kBAAQ,GAAA,CAAI,CAAC,OAAO,KAAA,KAAU;AAC7B,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AACrC,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,MAAA,uBAAON,GAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAA,EAAmB,GAAK,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,MAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAwB,KAAA,EAAO,KAAA,CAAM,SAAlB,GAAyB,CAAA;AAAA,IACtD;AACA,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,eAAe,KAAK,CAAA;AAC9C,IAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,QAAA,EAAU,CAAA;AAAA,QACV,IAAA;AAAA,QACA,UAAA,EACE,OAAO,KAAA,CAAM,UAAA,EAAY,UAAU,QAAA,GAAY,KAAA,CAAM,UAAA,CAAW,KAAA,GAAmB,KAAA,CAAM;AAAA;AAAA,SANvD,GASxC,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAO,EAAuB;AACzD,EAAA,uBACED,IAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,QAAA,EACrB,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,mFAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBAC7BA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBACdA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,gEAAA,EAAiE;AAAA,KAAA,EAC9F,CAAA;AAAA,oBACAA,IAAC,gBAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8GAAA,EACZ,QAAA,EAAA,MAAA,EACH,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,gBAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM,GAAI,wBAAwB,gBAAA,EAAkB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAClG,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,MAAA,KAAW,SAAA,mBACfC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAiD,CAAA,mBAEjEA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,MAE9C;AAAA,KAAA,EACH,CAAA;AAAA,IACC,0BAAUA,GAAAA,CAAC,OAAE,SAAA,EAAU,sCAAA,EAAwC,mBAAQ,CAAA,GAAO,IAAA;AAAA,IAC9E,QAAQ,MAAA,GAAS,CAAA,mBAChBA,GAAAA,CAAC,QAAG,SAAA,EAAU,4BAAA,EACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gCAAA,EAAkC,iBAAO,KAAA,EAAM,CAAA;AAAA,sBAC7DA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBAAA,EAAuB,iBAAO,KAAA,EAAM;AAAA,KAAA,EAAA,EAFnB,MAAA,CAAO,KAGxC,CACD,CAAA,EACH,CAAA,GACE,IAAA;AAAA,IACH,IAAA,CAAK,yBAASA,GAAAA,CAAC,qBAAkB,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,GAAK;AAAA,GAAA,EAC9D,CAAA;AAEJ;AAaO,SAAS,iBAAA,CAAkB,EAAE,gBAAA,EAAkB,KAAA,EAAM,EAA2B;AACrF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUS,gBAAS,KAAK,CAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,WAAW,SAAS,CAAA;AACjE,EAAA,MAAM,SAAA,GACJ,uBAAA,CAAwB,gBAAA,EAAkB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,CAAE,KAAA,IAAS,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACrG,EAAA,MAAM,SAAA,GAAY,UAAA,GAAa,CAAA,EAAG,SAAS,CAAA,MAAA,CAAA,GAAM,MAAM,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,SAAA,CAAA;AAE5F,EAAA,uBACEV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,WAAA,EAAA,EAAY,YAAA,EAAc,OAAA,EAAS,IAAA,EAClC,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,wBACEA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oCAAA;AAAA,cACV,IAAA,EACE,UAAA,mBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gDAAA,EAAiD,CAAA,mBAEjEA,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA;AAAA,cAIf,QAAA,kBAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACd,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,gBACrC,MAAM,MAAA,GAAS,CAAA,mBACdD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kEAAA,EACb,QAAA,EAAA;AAAA,kBAAA,KAAA,CAAM,MAAA;AAAA,kBAAO;AAAA,iBAAA,EAChB,CAAA,GACE,IAAA;AAAA,gCACJC,IAAC,eAAA,EAAA,EAAgB,SAAA,EAAWG,GAAG,6BAAA,EAA+B,IAAA,IAAQ,YAAY,CAAA,EAAG;AAAA,eAAA,EACvF;AAAA;AAAA;AACF;AAAA,OAEJ;AAAA,sBACAH,IAAC,gBAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,IAAC,UAAA,EAAA,EAAW,gBAAA,EAAsD,QAAb,IAAA,CAAK,MAAoB,CAC/E,CAAA,EACH,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,MAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,IAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAsC,SAAS,IAAA,CAAK,MAAA,EAAA,EAAvC,GAAG,IAAA,CAAK,MAAM,SAAiC,CACtF;AAAA,GAAA,EACH,CAAA;AAEJ;ACpIO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM,GAAI,uBAAA;AAAA,IAClC,gBAAA;AAAA,IACA,QAAA,CAAS,SAAA;AAAA,IACR,QAAA,CAAS,aAAa;AAAC,GAC1B;AAEA,EAAA,uBACED,IAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,mBAAA,EACtB,QAAA,EAAA;AAAA,oBAAAA,KAAC,kBAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,MAAE;AAAA,KAAA,EAErD,CAAA;AAAA,oBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BACV,QAAA,EAAA,OAAA,oBACCD,IAAAA,CAAAO,QAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,MAAA,yBAAA;AAAA,sBACuBN,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6BAAA,EAA+B,QAAA,EAAA,KAAA,CAAM,aAAY,EAAE,CAAA;AAAA,MAAO;AAAA,KAAA,EAEnG,CAAA,EAEJ,CAAA;AAAA,IACC,QAAQ,MAAA,GAAS,CAAA,oBAChBA,GAAAA,CAAC,QAAG,SAAA,EAAU,gDAAA,EACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gCAAA,EAAkC,iBAAO,KAAA,EAAM,CAAA;AAAA,sBAC7DA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EAAmD,iBAAO,KAAA,EAAM;AAAA,KAAA,EAAA,EAF/C,MAAA,CAAO,KAGxC,CACD,CAAA,EACH,CAAA;AAAA,oBAEFD,KAAC,mBAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAACK,MAAAA,EAAA,EAAO,QAAA,EAAU,SAAA,EAAW,SAAS,MAAM,SAAA,CAAU,QAAA,CAAS,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,WAAU,QAAA,EAAA,SAAA,EAEvG,CAAA;AAAA,sBACAN,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAACM,MAAAA,EAAA,EAAO,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,MAAM,SAAA,CAAU,QAAA,CAAS,EAAA,EAAI,IAAI,CAAA,EAAG,MAAK,IAAA,EAC5E,QAAA,EAAA;AAAA,UAAA,SAAA,mBAAYL,GAAAA,CAACU,OAAAA,EAAA,EAAQ,CAAA,GAAK,IAAA;AAAA,UAAK;AAAA,SAAA,EAElC,CAAA;AAAA,wBACAX,KAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,wBACEA,GAAAA,CAACK,MAAAA,EAAA,EAAO,cAAW,sBAAA,EAAuB,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,WAAU,OAAA,EAAQ,SAAA,EACpF,0BAAAL,GAAAA,CAACW,eAAAA,EAAA,EAAgB,CAAA,EACnB;AAAA;AAAA,WAEJ;AAAA,0BACAX,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAM,OACf,QAAA,kBAAAD,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AACb,gBAAA,eAAA,CAAgB,SAAS,SAAS,CAAA;AAClC,gBAAA,SAAA,CAAU,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,cAC7B,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAC,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,gBAAE,uBAAA;AAAA,gBACD,KAAA;AAAA,gBAAM;AAAA;AAAA;AAAA,WACzB,EACF;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC7CO,SAAS,UAAA,CAAW;AAAA,EACzB,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUY,gBAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,gBAA6B,MAAM,CAAA;AACjE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAiB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,gBAAS,KAAK,CAAA;AACpD,EAAA,MAAM,SAAA,GAAkBA,cAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,WAAW,IAAA,IAAQ,WAAA;AAC9D,EAAA,MAAM,aAAA,GAAgB,kBAAkB,MAAM,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe;AAAA,IACxC,4BAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAA,GAAiBA,MAAA,CAAA,WAAA;AAAA,IACrB,CAAC,QAAA,KAAqB;AACpB,MAAA,MAAM,WAAmB,EAAC;AAC1B,MAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,MAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,EAAQ,IAAI,CAAA;AACvC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,SAAA,GAAY,KAAA;AACZ,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AACA,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,CAAC,YAAY,CAAC,GAAG,OAAA,EAAS,GAAG,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACnF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,UAAA,GAAmBA,MAAA,CAAA,WAAA,CAAY,CAAC,KAAA,KAAkB;AACtD,IAAA,QAAA,CAAS,CAAC,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAqBA,MAAA,CAAA,WAAA;AAAA,IACzB,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,MAAA,GAAS,KAAA;AACf,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,KAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,CAAC,MAAM,KAAK;AAAA,GACd;AAGA,EAAA,MAAM,WAAA,GAAoBA,MAAA,CAAA,WAAA;AAAA,IACxB,CAAC,KAAA,KAA2B;AAC1B,MAAA,IAAI,CAAC,iBAAiB,CAAC,KAAA,CAAM,cAAc,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AACrE,MAAA,SAAA,CAAU,OAAA,IAAW,CAAA;AACrB,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,aAAa;AAAA,GAChB;AACA,EAAA,MAAM,WAAA,GAAoBA,MAAA,CAAA,WAAA,CAAY,CAAC,KAAA,KAA2B;AAChE,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,EAAc,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AACnD,IAAA,SAAA,CAAU,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,UAAU,CAAC,CAAA;AACrD,IAAA,IAAI,SAAA,CAAU,OAAA,KAAY,CAAA,EAAG,WAAA,CAAY,KAAK,CAAA;AAAA,EAChD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,MAAA,GAAeA,MAAA,CAAA,WAAA;AAAA,IACnB,CAAC,KAAA,KAA2B;AAC1B,MAAA,IAAI,CAAC,aAAA,EAAe;AACpB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,OAAA,GAAU,CAAA;AACpB,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,MAAM,YAAA,EAAc,KAAA,IAAS,EAAE,CAAA;AAC1D,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,QAAA,CAAS,OAAO,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,UAAU,aAAa;AAAA,GAC1B;AAEA,EAAA,MAAM,WAAA,GAAoBA,mBAAY,MAAM;AAC1C,IAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,IAAA,KAAK,KAAK,oBAAA,EAAqB;AAAA,EACjC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,mBAAA,KAAwB,IAAA;AAE1D,EAAA,uBACEb,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWI,EAAAA;AAAA,QACT,8EAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,WAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAY,aAAA,GAAgB,CAAC,KAAA,KAAU,KAAA,CAAM,gBAAe,GAAI,MAAA;AAAA,MAChE,MAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA,IAAY,IAAA,KAAS,MAAA,mBACpBH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6HAAA,EACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6GAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,0BACjDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAsB,QAAA,EAAA,2BAAA,EAAyB,CAAA;AAAA,0BAC9DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,eAAA,CAAgB,MAAM,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,QAAK,CAAA,EAAE;AAAA,SAAA,EACjG,GACF,CAAA,GACE,IAAA;AAAA,wBAEJD,KAAC,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,4BAClBD,KAAC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,cACxD,MAAA,CAAO,0BACNA,GAAAA,CAAC,SAAI,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,MAAA,CAAO,OAAA,EAAQ,CAAA,GACtE;AAAA,aAAA,EACN;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAD,KAAC,iBAAA,EAAA,EACD,QAAA,EAAA;AAAA,4BAAAA,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACC,wBACEA,GAAAA;AAAA,oBAACK,MAAAA;AAAA,oBAAA;AAAA,sBACC,YAAA,EAAW,sBAAA;AAAA,sBACX,SAAS,IAAA,KAAS,SAAA,GAAY,MAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,WAAA;AAAA,sBACtD,IAAA,EAAK,SAAA;AAAA,sBACL,OAAA,EAAQ,OAAA;AAAA,sBAER,QAAA,kBAAAL,IAAC,WAAA,EAAA,EAAY;AAAA;AAAA;AACf;AAAA,eAEJ;AAAA,8BACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAA,SAAA,EAAO;AAAA,aAAA,EACzB,CAAA;AAAA,4BAEAD,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACC,wBACEA,GAAAA;AAAA,oBAACK,MAAAA;AAAA,oBAAA;AAAA,sBACC,YAAA,EAAW,UAAA;AAAA,sBACX,SAAS,MAAM;AACb,wBAAA,IAAA,CAAK,OAAA,EAAQ;AACb,wBAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,sBAChB,CAAA;AAAA,sBACA,IAAA,EAAK,SAAA;AAAA,sBACL,OAAA,EAAQ,OAAA;AAAA,sBAER,QAAA,kBAAAL,IAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AACjB;AAAA,eAEJ;AAAA,8BACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAA,UAAA,EAAQ;AAAA,aAAA,EAC1B,CAAA;AAAA,YAEC,kBAAA,mBACCD,IAAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,cAAA;AAAA,gBAAA;AAAA,kBACC,wBACEA,GAAAA;AAAA,oBAACK,MAAAA;AAAA,oBAAA;AAAA,sBACC,YAAA,EAAY,YAAY,iBAAA,GAAoB,kBAAA;AAAA,sBAC5C,OAAA,EAAS,iBAAA;AAAA,sBACT,IAAA,EAAK,SAAA;AAAA,sBACL,OAAA,EAAQ,OAAA;AAAA,sBAEP,QAAA,EAAA,SAAA,mBAAYL,GAAAA,CAAC,aAAA,EAAA,EAAc,oBAAKA,GAAAA,CAACa,eAAA,EAAc;AAAA;AAAA;AAClD;AAAA,eAEJ;AAAA,8BACAb,GAAAA,CAAC,cAAA,EAAA,EAAgB,QAAA,EAAA,SAAA,GAAY,oBAAoB,YAAA,EAAa;AAAA,aAAA,EAChE,CAAA,GACE,IAAA;AAAA,4BAEJA,GAAAA,CAACK,MAAAA,EAAA,EAAO,YAAA,EAAW,SAAQ,OAAA,EAAS,OAAA,EAAS,IAAA,EAAK,SAAA,EAAU,SAAQ,OAAA,EAClE,QAAA,kBAAAL,GAAAA,CAACQ,KAAAA,EAAA,EAAM,CAAA,EACT;AAAA,WAAA,EACA;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,IAAA,KAAS,4BACRR,GAAAA,CAAC,SAAI,SAAA,EAAU,wDAAA,EACZ,QAAA,EAAA,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,CAAA,mBAC7BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EAAgD,QAAA,EAAA,uBAAA,EAE7D,CAAA,GAEA,KAAK,aAAA,CAAc,GAAA,CAAI,CAAC,YAAA,qBACtBD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,0DAAA;AAAA,YAGV,QAAA,EAAA;AAAA,8BAAAA,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,mDAAA;AAAA,kBACV,SAAS,MAAM;AACb,oBAAA,KAAK,IAAA,CAAK,gBAAA,CAAiB,YAAA,CAAa,EAAE,CAAA;AAC1C,oBAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,kBAChB,CAAA;AAAA,kBACA,IAAA,EAAK,QAAA;AAAA,kBAEL,QAAA,EAAA;AAAA,oCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,YAAA,CAAa,SAAS,UAAA,EAAW,CAAA;AAAA,oCAC3EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA,IAAI,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,CAAE,cAAA,EAAe,EACpD;AAAA;AAAA;AAAA,eACF;AAAA,8BACAA,GAAAA;AAAA,gBAACK,MAAAA;AAAA,gBAAA;AAAA,kBACC,YAAA,EAAW,qBAAA;AAAA,kBACX,SAAA,EAAU,sDAAA;AAAA,kBACV,SAAS,MAAM,KAAK,IAAA,CAAK,kBAAA,CAAmB,aAAa,EAAE,CAAA;AAAA,kBAC3D,IAAA,EAAK,SAAA;AAAA,kBACL,OAAA,EAAQ,mBAAA;AAAA,kBAER,QAAA,kBAAAL,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA;AACd;AAAA,WAAA;AAAA,UAvBK,YAAA,CAAa;AAAA,SAyBrB,CAAA,EAEL,CAAA,mBAEAD,KAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,IAAC,YAAA,EAAA,EAAa,SAAA,EAAWG,EAAAA,CAAG,SAAA,IAAa,0BAA0B,CAAA,EAChE,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,KAAK,CAAC,IAAA,CAAK,OAAA,mBACnCJ,KAAC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,4BACpBD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAA,KAAC,mBAAA,EAAA,EAAoB,QAAA,EAAA;AAAA,gBAAA,UAAA;AAAA,gBAAS,SAAA;AAAA,gBAAU;AAAA,eAAA,EAAC,CAAA;AAAA,8BACzCC,GAAAA,CAAC,yBAAA,EAAA,EAA0B,SAAA,EAAU,QAAO,QAAA,EAAA,oGAAA,EAG5C;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,eAAA,EAAA,EACE,QAAA,EAAA,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,UAAA,EAAY,KAAA,qBACxCA,GAAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,KAAA;AAAA,gBAEA,OAAA,EAAS,MAAM,YAAA,CAAa,UAAU,CAAA;AAAA,gBAErC,QAAA,EAAA;AAAA,eAAA;AAAA,cAHI;AAAA,aAKR,CAAA,EACH;AAAA,WAAA,EACF,CAAA,mBAEAD,IAAAA,CAAAO,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA,CAAE,GAAA;AAAA,cAAI,CAAC,IAAA,KACjC,IAAA,CAAK,IAAA,KAAS,eAAA,mBACZN,GAAAA,CAACc,WAAAA,EAAA,EAAY,IAAA,EAAK,WAAA,EAChB,QAAA,kBAAAd,IAAC,iBAAA,EAAA,EAAkB,gBAAA,EAAkB,MAAA,CAAO,gBAAA,EAAkB,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA,EAAA,EADhD,KAAK,GAExC,CAAA,mBAEAA,GAAAA,CAAC,WAAA,EAAA,EAA2B,OAAA,EAAS,IAAA,CAAK,OAAA,EAAA,EAAxB,KAAK,GAA4B;AAAA,aAEvD;AAAA,YACC,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,CAAC,6BAC1BA,GAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,QAAA;AAAA,gBACA,kBAAkB,MAAA,CAAO,gBAAA;AAAA,gBAEzB,eAAA;AAAA,gBACA,SAAA,EAAW,CAAC,MAAA,EAAQ,OAAA,KAAY,KAAK,IAAA,CAAK,eAAA,CAAgB,QAAQ,OAAO,CAAA;AAAA,gBACzE,SAAA,EAAW,IAAA,CAAK,mBAAA,KAAwB,QAAA,CAAS;AAAA,eAAA;AAAA,cAH5C,QAAA,CAAS;AAAA,aAKjB,CAAA;AAAA,YACA,IAAA,mBAAOA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA,GAAK;AAAA,WAAA,EAClC,CAAA,EAEJ,CAAA;AAAA,UAEC,KAAK,KAAA,IAAS,WAAA,mBACbD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mHAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,IAAA,CAAK,SAAS,WAAA,EAAY,CAAA;AAAA,4BAC9DA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qCAAA;AAAA,gBACV,SAAS,MAAM;AACb,kBAAA,IAAA,CAAK,UAAA,EAAW;AAChB,kBAAA,cAAA,CAAe,IAAI,CAAA;AAAA,gBACrB,CAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACN,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA,GACE,IAAA;AAAA,0BAEJA,GAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,eAAA,EAAiB,gBAAgB,MAAM,CAAA;AAAA,cACvC,SAAA,EAAWG,EAAAA,CAAG,SAAA,IAAa,0BAA0B,CAAA;AAAA,cACrD,QAAA,EAAU,IAAA,IAAQ,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA;AAAA,cACjD,KAAA;AAAA,cACA,WAAA,EAAa,gBAAgB,QAAA,GAAW,MAAA;AAAA,cACxC,YAAA,EAAc,UAAA;AAAA,cACd,QAAA,EAAU,YAAA;AAAA,cACV,aAAA,EAAe,QAAA;AAAA,cACf,aACE,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA,GAC3B,mDAAA,GACA,OAAO,SAAS,CAAA,MAAA,CAAA;AAAA,cAEtB,KAAA,EAAO;AAAA;AAAA;AACT,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACnWA,IAAM,oBAAA,GAAuB,aAAA;AAE7B,IAAI,iBAAA,GAAoB,CAAA;AAExB,SAAS,0BAAA,CAA2B,MAAc,KAAA,EAA8B;AAC9E,EAAA,iBAAA,IAAqB,CAAA;AACrB,EAAA,MAAM,eAAe,KAAA,IAAS,IAAI,GAAA,CAAI,CAAC,MAAM,KAAA,MAAW;AAAA,IACtD,IAAI,CAAA,EAAG,oBAAoB,CAAA,IAAA,EAAO,iBAAiB,IAAI,KAAK,CAAA,CAAA;AAAA,IAC5D,UAAU,IAAA,CAAK,IAAA;AAAA,IACf,MAAA,EAAQ,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,WAAA,EAAY,IAAK,MAAA;AAAA,IACrD,YAAY,IAAA,CAAK;AAAA,GACnB,CAAE,CAAA;AACF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,CAAA,EAAG,oBAAoB,CAAA,EAAG,iBAAiB,CAAA,CAAA;AAAA,IAC/C,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACnC,GAAI,WAAA,CAAY,MAAA,GAAS,EAAE,WAAA,KAAgB;AAAC,GAC9C;AACF;AA2BO,SAAS,aAAa,MAAA,EAAwD;AACnF,EAAA,MAAM,MAAA,GAAe,eAAQ,MAAM,IAAI,eAAe,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEvE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,gBAAmC,IAAI,CAAA;AAC/E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAC9E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,MAAA,CAAA,QAAA,CAAgC,EAAE,CAAA;AAClF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAU,MAAA,CAAA,QAAA,CAAyB,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAU,MAAA,CAAA,QAAA,CAA4B,EAAE,CAAA;AACpF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAU,gBAAwB,IAAI,CAAA;AACxF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAE5D,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAA,CACG,SAAA,EAAU,CACV,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,IAAI,CAAA;AAAA,IACnC,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,aAAA,GAAsB,MAAA,CAAA,WAAA,CAAY,CAAC,GAAA,KAAiB;AACxD,IAAA,MAAM,OAAA,GACJ,GAAA,YAAe,aAAA,GACX,GAAA,CAAI,OAAA,GACJ,yCAAA;AACN,IAAA,QAAA,CAAS,OAAO,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAsB,MAAA,CAAA,WAAA;AAAA,IAC1B,CAAC,QAAA,KAMK;AACJ,MAAA,IAAI,SAAS,MAAA,KAAW,OAAA,IAAW,CAAC,QAAA,CAAS,UAAU,MAAA,EAAQ;AAC7D,QAAA,QAAA,CAAS,QAAA,CAAS,WAAW,iCAAiC,CAAA;AAC9D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAA,CAAS,eAAA,EAAiB,iBAAA,CAAkB,QAAA,CAAS,eAAe,CAAA;AACxE,MAAA,IAAI,QAAA,CAAS,UAAU,MAAA,EAAQ;AAC7B,QAAA,WAAA,CAAY,CAAC,OAAA,KAAY;AAGvB,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,OAAA,KAAY,CAAC,OAAA,CAAQ,EAAA,CAAG,UAAA,CAAW,oBAAoB,CAAC,CAAA;AACxF,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAE,CAAC,CAAA;AACzD,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAU,MAAA,CAAO,CAAC,OAAA,KAAY,CAAC,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAC,KAAK,EAAC;AAChF,UAAA,OAAO,CAAC,GAAG,OAAA,EAAS,GAAG,KAAK,CAAA;AAAA,QAC9B,CAAC,CAAA;AAAA,MACH;AACA,MAAA,mBAAA,CAAoB,QAAA,CAAS,iBAAA,IAAqB,EAAE,CAAA;AACpD,MAAA,IAAI,QAAA,CAAS,MAAA,KAAW,OAAA,IAAW,QAAA,CAAS,OAAA,EAAS;AACnD,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,IAAA,GAAa,MAAA,CAAA,WAAA;AAAA,IACjB,OAAO,MAAc,KAAA,KAAmB;AACtC,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,MAAU,EAAE,KAAA,IAAS,MAAM,MAAA,CAAA,EAAS;AAC9C,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AAGb,MAAA,WAAA,CAAY,CAAC,YAAY,CAAC,GAAG,SAAS,0BAAA,CAA2B,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AAC9E,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,MAAA,CAAO,WAAA,CAAY,IAAA,EAAM,gBAAgB,KAAK,CAAA;AACrE,QAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,MACxB,SAAS,GAAA,EAAK;AACZ,QAAA,aAAA,CAAc,GAAG,CAAA;AAAA,MACnB,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,eAAe,OAAO;AAAA,GAChE;AAEA,EAAA,MAAM,eAAA,GAAwB,MAAA,CAAA,WAAA;AAAA,IAC5B,OAAO,QAAgB,OAAA,KAAqB;AAC1C,MAAA,IAAI,mBAAA,EAAqB;AACzB,MAAA,sBAAA,CAAuB,MAAM,CAAA;AAC7B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,eAAA,CAAgB,QAAQ,OAAO,CAAA;AAC7D,QAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,MACxB,SAAS,GAAA,EAAK;AACZ,QAAA,aAAA,CAAc,GAAG,CAAA;AAAA,MACnB,CAAA,SAAE;AACA,QAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,MAAA,EAAQ,aAAA,EAAe,mBAAmB;AAAA,GAC5D;AAEA,EAAA,MAAM,OAAA,GAAgB,mBAAY,MAAM;AACtC,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,oBAAA,GAA6B,mBAAY,YAAY;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAA,EAAe,IAAA,EAAK,GAAI,MAAM,OAAO,iBAAA,EAAkB;AAC/D,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,aAAA,CAAc,GAAG,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,MAAM,gBAAA,GAAyB,MAAA,CAAA,WAAA;AAAA,IAC7B,OAAO,EAAA,KAAe;AACpB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,eAAA,CAAgB,EAAE,CAAA;AAC/C,QAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,QAAA,WAAA,CAAY,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA;AAClC,QAAA,mBAAA,CAAoB,OAAA,CAAQ,iBAAA,IAAqB,EAAE,CAAA;AAAA,MACrD,SAAS,GAAA,EAAK;AACZ,QAAA,aAAA,CAAc,GAAG,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,aAAa;AAAA,GACxB;AAEA,EAAA,MAAM,kBAAA,GAA2B,MAAA,CAAA,WAAA;AAAA,IAC/B,OAAO,EAAA,KAAe;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,mBAAmB,EAAE,CAAA;AAClC,QAAA,gBAAA,CAAiB,CAAC,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAChE,QAAA,IAAI,cAAA,KAAmB,IAAI,OAAA,EAAQ;AAAA,MACrC,SAAS,GAAA,EAAK;AACZ,QAAA,aAAA,CAAc,GAAG,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,cAAA,EAAgB,aAAA,EAAe,OAAO;AAAA,GACjD;AAEA,EAAA,MAAM,aAAmB,MAAA,CAAA,WAAA,CAAY,MAAM,SAAS,IAAI,CAAA,EAAG,EAAE,CAAA;AAE7D,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,IACA,eAAA;AAAA,IACA,mBAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AC/NA,IAAM,cAAA,GAAiB,0BAAA;AAEvB,SAAS,WAAW,QAAA,EAA0B;AAC5C,EAAA,OAAO,CAAA,EAAG,cAAc,CAAA,EAAG,QAAA,IAAY,SAAS,CAAA,CAAA;AAClD;AAEA,SAAS,WAAW,QAAA,EAA+B;AACjD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,2BAAW,GAAA,EAAI;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAC,CAAA;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK,uBAAO,IAAI,GAAA,EAAI;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,IAAI,IAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,CAAC,CAAA,uBAAQ,GAAA,EAAI;AAAA,EAC7G,CAAA,CAAA,MAAQ;AACN,IAAA,2BAAW,GAAA,EAAI;AAAA,EACjB;AACF;AAgBO,SAAS,iBAAiB,QAAA,EAAsC;AACrE,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAUY,gBAAsB,sBAAM,IAAI,KAAK,CAAA;AAG3E,EAAMA,iBAAU,MAAM;AACpB,IAAA,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAgBA,MAAA,CAAA,WAAA;AAAA,IACpB,CAAC,IAAA,KAAsB;AACrB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;AAAA,MAC7E,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAAA,GAAyBA,MAAA,CAAA,WAAA,CAAY,CAAC,QAAA,KAAqB,QAAA,CAAS,IAAI,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEnG,EAAA,MAAM,gBAAA,GAAyBA,MAAA,CAAA,WAAA;AAAA,IAC7B,CAAC,QAAA,KAAqB;AACpB,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,MAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,GACpB;AAEA,EAAA,MAAM,kBAAA,GAA2BA,MAAA,CAAA,WAAA;AAAA,IAC/B,CAAC,QAAA,KAAqB;AACpB,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,MAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AACpB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,GACpB;AAEA,EAAA,OAAO,EAAE,kBAAA,EAAoB,gBAAA,EAAkB,gBAAA,EAAiB;AAClE;ACjDO,SAAS,YAAY,EAAE,MAAA,EAAQ,YAAA,EAAc,IAAA,EAAM,gBAAe,EAAqB;AAC5F,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUC,gBAAS,KAAK,CAAA;AACpE,EAAA,MAAM,OAAO,cAAA,IAAkB,gBAAA;AAC/B,EAAA,MAAM,OAAA,GAAgBA,MAAA,CAAA,WAAA;AAAA,IACpB,CAAC,IAAA,KAAkB;AACjB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,gBAAS,KAAK,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,cAAc,oBAAA,EAAsB;AAAA,IACpD,eAAA,EAAiB,IAAA;AAAA,IACjB,GAAA,EAAK;AAAA,GACN,CAAA;AACD,EAAA,MAAM,UAAA,GAAa,CAAC,SAAA,IAAa,SAAA;AAEjC,EAAA,MAAM,IAAA,GAAO,aAAa,MAAM,CAAA;AAChC,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,MAAA,CAAO,QAAQ,CAAA;AAKtD,EAAA,MAAM,EAAE,gBAAA,EAAkB,eAAA,EAAiB,mBAAA,EAAoB,GAAI,IAAA;AACnE,EAAA,MAAM,EAAE,kBAAiB,GAAI,aAAA;AAC7B,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,QAAQ,mBAAA,EAAqB;AAClC,IAAA,MAAM,MAAA,GAAS,iBAAiB,IAAA,CAAK,CAAC,aAAa,gBAAA,CAAiB,QAAA,CAAS,SAAS,CAAC,CAAA;AACvF,IAAA,IAAI,MAAA,EAAQ,KAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,EAClD,GAAG,CAAC,IAAA,EAAM,kBAAkB,mBAAA,EAAqB,gBAAA,EAAkB,eAAe,CAAC,CAAA;AAKnF,EAAA,MAAM,aAAA,GAAsBA,MAAA,CAAA,MAAA,iBAAoB,IAAI,GAAA,EAAK,CAAA;AACzD,EAAA,MAAM,EAAE,gBAAe,GAAI,MAAA;AAC3B,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,IAAU,CAAC,QAAQ,QAAA,IAAY,OAAA,CAAQ,gBAAgB,SAAA,EAAW;AACvF,MAAA,IAAI,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,EAAG;AAC3C,MAAA,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AACrD,MAAA,cAAA,CAAe,EAAE,SAAA,EAAW,IAAA,EAAM,UAAU,OAAA,CAAQ,SAAA,IAAa,IAAI,CAAA;AAAA,IACvE;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,CAAK,QAAA,EAAU,cAAc,CAAC,CAAA;AAGlC,EAAA,MAAM,sBAAA,GAA+BA,cAAsB,IAAI,CAAA;AAC/D,EAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AACrB,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,QAAQ,UAAA,IAAc,CAAC,OAAO,QAAA,IAAY,CAAC,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ;AACtE,IAAA,MAAM,eAAe,QAAA,CAAS,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,SAAS,MAAM,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AACnD,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,KAAO,uBAAuB,OAAA,EAAS;AAC7D,IAAA,sBAAA,CAAuB,UAAU,MAAA,CAAO,EAAA;AAExC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,SAAA,IAAa,EAAE,CAAC,CAAA;AACvF,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA;AAC/C,IAAA,MAAM,OAAO,OAAA,CAAQ,UAAA,GAAa,QAAQ,UAAA,CAAW,IAAI,IAAI,OAAA,CAAQ,KAAA;AACrE,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAAA,EAChC,GAAG,CAAC,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,IAAI,CAAC,CAAA;AAEvC,EAAA,MAAM,UAAA,GAAmBA,mBAAY,MAAM;AACzC,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACEjB,KAAC,eAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,CAAC,IAAA,IAAQ,CAAC,MAAA,CAAO,UAAA,EAAY,+BAC5BC,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,gBAAA;AAAA,QACX,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC3B,QAAA,EAAU,MAAA,CAAO,UAAA,EAAY,QAAA,IAAY,cAAA;AAAA,QAEzC,QAAA,kBAAAA,IAAC,YAAA,EAAA,EAAa;AAAA;AAAA,KAChB,GACE,IAAA;AAAA,IAEH,IAAA,GACC,6BACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,MAAA;AAAA,QACX,SAAA,EAAU,gDAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QAEL,QAAA,kBAAAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,SAAA;AAAA,YACA,kBAAA,EAAoB,SAAA;AAAA,YACpB,IAAA;AAAA,YACA,SAAA,EAAU,QAAA;AAAA,YACV,MAAA;AAAA,YACA,iBAAiB,aAAA,CAAc,gBAAA;AAAA,YAC/B,OAAA,EAAS,UAAA;AAAA,YACT,mBAAmB,MAAM,YAAA,CAAa,CAAC,KAAA,KAAU,CAAC,KAAK;AAAA;AAAA;AACzD;AAAA,wBAGFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,EAAAA;AAAA,UACT,sFAAA;AAAA,UAAA,CACC,MAAA,CAAO,UAAA,EAAY,QAAA,IAAY,cAAA,MAAoB,gBAChD,uCAAA,GACA;AAAA,SACN;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,CAAA,IAAA,EAAO,MAAA,CAAO,UAAA,EAAY,eAAe,GAAG,CAAA,wBAAA,CAAA;AAAA,UACpD,KAAA,EAAO,CAAA,IAAA,EAAO,MAAA,CAAO,UAAA,EAAY,cAAc,GAAG,CAAA,uBAAA;AAAA,SACpD;AAAA,QAEA,QAAA,kBAAAH,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,KAAA;AAAA,YACX,kBAAA,EAAkB,IAAA;AAAA,YAClB,IAAA;AAAA,YACA,SAAA,EAAU,QAAA;AAAA,YACV,MAAA;AAAA,YACA,iBAAiB,aAAA,CAAc,gBAAA;AAAA,YAC/B,OAAA,EAAS,UAAA;AAAA,YACT,iBAAA,EAAmB,MAAM,YAAA,CAAa,IAAI;AAAA;AAAA;AAC5C;AAAA,KACF,GAEA;AAAA,GAAA,EACN,CAAA;AAEJ;AAGA,SAAS,iBAAA,CACP,UACA,WAAA,EACyB;AACzB,EAAA,IAAI,CAAC,WAAA,CAAY,YAAA,EAAc,OAAO,EAAC;AACvC,EAAA,KAAA,IAAS,QAAQ,QAAA,CAAS,MAAA,GAAS,GAAG,KAAA,IAAS,CAAA,EAAG,SAAS,CAAA,EAAG;AAC5D,IAAA,MAAM,OAAA,GAAU,SAAS,KAAK,CAAA;AAC9B,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,WAAA,IAAe,CAAC,QAAQ,UAAA,EAAY;AACzD,IAAA,MAAM,KAAA,GAAQ,QAAQ,UAAA,CAAW,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,WAAA,CAAY,YAAY,CAAA;AACpF,IAAA,IAAI,KAAA,EAAO,OAAO,KAAA,CAAM,SAAA,IAAa,EAAC;AAAA,EACxC;AACA,EAAA,OAAO,EAAC;AACV;;;AC1KO,SAAS,kBAAkB,MAAA,EAAkC;AAClE,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import type {\n AgentConfig,\n AgentPublicConfig,\n ChatResponse,\n ConversationSummary,\n} from \"./types\";\n\nexport class AgentApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"AgentApiError\";\n this.status = status;\n }\n}\n\n/**\n * Thin fetch client for the Country Club Agent Mode API.\n *\n * Every request carries the agent client_id (query param — also used by the\n * backend's per-agent CORS middleware, including on preflights) and the\n * logged-in user's bearer token.\n */\nexport class AgentApiClient {\n private config: AgentConfig;\n\n constructor(config: AgentConfig) {\n this.config = config;\n }\n\n private async request<T>(\n path: string,\n options: { method?: string; body?: unknown } = {},\n ): Promise<T> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n // FormData bodies (file uploads) must not carry a manual Content-Type — the\n // browser sets the multipart boundary itself.\n const isFormData = typeof FormData !== \"undefined\" && options.body instanceof FormData;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"X-Agent-Client-Id\": this.config.clientId,\n };\n if (!isFormData) headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(url, {\n body:\n options.body === undefined\n ? undefined\n : isFormData\n ? (options.body as FormData)\n : JSON.stringify(options.body),\n headers,\n method: options.method ?? \"GET\",\n });\n\n if (response.status === 204) return undefined as T;\n\n let payload: Record<string, unknown> = {};\n try {\n payload = (await response.json()) as Record<string, unknown>;\n } catch {\n // Non-JSON error body — fall through to the status check.\n }\n\n if (!response.ok) {\n const detail =\n (payload.detail as string) ||\n (payload.message as string) ||\n `Request failed (${response.status})`;\n throw new AgentApiError(detail, response.status);\n }\n return payload as T;\n }\n\n getConfig(): Promise<AgentPublicConfig> {\n return this.request<AgentPublicConfig>(\"/agent-mode/config/\");\n }\n\n sendMessage(\n message: string,\n conversationId?: string | null,\n files?: File[],\n ): Promise<ChatResponse> {\n if (files && files.length > 0) {\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"message\", message);\n if (conversationId) form.append(\"conversation_id\", conversationId);\n for (const file of files) form.append(\"files\", file, file.name);\n return this.request<ChatResponse>(\"/agent-mode/chat/\", { body: form, method: \"POST\" });\n }\n return this.request<ChatResponse>(\"/agent-mode/chat/\", {\n body: {\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n },\n method: \"POST\",\n });\n }\n\n resolveApproval(callId: string, approve: boolean): Promise<ChatResponse> {\n return this.request<ChatResponse>(`/agent-mode/approvals/${callId}/resolve/`, {\n body: { approve, client_id: this.config.clientId },\n method: \"POST\",\n });\n }\n\n listConversations(): Promise<{ conversations: ConversationSummary[] }> {\n return this.request(\"/agent-mode/conversations/\");\n }\n\n getConversation(conversationId: string): Promise<{\n conversation: ConversationSummary;\n messages: ChatResponse[\"messages\"];\n pending_approvals: ChatResponse[\"pending_approvals\"];\n }> {\n return this.request(`/agent-mode/conversations/${conversationId}/`);\n }\n\n deleteConversation(conversationId: string): Promise<void> {\n return this.request(`/agent-mode/conversations/${conversationId}/`, {\n method: \"DELETE\",\n });\n }\n}\n","import type { AgentConfig } from \"./types\";\n\n/** Text formats the model can actually read. Images are never accepted. */\nexport const DEFAULT_ACCEPT = [\".txt\", \".md\", \".markdown\", \".csv\", \".tsv\", \".log\", \".docx\"];\n\nexport const DEFAULT_MAX_SIZE_MB = 5;\n\nexport function fileUploadEnabled(config: AgentConfig): boolean {\n return config.fileUpload?.enabled !== false;\n}\n\nexport function acceptedExtensions(config: AgentConfig): string[] {\n const accept = config.fileUpload?.accept;\n return accept && accept.length > 0 ? accept.map((ext) => ext.toLowerCase()) : DEFAULT_ACCEPT;\n}\n\nexport function maxSizeMb(config: AgentConfig): number {\n return config.fileUpload?.maxSizeMb ?? DEFAULT_MAX_SIZE_MB;\n}\n\n/** The `accept` attribute value for a native file input. */\nexport function acceptAttribute(config: AgentConfig): string {\n return acceptedExtensions(config).join(\",\");\n}\n\nfunction extensionOf(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot >= 0 ? filename.slice(dot).toLowerCase() : \"\";\n}\n\n/** Validate a picked/dropped file against the accepted formats and size. */\nexport function validateFile(config: AgentConfig, file: File): string | null {\n const extensions = acceptedExtensions(config);\n if (!extensions.includes(extensionOf(file.name))) {\n return `“${file.name}” isn’t a supported text file. Allowed: ${extensions.join(\", \")}.`;\n }\n const limit = maxSizeMb(config);\n if (file.size > limit * 1024 * 1024) {\n return `“${file.name}” is too large (max ${limit} MB).`;\n }\n return null;\n}\n\nexport function formatBytes(bytes: number | undefined): string {\n if (!bytes && bytes !== 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { ArrowUpIcon, FileTextIcon, PaperclipIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes } from \"../file-support\";\n\nexport interface AgentComposerProps {\n value: string;\n onValueChange: (value: string) => void;\n /** Submit the trimmed text plus any staged files. */\n onSubmit: (text: string) => void;\n disabled?: boolean;\n placeholder?: string;\n className?: string;\n /** File upload wiring. Omit `onPickFiles` to hide the attach button. */\n files: File[];\n onPickFiles?: (files: File[]) => void;\n onRemoveFile?: (index: number) => void;\n acceptAttribute?: string;\n}\n\n/**\n * Chat composer with attachment support: auto-growing textarea, an attach\n * (paperclip) button, staged-file chips, and a send button. Enter submits,\n * Shift+Enter inserts a newline. Submitting is allowed when there is text OR at\n * least one staged file.\n */\nexport function AgentComposer({\n acceptAttribute,\n className,\n disabled,\n files,\n onPickFiles,\n onRemoveFile,\n onSubmit,\n onValueChange,\n placeholder = \"Ask anything…\",\n value,\n}: AgentComposerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const canSubmit = !disabled && (value.trim().length > 0 || files.length > 0);\n\n const submit = React.useCallback(() => {\n if (!canSubmit) return;\n onSubmit(value.trim());\n }, [canSubmit, onSubmit, value]);\n\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = \"auto\";\n textarea.style.height = `${Math.min(textarea.scrollHeight, 144)}px`;\n }, [value]);\n\n const handlePick = (event: React.ChangeEvent<HTMLInputElement>) => {\n const picked = Array.from(event.target.files ?? []);\n if (picked.length) onPickFiles?.(picked);\n event.target.value = \"\"; // allow re-picking the same file\n };\n\n return (\n <form\n className={cn(\"shrink-0 bg-background p-3 pt-1.5\", className)}\n data-slot=\"agent-composer\"\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n >\n <div\n className={cn(\n \"flex flex-col gap-1.5 rounded-2xl border border-input bg-popover p-1.5 shadow-xs transition-[border-color,box-shadow] duration-150 focus-within:border-ring/64 focus-within:ring-2 focus-within:ring-ring/24 dark:bg-input/32\",\n disabled && \"opacity-64\",\n )}\n >\n {files.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5 px-1 pt-1\">\n {files.map((file, index) => (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 py-1 pr-1 pl-2 text-xs\"\n key={`${file.name}-${index}`}\n >\n <FileTextIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 truncate\">{file.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatBytes(file.size)}</span>\n {onRemoveFile ? (\n <button\n aria-label={`Remove ${file.name}`}\n className=\"flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground hover:bg-background hover:text-foreground [&_svg]:size-3\"\n onClick={() => onRemoveFile(index)}\n type=\"button\"\n >\n <XIcon />\n </button>\n ) : null}\n </span>\n ))}\n </div>\n ) : null}\n\n <div className=\"flex items-end gap-1.5\">\n {onPickFiles ? (\n <>\n <input\n accept={acceptAttribute}\n className=\"hidden\"\n multiple\n onChange={handlePick}\n ref={inputRef}\n type=\"file\"\n />\n <Button\n aria-label=\"Attach files\"\n className=\"shrink-0 self-center\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <PaperclipIcon />\n </Button>\n </>\n ) : null}\n\n <textarea\n className=\"max-h-36 min-h-8 flex-1 resize-none self-center bg-transparent py-1.5 pl-1.5 text-sm outline-none placeholder:text-muted-foreground\"\n disabled={disabled}\n onChange={(event) => onValueChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n }}\n placeholder={placeholder}\n ref={textareaRef}\n rows={1}\n value={value}\n />\n\n <Button\n aria-label=\"Send message\"\n className=\"shrink-0 rounded-full before:rounded-full\"\n disabled={!canSubmit}\n size=\"icon-sm\"\n type=\"submit\"\n >\n <ArrowUpIcon />\n </Button>\n </div>\n </div>\n </form>\n );\n}\n","import type { AgentMessage, MessageBlock } from \"./types\";\n\n/** One tool invocation inside a tool-activity group. */\nexport interface ToolStep {\n /** Provider tool-call id (matches assistant tool_call ↔ tool result). */\n callId: string;\n name: string;\n args: Record<string, unknown>;\n status: \"running\" | \"done\";\n /** Capped, pretty-printed raw result (for the JSON detail view). */\n result?: string;\n /** Structured blocks (tables) derived from the result. */\n blocks?: MessageBlock[];\n}\n\nexport type RenderItem =\n | { kind: \"user\"; key: string; message: AgentMessage }\n | { kind: \"assistant-text\"; key: string; message: AgentMessage }\n | { kind: \"tool-activity\"; key: string; steps: ToolStep[] };\n\n/**\n * Collapse the raw message stream into render items: user bubbles, assistant\n * text bubbles, and *grouped* tool activity. Consecutive tool calls (assistant\n * tool_calls + their tool results) fold into a single group so a run of ten\n * lookups shows as one collapsible block instead of ten stacked chips.\n *\n * An assistant message that carries visible text flushes the current group and\n * emits a text bubble before starting any new tool steps.\n */\nexport function groupMessages(messages: AgentMessage[]): RenderItem[] {\n const items: RenderItem[] = [];\n\n let group: ToolStep[] | null = null;\n let groupKey = \"\";\n const stepIndexByCallId = new Map<string, number>();\n\n const flush = () => {\n if (group && group.length > 0) {\n items.push({ key: `tools-${groupKey}`, kind: \"tool-activity\", steps: group });\n }\n group = null;\n groupKey = \"\";\n stepIndexByCallId.clear();\n };\n\n for (const message of messages) {\n if (message.role === \"user\") {\n flush();\n items.push({ key: message.id, kind: \"user\", message });\n continue;\n }\n\n if (message.role === \"assistant\") {\n const hasText = Boolean(message.content && message.content.trim());\n if (hasText) {\n flush();\n items.push({ key: message.id, kind: \"assistant-text\", message });\n }\n for (const toolCall of message.tool_calls ?? []) {\n const callId = toolCall.id ?? `${message.id}-${toolCall.name}`;\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n stepIndexByCallId.set(callId, group.length);\n group.push({\n args: (toolCall.arguments ?? {}) as Record<string, unknown>,\n callId,\n name: toolCall.name ?? \"tool\",\n status: \"running\",\n });\n }\n continue;\n }\n\n // Tool result: attach to its pending step, or open a group if orphaned.\n const callId = message.tool_call_id ?? \"\";\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n const existingIndex = callId ? stepIndexByCallId.get(callId) : undefined;\n if (existingIndex !== undefined) {\n const step = group[existingIndex];\n step.status = \"done\";\n step.result = message.result || step.result;\n step.blocks = message.blocks ?? step.blocks;\n } else {\n group.push({\n args: {},\n blocks: message.blocks,\n callId: callId || message.id,\n name: message.tool_name ?? \"tool\",\n result: message.result,\n status: \"done\",\n });\n }\n }\n\n flush();\n return items;\n}\n","\"use client\";\n\nimport { ChatMessage, ChatMessageBubble, Markdown } from \"@cntyclub/ui-react\";\nimport { FileTextIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentMessage } from \"../types\";\n\n/**\n * Renders a user or assistant *text* message. Tool activity (assistant\n * tool_calls and tool results) is grouped and rendered by `ToolActivityGroup`\n * via `groupMessages`, so this component ignores tool messages.\n */\nexport function MessageItem({ message }: { message: AgentMessage }) {\n if (message.role === \"user\") {\n const attachments = message.attachments ?? [];\n return (\n <ChatMessage from=\"user\">\n {attachments.length > 0 ? (\n <div className=\"flex flex-wrap justify-end gap-1.5\">\n {attachments.map((attachment) => (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 px-2 py-1 text-muted-foreground text-xs\"\n key={attachment.id}\n >\n <FileTextIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{attachment.filename}</span>\n </span>\n ))}\n </div>\n ) : null}\n {message.content ? <ChatMessageBubble from=\"user\">{message.content}</ChatMessageBubble> : null}\n </ChatMessage>\n );\n }\n\n if (message.role === \"assistant\") {\n if (!message.content || !message.content.trim()) return null;\n return (\n <ChatMessage from=\"assistant\">\n <ChatMessageBubble from=\"assistant\">\n <Markdown>{message.content}</Markdown>\n </ChatMessageBubble>\n </ChatMessage>\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport { cn } from \"@cntyclub/ui-react\";\nimport * as React from \"react\";\n\n/** Words cycled beside the typing dots so the wait feels alive (Claude-style). */\nconst DEFAULT_PHRASES = [\n \"Thinking\",\n \"Working on it\",\n \"Looking that up\",\n \"Reading the data\",\n \"Putting it together\",\n \"Almost there\",\n];\n\nexport interface ThinkingIndicatorProps {\n /** Override the rotating phrases. */\n phrases?: string[];\n /** Milliseconds each phrase stays before rotating. Default 1800. */\n intervalMs?: number;\n className?: string;\n}\n\n/**\n * A muted \"typing\" bubble: three bouncing dots plus a phrase that rotates every\n * ~1.8s, so a long tool run reads as active progress instead of a frozen \"…\".\n */\nexport function ThinkingIndicator({ className, intervalMs = 1800, phrases }: ThinkingIndicatorProps) {\n const words = phrases && phrases.length ? phrases : DEFAULT_PHRASES;\n const [index, setIndex] = React.useState(0);\n\n React.useEffect(() => {\n // Reset when the phrase set changes so we never index out of range.\n setIndex(0);\n const timer = setInterval(() => {\n setIndex((current) => (current + 1) % words.length);\n }, intervalMs);\n return () => clearInterval(timer);\n }, [intervalMs, words]);\n\n return (\n <div\n aria-label=\"Assistant is working\"\n className={cn(\n \"fade-in-0 flex w-fit animate-in items-center gap-2 rounded-2xl rounded-bl-md bg-muted px-3.5 py-2.5 duration-200\",\n className,\n )}\n data-slot=\"thinking-indicator\"\n role=\"status\"\n >\n <span className=\"flex items-center gap-1\">\n <span className=\"size-1.5 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:0ms]\" />\n <span className=\"size-1.5 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:150ms]\" />\n <span className=\"size-1.5 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:300ms]\" />\n </span>\n <span\n className=\"fade-in-0 animate-in text-muted-foreground text-xs duration-300\"\n // Re-key so the fade replays on each word change.\n key={index}\n >\n {words[index]}…\n </span>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport type { TableBlock } from \"./types\";\n\n/**\n * Turns a raw result-table block from the backend into something a person\n * actually wants to read:\n *\n * - drops plumbing columns (ids, slugs, foreign-key refs, s3 keys, embeddings)\n * that mean nothing to a human,\n * - renders image URLs as thumbnails and other URLs as links,\n * - flattens nested objects/arrays (e.g. `{\"total\": 247, \"customer\": 0}` or\n * `[{\"id\": …, \"name\": \"SaaS\"}]`) into a readable phrase instead of raw JSON,\n * - surfaces the identity columns (name/title/email) first.\n *\n * All of this is presentation-only and lives in the widget on purpose: the\n * backend still keeps the full payload (ids and all) in the model's tool\n * context so follow-up actions can reference rows by id.\n */\n\n/** A column ready for `DataTablePaged`: stable key + human-facing label. */\nexport interface DisplayColumn {\n key: string;\n label: string;\n}\n\nexport interface DisplayTable {\n columns: DisplayColumn[];\n rows: Record<string, React.ReactNode>[];\n}\n\n// Exact column names that are plumbing, never information a person reads.\nconst NOISE_KEYS = new Set([\n \"id\",\n \"pk\",\n \"uuid\",\n \"slug\",\n \"object_id\",\n \"external_id\",\n \"client_id\",\n \"content_type\",\n \"provider_call_id\",\n \"tool_call_id\",\n]);\n\n// Column-name shapes that are always internal references or secrets.\nconst NOISE_PATTERNS = [\n /_id$/i,\n /_ids$/i,\n /_key$/i,\n /_hash$/i,\n /embedding/i,\n /vector/i,\n /password/i,\n /secret/i,\n /(^|_)token(_|$)/i,\n];\n\nconst IMAGE_KEY = /(image|logo|avatar|photo|picture|icon|thumbnail|banner|cover|headshot)/i;\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg|avif)(\\?|$)/i;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T|$)/;\nconst URL_RE = /^https?:\\/\\//i;\n// Identity columns worth reading first, in priority order.\nconst PRIORITY_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\"];\n// Keys checked when reducing an object/array-of-objects to a single label.\nconst LABEL_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\", \"code\"];\n\nfunction isUuid(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value);\n}\n\nfunction humanize(key: string): string {\n const text = key.replace(/_/g, \" \").trim();\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** A column is noise if its name looks internal or every value is a UUID. */\nfunction isNoiseColumn(key: string, rows: Record<string, unknown>[]): boolean {\n if (NOISE_KEYS.has(key.toLowerCase())) return true;\n if (NOISE_PATTERNS.some((pattern) => pattern.test(key))) return true;\n const values = rows\n .map((row) => row[key])\n .filter((value) => value !== null && value !== undefined && value !== \"\");\n return values.length > 0 && values.every(isUuid);\n}\n\nfunction pickLabel(obj: Record<string, unknown>): string | null {\n for (const key of LABEL_KEYS) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value;\n if (typeof value === \"number\") return String(value);\n }\n return null;\n}\n\n/** `{total: 247, customer: 0}` → \"Total 247 · Customer 0\"; prefers a name/title. */\nfunction formatObject(obj: Record<string, unknown>): string {\n const label = pickLabel(obj);\n if (label) return label;\n const parts: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined || value === \"\") continue;\n if (typeof value === \"object\") continue; // keep it shallow and readable\n parts.push(`${humanize(key)} ${value}`);\n if (parts.length >= 6) break;\n }\n return parts.join(\" · \") || \"—\";\n}\n\n/** `[{name: \"SaaS\"}, {name: \"Fintech\"}]` → \"SaaS, Fintech (+N more)\". */\nfunction formatArray(arr: unknown[]): string {\n const items = arr\n .map((item) => {\n if (item === null || item === undefined) return \"\";\n if (Array.isArray(item)) return \"\";\n if (typeof item === \"object\") return pickLabel(item as Record<string, unknown>) ?? \"\";\n return String(item);\n })\n .filter(Boolean);\n if (items.length === 0) return \"—\";\n const shown = items.slice(0, 8);\n const extra = items.length - shown.length;\n return shown.join(\", \") + (extra > 0 ? ` +${extra} more` : \"\");\n}\n\nfunction renderScalar(key: string, value: string | number | boolean): React.ReactNode {\n if (typeof value !== \"string\") return value; // number | boolean → table handles\n\n const text = value.trim();\n if (URL_RE.test(text) && (IMAGE_EXT.test(text) || IMAGE_KEY.test(key))) {\n return (\n <img\n alt={humanize(key)}\n className=\"h-9 w-9 rounded-md border border-border object-cover\"\n loading=\"lazy\"\n src={text}\n />\n );\n }\n if (URL_RE.test(text)) {\n let label = text;\n try {\n label = new URL(text).hostname.replace(/^www\\./, \"\");\n } catch {\n // keep the full string if it isn't a parseable URL\n }\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={text}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n );\n }\n if (ISO_DATE_RE.test(text)) {\n const date = new Date(text);\n if (!Number.isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return text;\n}\n\nfunction formatCellValue(key: string, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === \"\") return value; // table → \"—\"\n if (Array.isArray(value)) return formatArray(value);\n if (typeof value === \"object\") return formatObject(value as Record<string, unknown>);\n return renderScalar(key, value as string | number | boolean);\n}\n\n/** Build clean, human-facing columns + rows from a raw result-table block. */\nexport function toDisplayTable(block: TableBlock): DisplayTable {\n const rows = block.rows ?? [];\n const kept = (block.columns ?? []).filter((key) => !isNoiseColumn(key, rows));\n // If filtering wiped everything (e.g. a table of pure ids), keep the original\n // columns rather than render an empty table.\n const columnKeys = kept.length > 0 ? kept : block.columns ?? [];\n\n const ordered = [...columnKeys].sort((a, b) => {\n const ra = PRIORITY_KEYS.indexOf(a.toLowerCase());\n const rb = PRIORITY_KEYS.indexOf(b.toLowerCase());\n const pa = ra === -1 ? PRIORITY_KEYS.length : ra;\n const pb = rb === -1 ? PRIORITY_KEYS.length : rb;\n if (pa !== pb) return pa - pb;\n return columnKeys.indexOf(a) - columnKeys.indexOf(b); // stable otherwise\n });\n\n const columns: DisplayColumn[] = ordered.map((key) => ({ key, label: humanize(key) }));\n const displayRows = rows.map((row) => {\n const out: Record<string, React.ReactNode> = {};\n for (const key of ordered) out[key] = formatCellValue(key, row[key]);\n return out;\n });\n\n return { columns, rows: displayRows };\n}\n","import type { DescribeToolCall, ToolCallDescription, ToolCallDetail } from \"./types\";\n\n/** \"business_target_company_tags_apply\" → \"target company tags apply\". */\nexport function humanizeToolName(toolName: string): string {\n return toolName.replace(/^[a-z]+_/, \"\").replaceAll(\"_\", \" \");\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Keys that are meaningless to a human reader — identifiers and storage keys.\n * These are hidden from the default argument facts (the user complained that\n * \"company_id\" / \"slug\" tell them nothing).\n */\nfunction isTechnicalKey(key: string): boolean {\n const lower = key.toLowerCase();\n return (\n lower === \"id\" ||\n lower === \"client_id\" ||\n lower === \"slug\" ||\n lower.endsWith(\"_id\") ||\n lower.endsWith(\"_ids\") ||\n lower.endsWith(\"_key\") ||\n lower.endsWith(\"_slug\") ||\n lower.endsWith(\"_uuid\") ||\n lower === \"uuid\" ||\n lower.endsWith(\"_s3_key\") ||\n lower === \"embedding\"\n );\n}\n\n/** A value that is itself just an identifier (bare UUID) carries no meaning. */\nfunction isTechnicalValue(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value.trim());\n}\n\n/** \"target_company\" → \"Target company\". */\nfunction humanizeKey(key: string): string {\n const spaced = key.replaceAll(\"_\", \" \").trim();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (Array.isArray(value)) {\n const items = value\n .filter((item) => !isTechnicalValue(item))\n .map((item) => formatValue(item));\n return items.length ? items.join(\", \") : `${value.length} item${value.length === 1 ? \"\" : \"s\"}`;\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"name\", \"title\", \"label\", \"email\"]) {\n if (typeof record[key] === \"string\") return record[key] as string;\n }\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Derive human-readable facts from raw arguments, dropping technical keys and\n * bare-identifier values. Long strings are truncated for the card.\n */\nexport function deriveDetails(args: Record<string, unknown>): ToolCallDetail[] {\n const details: ToolCallDetail[] = [];\n for (const [key, value] of Object.entries(args ?? {})) {\n if (isTechnicalKey(key)) continue;\n if (isTechnicalValue(value)) continue;\n if (value === \"\" || value === null || value === undefined) continue;\n const formatted = formatValue(value);\n if (!formatted || formatted === \"—\") continue;\n details.push({ label: humanizeKey(key), value: formatted.length > 140 ? `${formatted.slice(0, 140)}…` : formatted });\n }\n return details;\n}\n\nexport interface ResolvedToolPresentation {\n title: string;\n summary: string | null;\n details: ToolCallDetail[];\n}\n\n/**\n * Resolve how a tool call should be shown: prefer the host app's\n * `describeToolCall`, then fall back to a humanized name plus the non-technical\n * arguments so approvals and the tool log always read conceptually.\n */\nexport function resolveToolPresentation(\n describe: DescribeToolCall | undefined,\n toolName: string,\n args: Record<string, unknown>,\n): ResolvedToolPresentation {\n let description: ToolCallDescription | null | undefined;\n try {\n description = describe?.(toolName, args ?? {});\n } catch {\n description = null;\n }\n\n const title = description?.title?.trim() || humanizeToolName(toolName);\n const summary = description?.summary?.trim() || null;\n\n let details = description?.details ?? [];\n const wantsDerived = description?.showDerivedDetails ?? description?.details === undefined;\n if (details.length === 0 && wantsDerived) {\n details = deriveDetails(args ?? {});\n }\n\n return { details, summary, title };\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { DownloadIcon, FileTextIcon, Maximize2Icon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes } from \"../file-support\";\nimport type { DocumentBlock } from \"../types\";\n\nfunction DownloadButton({ block, size = \"sm\" }: { block: DocumentBlock; size?: \"sm\" | \"icon-sm\" }) {\n if (!block.download_url) {\n return (\n <Button disabled size={size} variant=\"outline\">\n {size === \"icon-sm\" ? <DownloadIcon /> : <><DownloadIcon /> Download</>}\n </Button>\n );\n }\n return (\n <Button\n render={\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a download={block.filename} href={block.download_url} rel=\"noopener noreferrer\" target=\"_blank\" />\n }\n size={size}\n variant={size === \"icon-sm\" ? \"outline\" : \"default\"}\n >\n <DownloadIcon />\n {size === \"icon-sm\" ? null : \"Download\"}\n </Button>\n );\n}\n\n/** Fullscreen preview overlay (viewport-fixed) with a download action. */\nfunction DocumentViewer({ block, onClose }: { block: DocumentBlock; onClose: () => void }) {\n React.useEffect(() => {\n const onKey = (event: KeyboardEvent) => event.key === \"Escape\" && onClose();\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n return (\n <div aria-modal=\"true\" className=\"fixed inset-0 z-[60] flex flex-col bg-background\" role=\"dialog\">\n <div className=\"flex shrink-0 items-center gap-2 border-border/72 border-b px-4 py-3\">\n <FileTextIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <DownloadButton block={block} />\n <Button aria-label=\"Close preview\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n <pre className=\"mx-auto max-w-3xl whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-foreground\">\n {block.preview || \"(no preview available — download to view)\"}\n {block.preview_truncated ? \"\\n\\n… preview truncated. Download for the full file.\" : \"\"}\n </pre>\n </div>\n </div>\n );\n}\n\n/**\n * Renders a generated document: a compact card with a short preview, an\n * expand-to-fullscreen button, and a download button. Clicking the preview or\n * expand opens the fullscreen viewer (download sits top-right there too).\n */\nexport function DocumentCard({ block }: { block: DocumentBlock }) {\n const [open, setOpen] = React.useState(false);\n const previewLines = (block.preview || \"\").split(\"\\n\").slice(0, 6).join(\"\\n\");\n\n return (\n <div className=\"w-full max-w-full overflow-hidden rounded-xl border border-border bg-card shadow-xs\">\n <div className=\"flex items-center gap-2 border-border/72 border-b px-3 py-2\">\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-lg bg-primary/8 text-primary [&_svg]:size-4\">\n <FileTextIcon />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <Button aria-label=\"Preview\" onClick={() => setOpen(true)} size=\"icon-sm\" variant=\"ghost\">\n <Maximize2Icon />\n </Button>\n <DownloadButton block={block} size=\"icon-sm\" />\n </div>\n {previewLines ? (\n <button\n className={cn(\n \"block w-full cursor-pointer px-3 py-2 text-left transition-colors hover:bg-accent/40\",\n )}\n onClick={() => setOpen(true)}\n type=\"button\"\n >\n <pre className=\"max-h-28 overflow-hidden whitespace-pre-wrap break-words font-mono text-[11px] leading-snug text-muted-foreground\">\n {previewLines}\n </pre>\n </button>\n ) : null}\n {open ? <DocumentViewer block={block} onClose={() => setOpen(false)} /> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { Checkbox, cn, Spinner } from \"@cntyclub/ui-react\";\nimport { ListChecksIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { TaskItem } from \"../types\";\n\n/**\n * A read-only checklist of the steps the agent is working through (Claude-style\n * to-dos). The user cannot toggle items — the agent drives the state via the\n * `update_tasks` tool.\n */\nexport function TaskChecklist({ tasks }: { tasks: TaskItem[] }) {\n if (!tasks || tasks.length === 0) return null;\n const done = tasks.filter((task) => task.status === \"done\").length;\n\n return (\n <div className=\"w-full max-w-full rounded-xl border border-border bg-card p-3 shadow-xs\">\n <div className=\"mb-2 flex items-center gap-1.5 font-medium text-sm\">\n <ListChecksIcon className=\"size-4 text-muted-foreground\" />\n Tasks\n <span className=\"ml-auto text-muted-foreground text-xs\">\n {done}/{tasks.length}\n </span>\n </div>\n <ul className=\"flex flex-col gap-1.5\">\n {tasks.map((task, index) => (\n <li className=\"flex items-center gap-2 text-sm\" key={`${index}-${task.title}`}>\n {task.status === \"in_progress\" ? (\n <span className=\"flex size-4 shrink-0 items-center justify-center [&_svg]:size-3.5\">\n <Spinner />\n </span>\n ) : (\n <Checkbox\n aria-hidden\n checked={task.status === \"done\"}\n className=\"pointer-events-none shrink-0\"\n readOnly\n tabIndex={-1}\n />\n )}\n <span\n className={cn(\n \"min-w-0\",\n task.status === \"done\" && \"text-muted-foreground line-through\",\n task.status === \"in_progress\" && \"font-medium\",\n )}\n >\n {task.title}\n </span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsiblePanel,\n CollapsibleTrigger,\n ChatToolChip,\n DataTablePaged,\n cn,\n} from \"@cntyclub/ui-react\";\nimport { CheckIcon, ChevronDownIcon, CodeIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { toDisplayTable } from \"../table-format\";\nimport { humanizeToolName, resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, MessageBlock, TableBlock } from \"../types\";\nimport type { ToolStep } from \"../message-group\";\nimport { DocumentCard } from \"./document-card\";\nimport { TaskChecklist } from \"./task-checklist\";\n\n/** Renders the visible output blocks of a step (tables, documents, checklists). */\nfunction StepBlocks({ blocks, stepKey }: { blocks: MessageBlock[] | undefined; stepKey: string }) {\n const visible = (blocks ?? []).filter(\n (block) => block.type === \"table\" || block.type === \"document\" || block.type === \"tasks\",\n );\n if (visible.length === 0) return null;\n return (\n <>\n {visible.map((block, index) => {\n const key = `${stepKey}-block-${index}`;\n if (block.type === \"document\") {\n return <DocumentCard block={block} key={key} />;\n }\n if (block.type === \"tasks\") {\n return <TaskChecklist key={key} tasks={block.tasks} />;\n }\n const table = block as TableBlock;\n const { columns, rows } = toDisplayTable(table);\n return (\n <div className=\"w-full max-w-full\" key={key}>\n <DataTablePaged\n columns={columns}\n pageSize={8}\n rows={rows}\n totalCount={\n typeof table.pagination?.count === \"number\" ? (table.pagination.count as number) : table.row_count\n }\n />\n </div>\n );\n })}\n </>\n );\n}\n\nfunction RawJsonDisclosure({ result }: { result: string }) {\n return (\n <Collapsible className=\"mt-1.5\">\n <CollapsibleTrigger className=\"group flex items-center gap-1 text-muted-foreground text-xs hover:text-foreground\">\n <CodeIcon className=\"size-3\" />\n <span>Raw JSON</span>\n <ChevronDownIcon className=\"size-3 transition-transform group-data-[panel-open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsiblePanel>\n <pre className=\"mt-1 max-h-64 overflow-auto rounded-lg bg-muted p-2 font-mono text-[11px] leading-snug text-muted-foreground\">\n {result}\n </pre>\n </CollapsiblePanel>\n </Collapsible>\n );\n}\n\nfunction StepDetail({\n describeToolCall,\n step,\n}: {\n describeToolCall?: DescribeToolCall;\n step: ToolStep;\n}) {\n const { details, summary, title } = resolveToolPresentation(describeToolCall, step.name, step.args);\n return (\n <div className=\"rounded-lg border border-border/72 bg-card p-2.5\">\n <div className=\"flex items-center gap-1.5 font-medium text-sm\">\n {step.status === \"running\" ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon className=\"size-3.5 text-success\" />\n )}\n {title}\n </div>\n {summary ? <p className=\"mt-0.5 text-muted-foreground text-xs\">{summary}</p> : null}\n {details.length > 0 ? (\n <dl className=\"mt-1.5 space-y-0.5 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {step.result ? <RawJsonDisclosure result={step.result} /> : null}\n </div>\n );\n}\n\nexport interface ToolActivityGroupProps {\n steps: ToolStep[];\n describeToolCall?: DescribeToolCall;\n}\n\n/**\n * A collapsed run of tool activity. Normally shows just the latest step as a\n * chip with a disclosure toggle; expanding reveals every step in plain language\n * with a per-step raw-JSON dropdown. Result tables always render below so the\n * data the user asked for is never hidden behind the toggle.\n */\nexport function ToolActivityGroup({ describeToolCall, steps }: ToolActivityGroupProps) {\n const [open, setOpen] = React.useState(false);\n if (steps.length === 0) return null;\n\n const last = steps[steps.length - 1];\n const anyRunning = steps.some((step) => step.status === \"running\");\n const lastTitle =\n resolveToolPresentation(describeToolCall, last.name, last.args).title || humanizeToolName(last.name);\n const chipLabel = anyRunning ? `${lastTitle}…` : steps.length > 1 ? lastTitle : `${lastTitle} finished`;\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <Collapsible onOpenChange={setOpen} open={open}>\n <CollapsibleTrigger\n render={\n <ChatToolChip\n className=\"cursor-pointer pr-2 hover:bg-muted\"\n icon={\n anyRunning ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon />\n )\n }\n >\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"truncate\">{chipLabel}</span>\n {steps.length > 1 ? (\n <span className=\"rounded-full bg-background px-1.5 text-[10px] text-foreground/72\">\n {steps.length} steps\n </span>\n ) : null}\n <ChevronDownIcon className={cn(\"size-3 transition-transform\", open && \"rotate-180\")} />\n </span>\n </ChatToolChip>\n }\n />\n <CollapsiblePanel>\n <div className=\"mt-2 flex flex-col gap-1.5\">\n {steps.map((step) => (\n <StepDetail describeToolCall={describeToolCall} key={step.callId} step={step} />\n ))}\n </div>\n </CollapsiblePanel>\n </Collapsible>\n\n {steps.map((step) => (\n <StepBlocks blocks={step.blocks} key={`${step.callId}-blocks`} stepKey={step.callId} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n ChatToolCard,\n ChatToolCardActions,\n ChatToolCardHeader,\n Group,\n Menu,\n MenuItem,\n MenuPopup,\n MenuTrigger,\n Spinner,\n} from \"@cntyclub/ui-react\";\nimport { CheckCheckIcon, ChevronDownIcon, ShieldAlertIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, PendingApproval } from \"../types\";\n\nexport interface ToolApprovalCardProps {\n approval: PendingApproval;\n resolving: boolean;\n onResolve: (callId: string, approve: boolean) => void;\n /** Host-app hook that turns the tool call into plain language. */\n describeToolCall?: DescribeToolCall;\n /** Remember this tool and auto-approve it from now on. */\n onAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Approval prompt for a write action the agent wants to perform. Arguments are\n * shown in plain language (technical ids/keys hidden, or a host-provided\n * description) so the user understands exactly what will change. The primary\n * action is a split button: \"Approve\" once, or \"Always approve\" this tool.\n */\nexport function ToolApprovalCard({\n approval,\n describeToolCall,\n onAlwaysApprove,\n onResolve,\n resolving,\n}: ToolApprovalCardProps) {\n const { details, summary, title } = resolveToolPresentation(\n describeToolCall,\n approval.tool_name,\n (approval.arguments ?? {}) as Record<string, unknown>,\n );\n\n return (\n <ChatToolCard className=\"border-warning/40\">\n <ChatToolCardHeader>\n <ShieldAlertIcon className=\"size-4 text-warning\" />\n Approval needed\n </ChatToolCardHeader>\n <p className=\"mt-1 text-muted-foreground\">\n {summary ?? (\n <>\n The assistant wants to <span className=\"font-medium text-foreground\">{title.toLowerCase()}</span> — this\n will change your data.\n </>\n )}\n </p>\n {details.length > 0 && (\n <dl className=\"mt-2 space-y-1 rounded-lg bg-muted p-2 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words font-medium text-foreground\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n )}\n <ChatToolCardActions>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, false)} size=\"sm\" variant=\"outline\">\n Decline\n </Button>\n <Group>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, true)} size=\"sm\">\n {resolving ? <Spinner /> : null}\n Approve\n </Button>\n <Menu>\n <MenuTrigger\n render={\n <Button aria-label=\"More approve options\" disabled={resolving} size=\"icon-sm\" variant=\"default\">\n <ChevronDownIcon />\n </Button>\n }\n />\n <MenuPopup align=\"end\">\n <MenuItem\n onClick={() => {\n onAlwaysApprove(approval.tool_name);\n onResolve(approval.id, true);\n }}\n >\n <CheckCheckIcon />\n Always approve “{title}”\n </MenuItem>\n </MenuPopup>\n </Menu>\n </Group>\n </ChatToolCardActions>\n </ChatToolCard>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n Chat,\n ChatEmptyState,\n ChatEmptyStateDescription,\n ChatEmptyStateIcon,\n ChatEmptyStateTitle,\n ChatMessage,\n ChatHeader,\n ChatHeaderActions,\n ChatHeaderAvatar,\n ChatHeaderTitle,\n ChatMessages,\n ChatSuggestion,\n ChatSuggestions,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@cntyclub/ui-react\";\nimport {\n HistoryIcon,\n Maximize2Icon,\n Minimize2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadCloudIcon,\n XIcon,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { acceptAttribute, fileUploadEnabled, validateFile } from \"../file-support\";\nimport { groupMessages } from \"../message-group\";\nimport type { AgentChatActions, AgentChatState } from \"../use-agent-chat\";\nimport type { AgentConfig } from \"../types\";\nimport { AgentComposer } from \"./agent-composer\";\nimport { MessageItem } from \"./message-item\";\nimport { ThinkingIndicator } from \"./thinking-indicator\";\nimport { ToolActivityGroup } from \"./tool-activity-group\";\nimport { ToolApprovalCard } from \"./tool-approval-card\";\n\nexport interface AgentPanelProps {\n config: AgentConfig;\n chat: AgentChatState & AgentChatActions;\n /** Fullscreen \"Agent Mode\" is active. */\n agentMode: boolean;\n /** Hide the expand button (mobile is always fullscreen). */\n canToggleAgentMode: boolean;\n onToggleAgentMode: () => void;\n onClose: () => void;\n /** Remember a write tool and auto-approve its future prompts. */\n onAlwaysApprove: (toolName: string) => void;\n className?: string;\n}\n\n/**\n * The chat surface shared by the popup panel and fullscreen Agent Mode.\n * Header (title, history, new chat, expand/collapse, close) + messages + input.\n */\nexport function AgentPanel({\n agentMode,\n canToggleAgentMode,\n chat,\n className,\n config,\n onAlwaysApprove,\n onClose,\n onToggleAgentMode,\n}: AgentPanelProps) {\n const [draft, setDraft] = React.useState(\"\");\n const [view, setView] = React.useState<\"chat\" | \"history\">(\"chat\");\n const [files, setFiles] = React.useState<File[]>([]);\n const [uploadError, setUploadError] = React.useState<string | null>(null);\n const [dragging, setDragging] = React.useState(false);\n const dragDepth = React.useRef(0);\n\n const agentName = config.agentName ?? chat.agentInfo?.name ?? \"Assistant\";\n const uploadEnabled = fileUploadEnabled(config);\n const suggestions = config.suggestions ?? [\n \"What can you help me with?\",\n \"Give me a quick summary of my data.\",\n ];\n\n const addFiles = React.useCallback(\n (incoming: File[]) => {\n const accepted: File[] = [];\n let rejection: string | null = null;\n for (const file of incoming) {\n const error = validateFile(config, file);\n if (error) {\n rejection = error;\n continue;\n }\n accepted.push(file);\n }\n setUploadError(rejection);\n if (accepted.length) setFiles((current) => [...current, ...accepted].slice(0, 10));\n },\n [config],\n );\n\n const removeFile = React.useCallback((index: number) => {\n setFiles((current) => current.filter((_, i) => i !== index));\n }, []);\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n const staged = files;\n setDraft(\"\");\n setFiles([]);\n setUploadError(null);\n void chat.send(text, staged);\n },\n [chat, files],\n );\n\n // ----- drag-and-drop file upload -----\n const onDragEnter = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled || !event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current += 1;\n setDragging(true);\n },\n [uploadEnabled],\n );\n const onDragLeave = React.useCallback((event: React.DragEvent) => {\n if (!event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current = Math.max(0, dragDepth.current - 1);\n if (dragDepth.current === 0) setDragging(false);\n }, []);\n const onDrop = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled) return;\n event.preventDefault();\n dragDepth.current = 0;\n setDragging(false);\n const dropped = Array.from(event.dataTransfer?.files ?? []);\n if (dropped.length) addFiles(dropped);\n },\n [addFiles, uploadEnabled],\n );\n\n const openHistory = React.useCallback(() => {\n setView(\"history\");\n void chat.refreshConversations();\n }, [chat]);\n\n const busy = chat.sending || chat.resolvingApprovalId !== null;\n\n return (\n <div\n className={cn(\n \"relative flex min-h-0 flex-col overflow-hidden bg-background text-foreground\",\n className,\n )}\n data-slot=\"agent-panel\"\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={uploadEnabled ? (event) => event.preventDefault() : undefined}\n onDrop={onDrop}\n >\n {dragging && view === \"chat\" ? (\n <div className=\"pointer-events-none absolute inset-0 z-40 flex flex-col items-center justify-center gap-2 bg-background/85 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-2 rounded-2xl border-2 border-primary/40 border-dashed px-8 py-6 text-center\">\n <UploadCloudIcon className=\"size-8 text-primary\" />\n <div className=\"font-medium text-sm\">Drop text files to attach</div>\n <div className=\"text-muted-foreground text-xs\">{acceptAttribute(config).replaceAll(\",\", \" · \")}</div>\n </div>\n </div>\n ) : null}\n {/* Header */}\n <ChatHeader>\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n <ChatHeaderAvatar />\n <ChatHeaderTitle>\n <div className=\"truncate font-medium text-sm\">{agentName}</div>\n {config.tagline ? (\n <div className=\"truncate text-muted-foreground text-xs\">{config.tagline}</div>\n ) : null}\n </ChatHeaderTitle>\n </div>\n\n <ChatHeaderActions>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Conversation history\"\n onClick={view === \"history\" ? () => setView(\"chat\") : openHistory}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <HistoryIcon />\n </Button>\n }\n />\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"New chat\"\n onClick={() => {\n chat.newChat();\n setView(\"chat\");\n }}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <SquarePenIcon />\n </Button>\n }\n />\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n\n {canToggleAgentMode ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={agentMode ? \"Exit Agent Mode\" : \"Enter Agent Mode\"}\n onClick={onToggleAgentMode}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {agentMode ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n }\n />\n <TooltipContent>{agentMode ? \"Exit Agent Mode\" : \"Agent Mode\"}</TooltipContent>\n </Tooltip>\n ) : null}\n\n <Button aria-label=\"Close\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </ChatHeaderActions>\n </ChatHeader>\n\n {view === \"history\" ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto p-2\">\n {chat.conversations.length === 0 ? (\n <p className=\"p-4 text-center text-muted-foreground text-sm\">\n No conversations yet.\n </p>\n ) : (\n chat.conversations.map((conversation) => (\n <div\n className=\"group flex items-center gap-1 rounded-lg hover:bg-accent\"\n key={conversation.id}\n >\n <button\n className=\"min-w-0 flex-1 cursor-pointer px-3 py-2 text-left\"\n onClick={() => {\n void chat.openConversation(conversation.id);\n setView(\"chat\");\n }}\n type=\"button\"\n >\n <span className=\"block truncate text-sm\">{conversation.title || \"Untitled\"}</span>\n <span className=\"block text-muted-foreground text-xs\">\n {new Date(conversation.updated_at).toLocaleString()}\n </span>\n </button>\n <Button\n aria-label=\"Delete conversation\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => void chat.deleteConversation(conversation.id)}\n size=\"icon-xs\"\n variant=\"destructive-ghost\"\n >\n <Trash2Icon />\n </Button>\n </div>\n ))\n )}\n </div>\n ) : (\n <Chat>\n <ChatMessages className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}>\n {chat.messages.length === 0 && !chat.sending ? (\n <ChatEmptyState>\n <ChatEmptyStateIcon />\n <div>\n <ChatEmptyStateTitle>Hi! I'm {agentName}.</ChatEmptyStateTitle>\n <ChatEmptyStateDescription className=\"mt-1\">\n Ask me anything about your data — I can look things up and take actions\n (with your approval).\n </ChatEmptyStateDescription>\n </div>\n <ChatSuggestions>\n {suggestions.slice(0, 4).map((suggestion, index) => (\n <ChatSuggestion\n index={index}\n key={suggestion}\n onClick={() => handleSubmit(suggestion)}\n >\n {suggestion}\n </ChatSuggestion>\n ))}\n </ChatSuggestions>\n </ChatEmptyState>\n ) : (\n <>\n {groupMessages(chat.messages).map((item) =>\n item.kind === \"tool-activity\" ? (\n <ChatMessage from=\"assistant\" key={item.key}>\n <ToolActivityGroup describeToolCall={config.describeToolCall} steps={item.steps} />\n </ChatMessage>\n ) : (\n <MessageItem key={item.key} message={item.message} />\n ),\n )}\n {chat.pendingApprovals.map((approval) => (\n <ToolApprovalCard\n approval={approval}\n describeToolCall={config.describeToolCall}\n key={approval.id}\n onAlwaysApprove={onAlwaysApprove}\n onResolve={(callId, approve) => void chat.resolveApproval(callId, approve)}\n resolving={chat.resolvingApprovalId === approval.id}\n />\n ))}\n {busy ? <ThinkingIndicator /> : null}\n </>\n )}\n </ChatMessages>\n\n {chat.error || uploadError ? (\n <div className=\"mx-3 mb-1 flex items-center justify-between gap-2 rounded-lg bg-destructive/10 px-3 py-2 text-destructive text-xs\">\n <span className=\"min-w-0 truncate\">{chat.error ?? uploadError}</span>\n <button\n className=\"shrink-0 cursor-pointer font-medium\"\n onClick={() => {\n chat.clearError();\n setUploadError(null);\n }}\n type=\"button\"\n >\n Dismiss\n </button>\n </div>\n ) : null}\n\n <AgentComposer\n acceptAttribute={acceptAttribute(config)}\n className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}\n disabled={busy || chat.pendingApprovals.length > 0}\n files={files}\n onPickFiles={uploadEnabled ? addFiles : undefined}\n onRemoveFile={removeFile}\n onSubmit={handleSubmit}\n onValueChange={setDraft}\n placeholder={\n chat.pendingApprovals.length > 0\n ? \"Approve or decline the pending action first…\"\n : `Ask ${agentName}…`\n }\n value={draft}\n />\n </Chat>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { AgentApiClient, AgentApiError } from \"./api-client\";\nimport type {\n AgentConfig,\n AgentMessage,\n AgentPublicConfig,\n ConversationSummary,\n PendingApproval,\n} from \"./types\";\n\n/** Prefix marking a locally-added user message not yet echoed back by the server. */\nconst OPTIMISTIC_ID_PREFIX = \"optimistic-\";\n\nlet optimisticCounter = 0;\n\nfunction buildOptimisticUserMessage(text: string, files?: File[]): AgentMessage {\n optimisticCounter += 1;\n const attachments = (files ?? []).map((file, index) => ({\n id: `${OPTIMISTIC_ID_PREFIX}att-${optimisticCounter}-${index}`,\n filename: file.name,\n format: file.name.split(\".\").pop()?.toLowerCase() ?? \"file\",\n size_bytes: file.size,\n }));\n return {\n id: `${OPTIMISTIC_ID_PREFIX}${optimisticCounter}`,\n role: \"user\",\n content: text,\n created_at: new Date().toISOString(),\n ...(attachments.length ? { attachments } : {}),\n } as AgentMessage;\n}\n\nexport interface AgentChatState {\n agentInfo: AgentPublicConfig | null;\n conversationId: string | null;\n conversations: ConversationSummary[];\n messages: AgentMessage[];\n pendingApprovals: PendingApproval[];\n sending: boolean;\n resolvingApprovalId: string | null;\n error: string | null;\n}\n\nexport interface AgentChatActions {\n send: (text: string, files?: File[]) => Promise<void>;\n resolveApproval: (callId: string, approve: boolean) => Promise<void>;\n newChat: () => void;\n openConversation: (conversationId: string) => Promise<void>;\n refreshConversations: () => Promise<void>;\n deleteConversation: (conversationId: string) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * Headless chat state for an Agent Mode agent: message history, sending,\n * pending write-tool approvals, and conversation management. UI-agnostic.\n */\nexport function useAgentChat(config: AgentConfig): AgentChatState & AgentChatActions {\n const client = React.useMemo(() => new AgentApiClient(config), [config]);\n\n const [agentInfo, setAgentInfo] = React.useState<AgentPublicConfig | null>(null);\n const [conversationId, setConversationId] = React.useState<string | null>(null);\n const [conversations, setConversations] = React.useState<ConversationSummary[]>([]);\n const [messages, setMessages] = React.useState<AgentMessage[]>([]);\n const [pendingApprovals, setPendingApprovals] = React.useState<PendingApproval[]>([]);\n const [sending, setSending] = React.useState(false);\n const [resolvingApprovalId, setResolvingApprovalId] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n client\n .getConfig()\n .then((info) => {\n if (!cancelled) setAgentInfo(info);\n })\n .catch(() => {\n // Non-fatal: the panel falls back to config-provided naming.\n });\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n const handleFailure = React.useCallback((err: unknown) => {\n const message =\n err instanceof AgentApiError\n ? err.message\n : \"Something went wrong. Please try again.\";\n setError(message);\n }, []);\n\n const applyResponse = React.useCallback(\n (response: {\n status?: string;\n message?: string;\n conversation_id?: string;\n messages?: AgentMessage[];\n pending_approvals?: PendingApproval[];\n }) => {\n if (response.status === \"error\" && !response.messages?.length) {\n setError(response.message ?? \"The assistant could not answer.\");\n return;\n }\n if (response.conversation_id) setConversationId(response.conversation_id);\n if (response.messages?.length) {\n setMessages((current) => {\n // Drop optimistic placeholders; the server now returns the real\n // persisted user message (with its real id) alongside the reply.\n const settled = current.filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const seen = new Set(settled.map((message) => message.id));\n const fresh = response.messages?.filter((message) => !seen.has(message.id)) ?? [];\n return [...settled, ...fresh];\n });\n }\n setPendingApprovals(response.pending_approvals ?? []);\n if (response.status === \"error\" && response.message) {\n setError(response.message);\n }\n },\n [],\n );\n\n const send = React.useCallback(\n async (text: string, files?: File[]) => {\n if (sending) return;\n if (!text.trim() && !(files && files.length)) return;\n setSending(true);\n setError(null);\n // Show the user's message immediately (then the typing indicator), rather\n // than waiting for the whole tool loop to finish before it appears.\n setMessages((current) => [...current, buildOptimisticUserMessage(text, files)]);\n try {\n const response = await client.sendMessage(text, conversationId, files);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setSending(false);\n }\n },\n [applyResponse, client, conversationId, handleFailure, sending],\n );\n\n const resolveApproval = React.useCallback(\n async (callId: string, approve: boolean) => {\n if (resolvingApprovalId) return;\n setResolvingApprovalId(callId);\n setError(null);\n try {\n const response = await client.resolveApproval(callId, approve);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setResolvingApprovalId(null);\n }\n },\n [applyResponse, client, handleFailure, resolvingApprovalId],\n );\n\n const newChat = React.useCallback(() => {\n setConversationId(null);\n setMessages([]);\n setPendingApprovals([]);\n setError(null);\n }, []);\n\n const refreshConversations = React.useCallback(async () => {\n try {\n const { conversations: list } = await client.listConversations();\n setConversations(list);\n } catch (err) {\n handleFailure(err);\n }\n }, [client, handleFailure]);\n\n const openConversation = React.useCallback(\n async (id: string) => {\n setError(null);\n try {\n const payload = await client.getConversation(id);\n setConversationId(id);\n setMessages(payload.messages ?? []);\n setPendingApprovals(payload.pending_approvals ?? []);\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, handleFailure],\n );\n\n const deleteConversation = React.useCallback(\n async (id: string) => {\n try {\n await client.deleteConversation(id);\n setConversations((current) => current.filter((c) => c.id !== id));\n if (conversationId === id) newChat();\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, conversationId, handleFailure, newChat],\n );\n\n const clearError = React.useCallback(() => setError(null), []);\n\n return {\n agentInfo,\n clearError,\n conversationId,\n conversations,\n deleteConversation,\n error,\n messages,\n newChat,\n openConversation,\n pendingApprovals,\n refreshConversations,\n resolveApproval,\n resolvingApprovalId,\n send,\n sending,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nconst STORAGE_PREFIX = \"cc-agent-always-approve:\";\n\nfunction storageKey(clientId: string): string {\n return `${STORAGE_PREFIX}${clientId || \"default\"}`;\n}\n\nfunction readStored(clientId: string): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = window.localStorage.getItem(storageKey(clientId));\n if (!raw) return new Set();\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? new Set(parsed.filter((v): v is string => typeof v === \"string\")) : new Set();\n } catch {\n return new Set();\n }\n}\n\nexport interface AlwaysApproveStore {\n /** Whether the user chose to always approve this tool for this agent. */\n isAlwaysApproved: (toolName: string) => boolean;\n /** Remember to auto-approve this tool from now on (persisted per agent). */\n setAlwaysApprove: (toolName: string) => void;\n /** Stop auto-approving this tool. */\n clearAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Per-agent \"always approve\" memory for write tools, persisted in localStorage\n * (keyed by client id). Once a tool is trusted the panel auto-resolves its\n * future approval prompts instead of asking again.\n */\nexport function useAlwaysApprove(clientId: string): AlwaysApproveStore {\n const [approved, setApproved] = React.useState<Set<string>>(() => new Set());\n\n // Load once mounted (localStorage is unavailable during SSR).\n React.useEffect(() => {\n setApproved(readStored(clientId));\n }, [clientId]);\n\n const persist = React.useCallback(\n (next: Set<string>) => {\n setApproved(next);\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey(clientId), JSON.stringify([...next]));\n } catch {\n // Ignore quota/availability errors — trust simply won't persist.\n }\n },\n [clientId],\n );\n\n const isAlwaysApproved = React.useCallback((toolName: string) => approved.has(toolName), [approved]);\n\n const setAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (approved.has(toolName)) return;\n const next = new Set(approved);\n next.add(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n const clearAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (!approved.has(toolName)) return;\n const next = new Set(approved);\n next.delete(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n return { clearAlwaysApprove, isAlwaysApproved, setAlwaysApprove };\n}\n","\"use client\";\n\nimport { cn, Fab, TooltipProvider, useMediaQuery } from \"@cntyclub/ui-react\";\nimport { SparklesIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentConfig, AgentMessage } from \"../types\";\nimport { useAgentChat } from \"../use-agent-chat\";\nimport { useAlwaysApprove } from \"../use-always-approve\";\nimport { AgentPanel } from \"./agent-panel\";\n\nexport interface AgentWidgetProps {\n config: AgentConfig;\n /** Controlled open state (optional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * The embeddable Agent Mode widget.\n *\n * - Closed: a floating round button (bottom-right by default).\n * - Open on desktop: a popup panel anchored to the button, with an\n * \"Agent Mode\" button that expands to a fullscreen chat. While in the popup,\n * the widget can navigate the host app to pages related to the tools the\n * agent uses (via `config.pages` + `config.navigate`).\n * - Open on mobile: fullscreen from the start.\n *\n * All colors come from the host app's UI-kit theme tokens, so light/dark mode\n * follows the dashboard automatically.\n */\nexport function AgentWidget({ config, onOpenChange, open: controlledOpen }: AgentWidgetProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = React.useCallback(\n (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n const [agentMode, setAgentMode] = React.useState(false);\n const isDesktop = useMediaQuery(\"(min-width: 640px)\", {\n defaultSSRValue: true,\n ssr: true,\n });\n const fullscreen = !isDesktop || agentMode;\n\n const chat = useAgentChat(config);\n const alwaysApprove = useAlwaysApprove(config.clientId);\n\n // ----- auto-approve trusted write tools -----\n // When the user has chosen \"Always approve\" for a tool, resolve its pending\n // prompts automatically (one at a time — the backend waits for siblings).\n const { pendingApprovals, resolveApproval, resolvingApprovalId } = chat;\n const { isAlwaysApproved } = alwaysApprove;\n React.useEffect(() => {\n if (!open || resolvingApprovalId) return;\n const target = pendingApprovals.find((approval) => isAlwaysApproved(approval.tool_name));\n if (target) void resolveApproval(target.id, true);\n }, [open, pendingApprovals, resolvingApprovalId, isAlwaysApproved, resolveApproval]);\n\n // ----- live page refresh after successful writes -----\n // When a write tool the agent ran succeeds, tell the host app so it can\n // refetch the affected data instead of the user having to reload the page.\n const firedWriteIds = React.useRef<Set<string>>(new Set());\n const { onWriteSuccess } = config;\n React.useEffect(() => {\n if (!onWriteSuccess) return;\n for (const message of chat.messages) {\n if (message.role !== \"tool\" || !message.is_write || message.tool_status !== \"success\") continue;\n if (firedWriteIds.current.has(message.id)) continue;\n firedWriteIds.current.add(message.id);\n const args = findToolArguments(chat.messages, message);\n onWriteSuccess({ arguments: args, toolName: message.tool_name ?? \"\" });\n }\n }, [chat.messages, onWriteSuccess]);\n\n // ----- page-follow navigation (popup mode only) -----\n const lastNavigatedMessageId = React.useRef<string | null>(null);\n const { messages } = chat;\n React.useEffect(() => {\n if (!open || fullscreen || !config.navigate || !config.pages?.length) return;\n const toolMessages = messages.filter((message) => message.role === \"tool\");\n const latest = toolMessages[toolMessages.length - 1];\n if (!latest || latest.id === lastNavigatedMessageId.current) return;\n lastNavigatedMessageId.current = latest.id;\n\n const mapping = config.pages.find((page) => page.tools.includes(latest.tool_name ?? \"\"));\n if (!mapping) return;\n\n const args = findToolArguments(messages, latest);\n const path = mapping.buildRoute ? mapping.buildRoute(args) : mapping.route;\n if (path) config.navigate(path);\n }, [config, fullscreen, messages, open]);\n\n const closePanel = React.useCallback(() => {\n setOpen(false);\n setAgentMode(false);\n }, [setOpen]);\n\n return (\n <TooltipProvider>\n {!open && !config.appearance?.hideLauncher ? (\n <Fab\n aria-label=\"Open assistant\"\n onClick={() => setOpen(true)}\n position={config.appearance?.position ?? \"bottom-right\"}\n >\n <SparklesIcon />\n </Fab>\n ) : null}\n\n {open ? (\n fullscreen ? (\n <div\n aria-modal=\"true\"\n className=\"fixed inset-0 z-50 flex flex-col bg-background\"\n role=\"dialog\"\n >\n <AgentPanel\n agentMode={agentMode}\n canToggleAgentMode={isDesktop}\n chat={chat}\n className=\"flex-1\"\n config={config}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode((value) => !value)}\n />\n </div>\n ) : (\n <div\n className={cn(\n \"fixed z-50 flex flex-col overflow-hidden rounded-2xl border border-border shadow-2xl\",\n (config.appearance?.position ?? \"bottom-right\") === \"bottom-left\"\n ? \"bottom-4 left-4 sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n )}\n role=\"dialog\"\n style={{\n height: `min(${config.appearance?.panelHeight ?? 640}px, calc(100dvh - 3rem))`,\n width: `min(${config.appearance?.panelWidth ?? 400}px, calc(100vw - 2rem))`,\n }}\n >\n <AgentPanel\n agentMode={false}\n canToggleAgentMode\n chat={chat}\n className=\"flex-1\"\n config={config}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode(true)}\n />\n </div>\n )\n ) : null}\n </TooltipProvider>\n );\n}\n\n/** Look up the arguments of the assistant tool_call a tool message answers. */\nfunction findToolArguments(\n messages: AgentMessage[],\n toolMessage: AgentMessage,\n): Record<string, unknown> {\n if (!toolMessage.tool_call_id) return {};\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role !== \"assistant\" || !message.tool_calls) continue;\n const match = message.tool_calls.find((call) => call.id === toolMessage.tool_call_id);\n if (match) return match.arguments ?? {};\n }\n return {};\n}\n","import type { AgentConfig } from \"./types\";\n\n/**\n * Identity helper that gives host apps full type inference/checking when\n * declaring their agent config file.\n */\nexport function defineAgentConfig(config: AgentConfig): AgentConfig {\n return config;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-chat.d.ts","sourceRoot":"","sources":["../src/use-agent-chat.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EAChB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"use-agent-chat.d.ts","sourceRoot":"","sources":["../src/use-agent-chat.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EAChB,MAAM,SAAS,CAAC;AAwBjB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,kBAAkB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,gBAAgB,CAuKnF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cntyclub/agent-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Embeddable AI agent chat widget for Country Club dashboards — floating button, popup panel, fullscreen Agent Mode, MCP tool approvals, and paginated result tables. Built exclusively on @cntyclub/ui-react.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|