@usetheo/ui 0.13.1 → 0.13.2
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/{chunk-REFY5MLN.js → chunk-2NTEJRPA.js} +5 -5
- package/dist/{chunk-REFY5MLN.js.map → chunk-2NTEJRPA.js.map} +1 -1
- package/dist/{chunk-2EUKYGH5.js → chunk-357XIC2N.js} +3 -3
- package/dist/chunk-357XIC2N.js.map +1 -0
- package/dist/{chunk-RPZMFGYI.js → chunk-3YOPTHZH.js} +3 -3
- package/dist/{chunk-RPZMFGYI.js.map → chunk-3YOPTHZH.js.map} +1 -1
- package/dist/{chunk-KFUFTZLS.js → chunk-44ZNZZUS.js} +3 -3
- package/dist/{chunk-KFUFTZLS.js.map → chunk-44ZNZZUS.js.map} +1 -1
- package/dist/{chunk-PJUP4BJD.js → chunk-47IPOYLQ.js} +3 -3
- package/dist/{chunk-PJUP4BJD.js.map → chunk-47IPOYLQ.js.map} +1 -1
- package/dist/{chunk-OJPPSJMF.js → chunk-4XYFJIRC.js} +3 -3
- package/dist/{chunk-OJPPSJMF.js.map → chunk-4XYFJIRC.js.map} +1 -1
- package/dist/{chunk-SOJW47EZ.js → chunk-5YX76GH6.js} +3 -3
- package/dist/{chunk-SOJW47EZ.js.map → chunk-5YX76GH6.js.map} +1 -1
- package/dist/{chunk-7T4NK6W6.js → chunk-65YSFZAN.js} +3 -3
- package/dist/{chunk-7T4NK6W6.js.map → chunk-65YSFZAN.js.map} +1 -1
- package/dist/{chunk-3ZXZGZOX.js → chunk-6ORS6XOE.js} +3 -3
- package/dist/{chunk-3ZXZGZOX.js.map → chunk-6ORS6XOE.js.map} +1 -1
- package/dist/{chunk-2A3E5Y72.js → chunk-6V2LQEPT.js} +3 -3
- package/dist/{chunk-2A3E5Y72.js.map → chunk-6V2LQEPT.js.map} +1 -1
- package/dist/{chunk-5XCTTXC3.js → chunk-ACZNFEOZ.js} +3 -3
- package/dist/{chunk-5XCTTXC3.js.map → chunk-ACZNFEOZ.js.map} +1 -1
- package/dist/{chunk-GLEOUWPN.js → chunk-AJ2LNQUQ.js} +3 -3
- package/dist/{chunk-GLEOUWPN.js.map → chunk-AJ2LNQUQ.js.map} +1 -1
- package/dist/{chunk-SBKVVVYY.js → chunk-AX6P3SDS.js} +3 -3
- package/dist/{chunk-SBKVVVYY.js.map → chunk-AX6P3SDS.js.map} +1 -1
- package/dist/{chunk-VB53UMAL.js → chunk-B42EOFRD.js} +3 -3
- package/dist/{chunk-VB53UMAL.js.map → chunk-B42EOFRD.js.map} +1 -1
- package/dist/{chunk-GIXHBTHH.js → chunk-CFVSXYVT.js} +3 -3
- package/dist/{chunk-GIXHBTHH.js.map → chunk-CFVSXYVT.js.map} +1 -1
- package/dist/{chunk-KDE3NYTI.js → chunk-CX54TUTT.js} +3 -3
- package/dist/{chunk-KDE3NYTI.js.map → chunk-CX54TUTT.js.map} +1 -1
- package/dist/{chunk-BP4RQSX7.js → chunk-DJK6H3FD.js} +3 -3
- package/dist/{chunk-BP4RQSX7.js.map → chunk-DJK6H3FD.js.map} +1 -1
- package/dist/{chunk-4SMYNLTA.js → chunk-EOTSD2GL.js} +3 -3
- package/dist/{chunk-4SMYNLTA.js.map → chunk-EOTSD2GL.js.map} +1 -1
- package/dist/{chunk-YUFFAWNB.js → chunk-FELH4AAQ.js} +3 -3
- package/dist/{chunk-YUFFAWNB.js.map → chunk-FELH4AAQ.js.map} +1 -1
- package/dist/{chunk-NEMXW2LB.js → chunk-FM72LBCJ.js} +3 -3
- package/dist/{chunk-NEMXW2LB.js.map → chunk-FM72LBCJ.js.map} +1 -1
- package/dist/{chunk-VHTAVROO.js → chunk-FNQASFTK.js} +3 -3
- package/dist/{chunk-VHTAVROO.js.map → chunk-FNQASFTK.js.map} +1 -1
- package/dist/{chunk-Q2BAL2PF.js → chunk-FOE3XXBJ.js} +3 -3
- package/dist/{chunk-Q2BAL2PF.js.map → chunk-FOE3XXBJ.js.map} +1 -1
- package/dist/{chunk-7BGCWJQR.js → chunk-HKVOCYTN.js} +3 -3
- package/dist/{chunk-7BGCWJQR.js.map → chunk-HKVOCYTN.js.map} +1 -1
- package/dist/{chunk-JFKBFQA5.js → chunk-HNRFBJ25.js} +3 -3
- package/dist/{chunk-JFKBFQA5.js.map → chunk-HNRFBJ25.js.map} +1 -1
- package/dist/{chunk-QCQTTOMD.js → chunk-II5Q5RIO.js} +3 -3
- package/dist/{chunk-QCQTTOMD.js.map → chunk-II5Q5RIO.js.map} +1 -1
- package/dist/{chunk-QRXIYPWP.js → chunk-ITEIRMSH.js} +3 -3
- package/dist/{chunk-QRXIYPWP.js.map → chunk-ITEIRMSH.js.map} +1 -1
- package/dist/{chunk-JQTCCKZA.js → chunk-JP3SHERK.js} +3 -3
- package/dist/{chunk-JQTCCKZA.js.map → chunk-JP3SHERK.js.map} +1 -1
- package/dist/{chunk-VBEMLZGX.js → chunk-JS5T2CRO.js} +3 -3
- package/dist/{chunk-VBEMLZGX.js.map → chunk-JS5T2CRO.js.map} +1 -1
- package/dist/{chunk-VBQFE5RV.js → chunk-KXZH7BTX.js} +3 -3
- package/dist/{chunk-VBQFE5RV.js.map → chunk-KXZH7BTX.js.map} +1 -1
- package/dist/{chunk-MXB2GVEQ.js → chunk-LB4PMLCX.js} +3 -3
- package/dist/{chunk-MXB2GVEQ.js.map → chunk-LB4PMLCX.js.map} +1 -1
- package/dist/{chunk-CED2LKHI.js → chunk-LMGE2QEO.js} +3 -3
- package/dist/{chunk-CED2LKHI.js.map → chunk-LMGE2QEO.js.map} +1 -1
- package/dist/{chunk-PVCW4O37.js → chunk-MLEPCMTF.js} +3 -3
- package/dist/{chunk-PVCW4O37.js.map → chunk-MLEPCMTF.js.map} +1 -1
- package/dist/{chunk-H5QPJNVD.js → chunk-NSZEZTDO.js} +3 -3
- package/dist/{chunk-H5QPJNVD.js.map → chunk-NSZEZTDO.js.map} +1 -1
- package/dist/{chunk-AENNHS3S.js → chunk-QBSJM4XI.js} +3 -3
- package/dist/{chunk-AENNHS3S.js.map → chunk-QBSJM4XI.js.map} +1 -1
- package/dist/{chunk-XJA4B3F5.js → chunk-QCSMJTA6.js} +3 -3
- package/dist/{chunk-XJA4B3F5.js.map → chunk-QCSMJTA6.js.map} +1 -1
- package/dist/{chunk-G2WCT6PJ.js → chunk-QTG266XU.js} +3 -3
- package/dist/{chunk-G2WCT6PJ.js.map → chunk-QTG266XU.js.map} +1 -1
- package/dist/{chunk-RLWULF5B.js → chunk-RMJYXHBX.js} +3 -3
- package/dist/{chunk-RLWULF5B.js.map → chunk-RMJYXHBX.js.map} +1 -1
- package/dist/{chunk-P44UAK45.js → chunk-SPGNNN4R.js} +3 -3
- package/dist/{chunk-P44UAK45.js.map → chunk-SPGNNN4R.js.map} +1 -1
- package/dist/{chunk-CSEGVTKO.js → chunk-T4Z7HBZR.js} +3 -3
- package/dist/{chunk-CSEGVTKO.js.map → chunk-T4Z7HBZR.js.map} +1 -1
- package/dist/{chunk-PZGUZHI7.js → chunk-TW5I37AE.js} +3 -3
- package/dist/{chunk-PZGUZHI7.js.map → chunk-TW5I37AE.js.map} +1 -1
- package/dist/{chunk-AXNJFBYX.js → chunk-UJAWV6LM.js} +3 -3
- package/dist/{chunk-AXNJFBYX.js.map → chunk-UJAWV6LM.js.map} +1 -1
- package/dist/{chunk-4DTLUBRW.js → chunk-V2WCZBVE.js} +4 -4
- package/dist/{chunk-4DTLUBRW.js.map → chunk-V2WCZBVE.js.map} +1 -1
- package/dist/{chunk-YES6SPDT.js → chunk-V4LRBYOD.js} +3 -3
- package/dist/{chunk-YES6SPDT.js.map → chunk-V4LRBYOD.js.map} +1 -1
- package/dist/{chunk-4UBFLXS3.js → chunk-VFRFUU7A.js} +3 -3
- package/dist/{chunk-4UBFLXS3.js.map → chunk-VFRFUU7A.js.map} +1 -1
- package/dist/{chunk-BWIDDAR7.js → chunk-VLNFUEOR.js} +3 -3
- package/dist/{chunk-BWIDDAR7.js.map → chunk-VLNFUEOR.js.map} +1 -1
- package/dist/{chunk-ZJXOHLQE.js → chunk-VU7XKD4G.js} +3 -3
- package/dist/{chunk-ZJXOHLQE.js.map → chunk-VU7XKD4G.js.map} +1 -1
- package/dist/{chunk-V3HFDVZ3.js → chunk-W24RR5OD.js} +3 -3
- package/dist/{chunk-V3HFDVZ3.js.map → chunk-W24RR5OD.js.map} +1 -1
- package/dist/{chunk-A3OU6ICP.js → chunk-W743ORLA.js} +3 -3
- package/dist/{chunk-A3OU6ICP.js.map → chunk-W743ORLA.js.map} +1 -1
- package/dist/{chunk-TJLULCZW.js → chunk-WQVEJJV7.js} +3 -3
- package/dist/{chunk-TJLULCZW.js.map → chunk-WQVEJJV7.js.map} +1 -1
- package/dist/{chunk-ZAMPCRFJ.js → chunk-WX4Q4DTX.js} +3 -3
- package/dist/{chunk-ZAMPCRFJ.js.map → chunk-WX4Q4DTX.js.map} +1 -1
- package/dist/{chunk-U3AEEFVB.js → chunk-Y7JTBQUQ.js} +3 -3
- package/dist/{chunk-U3AEEFVB.js.map → chunk-Y7JTBQUQ.js.map} +1 -1
- package/dist/{chunk-K72DJOXR.js → chunk-ZAP4RIUL.js} +3 -3
- package/dist/{chunk-K72DJOXR.js.map → chunk-ZAP4RIUL.js.map} +1 -1
- package/dist/{chunk-BPJ3RN3U.js → chunk-ZEDDWVBB.js} +4 -4
- package/dist/{chunk-BPJ3RN3U.js.map → chunk-ZEDDWVBB.js.map} +1 -1
- package/dist/composites/agent-composer/index.js +2 -2
- package/dist/composites/agent-stream/index.js +8 -8
- package/dist/composites/agent-tool-renderer/index.js +5 -5
- package/dist/composites/approval-card/index.js +1 -1
- package/dist/composites/chat-composer/index.js +1 -1
- package/dist/composites/chat-message/index.js +6 -6
- package/dist/composites/choice-prompt/index.js +1 -1
- package/dist/composites/command-palette/index.js +2 -2
- package/dist/composites/confirm-dialog/index.js +2 -2
- package/dist/composites/confirm-prompt/index.js +1 -1
- package/dist/composites/cron-jobs-list/index.js +2 -2
- package/dist/composites/data-table/index.js +2 -2
- package/dist/composites/domain-config/index.js +1 -1
- package/dist/composites/env-var-editor/index.js +1 -1
- package/dist/composites/mcp-server-list/index.js +2 -2
- package/dist/composites/metric-card/index.js +2 -2
- package/dist/composites/multi-select-prompt/index.js +1 -1
- package/dist/composites/page-shell/index.js +3 -3
- package/dist/composites/permission-modal/index.js +2 -2
- package/dist/composites/preview-env-card/index.js +1 -1
- package/dist/composites/preview-panel/index.js +1 -1
- package/dist/composites/project-card/index.js +1 -1
- package/dist/composites/rollback-ui/index.js +1 -1
- package/dist/composites/skills-list/index.js +2 -2
- package/dist/composites/text-prompt/index.js +1 -1
- package/dist/index.js +53 -53
- package/dist/primitives/artifact-preview/index.js +1 -1
- package/dist/primitives/build-log-stream/index.js +1 -1
- package/dist/primitives/card/index.js +1 -1
- package/dist/primitives/channel-card/index.js +1 -1
- package/dist/primitives/cost-meter/index.js +1 -1
- package/dist/primitives/cron-job-card/index.js +1 -1
- package/dist/primitives/dialog/index.js +1 -1
- package/dist/primitives/diff-viewer/index.js +1 -1
- package/dist/primitives/empty-state/index.js +1 -1
- package/dist/primitives/folder-context-card/index.js +1 -1
- package/dist/primitives/hook-config/index.js +1 -1
- package/dist/primitives/hook-event-log/index.js +1 -1
- package/dist/primitives/mcp-server-card/index.js +1 -1
- package/dist/primitives/memory-editor/index.js +1 -1
- package/dist/primitives/metrics-panel/index.js +1 -1
- package/dist/primitives/model-card/index.js +1 -1
- package/dist/primitives/permission-matrix/index.js +1 -1
- package/dist/primitives/pin-input/index.js +1 -1
- package/dist/primitives/progress-checklist/index.js +1 -1
- package/dist/primitives/recent-folders-list/index.js +1 -1
- package/dist/primitives/running-tasks-panel/index.js +1 -1
- package/dist/primitives/session-timeline/index.js +1 -1
- package/dist/primitives/skill-card/index.js +1 -1
- package/dist/primitives/system-prompt-editor/index.js +1 -1
- package/dist/primitives/task-plan/index.js +1 -1
- package/dist/primitives/terminal-panel/index.js +1 -1
- package/dist/primitives/token-usage-chart/index.js +1 -1
- package/dist/primitives/tools-list/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2EUKYGH5.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { DataTable } from './chunk-
|
|
2
|
+
import { DataTable } from './chunk-DJK6H3FD.js';
|
|
3
3
|
import { CodeBlock } from './chunk-VHK2OUCW.js';
|
|
4
|
-
import { TerminalPanel } from './chunk-
|
|
5
|
-
import { DiffViewer } from './chunk-
|
|
4
|
+
import { TerminalPanel } from './chunk-6ORS6XOE.js';
|
|
5
|
+
import { DiffViewer } from './chunk-ZAP4RIUL.js';
|
|
6
6
|
import { CreatedFilesCard } from './chunk-2NZYMQKT.js';
|
|
7
7
|
import { cn } from './chunk-EWDN56AS.js';
|
|
8
8
|
import { WrenchIcon, ShieldIcon, AlertCircleIcon, CheckCircleIcon, LoaderIcon } from 'lucide-react';
|
|
@@ -208,5 +208,5 @@ function AgentToolRenderer({
|
|
|
208
208
|
AgentToolRenderer.displayName = "AgentToolRenderer";
|
|
209
209
|
|
|
210
210
|
export { AgentToolRenderer, ToolCallPart, defaultClassifyTool, defaultToolRegistry, resolveToolRenderer };
|
|
211
|
-
//# sourceMappingURL=chunk-
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
211
|
+
//# sourceMappingURL=chunk-2NTEJRPA.js.map
|
|
212
|
+
//# sourceMappingURL=chunk-2NTEJRPA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/composites/agent-tool-renderer/tool-call-part.tsx","../src/components/composites/agent-tool-renderer/agent-tool-renderer.tsx"],"names":["deriveToolName","jsx"],"mappings":"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","file":"chunk-REFY5MLN.js","sourcesContent":["/**\n * `<ToolCallPart>` — renders a `ToolUIPart` (static `tool-${name}` or\n * `dynamic-tool`) as an inline card with the tool name, the input args, the\n * resolved output / error, and the current invocation state.\n *\n * Uses our `<Card>` primitive (composite-layer dep is allowed).\n */\nimport { AlertCircleIcon, CheckCircleIcon, LoaderIcon, ShieldIcon, WrenchIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { ToolUIPart } from \"../../../types/chat.js\";\n\nexport interface ToolCallPartProps {\n part: ToolUIPart;\n}\n\nfunction deriveToolName(part: ToolUIPart): string {\n if (part.toolName) return part.toolName;\n if (part.type === \"dynamic-tool\") return \"dynamic-tool\";\n // type is `tool-${name}` — strip the prefix\n return part.type.slice(\"tool-\".length);\n}\n\nfunction stateBadge(state: ToolUIPart[\"state\"]): { icon: ReactNode; label: string; tone: string } {\n switch (state) {\n case \"input-streaming\":\n return {\n icon: <LoaderIcon className=\"size-3.5 animate-spin\" aria-hidden=\"true\" />,\n label: \"Streaming input\",\n tone: \"text-muted-foreground\",\n };\n case \"input-available\":\n return {\n icon: <WrenchIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Ready to call\",\n tone: \"text-primary\",\n };\n case \"approval-requested\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Awaiting approval\",\n tone: \"text-warning\",\n };\n case \"approval-responded\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Approval responded\",\n tone: \"text-primary\",\n };\n case \"output-available\":\n return {\n icon: <CheckCircleIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Completed\",\n tone: \"text-success\",\n };\n case \"output-error\":\n return {\n icon: <AlertCircleIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Error\",\n tone: \"text-destructive\",\n };\n case \"output-denied\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Denied\",\n tone: \"text-destructive\",\n };\n default:\n return {\n icon: <WrenchIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Unknown\",\n tone: \"text-muted-foreground\",\n };\n }\n}\n\nfunction safeStringify(value: unknown): string {\n if (value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function ToolCallPart({ part }: ToolCallPartProps): JSX.Element {\n const toolName = deriveToolName(part);\n const badge = stateBadge(part.state);\n const inputStr = safeStringify(part.input);\n const outputStr =\n part.state === \"output-available\" ? safeStringify(part.output) : (part.errorText ?? \"\");\n\n return (\n <div\n data-slot=\"tool-call-part\"\n className={cn(\"my-3 overflow-hidden rounded-lg border border-border bg-card\", \"shadow-sm\")}\n data-theo-tool-call={part.state}\n >\n <header className=\"flex items-center justify-between gap-3 border-border border-b bg-muted/30 px-3 py-1.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <WrenchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"truncate font-mono text-foreground text-label\">{toolName}</span>\n </div>\n <span\n className={cn(\n \"inline-flex items-center gap-1 text-label-caps uppercase tracking-wider\",\n badge.tone,\n )}\n >\n {badge.icon}\n <span>{badge.label}</span>\n </span>\n </header>\n\n {inputStr ? (\n <details className=\"border-border border-b\" open={part.state === \"input-streaming\"}>\n <summary className=\"cursor-pointer px-3 py-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider hover:text-foreground\">\n Input\n </summary>\n <pre className=\"overflow-x-auto bg-muted/20 px-3 py-2 text-code-sm\">\n <code>{inputStr}</code>\n </pre>\n </details>\n ) : null}\n\n {outputStr ? (\n <details open={part.state === \"output-error\" || part.state === \"output-available\"}>\n <summary\n className={cn(\n \"cursor-pointer px-3 py-1.5 font-mono text-label-caps uppercase tracking-wider hover:text-foreground\",\n part.state === \"output-error\" ? \"text-destructive\" : \"text-muted-foreground\",\n )}\n >\n {part.state === \"output-error\" ? \"Error\" : \"Output\"}\n </summary>\n <pre\n className={cn(\n \"overflow-x-auto px-3 py-2 text-code-sm\",\n part.state === \"output-error\" ? \"bg-destructive/5\" : \"bg-muted/20\",\n )}\n >\n <code>{outputStr}</code>\n </pre>\n </details>\n ) : null}\n </div>\n );\n}\n","/**\n * `<AgentToolRenderer>` + the tool-renderer **registry** (M5-3).\n *\n * Dispatches a `ToolUIPart` to a rich renderer by classification kind\n * (`diff` / `terminal` / `code` / `created-files` / `data-table`), falling back\n * to `<ToolCallPart>` for anything unmapped. Mirrors the existing\n * `partRenderers` / `dataRenderers` override registries on `<ChatMessage>` — the\n * registry is prop-threaded, no React context (ADR D2).\n *\n * The default renderers are **defensive best-effort** (ADR D3): `code` and\n * `terminal` are generic over any string output; `diff` / `created-files` /\n * `data-table` render their rich primitive only when the output already matches\n * the structured shape, else they degrade to `<ToolCallPart>` (never throw on\n * `unknown`). Faithful sdk-tools `ToolUIPart`→props adapters are the M5-4 slice\n * (`@theokit/ui/sdk-tools-adapters`).\n */\nimport type { JSX, ReactNode } from \"react\";\nimport type { ToolUIPart } from \"../../../types/chat.js\";\nimport { CreatedFilesCard } from \"../../primitives/created-files-card/index.js\";\nimport { type DiffHunk, DiffViewer } from \"../../primitives/diff-viewer/index.js\";\nimport { type TerminalLine, TerminalPanel } from \"../../primitives/terminal-panel/index.js\";\nimport { CodeBlock } from \"../code-block/index.js\";\nimport { DataTable } from \"../data-table/index.js\";\nimport { ToolCallPart } from \"./tool-call-part.js\";\n\n/** The rich surfaces a tool invocation can be dispatched to. */\nexport type ToolRendererKind = \"diff\" | \"terminal\" | \"code\" | \"created-files\" | \"data-table\";\n\n/** A renderer for one tool invocation. Returns `ReactNode` (never throws). */\nexport type ToolRenderer = (part: ToolUIPart) => ReactNode;\n\n/** Registry of renderers keyed by classification kind. */\nexport type ToolRendererRegistry = Record<ToolRendererKind, ToolRenderer>;\n\n/** Maps a tool part to a kind, or `undefined` to fall back to `<ToolCallPart>`. */\nexport type ClassifyTool = (part: ToolUIPart) => ToolRendererKind | undefined;\n\n/* ─── classify ───────────────────────────────────────────────────────── */\n\nfunction deriveToolName(part: ToolUIPart): string {\n if (part.toolName) return part.toolName;\n if (part.type === \"dynamic-tool\") return \"dynamic-tool\";\n return part.type.slice(\"tool-\".length);\n}\n\n// Substring heuristics over the tool name. Ordered: most specific first.\nconst KIND_HINTS: ReadonlyArray<[ToolRendererKind, readonly string[]]> = [\n [\"diff\", [\"diff\", \"patch\"]],\n [\"created-files\", [\"edit_file\", \"write_file\", \"create_file\", \"created_file\"]],\n [\"terminal\", [\"shell\", \"bash\", \"exec\", \"run_\", \"command\", \"vitest\", \"pytest\"]],\n [\"data-table\", [\"list_dir\", \"glob\", \"list_\", \"search\", \"grep\", \"find\"]],\n [\"code\", [\"read_file\", \"cat_file\", \"code\", \"read\"]],\n];\n\n/**\n * Default classifier — a name-substring heuristic. Only affects the default;\n * fully overridable per call (ADR D1/D2). Never throws; unmapped → `undefined`.\n */\nexport function defaultClassifyTool(part: ToolUIPart): ToolRendererKind | undefined {\n const name = deriveToolName(part).toLowerCase();\n for (const [kind, hints] of KIND_HINTS) {\n if (hints.some((h) => name.includes(h))) return kind;\n }\n return undefined;\n}\n\n/**\n * Resolve the renderer for a part: `classify` → registry lookup. Returns\n * `undefined` when the tool is unmapped (the `<ToolCallPart>` fallback signal).\n */\nexport function resolveToolRenderer(\n registry: ToolRendererRegistry,\n classify: ClassifyTool,\n part: ToolUIPart,\n): ToolRenderer | undefined {\n const kind = classify(part);\n return kind ? registry[kind] : undefined;\n}\n\n/* ─── shape helpers (defensive) ──────────────────────────────────────── */\n\nfunction stringify(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStructuredDiff(\n o: unknown,\n): o is { path: string; stats?: { added: number; removed: number }; hunks: DiffHunk[] } {\n return isRecord(o) && typeof o.path === \"string\" && Array.isArray(o.hunks);\n}\n\nfunction isStructuredFiles(\n o: unknown,\n): o is { title?: ReactNode; files: Array<{ id: string; name: string }> } {\n return (\n isRecord(o) &&\n Array.isArray(o.files) &&\n o.files.every((f) => isRecord(f) && typeof f.id === \"string\" && typeof f.name === \"string\")\n );\n}\n\nfunction isObjectRows(o: unknown): o is Array<Record<string, unknown>> {\n return Array.isArray(o) && o.length > 0 && o.every(isRecord);\n}\n\nfunction toTerminalLines(output: unknown): TerminalLine[] {\n return stringify(output)\n .split(/\\r?\\n/)\n .map((content, i) => ({ id: `line-${i}`, kind: \"stdout\" as const, content }));\n}\n\nfunction renderDataTable(rows: Array<Record<string, unknown>>): JSX.Element {\n const columns = Object.keys(rows[0] ?? {}).map((key) => ({\n key,\n label: key,\n render: (row: Record<string, unknown>) => stringify(row[key]),\n }));\n return <DataTable data={rows} columns={columns} rowKey={(row) => stringify(row)} />;\n}\n\n/* ─── default registry ───────────────────────────────────────────────── */\n\nexport const defaultToolRegistry: ToolRendererRegistry = {\n code: (part) => <CodeBlock code={stringify(part.output)} copyable />,\n terminal: (part) => <TerminalPanel lines={toTerminalLines(part.output)} />,\n diff: (part) =>\n isStructuredDiff(part.output) ? (\n <DiffViewer path={part.output.path} stats={part.output.stats} hunks={part.output.hunks} />\n ) : (\n <ToolCallPart part={part} />\n ),\n \"created-files\": (part) =>\n isStructuredFiles(part.output) ? (\n <CreatedFilesCard files={part.output.files} title={part.output.title} />\n ) : (\n <ToolCallPart part={part} />\n ),\n \"data-table\": (part) =>\n isObjectRows(part.output) ? renderDataTable(part.output) : <ToolCallPart part={part} />,\n};\n\n/* ─── component ──────────────────────────────────────────────────────── */\n\nexport interface AgentToolRendererProps {\n part: ToolUIPart;\n /** Override the default registry (shallow-merge over `defaultToolRegistry`). */\n toolRenderers?: ToolRendererRegistry;\n /** Override the default classifier. */\n classifyTool?: ClassifyTool;\n}\n\n/**\n * Render one `ToolUIPart` through the registry, falling back to `<ToolCallPart>`\n * when the tool is unmapped. Reusable outside `<ChatMessage>`.\n *\n * Rich renderers apply ONLY to the `output-available` state — they render\n * `part.output`. Every other state (`input-streaming` / `input-available` /\n * `approval-*` / `output-error` / `output-denied`) carries no output (and, for\n * errors, only `errorText`), so it routes to `<ToolCallPart>`, which renders the\n * state badge, the input, and the error. This prevents a classified-but-errored\n * tool (e.g. a `shell` that failed) from rendering an empty rich surface and\n * dropping the error message.\n */\nexport function AgentToolRenderer({\n part,\n toolRenderers = defaultToolRegistry,\n classifyTool = defaultClassifyTool,\n}: AgentToolRendererProps): JSX.Element {\n const renderer =\n part.state === \"output-available\"\n ? resolveToolRenderer(toolRenderers, classifyTool, part)\n : undefined;\n // `display: contents` wrapper — carries the data-slot (shadcn v4 convention)\n // without introducing a layout box around the resolved renderer.\n return (\n <div data-slot=\"agent-tool-renderer\" className=\"contents\">\n {renderer ? renderer(part) : <ToolCallPart part={part} />}\n </div>\n );\n}\n\nAgentToolRenderer.displayName = \"AgentToolRenderer\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/agent-tool-renderer/tool-call-part.tsx","../src/components/composites/agent-tool-renderer/agent-tool-renderer.tsx"],"names":["deriveToolName","jsx"],"mappings":"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","file":"chunk-2NTEJRPA.js","sourcesContent":["/**\n * `<ToolCallPart>` — renders a `ToolUIPart` (static `tool-${name}` or\n * `dynamic-tool`) as an inline card with the tool name, the input args, the\n * resolved output / error, and the current invocation state.\n *\n * Uses our `<Card>` primitive (composite-layer dep is allowed).\n */\nimport { AlertCircleIcon, CheckCircleIcon, LoaderIcon, ShieldIcon, WrenchIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { ToolUIPart } from \"../../../types/chat.js\";\n\nexport interface ToolCallPartProps {\n part: ToolUIPart;\n}\n\nfunction deriveToolName(part: ToolUIPart): string {\n if (part.toolName) return part.toolName;\n if (part.type === \"dynamic-tool\") return \"dynamic-tool\";\n // type is `tool-${name}` — strip the prefix\n return part.type.slice(\"tool-\".length);\n}\n\nfunction stateBadge(state: ToolUIPart[\"state\"]): { icon: ReactNode; label: string; tone: string } {\n switch (state) {\n case \"input-streaming\":\n return {\n icon: <LoaderIcon className=\"size-3.5 animate-spin\" aria-hidden=\"true\" />,\n label: \"Streaming input\",\n tone: \"text-muted-foreground\",\n };\n case \"input-available\":\n return {\n icon: <WrenchIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Ready to call\",\n tone: \"text-primary\",\n };\n case \"approval-requested\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Awaiting approval\",\n tone: \"text-warning\",\n };\n case \"approval-responded\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Approval responded\",\n tone: \"text-primary\",\n };\n case \"output-available\":\n return {\n icon: <CheckCircleIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Completed\",\n tone: \"text-success\",\n };\n case \"output-error\":\n return {\n icon: <AlertCircleIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Error\",\n tone: \"text-destructive\",\n };\n case \"output-denied\":\n return {\n icon: <ShieldIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Denied\",\n tone: \"text-destructive\",\n };\n default:\n return {\n icon: <WrenchIcon className=\"size-3.5\" aria-hidden=\"true\" />,\n label: \"Unknown\",\n tone: \"text-muted-foreground\",\n };\n }\n}\n\nfunction safeStringify(value: unknown): string {\n if (value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function ToolCallPart({ part }: ToolCallPartProps): JSX.Element {\n const toolName = deriveToolName(part);\n const badge = stateBadge(part.state);\n const inputStr = safeStringify(part.input);\n const outputStr =\n part.state === \"output-available\" ? safeStringify(part.output) : (part.errorText ?? \"\");\n\n return (\n <div\n data-slot=\"tool-call-part\"\n className={cn(\"my-3 overflow-hidden rounded-lg border border-border bg-card\", \"shadow-sm\")}\n data-theo-tool-call={part.state}\n >\n <header className=\"flex items-center justify-between gap-3 border-border border-b bg-muted/30 px-3 py-1.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <WrenchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"truncate font-mono text-foreground text-label\">{toolName}</span>\n </div>\n <span\n className={cn(\n \"inline-flex items-center gap-1 text-label-caps uppercase tracking-wider\",\n badge.tone,\n )}\n >\n {badge.icon}\n <span>{badge.label}</span>\n </span>\n </header>\n\n {inputStr ? (\n <details className=\"border-border border-b\" open={part.state === \"input-streaming\"}>\n <summary className=\"cursor-pointer px-3 py-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider hover:text-foreground\">\n Input\n </summary>\n <pre className=\"overflow-x-auto bg-muted/20 px-3 py-2 text-code-sm\">\n <code>{inputStr}</code>\n </pre>\n </details>\n ) : null}\n\n {outputStr ? (\n <details open={part.state === \"output-error\" || part.state === \"output-available\"}>\n <summary\n className={cn(\n \"cursor-pointer px-3 py-1.5 font-mono text-label-caps uppercase tracking-wider hover:text-foreground\",\n part.state === \"output-error\" ? \"text-destructive\" : \"text-muted-foreground\",\n )}\n >\n {part.state === \"output-error\" ? \"Error\" : \"Output\"}\n </summary>\n <pre\n className={cn(\n \"overflow-x-auto px-3 py-2 text-code-sm\",\n part.state === \"output-error\" ? \"bg-destructive/5\" : \"bg-muted/20\",\n )}\n >\n <code>{outputStr}</code>\n </pre>\n </details>\n ) : null}\n </div>\n );\n}\n","/**\n * `<AgentToolRenderer>` + the tool-renderer **registry** (M5-3).\n *\n * Dispatches a `ToolUIPart` to a rich renderer by classification kind\n * (`diff` / `terminal` / `code` / `created-files` / `data-table`), falling back\n * to `<ToolCallPart>` for anything unmapped. Mirrors the existing\n * `partRenderers` / `dataRenderers` override registries on `<ChatMessage>` — the\n * registry is prop-threaded, no React context (ADR D2).\n *\n * The default renderers are **defensive best-effort** (ADR D3): `code` and\n * `terminal` are generic over any string output; `diff` / `created-files` /\n * `data-table` render their rich primitive only when the output already matches\n * the structured shape, else they degrade to `<ToolCallPart>` (never throw on\n * `unknown`). Faithful sdk-tools `ToolUIPart`→props adapters are the M5-4 slice\n * (`@theokit/ui/sdk-tools-adapters`).\n */\nimport type { JSX, ReactNode } from \"react\";\nimport type { ToolUIPart } from \"../../../types/chat.js\";\nimport { CreatedFilesCard } from \"../../primitives/created-files-card/index.js\";\nimport { type DiffHunk, DiffViewer } from \"../../primitives/diff-viewer/index.js\";\nimport { type TerminalLine, TerminalPanel } from \"../../primitives/terminal-panel/index.js\";\nimport { CodeBlock } from \"../code-block/index.js\";\nimport { DataTable } from \"../data-table/index.js\";\nimport { ToolCallPart } from \"./tool-call-part.js\";\n\n/** The rich surfaces a tool invocation can be dispatched to. */\nexport type ToolRendererKind = \"diff\" | \"terminal\" | \"code\" | \"created-files\" | \"data-table\";\n\n/** A renderer for one tool invocation. Returns `ReactNode` (never throws). */\nexport type ToolRenderer = (part: ToolUIPart) => ReactNode;\n\n/** Registry of renderers keyed by classification kind. */\nexport type ToolRendererRegistry = Record<ToolRendererKind, ToolRenderer>;\n\n/** Maps a tool part to a kind, or `undefined` to fall back to `<ToolCallPart>`. */\nexport type ClassifyTool = (part: ToolUIPart) => ToolRendererKind | undefined;\n\n/* ─── classify ───────────────────────────────────────────────────────── */\n\nfunction deriveToolName(part: ToolUIPart): string {\n if (part.toolName) return part.toolName;\n if (part.type === \"dynamic-tool\") return \"dynamic-tool\";\n return part.type.slice(\"tool-\".length);\n}\n\n// Substring heuristics over the tool name. Ordered: most specific first.\nconst KIND_HINTS: ReadonlyArray<[ToolRendererKind, readonly string[]]> = [\n [\"diff\", [\"diff\", \"patch\"]],\n [\"created-files\", [\"edit_file\", \"write_file\", \"create_file\", \"created_file\"]],\n [\"terminal\", [\"shell\", \"bash\", \"exec\", \"run_\", \"command\", \"vitest\", \"pytest\"]],\n [\"data-table\", [\"list_dir\", \"glob\", \"list_\", \"search\", \"grep\", \"find\"]],\n [\"code\", [\"read_file\", \"cat_file\", \"code\", \"read\"]],\n];\n\n/**\n * Default classifier — a name-substring heuristic. Only affects the default;\n * fully overridable per call (ADR D1/D2). Never throws; unmapped → `undefined`.\n */\nexport function defaultClassifyTool(part: ToolUIPart): ToolRendererKind | undefined {\n const name = deriveToolName(part).toLowerCase();\n for (const [kind, hints] of KIND_HINTS) {\n if (hints.some((h) => name.includes(h))) return kind;\n }\n return undefined;\n}\n\n/**\n * Resolve the renderer for a part: `classify` → registry lookup. Returns\n * `undefined` when the tool is unmapped (the `<ToolCallPart>` fallback signal).\n */\nexport function resolveToolRenderer(\n registry: ToolRendererRegistry,\n classify: ClassifyTool,\n part: ToolUIPart,\n): ToolRenderer | undefined {\n const kind = classify(part);\n return kind ? registry[kind] : undefined;\n}\n\n/* ─── shape helpers (defensive) ──────────────────────────────────────── */\n\nfunction stringify(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStructuredDiff(\n o: unknown,\n): o is { path: string; stats?: { added: number; removed: number }; hunks: DiffHunk[] } {\n return isRecord(o) && typeof o.path === \"string\" && Array.isArray(o.hunks);\n}\n\nfunction isStructuredFiles(\n o: unknown,\n): o is { title?: ReactNode; files: Array<{ id: string; name: string }> } {\n return (\n isRecord(o) &&\n Array.isArray(o.files) &&\n o.files.every((f) => isRecord(f) && typeof f.id === \"string\" && typeof f.name === \"string\")\n );\n}\n\nfunction isObjectRows(o: unknown): o is Array<Record<string, unknown>> {\n return Array.isArray(o) && o.length > 0 && o.every(isRecord);\n}\n\nfunction toTerminalLines(output: unknown): TerminalLine[] {\n return stringify(output)\n .split(/\\r?\\n/)\n .map((content, i) => ({ id: `line-${i}`, kind: \"stdout\" as const, content }));\n}\n\nfunction renderDataTable(rows: Array<Record<string, unknown>>): JSX.Element {\n const columns = Object.keys(rows[0] ?? {}).map((key) => ({\n key,\n label: key,\n render: (row: Record<string, unknown>) => stringify(row[key]),\n }));\n return <DataTable data={rows} columns={columns} rowKey={(row) => stringify(row)} />;\n}\n\n/* ─── default registry ───────────────────────────────────────────────── */\n\nexport const defaultToolRegistry: ToolRendererRegistry = {\n code: (part) => <CodeBlock code={stringify(part.output)} copyable />,\n terminal: (part) => <TerminalPanel lines={toTerminalLines(part.output)} />,\n diff: (part) =>\n isStructuredDiff(part.output) ? (\n <DiffViewer path={part.output.path} stats={part.output.stats} hunks={part.output.hunks} />\n ) : (\n <ToolCallPart part={part} />\n ),\n \"created-files\": (part) =>\n isStructuredFiles(part.output) ? (\n <CreatedFilesCard files={part.output.files} title={part.output.title} />\n ) : (\n <ToolCallPart part={part} />\n ),\n \"data-table\": (part) =>\n isObjectRows(part.output) ? renderDataTable(part.output) : <ToolCallPart part={part} />,\n};\n\n/* ─── component ──────────────────────────────────────────────────────── */\n\nexport interface AgentToolRendererProps {\n part: ToolUIPart;\n /** Override the default registry (shallow-merge over `defaultToolRegistry`). */\n toolRenderers?: ToolRendererRegistry;\n /** Override the default classifier. */\n classifyTool?: ClassifyTool;\n}\n\n/**\n * Render one `ToolUIPart` through the registry, falling back to `<ToolCallPart>`\n * when the tool is unmapped. Reusable outside `<ChatMessage>`.\n *\n * Rich renderers apply ONLY to the `output-available` state — they render\n * `part.output`. Every other state (`input-streaming` / `input-available` /\n * `approval-*` / `output-error` / `output-denied`) carries no output (and, for\n * errors, only `errorText`), so it routes to `<ToolCallPart>`, which renders the\n * state badge, the input, and the error. This prevents a classified-but-errored\n * tool (e.g. a `shell` that failed) from rendering an empty rich surface and\n * dropping the error message.\n */\nexport function AgentToolRenderer({\n part,\n toolRenderers = defaultToolRegistry,\n classifyTool = defaultClassifyTool,\n}: AgentToolRendererProps): JSX.Element {\n const renderer =\n part.state === \"output-available\"\n ? resolveToolRenderer(toolRenderers, classifyTool, part)\n : undefined;\n // `display: contents` wrapper — carries the data-slot (shadcn v4 convention)\n // without introducing a layout box around the resolved renderer.\n return (\n <div data-slot=\"agent-tool-renderer\" className=\"contents\">\n {renderer ? renderer(part) : <ToolCallPart part={part} />}\n </div>\n );\n}\n\nAgentToolRenderer.displayName = \"AgentToolRenderer\";\n"]}
|
|
@@ -6,7 +6,7 @@ import { forwardRef } from 'react';
|
|
|
6
6
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
8
|
var cardVariants = cva(
|
|
9
|
-
"grid w-full gap-3 rounded-xl border p-4 transition-colors duration-base ease-out-soft",
|
|
9
|
+
"grid w-full gap-3 rounded-xl border border-border p-4 transition-colors duration-base ease-out-soft",
|
|
10
10
|
{
|
|
11
11
|
variants: {
|
|
12
12
|
severity: {
|
|
@@ -94,5 +94,5 @@ var ApprovalCard = forwardRef(
|
|
|
94
94
|
ApprovalCard.displayName = "ApprovalCard";
|
|
95
95
|
|
|
96
96
|
export { ApprovalCard };
|
|
97
|
-
//# sourceMappingURL=chunk-
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
97
|
+
//# sourceMappingURL=chunk-357XIC2N.js.map
|
|
98
|
+
//# sourceMappingURL=chunk-357XIC2N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/approval-card/approval-card.tsx"],"names":[],"mappings":"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","file":"chunk-357XIC2N.js","sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { AlertTriangle, Lock, ShieldCheck } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport { Button } from \"../../primitives/button/index.js\";\n\n/**\n * ApprovalCard — inline pause-and-ask card for an agent stream.\n *\n * Used when the agent wants to perform an action that requires the user's\n * consent (run a destructive command, use a new tool, edit outside the\n * sandbox, etc.). Renders as a bordered card inside the conversation stream,\n * pauses the visual flow, and exposes Deny / Approve / Always-allow actions.\n */\n\nconst cardVariants = cva(\n \"grid w-full gap-3 rounded-xl border border-border p-4 transition-colors duration-base ease-out-soft\",\n {\n variants: {\n severity: {\n info: \"border-info/40 bg-info/5\",\n warning: \"border-warning/40 bg-warning/5\",\n destructive: \"border-destructive/40 bg-destructive/5\",\n },\n },\n defaultVariants: { severity: \"warning\" },\n },\n);\n\nconst ICON_FOR_SEVERITY: Record<NonNullable<ApprovalSeverity>, IconComponent> = {\n info: ShieldCheck,\n warning: AlertTriangle,\n destructive: Lock,\n};\n\nconst ICON_TONE: Record<NonNullable<ApprovalSeverity>, string> = {\n info: \"text-info\",\n warning: \"text-warning\",\n destructive: \"text-destructive\",\n};\n\ntype ApprovalSeverity = NonNullable<VariantProps<typeof cardVariants>[\"severity\"]>;\n\ninterface ApprovalCardProps\n extends Omit<HTMLAttributes<HTMLElement>, \"title\">,\n VariantProps<typeof cardVariants> {\n /** Short headline (\"Run destructive command?\"). */\n title: ReactNode;\n /** What is being requested (command, file path, tool name…). Renders monospace. */\n request: ReactNode;\n /** Optional explanation line under the request. */\n description?: ReactNode;\n /** Optional expandable details (e.g. full command, file diff). */\n details?: ReactNode;\n /** Pressing the primary \"Approve\" button. */\n onApprove?: () => void;\n /** Pressing \"Deny\". */\n onDeny?: () => void;\n /** Pressing \"Always allow\" — optional tertiary action. */\n onAlways?: () => void;\n /** Customise the icon shown in the corner. */\n icon?: IconComponent;\n}\n\nconst ApprovalCard = forwardRef<HTMLElement, ApprovalCardProps>(\n (\n {\n className,\n severity = \"warning\",\n title,\n request,\n description,\n details,\n onApprove,\n onDeny,\n onAlways,\n icon,\n ...props\n },\n ref,\n ) => {\n const resolvedSeverity: ApprovalSeverity = severity ?? \"warning\";\n const Icon = icon ?? ICON_FOR_SEVERITY[resolvedSeverity];\n return (\n <section\n data-slot=\"approval-card\"\n ref={ref}\n role=\"alertdialog\"\n aria-label={typeof title === \"string\" ? title : \"Approval required\"}\n className={cn(cardVariants({ severity: resolvedSeverity }), className)}\n {...props}\n >\n <header className=\"flex items-start gap-3\">\n <span\n className={cn(\"mt-0.5 inline-flex shrink-0\", ICON_TONE[resolvedSeverity])}\n aria-hidden=\"true\"\n >\n <Icon className=\"size-4\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <h4 className=\"font-display text-foreground text-title-md tracking-tight\">{title}</h4>\n <code className=\"overflow-hidden break-words font-mono text-code-md text-muted-foreground\">\n {request}\n </code>\n {description ? (\n <p className=\"text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n </header>\n {details ? (\n <details className=\"rounded-md border border-border/40 bg-background/40 px-3 py-2 text-body-sm\">\n <summary className=\"cursor-pointer select-none font-mono text-label text-muted-foreground\">\n Show details\n </summary>\n <div className=\"mt-2 break-words\">{details}</div>\n </details>\n ) : null}\n <footer className=\"flex flex-wrap items-center justify-end gap-2\">\n {onAlways ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={onAlways}>\n Always allow\n </Button>\n ) : null}\n {onDeny ? (\n <Button size=\"sm\" variant=\"secondary\" onClick={onDeny}>\n Deny\n </Button>\n ) : null}\n {onApprove ? (\n <Button\n size=\"sm\"\n variant={resolvedSeverity === \"destructive\" ? \"destructive\" : \"primary\"}\n onClick={onApprove}\n >\n Approve\n </Button>\n ) : null}\n </footer>\n </section>\n );\n },\n);\nApprovalCard.displayName = \"ApprovalCard\";\n\nexport { ApprovalCard, type ApprovalSeverity };\n"]}
|
|
@@ -9,7 +9,7 @@ var EmptyState = forwardRef(
|
|
|
9
9
|
"data-slot": "empty-state",
|
|
10
10
|
ref,
|
|
11
11
|
className: cn(
|
|
12
|
-
"grid place-items-center gap-3 rounded-2xl border bg-card px-6 py-12 text-center",
|
|
12
|
+
"grid place-items-center gap-3 rounded-2xl border border-border bg-card px-6 py-12 text-center",
|
|
13
13
|
dashed ? "border-border/60 border-dashed" : "border-border/40",
|
|
14
14
|
className
|
|
15
15
|
),
|
|
@@ -27,5 +27,5 @@ var EmptyState = forwardRef(
|
|
|
27
27
|
EmptyState.displayName = "EmptyState";
|
|
28
28
|
|
|
29
29
|
export { EmptyState };
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
30
|
+
//# sourceMappingURL=chunk-3YOPTHZH.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-3YOPTHZH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/primitives/empty-state/empty-state.tsx"],"names":[],"mappings":";;;;AAwBA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CACE,EAAE,SAAA,EAAW,IAAA,EAAM,MAAM,KAAA,EAAO,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,MAAA,GAAS,IAAA,EAAM,GAAG,KAAA,IAChF,GAAA,qBAEA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/empty-state/empty-state.tsx"],"names":[],"mappings":";;;;AAwBA,IAAM,UAAA,GAAa,UAAA;AAAA,EACjB,CACE,EAAE,SAAA,EAAW,IAAA,EAAM,MAAM,KAAA,EAAO,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,MAAA,GAAS,IAAA,EAAM,GAAG,KAAA,IAChF,GAAA,qBAEA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,+FAAA;AAAA,QACA,SAAS,gCAAA,GAAmC,kBAAA;AAAA,QAC5C;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wEAAA,EACd,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,aAAA,EAAY,MAAA,EAAO,CAAA,EAC9C,CAAA,GACE,IAAA;AAAA,QACH,0BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EAA6D,mBAAQ,CAAA,GAChF,IAAA;AAAA,wBACJ,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EAA8C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACjE,8BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,uBAAY,CAAA,GACtE,IAAA;AAAA,QACH,yBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAQ,kBAAO,CAAA,GAAS;AAAA;AAAA;AAAA;AAGvD;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-3YOPTHZH.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\ninterface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Icon shown above the title. */\n icon?: IconComponent;\n title: ReactNode;\n description?: ReactNode;\n /** Optional action slot (typically <Button>). */\n action?: ReactNode;\n /** Hint shown above the title (e.g. uppercase eyebrow). */\n eyebrow?: ReactNode;\n /** Bordered dashed surface (placeholder vibe). Default true. */\n dashed?: boolean;\n}\n\n/**\n * EmptyState — visual placeholder for empty lists / first-run screens.\n *\n * Composition: icon + eyebrow + title + description + action. All slots are\n * optional except title.\n */\nconst EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n { className, icon: Icon, title, description, action, eyebrow, dashed = true, ...props },\n ref,\n ) => (\n <div\n data-slot=\"empty-state\"\n ref={ref}\n className={cn(\n \"grid place-items-center gap-3 rounded-2xl border border-border bg-card px-6 py-12 text-center\",\n dashed ? \"border-border/60 border-dashed\" : \"border-border/40\",\n className,\n )}\n {...props}\n >\n {Icon ? (\n <span className=\"grid size-12 place-items-center rounded-2xl bg-primary/10 text-primary\">\n <Icon className=\"size-6\" aria-hidden=\"true\" />\n </span>\n ) : null}\n {eyebrow ? (\n <p className=\"font-mono text-label-caps text-muted-foreground uppercase\">{eyebrow}</p>\n ) : null}\n <h3 className=\"font-display text-foreground text-title-md\">{title}</h3>\n {description ? (\n <p className=\"max-w-md text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n {action ? <div className=\"mt-2\">{action}</div> : null}\n </div>\n ),\n);\nEmptyState.displayName = \"EmptyState\";\n\nexport { EmptyState };\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Input } from './chunk-BYUWQ6OP.js';
|
|
3
|
-
import { Dialog } from './chunk-
|
|
3
|
+
import { Dialog } from './chunk-T4Z7HBZR.js';
|
|
4
4
|
import { Button } from './chunk-25KBUQEQ.js';
|
|
5
5
|
import { Loader2 } from 'lucide-react';
|
|
6
6
|
import { forwardRef, useState, useRef, useEffect } from 'react';
|
|
@@ -107,5 +107,5 @@ var ConfirmDialog = forwardRef(
|
|
|
107
107
|
ConfirmDialog.displayName = "ConfirmDialog";
|
|
108
108
|
|
|
109
109
|
export { ConfirmDialog };
|
|
110
|
-
//# sourceMappingURL=chunk-
|
|
111
|
-
//# sourceMappingURL=chunk-
|
|
110
|
+
//# sourceMappingURL=chunk-44ZNZZUS.js.map
|
|
111
|
+
//# sourceMappingURL=chunk-44ZNZZUS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/composites/confirm-dialog/confirm-dialog.tsx"],"names":[],"mappings":";;;;;;;AAgDA,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CACE;AAAA,IACE,IAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA,GAAe,SAAA;AAAA,IACf,WAAA,GAAc,QAAA;AAAA,IACd,MAAA,GAAS,SAAA;AAAA,IACT,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS;AAAA,KAEX,GAAA,KACG;AACH,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,OAAiC,IAAI,CAAA;AAEvD,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,kBAAA;AACzB,IAAA,MAAM,aAAA,GAAgB,cAAA,GAAiB,WAAA,KAAgB,kBAAA,GAAqB,IAAA;AAC5E,IAAA,MAAM,WAAA,GAAc,oBAAoB,IAAA,IAAQ,eAAA;AAChD,IAAA,MAAM,UAAA,GAAa,iBAAiB,CAAC,WAAA;AAGrC,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,IAAA,EAAM,cAAA,CAAe,EAAE,CAAA;AAAA,IAC9B,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,EAAA,GAAK,OAAO,UAAA,CAAW,MAAM,UAAU,OAAA,EAAS,KAAA,IAAS,CAAC,CAAA;AAChE,QAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AAAA,MACrC;AAAA,IACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,IAAA,eAAe,aAAA,GAAgB;AAC7B,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAA,CAAA,MAAQ;AAAA,MAER,CAAA,SAAE;AACA,QAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,SAAS,mBAAmB,CAAA,EAAoC;AAC9D,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,UAAA,EAAY;AACnC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAK,aAAA,EAAc;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAY,YAAA,EAClB,QAAA,kBAAA,IAAA,CAAC,OAAO,OAAA,EAAP,EAAe,WAAA,EAAU,gBAAA,EAAiB,GAAA,EACzC,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,MAAA,CAAO,QAAP,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,CAAO,KAAA,EAAP,EAAc,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACrB,GAAA,CAAC,MAAA,CAAO,WAAA,EAAP,EAAoB,QAAA,EAAA,WAAA,EAAY;AAAA,OAAA,EACnC,CAAA;AAAA,MACC,cAAA,mBACC,IAAA,CAAC,MAAA,CAAO,IAAA,EAAP,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,yCAAA,EAA0C,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,UAChD,GAAA;AAAA,0BACL,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA,kBAAA,EACH,CAAA;AAAA,UAAQ,GAAA;AAAA,UAAI;AAAA,SAAA,EAEd,CAAA;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,SAAA,EAAW,kBAAA;AAAA,YACX,YAAA,EAAa,KAAA;AAAA,YACb,YAAA,EAAW;AAAA;AAAA;AACb,OAAA,EACF,CAAA,GACE,IAAA;AAAA,sBACJ,IAAA,CAAC,MAAA,CAAO,MAAA,EAAP,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,YACjC,QAAA,EAAU,WAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAA,KAAW,aAAA,GAAgB,aAAA,GAAgB,SAAA;AAAA,YACpD,OAAA,EAAS,MAAM,KAAK,aAAA,EAAc;AAAA,YAClC,UAAU,CAAC,UAAA;AAAA,YACX,cAAA,EAAY,IAAA;AAAA,YAEX,QAAA,EAAA;AAAA,cAAA,WAAA,uBAAe,OAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,uBAAsB,CAAA,GAAK,IAAA;AAAA,cAC/E;AAAA;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/confirm-dialog/confirm-dialog.tsx"],"names":[],"mappings":"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","file":"chunk-44ZNZZUS.js","sourcesContent":["\"use client\";\n\nimport { Loader2 } from \"lucide-react\";\nimport { forwardRef, useEffect, useRef, useState } from \"react\";\nimport type { KeyboardEvent, ReactNode } from \"react\";\nimport { Button } from \"../../primitives/button/index.js\";\nimport { Dialog } from \"../../primitives/dialog/index.js\";\nimport { Input } from \"../../primitives/input/index.js\";\n\n/**\n * ConfirmDialog — controlled confirmation modal built on `Dialog`.\n *\n * Focuses Cancel on open (deliberate — NOT the destructive button).\n * `intent=\"destructive\"` styles the confirm button with the destructive\n * variant. `confirmationPhrase` enables typed-confirmation guard:\n * the confirm button is disabled until the input value matches the\n * phrase exactly (case-sensitive). An empty string phrase is treated\n * as \"no phrase required\" (`!!confirmationPhrase`). Pressing Enter in\n * the input triggers confirm when `canConfirm` is true.\n *\n * `onConfirm` can be async. While the returned promise is pending,\n * both buttons are disabled and a `Loader2` spinner appears. On\n * resolve, the dialog closes via `onOpenChange(false)`. On reject,\n * the dialog stays open so the consumer can show their own error.\n *\n * @example\n * <ConfirmDialog\n * open={open} onOpenChange={setOpen}\n * title=\"Delete project\"\n * description=\"This cannot be undone.\"\n * intent=\"destructive\"\n * confirmationPhrase=\"my-project\"\n * onConfirm={async () => api.deleteProject(id)}\n * />\n */\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: ReactNode;\n description: ReactNode;\n confirmLabel?: ReactNode;\n cancelLabel?: ReactNode;\n intent?: \"default\" | \"destructive\";\n confirmationPhrase?: string;\n onConfirm: () => void | Promise<void>;\n loading?: boolean;\n}\n\nconst ConfirmDialog = forwardRef<HTMLDivElement, ConfirmDialogProps>(\n (\n {\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n intent = \"default\",\n confirmationPhrase,\n onConfirm,\n loading: externalLoading,\n },\n ref,\n ) => {\n const [phraseInput, setPhraseInput] = useState(\"\");\n const [internalLoading, setInternalLoading] = useState(false);\n const cancelRef = useRef<HTMLButtonElement | null>(null);\n\n const phraseRequired = !!confirmationPhrase;\n const phraseMatched = phraseRequired ? phraseInput === confirmationPhrase : true;\n const showLoading = externalLoading === true || internalLoading;\n const canConfirm = phraseMatched && !showLoading;\n\n // Reset phrase input whenever the dialog closes.\n useEffect(() => {\n if (!open) setPhraseInput(\"\");\n }, [open]);\n\n // Auto-focus Cancel on open (NOT confirm — destructive safety).\n useEffect(() => {\n if (open) {\n const id = window.setTimeout(() => cancelRef.current?.focus(), 0);\n return () => window.clearTimeout(id);\n }\n }, [open]);\n\n async function handleConfirm() {\n if (!canConfirm) return;\n setInternalLoading(true);\n try {\n await onConfirm();\n onOpenChange(false);\n } catch {\n // Stay open; consumer surfaces error.\n } finally {\n setInternalLoading(false);\n }\n }\n\n function handleInputKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Enter\" && canConfirm) {\n e.preventDefault();\n void handleConfirm();\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <Dialog.Content data-slot=\"confirm-dialog\" ref={ref}>\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n <Dialog.Description>{description}</Dialog.Description>\n </Dialog.Header>\n {phraseRequired ? (\n <Dialog.Body>\n <p className=\"mb-2 text-body-sm text-muted-foreground\">\n Type{\" \"}\n <code className=\"rounded bg-muted px-1 py-0.5 font-mono text-foreground\">\n {confirmationPhrase}\n </code>{\" \"}\n to confirm\n </p>\n <Input\n value={phraseInput}\n onChange={(e) => setPhraseInput(e.target.value)}\n onKeyDown={handleInputKeyDown}\n autoComplete=\"off\"\n aria-label=\"Confirmation phrase\"\n />\n </Dialog.Body>\n ) : null}\n <Dialog.Footer>\n <Button\n ref={cancelRef}\n variant=\"secondary\"\n onClick={() => onOpenChange(false)}\n disabled={showLoading}\n >\n {cancelLabel}\n </Button>\n <Button\n variant={intent === \"destructive\" ? \"destructive\" : \"primary\"}\n onClick={() => void handleConfirm()}\n disabled={!canConfirm}\n data-confirm\n >\n {showLoading ? <Loader2 aria-hidden=\"true\" className=\"size-4 animate-spin\" /> : null}\n {confirmLabel}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n );\n },\n);\nConfirmDialog.displayName = \"ConfirmDialog\";\n\nexport { ConfirmDialog };\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { ChatComposer } from './chunk-
|
|
2
|
+
import { ChatComposer } from './chunk-TW5I37AE.js';
|
|
3
3
|
import { MentionMenu } from './chunk-HZ7Z22VW.js';
|
|
4
4
|
import { cn } from './chunk-EWDN56AS.js';
|
|
5
5
|
import { useState, useMemo } from 'react';
|
|
@@ -112,5 +112,5 @@ function AgentComposer({
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
export { AgentComposer };
|
|
115
|
-
//# sourceMappingURL=chunk-
|
|
116
|
-
//# sourceMappingURL=chunk-
|
|
115
|
+
//# sourceMappingURL=chunk-47IPOYLQ.js.map
|
|
116
|
+
//# sourceMappingURL=chunk-47IPOYLQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/composites/agent-composer/agent-composer.tsx"],"names":[],"mappings":"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","file":"chunk-PJUP4BJD.js","sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { ComponentProps, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport {\n type MentionItem,\n MentionMenu,\n type MentionTrigger,\n} from \"../../primitives/mention-menu/index.js\";\nimport { ChatComposer } from \"../chat-composer/chat-composer.js\";\n\n/**\n * AgentComposer — ChatComposer + slash-command / @file / #memory triggers.\n *\n * Wraps ChatComposer and watches the value for three trigger characters:\n * `/` → slash commands (`/clear`, `/help`, …)\n * `@` → file references (`@src/components/Foo.tsx`)\n * `#` → memory entries (`#alignment-grid`)\n *\n * Detection is string-based — no textarea ref required. A trigger is active\n * iff the value ends with a token of the form `[\\s|^]([/@#])[^\\s]*` (i.e. a\n * trigger char preceded by start-of-string or whitespace, with no space\n * after).\n *\n * The consumer provides the candidate items per trigger. On selection the\n * trailing token is replaced with the chosen value plus a trailing space.\n */\n\ntype ItemsProvider = (query: string) => MentionItem[];\n\ninterface AgentComposerProps extends ComponentProps<typeof ChatComposer> {\n /** Items shown when `/` is the active trigger. */\n commands?: MentionItem[] | ItemsProvider;\n /** Items shown when `@` is the active trigger. */\n files?: MentionItem[] | ItemsProvider;\n /** Items shown when `#` is the active trigger. */\n memories?: MentionItem[] | ItemsProvider;\n /**\n * What text gets inserted when an item is picked. Defaults to\n * `${trigger}${item.label}` (assumes `label` is a string). Override to\n * insert a token different from the visible label (e.g. include path,\n * id, …).\n */\n resolveInsertText?: (item: MentionItem, trigger: MentionTrigger) => string;\n /** Optional slot for the empty-state copy per trigger. */\n emptyLabels?: Partial<Record<MentionTrigger, ReactNode>>;\n /** Outer wrapper className (the relative positioning anchor for the menu). */\n containerClassName?: string;\n}\n\nconst TRIGGER_CHARS: ReadonlyArray<MentionTrigger> = [\"/\", \"@\", \"#\"];\n\nconst TRIGGER_RE = /(^|\\s)([/@#])([^\\s]*)$/;\n\ninterface DetectedTrigger {\n trigger: MentionTrigger;\n query: string;\n /** Index in the value where the trigger char starts. */\n start: number;\n}\n\nfunction detectTrigger(value: string): DetectedTrigger | null {\n const match = value.match(TRIGGER_RE);\n if (!match) return null;\n const leading = match[1] ?? \"\";\n const triggerChar = match[2] as MentionTrigger;\n const query = match[3] ?? \"\";\n if (!TRIGGER_CHARS.includes(triggerChar)) return null;\n // start = position of the trigger char itself\n const start = (match.index ?? 0) + leading.length;\n return { trigger: triggerChar, query, start };\n}\n\nfunction resolveItems(\n source: MentionItem[] | ItemsProvider | undefined,\n query: string,\n): MentionItem[] {\n if (!source) return [];\n if (typeof source === \"function\") return source(query);\n if (!query) return source;\n const q = query.toLowerCase();\n return source.filter((item) => {\n const haystack = `${typeof item.label === \"string\" ? item.label : \"\"} ${\n typeof item.description === \"string\" ? item.description : \"\"\n }`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nfunction defaultInsertText(item: MentionItem, trigger: MentionTrigger): string {\n const label = typeof item.label === \"string\" ? item.label : \"\";\n // If the visible label already starts with the trigger char (e.g. \"/clear\"),\n // use it as-is so we don't end up with \"//clear\".\n if (label.startsWith(trigger)) return label;\n return `${trigger}${label}`;\n}\n\nexport function AgentComposer({\n value,\n onValueChange,\n commands,\n files,\n memories,\n resolveInsertText = defaultInsertText,\n emptyLabels,\n containerClassName,\n className,\n textareaProps,\n ...chatComposerProps\n}: AgentComposerProps) {\n // Trigger detection + manual dismiss state.\n // We honour `dismissed` so the user can Esc the menu and keep typing after\n // a trigger char without the menu re-appearing.\n const [dismissedAt, setDismissedAt] = useState<number | null>(null);\n\n const detected = useMemo(() => detectTrigger(value), [value]);\n const isDismissed = detected !== null && dismissedAt === detected.start;\n const activeTrigger = isDismissed ? null : (detected?.trigger ?? null);\n const query = isDismissed ? \"\" : (detected?.query ?? \"\");\n\n const items = useMemo(() => {\n if (!activeTrigger || !detected) return [];\n if (activeTrigger === \"/\") return resolveItems(commands, query);\n if (activeTrigger === \"@\") return resolveItems(files, query);\n if (activeTrigger === \"#\") return resolveItems(memories, query);\n return [];\n }, [activeTrigger, detected, commands, files, memories, query]);\n\n const handleSelect = (item: MentionItem) => {\n if (!detected) return;\n const before = value.slice(0, detected.start);\n const insert = resolveInsertText(item, detected.trigger);\n onValueChange(`${before}${insert} `);\n setDismissedAt(null);\n };\n\n const handleClose = () => {\n if (detected) setDismissedAt(detected.start);\n };\n\n const interceptKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeTrigger) {\n // Let MentionMenu's global key handler take Arrow/Enter/Esc.\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \"Escape\"].includes(e.key)) {\n if (e.key === \"Enter\") e.preventDefault(); // also prevent form submit\n return;\n }\n }\n // Mirror ChatComposer's default Enter-to-submit when menu is closed.\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget.form as HTMLFormElement | null)?.requestSubmit();\n }\n textareaProps?.onKeyDown?.(e);\n };\n\n return (\n <div data-slot=\"agent-composer\" className={cn(\"relative\", containerClassName)}>\n <MentionMenu\n open={!!activeTrigger && items !== null}\n trigger={(activeTrigger ?? \"/\") as MentionTrigger}\n items={items}\n onSelect={handleSelect}\n onClose={handleClose}\n emptyLabel={activeTrigger ? emptyLabels?.[activeTrigger] : undefined}\n />\n <ChatComposer\n value={value}\n onValueChange={(next) => {\n // If user clears the trigger token, drop the dismissed marker too.\n if (!detectTrigger(next)) setDismissedAt(null);\n onValueChange(next);\n }}\n className={className}\n textareaProps={{\n ...textareaProps,\n onKeyDown: interceptKeyDown,\n }}\n {...chatComposerProps}\n />\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/agent-composer/agent-composer.tsx"],"names":[],"mappings":"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","file":"chunk-47IPOYLQ.js","sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { ComponentProps, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport {\n type MentionItem,\n MentionMenu,\n type MentionTrigger,\n} from \"../../primitives/mention-menu/index.js\";\nimport { ChatComposer } from \"../chat-composer/chat-composer.js\";\n\n/**\n * AgentComposer — ChatComposer + slash-command / @file / #memory triggers.\n *\n * Wraps ChatComposer and watches the value for three trigger characters:\n * `/` → slash commands (`/clear`, `/help`, …)\n * `@` → file references (`@src/components/Foo.tsx`)\n * `#` → memory entries (`#alignment-grid`)\n *\n * Detection is string-based — no textarea ref required. A trigger is active\n * iff the value ends with a token of the form `[\\s|^]([/@#])[^\\s]*` (i.e. a\n * trigger char preceded by start-of-string or whitespace, with no space\n * after).\n *\n * The consumer provides the candidate items per trigger. On selection the\n * trailing token is replaced with the chosen value plus a trailing space.\n */\n\ntype ItemsProvider = (query: string) => MentionItem[];\n\ninterface AgentComposerProps extends ComponentProps<typeof ChatComposer> {\n /** Items shown when `/` is the active trigger. */\n commands?: MentionItem[] | ItemsProvider;\n /** Items shown when `@` is the active trigger. */\n files?: MentionItem[] | ItemsProvider;\n /** Items shown when `#` is the active trigger. */\n memories?: MentionItem[] | ItemsProvider;\n /**\n * What text gets inserted when an item is picked. Defaults to\n * `${trigger}${item.label}` (assumes `label` is a string). Override to\n * insert a token different from the visible label (e.g. include path,\n * id, …).\n */\n resolveInsertText?: (item: MentionItem, trigger: MentionTrigger) => string;\n /** Optional slot for the empty-state copy per trigger. */\n emptyLabels?: Partial<Record<MentionTrigger, ReactNode>>;\n /** Outer wrapper className (the relative positioning anchor for the menu). */\n containerClassName?: string;\n}\n\nconst TRIGGER_CHARS: ReadonlyArray<MentionTrigger> = [\"/\", \"@\", \"#\"];\n\nconst TRIGGER_RE = /(^|\\s)([/@#])([^\\s]*)$/;\n\ninterface DetectedTrigger {\n trigger: MentionTrigger;\n query: string;\n /** Index in the value where the trigger char starts. */\n start: number;\n}\n\nfunction detectTrigger(value: string): DetectedTrigger | null {\n const match = value.match(TRIGGER_RE);\n if (!match) return null;\n const leading = match[1] ?? \"\";\n const triggerChar = match[2] as MentionTrigger;\n const query = match[3] ?? \"\";\n if (!TRIGGER_CHARS.includes(triggerChar)) return null;\n // start = position of the trigger char itself\n const start = (match.index ?? 0) + leading.length;\n return { trigger: triggerChar, query, start };\n}\n\nfunction resolveItems(\n source: MentionItem[] | ItemsProvider | undefined,\n query: string,\n): MentionItem[] {\n if (!source) return [];\n if (typeof source === \"function\") return source(query);\n if (!query) return source;\n const q = query.toLowerCase();\n return source.filter((item) => {\n const haystack = `${typeof item.label === \"string\" ? item.label : \"\"} ${\n typeof item.description === \"string\" ? item.description : \"\"\n }`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nfunction defaultInsertText(item: MentionItem, trigger: MentionTrigger): string {\n const label = typeof item.label === \"string\" ? item.label : \"\";\n // If the visible label already starts with the trigger char (e.g. \"/clear\"),\n // use it as-is so we don't end up with \"//clear\".\n if (label.startsWith(trigger)) return label;\n return `${trigger}${label}`;\n}\n\nexport function AgentComposer({\n value,\n onValueChange,\n commands,\n files,\n memories,\n resolveInsertText = defaultInsertText,\n emptyLabels,\n containerClassName,\n className,\n textareaProps,\n ...chatComposerProps\n}: AgentComposerProps) {\n // Trigger detection + manual dismiss state.\n // We honour `dismissed` so the user can Esc the menu and keep typing after\n // a trigger char without the menu re-appearing.\n const [dismissedAt, setDismissedAt] = useState<number | null>(null);\n\n const detected = useMemo(() => detectTrigger(value), [value]);\n const isDismissed = detected !== null && dismissedAt === detected.start;\n const activeTrigger = isDismissed ? null : (detected?.trigger ?? null);\n const query = isDismissed ? \"\" : (detected?.query ?? \"\");\n\n const items = useMemo(() => {\n if (!activeTrigger || !detected) return [];\n if (activeTrigger === \"/\") return resolveItems(commands, query);\n if (activeTrigger === \"@\") return resolveItems(files, query);\n if (activeTrigger === \"#\") return resolveItems(memories, query);\n return [];\n }, [activeTrigger, detected, commands, files, memories, query]);\n\n const handleSelect = (item: MentionItem) => {\n if (!detected) return;\n const before = value.slice(0, detected.start);\n const insert = resolveInsertText(item, detected.trigger);\n onValueChange(`${before}${insert} `);\n setDismissedAt(null);\n };\n\n const handleClose = () => {\n if (detected) setDismissedAt(detected.start);\n };\n\n const interceptKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeTrigger) {\n // Let MentionMenu's global key handler take Arrow/Enter/Esc.\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \"Escape\"].includes(e.key)) {\n if (e.key === \"Enter\") e.preventDefault(); // also prevent form submit\n return;\n }\n }\n // Mirror ChatComposer's default Enter-to-submit when menu is closed.\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget.form as HTMLFormElement | null)?.requestSubmit();\n }\n textareaProps?.onKeyDown?.(e);\n };\n\n return (\n <div data-slot=\"agent-composer\" className={cn(\"relative\", containerClassName)}>\n <MentionMenu\n open={!!activeTrigger && items !== null}\n trigger={(activeTrigger ?? \"/\") as MentionTrigger}\n items={items}\n onSelect={handleSelect}\n onClose={handleClose}\n emptyLabel={activeTrigger ? emptyLabels?.[activeTrigger] : undefined}\n />\n <ChatComposer\n value={value}\n onValueChange={(next) => {\n // If user clears the trigger token, drop the dismissed marker too.\n if (!detectTrigger(next)) setDismissedAt(null);\n onValueChange(next);\n }}\n className={className}\n textareaProps={{\n ...textareaProps,\n onKeyDown: interceptKeyDown,\n }}\n {...chatComposerProps}\n />\n </div>\n );\n}\n"]}
|
|
@@ -29,7 +29,7 @@ var ConfirmPrompt = forwardRef(
|
|
|
29
29
|
role: isDestructive ? "alertdialog" : void 0,
|
|
30
30
|
"aria-labelledby": questionId,
|
|
31
31
|
className: cn(
|
|
32
|
-
"grid w-full gap-4 rounded-xl border bg-card p-5 text-card-foreground shadow-md",
|
|
32
|
+
"grid w-full gap-4 rounded-xl border border-border bg-card p-5 text-card-foreground shadow-md",
|
|
33
33
|
"transition-shadow duration-base ease-out-soft",
|
|
34
34
|
isDestructive && "border-destructive/40 bg-destructive/5",
|
|
35
35
|
className
|
|
@@ -61,5 +61,5 @@ var ConfirmPrompt = forwardRef(
|
|
|
61
61
|
ConfirmPrompt.displayName = "ConfirmPrompt";
|
|
62
62
|
|
|
63
63
|
export { ConfirmPrompt };
|
|
64
|
-
//# sourceMappingURL=chunk-
|
|
65
|
-
//# sourceMappingURL=chunk-
|
|
64
|
+
//# sourceMappingURL=chunk-4XYFJIRC.js.map
|
|
65
|
+
//# sourceMappingURL=chunk-4XYFJIRC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/composites/confirm-prompt/confirm-prompt.tsx"],"names":[],"mappings":";;;;;;AAsCA,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CACE;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,GAAU,SAAA;AAAA,IACV,YAAA,GAAe,SAAA;AAAA,IACf,WAAA,GAAc,QAAA;AAAA,IACd,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,UAAA,GAAa,GAAG,MAAM,CAAA,SAAA,CAAA;AAC5B,IAAA,MAAM,gBAAgB,OAAA,KAAY,aAAA;AAElC,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,gBAAA;AAAA,QACV,GAAA;AAAA,QACA,IAAA,EAAM,gBAAgB,aAAA,GAAgB,MAAA;AAAA,QACtC,iBAAA,EAAiB,UAAA;AAAA,QACjB,SAAA,EAAW,EAAA;AAAA,UACT,
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/confirm-prompt/confirm-prompt.tsx"],"names":[],"mappings":";;;;;;AAsCA,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CACE;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,GAAU,SAAA;AAAA,IACV,YAAA,GAAe,SAAA;AAAA,IACf,WAAA,GAAc,QAAA;AAAA,IACd,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,UAAA,GAAa,GAAG,MAAM,CAAA,SAAA,CAAA;AAC5B,IAAA,MAAM,gBAAgB,OAAA,KAAY,aAAA;AAElC,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,gBAAA;AAAA,QACV,GAAA;AAAA,QACA,IAAA,EAAM,gBAAgB,aAAA,GAAgB,MAAA;AAAA,QACtC,iBAAA,EAAiB,UAAA;AAAA,QACjB,SAAA,EAAW,EAAA;AAAA,UACT,8FAAA;AAAA,UACA,+CAAA;AAAA,UACA,aAAA,IAAiB,wCAAA;AAAA,UACjB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,wCAAA,EAChB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAI,UAAA,EAAY,SAAA,EAAU,6DAC3B,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,YACC,SAAS,IAAA,mBACR,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,gBAAgB,aAAA,GAAgB,SAAA;AAAA,gBACzC,IAAA,EAAK,IAAA;AAAA,gBACL,SAAA,EAAU,UAAA;AAAA,gBAET,QAAA,EAAA;AAAA;AAAA,aACH,GACE;AAAA,WAAA,EACN,CAAA;AAAA,UACC,eAAe,IAAA,mBACd,GAAA,CAAC,OAAE,SAAA,EAAU,oCAAA,EAAsC,uBAAY,CAAA,GAC7D,IAAA;AAAA,0BAEJ,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,qCAAA,EAChB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAO,IAAA,EAAK,IAAA,EAAK,SAAQ,WAAA,EAAY,OAAA,EAAS,UAC5C,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,4BACA,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,gBAAgB,aAAA,GAAgB,SAAA,EAAW,OAAA,EAAS,SAAA,EAC5E,QAAA,EAAA,YAAA,EACH;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-4XYFJIRC.js","sourcesContent":["\"use client\";\n\nimport { forwardRef, useId } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\nimport { Button } from \"../../primitives/button/index.js\";\n\n/**\n * ConfirmPrompt — binary yes/no \"ask the user\" card for agent surfaces.\n *\n * The simplest member of the prompt family: a question with an optional header\n * chip and two actions. Use `variant=\"destructive\"` for dangerous confirmations\n * (delete, drop, force-push) — it tones the confirm button red and exposes the\n * card as an `alertdialog` so assistive tech announces the stakes.\n *\n * Renders one question at a time — sequencing is the consumer's responsibility.\n */\n\nexport interface ConfirmPromptProps extends Omit<HTMLAttributes<HTMLElement>, \"onSelect\"> {\n /** The question being asked. */\n question: ReactNode;\n /** Optional secondary line under the question. */\n description?: ReactNode;\n /** Optional short header chip (rendered as a Badge). */\n badge?: ReactNode;\n /** Tone of the confirm action. `destructive` also exposes role=alertdialog. */\n variant?: \"primary\" | \"destructive\";\n /** Confirm button label. Defaults to \"Confirm\". */\n confirmLabel?: ReactNode;\n /** Cancel button label. Defaults to \"Cancel\". Omit `onCancel` to hide it. */\n cancelLabel?: ReactNode;\n /** Pressing Confirm. */\n onConfirm?: () => void;\n /** Pressing Cancel. */\n onCancel?: () => void;\n}\n\nconst ConfirmPrompt = forwardRef<HTMLElement, ConfirmPromptProps>(\n (\n {\n className,\n question,\n description,\n badge,\n variant = \"primary\",\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n onConfirm,\n onCancel,\n ...props\n },\n ref,\n ) => {\n const baseId = useId();\n const questionId = `${baseId}-question`;\n const isDestructive = variant === \"destructive\";\n\n return (\n <section\n data-slot=\"confirm-prompt\"\n ref={ref}\n role={isDestructive ? \"alertdialog\" : undefined}\n aria-labelledby={questionId}\n className={cn(\n \"grid w-full gap-4 rounded-xl border border-border bg-card p-5 text-card-foreground shadow-md\",\n \"transition-shadow duration-base ease-out-soft\",\n isDestructive && \"border-destructive/40 bg-destructive/5\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <h3 id={questionId} className=\"font-display text-foreground text-title-md tracking-tight\">\n {question}\n </h3>\n {badge != null ? (\n <Badge\n variant={isDestructive ? \"destructive\" : \"primary\"}\n size=\"sm\"\n className=\"shrink-0\"\n >\n {badge}\n </Badge>\n ) : null}\n </header>\n {description != null ? (\n <p className=\"text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n\n <footer className=\"flex items-center justify-end gap-2\">\n <Button size=\"sm\" variant=\"secondary\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button size=\"sm\" variant={isDestructive ? \"destructive\" : \"primary\"} onClick={onConfirm}>\n {confirmLabel}\n </Button>\n </footer>\n </section>\n );\n },\n);\nConfirmPrompt.displayName = \"ConfirmPrompt\";\n\nexport { ConfirmPrompt };\n"]}
|
|
@@ -22,7 +22,7 @@ var RunningTasksPanel = forwardRef(
|
|
|
22
22
|
{
|
|
23
23
|
"data-slot": "running-tasks-panel",
|
|
24
24
|
ref,
|
|
25
|
-
className: cn("rounded-xl border bg-card p-4", className),
|
|
25
|
+
className: cn("rounded-xl border border-border bg-card p-4", className),
|
|
26
26
|
...props,
|
|
27
27
|
children: [
|
|
28
28
|
/* @__PURE__ */ jsx(Group, { title: "Running", empty: "Nothing running", items: running }),
|
|
@@ -66,5 +66,5 @@ function Group({
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
export { RunningTasksPanel };
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-5YX76GH6.js.map
|
|
70
|
+
//# sourceMappingURL=chunk-5YX76GH6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/primitives/running-tasks-panel/running-tasks-panel.tsx"],"names":[],"mappings":";;;;;AAmBA,IAAM,UAAA,GAAa;AAAA,EACjB,KAAA,EAAO,GAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AACA,IAAM,WAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAQA,IAAM,iBAAA,GAAoB,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,OAAO,GAAG,KAAA,IAAS,GAAA,KAAQ;AACvC,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,SAAS,CAAA;AAC1D,IAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,SAAS,CAAA;AAC5D,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,qBAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG
|
|
1
|
+
{"version":3,"sources":["../src/components/primitives/running-tasks-panel/running-tasks-panel.tsx"],"names":[],"mappings":"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","file":"chunk-5YX76GH6.js","sourcesContent":["import { Bot, CheckCircle2, Loader2, Terminal } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type TaskSource = \"agent\" | \"bash\" | \"tool\";\nexport type RunningTaskStatus = \"running\" | \"completed\" | \"failed\";\n\nexport interface RunningTaskItem {\n id: string;\n label: ReactNode;\n source: TaskSource;\n status: RunningTaskStatus;\n}\n\ninterface RunningTasksPanelProps extends HTMLAttributes<HTMLElement> {\n tasks: RunningTaskItem[];\n}\n\nconst sourceIcon = {\n agent: Bot,\n bash: Terminal,\n tool: Bot,\n} as const;\nconst sourceLabel: Record<TaskSource, string> = {\n agent: \"Agent\",\n bash: \"Bash\",\n tool: \"Tool\",\n};\n\n/**\n * RunningTasksPanel — split list of Running vs Completed tasks.\n *\n * Used in the Code workspace right rail to give operational visibility into\n * what the agent is executing (foreground/background) vs what already finished.\n */\nconst RunningTasksPanel = forwardRef<HTMLElement, RunningTasksPanelProps>(\n ({ className, tasks, ...props }, ref) => {\n const running = tasks.filter((t) => t.status === \"running\");\n const completed = tasks.filter((t) => t.status !== \"running\");\n return (\n <section\n data-slot=\"running-tasks-panel\"\n ref={ref}\n className={cn(\"rounded-xl border border-border bg-card p-4\", className)}\n {...props}\n >\n <Group title=\"Running\" empty=\"Nothing running\" items={running} />\n {completed.length > 0 ? (\n <div className=\"mt-4\">\n <Group title=\"Completed\" empty=\"—\" items={completed} />\n </div>\n ) : null}\n </section>\n );\n },\n);\nRunningTasksPanel.displayName = \"RunningTasksPanel\";\n\nfunction Group({\n title,\n empty,\n items,\n}: {\n title: string;\n empty: ReactNode;\n items: RunningTaskItem[];\n}) {\n return (\n <div>\n <h4 className=\"mb-2 font-sans text-label-caps text-muted-foreground uppercase tracking-wider\">\n {title}\n </h4>\n {items.length === 0 ? (\n <p className=\"text-body-sm text-muted-foreground\">{empty}</p>\n ) : (\n <ul className=\"grid gap-1\">\n {items.map((task) => {\n const SourceIcon = sourceIcon[task.source];\n return (\n <li\n key={task.id}\n className=\"flex items-center gap-2 rounded-md px-2 py-1.5 text-body-sm\"\n >\n {task.status === \"running\" ? (\n <Loader2 className=\"size-3.5 animate-spin text-primary\" aria-label=\"running\" />\n ) : task.status === \"completed\" ? (\n <CheckCircle2 className=\"size-3.5 text-success\" aria-label=\"completed\" />\n ) : (\n <span className=\"size-2 rounded-full bg-destructive\" aria-label=\"failed\" />\n )}\n <SourceIcon\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <span className=\"flex-1 truncate\">{task.label}</span>\n <span className=\"font-mono text-label text-muted-foreground uppercase\">\n {sourceLabel[task.source]}\n </span>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n\nexport { RunningTasksPanel };\n"]}
|
|
@@ -78,7 +78,7 @@ var MultiSelectPrompt = forwardRef(
|
|
|
78
78
|
"aria-labelledby": questionId,
|
|
79
79
|
onKeyDown: handleKeyDown,
|
|
80
80
|
className: cn(
|
|
81
|
-
"grid w-full gap-4 rounded-xl border bg-card p-5 text-card-foreground shadow-md",
|
|
81
|
+
"grid w-full gap-4 rounded-xl border border-border bg-card p-5 text-card-foreground shadow-md",
|
|
82
82
|
"transition-shadow duration-base ease-out-soft",
|
|
83
83
|
className
|
|
84
84
|
),
|
|
@@ -188,5 +188,5 @@ var MultiSelectPrompt = forwardRef(
|
|
|
188
188
|
MultiSelectPrompt.displayName = "MultiSelectPrompt";
|
|
189
189
|
|
|
190
190
|
export { MultiSelectPrompt };
|
|
191
|
-
//# sourceMappingURL=chunk-
|
|
192
|
-
//# sourceMappingURL=chunk-
|
|
191
|
+
//# sourceMappingURL=chunk-65YSFZAN.js.map
|
|
192
|
+
//# sourceMappingURL=chunk-65YSFZAN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/composites/multi-select-prompt/multi-select-prompt.tsx"],"names":[],"mappings":"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","file":"chunk-7T4NK6W6.js","sourcesContent":["\"use client\";\n\nimport { forwardRef, useId, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { OTHER_OPTION_VALUE, type PromptOption, digitKeyToIndex } from \"../../../lib/prompt.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\nimport { Button } from \"../../primitives/button/index.js\";\nimport { Checkbox } from \"../../primitives/checkbox/index.js\";\nimport { Input } from \"../../primitives/input/index.js\";\nimport { Label } from \"../../primitives/label/index.js\";\n\n/**\n * MultiSelectPrompt — multi-select \"ask the user\" card for agent surfaces.\n *\n * The checkbox sibling of `ChoicePrompt`: same question + header chip + option\n * shape + `1`..`9` number-key toggles + injectable free-text \"Other\" +\n * side-by-side preview, but the user may select any number of options.\n *\n * Renders one question at a time — sequencing is the consumer's responsibility.\n * Controlled (`value` + `onValueChange`) or uncontrolled (`defaultValue`).\n */\n\n/** Payload handed to `onConfirm`. */\nexport interface MultiSelectPromptResult {\n /** The selected option values (includes the reserved Other value when checked). */\n values: string[];\n /** Present only when the Other option is among the selected values. */\n otherText?: string;\n}\n\nexport interface MultiSelectPromptProps extends Omit<HTMLAttributes<HTMLElement>, \"onSelect\"> {\n /** The question being asked. */\n question: ReactNode;\n /** Optional secondary line under the question. */\n description?: ReactNode;\n /** Optional short header chip (rendered as a Badge). */\n badge?: ReactNode;\n /** The selectable options. */\n options: PromptOption[];\n /** Controlled selected values. */\n value?: string[];\n /** Initial selected values when uncontrolled. */\n defaultValue?: string[];\n /** Fired with the full value array whenever the selection changes. */\n onValueChange?: (values: string[]) => void;\n /** Inject a free-text \"Other\" option as the last row. */\n allowOther?: boolean;\n /** Label for the Other row. Defaults to \"Other\". */\n otherLabel?: ReactNode;\n /** Placeholder for the Other text field. */\n otherPlaceholder?: string;\n /** Controlled Other text. */\n otherText?: string;\n /** Fired with the Other text on every keystroke. */\n onOtherTextChange?: (text: string) => void;\n /** Enable `1`..`9` number-key toggling. Default true. */\n enableKeyboardShortcuts?: boolean;\n /** Show the `1`..`9` hint chips next to options. Defaults to the shortcut flag. */\n showNumbers?: boolean;\n /** Minimum selections required before Confirm enables. Default 1. */\n minSelected?: number;\n /** Confirm button label. Defaults to \"Confirm\". Omit `onConfirm` to hide it. */\n confirmLabel?: ReactNode;\n /** Cancel button label. Defaults to \"Cancel\". Omit `onCancel` to hide it. */\n cancelLabel?: ReactNode;\n /** Pressing Confirm. Receives the selection (and Other text when relevant). */\n onConfirm?: (result: MultiSelectPromptResult) => void;\n /** Pressing Cancel. */\n onCancel?: () => void;\n}\n\nconst MultiSelectPrompt = forwardRef<HTMLElement, MultiSelectPromptProps>(\n (\n {\n className,\n question,\n description,\n badge,\n options,\n value,\n defaultValue,\n onValueChange,\n allowOther = false,\n otherLabel = \"Other\",\n otherPlaceholder = \"Type your answer…\",\n otherText,\n onOtherTextChange,\n enableKeyboardShortcuts = true,\n showNumbers,\n minSelected = 1,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n onConfirm,\n onCancel,\n ...props\n },\n ref,\n ) => {\n const baseId = useId();\n const questionId = `${baseId}-question`;\n const optionId = (value_: string): string => `${baseId}-opt-${value_}`;\n\n const [internalValues, setInternalValues] = useState<string[]>(defaultValue ?? []);\n const values = value !== undefined ? value : internalValues;\n\n const [internalOther, setInternalOther] = useState(\"\");\n const otherValue = otherText !== undefined ? otherText : internalOther;\n\n const numbersVisible = showNumbers ?? enableKeyboardShortcuts;\n const hasPreview = options.some((option) => option.preview != null);\n const selectedPreviews = options.filter(\n (option) => option.preview != null && values.includes(option.value),\n );\n\n const toggle = (next: string): void => {\n const updated = values.includes(next)\n ? values.filter((current) => current !== next)\n : [...values, next];\n if (value === undefined) setInternalValues(updated);\n onValueChange?.(updated);\n };\n\n const setOther = (next: string): void => {\n if (otherText === undefined) setInternalOther(next);\n onOtherTextChange?.(next);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>): void => {\n if (!enableKeyboardShortcuts) return;\n const target = event.target as HTMLElement;\n if (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\") return;\n const index = digitKeyToIndex(event.key);\n if (index === null || index >= options.length) return;\n const option = options[index];\n if (!option || option.disabled) return;\n event.preventDefault();\n toggle(option.value);\n };\n\n const otherChecked = values.includes(OTHER_OPTION_VALUE);\n\n const confirm = (): void => {\n if (values.length < minSelected) return;\n onConfirm?.(otherChecked ? { values, otherText: otherValue } : { values });\n };\n\n return (\n <section\n data-slot=\"multi-select-prompt\"\n ref={ref}\n aria-labelledby={questionId}\n onKeyDown={handleKeyDown}\n className={cn(\n \"grid w-full gap-4 rounded-xl border bg-card p-5 text-card-foreground shadow-md\",\n \"transition-shadow duration-base ease-out-soft\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <h3 id={questionId} className=\"font-display text-foreground text-title-md tracking-tight\">\n {question}\n </h3>\n {badge != null ? (\n <Badge variant=\"primary\" size=\"sm\" className=\"shrink-0\">\n {badge}\n </Badge>\n ) : null}\n </header>\n {description != null ? (\n <p className=\"text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n\n <div className={cn(\"grid gap-5\", hasPreview && \"md:grid-cols-2\")}>\n <fieldset className=\"m-0 grid min-w-0 gap-2 border-0 p-0\" aria-labelledby={questionId}>\n {options.map((option, index) => (\n <div key={option.value} className=\"flex items-start gap-3\">\n <Checkbox\n id={optionId(option.value)}\n checked={values.includes(option.value)}\n disabled={option.disabled}\n onCheckedChange={() => toggle(option.value)}\n className=\"mt-0.5\"\n />\n <Label\n htmlFor={optionId(option.value)}\n className=\"flex flex-1 cursor-pointer flex-col items-start gap-0.5\"\n >\n <span className=\"text-body-md text-foreground\">{option.label}</span>\n {option.description != null ? (\n <span className=\"text-body-sm text-muted-foreground\">{option.description}</span>\n ) : null}\n </Label>\n {numbersVisible && index < 9 ? (\n <span\n aria-hidden=\"true\"\n className=\"mt-0.5 shrink-0 rounded border border-border bg-muted px-1.5 font-mono text-label text-muted-foreground\"\n >\n {index + 1}\n </span>\n ) : null}\n </div>\n ))}\n\n {allowOther ? (\n <div className=\"flex flex-col gap-2 border-border/40 border-t pt-2\">\n <div className=\"flex items-start gap-3\">\n <Checkbox\n id={optionId(OTHER_OPTION_VALUE)}\n checked={otherChecked}\n onCheckedChange={() => toggle(OTHER_OPTION_VALUE)}\n className=\"mt-0.5\"\n />\n <Label\n htmlFor={optionId(OTHER_OPTION_VALUE)}\n className=\"flex-1 cursor-pointer text-body-md\"\n >\n {otherLabel}\n </Label>\n </div>\n {otherChecked ? (\n <Input\n size=\"sm\"\n aria-label={typeof otherLabel === \"string\" ? otherLabel : \"Other\"}\n placeholder={otherPlaceholder}\n value={otherValue}\n onChange={(event) => setOther(event.target.value)}\n className=\"ml-7\"\n />\n ) : null}\n </div>\n ) : null}\n </fieldset>\n\n {hasPreview ? (\n <div className=\"rounded-lg border border-border/60 bg-muted/40 p-3\">\n <p className=\"mb-2 font-sans text-label-caps text-muted-foreground uppercase tracking-wider\">\n Preview\n </p>\n {selectedPreviews.length > 0 ? (\n <div className=\"grid gap-3\">\n {selectedPreviews.map((option) => (\n <div\n key={option.value}\n className=\"whitespace-pre-wrap break-words font-mono text-code-sm text-foreground\"\n >\n {option.preview}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-body-sm text-muted-foreground\">Select an option to preview.</p>\n )}\n </div>\n ) : null}\n </div>\n\n {onConfirm || onCancel ? (\n <footer className=\"flex items-center justify-end gap-2\">\n {onCancel ? (\n <Button size=\"sm\" variant=\"secondary\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n ) : null}\n {onConfirm ? (\n <Button\n size=\"sm\"\n variant=\"primary\"\n disabled={values.length < minSelected}\n onClick={confirm}\n >\n {confirmLabel}\n </Button>\n ) : null}\n </footer>\n ) : null}\n </section>\n );\n },\n);\nMultiSelectPrompt.displayName = \"MultiSelectPrompt\";\n\nexport { MultiSelectPrompt };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/multi-select-prompt/multi-select-prompt.tsx"],"names":[],"mappings":"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","file":"chunk-65YSFZAN.js","sourcesContent":["\"use client\";\n\nimport { forwardRef, useId, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { OTHER_OPTION_VALUE, type PromptOption, digitKeyToIndex } from \"../../../lib/prompt.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\nimport { Button } from \"../../primitives/button/index.js\";\nimport { Checkbox } from \"../../primitives/checkbox/index.js\";\nimport { Input } from \"../../primitives/input/index.js\";\nimport { Label } from \"../../primitives/label/index.js\";\n\n/**\n * MultiSelectPrompt — multi-select \"ask the user\" card for agent surfaces.\n *\n * The checkbox sibling of `ChoicePrompt`: same question + header chip + option\n * shape + `1`..`9` number-key toggles + injectable free-text \"Other\" +\n * side-by-side preview, but the user may select any number of options.\n *\n * Renders one question at a time — sequencing is the consumer's responsibility.\n * Controlled (`value` + `onValueChange`) or uncontrolled (`defaultValue`).\n */\n\n/** Payload handed to `onConfirm`. */\nexport interface MultiSelectPromptResult {\n /** The selected option values (includes the reserved Other value when checked). */\n values: string[];\n /** Present only when the Other option is among the selected values. */\n otherText?: string;\n}\n\nexport interface MultiSelectPromptProps extends Omit<HTMLAttributes<HTMLElement>, \"onSelect\"> {\n /** The question being asked. */\n question: ReactNode;\n /** Optional secondary line under the question. */\n description?: ReactNode;\n /** Optional short header chip (rendered as a Badge). */\n badge?: ReactNode;\n /** The selectable options. */\n options: PromptOption[];\n /** Controlled selected values. */\n value?: string[];\n /** Initial selected values when uncontrolled. */\n defaultValue?: string[];\n /** Fired with the full value array whenever the selection changes. */\n onValueChange?: (values: string[]) => void;\n /** Inject a free-text \"Other\" option as the last row. */\n allowOther?: boolean;\n /** Label for the Other row. Defaults to \"Other\". */\n otherLabel?: ReactNode;\n /** Placeholder for the Other text field. */\n otherPlaceholder?: string;\n /** Controlled Other text. */\n otherText?: string;\n /** Fired with the Other text on every keystroke. */\n onOtherTextChange?: (text: string) => void;\n /** Enable `1`..`9` number-key toggling. Default true. */\n enableKeyboardShortcuts?: boolean;\n /** Show the `1`..`9` hint chips next to options. Defaults to the shortcut flag. */\n showNumbers?: boolean;\n /** Minimum selections required before Confirm enables. Default 1. */\n minSelected?: number;\n /** Confirm button label. Defaults to \"Confirm\". Omit `onConfirm` to hide it. */\n confirmLabel?: ReactNode;\n /** Cancel button label. Defaults to \"Cancel\". Omit `onCancel` to hide it. */\n cancelLabel?: ReactNode;\n /** Pressing Confirm. Receives the selection (and Other text when relevant). */\n onConfirm?: (result: MultiSelectPromptResult) => void;\n /** Pressing Cancel. */\n onCancel?: () => void;\n}\n\nconst MultiSelectPrompt = forwardRef<HTMLElement, MultiSelectPromptProps>(\n (\n {\n className,\n question,\n description,\n badge,\n options,\n value,\n defaultValue,\n onValueChange,\n allowOther = false,\n otherLabel = \"Other\",\n otherPlaceholder = \"Type your answer…\",\n otherText,\n onOtherTextChange,\n enableKeyboardShortcuts = true,\n showNumbers,\n minSelected = 1,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n onConfirm,\n onCancel,\n ...props\n },\n ref,\n ) => {\n const baseId = useId();\n const questionId = `${baseId}-question`;\n const optionId = (value_: string): string => `${baseId}-opt-${value_}`;\n\n const [internalValues, setInternalValues] = useState<string[]>(defaultValue ?? []);\n const values = value !== undefined ? value : internalValues;\n\n const [internalOther, setInternalOther] = useState(\"\");\n const otherValue = otherText !== undefined ? otherText : internalOther;\n\n const numbersVisible = showNumbers ?? enableKeyboardShortcuts;\n const hasPreview = options.some((option) => option.preview != null);\n const selectedPreviews = options.filter(\n (option) => option.preview != null && values.includes(option.value),\n );\n\n const toggle = (next: string): void => {\n const updated = values.includes(next)\n ? values.filter((current) => current !== next)\n : [...values, next];\n if (value === undefined) setInternalValues(updated);\n onValueChange?.(updated);\n };\n\n const setOther = (next: string): void => {\n if (otherText === undefined) setInternalOther(next);\n onOtherTextChange?.(next);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLElement>): void => {\n if (!enableKeyboardShortcuts) return;\n const target = event.target as HTMLElement;\n if (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\") return;\n const index = digitKeyToIndex(event.key);\n if (index === null || index >= options.length) return;\n const option = options[index];\n if (!option || option.disabled) return;\n event.preventDefault();\n toggle(option.value);\n };\n\n const otherChecked = values.includes(OTHER_OPTION_VALUE);\n\n const confirm = (): void => {\n if (values.length < minSelected) return;\n onConfirm?.(otherChecked ? { values, otherText: otherValue } : { values });\n };\n\n return (\n <section\n data-slot=\"multi-select-prompt\"\n ref={ref}\n aria-labelledby={questionId}\n onKeyDown={handleKeyDown}\n className={cn(\n \"grid w-full gap-4 rounded-xl border border-border bg-card p-5 text-card-foreground shadow-md\",\n \"transition-shadow duration-base ease-out-soft\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <h3 id={questionId} className=\"font-display text-foreground text-title-md tracking-tight\">\n {question}\n </h3>\n {badge != null ? (\n <Badge variant=\"primary\" size=\"sm\" className=\"shrink-0\">\n {badge}\n </Badge>\n ) : null}\n </header>\n {description != null ? (\n <p className=\"text-body-sm text-muted-foreground\">{description}</p>\n ) : null}\n\n <div className={cn(\"grid gap-5\", hasPreview && \"md:grid-cols-2\")}>\n <fieldset className=\"m-0 grid min-w-0 gap-2 border-0 p-0\" aria-labelledby={questionId}>\n {options.map((option, index) => (\n <div key={option.value} className=\"flex items-start gap-3\">\n <Checkbox\n id={optionId(option.value)}\n checked={values.includes(option.value)}\n disabled={option.disabled}\n onCheckedChange={() => toggle(option.value)}\n className=\"mt-0.5\"\n />\n <Label\n htmlFor={optionId(option.value)}\n className=\"flex flex-1 cursor-pointer flex-col items-start gap-0.5\"\n >\n <span className=\"text-body-md text-foreground\">{option.label}</span>\n {option.description != null ? (\n <span className=\"text-body-sm text-muted-foreground\">{option.description}</span>\n ) : null}\n </Label>\n {numbersVisible && index < 9 ? (\n <span\n aria-hidden=\"true\"\n className=\"mt-0.5 shrink-0 rounded border border-border bg-muted px-1.5 font-mono text-label text-muted-foreground\"\n >\n {index + 1}\n </span>\n ) : null}\n </div>\n ))}\n\n {allowOther ? (\n <div className=\"flex flex-col gap-2 border-border/40 border-t pt-2\">\n <div className=\"flex items-start gap-3\">\n <Checkbox\n id={optionId(OTHER_OPTION_VALUE)}\n checked={otherChecked}\n onCheckedChange={() => toggle(OTHER_OPTION_VALUE)}\n className=\"mt-0.5\"\n />\n <Label\n htmlFor={optionId(OTHER_OPTION_VALUE)}\n className=\"flex-1 cursor-pointer text-body-md\"\n >\n {otherLabel}\n </Label>\n </div>\n {otherChecked ? (\n <Input\n size=\"sm\"\n aria-label={typeof otherLabel === \"string\" ? otherLabel : \"Other\"}\n placeholder={otherPlaceholder}\n value={otherValue}\n onChange={(event) => setOther(event.target.value)}\n className=\"ml-7\"\n />\n ) : null}\n </div>\n ) : null}\n </fieldset>\n\n {hasPreview ? (\n <div className=\"rounded-lg border border-border/60 bg-muted/40 p-3\">\n <p className=\"mb-2 font-sans text-label-caps text-muted-foreground uppercase tracking-wider\">\n Preview\n </p>\n {selectedPreviews.length > 0 ? (\n <div className=\"grid gap-3\">\n {selectedPreviews.map((option) => (\n <div\n key={option.value}\n className=\"whitespace-pre-wrap break-words font-mono text-code-sm text-foreground\"\n >\n {option.preview}\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-body-sm text-muted-foreground\">Select an option to preview.</p>\n )}\n </div>\n ) : null}\n </div>\n\n {onConfirm || onCancel ? (\n <footer className=\"flex items-center justify-end gap-2\">\n {onCancel ? (\n <Button size=\"sm\" variant=\"secondary\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n ) : null}\n {onConfirm ? (\n <Button\n size=\"sm\"\n variant=\"primary\"\n disabled={values.length < minSelected}\n onClick={confirm}\n >\n {confirmLabel}\n </Button>\n ) : null}\n </footer>\n ) : null}\n </section>\n );\n },\n);\nMultiSelectPrompt.displayName = \"MultiSelectPrompt\";\n\nexport { MultiSelectPrompt };\n"]}
|
|
@@ -20,7 +20,7 @@ var TerminalPanel = forwardRef(
|
|
|
20
20
|
{
|
|
21
21
|
"data-slot": "terminal-panel",
|
|
22
22
|
ref,
|
|
23
|
-
className: cn("overflow-hidden rounded-xl border bg-card", className),
|
|
23
|
+
className: cn("overflow-hidden rounded-xl border border-border bg-card", className),
|
|
24
24
|
...props,
|
|
25
25
|
children: [
|
|
26
26
|
/* @__PURE__ */ jsxs("header", { className: "flex items-center gap-2 border-border/40 border-b px-3 py-2", children: [
|
|
@@ -53,5 +53,5 @@ var TerminalPanel = forwardRef(
|
|
|
53
53
|
TerminalPanel.displayName = "TerminalPanel";
|
|
54
54
|
|
|
55
55
|
export { TerminalPanel };
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
56
|
+
//# sourceMappingURL=chunk-6ORS6XOE.js.map
|
|
57
|
+
//# sourceMappingURL=chunk-6ORS6XOE.js.map
|