@flanksource/clicky-ui 0.3.5 → 0.3.7
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/README.md +42 -0
- package/dist/ai.cjs +15 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +15 -0
- package/dist/ai.js.map +1 -1
- package/dist/components/DateField.d.ts +1 -1
- package/dist/components/DatePicker.d.ts +1 -1
- package/dist/components/DateTimePicker.d.ts +1 -1
- package/dist/components/FormLookupProvider.cjs +12 -0
- package/dist/components/FormLookupProvider.cjs.map +1 -0
- package/dist/components/FormLookupProvider.d.ts +7 -0
- package/dist/components/FormLookupProvider.d.ts.map +1 -0
- package/dist/components/FormLookupProvider.js +12 -0
- package/dist/components/FormLookupProvider.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +2 -2
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.js +1 -1
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/ListMenu.cjs +145 -0
- package/dist/components/ListMenu.cjs.map +1 -0
- package/dist/components/ListMenu.d.ts +54 -0
- package/dist/components/ListMenu.d.ts.map +1 -0
- package/dist/components/ListMenu.js +145 -0
- package/dist/components/ListMenu.js.map +1 -0
- package/dist/components/MdxEditorField.cjs +128 -0
- package/dist/components/MdxEditorField.cjs.map +1 -0
- package/dist/components/MdxEditorField.d.ts +4 -0
- package/dist/components/MdxEditorField.d.ts.map +1 -0
- package/dist/components/MdxEditorField.js +106 -0
- package/dist/components/MdxEditorField.js.map +1 -0
- package/dist/components/MdxEditorToolbar.cjs +76 -0
- package/dist/components/MdxEditorToolbar.cjs.map +1 -0
- package/dist/components/MdxEditorToolbar.d.ts +8 -0
- package/dist/components/MdxEditorToolbar.d.ts.map +1 -0
- package/dist/components/MdxEditorToolbar.js +76 -0
- package/dist/components/MdxEditorToolbar.js.map +1 -0
- package/dist/components/button-variants.d.ts +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/form-lookup-context.cjs +1 -8
- package/dist/components/form-lookup-context.cjs.map +1 -1
- package/dist/components/form-lookup-context.d.ts +1 -5
- package/dist/components/form-lookup-context.d.ts.map +1 -1
- package/dist/components/form-lookup-context.js +1 -8
- package/dist/components/form-lookup-context.js.map +1 -1
- package/dist/components/jotai-bindings-core.cjs +197 -0
- package/dist/components/jotai-bindings-core.cjs.map +1 -0
- package/dist/components/jotai-bindings-core.d.ts +45 -0
- package/dist/components/jotai-bindings-core.d.ts.map +1 -0
- package/dist/components/jotai-bindings-core.js +197 -0
- package/dist/components/jotai-bindings-core.js.map +1 -0
- package/dist/components/jotai-bindings.cjs +17 -0
- package/dist/components/jotai-bindings.cjs.map +1 -0
- package/dist/components/jotai-bindings.d.ts +4 -0
- package/dist/components/jotai-bindings.d.ts.map +1 -0
- package/dist/components/jotai-bindings.js +17 -0
- package/dist/components/jotai-bindings.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +37 -0
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +6 -0
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +38 -1
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +3 -1
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +4 -2
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +9 -0
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +9 -0
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +4 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/mdx-editor-field-plugins.cjs +124 -0
- package/dist/components/mdx-editor-field-plugins.cjs.map +1 -0
- package/dist/components/mdx-editor-field-plugins.d.ts +6 -0
- package/dist/components/mdx-editor-field-plugins.d.ts.map +1 -0
- package/dist/components/mdx-editor-field-plugins.js +124 -0
- package/dist/components/mdx-editor-field-plugins.js.map +1 -0
- package/dist/components/mdx-editor-options.d.ts +77 -0
- package/dist/components/mdx-editor-options.d.ts.map +1 -0
- package/dist/components/use-list-menu-selection.cjs +77 -0
- package/dist/components/use-list-menu-selection.cjs.map +1 -0
- package/dist/components/use-list-menu-selection.d.ts +40 -0
- package/dist/components/use-list-menu-selection.d.ts.map +1 -0
- package/dist/components/use-list-menu-selection.js +77 -0
- package/dist/components/use-list-menu-selection.js.map +1 -0
- package/dist/components.cjs +10 -1
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +4 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +10 -1
- package/dist/components.js.map +1 -1
- package/dist/data/MarkdownEditor.model.d.ts +1 -1
- package/dist/data/ProgressBars.cjs +194 -0
- package/dist/data/ProgressBars.cjs.map +1 -0
- package/dist/data/ProgressBars.d.ts +85 -0
- package/dist/data/ProgressBars.d.ts.map +1 -0
- package/dist/data/ProgressBars.js +194 -0
- package/dist/data/ProgressBars.js.map +1 -0
- package/dist/data/ProgressBars.model.cjs +27 -0
- package/dist/data/ProgressBars.model.cjs.map +1 -0
- package/dist/data/ProgressBars.model.d.ts +20 -0
- package/dist/data/ProgressBars.model.d.ts.map +1 -0
- package/dist/data/ProgressBars.model.js +27 -0
- package/dist/data/ProgressBars.model.js.map +1 -0
- package/dist/data/PromptBanner.cjs +199 -0
- package/dist/data/PromptBanner.cjs.map +1 -0
- package/dist/data/PromptBanner.d.ts +17 -0
- package/dist/data/PromptBanner.d.ts.map +1 -0
- package/dist/data/PromptBanner.js +199 -0
- package/dist/data/PromptBanner.js.map +1 -0
- package/dist/data/PromptBanner.model.cjs +132 -0
- package/dist/data/PromptBanner.model.cjs.map +1 -0
- package/dist/data/PromptBanner.model.d.ts +23 -0
- package/dist/data/PromptBanner.model.d.ts.map +1 -0
- package/dist/data/PromptBanner.model.js +132 -0
- package/dist/data/PromptBanner.model.js.map +1 -0
- package/dist/data/PromptDialog.cjs +43 -0
- package/dist/data/PromptDialog.cjs.map +1 -0
- package/dist/data/PromptDialog.d.ts +14 -0
- package/dist/data/PromptDialog.d.ts.map +1 -0
- package/dist/data/PromptDialog.js +43 -0
- package/dist/data/PromptDialog.js.map +1 -0
- package/dist/data/TaskManager.cjs +8 -1
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +8 -1
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskProgress.cjs +15 -2
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +0 -10
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +15 -2
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.cjs +19 -173
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts +9 -26
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +20 -174
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/WorkloadCard.model.cjs.map +1 -1
- package/dist/data/WorkloadCard.model.d.ts +2 -2
- package/dist/data/WorkloadCard.model.d.ts.map +1 -1
- package/dist/data/WorkloadCard.model.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +53 -9
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +53 -9
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/SessionViewer.cjs +275 -0
- package/dist/data/ai/SessionViewer.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.d.ts +33 -0
- package/dist/data/ai/SessionViewer.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts +4 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.js +275 -0
- package/dist/data/ai/SessionViewer.js.map +1 -0
- package/dist/data/ai/SessionViewer.model.cjs +275 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.model.d.ts +87 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.model.js +275 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -0
- package/dist/data/ai/SessionViewerMenu.cjs +190 -0
- package/dist/data/ai/SessionViewerMenu.cjs.map +1 -0
- package/dist/data/ai/SessionViewerMenu.d.ts +24 -0
- package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -0
- package/dist/data/ai/SessionViewerMenu.js +190 -0
- package/dist/data/ai/SessionViewerMenu.js.map +1 -0
- package/dist/data/ai/ToolPreferences.cjs +232 -39
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +4 -7
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +234 -41
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/index.d.ts +3 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/session-categories.cjs +219 -0
- package/dist/data/ai/session-categories.cjs.map +1 -0
- package/dist/data/ai/session-categories.d.ts +36 -0
- package/dist/data/ai/session-categories.d.ts.map +1 -0
- package/dist/data/ai/session-categories.js +219 -0
- package/dist/data/ai/session-categories.js.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.cjs +89 -3
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.d.ts +1 -1
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.js +89 -3
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +7 -1
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/task-status.cjs +19 -12
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.d.ts +2 -1
- package/dist/data/task-status.d.ts.map +1 -1
- package/dist/data/task-status.js +19 -12
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/test-runner/TestRunner.fixtures.d.ts +11 -4
- package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.cjs.map +1 -1
- package/dist/data/version-info.js +3 -3
- package/dist/data/version-info.js.map +1 -1
- package/dist/data.cjs +11 -2
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +11 -2
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-prompts.cjs +83 -0
- package/dist/hooks/use-prompts.cjs.map +1 -0
- package/dist/hooks/use-prompts.d.ts +43 -0
- package/dist/hooks/use-prompts.d.ts.map +1 -0
- package/dist/hooks/use-prompts.js +83 -0
- package/dist/hooks/use-prompts.js.map +1 -0
- package/dist/hooks.cjs +3 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +3 -0
- package/dist/hooks.js.map +1 -1
- package/dist/index.cjs +21 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/jotai.cjs +9 -0
- package/dist/jotai.cjs.map +1 -0
- package/dist/jotai.d.ts +4 -0
- package/dist/jotai.d.ts.map +1 -0
- package/dist/jotai.js +9 -0
- package/dist/jotai.js.map +1 -0
- package/dist/lib/utils.cjs +18 -1
- package/dist/lib/utils.cjs.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +18 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/mdx-editor.cjs +5 -0
- package/dist/mdx-editor.cjs.map +1 -0
- package/dist/mdx-editor.css +2 -0
- package/dist/mdx-editor.d.ts +2 -0
- package/dist/mdx-editor.d.ts.map +1 -0
- package/dist/mdx-editor.js +5 -0
- package/dist/mdx-editor.js.map +1 -0
- package/dist/rpc/apiClient.cjs +1 -1
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.js +1 -1
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/surfaceIconMap.cjs +12 -1
- package/dist/rpc/surfaceIconMap.cjs.map +1 -1
- package/dist/rpc/surfaceIconMap.d.ts.map +1 -1
- package/dist/rpc/surfaceIconMap.js +12 -1
- package/dist/rpc/surfaceIconMap.js.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/oxlint-plugins/README.md +148 -0
- package/oxlint-plugins/clicky-ui-no-adhoc-overlay.js +88 -0
- package/oxlint-plugins/clicky-ui-prefer-components.js +46 -0
- package/oxlint-plugins/clicky-ui-prefer-icons.js +121 -0
- package/oxlint-plugins/clicky-ui-prefer-tailwind.js +98 -0
- package/oxlint-plugins/clicky-ui-prefer-theme.js +134 -0
- package/oxlint-plugins/clicky-ui-shared.js +132 -0
- package/oxlint-plugins/clicky-ui.js +34 -0
- package/oxlint-plugins/no-iconify-names.js +37 -0
- package/package.json +21 -1
- package/dist/data/TimeseriesCoreBars.model.cjs +0 -27
- package/dist/data/TimeseriesCoreBars.model.cjs.map +0 -1
- package/dist/data/TimeseriesCoreBars.model.d.ts +0 -20
- package/dist/data/TimeseriesCoreBars.model.d.ts.map +0 -1
- package/dist/data/TimeseriesCoreBars.model.js +0 -27
- package/dist/data/TimeseriesCoreBars.model.js.map +0 -1
|
@@ -4,77 +4,270 @@ const jsxRuntime = require("react/jsx-runtime");
|
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const utils = require("../../lib/utils.cjs");
|
|
6
6
|
const DropdownMenu = require("../../overlay/DropdownMenu.cjs");
|
|
7
|
+
const HoverCard = require("../../overlay/HoverCard.cjs");
|
|
8
|
+
const Modal = require("../../overlay/Modal.cjs");
|
|
7
9
|
const button = require("../../components/button.cjs");
|
|
8
10
|
const Icon = require("../Icon.cjs");
|
|
9
11
|
const UiSliders = require("../../icons/components/UiSliders.cjs");
|
|
12
|
+
const UiInfo = require("../../icons/components/UiInfo.cjs");
|
|
10
13
|
const MODE_CYCLE = ["enabled", "ask", "disabled"];
|
|
11
|
-
const MODE_LABEL = {
|
|
14
|
+
const MODE_LABEL = {
|
|
15
|
+
enabled: "Auto",
|
|
16
|
+
ask: "Ask",
|
|
17
|
+
disabled: "Off"
|
|
18
|
+
};
|
|
12
19
|
function ToolRow({
|
|
13
|
-
|
|
20
|
+
entry,
|
|
14
21
|
mode,
|
|
15
22
|
onToggle
|
|
16
23
|
}) {
|
|
24
|
+
var _a;
|
|
25
|
+
const title = entry.tools.length > 1 ? `${entry.tools.length} tools` : (_a = entry.tools[0]) == null ? void 0 : _a.description;
|
|
17
26
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18
27
|
"button",
|
|
19
28
|
{
|
|
20
29
|
type: "button",
|
|
21
30
|
className: "flex w-full items-center justify-between rounded px-2 py-1 text-left hover:bg-accent",
|
|
22
|
-
|
|
31
|
+
title,
|
|
32
|
+
onClick: () => onToggle(entry.key, mode),
|
|
23
33
|
children: [
|
|
24
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn("text-xs", mode === "disabled" && "text-muted-foreground line-through"), children: meta.label }),
|
|
25
34
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
26
35
|
"span",
|
|
27
36
|
{
|
|
28
37
|
className: utils.cn(
|
|
29
|
-
"
|
|
30
|
-
mode === "
|
|
31
|
-
mode === "ask" && "bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300",
|
|
32
|
-
mode === "disabled" && "bg-muted text-muted-foreground"
|
|
38
|
+
"text-xs",
|
|
39
|
+
mode === "disabled" && "text-muted-foreground line-through"
|
|
33
40
|
),
|
|
34
|
-
children:
|
|
41
|
+
children: entry.label
|
|
35
42
|
}
|
|
36
|
-
)
|
|
43
|
+
),
|
|
44
|
+
/* @__PURE__ */ jsxRuntime.jsx(ModeBadge, { mode })
|
|
37
45
|
]
|
|
38
46
|
}
|
|
39
47
|
);
|
|
40
48
|
}
|
|
41
|
-
function
|
|
49
|
+
function AdvancedToolRow({
|
|
50
|
+
tool,
|
|
51
|
+
mode,
|
|
52
|
+
onToggle
|
|
53
|
+
}) {
|
|
54
|
+
var _a;
|
|
55
|
+
const description = ((_a = tool.description) == null ? void 0 : _a.trim()) || "No description";
|
|
56
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
57
|
+
"button",
|
|
58
|
+
{
|
|
59
|
+
type: "button",
|
|
60
|
+
className: "grid h-9 w-full grid-cols-[minmax(0,1fr)_4rem] items-center gap-3 border-b border-border px-2 text-left hover:bg-accent",
|
|
61
|
+
title: description,
|
|
62
|
+
onClick: () => onToggle(tool.name, mode),
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
66
|
+
"span",
|
|
67
|
+
{
|
|
68
|
+
className: utils.cn(
|
|
69
|
+
"min-w-0 truncate font-mono text-xs",
|
|
70
|
+
mode === "disabled" && "text-muted-foreground line-through"
|
|
71
|
+
),
|
|
72
|
+
children: tool.name
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
76
|
+
HoverCard.HoverCard,
|
|
77
|
+
{
|
|
78
|
+
placement: "top",
|
|
79
|
+
delay: 120,
|
|
80
|
+
trigger: /* @__PURE__ */ jsxRuntime.jsx(
|
|
81
|
+
"span",
|
|
82
|
+
{
|
|
83
|
+
"aria-label": `Description for ${tool.name}`,
|
|
84
|
+
className: "inline-flex shrink-0 text-muted-foreground",
|
|
85
|
+
title: description,
|
|
86
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiInfo.UiInfo, className: "size-3.5" })
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
cardClassName: "max-w-xs whitespace-normal",
|
|
90
|
+
children: description
|
|
91
|
+
}
|
|
92
|
+
)
|
|
93
|
+
] }),
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "justify-self-end", children: /* @__PURE__ */ jsxRuntime.jsx(ModeBadge, { mode }) })
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
function ModeBadge({ mode }) {
|
|
100
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
101
|
+
"span",
|
|
102
|
+
{
|
|
103
|
+
className: utils.cn(
|
|
104
|
+
"rounded px-1.5 py-0.5 text-[10px] font-medium",
|
|
105
|
+
mode === "enabled" && "bg-emerald-100 text-emerald-700 dark:bg-emerald-900 dark:text-emerald-300",
|
|
106
|
+
mode === "ask" && "bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300",
|
|
107
|
+
mode === "disabled" && "bg-muted text-muted-foreground"
|
|
108
|
+
),
|
|
109
|
+
children: MODE_LABEL[mode]
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
function ToolPreferences({
|
|
114
|
+
tools,
|
|
115
|
+
value,
|
|
116
|
+
onChange,
|
|
117
|
+
className = ""
|
|
118
|
+
}) {
|
|
119
|
+
const [advancedOpen, setAdvancedOpen] = react.useState(false);
|
|
42
120
|
const groups = react.useMemo(() => {
|
|
43
|
-
|
|
121
|
+
const maps = {};
|
|
122
|
+
for (const meta of tools) {
|
|
123
|
+
const group = toolGroup(meta);
|
|
124
|
+
const key = toolPreferenceKey(meta);
|
|
125
|
+
const map = maps[group] ?? (maps[group] = /* @__PURE__ */ new Map());
|
|
126
|
+
let entry = map.get(key);
|
|
127
|
+
if (!entry) {
|
|
128
|
+
entry = {
|
|
129
|
+
key,
|
|
130
|
+
label: key === meta.name ? meta.label : key,
|
|
131
|
+
group,
|
|
132
|
+
tools: [],
|
|
133
|
+
defaultMode: toolDefaultMode(meta)
|
|
134
|
+
};
|
|
135
|
+
map.set(key, entry);
|
|
136
|
+
}
|
|
137
|
+
entry.tools.push(meta);
|
|
138
|
+
entry.defaultMode = mostRestrictiveMode(
|
|
139
|
+
entry.defaultMode,
|
|
140
|
+
toolDefaultMode(meta)
|
|
141
|
+
);
|
|
142
|
+
}
|
|
44
143
|
const g = {};
|
|
45
|
-
for (const
|
|
144
|
+
for (const [group, map] of Object.entries(maps)) {
|
|
145
|
+
g[group] = [...map.values()].sort((a, b) => a.label.localeCompare(b.label));
|
|
146
|
+
}
|
|
46
147
|
return g;
|
|
47
148
|
}, [tools]);
|
|
48
|
-
const
|
|
49
|
-
|
|
149
|
+
const advancedGroups = react.useMemo(
|
|
150
|
+
() => groupedToolMetas(tools),
|
|
151
|
+
[tools]
|
|
152
|
+
);
|
|
153
|
+
const handleToggle = (name, current) => {
|
|
50
154
|
const next = MODE_CYCLE[(MODE_CYCLE.indexOf(current) + 1) % MODE_CYCLE.length];
|
|
51
155
|
onChange({ ...value, [name]: next });
|
|
52
156
|
};
|
|
53
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
157
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
158
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
159
|
+
DropdownMenu.DropdownMenu,
|
|
160
|
+
{
|
|
161
|
+
align: "right",
|
|
162
|
+
className,
|
|
163
|
+
menuClassName: "w-64 max-h-[400px] overflow-y-auto p-3",
|
|
164
|
+
trigger: /* @__PURE__ */ jsxRuntime.jsx(
|
|
165
|
+
button.Button,
|
|
166
|
+
{
|
|
167
|
+
variant: "ghost",
|
|
168
|
+
size: "icon",
|
|
169
|
+
title: "Tool preferences",
|
|
170
|
+
"data-testid": "tool-preferences-btn",
|
|
171
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiSliders.UiSliders, className: "size-4" })
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
children: (closeMenu) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
175
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-2 text-xs font-semibold", children: "Tool Preferences" }),
|
|
176
|
+
Object.entries(groups).sort(([a], [b]) => a.localeCompare(b)).map(([group, metas]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2", children: [
|
|
177
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-0.5 px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: group }),
|
|
178
|
+
metas.map((entry) => {
|
|
179
|
+
const mode = value[entry.key] ?? entry.defaultMode;
|
|
180
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
181
|
+
ToolRow,
|
|
182
|
+
{
|
|
183
|
+
entry,
|
|
184
|
+
mode,
|
|
185
|
+
onToggle: handleToggle
|
|
186
|
+
},
|
|
187
|
+
entry.key
|
|
188
|
+
);
|
|
189
|
+
})
|
|
190
|
+
] }, group)),
|
|
191
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 border-t border-border pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
192
|
+
"button",
|
|
67
193
|
{
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
194
|
+
type: "button",
|
|
195
|
+
className: "w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent",
|
|
196
|
+
onClick: () => {
|
|
197
|
+
closeMenu();
|
|
198
|
+
setAdvancedOpen(true);
|
|
199
|
+
},
|
|
200
|
+
children: "Advanced"
|
|
201
|
+
}
|
|
202
|
+
) })
|
|
203
|
+
] })
|
|
204
|
+
}
|
|
205
|
+
),
|
|
206
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
207
|
+
Modal.Modal,
|
|
208
|
+
{
|
|
209
|
+
open: advancedOpen,
|
|
210
|
+
onClose: () => setAdvancedOpen(false),
|
|
211
|
+
title: "Advanced Tool Preferences",
|
|
212
|
+
size: "xl",
|
|
213
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "overflow-hidden rounded border border-border", children: [
|
|
214
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[minmax(0,1fr)_4rem] gap-3 border-b border-border bg-muted/40 px-2 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: [
|
|
215
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Name" }),
|
|
216
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-right", children: "Mode" })
|
|
217
|
+
] }),
|
|
218
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-[60vh] overflow-y-auto", children: advancedGroups.length > 0 ? advancedGroups.map(([group, groupTools]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "sticky top-0 z-[1] border-b border-border bg-muted/60 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: group }),
|
|
220
|
+
groupTools.map((tool) => {
|
|
221
|
+
const mode = toolMode(tool, value);
|
|
222
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
223
|
+
AdvancedToolRow,
|
|
224
|
+
{
|
|
225
|
+
tool,
|
|
226
|
+
mode,
|
|
227
|
+
onToggle: handleToggle
|
|
228
|
+
},
|
|
229
|
+
tool.name
|
|
230
|
+
);
|
|
231
|
+
})
|
|
232
|
+
] }, group)) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-6 text-center text-xs text-muted-foreground", children: "No tools" }) })
|
|
233
|
+
] })
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
] });
|
|
237
|
+
}
|
|
238
|
+
function toolGroup(meta) {
|
|
239
|
+
return meta.group ?? "Tools";
|
|
240
|
+
}
|
|
241
|
+
function groupedToolMetas(tools) {
|
|
242
|
+
var _a;
|
|
243
|
+
const groups = {};
|
|
244
|
+
for (const tool of tools) {
|
|
245
|
+
(groups[_a = toolGroup(tool)] ?? (groups[_a] = [])).push(tool);
|
|
246
|
+
}
|
|
247
|
+
return Object.entries(groups).map(([group, groupTools]) => [
|
|
248
|
+
group,
|
|
249
|
+
[...groupTools].sort((a, b) => a.name.localeCompare(b.name))
|
|
250
|
+
]).sort(([a], [b]) => a.localeCompare(b));
|
|
251
|
+
}
|
|
252
|
+
function toolPreferenceKey(meta) {
|
|
253
|
+
return meta.preferenceKey ?? meta.name;
|
|
254
|
+
}
|
|
255
|
+
function toolDefaultMode(meta) {
|
|
256
|
+
return meta.defaultMode ?? "enabled";
|
|
257
|
+
}
|
|
258
|
+
function toolMode(meta, value) {
|
|
259
|
+
const own = value[meta.name];
|
|
260
|
+
if (own) return own;
|
|
261
|
+
const key = toolPreferenceKey(meta);
|
|
262
|
+
if (key !== meta.name) {
|
|
263
|
+
const grouped = value[key];
|
|
264
|
+
if (grouped) return grouped;
|
|
265
|
+
}
|
|
266
|
+
return toolDefaultMode(meta);
|
|
267
|
+
}
|
|
268
|
+
function mostRestrictiveMode(a, b) {
|
|
269
|
+
const rank = { enabled: 0, ask: 1, disabled: 2 };
|
|
270
|
+
return rank[a] >= rank[b] ? a : b;
|
|
78
271
|
}
|
|
79
272
|
exports.ToolPreferences = ToolPreferences;
|
|
80
273
|
//# sourceMappingURL=ToolPreferences.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.cjs","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiSliders } from \"../../icons\";\nimport type { ToolMeta } from \"../chat/types\";\n\nexport type { ToolMeta };\n\n/** How a tool may be invoked: run automatically, pause for approval, or be\n * hidden from the model entirely. */\nexport type ToolMode = \"enabled\" | \"ask\" | \"disabled\";\n\nconst MODE_CYCLE: ToolMode[] = [\"enabled\", \"ask\", \"disabled\"];\nconst MODE_LABEL: Record<ToolMode, string> = { enabled: \"Auto\", ask: \"Ask\", disabled: \"Off\" };\n\nexport type ToolPreferencesProps = {\n /** The tools to list. Replaces ai-financials' global registry — callers pass\n * whatever their backend exposes. */\n tools: ToolMeta[];\n /** Current per-tool mode. Missing entries default to \"enabled\". */\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n className?: string;\n};\n\nfunction ToolRow({\n meta,\n mode,\n onToggle,\n}: {\n meta: ToolMeta;\n mode: ToolMode;\n onToggle: (name: string) => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between rounded px-2 py-1 text-left hover:bg-accent\"\n onClick={() => onToggle(meta.name)}\n >\n <span className={cn(\"text-xs\", mode === \"disabled\" && \"text-muted-foreground line-through\")}>\n {meta.label}\n </span>\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"enabled\" &&\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900 dark:text-emerald-300\",\n mode === \"ask\" && \"bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300\",\n mode === \"disabled\" && \"bg-muted text-muted-foreground\",\n )}\n >\n {MODE_LABEL[mode]}\n </span>\n </button>\n );\n}\n\n/** A popover that cycles each tool through Auto → Ask → Off. The resulting\n * `Record<name, ToolMode>` is meant to be forwarded to the backend (e.g. via\n * `<Chat body={{ toolPreferences }}>`). */\nexport function ToolPreferences({ tools, value, onChange, className = \"\" }: ToolPreferencesProps) {\n const groups = useMemo(() => {\n const g: Record<string, ToolMeta[]> = {};\n for (const meta of tools) (g[meta.group ?? \"Tools\"] ??= []).push(meta);\n return g;\n }, [tools]);\n\n const handleToggle = (name: string) => {\n const current = value[name] ?? \"enabled\";\n const next = MODE_CYCLE[(MODE_CYCLE.indexOf(current) + 1) % MODE_CYCLE.length]!;\n onChange({ ...value, [name]: next });\n };\n\n return (\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-64 max-h-[400px] overflow-y-auto p-3\"\n trigger={\n <Button variant=\"ghost\" size=\"icon\" title=\"Tool preferences\" data-testid=\"tool-preferences-btn\">\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {() => (\n <div>\n <div className=\"mb-2 text-xs font-semibold\">Tool Preferences</div>\n <p className=\"mb-2 text-[10px] text-muted-foreground\">Click to cycle: Auto → Ask → Off</p>\n {Object.entries(groups).map(([group, metas]) => (\n <div key={group} className=\"mb-2\">\n <div className=\"mb-0.5 px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </div>\n {metas.map((meta) => (\n <ToolRow\n key={meta.name}\n meta={meta}\n mode={value[meta.name] ?? \"enabled\"}\n onToggle={handleToggle}\n />\n ))}\n </div>\n ))}\n </div>\n )}\n </DropdownMenu>\n );\n}\n"],"names":["jsxs","jsx","cn","useMemo","DropdownMenu","Button","Icon","UiSliders"],"mappings":";;;;;;;;;AAcA,MAAM,aAAyB,CAAC,WAAW,OAAO,UAAU;AAC5D,MAAM,aAAuC,EAAE,SAAS,QAAQ,KAAK,OAAO,UAAU,MAAA;AAYtF,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,SAAS,MAAM,SAAS,KAAK,IAAI;AAAA,MAEjC,UAAA;AAAA,QAAAC,2BAAAA,IAAC,QAAA,EAAK,WAAWC,MAAAA,GAAG,WAAW,SAAS,cAAc,oCAAoC,GACvF,UAAA,KAAK,MAAA,CACR;AAAA,QACAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC,MAAAA;AAAAA,cACT;AAAA,cACA,SAAS,aACP;AAAA,cACF,SAAS,SAAS;AAAA,cAClB,SAAS,cAAc;AAAA,YAAA;AAAA,YAGxB,qBAAW,IAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MAClB;AAAA,IAAA;AAAA,EAAA;AAGN;AAKO,SAAS,gBAAgB,EAAE,OAAO,OAAO,UAAU,YAAY,MAA4B;AAChG,QAAM,SAASC,MAAAA,QAAQ,MAAM;;AAC3B,UAAM,IAAgC,CAAA;AACtC,eAAW,QAAQ,MAAO,EAAC,OAAE,KAAK,SAAS,aAAhB,QAA6B,KAAI,KAAK,IAAI;AACrE,WAAO;AAAA,EACT,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,eAAe,CAAC,SAAiB;AACrC,UAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,UAAM,OAAO,YAAY,WAAW,QAAQ,OAAO,IAAI,KAAK,WAAW,MAAM;AAC7E,aAAS,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM;AAAA,EACrC;AAEA,SACEF,2BAAAA;AAAAA,IAACG,aAAAA;AAAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,eAAc;AAAA,MACd,SACEH,2BAAAA,IAACI,OAAAA,QAAA,EAAO,SAAQ,SAAQ,MAAK,QAAO,OAAM,oBAAmB,eAAY,wBACvE,UAAAJ,+BAACK,KAAAA,MAAA,EAAK,MAAMC,UAAAA,WAAW,WAAU,UAAS,GAC5C;AAAA,MAGD,UAAA,sCACE,OAAA,EACC,UAAA;AAAA,QAAAN,2BAAAA,IAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,oBAAgB;AAAA,QAC5DA,2BAAAA,IAAC,KAAA,EAAE,WAAU,0CAAyC,UAAA,oCAAgC;AAAA,QACrF,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,MACxCD,2BAAAA,KAAC,OAAA,EAAgB,WAAU,QACzB,UAAA;AAAA,UAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,wFACZ,UAAA,OACH;AAAA,UACC,MAAM,IAAI,CAAC,SACVA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC;AAAA,cACA,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,cAC1B,UAAU;AAAA,YAAA;AAAA,YAHL,KAAK;AAAA,UAAA,CAKb;AAAA,QAAA,EAAA,GAXO,KAYV,CACD;AAAA,MAAA,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
|
|
1
|
+
{"version":3,"file":"ToolPreferences.cjs","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { HoverCard } from \"../../overlay/HoverCard\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiInfo, UiSliders } from \"../../icons\";\nimport type { ToolMeta, ToolMode } from \"../chat/types\";\n\nexport type { ToolMeta, ToolMode };\n\n/** How a tool may be invoked: run automatically, pause for approval, or be\n * hidden from the model entirely. */\nconst MODE_CYCLE: ToolMode[] = [\"enabled\", \"ask\", \"disabled\"];\nconst MODE_LABEL: Record<ToolMode, string> = {\n enabled: \"Auto\",\n ask: \"Ask\",\n disabled: \"Off\",\n};\n\ntype ToolPreferenceEntry = {\n key: string;\n label: string;\n group: string;\n tools: ToolMeta[];\n defaultMode: ToolMode;\n};\n\nexport type ToolPreferencesProps = {\n /** The tools to list. Replaces ai-financials' global registry — callers pass\n * whatever their backend exposes. */\n tools: ToolMeta[];\n /** Current per-tool mode. Missing entries default to \"enabled\". */\n value: Record<string, ToolMode>;\n onChange: (prefs: Record<string, ToolMode>) => void;\n className?: string;\n};\n\nfunction ToolRow({\n entry,\n mode,\n onToggle,\n}: {\n entry: ToolPreferenceEntry;\n mode: ToolMode;\n onToggle: (name: string, current: ToolMode) => void;\n}) {\n const title =\n entry.tools.length > 1\n ? `${entry.tools.length} tools`\n : entry.tools[0]?.description;\n return (\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between rounded px-2 py-1 text-left hover:bg-accent\"\n title={title}\n onClick={() => onToggle(entry.key, mode)}\n >\n <span\n className={cn(\n \"text-xs\",\n mode === \"disabled\" && \"text-muted-foreground line-through\",\n )}\n >\n {entry.label}\n </span>\n <ModeBadge mode={mode} />\n </button>\n );\n}\n\nfunction AdvancedToolRow({\n tool,\n mode,\n onToggle,\n}: {\n tool: ToolMeta;\n mode: ToolMode;\n onToggle: (name: string, current: ToolMode) => void;\n}) {\n const description = tool.description?.trim() || \"No description\";\n return (\n <button\n type=\"button\"\n className=\"grid h-9 w-full grid-cols-[minmax(0,1fr)_4rem] items-center gap-3 border-b border-border px-2 text-left hover:bg-accent\"\n title={description}\n onClick={() => onToggle(tool.name, mode)}\n >\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span\n className={cn(\n \"min-w-0 truncate font-mono text-xs\",\n mode === \"disabled\" && \"text-muted-foreground line-through\",\n )}\n >\n {tool.name}\n </span>\n <HoverCard\n placement=\"top\"\n delay={120}\n trigger={\n <span\n aria-label={`Description for ${tool.name}`}\n className=\"inline-flex shrink-0 text-muted-foreground\"\n title={description}\n >\n <Icon icon={UiInfo} className=\"size-3.5\" />\n </span>\n }\n cardClassName=\"max-w-xs whitespace-normal\"\n >\n {description}\n </HoverCard>\n </span>\n <span className=\"justify-self-end\">\n <ModeBadge mode={mode} />\n </span>\n </button>\n );\n}\n\nfunction ModeBadge({ mode }: { mode: ToolMode }) {\n return (\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"enabled\" &&\n \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900 dark:text-emerald-300\",\n mode === \"ask\" &&\n \"bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300\",\n mode === \"disabled\" && \"bg-muted text-muted-foreground\",\n )}\n >\n {MODE_LABEL[mode]}\n </span>\n );\n}\n\n/** A popover that cycles each tool/group through Auto → Ask → Off. The resulting\n * `Record<name, ToolMode>` is meant to be forwarded to the backend (e.g. via\n * `<Chat body={{ toolPreferences }}>`). */\nexport function ToolPreferences({\n tools,\n value,\n onChange,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const groups = useMemo(() => {\n const maps: Record<string, Map<string, ToolPreferenceEntry>> = {};\n for (const meta of tools) {\n const group = toolGroup(meta);\n const key = toolPreferenceKey(meta);\n const map = (maps[group] ??= new Map());\n let entry = map.get(key);\n if (!entry) {\n entry = {\n key,\n label: key === meta.name ? meta.label : key,\n group,\n tools: [],\n defaultMode: toolDefaultMode(meta),\n };\n map.set(key, entry);\n }\n entry.tools.push(meta);\n entry.defaultMode = mostRestrictiveMode(\n entry.defaultMode,\n toolDefaultMode(meta),\n );\n }\n const g: Record<string, ToolPreferenceEntry[]> = {};\n for (const [group, map] of Object.entries(maps)) {\n g[group] = [...map.values()].sort((a, b) => a.label.localeCompare(b.label));\n }\n return g;\n }, [tools]);\n\n const advancedGroups = useMemo(\n () => groupedToolMetas(tools),\n [tools],\n );\n\n const handleToggle = (name: string, current: ToolMode) => {\n const next =\n MODE_CYCLE[(MODE_CYCLE.indexOf(current) + 1) % MODE_CYCLE.length]!;\n onChange({ ...value, [name]: next });\n };\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-64 max-h-[400px] overflow-y-auto p-3\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-2 text-xs font-semibold\">Tool Preferences</div>\n {Object.entries(groups)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([group, metas]) => (\n <div key={group} className=\"mb-2\">\n <div className=\"mb-0.5 px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </div>\n {metas.map((entry) => {\n const mode = value[entry.key] ?? entry.defaultMode;\n return (\n <ToolRow\n key={entry.key}\n entry={entry}\n mode={mode}\n onToggle={handleToggle}\n />\n );\n })}\n </div>\n ))}\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Tool Preferences\"\n size=\"xl\"\n >\n <div className=\"overflow-hidden rounded border border-border\">\n <div className=\"grid grid-cols-[minmax(0,1fr)_4rem] gap-3 border-b border-border bg-muted/40 px-2 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n <span>Name</span>\n <span className=\"text-right\">Mode</span>\n </div>\n <div className=\"max-h-[60vh] overflow-y-auto\">\n {advancedGroups.length > 0 ? (\n advancedGroups.map(([group, groupTools]) => (\n <div key={group}>\n <div className=\"sticky top-0 z-[1] border-b border-border bg-muted/60 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </div>\n {groupTools.map((tool) => {\n const mode = toolMode(tool, value);\n return (\n <AdvancedToolRow\n key={tool.name}\n tool={tool}\n mode={mode}\n onToggle={handleToggle}\n />\n );\n })}\n </div>\n ))\n ) : (\n <div className=\"px-2 py-6 text-center text-xs text-muted-foreground\">\n No tools\n </div>\n )}\n </div>\n </div>\n </Modal>\n </>\n );\n}\n\nfunction toolGroup(meta: ToolMeta): string {\n return meta.group ?? \"Tools\";\n}\n\nfunction groupedToolMetas(tools: ToolMeta[]): Array<[string, ToolMeta[]]> {\n const groups: Record<string, ToolMeta[]> = {};\n for (const tool of tools) {\n (groups[toolGroup(tool)] ??= []).push(tool);\n }\n return Object.entries(groups)\n .map(([group, groupTools]) => [\n group,\n [...groupTools].sort((a, b) => a.name.localeCompare(b.name)),\n ] as [string, ToolMeta[]])\n .sort(([a], [b]) => a.localeCompare(b));\n}\n\nfunction toolPreferenceKey(meta: ToolMeta): string {\n return meta.preferenceKey ?? meta.name;\n}\n\nfunction toolDefaultMode(meta: ToolMeta): ToolMode {\n return meta.defaultMode ?? \"enabled\";\n}\n\nfunction toolMode(meta: ToolMeta, value: Record<string, ToolMode>): ToolMode {\n const own = value[meta.name];\n if (own) return own;\n const key = toolPreferenceKey(meta);\n if (key !== meta.name) {\n const grouped = value[key];\n if (grouped) return grouped;\n }\n return toolDefaultMode(meta);\n}\n\nfunction mostRestrictiveMode(a: ToolMode, b: ToolMode): ToolMode {\n const rank: Record<ToolMode, number> = { enabled: 0, ask: 1, disabled: 2 };\n return rank[a] >= rank[b] ? a : b;\n}\n"],"names":["jsxs","jsx","cn","HoverCard","Icon","UiInfo","useState","useMemo","Fragment","DropdownMenu","Button","UiSliders","Modal"],"mappings":"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"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import { ToolMeta } from '../chat/types';
|
|
2
|
-
export type { ToolMeta };
|
|
3
|
-
/** How a tool may be invoked: run automatically, pause for approval, or be
|
|
4
|
-
* hidden from the model entirely. */
|
|
5
|
-
export type ToolMode = "enabled" | "ask" | "disabled";
|
|
1
|
+
import { ToolMeta, ToolMode } from '../chat/types';
|
|
2
|
+
export type { ToolMeta, ToolMode };
|
|
6
3
|
export type ToolPreferencesProps = {
|
|
7
4
|
/** The tools to list. Replaces ai-financials' global registry — callers pass
|
|
8
5
|
* whatever their backend exposes. */
|
|
@@ -12,8 +9,8 @@ export type ToolPreferencesProps = {
|
|
|
12
9
|
onChange: (prefs: Record<string, ToolMode>) => void;
|
|
13
10
|
className?: string;
|
|
14
11
|
};
|
|
15
|
-
/** A popover that cycles each tool through Auto → Ask → Off. The resulting
|
|
12
|
+
/** A popover that cycles each tool/group through Auto → Ask → Off. The resulting
|
|
16
13
|
* `Record<name, ToolMode>` is meant to be forwarded to the backend (e.g. via
|
|
17
14
|
* `<Chat body={{ toolPreferences }}>`). */
|
|
18
|
-
export declare function ToolPreferences({ tools, value, onChange, className }: ToolPreferencesProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function ToolPreferences({ tools, value, onChange, className, }: ToolPreferencesProps): import("react/jsx-runtime").JSX.Element;
|
|
19
16
|
//# sourceMappingURL=ToolPreferences.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolPreferences.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ToolPreferences.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAExD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAmBnC,MAAM,MAAM,oBAAoB,GAAG;IACjC;0CACsC;IACtC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAsGF;;4CAE4C;AAC5C,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,SAAc,GACf,EAAE,oBAAoB,2CA2ItB"}
|