@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.
Files changed (224) hide show
  1. package/dist/ai.cjs +48 -3
  2. package/dist/ai.cjs.map +1 -1
  3. package/dist/ai.js +46 -1
  4. package/dist/ai.js.map +1 -1
  5. package/dist/components/DateField.d.ts +1 -1
  6. package/dist/components/DatePicker.d.ts +1 -1
  7. package/dist/components/DateTimePicker.d.ts +1 -1
  8. package/dist/components/mdx-editor-callout-model.d.ts +1 -1
  9. package/dist/data/MarkdownEditor.model.d.ts +1 -1
  10. package/dist/data/ai/ChatWindow.catalogs.cjs +11 -5
  11. package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -1
  12. package/dist/data/ai/ChatWindow.catalogs.d.ts +2 -1
  13. package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -1
  14. package/dist/data/ai/ChatWindow.catalogs.js +11 -5
  15. package/dist/data/ai/ChatWindow.catalogs.js.map +1 -1
  16. package/dist/data/ai/ChatWindow.cjs +1 -0
  17. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  18. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  19. package/dist/data/ai/ChatWindow.js +1 -0
  20. package/dist/data/ai/ChatWindow.js.map +1 -1
  21. package/dist/data/ai/PromptRunEditor/VariablesField.cjs +79 -0
  22. package/dist/data/ai/PromptRunEditor/VariablesField.cjs.map +1 -0
  23. package/dist/data/ai/PromptRunEditor/VariablesField.d.ts +8 -0
  24. package/dist/data/ai/PromptRunEditor/VariablesField.d.ts.map +1 -0
  25. package/dist/data/ai/PromptRunEditor/VariablesField.js +79 -0
  26. package/dist/data/ai/PromptRunEditor/VariablesField.js.map +1 -0
  27. package/dist/data/ai/PromptRunEditor/index.cjs +61 -69
  28. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  29. package/dist/data/ai/PromptRunEditor/index.d.ts +11 -1
  30. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  31. package/dist/data/ai/PromptRunEditor/index.js +61 -69
  32. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  33. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
  34. package/dist/data/ai/PromptRunEditor/model.d.ts +2 -0
  35. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
  36. package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
  37. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +4 -3
  38. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  39. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  40. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +2 -1
  41. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  42. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs +2 -2
  43. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs.map +1 -1
  44. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js +1 -1
  45. package/dist/data/ai/SpecRuntimeEditor/index.cjs +4 -3
  46. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  47. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  48. package/dist/data/ai/SpecRuntimeEditor/index.js +2 -1
  49. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  50. package/dist/data/ai/index.d.ts +3 -2
  51. package/dist/data/ai/index.d.ts.map +1 -1
  52. package/dist/data/ai/runtime-profile.cjs.map +1 -1
  53. package/dist/data/ai/runtime-profile.d.ts +9 -7
  54. package/dist/data/ai/runtime-profile.d.ts.map +1 -1
  55. package/dist/data/ai/runtime-profile.js.map +1 -1
  56. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs +111 -0
  57. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs.map +1 -0
  58. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts +7 -0
  59. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts.map +1 -0
  60. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js +111 -0
  61. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js.map +1 -0
  62. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +313 -0
  63. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -0
  64. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts +8 -0
  65. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -0
  66. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +313 -0
  67. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -0
  68. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs +98 -0
  69. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs.map +1 -0
  70. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts +11 -0
  71. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts.map +1 -0
  72. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js +98 -0
  73. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js.map +1 -0
  74. package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs +35 -0
  75. package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs.map +1 -0
  76. package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts +11 -0
  77. package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts.map +1 -0
  78. package/dist/data/ai/runtime-profiles/PresetSpecEditor.js +35 -0
  79. package/dist/data/ai/runtime-profiles/PresetSpecEditor.js.map +1 -0
  80. package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs +179 -0
  81. package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs.map +1 -0
  82. package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts +22 -0
  83. package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts.map +1 -0
  84. package/dist/data/ai/runtime-profiles/PresetWorkspace.js +179 -0
  85. package/dist/data/ai/runtime-profiles/PresetWorkspace.js.map +1 -0
  86. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs +57 -0
  87. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs.map +1 -0
  88. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts +18 -0
  89. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts.map +1 -0
  90. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js +57 -0
  91. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js.map +1 -0
  92. package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs +135 -0
  93. package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs.map +1 -0
  94. package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts +23 -0
  95. package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts.map +1 -0
  96. package/dist/data/ai/runtime-profiles/ProfileWorkspace.js +135 -0
  97. package/dist/data/ai/runtime-profiles/ProfileWorkspace.js.map +1 -0
  98. package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs +85 -0
  99. package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs.map +1 -0
  100. package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts +7 -0
  101. package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts.map +1 -0
  102. package/dist/data/ai/runtime-profiles/ResolutionInspector.js +85 -0
  103. package/dist/data/ai/runtime-profiles/ResolutionInspector.js.map +1 -0
  104. package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs +42 -0
  105. package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs.map +1 -0
  106. package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts +6 -0
  107. package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts.map +1 -0
  108. package/dist/data/ai/runtime-profiles/ResolutionTrace.js +42 -0
  109. package/dist/data/ai/runtime-profiles/ResolutionTrace.js.map +1 -0
  110. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs +93 -0
  111. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs.map +1 -0
  112. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts +18 -0
  113. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts.map +1 -0
  114. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js +93 -0
  115. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js.map +1 -0
  116. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs +44 -0
  117. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs.map +1 -0
  118. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts +6 -0
  119. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts.map +1 -0
  120. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js +44 -0
  121. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js.map +1 -0
  122. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs +198 -0
  123. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs.map +1 -0
  124. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts +12 -0
  125. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts.map +1 -0
  126. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js +198 -0
  127. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js.map +1 -0
  128. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs +97 -0
  129. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs.map +1 -0
  130. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts +26 -0
  131. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts.map +1 -0
  132. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js +97 -0
  133. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js.map +1 -0
  134. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs +143 -0
  135. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs.map +1 -0
  136. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts +25 -0
  137. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts.map +1 -0
  138. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js +143 -0
  139. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js.map +1 -0
  140. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs +41 -0
  141. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs.map +1 -0
  142. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts +8 -0
  143. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts.map +1 -0
  144. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js +41 -0
  145. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js.map +1 -0
  146. package/dist/data/ai/runtime-profiles/index.d.ts +20 -0
  147. package/dist/data/ai/runtime-profiles/index.d.ts.map +1 -0
  148. package/dist/data/ai/runtime-profiles/types.d.ts +50 -0
  149. package/dist/data/ai/runtime-profiles/types.d.ts.map +1 -0
  150. package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs +37 -0
  151. package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs.map +1 -0
  152. package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts +5 -0
  153. package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts.map +1 -0
  154. package/dist/data/ai/runtime-profiles/use-permission-catalog.js +37 -0
  155. package/dist/data/ai/runtime-profiles/use-permission-catalog.js.map +1 -0
  156. package/dist/data/ai/runtime-profiles/use-resolution.cjs +43 -0
  157. package/dist/data/ai/runtime-profiles/use-resolution.cjs.map +1 -0
  158. package/dist/data/ai/runtime-profiles/use-resolution.d.ts +4 -0
  159. package/dist/data/ai/runtime-profiles/use-resolution.d.ts.map +1 -0
  160. package/dist/data/ai/runtime-profiles/use-resolution.js +43 -0
  161. package/dist/data/ai/runtime-profiles/use-resolution.js.map +1 -0
  162. package/dist/data/ai/runtime-profiles/use-runtime-families.cjs +38 -0
  163. package/dist/data/ai/runtime-profiles/use-runtime-families.cjs.map +1 -0
  164. package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts +3 -0
  165. package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts.map +1 -0
  166. package/dist/data/ai/runtime-profiles/use-runtime-families.js +38 -0
  167. package/dist/data/ai/runtime-profiles/use-runtime-families.js.map +1 -0
  168. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs +107 -0
  169. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs.map +1 -0
  170. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts +35 -0
  171. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts.map +1 -0
  172. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js +107 -0
  173. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js.map +1 -0
  174. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  175. package/dist/data/ai/use-session-scroll.d.ts +2 -2
  176. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  177. package/dist/data/ai/use-session-scroll.js.map +1 -1
  178. package/dist/data/badge-variants.d.ts +1 -1
  179. package/dist/data/runtime/RuntimeBar.cjs +3 -2
  180. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  181. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  182. package/dist/data/runtime/RuntimeBar.js +3 -2
  183. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  184. package/dist/data/runtime/runtime-field-support.cjs +3 -3
  185. package/dist/data/runtime/runtime-field-support.cjs.map +1 -1
  186. package/dist/data/runtime/runtime-field-support.js +1 -1
  187. package/dist/data/runtime/runtime-mode.cjs +14 -47
  188. package/dist/data/runtime/runtime-mode.cjs.map +1 -1
  189. package/dist/data/runtime/runtime-mode.d.ts +5 -7
  190. package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
  191. package/dist/data/runtime/runtime-mode.js +7 -39
  192. package/dist/data/runtime/runtime-mode.js.map +1 -1
  193. package/dist/data/version-info.cjs +3 -3
  194. package/dist/data/version-info.js +3 -3
  195. package/dist/index.cjs +52 -0
  196. package/dist/index.cjs.map +1 -1
  197. package/dist/index.js +52 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/lib/permission-strategies.cjs +155 -0
  200. package/dist/lib/permission-strategies.cjs.map +1 -0
  201. package/dist/lib/permission-strategies.d.ts +35 -0
  202. package/dist/lib/permission-strategies.d.ts.map +1 -0
  203. package/dist/lib/permission-strategies.js +155 -0
  204. package/dist/lib/permission-strategies.js.map +1 -0
  205. package/dist/lib/runtime-family.cjs +51 -0
  206. package/dist/lib/runtime-family.cjs.map +1 -0
  207. package/dist/lib/runtime-family.d.ts +25 -0
  208. package/dist/lib/runtime-family.d.ts.map +1 -0
  209. package/dist/lib/runtime-family.js +51 -0
  210. package/dist/lib/runtime-family.js.map +1 -0
  211. package/dist/lib/runtime-profile-model.cjs +129 -0
  212. package/dist/lib/runtime-profile-model.cjs.map +1 -0
  213. package/dist/lib/runtime-profile-model.d.ts +30 -0
  214. package/dist/lib/runtime-profile-model.d.ts.map +1 -0
  215. package/dist/lib/runtime-profile-model.js +129 -0
  216. package/dist/lib/runtime-profile-model.js.map +1 -0
  217. package/dist/styles.css +1 -1
  218. package/dist/utils.cjs +52 -0
  219. package/dist/utils.cjs.map +1 -1
  220. package/dist/utils.d.ts +5 -0
  221. package/dist/utils.d.ts.map +1 -1
  222. package/dist/utils.js +53 -1
  223. package/dist/utils.js.map +1 -1
  224. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { IconButton } from "../../../components/IconButton.js";
3
+ import { MultiSelect } from "../../../components/MultiSelect.js";
4
+ import { moveItem } from "../../../lib/collections.js";
5
+ import { presetForRef } from "../../../lib/runtime-profile-model.js";
6
+ import { UiChevronUp } from "../../../icons/components/UiChevronUp.js";
7
+ import { UiChevronDown } from "../../../icons/components/UiChevronDown.js";
8
+ import { UiTrash } from "../../../icons/components/UiTrash.js";
9
+ function OrderedPresetSelect({
10
+ presets,
11
+ value,
12
+ onChange
13
+ }) {
14
+ const rows = value.map((ref) => ({
15
+ ref,
16
+ preset: presetForRef(ref, presets)
17
+ }));
18
+ const selectedIds = rows.map(({ ref, preset }) => (preset == null ? void 0 : preset.id) ?? ref);
19
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-density-2 rounded-md border border-border p-density-3", children: [
20
+ /* @__PURE__ */ jsxs("div", { children: [
21
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold", children: "Included presets" }),
22
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Select reusable behavior, then order presets within their resolution scope. The profile spec below is the final profile-owned override." })
23
+ ] }),
24
+ /* @__PURE__ */ jsx(
25
+ MultiSelect,
26
+ {
27
+ options: presets.map((preset) => ({
28
+ value: preset.id,
29
+ label: preset.name,
30
+ ...preset.description ? { title: preset.description } : {}
31
+ })),
32
+ value: selectedIds,
33
+ onChange,
34
+ ariaLabel: "Profile presets",
35
+ placeholder: "Select presets",
36
+ className: "w-full",
37
+ triggerClassName: "w-full max-w-none"
38
+ }
39
+ ),
40
+ rows.length > 0 && /* @__PURE__ */ jsx(
41
+ "ol",
42
+ {
43
+ "aria-label": "Preset order",
44
+ className: "divide-y divide-border rounded-md border border-border",
45
+ children: rows.map(({ ref, preset }, index) => /* @__PURE__ */ jsxs(
46
+ "li",
47
+ {
48
+ className: "flex min-w-0 items-center gap-density-2 px-density-2 py-density-1",
49
+ children: [
50
+ /* @__PURE__ */ jsx("span", { className: "w-5 shrink-0 text-center text-[10px] tabular-nums text-muted-foreground", children: String(index + 1).padStart(2, "0") }),
51
+ preset ? /* @__PURE__ */ jsx(PresetRow, { preset }) : /* @__PURE__ */ jsx(MissingPresetRow, { reference: ref }),
52
+ preset ? /* @__PURE__ */ jsxs(Fragment, { children: [
53
+ /* @__PURE__ */ jsx(
54
+ IconButton,
55
+ {
56
+ icon: UiChevronUp,
57
+ label: `Move ${preset.name} up`,
58
+ disabled: index === 0,
59
+ onClick: () => onChange(moveItem(value, index, index - 1))
60
+ }
61
+ ),
62
+ /* @__PURE__ */ jsx(
63
+ IconButton,
64
+ {
65
+ icon: UiChevronDown,
66
+ label: `Move ${preset.name} down`,
67
+ disabled: index === rows.length - 1,
68
+ onClick: () => onChange(moveItem(value, index, index + 1))
69
+ }
70
+ )
71
+ ] }) : /* @__PURE__ */ jsx(
72
+ IconButton,
73
+ {
74
+ icon: UiTrash,
75
+ label: `Remove missing preset ${ref}`,
76
+ className: "hover:text-destructive",
77
+ onClick: () => onChange(
78
+ value.filter((_, itemIndex) => itemIndex !== index)
79
+ )
80
+ }
81
+ )
82
+ ]
83
+ },
84
+ `${ref}-${index}`
85
+ ))
86
+ }
87
+ )
88
+ ] });
89
+ }
90
+ function PresetRow({ preset }) {
91
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
92
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
93
+ /* @__PURE__ */ jsx("div", { className: "truncate text-xs font-medium", children: preset.name }),
94
+ /* @__PURE__ */ jsx("div", { className: "truncate text-[10px] text-muted-foreground", children: preset.description })
95
+ ] }),
96
+ /* @__PURE__ */ jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium uppercase text-muted-foreground", children: preset.scope })
97
+ ] });
98
+ }
99
+ function MissingPresetRow({ reference }) {
100
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
101
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 text-muted-foreground", children: [
102
+ /* @__PURE__ */ jsx("div", { className: "truncate text-xs font-medium italic", children: reference }),
103
+ /* @__PURE__ */ jsx("div", { className: "truncate text-[10px]", children: "Missing preset — not in this catalog." })
104
+ ] }),
105
+ /* @__PURE__ */ jsx("span", { className: "rounded bg-destructive/10 px-1.5 py-0.5 text-[9px] font-medium uppercase text-destructive", children: "missing" })
106
+ ] });
107
+ }
108
+ export {
109
+ OrderedPresetSelect
110
+ };
111
+ //# sourceMappingURL=OrderedPresetSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderedPresetSelect.js","sources":["../../../../src/data/ai/runtime-profiles/OrderedPresetSelect.tsx"],"sourcesContent":["import { IconButton } from \"../../../components/IconButton\";\nimport { MultiSelect } from \"../../../components/MultiSelect\";\nimport { UiChevronDown, UiChevronUp, UiTrash } from \"../../../icons\";\nimport { moveItem } from \"../../../lib/collections\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\n\nexport function OrderedPresetSelect({\n presets,\n value,\n onChange,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (value: string[]) => void;\n}) {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const selectedIds = rows.map(({ ref, preset }) => preset?.id ?? ref);\n\n return (\n <div className=\"space-y-density-2 rounded-md border border-border p-density-3\">\n <div>\n <div className=\"text-sm font-semibold\">Included presets</div>\n <p className=\"text-xs text-muted-foreground\">\n Select reusable behavior, then order presets within their resolution\n scope. The profile spec below is the final profile-owned override.\n </p>\n </div>\n <MultiSelect\n options={presets.map((preset) => ({\n value: preset.id,\n label: preset.name,\n ...(preset.description ? { title: preset.description } : {}),\n }))}\n value={selectedIds}\n onChange={onChange}\n ariaLabel=\"Profile presets\"\n placeholder=\"Select presets\"\n className=\"w-full\"\n triggerClassName=\"w-full max-w-none\"\n />\n {rows.length > 0 && (\n <ol\n aria-label=\"Preset order\"\n className=\"divide-y divide-border rounded-md border border-border\"\n >\n {rows.map(({ ref, preset }, index) => (\n <li\n key={`${ref}-${index}`}\n className=\"flex min-w-0 items-center gap-density-2 px-density-2 py-density-1\"\n >\n <span className=\"w-5 shrink-0 text-center text-[10px] tabular-nums text-muted-foreground\">\n {String(index + 1).padStart(2, \"0\")}\n </span>\n {preset ? (\n <PresetRow preset={preset} />\n ) : (\n <MissingPresetRow reference={ref} />\n )}\n {preset ? (\n <>\n <IconButton\n icon={UiChevronUp}\n label={`Move ${preset.name} up`}\n disabled={index === 0}\n onClick={() => onChange(moveItem(value, index, index - 1))}\n />\n <IconButton\n icon={UiChevronDown}\n label={`Move ${preset.name} down`}\n disabled={index === rows.length - 1}\n onClick={() => onChange(moveItem(value, index, index + 1))}\n />\n </>\n ) : (\n <IconButton\n icon={UiTrash}\n label={`Remove missing preset ${ref}`}\n className=\"hover:text-destructive\"\n onClick={() =>\n onChange(\n value.filter((_, itemIndex) => itemIndex !== index),\n )\n }\n />\n )}\n </li>\n ))}\n </ol>\n )}\n </div>\n );\n}\n\nfunction PresetRow({ preset }: { preset: RuntimePreset }) {\n return (\n <>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium\">{preset.name}</div>\n <div className=\"truncate text-[10px] text-muted-foreground\">\n {preset.description}\n </div>\n </div>\n <span className=\"rounded bg-muted px-1.5 py-0.5 text-[9px] font-medium uppercase text-muted-foreground\">\n {preset.scope}\n </span>\n </>\n );\n}\n\nfunction MissingPresetRow({ reference }: { reference: string }) {\n return (\n <>\n <div className=\"min-w-0 flex-1 text-muted-foreground\">\n <div className=\"truncate text-xs font-medium italic\">{reference}</div>\n <div className=\"truncate text-[10px]\">\n Missing preset — not in this catalog.\n </div>\n </div>\n <span className=\"rounded bg-destructive/10 px-1.5 py-0.5 text-[9px] font-medium uppercase text-destructive\">\n missing\n </span>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,313 @@
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 AccordionList = require("../../../components/AccordionList.cjs");
6
+ const Combobox = require("../../../components/Combobox.cjs");
7
+ const select = require("../../../components/select.cjs");
8
+ const SegmentedControl = require("../../../components/SegmentedControl.cjs");
9
+ const utils = require("../../../lib/utils.cjs");
10
+ const HoverCard = require("../../../overlay/HoverCard.cjs");
11
+ const permissionStrategies = require("../../../lib/permission-strategies.cjs");
12
+ const PermissionStrategyConditionRow = require("./PermissionStrategyConditionRow.cjs");
13
+ const UiListChecks = require("../../../icons/components/UiListChecks.cjs");
14
+ const UiEye = require("../../../icons/components/UiEye.cjs");
15
+ const UiWarningTriangle = require("../../../icons/components/UiWarningTriangle.cjs");
16
+ const UiRepeat = require("../../../icons/components/UiRepeat.cjs");
17
+ const UiSliders = require("../../../icons/components/UiSliders.cjs");
18
+ const UiSparkles = require("../../../icons/components/UiSparkles.cjs");
19
+ const UiQuestion = require("../../../icons/components/UiQuestion.cjs");
20
+ const UiShieldSlash = require("../../../icons/components/UiShieldSlash.cjs");
21
+ const UiShield = require("../../../icons/components/UiShield.cjs");
22
+ function PermissionStrategiesEditor({
23
+ value,
24
+ tools,
25
+ onChange
26
+ }) {
27
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-2", children: [
28
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
29
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold", children: "Permission strategies" }),
30
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Match tool metadata and assign authority. Later rows win." })
31
+ ] }),
32
+ /* @__PURE__ */ jsxRuntime.jsx(
33
+ AccordionList.AccordionList,
34
+ {
35
+ items: value,
36
+ onChange,
37
+ allowDrag: true,
38
+ allowReorder: true,
39
+ allowDuplicate: true,
40
+ allowRemove: true,
41
+ cloneItem: (rule) => structuredClone(rule),
42
+ onCreate: () => ({ name: "*", policy: "ask" }),
43
+ addLabel: "Add permission strategy",
44
+ addDescription: "Start with a common match preset or define custom conditions.",
45
+ itemLabel: ({ item, index }) => `Permission strategy ${index + 1}: ${strategyLabel(item)}`,
46
+ idPrefix: "permission-strategy",
47
+ renderHeader: ({ item }) => /* @__PURE__ */ jsxRuntime.jsx(StrategyHeader, { rule: item }),
48
+ renderMeta: ({ item }) => /* @__PURE__ */ jsxRuntime.jsx(MatchCountBadge, { rule: item, tools }),
49
+ renderBody: ({ item, onChange: changeRule }) => /* @__PURE__ */ jsxRuntime.jsx(
50
+ PermissionStrategyFields,
51
+ {
52
+ value: item,
53
+ tools,
54
+ onChange: changeRule
55
+ }
56
+ )
57
+ }
58
+ )
59
+ ] });
60
+ }
61
+ function StrategyHeader({ rule }) {
62
+ const preset = permissionStrategies.strategyPreset(rule);
63
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
64
+ /* @__PURE__ */ jsxRuntime.jsx(
65
+ "span",
66
+ {
67
+ className: utils.cn(
68
+ "flex size-7 shrink-0 items-center justify-center rounded-md",
69
+ strategyIconStyle(preset)
70
+ ),
71
+ children: /* @__PURE__ */ jsxRuntime.jsx(StrategyIcon, { preset, className: "size-4" })
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-medium", children: strategyLabel(rule) }),
75
+ /* @__PURE__ */ jsxRuntime.jsx(PolicyBadge, { policy: rule.policy })
76
+ ] });
77
+ }
78
+ function PermissionStrategyFields({
79
+ value,
80
+ tools,
81
+ onChange
82
+ }) {
83
+ const inferredPreset = permissionStrategies.strategyPreset(value);
84
+ const [custom, setCustom] = react.useState(inferredPreset === "custom");
85
+ const preset = custom ? "custom" : inferredPreset;
86
+ const fields = permissionStrategies.activeMatchFields(value);
87
+ const available = permissionStrategies.MATCH_FIELDS.filter((field) => !fields.includes(field));
88
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
89
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-3 md:grid-cols-2", children: [
90
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-1 text-xs font-medium", children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Match preset" }),
92
+ /* @__PURE__ */ jsxRuntime.jsx(
93
+ Combobox.Combobox,
94
+ {
95
+ ariaLabel: "Match preset",
96
+ value: preset,
97
+ options: permissionStrategies.STRATEGY_PRESETS.map((option) => ({
98
+ value: option.value,
99
+ label: option.label,
100
+ description: option.description,
101
+ icon: /* @__PURE__ */ jsxRuntime.jsx(StrategyIcon, { preset: option.value, className: "size-4" })
102
+ })),
103
+ onChange: (nextValue) => {
104
+ const next = nextValue;
105
+ setCustom(next === "custom");
106
+ if (next === "custom") {
107
+ if (inferredPreset !== "custom") {
108
+ onChange({ group: "*", policy: value.policy });
109
+ }
110
+ return;
111
+ }
112
+ onChange(permissionStrategies.applyStrategyPreset(value, next));
113
+ },
114
+ allowCustomValue: false,
115
+ required: true
116
+ }
117
+ )
118
+ ] }),
119
+ /* @__PURE__ */ jsxRuntime.jsx(
120
+ PolicyControl,
121
+ {
122
+ value: value.policy,
123
+ onChange: (policy) => onChange({ ...value, policy })
124
+ }
125
+ )
126
+ ] }),
127
+ preset === "custom" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 rounded-lg border border-border bg-background p-3", children: [
128
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
129
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Match conditions" }),
130
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Every condition must match. Comma-separated patterns within one field are alternatives." })
131
+ ] }),
132
+ fields.map((field, index) => /* @__PURE__ */ jsxRuntime.jsx(
133
+ PermissionStrategyConditionRow.PermissionStrategyConditionRow,
134
+ {
135
+ rule: value,
136
+ field,
137
+ index,
138
+ tools,
139
+ onChange
140
+ },
141
+ `${field}-${index}`
142
+ )),
143
+ available.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "grid gap-1 text-xs font-medium sm:max-w-xs", children: [
144
+ "Add condition",
145
+ /* @__PURE__ */ jsxRuntime.jsx(
146
+ select.Select,
147
+ {
148
+ value: "",
149
+ placeholder: "Choose metadata…",
150
+ onChange: (event) => onChange(
151
+ permissionStrategies.addCondition(value, event.target.value)
152
+ ),
153
+ options: permissionStrategies.MATCH_FIELD_OPTIONS.filter(
154
+ (option) => available.includes(option.value)
155
+ ),
156
+ className: "border-dashed text-muted-foreground"
157
+ }
158
+ )
159
+ ] })
160
+ ] }) : null
161
+ ] });
162
+ }
163
+ function PolicyControl({
164
+ value,
165
+ onChange
166
+ }) {
167
+ const options = [
168
+ { id: "auto", label: "Auto", icon: UiSparkles.UiSparkles },
169
+ { id: "ask", label: "Ask", icon: UiQuestion.UiQuestion },
170
+ { id: "deny", label: "Off", icon: UiShieldSlash.UiShieldSlash },
171
+ { id: "allow", label: "On", icon: UiShield.UiShieldCheck }
172
+ ];
173
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-1 text-xs font-medium", children: [
174
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Policy" }),
175
+ /* @__PURE__ */ jsxRuntime.jsx(
176
+ "div",
177
+ {
178
+ "data-testid": "permission-policy-control",
179
+ "data-policy": value,
180
+ className: utils.cn("rounded-md border p-1", policyStyle(value)),
181
+ children: /* @__PURE__ */ jsxRuntime.jsx(
182
+ SegmentedControl.SegmentedControl,
183
+ {
184
+ "aria-label": "Policy",
185
+ value,
186
+ options,
187
+ onChange,
188
+ size: "sm",
189
+ className: "w-full justify-stretch"
190
+ }
191
+ )
192
+ }
193
+ )
194
+ ] });
195
+ }
196
+ function MatchCountBadge({
197
+ rule,
198
+ tools
199
+ }) {
200
+ const matches = permissionStrategies.matchingTools(rule, tools);
201
+ const label = `${matches.length} matching ${matches.length === 1 ? "operation" : "operations"}`;
202
+ return /* @__PURE__ */ jsxRuntime.jsxs(
203
+ HoverCard.HoverCard,
204
+ {
205
+ placement: "top",
206
+ cardClassName: "max-w-sm whitespace-normal p-3",
207
+ trigger: /* @__PURE__ */ jsxRuntime.jsxs(
208
+ "button",
209
+ {
210
+ type: "button",
211
+ "aria-label": label,
212
+ className: "inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/40 px-2.5 py-1 text-xs font-semibold text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
213
+ children: [
214
+ /* @__PURE__ */ jsxRuntime.jsx(UiListChecks.UiListChecks, { className: "size-3.5" }),
215
+ label
216
+ ]
217
+ }
218
+ ),
219
+ children: [
220
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-semibold text-foreground", children: label }),
221
+ matches.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap gap-1.5", children: matches.map((tool) => /* @__PURE__ */ jsxRuntime.jsx(
222
+ "span",
223
+ {
224
+ className: "rounded border border-border bg-muted/40 px-2 py-1 font-mono text-[11px] text-foreground",
225
+ children: tool.name
226
+ },
227
+ tool.name
228
+ )) }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "No catalog operation matches every condition." })
229
+ ]
230
+ }
231
+ );
232
+ }
233
+ function PolicyBadge({ policy }) {
234
+ return /* @__PURE__ */ jsxRuntime.jsxs(
235
+ "span",
236
+ {
237
+ "aria-label": `Policy: ${policyLabel(policy)}`,
238
+ className: utils.cn(
239
+ "flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-[10px] font-semibold",
240
+ policyStyle(policy)
241
+ ),
242
+ children: [
243
+ /* @__PURE__ */ jsxRuntime.jsx(PolicyIcon, { policy, className: "size-3" }),
244
+ policyLabel(policy)
245
+ ]
246
+ }
247
+ );
248
+ }
249
+ function StrategyIcon({
250
+ preset,
251
+ className
252
+ }) {
253
+ if (preset === "all") return /* @__PURE__ */ jsxRuntime.jsx(UiListChecks.UiListChecks, { className });
254
+ if (preset === "read-only") return /* @__PURE__ */ jsxRuntime.jsx(UiEye.UiEye, { className });
255
+ if (preset === "destructive")
256
+ return /* @__PURE__ */ jsxRuntime.jsx(UiWarningTriangle.UiWarningTriangle, { className });
257
+ if (preset === "idempotent") return /* @__PURE__ */ jsxRuntime.jsx(UiRepeat.UiRepeat, { className });
258
+ return /* @__PURE__ */ jsxRuntime.jsx(UiSliders.UiSliders, { className });
259
+ }
260
+ function PolicyIcon({
261
+ policy,
262
+ className
263
+ }) {
264
+ if (policy === "allow") return /* @__PURE__ */ jsxRuntime.jsx(UiShield.UiShieldCheck, { className });
265
+ if (policy === "deny") return /* @__PURE__ */ jsxRuntime.jsx(UiShieldSlash.UiShieldSlash, { className });
266
+ if (policy === "ask") return /* @__PURE__ */ jsxRuntime.jsx(UiQuestion.UiQuestion, { className });
267
+ return /* @__PURE__ */ jsxRuntime.jsx(UiSparkles.UiSparkles, { className });
268
+ }
269
+ function strategyLabel(rule) {
270
+ var _a, _b;
271
+ const preset = permissionStrategies.strategyPreset(rule);
272
+ if (preset !== "custom") {
273
+ return ((_a = permissionStrategies.STRATEGY_PRESETS.find((option) => option.value === preset)) == null ? void 0 : _a.label) ?? "All tools";
274
+ }
275
+ const fields = permissionStrategies.activeMatchFields(rule);
276
+ if (fields.length !== 1) {
277
+ return `Custom conditions · ${fields.length} conditions`;
278
+ }
279
+ const field = fields[0];
280
+ if (!field) return "Custom conditions";
281
+ const label = ((_b = permissionStrategies.MATCH_FIELD_OPTIONS.find((option) => option.value === field)) == null ? void 0 : _b.label) ?? field;
282
+ const value = permissionStrategies.conditionText(rule, field);
283
+ if (Array.isArray(rule[field])) {
284
+ return `Custom conditions · ${label} in ${rule[field].length} values`;
285
+ }
286
+ const displayValue = value === "true" ? "Yes" : value === "false" ? "No" : value;
287
+ return `Custom conditions · ${label} ${displayValue}`;
288
+ }
289
+ function policyLabel(policy) {
290
+ if (policy === "allow") return "On";
291
+ if (policy === "deny") return "Off";
292
+ if (policy === "ask") return "Ask";
293
+ return "Auto";
294
+ }
295
+ function strategyIconStyle(preset) {
296
+ if (preset === "read-only") return "bg-emerald-500/10 text-emerald-700";
297
+ if (preset === "destructive") return "bg-red-500/10 text-red-700";
298
+ if (preset === "idempotent") return "bg-sky-500/10 text-sky-700";
299
+ if (preset === "all") return "bg-violet-500/10 text-violet-700";
300
+ return "bg-muted text-muted-foreground";
301
+ }
302
+ function policyStyle(policy) {
303
+ if (policy === "allow") {
304
+ return "border-emerald-500/30 bg-emerald-500/10 text-emerald-700";
305
+ }
306
+ if (policy === "deny") return "border-red-500/30 bg-red-500/10 text-red-700";
307
+ if (policy === "ask") {
308
+ return "border-amber-500/30 bg-amber-500/10 text-amber-700";
309
+ }
310
+ return "border-violet-500/30 bg-violet-500/10 text-violet-700";
311
+ }
312
+ exports.PermissionStrategiesEditor = PermissionStrategiesEditor;
313
+ //# sourceMappingURL=PermissionStrategiesEditor.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionStrategiesEditor.cjs","sources":["../../../../src/data/ai/runtime-profiles/PermissionStrategiesEditor.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { AccordionList } from \"../../../components/AccordionList\";\nimport { Combobox } from \"../../../components/Combobox\";\nimport { Select } from \"../../../components/select\";\nimport {\n SegmentedControl,\n type SegmentedOption,\n} from \"../../../components/SegmentedControl\";\nimport {\n UiEye,\n UiListChecks,\n UiQuestion,\n UiRepeat,\n UiShieldCheck,\n UiShieldSlash,\n UiSliders,\n UiSparkles,\n UiWarningTriangle,\n} from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { HoverCard } from \"../../../overlay/HoverCard\";\nimport type { PermissionPolicy, PermissionRule } from \"../../chat/tool-policy\";\nimport type { ToolMeta, ToolPolicy } from \"../../chat/types\";\nimport {\n MATCH_FIELDS,\n MATCH_FIELD_OPTIONS,\n STRATEGY_PRESETS,\n activeMatchFields,\n addCondition,\n applyStrategyPreset,\n conditionText,\n matchingTools,\n strategyPreset,\n type MatchField,\n type StrategyPreset,\n} from \"../../../lib/permission-strategies\";\nimport { PermissionStrategyConditionRow } from \"./PermissionStrategyConditionRow\";\n\nexport function PermissionStrategiesEditor({\n value,\n tools,\n onChange,\n}: {\n value: PermissionPolicy;\n tools: ToolMeta[];\n onChange: (value: PermissionPolicy) => void;\n}) {\n return (\n <section className=\"space-y-2\">\n <div>\n <h3 className=\"text-sm font-semibold\">Permission strategies</h3>\n <p className=\"text-xs text-muted-foreground\">\n Match tool metadata and assign authority. Later rows win.\n </p>\n </div>\n <AccordionList\n items={value}\n onChange={onChange}\n allowDrag\n allowReorder\n allowDuplicate\n allowRemove\n cloneItem={(rule) => structuredClone(rule)}\n onCreate={(): PermissionRule => ({ name: \"*\", policy: \"ask\" })}\n addLabel=\"Add permission strategy\"\n addDescription=\"Start with a common match preset or define custom conditions.\"\n itemLabel={({ item, index }) =>\n `Permission strategy ${index + 1}: ${strategyLabel(item)}`\n }\n idPrefix=\"permission-strategy\"\n renderHeader={({ item }) => <StrategyHeader rule={item} />}\n renderMeta={({ item }) => <MatchCountBadge rule={item} tools={tools} />}\n renderBody={({ item, onChange: changeRule }) => (\n <PermissionStrategyFields\n value={item}\n tools={tools}\n onChange={changeRule}\n />\n )}\n />\n </section>\n );\n}\n\nfunction StrategyHeader({ rule }: { rule: PermissionRule }) {\n const preset = strategyPreset(rule);\n return (\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <span\n className={cn(\n \"flex size-7 shrink-0 items-center justify-center rounded-md\",\n strategyIconStyle(preset),\n )}\n >\n <StrategyIcon preset={preset} className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">\n {strategyLabel(rule)}\n </span>\n <PolicyBadge policy={rule.policy} />\n </div>\n );\n}\n\nfunction PermissionStrategyFields({\n value,\n tools,\n onChange,\n}: {\n value: PermissionRule;\n tools: ToolMeta[];\n onChange: (value: PermissionRule) => void;\n}) {\n const inferredPreset = strategyPreset(value);\n const [custom, setCustom] = useState(inferredPreset === \"custom\");\n const preset = custom ? \"custom\" : inferredPreset;\n const fields = activeMatchFields(value);\n const available = MATCH_FIELDS.filter((field) => !fields.includes(field));\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"grid gap-1 text-xs font-medium\">\n <span>Match preset</span>\n <Combobox\n ariaLabel=\"Match preset\"\n value={preset}\n options={STRATEGY_PRESETS.map((option) => ({\n value: option.value,\n label: option.label,\n description: option.description,\n icon: <StrategyIcon preset={option.value} className=\"size-4\" />,\n }))}\n onChange={(nextValue) => {\n const next = nextValue as StrategyPreset;\n setCustom(next === \"custom\");\n if (next === \"custom\") {\n if (inferredPreset !== \"custom\") {\n onChange({ group: \"*\", policy: value.policy });\n }\n return;\n }\n onChange(applyStrategyPreset(value, next));\n }}\n allowCustomValue={false}\n required\n />\n </div>\n <PolicyControl\n value={value.policy}\n onChange={(policy) => onChange({ ...value, policy })}\n />\n </div>\n\n {preset === \"custom\" ? (\n <div className=\"space-y-2 rounded-lg border border-border bg-background p-3\">\n <div>\n <h4 className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Match conditions\n </h4>\n <p className=\"text-xs text-muted-foreground\">\n Every condition must match. Comma-separated patterns within one\n field are alternatives.\n </p>\n </div>\n {fields.map((field, index) => (\n <PermissionStrategyConditionRow\n key={`${field}-${index}`}\n rule={value}\n field={field}\n index={index}\n tools={tools}\n onChange={onChange}\n />\n ))}\n {available.length > 0 && (\n <label className=\"grid gap-1 text-xs font-medium sm:max-w-xs\">\n Add condition\n <Select\n value=\"\"\n placeholder=\"Choose metadata…\"\n onChange={(event) =>\n onChange(\n addCondition(value, event.target.value as MatchField),\n )\n }\n options={MATCH_FIELD_OPTIONS.filter((option) =>\n available.includes(option.value),\n )}\n className=\"border-dashed text-muted-foreground\"\n />\n </label>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction PolicyControl({\n value,\n onChange,\n}: {\n value: ToolPolicy;\n onChange: (value: ToolPolicy) => void;\n}) {\n const options: SegmentedOption<ToolPolicy>[] = [\n { id: \"auto\", label: \"Auto\", icon: UiSparkles },\n { id: \"ask\", label: \"Ask\", icon: UiQuestion },\n { id: \"deny\", label: \"Off\", icon: UiShieldSlash },\n { id: \"allow\", label: \"On\", icon: UiShieldCheck },\n ];\n return (\n <div className=\"grid gap-1 text-xs font-medium\">\n <span>Policy</span>\n <div\n data-testid=\"permission-policy-control\"\n data-policy={value}\n className={cn(\"rounded-md border p-1\", policyStyle(value))}\n >\n <SegmentedControl\n aria-label=\"Policy\"\n value={value}\n options={options}\n onChange={onChange}\n size=\"sm\"\n className=\"w-full justify-stretch\"\n />\n </div>\n </div>\n );\n}\n\nfunction MatchCountBadge({\n rule,\n tools,\n}: {\n rule: PermissionRule;\n tools: ToolMeta[];\n}) {\n const matches = matchingTools(rule, tools);\n const label = `${matches.length} matching ${\n matches.length === 1 ? \"operation\" : \"operations\"\n }`;\n return (\n <HoverCard\n placement=\"top\"\n cardClassName=\"max-w-sm whitespace-normal p-3\"\n trigger={\n <button\n type=\"button\"\n aria-label={label}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/40 px-2.5 py-1 text-xs font-semibold text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <UiListChecks className=\"size-3.5\" />\n {label}\n </button>\n }\n >\n <div className=\"text-xs font-semibold text-foreground\">{label}</div>\n {matches.length > 0 ? (\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {matches.map((tool) => (\n <span\n key={tool.name}\n className=\"rounded border border-border bg-muted/40 px-2 py-1 font-mono text-[11px] text-foreground\"\n >\n {tool.name}\n </span>\n ))}\n </div>\n ) : (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n No catalog operation matches every condition.\n </p>\n )}\n </HoverCard>\n );\n}\n\nfunction PolicyBadge({ policy }: { policy: ToolPolicy }) {\n return (\n <span\n aria-label={`Policy: ${policyLabel(policy)}`}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-[10px] font-semibold\",\n policyStyle(policy),\n )}\n >\n <PolicyIcon policy={policy} className=\"size-3\" />\n {policyLabel(policy)}\n </span>\n );\n}\n\nfunction StrategyIcon({\n preset,\n className,\n}: {\n preset: StrategyPreset;\n className?: string;\n}) {\n if (preset === \"all\") return <UiListChecks className={className} />;\n if (preset === \"read-only\") return <UiEye className={className} />;\n if (preset === \"destructive\")\n return <UiWarningTriangle className={className} />;\n if (preset === \"idempotent\") return <UiRepeat className={className} />;\n return <UiSliders className={className} />;\n}\n\nfunction PolicyIcon({\n policy,\n className,\n}: {\n policy: ToolPolicy;\n className?: string;\n}) {\n if (policy === \"allow\") return <UiShieldCheck className={className} />;\n if (policy === \"deny\") return <UiShieldSlash className={className} />;\n if (policy === \"ask\") return <UiQuestion className={className} />;\n return <UiSparkles className={className} />;\n}\n\nfunction strategyLabel(rule: PermissionRule): string {\n const preset = strategyPreset(rule);\n if (preset !== \"custom\") {\n return (\n STRATEGY_PRESETS.find((option) => option.value === preset)?.label ??\n \"All tools\"\n );\n }\n const fields = activeMatchFields(rule);\n if (fields.length !== 1) {\n return `Custom conditions · ${fields.length} conditions`;\n }\n const field = fields[0];\n if (!field) return \"Custom conditions\";\n const label =\n MATCH_FIELD_OPTIONS.find((option) => option.value === field)?.label ??\n field;\n const value = conditionText(rule, field);\n if (Array.isArray(rule[field])) {\n return `Custom conditions · ${label} in ${rule[field].length} values`;\n }\n const displayValue =\n value === \"true\" ? \"Yes\" : value === \"false\" ? \"No\" : value;\n return `Custom conditions · ${label} ${displayValue}`;\n}\n\nfunction policyLabel(policy: ToolPolicy): string {\n if (policy === \"allow\") return \"On\";\n if (policy === \"deny\") return \"Off\";\n if (policy === \"ask\") return \"Ask\";\n return \"Auto\";\n}\n\nfunction strategyIconStyle(preset: StrategyPreset): string {\n if (preset === \"read-only\") return \"bg-emerald-500/10 text-emerald-700\";\n if (preset === \"destructive\") return \"bg-red-500/10 text-red-700\";\n if (preset === \"idempotent\") return \"bg-sky-500/10 text-sky-700\";\n if (preset === \"all\") return \"bg-violet-500/10 text-violet-700\";\n return \"bg-muted text-muted-foreground\";\n}\n\nfunction policyStyle(policy: ToolPolicy): string {\n if (policy === \"allow\") {\n return \"border-emerald-500/30 bg-emerald-500/10 text-emerald-700\";\n }\n if (policy === \"deny\") return \"border-red-500/30 bg-red-500/10 text-red-700\";\n if (policy === \"ask\") {\n return \"border-amber-500/30 bg-amber-500/10 text-amber-700\";\n }\n return \"border-violet-500/30 bg-violet-500/10 text-violet-700\";\n}\n"],"names":["jsxs","jsx","AccordionList","strategyPreset","cn","useState","activeMatchFields","MATCH_FIELDS","Combobox","STRATEGY_PRESETS","applyStrategyPreset","PermissionStrategyConditionRow","Select","addCondition","MATCH_FIELD_OPTIONS","UiSparkles","UiQuestion","UiShieldSlash","UiShieldCheck","SegmentedControl","matchingTools","HoverCard","UiListChecks","UiEye","UiWarningTriangle","UiRepeat","UiSliders","conditionText"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { PermissionPolicy } from '../../chat/tool-policy';
2
+ import { ToolMeta } from '../../chat/types';
3
+ export declare function PermissionStrategiesEditor({ value, tools, onChange, }: {
4
+ value: PermissionPolicy;
5
+ tools: ToolMeta[];
6
+ onChange: (value: PermissionPolicy) => void;
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=PermissionStrategiesEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionStrategiesEditor.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/runtime-profiles/PermissionStrategiesEditor.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,kBAAkB,CAAC;AAgB7D,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC7C,+BAoCA"}