@flanksource/clicky-ui 0.3.25 → 0.3.27

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 (535) hide show
  1. package/NOTICE.md +1 -0
  2. package/dist/ai.cjs +4 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +6 -2
  5. package/dist/ai.js.map +1 -1
  6. package/dist/chat.cjs +8 -0
  7. package/dist/chat.cjs.map +1 -1
  8. package/dist/chat.js +9 -1
  9. package/dist/chat.js.map +1 -1
  10. package/dist/comments/CommentCard.cjs +89 -14
  11. package/dist/comments/CommentCard.cjs.map +1 -1
  12. package/dist/comments/CommentCard.d.ts.map +1 -1
  13. package/dist/comments/CommentCard.js +90 -15
  14. package/dist/comments/CommentCard.js.map +1 -1
  15. package/dist/comments/CommentComposer.cjs +25 -2
  16. package/dist/comments/CommentComposer.cjs.map +1 -1
  17. package/dist/comments/CommentComposer.d.ts.map +1 -1
  18. package/dist/comments/CommentComposer.js +25 -2
  19. package/dist/comments/CommentComposer.js.map +1 -1
  20. package/dist/comments/CommentProvider.cjs +21 -14
  21. package/dist/comments/CommentProvider.cjs.map +1 -1
  22. package/dist/comments/CommentProvider.d.ts +1 -1
  23. package/dist/comments/CommentProvider.d.ts.map +1 -1
  24. package/dist/comments/CommentProvider.js +21 -14
  25. package/dist/comments/CommentProvider.js.map +1 -1
  26. package/dist/comments/CommentSidePanel.cjs +1 -1
  27. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  28. package/dist/comments/CommentSidePanel.js +1 -1
  29. package/dist/comments/CommentSidePanel.js.map +1 -1
  30. package/dist/comments/comment-types.cjs.map +1 -1
  31. package/dist/comments/comment-types.d.ts +6 -0
  32. package/dist/comments/comment-types.d.ts.map +1 -1
  33. package/dist/comments/comment-types.js.map +1 -1
  34. package/dist/components/DimensionField.cjs +56 -0
  35. package/dist/components/DimensionField.cjs.map +1 -0
  36. package/dist/components/DimensionField.d.ts +17 -0
  37. package/dist/components/DimensionField.d.ts.map +1 -0
  38. package/dist/components/DimensionField.js +56 -0
  39. package/dist/components/DimensionField.js.map +1 -0
  40. package/dist/components.cjs +4 -0
  41. package/dist/components.cjs.map +1 -1
  42. package/dist/components.d.ts +2 -0
  43. package/dist/components.d.ts.map +1 -1
  44. package/dist/components.js +4 -0
  45. package/dist/components.js.map +1 -1
  46. package/dist/data/Clicky.cjs +4 -5
  47. package/dist/data/Clicky.cjs.map +1 -1
  48. package/dist/data/Clicky.d.ts.map +1 -1
  49. package/dist/data/Clicky.js +4 -5
  50. package/dist/data/Clicky.js.map +1 -1
  51. package/dist/data/FixtureEditor/fixture-frontmatter.cjs +4 -0
  52. package/dist/data/FixtureEditor/fixture-frontmatter.cjs.map +1 -1
  53. package/dist/data/FixtureEditor/fixture-frontmatter.d.ts.map +1 -1
  54. package/dist/data/FixtureEditor/fixture-frontmatter.js +4 -0
  55. package/dist/data/FixtureEditor/fixture-frontmatter.js.map +1 -1
  56. package/dist/data/TaskExecDetails.cjs +8 -3
  57. package/dist/data/TaskExecDetails.cjs.map +1 -1
  58. package/dist/data/TaskExecDetails.d.ts +4 -0
  59. package/dist/data/TaskExecDetails.d.ts.map +1 -1
  60. package/dist/data/TaskExecDetails.js +9 -4
  61. package/dist/data/TaskExecDetails.js.map +1 -1
  62. package/dist/data/TaskManagerButton.cjs +101 -7
  63. package/dist/data/TaskManagerButton.cjs.map +1 -1
  64. package/dist/data/TaskManagerButton.d.ts +6 -1
  65. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  66. package/dist/data/TaskManagerButton.js +103 -9
  67. package/dist/data/TaskManagerButton.js.map +1 -1
  68. package/dist/data/TaskProcessDetails.cjs +2 -0
  69. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  70. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  71. package/dist/data/TaskProcessDetails.js +2 -0
  72. package/dist/data/TaskProcessDetails.js.map +1 -1
  73. package/dist/data/TaskProgress.cjs +14 -4
  74. package/dist/data/TaskProgress.cjs.map +1 -1
  75. package/dist/data/TaskProgress.js +14 -4
  76. package/dist/data/TaskProgress.js.map +1 -1
  77. package/dist/data/TaskSnapshot.cjs.map +1 -1
  78. package/dist/data/TaskSnapshot.d.ts +1 -0
  79. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  80. package/dist/data/TaskSnapshot.js.map +1 -1
  81. package/dist/data/ai/ChatWindow.cjs +18 -23
  82. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  83. package/dist/data/ai/ChatWindow.d.ts +1 -1
  84. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  85. package/dist/data/ai/ChatWindow.js +19 -24
  86. package/dist/data/ai/ChatWindow.js.map +1 -1
  87. package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
  88. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  89. package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
  90. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  91. package/dist/data/ai/ChatWindow.preferences.js +12 -21
  92. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  93. package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
  94. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  95. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
  96. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  97. package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
  98. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  99. package/dist/data/ai/ChatWindow.types.d.ts +2 -2
  100. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  101. package/dist/data/ai/ChatWindowManager.cjs +2 -2
  102. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  103. package/dist/data/ai/ChatWindowManager.js +2 -2
  104. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  105. package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
  106. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
  107. package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
  108. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
  109. package/dist/data/ai/ChatWindowRequestBody.js +4 -2
  110. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
  111. package/dist/data/ai/PromptRunEditor/index.cjs +2 -3
  112. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  113. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  114. package/dist/data/ai/PromptRunEditor/index.js +2 -3
  115. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  116. package/dist/data/ai/PromptRunEditor/model.cjs +1 -0
  117. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
  118. package/dist/data/ai/PromptRunEditor/model.d.ts +1 -1
  119. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
  120. package/dist/data/ai/PromptRunEditor/model.js +1 -0
  121. package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
  122. package/dist/data/ai/RuntimeModePicker.cjs +11 -9
  123. package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
  124. package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
  125. package/dist/data/ai/RuntimeModePicker.js +12 -10
  126. package/dist/data/ai/RuntimeModePicker.js.map +1 -1
  127. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +5 -0
  128. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  129. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  130. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +5 -0
  131. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  132. package/dist/data/ai/SpecRuntimeEditor.model.cjs +4 -0
  133. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  134. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -0
  135. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  136. package/dist/data/ai/SpecRuntimeEditor.model.js +4 -0
  137. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  138. package/dist/data/ai/ToolPreferences.cjs +5 -5
  139. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  140. package/dist/data/ai/ToolPreferences.d.ts +6 -5
  141. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  142. package/dist/data/ai/ToolPreferences.js +5 -5
  143. package/dist/data/ai/ToolPreferences.js.map +1 -1
  144. package/dist/data/ai/ToolPreferences.model.cjs +61 -37
  145. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  146. package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
  147. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  148. package/dist/data/ai/ToolPreferences.model.js +62 -38
  149. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  150. package/dist/data/ai/ToolPreferencesList.cjs +17 -20
  151. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  152. package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
  153. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  154. package/dist/data/ai/ToolPreferencesList.js +18 -21
  155. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  156. package/dist/data/ai/chat-window-context.cjs +1 -1
  157. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  158. package/dist/data/ai/chat-window-context.d.ts +7 -7
  159. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  160. package/dist/data/ai/chat-window-context.js +1 -1
  161. package/dist/data/ai/chat-window-context.js.map +1 -1
  162. package/dist/data/ai/index.d.ts +3 -1
  163. package/dist/data/ai/index.d.ts.map +1 -1
  164. package/dist/data/chat/Chat.cjs +4 -2
  165. package/dist/data/chat/Chat.cjs.map +1 -1
  166. package/dist/data/chat/Chat.d.ts.map +1 -1
  167. package/dist/data/chat/Chat.js +4 -2
  168. package/dist/data/chat/Chat.js.map +1 -1
  169. package/dist/data/chat/Chat.runtime.cjs +14 -3
  170. package/dist/data/chat/Chat.runtime.cjs.map +1 -1
  171. package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
  172. package/dist/data/chat/Chat.runtime.js +15 -4
  173. package/dist/data/chat/Chat.runtime.js.map +1 -1
  174. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  175. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  176. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  177. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  178. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  179. package/dist/data/chat/index.d.ts +2 -1
  180. package/dist/data/chat/index.d.ts.map +1 -1
  181. package/dist/data/chat/tool-policy.cjs +132 -0
  182. package/dist/data/chat/tool-policy.cjs.map +1 -0
  183. package/dist/data/chat/tool-policy.d.ts +81 -0
  184. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  185. package/dist/data/chat/tool-policy.js +132 -0
  186. package/dist/data/chat/tool-policy.js.map +1 -0
  187. package/dist/data/chat/types.cjs +20 -0
  188. package/dist/data/chat/types.cjs.map +1 -1
  189. package/dist/data/chat/types.d.ts +22 -2
  190. package/dist/data/chat/types.d.ts.map +1 -1
  191. package/dist/data/chat/types.js +20 -0
  192. package/dist/data/chat/types.js.map +1 -1
  193. package/dist/data/debugConsoleSignal.cjs +64 -0
  194. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  195. package/dist/data/debugConsoleSignal.d.ts +83 -0
  196. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  197. package/dist/data/debugConsoleSignal.js +64 -0
  198. package/dist/data/debugConsoleSignal.js.map +1 -0
  199. package/dist/data/har/HarPanel.cjs +20 -14
  200. package/dist/data/har/HarPanel.cjs.map +1 -1
  201. package/dist/data/har/HarPanel.d.ts.map +1 -1
  202. package/dist/data/har/HarPanel.js +20 -14
  203. package/dist/data/har/HarPanel.js.map +1 -1
  204. package/dist/data/har/types.d.ts +18 -0
  205. package/dist/data/har/types.d.ts.map +1 -1
  206. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  207. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  208. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  209. package/dist/data/query-browser/QueryBrowser.js +5 -43
  210. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  211. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  212. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  213. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  214. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  215. package/dist/data/runtime/RuntimeBar.cjs +26 -41
  216. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  217. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  218. package/dist/data/runtime/RuntimeBar.js +28 -43
  219. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  220. package/dist/data/runtime/RuntimeBar.model.cjs +65 -0
  221. package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -1
  222. package/dist/data/runtime/RuntimeBar.model.d.ts +11 -3
  223. package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -1
  224. package/dist/data/runtime/RuntimeBar.model.js +65 -0
  225. package/dist/data/runtime/RuntimeBar.model.js.map +1 -1
  226. package/dist/data/runtime/model-capabilities.cjs +8 -5
  227. package/dist/data/runtime/model-capabilities.cjs.map +1 -1
  228. package/dist/data/runtime/model-capabilities.d.ts +6 -1
  229. package/dist/data/runtime/model-capabilities.d.ts.map +1 -1
  230. package/dist/data/runtime/model-capabilities.js +8 -5
  231. package/dist/data/runtime/model-capabilities.js.map +1 -1
  232. package/dist/data/runtime/runtime-mode.cjs +17 -0
  233. package/dist/data/runtime/runtime-mode.cjs.map +1 -1
  234. package/dist/data/runtime/runtime-mode.d.ts +6 -0
  235. package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
  236. package/dist/data/runtime/runtime-mode.js +17 -0
  237. package/dist/data/runtime/runtime-mode.js.map +1 -1
  238. package/dist/data/useDebugAction.cjs +29 -0
  239. package/dist/data/useDebugAction.cjs.map +1 -0
  240. package/dist/data/useDebugAction.d.ts +16 -0
  241. package/dist/data/useDebugAction.d.ts.map +1 -0
  242. package/dist/data/useDebugAction.js +29 -0
  243. package/dist/data/useDebugAction.js.map +1 -0
  244. package/dist/data/version-info.cjs +3 -3
  245. package/dist/data/version-info.js +3 -3
  246. package/dist/data.cjs +16 -8
  247. package/dist/data.cjs.map +1 -1
  248. package/dist/data.d.ts +3 -2
  249. package/dist/data.d.ts.map +1 -1
  250. package/dist/data.js +16 -8
  251. package/dist/devtools/DebugConsole.cjs +138 -0
  252. package/dist/devtools/DebugConsole.cjs.map +1 -0
  253. package/dist/devtools/DebugConsole.d.ts +23 -0
  254. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  255. package/dist/devtools/DebugConsole.js +138 -0
  256. package/dist/devtools/DebugConsole.js.map +1 -0
  257. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  258. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  259. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  260. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  261. package/dist/devtools/DebugConsoleButton.js +59 -0
  262. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  263. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  264. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  265. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  266. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  267. package/dist/devtools/DebugConsoleDock.js +112 -0
  268. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  269. package/dist/devtools/ExecutionDetail.cjs +135 -0
  270. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  271. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  272. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  273. package/dist/devtools/ExecutionDetail.js +135 -0
  274. package/dist/devtools/ExecutionDetail.js.map +1 -0
  275. package/dist/devtools/debugClient.cjs +172 -0
  276. package/dist/devtools/debugClient.cjs.map +1 -0
  277. package/dist/devtools/debugClient.d.ts +98 -0
  278. package/dist/devtools/debugClient.d.ts.map +1 -0
  279. package/dist/devtools/debugClient.js +172 -0
  280. package/dist/devtools/debugClient.js.map +1 -0
  281. package/dist/devtools/debugStore.cjs +115 -0
  282. package/dist/devtools/debugStore.cjs.map +1 -0
  283. package/dist/devtools/debugStore.d.ts +83 -0
  284. package/dist/devtools/debugStore.d.ts.map +1 -0
  285. package/dist/devtools/debugStore.js +115 -0
  286. package/dist/devtools/debugStore.js.map +1 -0
  287. package/dist/devtools/dockState.cjs +51 -0
  288. package/dist/devtools/dockState.cjs.map +1 -0
  289. package/dist/devtools/dockState.d.ts +31 -0
  290. package/dist/devtools/dockState.d.ts.map +1 -0
  291. package/dist/devtools/dockState.js +51 -0
  292. package/dist/devtools/dockState.js.map +1 -0
  293. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  294. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  295. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  296. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  297. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  298. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  299. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  300. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  301. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  302. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  303. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  304. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  305. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  306. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  307. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  308. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  309. package/dist/devtools/tabs/InspectionTab.js +316 -0
  310. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  311. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  312. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  313. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  314. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  315. package/dist/devtools/tabs/NetworkTab.js +91 -0
  316. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  317. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  318. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  319. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  320. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  321. package/dist/devtools/tabs/QueriesTab.js +85 -0
  322. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  323. package/dist/devtools/types.cjs +26 -0
  324. package/dist/devtools/types.cjs.map +1 -0
  325. package/dist/devtools/types.d.ts +235 -0
  326. package/dist/devtools/types.d.ts.map +1 -0
  327. package/dist/devtools/types.js +26 -0
  328. package/dist/devtools/types.js.map +1 -0
  329. package/dist/devtools/useDebugStream.cjs +46 -0
  330. package/dist/devtools/useDebugStream.cjs.map +1 -0
  331. package/dist/devtools/useDebugStream.d.ts +23 -0
  332. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  333. package/dist/devtools/useDebugStream.js +46 -0
  334. package/dist/devtools/useDebugStream.js.map +1 -0
  335. package/dist/devtools.cjs +51 -0
  336. package/dist/devtools.cjs.map +1 -0
  337. package/dist/devtools.d.ts +37 -0
  338. package/dist/devtools.d.ts.map +1 -0
  339. package/dist/devtools.js +51 -0
  340. package/dist/devtools.js.map +1 -0
  341. package/dist/icons/components/UiOpenScad.cjs +10 -0
  342. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  343. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  344. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  345. package/dist/icons/components/UiOpenScad.js +10 -0
  346. package/dist/icons/components/UiOpenScad.js.map +1 -0
  347. package/dist/icons/index.d.ts +1 -0
  348. package/dist/icons/index.d.ts.map +1 -1
  349. package/dist/icons/registry.cjs +2 -0
  350. package/dist/icons/registry.cjs.map +1 -1
  351. package/dist/icons/registry.d.ts.map +1 -1
  352. package/dist/icons/registry.js +2 -0
  353. package/dist/icons/registry.js.map +1 -1
  354. package/dist/icons.cjs +2 -0
  355. package/dist/icons.cjs.map +1 -1
  356. package/dist/icons.js +2 -0
  357. package/dist/icons.js.map +1 -1
  358. package/dist/index.cjs +20 -8
  359. package/dist/index.cjs.map +1 -1
  360. package/dist/index.js +20 -8
  361. package/dist/index.js.map +1 -1
  362. package/dist/layout/AppShell.cjs +15 -10
  363. package/dist/layout/AppShell.cjs.map +1 -1
  364. package/dist/layout/AppShell.d.ts +11 -0
  365. package/dist/layout/AppShell.d.ts.map +1 -1
  366. package/dist/layout/AppShell.js +15 -10
  367. package/dist/layout/AppShell.js.map +1 -1
  368. package/dist/layout/AppShell.nav.cjs +170 -49
  369. package/dist/layout/AppShell.nav.cjs.map +1 -1
  370. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  371. package/dist/layout/AppShell.nav.js +170 -49
  372. package/dist/layout/AppShell.nav.js.map +1 -1
  373. package/dist/overlay/CellActions.cjs +18 -124
  374. package/dist/overlay/CellActions.cjs.map +1 -1
  375. package/dist/overlay/CellActions.d.ts +1 -1
  376. package/dist/overlay/CellActions.d.ts.map +1 -1
  377. package/dist/overlay/CellActions.js +18 -124
  378. package/dist/overlay/CellActions.js.map +1 -1
  379. package/dist/overlay/ContextMenu.cjs +144 -0
  380. package/dist/overlay/ContextMenu.cjs.map +1 -0
  381. package/dist/overlay/ContextMenu.d.ts +8 -0
  382. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  383. package/dist/overlay/ContextMenu.js +144 -0
  384. package/dist/overlay/ContextMenu.js.map +1 -0
  385. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  386. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  387. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  388. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  389. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  390. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  391. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  392. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  393. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  394. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  395. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  396. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  397. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  398. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  399. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  400. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  401. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  402. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  403. package/dist/profiles/connections/index.d.ts +1 -0
  404. package/dist/profiles/connections/index.d.ts.map +1 -1
  405. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  406. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  407. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  408. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  409. package/dist/profiles/connections/inspectionStatus.js +44 -0
  410. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  411. package/dist/profiles/connections/useInspection.cjs +123 -0
  412. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  413. package/dist/profiles/connections/useInspection.d.ts +35 -0
  414. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  415. package/dist/profiles/connections/useInspection.js +123 -0
  416. package/dist/profiles/connections/useInspection.js.map +1 -0
  417. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  418. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  419. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  420. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  421. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  422. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  423. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  424. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  425. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  426. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  427. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  428. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  429. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  430. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  431. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  432. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  433. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  434. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  435. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  436. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  437. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  438. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  439. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  440. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  441. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  442. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  443. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  444. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  445. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  446. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  447. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  448. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  449. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  450. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  451. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  452. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  453. package/dist/profiles/query/profileSamplePayload.js +6 -4
  454. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  455. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  456. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  457. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  458. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  459. package/dist/profiles/query/profileSampleResult.js +26 -0
  460. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  461. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  462. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  463. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  464. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  465. package/dist/profiles/query/queryTargetPicker.js +5 -3
  466. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  467. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  468. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  469. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  470. package/dist/profiles/wizard/profileWizard.js +15 -6
  471. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  472. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  473. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  474. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  475. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  476. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  477. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  478. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  479. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  480. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  481. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  482. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  483. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  484. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  485. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  486. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  487. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  488. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  489. package/dist/profiles.cjs +8 -2
  490. package/dist/profiles.cjs.map +1 -1
  491. package/dist/profiles.js +10 -4
  492. package/dist/profiles.js.map +1 -1
  493. package/dist/rpc/FilterForm.cjs +21 -237
  494. package/dist/rpc/FilterForm.cjs.map +1 -1
  495. package/dist/rpc/FilterForm.d.ts +3 -1
  496. package/dist/rpc/FilterForm.d.ts.map +1 -1
  497. package/dist/rpc/FilterForm.js +21 -237
  498. package/dist/rpc/FilterForm.js.map +1 -1
  499. package/dist/rpc/FilterFormFields.cjs +240 -0
  500. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  501. package/dist/rpc/FilterFormFields.d.ts +12 -0
  502. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  503. package/dist/rpc/FilterFormFields.js +240 -0
  504. package/dist/rpc/FilterFormFields.js.map +1 -0
  505. package/dist/rpc/router.cjs +3 -2
  506. package/dist/rpc/router.cjs.map +1 -1
  507. package/dist/rpc/router.d.ts.map +1 -1
  508. package/dist/rpc/router.js +3 -2
  509. package/dist/rpc/router.js.map +1 -1
  510. package/dist/rpc/types.cjs.map +1 -1
  511. package/dist/rpc/types.d.ts +3 -1
  512. package/dist/rpc/types.d.ts.map +1 -1
  513. package/dist/rpc/types.js.map +1 -1
  514. package/dist/styles.css +1 -1
  515. package/package.json +6 -1
  516. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  517. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  518. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  519. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  520. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  521. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  522. package/dist/data/query-info/index.d.ts +0 -4
  523. package/dist/data/query-info/index.d.ts.map +0 -1
  524. package/dist/data/query-info/queryInfo.cjs +0 -42
  525. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  526. package/dist/data/query-info/queryInfo.d.ts +0 -45
  527. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  528. package/dist/data/query-info/queryInfo.js +0 -42
  529. package/dist/data/query-info/queryInfo.js.map +0 -1
  530. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  531. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  532. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  533. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  534. package/dist/data/query-info/useQueryInfo.js +0 -48
  535. package/dist/data/query-info/useQueryInfo.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"model-capabilities.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/model-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMjE,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAErD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,MAAM,EAAE,CAIV;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,qBAAqB,EACxE,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,CAAC,CAiCH"}
1
+ {"version":3,"file":"model-capabilities.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/model-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIjE,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAErD,sEAAsE;AACtE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,MAAM,EAAE,CAIV;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,qBAAqB,EACxE,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,SAAS,CAAC,EAAE;IACV,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B,GACA,CAAC,CAqCH"}
@@ -3,20 +3,23 @@ function effortOptionsForModel(model, fallbackEfforts) {
3
3
  if (!model.reasoning) return [];
4
4
  return [...model.supportedEfforts ?? []];
5
5
  }
6
- function reconcileModelCapabilities(value, model, fallbackEfforts) {
6
+ function reconcileModelCapabilities(value, model, fallbackEfforts, execution) {
7
7
  const next = { ...value };
8
8
  if (model == null ? void 0 : model.runtime) {
9
9
  delete next.model;
10
10
  delete next.id;
11
11
  delete next.backend;
12
- delete next.temperature;
13
- delete next.effort;
14
- delete next.noCache;
15
- delete next.fallbacks;
12
+ delete next.mode;
16
13
  Object.assign(next, model.runtime);
17
14
  } else if (model) {
18
15
  next.model = model.id;
19
16
  }
17
+ if (execution) {
18
+ if (execution.backend) next.backend = execution.backend;
19
+ else delete next.backend;
20
+ if (execution.mode) next.mode = execution.mode;
21
+ else delete next.mode;
22
+ }
20
23
  const efforts = effortOptionsForModel(model, fallbackEfforts);
21
24
  if ((model == null ? void 0 : model.capabilitiesKnown) && efforts.length === 0) {
22
25
  delete next.effort;
@@ -1 +1 @@
1
- {"version":3,"file":"model-capabilities.js","sources":["../../../src/data/runtime/model-capabilities.ts"],"sourcesContent":["import type { ChatModel, ChatModelRuntime } from \"../chat/types\";\n\n// A runtime control edits exactly the wire value a catalog row\n// carries (`reconcileModelCapabilities` copies one onto the other), so it stays\n// one declaration a field added to the catalog shape cannot drift out of the\n// editable shape.\nexport type ModelRuntimeSelection = ChatModelRuntime;\n\nexport function effortOptionsForModel(\n model: ChatModel | undefined,\n fallbackEfforts: readonly string[],\n): string[] {\n if (!model?.capabilitiesKnown) return [...fallbackEfforts];\n if (!model.reasoning) return [];\n return [...(model.supportedEfforts ?? [])];\n}\n\nexport function reconcileModelCapabilities<T extends ModelRuntimeSelection>(\n value: T,\n model: ChatModel | undefined,\n fallbackEfforts: readonly string[],\n): T {\n const next = { ...value } as ModelRuntimeSelection;\n if (model?.runtime) {\n delete next.model;\n delete next.id;\n delete next.backend;\n delete next.temperature;\n delete next.effort;\n delete next.noCache;\n delete next.fallbacks;\n Object.assign(next, model.runtime);\n } else if (model) {\n next.model = model.id;\n }\n\n const efforts = effortOptionsForModel(model, fallbackEfforts);\n if (model?.capabilitiesKnown && efforts.length === 0) {\n delete next.effort;\n } else if (\n efforts.length > 0 &&\n (!next.effort || !efforts.includes(next.effort))\n ) {\n const preferred = model?.defaultEffort;\n next.effort =\n preferred && efforts.includes(preferred)\n ? preferred\n : efforts.includes(\"medium\")\n ? \"medium\"\n : efforts[0]!;\n }\n\n if (model?.temperature === false) delete next.temperature;\n return next as T;\n}\n"],"names":[],"mappings":"AAQO,SAAS,sBACd,OACA,iBACU;AACV,MAAI,EAAC,+BAAO,mBAAmB,QAAO,CAAC,GAAG,eAAe;AACzD,MAAI,CAAC,MAAM,UAAW,QAAO,CAAA;AAC7B,SAAO,CAAC,GAAI,MAAM,oBAAoB,EAAG;AAC3C;AAEO,SAAS,2BACd,OACA,OACA,iBACG;AACH,QAAM,OAAO,EAAE,GAAG,MAAA;AAClB,MAAI,+BAAO,SAAS;AAClB,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,OAAO,MAAM,MAAM,OAAO;AAAA,EACnC,WAAW,OAAO;AAChB,SAAK,QAAQ,MAAM;AAAA,EACrB;AAEA,QAAM,UAAU,sBAAsB,OAAO,eAAe;AAC5D,OAAI,+BAAO,sBAAqB,QAAQ,WAAW,GAAG;AACpD,WAAO,KAAK;AAAA,EACd,WACE,QAAQ,SAAS,MAChB,CAAC,KAAK,UAAU,CAAC,QAAQ,SAAS,KAAK,MAAM,IAC9C;AACA,UAAM,YAAY,+BAAO;AACzB,SAAK,SACH,aAAa,QAAQ,SAAS,SAAS,IACnC,YACA,QAAQ,SAAS,QAAQ,IACvB,WACF,QAAQ,CAAC;AAAA,EACjB;AAEA,OAAI,+BAAO,iBAAgB,MAAO,QAAO,KAAK;AAC9C,SAAO;AACT;"}
1
+ {"version":3,"file":"model-capabilities.js","sources":["../../../src/data/runtime/model-capabilities.ts"],"sourcesContent":["import type { ChatModel, ChatModelRuntime } from \"../chat/types\";\n\n// Runtime controls and catalog rows share one wire shape. Reconciliation copies\n// catalog identity while retaining user-owned runtime options that remain valid.\nexport type ModelRuntimeSelection = ChatModelRuntime;\n\n/** Lists the effort values accepted by the selected catalog model. */\nexport function effortOptionsForModel(\n model: ChatModel | undefined,\n fallbackEfforts: readonly string[],\n): string[] {\n if (!model?.capabilitiesKnown) return [...fallbackEfforts];\n if (!model.reasoning) return [];\n return [...(model.supportedEfforts ?? [])];\n}\n\n/** Applies catalog identity and capabilities under the caller's execution policy. */\nexport function reconcileModelCapabilities<T extends ModelRuntimeSelection>(\n value: T,\n model: ChatModel | undefined,\n fallbackEfforts: readonly string[],\n execution?: {\n backend: string | undefined;\n mode: string | undefined;\n },\n): T {\n const next = { ...value } as ModelRuntimeSelection;\n if (model?.runtime) {\n delete next.model;\n delete next.id;\n delete next.backend;\n delete next.mode;\n Object.assign(next, model.runtime);\n } else if (model) {\n next.model = model.id;\n }\n\n if (execution) {\n if (execution.backend) next.backend = execution.backend;\n else delete next.backend;\n if (execution.mode) next.mode = execution.mode;\n else delete next.mode;\n }\n\n const efforts = effortOptionsForModel(model, fallbackEfforts);\n if (model?.capabilitiesKnown && efforts.length === 0) {\n delete next.effort;\n } else if (\n efforts.length > 0 &&\n (!next.effort || !efforts.includes(next.effort))\n ) {\n const preferred = model?.defaultEffort;\n next.effort =\n preferred && efforts.includes(preferred)\n ? preferred\n : efforts.includes(\"medium\")\n ? \"medium\"\n : efforts[0]!;\n }\n\n if (model?.temperature === false) delete next.temperature;\n return next as T;\n}\n"],"names":[],"mappings":"AAOO,SAAS,sBACd,OACA,iBACU;AACV,MAAI,EAAC,+BAAO,mBAAmB,QAAO,CAAC,GAAG,eAAe;AACzD,MAAI,CAAC,MAAM,UAAW,QAAO,CAAA;AAC7B,SAAO,CAAC,GAAI,MAAM,oBAAoB,EAAG;AAC3C;AAGO,SAAS,2BACd,OACA,OACA,iBACA,WAIG;AACH,QAAM,OAAO,EAAE,GAAG,MAAA;AAClB,MAAI,+BAAO,SAAS;AAClB,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,KAAK;AACZ,WAAO,OAAO,MAAM,MAAM,OAAO;AAAA,EACnC,WAAW,OAAO;AAChB,SAAK,QAAQ,MAAM;AAAA,EACrB;AAEA,MAAI,WAAW;AACb,QAAI,UAAU,QAAS,MAAK,UAAU,UAAU;AAAA,gBACpC,KAAK;AACjB,QAAI,UAAU,KAAM,MAAK,OAAO,UAAU;AAAA,gBAC9B,KAAK;AAAA,EACnB;AAEA,QAAM,UAAU,sBAAsB,OAAO,eAAe;AAC5D,OAAI,+BAAO,sBAAqB,QAAQ,WAAW,GAAG;AACpD,WAAO,KAAK;AAAA,EACd,WACE,QAAQ,SAAS,MAChB,CAAC,KAAK,UAAU,CAAC,QAAQ,SAAS,KAAK,MAAM,IAC9C;AACA,UAAM,YAAY,+BAAO;AACzB,SAAK,SACH,aAAa,QAAQ,SAAS,SAAS,IACnC,YACA,QAAQ,SAAS,QAAQ,IACvB,WACF,QAAQ,CAAC;AAAA,EACjB;AAEA,OAAI,+BAAO,iBAAgB,MAAO,QAAO,KAAK;AAC9C,SAAO;AACT;"}
@@ -274,6 +274,21 @@ function modelBelongsToFamily(modelId, models, family, backend) {
274
274
  const providerMatches = !provider || selected.provider === provider;
275
275
  return providerMatches && modelMatchesBackend(selected, backend);
276
276
  }
277
+ function modelForFamily(modelId, models, family, backend) {
278
+ if (!modelId) return void 0;
279
+ const matches = modelsForFamily(models, family, backend).filter(
280
+ (model) => {
281
+ var _a, _b;
282
+ return model.id === modelId || ((_a = model.runtime) == null ? void 0 : _a.model) === modelId || ((_b = model.runtime) == null ? void 0 : _b.id) === modelId;
283
+ }
284
+ );
285
+ return matches.find(
286
+ (model) => {
287
+ var _a;
288
+ return !backend || !((_a = model.runtime) == null ? void 0 : _a.backend) || model.runtime.backend === backend;
289
+ }
290
+ ) ?? (matches.length === 1 ? matches[0] : void 0);
291
+ }
277
292
  function modelMatchesBackend(model, backend) {
278
293
  var _a;
279
294
  if (!backend) return true;
@@ -290,6 +305,8 @@ exports.firstMode = firstMode;
290
305
  exports.labelForBackend = labelForBackend;
291
306
  exports.modeForBackend = modeForBackend;
292
307
  exports.modelBelongsToFamily = modelBelongsToFamily;
308
+ exports.modelForFamily = modelForFamily;
309
+ exports.modelMatchesBackend = modelMatchesBackend;
293
310
  exports.modelsForFamily = modelsForFamily;
294
311
  exports.runtimeModeOptions = runtimeModeOptions;
295
312
  exports.selectionForBackend = selectionForBackend;
@@ -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 { ChatModel, RuntimeAvailability } from \"../chat/types\";\nimport {\n availabilityText,\n isSelectableModel,\n isUnavailable,\n unsupportedAvailability,\n} from \"./availability\";\n\n// A backend runtime is factored into two UI axes — a provider\n// **family** (Claude, OpenAI, …) and a **mode** within it (Agent, CLI, cmux,\n// API) — that together resolve to a single `spec.backend` string. This is the\n// only place that mapping lives; both the inline PromptRunEditor and the modal\n// SpecRuntimeEditor drive their Mode pickers from it.\n\nexport type SpecRuntimeModeOption = {\n /** UI mode id within a family (e.g. \"agent\", \"cli\", \"cmux\", \"api\"). */\n id: string;\n label: string;\n /** The concrete `spec.backend` this (family, mode) resolves to. */\n backend: string;\n icon?: StaticIconComponent | undefined;\n title?: string | undefined;\n provider?: string | undefined;\n availability?: RuntimeAvailability | 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// Default catalog covering the captain/gavel backend set. Hosts may pass their\n// own via the `families` prop when their catalog differs.\nexport const SPEC_RUNTIME_FAMILIES: SpecRuntimeFamily[] = [\n {\n id: \"claude\",\n label: \"Claude\",\n provider: \"claude-agent\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"claude-agent\",\n icon: UiRobotAi,\n title: \"Claude Agent SDK\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"claude-cli\",\n icon: UiTerminal,\n title: \"Claude Code CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"claude-cmux\",\n icon: UiColumns,\n title: \"Claude multiplexer\",\n },\n ],\n },\n {\n id: \"codex\",\n label: \"Codex\",\n provider: \"codex-cli\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"codex-agent\",\n icon: UiRobotAi,\n title: \"Codex agent\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"codex-cli\",\n icon: UiTerminal,\n title: \"Codex CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"codex-cmux\",\n icon: UiColumns,\n title: \"Codex multiplexer\",\n },\n ],\n },\n {\n id: \"openai\",\n label: \"OpenAI\",\n provider: \"openai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"openai\",\n icon: UiCloud,\n title: \"OpenAI API\",\n },\n ],\n },\n {\n id: \"anthropic\",\n label: \"Anthropic\",\n provider: \"anthropic\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"anthropic\",\n icon: UiCloud,\n title: \"Anthropic API\",\n },\n ],\n },\n {\n id: \"gemini\",\n label: \"Gemini\",\n provider: \"googleai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"gemini\",\n icon: UiCloud,\n title: \"Gemini API\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"gemini-cli\",\n icon: UiTerminal,\n title: \"Gemini CLI\",\n },\n ],\n },\n {\n id: \"deepseek\",\n label: \"DeepSeek\",\n provider: \"deepseek\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"deepseek\",\n icon: UiCloud,\n title: \"DeepSeek API\",\n },\n ],\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 /** api | agent | cli | cmux */\n mode: string;\n /** The concrete `spec.backend`, e.g. \"claude-cmux\". */\n backend: string;\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};\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 backend: mode.backend,\n icon: MODE_ICONS[mode.mode],\n title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,\n provider: mode.catalogProvider ?? entry.catalogPrefix,\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.backend\n } in Captain configuration.`,\n remediation: `Enable ${\n mode.disabledReason ?? mode.backend\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 returned `backend` belongs\n// to the family that declared the mode first — resolve the real one with\n// `backendForFamilyMode`.\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\nexport function backendForFamilyMode(\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.backend;\n}\n\nexport function selectionForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): { family: string; mode: string } {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return { family: family.id, mode: mode.id };\n }\n }\n }\n const first = familyById(families, \"\");\n return { family: first.id, mode: firstMode(first).id };\n}\n\nexport function familyForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeFamily | undefined {\n const target = (backend ?? \"\").toLowerCase();\n return families.find((family) =>\n family.modes.some((mode) => mode.backend.toLowerCase() === target)\n );\n}\n\n// The mode a backend id names, or undefined when the catalog does not declare\n// it. Unlike `selectionForBackend` this does not fall back to the first family,\n// so a summary can stay silent about a runtime it cannot identify.\nexport function modeForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeModeOption | undefined {\n const target = (backend ?? \"\").toLowerCase();\n if (!target) return undefined;\n for (const family of families) {\n const mode = family.modes.find(\n (entry) => entry.backend.toLowerCase() === target\n );\n if (mode) return mode;\n }\n return undefined;\n}\n\n// \"claude-agent\" -> \"Claude Agent\"; unknown/empty -> \"Prompt default\".\nexport function labelForBackend(\n backend: string | undefined,\n families: SpecRuntimeFamily[] = SPEC_RUNTIME_FAMILIES\n): string {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return `${family.label} ${mode.label}`;\n }\n }\n }\n return \"Prompt default\";\n}\n\nexport function modelsForFamily(\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: string | undefined\n): ChatModel[] {\n if (!family) return models.filter(isSelectableModel);\n const provider =\n family.modes.find((mode) => mode.backend === backend)?.provider ??\n family.provider;\n return models.filter(\n (model) =>\n isSelectableModel(model) &&\n model.provider === provider &&\n modelMatchesBackend(model, backend)\n );\n}\n\nexport function modelBelongsToFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: 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((mode) => mode.backend === backend)?.provider ??\n family?.provider;\n const providerMatches = !provider || selected.provider === provider;\n return providerMatches && modelMatchesBackend(selected, backend);\n}\n\nfunction modelMatchesBackend(\n model: ChatModel,\n backend: string | undefined\n): boolean {\n if (!backend) return true;\n const backends = model.backends?.filter(Boolean);\n if (!backends || backends.length === 0) return true;\n return backends.includes(backend);\n}\n"],"names":["UiRobotAi","UiTerminal","UiColumns","UiCloud","isUnavailable","isSelectableModel","_a"],"mappings":"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"}
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 { ChatModel, RuntimeAvailability } from \"../chat/types\";\nimport {\n availabilityText,\n isSelectableModel,\n isUnavailable,\n unsupportedAvailability,\n} from \"./availability\";\n\n// A backend runtime is factored into two UI axes — a provider\n// **family** (Claude, OpenAI, …) and a **mode** within it (Agent, CLI, cmux,\n// API) — that together resolve to a single `spec.backend` string. This is the\n// only place that mapping lives; both the inline PromptRunEditor and the modal\n// SpecRuntimeEditor drive their Mode pickers from it.\n\nexport type SpecRuntimeModeOption = {\n /** UI mode id within a family (e.g. \"agent\", \"cli\", \"cmux\", \"api\"). */\n id: string;\n label: string;\n /** The concrete `spec.backend` this (family, mode) resolves to. */\n backend: string;\n icon?: StaticIconComponent | undefined;\n title?: string | undefined;\n provider?: string | undefined;\n availability?: RuntimeAvailability | 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// Default catalog covering the captain/gavel backend set. Hosts may pass their\n// own via the `families` prop when their catalog differs.\nexport const SPEC_RUNTIME_FAMILIES: SpecRuntimeFamily[] = [\n {\n id: \"claude\",\n label: \"Claude\",\n provider: \"claude-agent\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"claude-agent\",\n icon: UiRobotAi,\n title: \"Claude Agent SDK\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"claude-cli\",\n icon: UiTerminal,\n title: \"Claude Code CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"claude-cmux\",\n icon: UiColumns,\n title: \"Claude multiplexer\",\n },\n ],\n },\n {\n id: \"codex\",\n label: \"Codex\",\n provider: \"codex-cli\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"codex-agent\",\n icon: UiRobotAi,\n title: \"Codex agent\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"codex-cli\",\n icon: UiTerminal,\n title: \"Codex CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"codex-cmux\",\n icon: UiColumns,\n title: \"Codex multiplexer\",\n },\n ],\n },\n {\n id: \"openai\",\n label: \"OpenAI\",\n provider: \"openai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"openai\",\n icon: UiCloud,\n title: \"OpenAI API\",\n },\n ],\n },\n {\n id: \"anthropic\",\n label: \"Anthropic\",\n provider: \"anthropic\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"anthropic\",\n icon: UiCloud,\n title: \"Anthropic API\",\n },\n ],\n },\n {\n id: \"gemini\",\n label: \"Gemini\",\n provider: \"googleai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"gemini\",\n icon: UiCloud,\n title: \"Gemini API\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"gemini-cli\",\n icon: UiTerminal,\n title: \"Gemini CLI\",\n },\n ],\n },\n {\n id: \"deepseek\",\n label: \"DeepSeek\",\n provider: \"deepseek\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"deepseek\",\n icon: UiCloud,\n title: \"DeepSeek API\",\n },\n ],\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 /** api | agent | cli | cmux */\n mode: string;\n /** The concrete `spec.backend`, e.g. \"claude-cmux\". */\n backend: string;\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};\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 backend: mode.backend,\n icon: MODE_ICONS[mode.mode],\n title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,\n provider: mode.catalogProvider ?? entry.catalogPrefix,\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.backend\n } in Captain configuration.`,\n remediation: `Enable ${\n mode.disabledReason ?? mode.backend\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 returned `backend` belongs\n// to the family that declared the mode first — resolve the real one with\n// `backendForFamilyMode`.\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\nexport function backendForFamilyMode(\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.backend;\n}\n\nexport function selectionForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): { family: string; mode: string } {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return { family: family.id, mode: mode.id };\n }\n }\n }\n const first = familyById(families, \"\");\n return { family: first.id, mode: firstMode(first).id };\n}\n\nexport function familyForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeFamily | undefined {\n const target = (backend ?? \"\").toLowerCase();\n return families.find((family) =>\n family.modes.some((mode) => mode.backend.toLowerCase() === target)\n );\n}\n\n// The mode a backend id names, or undefined when the catalog does not declare\n// it. Unlike `selectionForBackend` this does not fall back to the first family,\n// so a summary can stay silent about a runtime it cannot identify.\nexport function modeForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeModeOption | undefined {\n const target = (backend ?? \"\").toLowerCase();\n if (!target) return undefined;\n for (const family of families) {\n const mode = family.modes.find(\n (entry) => entry.backend.toLowerCase() === target\n );\n if (mode) return mode;\n }\n return undefined;\n}\n\n// \"claude-agent\" -> \"Claude Agent\"; unknown/empty -> \"Prompt default\".\nexport function labelForBackend(\n backend: string | undefined,\n families: SpecRuntimeFamily[] = SPEC_RUNTIME_FAMILIES\n): string {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return `${family.label} ${mode.label}`;\n }\n }\n }\n return \"Prompt default\";\n}\n\n/** Lists selectable models by provider and declared backend support. */\nexport function modelsForFamily(\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: string | undefined\n): ChatModel[] {\n if (!family) return models.filter(isSelectableModel);\n const provider =\n family.modes.find((mode) => mode.backend === backend)?.provider ??\n family.provider;\n return models.filter(\n (model) =>\n isSelectableModel(model) &&\n model.provider === provider &&\n modelMatchesBackend(model, backend)\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 backend?: 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((mode) => mode.backend === backend)?.provider ??\n family?.provider;\n const providerMatches = !provider || selected.provider === provider;\n return providerMatches && modelMatchesBackend(selected, backend);\n}\n\n/** Resolves a target backend row, using a sole shared row as fallback. */\nexport function modelForFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: string | undefined\n): ChatModel | undefined {\n if (!modelId) return undefined;\n const matches = modelsForFamily(models, family, backend).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) =>\n !backend ||\n !model.runtime?.backend ||\n model.runtime.backend === backend\n ) ?? (matches.length === 1 ? matches[0] : undefined)\n );\n}\n\n/** Checks a model row's declared runtime backends when the catalog scopes it. */\nexport function modelMatchesBackend(\n model: ChatModel,\n backend: string | undefined\n): boolean {\n if (!backend) return true;\n const backends = model.backends?.filter(Boolean);\n if (!backends || backends.length === 0) return true;\n return backends.includes(backend);\n}\n"],"names":["UiRobotAi","UiTerminal","UiColumns","UiCloud","isUnavailable","isSelectableModel","_a"],"mappings":";;;;;;;AAsCO,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,SAAS;AAAA,QACT,MAAMA,UAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAMC,WAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAMC,UAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;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,SAAS;AAAA,QACT,MAAMF,UAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAMC,WAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAMC,UAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;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,SAAS;AAAA,QACT,MAAMC,QAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;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,SAAS;AAAA,QACT,MAAMA,QAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;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,SAAS;AAAA,QACT,MAAMA,QAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAMF,WAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;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,SAAS;AAAA,QACT,MAAME,QAAAA;AAAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,EACF;AAEJ;AAmCA,MAAM,aAAkD;AAAA,EACtD,KAAKA,QAAAA;AAAAA,EACL,OAAOH,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,SAAS,KAAK;AAAA,MACd,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,eACL,EAAE,cAAc,KAAK,aAAA,IACrB,KAAK,WACL;AAAA,QACE,cAAc;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ,eACN,KAAK,kBAAkB,KAAK,OAC9B;AAAA,UACA,aAAa,UACX,KAAK,kBAAkB,KAAK,OAC9B;AAAA,QAAA;AAAA,MACF,IAEF,CAAA;AAAA,IAAC,EACL;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,CAACE,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;AA6BO,SAAS,qBACd,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,oBACd,UACA,SACkC;AAClC,QAAM,UAAU,WAAW,IAAI,YAAA;AAC/B,aAAW,UAAU,UAAU;AAC7B,eAAW,QAAQ,OAAO,OAAO;AAC/B,UAAI,KAAK,QAAQ,YAAA,MAAkB,QAAQ;AACzC,eAAO,EAAE,QAAQ,OAAO,IAAI,MAAM,KAAK,GAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,WAAW,UAAU,EAAE;AACrC,SAAO,EAAE,QAAQ,MAAM,IAAI,MAAM,UAAU,KAAK,EAAE,GAAA;AACpD;AAEO,SAAS,iBACd,UACA,SAC+B;AAC/B,QAAM,UAAU,WAAW,IAAI,YAAA;AAC/B,SAAO,SAAS;AAAA,IAAK,CAAC,WACpB,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,QAAQ,YAAA,MAAkB,MAAM;AAAA,EAAA;AAErE;AAKO,SAAS,eACd,UACA,SACmC;AACnC,QAAM,UAAU,WAAW,IAAI,YAAA;AAC/B,MAAI,CAAC,OAAQ,QAAO;AACpB,aAAW,UAAU,UAAU;AAC7B,UAAM,OAAO,OAAO,MAAM;AAAA,MACxB,CAAC,UAAU,MAAM,QAAQ,kBAAkB;AAAA,IAAA;AAE7C,QAAI,KAAM,QAAO;AAAA,EACnB;AACA,SAAO;AACT;AAGO,SAAS,gBACd,SACA,WAAgC,uBACxB;AACR,QAAM,UAAU,WAAW,IAAI,YAAA;AAC/B,aAAW,UAAU,UAAU;AAC7B,eAAW,QAAQ,OAAO,OAAO;AAC/B,UAAI,KAAK,QAAQ,YAAA,MAAkB,QAAQ;AACzC,eAAO,GAAG,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,gBACd,QACA,QACA,SACa;;AACb,MAAI,CAAC,OAAQ,QAAO,OAAO,OAAOC,aAAAA,iBAAiB;AACnD,QAAM,aACJ,YAAO,MAAM,KAAK,CAAC,SAAS,KAAK,YAAY,OAAO,MAApD,mBAAuD,aACvD,OAAO;AACT,SAAO,OAAO;AAAA,IACZ,CAAC,UACCA,+BAAkB,KAAK,KACvB,MAAM,aAAa,YACnB,oBAAoB,OAAO,OAAO;AAAA,EAAA;AAExC;AAGO,SAAS,qBACd,SACA,QACA,QACA,SACS;;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,aACzB,WAAM,YAAN,mBAAe,QAAO;AAAA;AAAA,EAAA;AAE5B,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,aACJ,sCAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,YAAY,aAA9C,mBAAwD,cACxD,iCAAQ;AACV,QAAM,kBAAkB,CAAC,YAAY,SAAS,aAAa;AAC3D,SAAO,mBAAmB,oBAAoB,UAAU,OAAO;AACjE;AAGO,SAAS,eACd,SACA,QACA,QACA,SACuB;AACvB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,gBAAgB,QAAQ,QAAQ,OAAO,EAAE;AAAA,IACvD,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;;AACC,cAAC,WACD,GAAC,WAAM,YAAN,mBAAe,YAChB,MAAM,QAAQ,YAAY;AAAA;AAAA,EAAA,MACxB,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAE9C;AAGO,SAAS,oBACd,OACA,SACS;;AACT,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,YAAW,WAAM,aAAN,mBAAgB,OAAO;AACxC,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO;AAC/C,SAAO,SAAS,SAAS,OAAO;AAClC;;;;;;;;;;;;;;;"}
@@ -60,6 +60,12 @@ export declare function selectionForBackend(families: SpecRuntimeFamily[], backe
60
60
  export declare function familyForBackend(families: SpecRuntimeFamily[], backend: string | undefined): SpecRuntimeFamily | undefined;
61
61
  export declare function modeForBackend(families: SpecRuntimeFamily[], backend: string | undefined): SpecRuntimeModeOption | undefined;
62
62
  export declare function labelForBackend(backend: string | undefined, families?: SpecRuntimeFamily[]): string;
63
+ /** Lists selectable models by provider and declared backend support. */
63
64
  export declare function modelsForFamily(models: ChatModel[], family: SpecRuntimeFamily | undefined, backend?: string | undefined): ChatModel[];
65
+ /** Reports whether the first matching catalog identity belongs to the target family. */
64
66
  export declare function modelBelongsToFamily(modelId: string | undefined, models: ChatModel[], family: SpecRuntimeFamily | undefined, backend?: string | undefined): boolean;
67
+ /** Resolves a target backend row, using a sole shared row as fallback. */
68
+ export declare function modelForFamily(modelId: string | undefined, models: ChatModel[], family: SpecRuntimeFamily | undefined, backend?: string | undefined): ChatModel | undefined;
69
+ /** Checks a model row's declared runtime backends when the catalog scopes it. */
70
+ export declare function modelMatchesBackend(model: ChatModel, backend: string | undefined): boolean;
65
71
  //# sourceMappingURL=runtime-mode.d.ts.map
@@ -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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"}
@@ -272,6 +272,21 @@ function modelBelongsToFamily(modelId, models, family, backend) {
272
272
  const providerMatches = !provider || selected.provider === provider;
273
273
  return providerMatches && modelMatchesBackend(selected, backend);
274
274
  }
275
+ function modelForFamily(modelId, models, family, backend) {
276
+ if (!modelId) return void 0;
277
+ const matches = modelsForFamily(models, family, backend).filter(
278
+ (model) => {
279
+ var _a, _b;
280
+ return model.id === modelId || ((_a = model.runtime) == null ? void 0 : _a.model) === modelId || ((_b = model.runtime) == null ? void 0 : _b.id) === modelId;
281
+ }
282
+ );
283
+ return matches.find(
284
+ (model) => {
285
+ var _a;
286
+ return !backend || !((_a = model.runtime) == null ? void 0 : _a.backend) || model.runtime.backend === backend;
287
+ }
288
+ ) ?? (matches.length === 1 ? matches[0] : void 0);
289
+ }
275
290
  function modelMatchesBackend(model, backend) {
276
291
  var _a;
277
292
  if (!backend) return true;
@@ -289,6 +304,8 @@ export {
289
304
  labelForBackend,
290
305
  modeForBackend,
291
306
  modelBelongsToFamily,
307
+ modelForFamily,
308
+ modelMatchesBackend,
292
309
  modelsForFamily,
293
310
  runtimeModeOptions,
294
311
  selectionForBackend
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-mode.js","sources":["../../../src/data/runtime/runtime-mode.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport { UiCloud, UiColumns, UiRobotAi, UiTerminal } from \"../../icons\";\nimport type { ChatModel, RuntimeAvailability } from \"../chat/types\";\nimport {\n availabilityText,\n isSelectableModel,\n isUnavailable,\n unsupportedAvailability,\n} from \"./availability\";\n\n// A backend runtime is factored into two UI axes — a provider\n// **family** (Claude, OpenAI, …) and a **mode** within it (Agent, CLI, cmux,\n// API) — that together resolve to a single `spec.backend` string. This is the\n// only place that mapping lives; both the inline PromptRunEditor and the modal\n// SpecRuntimeEditor drive their Mode pickers from it.\n\nexport type SpecRuntimeModeOption = {\n /** UI mode id within a family (e.g. \"agent\", \"cli\", \"cmux\", \"api\"). */\n id: string;\n label: string;\n /** The concrete `spec.backend` this (family, mode) resolves to. */\n backend: string;\n icon?: StaticIconComponent | undefined;\n title?: string | undefined;\n provider?: string | undefined;\n availability?: RuntimeAvailability | 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// Default catalog covering the captain/gavel backend set. Hosts may pass their\n// own via the `families` prop when their catalog differs.\nexport const SPEC_RUNTIME_FAMILIES: SpecRuntimeFamily[] = [\n {\n id: \"claude\",\n label: \"Claude\",\n provider: \"claude-agent\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"claude-agent\",\n icon: UiRobotAi,\n title: \"Claude Agent SDK\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"claude-cli\",\n icon: UiTerminal,\n title: \"Claude Code CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"claude-cmux\",\n icon: UiColumns,\n title: \"Claude multiplexer\",\n },\n ],\n },\n {\n id: \"codex\",\n label: \"Codex\",\n provider: \"codex-cli\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"codex-agent\",\n icon: UiRobotAi,\n title: \"Codex agent\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"codex-cli\",\n icon: UiTerminal,\n title: \"Codex CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"codex-cmux\",\n icon: UiColumns,\n title: \"Codex multiplexer\",\n },\n ],\n },\n {\n id: \"openai\",\n label: \"OpenAI\",\n provider: \"openai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"openai\",\n icon: UiCloud,\n title: \"OpenAI API\",\n },\n ],\n },\n {\n id: \"anthropic\",\n label: \"Anthropic\",\n provider: \"anthropic\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"anthropic\",\n icon: UiCloud,\n title: \"Anthropic API\",\n },\n ],\n },\n {\n id: \"gemini\",\n label: \"Gemini\",\n provider: \"googleai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"gemini\",\n icon: UiCloud,\n title: \"Gemini API\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"gemini-cli\",\n icon: UiTerminal,\n title: \"Gemini CLI\",\n },\n ],\n },\n {\n id: \"deepseek\",\n label: \"DeepSeek\",\n provider: \"deepseek\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"deepseek\",\n icon: UiCloud,\n title: \"DeepSeek API\",\n },\n ],\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 /** api | agent | cli | cmux */\n mode: string;\n /** The concrete `spec.backend`, e.g. \"claude-cmux\". */\n backend: string;\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};\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 backend: mode.backend,\n icon: MODE_ICONS[mode.mode],\n title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,\n provider: mode.catalogProvider ?? entry.catalogPrefix,\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.backend\n } in Captain configuration.`,\n remediation: `Enable ${\n mode.disabledReason ?? mode.backend\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 returned `backend` belongs\n// to the family that declared the mode first — resolve the real one with\n// `backendForFamilyMode`.\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\nexport function backendForFamilyMode(\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.backend;\n}\n\nexport function selectionForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): { family: string; mode: string } {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return { family: family.id, mode: mode.id };\n }\n }\n }\n const first = familyById(families, \"\");\n return { family: first.id, mode: firstMode(first).id };\n}\n\nexport function familyForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeFamily | undefined {\n const target = (backend ?? \"\").toLowerCase();\n return families.find((family) =>\n family.modes.some((mode) => mode.backend.toLowerCase() === target)\n );\n}\n\n// The mode a backend id names, or undefined when the catalog does not declare\n// it. Unlike `selectionForBackend` this does not fall back to the first family,\n// so a summary can stay silent about a runtime it cannot identify.\nexport function modeForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeModeOption | undefined {\n const target = (backend ?? \"\").toLowerCase();\n if (!target) return undefined;\n for (const family of families) {\n const mode = family.modes.find(\n (entry) => entry.backend.toLowerCase() === target\n );\n if (mode) return mode;\n }\n return undefined;\n}\n\n// \"claude-agent\" -> \"Claude Agent\"; unknown/empty -> \"Prompt default\".\nexport function labelForBackend(\n backend: string | undefined,\n families: SpecRuntimeFamily[] = SPEC_RUNTIME_FAMILIES\n): string {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return `${family.label} ${mode.label}`;\n }\n }\n }\n return \"Prompt default\";\n}\n\nexport function modelsForFamily(\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: string | undefined\n): ChatModel[] {\n if (!family) return models.filter(isSelectableModel);\n const provider =\n family.modes.find((mode) => mode.backend === backend)?.provider ??\n family.provider;\n return models.filter(\n (model) =>\n isSelectableModel(model) &&\n model.provider === provider &&\n modelMatchesBackend(model, backend)\n );\n}\n\nexport function modelBelongsToFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: 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((mode) => mode.backend === backend)?.provider ??\n family?.provider;\n const providerMatches = !provider || selected.provider === provider;\n return providerMatches && modelMatchesBackend(selected, backend);\n}\n\nfunction modelMatchesBackend(\n model: ChatModel,\n backend: string | undefined\n): boolean {\n if (!backend) return true;\n const backends = model.backends?.filter(Boolean);\n if (!backends || backends.length === 0) return true;\n return backends.includes(backend);\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"runtime-mode.js","sources":["../../../src/data/runtime/runtime-mode.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport { UiCloud, UiColumns, UiRobotAi, UiTerminal } from \"../../icons\";\nimport type { ChatModel, RuntimeAvailability } from \"../chat/types\";\nimport {\n availabilityText,\n isSelectableModel,\n isUnavailable,\n unsupportedAvailability,\n} from \"./availability\";\n\n// A backend runtime is factored into two UI axes — a provider\n// **family** (Claude, OpenAI, …) and a **mode** within it (Agent, CLI, cmux,\n// API) — that together resolve to a single `spec.backend` string. This is the\n// only place that mapping lives; both the inline PromptRunEditor and the modal\n// SpecRuntimeEditor drive their Mode pickers from it.\n\nexport type SpecRuntimeModeOption = {\n /** UI mode id within a family (e.g. \"agent\", \"cli\", \"cmux\", \"api\"). */\n id: string;\n label: string;\n /** The concrete `spec.backend` this (family, mode) resolves to. */\n backend: string;\n icon?: StaticIconComponent | undefined;\n title?: string | undefined;\n provider?: string | undefined;\n availability?: RuntimeAvailability | 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// Default catalog covering the captain/gavel backend set. Hosts may pass their\n// own via the `families` prop when their catalog differs.\nexport const SPEC_RUNTIME_FAMILIES: SpecRuntimeFamily[] = [\n {\n id: \"claude\",\n label: \"Claude\",\n provider: \"claude-agent\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"claude-agent\",\n icon: UiRobotAi,\n title: \"Claude Agent SDK\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"claude-cli\",\n icon: UiTerminal,\n title: \"Claude Code CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"claude-cmux\",\n icon: UiColumns,\n title: \"Claude multiplexer\",\n },\n ],\n },\n {\n id: \"codex\",\n label: \"Codex\",\n provider: \"codex-cli\",\n modes: [\n {\n id: \"agent\",\n label: \"Agent\",\n backend: \"codex-agent\",\n icon: UiRobotAi,\n title: \"Codex agent\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"codex-cli\",\n icon: UiTerminal,\n title: \"Codex CLI\",\n },\n {\n id: \"cmux\",\n label: \"cmux\",\n backend: \"codex-cmux\",\n icon: UiColumns,\n title: \"Codex multiplexer\",\n },\n ],\n },\n {\n id: \"openai\",\n label: \"OpenAI\",\n provider: \"openai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"openai\",\n icon: UiCloud,\n title: \"OpenAI API\",\n },\n ],\n },\n {\n id: \"anthropic\",\n label: \"Anthropic\",\n provider: \"anthropic\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"anthropic\",\n icon: UiCloud,\n title: \"Anthropic API\",\n },\n ],\n },\n {\n id: \"gemini\",\n label: \"Gemini\",\n provider: \"googleai\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"gemini\",\n icon: UiCloud,\n title: \"Gemini API\",\n },\n {\n id: \"cli\",\n label: \"CLI\",\n backend: \"gemini-cli\",\n icon: UiTerminal,\n title: \"Gemini CLI\",\n },\n ],\n },\n {\n id: \"deepseek\",\n label: \"DeepSeek\",\n provider: \"deepseek\",\n modes: [\n {\n id: \"api\",\n label: \"API\",\n backend: \"deepseek\",\n icon: UiCloud,\n title: \"DeepSeek API\",\n },\n ],\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 /** api | agent | cli | cmux */\n mode: string;\n /** The concrete `spec.backend`, e.g. \"claude-cmux\". */\n backend: string;\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};\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 backend: mode.backend,\n icon: MODE_ICONS[mode.mode],\n title: `${label} ${MODE_TITLES[mode.mode] ?? titleCase(mode.mode)}`,\n provider: mode.catalogProvider ?? entry.catalogPrefix,\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.backend\n } in Captain configuration.`,\n remediation: `Enable ${\n mode.disabledReason ?? mode.backend\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 returned `backend` belongs\n// to the family that declared the mode first — resolve the real one with\n// `backendForFamilyMode`.\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\nexport function backendForFamilyMode(\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.backend;\n}\n\nexport function selectionForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): { family: string; mode: string } {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return { family: family.id, mode: mode.id };\n }\n }\n }\n const first = familyById(families, \"\");\n return { family: first.id, mode: firstMode(first).id };\n}\n\nexport function familyForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeFamily | undefined {\n const target = (backend ?? \"\").toLowerCase();\n return families.find((family) =>\n family.modes.some((mode) => mode.backend.toLowerCase() === target)\n );\n}\n\n// The mode a backend id names, or undefined when the catalog does not declare\n// it. Unlike `selectionForBackend` this does not fall back to the first family,\n// so a summary can stay silent about a runtime it cannot identify.\nexport function modeForBackend(\n families: SpecRuntimeFamily[],\n backend: string | undefined\n): SpecRuntimeModeOption | undefined {\n const target = (backend ?? \"\").toLowerCase();\n if (!target) return undefined;\n for (const family of families) {\n const mode = family.modes.find(\n (entry) => entry.backend.toLowerCase() === target\n );\n if (mode) return mode;\n }\n return undefined;\n}\n\n// \"claude-agent\" -> \"Claude Agent\"; unknown/empty -> \"Prompt default\".\nexport function labelForBackend(\n backend: string | undefined,\n families: SpecRuntimeFamily[] = SPEC_RUNTIME_FAMILIES\n): string {\n const target = (backend ?? \"\").toLowerCase();\n for (const family of families) {\n for (const mode of family.modes) {\n if (mode.backend.toLowerCase() === target) {\n return `${family.label} ${mode.label}`;\n }\n }\n }\n return \"Prompt default\";\n}\n\n/** Lists selectable models by provider and declared backend support. */\nexport function modelsForFamily(\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: string | undefined\n): ChatModel[] {\n if (!family) return models.filter(isSelectableModel);\n const provider =\n family.modes.find((mode) => mode.backend === backend)?.provider ??\n family.provider;\n return models.filter(\n (model) =>\n isSelectableModel(model) &&\n model.provider === provider &&\n modelMatchesBackend(model, backend)\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 backend?: 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((mode) => mode.backend === backend)?.provider ??\n family?.provider;\n const providerMatches = !provider || selected.provider === provider;\n return providerMatches && modelMatchesBackend(selected, backend);\n}\n\n/** Resolves a target backend row, using a sole shared row as fallback. */\nexport function modelForFamily(\n modelId: string | undefined,\n models: ChatModel[],\n family: SpecRuntimeFamily | undefined,\n backend?: string | undefined\n): ChatModel | undefined {\n if (!modelId) return undefined;\n const matches = modelsForFamily(models, family, backend).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) =>\n !backend ||\n !model.runtime?.backend ||\n model.runtime.backend === backend\n ) ?? (matches.length === 1 ? matches[0] : undefined)\n );\n}\n\n/** Checks a model row's declared runtime backends when the catalog scopes it. */\nexport function modelMatchesBackend(\n model: ChatModel,\n backend: string | undefined\n): boolean {\n if (!backend) return true;\n const backends = model.backends?.filter(Boolean);\n if (!backends || backends.length === 0) return true;\n return backends.includes(backend);\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const debugConsoleSignal = require("./debugConsoleSignal.cjs");
5
+ const UiDebug = require("../icons/components/UiDebug.cjs");
6
+ function useDebugAction() {
7
+ const available = react.useSyncExternalStore(
8
+ debugConsoleSignal.subscribeToDebugConsole,
9
+ debugConsoleSignal.debugConsoleAvailable,
10
+ // A server render has no console mounted, so the action is absent there too
11
+ // rather than hydrating into existence and shifting the menu.
12
+ () => false
13
+ );
14
+ return react.useMemo(
15
+ () => available ? {
16
+ id: "show-query",
17
+ label: "Debug",
18
+ icon: UiDebug.UiDebug,
19
+ // No heading and no description: one word under a "Debug" heading
20
+ // beside a one-line gloss of itself is three ways of saying the same
21
+ // thing in a menu with room for one.
22
+ section: "",
23
+ onSelect: () => debugConsoleSignal.revealDebugConsole({ tab: "queries" })
24
+ } : void 0,
25
+ [available]
26
+ );
27
+ }
28
+ exports.useDebugAction = useDebugAction;
29
+ //# sourceMappingURL=useDebugAction.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebugAction.cjs","sources":["../../src/data/useDebugAction.tsx"],"sourcesContent":["import { useMemo, useSyncExternalStore } from \"react\";\nimport { UiDebug } from \"../icons\";\nimport type { DataTableMenuAction } from \"./DataTable\";\nimport {\n debugConsoleAvailable,\n revealDebugConsole,\n subscribeToDebugConsole,\n} from \"./debugConsoleSignal\";\n\n/**\n * Puts \"Debug\" in a result table's overflow menu.\n *\n * It reveals the console rather than opening a dialog. The dialog it replaces\n * had to *re-run the query* to say what it ran, so what you inspected was never\n * the execution you were looking at — and it closed the moment you changed a\n * filter, which is precisely when you wanted to compare two runs. The console\n * already holds the record for the run that happened.\n *\n * The action is absent when no console is mounted. A menu item that silently\n * does nothing reads as broken; an absent one reads as a feature this app does\n * not have, which is the truth.\n */\nexport function useDebugAction(): DataTableMenuAction | undefined {\n const available = useSyncExternalStore(\n subscribeToDebugConsole,\n debugConsoleAvailable,\n // A server render has no console mounted, so the action is absent there too\n // rather than hydrating into existence and shifting the menu.\n () => false,\n );\n\n // Memoized because it lands in a memoized menu-action list: a fresh object\n // each render would rebuild that list, and the table's menu with it.\n return useMemo<DataTableMenuAction | undefined>(\n () =>\n available\n ? {\n id: \"show-query\",\n label: \"Debug\",\n icon: UiDebug,\n // No heading and no description: one word under a \"Debug\" heading\n // beside a one-line gloss of itself is three ways of saying the same\n // thing in a menu with room for one.\n section: \"\",\n onSelect: () => revealDebugConsole({ tab: \"queries\" }),\n }\n : undefined,\n [available],\n );\n}\n"],"names":["useSyncExternalStore","subscribeToDebugConsole","debugConsoleAvailable","useMemo","UiDebug","revealDebugConsole"],"mappings":";;;;;AAsBO,SAAS,iBAAkD;AAChE,QAAM,YAAYA,MAAAA;AAAAA,IAChBC,mBAAAA;AAAAA,IACAC,mBAAAA;AAAAA;AAAAA;AAAAA,IAGA,MAAM;AAAA,EAAA;AAKR,SAAOC,MAAAA;AAAAA,IACL,MACE,YACI;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAMC,QAAAA;AAAAA;AAAAA;AAAAA;AAAAA,MAIN,SAAS;AAAA,MACT,UAAU,MAAMC,mBAAAA,mBAAmB,EAAE,KAAK,WAAW;AAAA,IAAA,IAEvD;AAAA,IACN,CAAC,SAAS;AAAA,EAAA;AAEd;;"}
@@ -0,0 +1,16 @@
1
+ import { DataTableMenuAction } from './DataTable';
2
+ /**
3
+ * Puts "Debug" in a result table's overflow menu.
4
+ *
5
+ * It reveals the console rather than opening a dialog. The dialog it replaces
6
+ * had to *re-run the query* to say what it ran, so what you inspected was never
7
+ * the execution you were looking at — and it closed the moment you changed a
8
+ * filter, which is precisely when you wanted to compare two runs. The console
9
+ * already holds the record for the run that happened.
10
+ *
11
+ * The action is absent when no console is mounted. A menu item that silently
12
+ * does nothing reads as broken; an absent one reads as a feature this app does
13
+ * not have, which is the truth.
14
+ */
15
+ export declare function useDebugAction(): DataTableMenuAction | undefined;
16
+ //# sourceMappingURL=useDebugAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebugAction.d.ts","sourceRoot":"","sources":["../../src/data/useDebugAction.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOvD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,IAAI,mBAAmB,GAAG,SAAS,CA2BhE"}
@@ -0,0 +1,29 @@
1
+ import { useSyncExternalStore, useMemo } from "react";
2
+ import { subscribeToDebugConsole, debugConsoleAvailable, revealDebugConsole } from "./debugConsoleSignal.js";
3
+ import { UiDebug } from "../icons/components/UiDebug.js";
4
+ function useDebugAction() {
5
+ const available = useSyncExternalStore(
6
+ subscribeToDebugConsole,
7
+ debugConsoleAvailable,
8
+ // A server render has no console mounted, so the action is absent there too
9
+ // rather than hydrating into existence and shifting the menu.
10
+ () => false
11
+ );
12
+ return useMemo(
13
+ () => available ? {
14
+ id: "show-query",
15
+ label: "Debug",
16
+ icon: UiDebug,
17
+ // No heading and no description: one word under a "Debug" heading
18
+ // beside a one-line gloss of itself is three ways of saying the same
19
+ // thing in a menu with room for one.
20
+ section: "",
21
+ onSelect: () => revealDebugConsole({ tab: "queries" })
22
+ } : void 0,
23
+ [available]
24
+ );
25
+ }
26
+ export {
27
+ useDebugAction
28
+ };
29
+ //# sourceMappingURL=useDebugAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebugAction.js","sources":["../../src/data/useDebugAction.tsx"],"sourcesContent":["import { useMemo, useSyncExternalStore } from \"react\";\nimport { UiDebug } from \"../icons\";\nimport type { DataTableMenuAction } from \"./DataTable\";\nimport {\n debugConsoleAvailable,\n revealDebugConsole,\n subscribeToDebugConsole,\n} from \"./debugConsoleSignal\";\n\n/**\n * Puts \"Debug\" in a result table's overflow menu.\n *\n * It reveals the console rather than opening a dialog. The dialog it replaces\n * had to *re-run the query* to say what it ran, so what you inspected was never\n * the execution you were looking at — and it closed the moment you changed a\n * filter, which is precisely when you wanted to compare two runs. The console\n * already holds the record for the run that happened.\n *\n * The action is absent when no console is mounted. A menu item that silently\n * does nothing reads as broken; an absent one reads as a feature this app does\n * not have, which is the truth.\n */\nexport function useDebugAction(): DataTableMenuAction | undefined {\n const available = useSyncExternalStore(\n subscribeToDebugConsole,\n debugConsoleAvailable,\n // A server render has no console mounted, so the action is absent there too\n // rather than hydrating into existence and shifting the menu.\n () => false,\n );\n\n // Memoized because it lands in a memoized menu-action list: a fresh object\n // each render would rebuild that list, and the table's menu with it.\n return useMemo<DataTableMenuAction | undefined>(\n () =>\n available\n ? {\n id: \"show-query\",\n label: \"Debug\",\n icon: UiDebug,\n // No heading and no description: one word under a \"Debug\" heading\n // beside a one-line gloss of itself is three ways of saying the same\n // thing in a menu with room for one.\n section: \"\",\n onSelect: () => revealDebugConsole({ tab: \"queries\" }),\n }\n : undefined,\n [available],\n );\n}\n"],"names":[],"mappings":";;;AAsBO,SAAS,iBAAkD;AAChE,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA;AAAA;AAAA,IAGA,MAAM;AAAA,EAAA;AAKR,SAAO;AAAA,IACL,MACE,YACI;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA;AAAA;AAAA;AAAA,MAIN,SAAS;AAAA,MACT,UAAU,MAAM,mBAAmB,EAAE,KAAK,WAAW;AAAA,IAAA,IAEvD;AAAA,IACN,CAAC,SAAS;AAAA,EAAA;AAEd;"}
@@ -15,9 +15,9 @@ function detectMode() {
15
15
  }
16
16
  function getVersionInfo() {
17
17
  return {
18
- commit: read(() => "a382bd66", ""),
19
- tag: read(() => "clicky-ui@0.3.24", ""),
20
- date: read(() => "2026-08-21T13:51:46.739Z", ""),
18
+ commit: read(() => "cb780cb7", ""),
19
+ tag: read(() => "clicky-ui@0.3.26", ""),
20
+ date: read(() => "2026-08-28T17:42:37.415Z", ""),
21
21
  dirty: read(() => true, false),
22
22
  mode: detectMode()
23
23
  };
@@ -13,9 +13,9 @@ function detectMode() {
13
13
  }
14
14
  function getVersionInfo() {
15
15
  return {
16
- commit: read(() => "a382bd66", ""),
17
- tag: read(() => "clicky-ui@0.3.24", ""),
18
- date: read(() => "2026-08-21T13:51:23.496Z", ""),
16
+ commit: read(() => "cb780cb7", ""),
17
+ tag: read(() => "clicky-ui@0.3.26", ""),
18
+ date: read(() => "2026-08-28T17:42:12.746Z", ""),
19
19
  dirty: read(() => true, false),
20
20
  mode: detectMode()
21
21
  };
package/dist/data.cjs CHANGED
@@ -73,6 +73,8 @@ const ExecutionTree = require("./data/ExecutionTree.cjs");
73
73
  const TreeNode = require("./data/TreeNode.cjs");
74
74
  const TreeGroupHeader = require("./data/TreeGroupHeader.cjs");
75
75
  const Timeline = require("./data/Timeline.cjs");
76
+ const debugConsoleSignal = require("./data/debugConsoleSignal.cjs");
77
+ const useDebugAction = require("./data/useDebugAction.cjs");
76
78
  const TaskSnapshot = require("./data/TaskSnapshot.cjs");
77
79
  const taskStatus = require("./data/task-status.cjs");
78
80
  const TaskProgress = require("./data/TaskProgress.cjs");
@@ -106,10 +108,8 @@ const CacheValue = require("./data/cache-browser/CacheValue.cjs");
106
108
  const ClickyExportDialog = require("./data/clicky-export/ClickyExportDialog.cjs");
107
109
  const FixtureEditor = require("./data/FixtureEditor/FixtureEditor.cjs");
108
110
  const GitChangeList = require("./data/git/GitChangeList.cjs");
109
- const queryInfo = require("./data/query-info/queryInfo.cjs");
110
111
  const QueryBrowser = require("./data/query-browser/QueryBrowser.cjs");
111
112
  const QueryBrowser_types = require("./data/query-browser/QueryBrowser.types.cjs");
112
- const QueryInfoDialog = require("./data/query-info/QueryInfoDialog.cjs");
113
113
  const status = require("./data/test-runner/status.cjs");
114
114
  const TestFailureDetail = require("./data/test-runner/TestFailureDetail.cjs");
115
115
  const TestDetailPanel = require("./data/test-runner/TestDetailPanel.cjs");
@@ -319,6 +319,7 @@ const UiNetwork = require("./icons/components/UiNetwork.cjs");
319
319
  const UiNull = require("./icons/components/UiNull.cjs");
320
320
  const UiNumeric = require("./icons/components/UiNumeric.cjs");
321
321
  const UiObject = require("./icons/components/UiObject.cjs");
322
+ const UiOpenScad = require("./icons/components/UiOpenScad.cjs");
322
323
  const UiOperator = require("./icons/components/UiOperator.cjs");
323
324
  const UiOrganization = require("./icons/components/UiOrganization.cjs");
324
325
  const UiPackage = require("./icons/components/UiPackage.cjs");
@@ -454,7 +455,6 @@ const gitDates = require("./data/git/git-dates.cjs");
454
455
  const frameworkIcon = require("./data/test-runner/frameworkIcon.cjs");
455
456
  const types = require("./data/cache-browser/types.cjs");
456
457
  const useClickyExport = require("./data/clicky-export/useClickyExport.cjs");
457
- const useQueryInfo = require("./data/query-info/useQueryInfo.cjs");
458
458
  exports.AnsiHtml = AnsiHtml.AnsiHtml;
459
459
  exports.Avatar = Avatar.Avatar;
460
460
  exports.AvatarBadge = AvatarBadge.AvatarBadge;
@@ -575,6 +575,18 @@ exports.ExecutionTree = ExecutionTree.ExecutionTree;
575
575
  exports.TreeNode = TreeNode.TreeNode;
576
576
  exports.TreeGroupHeader = TreeGroupHeader.TreeGroupHeader;
577
577
  exports.Timeline = Timeline.Timeline;
578
+ exports.DEBUG_CAPTURE_HEADER = debugConsoleSignal.DEBUG_CAPTURE_HEADER;
579
+ exports.DEBUG_REFRESH_INSPECTION_HEADER = debugConsoleSignal.DEBUG_REFRESH_INSPECTION_HEADER;
580
+ exports.debugCaptureHeaders = debugConsoleSignal.debugCaptureHeaders;
581
+ exports.debugConsoleAvailable = debugConsoleSignal.debugConsoleAvailable;
582
+ exports.debugConsoleOpen = debugConsoleSignal.debugConsoleOpen;
583
+ exports.registerDebugConsole = debugConsoleSignal.registerDebugConsole;
584
+ exports.revealDebugConsole = debugConsoleSignal.revealDebugConsole;
585
+ exports.setDebugCaptureLevel = debugConsoleSignal.setDebugCaptureLevel;
586
+ exports.setDebugConsoleOpen = debugConsoleSignal.setDebugConsoleOpen;
587
+ exports.setDebugRefreshInspection = debugConsoleSignal.setDebugRefreshInspection;
588
+ exports.subscribeToDebugConsole = debugConsoleSignal.subscribeToDebugConsole;
589
+ exports.useDebugAction = useDebugAction.useDebugAction;
578
590
  exports.allGroupsTerminal = TaskSnapshot.allGroupsTerminal;
579
591
  exports.isTerminalStatus = TaskSnapshot.isTerminalStatus;
580
592
  exports.bucketTasks = taskStatus.bucketTasks;
@@ -639,12 +651,8 @@ exports.GitChangedFilesSummary = GitChangeList.GitChangedFilesSummary;
639
651
  exports.GitCommitList = GitChangeList.GitCommitList;
640
652
  exports.GitDiffPanel = GitChangeList.GitDiffPanel;
641
653
  exports.GitFileList = GitChangeList.GitFileList;
642
- exports.QUERY_INFO_CONTENT_TYPE = queryInfo.QUERY_INFO_CONTENT_TYPE;
643
- exports.buildQueryInfoUrl = queryInfo.buildQueryInfoUrl;
644
- exports.fetchQueryInfo = queryInfo.fetchQueryInfo;
645
654
  exports.QueryBrowser = QueryBrowser.QueryBrowser;
646
655
  exports.QueryBrowserExecutionError = QueryBrowser_types.QueryBrowserExecutionError;
647
- exports.QueryInfoDialog = QueryInfoDialog.QueryInfoDialog;
648
656
  exports.STATUS_LABELS = status.STATUS_LABELS;
649
657
  exports.aggregateStatusCounts = status.aggregateStatusCounts;
650
658
  exports.collapseSingleChildChains = status.collapseSingleChildChains;
@@ -1027,6 +1035,7 @@ exports.UiNetworkFilled = UiNetwork.UiNetworkFilled;
1027
1035
  exports.UiNull = UiNull.UiNull;
1028
1036
  exports.UiNumeric = UiNumeric.UiNumeric;
1029
1037
  exports.UiObject = UiObject.UiObject;
1038
+ exports.UiOpenScad = UiOpenScad.UiOpenScad;
1030
1039
  exports.UiOperator = UiOperator.UiOperator;
1031
1040
  exports.UiOrganization = UiOrganization.UiOrganization;
1032
1041
  exports.UiOrganizationCheck = UiOrganization.UiOrganizationCheck;
@@ -1308,5 +1317,4 @@ exports.formatGitCommitDateHeader = gitDates.formatGitCommitDateHeader;
1308
1317
  exports.frameworkIcon = frameworkIcon.frameworkIcon;
1309
1318
  exports.isLeaf = types.isLeaf;
1310
1319
  exports.useClickyExport = useClickyExport.useClickyExport;
1311
- exports.useQueryInfo = useQueryInfo.useQueryInfo;
1312
1320
  //# sourceMappingURL=data.cjs.map
package/dist/data.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"data.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/data.d.ts CHANGED
@@ -77,7 +77,8 @@ export * from './data/git';
77
77
  export * from './data/test-runner';
78
78
  export * from './data/cache-browser';
79
79
  export * from './data/query-browser';
80
- export * from './data/query-info';
80
+ export { debugCaptureHeaders, debugConsoleAvailable, debugConsoleOpen, DEBUG_CAPTURE_HEADER, registerDebugConsole, revealDebugConsole, DEBUG_REFRESH_INSPECTION_HEADER, setDebugCaptureLevel, setDebugConsoleOpen, setDebugRefreshInspection, subscribeToDebugConsole, type DebugConsoleRequest, } from './data/debugConsoleSignal';
81
+ export { useDebugAction } from './data/useDebugAction';
81
82
  export * from './data/clicky-export';
82
83
  export { type LogEntry, type TaskControlAction, type TaskExecDetails, type TaskSnapshot, type TaskRunMeta, isTerminalStatus, allGroupsTerminal, } from './data/TaskSnapshot';
83
84
  export { taskStatusColor, taskStatusIcon, taskStatusBg, logLevelColor, taskSegments, bucketTasks, } from './data/task-status';
@@ -104,5 +105,5 @@ export { parseJavaStackTrace, type ParsedStackFrame, type ParsedStackTrace, } fr
104
105
  export { ErrorDetails, PrettyStackTrace, CopyBadge, type ErrorDetailsProps, } from './data/diagnostics/ErrorDetails';
105
106
  export { normalizeErrorDiagnostics, parseDiagnosticsStackTrace, parseInlineJsonContextValue, compactStackPath, isApplicationStackFrame, type ErrorDiagnostics, type ErrorStackFrame, type ParsedErrorStackTrace, } from './data/diagnostics/error-diagnostics';
106
107
  export { HarPanel, type HarPanelProps } from './data/har/HarPanel';
107
- export type { HAREntry, HARRequest, HARResponse, HARContent, HARHeader, HARPostData, } from './data/har/types';
108
+ export type { HAREntry, HARRequest, HARResponse, HARContent, HARCreator, HARFile, HARHeader, HARLog, HARPostData, } from './data/har/types';
108
109
  //# sourceMappingURL=data.d.ts.map