@flanksource/clicky-ui 0.3.29 → 0.3.31

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 (346) 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/comments/CommentCard.cjs +110 -262
  6. package/dist/comments/CommentCard.cjs.map +1 -1
  7. package/dist/comments/CommentCard.d.ts +3 -1
  8. package/dist/comments/CommentCard.d.ts.map +1 -1
  9. package/dist/comments/CommentCard.js +105 -257
  10. package/dist/comments/CommentCard.js.map +1 -1
  11. package/dist/comments/CommentCardParts.cjs +95 -0
  12. package/dist/comments/CommentCardParts.cjs.map +1 -0
  13. package/dist/comments/CommentCardParts.d.ts +17 -0
  14. package/dist/comments/CommentCardParts.d.ts.map +1 -0
  15. package/dist/comments/CommentCardParts.js +95 -0
  16. package/dist/comments/CommentCardParts.js.map +1 -0
  17. package/dist/comments/CommentSidePanel.cjs +14 -7
  18. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  19. package/dist/comments/CommentSidePanel.d.ts +3 -1
  20. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  21. package/dist/comments/CommentSidePanel.js +14 -7
  22. package/dist/comments/CommentSidePanel.js.map +1 -1
  23. package/dist/comments/CommentThread.cjs +2 -0
  24. package/dist/comments/CommentThread.cjs.map +1 -1
  25. package/dist/comments/CommentThread.d.ts +2 -1
  26. package/dist/comments/CommentThread.d.ts.map +1 -1
  27. package/dist/comments/CommentThread.js +2 -0
  28. package/dist/comments/CommentThread.js.map +1 -1
  29. package/dist/comments/CommentThreadList.cjs +50 -34
  30. package/dist/comments/CommentThreadList.cjs.map +1 -1
  31. package/dist/comments/CommentThreadList.d.ts +3 -1
  32. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  33. package/dist/comments/CommentThreadList.js +50 -34
  34. package/dist/comments/CommentThreadList.js.map +1 -1
  35. package/dist/components/ComboboxMenu.cjs +4 -1
  36. package/dist/components/ComboboxMenu.cjs.map +1 -1
  37. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  38. package/dist/components/ComboboxMenu.js +5 -2
  39. package/dist/components/ComboboxMenu.js.map +1 -1
  40. package/dist/components/ComboboxTags.cjs +5 -1
  41. package/dist/components/ComboboxTags.cjs.map +1 -1
  42. package/dist/components/ComboboxTags.d.ts.map +1 -1
  43. package/dist/components/ComboboxTags.js +6 -2
  44. package/dist/components/ComboboxTags.js.map +1 -1
  45. package/dist/components/ConnectionLoggingPolicy.cjs +24 -35
  46. package/dist/components/ConnectionLoggingPolicy.cjs.map +1 -1
  47. package/dist/components/ConnectionLoggingPolicy.d.ts.map +1 -1
  48. package/dist/components/ConnectionLoggingPolicy.js +24 -35
  49. package/dist/components/ConnectionLoggingPolicy.js.map +1 -1
  50. package/dist/components/DateField.d.ts +1 -1
  51. package/dist/components/DatePicker.d.ts +1 -1
  52. package/dist/components/DateTimePicker.d.ts +1 -1
  53. package/dist/components/MultiSelect.cjs.map +1 -1
  54. package/dist/components/MultiSelect.d.ts +7 -0
  55. package/dist/components/MultiSelect.d.ts.map +1 -1
  56. package/dist/components/MultiSelect.js.map +1 -1
  57. package/dist/components/filter-bar-multi.cjs +10 -1
  58. package/dist/components/filter-bar-multi.cjs.map +1 -1
  59. package/dist/components/filter-bar-multi.d.ts.map +1 -1
  60. package/dist/components/filter-bar-multi.js +11 -2
  61. package/dist/components/filter-bar-multi.js.map +1 -1
  62. package/dist/components/mdx-editor-callout-model.d.ts +1 -1
  63. package/dist/data/MarkdownEditor.model.d.ts +1 -1
  64. package/dist/data/ai/ChatWindow.catalogs.cjs +11 -5
  65. package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -1
  66. package/dist/data/ai/ChatWindow.catalogs.d.ts +2 -1
  67. package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -1
  68. package/dist/data/ai/ChatWindow.catalogs.js +11 -5
  69. package/dist/data/ai/ChatWindow.catalogs.js.map +1 -1
  70. package/dist/data/ai/ChatWindow.cjs +1 -0
  71. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  72. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  73. package/dist/data/ai/ChatWindow.js +1 -0
  74. package/dist/data/ai/ChatWindow.js.map +1 -1
  75. package/dist/data/ai/PromptRunEditor/VariablesField.cjs +79 -0
  76. package/dist/data/ai/PromptRunEditor/VariablesField.cjs.map +1 -0
  77. package/dist/data/ai/PromptRunEditor/VariablesField.d.ts +8 -0
  78. package/dist/data/ai/PromptRunEditor/VariablesField.d.ts.map +1 -0
  79. package/dist/data/ai/PromptRunEditor/VariablesField.js +79 -0
  80. package/dist/data/ai/PromptRunEditor/VariablesField.js.map +1 -0
  81. package/dist/data/ai/PromptRunEditor/index.cjs +61 -69
  82. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  83. package/dist/data/ai/PromptRunEditor/index.d.ts +11 -1
  84. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  85. package/dist/data/ai/PromptRunEditor/index.js +61 -69
  86. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  87. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
  88. package/dist/data/ai/PromptRunEditor/model.d.ts +2 -0
  89. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
  90. package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
  91. package/dist/data/ai/SessionViewer.model.cjs +23 -8
  92. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  93. package/dist/data/ai/SessionViewer.model.d.ts +8 -0
  94. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  95. package/dist/data/ai/SessionViewer.model.js +23 -8
  96. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  97. package/dist/data/ai/SessionViewer.rows.cjs +9 -1
  98. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  99. package/dist/data/ai/SessionViewer.rows.js +9 -1
  100. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  101. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +4 -3
  102. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  103. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  104. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +2 -1
  105. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  106. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs +2 -2
  107. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs.map +1 -1
  108. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js +1 -1
  109. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs +24 -2
  110. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
  111. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
  112. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js +25 -3
  113. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
  114. package/dist/data/ai/SpecRuntimeEditor/index.cjs +4 -3
  115. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  116. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  117. package/dist/data/ai/SpecRuntimeEditor/index.js +2 -1
  118. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  119. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  120. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  121. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  122. package/dist/data/ai/SpecRuntimeEditor.model.cjs +4 -0
  123. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  124. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +4 -0
  125. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  126. package/dist/data/ai/SpecRuntimeEditor.model.js +4 -0
  127. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  128. package/dist/data/ai/index.d.ts +3 -2
  129. package/dist/data/ai/index.d.ts.map +1 -1
  130. package/dist/data/ai/runtime-profile.cjs.map +1 -1
  131. package/dist/data/ai/runtime-profile.d.ts +9 -7
  132. package/dist/data/ai/runtime-profile.d.ts.map +1 -1
  133. package/dist/data/ai/runtime-profile.js.map +1 -1
  134. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs +111 -0
  135. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs.map +1 -0
  136. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts +7 -0
  137. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts.map +1 -0
  138. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js +111 -0
  139. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js.map +1 -0
  140. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +313 -0
  141. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -0
  142. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts +8 -0
  143. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -0
  144. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +313 -0
  145. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -0
  146. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs +98 -0
  147. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs.map +1 -0
  148. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts +11 -0
  149. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts.map +1 -0
  150. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js +98 -0
  151. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js.map +1 -0
  152. package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs +35 -0
  153. package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs.map +1 -0
  154. package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts +11 -0
  155. package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts.map +1 -0
  156. package/dist/data/ai/runtime-profiles/PresetSpecEditor.js +35 -0
  157. package/dist/data/ai/runtime-profiles/PresetSpecEditor.js.map +1 -0
  158. package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs +179 -0
  159. package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs.map +1 -0
  160. package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts +22 -0
  161. package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts.map +1 -0
  162. package/dist/data/ai/runtime-profiles/PresetWorkspace.js +179 -0
  163. package/dist/data/ai/runtime-profiles/PresetWorkspace.js.map +1 -0
  164. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs +57 -0
  165. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs.map +1 -0
  166. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts +18 -0
  167. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts.map +1 -0
  168. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js +57 -0
  169. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js.map +1 -0
  170. package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs +135 -0
  171. package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs.map +1 -0
  172. package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts +23 -0
  173. package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts.map +1 -0
  174. package/dist/data/ai/runtime-profiles/ProfileWorkspace.js +135 -0
  175. package/dist/data/ai/runtime-profiles/ProfileWorkspace.js.map +1 -0
  176. package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs +85 -0
  177. package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs.map +1 -0
  178. package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts +7 -0
  179. package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts.map +1 -0
  180. package/dist/data/ai/runtime-profiles/ResolutionInspector.js +85 -0
  181. package/dist/data/ai/runtime-profiles/ResolutionInspector.js.map +1 -0
  182. package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs +42 -0
  183. package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs.map +1 -0
  184. package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts +6 -0
  185. package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts.map +1 -0
  186. package/dist/data/ai/runtime-profiles/ResolutionTrace.js +42 -0
  187. package/dist/data/ai/runtime-profiles/ResolutionTrace.js.map +1 -0
  188. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs +93 -0
  189. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs.map +1 -0
  190. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts +18 -0
  191. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts.map +1 -0
  192. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js +93 -0
  193. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js.map +1 -0
  194. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs +44 -0
  195. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs.map +1 -0
  196. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts +6 -0
  197. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts.map +1 -0
  198. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js +44 -0
  199. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js.map +1 -0
  200. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs +198 -0
  201. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs.map +1 -0
  202. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts +12 -0
  203. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts.map +1 -0
  204. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js +198 -0
  205. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js.map +1 -0
  206. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs +97 -0
  207. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs.map +1 -0
  208. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts +26 -0
  209. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts.map +1 -0
  210. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js +97 -0
  211. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js.map +1 -0
  212. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs +143 -0
  213. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs.map +1 -0
  214. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts +25 -0
  215. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts.map +1 -0
  216. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js +143 -0
  217. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js.map +1 -0
  218. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs +41 -0
  219. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs.map +1 -0
  220. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts +8 -0
  221. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts.map +1 -0
  222. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js +41 -0
  223. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js.map +1 -0
  224. package/dist/data/ai/runtime-profiles/index.d.ts +20 -0
  225. package/dist/data/ai/runtime-profiles/index.d.ts.map +1 -0
  226. package/dist/data/ai/runtime-profiles/types.d.ts +50 -0
  227. package/dist/data/ai/runtime-profiles/types.d.ts.map +1 -0
  228. package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs +37 -0
  229. package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs.map +1 -0
  230. package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts +5 -0
  231. package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts.map +1 -0
  232. package/dist/data/ai/runtime-profiles/use-permission-catalog.js +37 -0
  233. package/dist/data/ai/runtime-profiles/use-permission-catalog.js.map +1 -0
  234. package/dist/data/ai/runtime-profiles/use-resolution.cjs +43 -0
  235. package/dist/data/ai/runtime-profiles/use-resolution.cjs.map +1 -0
  236. package/dist/data/ai/runtime-profiles/use-resolution.d.ts +4 -0
  237. package/dist/data/ai/runtime-profiles/use-resolution.d.ts.map +1 -0
  238. package/dist/data/ai/runtime-profiles/use-resolution.js +43 -0
  239. package/dist/data/ai/runtime-profiles/use-resolution.js.map +1 -0
  240. package/dist/data/ai/runtime-profiles/use-runtime-families.cjs +38 -0
  241. package/dist/data/ai/runtime-profiles/use-runtime-families.cjs.map +1 -0
  242. package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts +3 -0
  243. package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts.map +1 -0
  244. package/dist/data/ai/runtime-profiles/use-runtime-families.js +38 -0
  245. package/dist/data/ai/runtime-profiles/use-runtime-families.js.map +1 -0
  246. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs +107 -0
  247. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs.map +1 -0
  248. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts +35 -0
  249. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts.map +1 -0
  250. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js +107 -0
  251. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js.map +1 -0
  252. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  253. package/dist/data/ai/use-session-scroll.d.ts +2 -2
  254. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  255. package/dist/data/ai/use-session-scroll.js.map +1 -1
  256. package/dist/data/badge-variants.d.ts +1 -1
  257. package/dist/data/runtime/RuntimeBar.cjs +3 -2
  258. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  259. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  260. package/dist/data/runtime/RuntimeBar.js +3 -2
  261. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  262. package/dist/data/runtime/runtime-field-support.cjs +3 -3
  263. package/dist/data/runtime/runtime-field-support.cjs.map +1 -1
  264. package/dist/data/runtime/runtime-field-support.js +1 -1
  265. package/dist/data/runtime/runtime-mode.cjs +14 -47
  266. package/dist/data/runtime/runtime-mode.cjs.map +1 -1
  267. package/dist/data/runtime/runtime-mode.d.ts +5 -7
  268. package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
  269. package/dist/data/runtime/runtime-mode.js +7 -39
  270. package/dist/data/runtime/runtime-mode.js.map +1 -1
  271. package/dist/data/test-runner/TestRunner.cjs +6 -4
  272. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  273. package/dist/data/test-runner/TestRunner.d.ts +10 -1
  274. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  275. package/dist/data/test-runner/TestRunner.js +6 -4
  276. package/dist/data/test-runner/TestRunner.js.map +1 -1
  277. package/dist/data/verification/VerificationResults.cjs +99 -0
  278. package/dist/data/verification/VerificationResults.cjs.map +1 -0
  279. package/dist/data/verification/VerificationResults.d.ts +27 -0
  280. package/dist/data/verification/VerificationResults.d.ts.map +1 -0
  281. package/dist/data/verification/VerificationResults.js +99 -0
  282. package/dist/data/verification/VerificationResults.js.map +1 -0
  283. package/dist/data/verification/adapterViews.cjs +116 -0
  284. package/dist/data/verification/adapterViews.cjs.map +1 -0
  285. package/dist/data/verification/adapterViews.d.ts +13 -0
  286. package/dist/data/verification/adapterViews.d.ts.map +1 -0
  287. package/dist/data/verification/adapterViews.js +116 -0
  288. package/dist/data/verification/adapterViews.js.map +1 -0
  289. package/dist/data/verification/adapters.cjs +26 -0
  290. package/dist/data/verification/adapters.cjs.map +1 -0
  291. package/dist/data/verification/adapters.d.ts +6 -0
  292. package/dist/data/verification/adapters.d.ts.map +1 -0
  293. package/dist/data/verification/adapters.js +26 -0
  294. package/dist/data/verification/adapters.js.map +1 -0
  295. package/dist/data/verification/index.d.ts +5 -0
  296. package/dist/data/verification/index.d.ts.map +1 -0
  297. package/dist/data/verification/verify-report.cjs +58 -0
  298. package/dist/data/verification/verify-report.cjs.map +1 -0
  299. package/dist/data/verification/verify-report.d.ts +96 -0
  300. package/dist/data/verification/verify-report.d.ts.map +1 -0
  301. package/dist/data/verification/verify-report.js +58 -0
  302. package/dist/data/verification/verify-report.js.map +1 -0
  303. package/dist/data/verification/verifyReportTests.cjs +83 -0
  304. package/dist/data/verification/verifyReportTests.cjs.map +1 -0
  305. package/dist/data/verification/verifyReportTests.d.ts +13 -0
  306. package/dist/data/verification/verifyReportTests.d.ts.map +1 -0
  307. package/dist/data/verification/verifyReportTests.js +83 -0
  308. package/dist/data/verification/verifyReportTests.js.map +1 -0
  309. package/dist/data/version-info.cjs +3 -3
  310. package/dist/data/version-info.js +3 -3
  311. package/dist/data.cjs +10 -0
  312. package/dist/data.cjs.map +1 -1
  313. package/dist/data.d.ts +1 -0
  314. package/dist/data.d.ts.map +1 -1
  315. package/dist/data.js +10 -0
  316. package/dist/data.js.map +1 -1
  317. package/dist/index.cjs +62 -0
  318. package/dist/index.cjs.map +1 -1
  319. package/dist/index.js +62 -0
  320. package/dist/index.js.map +1 -1
  321. package/dist/lib/permission-strategies.cjs +155 -0
  322. package/dist/lib/permission-strategies.cjs.map +1 -0
  323. package/dist/lib/permission-strategies.d.ts +35 -0
  324. package/dist/lib/permission-strategies.d.ts.map +1 -0
  325. package/dist/lib/permission-strategies.js +155 -0
  326. package/dist/lib/permission-strategies.js.map +1 -0
  327. package/dist/lib/runtime-family.cjs +51 -0
  328. package/dist/lib/runtime-family.cjs.map +1 -0
  329. package/dist/lib/runtime-family.d.ts +25 -0
  330. package/dist/lib/runtime-family.d.ts.map +1 -0
  331. package/dist/lib/runtime-family.js +51 -0
  332. package/dist/lib/runtime-family.js.map +1 -0
  333. package/dist/lib/runtime-profile-model.cjs +129 -0
  334. package/dist/lib/runtime-profile-model.cjs.map +1 -0
  335. package/dist/lib/runtime-profile-model.d.ts +30 -0
  336. package/dist/lib/runtime-profile-model.d.ts.map +1 -0
  337. package/dist/lib/runtime-profile-model.js +129 -0
  338. package/dist/lib/runtime-profile-model.js.map +1 -0
  339. package/dist/styles.css +1 -1
  340. package/dist/utils.cjs +52 -0
  341. package/dist/utils.cjs.map +1 -1
  342. package/dist/utils.d.ts +5 -0
  343. package/dist/utils.d.ts.map +1 -1
  344. package/dist/utils.js +53 -1
  345. package/dist/utils.js.map +1 -1
  346. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,aAAa,EACb,cAAc,EACd,gBAA4C,EAC5C,MAAc,EACd,SAAgB,EAChB,UAAiB,EACjB,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,+BAkHpB"}
1
+ {"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,aAAa,EACb,cAAc,EACd,gBAA4C,EAC5C,MAAc,EACd,SAAgB,EAChB,UAAiB,EACjB,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,+BAmHpB"}
@@ -6,7 +6,8 @@ import { RuntimeBarCombo } from "./RuntimeBarCombo.js";
6
6
  import { RuntimeBarSegments } from "./RuntimeBarSegments.js";
7
7
  import { isSelectableModel } from "./availability.js";
8
8
  import { effortOptionsForModel, reconcileModelCapabilities } from "./model-capabilities.js";
9
- import { runtimeModeFromModel, selectionForRuntime, SPEC_RUNTIME_FAMILIES, familyById, firstMode, modelsForFamily } from "./runtime-mode.js";
9
+ import { selectionForRuntime, SPEC_RUNTIME_FAMILIES, familyById, firstMode, modelsForFamily } from "./runtime-mode.js";
10
+ import { runtimeModeFromModel } from "../../lib/runtime-family.js";
10
11
  function RuntimeBar({
11
12
  value,
12
13
  onChange,
@@ -37,7 +38,7 @@ function RuntimeBar({
37
38
  const modelOptions = modelsForFamily(models, family, specMode);
38
39
  const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);
39
40
  const selectedModelUnavailable = Boolean(
40
- (value.id || value.model) && runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry))
41
+ !resolvedModel && (value.id || value.model) && runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry))
41
42
  );
42
43
  const supportedEfforts = effortOptionsForModel(
43
44
  resolvedModel,
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [preferredFamily, setPreferredFamily] = useState<string>();\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim();\n const selection = selectionForRuntime(\n families,\n specMode,\n value.model || effectiveModel,\n models,\n preferredFamily,\n );\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, specMode);\n const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);\n const selectedModelUnavailable = Boolean(\n (value.id || value.model) &&\n runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry)),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyMode = (familyId: string, modeId: string) => {\n setPreferredFamily(familyId);\n const next = applyRuntimeMode(\n value,\n models,\n families,\n familyId,\n modeId,\n reasoningEfforts,\n );\n if (next !== value) onChange(next);\n };\n\n const applyCustomModel = (model: string) => {\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n };\n // A family's model catalog can serve several modes. Selecting a row must not\n // silently move the user away from the mode they chose.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(\n withoutCatalogModel(value),\n model,\n reasoningEfforts,\n { mode: mode.id },\n );\n onChange(next);\n };\n const clearModel = () => {\n onChange(withoutCatalogModel(value));\n };\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyMode(familyId, selection.mode)}\n onModeChange={(modeId) => applyMode(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onModeChange={applyMode}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [preferredFamily, setPreferredFamily] = useState<string>();\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim();\n const selection = selectionForRuntime(\n families,\n specMode,\n value.model || effectiveModel,\n models,\n preferredFamily,\n );\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, specMode);\n const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);\n const selectedModelUnavailable = Boolean(\n !resolvedModel &&\n (value.id || value.model) &&\n runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry)),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyMode = (familyId: string, modeId: string) => {\n setPreferredFamily(familyId);\n const next = applyRuntimeMode(\n value,\n models,\n families,\n familyId,\n modeId,\n reasoningEfforts,\n );\n if (next !== value) onChange(next);\n };\n\n const applyCustomModel = (model: string) => {\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n };\n // A family's model catalog can serve several modes. Selecting a row must not\n // silently move the user away from the mode they chose.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(\n withoutCatalogModel(value),\n model,\n reasoningEfforts,\n { mode: mode.id },\n );\n onChange(next);\n };\n const clearModel = () => {\n onChange(withoutCatalogModel(value));\n };\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyMode(familyId, selection.mode)}\n onModeChange={(modeId) => applyMode(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onModeChange={applyMode}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const runtimeMode = require("./runtime-mode.cjs");
3
+ const runtimeFamily = require("../../lib/runtime-family.cjs");
4
4
  const RUNTIME_SCHEMA_SECTIONS = [
5
5
  "model",
6
6
  "prompt",
@@ -12,7 +12,7 @@ const RUNTIME_SCHEMA_SECTIONS = [
12
12
  ];
13
13
  const SUPPORT_ALL_RUNTIME_FIELDS = () => true;
14
14
  function runtimeFieldSupport(families, mode, preferredFamily) {
15
- const selected = runtimeMode.modeOptionFor(families, mode, preferredFamily);
15
+ const selected = runtimeFamily.modeOptionFor(families, mode, preferredFamily);
16
16
  if (!selected) {
17
17
  throw new Error(
18
18
  `runtime mode ${JSON.stringify(mode)} is missing from the catalog`
@@ -24,7 +24,7 @@ function runtimeFieldSupport(families, mode, preferredFamily) {
24
24
  }
25
25
  function runtimeFieldSection(families, mode, path, preferredFamily) {
26
26
  var _a;
27
- const selected = runtimeMode.modeOptionFor(families, mode, preferredFamily);
27
+ const selected = runtimeFamily.modeOptionFor(families, mode, preferredFamily);
28
28
  if (!selected) {
29
29
  throw new Error(
30
30
  `runtime mode ${JSON.stringify(mode)} is missing from the catalog`
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-field-support.cjs","sources":["../../../src/data/runtime/runtime-field-support.ts"],"sourcesContent":["import { modeOptionFor, type SpecRuntimeFamily } from \"./runtime-mode\";\n\nexport type RuntimeFieldSupport = (path: string) => boolean;\n\nconst RUNTIME_SCHEMA_SECTIONS = [\n \"model\",\n \"prompt\",\n \"workspace\",\n \"sandbox\",\n \"permissions\",\n \"environment\",\n \"cli\",\n] as const;\n\nexport type RuntimeSchemaSection = (typeof RUNTIME_SCHEMA_SECTIONS)[number];\n\nexport const SUPPORT_ALL_RUNTIME_FIELDS: RuntimeFieldSupport = () => true;\n\nexport function runtimeFieldSupport(\n families: SpecRuntimeFamily[],\n mode: string,\n preferredFamily?: string | undefined,\n): RuntimeFieldSupport {\n const selected = modeOptionFor(families, mode, preferredFamily);\n if (!selected) {\n throw new Error(\n `runtime mode ${JSON.stringify(mode)} is missing from the catalog`,\n );\n }\n const schema = selected.schema;\n if (!schema) return SUPPORT_ALL_RUNTIME_FIELDS;\n return (path) => schemaHasPath(schema, path);\n}\n\nexport function runtimeFieldSection(\n families: SpecRuntimeFamily[],\n mode: string,\n path: string,\n preferredFamily?: string | undefined,\n): RuntimeSchemaSection | undefined {\n const selected = modeOptionFor(families, mode, preferredFamily);\n if (!selected) {\n throw new Error(\n `runtime mode ${JSON.stringify(mode)} is missing from the catalog`,\n );\n }\n if (!selected.schema) return undefined;\n const section = runtimeSchemaPropertyAtPath(selected.schema, path)?.[\n \"x-clicky-section\"\n ];\n if (section == null || section === \"\") return undefined;\n if (!isRuntimeSchemaSection(section)) {\n throw new Error(\n `runtime field ${JSON.stringify(path)} has invalid x-clicky-section ${JSON.stringify(section)}`,\n );\n }\n return section;\n}\n\nfunction isRuntimeSchemaSection(value: unknown): value is RuntimeSchemaSection {\n return RUNTIME_SCHEMA_SECTIONS.some((section) => section === value);\n}\n\nfunction schemaHasPath(\n schema: NonNullable<SpecRuntimeFamily[\"modes\"][number][\"schema\"]>,\n path: string,\n): boolean {\n return runtimeSchemaPropertyAtPath(schema, path) != null;\n}\n\nexport function runtimeSchemaPropertyAtPath(\n schema: NonNullable<SpecRuntimeFamily[\"modes\"][number][\"schema\"]>,\n path: string,\n) {\n let current = schema;\n for (const part of path.split(\".\")) {\n const property = current.properties?.[part];\n if (!property) return undefined;\n current = property;\n }\n return current;\n}\n"],"names":["modeOptionFor"],"mappings":";;;AAIA,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,MAAM,6BAAkD,MAAM;AAE9D,SAAS,oBACd,UACA,MACA,iBACqB;AACrB,QAAM,WAAWA,YAAAA,cAAc,UAAU,MAAM,eAAe;AAC9D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,gBAAgB,KAAK,UAAU,IAAI,CAAC;AAAA,IAAA;AAAA,EAExC;AACA,QAAM,SAAS,SAAS;AACxB,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,CAAC,SAAS,cAAc,QAAQ,IAAI;AAC7C;AAEO,SAAS,oBACd,UACA,MACA,MACA,iBACkC;;AAClC,QAAM,WAAWA,YAAAA,cAAc,UAAU,MAAM,eAAe;AAC9D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,gBAAgB,KAAK,UAAU,IAAI,CAAC;AAAA,IAAA;AAAA,EAExC;AACA,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,QAAM,WAAU,iCAA4B,SAAS,QAAQ,IAAI,MAAjD,mBACd;AAEF,MAAI,WAAW,QAAQ,YAAY,GAAI,QAAO;AAC9C,MAAI,CAAC,uBAAuB,OAAO,GAAG;AACpC,UAAM,IAAI;AAAA,MACR,iBAAiB,KAAK,UAAU,IAAI,CAAC,iCAAiC,KAAK,UAAU,OAAO,CAAC;AAAA,IAAA;AAAA,EAEjG;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAA+C;AAC7E,SAAO,wBAAwB,KAAK,CAAC,YAAY,YAAY,KAAK;AACpE;AAEA,SAAS,cACP,QACA,MACS;AACT,SAAO,4BAA4B,QAAQ,IAAI,KAAK;AACtD;AAEO,SAAS,4BACd,QACA,MACA;;AACA,MAAI,UAAU;AACd,aAAW,QAAQ,KAAK,MAAM,GAAG,GAAG;AAClC,UAAM,YAAW,aAAQ,eAAR,mBAAqB;AACtC,QAAI,CAAC,SAAU,QAAO;AACtB,cAAU;AAAA,EACZ;AACA,SAAO;AACT;;;;;"}
1
+ {"version":3,"file":"runtime-field-support.cjs","sources":["../../../src/data/runtime/runtime-field-support.ts"],"sourcesContent":["import { modeOptionFor, type SpecRuntimeFamily } from \"./runtime-mode\";\n\nexport type RuntimeFieldSupport = (path: string) => boolean;\n\nconst RUNTIME_SCHEMA_SECTIONS = [\n \"model\",\n \"prompt\",\n \"workspace\",\n \"sandbox\",\n \"permissions\",\n \"environment\",\n \"cli\",\n] as const;\n\nexport type RuntimeSchemaSection = (typeof RUNTIME_SCHEMA_SECTIONS)[number];\n\nexport const SUPPORT_ALL_RUNTIME_FIELDS: RuntimeFieldSupport = () => true;\n\nexport function runtimeFieldSupport(\n families: SpecRuntimeFamily[],\n mode: string,\n preferredFamily?: string | undefined,\n): RuntimeFieldSupport {\n const selected = modeOptionFor(families, mode, preferredFamily);\n if (!selected) {\n throw new Error(\n `runtime mode ${JSON.stringify(mode)} is missing from the catalog`,\n );\n }\n const schema = selected.schema;\n if (!schema) return SUPPORT_ALL_RUNTIME_FIELDS;\n return (path) => schemaHasPath(schema, path);\n}\n\nexport function runtimeFieldSection(\n families: SpecRuntimeFamily[],\n mode: string,\n path: string,\n preferredFamily?: string | undefined,\n): RuntimeSchemaSection | undefined {\n const selected = modeOptionFor(families, mode, preferredFamily);\n if (!selected) {\n throw new Error(\n `runtime mode ${JSON.stringify(mode)} is missing from the catalog`,\n );\n }\n if (!selected.schema) return undefined;\n const section = runtimeSchemaPropertyAtPath(selected.schema, path)?.[\n \"x-clicky-section\"\n ];\n if (section == null || section === \"\") return undefined;\n if (!isRuntimeSchemaSection(section)) {\n throw new Error(\n `runtime field ${JSON.stringify(path)} has invalid x-clicky-section ${JSON.stringify(section)}`,\n );\n }\n return section;\n}\n\nfunction isRuntimeSchemaSection(value: unknown): value is RuntimeSchemaSection {\n return RUNTIME_SCHEMA_SECTIONS.some((section) => section === value);\n}\n\nfunction schemaHasPath(\n schema: NonNullable<SpecRuntimeFamily[\"modes\"][number][\"schema\"]>,\n path: string,\n): boolean {\n return runtimeSchemaPropertyAtPath(schema, path) != null;\n}\n\nexport function runtimeSchemaPropertyAtPath(\n schema: NonNullable<SpecRuntimeFamily[\"modes\"][number][\"schema\"]>,\n path: string,\n) {\n let current = schema;\n for (const part of path.split(\".\")) {\n const property = current.properties?.[part];\n if (!property) return undefined;\n current = property;\n }\n return current;\n}\n"],"names":["modeOptionFor"],"mappings":";;;AAIA,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,MAAM,6BAAkD,MAAM;AAE9D,SAAS,oBACd,UACA,MACA,iBACqB;AACrB,QAAM,WAAWA,cAAAA,cAAc,UAAU,MAAM,eAAe;AAC9D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,gBAAgB,KAAK,UAAU,IAAI,CAAC;AAAA,IAAA;AAAA,EAExC;AACA,QAAM,SAAS,SAAS;AACxB,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,CAAC,SAAS,cAAc,QAAQ,IAAI;AAC7C;AAEO,SAAS,oBACd,UACA,MACA,MACA,iBACkC;;AAClC,QAAM,WAAWA,cAAAA,cAAc,UAAU,MAAM,eAAe;AAC9D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,gBAAgB,KAAK,UAAU,IAAI,CAAC;AAAA,IAAA;AAAA,EAExC;AACA,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,QAAM,WAAU,iCAA4B,SAAS,QAAQ,IAAI,MAAjD,mBACd;AAEF,MAAI,WAAW,QAAQ,YAAY,GAAI,QAAO;AAC9C,MAAI,CAAC,uBAAuB,OAAO,GAAG;AACpC,UAAM,IAAI;AAAA,MACR,iBAAiB,KAAK,UAAU,IAAI,CAAC,iCAAiC,KAAK,UAAU,OAAO,CAAC;AAAA,IAAA;AAAA,EAEjG;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAA+C;AAC7E,SAAO,wBAAwB,KAAK,CAAC,YAAY,YAAY,KAAK;AACpE;AAEA,SAAS,cACP,QACA,MACS;AACT,SAAO,4BAA4B,QAAQ,IAAI,KAAK;AACtD;AAEO,SAAS,4BACd,QACA,MACA;;AACA,MAAI,UAAU;AACd,aAAW,QAAQ,KAAK,MAAM,GAAG,GAAG;AAClC,UAAM,YAAW,aAAQ,eAAR,mBAAqB;AACtC,QAAI,CAAC,SAAU,QAAO;AACtB,cAAU;AAAA,EACZ;AACA,SAAO;AACT;;;;;"}
@@ -1,4 +1,4 @@
1
- import { modeOptionFor } from "./runtime-mode.js";
1
+ import { modeOptionFor } from "../../lib/runtime-family.js";
2
2
  const RUNTIME_SCHEMA_SECTIONS = [
3
3
  "model",
4
4
  "prompt",
@@ -1,25 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const availability = require("./availability.cjs");
4
+ const runtimeFamily = require("../../lib/runtime-family.cjs");
4
5
  const UiCloud = require("../../icons/components/UiCloud.cjs");
5
6
  const UiRobotAi = require("../../icons/components/UiRobotAi.cjs");
6
7
  const UiTerminal = require("../../icons/components/UiTerminal.cjs");
7
8
  const UiColumns = require("../../icons/components/UiColumns.cjs");
8
- const SPEC_RUNTIME_MODES = ["api", "agent", "cli", "cmux"];
9
- function isSpecRuntimeMode(value) {
10
- return SPEC_RUNTIME_MODES.some((mode) => mode === value);
11
- }
12
- function runtimeModeFromModel(model) {
13
- const [prefix] = (model ?? "").trim().toLowerCase().split(":");
14
- return isSpecRuntimeMode(prefix) ? prefix : void 0;
15
- }
16
9
  function runtimeModelError(model) {
17
10
  for (const raw of (model ?? "").split(",")) {
18
11
  const compact = raw.trim();
19
12
  if (!compact || !compact.includes(":")) continue;
20
13
  const parts = compact.split(":").map((part) => part.trim());
21
14
  const [mode, name, effort] = parts;
22
- if (!isSpecRuntimeMode(mode)) {
15
+ if (!runtimeFamily.isSpecRuntimeMode(mode)) {
23
16
  return `Invalid model configuration: mode ${JSON.stringify(mode)} in model ${JSON.stringify(compact)}. Expected api, agent, cli, or cmux.`;
24
17
  }
25
18
  if (!name || parts.length > 3) {
@@ -33,7 +26,7 @@ function runtimeModelError(model) {
33
26
  }
34
27
  function runtimeModeError(families, mode, familyId) {
35
28
  if (!mode) return void 0;
36
- if (!isSpecRuntimeMode(mode)) {
29
+ if (!runtimeFamily.isSpecRuntimeMode(mode)) {
37
30
  return `Invalid model configuration: mode ${JSON.stringify(mode)}. Expected api, agent, cli, or cmux.`;
38
31
  }
39
32
  const family = familyId ? families.find((entry) => entry.id === familyId) : void 0;
@@ -119,7 +112,8 @@ const SPEC_RUNTIME_FAMILIES = [
119
112
  {
120
113
  id: "gemini",
121
114
  label: "Gemini",
122
- provider: "googleai",
115
+ provider: "google",
116
+ catalogPrefix: "googleai",
123
117
  modes: [
124
118
  { id: "api", label: "API", icon: UiCloud.UiCloud, title: "Gemini API" },
125
119
  { id: "cli", label: "CLI", icon: UiTerminal.UiTerminal, title: "Gemini CLI" }
@@ -163,7 +157,7 @@ function familiesFromRuntimeCatalog(catalog) {
163
157
  label: MODE_LABELS[mode.mode] ?? titleCase(mode.mode),
164
158
  icon: MODE_ICONS[mode.mode],
165
159
  title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,
166
- provider: mode.catalogProvider ?? entry.catalogPrefix,
160
+ provider: mode.catalogProvider ?? entry.provider,
167
161
  ...mode.defaultModel ? { defaultModel: mode.defaultModel } : {},
168
162
  ...mode.permissions ? { permissions: mode.permissions } : {},
169
163
  ...mode.schema ? { schema: mode.schema } : {},
@@ -178,7 +172,8 @@ function familiesFromRuntimeCatalog(catalog) {
178
172
  families.push({
179
173
  id: entry.family,
180
174
  label,
181
- provider: entry.catalogPrefix,
175
+ provider: entry.provider,
176
+ catalogPrefix: entry.catalogPrefix,
182
177
  modes
183
178
  });
184
179
  }
@@ -239,25 +234,12 @@ function selectionForMode(families, mode, preferredFamily) {
239
234
  const first = familyById(families, "");
240
235
  return { family: first.id, mode: firstMode(first).id };
241
236
  }
242
- function familyForModel(families, models, modelId) {
243
- if (!modelId) return void 0;
244
- const selected = models.find(
245
- (model) => {
246
- var _a, _b;
247
- return model.id === modelId || ((_a = model.runtime) == null ? void 0 : _a.model) === modelId || ((_b = model.runtime) == null ? void 0 : _b.id) === modelId;
248
- }
249
- );
250
- if (!selected) return void 0;
251
- return families.find(
252
- (family) => family.provider === selected.provider || family.modes.some((mode) => mode.provider === selected.provider)
253
- );
254
- }
255
237
  function selectionForRuntime(families, mode, modelId, models, preferredFamily) {
256
238
  var _a;
257
239
  return selectionForMode(
258
240
  families,
259
241
  mode,
260
- ((_a = familyForModel(families, models, modelId)) == null ? void 0 : _a.id) ?? preferredFamily
242
+ ((_a = runtimeFamily.familyForModel(families, models, modelId)) == null ? void 0 : _a.id) ?? preferredFamily
261
243
  );
262
244
  }
263
245
  function familyForMode(families, mode, preferredFamily) {
@@ -270,21 +252,6 @@ function familyForMode(families, mode, preferredFamily) {
270
252
  (family) => family.modes.some((entry) => entry.id.toLowerCase() === target)
271
253
  );
272
254
  }
273
- function modeOptionFor(families, mode, preferredFamily) {
274
- const target = (mode ?? "").toLowerCase();
275
- if (!target) return void 0;
276
- const ordered = preferredFamily ? [
277
- ...families.filter((family) => family.id === preferredFamily),
278
- ...families.filter((family) => family.id !== preferredFamily)
279
- ] : families;
280
- for (const family of ordered) {
281
- const entry = family.modes.find(
282
- (candidate) => candidate.id.toLowerCase() === target
283
- );
284
- if (entry) return entry;
285
- }
286
- return void 0;
287
- }
288
255
  function labelForMode(mode, families = SPEC_RUNTIME_FAMILIES) {
289
256
  const target = (mode ?? "").toLowerCase();
290
257
  for (const family of families) {
@@ -332,22 +299,22 @@ function modelForFamily(modelId, models, family, mode) {
332
299
  }
333
300
  ) ?? (matches.length === 1 ? matches[0] : void 0);
334
301
  }
302
+ exports.SPEC_RUNTIME_MODES = runtimeFamily.SPEC_RUNTIME_MODES;
303
+ exports.familyForModel = runtimeFamily.familyForModel;
304
+ exports.isSpecRuntimeMode = runtimeFamily.isSpecRuntimeMode;
305
+ exports.modeOptionFor = runtimeFamily.modeOptionFor;
306
+ exports.runtimeModeFromModel = runtimeFamily.runtimeModeFromModel;
335
307
  exports.SPEC_RUNTIME_FAMILIES = SPEC_RUNTIME_FAMILIES;
336
- exports.SPEC_RUNTIME_MODES = SPEC_RUNTIME_MODES;
337
308
  exports.familiesFromRuntimeCatalog = familiesFromRuntimeCatalog;
338
309
  exports.familyById = familyById;
339
310
  exports.familyForMode = familyForMode;
340
- exports.familyForModel = familyForModel;
341
311
  exports.firstMode = firstMode;
342
- exports.isSpecRuntimeMode = isSpecRuntimeMode;
343
312
  exports.labelForMode = labelForMode;
344
313
  exports.modeForFamily = modeForFamily;
345
- exports.modeOptionFor = modeOptionFor;
346
314
  exports.modelBelongsToFamily = modelBelongsToFamily;
347
315
  exports.modelForFamily = modelForFamily;
348
316
  exports.modelsForFamily = modelsForFamily;
349
317
  exports.runtimeModeError = runtimeModeError;
350
- exports.runtimeModeFromModel = runtimeModeFromModel;
351
318
  exports.runtimeModeOptions = runtimeModeOptions;
352
319
  exports.runtimeModelError = runtimeModelError;
353
320
  exports.selectionForMode = selectionForMode;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-mode.cjs","sources":["../../../src/data/runtime/runtime-mode.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport { UiCloud, UiColumns, UiRobotAi, UiTerminal } from \"../../icons\";\nimport type { JsonSchemaProperty } from \"../../components/json-schema-form-types\";\nimport type { ChatModel, RuntimeAvailability } from \"../chat/types\";\nimport {\n availabilityText,\n isSelectableModel,\n isUnavailable,\n unsupportedAvailability,\n} from \"./availability\";\n\n// A runtime has two independent axes: the model selects a provider family and\n// `spec.mode` selects api | agent | cli | cmux. The mode never contains a\n// provider name. This file used to call that axis `backend`, which is also what\n// captain called the composite adapter id it once served — so a value read from\n// one and posted back as the other type-checked and ran the wrong runtime.\n\nexport const SPEC_RUNTIME_MODES = [\"api\", \"agent\", \"cli\", \"cmux\"] as const;\nexport type SpecRuntimeMode = (typeof SPEC_RUNTIME_MODES)[number];\n\nexport function isSpecRuntimeMode(\n value: string | undefined,\n): value is SpecRuntimeMode {\n return SPEC_RUNTIME_MODES.some((mode) => mode === 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 runtimeModelError(\n model: string | undefined,\n): string | undefined {\n for (const raw of (model ?? \"\").split(\",\")) {\n const compact = raw.trim();\n if (!compact || !compact.includes(\":\")) continue;\n const parts = compact.split(\":\").map((part) => part.trim());\n const [mode, name, effort] = parts;\n if (!isSpecRuntimeMode(mode)) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)} in model ${JSON.stringify(compact)}. Expected api, agent, cli, or cmux.`;\n }\n if (!name || parts.length > 3) {\n return `Invalid model configuration: model ${JSON.stringify(compact)}. Expected mode:model[:effort].`;\n }\n if (\n effort !== undefined &&\n ![\"low\", \"medium\", \"high\", \"xhigh\", \"max\", \"ultra\"].includes(effort)\n ) {\n return `Invalid model configuration: effort ${JSON.stringify(effort)} in model ${JSON.stringify(compact)}.`;\n }\n }\n return undefined;\n}\n\nexport function runtimeModeError(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n familyId?: string | undefined,\n): string | undefined {\n if (!mode) return undefined;\n if (!isSpecRuntimeMode(mode)) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)}. Expected api, agent, cli, or cmux.`;\n }\n const family = familyId\n ? families.find((entry) => entry.id === familyId)\n : undefined;\n if (family && !family.modes.some((entry) => entry.id === mode)) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)} is not available for ${family.label}.`;\n }\n if (!families.some((entry) => entry.modes.some((m) => m.id === mode))) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)} is missing from the runtime catalog.`;\n }\n return undefined;\n}\n\nexport type SpecRuntimeModeOption = {\n /** The canonical `spec.mode`: api | agent | cli | cmux. */\n id: string;\n label: string;\n icon?: StaticIconComponent | undefined;\n title?: string | undefined;\n provider?: string | undefined;\n defaultModel?: string | undefined;\n availability?: RuntimeAvailability | undefined;\n permissions?: RuntimePermissionCapabilities | undefined;\n schema?: RuntimeSpecSchema | undefined;\n};\n\nexport type RuntimeArgumentImplementation = \"mapped\" | \"managed\";\n\nexport type RuntimeArgumentMapping = {\n name: string;\n implementation: RuntimeArgumentImplementation;\n description?: string | undefined;\n};\n\nexport type RuntimeSpecSchema = JsonSchemaProperty & {\n \"x-clicky-arguments\"?: RuntimeArgumentMapping[] | undefined;\n \"x-clicky-managed-arguments\"?: RuntimeArgumentMapping[] | undefined;\n};\n\nexport type RuntimePermissionSupportKind =\n | \"native\"\n | \"approximated\"\n | \"requires-broker\"\n | \"unsupported\";\n\nexport type RuntimePermissionSupport = {\n kind: RuntimePermissionSupportKind;\n effects?:\n | {\n flag?: string | undefined;\n sandbox?: string | undefined;\n approval?: string | undefined;\n note?: string | undefined;\n }\n | undefined;\n};\n\nexport type RuntimePermissionCapabilities = {\n modes: Record<string, RuntimePermissionSupport>;\n toolPolicies: Record<string, Record<string, RuntimePermissionSupport>>;\n resources: Record<string, Record<string, RuntimePermissionSupport>>;\n tools?: string[] | undefined;\n};\n\nexport type SpecRuntimeFamily = {\n id: string;\n label: string;\n /** The model-catalog provider (`ChatModel.provider`) whose models this family runs. */\n provider: string;\n modes: SpecRuntimeModeOption[];\n};\n\n// Offline catalog for stories and tests. Live hosts should pass Captain's\n// registry projection; both use the same provider + mode structure.\nexport const SPEC_RUNTIME_FAMILIES: SpecRuntimeFamily[] = [\n {\n id: \"claude\",\n label: \"Claude\",\n provider: \"anthropic\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n icon: UiCloud,\n title: \"Anthropic API\",\n provider: \"anthropic\",\n },\n {\n id: \"agent\",\n label: \"Agent\",\n icon: UiRobotAi,\n title: \"Claude Agent SDK\",\n provider: \"anthropic\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n icon: UiTerminal,\n title: \"Claude Code CLI\",\n provider: \"anthropic\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n icon: UiColumns,\n title: \"Claude multiplexer\",\n provider: \"anthropic\",\n },\n ],\n },\n {\n id: \"codex\",\n label: \"Codex\",\n provider: \"openai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n icon: UiCloud,\n title: \"OpenAI API\",\n provider: \"openai\",\n },\n {\n id: \"agent\",\n label: \"Agent\",\n icon: UiRobotAi,\n title: \"Codex agent\",\n provider: \"openai\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n icon: UiTerminal,\n title: \"Codex CLI\",\n provider: \"openai\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n icon: UiColumns,\n title: \"Codex multiplexer\",\n provider: \"openai\",\n },\n ],\n },\n {\n id: \"gemini\",\n label: \"Gemini\",\n provider: \"googleai\",\n modes: [\n { id: \"api\", label: \"API\", icon: UiCloud, title: \"Gemini API\" },\n { id: \"cli\", label: \"CLI\", icon: UiTerminal, title: \"Gemini CLI\" },\n ],\n },\n {\n id: \"deepseek\",\n label: \"DeepSeek\",\n provider: \"deepseek\",\n modes: [{ id: \"api\", label: \"API\", icon: UiCloud, title: \"DeepSeek API\" }],\n },\n];\n\n// One provider×mode cell as captain serves it (`/whoami`.runtimes and the prompt\n// schema document's `runtimes`), projected from its model registry. It carries\n// ids, not display text: `claude`/`api` are enough to render both, and a served\n// label would be a second place for presentation to drift.\nexport type RuntimeCatalogMode = {\n /** The canonical `spec.mode`: api | agent | cli | cmux. */\n mode: SpecRuntimeMode;\n /** \"api\" (remote, in-process) or \"cli\" (supervised local binary). */\n kind?: string | undefined;\n /** Rides the local CLI's own login; never consults an API key. */\n keyless?: boolean | undefined;\n /** The model id a picker should seed this mode with. */\n defaultModel?: string | undefined;\n /** The user switched this off in `~/.captain.yaml`. */\n disabled?: boolean | undefined;\n disabledReason?: string | undefined;\n /** Model-catalog provider used by this exact mode. */\n catalogProvider?: string | undefined;\n availability?: RuntimeAvailability | undefined;\n permissions?: RuntimePermissionCapabilities | undefined;\n /** Supported Spec fields, annotated with native CLI and protocol bindings. */\n schema: RuntimeSpecSchema;\n};\n\nexport type RuntimeCatalogFamily = {\n /** The coding-agent name: claude | codex | gemini | deepseek. */\n family: string;\n /** The canonical provider key: anthropic | openai | google | deepseek. */\n provider: string;\n /** The namespace this provider's model ids carry (`ChatModel.provider`). */\n catalogPrefix: string;\n modes: RuntimeCatalogMode[];\n};\n\nconst MODE_ICONS: Record<string, StaticIconComponent> = {\n api: UiCloud,\n agent: UiRobotAi,\n cli: UiTerminal,\n cmux: UiColumns,\n};\n\n// Mode ids are lowercase tokens; only the acronyms and the lowercase brand\n// \"cmux\" need spelling out. `agent` falls through to plain title case.\nconst MODE_LABELS: Record<string, string> = {\n api: \"API\",\n cli: \"CLI\",\n cmux: \"cmux\",\n};\n\n// Tooltip text, so \"Claude cmux\" reads as \"Claude multiplexer\".\nconst MODE_TITLES: Record<string, string> = {\n api: \"API\",\n agent: \"Agent SDK\",\n cli: \"CLI\",\n cmux: \"multiplexer\",\n};\n\n// The one brand whose title case is not just an initial capital.\nconst FAMILY_LABELS: Record<string, string> = { deepseek: \"DeepSeek\" };\n\nfunction titleCase(token: string): string {\n return token ? token.charAt(0).toUpperCase() + token.slice(1) : token;\n}\n\n// Turns the served catalog into the shared family list. Unavailable entries\n// stay present for Provider Status while runtime controls filter them out.\n//\n// The registry has one provider per family, so Claude's API mode sits beside its\n// Agent/CLI/cmux modes here rather than in a separate \"Anthropic\" family the way\n// SPEC_RUNTIME_FAMILIES splits them.\nexport function familiesFromRuntimeCatalog(\n catalog: RuntimeCatalogFamily[] | undefined,\n): SpecRuntimeFamily[] {\n if (!catalog?.length) return SPEC_RUNTIME_FAMILIES;\n const families: SpecRuntimeFamily[] = [];\n for (const entry of catalog) {\n const label = FAMILY_LABELS[entry.family] ?? titleCase(entry.family);\n const modes = entry.modes.map((mode) => ({\n id: mode.mode,\n label: MODE_LABELS[mode.mode] ?? titleCase(mode.mode),\n icon: MODE_ICONS[mode.mode],\n title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,\n provider: mode.catalogProvider ?? entry.catalogPrefix,\n ...(mode.defaultModel ? { defaultModel: mode.defaultModel } : {}),\n ...(mode.permissions ? { permissions: mode.permissions } : {}),\n ...(mode.schema ? { schema: mode.schema } : {}),\n ...(mode.availability\n ? { availability: mode.availability }\n : mode.disabled\n ? {\n availability: {\n state: \"disabled\" as const,\n reason: `Disabled by ${\n mode.disabledReason ?? mode.mode\n } in Captain configuration.`,\n remediation: `Enable ${\n mode.disabledReason ?? mode.mode\n } on the Whoami page, then refresh.`,\n },\n }\n : {}),\n }));\n families.push({\n id: entry.family,\n label,\n provider: entry.catalogPrefix,\n modes,\n });\n }\n return families.length ? families : SPEC_RUNTIME_FAMILIES;\n}\n\nexport function familyById(\n families: SpecRuntimeFamily[],\n id: string,\n): SpecRuntimeFamily {\n const match = families.find((family) => family.id === id);\n if (match) return match;\n const first = families[0];\n if (!first) throw new Error(\"SpecRuntimeFamily catalog must not be empty\");\n return first;\n}\n\nexport function firstMode(family: SpecRuntimeFamily): SpecRuntimeModeOption {\n const mode =\n family.modes.find((candidate) => !isUnavailable(candidate.availability)) ??\n family.modes[0];\n if (!mode) {\n throw new Error(\n `SpecRuntimeFamily \"${family.id}\" must have at least one mode`,\n );\n }\n return mode;\n}\n\n// Every mode id in the catalog, first-seen order. The entry returned for an id\n// belongs to the family that declared it first, so its presentation fields may\n// differ from another family's — the id itself is family-independent.\nexport function runtimeModeOptions(\n families: SpecRuntimeFamily[],\n): SpecRuntimeModeOption[] {\n const modes = new Map<string, SpecRuntimeModeOption>();\n for (const family of families) {\n for (const mode of family.modes) {\n if (!modes.has(mode.id)) modes.set(mode.id, mode);\n }\n }\n return [...modes.values()];\n}\n\n// One phrasing for \"this family does not offer that mode\", shared by every\n// runtime presentation so the same state never reads two ways.\nexport function unsupportedModeTitle(family: SpecRuntimeFamily): string {\n return availabilityText(\n unsupportedAvailability(\n family.label,\n \"this\",\n family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => mode.label),\n ),\n )!;\n}\n\nexport function unsupportedModeAvailability(\n family: SpecRuntimeFamily,\n mode: SpecRuntimeModeOption,\n): RuntimeAvailability {\n return unsupportedAvailability(\n family.label,\n mode.label,\n family.modes\n .filter((candidate) => !isUnavailable(candidate.availability))\n .map((candidate) => candidate.label),\n );\n}\n\n// The mode a family will actually run for a requested id, falling back to its\n// first available one. The answer is a `spec.mode` value.\nexport function modeForFamily(\n families: SpecRuntimeFamily[],\n familyId: string,\n modeId: string,\n): string {\n const family = familyById(families, familyId);\n const requested = family.modes.find((candidate) => candidate.id === modeId);\n const mode =\n requested && !isUnavailable(requested.availability)\n ? requested\n : firstMode(family);\n if (isUnavailable(mode.availability)) {\n throw new Error(\n `SpecRuntimeFamily \"${family.id}\" has no available runtime modes`,\n );\n }\n return mode.id;\n}\n\nexport function selectionForMode(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n preferredFamily?: string | undefined,\n): { family: string; mode: string } {\n const target = (mode ?? \"\").toLowerCase();\n const preferred = families.find((family) => family.id === preferredFamily);\n const preferredMode = preferred?.modes.find(\n (entry) => entry.id.toLowerCase() === target,\n );\n if (preferred && preferredMode) {\n return { family: preferred.id, mode: preferredMode.id };\n }\n for (const family of families) {\n for (const entry of family.modes) {\n if (entry.id.toLowerCase() === target) {\n return { family: family.id, mode: entry.id };\n }\n }\n }\n const first = familyById(families, \"\");\n return { family: first.id, mode: firstMode(first).id };\n}\n\nexport function familyForModel(\n families: SpecRuntimeFamily[],\n models: ChatModel[],\n modelId: string | undefined,\n): SpecRuntimeFamily | 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 if (!selected) return undefined;\n return families.find(\n (family) =>\n family.provider === selected.provider ||\n family.modes.some((mode) => mode.provider === selected.provider),\n );\n}\n\nexport function selectionForRuntime(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n modelId: string | undefined,\n models: ChatModel[],\n preferredFamily?: string | undefined,\n): { family: string; mode: string } {\n return selectionForMode(\n families,\n mode,\n familyForModel(families, models, modelId)?.id ?? preferredFamily,\n );\n}\n\nexport function familyForMode(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n preferredFamily?: string | undefined,\n): SpecRuntimeFamily | undefined {\n if (preferredFamily) {\n const family = families.find((entry) => entry.id === preferredFamily);\n if (family?.modes.some((entry) => entry.id === mode)) return family;\n }\n const target = (mode ?? \"\").toLowerCase();\n return families.find((family) =>\n family.modes.some((entry) => entry.id.toLowerCase() === target),\n );\n}\n\n// The mode option a `spec.mode` names, or undefined when the catalog does not\n// declare it. Unlike `selectionForMode` this does not fall back to the first\n// family, so a summary can stay silent about a runtime it cannot identify.\nexport function modeOptionFor(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n preferredFamily?: string | undefined,\n): SpecRuntimeModeOption | 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\n// `mode` is provider-independent, so a family is needed for a full label.\nexport function labelForMode(\n mode: string | undefined,\n families: SpecRuntimeFamily[] = SPEC_RUNTIME_FAMILIES,\n): string {\n const target = (mode ?? \"\").toLowerCase();\n for (const family of families) {\n for (const entry of family.modes) {\n if (entry.id.toLowerCase() === target) {\n return `${family.label} ${entry.label}`;\n }\n }\n }\n return \"Prompt default\";\n}\n\n/** Lists selectable models for one provider family. */\nexport function modelsForFamily(\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n mode?: string | undefined,\n): ChatModel[] {\n if (!family) return models.filter(isSelectableModel);\n const provider =\n family.modes.find((entry) => entry.id === mode)?.provider ??\n family.provider;\n return models.filter(\n (model) => isSelectableModel(model) && model.provider === provider,\n );\n}\n\n/** Reports whether the first matching catalog identity belongs to the target family. */\nexport function modelBelongsToFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n mode?: string | undefined,\n): boolean {\n if (!modelId) return true;\n const selected = models.find(\n (model) =>\n isSelectableModel(model) &&\n (model.id === modelId ||\n model.runtime?.model === modelId ||\n model.runtime?.id === modelId),\n );\n if (!selected) return false;\n const provider =\n family?.modes.find((entry) => entry.id === mode)?.provider ??\n family?.provider;\n return (\n (!provider || selected.provider === provider) &&\n (!selected.runtime?.mode || selected.runtime.mode === mode)\n );\n}\n\n/** Resolves a target mode row, using a sole shared row as fallback. */\nexport function modelForFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n mode?: string | undefined,\n): ChatModel | undefined {\n if (!modelId) return undefined;\n const matches = modelsForFamily(models, family, mode).filter(\n (model) =>\n model.id === modelId ||\n model.runtime?.model === modelId ||\n model.runtime?.id === modelId,\n );\n return (\n matches.find(\n (model) => !mode || !model.runtime?.mode || model.runtime.mode === mode,\n ) ?? (matches.length === 1 ? matches[0] : undefined)\n );\n}\n"],"names":["UiCloud","UiRobotAi","UiTerminal","UiColumns","isUnavailable","isSelectableModel","_a","_b"],"mappings":";;;;;;;AAiBO,MAAM,qBAAqB,CAAC,OAAO,SAAS,OAAO,MAAM;AAGzD,SAAS,kBACd,OAC0B;AAC1B,SAAO,mBAAmB,KAAK,CAAC,SAAS,SAAS,KAAK;AACzD;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,kBACd,OACoB;AACpB,aAAW,QAAQ,SAAS,IAAI,MAAM,GAAG,GAAG;AAC1C,UAAM,UAAU,IAAI,KAAA;AACpB,QAAI,CAAC,WAAW,CAAC,QAAQ,SAAS,GAAG,EAAG;AACxC,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,MAAM;AAC1D,UAAM,CAAC,MAAM,MAAM,MAAM,IAAI;AAC7B,QAAI,CAAC,kBAAkB,IAAI,GAAG;AAC5B,aAAO,qCAAqC,KAAK,UAAU,IAAI,CAAC,aAAa,KAAK,UAAU,OAAO,CAAC;AAAA,IACtG;AACA,QAAI,CAAC,QAAQ,MAAM,SAAS,GAAG;AAC7B,aAAO,sCAAsC,KAAK,UAAU,OAAO,CAAC;AAAA,IACtE;AACA,QACE,WAAW,UACX,CAAC,CAAC,OAAO,UAAU,QAAQ,SAAS,OAAO,OAAO,EAAE,SAAS,MAAM,GACnE;AACA,aAAO,uCAAuC,KAAK,UAAU,MAAM,CAAC,aAAa,KAAK,UAAU,OAAO,CAAC;AAAA,IAC1G;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBACd,UACA,MACA,UACoB;AACpB,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,kBAAkB,IAAI,GAAG;AAC5B,WAAO,qCAAqC,KAAK,UAAU,IAAI,CAAC;AAAA,EAClE;AACA,QAAM,SAAS,WACX,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ,IAC9C;AACJ,MAAI,UAAU,CAAC,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,IAAI,GAAG;AAC9D,WAAO,qCAAqC,KAAK,UAAU,IAAI,CAAC,yBAAyB,OAAO,KAAK;AAAA,EACvG;AACA,MAAI,CAAC,SAAS,KAAK,CAAC,UAAU,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,GAAG;AACrE,WAAO,qCAAqC,KAAK,UAAU,IAAI,CAAC;AAAA,EAClE;AACA,SAAO;AACT;AA+DO,MAAM,wBAA6C;AAAA,EACxD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMA,QAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMC,UAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMC,WAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMC,UAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEF;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMH,QAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMC,UAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMC,WAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAMC,UAAAA;AAAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEF;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,MACL,EAAE,IAAI,OAAO,OAAO,OAAO,MAAMH,QAAAA,SAAS,OAAO,aAAA;AAAA,MACjD,EAAE,IAAI,OAAO,OAAO,OAAO,MAAME,WAAAA,YAAY,OAAO,aAAA;AAAA,IAAa;AAAA,EACnE;AAAA,EAEF;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO,CAAC,EAAE,IAAI,OAAO,OAAO,OAAO,MAAMF,QAAAA,SAAS,OAAO,eAAA,CAAgB;AAAA,EAAA;AAE7E;AAoCA,MAAM,aAAkD;AAAA,EACtD,KAAKA,QAAAA;AAAAA,EACL,OAAOC,UAAAA;AAAAA,EACP,KAAKC,WAAAA;AAAAA,EACL,MAAMC,UAAAA;AACR;AAIA,MAAM,cAAsC;AAAA,EAC1C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AACR;AAGA,MAAM,cAAsC;AAAA,EAC1C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AACR;AAGA,MAAM,gBAAwC,EAAE,UAAU,WAAA;AAE1D,SAAS,UAAU,OAAuB;AACxC,SAAO,QAAQ,MAAM,OAAO,CAAC,EAAE,gBAAgB,MAAM,MAAM,CAAC,IAAI;AAClE;AAQO,SAAS,2BACd,SACqB;AACrB,MAAI,EAAC,mCAAS,QAAQ,QAAO;AAC7B,QAAM,WAAgC,CAAA;AACtC,aAAW,SAAS,SAAS;AAC3B,UAAM,QAAQ,cAAc,MAAM,MAAM,KAAK,UAAU,MAAM,MAAM;AACnE,UAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,UAAU;AAAA,MACvC,IAAI,KAAK;AAAA,MACT,OAAO,YAAY,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI;AAAA,MACpD,MAAM,WAAW,KAAK,IAAI;AAAA,MAC1B,OAAO,GAAG,KAAK,IAAI,YAAY,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,MACjE,UAAU,KAAK,mBAAmB,MAAM;AAAA,MACxC,GAAI,KAAK,eAAe,EAAE,cAAc,KAAK,aAAA,IAAiB,CAAA;AAAA,MAC9D,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAA,IAAgB,CAAA;AAAA,MAC3D,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,MAC5C,GAAI,KAAK,eACL,EAAE,cAAc,KAAK,aAAA,IACrB,KAAK,WACH;AAAA,QACE,cAAc;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ,eACN,KAAK,kBAAkB,KAAK,IAC9B;AAAA,UACA,aAAa,UACX,KAAK,kBAAkB,KAAK,IAC9B;AAAA,QAAA;AAAA,MACF,IAEF,CAAA;AAAA,IAAC,EACP;AACF,aAAS,KAAK;AAAA,MACZ,IAAI,MAAM;AAAA,MACV;AAAA,MACA,UAAU,MAAM;AAAA,MAChB;AAAA,IAAA,CACD;AAAA,EACH;AACA,SAAO,SAAS,SAAS,WAAW;AACtC;AAEO,SAAS,WACd,UACA,IACmB;AACnB,QAAM,QAAQ,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,EAAE;AACxD,MAAI,MAAO,QAAO;AAClB,QAAM,QAAQ,SAAS,CAAC;AACxB,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,6CAA6C;AACzE,SAAO;AACT;AAEO,SAAS,UAAU,QAAkD;AAC1E,QAAM,OACJ,OAAO,MAAM,KAAK,CAAC,cAAc,CAACC,2BAAc,UAAU,YAAY,CAAC,KACvE,OAAO,MAAM,CAAC;AAChB,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR,sBAAsB,OAAO,EAAE;AAAA,IAAA;AAAA,EAEnC;AACA,SAAO;AACT;AAKO,SAAS,mBACd,UACyB;AACzB,QAAM,4BAAY,IAAA;AAClB,aAAW,UAAU,UAAU;AAC7B,eAAW,QAAQ,OAAO,OAAO;AAC/B,UAAI,CAAC,MAAM,IAAI,KAAK,EAAE,EAAG,OAAM,IAAI,KAAK,IAAI,IAAI;AAAA,IAClD;AAAA,EACF;AACA,SAAO,CAAC,GAAG,MAAM,QAAQ;AAC3B;AA+BO,SAAS,cACd,UACA,UACA,QACQ;AACR,QAAM,SAAS,WAAW,UAAU,QAAQ;AAC5C,QAAM,YAAY,OAAO,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,MAAM;AAC1E,QAAM,OACJ,aAAa,CAACA,2BAAc,UAAU,YAAY,IAC9C,YACA,UAAU,MAAM;AACtB,MAAIA,aAAAA,cAAc,KAAK,YAAY,GAAG;AACpC,UAAM,IAAI;AAAA,MACR,sBAAsB,OAAO,EAAE;AAAA,IAAA;AAAA,EAEnC;AACA,SAAO,KAAK;AACd;AAEO,SAAS,iBACd,UACA,MACA,iBACkC;AAClC,QAAM,UAAU,QAAQ,IAAI,YAAA;AAC5B,QAAM,YAAY,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,eAAe;AACzE,QAAM,gBAAgB,uCAAW,MAAM;AAAA,IACrC,CAAC,UAAU,MAAM,GAAG,kBAAkB;AAAA;AAExC,MAAI,aAAa,eAAe;AAC9B,WAAO,EAAE,QAAQ,UAAU,IAAI,MAAM,cAAc,GAAA;AAAA,EACrD;AACA,aAAW,UAAU,UAAU;AAC7B,eAAW,SAAS,OAAO,OAAO;AAChC,UAAI,MAAM,GAAG,YAAA,MAAkB,QAAQ;AACrC,eAAO,EAAE,QAAQ,OAAO,IAAI,MAAM,MAAM,GAAA;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,WAAW,UAAU,EAAE;AACrC,SAAO,EAAE,QAAQ,MAAM,IAAI,MAAM,UAAU,KAAK,EAAE,GAAA;AACpD;AAEO,SAAS,eACd,UACA,QACA,SAC+B;AAC/B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,WAAW,OAAO;AAAA,IACtB,CAAC,UAAA;;AACC,mBAAM,OAAO,aACb,WAAM,YAAN,mBAAe,WAAU,aACzB,WAAM,YAAN,mBAAe,QAAO;AAAA;AAAA,EAAA;AAE1B,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAAS;AAAA,IACd,CAAC,WACC,OAAO,aAAa,SAAS,YAC7B,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,aAAa,SAAS,QAAQ;AAAA,EAAA;AAErE;AAEO,SAAS,oBACd,UACA,MACA,SACA,QACA,iBACkC;;AAClC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACA,oBAAe,UAAU,QAAQ,OAAO,MAAxC,mBAA2C,OAAM;AAAA,EAAA;AAErD;AAEO,SAAS,cACd,UACA,MACA,iBAC+B;AAC/B,MAAI,iBAAiB;AACnB,UAAM,SAAS,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,eAAe;AACpE,QAAI,iCAAQ,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,MAAO,QAAO;AAAA,EAC/D;AACA,QAAM,UAAU,QAAQ,IAAI,YAAA;AAC5B,SAAO,SAAS;AAAA,IAAK,CAAC,WACpB,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,GAAG,YAAA,MAAkB,MAAM;AAAA,EAAA;AAElE;AAKO,SAAS,cACd,UACA,MACA,iBACmC;AACnC,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;AAGO,SAAS,aACd,MACA,WAAgC,uBACxB;AACR,QAAM,UAAU,QAAQ,IAAI,YAAA;AAC5B,aAAW,UAAU,UAAU;AAC7B,eAAW,SAAS,OAAO,OAAO;AAChC,UAAI,MAAM,GAAG,YAAA,MAAkB,QAAQ;AACrC,eAAO,GAAG,OAAO,KAAK,IAAI,MAAM,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,gBACd,QACA,QACA,MACa;;AACb,MAAI,CAAC,OAAQ,QAAO,OAAO,OAAOC,aAAAA,iBAAiB;AACnD,QAAM,aACJ,YAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,IAAI,MAA9C,mBAAiD,aACjD,OAAO;AACT,SAAO,OAAO;AAAA,IACZ,CAAC,UAAUA,aAAAA,kBAAkB,KAAK,KAAK,MAAM,aAAa;AAAA,EAAA;AAE9D;AAGO,SAAS,qBACd,SACA,QACA,QACA,MACS;;AACT,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,WAAW,OAAO;AAAA,IACtB,CAAC,UAAA;;AACCA,0BAAAA,kBAAkB,KAAK,MACtB,MAAM,OAAO,aACZC,MAAA,MAAM,YAAN,gBAAAA,IAAe,WAAU,aACzBC,MAAA,MAAM,YAAN,gBAAAA,IAAe,QAAO;AAAA;AAAA,EAAA;AAE5B,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,aACJ,sCAAQ,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,UAA3C,mBAAkD,cAClD,iCAAQ;AACV,UACG,CAAC,YAAY,SAAS,aAAa,cACnC,GAAC,cAAS,YAAT,mBAAkB,SAAQ,SAAS,QAAQ,SAAS;AAE1D;AAGO,SAAS,eACd,SACA,QACA,QACA,MACuB;AACvB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,gBAAgB,QAAQ,QAAQ,IAAI,EAAE;AAAA,IACpD,CAAC,UAAA;;AACC,mBAAM,OAAO,aACb,WAAM,YAAN,mBAAe,WAAU,aACzB,WAAM,YAAN,mBAAe,QAAO;AAAA;AAAA,EAAA;AAE1B,SACE,QAAQ;AAAA,IACN,CAAC,UAAA;;AAAU,cAAC,QAAQ,GAAC,WAAM,YAAN,mBAAe,SAAQ,MAAM,QAAQ,SAAS;AAAA;AAAA,EAAA,MAC/D,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAE9C;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"runtime-mode.cjs","sources":["../../../src/data/runtime/runtime-mode.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport { UiCloud, UiColumns, UiRobotAi, UiTerminal } from \"../../icons\";\nimport type { JsonSchemaProperty } from \"../../components/json-schema-form-types\";\nimport type { ChatModel, RuntimeAvailability } from \"../chat/types\";\nimport {\n availabilityText,\n isSelectableModel,\n isUnavailable,\n unsupportedAvailability,\n} from \"./availability\";\nimport {\n familyForModel,\n isSpecRuntimeMode,\n type SpecRuntimeMode,\n} from \"../../lib/runtime-family\";\nexport {\n familyForModel,\n isSpecRuntimeMode,\n modeOptionFor,\n runtimeModeFromModel,\n SPEC_RUNTIME_MODES,\n type SpecRuntimeMode,\n} from \"../../lib/runtime-family\";\n\n// A runtime has two independent axes: the model selects a provider family and\n// `spec.mode` selects api | agent | cli | cmux. The mode never contains a\n// provider name. This file used to call that axis `backend`, which is also what\n// captain called the composite adapter id it once served — so a value read from\n// one and posted back as the other type-checked and ran the wrong runtime.\n\nexport function runtimeModelError(\n model: string | undefined,\n): string | undefined {\n for (const raw of (model ?? \"\").split(\",\")) {\n const compact = raw.trim();\n if (!compact || !compact.includes(\":\")) continue;\n const parts = compact.split(\":\").map((part) => part.trim());\n const [mode, name, effort] = parts;\n if (!isSpecRuntimeMode(mode)) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)} in model ${JSON.stringify(compact)}. Expected api, agent, cli, or cmux.`;\n }\n if (!name || parts.length > 3) {\n return `Invalid model configuration: model ${JSON.stringify(compact)}. Expected mode:model[:effort].`;\n }\n if (\n effort !== undefined &&\n ![\"low\", \"medium\", \"high\", \"xhigh\", \"max\", \"ultra\"].includes(effort)\n ) {\n return `Invalid model configuration: effort ${JSON.stringify(effort)} in model ${JSON.stringify(compact)}.`;\n }\n }\n return undefined;\n}\n\nexport function runtimeModeError(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n familyId?: string | undefined,\n): string | undefined {\n if (!mode) return undefined;\n if (!isSpecRuntimeMode(mode)) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)}. Expected api, agent, cli, or cmux.`;\n }\n const family = familyId\n ? families.find((entry) => entry.id === familyId)\n : undefined;\n if (family && !family.modes.some((entry) => entry.id === mode)) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)} is not available for ${family.label}.`;\n }\n if (!families.some((entry) => entry.modes.some((m) => m.id === mode))) {\n return `Invalid model configuration: mode ${JSON.stringify(mode)} is missing from the runtime catalog.`;\n }\n return undefined;\n}\n\nexport type SpecRuntimeModeOption = {\n /** The canonical `spec.mode`: api | agent | cli | cmux. */\n id: string;\n label: string;\n icon?: StaticIconComponent | undefined;\n title?: string | undefined;\n provider?: string | undefined;\n defaultModel?: string | undefined;\n availability?: RuntimeAvailability | undefined;\n permissions?: RuntimePermissionCapabilities | undefined;\n schema?: RuntimeSpecSchema | undefined;\n};\n\nexport type RuntimeArgumentImplementation = \"mapped\" | \"managed\";\n\nexport type RuntimeArgumentMapping = {\n name: string;\n implementation: RuntimeArgumentImplementation;\n description?: string | undefined;\n};\n\nexport type RuntimeSpecSchema = JsonSchemaProperty & {\n \"x-clicky-arguments\"?: RuntimeArgumentMapping[] | undefined;\n \"x-clicky-managed-arguments\"?: RuntimeArgumentMapping[] | undefined;\n};\n\nexport type RuntimePermissionSupportKind =\n | \"native\"\n | \"approximated\"\n | \"requires-broker\"\n | \"unsupported\";\n\nexport type RuntimePermissionSupport = {\n kind: RuntimePermissionSupportKind;\n effects?:\n | {\n flag?: string | undefined;\n sandbox?: string | undefined;\n approval?: string | undefined;\n note?: string | undefined;\n }\n | undefined;\n};\n\nexport type RuntimePermissionCapabilities = {\n modes: Record<string, RuntimePermissionSupport>;\n toolPolicies: Record<string, Record<string, RuntimePermissionSupport>>;\n resources: Record<string, Record<string, RuntimePermissionSupport>>;\n tools?: string[] | undefined;\n};\n\nexport type SpecRuntimeFamily = {\n id: string;\n label: string;\n /** The model-catalog provider (`ChatModel.provider`) whose models this family runs. */\n provider: string;\n /** Namespace used by fully-qualified model ids when it differs from provider. */\n catalogPrefix?: string | undefined;\n modes: SpecRuntimeModeOption[];\n};\n\n// Offline catalog for stories and tests. Live hosts should pass Captain's\n// registry projection; both use the same provider + mode structure.\nexport const SPEC_RUNTIME_FAMILIES: SpecRuntimeFamily[] = [\n {\n id: \"claude\",\n label: \"Claude\",\n provider: \"anthropic\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n icon: UiCloud,\n title: \"Anthropic API\",\n provider: \"anthropic\",\n },\n {\n id: \"agent\",\n label: \"Agent\",\n icon: UiRobotAi,\n title: \"Claude Agent SDK\",\n provider: \"anthropic\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n icon: UiTerminal,\n title: \"Claude Code CLI\",\n provider: \"anthropic\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n icon: UiColumns,\n title: \"Claude multiplexer\",\n provider: \"anthropic\",\n },\n ],\n },\n {\n id: \"codex\",\n label: \"Codex\",\n provider: \"openai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n icon: UiCloud,\n title: \"OpenAI API\",\n provider: \"openai\",\n },\n {\n id: \"agent\",\n label: \"Agent\",\n icon: UiRobotAi,\n title: \"Codex agent\",\n provider: \"openai\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n icon: UiTerminal,\n title: \"Codex CLI\",\n provider: \"openai\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n icon: UiColumns,\n title: \"Codex multiplexer\",\n provider: \"openai\",\n },\n ],\n },\n {\n id: \"gemini\",\n label: \"Gemini\",\n provider: \"google\",\n catalogPrefix: \"googleai\",\n modes: [\n { id: \"api\", label: \"API\", icon: UiCloud, title: \"Gemini API\" },\n { id: \"cli\", label: \"CLI\", icon: UiTerminal, title: \"Gemini CLI\" },\n ],\n },\n {\n id: \"deepseek\",\n label: \"DeepSeek\",\n provider: \"deepseek\",\n modes: [{ id: \"api\", label: \"API\", icon: UiCloud, title: \"DeepSeek API\" }],\n },\n];\n\n// One provider×mode cell as captain serves it (`/whoami`.runtimes and the prompt\n// schema document's `runtimes`), projected from its model registry. It carries\n// ids, not display text: `claude`/`api` are enough to render both, and a served\n// label would be a second place for presentation to drift.\nexport type RuntimeCatalogMode = {\n /** The canonical `spec.mode`: api | agent | cli | cmux. */\n mode: SpecRuntimeMode;\n /** \"api\" (remote, in-process) or \"cli\" (supervised local binary). */\n kind?: string | undefined;\n /** Rides the local CLI's own login; never consults an API key. */\n keyless?: boolean | undefined;\n /** The model id a picker should seed this mode with. */\n defaultModel?: string | undefined;\n /** The user switched this off in `~/.captain.yaml`. */\n disabled?: boolean | undefined;\n disabledReason?: string | undefined;\n /** Model-catalog provider used by this exact mode. */\n catalogProvider?: string | undefined;\n availability?: RuntimeAvailability | undefined;\n permissions?: RuntimePermissionCapabilities | undefined;\n /** Supported Spec fields, annotated with native CLI and protocol bindings. */\n schema: RuntimeSpecSchema;\n};\n\nexport type RuntimeCatalogFamily = {\n /** The coding-agent name: claude | codex | gemini | deepseek. */\n family: string;\n /** The canonical provider key: anthropic | openai | google | deepseek. */\n provider: string;\n /** The namespace used in fully-qualified model ids. */\n catalogPrefix: string;\n modes: RuntimeCatalogMode[];\n};\n\nconst MODE_ICONS: Record<string, StaticIconComponent> = {\n api: UiCloud,\n agent: UiRobotAi,\n cli: UiTerminal,\n cmux: UiColumns,\n};\n\n// Mode ids are lowercase tokens; only the acronyms and the lowercase brand\n// \"cmux\" need spelling out. `agent` falls through to plain title case.\nconst MODE_LABELS: Record<string, string> = {\n api: \"API\",\n cli: \"CLI\",\n cmux: \"cmux\",\n};\n\n// Tooltip text, so \"Claude cmux\" reads as \"Claude multiplexer\".\nconst MODE_TITLES: Record<string, string> = {\n api: \"API\",\n agent: \"Agent SDK\",\n cli: \"CLI\",\n cmux: \"multiplexer\",\n};\n\n// The one brand whose title case is not just an initial capital.\nconst FAMILY_LABELS: Record<string, string> = { deepseek: \"DeepSeek\" };\n\nfunction titleCase(token: string): string {\n return token ? token.charAt(0).toUpperCase() + token.slice(1) : token;\n}\n\n// Turns the served catalog into the shared family list. Unavailable entries\n// stay present for Provider Status while runtime controls filter them out.\n//\n// The registry has one provider per family, so Claude's API mode sits beside its\n// Agent/CLI/cmux modes here rather than in a separate \"Anthropic\" family the way\n// SPEC_RUNTIME_FAMILIES splits them.\nexport function familiesFromRuntimeCatalog(\n catalog: RuntimeCatalogFamily[] | undefined,\n): SpecRuntimeFamily[] {\n if (!catalog?.length) return SPEC_RUNTIME_FAMILIES;\n const families: SpecRuntimeFamily[] = [];\n for (const entry of catalog) {\n const label = FAMILY_LABELS[entry.family] ?? titleCase(entry.family);\n const modes = entry.modes.map((mode) => ({\n id: mode.mode,\n label: MODE_LABELS[mode.mode] ?? titleCase(mode.mode),\n icon: MODE_ICONS[mode.mode],\n title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,\n provider: mode.catalogProvider ?? entry.provider,\n ...(mode.defaultModel ? { defaultModel: mode.defaultModel } : {}),\n ...(mode.permissions ? { permissions: mode.permissions } : {}),\n ...(mode.schema ? { schema: mode.schema } : {}),\n ...(mode.availability\n ? { availability: mode.availability }\n : mode.disabled\n ? {\n availability: {\n state: \"disabled\" as const,\n reason: `Disabled by ${\n mode.disabledReason ?? mode.mode\n } in Captain configuration.`,\n remediation: `Enable ${\n mode.disabledReason ?? mode.mode\n } on the Whoami page, then refresh.`,\n },\n }\n : {}),\n }));\n families.push({\n id: entry.family,\n label,\n provider: entry.provider,\n catalogPrefix: entry.catalogPrefix,\n modes,\n });\n }\n return families.length ? families : SPEC_RUNTIME_FAMILIES;\n}\n\nexport function familyById(\n families: SpecRuntimeFamily[],\n id: string,\n): SpecRuntimeFamily {\n const match = families.find((family) => family.id === id);\n if (match) return match;\n const first = families[0];\n if (!first) throw new Error(\"SpecRuntimeFamily catalog must not be empty\");\n return first;\n}\n\nexport function firstMode(family: SpecRuntimeFamily): SpecRuntimeModeOption {\n const mode =\n family.modes.find((candidate) => !isUnavailable(candidate.availability)) ??\n family.modes[0];\n if (!mode) {\n throw new Error(\n `SpecRuntimeFamily \"${family.id}\" must have at least one mode`,\n );\n }\n return mode;\n}\n\n// Every mode id in the catalog, first-seen order. The entry returned for an id\n// belongs to the family that declared it first, so its presentation fields may\n// differ from another family's — the id itself is family-independent.\nexport function runtimeModeOptions(\n families: SpecRuntimeFamily[],\n): SpecRuntimeModeOption[] {\n const modes = new Map<string, SpecRuntimeModeOption>();\n for (const family of families) {\n for (const mode of family.modes) {\n if (!modes.has(mode.id)) modes.set(mode.id, mode);\n }\n }\n return [...modes.values()];\n}\n\n// One phrasing for \"this family does not offer that mode\", shared by every\n// runtime presentation so the same state never reads two ways.\nexport function unsupportedModeTitle(family: SpecRuntimeFamily): string {\n return availabilityText(\n unsupportedAvailability(\n family.label,\n \"this\",\n family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => mode.label),\n ),\n )!;\n}\n\nexport function unsupportedModeAvailability(\n family: SpecRuntimeFamily,\n mode: SpecRuntimeModeOption,\n): RuntimeAvailability {\n return unsupportedAvailability(\n family.label,\n mode.label,\n family.modes\n .filter((candidate) => !isUnavailable(candidate.availability))\n .map((candidate) => candidate.label),\n );\n}\n\n// The mode a family will actually run for a requested id, falling back to its\n// first available one. The answer is a `spec.mode` value.\nexport function modeForFamily(\n families: SpecRuntimeFamily[],\n familyId: string,\n modeId: string,\n): string {\n const family = familyById(families, familyId);\n const requested = family.modes.find((candidate) => candidate.id === modeId);\n const mode =\n requested && !isUnavailable(requested.availability)\n ? requested\n : firstMode(family);\n if (isUnavailable(mode.availability)) {\n throw new Error(\n `SpecRuntimeFamily \"${family.id}\" has no available runtime modes`,\n );\n }\n return mode.id;\n}\n\nexport function selectionForMode(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n preferredFamily?: string | undefined,\n): { family: string; mode: string } {\n const target = (mode ?? \"\").toLowerCase();\n const preferred = families.find((family) => family.id === preferredFamily);\n const preferredMode = preferred?.modes.find(\n (entry) => entry.id.toLowerCase() === target,\n );\n if (preferred && preferredMode) {\n return { family: preferred.id, mode: preferredMode.id };\n }\n for (const family of families) {\n for (const entry of family.modes) {\n if (entry.id.toLowerCase() === target) {\n return { family: family.id, mode: entry.id };\n }\n }\n }\n const first = familyById(families, \"\");\n return { family: first.id, mode: firstMode(first).id };\n}\n\nexport function selectionForRuntime(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n modelId: string | undefined,\n models: ChatModel[],\n preferredFamily?: string | undefined,\n): { family: string; mode: string } {\n return selectionForMode(\n families,\n mode,\n familyForModel(families, models, modelId)?.id ?? preferredFamily,\n );\n}\n\nexport function familyForMode(\n families: SpecRuntimeFamily[],\n mode: string | undefined,\n preferredFamily?: string | undefined,\n): SpecRuntimeFamily | undefined {\n if (preferredFamily) {\n const family = families.find((entry) => entry.id === preferredFamily);\n if (family?.modes.some((entry) => entry.id === mode)) return family;\n }\n const target = (mode ?? \"\").toLowerCase();\n return families.find((family) =>\n family.modes.some((entry) => entry.id.toLowerCase() === target),\n );\n}\n\n// The mode option a `spec.mode` names, or undefined when the catalog does not\n// declare it. Unlike `selectionForMode` this does not fall back to the first\n// family, so a summary can stay silent about a runtime it cannot identify.\n// `mode` is provider-independent, so a family is needed for a full label.\nexport function labelForMode(\n mode: string | undefined,\n families: SpecRuntimeFamily[] = SPEC_RUNTIME_FAMILIES,\n): string {\n const target = (mode ?? \"\").toLowerCase();\n for (const family of families) {\n for (const entry of family.modes) {\n if (entry.id.toLowerCase() === target) {\n return `${family.label} ${entry.label}`;\n }\n }\n }\n return \"Prompt default\";\n}\n\n/** Lists selectable models for one provider family. */\nexport function modelsForFamily(\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n mode?: string | undefined,\n): ChatModel[] {\n if (!family) return models.filter(isSelectableModel);\n const provider =\n family.modes.find((entry) => entry.id === mode)?.provider ??\n family.provider;\n return models.filter(\n (model) => isSelectableModel(model) && model.provider === provider,\n );\n}\n\n/** Reports whether the first matching catalog identity belongs to the target family. */\nexport function modelBelongsToFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n mode?: string | undefined,\n): boolean {\n if (!modelId) return true;\n const selected = models.find(\n (model) =>\n isSelectableModel(model) &&\n (model.id === modelId ||\n model.runtime?.model === modelId ||\n model.runtime?.id === modelId),\n );\n if (!selected) return false;\n const provider =\n family?.modes.find((entry) => entry.id === mode)?.provider ??\n family?.provider;\n return (\n (!provider || selected.provider === provider) &&\n (!selected.runtime?.mode || selected.runtime.mode === mode)\n );\n}\n\n/** Resolves a target mode row, using a sole shared row as fallback. */\nexport function modelForFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n mode?: string | undefined,\n): ChatModel | undefined {\n if (!modelId) return undefined;\n const matches = modelsForFamily(models, family, mode).filter(\n (model) =>\n model.id === modelId ||\n model.runtime?.model === modelId ||\n model.runtime?.id === modelId,\n );\n return (\n matches.find(\n (model) => !mode || !model.runtime?.mode || model.runtime.mode === mode,\n ) ?? (matches.length === 1 ? matches[0] : undefined)\n );\n}\n"],"names":["isSpecRuntimeMode","UiCloud","UiRobotAi","UiTerminal","UiColumns","isUnavailable","familyForModel","isSelectableModel","_a","_b"],"mappings":"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"}
@@ -1,10 +1,8 @@
1
1
  import { StaticIconComponent } from '../Icon';
2
2
  import { JsonSchemaProperty } from '../../components/json-schema-form-types';
3
3
  import { ChatModel, RuntimeAvailability } from '../chat/types';
4
- export declare const SPEC_RUNTIME_MODES: readonly ["api", "agent", "cli", "cmux"];
5
- export type SpecRuntimeMode = (typeof SPEC_RUNTIME_MODES)[number];
6
- export declare function isSpecRuntimeMode(value: string | undefined): value is SpecRuntimeMode;
7
- export declare function runtimeModeFromModel(model: string | undefined): SpecRuntimeMode | undefined;
4
+ import { SpecRuntimeMode } from '../../lib/runtime-family';
5
+ export { familyForModel, isSpecRuntimeMode, modeOptionFor, runtimeModeFromModel, SPEC_RUNTIME_MODES, type SpecRuntimeMode, } from '../../lib/runtime-family';
8
6
  export declare function runtimeModelError(model: string | undefined): string | undefined;
9
7
  export declare function runtimeModeError(families: SpecRuntimeFamily[], mode: string | undefined, familyId?: string | undefined): string | undefined;
10
8
  export type SpecRuntimeModeOption = {
@@ -50,6 +48,8 @@ export type SpecRuntimeFamily = {
50
48
  label: string;
51
49
  /** The model-catalog provider (`ChatModel.provider`) whose models this family runs. */
52
50
  provider: string;
51
+ /** Namespace used by fully-qualified model ids when it differs from provider. */
52
+ catalogPrefix?: string | undefined;
53
53
  modes: SpecRuntimeModeOption[];
54
54
  };
55
55
  export declare const SPEC_RUNTIME_FAMILIES: SpecRuntimeFamily[];
@@ -77,7 +77,7 @@ export type RuntimeCatalogFamily = {
77
77
  family: string;
78
78
  /** The canonical provider key: anthropic | openai | google | deepseek. */
79
79
  provider: string;
80
- /** The namespace this provider's model ids carry (`ChatModel.provider`). */
80
+ /** The namespace used in fully-qualified model ids. */
81
81
  catalogPrefix: string;
82
82
  modes: RuntimeCatalogMode[];
83
83
  };
@@ -92,13 +92,11 @@ export declare function selectionForMode(families: SpecRuntimeFamily[], mode: st
92
92
  family: string;
93
93
  mode: string;
94
94
  };
95
- export declare function familyForModel(families: SpecRuntimeFamily[], models: ChatModel[], modelId: string | undefined): SpecRuntimeFamily | undefined;
96
95
  export declare function selectionForRuntime(families: SpecRuntimeFamily[], mode: string | undefined, modelId: string | undefined, models: ChatModel[], preferredFamily?: string | undefined): {
97
96
  family: string;
98
97
  mode: string;
99
98
  };
100
99
  export declare function familyForMode(families: SpecRuntimeFamily[], mode: string | undefined, preferredFamily?: string | undefined): SpecRuntimeFamily | undefined;
101
- export declare function modeOptionFor(families: SpecRuntimeFamily[], mode: string | undefined, preferredFamily?: string | undefined): SpecRuntimeModeOption | undefined;
102
100
  export declare function labelForMode(mode: string | undefined, families?: SpecRuntimeFamily[]): string;
103
101
  /** Lists selectable models for one provider family. */
104
102
  export declare function modelsForFamily(models: ChatModel[], family: SpecRuntimeFamily | undefined, mode?: string | undefined): ChatModel[];
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-mode.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/runtime-mode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-mode.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/runtime-mode.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,10 @@
1
1
  import { isUnavailable, isSelectableModel } from "./availability.js";
2
+ import { isSpecRuntimeMode, familyForModel } from "../../lib/runtime-family.js";
3
+ import { SPEC_RUNTIME_MODES, modeOptionFor, runtimeModeFromModel } from "../../lib/runtime-family.js";
2
4
  import { UiCloud } from "../../icons/components/UiCloud.js";
3
5
  import { UiRobotAi } from "../../icons/components/UiRobotAi.js";
4
6
  import { UiTerminal } from "../../icons/components/UiTerminal.js";
5
7
  import { UiColumns } from "../../icons/components/UiColumns.js";
6
- const SPEC_RUNTIME_MODES = ["api", "agent", "cli", "cmux"];
7
- function isSpecRuntimeMode(value) {
8
- return SPEC_RUNTIME_MODES.some((mode) => mode === value);
9
- }
10
- function runtimeModeFromModel(model) {
11
- const [prefix] = (model ?? "").trim().toLowerCase().split(":");
12
- return isSpecRuntimeMode(prefix) ? prefix : void 0;
13
- }
14
8
  function runtimeModelError(model) {
15
9
  for (const raw of (model ?? "").split(",")) {
16
10
  const compact = raw.trim();
@@ -117,7 +111,8 @@ const SPEC_RUNTIME_FAMILIES = [
117
111
  {
118
112
  id: "gemini",
119
113
  label: "Gemini",
120
- provider: "googleai",
114
+ provider: "google",
115
+ catalogPrefix: "googleai",
121
116
  modes: [
122
117
  { id: "api", label: "API", icon: UiCloud, title: "Gemini API" },
123
118
  { id: "cli", label: "CLI", icon: UiTerminal, title: "Gemini CLI" }
@@ -161,7 +156,7 @@ function familiesFromRuntimeCatalog(catalog) {
161
156
  label: MODE_LABELS[mode.mode] ?? titleCase(mode.mode),
162
157
  icon: MODE_ICONS[mode.mode],
163
158
  title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,
164
- provider: mode.catalogProvider ?? entry.catalogPrefix,
159
+ provider: mode.catalogProvider ?? entry.provider,
165
160
  ...mode.defaultModel ? { defaultModel: mode.defaultModel } : {},
166
161
  ...mode.permissions ? { permissions: mode.permissions } : {},
167
162
  ...mode.schema ? { schema: mode.schema } : {},
@@ -176,7 +171,8 @@ function familiesFromRuntimeCatalog(catalog) {
176
171
  families.push({
177
172
  id: entry.family,
178
173
  label,
179
- provider: entry.catalogPrefix,
174
+ provider: entry.provider,
175
+ catalogPrefix: entry.catalogPrefix,
180
176
  modes
181
177
  });
182
178
  }
@@ -237,19 +233,6 @@ function selectionForMode(families, mode, preferredFamily) {
237
233
  const first = familyById(families, "");
238
234
  return { family: first.id, mode: firstMode(first).id };
239
235
  }
240
- function familyForModel(families, models, modelId) {
241
- if (!modelId) return void 0;
242
- const selected = models.find(
243
- (model) => {
244
- var _a, _b;
245
- return model.id === modelId || ((_a = model.runtime) == null ? void 0 : _a.model) === modelId || ((_b = model.runtime) == null ? void 0 : _b.id) === modelId;
246
- }
247
- );
248
- if (!selected) return void 0;
249
- return families.find(
250
- (family) => family.provider === selected.provider || family.modes.some((mode) => mode.provider === selected.provider)
251
- );
252
- }
253
236
  function selectionForRuntime(families, mode, modelId, models, preferredFamily) {
254
237
  var _a;
255
238
  return selectionForMode(
@@ -268,21 +251,6 @@ function familyForMode(families, mode, preferredFamily) {
268
251
  (family) => family.modes.some((entry) => entry.id.toLowerCase() === target)
269
252
  );
270
253
  }
271
- function modeOptionFor(families, mode, preferredFamily) {
272
- const target = (mode ?? "").toLowerCase();
273
- if (!target) return void 0;
274
- const ordered = preferredFamily ? [
275
- ...families.filter((family) => family.id === preferredFamily),
276
- ...families.filter((family) => family.id !== preferredFamily)
277
- ] : families;
278
- for (const family of ordered) {
279
- const entry = family.modes.find(
280
- (candidate) => candidate.id.toLowerCase() === target
281
- );
282
- if (entry) return entry;
283
- }
284
- return void 0;
285
- }
286
254
  function labelForMode(mode, families = SPEC_RUNTIME_FAMILIES) {
287
255
  const target = (mode ?? "").toLowerCase();
288
256
  for (const family of families) {