@flanksource/clicky-ui 0.3.16 → 0.3.18

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 (871) hide show
  1. package/dist/ai.cjs +12 -6
  2. package/dist/ai.cjs.map +1 -1
  3. package/dist/ai.js +10 -4
  4. package/dist/ai.js.map +1 -1
  5. package/dist/chat.cjs +36 -0
  6. package/dist/chat.cjs.map +1 -1
  7. package/dist/chat.js +37 -1
  8. package/dist/chat.js.map +1 -1
  9. package/dist/components/Combobox.cjs +122 -153
  10. package/dist/components/Combobox.cjs.map +1 -1
  11. package/dist/components/Combobox.d.ts.map +1 -1
  12. package/dist/components/Combobox.js +124 -155
  13. package/dist/components/Combobox.js.map +1 -1
  14. package/dist/components/ComboboxControl.cjs +145 -0
  15. package/dist/components/ComboboxControl.cjs.map +1 -0
  16. package/dist/components/ComboboxControl.d.ts +37 -0
  17. package/dist/components/ComboboxControl.d.ts.map +1 -0
  18. package/dist/components/ComboboxControl.js +145 -0
  19. package/dist/components/ComboboxControl.js.map +1 -0
  20. package/dist/components/ComboboxMenu.cjs +31 -14
  21. package/dist/components/ComboboxMenu.cjs.map +1 -1
  22. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  23. package/dist/components/ComboboxMenu.js +31 -14
  24. package/dist/components/ComboboxMenu.js.map +1 -1
  25. package/dist/components/ComboboxTags.cjs +40 -0
  26. package/dist/components/ComboboxTags.cjs.map +1 -0
  27. package/dist/components/ComboboxTags.d.ts +8 -0
  28. package/dist/components/ComboboxTags.d.ts.map +1 -0
  29. package/dist/components/ComboboxTags.js +40 -0
  30. package/dist/components/ComboboxTags.js.map +1 -0
  31. package/dist/components/ErrorWrapper.cjs +168 -0
  32. package/dist/components/ErrorWrapper.cjs.map +1 -0
  33. package/dist/components/ErrorWrapper.d.ts +19 -0
  34. package/dist/components/ErrorWrapper.d.ts.map +1 -0
  35. package/dist/components/ErrorWrapper.js +168 -0
  36. package/dist/components/ErrorWrapper.js.map +1 -0
  37. package/dist/components/FilterBar.cjs +64 -2
  38. package/dist/components/FilterBar.cjs.map +1 -1
  39. package/dist/components/FilterBar.d.ts +18 -1
  40. package/dist/components/FilterBar.d.ts.map +1 -1
  41. package/dist/components/FilterBar.js +64 -2
  42. package/dist/components/FilterBar.js.map +1 -1
  43. package/dist/components/JSONPathField.cjs +91 -0
  44. package/dist/components/JSONPathField.cjs.map +1 -0
  45. package/dist/components/JSONPathField.d.ts +19 -0
  46. package/dist/components/JSONPathField.d.ts.map +1 -0
  47. package/dist/components/JSONPathField.js +91 -0
  48. package/dist/components/JSONPathField.js.map +1 -0
  49. package/dist/components/JsonSchemaForm.cjs +8 -4
  50. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  51. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  52. package/dist/components/JsonSchemaForm.js +8 -4
  53. package/dist/components/JsonSchemaForm.js.map +1 -1
  54. package/dist/components/TreePickerField.cjs +22 -4
  55. package/dist/components/TreePickerField.cjs.map +1 -1
  56. package/dist/components/TreePickerField.d.ts +22 -2
  57. package/dist/components/TreePickerField.d.ts.map +1 -1
  58. package/dist/components/TreePickerField.js +22 -4
  59. package/dist/components/TreePickerField.js.map +1 -1
  60. package/dist/components/TriStateToggle.cjs +53 -0
  61. package/dist/components/TriStateToggle.cjs.map +1 -0
  62. package/dist/components/TriStateToggle.d.ts +27 -0
  63. package/dist/components/TriStateToggle.d.ts.map +1 -0
  64. package/dist/components/TriStateToggle.js +53 -0
  65. package/dist/components/TriStateToggle.js.map +1 -0
  66. package/dist/components/combobox-types.d.ts +16 -1
  67. package/dist/components/combobox-types.d.ts.map +1 -1
  68. package/dist/components/combobox-utils.cjs +26 -0
  69. package/dist/components/combobox-utils.cjs.map +1 -1
  70. package/dist/components/combobox-utils.d.ts +10 -0
  71. package/dist/components/combobox-utils.d.ts.map +1 -1
  72. package/dist/components/combobox-utils.js +26 -0
  73. package/dist/components/combobox-utils.js.map +1 -1
  74. package/dist/components/filter-bar-utils.cjs +5 -0
  75. package/dist/components/filter-bar-utils.cjs.map +1 -1
  76. package/dist/components/filter-bar-utils.d.ts.map +1 -1
  77. package/dist/components/filter-bar-utils.js +5 -0
  78. package/dist/components/filter-bar-utils.js.map +1 -1
  79. package/dist/components/json-schema-form-accordion-array.cjs +290 -0
  80. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -0
  81. package/dist/components/json-schema-form-accordion-array.d.ts +7 -0
  82. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -0
  83. package/dist/components/json-schema-form-accordion-array.js +290 -0
  84. package/dist/components/json-schema-form-accordion-array.js.map +1 -0
  85. package/dist/components/json-schema-form-array.cjs +99 -110
  86. package/dist/components/json-schema-form-array.cjs.map +1 -1
  87. package/dist/components/json-schema-form-array.d.ts +1 -1
  88. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-array.js +98 -109
  90. package/dist/components/json-schema-form-array.js.map +1 -1
  91. package/dist/components/json-schema-form-error-display.cjs +4 -2
  92. package/dist/components/json-schema-form-error-display.cjs.map +1 -1
  93. package/dist/components/json-schema-form-error-display.d.ts +4 -2
  94. package/dist/components/json-schema-form-error-display.d.ts.map +1 -1
  95. package/dist/components/json-schema-form-error-display.js +4 -2
  96. package/dist/components/json-schema-form-error-display.js.map +1 -1
  97. package/dist/components/json-schema-form-extensions.cjs +10 -0
  98. package/dist/components/json-schema-form-extensions.cjs.map +1 -0
  99. package/dist/components/json-schema-form-extensions.d.ts +8 -0
  100. package/dist/components/json-schema-form-extensions.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-extensions.js +10 -0
  102. package/dist/components/json-schema-form-extensions.js.map +1 -0
  103. package/dist/components/json-schema-form-fields.cjs +25 -101
  104. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  105. package/dist/components/json-schema-form-fields.d.ts +1 -32
  106. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  107. package/dist/components/json-schema-form-fields.js +28 -104
  108. package/dist/components/json-schema-form-fields.js.map +1 -1
  109. package/dist/components/json-schema-form-item-summary.cjs +131 -0
  110. package/dist/components/json-schema-form-item-summary.cjs.map +1 -0
  111. package/dist/components/json-schema-form-item-summary.d.ts +13 -0
  112. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -0
  113. package/dist/components/json-schema-form-item-summary.js +131 -0
  114. package/dist/components/json-schema-form-item-summary.js.map +1 -0
  115. package/dist/components/json-schema-form-layout.cjs +156 -0
  116. package/dist/components/json-schema-form-layout.cjs.map +1 -0
  117. package/dist/components/json-schema-form-layout.d.ts +43 -0
  118. package/dist/components/json-schema-form-layout.d.ts.map +1 -0
  119. package/dist/components/json-schema-form-layout.js +156 -0
  120. package/dist/components/json-schema-form-layout.js.map +1 -0
  121. package/dist/components/json-schema-form-lookup-tree.cjs +149 -0
  122. package/dist/components/json-schema-form-lookup-tree.cjs.map +1 -0
  123. package/dist/components/json-schema-form-lookup-tree.d.ts +22 -0
  124. package/dist/components/json-schema-form-lookup-tree.d.ts.map +1 -0
  125. package/dist/components/json-schema-form-lookup-tree.js +149 -0
  126. package/dist/components/json-schema-form-lookup-tree.js.map +1 -0
  127. package/dist/components/json-schema-form-object.cjs +11 -4
  128. package/dist/components/json-schema-form-object.cjs.map +1 -1
  129. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  130. package/dist/components/json-schema-form-object.js +11 -4
  131. package/dist/components/json-schema-form-object.js.map +1 -1
  132. package/dist/components/json-schema-form-render.cjs +51 -28
  133. package/dist/components/json-schema-form-render.cjs.map +1 -1
  134. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  135. package/dist/components/json-schema-form-render.js +51 -28
  136. package/dist/components/json-schema-form-render.js.map +1 -1
  137. package/dist/components/json-schema-form-resolve.cjs +62 -13
  138. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  139. package/dist/components/json-schema-form-resolve.d.ts +1 -0
  140. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  141. package/dist/components/json-schema-form-resolve.js +62 -13
  142. package/dist/components/json-schema-form-resolve.js.map +1 -1
  143. package/dist/components/json-schema-form-table-array.cjs +123 -0
  144. package/dist/components/json-schema-form-table-array.cjs.map +1 -0
  145. package/dist/components/json-schema-form-table-array.d.ts +7 -0
  146. package/dist/components/json-schema-form-table-array.d.ts.map +1 -0
  147. package/dist/components/json-schema-form-table-array.js +123 -0
  148. package/dist/components/json-schema-form-table-array.js.map +1 -0
  149. package/dist/components/json-schema-form-tone.cjs +34 -0
  150. package/dist/components/json-schema-form-tone.cjs.map +1 -0
  151. package/dist/components/json-schema-form-tone.d.ts +8 -0
  152. package/dist/components/json-schema-form-tone.d.ts.map +1 -0
  153. package/dist/components/json-schema-form-tone.js +34 -0
  154. package/dist/components/json-schema-form-tone.js.map +1 -0
  155. package/dist/components/json-schema-form-types.d.ts +79 -10
  156. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  157. package/dist/components/json-schema-form-utils.cjs +47 -4
  158. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  159. package/dist/components/json-schema-form-utils.d.ts +19 -4
  160. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  161. package/dist/components/json-schema-form-utils.js +47 -4
  162. package/dist/components/json-schema-form-utils.js.map +1 -1
  163. package/dist/components/tri-state.cjs +8 -0
  164. package/dist/components/tri-state.cjs.map +1 -0
  165. package/dist/components/tri-state.d.ts +5 -0
  166. package/dist/components/tri-state.d.ts.map +1 -0
  167. package/dist/components/tri-state.js +8 -0
  168. package/dist/components/tri-state.js.map +1 -0
  169. package/dist/components/useComboboxLayout.cjs +59 -0
  170. package/dist/components/useComboboxLayout.cjs.map +1 -0
  171. package/dist/components/useComboboxLayout.d.ts +5 -0
  172. package/dist/components/useComboboxLayout.d.ts.map +1 -0
  173. package/dist/components/useComboboxLayout.js +59 -0
  174. package/dist/components/useComboboxLayout.js.map +1 -0
  175. package/dist/components.cjs +21 -0
  176. package/dist/components.cjs.map +1 -1
  177. package/dist/components.d.ts +14 -4
  178. package/dist/components.d.ts.map +1 -1
  179. package/dist/components.js +22 -1
  180. package/dist/components.js.map +1 -1
  181. package/dist/data/Clicky.cjs +51 -2
  182. package/dist/data/Clicky.cjs.map +1 -1
  183. package/dist/data/Clicky.d.ts +10 -1
  184. package/dist/data/Clicky.d.ts.map +1 -1
  185. package/dist/data/Clicky.js +51 -2
  186. package/dist/data/Clicky.js.map +1 -1
  187. package/dist/data/DataTable.cjs +215 -63
  188. package/dist/data/DataTable.cjs.map +1 -1
  189. package/dist/data/DataTable.d.ts +65 -3
  190. package/dist/data/DataTable.d.ts.map +1 -1
  191. package/dist/data/DataTable.js +215 -63
  192. package/dist/data/DataTable.js.map +1 -1
  193. package/dist/data/LogsTable.cjs +10 -1
  194. package/dist/data/LogsTable.cjs.map +1 -1
  195. package/dist/data/LogsTable.d.ts +3 -1
  196. package/dist/data/LogsTable.d.ts.map +1 -1
  197. package/dist/data/LogsTable.js +10 -1
  198. package/dist/data/LogsTable.js.map +1 -1
  199. package/dist/data/ServerTimingBadge.cjs +64 -0
  200. package/dist/data/ServerTimingBadge.cjs.map +1 -0
  201. package/dist/data/ServerTimingBadge.d.ts +9 -0
  202. package/dist/data/ServerTimingBadge.d.ts.map +1 -0
  203. package/dist/data/ServerTimingBadge.js +64 -0
  204. package/dist/data/ServerTimingBadge.js.map +1 -0
  205. package/dist/data/TaskManager.cjs +99 -14
  206. package/dist/data/TaskManager.cjs.map +1 -1
  207. package/dist/data/TaskManager.d.ts.map +1 -1
  208. package/dist/data/TaskManager.js +100 -15
  209. package/dist/data/TaskManager.js.map +1 -1
  210. package/dist/data/TaskProgress.cjs +50 -11
  211. package/dist/data/TaskProgress.cjs.map +1 -1
  212. package/dist/data/TaskProgress.d.ts +2 -1
  213. package/dist/data/TaskProgress.d.ts.map +1 -1
  214. package/dist/data/TaskProgress.js +50 -11
  215. package/dist/data/TaskProgress.js.map +1 -1
  216. package/dist/data/ai/AdvancedChatConfig.cjs +289 -0
  217. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -0
  218. package/dist/data/ai/AdvancedChatConfig.d.ts +21 -0
  219. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -0
  220. package/dist/data/ai/AdvancedChatConfig.js +289 -0
  221. package/dist/data/ai/AdvancedChatConfig.js.map +1 -0
  222. package/dist/data/ai/AdvancedCostsPanel.cjs +120 -0
  223. package/dist/data/ai/AdvancedCostsPanel.cjs.map +1 -0
  224. package/dist/data/ai/AdvancedCostsPanel.d.ts +16 -0
  225. package/dist/data/ai/AdvancedCostsPanel.d.ts.map +1 -0
  226. package/dist/data/ai/AdvancedCostsPanel.js +120 -0
  227. package/dist/data/ai/AdvancedCostsPanel.js.map +1 -0
  228. package/dist/data/ai/ChatWindow.catalogs.cjs +74 -0
  229. package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -0
  230. package/dist/data/ai/ChatWindow.catalogs.d.ts +16 -0
  231. package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -0
  232. package/dist/data/ai/ChatWindow.catalogs.js +74 -0
  233. package/dist/data/ai/ChatWindow.catalogs.js.map +1 -0
  234. package/dist/data/ai/ChatWindow.cjs +86 -100
  235. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  236. package/dist/data/ai/ChatWindow.d.ts +1 -1
  237. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  238. package/dist/data/ai/ChatWindow.js +88 -102
  239. package/dist/data/ai/ChatWindow.js.map +1 -1
  240. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  241. package/dist/data/ai/ChatWindow.preferences.d.ts +2 -4
  242. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  243. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  244. package/dist/data/ai/ChatWindow.runtime.cjs +120 -0
  245. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -0
  246. package/dist/data/ai/ChatWindow.runtime.d.ts +20 -0
  247. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -0
  248. package/dist/data/ai/ChatWindow.runtime.js +120 -0
  249. package/dist/data/ai/ChatWindow.runtime.js.map +1 -0
  250. package/dist/data/ai/ChatWindow.thread-status.cjs +14 -0
  251. package/dist/data/ai/ChatWindow.thread-status.cjs.map +1 -0
  252. package/dist/data/ai/ChatWindow.thread-status.d.ts +5 -0
  253. package/dist/data/ai/ChatWindow.thread-status.d.ts.map +1 -0
  254. package/dist/data/ai/ChatWindow.thread-status.js +14 -0
  255. package/dist/data/ai/ChatWindow.thread-status.js.map +1 -0
  256. package/dist/data/ai/ChatWindow.thread.cjs +68 -0
  257. package/dist/data/ai/ChatWindow.thread.cjs.map +1 -0
  258. package/dist/data/ai/ChatWindow.thread.d.ts +16 -0
  259. package/dist/data/ai/ChatWindow.thread.d.ts.map +1 -0
  260. package/dist/data/ai/ChatWindow.thread.js +68 -0
  261. package/dist/data/ai/ChatWindow.thread.js.map +1 -0
  262. package/dist/data/ai/ChatWindow.tool-catalog.cjs +20 -0
  263. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  264. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +17 -1
  265. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  266. package/dist/data/ai/ChatWindow.tool-catalog.js +20 -0
  267. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  268. package/dist/data/ai/ChatWindow.types.d.ts +13 -5
  269. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  270. package/dist/data/ai/ChatWindowManager.cjs +3 -1
  271. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  272. package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
  273. package/dist/data/ai/ChatWindowManager.js +3 -1
  274. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  275. package/dist/data/ai/PromptPicker/PromptPicker.cjs +1 -1
  276. package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
  277. package/dist/data/ai/PromptPicker/PromptPicker.d.ts +1 -1
  278. package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
  279. package/dist/data/ai/PromptPicker/PromptPicker.js +1 -1
  280. package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
  281. package/dist/data/ai/PromptRunEditor/index.cjs +101 -89
  282. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  283. package/dist/data/ai/PromptRunEditor/index.d.ts +6 -10
  284. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  285. package/dist/data/ai/PromptRunEditor/index.js +103 -91
  286. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  287. package/dist/data/ai/PromptRunEditor/model.cjs +47 -0
  288. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -0
  289. package/dist/data/ai/PromptRunEditor/model.d.ts +17 -0
  290. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -0
  291. package/dist/data/ai/PromptRunEditor/model.js +47 -0
  292. package/dist/data/ai/PromptRunEditor/model.js.map +1 -0
  293. package/dist/data/ai/RuntimeModePicker.cjs +1 -1
  294. package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
  295. package/dist/data/ai/RuntimeModePicker.d.ts +1 -1
  296. package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
  297. package/dist/data/ai/RuntimeModePicker.js +1 -1
  298. package/dist/data/ai/RuntimeModePicker.js.map +1 -1
  299. package/dist/data/ai/SessionInspector.files.cjs +26 -43
  300. package/dist/data/ai/SessionInspector.files.cjs.map +1 -1
  301. package/dist/data/ai/SessionInspector.files.d.ts.map +1 -1
  302. package/dist/data/ai/SessionInspector.files.js +26 -43
  303. package/dist/data/ai/SessionInspector.files.js.map +1 -1
  304. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  305. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  306. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  307. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  308. package/dist/data/ai/SessionInspector.model.cjs +1 -1
  309. package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
  310. package/dist/data/ai/SessionInspector.model.js +1 -1
  311. package/dist/data/ai/SessionInspector.model.js.map +1 -1
  312. package/dist/data/ai/SessionViewer.header.cjs +17 -9
  313. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  314. package/dist/data/ai/SessionViewer.header.d.ts.map +1 -1
  315. package/dist/data/ai/SessionViewer.header.js +17 -9
  316. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  317. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  318. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  319. package/dist/data/ai/SessionViewer.model.d.ts +4 -0
  320. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  321. package/dist/data/ai/SessionViewer.model.js +2 -0
  322. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  323. package/dist/data/ai/SessionViewer.rows.cjs +4 -16
  324. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  325. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  326. package/dist/data/ai/SessionViewer.rows.js +4 -16
  327. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  328. package/dist/data/ai/SessionViewer.unified.d.ts +1 -0
  329. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  330. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +12 -3
  331. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  332. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +1 -1
  333. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  334. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +12 -3
  335. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  336. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
  337. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +1 -1
  338. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
  339. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
  340. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  341. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +2 -2
  342. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  343. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  344. package/dist/data/ai/ThreadPicker.cjs +65 -3
  345. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  346. package/dist/data/ai/ThreadPicker.d.ts +13 -5
  347. package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
  348. package/dist/data/ai/ThreadPicker.js +65 -3
  349. package/dist/data/ai/ThreadPicker.js.map +1 -1
  350. package/dist/data/ai/ToolPreferences.cjs +65 -685
  351. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  352. package/dist/data/ai/ToolPreferences.d.ts +15 -17
  353. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  354. package/dist/data/ai/ToolPreferences.js +64 -683
  355. package/dist/data/ai/ToolPreferences.js.map +1 -1
  356. package/dist/data/ai/ToolPreferences.model.cjs +148 -0
  357. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -0
  358. package/dist/data/ai/ToolPreferences.model.d.ts +31 -0
  359. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -0
  360. package/dist/data/ai/ToolPreferences.model.js +148 -0
  361. package/dist/data/ai/ToolPreferences.model.js.map +1 -0
  362. package/dist/data/ai/ToolPreferencesList.cjs +270 -0
  363. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -0
  364. package/dist/data/ai/ToolPreferencesList.d.ts +18 -0
  365. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -0
  366. package/dist/data/ai/ToolPreferencesList.js +270 -0
  367. package/dist/data/ai/ToolPreferencesList.js.map +1 -0
  368. package/dist/data/ai/agent-action-icons.cjs.map +1 -1
  369. package/dist/data/ai/agent-action-icons.js.map +1 -1
  370. package/dist/data/ai/chat-window-context.cjs +4 -1
  371. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  372. package/dist/data/ai/chat-window-context.d.ts +7 -0
  373. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  374. package/dist/data/ai/chat-window-context.js +4 -1
  375. package/dist/data/ai/chat-window-context.js.map +1 -1
  376. package/dist/data/ai/index.d.ts +7 -3
  377. package/dist/data/ai/index.d.ts.map +1 -1
  378. package/dist/data/ai/session-tones.cjs +67 -0
  379. package/dist/data/ai/session-tones.cjs.map +1 -0
  380. package/dist/data/ai/session-tones.d.ts +34 -0
  381. package/dist/data/ai/session-tones.d.ts.map +1 -0
  382. package/dist/data/ai/session-tones.js +67 -0
  383. package/dist/data/ai/session-tones.js.map +1 -0
  384. package/dist/data/ai/thread-costs.cjs +39 -0
  385. package/dist/data/ai/thread-costs.cjs.map +1 -0
  386. package/dist/data/ai/thread-costs.d.ts +62 -0
  387. package/dist/data/ai/thread-costs.d.ts.map +1 -0
  388. package/dist/data/ai/thread-costs.js +39 -0
  389. package/dist/data/ai/thread-costs.js.map +1 -0
  390. package/dist/data/cells/CellFilterActions.cjs +68 -0
  391. package/dist/data/cells/CellFilterActions.cjs.map +1 -0
  392. package/dist/data/cells/CellFilterActions.d.ts +15 -0
  393. package/dist/data/cells/CellFilterActions.d.ts.map +1 -0
  394. package/dist/data/cells/CellFilterActions.js +68 -0
  395. package/dist/data/cells/CellFilterActions.js.map +1 -0
  396. package/dist/data/chat/Chat.cjs +192 -80
  397. package/dist/data/chat/Chat.cjs.map +1 -1
  398. package/dist/data/chat/Chat.d.ts +24 -4
  399. package/dist/data/chat/Chat.d.ts.map +1 -1
  400. package/dist/data/chat/Chat.fixtures.cjs +48 -3
  401. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  402. package/dist/data/chat/Chat.fixtures.d.ts +1 -1
  403. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
  404. package/dist/data/chat/Chat.fixtures.js +48 -3
  405. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  406. package/dist/data/chat/Chat.js +195 -83
  407. package/dist/data/chat/Chat.js.map +1 -1
  408. package/dist/data/chat/Chat.runtime.cjs +63 -0
  409. package/dist/data/chat/Chat.runtime.cjs.map +1 -0
  410. package/dist/data/chat/Chat.runtime.d.ts +16 -0
  411. package/dist/data/chat/Chat.runtime.d.ts.map +1 -0
  412. package/dist/data/chat/Chat.runtime.js +63 -0
  413. package/dist/data/chat/Chat.runtime.js.map +1 -0
  414. package/dist/data/chat/ChatRuntimeToolbar.cjs +62 -0
  415. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -0
  416. package/dist/data/chat/ChatRuntimeToolbar.d.ts +14 -0
  417. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -0
  418. package/dist/data/chat/ChatRuntimeToolbar.js +62 -0
  419. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -0
  420. package/dist/data/chat/ContextMeter.cjs +144 -73
  421. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  422. package/dist/data/chat/ContextMeter.d.ts +8 -3
  423. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  424. package/dist/data/chat/ContextMeter.js +144 -73
  425. package/dist/data/chat/ContextMeter.js.map +1 -1
  426. package/dist/data/chat/ToolCall.cjs +86 -24
  427. package/dist/data/chat/ToolCall.cjs.map +1 -1
  428. package/dist/data/chat/ToolCall.d.ts +12 -5
  429. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  430. package/dist/data/chat/ToolCall.js +86 -24
  431. package/dist/data/chat/ToolCall.js.map +1 -1
  432. package/dist/data/chat/approval.cjs +64 -0
  433. package/dist/data/chat/approval.cjs.map +1 -0
  434. package/dist/data/chat/approval.d.ts +18 -0
  435. package/dist/data/chat/approval.d.ts.map +1 -0
  436. package/dist/data/chat/approval.js +64 -0
  437. package/dist/data/chat/approval.js.map +1 -0
  438. package/dist/data/chat/index.d.ts +5 -3
  439. package/dist/data/chat/index.d.ts.map +1 -1
  440. package/dist/data/chat/tool-render/ToolArgs.cjs +50 -0
  441. package/dist/data/chat/tool-render/ToolArgs.cjs.map +1 -0
  442. package/dist/data/chat/tool-render/ToolArgs.d.ts +7 -0
  443. package/dist/data/chat/tool-render/ToolArgs.d.ts.map +1 -0
  444. package/dist/data/chat/tool-render/ToolArgs.js +50 -0
  445. package/dist/data/chat/tool-render/ToolArgs.js.map +1 -0
  446. package/dist/data/chat/tool-render/ToolParams.cjs +155 -0
  447. package/dist/data/chat/tool-render/ToolParams.cjs.map +1 -0
  448. package/dist/data/chat/tool-render/ToolParams.d.ts +20 -0
  449. package/dist/data/chat/tool-render/ToolParams.d.ts.map +1 -0
  450. package/dist/data/chat/tool-render/ToolParams.js +155 -0
  451. package/dist/data/chat/tool-render/ToolParams.js.map +1 -0
  452. package/dist/data/chat/tool-render/ToolValue.cjs +140 -0
  453. package/dist/data/chat/tool-render/ToolValue.cjs.map +1 -0
  454. package/dist/data/chat/tool-render/ToolValue.d.ts +16 -0
  455. package/dist/data/chat/tool-render/ToolValue.d.ts.map +1 -0
  456. package/dist/data/chat/tool-render/ToolValue.js +140 -0
  457. package/dist/data/chat/tool-render/ToolValue.js.map +1 -0
  458. package/dist/data/chat/tool-render/adapter.cjs +48 -0
  459. package/dist/data/chat/tool-render/adapter.cjs.map +1 -0
  460. package/dist/data/chat/tool-render/adapter.d.ts +57 -0
  461. package/dist/data/chat/tool-render/adapter.d.ts.map +1 -0
  462. package/dist/data/chat/tool-render/adapter.js +48 -0
  463. package/dist/data/chat/tool-render/adapter.js.map +1 -0
  464. package/dist/data/chat/tool-render/context.cjs +16 -0
  465. package/dist/data/chat/tool-render/context.cjs.map +1 -0
  466. package/dist/data/chat/tool-render/context.d.ts +6 -0
  467. package/dist/data/chat/tool-render/context.d.ts.map +1 -0
  468. package/dist/data/chat/tool-render/context.js +16 -0
  469. package/dist/data/chat/tool-render/context.js.map +1 -0
  470. package/dist/data/chat/tool-render/defaults.cjs +45 -0
  471. package/dist/data/chat/tool-render/defaults.cjs.map +1 -0
  472. package/dist/data/chat/tool-render/defaults.d.ts +11 -0
  473. package/dist/data/chat/tool-render/defaults.d.ts.map +1 -0
  474. package/dist/data/chat/tool-render/defaults.js +45 -0
  475. package/dist/data/chat/tool-render/defaults.js.map +1 -0
  476. package/dist/data/chat/tool-render/index.d.ts +13 -0
  477. package/dist/data/chat/tool-render/index.d.ts.map +1 -0
  478. package/dist/data/chat/tool-render/known-tool-views.cjs +208 -0
  479. package/dist/data/chat/tool-render/known-tool-views.cjs.map +1 -0
  480. package/dist/data/chat/tool-render/known-tool-views.d.ts +10 -0
  481. package/dist/data/chat/tool-render/known-tool-views.d.ts.map +1 -0
  482. package/dist/data/chat/tool-render/known-tool-views.js +208 -0
  483. package/dist/data/chat/tool-render/known-tool-views.js.map +1 -0
  484. package/dist/data/chat/tool-render/known-tools.cjs +58 -0
  485. package/dist/data/chat/tool-render/known-tools.cjs.map +1 -0
  486. package/dist/data/chat/tool-render/known-tools.d.ts +4 -0
  487. package/dist/data/chat/tool-render/known-tools.d.ts.map +1 -0
  488. package/dist/data/chat/tool-render/known-tools.js +58 -0
  489. package/dist/data/chat/tool-render/known-tools.js.map +1 -0
  490. package/dist/data/chat/tool-render/normalize.cjs +42 -0
  491. package/dist/data/chat/tool-render/normalize.cjs.map +1 -0
  492. package/dist/data/chat/tool-render/normalize.d.ts +13 -0
  493. package/dist/data/chat/tool-render/normalize.d.ts.map +1 -0
  494. package/dist/data/chat/tool-render/normalize.js +42 -0
  495. package/dist/data/chat/tool-render/normalize.js.map +1 -0
  496. package/dist/data/chat/tool-render/registry.cjs +14 -0
  497. package/dist/data/chat/tool-render/registry.cjs.map +1 -0
  498. package/dist/data/chat/tool-render/registry.d.ts +7 -0
  499. package/dist/data/chat/tool-render/registry.d.ts.map +1 -0
  500. package/dist/data/chat/tool-render/registry.js +14 -0
  501. package/dist/data/chat/tool-render/registry.js.map +1 -0
  502. package/dist/data/chat/tool-render/schema.cjs +57 -0
  503. package/dist/data/chat/tool-render/schema.cjs.map +1 -0
  504. package/dist/data/chat/tool-render/schema.d.ts +28 -0
  505. package/dist/data/chat/tool-render/schema.d.ts.map +1 -0
  506. package/dist/data/chat/tool-render/schema.js +57 -0
  507. package/dist/data/chat/tool-render/schema.js.map +1 -0
  508. package/dist/data/chat/tool-render/shape.cjs +94 -0
  509. package/dist/data/chat/tool-render/shape.cjs.map +1 -0
  510. package/dist/data/chat/tool-render/shape.d.ts +39 -0
  511. package/dist/data/chat/tool-render/shape.d.ts.map +1 -0
  512. package/dist/data/chat/tool-render/shape.js +94 -0
  513. package/dist/data/chat/tool-render/shape.js.map +1 -0
  514. package/dist/data/chat/tool-render/summary.cjs +34 -0
  515. package/dist/data/chat/tool-render/summary.cjs.map +1 -0
  516. package/dist/data/chat/tool-render/summary.d.ts +8 -0
  517. package/dist/data/chat/tool-render/summary.d.ts.map +1 -0
  518. package/dist/data/chat/tool-render/summary.js +34 -0
  519. package/dist/data/chat/tool-render/summary.js.map +1 -0
  520. package/dist/data/chat/types.cjs.map +1 -1
  521. package/dist/data/chat/types.d.ts +19 -0
  522. package/dist/data/chat/types.d.ts.map +1 -1
  523. package/dist/data/chat/types.js.map +1 -1
  524. package/dist/data/chat/usage-snapshot.cjs +17 -0
  525. package/dist/data/chat/usage-snapshot.cjs.map +1 -0
  526. package/dist/data/chat/usage-snapshot.d.ts +21 -0
  527. package/dist/data/chat/usage-snapshot.d.ts.map +1 -0
  528. package/dist/data/chat/usage-snapshot.js +17 -0
  529. package/dist/data/chat/usage-snapshot.js.map +1 -0
  530. package/dist/data/data-table-filter-values.cjs +83 -0
  531. package/dist/data/data-table-filter-values.cjs.map +1 -0
  532. package/dist/data/data-table-filter-values.d.ts +18 -0
  533. package/dist/data/data-table-filter-values.d.ts.map +1 -0
  534. package/dist/data/data-table-filter-values.js +83 -0
  535. package/dist/data/data-table-filter-values.js.map +1 -0
  536. package/dist/data/data-table-server-filters.cjs +171 -0
  537. package/dist/data/data-table-server-filters.cjs.map +1 -0
  538. package/dist/data/data-table-server-filters.d.ts +128 -0
  539. package/dist/data/data-table-server-filters.d.ts.map +1 -0
  540. package/dist/data/data-table-server-filters.js +171 -0
  541. package/dist/data/data-table-server-filters.js.map +1 -0
  542. package/dist/data/query-browser/QueryBrowser.cjs +96 -19
  543. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  544. package/dist/data/query-browser/QueryBrowser.d.ts +37 -6
  545. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  546. package/dist/data/query-browser/QueryBrowser.js +96 -19
  547. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  548. package/dist/data/query-browser/index.d.ts +1 -1
  549. package/dist/data/query-browser/index.d.ts.map +1 -1
  550. package/dist/data/runtime/ProviderStatusPanel.cjs +187 -0
  551. package/dist/data/runtime/ProviderStatusPanel.cjs.map +1 -0
  552. package/dist/data/runtime/ProviderStatusPanel.d.ts +10 -0
  553. package/dist/data/runtime/ProviderStatusPanel.d.ts.map +1 -0
  554. package/dist/data/runtime/ProviderStatusPanel.js +187 -0
  555. package/dist/data/runtime/ProviderStatusPanel.js.map +1 -0
  556. package/dist/data/runtime/RuntimeBar.cjs +147 -0
  557. package/dist/data/runtime/RuntimeBar.cjs.map +1 -0
  558. package/dist/data/runtime/RuntimeBar.d.ts +22 -0
  559. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -0
  560. package/dist/data/runtime/RuntimeBar.js +147 -0
  561. package/dist/data/runtime/RuntimeBar.js.map +1 -0
  562. package/dist/data/runtime/RuntimeBar.model.cjs +14 -0
  563. package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -0
  564. package/dist/data/runtime/RuntimeBar.model.d.ts +10 -0
  565. package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
  566. package/dist/data/runtime/RuntimeBar.model.js +14 -0
  567. package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
  568. package/dist/data/runtime/RuntimeBarCombo.cjs +354 -0
  569. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
  570. package/dist/data/runtime/RuntimeBarCombo.d.ts +23 -0
  571. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
  572. package/dist/data/runtime/RuntimeBarCombo.js +354 -0
  573. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
  574. package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +93 -87
  575. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -0
  576. package/dist/data/runtime/RuntimeBarSegments.d.ts +25 -0
  577. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -0
  578. package/dist/data/{ai/RuntimeBar.js → runtime/RuntimeBarSegments.js} +96 -90
  579. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -0
  580. package/dist/data/runtime/availability.cjs +11 -0
  581. package/dist/data/runtime/availability.cjs.map +1 -0
  582. package/dist/data/runtime/availability.d.ts +6 -0
  583. package/dist/data/runtime/availability.d.ts.map +1 -0
  584. package/dist/data/runtime/availability.js +11 -0
  585. package/dist/data/runtime/availability.js.map +1 -0
  586. package/dist/data/{ai → runtime}/model-capabilities.cjs +12 -1
  587. package/dist/data/runtime/model-capabilities.cjs.map +1 -0
  588. package/dist/data/{ai → runtime}/model-capabilities.d.ts +2 -6
  589. package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
  590. package/dist/data/{ai → runtime}/model-capabilities.js +12 -1
  591. package/dist/data/runtime/model-capabilities.js.map +1 -0
  592. package/dist/data/runtime/provider-status.cjs +106 -0
  593. package/dist/data/runtime/provider-status.cjs.map +1 -0
  594. package/dist/data/runtime/provider-status.d.ts +24 -0
  595. package/dist/data/runtime/provider-status.d.ts.map +1 -0
  596. package/dist/data/runtime/provider-status.js +106 -0
  597. package/dist/data/runtime/provider-status.js.map +1 -0
  598. package/dist/data/{ai → runtime}/runtime-mode.cjs +123 -22
  599. package/dist/data/runtime/runtime-mode.cjs.map +1 -0
  600. package/dist/data/{ai → runtime}/runtime-mode.d.ts +8 -1
  601. package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
  602. package/dist/data/{ai → runtime}/runtime-mode.js +123 -22
  603. package/dist/data/runtime/runtime-mode.js.map +1 -0
  604. package/dist/data/server-timing.cjs +120 -0
  605. package/dist/data/server-timing.cjs.map +1 -0
  606. package/dist/data/server-timing.d.ts +11 -0
  607. package/dist/data/server-timing.d.ts.map +1 -0
  608. package/dist/data/server-timing.js +120 -0
  609. package/dist/data/server-timing.js.map +1 -0
  610. package/dist/data/task-query-keys.cjs +26 -0
  611. package/dist/data/task-query-keys.cjs.map +1 -0
  612. package/dist/data/task-query-keys.d.ts +27 -0
  613. package/dist/data/task-query-keys.d.ts.map +1 -0
  614. package/dist/data/task-query-keys.js +26 -0
  615. package/dist/data/task-query-keys.js.map +1 -0
  616. package/dist/data/version-info.cjs +3 -3
  617. package/dist/data/version-info.js +3 -3
  618. package/dist/data.cjs +23 -0
  619. package/dist/data.cjs.map +1 -1
  620. package/dist/data.d.ts +8 -2
  621. package/dist/data.d.ts.map +1 -1
  622. package/dist/data.js +23 -0
  623. package/dist/data.js.map +1 -1
  624. package/dist/hooks/use-hotkey.cjs +6 -1
  625. package/dist/hooks/use-hotkey.cjs.map +1 -1
  626. package/dist/hooks/use-hotkey.d.ts.map +1 -1
  627. package/dist/hooks/use-hotkey.js +6 -1
  628. package/dist/hooks/use-hotkey.js.map +1 -1
  629. package/dist/hooks/use-task-run.cjs +7 -4
  630. package/dist/hooks/use-task-run.cjs.map +1 -1
  631. package/dist/hooks/use-task-run.d.ts +12 -0
  632. package/dist/hooks/use-task-run.d.ts.map +1 -1
  633. package/dist/hooks/use-task-run.js +7 -4
  634. package/dist/hooks/use-task-run.js.map +1 -1
  635. package/dist/icons/index.d.ts +1 -0
  636. package/dist/icons/index.d.ts.map +1 -1
  637. package/dist/icons/registry.cjs +692 -0
  638. package/dist/icons/registry.cjs.map +1 -0
  639. package/dist/icons/registry.d.ts +21 -0
  640. package/dist/icons/registry.d.ts.map +1 -0
  641. package/dist/icons/registry.js +692 -0
  642. package/dist/icons/registry.js.map +1 -0
  643. package/dist/icons.cjs +3 -0
  644. package/dist/icons.cjs.map +1 -1
  645. package/dist/icons.js +4 -1
  646. package/dist/icons.js.map +1 -1
  647. package/dist/index.cjs +54 -0
  648. package/dist/index.cjs.map +1 -1
  649. package/dist/index.js +56 -2
  650. package/dist/index.js.map +1 -1
  651. package/dist/layout/AppShell.cjs +93 -57
  652. package/dist/layout/AppShell.cjs.map +1 -1
  653. package/dist/layout/AppShell.d.ts +49 -1
  654. package/dist/layout/AppShell.d.ts.map +1 -1
  655. package/dist/layout/AppShell.js +93 -57
  656. package/dist/layout/AppShell.js.map +1 -1
  657. package/dist/layout/AppShell.nav.cjs +144 -19
  658. package/dist/layout/AppShell.nav.cjs.map +1 -1
  659. package/dist/layout/AppShell.nav.d.ts +6 -1
  660. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  661. package/dist/layout/AppShell.nav.js +144 -19
  662. package/dist/layout/AppShell.nav.js.map +1 -1
  663. package/dist/layout/SplitPane.cjs +23 -7
  664. package/dist/layout/SplitPane.cjs.map +1 -1
  665. package/dist/layout/SplitPane.d.ts +3 -1
  666. package/dist/layout/SplitPane.d.ts.map +1 -1
  667. package/dist/layout/SplitPane.js +23 -7
  668. package/dist/layout/SplitPane.js.map +1 -1
  669. package/dist/lib/format.cjs +86 -4
  670. package/dist/lib/format.cjs.map +1 -1
  671. package/dist/lib/format.d.ts +69 -0
  672. package/dist/lib/format.d.ts.map +1 -1
  673. package/dist/lib/format.js +86 -4
  674. package/dist/lib/format.js.map +1 -1
  675. package/dist/lib/path-tree.cjs +69 -0
  676. package/dist/lib/path-tree.cjs.map +1 -0
  677. package/dist/lib/path-tree.d.ts +54 -0
  678. package/dist/lib/path-tree.d.ts.map +1 -0
  679. package/dist/lib/path-tree.js +69 -0
  680. package/dist/lib/path-tree.js.map +1 -0
  681. package/dist/monaco.d.ts +1 -0
  682. package/dist/monaco.d.ts.map +1 -1
  683. package/dist/overlay/DropdownMenuSubmenu.cjs +13 -7
  684. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  685. package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
  686. package/dist/overlay/DropdownMenuSubmenu.js +13 -7
  687. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  688. package/dist/overlay/HoverCard.cjs.map +1 -1
  689. package/dist/overlay/HoverCard.d.ts +2 -2
  690. package/dist/overlay/HoverCard.d.ts.map +1 -1
  691. package/dist/overlay/HoverCard.js.map +1 -1
  692. package/dist/overlay/Tour.cjs +173 -0
  693. package/dist/overlay/Tour.cjs.map +1 -0
  694. package/dist/overlay/Tour.d.ts +61 -0
  695. package/dist/overlay/Tour.d.ts.map +1 -0
  696. package/dist/overlay/Tour.js +173 -0
  697. package/dist/overlay/Tour.js.map +1 -0
  698. package/dist/overlay/TourCard.cjs +108 -0
  699. package/dist/overlay/TourCard.cjs.map +1 -0
  700. package/dist/overlay/TourCard.d.ts +23 -0
  701. package/dist/overlay/TourCard.d.ts.map +1 -0
  702. package/dist/overlay/TourCard.js +108 -0
  703. package/dist/overlay/TourCard.js.map +1 -0
  704. package/dist/overlay/TourProvider.cjs +160 -0
  705. package/dist/overlay/TourProvider.cjs.map +1 -0
  706. package/dist/overlay/TourProvider.d.ts +31 -0
  707. package/dist/overlay/TourProvider.d.ts.map +1 -0
  708. package/dist/overlay/TourProvider.js +160 -0
  709. package/dist/overlay/TourProvider.js.map +1 -0
  710. package/dist/overlay/TourSpotlight.cjs +47 -0
  711. package/dist/overlay/TourSpotlight.cjs.map +1 -0
  712. package/dist/overlay/TourSpotlight.d.ts +12 -0
  713. package/dist/overlay/TourSpotlight.d.ts.map +1 -0
  714. package/dist/overlay/TourSpotlight.js +47 -0
  715. package/dist/overlay/TourSpotlight.js.map +1 -0
  716. package/dist/overlay/modalStack.cjs +18 -4
  717. package/dist/overlay/modalStack.cjs.map +1 -1
  718. package/dist/overlay/modalStack.d.ts +10 -2
  719. package/dist/overlay/modalStack.d.ts.map +1 -1
  720. package/dist/overlay/modalStack.js +19 -5
  721. package/dist/overlay/modalStack.js.map +1 -1
  722. package/dist/overlay/tour-anchor.cjs +114 -0
  723. package/dist/overlay/tour-anchor.cjs.map +1 -0
  724. package/dist/overlay/tour-anchor.d.ts +30 -0
  725. package/dist/overlay/tour-anchor.d.ts.map +1 -0
  726. package/dist/overlay/tour-anchor.js +114 -0
  727. package/dist/overlay/tour-anchor.js.map +1 -0
  728. package/dist/overlay/tour-context.cjs +12 -0
  729. package/dist/overlay/tour-context.cjs.map +1 -0
  730. package/dist/overlay/tour-context.d.ts +40 -0
  731. package/dist/overlay/tour-context.d.ts.map +1 -0
  732. package/dist/overlay/tour-context.js +12 -0
  733. package/dist/overlay/tour-context.js.map +1 -0
  734. package/dist/overlay/tour-geometry.cjs +65 -0
  735. package/dist/overlay/tour-geometry.cjs.map +1 -0
  736. package/dist/overlay/tour-geometry.d.ts +47 -0
  737. package/dist/overlay/tour-geometry.d.ts.map +1 -0
  738. package/dist/overlay/tour-geometry.js +65 -0
  739. package/dist/overlay/tour-geometry.js.map +1 -0
  740. package/dist/overlay/tour-model.cjs +79 -0
  741. package/dist/overlay/tour-model.cjs.map +1 -0
  742. package/dist/overlay/tour-model.d.ts +29 -0
  743. package/dist/overlay/tour-model.d.ts.map +1 -0
  744. package/dist/overlay/tour-model.js +79 -0
  745. package/dist/overlay/tour-model.js.map +1 -0
  746. package/dist/overlay/tour-progress.cjs +54 -0
  747. package/dist/overlay/tour-progress.cjs.map +1 -0
  748. package/dist/overlay/tour-progress.d.ts +40 -0
  749. package/dist/overlay/tour-progress.d.ts.map +1 -0
  750. package/dist/overlay/tour-progress.js +54 -0
  751. package/dist/overlay/tour-progress.js.map +1 -0
  752. package/dist/overlay/tour-types.d.ts +144 -0
  753. package/dist/overlay/tour-types.d.ts.map +1 -0
  754. package/dist/overlay/use-tour-anchor.cjs +43 -0
  755. package/dist/overlay/use-tour-anchor.cjs.map +1 -0
  756. package/dist/overlay/use-tour-anchor.d.ts +23 -0
  757. package/dist/overlay/use-tour-anchor.d.ts.map +1 -0
  758. package/dist/overlay/use-tour-anchor.js +43 -0
  759. package/dist/overlay/use-tour-anchor.js.map +1 -0
  760. package/dist/overlay/use-tour-rect.cjs +33 -0
  761. package/dist/overlay/use-tour-rect.cjs.map +1 -0
  762. package/dist/overlay/use-tour-rect.d.ts +12 -0
  763. package/dist/overlay/use-tour-rect.d.ts.map +1 -0
  764. package/dist/overlay/use-tour-rect.js +33 -0
  765. package/dist/overlay/use-tour-rect.js.map +1 -0
  766. package/dist/overlay/use-tour-step.cjs +66 -0
  767. package/dist/overlay/use-tour-step.cjs.map +1 -0
  768. package/dist/overlay/use-tour-step.d.ts +45 -0
  769. package/dist/overlay/use-tour-step.d.ts.map +1 -0
  770. package/dist/overlay/use-tour-step.js +66 -0
  771. package/dist/overlay/use-tour-step.js.map +1 -0
  772. package/dist/overlay/zIndex.cjs +8 -0
  773. package/dist/overlay/zIndex.cjs.map +1 -1
  774. package/dist/overlay/zIndex.d.ts +8 -0
  775. package/dist/overlay/zIndex.d.ts.map +1 -1
  776. package/dist/overlay/zIndex.js +8 -0
  777. package/dist/overlay/zIndex.js.map +1 -1
  778. package/dist/rpc/CommandOutput.cjs +8 -0
  779. package/dist/rpc/CommandOutput.cjs.map +1 -1
  780. package/dist/rpc/CommandOutput.d.ts +4 -1
  781. package/dist/rpc/CommandOutput.d.ts.map +1 -1
  782. package/dist/rpc/CommandOutput.js +8 -0
  783. package/dist/rpc/CommandOutput.js.map +1 -1
  784. package/dist/rpc/EntityExplorerApp.cjs +10 -16
  785. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  786. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  787. package/dist/rpc/EntityExplorerApp.js +10 -16
  788. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  789. package/dist/rpc/OperationActionBar.cjs +1 -1
  790. package/dist/rpc/OperationActionBar.cjs.map +1 -1
  791. package/dist/rpc/OperationActionBar.js +1 -1
  792. package/dist/rpc/OperationActionBar.js.map +1 -1
  793. package/dist/rpc/OperationCatalog.cjs +111 -58
  794. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  795. package/dist/rpc/OperationCatalog.d.ts +1 -6
  796. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  797. package/dist/rpc/OperationCatalog.js +112 -59
  798. package/dist/rpc/OperationCatalog.js.map +1 -1
  799. package/dist/rpc/OperationResultView.cjs +44 -0
  800. package/dist/rpc/OperationResultView.cjs.map +1 -1
  801. package/dist/rpc/OperationResultView.d.ts +8 -1
  802. package/dist/rpc/OperationResultView.d.ts.map +1 -1
  803. package/dist/rpc/OperationResultView.js +44 -0
  804. package/dist/rpc/OperationResultView.js.map +1 -1
  805. package/dist/rpc/SchemaActionForm.cjs +2 -21
  806. package/dist/rpc/SchemaActionForm.cjs.map +1 -1
  807. package/dist/rpc/SchemaActionForm.d.ts.map +1 -1
  808. package/dist/rpc/SchemaActionForm.js +3 -22
  809. package/dist/rpc/SchemaActionForm.js.map +1 -1
  810. package/dist/rpc/apiClient.cjs +16 -2
  811. package/dist/rpc/apiClient.cjs.map +1 -1
  812. package/dist/rpc/apiClient.d.ts.map +1 -1
  813. package/dist/rpc/apiClient.js +16 -2
  814. package/dist/rpc/apiClient.js.map +1 -1
  815. package/dist/rpc/formMetadata.cjs +89 -49
  816. package/dist/rpc/formMetadata.cjs.map +1 -1
  817. package/dist/rpc/formMetadata.d.ts +14 -6
  818. package/dist/rpc/formMetadata.d.ts.map +1 -1
  819. package/dist/rpc/formMetadata.js +87 -47
  820. package/dist/rpc/formMetadata.js.map +1 -1
  821. package/dist/rpc/operationFilterSearch.cjs +23 -0
  822. package/dist/rpc/operationFilterSearch.cjs.map +1 -0
  823. package/dist/rpc/operationFilterSearch.d.ts +22 -0
  824. package/dist/rpc/operationFilterSearch.d.ts.map +1 -0
  825. package/dist/rpc/operationFilterSearch.js +23 -0
  826. package/dist/rpc/operationFilterSearch.js.map +1 -0
  827. package/dist/rpc/operationLookupFetcher.cjs +28 -0
  828. package/dist/rpc/operationLookupFetcher.cjs.map +1 -0
  829. package/dist/rpc/operationLookupFetcher.d.ts +17 -0
  830. package/dist/rpc/operationLookupFetcher.d.ts.map +1 -0
  831. package/dist/rpc/operationLookupFetcher.js +28 -0
  832. package/dist/rpc/operationLookupFetcher.js.map +1 -0
  833. package/dist/rpc/surfaceNav.cjs +77 -0
  834. package/dist/rpc/surfaceNav.cjs.map +1 -0
  835. package/dist/rpc/surfaceNav.d.ts +19 -0
  836. package/dist/rpc/surfaceNav.d.ts.map +1 -0
  837. package/dist/rpc/surfaceNav.js +77 -0
  838. package/dist/rpc/surfaceNav.js.map +1 -0
  839. package/dist/rpc/types.cjs.map +1 -1
  840. package/dist/rpc/types.d.ts +12 -1
  841. package/dist/rpc/types.d.ts.map +1 -1
  842. package/dist/rpc/types.js.map +1 -1
  843. package/dist/rpc.cjs +2 -0
  844. package/dist/rpc.cjs.map +1 -1
  845. package/dist/rpc.d.ts +1 -0
  846. package/dist/rpc.d.ts.map +1 -1
  847. package/dist/rpc.js +2 -0
  848. package/dist/rpc.js.map +1 -1
  849. package/dist/styles.css +1 -1
  850. package/dist/tailwind-preset.cjs +4 -0
  851. package/dist/tailwind-preset.cjs.map +1 -1
  852. package/dist/tailwind-preset.d.ts.map +1 -1
  853. package/dist/tailwind-preset.js +4 -0
  854. package/dist/tailwind-preset.js.map +1 -1
  855. package/dist/utils.cjs +8 -0
  856. package/dist/utils.cjs.map +1 -1
  857. package/dist/utils.d.ts +2 -1
  858. package/dist/utils.d.ts.map +1 -1
  859. package/dist/utils.js +10 -2
  860. package/dist/utils.js.map +1 -1
  861. package/package.json +1 -1
  862. package/dist/data/ai/RuntimeBar.cjs.map +0 -1
  863. package/dist/data/ai/RuntimeBar.d.ts +0 -27
  864. package/dist/data/ai/RuntimeBar.d.ts.map +0 -1
  865. package/dist/data/ai/RuntimeBar.js.map +0 -1
  866. package/dist/data/ai/model-capabilities.cjs.map +0 -1
  867. package/dist/data/ai/model-capabilities.d.ts.map +0 -1
  868. package/dist/data/ai/model-capabilities.js.map +0 -1
  869. package/dist/data/ai/runtime-mode.cjs.map +0 -1
  870. package/dist/data/ai/runtime-mode.d.ts.map +0 -1
  871. package/dist/data/ai/runtime-mode.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ModelSection.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/ModelSection.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../../chat/effort-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { providerIcon, providerIconColor } from \"../../chat/provider-icons\";\nimport { Icon } from \"../../Icon\";\nimport { IconButton } from \"../../../components\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n UiAdd,\n UiCoins,\n UiCurrencyDollar,\n UiFingerprint,\n UiRepeat,\n UiSparkles,\n UiTimer,\n UiTrash,\n} from \"../../../icons\";\nimport type {\n AISpecRuntimeModelFallback,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { RuntimeBar } from \"../RuntimeBar\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n firstMode,\n modeForBackend,\n type SpecRuntimeFamily,\n} from \"../runtime-mode\";\nimport { CheckboxField, NumberField, SpecField, SpecInput } from \"./fields\";\nimport { withBudgetValue, withOptionalRoot, withRoot } from \"./update\";\n\ntype FallbackDraftPatch = {\n model?: string | undefined;\n id?: string | undefined;\n backend?: string | undefined;\n temperature?: number | undefined;\n effort?: string | undefined;\n noCache?: boolean | undefined;\n};\n\nexport function ModelSection({\n value,\n onChange,\n models,\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n // The bar owns family, mode, model and effort — including the free-text model\n // entry for families the catalog does not describe.\n return (\n <div className=\"grid gap-density-2\">\n <RuntimeBar\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <div className=\"grid grid-cols-2 gap-density-2 md:grid-cols-4\">\n <NumberField\n label=\"Max cost (USD)\"\n value={value.budget?.cost}\n onChange={(cost) => onChange(withBudgetValue(value, \"cost\", cost))}\n icon={UiCurrencyDollar}\n min={0}\n step={0.01}\n />\n <NumberField\n label=\"Max tokens\"\n value={value.budget?.maxTokens}\n onChange={(maxTokens) =>\n onChange(withBudgetValue(value, \"maxTokens\", maxTokens))\n }\n icon={UiCoins}\n min={0}\n step={1}\n integer\n />\n <NumberField\n label=\"Max turns\"\n value={value.budget?.maxTurns}\n onChange={(maxTurns) =>\n onChange(withBudgetValue(value, \"maxTurns\", maxTurns))\n }\n icon={UiRepeat}\n min={0}\n max={100}\n step={1}\n integer\n />\n <SpecField label=\"Timeout\">\n <SpecInput\n value={value.budget?.timeout}\n onChange={(timeout) =>\n onChange(withBudgetValue(value, \"timeout\", timeout))\n }\n placeholder=\"30m\"\n icon={UiTimer}\n mono\n />\n </SpecField>\n </div>\n </div>\n );\n}\n\nexport function ModelAdvanced({\n value,\n onChange,\n models = [],\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n return (\n <div className=\"grid gap-density-2\">\n <FallbackModelsEditor\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <SpecField label=\"Session ID\">\n <SpecInput\n value={value.sessionId}\n onChange={(sessionId) =>\n onChange(withOptionalRoot(value, \"sessionId\", sessionId))\n }\n placeholder=\"session UUID\"\n icon={UiFingerprint}\n mono\n />\n </SpecField>\n <CheckboxField\n label=\"Disable prompt caching\"\n checked={value.noCache}\n onChange={(noCache) => onChange(withRoot(value, { noCache }))}\n />\n </div>\n );\n}\n\nfunction FallbackModelsEditor({\n value,\n onChange,\n models,\n families = SPEC_RUNTIME_FAMILIES,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n const fallbacks = value.fallbacks ?? [];\n const [expandedIndex, setExpandedIndex] = useState<number | null>(null);\n\n const setFallbacks = (nextFallbacks: AISpecRuntimeModelFallback[]) => {\n onChange(withRoot(value, { fallbacks: nextFallbacks }));\n };\n\n const removeFallback = (index: number) => {\n setFallbacks(fallbacks.filter((_, rowIndex) => rowIndex !== index));\n setExpandedIndex((current) => {\n if (current == null) return null;\n if (current === index) return null;\n return current > index ? current - 1 : current;\n });\n };\n\n const addFallback = () => {\n const nextFallbacks = [...fallbacks, newFallbackDraft(value, families)];\n setFallbacks(nextFallbacks);\n setExpandedIndex(nextFallbacks.length - 1);\n };\n\n const updateFallback = (index: number, nextFallback: FallbackDraftPatch) => {\n setFallbacks(\n fallbacks.map((fallback, rowIndex) =>\n rowIndex === index ? compactEditableFallback(nextFallback) : fallback,\n ),\n );\n };\n\n const toggleFallback = (index: number) => {\n setExpandedIndex((current) => (current === index ? null : index));\n };\n\n return (\n <div className=\"space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2\">\n <div className=\"inline-flex min-w-0 items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <Icon icon={UiRepeat} className=\"size-3.5 shrink-0\" />\n <span>Fallback models</span>\n </div>\n <button\n type=\"button\"\n onClick={addFallback}\n className=\"inline-flex items-center gap-1 rounded-md border border-border bg-background px-density-2 py-density-1 text-xs font-medium text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Icon icon={UiAdd} className=\"size-3.5\" />\n Add\n </button>\n </div>\n {fallbacks.length > 0 && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div className=\"divide-y divide-border\">\n {fallbacks.map((fallback, index) => (\n <FallbackModelRow\n key={`${fallback.model ?? \"fallback\"}-${index}`}\n fallback={fallback}\n models={models}\n families={families}\n expanded={expandedIndex === index}\n editorId={`spec-runtime-fallback-${index}-picker`}\n onToggle={() => toggleFallback(index)}\n onChange={(nextFallback) => updateFallback(index, nextFallback)}\n onRemove={() => removeFallback(index)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelRow({\n fallback,\n models,\n families,\n expanded,\n editorId,\n onToggle,\n onChange,\n onRemove,\n}: {\n fallback: AISpecRuntimeModelFallback;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n expanded: boolean;\n editorId: string;\n onToggle: () => void;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n onRemove: () => void;\n}) {\n const meta = fallbackModelMeta(fallback, models);\n const Glyph = meta.provider ? providerIcon(meta.provider) : undefined;\n const label = meta.label || \"Select model\";\n // The collapsed row is the bar in miniature: brand mark, runtime mode, model,\n // effort — each carrying the same tone it has inside the expanded editor.\n const mode = modeForBackend(families, fallback.backend);\n const effortGlyph = fallback.effort\n ? effortLevelIcon(fallback.effort)\n : undefined;\n return (\n <div>\n <div className=\"grid min-h-9 grid-cols-[minmax(0,1fr)_auto] items-center gap-density-1 px-density-1 py-density-1\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={editorId}\n aria-label={`Edit fallback ${label}`}\n onClick={onToggle}\n className=\"grid min-w-0 grid-cols-[auto_auto_minmax(0,1fr)_auto] items-center gap-density-2 rounded-md px-density-1 py-density-1 text-left hover:bg-muted\"\n >\n {Glyph ? (\n <Glyph\n className={cn(\n \"size-4 shrink-0\",\n meta.provider ? providerIconColor(meta.provider) : undefined,\n )}\n />\n ) : (\n <Icon\n icon={UiSparkles}\n className=\"size-4 shrink-0 text-muted-foreground/70\"\n />\n )}\n {mode?.icon ? (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n title={mode.title ?? mode.label}\n />\n ) : (\n // Held open so rows with and without a known mode still align.\n <span aria-hidden=\"true\" className=\"size-4\" />\n )}\n <span\n className=\"min-w-0 truncate font-mono text-xs text-foreground\"\n title={label}\n >\n {label}\n </span>\n {fallback.effort ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-semibold uppercase leading-none text-muted-foreground\">\n {effortGlyph && (\n <Icon\n icon={effortGlyph}\n className={cn(\"size-3\", effortLevelColor(fallback.effort))}\n />\n )}\n {effortLevelLabel(fallback.effort)}\n </span>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n </button>\n <IconButton\n icon={UiTrash}\n label={`Remove ${label}`}\n onClick={onRemove}\n className=\"size-6\"\n iconClassName=\"size-4\"\n />\n </div>\n {expanded && (\n <div className=\"border-t border-border p-density-2\">\n <FallbackModelPicker\n id={editorId}\n value={fallback}\n onChange={onChange}\n models={models}\n families={families}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelPicker({\n id,\n value,\n onChange,\n models,\n families,\n}: {\n id: string;\n value: AISpecRuntimeModelFallback;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n}) {\n return (\n <div\n id={id}\n role=\"group\"\n aria-label=\"Fallback model picker\"\n className=\"rounded-md border border-dashed border-border bg-muted/20 p-density-2\"\n >\n <RuntimeBar\n value={value}\n onChange={(next) => onChange(compactEditableFallback(next))}\n models={models}\n families={families}\n ariaLabel=\"Fallback runtime\"\n />\n </div>\n );\n}\n\nfunction newFallbackDraft(\n value: AISpecRuntimeValue,\n families: SpecRuntimeFamily[],\n): AISpecRuntimeModelFallback {\n const fallback: AISpecRuntimeModelFallback = {};\n const backend = value.backend || defaultFallbackBackend(families);\n if (backend) fallback.backend = backend;\n if (value.effort) fallback.effort = value.effort;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n fallback.temperature = value.temperature;\n }\n return fallback;\n}\n\nfunction defaultFallbackBackend(families: SpecRuntimeFamily[]): string {\n const family = families[0] ?? SPEC_RUNTIME_FAMILIES[0];\n return family ? firstMode(family).backend : \"\";\n}\n\nfunction compactEditableFallback(\n value: FallbackDraftPatch,\n): AISpecRuntimeModelFallback {\n const next: AISpecRuntimeModelFallback = {};\n const model = cleanString(value.model);\n if (model) next.model = model;\n const id = cleanString(value.id);\n if (id) next.id = id;\n const backend = cleanString(value.backend);\n if (backend) next.backend = backend;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n next.temperature = value.temperature;\n }\n const effort = cleanString(value.effort);\n if (effort) next.effort = effort;\n if (value.noCache) next.noCache = true;\n return next;\n}\n\nfunction fallbackModelMeta(\n fallback: AISpecRuntimeModelFallback,\n models: ChatModel[],\n): { label: string; provider?: string | undefined } {\n const modelId = fallback.model ?? \"\";\n const match = models.find(\n (model) => model.id === modelId || model.label === modelId,\n );\n if (match) return { label: match.label, provider: match.provider };\n return {\n label: modelId || fallback.id || \"\",\n provider: inferProvider(fallback),\n };\n}\n\nfunction inferProvider(\n fallback: AISpecRuntimeModelFallback,\n): string | undefined {\n const text =\n `${fallback.backend ?? \"\"} ${fallback.model ?? \"\"}`.toLowerCase();\n if (text.includes(\"anthropic\") || text.includes(\"claude\")) return \"anthropic\";\n if (text.includes(\"google\") || text.includes(\"gemini\")) return \"googleai\";\n if (\n text.includes(\"openai\") ||\n text.includes(\"gpt\") ||\n text.includes(\"codex\")\n ) {\n return \"openai\";\n }\n return undefined;\n}\n\nfunction cleanString(value: string | undefined): string {\n return value?.trim() ?? \"\";\n}\n"],"names":["jsxs","jsx","RuntimeBar","NumberField","withBudgetValue","UiCurrencyDollar","UiCoins","UiRepeat","SpecField","SpecInput","UiTimer","withOptionalRoot","UiFingerprint","CheckboxField","withRoot","SPEC_RUNTIME_FAMILIES","useState","Icon","UiAdd","providerIcon","modeForBackend","effortLevelIcon","cn","providerIconColor","UiSparkles","effortLevelColor","effortLevelLabel","IconButton","UiTrash","firstMode"],"mappings":"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"}
1
+ {"version":3,"file":"ModelSection.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/ModelSection.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../../chat/effort-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { providerIcon, providerIconColor } from \"../../chat/provider-icons\";\nimport { Icon } from \"../../Icon\";\nimport { IconButton } from \"../../../components\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n UiAdd,\n UiCoins,\n UiCurrencyDollar,\n UiFingerprint,\n UiRepeat,\n UiSparkles,\n UiTimer,\n UiTrash,\n} from \"../../../icons\";\nimport type {\n AISpecRuntimeModelFallback,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { ProviderStatusPanel } from \"../../runtime/ProviderStatusPanel\";\nimport { RuntimeBar } from \"../../runtime/RuntimeBar\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n firstMode,\n modeForBackend,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport { CheckboxField, NumberField, SpecField, SpecInput } from \"./fields\";\nimport { withBudgetValue, withOptionalRoot, withRoot } from \"./update\";\n\ntype FallbackDraftPatch = {\n model?: string | undefined;\n id?: string | undefined;\n backend?: string | undefined;\n temperature?: number | undefined;\n effort?: string | undefined;\n noCache?: boolean | undefined;\n};\n\nexport function ModelSection({\n value,\n onChange,\n models,\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n // The bar owns family, mode, model and effort — including the free-text model\n // entry for families the catalog does not describe.\n return (\n <div className=\"grid gap-density-2\">\n <RuntimeBar\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <div className=\"grid grid-cols-2 gap-density-2 md:grid-cols-4\">\n <NumberField\n label=\"Max cost (USD)\"\n value={value.budget?.cost}\n onChange={(cost) => onChange(withBudgetValue(value, \"cost\", cost))}\n icon={UiCurrencyDollar}\n min={0}\n step={0.01}\n />\n <NumberField\n label=\"Max tokens\"\n value={value.budget?.maxTokens}\n onChange={(maxTokens) =>\n onChange(withBudgetValue(value, \"maxTokens\", maxTokens))\n }\n icon={UiCoins}\n min={0}\n step={1}\n integer\n />\n <NumberField\n label=\"Max turns\"\n value={value.budget?.maxTurns}\n onChange={(maxTurns) =>\n onChange(withBudgetValue(value, \"maxTurns\", maxTurns))\n }\n icon={UiRepeat}\n min={0}\n max={100}\n step={1}\n integer\n />\n <SpecField label=\"Timeout\">\n <SpecInput\n value={value.budget?.timeout}\n onChange={(timeout) =>\n onChange(withBudgetValue(value, \"timeout\", timeout))\n }\n placeholder=\"30m\"\n icon={UiTimer}\n mono\n />\n </SpecField>\n </div>\n <ProviderStatusPanel\n models={models}\n families={families ?? SPEC_RUNTIME_FAMILIES}\n defaultCollapsed\n />\n </div>\n );\n}\n\nexport function ModelAdvanced({\n value,\n onChange,\n models = [],\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n return (\n <div className=\"grid gap-density-2\">\n <FallbackModelsEditor\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <SpecField label=\"Session ID\">\n <SpecInput\n value={value.sessionId}\n onChange={(sessionId) =>\n onChange(withOptionalRoot(value, \"sessionId\", sessionId))\n }\n placeholder=\"session UUID\"\n icon={UiFingerprint}\n mono\n />\n </SpecField>\n <CheckboxField\n label=\"Disable prompt caching\"\n checked={value.noCache}\n onChange={(noCache) => onChange(withRoot(value, { noCache }))}\n />\n </div>\n );\n}\n\nfunction FallbackModelsEditor({\n value,\n onChange,\n models,\n families = SPEC_RUNTIME_FAMILIES,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n const fallbacks = value.fallbacks ?? [];\n const [expandedIndex, setExpandedIndex] = useState<number | null>(null);\n\n const setFallbacks = (nextFallbacks: AISpecRuntimeModelFallback[]) => {\n onChange(withRoot(value, { fallbacks: nextFallbacks }));\n };\n\n const removeFallback = (index: number) => {\n setFallbacks(fallbacks.filter((_, rowIndex) => rowIndex !== index));\n setExpandedIndex((current) => {\n if (current == null) return null;\n if (current === index) return null;\n return current > index ? current - 1 : current;\n });\n };\n\n const addFallback = () => {\n const nextFallbacks = [...fallbacks, newFallbackDraft(value, families)];\n setFallbacks(nextFallbacks);\n setExpandedIndex(nextFallbacks.length - 1);\n };\n\n const updateFallback = (index: number, nextFallback: FallbackDraftPatch) => {\n setFallbacks(\n fallbacks.map((fallback, rowIndex) =>\n rowIndex === index ? compactEditableFallback(nextFallback) : fallback\n )\n );\n };\n\n const toggleFallback = (index: number) => {\n setExpandedIndex((current) => (current === index ? null : index));\n };\n\n return (\n <div className=\"space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2\">\n <div className=\"inline-flex min-w-0 items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <Icon icon={UiRepeat} className=\"size-3.5 shrink-0\" />\n <span>Fallback models</span>\n </div>\n <button\n type=\"button\"\n onClick={addFallback}\n className=\"inline-flex items-center gap-1 rounded-md border border-border bg-background px-density-2 py-density-1 text-xs font-medium text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Icon icon={UiAdd} className=\"size-3.5\" />\n Add\n </button>\n </div>\n {fallbacks.length > 0 && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div className=\"divide-y divide-border\">\n {fallbacks.map((fallback, index) => (\n <FallbackModelRow\n key={`${fallback.model ?? \"fallback\"}-${index}`}\n fallback={fallback}\n models={models}\n families={families}\n expanded={expandedIndex === index}\n editorId={`spec-runtime-fallback-${index}-picker`}\n onToggle={() => toggleFallback(index)}\n onChange={(nextFallback) => updateFallback(index, nextFallback)}\n onRemove={() => removeFallback(index)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelRow({\n fallback,\n models,\n families,\n expanded,\n editorId,\n onToggle,\n onChange,\n onRemove,\n}: {\n fallback: AISpecRuntimeModelFallback;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n expanded: boolean;\n editorId: string;\n onToggle: () => void;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n onRemove: () => void;\n}) {\n const meta = fallbackModelMeta(fallback, models);\n const Glyph = meta.provider ? providerIcon(meta.provider) : undefined;\n const label = meta.label || \"Select model\";\n // The collapsed row is the bar in miniature: brand mark, runtime mode, model,\n // effort — each carrying the same tone it has inside the expanded editor.\n const mode = modeForBackend(families, fallback.backend);\n const effortGlyph = fallback.effort\n ? effortLevelIcon(fallback.effort)\n : undefined;\n return (\n <div>\n <div className=\"grid min-h-9 grid-cols-[minmax(0,1fr)_auto] items-center gap-density-1 px-density-1 py-density-1\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={editorId}\n aria-label={`Edit fallback ${label}`}\n onClick={onToggle}\n className=\"grid min-w-0 grid-cols-[auto_auto_minmax(0,1fr)_auto] items-center gap-density-2 rounded-md px-density-1 py-density-1 text-left hover:bg-muted\"\n >\n {Glyph ? (\n <Glyph\n className={cn(\n \"size-4 shrink-0\",\n meta.provider ? providerIconColor(meta.provider) : undefined\n )}\n />\n ) : (\n <Icon\n icon={UiSparkles}\n className=\"size-4 shrink-0 text-muted-foreground/70\"\n />\n )}\n {mode?.icon ? (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n title={mode.title ?? mode.label}\n />\n ) : (\n // Held open so rows with and without a known mode still align.\n <span aria-hidden=\"true\" className=\"size-4\" />\n )}\n <span\n className=\"min-w-0 truncate font-mono text-xs text-foreground\"\n title={label}\n >\n {label}\n </span>\n {fallback.effort ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-semibold uppercase leading-none text-muted-foreground\">\n {effortGlyph && (\n <Icon\n icon={effortGlyph}\n className={cn(\"size-3\", effortLevelColor(fallback.effort))}\n />\n )}\n {effortLevelLabel(fallback.effort)}\n </span>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n </button>\n <IconButton\n icon={UiTrash}\n label={`Remove ${label}`}\n onClick={onRemove}\n className=\"size-6\"\n iconClassName=\"size-4\"\n />\n </div>\n {expanded && (\n <div className=\"border-t border-border p-density-2\">\n <FallbackModelPicker\n id={editorId}\n value={fallback}\n onChange={onChange}\n models={models}\n families={families}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelPicker({\n id,\n value,\n onChange,\n models,\n families,\n}: {\n id: string;\n value: AISpecRuntimeModelFallback;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n}) {\n return (\n <div\n id={id}\n role=\"group\"\n aria-label=\"Fallback model picker\"\n className=\"rounded-md border border-dashed border-border bg-muted/20 p-density-2\"\n >\n <RuntimeBar\n value={value}\n onChange={(next) => onChange(compactEditableFallback(next))}\n models={models}\n families={families}\n ariaLabel=\"Fallback runtime\"\n />\n </div>\n );\n}\n\nfunction newFallbackDraft(\n value: AISpecRuntimeValue,\n families: SpecRuntimeFamily[]\n): AISpecRuntimeModelFallback {\n const fallback: AISpecRuntimeModelFallback = {};\n const backend = value.backend || defaultFallbackBackend(families);\n if (backend) fallback.backend = backend;\n if (value.effort) fallback.effort = value.effort;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n fallback.temperature = value.temperature;\n }\n return fallback;\n}\n\nfunction defaultFallbackBackend(families: SpecRuntimeFamily[]): string {\n const family = families[0] ?? SPEC_RUNTIME_FAMILIES[0];\n return family ? firstMode(family).backend : \"\";\n}\n\nfunction compactEditableFallback(\n value: FallbackDraftPatch\n): AISpecRuntimeModelFallback {\n const next: AISpecRuntimeModelFallback = {};\n const model = cleanString(value.model);\n if (model) next.model = model;\n const id = cleanString(value.id);\n if (id) next.id = id;\n const backend = cleanString(value.backend);\n if (backend) next.backend = backend;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n next.temperature = value.temperature;\n }\n const effort = cleanString(value.effort);\n if (effort) next.effort = effort;\n if (value.noCache) next.noCache = true;\n return next;\n}\n\nfunction fallbackModelMeta(\n fallback: AISpecRuntimeModelFallback,\n models: ChatModel[]\n): { label: string; provider?: string | undefined } {\n const modelId = fallback.model ?? \"\";\n const match = models.find(\n (model) => model.id === modelId || model.label === modelId\n );\n if (match) return { label: match.label, provider: match.provider };\n return {\n label: modelId || fallback.id || \"\",\n provider: inferProvider(fallback),\n };\n}\n\nfunction inferProvider(\n fallback: AISpecRuntimeModelFallback\n): string | undefined {\n const text = `${fallback.backend ?? \"\"} ${\n fallback.model ?? \"\"\n }`.toLowerCase();\n if (text.includes(\"anthropic\") || text.includes(\"claude\")) return \"anthropic\";\n if (text.includes(\"google\") || text.includes(\"gemini\")) return \"googleai\";\n if (\n text.includes(\"openai\") ||\n text.includes(\"gpt\") ||\n text.includes(\"codex\")\n ) {\n return \"openai\";\n }\n return undefined;\n}\n\nfunction cleanString(value: string | undefined): string {\n return value?.trim() ?? \"\";\n}\n"],"names":["jsxs","jsx","RuntimeBar","NumberField","withBudgetValue","UiCurrencyDollar","UiCoins","UiRepeat","SpecField","SpecInput","UiTimer","ProviderStatusPanel","SPEC_RUNTIME_FAMILIES","withOptionalRoot","UiFingerprint","CheckboxField","withRoot","useState","Icon","UiAdd","providerIcon","modeForBackend","effortLevelIcon","cn","providerIconColor","UiSparkles","effortLevelColor","effortLevelLabel","IconButton","UiTrash","firstMode"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ChatModel } from '../../chat/types';
2
2
  import { AISpecRuntimeValue } from '../SpecRuntimeEditor.model';
3
- import { SpecRuntimeFamily } from '../runtime-mode';
3
+ import { SpecRuntimeFamily } from '../../runtime/runtime-mode';
4
4
  export declare function ModelSection({ value, onChange, models, families, }: {
5
5
  value: AISpecRuntimeValue;
6
6
  onChange: (value: AISpecRuntimeValue) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"ModelSection.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/ModelSection.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAelD,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAazB,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;CAC5C,2CAyDA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,MAAW,EACX,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;CAC5C,2CA2BA"}
1
+ {"version":3,"file":"ModelSection.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/ModelSection.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAelD,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAapC,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;CAC5C,2CA8DA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,MAAW,EACX,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;CAC5C,2CA2BA"}
@@ -5,8 +5,9 @@ import { providerIcon, providerIconColor } from "../../chat/provider-icons.js";
5
5
  import { Icon } from "../../Icon.js";
6
6
  import { IconButton } from "../../../components/IconButton.js";
7
7
  import { cn } from "../../../lib/utils.js";
8
- import { RuntimeBar } from "../RuntimeBar.js";
9
- import { SPEC_RUNTIME_FAMILIES, modeForBackend, firstMode } from "../runtime-mode.js";
8
+ import { ProviderStatusPanel } from "../../runtime/ProviderStatusPanel.js";
9
+ import { RuntimeBar } from "../../runtime/RuntimeBar.js";
10
+ import { SPEC_RUNTIME_FAMILIES, modeForBackend, firstMode } from "../../runtime/runtime-mode.js";
10
11
  import { NumberField, SpecField, SpecInput, CheckboxField } from "./fields.js";
11
12
  import { withBudgetValue, withOptionalRoot, withRoot } from "./update.js";
12
13
  import { UiCurrencyDollar } from "../../../icons/components/UiCurrencyDollar.js";
@@ -81,7 +82,15 @@ function ModelSection({
81
82
  mono: true
82
83
  }
83
84
  ) })
84
- ] })
85
+ ] }),
86
+ /* @__PURE__ */ jsx(
87
+ ProviderStatusPanel,
88
+ {
89
+ models,
90
+ families: families ?? SPEC_RUNTIME_FAMILIES,
91
+ defaultCollapsed: true
92
+ }
93
+ )
85
94
  ] });
86
95
  }
87
96
  function ModelAdvanced({
@@ -1 +1 @@
1
- {"version":3,"file":"ModelSection.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/ModelSection.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../../chat/effort-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { providerIcon, providerIconColor } from \"../../chat/provider-icons\";\nimport { Icon } from \"../../Icon\";\nimport { IconButton } from \"../../../components\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n UiAdd,\n UiCoins,\n UiCurrencyDollar,\n UiFingerprint,\n UiRepeat,\n UiSparkles,\n UiTimer,\n UiTrash,\n} from \"../../../icons\";\nimport type {\n AISpecRuntimeModelFallback,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { RuntimeBar } from \"../RuntimeBar\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n firstMode,\n modeForBackend,\n type SpecRuntimeFamily,\n} from \"../runtime-mode\";\nimport { CheckboxField, NumberField, SpecField, SpecInput } from \"./fields\";\nimport { withBudgetValue, withOptionalRoot, withRoot } from \"./update\";\n\ntype FallbackDraftPatch = {\n model?: string | undefined;\n id?: string | undefined;\n backend?: string | undefined;\n temperature?: number | undefined;\n effort?: string | undefined;\n noCache?: boolean | undefined;\n};\n\nexport function ModelSection({\n value,\n onChange,\n models,\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n // The bar owns family, mode, model and effort — including the free-text model\n // entry for families the catalog does not describe.\n return (\n <div className=\"grid gap-density-2\">\n <RuntimeBar\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <div className=\"grid grid-cols-2 gap-density-2 md:grid-cols-4\">\n <NumberField\n label=\"Max cost (USD)\"\n value={value.budget?.cost}\n onChange={(cost) => onChange(withBudgetValue(value, \"cost\", cost))}\n icon={UiCurrencyDollar}\n min={0}\n step={0.01}\n />\n <NumberField\n label=\"Max tokens\"\n value={value.budget?.maxTokens}\n onChange={(maxTokens) =>\n onChange(withBudgetValue(value, \"maxTokens\", maxTokens))\n }\n icon={UiCoins}\n min={0}\n step={1}\n integer\n />\n <NumberField\n label=\"Max turns\"\n value={value.budget?.maxTurns}\n onChange={(maxTurns) =>\n onChange(withBudgetValue(value, \"maxTurns\", maxTurns))\n }\n icon={UiRepeat}\n min={0}\n max={100}\n step={1}\n integer\n />\n <SpecField label=\"Timeout\">\n <SpecInput\n value={value.budget?.timeout}\n onChange={(timeout) =>\n onChange(withBudgetValue(value, \"timeout\", timeout))\n }\n placeholder=\"30m\"\n icon={UiTimer}\n mono\n />\n </SpecField>\n </div>\n </div>\n );\n}\n\nexport function ModelAdvanced({\n value,\n onChange,\n models = [],\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n return (\n <div className=\"grid gap-density-2\">\n <FallbackModelsEditor\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <SpecField label=\"Session ID\">\n <SpecInput\n value={value.sessionId}\n onChange={(sessionId) =>\n onChange(withOptionalRoot(value, \"sessionId\", sessionId))\n }\n placeholder=\"session UUID\"\n icon={UiFingerprint}\n mono\n />\n </SpecField>\n <CheckboxField\n label=\"Disable prompt caching\"\n checked={value.noCache}\n onChange={(noCache) => onChange(withRoot(value, { noCache }))}\n />\n </div>\n );\n}\n\nfunction FallbackModelsEditor({\n value,\n onChange,\n models,\n families = SPEC_RUNTIME_FAMILIES,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n const fallbacks = value.fallbacks ?? [];\n const [expandedIndex, setExpandedIndex] = useState<number | null>(null);\n\n const setFallbacks = (nextFallbacks: AISpecRuntimeModelFallback[]) => {\n onChange(withRoot(value, { fallbacks: nextFallbacks }));\n };\n\n const removeFallback = (index: number) => {\n setFallbacks(fallbacks.filter((_, rowIndex) => rowIndex !== index));\n setExpandedIndex((current) => {\n if (current == null) return null;\n if (current === index) return null;\n return current > index ? current - 1 : current;\n });\n };\n\n const addFallback = () => {\n const nextFallbacks = [...fallbacks, newFallbackDraft(value, families)];\n setFallbacks(nextFallbacks);\n setExpandedIndex(nextFallbacks.length - 1);\n };\n\n const updateFallback = (index: number, nextFallback: FallbackDraftPatch) => {\n setFallbacks(\n fallbacks.map((fallback, rowIndex) =>\n rowIndex === index ? compactEditableFallback(nextFallback) : fallback,\n ),\n );\n };\n\n const toggleFallback = (index: number) => {\n setExpandedIndex((current) => (current === index ? null : index));\n };\n\n return (\n <div className=\"space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2\">\n <div className=\"inline-flex min-w-0 items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <Icon icon={UiRepeat} className=\"size-3.5 shrink-0\" />\n <span>Fallback models</span>\n </div>\n <button\n type=\"button\"\n onClick={addFallback}\n className=\"inline-flex items-center gap-1 rounded-md border border-border bg-background px-density-2 py-density-1 text-xs font-medium text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Icon icon={UiAdd} className=\"size-3.5\" />\n Add\n </button>\n </div>\n {fallbacks.length > 0 && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div className=\"divide-y divide-border\">\n {fallbacks.map((fallback, index) => (\n <FallbackModelRow\n key={`${fallback.model ?? \"fallback\"}-${index}`}\n fallback={fallback}\n models={models}\n families={families}\n expanded={expandedIndex === index}\n editorId={`spec-runtime-fallback-${index}-picker`}\n onToggle={() => toggleFallback(index)}\n onChange={(nextFallback) => updateFallback(index, nextFallback)}\n onRemove={() => removeFallback(index)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelRow({\n fallback,\n models,\n families,\n expanded,\n editorId,\n onToggle,\n onChange,\n onRemove,\n}: {\n fallback: AISpecRuntimeModelFallback;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n expanded: boolean;\n editorId: string;\n onToggle: () => void;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n onRemove: () => void;\n}) {\n const meta = fallbackModelMeta(fallback, models);\n const Glyph = meta.provider ? providerIcon(meta.provider) : undefined;\n const label = meta.label || \"Select model\";\n // The collapsed row is the bar in miniature: brand mark, runtime mode, model,\n // effort — each carrying the same tone it has inside the expanded editor.\n const mode = modeForBackend(families, fallback.backend);\n const effortGlyph = fallback.effort\n ? effortLevelIcon(fallback.effort)\n : undefined;\n return (\n <div>\n <div className=\"grid min-h-9 grid-cols-[minmax(0,1fr)_auto] items-center gap-density-1 px-density-1 py-density-1\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={editorId}\n aria-label={`Edit fallback ${label}`}\n onClick={onToggle}\n className=\"grid min-w-0 grid-cols-[auto_auto_minmax(0,1fr)_auto] items-center gap-density-2 rounded-md px-density-1 py-density-1 text-left hover:bg-muted\"\n >\n {Glyph ? (\n <Glyph\n className={cn(\n \"size-4 shrink-0\",\n meta.provider ? providerIconColor(meta.provider) : undefined,\n )}\n />\n ) : (\n <Icon\n icon={UiSparkles}\n className=\"size-4 shrink-0 text-muted-foreground/70\"\n />\n )}\n {mode?.icon ? (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n title={mode.title ?? mode.label}\n />\n ) : (\n // Held open so rows with and without a known mode still align.\n <span aria-hidden=\"true\" className=\"size-4\" />\n )}\n <span\n className=\"min-w-0 truncate font-mono text-xs text-foreground\"\n title={label}\n >\n {label}\n </span>\n {fallback.effort ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-semibold uppercase leading-none text-muted-foreground\">\n {effortGlyph && (\n <Icon\n icon={effortGlyph}\n className={cn(\"size-3\", effortLevelColor(fallback.effort))}\n />\n )}\n {effortLevelLabel(fallback.effort)}\n </span>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n </button>\n <IconButton\n icon={UiTrash}\n label={`Remove ${label}`}\n onClick={onRemove}\n className=\"size-6\"\n iconClassName=\"size-4\"\n />\n </div>\n {expanded && (\n <div className=\"border-t border-border p-density-2\">\n <FallbackModelPicker\n id={editorId}\n value={fallback}\n onChange={onChange}\n models={models}\n families={families}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelPicker({\n id,\n value,\n onChange,\n models,\n families,\n}: {\n id: string;\n value: AISpecRuntimeModelFallback;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n}) {\n return (\n <div\n id={id}\n role=\"group\"\n aria-label=\"Fallback model picker\"\n className=\"rounded-md border border-dashed border-border bg-muted/20 p-density-2\"\n >\n <RuntimeBar\n value={value}\n onChange={(next) => onChange(compactEditableFallback(next))}\n models={models}\n families={families}\n ariaLabel=\"Fallback runtime\"\n />\n </div>\n );\n}\n\nfunction newFallbackDraft(\n value: AISpecRuntimeValue,\n families: SpecRuntimeFamily[],\n): AISpecRuntimeModelFallback {\n const fallback: AISpecRuntimeModelFallback = {};\n const backend = value.backend || defaultFallbackBackend(families);\n if (backend) fallback.backend = backend;\n if (value.effort) fallback.effort = value.effort;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n fallback.temperature = value.temperature;\n }\n return fallback;\n}\n\nfunction defaultFallbackBackend(families: SpecRuntimeFamily[]): string {\n const family = families[0] ?? SPEC_RUNTIME_FAMILIES[0];\n return family ? firstMode(family).backend : \"\";\n}\n\nfunction compactEditableFallback(\n value: FallbackDraftPatch,\n): AISpecRuntimeModelFallback {\n const next: AISpecRuntimeModelFallback = {};\n const model = cleanString(value.model);\n if (model) next.model = model;\n const id = cleanString(value.id);\n if (id) next.id = id;\n const backend = cleanString(value.backend);\n if (backend) next.backend = backend;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n next.temperature = value.temperature;\n }\n const effort = cleanString(value.effort);\n if (effort) next.effort = effort;\n if (value.noCache) next.noCache = true;\n return next;\n}\n\nfunction fallbackModelMeta(\n fallback: AISpecRuntimeModelFallback,\n models: ChatModel[],\n): { label: string; provider?: string | undefined } {\n const modelId = fallback.model ?? \"\";\n const match = models.find(\n (model) => model.id === modelId || model.label === modelId,\n );\n if (match) return { label: match.label, provider: match.provider };\n return {\n label: modelId || fallback.id || \"\",\n provider: inferProvider(fallback),\n };\n}\n\nfunction inferProvider(\n fallback: AISpecRuntimeModelFallback,\n): string | undefined {\n const text =\n `${fallback.backend ?? \"\"} ${fallback.model ?? \"\"}`.toLowerCase();\n if (text.includes(\"anthropic\") || text.includes(\"claude\")) return \"anthropic\";\n if (text.includes(\"google\") || text.includes(\"gemini\")) return \"googleai\";\n if (\n text.includes(\"openai\") ||\n text.includes(\"gpt\") ||\n text.includes(\"codex\")\n ) {\n return \"openai\";\n }\n return undefined;\n}\n\nfunction cleanString(value: string | undefined): string {\n return value?.trim() ?? \"\";\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ModelSection.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/ModelSection.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../../chat/effort-icons\";\nimport type { ChatModel } from \"../../chat/types\";\nimport { providerIcon, providerIconColor } from \"../../chat/provider-icons\";\nimport { Icon } from \"../../Icon\";\nimport { IconButton } from \"../../../components\";\nimport { cn } from \"../../../lib/utils\";\nimport {\n UiAdd,\n UiCoins,\n UiCurrencyDollar,\n UiFingerprint,\n UiRepeat,\n UiSparkles,\n UiTimer,\n UiTrash,\n} from \"../../../icons\";\nimport type {\n AISpecRuntimeModelFallback,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { ProviderStatusPanel } from \"../../runtime/ProviderStatusPanel\";\nimport { RuntimeBar } from \"../../runtime/RuntimeBar\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n firstMode,\n modeForBackend,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport { CheckboxField, NumberField, SpecField, SpecInput } from \"./fields\";\nimport { withBudgetValue, withOptionalRoot, withRoot } from \"./update\";\n\ntype FallbackDraftPatch = {\n model?: string | undefined;\n id?: string | undefined;\n backend?: string | undefined;\n temperature?: number | undefined;\n effort?: string | undefined;\n noCache?: boolean | undefined;\n};\n\nexport function ModelSection({\n value,\n onChange,\n models,\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n // The bar owns family, mode, model and effort — including the free-text model\n // entry for families the catalog does not describe.\n return (\n <div className=\"grid gap-density-2\">\n <RuntimeBar\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <div className=\"grid grid-cols-2 gap-density-2 md:grid-cols-4\">\n <NumberField\n label=\"Max cost (USD)\"\n value={value.budget?.cost}\n onChange={(cost) => onChange(withBudgetValue(value, \"cost\", cost))}\n icon={UiCurrencyDollar}\n min={0}\n step={0.01}\n />\n <NumberField\n label=\"Max tokens\"\n value={value.budget?.maxTokens}\n onChange={(maxTokens) =>\n onChange(withBudgetValue(value, \"maxTokens\", maxTokens))\n }\n icon={UiCoins}\n min={0}\n step={1}\n integer\n />\n <NumberField\n label=\"Max turns\"\n value={value.budget?.maxTurns}\n onChange={(maxTurns) =>\n onChange(withBudgetValue(value, \"maxTurns\", maxTurns))\n }\n icon={UiRepeat}\n min={0}\n max={100}\n step={1}\n integer\n />\n <SpecField label=\"Timeout\">\n <SpecInput\n value={value.budget?.timeout}\n onChange={(timeout) =>\n onChange(withBudgetValue(value, \"timeout\", timeout))\n }\n placeholder=\"30m\"\n icon={UiTimer}\n mono\n />\n </SpecField>\n </div>\n <ProviderStatusPanel\n models={models}\n families={families ?? SPEC_RUNTIME_FAMILIES}\n defaultCollapsed\n />\n </div>\n );\n}\n\nexport function ModelAdvanced({\n value,\n onChange,\n models = [],\n families,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n return (\n <div className=\"grid gap-density-2\">\n <FallbackModelsEditor\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n <SpecField label=\"Session ID\">\n <SpecInput\n value={value.sessionId}\n onChange={(sessionId) =>\n onChange(withOptionalRoot(value, \"sessionId\", sessionId))\n }\n placeholder=\"session UUID\"\n icon={UiFingerprint}\n mono\n />\n </SpecField>\n <CheckboxField\n label=\"Disable prompt caching\"\n checked={value.noCache}\n onChange={(noCache) => onChange(withRoot(value, { noCache }))}\n />\n </div>\n );\n}\n\nfunction FallbackModelsEditor({\n value,\n onChange,\n models,\n families = SPEC_RUNTIME_FAMILIES,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models: ChatModel[];\n families?: SpecRuntimeFamily[] | undefined;\n}) {\n const fallbacks = value.fallbacks ?? [];\n const [expandedIndex, setExpandedIndex] = useState<number | null>(null);\n\n const setFallbacks = (nextFallbacks: AISpecRuntimeModelFallback[]) => {\n onChange(withRoot(value, { fallbacks: nextFallbacks }));\n };\n\n const removeFallback = (index: number) => {\n setFallbacks(fallbacks.filter((_, rowIndex) => rowIndex !== index));\n setExpandedIndex((current) => {\n if (current == null) return null;\n if (current === index) return null;\n return current > index ? current - 1 : current;\n });\n };\n\n const addFallback = () => {\n const nextFallbacks = [...fallbacks, newFallbackDraft(value, families)];\n setFallbacks(nextFallbacks);\n setExpandedIndex(nextFallbacks.length - 1);\n };\n\n const updateFallback = (index: number, nextFallback: FallbackDraftPatch) => {\n setFallbacks(\n fallbacks.map((fallback, rowIndex) =>\n rowIndex === index ? compactEditableFallback(nextFallback) : fallback\n )\n );\n };\n\n const toggleFallback = (index: number) => {\n setExpandedIndex((current) => (current === index ? null : index));\n };\n\n return (\n <div className=\"space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2\">\n <div className=\"inline-flex min-w-0 items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n <Icon icon={UiRepeat} className=\"size-3.5 shrink-0\" />\n <span>Fallback models</span>\n </div>\n <button\n type=\"button\"\n onClick={addFallback}\n className=\"inline-flex items-center gap-1 rounded-md border border-border bg-background px-density-2 py-density-1 text-xs font-medium text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Icon icon={UiAdd} className=\"size-3.5\" />\n Add\n </button>\n </div>\n {fallbacks.length > 0 && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div className=\"divide-y divide-border\">\n {fallbacks.map((fallback, index) => (\n <FallbackModelRow\n key={`${fallback.model ?? \"fallback\"}-${index}`}\n fallback={fallback}\n models={models}\n families={families}\n expanded={expandedIndex === index}\n editorId={`spec-runtime-fallback-${index}-picker`}\n onToggle={() => toggleFallback(index)}\n onChange={(nextFallback) => updateFallback(index, nextFallback)}\n onRemove={() => removeFallback(index)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelRow({\n fallback,\n models,\n families,\n expanded,\n editorId,\n onToggle,\n onChange,\n onRemove,\n}: {\n fallback: AISpecRuntimeModelFallback;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n expanded: boolean;\n editorId: string;\n onToggle: () => void;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n onRemove: () => void;\n}) {\n const meta = fallbackModelMeta(fallback, models);\n const Glyph = meta.provider ? providerIcon(meta.provider) : undefined;\n const label = meta.label || \"Select model\";\n // The collapsed row is the bar in miniature: brand mark, runtime mode, model,\n // effort — each carrying the same tone it has inside the expanded editor.\n const mode = modeForBackend(families, fallback.backend);\n const effortGlyph = fallback.effort\n ? effortLevelIcon(fallback.effort)\n : undefined;\n return (\n <div>\n <div className=\"grid min-h-9 grid-cols-[minmax(0,1fr)_auto] items-center gap-density-1 px-density-1 py-density-1\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={editorId}\n aria-label={`Edit fallback ${label}`}\n onClick={onToggle}\n className=\"grid min-w-0 grid-cols-[auto_auto_minmax(0,1fr)_auto] items-center gap-density-2 rounded-md px-density-1 py-density-1 text-left hover:bg-muted\"\n >\n {Glyph ? (\n <Glyph\n className={cn(\n \"size-4 shrink-0\",\n meta.provider ? providerIconColor(meta.provider) : undefined\n )}\n />\n ) : (\n <Icon\n icon={UiSparkles}\n className=\"size-4 shrink-0 text-muted-foreground/70\"\n />\n )}\n {mode?.icon ? (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n title={mode.title ?? mode.label}\n />\n ) : (\n // Held open so rows with and without a known mode still align.\n <span aria-hidden=\"true\" className=\"size-4\" />\n )}\n <span\n className=\"min-w-0 truncate font-mono text-xs text-foreground\"\n title={label}\n >\n {label}\n </span>\n {fallback.effort ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[10px] font-semibold uppercase leading-none text-muted-foreground\">\n {effortGlyph && (\n <Icon\n icon={effortGlyph}\n className={cn(\"size-3\", effortLevelColor(fallback.effort))}\n />\n )}\n {effortLevelLabel(fallback.effort)}\n </span>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n </button>\n <IconButton\n icon={UiTrash}\n label={`Remove ${label}`}\n onClick={onRemove}\n className=\"size-6\"\n iconClassName=\"size-4\"\n />\n </div>\n {expanded && (\n <div className=\"border-t border-border p-density-2\">\n <FallbackModelPicker\n id={editorId}\n value={fallback}\n onChange={onChange}\n models={models}\n families={families}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction FallbackModelPicker({\n id,\n value,\n onChange,\n models,\n families,\n}: {\n id: string;\n value: AISpecRuntimeModelFallback;\n onChange: (value: AISpecRuntimeModelFallback) => void;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n}) {\n return (\n <div\n id={id}\n role=\"group\"\n aria-label=\"Fallback model picker\"\n className=\"rounded-md border border-dashed border-border bg-muted/20 p-density-2\"\n >\n <RuntimeBar\n value={value}\n onChange={(next) => onChange(compactEditableFallback(next))}\n models={models}\n families={families}\n ariaLabel=\"Fallback runtime\"\n />\n </div>\n );\n}\n\nfunction newFallbackDraft(\n value: AISpecRuntimeValue,\n families: SpecRuntimeFamily[]\n): AISpecRuntimeModelFallback {\n const fallback: AISpecRuntimeModelFallback = {};\n const backend = value.backend || defaultFallbackBackend(families);\n if (backend) fallback.backend = backend;\n if (value.effort) fallback.effort = value.effort;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n fallback.temperature = value.temperature;\n }\n return fallback;\n}\n\nfunction defaultFallbackBackend(families: SpecRuntimeFamily[]): string {\n const family = families[0] ?? SPEC_RUNTIME_FAMILIES[0];\n return family ? firstMode(family).backend : \"\";\n}\n\nfunction compactEditableFallback(\n value: FallbackDraftPatch\n): AISpecRuntimeModelFallback {\n const next: AISpecRuntimeModelFallback = {};\n const model = cleanString(value.model);\n if (model) next.model = model;\n const id = cleanString(value.id);\n if (id) next.id = id;\n const backend = cleanString(value.backend);\n if (backend) next.backend = backend;\n if (value.temperature != null && Number.isFinite(value.temperature)) {\n next.temperature = value.temperature;\n }\n const effort = cleanString(value.effort);\n if (effort) next.effort = effort;\n if (value.noCache) next.noCache = true;\n return next;\n}\n\nfunction fallbackModelMeta(\n fallback: AISpecRuntimeModelFallback,\n models: ChatModel[]\n): { label: string; provider?: string | undefined } {\n const modelId = fallback.model ?? \"\";\n const match = models.find(\n (model) => model.id === modelId || model.label === modelId\n );\n if (match) return { label: match.label, provider: match.provider };\n return {\n label: modelId || fallback.id || \"\",\n provider: inferProvider(fallback),\n };\n}\n\nfunction inferProvider(\n fallback: AISpecRuntimeModelFallback\n): string | undefined {\n const text = `${fallback.backend ?? \"\"} ${\n fallback.model ?? \"\"\n }`.toLowerCase();\n if (text.includes(\"anthropic\") || text.includes(\"claude\")) return \"anthropic\";\n if (text.includes(\"google\") || text.includes(\"gemini\")) return \"googleai\";\n if (\n text.includes(\"openai\") ||\n text.includes(\"gpt\") ||\n text.includes(\"codex\")\n ) {\n return \"openai\";\n }\n return undefined;\n}\n\nfunction cleanString(value: string | undefined): string {\n return value?.trim() ?? \"\";\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AA6CO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;;AAGD,SACE,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,IAElC,qBAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO,WAAM,WAAN,mBAAc;AAAA,UACrB,UAAU,CAAC,SAAS,SAAS,gBAAgB,OAAO,QAAQ,IAAI,CAAC;AAAA,UACjE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,QAAA;AAAA,MAAA;AAAA,MAER;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO,WAAM,WAAN,mBAAc;AAAA,UACrB,UAAU,CAAC,cACT,SAAS,gBAAgB,OAAO,aAAa,SAAS,CAAC;AAAA,UAEzD,MAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAET;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO,WAAM,WAAN,mBAAc;AAAA,UACrB,UAAU,CAAC,aACT,SAAS,gBAAgB,OAAO,YAAY,QAAQ,CAAC;AAAA,UAEvD,MAAM;AAAA,UACN,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAET,oBAAC,WAAA,EAAU,OAAM,WACf,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,QAAO,WAAM,WAAN,mBAAc;AAAA,UACrB,UAAU,CAAC,YACT,SAAS,gBAAgB,OAAO,WAAW,OAAO,CAAC;AAAA,UAErD,aAAY;AAAA,UACZ,MAAM;AAAA,UACN,MAAI;AAAA,QAAA;AAAA,MAAA,EACN,CACF;AAAA,IAAA,GACF;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,UAAU,YAAY;AAAA,QACtB,kBAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAClB,GACF;AAEJ;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,SAAS,CAAA;AAAA,EACT;AACF,GAKG;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,IAElC,oBAAC,WAAA,EAAU,OAAM,cACf,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,MAAM;AAAA,QACb,UAAU,CAAC,cACT,SAAS,iBAAiB,OAAO,aAAa,SAAS,CAAC;AAAA,QAE1D,aAAY;AAAA,QACZ,MAAM;AAAA,QACN,MAAI;AAAA,MAAA;AAAA,IAAA,GAER;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,MAAM;AAAA,QACf,UAAU,CAAC,YAAY,SAAS,SAAS,OAAO,EAAE,SAAS,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAC9D,GACF;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAKG;AACD,QAAM,YAAY,MAAM,aAAa,CAAA;AACrC,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,IAAI;AAEtE,QAAM,eAAe,CAAC,kBAAgD;AACpE,aAAS,SAAS,OAAO,EAAE,WAAW,cAAA,CAAe,CAAC;AAAA,EACxD;AAEA,QAAM,iBAAiB,CAAC,UAAkB;AACxC,iBAAa,UAAU,OAAO,CAAC,GAAG,aAAa,aAAa,KAAK,CAAC;AAClE,qBAAiB,CAAC,YAAY;AAC5B,UAAI,WAAW,KAAM,QAAO;AAC5B,UAAI,YAAY,MAAO,QAAO;AAC9B,aAAO,UAAU,QAAQ,UAAU,IAAI;AAAA,IACzC,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,gBAAgB,CAAC,GAAG,WAAW,iBAAiB,OAAO,QAAQ,CAAC;AACtE,iBAAa,aAAa;AAC1B,qBAAiB,cAAc,SAAS,CAAC;AAAA,EAC3C;AAEA,QAAM,iBAAiB,CAAC,OAAe,iBAAqC;AAC1E;AAAA,MACE,UAAU;AAAA,QAAI,CAAC,UAAU,aACvB,aAAa,QAAQ,wBAAwB,YAAY,IAAI;AAAA,MAAA;AAAA,IAC/D;AAAA,EAEJ;AAEA,QAAM,iBAAiB,CAAC,UAAkB;AACxC,qBAAiB,CAAC,YAAa,YAAY,QAAQ,OAAO,KAAM;AAAA,EAClE;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAU,sFACb,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAM,UAAU,WAAU,qBAAoB;AAAA,QACpD,oBAAC,UAAK,UAAA,kBAAA,CAAe;AAAA,MAAA,GACvB;AAAA,MACA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,oBAAC,MAAA,EAAK,MAAM,OAAO,WAAU,YAAW;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAE5C,GACF;AAAA,IACC,UAAU,SAAS,KAClB,oBAAC,SAAI,WAAU,mDACb,UAAA,oBAAC,OAAA,EAAI,WAAU,0BACZ,UAAA,UAAU,IAAI,CAAC,UAAU,UACxB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,kBAAkB;AAAA,QAC5B,UAAU,yBAAyB,KAAK;AAAA,QACxC,UAAU,MAAM,eAAe,KAAK;AAAA,QACpC,UAAU,CAAC,iBAAiB,eAAe,OAAO,YAAY;AAAA,QAC9D,UAAU,MAAM,eAAe,KAAK;AAAA,MAAA;AAAA,MAR/B,GAAG,SAAS,SAAS,UAAU,IAAI,KAAK;AAAA,IAAA,CAUhD,GACH,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,QAAM,OAAO,kBAAkB,UAAU,MAAM;AAC/C,QAAM,QAAQ,KAAK,WAAW,aAAa,KAAK,QAAQ,IAAI;AAC5D,QAAM,QAAQ,KAAK,SAAS;AAG5B,QAAM,OAAO,eAAe,UAAU,SAAS,OAAO;AACtD,QAAM,cAAc,SAAS,SACzB,gBAAgB,SAAS,MAAM,IAC/B;AACJ,8BACG,OAAA,EACC,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,oGACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,cAAY,iBAAiB,KAAK;AAAA,UAClC,SAAS;AAAA,UACT,WAAU;AAAA,UAET,UAAA;AAAA,YAAA,QACC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,KAAK,WAAW,kBAAkB,KAAK,QAAQ,IAAI;AAAA,gBAAA;AAAA,cACrD;AAAA,YAAA,IAGF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAM;AAAA,gBACN,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,aAGb,6BAAM,QACL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAM,KAAK;AAAA,gBACX,WAAU;AAAA,gBACV,OAAO,KAAK,SAAS,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA;AAAA,cAI5B,oBAAC,QAAA,EAAK,eAAY,QAAO,WAAU,SAAA,CAAS;AAAA;AAAA,YAE9C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBAEN,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEF,SAAS,SACR,qBAAC,QAAA,EAAK,WAAU,2IACb,UAAA;AAAA,cAAA,eACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAM;AAAA,kBACN,WAAW,GAAG,UAAU,iBAAiB,SAAS,MAAM,CAAC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAG5D,iBAAiB,SAAS,MAAM;AAAA,YAAA,EAAA,CACnC,IAEA,oBAAC,QAAA,EAAK,eAAY,OAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAG7B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,UAAU,KAAK;AAAA,UACtB,SAAS;AAAA,UACT,WAAU;AAAA,UACV,eAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAChB,GACF;AAAA,IACC,YACC,oBAAC,OAAA,EAAI,WAAU,sCACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA,EACF,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAU;AAAA,MAEV,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,SAAS,SAAS,wBAAwB,IAAI,CAAC;AAAA,UAC1D;AAAA,UACA;AAAA,UACA,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ;AAAA,EAAA;AAGN;AAEA,SAAS,iBACP,OACA,UAC4B;AAC5B,QAAM,WAAuC,CAAA;AAC7C,QAAM,UAAU,MAAM,WAAW,uBAAuB,QAAQ;AAChE,MAAI,kBAAkB,UAAU;AAChC,MAAI,MAAM,OAAQ,UAAS,SAAS,MAAM;AAC1C,MAAI,MAAM,eAAe,QAAQ,OAAO,SAAS,MAAM,WAAW,GAAG;AACnE,aAAS,cAAc,MAAM;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAAuC;AACrE,QAAM,SAAS,SAAS,CAAC,KAAK,sBAAsB,CAAC;AACrD,SAAO,SAAS,UAAU,MAAM,EAAE,UAAU;AAC9C;AAEA,SAAS,wBACP,OAC4B;AAC5B,QAAM,OAAmC,CAAA;AACzC,QAAM,QAAQ,YAAY,MAAM,KAAK;AACrC,MAAI,YAAY,QAAQ;AACxB,QAAM,KAAK,YAAY,MAAM,EAAE;AAC/B,MAAI,SAAS,KAAK;AAClB,QAAM,UAAU,YAAY,MAAM,OAAO;AACzC,MAAI,cAAc,UAAU;AAC5B,MAAI,MAAM,eAAe,QAAQ,OAAO,SAAS,MAAM,WAAW,GAAG;AACnE,SAAK,cAAc,MAAM;AAAA,EAC3B;AACA,QAAM,SAAS,YAAY,MAAM,MAAM;AACvC,MAAI,aAAa,SAAS;AAC1B,MAAI,MAAM,QAAS,MAAK,UAAU;AAClC,SAAO;AACT;AAEA,SAAS,kBACP,UACA,QACkD;AAClD,QAAM,UAAU,SAAS,SAAS;AAClC,QAAM,QAAQ,OAAO;AAAA,IACnB,CAAC,UAAU,MAAM,OAAO,WAAW,MAAM,UAAU;AAAA,EAAA;AAErD,MAAI,cAAc,EAAE,OAAO,MAAM,OAAO,UAAU,MAAM,SAAA;AACxD,SAAO;AAAA,IACL,OAAO,WAAW,SAAS,MAAM;AAAA,IACjC,UAAU,cAAc,QAAQ;AAAA,EAAA;AAEpC;AAEA,SAAS,cACP,UACoB;AACpB,QAAM,OAAO,GAAG,SAAS,WAAW,EAAE,IACpC,SAAS,SAAS,EACpB,GAAG,YAAA;AACH,MAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,QAAQ,EAAG,QAAO;AAClE,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,QAAQ,EAAG,QAAO;AAC/D,MACE,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,OAAO,GACrB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAmC;AACtD,UAAO,+BAAO,WAAU;AAC1B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"VerifySection.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/VerifySection.tsx"],"sourcesContent":["import { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRepeat } from \"../../../icons\";\nimport { FixtureEditor } from \"../../FixtureEditor\";\nimport type { ChatModel } from \"../../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime-mode\";\nimport {\n SPEC_VERIFY_SCOPES,\n type AISpecRuntimeValue,\n type SpecVerifyScope,\n} from \"../SpecRuntimeEditor.model\";\nimport { NumberField, SpecField } from \"./fields\";\nimport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nimport { withVerify } from \"./update\";\n\nconst SCOPE_OPTIONS: Array<{ id: SpecVerifyScope; label: string }> =\n SPEC_VERIFY_SCOPES.map((scope) => ({\n id: scope,\n label: scope === \"all\" ? \"All files\" : \"Changed files\",\n }));\n\nexport function VerifySection({\n value,\n onChange,\n models,\n families,\n secretSelector,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n}) {\n return (\n <div className=\"grid gap-density-3\">\n <SpecField label=\"Verify fixture\">\n <FixtureEditor\n value={value.workflow?.verify?.fixture ?? \"\"}\n onChange={(fixture) => onChange(withVerify(value, { fixture }))}\n size=\"sm\"\n placeholder=\"Write the verify fixture markdown...\"\n frontmatterEditor={{\n mode: \"verification\",\n models,\n families,\n secretSelector,\n }}\n />\n </SpecField>\n <div className=\"flex flex-wrap items-end gap-density-3\">\n <SpecField label=\"Scope\">\n <SegmentedControl\n aria-label=\"Verification scope\"\n size=\"sm\"\n value={(value.workflow?.verify?.scope || \"all\") as SpecVerifyScope}\n onChange={(scope) => onChange(withVerify(value, { scope }))}\n options={SCOPE_OPTIONS}\n />\n </SpecField>\n <div className=\"w-32\">\n <NumberField\n label=\"Max iterations\"\n value={value.workflow?.verify?.maxIterations}\n onChange={(maxIterations) =>\n onChange(withVerify(value, { maxIterations: maxIterations ?? 0 }))\n }\n icon={UiRepeat}\n min={0}\n step={1}\n integer\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":["SPEC_VERIFY_SCOPES","jsxs","jsx","SpecField","FixtureEditor","withVerify","SegmentedControl","NumberField","UiRepeat"],"mappings":";;;;;;;;;AAcA,MAAM,gBACJA,wBAAAA,mBAAmB,IAAI,CAAC,WAAW;AAAA,EACjC,IAAI;AAAA,EACJ,OAAO,UAAU,QAAQ,cAAc;AACzC,EAAE;AAEG,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAAC,2BAAAA,IAACC,OAAAA,WAAA,EAAU,OAAM,kBACf,UAAAD,2BAAAA;AAAAA,MAACE,cAAAA;AAAAA,MAAA;AAAA,QACC,SAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,YAAW;AAAA,QAC1C,UAAU,CAAC,YAAY,SAASC,OAAAA,WAAW,OAAO,EAAE,QAAA,CAAS,CAAC;AAAA,QAC9D,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GAEJ;AAAA,IACAJ,2BAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAAC,2BAAAA,IAACC,OAAAA,WAAA,EAAU,OAAM,SACf,UAAAD,2BAAAA;AAAAA,QAACI,iBAAAA;AAAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,MAAK;AAAA,UACL,SAAQ,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,UAAS;AAAA,UACzC,UAAU,CAAC,UAAU,SAASD,OAAAA,WAAW,OAAO,EAAE,MAAA,CAAO,CAAC;AAAA,UAC1D,SAAS;AAAA,QAAA;AAAA,MAAA,GAEb;AAAA,MACAH,2BAAAA,IAAC,OAAA,EAAI,WAAU,QACb,UAAAA,2BAAAA;AAAAA,QAACK,OAAAA;AAAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB;AAAA,UAC/B,UAAU,CAAC,kBACT,SAASF,OAAAA,WAAW,OAAO,EAAE,eAAe,iBAAiB,EAAA,CAAG,CAAC;AAAA,UAEnE,MAAMG,SAAAA;AAAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAO;AAAA,QAAA;AAAA,MAAA,EACT,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;;"}
1
+ {"version":3,"file":"VerifySection.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/VerifySection.tsx"],"sourcesContent":["import { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRepeat } from \"../../../icons\";\nimport { FixtureEditor } from \"../../FixtureEditor\";\nimport type { ChatModel } from \"../../chat/types\";\nimport type { SpecRuntimeFamily } from \"../../runtime/runtime-mode\";\nimport {\n SPEC_VERIFY_SCOPES,\n type AISpecRuntimeValue,\n type SpecVerifyScope,\n} from \"../SpecRuntimeEditor.model\";\nimport { NumberField, SpecField } from \"./fields\";\nimport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nimport { withVerify } from \"./update\";\n\nconst SCOPE_OPTIONS: Array<{ id: SpecVerifyScope; label: string }> =\n SPEC_VERIFY_SCOPES.map((scope) => ({\n id: scope,\n label: scope === \"all\" ? \"All files\" : \"Changed files\",\n }));\n\nexport function VerifySection({\n value,\n onChange,\n models,\n families,\n secretSelector,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n}) {\n return (\n <div className=\"grid gap-density-3\">\n <SpecField label=\"Verify fixture\">\n <FixtureEditor\n value={value.workflow?.verify?.fixture ?? \"\"}\n onChange={(fixture) => onChange(withVerify(value, { fixture }))}\n size=\"sm\"\n placeholder=\"Write the verify fixture markdown...\"\n frontmatterEditor={{\n mode: \"verification\",\n models,\n families,\n secretSelector,\n }}\n />\n </SpecField>\n <div className=\"flex flex-wrap items-end gap-density-3\">\n <SpecField label=\"Scope\">\n <SegmentedControl\n aria-label=\"Verification scope\"\n size=\"sm\"\n value={(value.workflow?.verify?.scope || \"all\") as SpecVerifyScope}\n onChange={(scope) => onChange(withVerify(value, { scope }))}\n options={SCOPE_OPTIONS}\n />\n </SpecField>\n <div className=\"w-32\">\n <NumberField\n label=\"Max iterations\"\n value={value.workflow?.verify?.maxIterations}\n onChange={(maxIterations) =>\n onChange(withVerify(value, { maxIterations: maxIterations ?? 0 }))\n }\n icon={UiRepeat}\n min={0}\n step={1}\n integer\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":["SPEC_VERIFY_SCOPES","jsxs","jsx","SpecField","FixtureEditor","withVerify","SegmentedControl","NumberField","UiRepeat"],"mappings":";;;;;;;;;AAcA,MAAM,gBACJA,wBAAAA,mBAAmB,IAAI,CAAC,WAAW;AAAA,EACjC,IAAI;AAAA,EACJ,OAAO,UAAU,QAAQ,cAAc;AACzC,EAAE;AAEG,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAAC,2BAAAA,IAACC,OAAAA,WAAA,EAAU,OAAM,kBACf,UAAAD,2BAAAA;AAAAA,MAACE,cAAAA;AAAAA,MAAA;AAAA,QACC,SAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,YAAW;AAAA,QAC1C,UAAU,CAAC,YAAY,SAASC,OAAAA,WAAW,OAAO,EAAE,QAAA,CAAS,CAAC;AAAA,QAC9D,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GAEJ;AAAA,IACAJ,2BAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAAC,2BAAAA,IAACC,OAAAA,WAAA,EAAU,OAAM,SACf,UAAAD,2BAAAA;AAAAA,QAACI,iBAAAA;AAAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,MAAK;AAAA,UACL,SAAQ,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,UAAS;AAAA,UACzC,UAAU,CAAC,UAAU,SAASD,OAAAA,WAAW,OAAO,EAAE,MAAA,CAAO,CAAC;AAAA,UAC1D,SAAS;AAAA,QAAA;AAAA,MAAA,GAEb;AAAA,MACAH,2BAAAA,IAAC,OAAA,EAAI,WAAU,QACb,UAAAA,2BAAAA;AAAAA,QAACK,OAAAA;AAAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB;AAAA,UAC/B,UAAU,CAAC,kBACT,SAASF,OAAAA,WAAW,OAAO,EAAE,eAAe,iBAAiB,EAAA,CAAG,CAAC;AAAA,UAEnE,MAAMG,SAAAA;AAAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAO;AAAA,QAAA;AAAA,MAAA,EACT,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;;"}
@@ -1,5 +1,5 @@
1
1
  import { ChatModel } from '../../chat/types';
2
- import { SpecRuntimeFamily } from '../runtime-mode';
2
+ import { SpecRuntimeFamily } from '../../runtime/runtime-mode';
3
3
  import { AISpecRuntimeValue } from '../SpecRuntimeEditor.model';
4
4
  import { SpecRuntimeSecretSelectorConfig } from './types';
5
5
  export declare function VerifySection({ value, onChange, models, families, secretSelector, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"VerifySection.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/VerifySection.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAS/D,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,cAAc,GACf,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,cAAc,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;CAC9D,2CA2CA"}
1
+ {"version":3,"file":"VerifySection.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/VerifySection.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAS/D,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,cAAc,GACf,EAAE;IACD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,cAAc,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;CAC9D,2CA2CA"}
@@ -1 +1 @@
1
- {"version":3,"file":"VerifySection.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/VerifySection.tsx"],"sourcesContent":["import { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRepeat } from \"../../../icons\";\nimport { FixtureEditor } from \"../../FixtureEditor\";\nimport type { ChatModel } from \"../../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime-mode\";\nimport {\n SPEC_VERIFY_SCOPES,\n type AISpecRuntimeValue,\n type SpecVerifyScope,\n} from \"../SpecRuntimeEditor.model\";\nimport { NumberField, SpecField } from \"./fields\";\nimport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nimport { withVerify } from \"./update\";\n\nconst SCOPE_OPTIONS: Array<{ id: SpecVerifyScope; label: string }> =\n SPEC_VERIFY_SCOPES.map((scope) => ({\n id: scope,\n label: scope === \"all\" ? \"All files\" : \"Changed files\",\n }));\n\nexport function VerifySection({\n value,\n onChange,\n models,\n families,\n secretSelector,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n}) {\n return (\n <div className=\"grid gap-density-3\">\n <SpecField label=\"Verify fixture\">\n <FixtureEditor\n value={value.workflow?.verify?.fixture ?? \"\"}\n onChange={(fixture) => onChange(withVerify(value, { fixture }))}\n size=\"sm\"\n placeholder=\"Write the verify fixture markdown...\"\n frontmatterEditor={{\n mode: \"verification\",\n models,\n families,\n secretSelector,\n }}\n />\n </SpecField>\n <div className=\"flex flex-wrap items-end gap-density-3\">\n <SpecField label=\"Scope\">\n <SegmentedControl\n aria-label=\"Verification scope\"\n size=\"sm\"\n value={(value.workflow?.verify?.scope || \"all\") as SpecVerifyScope}\n onChange={(scope) => onChange(withVerify(value, { scope }))}\n options={SCOPE_OPTIONS}\n />\n </SpecField>\n <div className=\"w-32\">\n <NumberField\n label=\"Max iterations\"\n value={value.workflow?.verify?.maxIterations}\n onChange={(maxIterations) =>\n onChange(withVerify(value, { maxIterations: maxIterations ?? 0 }))\n }\n icon={UiRepeat}\n min={0}\n step={1}\n integer\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAcA,MAAM,gBACJ,mBAAmB,IAAI,CAAC,WAAW;AAAA,EACjC,IAAI;AAAA,EACJ,OAAO,UAAU,QAAQ,cAAc;AACzC,EAAE;AAEG,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA,oBAAC,WAAA,EAAU,OAAM,kBACf,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,YAAW;AAAA,QAC1C,UAAU,CAAC,YAAY,SAAS,WAAW,OAAO,EAAE,QAAA,CAAS,CAAC;AAAA,QAC9D,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GAEJ;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,oBAAC,WAAA,EAAU,OAAM,SACf,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,MAAK;AAAA,UACL,SAAQ,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,UAAS;AAAA,UACzC,UAAU,CAAC,UAAU,SAAS,WAAW,OAAO,EAAE,MAAA,CAAO,CAAC;AAAA,UAC1D,SAAS;AAAA,QAAA;AAAA,MAAA,GAEb;AAAA,MACA,oBAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB;AAAA,UAC/B,UAAU,CAAC,kBACT,SAAS,WAAW,OAAO,EAAE,eAAe,iBAAiB,EAAA,CAAG,CAAC;AAAA,UAEnE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAO;AAAA,QAAA;AAAA,MAAA,EACT,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"VerifySection.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/VerifySection.tsx"],"sourcesContent":["import { SegmentedControl } from \"../../../components/SegmentedControl\";\nimport { UiRepeat } from \"../../../icons\";\nimport { FixtureEditor } from \"../../FixtureEditor\";\nimport type { ChatModel } from \"../../chat/types\";\nimport type { SpecRuntimeFamily } from \"../../runtime/runtime-mode\";\nimport {\n SPEC_VERIFY_SCOPES,\n type AISpecRuntimeValue,\n type SpecVerifyScope,\n} from \"../SpecRuntimeEditor.model\";\nimport { NumberField, SpecField } from \"./fields\";\nimport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nimport { withVerify } from \"./update\";\n\nconst SCOPE_OPTIONS: Array<{ id: SpecVerifyScope; label: string }> =\n SPEC_VERIFY_SCOPES.map((scope) => ({\n id: scope,\n label: scope === \"all\" ? \"All files\" : \"Changed files\",\n }));\n\nexport function VerifySection({\n value,\n onChange,\n models,\n families,\n secretSelector,\n}: {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n}) {\n return (\n <div className=\"grid gap-density-3\">\n <SpecField label=\"Verify fixture\">\n <FixtureEditor\n value={value.workflow?.verify?.fixture ?? \"\"}\n onChange={(fixture) => onChange(withVerify(value, { fixture }))}\n size=\"sm\"\n placeholder=\"Write the verify fixture markdown...\"\n frontmatterEditor={{\n mode: \"verification\",\n models,\n families,\n secretSelector,\n }}\n />\n </SpecField>\n <div className=\"flex flex-wrap items-end gap-density-3\">\n <SpecField label=\"Scope\">\n <SegmentedControl\n aria-label=\"Verification scope\"\n size=\"sm\"\n value={(value.workflow?.verify?.scope || \"all\") as SpecVerifyScope}\n onChange={(scope) => onChange(withVerify(value, { scope }))}\n options={SCOPE_OPTIONS}\n />\n </SpecField>\n <div className=\"w-32\">\n <NumberField\n label=\"Max iterations\"\n value={value.workflow?.verify?.maxIterations}\n onChange={(maxIterations) =>\n onChange(withVerify(value, { maxIterations: maxIterations ?? 0 }))\n }\n icon={UiRepeat}\n min={0}\n step={1}\n integer\n />\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAcA,MAAM,gBACJ,mBAAmB,IAAI,CAAC,WAAW;AAAA,EACjC,IAAI;AAAA,EACJ,OAAO,UAAU,QAAQ,cAAc;AACzC,EAAE;AAEG,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA,oBAAC,WAAA,EAAU,OAAM,kBACf,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,YAAW;AAAA,QAC1C,UAAU,CAAC,YAAY,SAAS,WAAW,OAAO,EAAE,QAAA,CAAS,CAAC;AAAA,QAC9D,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GAEJ;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAA,oBAAC,WAAA,EAAU,OAAM,SACf,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,MAAK;AAAA,UACL,SAAQ,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB,UAAS;AAAA,UACzC,UAAU,CAAC,UAAU,SAAS,WAAW,OAAO,EAAE,MAAA,CAAO,CAAC;AAAA,UAC1D,SAAS;AAAA,QAAA;AAAA,MAAA,GAEb;AAAA,MACA,oBAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,QAAO,iBAAM,aAAN,mBAAgB,WAAhB,mBAAwB;AAAA,UAC/B,UAAU,CAAC,kBACT,SAAS,WAAW,OAAO,EAAE,eAAe,iBAAiB,EAAA,CAAG,CAAC;AAAA,UAEnE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,UACN,SAAO;AAAA,QAAA;AAAA,MAAA,EACT,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, type ReactNode } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type {\n AISpecRuntimePermissionCatalog,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { CLIArgsSection, type SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nimport { CommitSection } from \"./CommitSection\";\nimport { EnvironmentAdvanced, EnvironmentSection } from \"./EnvironmentSection\";\nimport { Footer } from \"./Footer\";\nimport { ModelAdvanced, ModelSection } from \"./ModelSection\";\nimport { PermissionsAdvanced, PermissionsSection } from \"./PermissionsSection\";\nimport { PromptAdvanced, PromptSection } from \"./PromptSection\";\nimport { Rail } from \"./Rail\";\nimport { SectionCard } from \"./SectionCard\";\nimport { VerifySection } from \"./VerifySection\";\nimport { WorkspaceSection } from \"./WorkspaceSection\";\nimport {\n buildPermissionCatalog,\n specPermissionEntries,\n withAddedPermission,\n withPermissionEntries,\n} from \"./permissions-model\";\nimport { summarizeTarget } from \"./summaries\";\nimport {\n SPEC_RUNTIME_SECTIONS,\n sectionNumber,\n type SpecRuntimeSecretSelectorConfig,\n type SpecSectionId,\n} from \"./types\";\nimport type { SpecRuntimeFamily } from \"../runtime-mode\";\nimport { useScrollSpy } from \"./use-scrollspy\";\n\nexport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nexport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nexport type { SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nexport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"../runtime-mode\";\n\nexport type SpecRuntimeEditorProps = {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n /** Provider families for the two-axis Family → Mode picker in the model section. */\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n /** Schema for the backend's extra CLI args; enables the CLI flags section. */\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Optional section allow-list for embedded editors that only need part of the runtime spec. */\n sections?: readonly SpecSectionId[] | undefined;\n className?: string | undefined;\n title?: ReactNode | undefined;\n eyebrow?: ReactNode | undefined;\n /** Hide the editor rail when a host modal already supplies the context. */\n showHeader?: boolean | undefined;\n /** Content rendered before the first section inside the editor column. */\n beforeSections?: ReactNode | undefined;\n /** Sections that should start collapsed in embedded contexts. */\n defaultCollapsedSections?: readonly SpecSectionId[] | undefined;\n /** Renders the sticky footer's save action when set. */\n onSave?: (() => void) | undefined;\n /** Renders the sticky footer's cancel action when set. */\n onCancel?: (() => void) | undefined;\n saveLabel?: string | undefined;\n footerStatus?: ReactNode | undefined;\n};\n\nconst ADVANCED_HINTS: Partial<Record<SpecSectionId, string>> = {\n model: \"fallbacks, session, caching\",\n prompt: \"schema\",\n permissions: \"full permission tree\",\n environment: \"dotenv files\",\n};\n\n// Full-page runtime spec editor (design \"Runtime Spec Editor v2\"): a live\n// summary rail with scrollspy nav, preset quick-starts, and stacked numbered\n// sections. Container-responsive so it works embedded in a modal or standalone.\nexport function SpecRuntimeEditor({\n value,\n onChange,\n models = [],\n families,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sections: sectionFilter,\n className,\n title = \"Runtime Spec\",\n eyebrow = \"Agent configuration\",\n showHeader = true,\n beforeSections,\n defaultCollapsedSections,\n onSave,\n onCancel,\n saveLabel = \"Save & run\",\n footerStatus = \"Ready to run\",\n}: SpecRuntimeEditorProps) {\n const idPrefix = useId();\n const catalog = useMemo(\n () => buildPermissionCatalog(permissionCatalog, tools),\n [permissionCatalog, tools],\n );\n const entries = useMemo(\n () => specPermissionEntries(value, catalog),\n [value, catalog],\n );\n\n const allowedSections = useMemo(\n () => (sectionFilter ? new Set(sectionFilter) : undefined),\n [sectionFilter],\n );\n const sections = SPEC_RUNTIME_SECTIONS.filter(\n (section) =>\n (section.id !== \"cli\" || cliOptions) &&\n (allowedSections == null || allowedSections.has(section.id)),\n );\n const collapsedSections = useMemo(\n () => new Set(defaultCollapsedSections ?? []),\n [defaultCollapsedSections],\n );\n const domId = (id: SpecSectionId) => `${idPrefix}-${id}`;\n const { sectionRef } = useScrollSpy(\n sections.map((section) => domId(section.id)),\n );\n\n const applyEntries = (\n applied: Parameters<typeof withPermissionEntries>[1],\n mode: Parameters<typeof withPermissionEntries>[2],\n ) => onChange(withPermissionEntries(value, applied, mode));\n const addEntry = (\n domain: Parameters<typeof withAddedPermission>[1],\n id: string,\n ) => {\n const next = withAddedPermission(value, domain, id);\n if (next) onChange(next);\n };\n\n const sectionBody = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelSection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptSection value={value} onChange={onChange} />;\n case \"workspace\":\n return (\n <WorkspaceSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"permissions\":\n return (\n <PermissionsSection\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return (\n <EnvironmentSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"verify\":\n return (\n <VerifySection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n />\n );\n case \"commit\":\n return <CommitSection value={value} onChange={onChange} />;\n case \"cli\":\n return cliOptions ? (\n <CLIArgsSection\n value={value}\n onChange={onChange}\n cliOptions={cliOptions}\n />\n ) : null;\n }\n };\n\n const sectionAdvanced = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelAdvanced\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptAdvanced value={value} onChange={onChange} />;\n case \"permissions\":\n return (\n <PermissionsAdvanced\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return <EnvironmentAdvanced value={value} onChange={onChange} />;\n default:\n return undefined;\n }\n };\n\n return (\n <div className={cn(\"@container\", className)}>\n <div className=\"mx-auto max-w-[820px] px-density-4 py-density-4\">\n {showHeader && (\n <Rail\n eyebrow={eyebrow}\n title={title}\n target={summarizeTarget(value)}\n />\n )}\n {beforeSections}\n {sections.map((section) => (\n <SectionCard\n key={section.id}\n meta={section}\n number={sectionNumber(section.id)}\n domId={domId(section.id)}\n sectionRef={sectionRef(domId(section.id))}\n advanced={sectionAdvanced(section.id)}\n advancedHint={ADVANCED_HINTS[section.id]}\n defaultCollapsed={collapsedSections.has(section.id)}\n >\n {sectionBody(section.id)}\n </SectionCard>\n ))}\n </div>\n {(onSave || onCancel) && (\n <Footer\n status={footerStatus}\n saveLabel={saveLabel}\n onSave={onSave}\n onCancel={onCancel}\n />\n )}\n </div>\n );\n}\n"],"names":["useId","useMemo","buildPermissionCatalog","specPermissionEntries","SPEC_RUNTIME_SECTIONS","useScrollSpy","withPermissionEntries","withAddedPermission","jsx","ModelSection","PromptSection","WorkspaceSection","PermissionsSection","EnvironmentSection","VerifySection","CommitSection","CLIArgsSection","ModelAdvanced","PromptAdvanced","PermissionsAdvanced","EnvironmentAdvanced","cn","jsxs","Rail","summarizeTarget","SectionCard","sectionNumber","Footer"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, type ReactNode } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type {\n AISpecRuntimePermissionCatalog,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { CLIArgsSection, type SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nimport { CommitSection } from \"./CommitSection\";\nimport { EnvironmentAdvanced, EnvironmentSection } from \"./EnvironmentSection\";\nimport { Footer } from \"./Footer\";\nimport { ModelAdvanced, ModelSection } from \"./ModelSection\";\nimport { PermissionsAdvanced, PermissionsSection } from \"./PermissionsSection\";\nimport { PromptAdvanced, PromptSection } from \"./PromptSection\";\nimport { Rail } from \"./Rail\";\nimport { SectionCard } from \"./SectionCard\";\nimport { VerifySection } from \"./VerifySection\";\nimport { WorkspaceSection } from \"./WorkspaceSection\";\nimport {\n buildPermissionCatalog,\n specPermissionEntries,\n withAddedPermission,\n withPermissionEntries,\n} from \"./permissions-model\";\nimport { summarizeTarget } from \"./summaries\";\nimport {\n SPEC_RUNTIME_SECTIONS,\n sectionNumber,\n type SpecRuntimeSecretSelectorConfig,\n type SpecSectionId,\n} from \"./types\";\nimport type { SpecRuntimeFamily } from \"../../runtime/runtime-mode\";\nimport { useScrollSpy } from \"./use-scrollspy\";\n\nexport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nexport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nexport type { SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nexport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"../../runtime/runtime-mode\";\n\nexport type SpecRuntimeEditorProps = {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n /** Provider families for the two-axis Family → Mode picker in the model section. */\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n /** Schema for the backend's extra CLI args; enables the CLI flags section. */\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Optional section allow-list for embedded editors that only need part of the runtime spec. */\n sections?: readonly SpecSectionId[] | undefined;\n className?: string | undefined;\n title?: ReactNode | undefined;\n eyebrow?: ReactNode | undefined;\n /** Hide the editor rail when a host modal already supplies the context. */\n showHeader?: boolean | undefined;\n /** Content rendered before the first section inside the editor column. */\n beforeSections?: ReactNode | undefined;\n /** Sections that should start collapsed in embedded contexts. */\n defaultCollapsedSections?: readonly SpecSectionId[] | undefined;\n /** Renders the sticky footer's save action when set. */\n onSave?: (() => void) | undefined;\n /** Renders the sticky footer's cancel action when set. */\n onCancel?: (() => void) | undefined;\n saveLabel?: string | undefined;\n footerStatus?: ReactNode | undefined;\n};\n\nconst ADVANCED_HINTS: Partial<Record<SpecSectionId, string>> = {\n model: \"fallbacks, session, caching\",\n prompt: \"schema\",\n permissions: \"full permission tree\",\n environment: \"dotenv files\",\n};\n\n// Full-page runtime spec editor (design \"Runtime Spec Editor v2\"): a live\n// summary rail with scrollspy nav, preset quick-starts, and stacked numbered\n// sections. Container-responsive so it works embedded in a modal or standalone.\nexport function SpecRuntimeEditor({\n value,\n onChange,\n models = [],\n families,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sections: sectionFilter,\n className,\n title = \"Runtime Spec\",\n eyebrow = \"Agent configuration\",\n showHeader = true,\n beforeSections,\n defaultCollapsedSections,\n onSave,\n onCancel,\n saveLabel = \"Save & run\",\n footerStatus = \"Ready to run\",\n}: SpecRuntimeEditorProps) {\n const idPrefix = useId();\n const catalog = useMemo(\n () => buildPermissionCatalog(permissionCatalog, tools),\n [permissionCatalog, tools],\n );\n const entries = useMemo(\n () => specPermissionEntries(value, catalog),\n [value, catalog],\n );\n\n const allowedSections = useMemo(\n () => (sectionFilter ? new Set(sectionFilter) : undefined),\n [sectionFilter],\n );\n const sections = SPEC_RUNTIME_SECTIONS.filter(\n (section) =>\n (section.id !== \"cli\" || cliOptions) &&\n (allowedSections == null || allowedSections.has(section.id)),\n );\n const collapsedSections = useMemo(\n () => new Set(defaultCollapsedSections ?? []),\n [defaultCollapsedSections],\n );\n const domId = (id: SpecSectionId) => `${idPrefix}-${id}`;\n const { sectionRef } = useScrollSpy(\n sections.map((section) => domId(section.id)),\n );\n\n const applyEntries = (\n applied: Parameters<typeof withPermissionEntries>[1],\n mode: Parameters<typeof withPermissionEntries>[2],\n ) => onChange(withPermissionEntries(value, applied, mode));\n const addEntry = (\n domain: Parameters<typeof withAddedPermission>[1],\n id: string,\n ) => {\n const next = withAddedPermission(value, domain, id);\n if (next) onChange(next);\n };\n\n const sectionBody = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelSection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptSection value={value} onChange={onChange} />;\n case \"workspace\":\n return (\n <WorkspaceSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"permissions\":\n return (\n <PermissionsSection\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return (\n <EnvironmentSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"verify\":\n return (\n <VerifySection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n />\n );\n case \"commit\":\n return <CommitSection value={value} onChange={onChange} />;\n case \"cli\":\n return cliOptions ? (\n <CLIArgsSection\n value={value}\n onChange={onChange}\n cliOptions={cliOptions}\n />\n ) : null;\n }\n };\n\n const sectionAdvanced = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelAdvanced\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptAdvanced value={value} onChange={onChange} />;\n case \"permissions\":\n return (\n <PermissionsAdvanced\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return <EnvironmentAdvanced value={value} onChange={onChange} />;\n default:\n return undefined;\n }\n };\n\n return (\n <div className={cn(\"@container\", className)}>\n <div className=\"mx-auto max-w-[820px] px-density-4 py-density-4\">\n {showHeader && (\n <Rail\n eyebrow={eyebrow}\n title={title}\n target={summarizeTarget(value)}\n />\n )}\n {beforeSections}\n {sections.map((section) => (\n <SectionCard\n key={section.id}\n meta={section}\n number={sectionNumber(section.id)}\n domId={domId(section.id)}\n sectionRef={sectionRef(domId(section.id))}\n advanced={sectionAdvanced(section.id)}\n advancedHint={ADVANCED_HINTS[section.id]}\n defaultCollapsed={collapsedSections.has(section.id)}\n >\n {sectionBody(section.id)}\n </SectionCard>\n ))}\n </div>\n {(onSave || onCancel) && (\n <Footer\n status={footerStatus}\n saveLabel={saveLabel}\n onSave={onSave}\n onCancel={onCancel}\n />\n )}\n </div>\n );\n}\n"],"names":["useId","useMemo","buildPermissionCatalog","specPermissionEntries","SPEC_RUNTIME_SECTIONS","useScrollSpy","withPermissionEntries","withAddedPermission","jsx","ModelSection","PromptSection","WorkspaceSection","PermissionsSection","EnvironmentSection","VerifySection","CommitSection","CLIArgsSection","ModelAdvanced","PromptAdvanced","PermissionsAdvanced","EnvironmentAdvanced","cn","jsxs","Rail","summarizeTarget","SectionCard","sectionNumber","Footer"],"mappings":"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"}
@@ -3,11 +3,11 @@ import { ChatModel, ToolMeta } from '../../chat/types';
3
3
  import { AISpecRuntimePermissionCatalog, AISpecRuntimeValue } from '../SpecRuntimeEditor.model';
4
4
  import { SpecRuntimeCLIOptions } from './CLIArgsSection';
5
5
  import { SpecRuntimeSecretSelectorConfig, SpecSectionId } from './types';
6
- import { SpecRuntimeFamily } from '../runtime-mode';
6
+ import { SpecRuntimeFamily } from '../../runtime/runtime-mode';
7
7
  export type { AISpecRuntimeValue } from '../SpecRuntimeEditor.model';
8
8
  export type { SpecRuntimeSecretSelectorConfig } from './types';
9
9
  export type { SpecRuntimeCLIOptions } from './CLIArgsSection';
10
- export { SPEC_RUNTIME_FAMILIES, type SpecRuntimeFamily, type SpecRuntimeModeOption, } from '../runtime-mode';
10
+ export { SPEC_RUNTIME_FAMILIES, type SpecRuntimeFamily, type SpecRuntimeModeOption, } from '../../runtime/runtime-mode';
11
11
  export type SpecRuntimeEditorProps = {
12
12
  value: AISpecRuntimeValue;
13
13
  onChange: (value: AISpecRuntimeValue) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACV,8BAA8B,EAC9B,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAkB9E,OAAO,EAGL,KAAK,+BAA+B,EACpC,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC/B,iBAAiB,CAAC,EAAE,8BAA8B,GAAG,SAAS,CAAC;IAC/D,cAAc,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;IAC7D,8EAA8E;IAC9E,UAAU,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC/C,gGAAgG;IAChG,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACvC,iEAAiE;IACjE,wBAAwB,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;IAChE,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACtC,CAAC;AAYF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,EACR,MAAW,EACX,QAAQ,EACR,KAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,QAAQ,EAAE,aAAa,EACvB,SAAS,EACT,KAAsB,EACtB,OAA+B,EAC/B,UAAiB,EACjB,cAAc,EACd,wBAAwB,EACxB,MAAM,EACN,QAAQ,EACR,SAAwB,EACxB,YAA6B,GAC9B,EAAE,sBAAsB,2CAyKxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACV,8BAA8B,EAC9B,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAkB9E,OAAO,EAGL,KAAK,+BAA+B,EACpC,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC/B,iBAAiB,CAAC,EAAE,8BAA8B,GAAG,SAAS,CAAC;IAC/D,cAAc,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;IAC7D,8EAA8E;IAC9E,UAAU,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC/C,gGAAgG;IAChG,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACvC,iEAAiE;IACjE,wBAAwB,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;IAChE,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACtC,CAAC;AAYF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,EACR,MAAW,EACX,QAAQ,EACR,KAAU,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,QAAQ,EAAE,aAAa,EACvB,SAAS,EACT,KAAsB,EACtB,OAA+B,EAC/B,UAAiB,EACjB,cAAc,EACd,wBAAwB,EACxB,MAAM,EACN,QAAQ,EACR,SAAwB,EACxB,YAA6B,GAC9B,EAAE,sBAAsB,2CAyKxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, type ReactNode } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type {\n AISpecRuntimePermissionCatalog,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { CLIArgsSection, type SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nimport { CommitSection } from \"./CommitSection\";\nimport { EnvironmentAdvanced, EnvironmentSection } from \"./EnvironmentSection\";\nimport { Footer } from \"./Footer\";\nimport { ModelAdvanced, ModelSection } from \"./ModelSection\";\nimport { PermissionsAdvanced, PermissionsSection } from \"./PermissionsSection\";\nimport { PromptAdvanced, PromptSection } from \"./PromptSection\";\nimport { Rail } from \"./Rail\";\nimport { SectionCard } from \"./SectionCard\";\nimport { VerifySection } from \"./VerifySection\";\nimport { WorkspaceSection } from \"./WorkspaceSection\";\nimport {\n buildPermissionCatalog,\n specPermissionEntries,\n withAddedPermission,\n withPermissionEntries,\n} from \"./permissions-model\";\nimport { summarizeTarget } from \"./summaries\";\nimport {\n SPEC_RUNTIME_SECTIONS,\n sectionNumber,\n type SpecRuntimeSecretSelectorConfig,\n type SpecSectionId,\n} from \"./types\";\nimport type { SpecRuntimeFamily } from \"../runtime-mode\";\nimport { useScrollSpy } from \"./use-scrollspy\";\n\nexport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nexport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nexport type { SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nexport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"../runtime-mode\";\n\nexport type SpecRuntimeEditorProps = {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n /** Provider families for the two-axis Family → Mode picker in the model section. */\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n /** Schema for the backend's extra CLI args; enables the CLI flags section. */\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Optional section allow-list for embedded editors that only need part of the runtime spec. */\n sections?: readonly SpecSectionId[] | undefined;\n className?: string | undefined;\n title?: ReactNode | undefined;\n eyebrow?: ReactNode | undefined;\n /** Hide the editor rail when a host modal already supplies the context. */\n showHeader?: boolean | undefined;\n /** Content rendered before the first section inside the editor column. */\n beforeSections?: ReactNode | undefined;\n /** Sections that should start collapsed in embedded contexts. */\n defaultCollapsedSections?: readonly SpecSectionId[] | undefined;\n /** Renders the sticky footer's save action when set. */\n onSave?: (() => void) | undefined;\n /** Renders the sticky footer's cancel action when set. */\n onCancel?: (() => void) | undefined;\n saveLabel?: string | undefined;\n footerStatus?: ReactNode | undefined;\n};\n\nconst ADVANCED_HINTS: Partial<Record<SpecSectionId, string>> = {\n model: \"fallbacks, session, caching\",\n prompt: \"schema\",\n permissions: \"full permission tree\",\n environment: \"dotenv files\",\n};\n\n// Full-page runtime spec editor (design \"Runtime Spec Editor v2\"): a live\n// summary rail with scrollspy nav, preset quick-starts, and stacked numbered\n// sections. Container-responsive so it works embedded in a modal or standalone.\nexport function SpecRuntimeEditor({\n value,\n onChange,\n models = [],\n families,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sections: sectionFilter,\n className,\n title = \"Runtime Spec\",\n eyebrow = \"Agent configuration\",\n showHeader = true,\n beforeSections,\n defaultCollapsedSections,\n onSave,\n onCancel,\n saveLabel = \"Save & run\",\n footerStatus = \"Ready to run\",\n}: SpecRuntimeEditorProps) {\n const idPrefix = useId();\n const catalog = useMemo(\n () => buildPermissionCatalog(permissionCatalog, tools),\n [permissionCatalog, tools],\n );\n const entries = useMemo(\n () => specPermissionEntries(value, catalog),\n [value, catalog],\n );\n\n const allowedSections = useMemo(\n () => (sectionFilter ? new Set(sectionFilter) : undefined),\n [sectionFilter],\n );\n const sections = SPEC_RUNTIME_SECTIONS.filter(\n (section) =>\n (section.id !== \"cli\" || cliOptions) &&\n (allowedSections == null || allowedSections.has(section.id)),\n );\n const collapsedSections = useMemo(\n () => new Set(defaultCollapsedSections ?? []),\n [defaultCollapsedSections],\n );\n const domId = (id: SpecSectionId) => `${idPrefix}-${id}`;\n const { sectionRef } = useScrollSpy(\n sections.map((section) => domId(section.id)),\n );\n\n const applyEntries = (\n applied: Parameters<typeof withPermissionEntries>[1],\n mode: Parameters<typeof withPermissionEntries>[2],\n ) => onChange(withPermissionEntries(value, applied, mode));\n const addEntry = (\n domain: Parameters<typeof withAddedPermission>[1],\n id: string,\n ) => {\n const next = withAddedPermission(value, domain, id);\n if (next) onChange(next);\n };\n\n const sectionBody = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelSection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptSection value={value} onChange={onChange} />;\n case \"workspace\":\n return (\n <WorkspaceSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"permissions\":\n return (\n <PermissionsSection\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return (\n <EnvironmentSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"verify\":\n return (\n <VerifySection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n />\n );\n case \"commit\":\n return <CommitSection value={value} onChange={onChange} />;\n case \"cli\":\n return cliOptions ? (\n <CLIArgsSection\n value={value}\n onChange={onChange}\n cliOptions={cliOptions}\n />\n ) : null;\n }\n };\n\n const sectionAdvanced = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelAdvanced\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptAdvanced value={value} onChange={onChange} />;\n case \"permissions\":\n return (\n <PermissionsAdvanced\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return <EnvironmentAdvanced value={value} onChange={onChange} />;\n default:\n return undefined;\n }\n };\n\n return (\n <div className={cn(\"@container\", className)}>\n <div className=\"mx-auto max-w-[820px] px-density-4 py-density-4\">\n {showHeader && (\n <Rail\n eyebrow={eyebrow}\n title={title}\n target={summarizeTarget(value)}\n />\n )}\n {beforeSections}\n {sections.map((section) => (\n <SectionCard\n key={section.id}\n meta={section}\n number={sectionNumber(section.id)}\n domId={domId(section.id)}\n sectionRef={sectionRef(domId(section.id))}\n advanced={sectionAdvanced(section.id)}\n advancedHint={ADVANCED_HINTS[section.id]}\n defaultCollapsed={collapsedSections.has(section.id)}\n >\n {sectionBody(section.id)}\n </SectionCard>\n ))}\n </div>\n {(onSave || onCancel) && (\n <Footer\n status={footerStatus}\n saveLabel={saveLabel}\n onSave={onSave}\n onCancel={onCancel}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data/ai/SpecRuntimeEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, type ReactNode } from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type {\n AISpecRuntimePermissionCatalog,\n AISpecRuntimeValue,\n} from \"../SpecRuntimeEditor.model\";\nimport { CLIArgsSection, type SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nimport { CommitSection } from \"./CommitSection\";\nimport { EnvironmentAdvanced, EnvironmentSection } from \"./EnvironmentSection\";\nimport { Footer } from \"./Footer\";\nimport { ModelAdvanced, ModelSection } from \"./ModelSection\";\nimport { PermissionsAdvanced, PermissionsSection } from \"./PermissionsSection\";\nimport { PromptAdvanced, PromptSection } from \"./PromptSection\";\nimport { Rail } from \"./Rail\";\nimport { SectionCard } from \"./SectionCard\";\nimport { VerifySection } from \"./VerifySection\";\nimport { WorkspaceSection } from \"./WorkspaceSection\";\nimport {\n buildPermissionCatalog,\n specPermissionEntries,\n withAddedPermission,\n withPermissionEntries,\n} from \"./permissions-model\";\nimport { summarizeTarget } from \"./summaries\";\nimport {\n SPEC_RUNTIME_SECTIONS,\n sectionNumber,\n type SpecRuntimeSecretSelectorConfig,\n type SpecSectionId,\n} from \"./types\";\nimport type { SpecRuntimeFamily } from \"../../runtime/runtime-mode\";\nimport { useScrollSpy } from \"./use-scrollspy\";\n\nexport type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\nexport type { SpecRuntimeSecretSelectorConfig } from \"./types\";\nexport type { SpecRuntimeCLIOptions } from \"./CLIArgsSection\";\nexport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"../../runtime/runtime-mode\";\n\nexport type SpecRuntimeEditorProps = {\n value: AISpecRuntimeValue;\n onChange: (value: AISpecRuntimeValue) => void;\n models?: ChatModel[] | undefined;\n /** Provider families for the two-axis Family → Mode picker in the model section. */\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n /** Schema for the backend's extra CLI args; enables the CLI flags section. */\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Optional section allow-list for embedded editors that only need part of the runtime spec. */\n sections?: readonly SpecSectionId[] | undefined;\n className?: string | undefined;\n title?: ReactNode | undefined;\n eyebrow?: ReactNode | undefined;\n /** Hide the editor rail when a host modal already supplies the context. */\n showHeader?: boolean | undefined;\n /** Content rendered before the first section inside the editor column. */\n beforeSections?: ReactNode | undefined;\n /** Sections that should start collapsed in embedded contexts. */\n defaultCollapsedSections?: readonly SpecSectionId[] | undefined;\n /** Renders the sticky footer's save action when set. */\n onSave?: (() => void) | undefined;\n /** Renders the sticky footer's cancel action when set. */\n onCancel?: (() => void) | undefined;\n saveLabel?: string | undefined;\n footerStatus?: ReactNode | undefined;\n};\n\nconst ADVANCED_HINTS: Partial<Record<SpecSectionId, string>> = {\n model: \"fallbacks, session, caching\",\n prompt: \"schema\",\n permissions: \"full permission tree\",\n environment: \"dotenv files\",\n};\n\n// Full-page runtime spec editor (design \"Runtime Spec Editor v2\"): a live\n// summary rail with scrollspy nav, preset quick-starts, and stacked numbered\n// sections. Container-responsive so it works embedded in a modal or standalone.\nexport function SpecRuntimeEditor({\n value,\n onChange,\n models = [],\n families,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sections: sectionFilter,\n className,\n title = \"Runtime Spec\",\n eyebrow = \"Agent configuration\",\n showHeader = true,\n beforeSections,\n defaultCollapsedSections,\n onSave,\n onCancel,\n saveLabel = \"Save & run\",\n footerStatus = \"Ready to run\",\n}: SpecRuntimeEditorProps) {\n const idPrefix = useId();\n const catalog = useMemo(\n () => buildPermissionCatalog(permissionCatalog, tools),\n [permissionCatalog, tools],\n );\n const entries = useMemo(\n () => specPermissionEntries(value, catalog),\n [value, catalog],\n );\n\n const allowedSections = useMemo(\n () => (sectionFilter ? new Set(sectionFilter) : undefined),\n [sectionFilter],\n );\n const sections = SPEC_RUNTIME_SECTIONS.filter(\n (section) =>\n (section.id !== \"cli\" || cliOptions) &&\n (allowedSections == null || allowedSections.has(section.id)),\n );\n const collapsedSections = useMemo(\n () => new Set(defaultCollapsedSections ?? []),\n [defaultCollapsedSections],\n );\n const domId = (id: SpecSectionId) => `${idPrefix}-${id}`;\n const { sectionRef } = useScrollSpy(\n sections.map((section) => domId(section.id)),\n );\n\n const applyEntries = (\n applied: Parameters<typeof withPermissionEntries>[1],\n mode: Parameters<typeof withPermissionEntries>[2],\n ) => onChange(withPermissionEntries(value, applied, mode));\n const addEntry = (\n domain: Parameters<typeof withAddedPermission>[1],\n id: string,\n ) => {\n const next = withAddedPermission(value, domain, id);\n if (next) onChange(next);\n };\n\n const sectionBody = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelSection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptSection value={value} onChange={onChange} />;\n case \"workspace\":\n return (\n <WorkspaceSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"permissions\":\n return (\n <PermissionsSection\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return (\n <EnvironmentSection\n value={value}\n onChange={onChange}\n secretSelector={secretSelector}\n />\n );\n case \"verify\":\n return (\n <VerifySection\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n />\n );\n case \"commit\":\n return <CommitSection value={value} onChange={onChange} />;\n case \"cli\":\n return cliOptions ? (\n <CLIArgsSection\n value={value}\n onChange={onChange}\n cliOptions={cliOptions}\n />\n ) : null;\n }\n };\n\n const sectionAdvanced = (id: SpecSectionId): ReactNode => {\n switch (id) {\n case \"model\":\n return (\n <ModelAdvanced\n value={value}\n onChange={onChange}\n models={models}\n {...(families ? { families } : {})}\n />\n );\n case \"prompt\":\n return <PromptAdvanced value={value} onChange={onChange} />;\n case \"permissions\":\n return (\n <PermissionsAdvanced\n value={value}\n onChange={onChange}\n entries={entries}\n onApplyEntries={applyEntries}\n onAddEntry={addEntry}\n />\n );\n case \"environment\":\n return <EnvironmentAdvanced value={value} onChange={onChange} />;\n default:\n return undefined;\n }\n };\n\n return (\n <div className={cn(\"@container\", className)}>\n <div className=\"mx-auto max-w-[820px] px-density-4 py-density-4\">\n {showHeader && (\n <Rail\n eyebrow={eyebrow}\n title={title}\n target={summarizeTarget(value)}\n />\n )}\n {beforeSections}\n {sections.map((section) => (\n <SectionCard\n key={section.id}\n meta={section}\n number={sectionNumber(section.id)}\n domId={domId(section.id)}\n sectionRef={sectionRef(domId(section.id))}\n advanced={sectionAdvanced(section.id)}\n advancedHint={ADVANCED_HINTS[section.id]}\n defaultCollapsed={collapsedSections.has(section.id)}\n >\n {sectionBody(section.id)}\n </SectionCard>\n ))}\n </div>\n {(onSave || onCancel) && (\n <Footer\n status={footerStatus}\n saveLabel={saveLabel}\n onSave={onSave}\n onCancel={onCancel}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -7,19 +7,23 @@ const DropdownMenu = require("../../overlay/DropdownMenu.cjs");
7
7
  const Icon = require("../Icon.cjs");
8
8
  const UiAdd = require("../../icons/components/UiAdd.cjs");
9
9
  const UiComment = require("../../icons/components/UiComment.cjs");
10
+ const UiPencilSimpleLine = require("../../icons/components/UiPencilSimpleLine.cjs");
10
11
  const UiTrash = require("../../icons/components/UiTrash.cjs");
11
12
  const UiChevronDown = require("../../icons/components/UiChevronDown.cjs");
12
13
  function ThreadPicker({
13
14
  threadId,
14
15
  onSelect,
15
16
  onNew,
16
- api = "/api/chat/threads",
17
+ api = "/api/chat/sessions",
17
18
  source,
18
19
  query,
20
+ refreshToken,
19
21
  className = ""
20
22
  }) {
21
23
  const [threads, setThreads] = react.useState([]);
22
24
  const [loading, setLoading] = react.useState(false);
25
+ const [renaming, setRenaming] = react.useState();
26
+ const canRename = source ? Boolean(source.rename) : Boolean(api);
23
27
  const listUrl = query ? `${api}?${query}` : api;
24
28
  const fetchThreads = react.useCallback(async () => {
25
29
  setLoading(true);
@@ -38,7 +42,36 @@ function ThreadPicker({
38
42
  }, [source, listUrl]);
39
43
  react.useEffect(() => {
40
44
  void fetchThreads();
41
- }, [fetchThreads]);
45
+ }, [fetchThreads, refreshToken]);
46
+ const commitRename = react.useCallback(async () => {
47
+ var _a, _b;
48
+ if (!renaming) return;
49
+ const { id, title } = renaming;
50
+ setRenaming(void 0);
51
+ const trimmed = title.trim();
52
+ const previous = ((_a = threads.find((t) => t.id === id)) == null ? void 0 : _a.title) ?? null;
53
+ if (!trimmed || trimmed === previous) return;
54
+ setThreads(
55
+ (prev) => prev.map((t) => t.id === id ? { ...t, title: trimmed } : t)
56
+ );
57
+ try {
58
+ if (source) {
59
+ await ((_b = source.rename) == null ? void 0 : _b.call(source, id, trimmed));
60
+ } else {
61
+ const res = await fetch(`${api}/${id}`, {
62
+ method: "PATCH",
63
+ headers: { "Content-Type": "application/json" },
64
+ body: JSON.stringify({ title: trimmed })
65
+ });
66
+ if (!res.ok) throw new Error(`rename failed with status ${res.status}`);
67
+ }
68
+ } catch (err) {
69
+ console.warn("clicky-ui: failed to rename thread", err);
70
+ setThreads(
71
+ (prev) => prev.map((t) => t.id === id ? { ...t, title: previous } : t)
72
+ );
73
+ }
74
+ }, [api, renaming, source, threads]);
42
75
  const handleDelete = react.useCallback(
43
76
  async (id, e) => {
44
77
  var _a;
@@ -121,11 +154,40 @@ function ThreadPicker({
121
154
  },
122
155
  children: [
123
156
  /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiComment.UiComment, className: "size-3 shrink-0" }),
124
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 truncate", children: t.title || "Untitled" }),
157
+ (renaming == null ? void 0 : renaming.id) === t.id ? /* @__PURE__ */ jsxRuntime.jsx(
158
+ "input",
159
+ {
160
+ autoFocus: true,
161
+ "aria-label": "Conversation title",
162
+ className: "flex-1 rounded border border-border bg-background px-1 py-0.5 text-xs",
163
+ value: renaming.title,
164
+ onClick: (e) => e.stopPropagation(),
165
+ onChange: (e) => setRenaming({ id: t.id, title: e.target.value }),
166
+ onBlur: () => setRenaming(void 0),
167
+ onKeyDown: (e) => {
168
+ e.stopPropagation();
169
+ if (e.key === "Enter") void commitRename();
170
+ if (e.key === "Escape") setRenaming(void 0);
171
+ }
172
+ }
173
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 truncate", children: t.title || "Untitled" }),
125
174
  t.totalCostUsd != null && t.totalCostUsd > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: [
126
175
  "$",
127
176
  t.totalCostUsd.toFixed(2)
128
177
  ] }),
178
+ canRename && (renaming == null ? void 0 : renaming.id) !== t.id && /* @__PURE__ */ jsxRuntime.jsx(
179
+ "button",
180
+ {
181
+ type: "button",
182
+ "aria-label": "Rename conversation",
183
+ className: "shrink-0 rounded p-0.5 text-muted-foreground opacity-0 hover:text-foreground group-hover/thread:opacity-100",
184
+ onClick: (e) => {
185
+ e.stopPropagation();
186
+ setRenaming({ id: t.id, title: t.title ?? "" });
187
+ },
188
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiPencilSimpleLine.UiPencilSimpleLine, className: "size-3" })
189
+ }
190
+ ),
129
191
  /* @__PURE__ */ jsxRuntime.jsx(
130
192
  "button",
131
193
  {