@agent-native/core 0.58.2 → 0.58.4
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/agent/engine/translate-ai-sdk.d.ts.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.js +1 -0
- package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
- package/dist/agent/production-agent.d.ts +11 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +168 -11
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/tool-error-redaction.d.ts +4 -0
- package/dist/agent/tool-error-redaction.d.ts.map +1 -0
- package/dist/agent/tool-error-redaction.js +43 -0
- package/dist/agent/tool-error-redaction.js.map +1 -0
- package/dist/agent/types.d.ts +23 -6
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/plan-local.d.ts +34 -0
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +205 -1
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +5 -0
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +19 -2
- package/dist/cli/recap.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +6 -3
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +5 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +141 -39
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +44 -31
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/blocks/library/diagram.d.ts.map +1 -1
- package/dist/client/blocks/library/diagram.js +85 -20
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/library/tabs.d.ts.map +1 -1
- package/dist/client/blocks/library/tabs.js +5 -5
- package/dist/client/blocks/library/tabs.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +13 -10
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +3 -3
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +0 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +5 -2
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/DataChartRenderer.d.ts.map +1 -1
- package/dist/client/chat/widgets/DataChartRenderer.js +98 -21
- package/dist/client/chat/widgets/DataChartRenderer.js.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts +4 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js +30 -4
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/client/composer/AgentComposerFrame.js +1 -1
- package/dist/client/composer/AgentComposerFrame.js.map +1 -1
- package/dist/scripts/db/tool-schemas.d.ts +3 -0
- package/dist/scripts/db/tool-schemas.d.ts.map +1 -0
- package/dist/scripts/db/tool-schemas.js +27 -0
- package/dist/scripts/db/tool-schemas.js.map +1 -0
- package/dist/scripts/dev/index.d.ts.map +1 -1
- package/dist/scripts/dev/index.js +2 -22
- package/dist/scripts/dev/index.js.map +1 -1
- package/dist/scripts/parse-args.js +1 -1
- package/dist/scripts/parse-args.js.map +1 -1
- package/dist/scripts/runner.js +1 -1
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +17 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +8 -24
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/cli-capture.d.ts.map +1 -1
- package/dist/server/cli-capture.js +2 -1
- package/dist/server/cli-capture.js.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +25 -11
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/styles/agent-native.css +115 -2
- package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +100 -0
- package/docs/content/pr-visual-recap.md +2 -2
- package/package.json +2 -1
- package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +100 -0
|
@@ -1,33 +1,110 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
import { Area, AreaChart, Bar, BarChart, CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from "recharts";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
4
2
|
const DEFAULT_COLORS = [
|
|
5
3
|
"hsl(var(--primary))",
|
|
6
4
|
"hsl(199 89% 48%)",
|
|
7
5
|
"hsl(151 55% 42%)",
|
|
8
6
|
"hsl(35 92% 50%)",
|
|
9
7
|
];
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
8
|
+
const WIDTH = 640;
|
|
9
|
+
const HEIGHT = 240;
|
|
10
|
+
const MARGIN = { top: 14, right: 18, bottom: 34, left: 46 };
|
|
11
|
+
const PLOT_WIDTH = WIDTH - MARGIN.left - MARGIN.right;
|
|
12
|
+
const PLOT_HEIGHT = HEIGHT - MARGIN.top - MARGIN.bottom;
|
|
13
|
+
function numericValue(row, key) {
|
|
14
|
+
const value = row[key];
|
|
15
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
16
|
+
return value;
|
|
17
|
+
if (typeof value === "string" && value.trim()) {
|
|
18
|
+
const parsed = Number(value);
|
|
19
|
+
if (Number.isFinite(parsed))
|
|
20
|
+
return parsed;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function formatTick(value) {
|
|
25
|
+
if (Math.abs(value) >= 1000)
|
|
26
|
+
return value.toLocaleString();
|
|
27
|
+
if (Number.isInteger(value))
|
|
28
|
+
return String(value);
|
|
29
|
+
return value.toFixed(1);
|
|
30
|
+
}
|
|
31
|
+
function labelFor(value) {
|
|
32
|
+
const label = value == null ? "" : String(value);
|
|
33
|
+
return label.length > 16 ? `${label.slice(0, 15)}...` : label;
|
|
34
|
+
}
|
|
35
|
+
function rangeFor(chart) {
|
|
36
|
+
const values = chart.data.flatMap((row) => chart.series
|
|
37
|
+
.map((series) => numericValue(row, series.key))
|
|
38
|
+
.filter((value) => value !== null));
|
|
39
|
+
if (values.length === 0)
|
|
40
|
+
return { min: 0, max: 1 };
|
|
41
|
+
let min = Math.min(...values);
|
|
42
|
+
let max = Math.max(...values);
|
|
43
|
+
if (chart.type === "bar" || chart.type === "area") {
|
|
44
|
+
min = Math.min(0, min);
|
|
45
|
+
max = Math.max(0, max);
|
|
46
|
+
}
|
|
47
|
+
if (min === max) {
|
|
48
|
+
const pad = Math.abs(max || 1) * 0.2;
|
|
49
|
+
min -= pad;
|
|
50
|
+
max += pad;
|
|
20
51
|
}
|
|
21
|
-
|
|
22
|
-
|
|
52
|
+
return { min, max };
|
|
53
|
+
}
|
|
54
|
+
function ChartBody({ chart }) {
|
|
55
|
+
const { min, max } = rangeFor(chart);
|
|
56
|
+
const yFor = (value) => MARGIN.top + ((max - value) / (max - min)) * PLOT_HEIGHT;
|
|
57
|
+
const xForPoint = (index) => chart.data.length <= 1
|
|
58
|
+
? MARGIN.left + PLOT_WIDTH / 2
|
|
59
|
+
: MARGIN.left + (index / (chart.data.length - 1)) * PLOT_WIDTH;
|
|
60
|
+
const gridTicks = Array.from({ length: 4 }, (_, index) => {
|
|
61
|
+
const value = min + ((max - min) * index) / 3;
|
|
62
|
+
return { value, y: yFor(value) };
|
|
63
|
+
});
|
|
64
|
+
const xTickEvery = Math.max(1, Math.ceil(chart.data.length / 6));
|
|
65
|
+
const zeroY = yFor(Math.max(min, Math.min(max, 0)));
|
|
66
|
+
const axes = (_jsxs("g", { "aria-hidden": "true", children: [gridTicks.map((tick) => (_jsxs("g", { children: [_jsx("line", { x1: MARGIN.left, x2: WIDTH - MARGIN.right, y1: tick.y, y2: tick.y, stroke: "hsl(var(--border))", strokeDasharray: "3 3" }), _jsx("text", { x: MARGIN.left - 8, y: tick.y + 4, fill: "hsl(var(--muted-foreground))", fontSize: "11", textAnchor: "end", children: formatTick(tick.value) })] }, tick.y))), _jsx("line", { x1: MARGIN.left, x2: WIDTH - MARGIN.right, y1: zeroY, y2: zeroY, stroke: "hsl(var(--border))" }), chart.data.map((row, index) => index % xTickEvery === 0 || index === chart.data.length - 1 ? (_jsx("text", { x: chart.type === "bar"
|
|
67
|
+
? MARGIN.left + (index + 0.5) * (PLOT_WIDTH / chart.data.length)
|
|
68
|
+
: xForPoint(index), y: HEIGHT - 12, fill: "hsl(var(--muted-foreground))", fontSize: "11", textAnchor: "middle", children: labelFor(row[chart.xKey]) }, `${index}-${String(row[chart.xKey] ?? "")}`)) : null)] }));
|
|
69
|
+
if (chart.type === "bar") {
|
|
70
|
+
const slotWidth = PLOT_WIDTH / Math.max(1, chart.data.length);
|
|
71
|
+
const groupWidth = slotWidth * 0.72;
|
|
72
|
+
const barWidth = groupWidth / Math.max(1, chart.series.length);
|
|
73
|
+
return (_jsxs(_Fragment, { children: [axes, chart.data.map((row, rowIndex) => chart.series.map((series, seriesIndex) => {
|
|
74
|
+
const value = numericValue(row, series.key);
|
|
75
|
+
if (value === null)
|
|
76
|
+
return null;
|
|
77
|
+
const color = series.color ??
|
|
78
|
+
DEFAULT_COLORS[seriesIndex % DEFAULT_COLORS.length];
|
|
79
|
+
const y = yFor(Math.max(value, 0));
|
|
80
|
+
const height = Math.max(1, Math.abs(zeroY - yFor(value)));
|
|
81
|
+
return (_jsx("rect", { x: MARGIN.left +
|
|
82
|
+
rowIndex * slotWidth +
|
|
83
|
+
(slotWidth - groupWidth) / 2 +
|
|
84
|
+
seriesIndex * barWidth, y: y, width: Math.max(2, barWidth - 2), height: height, rx: "3", fill: color }, `${rowIndex}-${series.key}`));
|
|
85
|
+
}))] }));
|
|
23
86
|
}
|
|
24
|
-
|
|
87
|
+
const paths = chart.series.map((series, seriesIndex) => {
|
|
88
|
+
const points = chart.data
|
|
89
|
+
.map((row, rowIndex) => {
|
|
90
|
+
const value = numericValue(row, series.key);
|
|
91
|
+
return value === null
|
|
92
|
+
? null
|
|
93
|
+
: { x: xForPoint(rowIndex), y: yFor(value) };
|
|
94
|
+
})
|
|
95
|
+
.filter((point) => point !== null);
|
|
96
|
+
const color = series.color ?? DEFAULT_COLORS[seriesIndex % DEFAULT_COLORS.length];
|
|
97
|
+
const linePath = points
|
|
98
|
+
.map((point, index) => `${index === 0 ? "M" : "L"} ${point.x} ${point.y}`)
|
|
99
|
+
.join(" ");
|
|
100
|
+
const areaPath = points.length > 0
|
|
101
|
+
? `${linePath} L ${points[points.length - 1].x} ${zeroY} L ${points[0].x} ${zeroY} Z`
|
|
102
|
+
: "";
|
|
103
|
+
return { series, color, linePath, areaPath, points };
|
|
104
|
+
});
|
|
105
|
+
return (_jsxs(_Fragment, { children: [axes, paths.map(({ series, color, areaPath }) => chart.type === "area" && areaPath ? (_jsx("path", { d: areaPath, fill: color, opacity: "0.18", stroke: "none" }, series.key)) : null), paths.map(({ series, color, linePath, points }) => (_jsxs("g", { children: [_jsx("path", { d: linePath, fill: "none", stroke: color, strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }), points.map((point, index) => (_jsx("circle", { cx: point.x, cy: point.y, r: "3", fill: "hsl(var(--background))", stroke: color, strokeWidth: "2" }, index)))] }, series.key)))] }));
|
|
25
106
|
}
|
|
26
107
|
export function DataChartRenderer({ chart }) {
|
|
27
|
-
|
|
28
|
-
useEffect(() => {
|
|
29
|
-
setReady(true);
|
|
30
|
-
}, []);
|
|
31
|
-
return (_jsx("div", { className: "h-60 w-full min-w-0", children: ready ? (_jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsx(ChartBody, { chart: chart }) })) : null }));
|
|
108
|
+
return (_jsx("div", { className: "h-60 w-full min-w-0 overflow-hidden", children: _jsx("svg", { className: "agent-data-chart-renderer h-full w-full", viewBox: `0 0 ${WIDTH} ${HEIGHT}`, role: "img", "aria-label": chart.title ?? "Data chart", preserveAspectRatio: "none", children: _jsx(ChartBody, { chart: chart }) }) }));
|
|
32
109
|
}
|
|
33
110
|
//# sourceMappingURL=DataChartRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataChartRenderer.js","sourceRoot":"","sources":["../../../../src/client/chat/widgets/DataChartRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { DataChartWidget as DataChartWidgetData } from \"./data-widget-types.js\";\n\nconst DEFAULT_COLORS = [\n \"hsl(var(--primary))\",\n \"hsl(199 89% 48%)\",\n \"hsl(151 55% 42%)\",\n \"hsl(35 92% 50%)\",\n];\n\nfunction ChartBody({ chart }: { chart: DataChartWidgetData }) {\n const axes = (\n <>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"hsl(var(--border))\" />\n <XAxis\n dataKey={chart.xKey}\n tickLine={false}\n axisLine={false}\n tick={{ fill: \"hsl(var(--muted-foreground))\", fontSize: 11 }}\n />\n <YAxis\n tickLine={false}\n axisLine={false}\n tick={{ fill: \"hsl(var(--muted-foreground))\", fontSize: 11 }}\n width={34}\n />\n <Tooltip\n contentStyle={{\n background: \"hsl(var(--background))\",\n border: \"1px solid hsl(var(--border))\",\n borderRadius: 8,\n color: \"hsl(var(--foreground))\",\n fontSize: 12,\n }}\n />\n </>\n );\n\n if (chart.type === \"line\") {\n return (\n <LineChart data={chart.data}>\n {axes}\n {chart.series.map((series, index) => (\n <Line\n key={series.key}\n type=\"monotone\"\n dataKey={series.key}\n name={series.label}\n stroke={\n series.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length]\n }\n strokeWidth={2}\n dot={false}\n isAnimationActive={false}\n />\n ))}\n </LineChart>\n );\n }\n\n if (chart.type === \"area\") {\n return (\n <AreaChart data={chart.data}>\n {axes}\n {chart.series.map((series, index) => (\n <Area\n key={series.key}\n type=\"monotone\"\n dataKey={series.key}\n name={series.label}\n stroke={\n series.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length]\n }\n fill={series.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n fillOpacity={0.18}\n isAnimationActive={false}\n />\n ))}\n </AreaChart>\n );\n }\n\n return (\n <BarChart data={chart.data}>\n {axes}\n {chart.series.map((series, index) => (\n <Bar\n key={series.key}\n dataKey={series.key}\n name={series.label}\n fill={series.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n radius={[4, 4, 0, 0]}\n isAnimationActive={false}\n />\n ))}\n </BarChart>\n );\n}\n\nexport function DataChartRenderer({ chart }: { chart: DataChartWidgetData }) {\n const [ready, setReady] = useState(false);\n\n useEffect(() => {\n setReady(true);\n }, []);\n\n return (\n <div className=\"h-60 w-full min-w-0\">\n {ready ? (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <ChartBody chart={chart} />\n </ResponsiveContainer>\n ) : null}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DataChartRenderer.js","sourceRoot":"","sources":["../../../../src/client/chat/widgets/DataChartRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { DataChartWidget as DataChartWidgetData } from \"./data-widget-types.js\";\n\nconst DEFAULT_COLORS = [\n \"hsl(var(--primary))\",\n \"hsl(199 89% 48%)\",\n \"hsl(151 55% 42%)\",\n \"hsl(35 92% 50%)\",\n];\n\nconst WIDTH = 640;\nconst HEIGHT = 240;\nconst MARGIN = { top: 14, right: 18, bottom: 34, left: 46 };\nconst PLOT_WIDTH = WIDTH - MARGIN.left - MARGIN.right;\nconst PLOT_HEIGHT = HEIGHT - MARGIN.top - MARGIN.bottom;\n\nfunction numericValue(\n row: Record<string, unknown>,\n key: string,\n): number | null {\n const value = row[key];\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return null;\n}\n\nfunction formatTick(value: number): string {\n if (Math.abs(value) >= 1000) return value.toLocaleString();\n if (Number.isInteger(value)) return String(value);\n return value.toFixed(1);\n}\n\nfunction labelFor(value: unknown): string {\n const label = value == null ? \"\" : String(value);\n return label.length > 16 ? `${label.slice(0, 15)}...` : label;\n}\n\nfunction rangeFor(chart: DataChartWidgetData) {\n const values = chart.data.flatMap((row) =>\n chart.series\n .map((series) => numericValue(row, series.key))\n .filter((value): value is number => value !== null),\n );\n if (values.length === 0) return { min: 0, max: 1 };\n\n let min = Math.min(...values);\n let max = Math.max(...values);\n if (chart.type === \"bar\" || chart.type === \"area\") {\n min = Math.min(0, min);\n max = Math.max(0, max);\n }\n if (min === max) {\n const pad = Math.abs(max || 1) * 0.2;\n min -= pad;\n max += pad;\n }\n return { min, max };\n}\n\nfunction ChartBody({ chart }: { chart: DataChartWidgetData }) {\n const { min, max } = rangeFor(chart);\n const yFor = (value: number) =>\n MARGIN.top + ((max - value) / (max - min)) * PLOT_HEIGHT;\n const xForPoint = (index: number) =>\n chart.data.length <= 1\n ? MARGIN.left + PLOT_WIDTH / 2\n : MARGIN.left + (index / (chart.data.length - 1)) * PLOT_WIDTH;\n const gridTicks = Array.from({ length: 4 }, (_, index) => {\n const value = min + ((max - min) * index) / 3;\n return { value, y: yFor(value) };\n });\n const xTickEvery = Math.max(1, Math.ceil(chart.data.length / 6));\n const zeroY = yFor(Math.max(min, Math.min(max, 0)));\n\n const axes = (\n <g aria-hidden=\"true\">\n {gridTicks.map((tick) => (\n <g key={tick.y}>\n <line\n x1={MARGIN.left}\n x2={WIDTH - MARGIN.right}\n y1={tick.y}\n y2={tick.y}\n stroke=\"hsl(var(--border))\"\n strokeDasharray=\"3 3\"\n />\n <text\n x={MARGIN.left - 8}\n y={tick.y + 4}\n fill=\"hsl(var(--muted-foreground))\"\n fontSize=\"11\"\n textAnchor=\"end\"\n >\n {formatTick(tick.value)}\n </text>\n </g>\n ))}\n <line\n x1={MARGIN.left}\n x2={WIDTH - MARGIN.right}\n y1={zeroY}\n y2={zeroY}\n stroke=\"hsl(var(--border))\"\n />\n {chart.data.map((row, index) =>\n index % xTickEvery === 0 || index === chart.data.length - 1 ? (\n <text\n key={`${index}-${String(row[chart.xKey] ?? \"\")}`}\n x={\n chart.type === \"bar\"\n ? MARGIN.left + (index + 0.5) * (PLOT_WIDTH / chart.data.length)\n : xForPoint(index)\n }\n y={HEIGHT - 12}\n fill=\"hsl(var(--muted-foreground))\"\n fontSize=\"11\"\n textAnchor=\"middle\"\n >\n {labelFor(row[chart.xKey])}\n </text>\n ) : null,\n )}\n </g>\n );\n\n if (chart.type === \"bar\") {\n const slotWidth = PLOT_WIDTH / Math.max(1, chart.data.length);\n const groupWidth = slotWidth * 0.72;\n const barWidth = groupWidth / Math.max(1, chart.series.length);\n return (\n <>\n {axes}\n {chart.data.map((row, rowIndex) =>\n chart.series.map((series, seriesIndex) => {\n const value = numericValue(row, series.key);\n if (value === null) return null;\n const color =\n series.color ??\n DEFAULT_COLORS[seriesIndex % DEFAULT_COLORS.length];\n const y = yFor(Math.max(value, 0));\n const height = Math.max(1, Math.abs(zeroY - yFor(value)));\n return (\n <rect\n key={`${rowIndex}-${series.key}`}\n x={\n MARGIN.left +\n rowIndex * slotWidth +\n (slotWidth - groupWidth) / 2 +\n seriesIndex * barWidth\n }\n y={y}\n width={Math.max(2, barWidth - 2)}\n height={height}\n rx=\"3\"\n fill={color}\n />\n );\n }),\n )}\n </>\n );\n }\n\n const paths = chart.series.map((series, seriesIndex) => {\n const points = chart.data\n .map((row, rowIndex) => {\n const value = numericValue(row, series.key);\n return value === null\n ? null\n : { x: xForPoint(rowIndex), y: yFor(value) };\n })\n .filter((point): point is { x: number; y: number } => point !== null);\n const color =\n series.color ?? DEFAULT_COLORS[seriesIndex % DEFAULT_COLORS.length];\n const linePath = points\n .map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`)\n .join(\" \");\n const areaPath =\n points.length > 0\n ? `${linePath} L ${points[points.length - 1].x} ${zeroY} L ${points[0].x} ${zeroY} Z`\n : \"\";\n return { series, color, linePath, areaPath, points };\n });\n\n return (\n <>\n {axes}\n {paths.map(({ series, color, areaPath }) =>\n chart.type === \"area\" && areaPath ? (\n <path\n key={series.key}\n d={areaPath}\n fill={color}\n opacity=\"0.18\"\n stroke=\"none\"\n />\n ) : null,\n )}\n {paths.map(({ series, color, linePath, points }) => (\n <g key={series.key}>\n <path\n d={linePath}\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {points.map((point, index) => (\n <circle\n key={index}\n cx={point.x}\n cy={point.y}\n r=\"3\"\n fill=\"hsl(var(--background))\"\n stroke={color}\n strokeWidth=\"2\"\n />\n ))}\n </g>\n ))}\n </>\n );\n}\n\nexport function DataChartRenderer({ chart }: { chart: DataChartWidgetData }) {\n return (\n <div className=\"h-60 w-full min-w-0 overflow-hidden\">\n <svg\n className=\"agent-data-chart-renderer h-full w-full\"\n viewBox={`0 0 ${WIDTH} ${HEIGHT}`}\n role=\"img\"\n aria-label={chart.title ?? \"Data chart\"}\n preserveAspectRatio=\"none\"\n >\n <ChartBody chart={chart} />\n </svg>\n </div>\n );\n}\n"]}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type ToolRendererContext, type ToolRendererComponent } from "../tool-render-registry.js";
|
|
2
|
+
export declare function isBuiltinDataWidgetActionRenderer(context: ToolRendererContext): boolean;
|
|
3
|
+
export declare function resolveBuiltinActionChatRenderer(context: ToolRendererContext): ToolRendererComponent | null;
|
|
4
|
+
export declare function resolveBuiltinFallbackToolRenderer(context: ToolRendererContext): ToolRendererComponent | null;
|
|
2
5
|
//# sourceMappingURL=builtin-tool-renderers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-tool-renderers.d.ts","sourceRoot":"","sources":["../../../../src/client/chat/widgets/builtin-tool-renderers.tsx"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"builtin-tool-renderers.d.ts","sourceRoot":"","sources":["../../../../src/client/chat/widgets/builtin-tool-renderers.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAiFpC,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAQT;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,mBAAmB,GAC3B,qBAAqB,GAAG,IAAI,CAQ9B;AAED,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,mBAAmB,GAC3B,qBAAqB,GAAG,IAAI,CAI9B"}
|
|
@@ -12,9 +12,15 @@ function normalizeActionDataWidgetResult(context) {
|
|
|
12
12
|
const result = normalizeDataWidgetResult(context.resultJson);
|
|
13
13
|
if (result)
|
|
14
14
|
return result;
|
|
15
|
+
const renderer = context.chatUI?.renderer;
|
|
16
|
+
if (renderer === ACTION_CHAT_UI_DATA_WIDGET_RENDERER ||
|
|
17
|
+
context.toolName === "render-data-widget") {
|
|
18
|
+
const argsResult = normalizeDataWidgetResult(context.args);
|
|
19
|
+
if (argsResult)
|
|
20
|
+
return argsResult;
|
|
21
|
+
}
|
|
15
22
|
if (!isRecord(context.resultJson))
|
|
16
23
|
return null;
|
|
17
|
-
const renderer = context.chatUI?.renderer;
|
|
18
24
|
if (renderer === ACTION_CHAT_UI_DATA_TABLE_RENDERER) {
|
|
19
25
|
return normalizeDataWidgetResult({
|
|
20
26
|
widget: DATA_TABLE_WIDGET,
|
|
@@ -62,6 +68,26 @@ function renderDataWidget(context) {
|
|
|
62
68
|
}
|
|
63
69
|
return null;
|
|
64
70
|
}
|
|
71
|
+
const BuiltinDataWidgetRenderer = ({ context }) => renderDataWidget(context);
|
|
72
|
+
export function isBuiltinDataWidgetActionRenderer(context) {
|
|
73
|
+
const renderer = context.chatUI?.renderer;
|
|
74
|
+
return (renderer === ACTION_CHAT_UI_DATA_TABLE_RENDERER ||
|
|
75
|
+
renderer === ACTION_CHAT_UI_DATA_CHART_RENDERER ||
|
|
76
|
+
renderer === ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER ||
|
|
77
|
+
renderer === ACTION_CHAT_UI_DATA_WIDGET_RENDERER);
|
|
78
|
+
}
|
|
79
|
+
export function resolveBuiltinActionChatRenderer(context) {
|
|
80
|
+
if (isBuiltinDataWidgetActionRenderer(context) &&
|
|
81
|
+
normalizeActionDataWidgetResult(context)) {
|
|
82
|
+
return BuiltinDataWidgetRenderer;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
export function resolveBuiltinFallbackToolRenderer(context) {
|
|
87
|
+
return normalizeActionDataWidgetResult(context) !== null
|
|
88
|
+
? BuiltinDataWidgetRenderer
|
|
89
|
+
: null;
|
|
90
|
+
}
|
|
65
91
|
for (const [id, renderer] of [
|
|
66
92
|
["core.data-table", ACTION_CHAT_UI_DATA_TABLE_RENDERER],
|
|
67
93
|
["core.data-chart", ACTION_CHAT_UI_DATA_CHART_RENDERER],
|
|
@@ -71,12 +97,12 @@ for (const [id, renderer] of [
|
|
|
71
97
|
registerReservedActionChatRenderer({
|
|
72
98
|
id,
|
|
73
99
|
renderer,
|
|
74
|
-
Component:
|
|
100
|
+
Component: BuiltinDataWidgetRenderer,
|
|
75
101
|
});
|
|
76
102
|
}
|
|
77
103
|
registerReservedFallbackToolRenderer({
|
|
78
104
|
id: "core.data-widgets",
|
|
79
|
-
match: (context) =>
|
|
80
|
-
Component:
|
|
105
|
+
match: (context) => normalizeActionDataWidgetResult(context) !== null,
|
|
106
|
+
Component: BuiltinDataWidgetRenderer,
|
|
81
107
|
});
|
|
82
108
|
//# sourceMappingURL=builtin-tool-renderers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin-tool-renderers.js","sourceRoot":"","sources":["../../../../src/client/chat/widgets/builtin-tool-renderers.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,GAE1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kCAAkC,EAClC,qCAAqC,EACrC,kCAAkC,EAClC,mCAAmC,GACpC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,kCAAkC,EAClC,oCAAoC,
|
|
1
|
+
{"version":3,"file":"builtin-tool-renderers.js","sourceRoot":"","sources":["../../../../src/client/chat/widgets/builtin-tool-renderers.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DATA_CHART_WIDGET,\n DATA_INSIGHTS_WIDGET,\n DATA_TABLE_WIDGET,\n normalizeDataWidgetKind,\n normalizeDataWidgetResult,\n type DataWidgetResult,\n} from \"./data-widget-types.js\";\nimport {\n ACTION_CHAT_UI_DATA_CHART_RENDERER,\n ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER,\n ACTION_CHAT_UI_DATA_TABLE_RENDERER,\n ACTION_CHAT_UI_DATA_WIDGET_RENDERER,\n} from \"../../../action-ui.js\";\nimport { DataChartWidget } from \"./DataChartWidget.js\";\nimport { DataInsightsWidget } from \"./DataInsightsWidget.js\";\nimport { DataTableWidget } from \"./DataTableWidget.js\";\nimport {\n registerReservedActionChatRenderer,\n registerReservedFallbackToolRenderer,\n type ToolRendererContext,\n type ToolRendererComponent,\n} from \"../tool-render-registry.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction normalizeActionDataWidgetResult(\n context: ToolRendererContext,\n): DataWidgetResult | null {\n const result = normalizeDataWidgetResult(context.resultJson);\n if (result) return result;\n\n const renderer = context.chatUI?.renderer;\n if (\n renderer === ACTION_CHAT_UI_DATA_WIDGET_RENDERER ||\n context.toolName === \"render-data-widget\"\n ) {\n const argsResult = normalizeDataWidgetResult(context.args);\n if (argsResult) return argsResult;\n }\n\n if (!isRecord(context.resultJson)) return null;\n\n if (renderer === ACTION_CHAT_UI_DATA_TABLE_RENDERER) {\n return normalizeDataWidgetResult({\n widget: DATA_TABLE_WIDGET,\n table: isRecord(context.resultJson.table)\n ? context.resultJson.table\n : context.resultJson,\n display: isRecord(context.resultJson.display)\n ? context.resultJson.display\n : undefined,\n });\n }\n if (renderer === ACTION_CHAT_UI_DATA_CHART_RENDERER) {\n return normalizeDataWidgetResult({\n widget: DATA_CHART_WIDGET,\n chartSeries: isRecord(context.resultJson.chartSeries)\n ? context.resultJson.chartSeries\n : context.resultJson,\n display: isRecord(context.resultJson.display)\n ? context.resultJson.display\n : undefined,\n });\n }\n if (renderer === ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER) {\n return normalizeDataWidgetResult({\n ...context.resultJson,\n widget: DATA_INSIGHTS_WIDGET,\n });\n }\n\n return null;\n}\n\nfunction renderDataWidget(context: ToolRendererContext) {\n const result =\n normalizeActionDataWidgetResult(context) ??\n normalizeDataWidgetResult(context.resultJson);\n if (!result) return null;\n const widget = normalizeDataWidgetKind(result.widget);\n if (widget === DATA_TABLE_WIDGET && result.table) {\n return (\n <DataTableWidget\n table={result.table}\n action={result.display?.primaryAction}\n />\n );\n }\n if (widget === DATA_CHART_WIDGET && result.chartSeries) {\n return <DataChartWidget chart={result.chartSeries} />;\n }\n if (widget === DATA_INSIGHTS_WIDGET) {\n return <DataInsightsWidget result={result} />;\n }\n return null;\n}\n\nconst BuiltinDataWidgetRenderer: ToolRendererComponent = ({ context }) =>\n renderDataWidget(context);\n\nexport function isBuiltinDataWidgetActionRenderer(\n context: ToolRendererContext,\n): boolean {\n const renderer = context.chatUI?.renderer;\n return (\n renderer === ACTION_CHAT_UI_DATA_TABLE_RENDERER ||\n renderer === ACTION_CHAT_UI_DATA_CHART_RENDERER ||\n renderer === ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER ||\n renderer === ACTION_CHAT_UI_DATA_WIDGET_RENDERER\n );\n}\n\nexport function resolveBuiltinActionChatRenderer(\n context: ToolRendererContext,\n): ToolRendererComponent | null {\n if (\n isBuiltinDataWidgetActionRenderer(context) &&\n normalizeActionDataWidgetResult(context)\n ) {\n return BuiltinDataWidgetRenderer;\n }\n return null;\n}\n\nexport function resolveBuiltinFallbackToolRenderer(\n context: ToolRendererContext,\n): ToolRendererComponent | null {\n return normalizeActionDataWidgetResult(context) !== null\n ? BuiltinDataWidgetRenderer\n : null;\n}\n\nfor (const [id, renderer] of [\n [\"core.data-table\", ACTION_CHAT_UI_DATA_TABLE_RENDERER],\n [\"core.data-chart\", ACTION_CHAT_UI_DATA_CHART_RENDERER],\n [\"core.data-insights\", ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER],\n [\"core.data-widget\", ACTION_CHAT_UI_DATA_WIDGET_RENDERER],\n] as const) {\n registerReservedActionChatRenderer({\n id,\n renderer,\n Component: BuiltinDataWidgetRenderer,\n });\n}\n\nregisterReservedFallbackToolRenderer({\n id: \"core.data-widgets\",\n match: (context) => normalizeActionDataWidgetResult(context) !== null,\n Component: BuiltinDataWidgetRenderer,\n});\n"]}
|
|
@@ -8,7 +8,7 @@ import { cn } from "../utils.js";
|
|
|
8
8
|
* all render this same frame so the composer does not drift across products.
|
|
9
9
|
*/
|
|
10
10
|
export function AgentComposerFrame({ children, className, rootClassName, style, rootStyle, layoutVariant = "default", onClick, }) {
|
|
11
|
-
return (_jsx("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "area", className: cn("agent-composer-area shrink-0 px-3 py-2", layoutVariant !== "default" && `agent-composer-area--${layoutVariant}`, className), style: style, onClick: onClick, children: _jsx(ComposerPrimitive.Root, { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "root", className: cn("agent-composer-root flex flex-col rounded-lg border border-input bg-
|
|
11
|
+
return (_jsx("div", { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "area", className: cn("agent-composer-area shrink-0 px-3 py-2", layoutVariant !== "default" && `agent-composer-area--${layoutVariant}`, className), style: style, onClick: onClick, children: _jsx(ComposerPrimitive.Root, { "data-agent-composer-variant": layoutVariant, "data-agent-composer-slot": "root", className: cn("agent-composer-root flex flex-col rounded-lg border border-input bg-muted/45 transition-colors focus-within:border-ring", layoutVariant !== "default" &&
|
|
12
12
|
`agent-composer-root--${layoutVariant}`, rootClassName), style: rootStyle, children: children }) }));
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=AgentComposerFrame.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentComposerFrame.js","sourceRoot":"","sources":["../../../src/client/composer/AgentComposerFrame.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAajC;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,aAAa,EACb,KAAK,EACL,SAAS,EACT,aAAa,GAAG,SAAS,EACzB,OAAO,GACiB;IACxB,OAAO,CACL,6CAC+B,aAAa,8BACjB,MAAM,EAC/B,SAAS,EAAE,EAAE,CACX,wCAAwC,EACxC,aAAa,KAAK,SAAS,IAAI,wBAAwB,aAAa,EAAE,EACtE,SAAS,CACV,EACD,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,YAEhB,KAAC,iBAAiB,CAAC,IAAI,mCACQ,aAAa,8BACjB,MAAM,EAC/B,SAAS,EAAE,EAAE,CACX,
|
|
1
|
+
{"version":3,"file":"AgentComposerFrame.js","sourceRoot":"","sources":["../../../src/client/composer/AgentComposerFrame.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAajC;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,SAAS,EACT,aAAa,EACb,KAAK,EACL,SAAS,EACT,aAAa,GAAG,SAAS,EACzB,OAAO,GACiB;IACxB,OAAO,CACL,6CAC+B,aAAa,8BACjB,MAAM,EAC/B,SAAS,EAAE,EAAE,CACX,wCAAwC,EACxC,aAAa,KAAK,SAAS,IAAI,wBAAwB,aAAa,EAAE,EACtE,SAAS,CACV,EACD,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,YAEhB,KAAC,iBAAiB,CAAC,IAAI,mCACQ,aAAa,8BACjB,MAAM,EAC/B,SAAS,EAAE,EAAE,CACX,yHAAyH,EACzH,aAAa,KAAK,SAAS;gBACzB,wBAAwB,aAAa,EAAE,EACzC,aAAa,CACd,EACD,KAAK,EAAE,SAAS,YAEf,QAAQ,GACc,GACrB,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { ComposerPrimitive } from \"@assistant-ui/react\";\nimport type React from \"react\";\nimport { cn } from \"../utils.js\";\nimport type { AgentComposerLayoutVariant } from \"./types.js\";\n\nexport interface AgentComposerFrameProps {\n children: React.ReactNode;\n className?: string;\n rootClassName?: string;\n style?: React.CSSProperties;\n rootStyle?: React.CSSProperties;\n layoutVariant?: AgentComposerLayoutVariant;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\n/**\n * The single visual shell for agent chat composition.\n *\n * AssistantChat, PromptComposer, and host surfaces such as Agent-Native Code\n * all render this same frame so the composer does not drift across products.\n */\nexport function AgentComposerFrame({\n children,\n className,\n rootClassName,\n style,\n rootStyle,\n layoutVariant = \"default\",\n onClick,\n}: AgentComposerFrameProps) {\n return (\n <div\n data-agent-composer-variant={layoutVariant}\n data-agent-composer-slot=\"area\"\n className={cn(\n \"agent-composer-area shrink-0 px-3 py-2\",\n layoutVariant !== \"default\" && `agent-composer-area--${layoutVariant}`,\n className,\n )}\n style={style}\n onClick={onClick}\n >\n <ComposerPrimitive.Root\n data-agent-composer-variant={layoutVariant}\n data-agent-composer-slot=\"root\"\n className={cn(\n \"agent-composer-root flex flex-col rounded-lg border border-input bg-muted/45 transition-colors focus-within:border-ring\",\n layoutVariant !== \"default\" &&\n `agent-composer-root--${layoutVariant}`,\n rootClassName,\n )}\n style={rootStyle}\n >\n {children}\n </ComposerPrimitive.Root>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.d.ts","sourceRoot":"","sources":["../../../src/scripts/db/tool-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,wBAAgB,oBAAoB,IAAI,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CA4B5E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function dbExecToolParameters() {
|
|
2
|
+
return {
|
|
3
|
+
type: "object",
|
|
4
|
+
properties: {
|
|
5
|
+
sql: {
|
|
6
|
+
type: "string",
|
|
7
|
+
description: "Single INSERT / UPDATE / DELETE / REPLACE statement. Use parameterized placeholders (?) where possible.",
|
|
8
|
+
},
|
|
9
|
+
args: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: 'Optional JSON array of positional bind args for `sql`. Example: \'["published","form-123"]\'',
|
|
12
|
+
},
|
|
13
|
+
statements: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: 'Optional JSON array of write statements to execute in one transaction. Prefer this over multiple db-exec calls. Example: \'[{"sql":"INSERT INTO notes (id,title) VALUES (?,?)","args":["n1","One"]},{"sql":"UPDATE counters SET value = value + 1 WHERE key = ?","args":["notes"]}]\'',
|
|
16
|
+
},
|
|
17
|
+
format: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: 'Output format: "json" or "text" (default: text)',
|
|
20
|
+
enum: ["json", "text"],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
additionalProperties: false,
|
|
24
|
+
oneOf: [{ required: ["sql"] }, { required: ["statements"] }],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=tool-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.js","sourceRoot":"","sources":["../../../src/scripts/db/tool-schemas.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,yGAAyG;aAC5G;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,8FAA8F;aACjG;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,uRAAuR;aAC1R;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iDAAiD;gBAC9D,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;aACvB;SACF;QACD,oBAAoB,EAAE,KAAK;QAC3B,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC","sourcesContent":["import type { ActionTool } from \"../../agent/types.js\";\n\nexport function dbExecToolParameters(): NonNullable<ActionTool[\"parameters\"]> {\n return {\n type: \"object\",\n properties: {\n sql: {\n type: \"string\",\n description:\n \"Single INSERT / UPDATE / DELETE / REPLACE statement. Use parameterized placeholders (?) where possible.\",\n },\n args: {\n type: \"string\",\n description:\n 'Optional JSON array of positional bind args for `sql`. Example: \\'[\"published\",\"form-123\"]\\'',\n },\n statements: {\n type: \"string\",\n description:\n 'Optional JSON array of write statements to execute in one transaction. Prefer this over multiple db-exec calls. Example: \\'[{\"sql\":\"INSERT INTO notes (id,title) VALUES (?,?)\",\"args\":[\"n1\",\"One\"]},{\"sql\":\"UPDATE counters SET value = value + 1 WHERE key = ?\",\"args\":[\"notes\"]}]\\'',\n },\n format: {\n type: \"string\",\n description: 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n additionalProperties: false,\n oneOf: [{ required: [\"sql\"] }, { required: [\"statements\"] }],\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scripts/dev/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scripts/dev/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAuDnE;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAyLtC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* registered in production.
|
|
7
7
|
*/
|
|
8
8
|
import { createCodingToolRegistry } from "../../coding-tools/index.js";
|
|
9
|
+
import { dbExecToolParameters } from "../db/tool-schemas.js";
|
|
9
10
|
import { tool as readFileTool, run as readFileRun } from "./read-file.js";
|
|
10
11
|
import { tool as writeFileTool, run as writeFileRun } from "./write-file.js";
|
|
11
12
|
import { tool as listFilesTool, run as listFilesRun } from "./list-files.js";
|
|
@@ -103,28 +104,7 @@ export async function createDevScriptRegistry(options = {}) {
|
|
|
103
104
|
}, dbQuery.default, { readOnly: true }),
|
|
104
105
|
"db-exec": wrapCliScript({
|
|
105
106
|
description: "Execute app-database write SQL (INSERT, UPDATE, DELETE, REPLACE). For multiple related writes, pass `statements` so they run sequentially in one transaction instead of issuing several db-exec calls. Schema changes (CREATE/ALTER/DROP) are blocked. Never use this to backfill missing data for a read/analysis request or to create/modify users, members, roles, permissions, admin flags, or ownership; use a dedicated app action or reviewed code.",
|
|
106
|
-
parameters:
|
|
107
|
-
type: "object",
|
|
108
|
-
properties: {
|
|
109
|
-
sql: {
|
|
110
|
-
type: "string",
|
|
111
|
-
description: "Single INSERT / UPDATE / DELETE / REPLACE statement. Use parameterized placeholders (?) where possible.",
|
|
112
|
-
},
|
|
113
|
-
args: {
|
|
114
|
-
type: "string",
|
|
115
|
-
description: 'Optional JSON array of positional bind args for `sql`. Example: \'["published","form-123"]\'',
|
|
116
|
-
},
|
|
117
|
-
statements: {
|
|
118
|
-
type: "string",
|
|
119
|
-
description: 'Optional JSON array of write statements to execute in one transaction. Prefer this over multiple db-exec calls. Example: \'[{"sql":"INSERT INTO notes (id,title) VALUES (?,?)","args":["n1","One"]},{"sql":"UPDATE counters SET value = value + 1 WHERE key = ?","args":["notes"]}]\'',
|
|
120
|
-
},
|
|
121
|
-
format: {
|
|
122
|
-
type: "string",
|
|
123
|
-
description: 'Output format: "json" or "text" (default: text)',
|
|
124
|
-
enum: ["json", "text"],
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
},
|
|
107
|
+
parameters: dbExecToolParameters(),
|
|
128
108
|
}, dbExec.default),
|
|
129
109
|
"db-patch": wrapCliScript({
|
|
130
110
|
description: "Surgical search-and-replace on a text column in a SQL table. Prefer over `db-exec UPDATE` for large text fields (documents, slides, dashboards, JSON blobs) where you only need to change a small slice — avoids re-sending the full column value. Targets exactly one row at a time (narrow --where by primary key). If a template-specific action exists for the table (e.g. `edit-document`, `update-slide`), use that instead — it will also push live updates to open collaborative editors.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scripts/dev/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dev-mode script registry.\n *\n * Provides shared coding and database tools for the agent\n * when running in development mode. These tools should NEVER be\n * registered in production.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport type { ActionEntry } from \"../../agent/production-agent.js\";\nimport { createCodingToolRegistry } from \"../../coding-tools/index.js\";\nimport { tool as readFileTool, run as readFileRun } from \"./read-file.js\";\nimport { tool as writeFileTool, run as writeFileRun } from \"./write-file.js\";\nimport { tool as listFilesTool, run as listFilesRun } from \"./list-files.js\";\nimport {\n tool as searchFilesTool,\n run as searchFilesRun,\n} from \"./search-files.js\";\nimport { tool as shellTool, run as shellRun } from \"./shell.js\";\n\n/**\n * Wraps a core CLI script (that writes to console.log) as a ActionEntry\n * by capturing stdout.\n */\nfunction wrapCliScript(\n tool: ActionTool,\n cliDefault: (args: string[]) => Promise<void>,\n opts?: { readOnly?: boolean },\n): ActionEntry {\n return {\n tool,\n ...(opts?.readOnly ? { readOnly: true as const } : {}),\n run: async (args: Record<string, string>): Promise<string> => {\n const cliArgs: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const raw = v as unknown;\n const value =\n raw != null && typeof raw === \"object\"\n ? JSON.stringify(raw)\n : String(raw);\n cliArgs.push(`--${k}`, value);\n }\n\n // Capture console.log output\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...a: unknown[]) => {\n logs.push(a.map(String).join(\" \"));\n };\n\n try {\n await cliDefault(cliArgs);\n } catch (err: any) {\n logs.push(`Error: ${err?.message ?? String(err)}`);\n } finally {\n console.log = origLog;\n }\n\n return logs.join(\"\\n\") || \"(no output)\";\n },\n };\n}\n\n/**\n * Creates the dev-mode script registry with shared bash/read/edit/write\n * coding tools and database tools. Call this and merge with your app's registry\n * when NODE_ENV !== \"production\".\n */\nexport async function createDevScriptRegistry(\n options: { legacyAliases?: boolean; databaseTools?: boolean } = {},\n): Promise<Record<string, ActionEntry>> {\n // Lazy-import DB scripts to avoid requiring libsql in non-DB apps\n let dbEntries: Record<string, ActionEntry> = {};\n if (options.databaseTools !== false) {\n try {\n // Dynamic imports — these are part of @agent-native/core\n const [dbSchema, dbQuery, dbExec, dbPatch, dbCheckScoping] =\n await Promise.all([\n import(\"../db/schema.js\"),\n import(\"../db/query.js\"),\n import(\"../db/exec.js\"),\n import(\"../db/patch.js\"),\n import(\"../db/check-scoping.js\"),\n ]);\n\n dbEntries = {\n \"db-schema\": wrapCliScript(\n {\n description:\n \"Show all database tables, columns, types, and foreign keys\",\n parameters: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n },\n },\n dbSchema.default,\n { readOnly: true },\n ),\n \"db-query\": wrapCliScript(\n {\n description:\n \"Run a read-only SQL query (SELECT, WITH, EXPLAIN, PRAGMA) against the app database\",\n parameters: {\n type: \"object\",\n properties: {\n sql: {\n type: \"string\",\n description: \"The SQL SELECT query to execute\",\n },\n args: {\n type: \"string\",\n description:\n 'Optional JSON array of positional bind args for parameterized placeholders. Example: \\'[\"draft\",\"form-123\"]\\'',\n },\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"table\" (default: table)',\n enum: [\"json\", \"table\"],\n },\n },\n required: [\"sql\"],\n },\n },\n dbQuery.default,\n { readOnly: true },\n ),\n \"db-exec\": wrapCliScript(\n {\n description:\n \"Execute app-database write SQL (INSERT, UPDATE, DELETE, REPLACE). For multiple related writes, pass `statements` so they run sequentially in one transaction instead of issuing several db-exec calls. Schema changes (CREATE/ALTER/DROP) are blocked. Never use this to backfill missing data for a read/analysis request or to create/modify users, members, roles, permissions, admin flags, or ownership; use a dedicated app action or reviewed code.\",\n parameters: {\n type: \"object\",\n properties: {\n sql: {\n type: \"string\",\n description:\n \"Single INSERT / UPDATE / DELETE / REPLACE statement. Use parameterized placeholders (?) where possible.\",\n },\n args: {\n type: \"string\",\n description:\n 'Optional JSON array of positional bind args for `sql`. Example: \\'[\"published\",\"form-123\"]\\'',\n },\n statements: {\n type: \"string\",\n description:\n 'Optional JSON array of write statements to execute in one transaction. Prefer this over multiple db-exec calls. Example: \\'[{\"sql\":\"INSERT INTO notes (id,title) VALUES (?,?)\",\"args\":[\"n1\",\"One\"]},{\"sql\":\"UPDATE counters SET value = value + 1 WHERE key = ?\",\"args\":[\"notes\"]}]\\'',\n },\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n },\n },\n dbExec.default,\n ),\n \"db-patch\": wrapCliScript(\n {\n description:\n \"Surgical search-and-replace on a text column in a SQL table. Prefer over `db-exec UPDATE` for large text fields (documents, slides, dashboards, JSON blobs) where you only need to change a small slice — avoids re-sending the full column value. Targets exactly one row at a time (narrow --where by primary key). If a template-specific action exists for the table (e.g. `edit-document`, `update-slide`), use that instead — it will also push live updates to open collaborative editors.\",\n parameters: {\n type: \"object\",\n properties: {\n table: {\n type: \"string\",\n description:\n \"Target table name (plain identifier, no quoting)\",\n },\n column: {\n type: \"string\",\n description:\n \"Target text column name (plain identifier, no quoting)\",\n },\n where: {\n type: \"string\",\n description:\n \"SQL WHERE clause that matches exactly one row, e.g. \\\"id = 'abc123'\\\". Must not contain semicolons or DDL keywords.\",\n },\n find: {\n type: \"string\",\n description:\n \"Text to find (single-edit mode). Pair with --replace.\",\n },\n replace: {\n type: \"string\",\n description:\n 'Replacement text (single-edit mode). Defaults to \"\" (delete the match).',\n },\n edits: {\n type: \"string\",\n description:\n 'Batch mode: JSON array of {find, replace} objects. Example: \\'[{\"find\":\"Q3\",\"replace\":\"Q4\"},{\"find\":\"$1M\",\"replace\":\"$1.2M\"}]\\'',\n },\n all: {\n type: \"string\",\n description:\n 'Set to \"true\" to replace every occurrence of each find (default: first occurrence only).',\n enum: [\"true\", \"false\"],\n },\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n required: [\"table\", \"column\", \"where\"],\n },\n },\n dbPatch.default,\n ),\n \"db-check-scoping\": wrapCliScript(\n {\n description:\n \"Validate that all template tables have owner_email and org_id columns for data scoping\",\n parameters: {\n type: \"object\",\n properties: {\n \"require-org\": {\n type: \"string\",\n description:\n 'Set to \"true\" to also require org_id columns (for multi-org apps)',\n enum: [\"true\", \"false\"],\n },\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n },\n },\n dbCheckScoping.default,\n { readOnly: true },\n ),\n };\n } catch {\n // DB scripts not available (no libsql) — skip silently\n }\n }\n\n const codingEntries = createCodingToolRegistry({\n cwd: process.cwd(),\n bashThrowsOnNonZero: true,\n });\n const legacyEntries: Record<string, ActionEntry> = options.legacyAliases\n ? {\n \"read-file\": { tool: readFileTool, run: readFileRun, readOnly: true },\n \"write-file\": { tool: writeFileTool, run: writeFileRun },\n \"list-files\": {\n tool: listFilesTool,\n run: listFilesRun,\n readOnly: true,\n },\n \"search-files\": {\n tool: searchFilesTool,\n run: searchFilesRun,\n readOnly: true,\n },\n shell: { tool: shellTool, run: shellRun },\n }\n : {};\n\n return {\n ...codingEntries,\n ...legacyEntries,\n ...dbEntries,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scripts/dev/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dev-mode script registry.\n *\n * Provides shared coding and database tools for the agent\n * when running in development mode. These tools should NEVER be\n * registered in production.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport type { ActionEntry } from \"../../agent/production-agent.js\";\nimport { createCodingToolRegistry } from \"../../coding-tools/index.js\";\nimport { dbExecToolParameters } from \"../db/tool-schemas.js\";\nimport { tool as readFileTool, run as readFileRun } from \"./read-file.js\";\nimport { tool as writeFileTool, run as writeFileRun } from \"./write-file.js\";\nimport { tool as listFilesTool, run as listFilesRun } from \"./list-files.js\";\nimport {\n tool as searchFilesTool,\n run as searchFilesRun,\n} from \"./search-files.js\";\nimport { tool as shellTool, run as shellRun } from \"./shell.js\";\n\n/**\n * Wraps a core CLI script (that writes to console.log) as a ActionEntry\n * by capturing stdout.\n */\nfunction wrapCliScript(\n tool: ActionTool,\n cliDefault: (args: string[]) => Promise<void>,\n opts?: { readOnly?: boolean },\n): ActionEntry {\n return {\n tool,\n ...(opts?.readOnly ? { readOnly: true as const } : {}),\n run: async (args: Record<string, string>): Promise<string> => {\n const cliArgs: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const raw = v as unknown;\n const value =\n raw != null && typeof raw === \"object\"\n ? JSON.stringify(raw)\n : String(raw);\n cliArgs.push(`--${k}`, value);\n }\n\n // Capture console.log output\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...a: unknown[]) => {\n logs.push(a.map(String).join(\" \"));\n };\n\n try {\n await cliDefault(cliArgs);\n } catch (err: any) {\n logs.push(`Error: ${err?.message ?? String(err)}`);\n } finally {\n console.log = origLog;\n }\n\n return logs.join(\"\\n\") || \"(no output)\";\n },\n };\n}\n\n/**\n * Creates the dev-mode script registry with shared bash/read/edit/write\n * coding tools and database tools. Call this and merge with your app's registry\n * when NODE_ENV !== \"production\".\n */\nexport async function createDevScriptRegistry(\n options: { legacyAliases?: boolean; databaseTools?: boolean } = {},\n): Promise<Record<string, ActionEntry>> {\n // Lazy-import DB scripts to avoid requiring libsql in non-DB apps\n let dbEntries: Record<string, ActionEntry> = {};\n if (options.databaseTools !== false) {\n try {\n // Dynamic imports — these are part of @agent-native/core\n const [dbSchema, dbQuery, dbExec, dbPatch, dbCheckScoping] =\n await Promise.all([\n import(\"../db/schema.js\"),\n import(\"../db/query.js\"),\n import(\"../db/exec.js\"),\n import(\"../db/patch.js\"),\n import(\"../db/check-scoping.js\"),\n ]);\n\n dbEntries = {\n \"db-schema\": wrapCliScript(\n {\n description:\n \"Show all database tables, columns, types, and foreign keys\",\n parameters: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n },\n },\n dbSchema.default,\n { readOnly: true },\n ),\n \"db-query\": wrapCliScript(\n {\n description:\n \"Run a read-only SQL query (SELECT, WITH, EXPLAIN, PRAGMA) against the app database\",\n parameters: {\n type: \"object\",\n properties: {\n sql: {\n type: \"string\",\n description: \"The SQL SELECT query to execute\",\n },\n args: {\n type: \"string\",\n description:\n 'Optional JSON array of positional bind args for parameterized placeholders. Example: \\'[\"draft\",\"form-123\"]\\'',\n },\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"table\" (default: table)',\n enum: [\"json\", \"table\"],\n },\n },\n required: [\"sql\"],\n },\n },\n dbQuery.default,\n { readOnly: true },\n ),\n \"db-exec\": wrapCliScript(\n {\n description:\n \"Execute app-database write SQL (INSERT, UPDATE, DELETE, REPLACE). For multiple related writes, pass `statements` so they run sequentially in one transaction instead of issuing several db-exec calls. Schema changes (CREATE/ALTER/DROP) are blocked. Never use this to backfill missing data for a read/analysis request or to create/modify users, members, roles, permissions, admin flags, or ownership; use a dedicated app action or reviewed code.\",\n parameters: dbExecToolParameters(),\n },\n dbExec.default,\n ),\n \"db-patch\": wrapCliScript(\n {\n description:\n \"Surgical search-and-replace on a text column in a SQL table. Prefer over `db-exec UPDATE` for large text fields (documents, slides, dashboards, JSON blobs) where you only need to change a small slice — avoids re-sending the full column value. Targets exactly one row at a time (narrow --where by primary key). If a template-specific action exists for the table (e.g. `edit-document`, `update-slide`), use that instead — it will also push live updates to open collaborative editors.\",\n parameters: {\n type: \"object\",\n properties: {\n table: {\n type: \"string\",\n description:\n \"Target table name (plain identifier, no quoting)\",\n },\n column: {\n type: \"string\",\n description:\n \"Target text column name (plain identifier, no quoting)\",\n },\n where: {\n type: \"string\",\n description:\n \"SQL WHERE clause that matches exactly one row, e.g. \\\"id = 'abc123'\\\". Must not contain semicolons or DDL keywords.\",\n },\n find: {\n type: \"string\",\n description:\n \"Text to find (single-edit mode). Pair with --replace.\",\n },\n replace: {\n type: \"string\",\n description:\n 'Replacement text (single-edit mode). Defaults to \"\" (delete the match).',\n },\n edits: {\n type: \"string\",\n description:\n 'Batch mode: JSON array of {find, replace} objects. Example: \\'[{\"find\":\"Q3\",\"replace\":\"Q4\"},{\"find\":\"$1M\",\"replace\":\"$1.2M\"}]\\'',\n },\n all: {\n type: \"string\",\n description:\n 'Set to \"true\" to replace every occurrence of each find (default: first occurrence only).',\n enum: [\"true\", \"false\"],\n },\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n required: [\"table\", \"column\", \"where\"],\n },\n },\n dbPatch.default,\n ),\n \"db-check-scoping\": wrapCliScript(\n {\n description:\n \"Validate that all template tables have owner_email and org_id columns for data scoping\",\n parameters: {\n type: \"object\",\n properties: {\n \"require-org\": {\n type: \"string\",\n description:\n 'Set to \"true\" to also require org_id columns (for multi-org apps)',\n enum: [\"true\", \"false\"],\n },\n format: {\n type: \"string\",\n description:\n 'Output format: \"json\" or \"text\" (default: text)',\n enum: [\"json\", \"text\"],\n },\n },\n },\n },\n dbCheckScoping.default,\n { readOnly: true },\n ),\n };\n } catch {\n // DB scripts not available (no libsql) — skip silently\n }\n }\n\n const codingEntries = createCodingToolRegistry({\n cwd: process.cwd(),\n bashThrowsOnNonZero: true,\n });\n const legacyEntries: Record<string, ActionEntry> = options.legacyAliases\n ? {\n \"read-file\": { tool: readFileTool, run: readFileRun, readOnly: true },\n \"write-file\": { tool: writeFileTool, run: writeFileRun },\n \"list-files\": {\n tool: listFilesTool,\n run: listFilesRun,\n readOnly: true,\n },\n \"search-files\": {\n tool: searchFilesTool,\n run: searchFilesRun,\n readOnly: true,\n },\n shell: { tool: shellTool, run: shellRun },\n }\n : {};\n\n return {\n ...codingEntries,\n ...legacyEntries,\n ...dbEntries,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../../src/scripts/parse-args.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../../src/scripts/parse-args.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACnB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,IAA4B;IAE5B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/**\n * Pure script utilities — no Node.js dependencies.\n * Safe to import from browser bundles and Vite SSR.\n */\n\n/**\n * Parse CLI args in --key value format.\n * Supports: --key value, --key=value, --flag (boolean true)\n */\nexport function parseArgs(args: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg.startsWith(\"--\")) continue;\n\n const eqIndex = arg.indexOf(\"=\");\n if (eqIndex !== -1) {\n const key = arg.slice(2, eqIndex);\n result[key] = arg.slice(eqIndex + 1);\n } else {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) {\n result[key] = next;\n i++;\n } else {\n result[key] = \"true\";\n }\n }\n }\n return result;\n}\n\n/**\n * Convert kebab-case keys to camelCase.\n */\nexport function camelCaseArgs(\n args: Record<string, string>,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(args)) {\n const camel = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n result[camel] = value;\n }\n return result;\n}\n"]}
|
package/dist/scripts/runner.js
CHANGED
|
@@ -131,7 +131,7 @@ function parseActionArgs(args, options = {}) {
|
|
|
131
131
|
else {
|
|
132
132
|
const key = arg.slice(2);
|
|
133
133
|
const next = args[i + 1];
|
|
134
|
-
if (next && !next.startsWith("--")) {
|
|
134
|
+
if (next !== undefined && !next.startsWith("--")) {
|
|
135
135
|
setParsedArg(parsed, key, coerceCliValue(next, coerceBooleans));
|
|
136
136
|
i++;
|
|
137
137
|
}
|