@flanksource/clicky-ui 0.3.29 → 0.3.30
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/ai.cjs +48 -3
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +46 -1
- 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/mdx-editor-callout-model.d.ts +1 -1
- package/dist/data/MarkdownEditor.model.d.ts +1 -1
- package/dist/data/ai/ChatWindow.catalogs.cjs +11 -5
- package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.catalogs.d.ts +2 -1
- package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.catalogs.js +11 -5
- package/dist/data/ai/ChatWindow.catalogs.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +1 -0
- 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 +1 -0
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/VariablesField.cjs +79 -0
- package/dist/data/ai/PromptRunEditor/VariablesField.cjs.map +1 -0
- package/dist/data/ai/PromptRunEditor/VariablesField.d.ts +8 -0
- package/dist/data/ai/PromptRunEditor/VariablesField.d.ts.map +1 -0
- package/dist/data/ai/PromptRunEditor/VariablesField.js +79 -0
- package/dist/data/ai/PromptRunEditor/VariablesField.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/index.cjs +61 -69
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +11 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +61 -69
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.d.ts +2 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +4 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +2 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs +2 -2
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +4 -3
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +2 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/index.d.ts +3 -2
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/runtime-profile.cjs.map +1 -1
- package/dist/data/ai/runtime-profile.d.ts +9 -7
- package/dist/data/ai/runtime-profile.d.ts.map +1 -1
- package/dist/data/ai/runtime-profile.js.map +1 -1
- package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs +111 -0
- package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts +7 -0
- package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js +111 -0
- package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js.map +1 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +313 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts +8 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +313 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs +98 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts +11 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js +98 -0
- package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js.map +1 -0
- package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs +35 -0
- package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts +11 -0
- package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/PresetSpecEditor.js +35 -0
- package/dist/data/ai/runtime-profiles/PresetSpecEditor.js.map +1 -0
- package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs +179 -0
- package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts +22 -0
- package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/PresetWorkspace.js +179 -0
- package/dist/data/ai/runtime-profiles/PresetWorkspace.js.map +1 -0
- package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs +57 -0
- package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts +18 -0
- package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js +57 -0
- package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js.map +1 -0
- package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs +135 -0
- package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts +23 -0
- package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/ProfileWorkspace.js +135 -0
- package/dist/data/ai/runtime-profiles/ProfileWorkspace.js.map +1 -0
- package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs +85 -0
- package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts +7 -0
- package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/ResolutionInspector.js +85 -0
- package/dist/data/ai/runtime-profiles/ResolutionInspector.js.map +1 -0
- package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs +42 -0
- package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts +6 -0
- package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/ResolutionTrace.js +42 -0
- package/dist/data/ai/runtime-profiles/ResolutionTrace.js.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs +93 -0
- package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts +18 -0
- package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js +93 -0
- package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs +44 -0
- package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts +6 -0
- package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js +44 -0
- package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs +198 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts +12 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js +198 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs +97 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts +26 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js +97 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs +143 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts +25 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js +143 -0
- package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs +41 -0
- package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts +8 -0
- package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js +41 -0
- package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js.map +1 -0
- package/dist/data/ai/runtime-profiles/index.d.ts +20 -0
- package/dist/data/ai/runtime-profiles/index.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/types.d.ts +50 -0
- package/dist/data/ai/runtime-profiles/types.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs +37 -0
- package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts +5 -0
- package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/use-permission-catalog.js +37 -0
- package/dist/data/ai/runtime-profiles/use-permission-catalog.js.map +1 -0
- package/dist/data/ai/runtime-profiles/use-resolution.cjs +43 -0
- package/dist/data/ai/runtime-profiles/use-resolution.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/use-resolution.d.ts +4 -0
- package/dist/data/ai/runtime-profiles/use-resolution.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/use-resolution.js +43 -0
- package/dist/data/ai/runtime-profiles/use-resolution.js.map +1 -0
- package/dist/data/ai/runtime-profiles/use-runtime-families.cjs +38 -0
- package/dist/data/ai/runtime-profiles/use-runtime-families.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts +3 -0
- package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/use-runtime-families.js +38 -0
- package/dist/data/ai/runtime-profiles/use-runtime-families.js.map +1 -0
- package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs +107 -0
- package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs.map +1 -0
- package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts +35 -0
- package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts.map +1 -0
- package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js +107 -0
- package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js.map +1 -0
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +2 -2
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/badge-variants.d.ts +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +3 -2
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +3 -2
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/runtime-field-support.cjs +3 -3
- package/dist/data/runtime/runtime-field-support.cjs.map +1 -1
- package/dist/data/runtime/runtime-field-support.js +1 -1
- package/dist/data/runtime/runtime-mode.cjs +14 -47
- package/dist/data/runtime/runtime-mode.cjs.map +1 -1
- package/dist/data/runtime/runtime-mode.d.ts +5 -7
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
- package/dist/data/runtime/runtime-mode.js +7 -39
- package/dist/data/runtime/runtime-mode.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/index.cjs +52 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/permission-strategies.cjs +155 -0
- package/dist/lib/permission-strategies.cjs.map +1 -0
- package/dist/lib/permission-strategies.d.ts +35 -0
- package/dist/lib/permission-strategies.d.ts.map +1 -0
- package/dist/lib/permission-strategies.js +155 -0
- package/dist/lib/permission-strategies.js.map +1 -0
- package/dist/lib/runtime-family.cjs +51 -0
- package/dist/lib/runtime-family.cjs.map +1 -0
- package/dist/lib/runtime-family.d.ts +25 -0
- package/dist/lib/runtime-family.d.ts.map +1 -0
- package/dist/lib/runtime-family.js +51 -0
- package/dist/lib/runtime-family.js.map +1 -0
- package/dist/lib/runtime-profile-model.cjs +129 -0
- package/dist/lib/runtime-profile-model.cjs.map +1 -0
- package/dist/lib/runtime-profile-model.d.ts +30 -0
- package/dist/lib/runtime-profile-model.d.ts.map +1 -0
- package/dist/lib/runtime-profile-model.js +129 -0
- package/dist/lib/runtime-profile-model.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +52 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +53 -1
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../../lib/utils.js";
|
|
3
|
+
const SOURCE_BADGE = {
|
|
4
|
+
preset: "bg-sky-500/10 text-sky-600 dark:text-sky-300",
|
|
5
|
+
profile: "bg-violet-500/10 text-violet-600 dark:text-violet-300",
|
|
6
|
+
prompt: "bg-muted text-muted-foreground",
|
|
7
|
+
request: "bg-muted text-muted-foreground"
|
|
8
|
+
};
|
|
9
|
+
function ResolutionTrace({
|
|
10
|
+
trace,
|
|
11
|
+
className
|
|
12
|
+
}) {
|
|
13
|
+
if (trace.length === 0) {
|
|
14
|
+
return /* @__PURE__ */ jsx("p", { className: cn("text-xs text-muted-foreground", className), children: "No layers resolved yet." });
|
|
15
|
+
}
|
|
16
|
+
return /* @__PURE__ */ jsx("ol", { "aria-label": "Resolution order", className: cn("space-y-1 text-sm", className), children: trace.map((layer, index) => /* @__PURE__ */ jsxs(
|
|
17
|
+
"li",
|
|
18
|
+
{
|
|
19
|
+
className: "flex items-center gap-2 rounded bg-muted/40 px-2 py-1.5",
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ jsx("span", { className: "w-5 text-right font-mono text-xs text-muted-foreground", children: index + 1 }),
|
|
22
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: layer.name }),
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
"span",
|
|
25
|
+
{
|
|
26
|
+
className: cn(
|
|
27
|
+
"rounded px-1.5 py-0.5 text-[10px] font-semibold uppercase",
|
|
28
|
+
SOURCE_BADGE[layer.source]
|
|
29
|
+
),
|
|
30
|
+
children: layer.source
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs capitalize text-muted-foreground", children: layer.scope })
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
layer.id ?? `${layer.source}:${layer.name}`
|
|
37
|
+
)) });
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
ResolutionTrace
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=ResolutionTrace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResolutionTrace.js","sources":["../../../../src/data/ai/runtime-profiles/ResolutionTrace.tsx"],"sourcesContent":["import { cn } from \"../../../lib/utils\";\nimport type {\n RuntimeResolutionLayer,\n RuntimeResolutionLayerSource,\n} from \"../runtime-profile\";\n\nconst SOURCE_BADGE: Record<RuntimeResolutionLayerSource, string> = {\n preset: \"bg-sky-500/10 text-sky-600 dark:text-sky-300\",\n profile: \"bg-violet-500/10 text-violet-600 dark:text-violet-300\",\n prompt: \"bg-muted text-muted-foreground\",\n request: \"bg-muted text-muted-foreground\",\n};\n\nexport function ResolutionTrace({\n trace,\n className,\n}: {\n trace: RuntimeResolutionLayer[];\n className?: string | undefined;\n}) {\n if (trace.length === 0) {\n return (\n <p className={cn(\"text-xs text-muted-foreground\", className)}>\n No layers resolved yet.\n </p>\n );\n }\n return (\n <ol aria-label=\"Resolution order\" className={cn(\"space-y-1 text-sm\", className)}>\n {trace.map((layer, index) => (\n <li\n key={layer.id ?? `${layer.source}:${layer.name}`}\n className=\"flex items-center gap-2 rounded bg-muted/40 px-2 py-1.5\"\n >\n <span className=\"w-5 text-right font-mono text-xs text-muted-foreground\">\n {index + 1}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{layer.name}</span>\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 text-[10px] font-semibold uppercase\",\n SOURCE_BADGE[layer.source],\n )}\n >\n {layer.source}\n </span>\n <span className=\"text-xs capitalize text-muted-foreground\">\n {layer.scope}\n </span>\n </li>\n ))}\n </ol>\n );\n}\n"],"names":[],"mappings":";;AAMA,MAAM,eAA6D;AAAA,EACjE,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAGG;AACD,MAAI,MAAM,WAAW,GAAG;AACtB,+BACG,KAAA,EAAE,WAAW,GAAG,iCAAiC,SAAS,GAAG,UAAA,2BAE9D;AAAA,EAEJ;AACA,SACE,oBAAC,MAAA,EAAG,cAAW,oBAAmB,WAAW,GAAG,qBAAqB,SAAS,GAC3E,UAAA,MAAM,IAAI,CAAC,OAAO,UACjB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,0DACb,UAAA,QAAQ,GACX;AAAA,QACA,oBAAC,QAAA,EAAK,WAAU,2BAA2B,gBAAM,MAAK;AAAA,QACtD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,aAAa,MAAM,MAAM;AAAA,YAAA;AAAA,YAG1B,UAAA,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAET,oBAAC,QAAA,EAAK,WAAU,4CACb,gBAAM,MAAA,CACT;AAAA,MAAA;AAAA,IAAA;AAAA,IAjBK,MAAM,MAAM,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI;AAAA,EAAA,CAmBjD,GACH;AAEJ;"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const button = require("../../../components/button.cjs");
|
|
5
|
+
const UiAdd = require("../../../icons/components/UiAdd.cjs");
|
|
6
|
+
const UiCopy = require("../../../icons/components/UiCopy.cjs");
|
|
7
|
+
const UiTrash = require("../../../icons/components/UiTrash.cjs");
|
|
8
|
+
function RuntimeLibraryList({
|
|
9
|
+
title,
|
|
10
|
+
items,
|
|
11
|
+
selectedId,
|
|
12
|
+
onSelect,
|
|
13
|
+
onCreate,
|
|
14
|
+
onDuplicate,
|
|
15
|
+
onDelete,
|
|
16
|
+
deleteReason
|
|
17
|
+
}) {
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "min-h-0 rounded-lg border border-border bg-card", children: [
|
|
19
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 border-b border-border px-3 py-2", children: [
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "flex-1 text-sm font-semibold", children: title }),
|
|
21
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
+
button.Button,
|
|
23
|
+
{
|
|
24
|
+
type: "button",
|
|
25
|
+
size: "icon",
|
|
26
|
+
variant: "ghost",
|
|
27
|
+
"aria-label": `Create ${title}`,
|
|
28
|
+
onClick: onCreate,
|
|
29
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(UiAdd.UiAdd, {})
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
] }),
|
|
33
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "divide-y divide-border", children: [
|
|
34
|
+
items.map((item) => {
|
|
35
|
+
var _a;
|
|
36
|
+
const reason = item.meta && !item.meta.writable ? `${item.meta.sourceLabel ?? "This source"} is read-only` : deleteReason == null ? void 0 : deleteReason(item.id);
|
|
37
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
38
|
+
"div",
|
|
39
|
+
{
|
|
40
|
+
className: selectedId === item.id ? "bg-primary/5 px-3 py-2" : "px-3 py-2 hover:bg-muted/40",
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
43
|
+
"button",
|
|
44
|
+
{
|
|
45
|
+
type: "button",
|
|
46
|
+
className: "w-full min-w-0 text-left",
|
|
47
|
+
onClick: () => onSelect(item.id),
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-medium", children: item.name }),
|
|
51
|
+
((_a = item.meta) == null ? void 0 : _a.sourceLabel) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium uppercase text-muted-foreground", children: item.meta.sourceLabel })
|
|
52
|
+
] }),
|
|
53
|
+
item.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 line-clamp-2 block text-xs text-muted-foreground", children: item.description })
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex justify-end gap-1", children: [
|
|
58
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
59
|
+
button.Button,
|
|
60
|
+
{
|
|
61
|
+
type: "button",
|
|
62
|
+
size: "icon",
|
|
63
|
+
variant: "ghost",
|
|
64
|
+
"aria-label": `Duplicate ${item.name}`,
|
|
65
|
+
onClick: () => onDuplicate(item.id),
|
|
66
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(UiCopy.UiCopy, {})
|
|
67
|
+
}
|
|
68
|
+
),
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
button.Button,
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
size: "icon",
|
|
74
|
+
variant: "ghost",
|
|
75
|
+
"aria-label": `Delete ${item.name}`,
|
|
76
|
+
title: reason,
|
|
77
|
+
disabled: Boolean(reason),
|
|
78
|
+
onClick: () => onDelete(item.id),
|
|
79
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(UiTrash.UiTrash, {})
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
] })
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
item.id
|
|
86
|
+
);
|
|
87
|
+
}),
|
|
88
|
+
items.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "No items yet." })
|
|
89
|
+
] })
|
|
90
|
+
] });
|
|
91
|
+
}
|
|
92
|
+
exports.RuntimeLibraryList = RuntimeLibraryList;
|
|
93
|
+
//# sourceMappingURL=RuntimeLibraryList.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeLibraryList.cjs","sources":["../../../../src/data/ai/runtime-profiles/RuntimeLibraryList.tsx"],"sourcesContent":["import { Button } from \"../../../components/button\";\nimport { UiAdd, UiCopy, UiTrash } from \"../../../icons\";\nimport type { RuntimeRecordMeta } from \"./types\";\n\nexport type RuntimeLibraryItem = {\n id: string;\n name: string;\n description?: string | undefined;\n meta?: RuntimeRecordMeta | undefined;\n};\n\nexport function RuntimeLibraryList({\n title,\n items,\n selectedId,\n onSelect,\n onCreate,\n onDuplicate,\n onDelete,\n deleteReason,\n}: {\n title: string;\n items: RuntimeLibraryItem[];\n selectedId: string | undefined;\n onSelect: (id: string) => void;\n onCreate: () => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n deleteReason?: ((id: string) => string | undefined) | undefined;\n}) {\n return (\n <aside className=\"min-h-0 rounded-lg border border-border bg-card\">\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <h2 className=\"flex-1 text-sm font-semibold\">{title}</h2>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Create ${title}`}\n onClick={onCreate}\n >\n <UiAdd />\n </Button>\n </div>\n <div className=\"divide-y divide-border\">\n {items.map((item) => {\n const reason =\n item.meta && !item.meta.writable\n ? `${item.meta.sourceLabel ?? \"This source\"} is read-only`\n : deleteReason?.(item.id);\n return (\n <div\n key={item.id}\n className={\n selectedId === item.id\n ? \"bg-primary/5 px-3 py-2\"\n : \"px-3 py-2 hover:bg-muted/40\"\n }\n >\n <button\n type=\"button\"\n className=\"w-full min-w-0 text-left\"\n onClick={() => onSelect(item.id)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">\n {item.name}\n </span>\n {item.meta?.sourceLabel && (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium uppercase text-muted-foreground\">\n {item.meta.sourceLabel}\n </span>\n )}\n </span>\n {item.description && (\n <span className=\"mt-0.5 line-clamp-2 block text-xs text-muted-foreground\">\n {item.description}\n </span>\n )}\n </button>\n <div className=\"mt-2 flex justify-end gap-1\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Duplicate ${item.name}`}\n onClick={() => onDuplicate(item.id)}\n >\n <UiCopy />\n </Button>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Delete ${item.name}`}\n title={reason}\n disabled={Boolean(reason)}\n onClick={() => onDelete(item.id)}\n >\n <UiTrash />\n </Button>\n </div>\n </div>\n );\n })}\n {items.length === 0 && (\n <p className=\"p-4 text-sm text-muted-foreground\">No items yet.</p>\n )}\n </div>\n </aside>\n );\n}\n"],"names":["jsxs","jsx","Button","UiAdd","UiCopy","UiTrash"],"mappings":";;;;;;;AAWO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,SACEA,2BAAAA,KAAC,SAAA,EAAM,WAAU,mDACf,UAAA;AAAA,IAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,MAAA,EAAG,WAAU,gCAAgC,UAAA,OAAM;AAAA,MACpDA,2BAAAA;AAAAA,QAACC,OAAAA;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,cAAY,UAAU,KAAK;AAAA,UAC3B,SAAS;AAAA,UAET,yCAACC,MAAAA,OAAA,CAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACT,GACF;AAAA,IACAH,2BAAAA,KAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,MAAA,MAAM,IAAI,CAAC,SAAS;;AACnB,cAAM,SACJ,KAAK,QAAQ,CAAC,KAAK,KAAK,WACpB,GAAG,KAAK,KAAK,eAAe,aAAa,kBACzC,6CAAe,KAAK;AAC1B,eACEA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WACE,eAAe,KAAK,KAChB,2BACA;AAAA,YAGN,UAAA;AAAA,cAAAA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,kBAE/B,UAAA;AAAA,oBAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,mCACd,UAAA;AAAA,sBAAAC,2BAAAA,IAAC,QAAA,EAAK,WAAU,+CACb,UAAA,KAAK,MACR;AAAA,wBACC,UAAK,SAAL,mBAAW,gBACVA,2BAAAA,IAAC,UAAK,WAAU,kGACb,UAAA,KAAK,KAAK,YAAA,CACb;AAAA,oBAAA,GAEJ;AAAA,oBACC,KAAK,eACJA,2BAAAA,IAAC,UAAK,WAAU,2DACb,eAAK,YAAA,CACR;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGJD,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,gBAAAC,2BAAAA;AAAAA,kBAACC,OAAAA;AAAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,cAAY,aAAa,KAAK,IAAI;AAAA,oBAClC,SAAS,MAAM,YAAY,KAAK,EAAE;AAAA,oBAElC,yCAACE,OAAAA,QAAA,CAAA,CAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEVH,2BAAAA;AAAAA,kBAACC,OAAAA;AAAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,cAAY,UAAU,KAAK,IAAI;AAAA,oBAC/B,OAAO;AAAA,oBACP,UAAU,QAAQ,MAAM;AAAA,oBACxB,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,oBAE/B,yCAACG,QAAAA,SAAA,CAAA,CAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACX,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAjDK,KAAK;AAAA,QAAA;AAAA,MAoDhB,CAAC;AAAA,MACA,MAAM,WAAW,oCACf,KAAA,EAAE,WAAU,qCAAoC,UAAA,gBAAA,CAAa;AAAA,IAAA,EAAA,CAElE;AAAA,EAAA,GACF;AAEJ;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RuntimeRecordMeta } from './types';
|
|
2
|
+
export type RuntimeLibraryItem = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string | undefined;
|
|
6
|
+
meta?: RuntimeRecordMeta | undefined;
|
|
7
|
+
};
|
|
8
|
+
export declare function RuntimeLibraryList({ title, items, selectedId, onSelect, onCreate, onDuplicate, onDelete, deleteReason, }: {
|
|
9
|
+
title: string;
|
|
10
|
+
items: RuntimeLibraryItem[];
|
|
11
|
+
selectedId: string | undefined;
|
|
12
|
+
onSelect: (id: string) => void;
|
|
13
|
+
onCreate: () => void;
|
|
14
|
+
onDuplicate: (id: string) => void;
|
|
15
|
+
onDelete: (id: string) => void;
|
|
16
|
+
deleteReason?: ((id: string) => string | undefined) | undefined;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=RuntimeLibraryList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeLibraryList.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/runtime-profiles/RuntimeLibraryList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,IAAI,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,KAAK,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,YAAY,GACb,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CACjE,+BAkFA"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from "../../../components/button.js";
|
|
3
|
+
import { UiAdd } from "../../../icons/components/UiAdd.js";
|
|
4
|
+
import { UiCopy } from "../../../icons/components/UiCopy.js";
|
|
5
|
+
import { UiTrash } from "../../../icons/components/UiTrash.js";
|
|
6
|
+
function RuntimeLibraryList({
|
|
7
|
+
title,
|
|
8
|
+
items,
|
|
9
|
+
selectedId,
|
|
10
|
+
onSelect,
|
|
11
|
+
onCreate,
|
|
12
|
+
onDuplicate,
|
|
13
|
+
onDelete,
|
|
14
|
+
deleteReason
|
|
15
|
+
}) {
|
|
16
|
+
return /* @__PURE__ */ jsxs("aside", { className: "min-h-0 rounded-lg border border-border bg-card", children: [
|
|
17
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b border-border px-3 py-2", children: [
|
|
18
|
+
/* @__PURE__ */ jsx("h2", { className: "flex-1 text-sm font-semibold", children: title }),
|
|
19
|
+
/* @__PURE__ */ jsx(
|
|
20
|
+
Button,
|
|
21
|
+
{
|
|
22
|
+
type: "button",
|
|
23
|
+
size: "icon",
|
|
24
|
+
variant: "ghost",
|
|
25
|
+
"aria-label": `Create ${title}`,
|
|
26
|
+
onClick: onCreate,
|
|
27
|
+
children: /* @__PURE__ */ jsx(UiAdd, {})
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
] }),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "divide-y divide-border", children: [
|
|
32
|
+
items.map((item) => {
|
|
33
|
+
var _a;
|
|
34
|
+
const reason = item.meta && !item.meta.writable ? `${item.meta.sourceLabel ?? "This source"} is read-only` : deleteReason == null ? void 0 : deleteReason(item.id);
|
|
35
|
+
return /* @__PURE__ */ jsxs(
|
|
36
|
+
"div",
|
|
37
|
+
{
|
|
38
|
+
className: selectedId === item.id ? "bg-primary/5 px-3 py-2" : "px-3 py-2 hover:bg-muted/40",
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsxs(
|
|
41
|
+
"button",
|
|
42
|
+
{
|
|
43
|
+
type: "button",
|
|
44
|
+
className: "w-full min-w-0 text-left",
|
|
45
|
+
onClick: () => onSelect(item.id),
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [
|
|
48
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-medium", children: item.name }),
|
|
49
|
+
((_a = item.meta) == null ? void 0 : _a.sourceLabel) && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium uppercase text-muted-foreground", children: item.meta.sourceLabel })
|
|
50
|
+
] }),
|
|
51
|
+
item.description && /* @__PURE__ */ jsx("span", { className: "mt-0.5 line-clamp-2 block text-xs text-muted-foreground", children: item.description })
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 flex justify-end gap-1", children: [
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
Button,
|
|
58
|
+
{
|
|
59
|
+
type: "button",
|
|
60
|
+
size: "icon",
|
|
61
|
+
variant: "ghost",
|
|
62
|
+
"aria-label": `Duplicate ${item.name}`,
|
|
63
|
+
onClick: () => onDuplicate(item.id),
|
|
64
|
+
children: /* @__PURE__ */ jsx(UiCopy, {})
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
Button,
|
|
69
|
+
{
|
|
70
|
+
type: "button",
|
|
71
|
+
size: "icon",
|
|
72
|
+
variant: "ghost",
|
|
73
|
+
"aria-label": `Delete ${item.name}`,
|
|
74
|
+
title: reason,
|
|
75
|
+
disabled: Boolean(reason),
|
|
76
|
+
onClick: () => onDelete(item.id),
|
|
77
|
+
children: /* @__PURE__ */ jsx(UiTrash, {})
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
] })
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
item.id
|
|
84
|
+
);
|
|
85
|
+
}),
|
|
86
|
+
items.length === 0 && /* @__PURE__ */ jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "No items yet." })
|
|
87
|
+
] })
|
|
88
|
+
] });
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
RuntimeLibraryList
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=RuntimeLibraryList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeLibraryList.js","sources":["../../../../src/data/ai/runtime-profiles/RuntimeLibraryList.tsx"],"sourcesContent":["import { Button } from \"../../../components/button\";\nimport { UiAdd, UiCopy, UiTrash } from \"../../../icons\";\nimport type { RuntimeRecordMeta } from \"./types\";\n\nexport type RuntimeLibraryItem = {\n id: string;\n name: string;\n description?: string | undefined;\n meta?: RuntimeRecordMeta | undefined;\n};\n\nexport function RuntimeLibraryList({\n title,\n items,\n selectedId,\n onSelect,\n onCreate,\n onDuplicate,\n onDelete,\n deleteReason,\n}: {\n title: string;\n items: RuntimeLibraryItem[];\n selectedId: string | undefined;\n onSelect: (id: string) => void;\n onCreate: () => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n deleteReason?: ((id: string) => string | undefined) | undefined;\n}) {\n return (\n <aside className=\"min-h-0 rounded-lg border border-border bg-card\">\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <h2 className=\"flex-1 text-sm font-semibold\">{title}</h2>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Create ${title}`}\n onClick={onCreate}\n >\n <UiAdd />\n </Button>\n </div>\n <div className=\"divide-y divide-border\">\n {items.map((item) => {\n const reason =\n item.meta && !item.meta.writable\n ? `${item.meta.sourceLabel ?? \"This source\"} is read-only`\n : deleteReason?.(item.id);\n return (\n <div\n key={item.id}\n className={\n selectedId === item.id\n ? \"bg-primary/5 px-3 py-2\"\n : \"px-3 py-2 hover:bg-muted/40\"\n }\n >\n <button\n type=\"button\"\n className=\"w-full min-w-0 text-left\"\n onClick={() => onSelect(item.id)}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">\n {item.name}\n </span>\n {item.meta?.sourceLabel && (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium uppercase text-muted-foreground\">\n {item.meta.sourceLabel}\n </span>\n )}\n </span>\n {item.description && (\n <span className=\"mt-0.5 line-clamp-2 block text-xs text-muted-foreground\">\n {item.description}\n </span>\n )}\n </button>\n <div className=\"mt-2 flex justify-end gap-1\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Duplicate ${item.name}`}\n onClick={() => onDuplicate(item.id)}\n >\n <UiCopy />\n </Button>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Delete ${item.name}`}\n title={reason}\n disabled={Boolean(reason)}\n onClick={() => onDelete(item.id)}\n >\n <UiTrash />\n </Button>\n </div>\n </div>\n );\n })}\n {items.length === 0 && (\n <p className=\"p-4 text-sm text-muted-foreground\">No items yet.</p>\n )}\n </div>\n </aside>\n );\n}\n"],"names":[],"mappings":";;;;;AAWO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,SACE,qBAAC,SAAA,EAAM,WAAU,mDACf,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,4DACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAG,WAAU,gCAAgC,UAAA,OAAM;AAAA,MACpD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,cAAY,UAAU,KAAK;AAAA,UAC3B,SAAS;AAAA,UAET,8BAAC,OAAA,CAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACT,GACF;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,MAAA,MAAM,IAAI,CAAC,SAAS;;AACnB,cAAM,SACJ,KAAK,QAAQ,CAAC,KAAK,KAAK,WACpB,GAAG,KAAK,KAAK,eAAe,aAAa,kBACzC,6CAAe,KAAK;AAC1B,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WACE,eAAe,KAAK,KAChB,2BACA;AAAA,YAGN,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,kBAE/B,UAAA;AAAA,oBAAA,qBAAC,QAAA,EAAK,WAAU,mCACd,UAAA;AAAA,sBAAA,oBAAC,QAAA,EAAK,WAAU,+CACb,UAAA,KAAK,MACR;AAAA,wBACC,UAAK,SAAL,mBAAW,gBACV,oBAAC,UAAK,WAAU,kGACb,UAAA,KAAK,KAAK,YAAA,CACb;AAAA,oBAAA,GAEJ;AAAA,oBACC,KAAK,eACJ,oBAAC,UAAK,WAAU,2DACb,eAAK,YAAA,CACR;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGJ,qBAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,cAAY,aAAa,KAAK,IAAI;AAAA,oBAClC,SAAS,MAAM,YAAY,KAAK,EAAE;AAAA,oBAElC,8BAAC,QAAA,CAAA,CAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEV;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,cAAY,UAAU,KAAK,IAAI;AAAA,oBAC/B,OAAO;AAAA,oBACP,UAAU,QAAQ,MAAM;AAAA,oBACxB,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,oBAE/B,8BAAC,SAAA,CAAA,CAAQ;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACX,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAjDK,KAAK;AAAA,QAAA;AAAA,MAoDhB,CAAC;AAAA,MACA,MAAM,WAAW,yBACf,KAAA,EAAE,WAAU,qCAAoC,UAAA,gBAAA,CAAa;AAAA,IAAA,EAAA,CAElE;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const button = require("../../../components/button.cjs");
|
|
5
|
+
const Icon = require("../../Icon.cjs");
|
|
6
|
+
const utils = require("../../../lib/utils.cjs");
|
|
7
|
+
const UiSave = require("../../../icons/components/UiSave.cjs");
|
|
8
|
+
function RuntimePersistenceBar({
|
|
9
|
+
persistence,
|
|
10
|
+
className
|
|
11
|
+
}) {
|
|
12
|
+
const locked = !persistence.dirty || persistence.saving;
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14
|
+
"div",
|
|
15
|
+
{
|
|
16
|
+
role: "group",
|
|
17
|
+
"aria-label": "Persistence",
|
|
18
|
+
className: utils.cn(
|
|
19
|
+
"flex flex-wrap items-center gap-density-2 rounded-md border border-border bg-muted/30 px-density-3 py-density-1 text-xs",
|
|
20
|
+
className
|
|
21
|
+
),
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: persistence.saving ? "Saving…" : persistence.dirty ? "Unsaved changes" : "All changes saved" }),
|
|
24
|
+
persistence.error && /* @__PURE__ */ jsxRuntime.jsx("span", { role: "alert", className: "font-medium text-destructive", children: persistence.error }),
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
+
button.Button,
|
|
27
|
+
{
|
|
28
|
+
size: "sm",
|
|
29
|
+
variant: "outline",
|
|
30
|
+
disabled: locked,
|
|
31
|
+
onClick: persistence.onDiscard,
|
|
32
|
+
children: "Discard"
|
|
33
|
+
}
|
|
34
|
+
),
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsxs(button.Button, { size: "sm", disabled: locked, onClick: persistence.onSave, children: [
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiSave.UiSave, className: "size-3.5" }),
|
|
37
|
+
"Save"
|
|
38
|
+
] })
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
exports.RuntimePersistenceBar = RuntimePersistenceBar;
|
|
44
|
+
//# sourceMappingURL=RuntimePersistenceBar.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimePersistenceBar.cjs","sources":["../../../../src/data/ai/runtime-profiles/RuntimePersistenceBar.tsx"],"sourcesContent":["import { Button } from \"../../../components/button\";\nimport { Icon } from \"../../Icon\";\nimport { UiSave } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { RuntimeProfilesPersistence } from \"./types\";\n\nexport function RuntimePersistenceBar({\n persistence,\n className,\n}: {\n persistence: RuntimeProfilesPersistence;\n className?: string | undefined;\n}) {\n const locked = !persistence.dirty || persistence.saving;\n return (\n <div\n role=\"group\"\n aria-label=\"Persistence\"\n className={cn(\n \"flex flex-wrap items-center gap-density-2 rounded-md border border-border bg-muted/30 px-density-3 py-density-1 text-xs\",\n className,\n )}\n >\n <span className=\"text-muted-foreground\">\n {persistence.saving\n ? \"Saving…\"\n : persistence.dirty\n ? \"Unsaved changes\"\n : \"All changes saved\"}\n </span>\n {persistence.error && (\n <span role=\"alert\" className=\"font-medium text-destructive\">\n {persistence.error}\n </span>\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={locked}\n onClick={persistence.onDiscard}\n >\n Discard\n </Button>\n <Button size=\"sm\" disabled={locked} onClick={persistence.onSave}>\n <Icon icon={UiSave} className=\"size-3.5\" />\n Save\n </Button>\n </div>\n );\n}\n"],"names":["jsxs","cn","jsx","Button","Icon","UiSave"],"mappings":";;;;;;;AAMO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGG;AACD,QAAM,SAAS,CAAC,YAAY,SAAS,YAAY;AACjD,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAAC,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBACb,UAAA,YAAY,SACT,YACA,YAAY,QACV,oBACA,oBAAA,CACR;AAAA,QACC,YAAY,SACXA,+BAAC,QAAA,EAAK,MAAK,SAAQ,WAAU,gCAC1B,UAAA,YAAY,MAAA,CACf;AAAA,QAEFA,2BAAAA;AAAAA,UAACC,OAAAA;AAAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,UAAU;AAAA,YACV,SAAS,YAAY;AAAA,YACtB,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDH,2BAAAA,KAACG,OAAAA,UAAO,MAAK,MAAK,UAAU,QAAQ,SAAS,YAAY,QACvD,UAAA;AAAA,UAAAD,2BAAAA,IAACE,KAAAA,MAAA,EAAK,MAAMC,OAAAA,QAAQ,WAAU,YAAW;AAAA,UAAE;AAAA,QAAA,EAAA,CAE7C;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RuntimeProfilesPersistence } from './types';
|
|
2
|
+
export declare function RuntimePersistenceBar({ persistence, className, }: {
|
|
3
|
+
persistence: RuntimeProfilesPersistence;
|
|
4
|
+
className?: string | undefined;
|
|
5
|
+
}): import("react").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=RuntimePersistenceBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimePersistenceBar.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/runtime-profiles/RuntimePersistenceBar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE1D,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,EACX,SAAS,GACV,EAAE;IACD,WAAW,EAAE,0BAA0B,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,+BAqCA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from "../../../components/button.js";
|
|
3
|
+
import { Icon } from "../../Icon.js";
|
|
4
|
+
import { cn } from "../../../lib/utils.js";
|
|
5
|
+
import { UiSave } from "../../../icons/components/UiSave.js";
|
|
6
|
+
function RuntimePersistenceBar({
|
|
7
|
+
persistence,
|
|
8
|
+
className
|
|
9
|
+
}) {
|
|
10
|
+
const locked = !persistence.dirty || persistence.saving;
|
|
11
|
+
return /* @__PURE__ */ jsxs(
|
|
12
|
+
"div",
|
|
13
|
+
{
|
|
14
|
+
role: "group",
|
|
15
|
+
"aria-label": "Persistence",
|
|
16
|
+
className: cn(
|
|
17
|
+
"flex flex-wrap items-center gap-density-2 rounded-md border border-border bg-muted/30 px-density-3 py-density-1 text-xs",
|
|
18
|
+
className
|
|
19
|
+
),
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: persistence.saving ? "Saving…" : persistence.dirty ? "Unsaved changes" : "All changes saved" }),
|
|
22
|
+
persistence.error && /* @__PURE__ */ jsx("span", { role: "alert", className: "font-medium text-destructive", children: persistence.error }),
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
Button,
|
|
25
|
+
{
|
|
26
|
+
size: "sm",
|
|
27
|
+
variant: "outline",
|
|
28
|
+
disabled: locked,
|
|
29
|
+
onClick: persistence.onDiscard,
|
|
30
|
+
children: "Discard"
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
/* @__PURE__ */ jsxs(Button, { size: "sm", disabled: locked, onClick: persistence.onSave, children: [
|
|
34
|
+
/* @__PURE__ */ jsx(Icon, { icon: UiSave, className: "size-3.5" }),
|
|
35
|
+
"Save"
|
|
36
|
+
] })
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
RuntimePersistenceBar
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=RuntimePersistenceBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimePersistenceBar.js","sources":["../../../../src/data/ai/runtime-profiles/RuntimePersistenceBar.tsx"],"sourcesContent":["import { Button } from \"../../../components/button\";\nimport { Icon } from \"../../Icon\";\nimport { UiSave } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { RuntimeProfilesPersistence } from \"./types\";\n\nexport function RuntimePersistenceBar({\n persistence,\n className,\n}: {\n persistence: RuntimeProfilesPersistence;\n className?: string | undefined;\n}) {\n const locked = !persistence.dirty || persistence.saving;\n return (\n <div\n role=\"group\"\n aria-label=\"Persistence\"\n className={cn(\n \"flex flex-wrap items-center gap-density-2 rounded-md border border-border bg-muted/30 px-density-3 py-density-1 text-xs\",\n className,\n )}\n >\n <span className=\"text-muted-foreground\">\n {persistence.saving\n ? \"Saving…\"\n : persistence.dirty\n ? \"Unsaved changes\"\n : \"All changes saved\"}\n </span>\n {persistence.error && (\n <span role=\"alert\" className=\"font-medium text-destructive\">\n {persistence.error}\n </span>\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={locked}\n onClick={persistence.onDiscard}\n >\n Discard\n </Button>\n <Button size=\"sm\" disabled={locked} onClick={persistence.onSave}>\n <Icon icon={UiSave} className=\"size-3.5\" />\n Save\n </Button>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAMO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGG;AACD,QAAM,SAAS,CAAC,YAAY,SAAS,YAAY;AACjD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,yBACb,UAAA,YAAY,SACT,YACA,YAAY,QACV,oBACA,oBAAA,CACR;AAAA,QACC,YAAY,SACX,oBAAC,QAAA,EAAK,MAAK,SAAQ,WAAU,gCAC1B,UAAA,YAAY,MAAA,CACf;AAAA,QAEF;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,UAAU;AAAA,YACV,SAAS,YAAY;AAAA,YACtB,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,qBAAC,UAAO,MAAK,MAAK,UAAU,QAAQ,SAAS,YAAY,QACvD,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAK,MAAM,QAAQ,WAAU,YAAW;AAAA,UAAE;AAAA,QAAA,EAAA,CAE7C;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const button = require("../../../components/button.cjs");
|
|
6
|
+
const Combobox = require("../../../components/Combobox.cjs");
|
|
7
|
+
const Field = require("../../../components/Field.cjs");
|
|
8
|
+
const InputField = require("../../../components/InputField.cjs");
|
|
9
|
+
const SegmentedControl = require("../../../components/SegmentedControl.cjs");
|
|
10
|
+
const Icon = require("../../Icon.cjs");
|
|
11
|
+
const fields = require("../SpecRuntimeEditor/fields.cjs");
|
|
12
|
+
const runtimeProfileModel = require("../../../lib/runtime-profile-model.cjs");
|
|
13
|
+
const OrderedPresetSelect = require("./OrderedPresetSelect.cjs");
|
|
14
|
+
const ResolutionTrace = require("./ResolutionTrace.cjs");
|
|
15
|
+
const UiLayers = require("../../../icons/components/UiLayers.cjs");
|
|
16
|
+
const UiSave = require("../../../icons/components/UiSave.cjs");
|
|
17
|
+
const UiFilePlus = require("../../../icons/components/UiFilePlus.cjs");
|
|
18
|
+
const UiGitMerge = require("../../../icons/components/UiGitMerge.cjs");
|
|
19
|
+
const NONE = "__clicky_runtime_profile_none__";
|
|
20
|
+
function RuntimeProfilePicker({
|
|
21
|
+
controller,
|
|
22
|
+
profiles,
|
|
23
|
+
presets,
|
|
24
|
+
resolution,
|
|
25
|
+
effectiveRuntime
|
|
26
|
+
}) {
|
|
27
|
+
var _a;
|
|
28
|
+
const { state } = controller;
|
|
29
|
+
const { draft } = state;
|
|
30
|
+
const nameId = react.useId();
|
|
31
|
+
const pendingProfile = profiles.find(
|
|
32
|
+
(profile) => {
|
|
33
|
+
var _a2;
|
|
34
|
+
return profile.id === ((_a2 = state.draft) == null ? void 0 : _a2.id);
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
const layers = [
|
|
38
|
+
{ id: "run", label: "This run" },
|
|
39
|
+
{ id: "profile", label: `Profile «${(draft == null ? void 0 : draft.name) ?? ""}»` }
|
|
40
|
+
];
|
|
41
|
+
const nameTaken = draft ? !runtimeProfileModel.uniqueName(draft.name, draft.id, profiles) : false;
|
|
42
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
43
|
+
"section",
|
|
44
|
+
{
|
|
45
|
+
"aria-label": "Runtime profile",
|
|
46
|
+
className: "mb-density-3 space-y-density-2 rounded-lg border border-border bg-card p-density-3",
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-density-2", children: [
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: [
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiLayers.UiLayers, className: "size-3.5" }),
|
|
51
|
+
"Runtime profile"
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
54
|
+
Combobox.Combobox,
|
|
55
|
+
{
|
|
56
|
+
ariaLabel: "Runtime profile",
|
|
57
|
+
value: ((_a = state.draft) == null ? void 0 : _a.id) ?? NONE,
|
|
58
|
+
options: [
|
|
59
|
+
{ value: NONE, label: "None" },
|
|
60
|
+
...profiles.map((profile) => ({
|
|
61
|
+
value: profile.id,
|
|
62
|
+
label: profile.name,
|
|
63
|
+
...profile.description ? { description: profile.description } : {}
|
|
64
|
+
}))
|
|
65
|
+
],
|
|
66
|
+
onChange: (next) => controller.select(next === NONE ? void 0 : next),
|
|
67
|
+
allowCustomValue: false,
|
|
68
|
+
required: true,
|
|
69
|
+
className: "min-w-56 flex-1"
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
] }),
|
|
73
|
+
controller.pending && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
role: "alert",
|
|
77
|
+
className: "flex flex-wrap items-center gap-density-2 rounded-md border border-amber-500/40 bg-amber-500/10 px-density-3 py-density-2 text-xs",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex-1", children: [
|
|
80
|
+
"Discard changes to «",
|
|
81
|
+
(pendingProfile == null ? void 0 : pendingProfile.name) ?? (draft == null ? void 0 : draft.name),
|
|
82
|
+
"»?"
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
85
|
+
button.Button,
|
|
86
|
+
{
|
|
87
|
+
size: "sm",
|
|
88
|
+
variant: "outline",
|
|
89
|
+
onClick: controller.cancelPending,
|
|
90
|
+
children: "Keep editing"
|
|
91
|
+
}
|
|
92
|
+
),
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
94
|
+
button.Button,
|
|
95
|
+
{
|
|
96
|
+
size: "sm",
|
|
97
|
+
variant: "destructive",
|
|
98
|
+
onClick: controller.confirmPending,
|
|
99
|
+
children: "Discard"
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
draft && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
106
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
107
|
+
SegmentedControl.SegmentedControl,
|
|
108
|
+
{
|
|
109
|
+
"aria-label": "Editing layer",
|
|
110
|
+
size: "sm",
|
|
111
|
+
value: state.layer,
|
|
112
|
+
options: layers,
|
|
113
|
+
onChange: controller.setLayer
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
state.layer === "profile" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-density-2", children: [
|
|
117
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
118
|
+
Field.Field,
|
|
119
|
+
{
|
|
120
|
+
label: "Profile name",
|
|
121
|
+
htmlFor: nameId,
|
|
122
|
+
labelClassName: "text-xs",
|
|
123
|
+
error: nameTaken ? "A unique profile name is required." : void 0,
|
|
124
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
125
|
+
InputField.InputField,
|
|
126
|
+
{
|
|
127
|
+
id: nameId,
|
|
128
|
+
value: draft.name,
|
|
129
|
+
invalid: nameTaken,
|
|
130
|
+
onChange: (name) => controller.editDraft({ ...draft, name })
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
+
OrderedPresetSelect.OrderedPresetSelect,
|
|
137
|
+
{
|
|
138
|
+
presets,
|
|
139
|
+
value: draft.presets,
|
|
140
|
+
onChange: (next) => controller.editDraft({ ...draft, presets: next })
|
|
141
|
+
}
|
|
142
|
+
)
|
|
143
|
+
] }),
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-density-2", children: [
|
|
145
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
146
|
+
button.Button,
|
|
147
|
+
{
|
|
148
|
+
size: "sm",
|
|
149
|
+
disabled: !controller.canSave || !controller.dirty || nameTaken || Boolean(controller.busy),
|
|
150
|
+
onClick: () => void controller.save(),
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiSave.UiSave, className: "size-3.5" }),
|
|
153
|
+
"Save profile"
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
158
|
+
button.Button,
|
|
159
|
+
{
|
|
160
|
+
size: "sm",
|
|
161
|
+
variant: "outline",
|
|
162
|
+
disabled: !controller.canCreate || Boolean(controller.busy),
|
|
163
|
+
onClick: () => void controller.saveAsNew(),
|
|
164
|
+
children: [
|
|
165
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiFilePlus.UiFilePlus, className: "size-3.5" }),
|
|
166
|
+
"Save as new"
|
|
167
|
+
]
|
|
168
|
+
}
|
|
169
|
+
),
|
|
170
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
171
|
+
button.Button,
|
|
172
|
+
{
|
|
173
|
+
size: "sm",
|
|
174
|
+
variant: "outline",
|
|
175
|
+
disabled: Boolean(controller.busy),
|
|
176
|
+
onClick: () => void controller.detach(),
|
|
177
|
+
children: [
|
|
178
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiGitMerge.UiGitMerge, className: "size-3.5" }),
|
|
179
|
+
"Detach"
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
),
|
|
183
|
+
controller.busy && /* @__PURE__ */ jsxRuntime.jsx("span", { role: "status", className: "text-xs text-muted-foreground", children: controller.busy === "detach" ? "Resolving…" : "Saving…" })
|
|
184
|
+
] })
|
|
185
|
+
] }),
|
|
186
|
+
controller.error && /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "text-xs text-destructive", children: controller.error }),
|
|
187
|
+
controller.notice && /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", className: "text-xs text-muted-foreground", children: controller.notice }),
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsx(fields.Disclosure, { label: "Resolution", hint: effectiveLabel(effectiveRuntime), children: /* @__PURE__ */ jsxRuntime.jsx(ResolutionTrace.ResolutionTrace, { trace: (resolution == null ? void 0 : resolution.trace) ?? [] }) })
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
function effectiveLabel(runtime) {
|
|
194
|
+
const parts = [runtime.model, runtime.mode].filter(Boolean);
|
|
195
|
+
return parts.length > 0 ? parts.join(" · ") : "inherits prompt defaults";
|
|
196
|
+
}
|
|
197
|
+
exports.RuntimeProfilePicker = RuntimeProfilePicker;
|
|
198
|
+
//# sourceMappingURL=RuntimeProfilePicker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuntimeProfilePicker.cjs","sources":["../../../../src/data/ai/runtime-profiles/RuntimeProfilePicker.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { Combobox } from \"../../../components/Combobox\";\nimport { Field } from \"../../../components/Field\";\nimport { InputField } from \"../../../components/InputField\";\nimport {\n SegmentedControl,\n type SegmentedOption,\n} from \"../../../components/SegmentedControl\";\nimport { UiFilePlus, UiGitMerge, UiLayers, UiSave } from \"../../../icons\";\nimport { Icon } from \"../../Icon\";\nimport type {\n ResolvedRuntimeSpec,\n RuntimePreset,\n RuntimeProfile,\n} from \"../runtime-profile\";\nimport { Disclosure } from \"../SpecRuntimeEditor/fields\";\nimport type { AISpecRuntimeSpec } from \"../SpecRuntimeEditor.model\";\nimport { uniqueName } from \"../../../lib/runtime-profile-model\";\nimport { OrderedPresetSelect } from \"./OrderedPresetSelect\";\nimport { ResolutionTrace } from \"./ResolutionTrace\";\nimport type { RuntimeProfileLayer } from \"./RuntimeProfilePicker.model\";\nimport type { RuntimeProfilePickerController } from \"./use-runtime-profile-picker\";\n\nconst NONE = \"__clicky_runtime_profile_none__\";\n\nexport type RuntimeProfilePickerProps = {\n controller: RuntimeProfilePickerController;\n profiles: RuntimeProfile[];\n presets: RuntimePreset[];\n resolution?: ResolvedRuntimeSpec | undefined;\n effectiveRuntime: Pick<AISpecRuntimeSpec, \"model\" | \"mode\">;\n};\n\nexport function RuntimeProfilePicker({\n controller,\n profiles,\n presets,\n resolution,\n effectiveRuntime,\n}: RuntimeProfilePickerProps) {\n const { state } = controller;\n const { draft } = state;\n const nameId = useId();\n const pendingProfile = profiles.find(\n (profile) => profile.id === state.draft?.id,\n );\n const layers: SegmentedOption<RuntimeProfileLayer>[] = [\n { id: \"run\", label: \"This run\" },\n { id: \"profile\", label: `Profile «${draft?.name ?? \"\"}»` },\n ];\n const nameTaken = draft ? !uniqueName(draft.name, draft.id, profiles) : false;\n\n return (\n <section\n aria-label=\"Runtime profile\"\n className=\"mb-density-3 space-y-density-2 rounded-lg border border-border bg-card p-density-3\"\n >\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <span className=\"inline-flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <Icon icon={UiLayers} className=\"size-3.5\" />\n Runtime profile\n </span>\n <Combobox\n ariaLabel=\"Runtime profile\"\n value={state.draft?.id ?? NONE}\n options={[\n { value: NONE, label: \"None\" },\n ...profiles.map((profile) => ({\n value: profile.id,\n label: profile.name,\n ...(profile.description\n ? { description: profile.description }\n : {}),\n })),\n ]}\n onChange={(next) =>\n controller.select(next === NONE ? undefined : next)\n }\n allowCustomValue={false}\n required\n className=\"min-w-56 flex-1\"\n />\n </div>\n {controller.pending && (\n <div\n role=\"alert\"\n className=\"flex flex-wrap items-center gap-density-2 rounded-md border border-amber-500/40 bg-amber-500/10 px-density-3 py-density-2 text-xs\"\n >\n <span className=\"flex-1\">\n Discard changes to «{pendingProfile?.name ?? draft?.name}»?\n </span>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={controller.cancelPending}\n >\n Keep editing\n </Button>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n onClick={controller.confirmPending}\n >\n Discard\n </Button>\n </div>\n )}\n {draft && (\n <>\n <SegmentedControl\n aria-label=\"Editing layer\"\n size=\"sm\"\n value={state.layer}\n options={layers}\n onChange={controller.setLayer}\n />\n {state.layer === \"profile\" && (\n <div className=\"space-y-density-2\">\n <Field\n label=\"Profile name\"\n htmlFor={nameId}\n labelClassName=\"text-xs\"\n error={\n nameTaken ? \"A unique profile name is required.\" : undefined\n }\n >\n <InputField\n id={nameId}\n value={draft.name}\n invalid={nameTaken}\n onChange={(name) => controller.editDraft({ ...draft, name })}\n />\n </Field>\n <OrderedPresetSelect\n presets={presets}\n value={draft.presets}\n onChange={(next) =>\n controller.editDraft({ ...draft, presets: next })\n }\n />\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <Button\n size=\"sm\"\n disabled={\n !controller.canSave ||\n !controller.dirty ||\n nameTaken ||\n Boolean(controller.busy)\n }\n onClick={() => void controller.save()}\n >\n <Icon icon={UiSave} className=\"size-3.5\" />\n Save profile\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={!controller.canCreate || Boolean(controller.busy)}\n onClick={() => void controller.saveAsNew()}\n >\n <Icon icon={UiFilePlus} className=\"size-3.5\" />\n Save as new\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={Boolean(controller.busy)}\n onClick={() => void controller.detach()}\n >\n <Icon icon={UiGitMerge} className=\"size-3.5\" />\n Detach\n </Button>\n {controller.busy && (\n <span role=\"status\" className=\"text-xs text-muted-foreground\">\n {controller.busy === \"detach\" ? \"Resolving…\" : \"Saving…\"}\n </span>\n )}\n </div>\n </>\n )}\n {controller.error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {controller.error}\n </p>\n )}\n {controller.notice && (\n <p role=\"status\" className=\"text-xs text-muted-foreground\">\n {controller.notice}\n </p>\n )}\n <Disclosure label=\"Resolution\" hint={effectiveLabel(effectiveRuntime)}>\n <ResolutionTrace trace={resolution?.trace ?? []} />\n </Disclosure>\n </section>\n );\n}\n\nfunction effectiveLabel(runtime: Pick<AISpecRuntimeSpec, \"model\" | \"mode\">) {\n const parts = [runtime.model, runtime.mode].filter(Boolean);\n return parts.length > 0 ? parts.join(\" · \") : \"inherits prompt defaults\";\n}\n"],"names":["useId","_a","uniqueName","jsxs","jsx","Icon","UiLayers","Combobox","Button","Fragment","SegmentedControl","Field","InputField","OrderedPresetSelect","UiSave","UiFilePlus","UiGitMerge","Disclosure","ResolutionTrace"],"mappings":"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"}
|