@flanksource/clicky-ui 0.3.26 → 0.3.28

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 (725) hide show
  1. package/NOTICE.md +14 -0
  2. package/dist/ai.cjs +52 -6
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +53 -7
  5. package/dist/ai.js.map +1 -1
  6. package/dist/comments/CommentCard.cjs +24 -39
  7. package/dist/comments/CommentCard.cjs.map +1 -1
  8. package/dist/comments/CommentCard.d.ts +9 -2
  9. package/dist/comments/CommentCard.d.ts.map +1 -1
  10. package/dist/comments/CommentCard.js +24 -39
  11. package/dist/comments/CommentCard.js.map +1 -1
  12. package/dist/comments/CommentProvider.cjs +4 -3
  13. package/dist/comments/CommentProvider.cjs.map +1 -1
  14. package/dist/comments/CommentProvider.d.ts +6 -1
  15. package/dist/comments/CommentProvider.d.ts.map +1 -1
  16. package/dist/comments/CommentProvider.js +4 -3
  17. package/dist/comments/CommentProvider.js.map +1 -1
  18. package/dist/comments/CommentSidePanel.cjs +65 -52
  19. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  20. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  21. package/dist/comments/CommentSidePanel.js +67 -54
  22. package/dist/comments/CommentSidePanel.js.map +1 -1
  23. package/dist/comments/CommentThread.cjs +2 -2
  24. package/dist/comments/CommentThread.cjs.map +1 -1
  25. package/dist/comments/CommentThread.d.ts +3 -3
  26. package/dist/comments/CommentThread.d.ts.map +1 -1
  27. package/dist/comments/CommentThread.js +2 -2
  28. package/dist/comments/CommentThread.js.map +1 -1
  29. package/dist/comments/CommentThreadList.cjs +85 -37
  30. package/dist/comments/CommentThreadList.cjs.map +1 -1
  31. package/dist/comments/CommentThreadList.d.ts +3 -3
  32. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  33. package/dist/comments/CommentThreadList.js +86 -38
  34. package/dist/comments/CommentThreadList.js.map +1 -1
  35. package/dist/comments/comment-utils.cjs +26 -0
  36. package/dist/comments/comment-utils.cjs.map +1 -1
  37. package/dist/comments/comment-utils.d.ts +11 -0
  38. package/dist/comments/comment-utils.d.ts.map +1 -1
  39. package/dist/comments/comment-utils.js +26 -0
  40. package/dist/comments/comment-utils.js.map +1 -1
  41. package/dist/comments.cjs +2 -0
  42. package/dist/comments.cjs.map +1 -1
  43. package/dist/comments.js +3 -1
  44. package/dist/components/AccordionList.cjs +3 -0
  45. package/dist/components/AccordionList.cjs.map +1 -1
  46. package/dist/components/AccordionList.d.ts +3 -1
  47. package/dist/components/AccordionList.d.ts.map +1 -1
  48. package/dist/components/AccordionList.js +3 -0
  49. package/dist/components/AccordionList.js.map +1 -1
  50. package/dist/components/CopyButton.cjs +35 -0
  51. package/dist/components/CopyButton.cjs.map +1 -0
  52. package/dist/components/CopyButton.d.ts +20 -0
  53. package/dist/components/CopyButton.d.ts.map +1 -0
  54. package/dist/components/CopyButton.js +35 -0
  55. package/dist/components/CopyButton.js.map +1 -0
  56. package/dist/components/FilterBar.cjs +29 -6
  57. package/dist/components/FilterBar.cjs.map +1 -1
  58. package/dist/components/FilterBar.d.ts +10 -1
  59. package/dist/components/FilterBar.d.ts.map +1 -1
  60. package/dist/components/FilterBar.js +29 -6
  61. package/dist/components/FilterBar.js.map +1 -1
  62. package/dist/components/ListMenu.cjs +4 -1
  63. package/dist/components/ListMenu.cjs.map +1 -1
  64. package/dist/components/ListMenu.d.ts +5 -1
  65. package/dist/components/ListMenu.d.ts.map +1 -1
  66. package/dist/components/ListMenu.js +4 -1
  67. package/dist/components/ListMenu.js.map +1 -1
  68. package/dist/components/SegmentedControl.cjs +4 -2
  69. package/dist/components/SegmentedControl.cjs.map +1 -1
  70. package/dist/components/SegmentedControl.d.ts +4 -0
  71. package/dist/components/SegmentedControl.d.ts.map +1 -1
  72. package/dist/components/SegmentedControl.js +4 -2
  73. package/dist/components/SegmentedControl.js.map +1 -1
  74. package/dist/components/clipboard.cjs +60 -0
  75. package/dist/components/clipboard.cjs.map +1 -0
  76. package/dist/components/clipboard.d.ts +13 -0
  77. package/dist/components/clipboard.d.ts.map +1 -0
  78. package/dist/components/clipboard.js +60 -0
  79. package/dist/components/clipboard.js.map +1 -0
  80. package/dist/components/json-schema-form-array.cjs +15 -1
  81. package/dist/components/json-schema-form-array.cjs.map +1 -1
  82. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  83. package/dist/components/json-schema-form-array.js +15 -1
  84. package/dist/components/json-schema-form-array.js.map +1 -1
  85. package/dist/components/json-schema-form-list-array.cjs +113 -0
  86. package/dist/components/json-schema-form-list-array.cjs.map +1 -0
  87. package/dist/components/json-schema-form-list-array.d.ts +7 -0
  88. package/dist/components/json-schema-form-list-array.d.ts.map +1 -0
  89. package/dist/components/json-schema-form-list-array.js +113 -0
  90. package/dist/components/json-schema-form-list-array.js.map +1 -0
  91. package/dist/components/json-schema-form-resolve.cjs +1 -1
  92. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  93. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  94. package/dist/components/json-schema-form-resolve.js +1 -1
  95. package/dist/components/json-schema-form-resolve.js.map +1 -1
  96. package/dist/components/json-schema-form-types.d.ts +1 -1
  97. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  98. package/dist/components.cjs +5 -0
  99. package/dist/components.cjs.map +1 -1
  100. package/dist/components.d.ts +2 -0
  101. package/dist/components.d.ts.map +1 -1
  102. package/dist/components.js +5 -0
  103. package/dist/components.js.map +1 -1
  104. package/dist/data/Clicky.cjs +4 -1
  105. package/dist/data/Clicky.cjs.map +1 -1
  106. package/dist/data/Clicky.js +4 -1
  107. package/dist/data/Clicky.js.map +1 -1
  108. package/dist/data/DataTable.cjs +202 -40
  109. package/dist/data/DataTable.cjs.map +1 -1
  110. package/dist/data/DataTable.d.ts +163 -3
  111. package/dist/data/DataTable.d.ts.map +1 -1
  112. package/dist/data/DataTable.js +202 -40
  113. package/dist/data/DataTable.js.map +1 -1
  114. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.cjs +1 -1
  115. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.cjs.map +1 -1
  116. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.js +1 -1
  117. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.js.map +1 -1
  118. package/dist/data/FixtureEditor/fixture-frontmatter.cjs +8 -6
  119. package/dist/data/FixtureEditor/fixture-frontmatter.cjs.map +1 -1
  120. package/dist/data/FixtureEditor/fixture-frontmatter.js +8 -6
  121. package/dist/data/FixtureEditor/fixture-frontmatter.js.map +1 -1
  122. package/dist/data/SelectionActionBar.cjs +242 -0
  123. package/dist/data/SelectionActionBar.cjs.map +1 -0
  124. package/dist/data/SelectionActionBar.d.ts +28 -0
  125. package/dist/data/SelectionActionBar.d.ts.map +1 -0
  126. package/dist/data/SelectionActionBar.js +242 -0
  127. package/dist/data/SelectionActionBar.js.map +1 -0
  128. package/dist/data/TaskManager.cjs +34 -12
  129. package/dist/data/TaskManager.cjs.map +1 -1
  130. package/dist/data/TaskManager.d.ts.map +1 -1
  131. package/dist/data/TaskManager.js +34 -12
  132. package/dist/data/TaskManager.js.map +1 -1
  133. package/dist/data/TaskManagerButton.cjs +11 -7
  134. package/dist/data/TaskManagerButton.cjs.map +1 -1
  135. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  136. package/dist/data/TaskManagerButton.js +11 -7
  137. package/dist/data/TaskManagerButton.js.map +1 -1
  138. package/dist/data/TaskProgress.cjs +55 -11
  139. package/dist/data/TaskProgress.cjs.map +1 -1
  140. package/dist/data/TaskProgress.d.ts.map +1 -1
  141. package/dist/data/TaskProgress.js +53 -9
  142. package/dist/data/TaskProgress.js.map +1 -1
  143. package/dist/data/ai/ChatWindow.cjs +2 -4
  144. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  145. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  146. package/dist/data/ai/ChatWindow.js +2 -4
  147. package/dist/data/ai/ChatWindow.js.map +1 -1
  148. package/dist/data/ai/ChatWindow.runtime.cjs +1 -2
  149. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  150. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  151. package/dist/data/ai/ChatWindow.runtime.js +1 -2
  152. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  153. package/dist/data/ai/PromptCatalog/PromptCatalogTable.cjs +262 -0
  154. package/dist/data/ai/PromptCatalog/PromptCatalogTable.cjs.map +1 -0
  155. package/dist/data/ai/PromptCatalog/PromptCatalogTable.d.ts +16 -0
  156. package/dist/data/ai/PromptCatalog/PromptCatalogTable.d.ts.map +1 -0
  157. package/dist/data/ai/PromptCatalog/PromptCatalogTable.js +262 -0
  158. package/dist/data/ai/PromptCatalog/PromptCatalogTable.js.map +1 -0
  159. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs +77 -0
  160. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -0
  161. package/dist/data/ai/PromptCatalog/PromptLayerStrip.d.ts +8 -0
  162. package/dist/data/ai/PromptCatalog/PromptLayerStrip.d.ts.map +1 -0
  163. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +77 -0
  164. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -0
  165. package/dist/data/ai/PromptCatalog/PromptPage.cjs +332 -0
  166. package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -0
  167. package/dist/data/ai/PromptCatalog/PromptPage.d.ts +17 -0
  168. package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -0
  169. package/dist/data/ai/PromptCatalog/PromptPage.js +332 -0
  170. package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -0
  171. package/dist/data/ai/PromptCatalog/PromptPageEditor.cjs +102 -0
  172. package/dist/data/ai/PromptCatalog/PromptPageEditor.cjs.map +1 -0
  173. package/dist/data/ai/PromptCatalog/PromptPageEditor.d.ts +16 -0
  174. package/dist/data/ai/PromptCatalog/PromptPageEditor.d.ts.map +1 -0
  175. package/dist/data/ai/PromptCatalog/PromptPageEditor.js +102 -0
  176. package/dist/data/ai/PromptCatalog/PromptPageEditor.js.map +1 -0
  177. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +102 -0
  178. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -0
  179. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +10 -0
  180. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -0
  181. package/dist/data/ai/PromptCatalog/PromptPageHeader.js +102 -0
  182. package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -0
  183. package/dist/data/ai/PromptCatalog/PromptPagePreview.cjs +90 -0
  184. package/dist/data/ai/PromptCatalog/PromptPagePreview.cjs.map +1 -0
  185. package/dist/data/ai/PromptCatalog/PromptPagePreview.d.ts +8 -0
  186. package/dist/data/ai/PromptCatalog/PromptPagePreview.d.ts.map +1 -0
  187. package/dist/data/ai/PromptCatalog/PromptPagePreview.js +90 -0
  188. package/dist/data/ai/PromptCatalog/PromptPagePreview.js.map +1 -0
  189. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +168 -0
  190. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -0
  191. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +17 -0
  192. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -0
  193. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +168 -0
  194. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -0
  195. package/dist/data/ai/PromptCatalog/PromptSourceBadge.cjs +36 -0
  196. package/dist/data/ai/PromptCatalog/PromptSourceBadge.cjs.map +1 -0
  197. package/dist/data/ai/PromptCatalog/PromptSourceBadge.d.ts +7 -0
  198. package/dist/data/ai/PromptCatalog/PromptSourceBadge.d.ts.map +1 -0
  199. package/dist/data/ai/PromptCatalog/PromptSourceBadge.js +36 -0
  200. package/dist/data/ai/PromptCatalog/PromptSourceBadge.js.map +1 -0
  201. package/dist/data/ai/PromptCatalog/index.d.ts +9 -0
  202. package/dist/data/ai/PromptCatalog/index.d.ts.map +1 -0
  203. package/dist/data/ai/PromptCatalog/prompt-catalog-model.cjs +137 -0
  204. package/dist/data/ai/PromptCatalog/prompt-catalog-model.cjs.map +1 -0
  205. package/dist/data/ai/PromptCatalog/prompt-catalog-model.d.ts +28 -0
  206. package/dist/data/ai/PromptCatalog/prompt-catalog-model.d.ts.map +1 -0
  207. package/dist/data/ai/PromptCatalog/prompt-catalog-model.js +137 -0
  208. package/dist/data/ai/PromptCatalog/prompt-catalog-model.js.map +1 -0
  209. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +114 -0
  210. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -0
  211. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +45 -0
  212. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -0
  213. package/dist/data/ai/PromptCatalog/prompt-page-model.js +114 -0
  214. package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -0
  215. package/dist/data/ai/PromptCatalog/types.d.ts +70 -0
  216. package/dist/data/ai/PromptCatalog/types.d.ts.map +1 -0
  217. package/dist/data/ai/PromptPicker/PromptPicker.cjs +9 -12
  218. package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
  219. package/dist/data/ai/PromptPicker/PromptPicker.js +9 -12
  220. package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
  221. package/dist/data/ai/PromptPicker/index.d.ts +1 -1
  222. package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
  223. package/dist/data/ai/PromptPicker/types.cjs.map +1 -1
  224. package/dist/data/ai/PromptPicker/types.d.ts +9 -0
  225. package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
  226. package/dist/data/ai/PromptPicker/types.js.map +1 -1
  227. package/dist/data/ai/PromptRunEditor/index.cjs +4 -5
  228. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  229. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  230. package/dist/data/ai/PromptRunEditor/index.js +5 -6
  231. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  232. package/dist/data/ai/PromptRunEditor/model.cjs +1 -1
  233. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
  234. package/dist/data/ai/PromptRunEditor/model.d.ts +1 -1
  235. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
  236. package/dist/data/ai/PromptRunEditor/model.js +1 -1
  237. package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
  238. package/dist/data/ai/RuntimeModePicker.cjs +25 -14
  239. package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
  240. package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
  241. package/dist/data/ai/RuntimeModePicker.js +26 -15
  242. package/dist/data/ai/RuntimeModePicker.js.map +1 -1
  243. package/dist/data/ai/SessionInspector.collection-types.d.ts +1 -1
  244. package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
  245. package/dist/data/ai/SessionInspector.collection.cjs +3 -3
  246. package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
  247. package/dist/data/ai/SessionInspector.collection.js +3 -3
  248. package/dist/data/ai/SessionInspector.collection.js.map +1 -1
  249. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  250. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  251. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  252. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  253. package/dist/data/ai/SessionInspector.model.cjs +3 -3
  254. package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
  255. package/dist/data/ai/SessionInspector.model.d.ts +1 -1
  256. package/dist/data/ai/SessionInspector.model.d.ts.map +1 -1
  257. package/dist/data/ai/SessionInspector.model.js +3 -3
  258. package/dist/data/ai/SessionInspector.model.js.map +1 -1
  259. package/dist/data/ai/SessionInspector.panels.cjs +1 -1
  260. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
  261. package/dist/data/ai/SessionInspector.panels.js +1 -1
  262. package/dist/data/ai/SessionInspector.panels.js.map +1 -1
  263. package/dist/data/ai/SessionInspector.summary.cjs +3 -3
  264. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
  265. package/dist/data/ai/SessionInspector.summary.js +3 -3
  266. package/dist/data/ai/SessionInspector.summary.js.map +1 -1
  267. package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
  268. package/dist/data/ai/SessionViewer.unified.d.ts +3 -2
  269. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  270. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +18 -30
  271. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
  272. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
  273. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +19 -31
  274. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
  275. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.cjs +71 -86
  276. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.cjs.map +1 -1
  277. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.d.ts.map +1 -1
  278. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.js +72 -87
  279. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.js.map +1 -1
  280. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.cjs +99 -0
  281. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.cjs.map +1 -0
  282. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.d.ts +13 -0
  283. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.d.ts.map +1 -0
  284. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.js +99 -0
  285. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.js.map +1 -0
  286. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +37 -21
  287. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  288. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +6 -2
  289. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  290. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +38 -22
  291. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  292. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs +114 -0
  293. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs.map +1 -0
  294. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.d.ts +10 -0
  295. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.d.ts.map +1 -0
  296. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js +114 -0
  297. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js.map +1 -0
  298. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.cjs +160 -0
  299. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.cjs.map +1 -0
  300. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.d.ts +9 -0
  301. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.d.ts.map +1 -0
  302. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.js +160 -0
  303. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.js.map +1 -0
  304. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.cjs +27 -241
  305. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.cjs.map +1 -1
  306. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.d.ts +5 -6
  307. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.d.ts.map +1 -1
  308. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.js +25 -239
  309. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.js.map +1 -1
  310. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +21 -8
  311. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
  312. package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts +4 -1
  313. package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
  314. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +22 -9
  315. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
  316. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.cjs +207 -164
  317. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.cjs.map +1 -1
  318. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.d.ts +4 -3
  319. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.d.ts.map +1 -1
  320. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.js +210 -167
  321. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.js.map +1 -1
  322. package/dist/data/ai/SpecRuntimeEditor/SectionCard.cjs +15 -15
  323. package/dist/data/ai/SpecRuntimeEditor/SectionCard.cjs.map +1 -1
  324. package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts.map +1 -1
  325. package/dist/data/ai/SpecRuntimeEditor/SectionCard.js +15 -15
  326. package/dist/data/ai/SpecRuntimeEditor/SectionCard.js.map +1 -1
  327. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +120 -42
  328. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
  329. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts +4 -1
  330. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
  331. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +123 -45
  332. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
  333. package/dist/data/ai/SpecRuntimeEditor/env-model.cjs.map +1 -1
  334. package/dist/data/ai/SpecRuntimeEditor/env-model.d.ts.map +1 -1
  335. package/dist/data/ai/SpecRuntimeEditor/env-model.js.map +1 -1
  336. package/dist/data/ai/SpecRuntimeEditor/index.cjs +136 -48
  337. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  338. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +13 -3
  339. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  340. package/dist/data/ai/SpecRuntimeEditor/index.js +137 -49
  341. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  342. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +93 -0
  343. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs.map +1 -0
  344. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.d.ts +6 -0
  345. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.d.ts.map +1 -0
  346. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +93 -0
  347. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js.map +1 -0
  348. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.cjs +35 -0
  349. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.cjs.map +1 -0
  350. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.d.ts +5 -0
  351. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.d.ts.map +1 -0
  352. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.js +35 -0
  353. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.js.map +1 -0
  354. package/dist/data/ai/SpecRuntimeEditor/presets.cjs +2 -9
  355. package/dist/data/ai/SpecRuntimeEditor/presets.cjs.map +1 -1
  356. package/dist/data/ai/SpecRuntimeEditor/presets.d.ts +1 -2
  357. package/dist/data/ai/SpecRuntimeEditor/presets.d.ts.map +1 -1
  358. package/dist/data/ai/SpecRuntimeEditor/presets.js +2 -9
  359. package/dist/data/ai/SpecRuntimeEditor/presets.js.map +1 -1
  360. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  361. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +1 -1
  362. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  363. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  364. package/dist/data/ai/SpecRuntimeEditor/types.cjs +2 -7
  365. package/dist/data/ai/SpecRuntimeEditor/types.cjs.map +1 -1
  366. package/dist/data/ai/SpecRuntimeEditor/types.d.ts +0 -1
  367. package/dist/data/ai/SpecRuntimeEditor/types.d.ts.map +1 -1
  368. package/dist/data/ai/SpecRuntimeEditor/types.js +3 -8
  369. package/dist/data/ai/SpecRuntimeEditor/types.js.map +1 -1
  370. package/dist/data/ai/SpecRuntimeEditor/update.cjs +43 -33
  371. package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
  372. package/dist/data/ai/SpecRuntimeEditor/update.d.ts +7 -13
  373. package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
  374. package/dist/data/ai/SpecRuntimeEditor/update.js +43 -33
  375. package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
  376. package/dist/data/ai/SpecRuntimeEditor.model.cjs +33 -45
  377. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  378. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +54 -29
  379. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  380. package/dist/data/ai/SpecRuntimeEditor.model.js +33 -44
  381. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  382. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.cjs +276 -0
  383. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.cjs.map +1 -0
  384. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.d.ts +58 -0
  385. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.d.ts.map +1 -0
  386. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.js +276 -0
  387. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.js.map +1 -0
  388. package/dist/data/ai/ThreadPicker.cjs +55 -42
  389. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  390. package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
  391. package/dist/data/ai/ThreadPicker.js +56 -43
  392. package/dist/data/ai/ThreadPicker.js.map +1 -1
  393. package/dist/data/ai/ToolPreferences.cjs +9 -1
  394. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  395. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  396. package/dist/data/ai/ToolPreferences.js +9 -1
  397. package/dist/data/ai/ToolPreferences.js.map +1 -1
  398. package/dist/data/ai/ToolSchemaBrowser.cjs +41 -487
  399. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  400. package/dist/data/ai/ToolSchemaBrowser.d.ts +7 -2
  401. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  402. package/dist/data/ai/ToolSchemaBrowser.detail.cjs +238 -0
  403. package/dist/data/ai/ToolSchemaBrowser.detail.cjs.map +1 -0
  404. package/dist/data/ai/ToolSchemaBrowser.detail.d.ts +8 -0
  405. package/dist/data/ai/ToolSchemaBrowser.detail.d.ts.map +1 -0
  406. package/dist/data/ai/ToolSchemaBrowser.detail.js +238 -0
  407. package/dist/data/ai/ToolSchemaBrowser.detail.js.map +1 -0
  408. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +57 -0
  409. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -0
  410. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +9 -0
  411. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -0
  412. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +57 -0
  413. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -0
  414. package/dist/data/ai/ToolSchemaBrowser.js +42 -488
  415. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  416. package/dist/data/ai/ToolSchemaBrowser.model.cjs +130 -0
  417. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -0
  418. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +35 -0
  419. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -0
  420. package/dist/data/ai/ToolSchemaBrowser.model.js +130 -0
  421. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -0
  422. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +57 -0
  423. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +1 -0
  424. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +7 -0
  425. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +1 -0
  426. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +57 -0
  427. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +1 -0
  428. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +389 -0
  429. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -0
  430. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +23 -0
  431. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -0
  432. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +389 -0
  433. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -0
  434. package/dist/data/ai/agent-action-icons.cjs +14 -6
  435. package/dist/data/ai/agent-action-icons.cjs.map +1 -1
  436. package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
  437. package/dist/data/ai/agent-action-icons.js +14 -6
  438. package/dist/data/ai/agent-action-icons.js.map +1 -1
  439. package/dist/data/ai/examples/sessions/claude-complete.cjs +17 -9
  440. package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -1
  441. package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -1
  442. package/dist/data/ai/examples/sessions/claude-complete.js +17 -9
  443. package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -1
  444. package/dist/data/ai/examples/sessions/claude.cjs +7 -4
  445. package/dist/data/ai/examples/sessions/claude.cjs.map +1 -1
  446. package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -1
  447. package/dist/data/ai/examples/sessions/claude.js +7 -4
  448. package/dist/data/ai/examples/sessions/claude.js.map +1 -1
  449. package/dist/data/ai/examples/sessions/codex-complete.cjs +17 -10
  450. package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -1
  451. package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -1
  452. package/dist/data/ai/examples/sessions/codex-complete.js +17 -10
  453. package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -1
  454. package/dist/data/ai/examples/sessions/codex.cjs +7 -4
  455. package/dist/data/ai/examples/sessions/codex.cjs.map +1 -1
  456. package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -1
  457. package/dist/data/ai/examples/sessions/codex.js +7 -4
  458. package/dist/data/ai/examples/sessions/codex.js.map +1 -1
  459. package/dist/data/ai/index.d.ts +6 -3
  460. package/dist/data/ai/index.d.ts.map +1 -1
  461. package/dist/data/ai/runtime-profile.cjs +93 -0
  462. package/dist/data/ai/runtime-profile.cjs.map +1 -0
  463. package/dist/data/ai/runtime-profile.d.ts +73 -0
  464. package/dist/data/ai/runtime-profile.d.ts.map +1 -0
  465. package/dist/data/ai/runtime-profile.js +93 -0
  466. package/dist/data/ai/runtime-profile.js.map +1 -0
  467. package/dist/data/ai/sandbox-kind-meta.cjs +38 -4
  468. package/dist/data/ai/sandbox-kind-meta.cjs.map +1 -1
  469. package/dist/data/ai/sandbox-kind-meta.d.ts +3 -0
  470. package/dist/data/ai/sandbox-kind-meta.d.ts.map +1 -1
  471. package/dist/data/ai/sandbox-kind-meta.js +38 -4
  472. package/dist/data/ai/sandbox-kind-meta.js.map +1 -1
  473. package/dist/data/chat/Chat.cjs +17 -5
  474. package/dist/data/chat/Chat.cjs.map +1 -1
  475. package/dist/data/chat/Chat.d.ts.map +1 -1
  476. package/dist/data/chat/Chat.fixtures.cjs +3 -3
  477. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  478. package/dist/data/chat/Chat.fixtures.js +3 -3
  479. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  480. package/dist/data/chat/Chat.js +18 -6
  481. package/dist/data/chat/Chat.js.map +1 -1
  482. package/dist/data/chat/Chat.runtime.cjs +15 -9
  483. package/dist/data/chat/Chat.runtime.cjs.map +1 -1
  484. package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
  485. package/dist/data/chat/Chat.runtime.js +16 -10
  486. package/dist/data/chat/Chat.runtime.js.map +1 -1
  487. package/dist/data/chat/ChatRuntimeToolbar.cjs +5 -5
  488. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  489. package/dist/data/chat/ChatRuntimeToolbar.js +5 -5
  490. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  491. package/dist/data/chat/ContextMeter.cjs +3 -3
  492. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  493. package/dist/data/chat/ContextMeter.d.ts +3 -3
  494. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  495. package/dist/data/chat/ContextMeter.js +3 -3
  496. package/dist/data/chat/ContextMeter.js.map +1 -1
  497. package/dist/data/chat/approval.cjs.map +1 -1
  498. package/dist/data/chat/approval.d.ts +21 -1
  499. package/dist/data/chat/approval.d.ts.map +1 -1
  500. package/dist/data/chat/approval.js.map +1 -1
  501. package/dist/data/chat/clickyOperationsToTools.cjs +5 -0
  502. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  503. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  504. package/dist/data/chat/clickyOperationsToTools.js +5 -0
  505. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  506. package/dist/data/chat/types.cjs.map +1 -1
  507. package/dist/data/chat/types.d.ts +7 -5
  508. package/dist/data/chat/types.d.ts.map +1 -1
  509. package/dist/data/chat/types.js.map +1 -1
  510. package/dist/data/chat/usage-snapshot.cjs +21 -1
  511. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  512. package/dist/data/chat/usage-snapshot.d.ts +2 -0
  513. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  514. package/dist/data/chat/usage-snapshot.js +22 -2
  515. package/dist/data/chat/usage-snapshot.js.map +1 -1
  516. package/dist/data/runtime/RuntimeBar.cjs +49 -51
  517. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  518. package/dist/data/runtime/RuntimeBar.d.ts +10 -2
  519. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  520. package/dist/data/runtime/RuntimeBar.js +51 -53
  521. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  522. package/dist/data/runtime/RuntimeBar.model.cjs +55 -0
  523. package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -1
  524. package/dist/data/runtime/RuntimeBar.model.d.ts +11 -3
  525. package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -1
  526. package/dist/data/runtime/RuntimeBar.model.js +55 -0
  527. package/dist/data/runtime/RuntimeBar.model.js.map +1 -1
  528. package/dist/data/runtime/RuntimeBarCombo.cjs +11 -6
  529. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
  530. package/dist/data/runtime/RuntimeBarCombo.d.ts +3 -1
  531. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
  532. package/dist/data/runtime/RuntimeBarCombo.js +11 -6
  533. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
  534. package/dist/data/runtime/RuntimeBarSegments.cjs +7 -5
  535. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
  536. package/dist/data/runtime/RuntimeBarSegments.d.ts +4 -2
  537. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
  538. package/dist/data/runtime/RuntimeBarSegments.js +7 -5
  539. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
  540. package/dist/data/runtime/model-capabilities.cjs +6 -6
  541. package/dist/data/runtime/model-capabilities.cjs.map +1 -1
  542. package/dist/data/runtime/model-capabilities.d.ts +5 -1
  543. package/dist/data/runtime/model-capabilities.d.ts.map +1 -1
  544. package/dist/data/runtime/model-capabilities.js +6 -6
  545. package/dist/data/runtime/model-capabilities.js.map +1 -1
  546. package/dist/data/runtime/provider-status.cjs +1 -1
  547. package/dist/data/runtime/provider-status.cjs.map +1 -1
  548. package/dist/data/runtime/provider-status.js +1 -1
  549. package/dist/data/runtime/provider-status.js.map +1 -1
  550. package/dist/data/runtime/runtime-field-support.cjs +63 -0
  551. package/dist/data/runtime/runtime-field-support.cjs.map +1 -0
  552. package/dist/data/runtime/runtime-field-support.d.ts +13 -0
  553. package/dist/data/runtime/runtime-field-support.d.ts.map +1 -0
  554. package/dist/data/runtime/runtime-field-support.js +63 -0
  555. package/dist/data/runtime/runtime-field-support.js.map +1 -0
  556. package/dist/data/runtime/runtime-mode.cjs +170 -111
  557. package/dist/data/runtime/runtime-mode.cjs.map +1 -1
  558. package/dist/data/runtime/runtime-mode.d.ts +58 -14
  559. package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
  560. package/dist/data/runtime/runtime-mode.js +170 -111
  561. package/dist/data/runtime/runtime-mode.js.map +1 -1
  562. package/dist/data/selectionActionSplit.cjs +33 -0
  563. package/dist/data/selectionActionSplit.cjs.map +1 -0
  564. package/dist/data/selectionActionSplit.d.ts +36 -0
  565. package/dist/data/selectionActionSplit.d.ts.map +1 -0
  566. package/dist/data/selectionActionSplit.js +33 -0
  567. package/dist/data/selectionActionSplit.js.map +1 -0
  568. package/dist/data/task-copy.cjs +76 -0
  569. package/dist/data/task-copy.cjs.map +1 -0
  570. package/dist/data/task-copy.d.ts +12 -0
  571. package/dist/data/task-copy.d.ts.map +1 -0
  572. package/dist/data/task-copy.js +76 -0
  573. package/dist/data/task-copy.js.map +1 -0
  574. package/dist/data/version-info.cjs +3 -3
  575. package/dist/data/version-info.js +3 -3
  576. package/dist/data.cjs +34 -0
  577. package/dist/data.cjs.map +1 -1
  578. package/dist/data.d.ts +4 -1
  579. package/dist/data.d.ts.map +1 -1
  580. package/dist/data.js +34 -0
  581. package/dist/data.js.map +1 -1
  582. package/dist/hooks/use-task-run.cjs +24 -17
  583. package/dist/hooks/use-task-run.cjs.map +1 -1
  584. package/dist/hooks/use-task-run.d.ts +3 -1
  585. package/dist/hooks/use-task-run.d.ts.map +1 -1
  586. package/dist/hooks/use-task-run.js +25 -18
  587. package/dist/hooks/use-task-run.js.map +1 -1
  588. package/dist/icons/components/UiCalendarCheck.cjs +15 -0
  589. package/dist/icons/components/UiCalendarCheck.cjs.map +1 -0
  590. package/dist/icons/components/UiCalendarCheck.d.ts +15 -0
  591. package/dist/icons/components/UiCalendarCheck.d.ts.map +1 -0
  592. package/dist/icons/components/UiCalendarCheck.js +15 -0
  593. package/dist/icons/components/UiCalendarCheck.js.map +1 -0
  594. package/dist/icons/components/UiChartLineUp.cjs +15 -0
  595. package/dist/icons/components/UiChartLineUp.cjs.map +1 -0
  596. package/dist/icons/components/UiChartLineUp.d.ts +15 -0
  597. package/dist/icons/components/UiChartLineUp.d.ts.map +1 -0
  598. package/dist/icons/components/UiChartLineUp.js +15 -0
  599. package/dist/icons/components/UiChartLineUp.js.map +1 -0
  600. package/dist/icons/components/UiClockCountdown.cjs +15 -0
  601. package/dist/icons/components/UiClockCountdown.cjs.map +1 -0
  602. package/dist/icons/components/UiClockCountdown.d.ts +15 -0
  603. package/dist/icons/components/UiClockCountdown.d.ts.map +1 -0
  604. package/dist/icons/components/UiClockCountdown.js +15 -0
  605. package/dist/icons/components/UiClockCountdown.js.map +1 -0
  606. package/dist/icons/components/UiFactory.cjs +15 -0
  607. package/dist/icons/components/UiFactory.cjs.map +1 -0
  608. package/dist/icons/components/UiFactory.d.ts +15 -0
  609. package/dist/icons/components/UiFactory.d.ts.map +1 -0
  610. package/dist/icons/components/UiFactory.js +15 -0
  611. package/dist/icons/components/UiFactory.js.map +1 -0
  612. package/dist/icons/components/UiHandCoins.cjs +15 -0
  613. package/dist/icons/components/UiHandCoins.cjs.map +1 -0
  614. package/dist/icons/components/UiHandCoins.d.ts +15 -0
  615. package/dist/icons/components/UiHandCoins.d.ts.map +1 -0
  616. package/dist/icons/components/UiHandCoins.js +15 -0
  617. package/dist/icons/components/UiHandCoins.js.map +1 -0
  618. package/dist/icons/components/UiInvoice.cjs +15 -0
  619. package/dist/icons/components/UiInvoice.cjs.map +1 -0
  620. package/dist/icons/components/UiInvoice.d.ts +15 -0
  621. package/dist/icons/components/UiInvoice.d.ts.map +1 -0
  622. package/dist/icons/components/UiInvoice.js +15 -0
  623. package/dist/icons/components/UiInvoice.js.map +1 -0
  624. package/dist/icons/components/UiTax.cjs +15 -0
  625. package/dist/icons/components/UiTax.cjs.map +1 -0
  626. package/dist/icons/components/UiTax.d.ts +15 -0
  627. package/dist/icons/components/UiTax.d.ts.map +1 -0
  628. package/dist/icons/components/UiTax.js +15 -0
  629. package/dist/icons/components/UiTax.js.map +1 -0
  630. package/dist/icons/index.d.ts +14 -0
  631. package/dist/icons/index.d.ts.map +1 -1
  632. package/dist/icons/registry.cjs +14 -0
  633. package/dist/icons/registry.cjs.map +1 -1
  634. package/dist/icons/registry.d.ts.map +1 -1
  635. package/dist/icons/registry.js +14 -0
  636. package/dist/icons/registry.js.map +1 -1
  637. package/dist/icons.cjs +21 -0
  638. package/dist/icons.cjs.map +1 -1
  639. package/dist/icons.js +21 -0
  640. package/dist/icons.js.map +1 -1
  641. package/dist/index.cjs +43 -0
  642. package/dist/index.cjs.map +1 -1
  643. package/dist/index.js +44 -1
  644. package/dist/index.js.map +1 -1
  645. package/dist/layout/AppShell.cjs +17 -3
  646. package/dist/layout/AppShell.cjs.map +1 -1
  647. package/dist/layout/AppShell.d.ts.map +1 -1
  648. package/dist/layout/AppShell.js +17 -3
  649. package/dist/layout/AppShell.js.map +1 -1
  650. package/dist/overlay/DropdownMenu.cjs +46 -35
  651. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  652. package/dist/overlay/DropdownMenu.js +46 -35
  653. package/dist/overlay/DropdownMenu.js.map +1 -1
  654. package/dist/rpc/FilterForm.cjs +26 -11
  655. package/dist/rpc/FilterForm.cjs.map +1 -1
  656. package/dist/rpc/FilterForm.d.ts +4 -1
  657. package/dist/rpc/FilterForm.d.ts.map +1 -1
  658. package/dist/rpc/FilterForm.js +26 -11
  659. package/dist/rpc/FilterForm.js.map +1 -1
  660. package/dist/rpc/FilterFormFields.cjs +3 -2
  661. package/dist/rpc/FilterFormFields.cjs.map +1 -1
  662. package/dist/rpc/FilterFormFields.d.ts +2 -1
  663. package/dist/rpc/FilterFormFields.d.ts.map +1 -1
  664. package/dist/rpc/FilterFormFields.js +3 -2
  665. package/dist/rpc/FilterFormFields.js.map +1 -1
  666. package/dist/rpc/OperationActionBar.cjs +67 -15
  667. package/dist/rpc/OperationActionBar.cjs.map +1 -1
  668. package/dist/rpc/OperationActionBar.d.ts +11 -3
  669. package/dist/rpc/OperationActionBar.d.ts.map +1 -1
  670. package/dist/rpc/OperationActionBar.js +68 -16
  671. package/dist/rpc/OperationActionBar.js.map +1 -1
  672. package/dist/rpc/OperationCatalog.cjs +69 -76
  673. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  674. package/dist/rpc/OperationCatalog.d.ts +3 -1
  675. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  676. package/dist/rpc/OperationCatalog.js +69 -76
  677. package/dist/rpc/OperationCatalog.js.map +1 -1
  678. package/dist/rpc/OperationCatalogActions.cjs +69 -0
  679. package/dist/rpc/OperationCatalogActions.cjs.map +1 -0
  680. package/dist/rpc/OperationCatalogActions.d.ts +17 -0
  681. package/dist/rpc/OperationCatalogActions.d.ts.map +1 -0
  682. package/dist/rpc/OperationCatalogActions.js +69 -0
  683. package/dist/rpc/OperationCatalogActions.js.map +1 -0
  684. package/dist/rpc/OperationEntityContextPicker.cjs +129 -116
  685. package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
  686. package/dist/rpc/OperationEntityContextPicker.d.ts +18 -1
  687. package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
  688. package/dist/rpc/OperationEntityContextPicker.js +130 -117
  689. package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
  690. package/dist/rpc/OperationResultView.cjs +7 -4
  691. package/dist/rpc/OperationResultView.cjs.map +1 -1
  692. package/dist/rpc/OperationResultView.d.ts +4 -2
  693. package/dist/rpc/OperationResultView.d.ts.map +1 -1
  694. package/dist/rpc/OperationResultView.js +7 -4
  695. package/dist/rpc/OperationResultView.js.map +1 -1
  696. package/dist/rpc/operationCatalogUrl.cjs +28 -0
  697. package/dist/rpc/operationCatalogUrl.cjs.map +1 -0
  698. package/dist/rpc/operationCatalogUrl.d.ts +3 -0
  699. package/dist/rpc/operationCatalogUrl.d.ts.map +1 -0
  700. package/dist/rpc/operationCatalogUrl.js +28 -0
  701. package/dist/rpc/operationCatalogUrl.js.map +1 -0
  702. package/dist/rpc/rowNavigation.cjs +4 -3
  703. package/dist/rpc/rowNavigation.cjs.map +1 -1
  704. package/dist/rpc/rowNavigation.d.ts +1 -1
  705. package/dist/rpc/rowNavigation.d.ts.map +1 -1
  706. package/dist/rpc/rowNavigation.js +4 -3
  707. package/dist/rpc/rowNavigation.js.map +1 -1
  708. package/dist/rpc/types.cjs.map +1 -1
  709. package/dist/rpc/types.d.ts +2 -2
  710. package/dist/rpc/types.d.ts.map +1 -1
  711. package/dist/rpc/types.js.map +1 -1
  712. package/dist/rpc.cjs +2 -0
  713. package/dist/rpc.cjs.map +1 -1
  714. package/dist/rpc.d.ts +2 -1
  715. package/dist/rpc.d.ts.map +1 -1
  716. package/dist/rpc.js +2 -0
  717. package/dist/rpc.js.map +1 -1
  718. package/dist/runtime-profile.cjs +7 -0
  719. package/dist/runtime-profile.cjs.map +1 -0
  720. package/dist/runtime-profile.d.ts +2 -0
  721. package/dist/runtime-profile.d.ts.map +1 -0
  722. package/dist/runtime-profile.js +7 -0
  723. package/dist/runtime-profile.js.map +1 -0
  724. package/dist/styles.css +1 -1
  725. package/package.json +6 -1
@@ -141,7 +141,7 @@ function FixtureFrontmatterDialog({
141
141
  }
142
142
  function hasRuntimeModelOverride(value) {
143
143
  return Boolean(
144
- value.model || value.backend || value.id || value.effort || value.temperature != null || value.noCache || value.budget
144
+ value.model || value.mode || value.id || value.effort || value.temperature != null || value.noCache || value.budget
145
145
  );
146
146
  }
147
147
  exports.FixtureFrontmatterDialog = FixtureFrontmatterDialog;
@@ -1 +1 @@
1
- {"version":3,"file":"FixtureFrontmatterDialog.cjs","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.backend ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":["useMemo","parseFixtureFrontmatter","fixtureFrontmatterState","useState","useEffect","applyFixtureFrontmatterState","applyFixtureFrontmatterRaw","jsx","SegmentedControl","Modal","jsxs","Button","Icon","UiCheck","SpecRuntimeEditor","Badge","UiFileCode"],"mappings":"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"}
1
+ {"version":3,"file":"FixtureFrontmatterDialog.cjs","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.mode ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":["useMemo","parseFixtureFrontmatter","fixtureFrontmatterState","useState","useEffect","applyFixtureFrontmatterState","applyFixtureFrontmatterRaw","jsx","SegmentedControl","Modal","jsxs","Button","Icon","UiCheck","SpecRuntimeEditor","Badge","UiFileCode"],"mappings":"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"}
@@ -139,7 +139,7 @@ function FixtureFrontmatterDialog({
139
139
  }
140
140
  function hasRuntimeModelOverride(value) {
141
141
  return Boolean(
142
- value.model || value.backend || value.id || value.effort || value.temperature != null || value.noCache || value.budget
142
+ value.model || value.mode || value.id || value.effort || value.temperature != null || value.noCache || value.budget
143
143
  );
144
144
  }
145
145
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"FixtureFrontmatterDialog.js","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.backend ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FixtureFrontmatterDialog.js","sources":["../../../src/data/FixtureEditor/FixtureFrontmatterDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiFileCode } from \"../../icons\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { SpecRuntimeEditor } from \"../ai/SpecRuntimeEditor\";\nimport type { SpecSectionId } from \"../ai/SpecRuntimeEditor/types\";\nimport type {\n FixtureEditorSize,\n FixtureFrontmatterEditorOptions,\n} from \"./types\";\nimport {\n applyFixtureFrontmatterRaw,\n applyFixtureFrontmatterState,\n fixtureFrontmatterState,\n parseFixtureFrontmatter,\n type FixtureFrontmatterState,\n} from \"./fixture-frontmatter\";\n\nexport type FixtureFrontmatterDialogProps = {\n open: boolean;\n markdown: string;\n onChange: (markdown: string) => void;\n onClose: () => void;\n size: FixtureEditorSize;\n options?: FixtureFrontmatterEditorOptions | undefined;\n};\n\nconst EMPTY_STATE: FixtureFrontmatterState = {\n runtime: {},\n aiExtras: {},\n};\n\ntype VerificationModelMode = \"same\" | \"different\";\n\nconst VERIFICATION_MODEL_OPTIONS: Array<{\n id: VerificationModelMode;\n label: string;\n}> = [\n { id: \"same\", label: \"Use same model\" },\n { id: \"different\", label: \"Use different model for verification\" },\n];\n\nconst DEFAULT_SECTIONS: readonly SpecSectionId[] = [\"model\", \"prompt\"];\nconst VERIFICATION_MODEL_SECTIONS: readonly SpecSectionId[] = [\n \"model\",\n \"prompt\",\n \"environment\",\n];\nconst VERIFICATION_INHERIT_SECTIONS: readonly SpecSectionId[] = [\n \"prompt\",\n \"environment\",\n];\nconst COLLAPSED_VERIFICATION_SECTIONS: readonly SpecSectionId[] = [\n \"environment\",\n];\n\nexport function FixtureFrontmatterDialog({\n open,\n markdown,\n onChange,\n onClose,\n options,\n}: FixtureFrontmatterDialogProps) {\n const parsed = useMemo(() => parseFixtureFrontmatter(markdown), [markdown]);\n const initialState = useMemo(\n () => (parsed.ok ? fixtureFrontmatterState(parsed.frontmatter) : EMPTY_STATE),\n [parsed],\n );\n const isVerification = options?.mode === \"verification\";\n const initialVerificationModelMode = useMemo<VerificationModelMode>(\n () => (hasRuntimeModelOverride(initialState.runtime) ? \"different\" : \"same\"),\n [initialState.runtime],\n );\n const [draft, setDraft] = useState<FixtureFrontmatterState>(initialState);\n const [rawDraft, setRawDraft] = useState(parsed.raw);\n const [verificationModelMode, setVerificationModelMode] =\n useState<VerificationModelMode>(initialVerificationModelMode);\n\n useEffect(() => {\n if (!open) return;\n setDraft(initialState);\n setRawDraft(parsed.raw);\n setVerificationModelMode(initialVerificationModelMode);\n }, [initialState, initialVerificationModelMode, open, parsed.raw]);\n\n const dirty = parsed.ok\n ? JSON.stringify(draft) !== JSON.stringify(initialState) ||\n (isVerification &&\n verificationModelMode !== initialVerificationModelMode)\n : rawDraft !== parsed.raw;\n\n const save = () => {\n const next = parsed.ok\n ? applyFixtureFrontmatterState(markdown, draft, {\n inheritModel: isVerification && verificationModelMode === \"same\",\n })\n : applyFixtureFrontmatterRaw(markdown, rawDraft);\n onChange(next);\n onClose();\n };\n\n const sections =\n isVerification && verificationModelMode === \"same\"\n ? VERIFICATION_INHERIT_SECTIONS\n : isVerification\n ? VERIFICATION_MODEL_SECTIONS\n : DEFAULT_SECTIONS;\n const verificationModelSelector = isVerification ? (\n <div className=\"pb-density-3\">\n <SegmentedControl\n aria-label=\"Verification model\"\n value={verificationModelMode}\n options={VERIFICATION_MODEL_OPTIONS}\n onChange={(mode) =>\n setVerificationModelMode(mode as VerificationModelMode)\n }\n size=\"lg\"\n wrap\n className=\"w-full\"\n />\n </div>\n ) : undefined;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n confirmClose={dirty}\n title=\"Fixture frontmatter\"\n size=\"2xl\"\n className=\"h-[92vh]\"\n footer={\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n {parsed.ok ? \"ai / env\" : \"YAML source\"}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n <Icon icon={UiCheck} className=\"size-4\" />\n Save frontmatter\n </Button>\n </div>\n </div>\n }\n >\n {parsed.ok ? (\n <div className=\"min-h-0\">\n <SpecRuntimeEditor\n value={draft.runtime}\n onChange={(runtime) => setDraft((current) => ({ ...current, runtime }))}\n models={options?.models}\n families={options?.families}\n tools={options?.tools}\n permissionCatalog={options?.permissionCatalog}\n secretSelector={options?.secretSelector}\n cliOptions={options?.cliOptions}\n sections={sections}\n showHeader={false}\n {...(verificationModelSelector\n ? { beforeSections: verificationModelSelector }\n : {})}\n defaultCollapsedSections={\n isVerification ? COLLAPSED_VERIFICATION_SECTIONS : undefined\n }\n />\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"status\" status=\"error\" size=\"xs\" clickToCopy={false}>\n YAML error\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{parsed.error}</span>\n </div>\n <label className=\"grid gap-2 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon icon={UiFileCode} className=\"size-4\" />\n Frontmatter source\n </span>\n <textarea\n aria-label=\"Frontmatter source\"\n value={rawDraft}\n onChange={(event) => setRawDraft(event.currentTarget.value)}\n spellCheck={false}\n className=\"min-h-80 w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs leading-5 text-foreground shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </label>\n </div>\n )}\n </Modal>\n );\n}\n\nfunction hasRuntimeModelOverride(value: FixtureFrontmatterState[\"runtime\"]) {\n return Boolean(\n value.model ||\n value.mode ||\n value.id ||\n value.effort ||\n value.temperature != null ||\n value.noCache ||\n value.budget,\n );\n}\n"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const yaml = require("yaml");
4
4
  const SpecRuntimeEditor_model = require("../ai/SpecRuntimeEditor.model.cjs");
5
5
  const AI_RUNTIME_KEYS = /* @__PURE__ */ new Set([
6
- "backend",
6
+ "mode",
7
7
  "budget",
8
8
  "effort",
9
9
  "id",
@@ -13,7 +13,7 @@ const AI_RUNTIME_KEYS = /* @__PURE__ */ new Set([
13
13
  "temperature"
14
14
  ]);
15
15
  const AI_MODEL_KEYS = /* @__PURE__ */ new Set([
16
- "backend",
16
+ "mode",
17
17
  "budget",
18
18
  "effort",
19
19
  "id",
@@ -105,8 +105,8 @@ function aiToRuntime(ai) {
105
105
  const runtime = {};
106
106
  const model = stringValue(ai.model);
107
107
  if (model) runtime.model = model;
108
- const backend = stringValue(ai.backend);
109
- if (backend) runtime.backend = backend;
108
+ const specMode = stringValue(ai.mode);
109
+ if (specMode) runtime.mode = specMode;
110
110
  const id = stringValue(ai.id);
111
111
  if (id) runtime.id = id;
112
112
  const effort = stringValue(ai.effort);
@@ -219,7 +219,8 @@ ${body}`;
219
219
  }
220
220
  function splitMarkdownFrontmatter(markdown) {
221
221
  const lines = splitLinesWithEndings(markdown);
222
- if (stripLineEnding(lines[0] ?? "") !== "---") return { hasFrontmatter: false };
222
+ if (stripLineEnding(lines[0] ?? "") !== "---")
223
+ return { hasFrontmatter: false };
223
224
  for (let index = 1; index < lines.length; index += 1) {
224
225
  const line = stripLineEnding(lines[index] ?? "");
225
226
  if (line === "---" || line === "...") {
@@ -254,7 +255,8 @@ function parseYamlRecord(yaml$1) {
254
255
  if (firstError) return { ok: false, error: firstError.message };
255
256
  const value = doc.toJSON();
256
257
  if (value == null) return { ok: true, value: {} };
257
- if (!isRecord(value)) return { ok: false, error: "Frontmatter root must be an object" };
258
+ if (!isRecord(value))
259
+ return { ok: false, error: "Frontmatter root must be an object" };
258
260
  return { ok: true, value };
259
261
  }
260
262
  function omitControlledAIKeys(ai) {
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-frontmatter.cjs","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const backend = stringValue(ai.backend);\n if (backend) runtime.backend = backend;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL) ? { cacheTTL: stringValue(extras.cacheTTL) } : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(markdown: string):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\") return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value)) return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(ai: Record<string, unknown>): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["compactAISpecRuntime","user","yaml","stringify","parseDocument"],"mappings":"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"}
1
+ {"version":3,"file":"fixture-frontmatter.cjs","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const specMode = stringValue(ai.mode);\n if (specMode) runtime.mode = specMode;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL)\n ? { cacheTTL: stringValue(extras.cacheTTL) }\n : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(\n markdown: string,\n):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\")\n return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value))\n return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(\n ai: Record<string, unknown>,\n): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["compactAISpecRuntime","user","yaml","stringify","parseDocument"],"mappings":";;;;AAsCA,MAAM,sCAAsB,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,oCAAoB,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,MAAM,gBAAgB,oBAAI,IAAI,CAAC,iBAAiB,UAAU,CAAC;AAEpD,SAAS,wBACd,UAC+B;AAC/B,QAAM,QAAQ,yBAAyB,QAAQ;AAC/C,MAAI,CAAC,MAAM,gBAAgB;AACzB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,gBAAgB;AAAA,MAChB,aAAa,CAAA;AAAA,MACb,KAAK;AAAA,MACL,MAAM;AAAA,IAAA;AAAA,EAEV;AACA,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP,KAAK,MAAM;AAAA,MACX,MAAM,MAAM;AAAA,IAAA;AAAA,EAEhB;AAEA,QAAM,SAAS,gBAAgB,MAAM,GAAG;AACxC,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,gBAAgB;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,KAAK,MAAM;AAAA,MACX,MAAM,MAAM;AAAA,IAAA;AAAA,EAEhB;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,gBAAgB;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,KAAK,MAAM;AAAA,IACX,MAAM,MAAM;AAAA,EAAA;AAEhB;AAEO,SAAS,wBACd,aACyB;AACzB,QAAM,KAAK,YAAY,YAAY,EAAE;AACrC,QAAM,UAAU,YAAY,EAAE;AAC9B,QAAM,UAAU,oBAAoB,YAAY,GAAG;AACnD,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,QAAQ,EAAE,GAAG,QAAQ,OAAO,QAAA;AAAA,EACtC;AACA,QAAM,WAAW,WAAW,EAAE;AAC9B,SAAO,EAAE,SAAS,SAAA;AACpB;AAEO,SAAS,6BACd,UACA,OACA,UAA0C,CAAA,GAClC;AACR,QAAM,SAAS,wBAAwB,QAAQ;AAC/C,QAAM,OAAO,OAAO;AACpB,QAAM,WAAW,OAAO,KAAK,OAAO,cAAc,CAAA;AAClD,QAAM,cAAc,qBAAqB,UAAU,OAAO,OAAO;AACjE,SAAO,4BAA4B,aAAa,IAAI;AACtD;AAEO,SAAS,2BACd,UACA,KACQ;AACR,QAAM,QAAQ,yBAAyB,QAAQ;AAC/C,QAAM,OAAO,MAAM,iBAAiB,MAAM,OAAO;AACjD,MAAI,IAAI,WAAW,GAAI,QAAO;AAC9B,QAAM,gBAAgB,IAAI,SAAS,IAAI,IAAI,MAAM,GAAG,GAAG;AAAA;AACvD,SAAO;AAAA,EAAQ,aAAa;AAAA,EAAQ,IAAI;AAC1C;AAEO,SAAS,qBACd,UACA,OACA,UAA0C,CAAA,GACjB;;AACzB,QAAM,OAAO,SAAS,UAAU,CAAC,MAAM,KAAK,CAAC;AAC7C,QAAM,YAAY,YAAY,SAAS,EAAE;AACzC,QAAM,KAAK;AAAA,IACT,GAAG,qBAAqB,SAAS;AAAA,IACjC,GAAG,YAAY,MAAM,SAAS,OAAO;AAAA,IACrC,GAAG,gBAAgB,MAAM,QAAQ;AAAA,EAAA;AAEnC,QAAM,MAAM,qBAAoB,WAAM,QAAQ,UAAd,mBAAqB,OAAO;AAE5D,MAAI,QAAQ,EAAE,EAAG,MAAK,KAAK;AAC3B,MAAI,QAAQ,GAAG,EAAG,MAAK,MAAM;AAC7B,SAAO;AACT;AAEA,SAAS,YAAY,IAAiD;AACpE,QAAM,UAA8B,CAAA;AACpC,QAAM,QAAQ,YAAY,GAAG,KAAK;AAClC,MAAI,eAAe,QAAQ;AAC3B,QAAM,WAAW,YAAY,GAAG,IAAI;AACpC,MAAI,kBAAkB,OAAO;AAC7B,QAAM,KAAK,YAAY,GAAG,EAAE;AAC5B,MAAI,YAAY,KAAK;AACrB,QAAM,SAAS,YAAY,GAAG,MAAM;AACpC,MAAI,gBAAgB,SAAS;AAC7B,QAAM,cAAc,YAAY,GAAG,WAAW;AAC9C,MAAI,eAAe,KAAM,SAAQ,cAAc;AAC/C,MAAI,GAAG,YAAY,KAAM,SAAQ,UAAU;AAE3C,QAAM,SAAS,YAAY,GAAG,MAAM;AACpC,QAAM,YAAY,YAAY,GAAG,SAAS,KAAK,YAAY,OAAO,SAAS;AAC3E,QAAM,OAAO,YAAY,OAAO,IAAI;AACpC,QAAM,WAAW,YAAY,OAAO,QAAQ;AAC5C,QAAM,UAAU,YAAY,OAAO,OAAO;AAC1C,MAAI,aAAa,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,SAAS;AACpE,YAAQ,SAAS;AAAA,MACf,GAAI,QAAQ,OAAO,EAAE,KAAA,IAAS,CAAA;AAAA,MAC9B,GAAI,aAAa,OAAO,EAAE,UAAA,IAAc,CAAA;AAAA,MACxC,GAAI,YAAY,OAAO,EAAE,SAAA,IAAa,CAAA;AAAA,MACtC,GAAI,UAAU,EAAE,YAAY,CAAA;AAAA,IAAC;AAAA,EAEjC;AAEA,QAAM,SAAS,sBAAsB,GAAG,MAAM;AAC9C,MAAI,gBAAgB,SAAS;AAE7B,SAAO;AACT;AAEA,SAAS,YACP,SACA,UAA0C,IACjB;;AACzB,QAAM,UAAUA,wBAAAA,qBAAqB,OAAO;AAC5C,QAAM,KAA8B,CAAA;AACpC,aAAW,OAAO,iBAAiB;AACjC,QAAI,QAAQ,gBAAgB,cAAc,IAAI,GAAG,EAAG;AACpD,UAAM,QAAS,QAAoC,GAAG;AACtD,QAAI,SAAS,SAAS,QAAQ,YAAY,QAAQ,YAAY,KAAK,CAAC,IAAI;AACtE,SAAG,GAAG,IAAI;AAAA,IACZ;AAAA,EACF;AACA,QAAM,aAAY,aAAQ,WAAR,mBAAgB;AAClC,MAAI,aAAa,QAAQ,CAAC,QAAQ,cAAc;AAC9C,WAAO,GAAG;AACV,OAAG,YAAY;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,sBACP,OAC0C;AAC1C,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAMC,QAAO,YAAY,KAAK;AAC9B,WAAOA,QAAO,EAAE,MAAAA,MAAAA,IAAS;AAAA,EAC3B;AACA,QAAM,SAAS,YAAY,KAAK;AAChC,QAAM,OAAO,YAAY,OAAO,IAAI;AACpC,QAAM,SAAS,YAAY,OAAO,MAAM;AACxC,QAAM,eAAe,YAAY,OAAO,YAAY;AACpD,QAAM,SAAS,YAAY,OAAO,MAAM;AACxC,QAAM,WAAW,gBAAgB,OAAO,QAAQ;AAChD,QAAM,MAAM;AAAA,IACV,GAAI,OAAO,EAAE,KAAA,IAAS,CAAA;AAAA,IACtB,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,IAC1B,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,IACtC,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,IAC1B,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,EAAC;AAEjC,SAAO,QAAQ,GAAG,IAAI,MAAM;AAC9B;AAEA,SAAS,WAAW,IAA8C;AAChE,QAAM,gBAAgB,YAAY,GAAG,aAAa;AAClD,QAAM,WAAW,YAAY,GAAG,QAAQ;AACxC,SAAO;AAAA,IACL,GAAI,iBAAiB,OAAO,EAAE,cAAA,IAAkB,CAAA;AAAA,IAChD,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,EAAC;AAEnC;AAEA,SAAS,gBAAgB,QAAkD;AACzE,SAAO;AAAA,IACL,GAAI,YAAY,OAAO,aAAa,KAAK,OACrC,EAAE,eAAe,YAAY,OAAO,aAAa,EAAA,IACjD,CAAA;AAAA,IACJ,GAAI,YAAY,OAAO,QAAQ,IAC3B,EAAE,UAAU,YAAY,OAAO,QAAQ,MACvC,CAAA;AAAA,EAAC;AAET;AAEA,SAAS,oBAAoB,OAAuC;AAClE,MAAI,CAAC,SAAS,KAAK,UAAU,CAAA;AAC7B,QAAM,UAAiC,CAAA;AACvC,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACpD,UAAM,MAAM,KAAK,KAAA;AACjB,QAAI,CAAC,OAAO,OAAO,aAAa,SAAU;AAC1C,YAAQ,KAAK,EAAE,MAAM,KAAK,OAAO,UAAU;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,oBACP,OACyB;AACzB,QAAM,MAA+B,CAAA;AACrC,aAAW,QAAQ,SAAS,IAAI;AAC9B,UAAM,OAAO,YAAY,KAAK,IAAI;AAClC,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC9D,UAAM,YACJ,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACxD,QAAI,WAAW,KAAM,KAAI,IAAI,IAAI;AAAA,aACxB,UAAW,KAAI,IAAI,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,4BACP,aACA,MACQ;AACR,MAAI,CAAC,QAAQ,WAAW,EAAG,QAAO;AAClC,QAAMC,SAAOC,KAAAA,UAAU,aAAa;AAAA,IAClC,WAAW;AAAA,IACX,iBAAiB;AAAA,EAAA,CAClB;AACD,QAAM,iBAAiBD,OAAK,SAAS,IAAI,IAAIA,SAAO,GAAGA,MAAI;AAAA;AAC3D,SAAO;AAAA,EAAQ,cAAc;AAAA,EAAQ,IAAI;AAC3C;AAEA,SAAS,yBACP,UAGuE;AACvE,QAAM,QAAQ,sBAAsB,QAAQ;AAC5C,MAAI,gBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM;AACtC,WAAO,EAAE,gBAAgB,MAAA;AAE3B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,gBAAgB,MAAM,KAAK,KAAK,EAAE;AAC/C,QAAI,SAAS,SAAS,SAAS,OAAO;AACpC,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,KAAK,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE;AAAA,QAClC,MAAM,MAAM,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE;AAAA,MAAA;AAAA,IAExC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE;AAAA,IAC3B,MAAM;AAAA,EAAA;AAEV;AAEA,SAAS,sBAAsB,MAAwB;AACrD,MAAI,SAAS,GAAI,QAAO,CAAA;AACxB,QAAM,QAAQ,KAAK,MAAM,iBAAiB,KAAK,CAAA;AAC/C,MAAI,MAAM,GAAG,EAAE,MAAM,UAAU,IAAA;AAC/B,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KAAK,QAAQ,UAAU,EAAE,EAAE,KAAA;AACpC;AAEA,SAAS,gBACPA,QAC6E;AAC7E,MAAIA,OAAK,KAAA,MAAW,GAAI,QAAO,EAAE,IAAI,MAAM,OAAO,GAAC;AACnD,QAAM,MAAME,KAAAA,cAAcF,QAAM,EAAE,cAAc,OAAO;AACvD,QAAM,aAAa,IAAI,OAAO,CAAC;AAC/B,MAAI,WAAY,QAAO,EAAE,IAAI,OAAO,OAAO,WAAW,QAAA;AACtD,QAAM,QAAQ,IAAI,OAAA;AAClB,MAAI,SAAS,KAAM,QAAO,EAAE,IAAI,MAAM,OAAO,GAAC;AAC9C,MAAI,CAAC,SAAS,KAAK;AACjB,WAAO,EAAE,IAAI,OAAO,OAAO,qCAAA;AAC7B,SAAO,EAAE,IAAI,MAAM,MAAA;AACrB;AAEA,SAAS,qBACP,IACyB;AACzB,QAAM,8BAAc,IAAI,CAAC,GAAG,iBAAiB,GAAG,eAAe,WAAW,CAAC;AAC3E,SAAO,SAAS,IAAI,CAAC,GAAG,OAAO,CAAC;AAClC;AAEA,SAAS,SACP,OACA,MACyB;AACzB,QAAM,UAAU,IAAI,IAAI,IAAI;AAC5B,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;AAAA,EAAA;AAE7D;AAEA,SAAS,YAAY,OAAyC;AAC5D,SAAO,SAAS,KAAK,IAAI,QAAQ,CAAA;AACnC;AAEA,SAAS,gBAAgB,OAAoD;AAC3E,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,QAAM,MAA8B,CAAA;AACpC,aAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAM,MAAM,OAAO,KAAA;AACnB,QAAI,CAAC,OAAO,OAAO,aAAa,SAAU;AAC1C,QAAI,GAAG,IAAI;AAAA,EACb;AACA,SAAO,QAAQ,GAAG,IAAI,MAAM;AAC9B;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,MAAM,SAAS;AACpE;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IACrD,QACA;AACN;AAEA,SAAS,QAAQ,OAAyC;AACxD,SAAO,OAAO,KAAK,KAAK,EAAE,SAAS;AACrC;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,SAAS,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC3E;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { stringify, parseDocument } from "yaml";
2
2
  import { compactAISpecRuntime } from "../ai/SpecRuntimeEditor.model.js";
3
3
  const AI_RUNTIME_KEYS = /* @__PURE__ */ new Set([
4
- "backend",
4
+ "mode",
5
5
  "budget",
6
6
  "effort",
7
7
  "id",
@@ -11,7 +11,7 @@ const AI_RUNTIME_KEYS = /* @__PURE__ */ new Set([
11
11
  "temperature"
12
12
  ]);
13
13
  const AI_MODEL_KEYS = /* @__PURE__ */ new Set([
14
- "backend",
14
+ "mode",
15
15
  "budget",
16
16
  "effort",
17
17
  "id",
@@ -103,8 +103,8 @@ function aiToRuntime(ai) {
103
103
  const runtime = {};
104
104
  const model = stringValue(ai.model);
105
105
  if (model) runtime.model = model;
106
- const backend = stringValue(ai.backend);
107
- if (backend) runtime.backend = backend;
106
+ const specMode = stringValue(ai.mode);
107
+ if (specMode) runtime.mode = specMode;
108
108
  const id = stringValue(ai.id);
109
109
  if (id) runtime.id = id;
110
110
  const effort = stringValue(ai.effort);
@@ -217,7 +217,8 @@ ${body}`;
217
217
  }
218
218
  function splitMarkdownFrontmatter(markdown) {
219
219
  const lines = splitLinesWithEndings(markdown);
220
- if (stripLineEnding(lines[0] ?? "") !== "---") return { hasFrontmatter: false };
220
+ if (stripLineEnding(lines[0] ?? "") !== "---")
221
+ return { hasFrontmatter: false };
221
222
  for (let index = 1; index < lines.length; index += 1) {
222
223
  const line = stripLineEnding(lines[index] ?? "");
223
224
  if (line === "---" || line === "...") {
@@ -252,7 +253,8 @@ function parseYamlRecord(yaml) {
252
253
  if (firstError) return { ok: false, error: firstError.message };
253
254
  const value = doc.toJSON();
254
255
  if (value == null) return { ok: true, value: {} };
255
- if (!isRecord(value)) return { ok: false, error: "Frontmatter root must be an object" };
256
+ if (!isRecord(value))
257
+ return { ok: false, error: "Frontmatter root must be an object" };
256
258
  return { ok: true, value };
257
259
  }
258
260
  function omitControlledAIKeys(ai) {
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-frontmatter.js","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"backend\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const backend = stringValue(ai.backend);\n if (backend) runtime.backend = backend;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL) ? { cacheTTL: stringValue(extras.cacheTTL) } : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(markdown: string):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\") return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value)) return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(ai: Record<string, unknown>): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["user"],"mappings":"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"}
1
+ {"version":3,"file":"fixture-frontmatter.js","sources":["../../../src/data/FixtureEditor/fixture-frontmatter.ts"],"sourcesContent":["import { parseDocument, stringify } from \"yaml\";\nimport {\n compactAISpecRuntime,\n type AISpecRuntimeEnvVar,\n type AISpecRuntimeValue,\n} from \"../ai/SpecRuntimeEditor.model\";\n\nexport type FixtureAIExtras = {\n maxConcurrent?: number;\n cacheTTL?: string;\n};\n\nexport type FixtureFrontmatterState = {\n runtime: AISpecRuntimeValue;\n aiExtras: FixtureAIExtras;\n};\n\nexport type FixtureFrontmatterApplyOptions = {\n /** Omit model/runtime knobs so a verification fixture inherits its parent runtime. */\n inheritModel?: boolean | undefined;\n};\n\nexport type FixtureFrontmatterParseResult =\n | {\n ok: true;\n hasFrontmatter: boolean;\n frontmatter: Record<string, unknown>;\n raw: string;\n body: string;\n }\n | {\n ok: false;\n hasFrontmatter: true;\n error: string;\n raw: string;\n body: string;\n };\n\nconst AI_RUNTIME_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"prompt\",\n \"temperature\",\n]);\n\nconst AI_MODEL_KEYS = new Set([\n \"mode\",\n \"budget\",\n \"effort\",\n \"id\",\n \"model\",\n \"noCache\",\n \"temperature\",\n]);\n\nconst AI_EXTRA_KEYS = new Set([\"maxConcurrent\", \"cacheTTL\"]);\n\nexport function parseFixtureFrontmatter(\n markdown: string,\n): FixtureFrontmatterParseResult {\n const split = splitMarkdownFrontmatter(markdown);\n if (!split.hasFrontmatter) {\n return {\n ok: true,\n hasFrontmatter: false,\n frontmatter: {},\n raw: \"\",\n body: markdown,\n };\n }\n if (!split.closed) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: \"Frontmatter closing delimiter not found\",\n raw: split.raw,\n body: split.body,\n };\n }\n\n const parsed = parseYamlRecord(split.raw);\n if (!parsed.ok) {\n return {\n ok: false,\n hasFrontmatter: true,\n error: parsed.error,\n raw: split.raw,\n body: split.body,\n };\n }\n\n return {\n ok: true,\n hasFrontmatter: true,\n frontmatter: parsed.value,\n raw: split.raw,\n body: split.body,\n };\n}\n\nexport function fixtureFrontmatterState(\n frontmatter: Record<string, unknown>,\n): FixtureFrontmatterState {\n const ai = recordValue(frontmatter.ai);\n const runtime = aiToRuntime(ai);\n const envVars = envToRuntimeEnvVars(frontmatter.env);\n if (envVars.length > 0) {\n runtime.setup = { ...runtime.setup, envVars };\n }\n const aiExtras = aiToExtras(ai);\n return { runtime, aiExtras };\n}\n\nexport function applyFixtureFrontmatterState(\n markdown: string,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): string {\n const parsed = parseFixtureFrontmatter(markdown);\n const body = parsed.body;\n const existing = parsed.ok ? parsed.frontmatter : {};\n const frontmatter = frontmatterFromState(existing, state, options);\n return serializeFixtureFrontmatter(frontmatter, body);\n}\n\nexport function applyFixtureFrontmatterRaw(\n markdown: string,\n raw: string,\n): string {\n const split = splitMarkdownFrontmatter(markdown);\n const body = split.hasFrontmatter ? split.body : markdown;\n if (raw.trim() === \"\") return body;\n const normalizedRaw = raw.endsWith(\"\\n\") ? raw : `${raw}\\n`;\n return `---\\n${normalizedRaw}---\\n${body}`;\n}\n\nexport function frontmatterFromState(\n existing: Record<string, unknown>,\n state: FixtureFrontmatterState,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const next = omitKeys(existing, [\"ai\", \"env\"]);\n const currentAI = recordValue(existing.ai);\n const ai = {\n ...omitControlledAIKeys(currentAI),\n ...runtimeToAI(state.runtime, options),\n ...compactAIExtras(state.aiExtras),\n };\n const env = runtimeEnvVarsToEnv(state.runtime.setup?.envVars);\n\n if (hasKeys(ai)) next.ai = ai;\n if (hasKeys(env)) next.env = env;\n return next;\n}\n\nfunction aiToRuntime(ai: Record<string, unknown>): AISpecRuntimeValue {\n const runtime: AISpecRuntimeValue = {};\n const model = stringValue(ai.model);\n if (model) runtime.model = model;\n const specMode = stringValue(ai.mode);\n if (specMode) runtime.mode = specMode;\n const id = stringValue(ai.id);\n if (id) runtime.id = id;\n const effort = stringValue(ai.effort);\n if (effort) runtime.effort = effort;\n const temperature = numberValue(ai.temperature);\n if (temperature != null) runtime.temperature = temperature;\n if (ai.noCache === true) runtime.noCache = true;\n\n const budget = recordValue(ai.budget);\n const maxTokens = numberValue(ai.maxTokens) ?? numberValue(budget.maxTokens);\n const cost = numberValue(budget.cost);\n const maxTurns = numberValue(budget.maxTurns);\n const timeout = stringValue(budget.timeout);\n if (maxTokens != null || cost != null || maxTurns != null || timeout) {\n runtime.budget = {\n ...(cost != null ? { cost } : {}),\n ...(maxTokens != null ? { maxTokens } : {}),\n ...(maxTurns != null ? { maxTurns } : {}),\n ...(timeout ? { timeout } : {}),\n };\n }\n\n const prompt = promptToRuntimePrompt(ai.prompt);\n if (prompt) runtime.prompt = prompt;\n\n return runtime;\n}\n\nfunction runtimeToAI(\n runtime: AISpecRuntimeValue,\n options: FixtureFrontmatterApplyOptions = {},\n): Record<string, unknown> {\n const compact = compactAISpecRuntime(runtime);\n const ai: Record<string, unknown> = {};\n for (const key of AI_RUNTIME_KEYS) {\n if (options.inheritModel && AI_MODEL_KEYS.has(key)) continue;\n const value = (compact as Record<string, unknown>)[key];\n if (value != null && (key !== \"budget\" || hasKeys(recordValue(value)))) {\n ai[key] = value;\n }\n }\n const maxTokens = compact.budget?.maxTokens;\n if (maxTokens != null && !options.inheritModel) {\n delete ai.budget;\n ai.maxTokens = maxTokens;\n }\n return ai;\n}\n\nfunction promptToRuntimePrompt(\n value: unknown,\n): AISpecRuntimeValue[\"prompt\"] | undefined {\n if (typeof value === \"string\") {\n const user = stringValue(value);\n return user ? { user } : undefined;\n }\n const prompt = recordValue(value);\n const user = stringValue(prompt.user);\n const system = stringValue(prompt.system);\n const appendSystem = stringValue(prompt.appendSystem);\n const source = stringValue(prompt.source);\n const metadata = recordStringMap(prompt.metadata);\n const out = {\n ...(user ? { user } : {}),\n ...(system ? { system } : {}),\n ...(appendSystem ? { appendSystem } : {}),\n ...(source ? { source } : {}),\n ...(metadata ? { metadata } : {}),\n };\n return hasKeys(out) ? out : undefined;\n}\n\nfunction aiToExtras(ai: Record<string, unknown>): FixtureAIExtras {\n const maxConcurrent = numberValue(ai.maxConcurrent);\n const cacheTTL = stringValue(ai.cacheTTL);\n return {\n ...(maxConcurrent != null ? { maxConcurrent } : {}),\n ...(cacheTTL ? { cacheTTL } : {}),\n };\n}\n\nfunction compactAIExtras(extras: FixtureAIExtras): Record<string, unknown> {\n return {\n ...(numberValue(extras.maxConcurrent) != null\n ? { maxConcurrent: numberValue(extras.maxConcurrent) }\n : {}),\n ...(stringValue(extras.cacheTTL)\n ? { cacheTTL: stringValue(extras.cacheTTL) }\n : {}),\n };\n}\n\nfunction envToRuntimeEnvVars(value: unknown): AISpecRuntimeEnvVar[] {\n if (!isRecord(value)) return [];\n const envVars: AISpecRuntimeEnvVar[] = [];\n for (const [name, envValue] of Object.entries(value)) {\n const key = name.trim();\n if (!key || typeof envValue !== \"string\") continue;\n envVars.push({ name: key, value: envValue });\n }\n return envVars;\n}\n\nfunction runtimeEnvVarsToEnv(\n value: AISpecRuntimeEnvVar[] | undefined,\n): Record<string, unknown> {\n const env: Record<string, unknown> = {};\n for (const item of value ?? []) {\n const name = stringValue(item.name);\n if (!name) continue;\n const literal = typeof item.value === \"string\" ? item.value : undefined;\n const valueFrom =\n typeof item.valueFrom === \"string\" ? item.valueFrom : undefined;\n if (literal != null) env[name] = literal;\n else if (valueFrom) env[name] = valueFrom;\n }\n return env;\n}\n\nfunction serializeFixtureFrontmatter(\n frontmatter: Record<string, unknown>,\n body: string,\n): string {\n if (!hasKeys(frontmatter)) return body;\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n collectionStyle: \"block\",\n });\n const normalizedYaml = yaml.endsWith(\"\\n\") ? yaml : `${yaml}\\n`;\n return `---\\n${normalizedYaml}---\\n${body}`;\n}\n\nfunction splitMarkdownFrontmatter(\n markdown: string,\n):\n | { hasFrontmatter: false }\n | { hasFrontmatter: true; closed: boolean; raw: string; body: string } {\n const lines = splitLinesWithEndings(markdown);\n if (stripLineEnding(lines[0] ?? \"\") !== \"---\")\n return { hasFrontmatter: false };\n\n for (let index = 1; index < lines.length; index += 1) {\n const line = stripLineEnding(lines[index] ?? \"\");\n if (line === \"---\" || line === \"...\") {\n return {\n hasFrontmatter: true,\n closed: true,\n raw: lines.slice(1, index).join(\"\"),\n body: lines.slice(index + 1).join(\"\"),\n };\n }\n }\n\n return {\n hasFrontmatter: true,\n closed: false,\n raw: lines.slice(1).join(\"\"),\n body: \"\",\n };\n}\n\nfunction splitLinesWithEndings(text: string): string[] {\n if (text === \"\") return [];\n const lines = text.match(/[^\\n]*(?:\\n|$)/g) ?? [];\n if (lines.at(-1) === \"\") lines.pop();\n return lines;\n}\n\nfunction stripLineEnding(line: string): string {\n return line.replace(/\\r?\\n$/, \"\").trim();\n}\n\nfunction parseYamlRecord(\n yaml: string,\n): { ok: true; value: Record<string, unknown> } | { ok: false; error: string } {\n if (yaml.trim() === \"\") return { ok: true, value: {} };\n const doc = parseDocument(yaml, { prettyErrors: false });\n const firstError = doc.errors[0];\n if (firstError) return { ok: false, error: firstError.message };\n const value = doc.toJSON();\n if (value == null) return { ok: true, value: {} };\n if (!isRecord(value))\n return { ok: false, error: \"Frontmatter root must be an object\" };\n return { ok: true, value };\n}\n\nfunction omitControlledAIKeys(\n ai: Record<string, unknown>,\n): Record<string, unknown> {\n const omitted = new Set([...AI_RUNTIME_KEYS, ...AI_EXTRA_KEYS, \"maxTokens\"]);\n return omitKeys(ai, [...omitted]);\n}\n\nfunction omitKeys(\n value: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const omitted = new Set(keys);\n return Object.fromEntries(\n Object.entries(value).filter(([key]) => !omitted.has(key)),\n );\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction recordStringMap(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [rawKey, rawValue] of Object.entries(value)) {\n const key = rawKey.trim();\n if (!key || typeof rawValue !== \"string\") continue;\n out[key] = rawValue;\n }\n return hasKeys(out) ? out : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value != null && !Array.isArray(value);\n}\n"],"names":["user"],"mappings":"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"}