@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,35 @@
1
+ import { MatchPatterns, PermissionRule } from '../data/chat/tool-policy';
2
+ import { ToolMeta } from '../data/chat/types';
3
+ export declare const PATTERN_FIELDS: readonly ["name", "group", "parent", "entity", "action", "verb", "method", "scope"];
4
+ export declare const HINT_FIELDS: readonly ["readOnly", "destructive", "idempotent"];
5
+ export declare const MATCH_FIELDS: readonly ["name", "group", "parent", "entity", "action", "verb", "method", "scope", "readOnly", "destructive", "idempotent"];
6
+ export type MatchField = (typeof MATCH_FIELDS)[number];
7
+ export type StrategyPreset = "all" | "read-only" | "destructive" | "idempotent" | "custom";
8
+ export declare const STRATEGY_PRESETS: Array<{
9
+ value: StrategyPreset;
10
+ label: string;
11
+ description: string;
12
+ }>;
13
+ export declare const MATCH_FIELD_OPTIONS: Array<{
14
+ value: MatchField;
15
+ label: string;
16
+ }>;
17
+ export declare function strategyPreset(rule: PermissionRule): StrategyPreset;
18
+ export declare function applyStrategyPreset(rule: PermissionRule, preset: Exclude<StrategyPreset, "custom">): PermissionRule;
19
+ export declare function activeMatchFields(rule: PermissionRule): MatchField[];
20
+ export declare function patternsText(value: MatchPatterns | undefined): string;
21
+ export declare function patternValues(value: MatchPatterns | undefined): string[];
22
+ export declare function updatePatternCondition({ rule, field, value, }: {
23
+ rule: PermissionRule;
24
+ field: (typeof PATTERN_FIELDS)[number];
25
+ value: MatchPatterns;
26
+ }): PermissionRule;
27
+ export declare function conditionText(rule: PermissionRule, field: MatchField): string;
28
+ export declare function replaceMatchField(rule: PermissionRule, current: MatchField, next: MatchField): PermissionRule;
29
+ export declare function updateCondition(rule: PermissionRule, field: MatchField, value: string): PermissionRule;
30
+ export declare function removeCondition(rule: PermissionRule, field: MatchField): PermissionRule;
31
+ export declare function addCondition(rule: PermissionRule, field: MatchField): PermissionRule;
32
+ export declare function isHintField(field: MatchField): field is (typeof HINT_FIELDS)[number];
33
+ export declare function matchingTools(rule: PermissionRule, tools: ToolMeta[]): ToolMeta[];
34
+ export declare function toolFieldSuggestions(tools: ToolMeta[], field: Exclude<MatchField, (typeof HINT_FIELDS)[number]>): string[];
35
+ //# sourceMappingURL=permission-strategies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-strategies.d.ts","sourceRoot":"","sources":["../../src/lib/permission-strategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,eAAO,MAAM,cAAc,qFASjB,CAAC;AACX,eAAO,MAAM,WAAW,oDAAqD,CAAC;AAC9E,eAAO,MAAM,YAAY,8HAA+C,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,WAAW,GACX,aAAa,GACb,YAAY,GACZ,QAAQ,CAAC;AAEb,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC;IACnC,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CA0BA,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAazE,CAAC;AAEJ,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAYnE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,GACxC,cAAc,CAMhB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,EAAE,CAEpE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAErE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,EAAE,CAExE;AAED,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,KAAK,EACL,KAAK,GACN,EAAE;IACD,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,EAAE,aAAa,CAAC;CACtB,GAAG,cAAc,CAEjB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAG7E;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,UAAU,GACf,cAAc,CAahB;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,GACZ,cAAc,CAUhB;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,UAAU,GAChB,cAAc,CAKhB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,UAAU,GAChB,cAAc,CAGhB;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,GAChB,KAAK,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAEvC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,cAEpE;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,YAQzD"}
@@ -0,0 +1,155 @@
1
+ import { matchesTool } from "../data/chat/tool-policy.js";
2
+ const PATTERN_FIELDS = [
3
+ "name",
4
+ "group",
5
+ "parent",
6
+ "entity",
7
+ "action",
8
+ "verb",
9
+ "method",
10
+ "scope"
11
+ ];
12
+ const HINT_FIELDS = ["readOnly", "destructive", "idempotent"];
13
+ const MATCH_FIELDS = [...PATTERN_FIELDS, ...HINT_FIELDS];
14
+ const STRATEGY_PRESETS = [
15
+ {
16
+ value: "all",
17
+ label: "All tools",
18
+ description: "Match every tool in the catalog."
19
+ },
20
+ {
21
+ value: "read-only",
22
+ label: "Read-only tools",
23
+ description: "Match tools explicitly marked read-only."
24
+ },
25
+ {
26
+ value: "destructive",
27
+ label: "Destructive tools",
28
+ description: "Match tools explicitly marked destructive."
29
+ },
30
+ {
31
+ value: "idempotent",
32
+ label: "Idempotent tools",
33
+ description: "Match tools safe to repeat."
34
+ },
35
+ {
36
+ value: "custom",
37
+ label: "Custom conditions",
38
+ description: "Combine tool metadata and safety annotations."
39
+ }
40
+ ];
41
+ const MATCH_FIELD_OPTIONS = [
42
+ { value: "name", label: "Tool name" },
43
+ { value: "group", label: "Group" },
44
+ { value: "parent", label: "Parent" },
45
+ { value: "entity", label: "Entity" },
46
+ { value: "action", label: "Action" },
47
+ { value: "verb", label: "Verb" },
48
+ { value: "method", label: "HTTP method" },
49
+ { value: "scope", label: "Scope" },
50
+ { value: "readOnly", label: "Read only" },
51
+ { value: "destructive", label: "Destructive" },
52
+ { value: "idempotent", label: "Idempotent" }
53
+ ];
54
+ function strategyPreset(rule) {
55
+ const fields = activeMatchFields(rule);
56
+ if (fields.length !== 1) return "custom";
57
+ if (fields[0] === "name" && patternsText(rule.name) === "*") return "all";
58
+ if (fields[0] === "readOnly" && rule.readOnly === true) return "read-only";
59
+ if (fields[0] === "destructive" && rule.destructive === true) {
60
+ return "destructive";
61
+ }
62
+ if (fields[0] === "idempotent" && rule.idempotent === true) {
63
+ return "idempotent";
64
+ }
65
+ return "custom";
66
+ }
67
+ function applyStrategyPreset(rule, preset) {
68
+ if (preset === "all") return { name: "*", policy: rule.policy };
69
+ if (preset === "read-only") return { readOnly: true, policy: rule.policy };
70
+ if (preset === "destructive")
71
+ return { destructive: true, policy: rule.policy };
72
+ return { idempotent: true, policy: rule.policy };
73
+ }
74
+ function activeMatchFields(rule) {
75
+ return MATCH_FIELDS.filter((field) => rule[field] !== void 0);
76
+ }
77
+ function patternsText(value) {
78
+ return typeof value === "string" ? value : (value ?? []).join(", ");
79
+ }
80
+ function patternValues(value) {
81
+ return typeof value === "string" ? value ? [value] : [] : value ?? [];
82
+ }
83
+ function updatePatternCondition({
84
+ rule,
85
+ field,
86
+ value
87
+ }) {
88
+ return { ...rule, [field]: value };
89
+ }
90
+ function conditionText(rule, field) {
91
+ if (isHintField(field)) return String(rule[field]);
92
+ return patternsText(rule[field]);
93
+ }
94
+ function replaceMatchField(rule, current, next) {
95
+ if (current === next) return rule;
96
+ const match = { ...rule };
97
+ const previous = match[current];
98
+ delete match[current];
99
+ match[next] = isHintField(next) ? typeof previous === "boolean" ? previous : true : typeof previous === "string" || Array.isArray(previous) ? previous : "*";
100
+ return match;
101
+ }
102
+ function updateCondition(rule, field, value) {
103
+ if (isHintField(field)) return { ...rule, [field]: value === "true" };
104
+ const patterns = value.split(",").map((item) => item.trim()).filter(Boolean);
105
+ return {
106
+ ...rule,
107
+ [field]: patterns.length <= 1 ? patterns[0] ?? "" : patterns
108
+ };
109
+ }
110
+ function removeCondition(rule, field) {
111
+ const next = { ...rule };
112
+ delete next[field];
113
+ if (activeMatchFields(next).length === 0) next.name = "*";
114
+ return next;
115
+ }
116
+ function addCondition(rule, field) {
117
+ if (rule[field] !== void 0) return rule;
118
+ return { ...rule, [field]: isHintField(field) ? true : "*" };
119
+ }
120
+ function isHintField(field) {
121
+ return HINT_FIELDS.includes(field);
122
+ }
123
+ function matchingTools(rule, tools) {
124
+ return tools.filter((tool) => matchesTool(rule, tool));
125
+ }
126
+ function toolFieldSuggestions(tools, field) {
127
+ const values = /* @__PURE__ */ new Set();
128
+ for (const tool of tools) {
129
+ const value = tool[field === "name" ? "name" : field];
130
+ if (typeof value === "string" && value.trim()) values.add(value);
131
+ }
132
+ return Array.from(values).sort((left, right) => left.localeCompare(right));
133
+ }
134
+ export {
135
+ HINT_FIELDS,
136
+ MATCH_FIELDS,
137
+ MATCH_FIELD_OPTIONS,
138
+ PATTERN_FIELDS,
139
+ STRATEGY_PRESETS,
140
+ activeMatchFields,
141
+ addCondition,
142
+ applyStrategyPreset,
143
+ conditionText,
144
+ isHintField,
145
+ matchingTools,
146
+ patternValues,
147
+ patternsText,
148
+ removeCondition,
149
+ replaceMatchField,
150
+ strategyPreset,
151
+ toolFieldSuggestions,
152
+ updateCondition,
153
+ updatePatternCondition
154
+ };
155
+ //# sourceMappingURL=permission-strategies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-strategies.js","sources":["../../src/lib/permission-strategies.ts"],"sourcesContent":["import {\n matchesTool,\n type MatchPatterns,\n type PermissionRule,\n} from \"../data/chat/tool-policy\";\nimport type { ToolMeta } from \"../data/chat/types\";\n\nexport const PATTERN_FIELDS = [\n \"name\",\n \"group\",\n \"parent\",\n \"entity\",\n \"action\",\n \"verb\",\n \"method\",\n \"scope\",\n] as const;\nexport const HINT_FIELDS = [\"readOnly\", \"destructive\", \"idempotent\"] as const;\nexport const MATCH_FIELDS = [...PATTERN_FIELDS, ...HINT_FIELDS] as const;\n\nexport type MatchField = (typeof MATCH_FIELDS)[number];\nexport type StrategyPreset =\n | \"all\"\n | \"read-only\"\n | \"destructive\"\n | \"idempotent\"\n | \"custom\";\n\nexport const STRATEGY_PRESETS: Array<{\n value: StrategyPreset;\n label: string;\n description: string;\n}> = [\n {\n value: \"all\",\n label: \"All tools\",\n description: \"Match every tool in the catalog.\",\n },\n {\n value: \"read-only\",\n label: \"Read-only tools\",\n description: \"Match tools explicitly marked read-only.\",\n },\n {\n value: \"destructive\",\n label: \"Destructive tools\",\n description: \"Match tools explicitly marked destructive.\",\n },\n {\n value: \"idempotent\",\n label: \"Idempotent tools\",\n description: \"Match tools safe to repeat.\",\n },\n {\n value: \"custom\",\n label: \"Custom conditions\",\n description: \"Combine tool metadata and safety annotations.\",\n },\n];\n\nexport const MATCH_FIELD_OPTIONS: Array<{ value: MatchField; label: string }> =\n [\n { value: \"name\", label: \"Tool name\" },\n { value: \"group\", label: \"Group\" },\n { value: \"parent\", label: \"Parent\" },\n { value: \"entity\", label: \"Entity\" },\n { value: \"action\", label: \"Action\" },\n { value: \"verb\", label: \"Verb\" },\n { value: \"method\", label: \"HTTP method\" },\n { value: \"scope\", label: \"Scope\" },\n { value: \"readOnly\", label: \"Read only\" },\n { value: \"destructive\", label: \"Destructive\" },\n { value: \"idempotent\", label: \"Idempotent\" },\n ];\n\nexport function strategyPreset(rule: PermissionRule): StrategyPreset {\n const fields = activeMatchFields(rule);\n if (fields.length !== 1) return \"custom\";\n if (fields[0] === \"name\" && patternsText(rule.name) === \"*\") return \"all\";\n if (fields[0] === \"readOnly\" && rule.readOnly === true) return \"read-only\";\n if (fields[0] === \"destructive\" && rule.destructive === true) {\n return \"destructive\";\n }\n if (fields[0] === \"idempotent\" && rule.idempotent === true) {\n return \"idempotent\";\n }\n return \"custom\";\n}\n\nexport function applyStrategyPreset(\n rule: PermissionRule,\n preset: Exclude<StrategyPreset, \"custom\">,\n): PermissionRule {\n if (preset === \"all\") return { name: \"*\", policy: rule.policy };\n if (preset === \"read-only\") return { readOnly: true, policy: rule.policy };\n if (preset === \"destructive\")\n return { destructive: true, policy: rule.policy };\n return { idempotent: true, policy: rule.policy };\n}\n\nexport function activeMatchFields(rule: PermissionRule): MatchField[] {\n return MATCH_FIELDS.filter((field) => rule[field] !== undefined);\n}\n\nexport function patternsText(value: MatchPatterns | undefined): string {\n return typeof value === \"string\" ? value : (value ?? []).join(\", \");\n}\n\nexport function patternValues(value: MatchPatterns | undefined): string[] {\n return typeof value === \"string\" ? (value ? [value] : []) : (value ?? []);\n}\n\nexport function updatePatternCondition({\n rule,\n field,\n value,\n}: {\n rule: PermissionRule;\n field: (typeof PATTERN_FIELDS)[number];\n value: MatchPatterns;\n}): PermissionRule {\n return { ...rule, [field]: value };\n}\n\nexport function conditionText(rule: PermissionRule, field: MatchField): string {\n if (isHintField(field)) return String(rule[field]);\n return patternsText(rule[field]);\n}\n\nexport function replaceMatchField(\n rule: PermissionRule,\n current: MatchField,\n next: MatchField,\n): PermissionRule {\n if (current === next) return rule;\n const match = { ...rule } as Record<string, unknown>;\n const previous = match[current];\n delete match[current];\n match[next] = isHintField(next)\n ? typeof previous === \"boolean\"\n ? previous\n : true\n : typeof previous === \"string\" || Array.isArray(previous)\n ? previous\n : \"*\";\n return match as PermissionRule;\n}\n\nexport function updateCondition(\n rule: PermissionRule,\n field: MatchField,\n value: string,\n): PermissionRule {\n if (isHintField(field)) return { ...rule, [field]: value === \"true\" };\n const patterns = value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n return {\n ...rule,\n [field]: patterns.length <= 1 ? (patterns[0] ?? \"\") : patterns,\n };\n}\n\nexport function removeCondition(\n rule: PermissionRule,\n field: MatchField,\n): PermissionRule {\n const next = { ...rule } as Record<string, unknown>;\n delete next[field];\n if (activeMatchFields(next as PermissionRule).length === 0) next.name = \"*\";\n return next as PermissionRule;\n}\n\nexport function addCondition(\n rule: PermissionRule,\n field: MatchField,\n): PermissionRule {\n if (rule[field] !== undefined) return rule;\n return { ...rule, [field]: isHintField(field) ? true : \"*\" };\n}\n\nexport function isHintField(\n field: MatchField,\n): field is (typeof HINT_FIELDS)[number] {\n return (HINT_FIELDS as readonly MatchField[]).includes(field);\n}\n\nexport function matchingTools(rule: PermissionRule, tools: ToolMeta[]) {\n return tools.filter((tool) => matchesTool(rule, tool));\n}\n\nexport function toolFieldSuggestions(\n tools: ToolMeta[],\n field: Exclude<MatchField, (typeof HINT_FIELDS)[number]>,\n) {\n const values = new Set<string>();\n for (const tool of tools) {\n const value = tool[field === \"name\" ? \"name\" : field];\n if (typeof value === \"string\" && value.trim()) values.add(value);\n }\n return Array.from(values).sort((left, right) => left.localeCompare(right));\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const SPEC_RUNTIME_MODES = ["api", "agent", "cli", "cmux"];
4
+ const RUNTIME_MODES = new Set(SPEC_RUNTIME_MODES);
5
+ function isSpecRuntimeMode(value) {
6
+ return RUNTIME_MODES.has(value ?? "");
7
+ }
8
+ function runtimeModeFromModel(model) {
9
+ const [prefix] = (model ?? "").trim().toLowerCase().split(":");
10
+ return isSpecRuntimeMode(prefix) ? prefix : void 0;
11
+ }
12
+ function familyForModel(families, models, modelId) {
13
+ var _a;
14
+ if (!modelId) return void 0;
15
+ const selected = models.find(
16
+ (model) => {
17
+ var _a2, _b;
18
+ return model.id === modelId || ((_a2 = model.runtime) == null ? void 0 : _a2.model) === modelId || ((_b = model.runtime) == null ? void 0 : _b.id) === modelId;
19
+ }
20
+ );
21
+ const compact = ((_a = modelId.split(",")[0]) == null ? void 0 : _a.trim()) ?? "";
22
+ const [prefix, inlineModel] = compact.split(":");
23
+ const canonicalModel = RUNTIME_MODES.has((prefix == null ? void 0 : prefix.toLowerCase()) ?? "") && inlineModel ? inlineModel : compact;
24
+ const slash = canonicalModel.indexOf("/");
25
+ const provider = (selected == null ? void 0 : selected.provider) ?? (slash > 0 ? canonicalModel.slice(0, slash) : void 0);
26
+ if (!provider) return void 0;
27
+ return families.find(
28
+ (family) => family.provider === provider || family.catalogPrefix === provider || family.modes.some((mode) => mode.provider === provider)
29
+ );
30
+ }
31
+ function modeOptionFor(families, mode, preferredFamily) {
32
+ const target = (mode ?? "").toLowerCase();
33
+ if (!target) return void 0;
34
+ const ordered = preferredFamily ? [
35
+ ...families.filter((family) => family.id === preferredFamily),
36
+ ...families.filter((family) => family.id !== preferredFamily)
37
+ ] : families;
38
+ for (const family of ordered) {
39
+ const entry = family.modes.find(
40
+ (candidate) => candidate.id.toLowerCase() === target
41
+ );
42
+ if (entry) return entry;
43
+ }
44
+ return void 0;
45
+ }
46
+ exports.SPEC_RUNTIME_MODES = SPEC_RUNTIME_MODES;
47
+ exports.familyForModel = familyForModel;
48
+ exports.isSpecRuntimeMode = isSpecRuntimeMode;
49
+ exports.modeOptionFor = modeOptionFor;
50
+ exports.runtimeModeFromModel = runtimeModeFromModel;
51
+ //# sourceMappingURL=runtime-family.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-family.cjs","sources":["../../src/lib/runtime-family.ts"],"sourcesContent":["type RuntimeModelIdentity = {\n id: string;\n provider: string;\n runtime?: { id?: string; model?: string } | undefined;\n};\n\ntype RuntimeFamilyIdentity = {\n id: string;\n provider: string;\n catalogPrefix?: string | undefined;\n modes: Array<{ id: string; provider?: string | undefined }>;\n};\n\nexport const SPEC_RUNTIME_MODES = [\"api\", \"agent\", \"cli\", \"cmux\"] as const;\nexport type SpecRuntimeMode = (typeof SPEC_RUNTIME_MODES)[number];\nconst RUNTIME_MODES = new Set<string>(SPEC_RUNTIME_MODES);\n\nexport function isSpecRuntimeMode(\n value: string | undefined,\n): value is SpecRuntimeMode {\n return RUNTIME_MODES.has(value ?? \"\");\n}\n\nexport function runtimeModeFromModel(\n model: string | undefined,\n): SpecRuntimeMode | undefined {\n const [prefix] = (model ?? \"\").trim().toLowerCase().split(\":\");\n return isSpecRuntimeMode(prefix) ? prefix : undefined;\n}\n\nexport function familyForModel<T extends RuntimeFamilyIdentity>(\n families: T[],\n models: RuntimeModelIdentity[],\n modelId: string | undefined,\n): T | undefined {\n if (!modelId) return undefined;\n const selected = models.find(\n (model) =>\n model.id === modelId ||\n model.runtime?.model === modelId ||\n model.runtime?.id === modelId,\n );\n const compact = modelId.split(\",\")[0]?.trim() ?? \"\";\n const [prefix, inlineModel] = compact.split(\":\");\n const canonicalModel =\n RUNTIME_MODES.has(prefix?.toLowerCase() ?? \"\") && inlineModel\n ? inlineModel\n : compact;\n const slash = canonicalModel.indexOf(\"/\");\n const provider =\n selected?.provider ??\n (slash > 0 ? canonicalModel.slice(0, slash) : undefined);\n if (!provider) return undefined;\n return families.find(\n (family) =>\n family.provider === provider ||\n family.catalogPrefix === provider ||\n family.modes.some((mode) => mode.provider === provider),\n );\n}\n\nexport function modeOptionFor<T extends RuntimeFamilyIdentity>(\n families: T[],\n mode: string | undefined,\n preferredFamily?: string | undefined,\n): T[\"modes\"][number] | undefined {\n const target = (mode ?? \"\").toLowerCase();\n if (!target) return undefined;\n const ordered = preferredFamily\n ? [\n ...families.filter((family) => family.id === preferredFamily),\n ...families.filter((family) => family.id !== preferredFamily),\n ]\n : families;\n for (const family of ordered) {\n const entry = family.modes.find(\n (candidate) => candidate.id.toLowerCase() === target,\n );\n if (entry) return entry;\n }\n return undefined;\n}\n"],"names":["_a"],"mappings":";;AAaO,MAAM,qBAAqB,CAAC,OAAO,SAAS,OAAO,MAAM;AAEhE,MAAM,gBAAgB,IAAI,IAAY,kBAAkB;AAEjD,SAAS,kBACd,OAC0B;AAC1B,SAAO,cAAc,IAAI,SAAS,EAAE;AACtC;AAEO,SAAS,qBACd,OAC6B;AAC7B,QAAM,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,YAAA,EAAc,MAAM,GAAG;AAC7D,SAAO,kBAAkB,MAAM,IAAI,SAAS;AAC9C;AAEO,SAAS,eACd,UACA,QACA,SACe;;AACf,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,WAAW,OAAO;AAAA,IACtB,CAAC,UAAA;;AACC,mBAAM,OAAO,aACbA,MAAA,MAAM,YAAN,gBAAAA,IAAe,WAAU,aACzB,WAAM,YAAN,mBAAe,QAAO;AAAA;AAAA,EAAA;AAE1B,QAAM,YAAU,aAAQ,MAAM,GAAG,EAAE,CAAC,MAApB,mBAAuB,WAAU;AACjD,QAAM,CAAC,QAAQ,WAAW,IAAI,QAAQ,MAAM,GAAG;AAC/C,QAAM,iBACJ,cAAc,KAAI,iCAAQ,kBAAiB,EAAE,KAAK,cAC9C,cACA;AACN,QAAM,QAAQ,eAAe,QAAQ,GAAG;AACxC,QAAM,YACJ,qCAAU,cACT,QAAQ,IAAI,eAAe,MAAM,GAAG,KAAK,IAAI;AAChD,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAAS;AAAA,IACd,CAAC,WACC,OAAO,aAAa,YACpB,OAAO,kBAAkB,YACzB,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,aAAa,QAAQ;AAAA,EAAA;AAE5D;AAEO,SAAS,cACd,UACA,MACA,iBACgC;AAChC,QAAM,UAAU,QAAQ,IAAI,YAAA;AAC5B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAU,kBACZ;AAAA,IACE,GAAG,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,eAAe;AAAA,IAC5D,GAAG,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,eAAe;AAAA,EAAA,IAE9D;AACJ,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAQ,OAAO,MAAM;AAAA,MACzB,CAAC,cAAc,UAAU,GAAG,kBAAkB;AAAA,IAAA;AAEhD,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;;;;;;"}
@@ -0,0 +1,25 @@
1
+ type RuntimeModelIdentity = {
2
+ id: string;
3
+ provider: string;
4
+ runtime?: {
5
+ id?: string;
6
+ model?: string;
7
+ } | undefined;
8
+ };
9
+ type RuntimeFamilyIdentity = {
10
+ id: string;
11
+ provider: string;
12
+ catalogPrefix?: string | undefined;
13
+ modes: Array<{
14
+ id: string;
15
+ provider?: string | undefined;
16
+ }>;
17
+ };
18
+ export declare const SPEC_RUNTIME_MODES: readonly ["api", "agent", "cli", "cmux"];
19
+ export type SpecRuntimeMode = (typeof SPEC_RUNTIME_MODES)[number];
20
+ export declare function isSpecRuntimeMode(value: string | undefined): value is SpecRuntimeMode;
21
+ export declare function runtimeModeFromModel(model: string | undefined): SpecRuntimeMode | undefined;
22
+ export declare function familyForModel<T extends RuntimeFamilyIdentity>(families: T[], models: RuntimeModelIdentity[], modelId: string | undefined): T | undefined;
23
+ export declare function modeOptionFor<T extends RuntimeFamilyIdentity>(families: T[], mode: string | undefined, preferredFamily?: string | undefined): T["modes"][number] | undefined;
24
+ export {};
25
+ //# sourceMappingURL=runtime-family.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-family.d.ts","sourceRoot":"","sources":["../../src/lib/runtime-family.ts"],"names":[],"mappings":"AAAA,KAAK,oBAAoB,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACvD,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CAC7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,0CAA2C,CAAC;AAC3E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGlE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,KAAK,IAAI,eAAe,CAE1B;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,qBAAqB,EAC5D,QAAQ,EAAE,CAAC,EAAE,EACb,MAAM,EAAE,oBAAoB,EAAE,EAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,CAAC,GAAG,SAAS,CAyBf;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,qBAAqB,EAC3D,QAAQ,EAAE,CAAC,EAAE,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,GACnC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAgBhC"}
@@ -0,0 +1,51 @@
1
+ const SPEC_RUNTIME_MODES = ["api", "agent", "cli", "cmux"];
2
+ const RUNTIME_MODES = new Set(SPEC_RUNTIME_MODES);
3
+ function isSpecRuntimeMode(value) {
4
+ return RUNTIME_MODES.has(value ?? "");
5
+ }
6
+ function runtimeModeFromModel(model) {
7
+ const [prefix] = (model ?? "").trim().toLowerCase().split(":");
8
+ return isSpecRuntimeMode(prefix) ? prefix : void 0;
9
+ }
10
+ function familyForModel(families, models, modelId) {
11
+ var _a;
12
+ if (!modelId) return void 0;
13
+ const selected = models.find(
14
+ (model) => {
15
+ var _a2, _b;
16
+ return model.id === modelId || ((_a2 = model.runtime) == null ? void 0 : _a2.model) === modelId || ((_b = model.runtime) == null ? void 0 : _b.id) === modelId;
17
+ }
18
+ );
19
+ const compact = ((_a = modelId.split(",")[0]) == null ? void 0 : _a.trim()) ?? "";
20
+ const [prefix, inlineModel] = compact.split(":");
21
+ const canonicalModel = RUNTIME_MODES.has((prefix == null ? void 0 : prefix.toLowerCase()) ?? "") && inlineModel ? inlineModel : compact;
22
+ const slash = canonicalModel.indexOf("/");
23
+ const provider = (selected == null ? void 0 : selected.provider) ?? (slash > 0 ? canonicalModel.slice(0, slash) : void 0);
24
+ if (!provider) return void 0;
25
+ return families.find(
26
+ (family) => family.provider === provider || family.catalogPrefix === provider || family.modes.some((mode) => mode.provider === provider)
27
+ );
28
+ }
29
+ function modeOptionFor(families, mode, preferredFamily) {
30
+ const target = (mode ?? "").toLowerCase();
31
+ if (!target) return void 0;
32
+ const ordered = preferredFamily ? [
33
+ ...families.filter((family) => family.id === preferredFamily),
34
+ ...families.filter((family) => family.id !== preferredFamily)
35
+ ] : families;
36
+ for (const family of ordered) {
37
+ const entry = family.modes.find(
38
+ (candidate) => candidate.id.toLowerCase() === target
39
+ );
40
+ if (entry) return entry;
41
+ }
42
+ return void 0;
43
+ }
44
+ export {
45
+ SPEC_RUNTIME_MODES,
46
+ familyForModel,
47
+ isSpecRuntimeMode,
48
+ modeOptionFor,
49
+ runtimeModeFromModel
50
+ };
51
+ //# sourceMappingURL=runtime-family.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-family.js","sources":["../../src/lib/runtime-family.ts"],"sourcesContent":["type RuntimeModelIdentity = {\n id: string;\n provider: string;\n runtime?: { id?: string; model?: string } | undefined;\n};\n\ntype RuntimeFamilyIdentity = {\n id: string;\n provider: string;\n catalogPrefix?: string | undefined;\n modes: Array<{ id: string; provider?: string | undefined }>;\n};\n\nexport const SPEC_RUNTIME_MODES = [\"api\", \"agent\", \"cli\", \"cmux\"] as const;\nexport type SpecRuntimeMode = (typeof SPEC_RUNTIME_MODES)[number];\nconst RUNTIME_MODES = new Set<string>(SPEC_RUNTIME_MODES);\n\nexport function isSpecRuntimeMode(\n value: string | undefined,\n): value is SpecRuntimeMode {\n return RUNTIME_MODES.has(value ?? \"\");\n}\n\nexport function runtimeModeFromModel(\n model: string | undefined,\n): SpecRuntimeMode | undefined {\n const [prefix] = (model ?? \"\").trim().toLowerCase().split(\":\");\n return isSpecRuntimeMode(prefix) ? prefix : undefined;\n}\n\nexport function familyForModel<T extends RuntimeFamilyIdentity>(\n families: T[],\n models: RuntimeModelIdentity[],\n modelId: string | undefined,\n): T | undefined {\n if (!modelId) return undefined;\n const selected = models.find(\n (model) =>\n model.id === modelId ||\n model.runtime?.model === modelId ||\n model.runtime?.id === modelId,\n );\n const compact = modelId.split(\",\")[0]?.trim() ?? \"\";\n const [prefix, inlineModel] = compact.split(\":\");\n const canonicalModel =\n RUNTIME_MODES.has(prefix?.toLowerCase() ?? \"\") && inlineModel\n ? inlineModel\n : compact;\n const slash = canonicalModel.indexOf(\"/\");\n const provider =\n selected?.provider ??\n (slash > 0 ? canonicalModel.slice(0, slash) : undefined);\n if (!provider) return undefined;\n return families.find(\n (family) =>\n family.provider === provider ||\n family.catalogPrefix === provider ||\n family.modes.some((mode) => mode.provider === provider),\n );\n}\n\nexport function modeOptionFor<T extends RuntimeFamilyIdentity>(\n families: T[],\n mode: string | undefined,\n preferredFamily?: string | undefined,\n): T[\"modes\"][number] | undefined {\n const target = (mode ?? \"\").toLowerCase();\n if (!target) return undefined;\n const ordered = preferredFamily\n ? [\n ...families.filter((family) => family.id === preferredFamily),\n ...families.filter((family) => family.id !== preferredFamily),\n ]\n : families;\n for (const family of ordered) {\n const entry = family.modes.find(\n (candidate) => candidate.id.toLowerCase() === target,\n );\n if (entry) return entry;\n }\n return undefined;\n}\n"],"names":["_a"],"mappings":"AAaO,MAAM,qBAAqB,CAAC,OAAO,SAAS,OAAO,MAAM;AAEhE,MAAM,gBAAgB,IAAI,IAAY,kBAAkB;AAEjD,SAAS,kBACd,OAC0B;AAC1B,SAAO,cAAc,IAAI,SAAS,EAAE;AACtC;AAEO,SAAS,qBACd,OAC6B;AAC7B,QAAM,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,YAAA,EAAc,MAAM,GAAG;AAC7D,SAAO,kBAAkB,MAAM,IAAI,SAAS;AAC9C;AAEO,SAAS,eACd,UACA,QACA,SACe;AArBV;AAsBL,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,WAAW,OAAO;AAAA,IACtB,CAAC,UAAA;AAxBE,UAAAA,KAAA;AAyBD,mBAAM,OAAO,aACbA,MAAA,MAAM,YAAN,gBAAAA,IAAe,WAAU,aACzB,WAAM,YAAN,mBAAe,QAAO;AAAA;AAAA,EAAA;AAE1B,QAAM,YAAU,aAAQ,MAAM,GAAG,EAAE,CAAC,MAApB,mBAAuB,WAAU;AACjD,QAAM,CAAC,QAAQ,WAAW,IAAI,QAAQ,MAAM,GAAG;AAC/C,QAAM,iBACJ,cAAc,KAAI,iCAAQ,kBAAiB,EAAE,KAAK,cAC9C,cACA;AACN,QAAM,QAAQ,eAAe,QAAQ,GAAG;AACxC,QAAM,YACJ,qCAAU,cACT,QAAQ,IAAI,eAAe,MAAM,GAAG,KAAK,IAAI;AAChD,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAAS;AAAA,IACd,CAAC,WACC,OAAO,aAAa,YACpB,OAAO,kBAAkB,YACzB,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,aAAa,QAAQ;AAAA,EAAA;AAE5D;AAEO,SAAS,cACd,UACA,MACA,iBACgC;AAChC,QAAM,UAAU,QAAQ,IAAI,YAAA;AAC5B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAU,kBACZ;AAAA,IACE,GAAG,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,eAAe;AAAA,IAC5D,GAAG,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,eAAe;AAAA,EAAA,IAE9D;AACJ,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAQ,OAAO,MAAM;AAAA,MACzB,CAAC,cAAc,UAAU,GAAG,kBAAkB;AAAA,IAAA;AAEhD,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const collections = require("./collections.cjs");
4
+ const runtimeFamily = require("./runtime-family.cjs");
5
+ function reorderProfilePresets(profile, from, to) {
6
+ if (!profile.presets[from] || !profile.presets[to]) {
7
+ throw new Error(`cannot reorder preset from ${from} to ${to}`);
8
+ }
9
+ return { ...profile, presets: collections.moveItem(profile.presets, from, to) };
10
+ }
11
+ function presetForRef(ref, presets) {
12
+ const name = ref.trim().toLowerCase();
13
+ return presets.find((preset) => preset.id === ref) ?? presets.find((preset) => preset.name.trim().toLowerCase() === name);
14
+ }
15
+ function presetsOf(profile, presets) {
16
+ const found = [];
17
+ const missing = [];
18
+ for (const ref of profile.presets) {
19
+ const preset = presetForRef(ref, presets);
20
+ if (preset) found.push(preset);
21
+ else missing.push(ref);
22
+ }
23
+ return { found, missing };
24
+ }
25
+ function authoredRuntimeSpec(profile, presets) {
26
+ var _a, _b, _c, _d;
27
+ if (!profile) return {};
28
+ const runtime = {};
29
+ for (const preset of presetsOf(profile, presets).found) {
30
+ if ((_a = preset.spec.model) == null ? void 0 : _a.trim()) runtime.model = preset.spec.model;
31
+ if ((_b = preset.spec.mode) == null ? void 0 : _b.trim()) runtime.mode = preset.spec.mode;
32
+ }
33
+ if ((_c = profile.spec.model) == null ? void 0 : _c.trim()) runtime.model = profile.spec.model;
34
+ if ((_d = profile.spec.mode) == null ? void 0 : _d.trim()) runtime.mode = profile.spec.mode;
35
+ return runtime;
36
+ }
37
+ function referencedBy(preset, profiles) {
38
+ const name = preset.name.trim().toLowerCase();
39
+ return profiles.filter(
40
+ (profile) => profile.presets.some(
41
+ (ref) => ref === preset.id || ref.trim().toLowerCase() === name
42
+ )
43
+ ).map((profile) => profile.name);
44
+ }
45
+ function duplicateName(name, existing) {
46
+ return nextNewName(`${name.trim()} copy`, existing);
47
+ }
48
+ function nextNewName(base, existing) {
49
+ const occupied = new Set(existing.map((item) => item.trim().toLowerCase()));
50
+ if (!occupied.has(base.toLowerCase())) return base;
51
+ let index = 2;
52
+ while (occupied.has(`${base} ${index}`.toLowerCase())) index += 1;
53
+ return `${base} ${index}`;
54
+ }
55
+ function uniqueName(name, id, records) {
56
+ const normalized = name.trim().toLowerCase();
57
+ if (!normalized) return false;
58
+ return !records.some(
59
+ (record) => record.id !== id && record.name.trim().toLowerCase() === normalized
60
+ );
61
+ }
62
+ function permissionTarget(spec, families) {
63
+ var _a;
64
+ const model = spec == null ? void 0 : spec.model;
65
+ const mode = runtimeFamily.runtimeModeFromModel(model) || ((_a = spec == null ? void 0 : spec.mode) == null ? void 0 : _a.trim());
66
+ const family = runtimeFamily.familyForModel(families, [], model);
67
+ if (!family || !mode || !runtimeFamily.modeOptionFor(families, mode, family.id)) {
68
+ return void 0;
69
+ }
70
+ return { provider: family.provider, mode };
71
+ }
72
+ function newProfileRecord(profiles, id) {
73
+ const name = nextNewName(
74
+ "New profile",
75
+ profiles.map((item) => item.name)
76
+ );
77
+ return { id, name, spec: {}, presets: [] };
78
+ }
79
+ function newPresetRecord(presets, id) {
80
+ const name = nextNewName(
81
+ "New preset",
82
+ presets.map((item) => item.name)
83
+ );
84
+ return { id, name, scope: "surface", spec: {} };
85
+ }
86
+ function duplicateRecord(records, sourceId, id) {
87
+ const source = records.find((record) => record.id === sourceId);
88
+ if (!source) throw new Error(`cannot duplicate missing record "${sourceId}"`);
89
+ return {
90
+ ...structuredClone(source),
91
+ id,
92
+ name: duplicateName(
93
+ source.name,
94
+ records.map((record) => record.name)
95
+ )
96
+ };
97
+ }
98
+ function selectionAfterDelete(records, deletedId, selectedId) {
99
+ var _a;
100
+ if (selectedId !== deletedId) return selectedId;
101
+ return (_a = records.find((record) => record.id !== deletedId)) == null ? void 0 : _a.id;
102
+ }
103
+ function mergeRuntimeSpec(base, overlay) {
104
+ return mergeRecords(base, overlay);
105
+ }
106
+ function mergeRecords(base, overlay) {
107
+ const merged = structuredClone(base);
108
+ for (const [key, value] of Object.entries(overlay)) {
109
+ if (value === void 0) continue;
110
+ const current = merged[key];
111
+ merged[key] = collections.isPlainObject(current) && collections.isPlainObject(value) ? mergeRecords(current, value) : structuredClone(value);
112
+ }
113
+ return merged;
114
+ }
115
+ exports.authoredRuntimeSpec = authoredRuntimeSpec;
116
+ exports.duplicateName = duplicateName;
117
+ exports.duplicateRecord = duplicateRecord;
118
+ exports.mergeRuntimeSpec = mergeRuntimeSpec;
119
+ exports.newPresetRecord = newPresetRecord;
120
+ exports.newProfileRecord = newProfileRecord;
121
+ exports.nextNewName = nextNewName;
122
+ exports.permissionTarget = permissionTarget;
123
+ exports.presetForRef = presetForRef;
124
+ exports.presetsOf = presetsOf;
125
+ exports.referencedBy = referencedBy;
126
+ exports.reorderProfilePresets = reorderProfilePresets;
127
+ exports.selectionAfterDelete = selectionAfterDelete;
128
+ exports.uniqueName = uniqueName;
129
+ //# sourceMappingURL=runtime-profile-model.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-profile-model.cjs","sources":["../../src/lib/runtime-profile-model.ts"],"sourcesContent":["import { isPlainObject, moveItem } from \"./collections\";\nimport {\n type SpecRuntimeFamily,\n} from \"../data/runtime/runtime-mode\";\nimport {\n familyForModel,\n modeOptionFor,\n runtimeModeFromModel,\n} from \"./runtime-family\";\nimport type { RuntimePreset, RuntimeProfile } from \"../data/ai/runtime-profile\";\nimport type { AISpecRuntimeSpec } from \"../data/ai/SpecRuntimeEditor.model\";\nimport type { RuntimePermissionTarget } from \"../data/ai/runtime-profiles/types\";\n\nexport function reorderProfilePresets(\n profile: RuntimeProfile,\n from: number,\n to: number,\n): RuntimeProfile {\n if (!profile.presets[from] || !profile.presets[to]) {\n throw new Error(`cannot reorder preset from ${from} to ${to}`);\n }\n return { ...profile, presets: moveItem(profile.presets, from, to) };\n}\n\nexport function presetForRef(\n ref: string,\n presets: RuntimePreset[],\n): RuntimePreset | undefined {\n const name = ref.trim().toLowerCase();\n return (\n presets.find((preset) => preset.id === ref) ??\n presets.find((preset) => preset.name.trim().toLowerCase() === name)\n );\n}\n\nexport function presetsOf(\n profile: Pick<RuntimeProfile, \"presets\">,\n presets: RuntimePreset[],\n): { found: RuntimePreset[]; missing: string[] } {\n const found: RuntimePreset[] = [];\n const missing: string[] = [];\n for (const ref of profile.presets) {\n const preset = presetForRef(ref, presets);\n if (preset) found.push(preset);\n else missing.push(ref);\n }\n return { found, missing };\n}\n\nexport function authoredRuntimeSpec(\n profile: RuntimeProfile | undefined,\n presets: RuntimePreset[],\n): Pick<AISpecRuntimeSpec, \"model\" | \"mode\"> {\n if (!profile) return {};\n const runtime: Pick<AISpecRuntimeSpec, \"model\" | \"mode\"> = {};\n for (const preset of presetsOf(profile, presets).found) {\n if (preset.spec.model?.trim()) runtime.model = preset.spec.model;\n if (preset.spec.mode?.trim()) runtime.mode = preset.spec.mode;\n }\n if (profile.spec.model?.trim()) runtime.model = profile.spec.model;\n if (profile.spec.mode?.trim()) runtime.mode = profile.spec.mode;\n return runtime;\n}\n\nexport function referencedBy(\n preset: Pick<RuntimePreset, \"id\" | \"name\">,\n profiles: RuntimeProfile[],\n): string[] {\n const name = preset.name.trim().toLowerCase();\n return profiles\n .filter((profile) =>\n profile.presets.some(\n (ref) => ref === preset.id || ref.trim().toLowerCase() === name,\n ),\n )\n .map((profile) => profile.name);\n}\n\nexport function duplicateName(name: string, existing: string[]): string {\n return nextNewName(`${name.trim()} copy`, existing);\n}\n\nexport function nextNewName(base: string, existing: string[]): string {\n const occupied = new Set(existing.map((item) => item.trim().toLowerCase()));\n if (!occupied.has(base.toLowerCase())) return base;\n let index = 2;\n while (occupied.has(`${base} ${index}`.toLowerCase())) index += 1;\n return `${base} ${index}`;\n}\n\nexport function uniqueName(\n name: string,\n id: string,\n records: Array<{ id: string; name: string }>,\n) {\n const normalized = name.trim().toLowerCase();\n if (!normalized) return false;\n return !records.some(\n (record) =>\n record.id !== id && record.name.trim().toLowerCase() === normalized,\n );\n}\n\nexport function permissionTarget(\n spec: AISpecRuntimeSpec | undefined,\n families: SpecRuntimeFamily[],\n): RuntimePermissionTarget | undefined {\n const model = spec?.model;\n const mode = runtimeModeFromModel(model) || spec?.mode?.trim();\n const family = familyForModel(families, [], model);\n if (!family || !mode || !modeOptionFor(families, mode, family.id)) {\n return undefined;\n }\n return { provider: family.provider, mode };\n}\n\nexport function newProfileRecord(\n profiles: RuntimeProfile[],\n id: string,\n): RuntimeProfile {\n const name = nextNewName(\n \"New profile\",\n profiles.map((item) => item.name),\n );\n return { id, name, spec: {}, presets: [] };\n}\n\nexport function newPresetRecord(\n presets: RuntimePreset[],\n id: string,\n): RuntimePreset {\n const name = nextNewName(\n \"New preset\",\n presets.map((item) => item.name),\n );\n return { id, name, scope: \"surface\", spec: {} };\n}\n\nexport function duplicateRecord<T extends { id: string; name: string }>(\n records: T[],\n sourceId: string,\n id: string,\n): T {\n const source = records.find((record) => record.id === sourceId);\n if (!source) throw new Error(`cannot duplicate missing record \"${sourceId}\"`);\n return {\n ...structuredClone(source),\n id,\n name: duplicateName(\n source.name,\n records.map((record) => record.name),\n ),\n };\n}\n\nexport function selectionAfterDelete(\n records: Array<{ id: string }>,\n deletedId: string,\n selectedId: string | undefined,\n): string | undefined {\n if (selectedId !== deletedId) return selectedId;\n return records.find((record) => record.id !== deletedId)?.id;\n}\n\nexport function mergeRuntimeSpec<T extends AISpecRuntimeSpec>(\n base: AISpecRuntimeSpec,\n overlay: T,\n): T {\n return mergeRecords(base, overlay) as T;\n}\n\nfunction mergeRecords(\n base: Record<string, unknown>,\n overlay: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = structuredClone(base);\n for (const [key, value] of Object.entries(overlay)) {\n if (value === undefined) continue;\n const current = merged[key];\n merged[key] =\n isPlainObject(current) && isPlainObject(value)\n ? mergeRecords(current, value)\n : structuredClone(value);\n }\n return merged;\n}\n"],"names":["moveItem","runtimeModeFromModel","familyForModel","modeOptionFor","isPlainObject"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { SpecRuntimeFamily } from '../data/runtime/runtime-mode';
2
+ import { RuntimePreset, RuntimeProfile } from '../data/ai/runtime-profile';
3
+ import { AISpecRuntimeSpec } from '../data/ai/SpecRuntimeEditor.model';
4
+ import { RuntimePermissionTarget } from '../data/ai/runtime-profiles/types';
5
+ export declare function reorderProfilePresets(profile: RuntimeProfile, from: number, to: number): RuntimeProfile;
6
+ export declare function presetForRef(ref: string, presets: RuntimePreset[]): RuntimePreset | undefined;
7
+ export declare function presetsOf(profile: Pick<RuntimeProfile, "presets">, presets: RuntimePreset[]): {
8
+ found: RuntimePreset[];
9
+ missing: string[];
10
+ };
11
+ export declare function authoredRuntimeSpec(profile: RuntimeProfile | undefined, presets: RuntimePreset[]): Pick<AISpecRuntimeSpec, "model" | "mode">;
12
+ export declare function referencedBy(preset: Pick<RuntimePreset, "id" | "name">, profiles: RuntimeProfile[]): string[];
13
+ export declare function duplicateName(name: string, existing: string[]): string;
14
+ export declare function nextNewName(base: string, existing: string[]): string;
15
+ export declare function uniqueName(name: string, id: string, records: Array<{
16
+ id: string;
17
+ name: string;
18
+ }>): boolean;
19
+ export declare function permissionTarget(spec: AISpecRuntimeSpec | undefined, families: SpecRuntimeFamily[]): RuntimePermissionTarget | undefined;
20
+ export declare function newProfileRecord(profiles: RuntimeProfile[], id: string): RuntimeProfile;
21
+ export declare function newPresetRecord(presets: RuntimePreset[], id: string): RuntimePreset;
22
+ export declare function duplicateRecord<T extends {
23
+ id: string;
24
+ name: string;
25
+ }>(records: T[], sourceId: string, id: string): T;
26
+ export declare function selectionAfterDelete(records: Array<{
27
+ id: string;
28
+ }>, deletedId: string, selectedId: string | undefined): string | undefined;
29
+ export declare function mergeRuntimeSpec<T extends AISpecRuntimeSpec>(base: AISpecRuntimeSpec, overlay: T): T;
30
+ //# sourceMappingURL=runtime-profile-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-profile-model.d.ts","sourceRoot":"","sources":["../../src/lib/runtime-profile-model.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EACvB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,cAAc,CAKhB;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,aAAa,EAAE,GACvB,aAAa,GAAG,SAAS,CAM3B;AAED,wBAAgB,SAAS,CACvB,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,EACxC,OAAO,EAAE,aAAa,EAAE,GACvB;IAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAS/C;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,OAAO,EAAE,aAAa,EAAE,GACvB,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,MAAM,CAAC,CAU3C;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,MAAM,CAAC,EAC1C,QAAQ,EAAE,cAAc,EAAE,GACzB,MAAM,EAAE,CASV;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAMpE;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,WAQ7C;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,uBAAuB,GAAG,SAAS,CAQrC;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EAAE,EAC1B,EAAE,EAAE,MAAM,GACT,cAAc,CAMhB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EAAE,EACxB,EAAE,EAAE,MAAM,GACT,aAAa,CAMf;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACpE,OAAO,EAAE,CAAC,EAAE,EACZ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACT,CAAC,CAWH;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,EAC1D,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,CAAC,GACT,CAAC,CAEH"}