@flanksource/clicky-ui 0.3.29 → 0.3.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/dist/ai.cjs +48 -3
  2. package/dist/ai.cjs.map +1 -1
  3. package/dist/ai.js +46 -1
  4. package/dist/ai.js.map +1 -1
  5. package/dist/comments/CommentCard.cjs +110 -262
  6. package/dist/comments/CommentCard.cjs.map +1 -1
  7. package/dist/comments/CommentCard.d.ts +3 -1
  8. package/dist/comments/CommentCard.d.ts.map +1 -1
  9. package/dist/comments/CommentCard.js +105 -257
  10. package/dist/comments/CommentCard.js.map +1 -1
  11. package/dist/comments/CommentCardParts.cjs +95 -0
  12. package/dist/comments/CommentCardParts.cjs.map +1 -0
  13. package/dist/comments/CommentCardParts.d.ts +17 -0
  14. package/dist/comments/CommentCardParts.d.ts.map +1 -0
  15. package/dist/comments/CommentCardParts.js +95 -0
  16. package/dist/comments/CommentCardParts.js.map +1 -0
  17. package/dist/comments/CommentSidePanel.cjs +14 -7
  18. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  19. package/dist/comments/CommentSidePanel.d.ts +3 -1
  20. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  21. package/dist/comments/CommentSidePanel.js +14 -7
  22. package/dist/comments/CommentSidePanel.js.map +1 -1
  23. package/dist/comments/CommentThread.cjs +2 -0
  24. package/dist/comments/CommentThread.cjs.map +1 -1
  25. package/dist/comments/CommentThread.d.ts +2 -1
  26. package/dist/comments/CommentThread.d.ts.map +1 -1
  27. package/dist/comments/CommentThread.js +2 -0
  28. package/dist/comments/CommentThread.js.map +1 -1
  29. package/dist/comments/CommentThreadList.cjs +50 -34
  30. package/dist/comments/CommentThreadList.cjs.map +1 -1
  31. package/dist/comments/CommentThreadList.d.ts +3 -1
  32. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  33. package/dist/comments/CommentThreadList.js +50 -34
  34. package/dist/comments/CommentThreadList.js.map +1 -1
  35. package/dist/components/ComboboxMenu.cjs +4 -1
  36. package/dist/components/ComboboxMenu.cjs.map +1 -1
  37. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  38. package/dist/components/ComboboxMenu.js +5 -2
  39. package/dist/components/ComboboxMenu.js.map +1 -1
  40. package/dist/components/ComboboxTags.cjs +5 -1
  41. package/dist/components/ComboboxTags.cjs.map +1 -1
  42. package/dist/components/ComboboxTags.d.ts.map +1 -1
  43. package/dist/components/ComboboxTags.js +6 -2
  44. package/dist/components/ComboboxTags.js.map +1 -1
  45. package/dist/components/ConnectionLoggingPolicy.cjs +24 -35
  46. package/dist/components/ConnectionLoggingPolicy.cjs.map +1 -1
  47. package/dist/components/ConnectionLoggingPolicy.d.ts.map +1 -1
  48. package/dist/components/ConnectionLoggingPolicy.js +24 -35
  49. package/dist/components/ConnectionLoggingPolicy.js.map +1 -1
  50. package/dist/components/DateField.d.ts +1 -1
  51. package/dist/components/DatePicker.d.ts +1 -1
  52. package/dist/components/DateTimePicker.d.ts +1 -1
  53. package/dist/components/MultiSelect.cjs.map +1 -1
  54. package/dist/components/MultiSelect.d.ts +7 -0
  55. package/dist/components/MultiSelect.d.ts.map +1 -1
  56. package/dist/components/MultiSelect.js.map +1 -1
  57. package/dist/components/filter-bar-multi.cjs +10 -1
  58. package/dist/components/filter-bar-multi.cjs.map +1 -1
  59. package/dist/components/filter-bar-multi.d.ts.map +1 -1
  60. package/dist/components/filter-bar-multi.js +11 -2
  61. package/dist/components/filter-bar-multi.js.map +1 -1
  62. package/dist/components/mdx-editor-callout-model.d.ts +1 -1
  63. package/dist/data/MarkdownEditor.model.d.ts +1 -1
  64. package/dist/data/ai/ChatWindow.catalogs.cjs +11 -5
  65. package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -1
  66. package/dist/data/ai/ChatWindow.catalogs.d.ts +2 -1
  67. package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -1
  68. package/dist/data/ai/ChatWindow.catalogs.js +11 -5
  69. package/dist/data/ai/ChatWindow.catalogs.js.map +1 -1
  70. package/dist/data/ai/ChatWindow.cjs +1 -0
  71. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  72. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  73. package/dist/data/ai/ChatWindow.js +1 -0
  74. package/dist/data/ai/ChatWindow.js.map +1 -1
  75. package/dist/data/ai/PromptRunEditor/VariablesField.cjs +79 -0
  76. package/dist/data/ai/PromptRunEditor/VariablesField.cjs.map +1 -0
  77. package/dist/data/ai/PromptRunEditor/VariablesField.d.ts +8 -0
  78. package/dist/data/ai/PromptRunEditor/VariablesField.d.ts.map +1 -0
  79. package/dist/data/ai/PromptRunEditor/VariablesField.js +79 -0
  80. package/dist/data/ai/PromptRunEditor/VariablesField.js.map +1 -0
  81. package/dist/data/ai/PromptRunEditor/index.cjs +61 -69
  82. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  83. package/dist/data/ai/PromptRunEditor/index.d.ts +11 -1
  84. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  85. package/dist/data/ai/PromptRunEditor/index.js +61 -69
  86. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  87. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
  88. package/dist/data/ai/PromptRunEditor/model.d.ts +2 -0
  89. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
  90. package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
  91. package/dist/data/ai/SessionViewer.model.cjs +23 -8
  92. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  93. package/dist/data/ai/SessionViewer.model.d.ts +8 -0
  94. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  95. package/dist/data/ai/SessionViewer.model.js +23 -8
  96. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  97. package/dist/data/ai/SessionViewer.rows.cjs +9 -1
  98. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  99. package/dist/data/ai/SessionViewer.rows.js +9 -1
  100. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  101. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +4 -3
  102. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  103. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  104. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +2 -1
  105. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  106. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs +2 -2
  107. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs.map +1 -1
  108. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js +1 -1
  109. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs +24 -2
  110. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
  111. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
  112. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js +25 -3
  113. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
  114. package/dist/data/ai/SpecRuntimeEditor/index.cjs +4 -3
  115. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  116. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  117. package/dist/data/ai/SpecRuntimeEditor/index.js +2 -1
  118. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  119. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  120. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  121. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  122. package/dist/data/ai/SpecRuntimeEditor.model.cjs +4 -0
  123. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  124. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +4 -0
  125. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  126. package/dist/data/ai/SpecRuntimeEditor.model.js +4 -0
  127. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  128. package/dist/data/ai/index.d.ts +3 -2
  129. package/dist/data/ai/index.d.ts.map +1 -1
  130. package/dist/data/ai/runtime-profile.cjs.map +1 -1
  131. package/dist/data/ai/runtime-profile.d.ts +9 -7
  132. package/dist/data/ai/runtime-profile.d.ts.map +1 -1
  133. package/dist/data/ai/runtime-profile.js.map +1 -1
  134. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs +111 -0
  135. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.cjs.map +1 -0
  136. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts +7 -0
  137. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.d.ts.map +1 -0
  138. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js +111 -0
  139. package/dist/data/ai/runtime-profiles/OrderedPresetSelect.js.map +1 -0
  140. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +313 -0
  141. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -0
  142. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts +8 -0
  143. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -0
  144. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +313 -0
  145. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -0
  146. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs +98 -0
  147. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.cjs.map +1 -0
  148. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts +11 -0
  149. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.d.ts.map +1 -0
  150. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js +98 -0
  151. package/dist/data/ai/runtime-profiles/PermissionStrategyConditionRow.js.map +1 -0
  152. package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs +35 -0
  153. package/dist/data/ai/runtime-profiles/PresetSpecEditor.cjs.map +1 -0
  154. package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts +11 -0
  155. package/dist/data/ai/runtime-profiles/PresetSpecEditor.d.ts.map +1 -0
  156. package/dist/data/ai/runtime-profiles/PresetSpecEditor.js +35 -0
  157. package/dist/data/ai/runtime-profiles/PresetSpecEditor.js.map +1 -0
  158. package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs +179 -0
  159. package/dist/data/ai/runtime-profiles/PresetWorkspace.cjs.map +1 -0
  160. package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts +22 -0
  161. package/dist/data/ai/runtime-profiles/PresetWorkspace.d.ts.map +1 -0
  162. package/dist/data/ai/runtime-profiles/PresetWorkspace.js +179 -0
  163. package/dist/data/ai/runtime-profiles/PresetWorkspace.js.map +1 -0
  164. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs +57 -0
  165. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.cjs.map +1 -0
  166. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts +18 -0
  167. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.d.ts.map +1 -0
  168. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js +57 -0
  169. package/dist/data/ai/runtime-profiles/ProfileSpecEditor.js.map +1 -0
  170. package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs +135 -0
  171. package/dist/data/ai/runtime-profiles/ProfileWorkspace.cjs.map +1 -0
  172. package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts +23 -0
  173. package/dist/data/ai/runtime-profiles/ProfileWorkspace.d.ts.map +1 -0
  174. package/dist/data/ai/runtime-profiles/ProfileWorkspace.js +135 -0
  175. package/dist/data/ai/runtime-profiles/ProfileWorkspace.js.map +1 -0
  176. package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs +85 -0
  177. package/dist/data/ai/runtime-profiles/ResolutionInspector.cjs.map +1 -0
  178. package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts +7 -0
  179. package/dist/data/ai/runtime-profiles/ResolutionInspector.d.ts.map +1 -0
  180. package/dist/data/ai/runtime-profiles/ResolutionInspector.js +85 -0
  181. package/dist/data/ai/runtime-profiles/ResolutionInspector.js.map +1 -0
  182. package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs +42 -0
  183. package/dist/data/ai/runtime-profiles/ResolutionTrace.cjs.map +1 -0
  184. package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts +6 -0
  185. package/dist/data/ai/runtime-profiles/ResolutionTrace.d.ts.map +1 -0
  186. package/dist/data/ai/runtime-profiles/ResolutionTrace.js +42 -0
  187. package/dist/data/ai/runtime-profiles/ResolutionTrace.js.map +1 -0
  188. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs +93 -0
  189. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.cjs.map +1 -0
  190. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts +18 -0
  191. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.d.ts.map +1 -0
  192. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js +93 -0
  193. package/dist/data/ai/runtime-profiles/RuntimeLibraryList.js.map +1 -0
  194. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs +44 -0
  195. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.cjs.map +1 -0
  196. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts +6 -0
  197. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.d.ts.map +1 -0
  198. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js +44 -0
  199. package/dist/data/ai/runtime-profiles/RuntimePersistenceBar.js.map +1 -0
  200. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs +198 -0
  201. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.cjs.map +1 -0
  202. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts +12 -0
  203. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.d.ts.map +1 -0
  204. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js +198 -0
  205. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.js.map +1 -0
  206. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs +97 -0
  207. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.cjs.map +1 -0
  208. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts +26 -0
  209. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.d.ts.map +1 -0
  210. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js +97 -0
  211. package/dist/data/ai/runtime-profiles/RuntimeProfilePicker.model.js.map +1 -0
  212. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs +143 -0
  213. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.cjs.map +1 -0
  214. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts +25 -0
  215. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.d.ts.map +1 -0
  216. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js +143 -0
  217. package/dist/data/ai/runtime-profiles/RuntimeProfilesWorkspace.js.map +1 -0
  218. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs +41 -0
  219. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.cjs.map +1 -0
  220. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts +8 -0
  221. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.d.ts.map +1 -0
  222. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js +41 -0
  223. package/dist/data/ai/runtime-profiles/RuntimeStatusNotice.js.map +1 -0
  224. package/dist/data/ai/runtime-profiles/index.d.ts +20 -0
  225. package/dist/data/ai/runtime-profiles/index.d.ts.map +1 -0
  226. package/dist/data/ai/runtime-profiles/types.d.ts +50 -0
  227. package/dist/data/ai/runtime-profiles/types.d.ts.map +1 -0
  228. package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs +37 -0
  229. package/dist/data/ai/runtime-profiles/use-permission-catalog.cjs.map +1 -0
  230. package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts +5 -0
  231. package/dist/data/ai/runtime-profiles/use-permission-catalog.d.ts.map +1 -0
  232. package/dist/data/ai/runtime-profiles/use-permission-catalog.js +37 -0
  233. package/dist/data/ai/runtime-profiles/use-permission-catalog.js.map +1 -0
  234. package/dist/data/ai/runtime-profiles/use-resolution.cjs +43 -0
  235. package/dist/data/ai/runtime-profiles/use-resolution.cjs.map +1 -0
  236. package/dist/data/ai/runtime-profiles/use-resolution.d.ts +4 -0
  237. package/dist/data/ai/runtime-profiles/use-resolution.d.ts.map +1 -0
  238. package/dist/data/ai/runtime-profiles/use-resolution.js +43 -0
  239. package/dist/data/ai/runtime-profiles/use-resolution.js.map +1 -0
  240. package/dist/data/ai/runtime-profiles/use-runtime-families.cjs +38 -0
  241. package/dist/data/ai/runtime-profiles/use-runtime-families.cjs.map +1 -0
  242. package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts +3 -0
  243. package/dist/data/ai/runtime-profiles/use-runtime-families.d.ts.map +1 -0
  244. package/dist/data/ai/runtime-profiles/use-runtime-families.js +38 -0
  245. package/dist/data/ai/runtime-profiles/use-runtime-families.js.map +1 -0
  246. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs +107 -0
  247. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.cjs.map +1 -0
  248. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts +35 -0
  249. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.d.ts.map +1 -0
  250. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js +107 -0
  251. package/dist/data/ai/runtime-profiles/use-runtime-profile-picker.js.map +1 -0
  252. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  253. package/dist/data/ai/use-session-scroll.d.ts +2 -2
  254. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  255. package/dist/data/ai/use-session-scroll.js.map +1 -1
  256. package/dist/data/badge-variants.d.ts +1 -1
  257. package/dist/data/runtime/RuntimeBar.cjs +3 -2
  258. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  259. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  260. package/dist/data/runtime/RuntimeBar.js +3 -2
  261. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  262. package/dist/data/runtime/runtime-field-support.cjs +3 -3
  263. package/dist/data/runtime/runtime-field-support.cjs.map +1 -1
  264. package/dist/data/runtime/runtime-field-support.js +1 -1
  265. package/dist/data/runtime/runtime-mode.cjs +14 -47
  266. package/dist/data/runtime/runtime-mode.cjs.map +1 -1
  267. package/dist/data/runtime/runtime-mode.d.ts +5 -7
  268. package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
  269. package/dist/data/runtime/runtime-mode.js +7 -39
  270. package/dist/data/runtime/runtime-mode.js.map +1 -1
  271. package/dist/data/test-runner/TestRunner.cjs +6 -4
  272. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  273. package/dist/data/test-runner/TestRunner.d.ts +10 -1
  274. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  275. package/dist/data/test-runner/TestRunner.js +6 -4
  276. package/dist/data/test-runner/TestRunner.js.map +1 -1
  277. package/dist/data/verification/VerificationResults.cjs +99 -0
  278. package/dist/data/verification/VerificationResults.cjs.map +1 -0
  279. package/dist/data/verification/VerificationResults.d.ts +27 -0
  280. package/dist/data/verification/VerificationResults.d.ts.map +1 -0
  281. package/dist/data/verification/VerificationResults.js +99 -0
  282. package/dist/data/verification/VerificationResults.js.map +1 -0
  283. package/dist/data/verification/adapterViews.cjs +116 -0
  284. package/dist/data/verification/adapterViews.cjs.map +1 -0
  285. package/dist/data/verification/adapterViews.d.ts +13 -0
  286. package/dist/data/verification/adapterViews.d.ts.map +1 -0
  287. package/dist/data/verification/adapterViews.js +116 -0
  288. package/dist/data/verification/adapterViews.js.map +1 -0
  289. package/dist/data/verification/adapters.cjs +26 -0
  290. package/dist/data/verification/adapters.cjs.map +1 -0
  291. package/dist/data/verification/adapters.d.ts +6 -0
  292. package/dist/data/verification/adapters.d.ts.map +1 -0
  293. package/dist/data/verification/adapters.js +26 -0
  294. package/dist/data/verification/adapters.js.map +1 -0
  295. package/dist/data/verification/index.d.ts +5 -0
  296. package/dist/data/verification/index.d.ts.map +1 -0
  297. package/dist/data/verification/verify-report.cjs +58 -0
  298. package/dist/data/verification/verify-report.cjs.map +1 -0
  299. package/dist/data/verification/verify-report.d.ts +96 -0
  300. package/dist/data/verification/verify-report.d.ts.map +1 -0
  301. package/dist/data/verification/verify-report.js +58 -0
  302. package/dist/data/verification/verify-report.js.map +1 -0
  303. package/dist/data/verification/verifyReportTests.cjs +83 -0
  304. package/dist/data/verification/verifyReportTests.cjs.map +1 -0
  305. package/dist/data/verification/verifyReportTests.d.ts +13 -0
  306. package/dist/data/verification/verifyReportTests.d.ts.map +1 -0
  307. package/dist/data/verification/verifyReportTests.js +83 -0
  308. package/dist/data/verification/verifyReportTests.js.map +1 -0
  309. package/dist/data/version-info.cjs +3 -3
  310. package/dist/data/version-info.js +3 -3
  311. package/dist/data.cjs +10 -0
  312. package/dist/data.cjs.map +1 -1
  313. package/dist/data.d.ts +1 -0
  314. package/dist/data.d.ts.map +1 -1
  315. package/dist/data.js +10 -0
  316. package/dist/data.js.map +1 -1
  317. package/dist/index.cjs +62 -0
  318. package/dist/index.cjs.map +1 -1
  319. package/dist/index.js +62 -0
  320. package/dist/index.js.map +1 -1
  321. package/dist/lib/permission-strategies.cjs +155 -0
  322. package/dist/lib/permission-strategies.cjs.map +1 -0
  323. package/dist/lib/permission-strategies.d.ts +35 -0
  324. package/dist/lib/permission-strategies.d.ts.map +1 -0
  325. package/dist/lib/permission-strategies.js +155 -0
  326. package/dist/lib/permission-strategies.js.map +1 -0
  327. package/dist/lib/runtime-family.cjs +51 -0
  328. package/dist/lib/runtime-family.cjs.map +1 -0
  329. package/dist/lib/runtime-family.d.ts +25 -0
  330. package/dist/lib/runtime-family.d.ts.map +1 -0
  331. package/dist/lib/runtime-family.js +51 -0
  332. package/dist/lib/runtime-family.js.map +1 -0
  333. package/dist/lib/runtime-profile-model.cjs +129 -0
  334. package/dist/lib/runtime-profile-model.cjs.map +1 -0
  335. package/dist/lib/runtime-profile-model.d.ts +30 -0
  336. package/dist/lib/runtime-profile-model.d.ts.map +1 -0
  337. package/dist/lib/runtime-profile-model.js +129 -0
  338. package/dist/lib/runtime-profile-model.js.map +1 -0
  339. package/dist/styles.css +1 -1
  340. package/dist/utils.cjs +52 -0
  341. package/dist/utils.cjs.map +1 -1
  342. package/dist/utils.d.ts +5 -0
  343. package/dist/utils.d.ts.map +1 -1
  344. package/dist/utils.js +53 -1
  345. package/dist/utils.js.map +1 -1
  346. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"sourcesContent":["import { useId, useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport { JsonSchemaForm } from \"../../../components/JsonSchemaForm\";\nimport type { JsonSchemaObject } from \"../../../components/json-schema-form-types\";\nimport { UiAdd, UiGearSix, UiTrash } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { Icon } from \"../../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../../chat/effort-icons\";\nimport { AttachmentButton, AttachmentList } from \"../../chat/Attachment\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"../../chat/attachment-upload\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FileUIPart } from \"../../chat/types\";\nimport { RuntimeBar } from \"../../runtime/RuntimeBar\";\nimport { runtimeModelForValue } from \"../../runtime/RuntimeBar.model\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n labelForMode,\n} from \"../../runtime/runtime-mode\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecRuntimeSandboxCreateConfig } from \"../SandboxCreateWizard.model\";\nimport type { SpecRuntimeCLIOptions } from \"../SpecRuntimeEditor/CLIArgsSection\";\nimport type { SpecRuntimeSandboxCatalog } from \"../SpecRuntimeEditor/types\";\nimport type {\n SpecRuntimeSecretSelectorConfig,\n SpecSectionId,\n} from \"../SpecRuntimeEditor/types\";\nimport { withPrompt } from \"../SpecRuntimeEditor/update\";\nimport type { AISpecRuntimePermissionCatalog } from \"../SpecRuntimeEditor.model\";\nimport { runtimeRows, withRuntimeRows, type AIPromptRunValue } from \"./model\";\n\nexport type PromptRunEditorProps = {\n value: AIPromptRunValue;\n onChange: (value: AIPromptRunValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Sandbox adapter catalog; enables the spec editor's Sandbox section. */\n sandboxCatalog?: SpecRuntimeSandboxCatalog | undefined;\n /** Host-owned sandbox creation and credential-reference adapter. */\n sandboxCreate?: SpecRuntimeSandboxCreateConfig | undefined;\n reasoningEfforts?: string[] | undefined;\n\n /** Schema-driven variables form; omit to render a raw-JSON editor. */\n variablesSchema?: JsonSchemaObject | undefined;\n /** Fires false while raw-JSON variables fail to parse; always true with a schema. */\n onVariablesValidityChange?: ((valid: boolean) => void) | undefined;\n\n /** Host-supplied editor for the `prompt.user` override; defaults to a textarea. */\n promptEditor?: ReactNode | undefined;\n promptLabel?: string | undefined;\n promptPlaceholder?: string | undefined;\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n\n /** Extra fields injected inside the Runtime block, below Model/Effort. */\n children?: ReactNode | undefined;\n header?: ReactNode | undefined;\n footer?: ReactNode | undefined;\n className?: string | undefined;\n\n editSpecLabel?: string | undefined;\n specModalTitle?: string | undefined;\n /** Restrict which SpecRuntimeEditor sections the \"Edit spec\" modal shows. */\n specSections?: readonly SpecSectionId[] | undefined;\n};\n\n// The inline \"prompt + variables + runtime\" composer shared by captain's prompt\n// workbench and gavel's todo run dialog. It edits Captain's complete prompt-run\n// request without making hosts project that contract into editor-specific state.\n// Hosts should mount it with a `key` per prompt/todo so internal draft state\n// (raw-JSON text, modal open) resets on selection change.\nexport function PromptRunEditor({\n value,\n onChange,\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sandboxCatalog,\n sandboxCreate,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n variablesSchema,\n onVariablesValidityChange,\n promptEditor,\n promptLabel = \"User prompt\",\n promptPlaceholder = \"Override the rendered user prompt\",\n enableAttachments = false,\n attachmentUpload,\n attachmentLimits,\n children,\n header,\n footer,\n className,\n editSpecLabel = \"Edit spec\",\n specModalTitle = \"Runtime spec\",\n specSections,\n}: PromptRunEditorProps) {\n const [specOpen, setSpecOpen] = useState(false);\n const spec = value.spec ?? {};\n const rows = runtimeRows(value);\n const selectedModel = runtimeModelForValue(models, spec);\n const resolvedAttachmentUpload = useMemo(\n () => attachmentUpload ?? createAttachmentUploadAdapter(),\n [attachmentUpload],\n );\n const attachmentFiles: FileUIPart[] = (spec.prompt?.attachments ?? []).map(\n (attachment) => ({\n type: \"file\",\n url: attachment.id\n ? `/api/attachments/${attachment.id}`\n : (attachment.url ?? \"\"),\n mediaType: attachment.mediaType ?? \"application/octet-stream\",\n ...(attachment.id ? { attachmentId: attachment.id } : {}),\n ...(attachment.size != null ? { size: attachment.size } : {}),\n ...(attachment.filename ? { filename: attachment.filename } : {}),\n ...(!attachment.filename && attachment.path\n ? { filename: attachment.path }\n : {}),\n }),\n ) as FileUIPart[];\n\n return (\n <div className={cn(\"grid gap-density-4\", className)}>\n {header}\n\n <Block title=\"Runtime\">\n <div className=\"grid gap-density-2\">\n {rows.map((runtime, index) => (\n <div\n key={index}\n role=\"group\"\n aria-label={`Runtime ${index + 1}`}\n className=\"flex min-w-0 items-center gap-density-2\"\n >\n <RuntimeBar\n value={runtime}\n onChange={(next) =>\n onChange(\n withRuntimeRows(\n value,\n rows.map((item, itemIndex) =>\n itemIndex === index ? next : item,\n ),\n ),\n )\n }\n models={models}\n families={families}\n reasoningEfforts={reasoningEfforts}\n ariaLabel={`Runtime ${index + 1} controls`}\n />\n {rows.length > 1 && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove runtime ${index + 1}`}\n onClick={() =>\n onChange(\n withRuntimeRows(\n value,\n rows.filter((_, itemIndex) => itemIndex !== index),\n ),\n )\n }\n >\n <Icon icon={UiTrash} className=\"size-4\" />\n </Button>\n )}\n </div>\n ))}\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Add runtime\"\n onClick={() =>\n onChange(\n withRuntimeRows(value, [\n ...rows,\n rows[0]?.mode ? { mode: rows[0].mode } : {},\n ]),\n )\n }\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n Add runtime\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setSpecOpen(true)}\n >\n <Icon icon={UiGearSix} className=\"size-4\" />\n {editSpecLabel}\n </Button>\n </div>\n </div>\n {children}\n </Block>\n\n <Block title=\"Variables\">\n <VariablesField\n {...(variablesSchema ? { schema: variablesSchema } : {})}\n value={value.variables ?? {}}\n onChange={(variables) => onChange({ ...value, variables })}\n {...(onVariablesValidityChange\n ? { onValidityChange: onVariablesValidityChange }\n : {})}\n />\n </Block>\n\n <Block title={promptLabel}>\n {promptEditor ?? (\n <textarea\n value={spec.prompt?.user ?? \"\"}\n onChange={(event) =>\n onChange({\n ...value,\n spec: withPrompt(spec, { user: event.target.value }),\n })\n }\n spellCheck={false}\n placeholder={promptPlaceholder}\n aria-label={promptLabel}\n className=\"min-h-[7rem] w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 text-sm outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n {enableAttachments && (\n <div className=\"space-y-density-2\">\n <AttachmentList\n files={attachmentFiles}\n onRemove={(index) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: (spec.prompt?.attachments ?? []).filter(\n (_, itemIndex) => itemIndex !== index,\n ),\n }),\n })\n }\n />\n <AttachmentButton\n files={attachmentFiles}\n upload={resolvedAttachmentUpload}\n onAdd={(parts) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: [\n ...(spec.prompt?.attachments ?? []),\n ...parts.map((part) => {\n const uploaded = part as AttachmentFilePart;\n return {\n id: uploaded.attachmentId,\n mediaType: uploaded.mediaType,\n size: uploaded.size,\n ...(uploaded.filename\n ? { filename: uploaded.filename }\n : {}),\n };\n }),\n ],\n }),\n })\n }\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n </div>\n )}\n </Block>\n\n {footer}\n\n <Modal\n open={specOpen}\n onClose={() => setSpecOpen(false)}\n title={specModalTitle}\n size=\"full\"\n closeOnEsc\n className=\"h-[95vh]\"\n >\n <SpecRuntimeEditor\n value={spec}\n onChange={(next) => onChange({ ...value, spec: next })}\n models={models}\n families={families}\n tools={tools}\n {...(permissionCatalog ? { permissionCatalog } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n {...(cliOptions ? { cliOptions } : {})}\n {...(sandboxCatalog ? { sandboxCatalog } : {})}\n {...(sandboxCreate ? { sandboxCreate } : {})}\n {...(specSections ? { sections: specSections } : {})}\n onSave={() => setSpecOpen(false)}\n onCancel={() => setSpecOpen(false)}\n saveLabel=\"Done\"\n footerStatus={labelForMode(spec.mode, families)}\n />\n </Modal>\n </div>\n );\n}\n\nfunction Block({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"space-y-density-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n {children}\n </section>\n );\n}\n\n// Variables are edited via the prompt's declared schema when present, otherwise\n// as a raw JSON object; the raw text is held locally and only committed to the\n// host when it parses to an object.\nfunction VariablesField({\n schema,\n value,\n onChange,\n onValidityChange,\n}: {\n schema?: JsonSchemaObject | undefined;\n value: Record<string, unknown>;\n onChange: (next: Record<string, unknown>) => void;\n onValidityChange?: ((valid: boolean) => void) | undefined;\n}) {\n const idPrefix = useId();\n const [rawText, setRawText] = useState(() => stringifyVariables(value));\n const [rawError, setRawError] = useState<string | null>(null);\n\n if (schema) {\n return (\n <JsonSchemaForm\n idPrefix={`prompt-vars-${idPrefix}`}\n schema={schema}\n value={value}\n onChange={(next) => onChange(next as Record<string, unknown>)}\n size=\"sm\"\n />\n );\n }\n\n const commit = (text: string) => {\n setRawText(text);\n if (!text.trim()) {\n setRawError(null);\n onValidityChange?.(true);\n onChange({});\n return;\n }\n try {\n const parsed = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n setRawError(null);\n onValidityChange?.(true);\n onChange(parsed as Record<string, unknown>);\n } else {\n setRawError(\"Expected a JSON object\");\n onValidityChange?.(false);\n }\n } catch (error) {\n setRawError(error instanceof Error ? error.message : \"Invalid JSON\");\n onValidityChange?.(false);\n }\n };\n\n return (\n <div className=\"space-y-1\">\n <textarea\n value={rawText}\n onChange={(event) => commit(event.target.value)}\n spellCheck={false}\n placeholder=\"{}\"\n aria-label=\"Variables JSON\"\n className=\"h-28 w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 font-mono text-xs outline-none focus:ring-2 focus:ring-ring\"\n />\n {rawError && <div className=\"text-xs text-destructive\">{rawError}</div>}\n </div>\n );\n}\n\nfunction stringifyVariables(value: Record<string, unknown>) {\n if (!value || Object.keys(value).length === 0) return \"{}\";\n return JSON.stringify(value, null, 2);\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/data/ai/PromptRunEditor/index.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../../components/button\";\nimport type { JsonSchemaObject } from \"../../../components/json-schema-form-types\";\nimport { UiAdd, UiGearSix, UiLayers, UiTrash } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport { Modal } from \"../../../overlay/Modal\";\nimport { Icon } from \"../../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../../chat/effort-icons\";\nimport { AttachmentButton, AttachmentList } from \"../../chat/Attachment\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"../../chat/attachment-upload\";\nimport type { ChatModel, ToolMeta } from \"../../chat/types\";\nimport type { FileUIPart } from \"../../chat/types\";\nimport { RuntimeBar } from \"../../runtime/RuntimeBar\";\nimport { runtimeModelForValue } from \"../../runtime/RuntimeBar.model\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n labelForMode,\n} from \"../../runtime/runtime-mode\";\nimport { SpecRuntimeEditor } from \"../SpecRuntimeEditor\";\nimport type { SpecRuntimeSandboxCreateConfig } from \"../SandboxCreateWizard.model\";\nimport type { SpecRuntimeCLIOptions } from \"../SpecRuntimeEditor/CLIArgsSection\";\nimport type { SpecRuntimeSandboxCatalog } from \"../SpecRuntimeEditor/types\";\nimport type {\n SpecRuntimeSecretSelectorConfig,\n SpecSectionId,\n} from \"../SpecRuntimeEditor/types\";\nimport { withPrompt } from \"../SpecRuntimeEditor/update\";\nimport type { AISpecRuntimePermissionCatalog } from \"../SpecRuntimeEditor.model\";\nimport type {\n ResolvedRuntimeProfile,\n ResolvedRuntimeSpec,\n RuntimePreset,\n RuntimeProfile,\n RuntimeProfileResolveRequest,\n} from \"../runtime-profile\";\nimport { authoredRuntimeSpec } from \"../../../lib/runtime-profile-model\";\nimport { RuntimeProfilePicker } from \"../runtime-profiles/RuntimeProfilePicker\";\nimport {\n inheritedRuntime,\n profileForRef,\n} from \"../runtime-profiles/RuntimeProfilePicker.model\";\nimport { useRuntimeProfilePicker } from \"../runtime-profiles/use-runtime-profile-picker\";\nimport { runtimeRows, withRuntimeRows, type AIPromptRunValue } from \"./model\";\nimport { VariablesField } from \"./VariablesField\";\n\nexport type PromptRunEditorProps = {\n value: AIPromptRunValue;\n onChange: (value: AIPromptRunValue) => void;\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n tools?: ToolMeta[] | undefined;\n permissionCatalog?: AISpecRuntimePermissionCatalog | undefined;\n secretSelector?: SpecRuntimeSecretSelectorConfig | undefined;\n cliOptions?: SpecRuntimeCLIOptions | undefined;\n /** Sandbox adapter catalog; enables the spec editor's Sandbox section. */\n sandboxCatalog?: SpecRuntimeSandboxCatalog | undefined;\n /** Host-owned sandbox creation and credential-reference adapter. */\n sandboxCreate?: SpecRuntimeSandboxCreateConfig | undefined;\n reasoningEfforts?: string[] | undefined;\n\n /** Schema-driven variables form; omit to render a raw-JSON editor. */\n variablesSchema?: JsonSchemaObject | undefined;\n /** Fires false while raw-JSON variables fail to parse; always true with a schema. */\n onVariablesValidityChange?: ((valid: boolean) => void) | undefined;\n\n /** Host-supplied editor for the `prompt.user` override; defaults to a textarea. */\n promptEditor?: ReactNode | undefined;\n promptLabel?: string | undefined;\n promptPlaceholder?: string | undefined;\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n\n /** Extra fields injected inside the Runtime block, below Model/Effort. */\n children?: ReactNode | undefined;\n header?: ReactNode | undefined;\n footer?: ReactNode | undefined;\n className?: string | undefined;\n\n editSpecLabel?: string | undefined;\n specModalTitle?: string | undefined;\n /** Restrict which SpecRuntimeEditor sections the \"Edit spec\" modal shows. */\n specSections?: readonly SpecSectionId[] | undefined;\n\n /** Saved runtime profiles; enables the profile picker inside the spec modal. */\n profiles?: RuntimeProfile[] | undefined;\n /** Presets the profiles reference, for ordering and inherited model/mode. */\n presets?: RuntimePreset[] | undefined;\n onSaveProfile?:\n | ((profile: RuntimeProfile) => Promise<RuntimeProfile>)\n | undefined;\n onCreateProfile?:\n | ((profile: RuntimeProfile) => Promise<RuntimeProfile>)\n | undefined;\n onResolveProfile?:\n | ((\n request: RuntimeProfileResolveRequest,\n ) => Promise<ResolvedRuntimeProfile>)\n | undefined;\n /** The last render's resolved spec and layer trace. */\n resolution?: ResolvedRuntimeSpec | undefined;\n};\n\n// The inline \"prompt + variables + runtime\" composer shared by captain's prompt\n// workbench and gavel's todo run dialog. It edits Captain's complete prompt-run\n// request without making hosts project that contract into editor-specific state.\n// Hosts should mount it with a `key` per prompt/todo so internal draft state\n// (raw-JSON text, modal open) resets on selection change.\nexport function PromptRunEditor({\n value,\n onChange,\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n tools = [],\n permissionCatalog,\n secretSelector,\n cliOptions,\n sandboxCatalog,\n sandboxCreate,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n variablesSchema,\n onVariablesValidityChange,\n promptEditor,\n promptLabel = \"User prompt\",\n promptPlaceholder = \"Override the rendered user prompt\",\n enableAttachments = false,\n attachmentUpload,\n attachmentLimits,\n children,\n header,\n footer,\n className,\n editSpecLabel = \"Edit spec\",\n specModalTitle = \"Runtime spec\",\n specSections,\n profiles,\n presets = [],\n onSaveProfile,\n onCreateProfile,\n onResolveProfile,\n resolution,\n}: PromptRunEditorProps) {\n const [specOpen, setSpecOpen] = useState(false);\n const spec = value.spec ?? {};\n const rows = runtimeRows(value);\n const selectedModel = runtimeModelForValue(models, spec);\n const picker = useRuntimeProfilePicker({\n value,\n onChange,\n profiles: profiles ?? [],\n presets,\n onSaveProfile,\n onCreateProfile,\n onResolveProfile,\n });\n const profileDraft =\n profiles !== undefined && picker.state.layer === \"profile\"\n ? picker.state.draft\n : undefined;\n const runRuntime = inheritedRuntime({\n draft: picker.state.draft,\n presets,\n resolution,\n });\n const presetRuntime = profileDraft\n ? authoredRuntimeSpec({ ...profileDraft, spec: {} }, presets)\n : {};\n const editorRuntime = profileDraft ? presetRuntime : runRuntime;\n const selectedProfile = profileForRef(value.runtimeProfile, profiles ?? []);\n const resolvedAttachmentUpload = useMemo(\n () => attachmentUpload ?? createAttachmentUploadAdapter(),\n [attachmentUpload],\n );\n const attachmentFiles: FileUIPart[] = (spec.prompt?.attachments ?? []).map(\n (attachment) => ({\n type: \"file\",\n url: attachment.id\n ? `/api/attachments/${attachment.id}`\n : (attachment.url ?? \"\"),\n mediaType: attachment.mediaType ?? \"application/octet-stream\",\n ...(attachment.id ? { attachmentId: attachment.id } : {}),\n ...(attachment.size != null ? { size: attachment.size } : {}),\n ...(attachment.filename ? { filename: attachment.filename } : {}),\n ...(!attachment.filename && attachment.path\n ? { filename: attachment.path }\n : {}),\n }),\n ) as FileUIPart[];\n\n return (\n <div className={cn(\"grid gap-density-4\", className)}>\n {header}\n\n <Block title=\"Runtime\">\n <div className=\"grid gap-density-2\">\n {rows.map((runtime, index) => (\n <div\n key={index}\n role=\"group\"\n aria-label={`Runtime ${index + 1}`}\n className=\"flex min-w-0 items-center gap-density-2\"\n >\n <RuntimeBar\n value={runtime}\n onChange={(next) =>\n onChange(\n withRuntimeRows(\n value,\n rows.map((item, itemIndex) =>\n itemIndex === index ? next : item,\n ),\n ),\n )\n }\n models={models}\n families={families}\n reasoningEfforts={reasoningEfforts}\n ariaLabel={`Runtime ${index + 1} controls`}\n />\n {rows.length > 1 && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove runtime ${index + 1}`}\n onClick={() =>\n onChange(\n withRuntimeRows(\n value,\n rows.filter((_, itemIndex) => itemIndex !== index),\n ),\n )\n }\n >\n <Icon icon={UiTrash} className=\"size-4\" />\n </Button>\n )}\n </div>\n ))}\n <div className=\"flex flex-wrap items-center gap-density-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label=\"Add runtime\"\n onClick={() =>\n onChange(\n withRuntimeRows(value, [\n ...rows,\n rows[0]?.mode ? { mode: rows[0].mode } : {},\n ]),\n )\n }\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n Add runtime\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setSpecOpen(true)}\n >\n <Icon icon={UiGearSix} className=\"size-4\" />\n {editSpecLabel}\n </Button>\n {value.runtimeProfile && (\n <span\n data-testid=\"runtime-profile-chip\"\n className=\"inline-flex items-center gap-1 rounded-full border border-violet-500/30 bg-violet-500/10 px-2 py-0.5 text-xs font-medium text-violet-700 dark:text-violet-300\"\n >\n <Icon icon={UiLayers} className=\"size-3.5\" />\n Profile · {selectedProfile?.name ?? value.runtimeProfile}\n </span>\n )}\n </div>\n </div>\n {children}\n </Block>\n\n <Block title=\"Variables\">\n <VariablesField\n {...(variablesSchema ? { schema: variablesSchema } : {})}\n value={value.variables ?? {}}\n onChange={(variables) => onChange({ ...value, variables })}\n {...(onVariablesValidityChange\n ? { onValidityChange: onVariablesValidityChange }\n : {})}\n />\n </Block>\n\n <Block title={promptLabel}>\n {promptEditor ?? (\n <textarea\n value={spec.prompt?.user ?? \"\"}\n onChange={(event) =>\n onChange({\n ...value,\n spec: withPrompt(spec, { user: event.target.value }),\n })\n }\n spellCheck={false}\n placeholder={promptPlaceholder}\n aria-label={promptLabel}\n className=\"min-h-[7rem] w-full resize-y rounded-md border border-border bg-background px-density-2 py-density-1 text-sm outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n {enableAttachments && (\n <div className=\"space-y-density-2\">\n <AttachmentList\n files={attachmentFiles}\n onRemove={(index) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: (spec.prompt?.attachments ?? []).filter(\n (_, itemIndex) => itemIndex !== index,\n ),\n }),\n })\n }\n />\n <AttachmentButton\n files={attachmentFiles}\n upload={resolvedAttachmentUpload}\n onAdd={(parts) =>\n onChange({\n ...value,\n spec: withPrompt(spec, {\n attachments: [\n ...(spec.prompt?.attachments ?? []),\n ...parts.map((part) => {\n const uploaded = part as AttachmentFilePart;\n return {\n id: uploaded.attachmentId,\n mediaType: uploaded.mediaType,\n size: uploaded.size,\n ...(uploaded.filename\n ? { filename: uploaded.filename }\n : {}),\n };\n }),\n ],\n }),\n })\n }\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n </div>\n )}\n </Block>\n\n {footer}\n\n <Modal\n open={specOpen}\n onClose={() => setSpecOpen(false)}\n title={specModalTitle}\n size=\"full\"\n closeOnEsc\n className=\"h-[95vh]\"\n >\n <SpecRuntimeEditor\n value={profileDraft ? profileDraft.spec : spec}\n onChange={(next) =>\n profileDraft\n ? picker.editDraft({ ...profileDraft, spec: next })\n : onChange({ ...value, spec: next })\n }\n models={models}\n families={families}\n tools={tools}\n effectiveModel={editorRuntime.model}\n effectiveMode={editorRuntime.mode}\n {...(permissionCatalog ? { permissionCatalog } : {})}\n {...(secretSelector ? { secretSelector } : {})}\n {...(cliOptions ? { cliOptions } : {})}\n {...(sandboxCatalog ? { sandboxCatalog } : {})}\n {...(sandboxCreate ? { sandboxCreate } : {})}\n {...(specSections ? { sections: specSections } : {})}\n {...(profiles !== undefined\n ? {\n beforeSections: (\n <RuntimeProfilePicker\n controller={picker}\n profiles={profiles}\n presets={presets}\n resolution={resolution}\n effectiveRuntime={runRuntime}\n />\n ),\n }\n : {})}\n onSave={() => setSpecOpen(false)}\n onCancel={() => setSpecOpen(false)}\n saveLabel=\"Done\"\n footerStatus={\n profileDraft\n ? `Editing profile «${profileDraft.name}»`\n : labelForMode(spec.mode, families)\n }\n />\n </Modal>\n </div>\n );\n}\n\nfunction Block({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section className=\"space-y-density-2\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n {children}\n </section>\n );\n}\n"],"names":["_a"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model.cjs","sources":["../../../../src/data/ai/PromptRunEditor/model.ts"],"sourcesContent":["import type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\n\nexport type AIPromptRunSpec = AISpecRuntimeValue & {\n messages?: unknown[];\n toolPreferences?: unknown;\n toolApproval?: unknown;\n};\n\nexport type AISpecRuntimeModel = Pick<\n AISpecRuntimeValue,\n \"model\" | \"id\" | \"mode\" | \"temperature\" | \"effort\" | \"noCache\" | \"fallbacks\"\n>;\n\nexport type AIPromptRunValue = {\n variables?: Record<string, unknown>;\n spec?: AIPromptRunSpec;\n runtimes?: AISpecRuntimeModel[];\n chat?: boolean;\n};\n\nconst MODEL_KEYS = [\n \"model\",\n \"id\",\n \"mode\",\n \"temperature\",\n \"effort\",\n \"noCache\",\n \"fallbacks\",\n] as const satisfies readonly (keyof AISpecRuntimeModel)[];\n\nexport function runtimeModelFromSpec(\n spec: AIPromptRunSpec | undefined,\n): AISpecRuntimeModel {\n if (!spec) return {};\n const model: AISpecRuntimeModel = {};\n for (const key of MODEL_KEYS) {\n const value = spec[key];\n if (value !== undefined) {\n Object.assign(model, { [key]: value });\n }\n }\n return model;\n}\n\nexport function runtimeRows(value: AIPromptRunValue): AISpecRuntimeModel[] {\n return value.runtimes?.length\n ? value.runtimes\n : [runtimeModelFromSpec(value.spec)];\n}\n\nexport function withRuntimeRows(\n value: AIPromptRunValue,\n rows: AISpecRuntimeModel[],\n): AIPromptRunValue {\n const first = rows[0] ?? {};\n const spec = withRuntimeModel(value.spec ?? {}, first);\n if (rows.length <= 1) {\n const next = { ...value, spec };\n delete next.runtimes;\n return next;\n }\n return { ...value, spec, runtimes: rows };\n}\n\nfunction withRuntimeModel(\n spec: AIPromptRunSpec,\n model: AISpecRuntimeModel,\n): AIPromptRunSpec {\n const next = { ...spec };\n for (const key of MODEL_KEYS) {\n delete next[key];\n }\n return { ...next, ...model };\n}\n"],"names":[],"mappings":";;AAoBA,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBACd,MACoB;AACpB,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,QAAM,QAA4B,CAAA;AAClC,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,UAAU,QAAW;AACvB,aAAO,OAAO,OAAO,EAAE,CAAC,GAAG,GAAG,OAAO;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAA+C;;AACzE,WAAO,WAAM,aAAN,mBAAgB,UACnB,MAAM,WACN,CAAC,qBAAqB,MAAM,IAAI,CAAC;AACvC;AAEO,SAAS,gBACd,OACA,MACkB;AAClB,QAAM,QAAQ,KAAK,CAAC,KAAK,CAAA;AACzB,QAAM,OAAO,iBAAiB,MAAM,QAAQ,CAAA,GAAI,KAAK;AACrD,MAAI,KAAK,UAAU,GAAG;AACpB,UAAM,OAAO,EAAE,GAAG,OAAO,KAAA;AACzB,WAAO,KAAK;AACZ,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,OAAO,MAAM,UAAU,KAAA;AACrC;AAEA,SAAS,iBACP,MACA,OACiB;AACjB,QAAM,OAAO,EAAE,GAAG,KAAA;AAClB,aAAW,OAAO,YAAY;AAC5B,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,MAAA;AACvB;;;;"}
1
+ {"version":3,"file":"model.cjs","sources":["../../../../src/data/ai/PromptRunEditor/model.ts"],"sourcesContent":["import type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\n\nexport type AIPromptRunSpec = AISpecRuntimeValue & {\n messages?: unknown[];\n toolPreferences?: unknown;\n toolApproval?: unknown;\n};\n\nexport type AISpecRuntimeModel = Pick<\n AISpecRuntimeValue,\n \"model\" | \"id\" | \"mode\" | \"temperature\" | \"effort\" | \"noCache\" | \"fallbacks\"\n>;\n\nexport type AIPromptRunValue = {\n variables?: Record<string, unknown>;\n spec?: AIPromptRunSpec;\n runtimes?: AISpecRuntimeModel[];\n chat?: boolean;\n /** Saved runtime profile (id or name) layered under `spec` by the host. */\n runtimeProfile?: string;\n};\n\nconst MODEL_KEYS = [\n \"model\",\n \"id\",\n \"mode\",\n \"temperature\",\n \"effort\",\n \"noCache\",\n \"fallbacks\",\n] as const satisfies readonly (keyof AISpecRuntimeModel)[];\n\nexport function runtimeModelFromSpec(\n spec: AIPromptRunSpec | undefined,\n): AISpecRuntimeModel {\n if (!spec) return {};\n const model: AISpecRuntimeModel = {};\n for (const key of MODEL_KEYS) {\n const value = spec[key];\n if (value !== undefined) {\n Object.assign(model, { [key]: value });\n }\n }\n return model;\n}\n\nexport function runtimeRows(value: AIPromptRunValue): AISpecRuntimeModel[] {\n return value.runtimes?.length\n ? value.runtimes\n : [runtimeModelFromSpec(value.spec)];\n}\n\nexport function withRuntimeRows(\n value: AIPromptRunValue,\n rows: AISpecRuntimeModel[],\n): AIPromptRunValue {\n const first = rows[0] ?? {};\n const spec = withRuntimeModel(value.spec ?? {}, first);\n if (rows.length <= 1) {\n const next = { ...value, spec };\n delete next.runtimes;\n return next;\n }\n return { ...value, spec, runtimes: rows };\n}\n\nfunction withRuntimeModel(\n spec: AIPromptRunSpec,\n model: AISpecRuntimeModel,\n): AIPromptRunSpec {\n const next = { ...spec };\n for (const key of MODEL_KEYS) {\n delete next[key];\n }\n return { ...next, ...model };\n}\n"],"names":[],"mappings":";;AAsBA,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBACd,MACoB;AACpB,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,QAAM,QAA4B,CAAA;AAClC,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,UAAU,QAAW;AACvB,aAAO,OAAO,OAAO,EAAE,CAAC,GAAG,GAAG,OAAO;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAA+C;;AACzE,WAAO,WAAM,aAAN,mBAAgB,UACnB,MAAM,WACN,CAAC,qBAAqB,MAAM,IAAI,CAAC;AACvC;AAEO,SAAS,gBACd,OACA,MACkB;AAClB,QAAM,QAAQ,KAAK,CAAC,KAAK,CAAA;AACzB,QAAM,OAAO,iBAAiB,MAAM,QAAQ,CAAA,GAAI,KAAK;AACrD,MAAI,KAAK,UAAU,GAAG;AACpB,UAAM,OAAO,EAAE,GAAG,OAAO,KAAA;AACzB,WAAO,KAAK;AACZ,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,OAAO,MAAM,UAAU,KAAA;AACrC;AAEA,SAAS,iBACP,MACA,OACiB;AACjB,QAAM,OAAO,EAAE,GAAG,KAAA;AAClB,aAAW,OAAO,YAAY;AAC5B,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,MAAA;AACvB;;;;"}
@@ -10,6 +10,8 @@ export type AIPromptRunValue = {
10
10
  spec?: AIPromptRunSpec;
11
11
  runtimes?: AISpecRuntimeModel[];
12
12
  chat?: boolean;
13
+ /** Saved runtime profile (id or name) layered under `spec` by the host. */
14
+ runtimeProfile?: string;
13
15
  };
14
16
  export declare function runtimeModelFromSpec(spec: AIPromptRunSpec | undefined): AISpecRuntimeModel;
15
17
  export declare function runtimeRows(value: AIPromptRunValue): AISpecRuntimeModel[];
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG;IACjD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,kBAAkB,EAClB,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAC7E,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAYF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,eAAe,GAAG,SAAS,GAChC,kBAAkB,CAUpB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,EAAE,CAIzE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,kBAAkB,EAAE,GACzB,gBAAgB,CASlB"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG;IACjD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,kBAAkB,EAClB,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAC7E,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAYF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,eAAe,GAAG,SAAS,GAChC,kBAAkB,CAUpB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,EAAE,CAIzE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,kBAAkB,EAAE,GACzB,gBAAgB,CASlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sources":["../../../../src/data/ai/PromptRunEditor/model.ts"],"sourcesContent":["import type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\n\nexport type AIPromptRunSpec = AISpecRuntimeValue & {\n messages?: unknown[];\n toolPreferences?: unknown;\n toolApproval?: unknown;\n};\n\nexport type AISpecRuntimeModel = Pick<\n AISpecRuntimeValue,\n \"model\" | \"id\" | \"mode\" | \"temperature\" | \"effort\" | \"noCache\" | \"fallbacks\"\n>;\n\nexport type AIPromptRunValue = {\n variables?: Record<string, unknown>;\n spec?: AIPromptRunSpec;\n runtimes?: AISpecRuntimeModel[];\n chat?: boolean;\n};\n\nconst MODEL_KEYS = [\n \"model\",\n \"id\",\n \"mode\",\n \"temperature\",\n \"effort\",\n \"noCache\",\n \"fallbacks\",\n] as const satisfies readonly (keyof AISpecRuntimeModel)[];\n\nexport function runtimeModelFromSpec(\n spec: AIPromptRunSpec | undefined,\n): AISpecRuntimeModel {\n if (!spec) return {};\n const model: AISpecRuntimeModel = {};\n for (const key of MODEL_KEYS) {\n const value = spec[key];\n if (value !== undefined) {\n Object.assign(model, { [key]: value });\n }\n }\n return model;\n}\n\nexport function runtimeRows(value: AIPromptRunValue): AISpecRuntimeModel[] {\n return value.runtimes?.length\n ? value.runtimes\n : [runtimeModelFromSpec(value.spec)];\n}\n\nexport function withRuntimeRows(\n value: AIPromptRunValue,\n rows: AISpecRuntimeModel[],\n): AIPromptRunValue {\n const first = rows[0] ?? {};\n const spec = withRuntimeModel(value.spec ?? {}, first);\n if (rows.length <= 1) {\n const next = { ...value, spec };\n delete next.runtimes;\n return next;\n }\n return { ...value, spec, runtimes: rows };\n}\n\nfunction withRuntimeModel(\n spec: AIPromptRunSpec,\n model: AISpecRuntimeModel,\n): AIPromptRunSpec {\n const next = { ...spec };\n for (const key of MODEL_KEYS) {\n delete next[key];\n }\n return { ...next, ...model };\n}\n"],"names":[],"mappings":"AAoBA,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBACd,MACoB;AACpB,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,QAAM,QAA4B,CAAA;AAClC,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,UAAU,QAAW;AACvB,aAAO,OAAO,OAAO,EAAE,CAAC,GAAG,GAAG,OAAO;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAA+C;AAxB3E;AAyBE,WAAO,WAAM,aAAN,mBAAgB,UACnB,MAAM,WACN,CAAC,qBAAqB,MAAM,IAAI,CAAC;AACvC;AAEO,SAAS,gBACd,OACA,MACkB;AAClB,QAAM,QAAQ,KAAK,CAAC,KAAK,CAAA;AACzB,QAAM,OAAO,iBAAiB,MAAM,QAAQ,CAAA,GAAI,KAAK;AACrD,MAAI,KAAK,UAAU,GAAG;AACpB,UAAM,OAAO,EAAE,GAAG,OAAO,KAAA;AACzB,WAAO,KAAK;AACZ,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,OAAO,MAAM,UAAU,KAAA;AACrC;AAEA,SAAS,iBACP,MACA,OACiB;AACjB,QAAM,OAAO,EAAE,GAAG,KAAA;AAClB,aAAW,OAAO,YAAY;AAC5B,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,MAAA;AACvB;"}
1
+ {"version":3,"file":"model.js","sources":["../../../../src/data/ai/PromptRunEditor/model.ts"],"sourcesContent":["import type { AISpecRuntimeValue } from \"../SpecRuntimeEditor.model\";\n\nexport type AIPromptRunSpec = AISpecRuntimeValue & {\n messages?: unknown[];\n toolPreferences?: unknown;\n toolApproval?: unknown;\n};\n\nexport type AISpecRuntimeModel = Pick<\n AISpecRuntimeValue,\n \"model\" | \"id\" | \"mode\" | \"temperature\" | \"effort\" | \"noCache\" | \"fallbacks\"\n>;\n\nexport type AIPromptRunValue = {\n variables?: Record<string, unknown>;\n spec?: AIPromptRunSpec;\n runtimes?: AISpecRuntimeModel[];\n chat?: boolean;\n /** Saved runtime profile (id or name) layered under `spec` by the host. */\n runtimeProfile?: string;\n};\n\nconst MODEL_KEYS = [\n \"model\",\n \"id\",\n \"mode\",\n \"temperature\",\n \"effort\",\n \"noCache\",\n \"fallbacks\",\n] as const satisfies readonly (keyof AISpecRuntimeModel)[];\n\nexport function runtimeModelFromSpec(\n spec: AIPromptRunSpec | undefined,\n): AISpecRuntimeModel {\n if (!spec) return {};\n const model: AISpecRuntimeModel = {};\n for (const key of MODEL_KEYS) {\n const value = spec[key];\n if (value !== undefined) {\n Object.assign(model, { [key]: value });\n }\n }\n return model;\n}\n\nexport function runtimeRows(value: AIPromptRunValue): AISpecRuntimeModel[] {\n return value.runtimes?.length\n ? value.runtimes\n : [runtimeModelFromSpec(value.spec)];\n}\n\nexport function withRuntimeRows(\n value: AIPromptRunValue,\n rows: AISpecRuntimeModel[],\n): AIPromptRunValue {\n const first = rows[0] ?? {};\n const spec = withRuntimeModel(value.spec ?? {}, first);\n if (rows.length <= 1) {\n const next = { ...value, spec };\n delete next.runtimes;\n return next;\n }\n return { ...value, spec, runtimes: rows };\n}\n\nfunction withRuntimeModel(\n spec: AIPromptRunSpec,\n model: AISpecRuntimeModel,\n): AIPromptRunSpec {\n const next = { ...spec };\n for (const key of MODEL_KEYS) {\n delete next[key];\n }\n return { ...next, ...model };\n}\n"],"names":[],"mappings":"AAsBA,MAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBACd,MACoB;AACpB,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,QAAM,QAA4B,CAAA;AAClC,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,UAAU,QAAW;AACvB,aAAO,OAAO,OAAO,EAAE,CAAC,GAAG,GAAG,OAAO;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,YAAY,OAA+C;AAxB3E;AAyBE,WAAO,WAAM,aAAN,mBAAgB,UACnB,MAAM,WACN,CAAC,qBAAqB,MAAM,IAAI,CAAC;AACvC;AAEO,SAAS,gBACd,OACA,MACkB;AAClB,QAAM,QAAQ,KAAK,CAAC,KAAK,CAAA;AACzB,QAAM,OAAO,iBAAiB,MAAM,QAAQ,CAAA,GAAI,KAAK;AACrD,MAAI,KAAK,UAAU,GAAG;AACpB,UAAM,OAAO,EAAE,GAAG,OAAO,KAAA;AACzB,WAAO,KAAK;AACZ,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,OAAO,MAAM,UAAU,KAAA;AACrC;AAEA,SAAS,iBACP,MACA,OACiB;AACjB,QAAM,OAAO,EAAE,GAAG,KAAA;AAClB,aAAW,OAAO,YAAY;AAC5B,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,MAAA;AACvB;"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const agentActionIcons = require("./agent-action-icons.cjs");
3
4
  const UiClose = require("../../icons/components/UiClose.cjs");
4
5
  const UiHourglass = require("../../icons/components/UiHourglass.cjs");
5
6
  const UiShare = require("../../icons/components/UiShare.cjs");
@@ -55,7 +56,7 @@ function parseEntries(input) {
55
56
  });
56
57
  }
57
58
  function roleFromType(type) {
58
- return type === "system" || type === "user" || type === "assistant" ? type : "assistant";
59
+ return type === "system" || type === "user" || type === "assistant" || type === "verified" || type === "verify_failed" ? type : "assistant";
59
60
  }
60
61
  function toolEvent(id, tool, input, response, timestamp, meta = {}) {
61
62
  return {
@@ -80,7 +81,7 @@ function toolEvent(id, tool, input, response, timestamp, meta = {}) {
80
81
  ...meta.raw !== void 0 ? { raw: meta.raw } : {}
81
82
  };
82
83
  }
83
- function blockEvent(block, role, id, timestamp, cwd) {
84
+ function blockEvent(block, role, id, timestamp, cwd, verifyPassed) {
84
85
  if (block.type === "tool_use" || block.name && block.input) {
85
86
  if (!block.name) return null;
86
87
  return toolEvent(id, block.name, block.input, void 0, timestamp, {
@@ -95,9 +96,14 @@ function blockEvent(block, role, id, timestamp, cwd) {
95
96
  if (block.text) {
96
97
  return {
97
98
  id,
98
- kind: role === "system" ? "system" : role === "user" ? "user" : "assistant",
99
+ kind: role === "system" || verifyPassed !== void 0 ? "system" : role === "user" ? "user" : "assistant",
99
100
  text: block.text,
100
- ...timestamp ? { timestamp } : {}
101
+ ...timestamp ? { timestamp } : {},
102
+ ...verifyPassed !== void 0 ? {
103
+ verifyPassed,
104
+ tone: verifyPassed ? "emerald" : "rose",
105
+ icon: agentActionIcons.WORKFLOW_PHASES.verify.icon
106
+ } : {}
101
107
  };
102
108
  }
103
109
  return null;
@@ -150,13 +156,15 @@ function normalizeSession(input) {
150
156
  return;
151
157
  }
152
158
  const role = roleFromType(((_a = entry.message) == null ? void 0 : _a.role) ?? entry.type);
159
+ const verifyPassed = role === "verified" ? true : role === "verify_failed" ? false : void 0;
153
160
  for (const [i, block] of (((_b = entry.message) == null ? void 0 : _b.content) ?? []).entries()) {
154
161
  const ev = blockEvent(
155
162
  block,
156
163
  role,
157
164
  `${baseId}-${i}`,
158
165
  entry.timestamp,
159
- entry.cwd
166
+ entry.cwd,
167
+ verifyPassed
160
168
  );
161
169
  if (ev) events.push(ev);
162
170
  }
@@ -248,7 +256,12 @@ function partEvent(part, role, id, meta) {
248
256
  ...meta.timestamp ? { timestamp: meta.timestamp } : {},
249
257
  ...meta.turnId ? { turnId: meta.turnId } : {},
250
258
  ...meta.agentId ? { agentId: meta.agentId } : {},
251
- ...meta.raw !== void 0 ? { raw: meta.raw } : {}
259
+ ...meta.raw !== void 0 ? { raw: meta.raw } : {},
260
+ ...meta.verifyPassed !== void 0 ? {
261
+ verifyPassed: meta.verifyPassed,
262
+ tone: meta.verifyPassed ? "emerald" : "rose",
263
+ icon: agentActionIcons.WORKFLOW_PHASES.verify.icon
264
+ } : {}
252
265
  } : null;
253
266
  }
254
267
  return null;
@@ -280,7 +293,8 @@ function normalizeMessages(messages) {
280
293
  });
281
294
  return;
282
295
  }
283
- const role = msg.role === "system" ? "system" : msg.role === "user" ? "user" : "assistant";
296
+ const verifyPassed = msg.role === "verified" ? true : msg.role === "verify_failed" ? false : void 0;
297
+ const role = msg.role === "system" || verifyPassed !== void 0 ? "system" : msg.role === "user" ? "user" : "assistant";
284
298
  const meta = {
285
299
  ...(prov == null ? void 0 : prov.timestamp) ? { timestamp: prov.timestamp } : {},
286
300
  ...(prov == null ? void 0 : prov.cwd) ? { cwd: prov.cwd } : {},
@@ -290,7 +304,8 @@ function normalizeMessages(messages) {
290
304
  ...msg.turnId ? { turnId: msg.turnId } : {},
291
305
  ...(prov == null ? void 0 : prov.agentId) ? { agentId: prov.agentId } : {},
292
306
  ...(prov == null ? void 0 : prov.sessionId) ? { sessionId: prov.sessionId } : {},
293
- ...msg.raw !== void 0 ? { raw: msg.raw } : {}
307
+ ...msg.raw !== void 0 ? { raw: msg.raw } : {},
308
+ ...verifyPassed !== void 0 ? { verifyPassed } : {}
294
309
  };
295
310
  msg.parts.forEach((part, i) => {
296
311
  const ev = partEvent(part, role, `${baseId}-${i}`, meta);
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewer.model.cjs","sources":["../../../src/data/ai/SessionViewer.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport type {\n SessionBudget,\n SessionCapabilities,\n SessionContext,\n SessionCost,\n SessionMetadataEvent,\n SessionTurn,\n SessionUIMessage,\n SessionUIPart,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport {\n UiAsterisk,\n UiCamera,\n UiClose,\n UiCloudDownload,\n UiCode2,\n UiCommand,\n UiCompass,\n UiCursorClick,\n UiCursorText,\n UiDiff,\n UiEye,\n UiGlobe,\n UiHourglass,\n UiKanban,\n UiKeyboard,\n UiListChecks,\n UiMagicWand,\n UiPalette,\n UiPencilSimpleLine,\n UiProhibit,\n UiPuzzle,\n UiQuestion,\n UiRobotAi,\n UiScan,\n UiScroll,\n UiSearch,\n UiShare,\n UiSparkles,\n UiStack,\n UiStrategy,\n UiTerminal,\n UiWrench,\n} from \"../../icons\";\n\n// ── Captain session schema ──────────────────────────────────────────────────\n// Mirrors github.com/flanksource/captain pkg/ai/history types. A session is a\n// list of SessionEntry records (the rows of a Claude Code / Codex JSONL log).\n\nexport interface SessionToolUse {\n tool?: string;\n input?: Record<string, unknown>;\n timestamp?: string;\n cwd?: string;\n session_id?: string;\n tool_use_id?: string;\n /** \"claude\" or \"codex\". */\n source?: string;\n model?: string;\n reasoning_effort?: string;\n response?: string;\n}\n\nexport interface SessionContent {\n /** Block kind: \"text\", \"thinking\", \"tool_use\", \"tool_result\", … */\n type?: string;\n text?: string;\n thinking?: string;\n name?: string;\n input?: Record<string, unknown>;\n id?: string;\n}\n\nexport interface SessionMessage {\n role?: string;\n stop_reason?: string;\n content?: SessionContent[];\n}\n\nexport interface SessionEntry {\n /** Top-level entry kind: assistant, user, system, … */\n type?: string;\n tool_use?: SessionToolUse;\n message?: SessionMessage;\n timestamp?: string;\n cwd?: string;\n sessionId?: string;\n uuid?: string;\n /** Synthetic assistant entry Claude Code writes when an API request fails. */\n isApiErrorMessage?: boolean;\n apiErrorStatus?: number;\n /** Claude Code's error classification (e.g. \"rate_limit\"). */\n error?: string;\n}\n\n/**\n * A session to render: the unified `SessionUIMessage[]` (preferred — what\n * `GET /api/captain/sessions/{id}` serves), a legacy `SessionEntry[]` log, or\n * raw log text (JSON array or JSONL).\n */\nexport type SessionInput =\n | string\n | SessionEntry[]\n | SessionUIMessage[]\n | UnifiedSessionInput;\n\nexport interface SessionMetadataSummary {\n /** Session identifier exposed by the context meter's copy action. */\n sessionId?: string;\n /** Runtime mechanism used to execute the session. */\n executionMode?: string;\n turns?: SessionTurn[];\n capabilities?: SessionCapabilities;\n budget?: SessionBudget;\n context?: SessionContext;\n events?: SessionMetadataEvent[];\n /** Dominant model id, for the context meter's hover popover. */\n model?: string;\n /** Provider id, used to resolve the model's brand glyph. */\n provider?: string;\n /** Session reasoning effort, for the context meter's hover popover. */\n reasoningEffort?: string;\n /** Aggregate token usage, for the context meter's hover popover. */\n usage?: SessionUsage;\n /** Aggregate cost breakdown, for the context meter's hover popover. */\n cost?: SessionCost;\n}\n\n// ── Normalized events ───────────────────────────────────────────────────────\n// The raw schema interleaves consolidated `tool_use` rows with `message`\n// content blocks. normalizeSession flattens both shapes into a single ordered\n// list the viewer can render row-by-row.\n\nexport type SessionEventKind =\n | \"system\"\n | \"user\"\n | \"assistant\"\n | \"thinking\"\n | \"tool\"\n | \"error\";\n\nexport interface SessionEvent {\n id: string;\n kind: SessionEventKind;\n /** Tool name (kind === \"tool\"). */\n tool?: string;\n toolInput?: Record<string, unknown>;\n toolResponse?: string;\n /** Prose for user/assistant/thinking, or the error message for errors. */\n text?: string;\n /** Working directory the tool ran in — used to relativize file paths. */\n cwd?: string;\n timestamp?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n errorType?: string;\n errorStatus?: number;\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length <= max ? text : `${text.slice(0, max)}…`;\n}\n\n// parseEntries accepts a parsed array as-is, or parses a string as a whole-\n// document JSON (array or single object, possibly pretty-printed) first, then\n// falls back to JSONL (one object per line). The whole-document parse error is\n// caught only to attempt the JSONL fallback — a genuinely malformed JSONL line\n// throws loudly rather than being silently dropped.\nfunction parseEntries(input: string | SessionEntry[]): SessionEntry[] {\n if (Array.isArray(input)) return input;\n const text = input.trim();\n if (!text) return [];\n try {\n const parsed: unknown = JSON.parse(text);\n return Array.isArray(parsed)\n ? (parsed as SessionEntry[])\n : [parsed as SessionEntry];\n } catch {\n // not a single JSON document — treat as JSONL below\n }\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as SessionEntry;\n } catch {\n throw new Error(\n `SessionViewer: invalid session JSON line: ${truncate(line, 80)}`,\n );\n }\n });\n}\n\nfunction roleFromType(type: string | undefined): string {\n return type === \"system\" || type === \"user\" || type === \"assistant\"\n ? type\n : \"assistant\";\n}\n\nfunction toolEvent(\n id: string,\n tool: string,\n input: Record<string, unknown> | undefined,\n response: string | undefined,\n timestamp: string | undefined,\n meta: {\n model?: string;\n reasoningEffort?: string;\n source?: string;\n cwd?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n } = {},\n): SessionEvent {\n return {\n id,\n kind: \"tool\",\n tool,\n ...(input ? { toolInput: input } : {}),\n ...(response ? { toolResponse: response } : {}),\n ...(timestamp ? { timestamp } : {}),\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort ? { reasoningEffort: meta.reasoningEffort } : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.toolState ? { toolState: meta.toolState } : {}),\n ...(meta.approval ? { approval: meta.approval } : {}),\n pending: meta.pending ?? false,\n ...(meta.toolCallId ? { toolCallId: meta.toolCallId } : {}),\n ...(meta.approvalId ? { approvalId: meta.approvalId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n };\n}\n\nfunction blockEvent(\n block: SessionContent,\n role: string,\n id: string,\n timestamp: string | undefined,\n cwd: string | undefined,\n): SessionEvent | null {\n if (block.type === \"tool_use\" || (block.name && block.input)) {\n if (!block.name) return null;\n return toolEvent(id, block.name, block.input, undefined, timestamp, {\n ...(cwd ? { cwd } : {}),\n ...(block.id ? { toolCallId: block.id } : {}),\n });\n }\n if (block.type === \"thinking\" || block.thinking) {\n const text = block.thinking ?? block.text;\n return text\n ? { id, kind: \"thinking\", text, ...(timestamp ? { timestamp } : {}) }\n : null;\n }\n if (block.text) {\n return {\n id,\n kind:\n role === \"system\" ? \"system\" : role === \"user\" ? \"user\" : \"assistant\",\n text: block.text,\n ...(timestamp ? { timestamp } : {}),\n };\n }\n return null;\n}\n\n/** Flatten a captain session (unified messages, entries, or raw log text) into\n * ordered events. Unified `SessionUIMessage[]` is detected by its `parts`. */\nexport function normalizeSession(input: SessionInput): SessionEvent[] {\n if (looksLikeUnifiedSession(input)) {\n return normalizeMessages(input.messages ?? []);\n }\n if (Array.isArray(input) && looksLikeUnifiedMessages(input)) {\n return normalizeMessages(input);\n }\n const entries = parseEntries(input as string | SessionEntry[]);\n const events: SessionEvent[] = [];\n entries.forEach((entry, seq) => {\n const baseId = entry.uuid ?? `e${seq}`;\n\n if (entry.isApiErrorMessage) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: errorMessage(entry),\n ...(entry.error ? { errorType: entry.error } : {}),\n ...(entry.apiErrorStatus ? { errorStatus: entry.apiErrorStatus } : {}),\n ...(entry.timestamp ? { timestamp: entry.timestamp } : {}),\n raw: entry,\n });\n return;\n }\n\n const tu = entry.tool_use;\n if (tu?.tool) {\n const cwd = tu.cwd ?? entry.cwd;\n events.push(\n toolEvent(\n `${baseId}-tool`,\n tu.tool,\n tu.input,\n tu.response,\n tu.timestamp ?? entry.timestamp,\n {\n ...(tu.model ? { model: tu.model } : {}),\n ...(tu.reasoning_effort\n ? { reasoningEffort: tu.reasoning_effort }\n : {}),\n ...(tu.source ? { source: tu.source } : {}),\n ...(cwd ? { cwd } : {}),\n ...(tu.tool_use_id ? { toolCallId: tu.tool_use_id } : {}),\n ...(tu.session_id ? { sessionId: tu.session_id } : {}),\n raw: entry,\n },\n ),\n );\n return;\n }\n\n const role = roleFromType(entry.message?.role ?? entry.type);\n for (const [i, block] of (entry.message?.content ?? []).entries()) {\n const ev = blockEvent(\n block,\n role,\n `${baseId}-${i}`,\n entry.timestamp,\n entry.cwd,\n );\n if (ev) events.push(ev);\n }\n });\n return events;\n}\n\nexport function getSessionMetadata(\n input: SessionInput,\n): SessionMetadataSummary | undefined {\n if (!looksLikeUnifiedSession(input)) return undefined;\n const metadata: SessionMetadataSummary = {\n ...(input.id ? { sessionId: input.id } : {}),\n ...(input.executionMode ? { executionMode: input.executionMode } : {}),\n ...(input.turns ? { turns: input.turns } : {}),\n ...(input.capabilities ? { capabilities: input.capabilities } : {}),\n ...(input.budget ? { budget: input.budget } : {}),\n ...(input.context ? { context: input.context } : {}),\n ...(input.events ? { events: input.events } : {}),\n ...(input.model ? { model: input.model } : {}),\n ...(input.provider ? { provider: input.provider } : {}),\n ...(input.reasoningEffort\n ? { reasoningEffort: input.reasoningEffort }\n : {}),\n ...(input.usage ? { usage: input.usage } : {}),\n ...(input.cost ? { cost: input.cost } : {}),\n };\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction errorMessage(entry: SessionEntry): string {\n const status = entry.apiErrorStatus ? ` (HTTP ${entry.apiErrorStatus})` : \"\";\n return `${entry.error ?? \"API error\"}${status}`;\n}\n\n// ── Unified message normalization ───────────────────────────────────────────\n// Projects the canonical SessionUIMessage[] (captain pkg/session) into the same\n// SessionEvent rows, so the viewer renders the unified model and the legacy\n// SessionEntry log identically.\n\n/** A unified message array is told apart from a SessionEntry log by its\n * per-message `parts` array (a SessionEntry carries `message`/`tool_use`). */\nfunction looksLikeUnifiedMessages(\n arr: SessionEntry[] | SessionUIMessage[],\n): arr is SessionUIMessage[] {\n const first: unknown = arr[0];\n return (\n typeof first === \"object\" &&\n first !== null &&\n Array.isArray((first as SessionUIMessage).parts)\n );\n}\n\nfunction looksLikeUnifiedSession(\n input: SessionInput,\n): input is UnifiedSessionInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n !Array.isArray(input) &&\n (\"messages\" in input ||\n \"turns\" in input ||\n \"capabilities\" in input ||\n \"budget\" in input ||\n \"context\" in input)\n );\n}\n\nfunction isUnifiedToolPart(part: SessionUIPart): boolean {\n return (\n Boolean(part.toolName) &&\n (part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\"))\n );\n}\n\n/** Render a tool part's already-parsed JSON output as text. */\nfunction outputToText(output: unknown): string | undefined {\n if (output == null) return undefined;\n return typeof output === \"string\" ? output : JSON.stringify(output);\n}\n\nfunction asRecord(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : undefined;\n}\n\nfunction partEvent(\n part: SessionUIPart,\n role: \"system\" | \"user\" | \"assistant\",\n id: string,\n meta: {\n timestamp?: string;\n cwd?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n sessionId?: string;\n raw?: unknown;\n },\n): SessionEvent | null {\n if (isUnifiedToolPart(part)) {\n const pending = pendingFromPart(part);\n return toolEvent(\n id,\n part.toolName as string,\n asRecord(part.input),\n outputToText(part.output),\n meta.timestamp,\n {\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort\n ? { reasoningEffort: meta.reasoningEffort }\n : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(part.state ? { toolState: part.state } : {}),\n ...(part.approval ? { approval: part.approval } : {}),\n pending,\n ...(part.toolCallId ? { toolCallId: part.toolCallId } : {}),\n ...(part.approval?.id ? { approvalId: part.approval.id } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n },\n );\n }\n if (part.type === \"reasoning\") {\n return part.text\n ? {\n id,\n kind: \"thinking\",\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n }\n : null;\n }\n if (part.type === \"text\") {\n return part.text\n ? {\n id,\n kind: role,\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n }\n : null;\n }\n return null; // file / unknown parts have no row representation\n}\n\nfunction pendingFromPart(part: SessionUIPart): boolean {\n if (part.approval?.approved !== undefined) return false;\n if (\n [\"approval-responded\", \"output-available\", \"output-denied\"].includes(\n part.state ?? \"\",\n )\n )\n return false;\n return (\n part.pending === true ||\n part.approval?.pending === true ||\n part.state === \"approval-requested\"\n );\n}\n\n/** Flatten unified session messages into ordered SessionEvent rows. */\nexport function normalizeMessages(\n messages: SessionUIMessage[],\n): SessionEvent[] {\n const events: SessionEvent[] = [];\n messages.forEach((msg, seq) => {\n const prov = msg.provenance;\n const baseId = msg.id ?? prov?.uuid ?? `m${seq}`;\n if (prov?.apiErrorStatus) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: `API error (HTTP ${prov.apiErrorStatus})`,\n errorStatus: prov.apiErrorStatus,\n ...(prov.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov.agentId ? { agentId: prov.agentId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n });\n return;\n }\n const role: \"system\" | \"user\" | \"assistant\" =\n msg.role === \"system\"\n ? \"system\"\n : msg.role === \"user\"\n ? \"user\"\n : \"assistant\";\n const meta = {\n ...(prov?.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(prov?.cwd ? { cwd: prov.cwd } : {}),\n ...(prov?.model ? { model: prov.model } : {}),\n ...(prov?.reasoningEffort\n ? { reasoningEffort: prov.reasoningEffort }\n : {}),\n ...(prov?.source ? { source: prov.source } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov?.agentId ? { agentId: prov.agentId } : {}),\n ...(prov?.sessionId ? { sessionId: prov.sessionId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n };\n msg.parts.forEach((part, i) => {\n const ev = partEvent(part, role, `${baseId}-${i}`, meta);\n if (ev) events.push(ev);\n });\n });\n return events;\n}\n\n// ── Action icon registry ────────────────────────────────────────────────────\n// Implements the Flanksource \"Coding agent action icons\" design: every agent\n// tool maps to a Phosphor-derived generated icon (Ui*) and a semantic tone so a\n// scan of the log reads at a glance. Tones group by surface — file reads (sky),\n// writes (amber), edits (violet), execution (emerald), agents (indigo),\n// destructive (rose), assets (pink/fuchsia).\n\nexport type SessionTone =\n | \"sky\"\n | \"amber\"\n | \"violet\"\n | \"emerald\"\n | \"teal\"\n | \"orange\"\n | \"rose\"\n | \"indigo\"\n | \"fuchsia\"\n | \"pink\"\n | \"slate\";\n\nexport interface SessionActionMeta {\n icon: StaticIconComponent;\n tone: SessionTone;\n /** Human-readable verb shown as the row heading (and in the filter menu). */\n label: string;\n /** The row heading is the input summary alone (file path, command) — the\n * icon and tone carry the verb, so the label only appears in the menu. */\n summaryOnly?: boolean;\n}\n\nconst ACTIONS: Record<string, SessionActionMeta> = {\n // File operations. Read (eye) and Write (diff) are deliberately kept off the\n // design's file-text / file-plus glyphs — they read better in a scrolling log\n // and write-type rows also carry a +/- diff stat.\n Read: { icon: UiEye, tone: \"sky\", label: \"Read file\", summaryOnly: true },\n Write: {\n icon: UiDiff,\n tone: \"amber\",\n label: \"Write file\",\n summaryOnly: true,\n },\n Edit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit file\",\n summaryOnly: true,\n },\n MultiEdit: {\n icon: UiStack,\n tone: \"violet\",\n label: \"Multi-edit\",\n summaryOnly: true,\n },\n NotebookEdit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit notebook\",\n summaryOnly: true,\n },\n // Search & navigation\n Grep: { icon: UiSearch, tone: \"amber\", label: \"Grep\" },\n Glob: { icon: UiAsterisk, tone: \"sky\", label: \"Glob\" },\n // Execution & shell\n Bash: { icon: UiTerminal, tone: \"emerald\", label: \"Run command\" },\n BashOutput: { icon: UiCode2, tone: \"emerald\", label: \"Shell output\" },\n KillShell: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n KillBash: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n // Agents & planning\n Task: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Agent: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Skill: { icon: UiMagicWand, tone: \"fuchsia\", label: \"Invoke skill\" },\n TodoWrite: { icon: UiListChecks, tone: \"sky\", label: \"Update todos\" },\n Plan: { icon: UiStrategy, tone: \"sky\", label: \"Plan\" },\n TaskCreate: { icon: UiKanban, tone: \"sky\", label: \"Create task\" },\n TaskUpdate: { icon: UiKanban, tone: \"sky\", label: \"Update task\" },\n TaskList: { icon: UiKanban, tone: \"sky\", label: \"List tasks\" },\n TaskGet: { icon: UiKanban, tone: \"sky\", label: \"Get task\" },\n TaskOutput: { icon: UiKanban, tone: \"sky\", label: \"Task output\" },\n TaskStop: { icon: UiProhibit, tone: \"rose\", label: \"Stop task\" },\n ToolSearch: { icon: UiSearch, tone: \"amber\", label: \"Search tools\" },\n AskUserQuestion: { icon: UiQuestion, tone: \"sky\", label: \"Ask user\" },\n EnterPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Enter plan mode\" },\n ExitPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Exit plan mode\" },\n // Web & browser automation\n WebFetch: { icon: UiCloudDownload, tone: \"sky\", label: \"Fetch URL\" },\n WebSearch: { icon: UiGlobe, tone: \"sky\", label: \"Web search\" },\n browser_navigate: { icon: UiCompass, tone: \"sky\", label: \"Navigate\" },\n browser_navigate_back: {\n icon: UiCompass,\n tone: \"sky\",\n label: \"Navigate back\",\n },\n browser_click: { icon: UiCursorClick, tone: \"sky\", label: \"Click\" },\n browser_triple_click: {\n icon: UiCursorText,\n tone: \"sky\",\n label: \"Triple click\",\n },\n browser_type: { icon: UiKeyboard, tone: \"emerald\", label: \"Type text\" },\n browser_press_key: { icon: UiCommand, tone: \"amber\", label: \"Press key\" },\n browser_snapshot: { icon: UiScan, tone: \"violet\", label: \"Snapshot\" },\n browser_take_screenshot: {\n icon: UiCamera,\n tone: \"indigo\",\n label: \"Screenshot\",\n },\n browser_evaluate: { icon: UiCode2, tone: \"violet\", label: \"Evaluate JS\" },\n browser_console_messages: { icon: UiScroll, tone: \"slate\", label: \"Console\" },\n browser_network_requests: {\n icon: UiShare,\n tone: \"emerald\",\n label: \"Network\",\n },\n browser_wait_for: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n Wait: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n browser_close: { icon: UiClose, tone: \"rose\", label: \"Close browser\" },\n};\n\n// MCP tools surface as `mcp__<server>__<name>` or `<server>__<name>`. Icon\n// servers get a distinct accent (palette); generative servers reuse the sparkle;\n// the rest fall back to the puzzle piece.\nconst MCP_ICON_SERVERS = new Set([\n \"iconify\",\n \"icons8\",\n \"lucide\",\n \"react-icons\",\n]);\nconst MCP_GEN_SERVERS = new Set([\"gemini\", \"openai\", \"anthropic\"]);\n\ninterface McpTool {\n server: string;\n name: string;\n}\n\nexport function splitMcpTool(tool: string): McpTool | null {\n const rest = tool.startsWith(\"mcp__\") ? tool.slice(\"mcp__\".length) : tool;\n const idx = rest.indexOf(\"__\");\n if (idx < 0) return null;\n return { server: rest.slice(0, idx), name: rest.slice(idx + 2) };\n}\n\n/** Resolve the icon, tone, and label for a tool name. */\nexport function getSessionAction(tool: string): SessionActionMeta {\n const exact = ACTIONS[tool];\n if (exact) return exact;\n\n const mcp = splitMcpTool(tool);\n if (mcp) {\n const label = `${mcp.server}: ${mcp.name.replace(/_/g, \" \")}`;\n if (MCP_ICON_SERVERS.has(mcp.server))\n return { icon: UiPalette, tone: \"pink\", label };\n if (MCP_GEN_SERVERS.has(mcp.server))\n return { icon: UiSparkles, tone: \"violet\", label };\n return { icon: UiPuzzle, tone: \"violet\", label };\n }\n\n return { icon: UiWrench, tone: \"slate\", label: tool };\n}\n\n/** Count tool-call events, the dominant model, and totals for the header. */\nexport function summarizeSession(events: SessionEvent[]): {\n toolCount: number;\n messageCount: number;\n model?: string;\n} {\n let toolCount = 0;\n let messageCount = 0;\n const modelCounts = new Map<string, number>();\n for (const event of events) {\n if (event.kind === \"tool\") toolCount += 1;\n if (\n event.kind === \"system\" ||\n event.kind === \"user\" ||\n event.kind === \"assistant\"\n ) {\n messageCount += 1;\n }\n if (event.model)\n modelCounts.set(event.model, (modelCounts.get(event.model) ?? 0) + 1);\n }\n let model: string | undefined;\n let best = 0;\n for (const [name, count] of modelCounts) {\n if (count > best) {\n best = count;\n model = name;\n }\n }\n return { toolCount, messageCount, ...(model ? { model } : {}) };\n}\n"],"names":["UiEye","UiDiff","UiPencilSimpleLine","UiStack","UiSearch","UiAsterisk","UiTerminal","UiCode2","UiProhibit","UiRobotAi","UiMagicWand","UiListChecks","UiStrategy","UiKanban","UiQuestion","UiCloudDownload","UiGlobe","UiCompass","UiCursorClick","UiCursorText","UiKeyboard","UiCommand","UiScan","UiCamera","UiScroll","UiShare","UiHourglass","UiClose","UiPalette","UiSparkles","UiPuzzle","UiWrench"],"mappings":"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"}
1
+ {"version":3,"file":"SessionViewer.model.cjs","sources":["../../../src/data/ai/SessionViewer.model.ts"],"sourcesContent":["import type { StaticIconComponent } from \"../Icon\";\nimport { WORKFLOW_PHASES } from \"./agent-action-icons\";\nimport type {\n SessionBudget,\n SessionCapabilities,\n SessionContext,\n SessionCost,\n SessionMetadataEvent,\n SessionTurn,\n SessionUIMessage,\n SessionUIPart,\n SessionUsage,\n UnifiedSessionInput,\n} from \"./SessionViewer.unified\";\nimport {\n UiAsterisk,\n UiCamera,\n UiClose,\n UiCloudDownload,\n UiCode2,\n UiCommand,\n UiCompass,\n UiCursorClick,\n UiCursorText,\n UiDiff,\n UiEye,\n UiGlobe,\n UiHourglass,\n UiKanban,\n UiKeyboard,\n UiListChecks,\n UiMagicWand,\n UiPalette,\n UiPencilSimpleLine,\n UiProhibit,\n UiPuzzle,\n UiQuestion,\n UiRobotAi,\n UiScan,\n UiScroll,\n UiSearch,\n UiShare,\n UiSparkles,\n UiStack,\n UiStrategy,\n UiTerminal,\n UiWrench,\n} from \"../../icons\";\n\n// ── Captain session schema ──────────────────────────────────────────────────\n// Mirrors github.com/flanksource/captain pkg/ai/history types. A session is a\n// list of SessionEntry records (the rows of a Claude Code / Codex JSONL log).\n\nexport interface SessionToolUse {\n tool?: string;\n input?: Record<string, unknown>;\n timestamp?: string;\n cwd?: string;\n session_id?: string;\n tool_use_id?: string;\n /** \"claude\" or \"codex\". */\n source?: string;\n model?: string;\n reasoning_effort?: string;\n response?: string;\n}\n\nexport interface SessionContent {\n /** Block kind: \"text\", \"thinking\", \"tool_use\", \"tool_result\", … */\n type?: string;\n text?: string;\n thinking?: string;\n name?: string;\n input?: Record<string, unknown>;\n id?: string;\n}\n\nexport interface SessionMessage {\n role?: string;\n stop_reason?: string;\n content?: SessionContent[];\n}\n\nexport interface SessionEntry {\n /** Top-level entry kind: assistant, user, system, … */\n type?: string;\n tool_use?: SessionToolUse;\n message?: SessionMessage;\n timestamp?: string;\n cwd?: string;\n sessionId?: string;\n uuid?: string;\n /** Synthetic assistant entry Claude Code writes when an API request fails. */\n isApiErrorMessage?: boolean;\n apiErrorStatus?: number;\n /** Claude Code's error classification (e.g. \"rate_limit\"). */\n error?: string;\n}\n\n/**\n * A session to render: the unified `SessionUIMessage[]` (preferred — what\n * `GET /api/captain/sessions/{id}` serves), a legacy `SessionEntry[]` log, or\n * raw log text (JSON array or JSONL).\n */\nexport type SessionInput =\n | string\n | SessionEntry[]\n | SessionUIMessage[]\n | UnifiedSessionInput;\n\nexport interface SessionMetadataSummary {\n /** Session identifier exposed by the context meter's copy action. */\n sessionId?: string;\n /** Runtime mechanism used to execute the session. */\n executionMode?: string;\n turns?: SessionTurn[];\n capabilities?: SessionCapabilities;\n budget?: SessionBudget;\n context?: SessionContext;\n events?: SessionMetadataEvent[];\n /** Dominant model id, for the context meter's hover popover. */\n model?: string;\n /** Provider id, used to resolve the model's brand glyph. */\n provider?: string;\n /** Session reasoning effort, for the context meter's hover popover. */\n reasoningEffort?: string;\n /** Aggregate token usage, for the context meter's hover popover. */\n usage?: SessionUsage;\n /** Aggregate cost breakdown, for the context meter's hover popover. */\n cost?: SessionCost;\n}\n\n// ── Normalized events ───────────────────────────────────────────────────────\n// The raw schema interleaves consolidated `tool_use` rows with `message`\n// content blocks. normalizeSession flattens both shapes into a single ordered\n// list the viewer can render row-by-row.\n\nexport type SessionEventKind =\n | \"system\"\n | \"user\"\n | \"assistant\"\n | \"thinking\"\n | \"tool\"\n | \"error\";\n\nexport interface SessionEvent {\n id: string;\n kind: SessionEventKind;\n /** Tool name (kind === \"tool\"). */\n tool?: string;\n toolInput?: Record<string, unknown>;\n toolResponse?: string;\n /** Prose for user/assistant/thinking, or the error message for errors. */\n text?: string;\n /** Working directory the tool ran in — used to relativize file paths. */\n cwd?: string;\n timestamp?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n errorType?: string;\n errorStatus?: number;\n /** Set for a `verified`/`verify_failed` role — the workflow verify verdict. */\n verifyPassed?: boolean;\n /** Row icon override (e.g. the verify glyph). Renderers fall back to the\n * kind's default icon when absent. */\n icon?: StaticIconComponent;\n /** Row tone override (e.g. pass/fail for a verify row). Renderers fall back\n * to the kind's default tone when absent. */\n tone?: SessionTone;\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length <= max ? text : `${text.slice(0, max)}…`;\n}\n\n// parseEntries accepts a parsed array as-is, or parses a string as a whole-\n// document JSON (array or single object, possibly pretty-printed) first, then\n// falls back to JSONL (one object per line). The whole-document parse error is\n// caught only to attempt the JSONL fallback — a genuinely malformed JSONL line\n// throws loudly rather than being silently dropped.\nfunction parseEntries(input: string | SessionEntry[]): SessionEntry[] {\n if (Array.isArray(input)) return input;\n const text = input.trim();\n if (!text) return [];\n try {\n const parsed: unknown = JSON.parse(text);\n return Array.isArray(parsed)\n ? (parsed as SessionEntry[])\n : [parsed as SessionEntry];\n } catch {\n // not a single JSON document — treat as JSONL below\n }\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as SessionEntry;\n } catch {\n throw new Error(\n `SessionViewer: invalid session JSON line: ${truncate(line, 80)}`,\n );\n }\n });\n}\n\n// \"verified\"/\"verify_failed\" pass through unchanged — the legacy SessionEntry\n// path needs the raw role to route to the same verify row `normalizeMessages`\n// builds for the unified path (see the call site below), not just a\n// system/user/assistant kind.\nfunction roleFromType(type: string | undefined): string {\n return type === \"system\" ||\n type === \"user\" ||\n type === \"assistant\" ||\n type === \"verified\" ||\n type === \"verify_failed\"\n ? type\n : \"assistant\";\n}\n\nfunction toolEvent(\n id: string,\n tool: string,\n input: Record<string, unknown> | undefined,\n response: string | undefined,\n timestamp: string | undefined,\n meta: {\n model?: string;\n reasoningEffort?: string;\n source?: string;\n cwd?: string;\n turnId?: string;\n agentId?: string;\n toolState?: string;\n approval?: SessionUIPart[\"approval\"];\n pending?: boolean;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n raw?: unknown;\n } = {},\n): SessionEvent {\n return {\n id,\n kind: \"tool\",\n tool,\n ...(input ? { toolInput: input } : {}),\n ...(response ? { toolResponse: response } : {}),\n ...(timestamp ? { timestamp } : {}),\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort ? { reasoningEffort: meta.reasoningEffort } : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.toolState ? { toolState: meta.toolState } : {}),\n ...(meta.approval ? { approval: meta.approval } : {}),\n pending: meta.pending ?? false,\n ...(meta.toolCallId ? { toolCallId: meta.toolCallId } : {}),\n ...(meta.approvalId ? { approvalId: meta.approvalId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n };\n}\n\nfunction blockEvent(\n block: SessionContent,\n role: string,\n id: string,\n timestamp: string | undefined,\n cwd: string | undefined,\n verifyPassed: boolean | undefined,\n): SessionEvent | null {\n if (block.type === \"tool_use\" || (block.name && block.input)) {\n if (!block.name) return null;\n return toolEvent(id, block.name, block.input, undefined, timestamp, {\n ...(cwd ? { cwd } : {}),\n ...(block.id ? { toolCallId: block.id } : {}),\n });\n }\n if (block.type === \"thinking\" || block.thinking) {\n const text = block.thinking ?? block.text;\n return text\n ? { id, kind: \"thinking\", text, ...(timestamp ? { timestamp } : {}) }\n : null;\n }\n if (block.text) {\n // A verify step reports its verdict as a `verified`/`verify_failed` role —\n // rendered as a system-style row carrying the pass/fail tone and the\n // workflow verify glyph, mirroring `normalizeMessages`'s unified-path rows.\n return {\n id,\n kind:\n role === \"system\" || verifyPassed !== undefined\n ? \"system\"\n : role === \"user\"\n ? \"user\"\n : \"assistant\",\n text: block.text,\n ...(timestamp ? { timestamp } : {}),\n ...(verifyPassed !== undefined\n ? {\n verifyPassed,\n tone: verifyPassed ? \"emerald\" : \"rose\",\n icon: WORKFLOW_PHASES.verify.icon,\n }\n : {}),\n };\n }\n return null;\n}\n\n/** Flatten a captain session (unified messages, entries, or raw log text) into\n * ordered events. Unified `SessionUIMessage[]` is detected by its `parts`. */\nexport function normalizeSession(input: SessionInput): SessionEvent[] {\n if (looksLikeUnifiedSession(input)) {\n return normalizeMessages(input.messages ?? []);\n }\n if (Array.isArray(input) && looksLikeUnifiedMessages(input)) {\n return normalizeMessages(input);\n }\n const entries = parseEntries(input as string | SessionEntry[]);\n const events: SessionEvent[] = [];\n entries.forEach((entry, seq) => {\n const baseId = entry.uuid ?? `e${seq}`;\n\n if (entry.isApiErrorMessage) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: errorMessage(entry),\n ...(entry.error ? { errorType: entry.error } : {}),\n ...(entry.apiErrorStatus ? { errorStatus: entry.apiErrorStatus } : {}),\n ...(entry.timestamp ? { timestamp: entry.timestamp } : {}),\n raw: entry,\n });\n return;\n }\n\n const tu = entry.tool_use;\n if (tu?.tool) {\n const cwd = tu.cwd ?? entry.cwd;\n events.push(\n toolEvent(\n `${baseId}-tool`,\n tu.tool,\n tu.input,\n tu.response,\n tu.timestamp ?? entry.timestamp,\n {\n ...(tu.model ? { model: tu.model } : {}),\n ...(tu.reasoning_effort\n ? { reasoningEffort: tu.reasoning_effort }\n : {}),\n ...(tu.source ? { source: tu.source } : {}),\n ...(cwd ? { cwd } : {}),\n ...(tu.tool_use_id ? { toolCallId: tu.tool_use_id } : {}),\n ...(tu.session_id ? { sessionId: tu.session_id } : {}),\n raw: entry,\n },\n ),\n );\n return;\n }\n\n const role = roleFromType(entry.message?.role ?? entry.type);\n const verifyPassed =\n role === \"verified\" ? true : role === \"verify_failed\" ? false : undefined;\n for (const [i, block] of (entry.message?.content ?? []).entries()) {\n const ev = blockEvent(\n block,\n role,\n `${baseId}-${i}`,\n entry.timestamp,\n entry.cwd,\n verifyPassed,\n );\n if (ev) events.push(ev);\n }\n });\n return events;\n}\n\nexport function getSessionMetadata(\n input: SessionInput,\n): SessionMetadataSummary | undefined {\n if (!looksLikeUnifiedSession(input)) return undefined;\n const metadata: SessionMetadataSummary = {\n ...(input.id ? { sessionId: input.id } : {}),\n ...(input.executionMode ? { executionMode: input.executionMode } : {}),\n ...(input.turns ? { turns: input.turns } : {}),\n ...(input.capabilities ? { capabilities: input.capabilities } : {}),\n ...(input.budget ? { budget: input.budget } : {}),\n ...(input.context ? { context: input.context } : {}),\n ...(input.events ? { events: input.events } : {}),\n ...(input.model ? { model: input.model } : {}),\n ...(input.provider ? { provider: input.provider } : {}),\n ...(input.reasoningEffort\n ? { reasoningEffort: input.reasoningEffort }\n : {}),\n ...(input.usage ? { usage: input.usage } : {}),\n ...(input.cost ? { cost: input.cost } : {}),\n };\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction errorMessage(entry: SessionEntry): string {\n const status = entry.apiErrorStatus ? ` (HTTP ${entry.apiErrorStatus})` : \"\";\n return `${entry.error ?? \"API error\"}${status}`;\n}\n\n// ── Unified message normalization ───────────────────────────────────────────\n// Projects the canonical SessionUIMessage[] (captain pkg/session) into the same\n// SessionEvent rows, so the viewer renders the unified model and the legacy\n// SessionEntry log identically.\n\n/** A unified message array is told apart from a SessionEntry log by its\n * per-message `parts` array (a SessionEntry carries `message`/`tool_use`). */\nfunction looksLikeUnifiedMessages(\n arr: SessionEntry[] | SessionUIMessage[],\n): arr is SessionUIMessage[] {\n const first: unknown = arr[0];\n return (\n typeof first === \"object\" &&\n first !== null &&\n Array.isArray((first as SessionUIMessage).parts)\n );\n}\n\nfunction looksLikeUnifiedSession(\n input: SessionInput,\n): input is UnifiedSessionInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n !Array.isArray(input) &&\n (\"messages\" in input ||\n \"turns\" in input ||\n \"capabilities\" in input ||\n \"budget\" in input ||\n \"context\" in input)\n );\n}\n\nfunction isUnifiedToolPart(part: SessionUIPart): boolean {\n return (\n Boolean(part.toolName) &&\n (part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\"))\n );\n}\n\n/** Render a tool part's already-parsed JSON output as text. */\nfunction outputToText(output: unknown): string | undefined {\n if (output == null) return undefined;\n return typeof output === \"string\" ? output : JSON.stringify(output);\n}\n\nfunction asRecord(input: unknown): Record<string, unknown> | undefined {\n return typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : undefined;\n}\n\nfunction partEvent(\n part: SessionUIPart,\n role: \"system\" | \"user\" | \"assistant\",\n id: string,\n meta: {\n timestamp?: string;\n cwd?: string;\n model?: string;\n reasoningEffort?: string;\n source?: string;\n turnId?: string;\n agentId?: string;\n sessionId?: string;\n raw?: unknown;\n verifyPassed?: boolean;\n },\n): SessionEvent | null {\n if (isUnifiedToolPart(part)) {\n const pending = pendingFromPart(part);\n return toolEvent(\n id,\n part.toolName as string,\n asRecord(part.input),\n outputToText(part.output),\n meta.timestamp,\n {\n ...(meta.model ? { model: meta.model } : {}),\n ...(meta.reasoningEffort\n ? { reasoningEffort: meta.reasoningEffort }\n : {}),\n ...(meta.source ? { source: meta.source } : {}),\n ...(meta.cwd ? { cwd: meta.cwd } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.sessionId ? { sessionId: meta.sessionId } : {}),\n ...(part.state ? { toolState: part.state } : {}),\n ...(part.approval ? { approval: part.approval } : {}),\n pending,\n ...(part.toolCallId ? { toolCallId: part.toolCallId } : {}),\n ...(part.approval?.id ? { approvalId: part.approval.id } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n },\n );\n }\n if (part.type === \"reasoning\") {\n return part.text\n ? {\n id,\n kind: \"thinking\",\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n }\n : null;\n }\n if (part.type === \"text\") {\n return part.text\n ? {\n id,\n kind: role,\n text: part.text,\n ...(meta.timestamp ? { timestamp: meta.timestamp } : {}),\n ...(meta.turnId ? { turnId: meta.turnId } : {}),\n ...(meta.agentId ? { agentId: meta.agentId } : {}),\n ...(meta.raw !== undefined ? { raw: meta.raw } : {}),\n ...(meta.verifyPassed !== undefined\n ? {\n verifyPassed: meta.verifyPassed,\n tone: meta.verifyPassed ? \"emerald\" : \"rose\",\n icon: WORKFLOW_PHASES.verify.icon,\n }\n : {}),\n }\n : null;\n }\n return null; // file / unknown parts have no row representation\n}\n\nfunction pendingFromPart(part: SessionUIPart): boolean {\n if (part.approval?.approved !== undefined) return false;\n if (\n [\"approval-responded\", \"output-available\", \"output-denied\"].includes(\n part.state ?? \"\",\n )\n )\n return false;\n return (\n part.pending === true ||\n part.approval?.pending === true ||\n part.state === \"approval-requested\"\n );\n}\n\n/** Flatten unified session messages into ordered SessionEvent rows. */\nexport function normalizeMessages(\n messages: SessionUIMessage[],\n): SessionEvent[] {\n const events: SessionEvent[] = [];\n messages.forEach((msg, seq) => {\n const prov = msg.provenance;\n const baseId = msg.id ?? prov?.uuid ?? `m${seq}`;\n if (prov?.apiErrorStatus) {\n events.push({\n id: `${baseId}-err`,\n kind: \"error\",\n text: `API error (HTTP ${prov.apiErrorStatus})`,\n errorStatus: prov.apiErrorStatus,\n ...(prov.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov.agentId ? { agentId: prov.agentId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n });\n return;\n }\n // A verify step reports its verdict as a `verified`/`verify_failed` role —\n // rendered as a system-style row (not a fourth top-level kind) carrying the\n // pass/fail tone and the workflow verify glyph as data.\n const verifyPassed =\n msg.role === \"verified\" ? true : msg.role === \"verify_failed\" ? false : undefined;\n const role: \"system\" | \"user\" | \"assistant\" =\n msg.role === \"system\" || verifyPassed !== undefined\n ? \"system\"\n : msg.role === \"user\"\n ? \"user\"\n : \"assistant\";\n const meta = {\n ...(prov?.timestamp ? { timestamp: prov.timestamp } : {}),\n ...(prov?.cwd ? { cwd: prov.cwd } : {}),\n ...(prov?.model ? { model: prov.model } : {}),\n ...(prov?.reasoningEffort\n ? { reasoningEffort: prov.reasoningEffort }\n : {}),\n ...(prov?.source ? { source: prov.source } : {}),\n ...(msg.turnId ? { turnId: msg.turnId } : {}),\n ...(prov?.agentId ? { agentId: prov.agentId } : {}),\n ...(prov?.sessionId ? { sessionId: prov.sessionId } : {}),\n ...(msg.raw !== undefined ? { raw: msg.raw } : {}),\n ...(verifyPassed !== undefined ? { verifyPassed } : {}),\n };\n msg.parts.forEach((part, i) => {\n const ev = partEvent(part, role, `${baseId}-${i}`, meta);\n if (ev) events.push(ev);\n });\n });\n return events;\n}\n\n// ── Action icon registry ────────────────────────────────────────────────────\n// Implements the Flanksource \"Coding agent action icons\" design: every agent\n// tool maps to a Phosphor-derived generated icon (Ui*) and a semantic tone so a\n// scan of the log reads at a glance. Tones group by surface — file reads (sky),\n// writes (amber), edits (violet), execution (emerald), agents (indigo),\n// destructive (rose), assets (pink/fuchsia).\n\nexport type SessionTone =\n | \"sky\"\n | \"amber\"\n | \"violet\"\n | \"emerald\"\n | \"teal\"\n | \"orange\"\n | \"rose\"\n | \"indigo\"\n | \"fuchsia\"\n | \"pink\"\n | \"slate\";\n\nexport interface SessionActionMeta {\n icon: StaticIconComponent;\n tone: SessionTone;\n /** Human-readable verb shown as the row heading (and in the filter menu). */\n label: string;\n /** The row heading is the input summary alone (file path, command) — the\n * icon and tone carry the verb, so the label only appears in the menu. */\n summaryOnly?: boolean;\n}\n\nconst ACTIONS: Record<string, SessionActionMeta> = {\n // File operations. Read (eye) and Write (diff) are deliberately kept off the\n // design's file-text / file-plus glyphs — they read better in a scrolling log\n // and write-type rows also carry a +/- diff stat.\n Read: { icon: UiEye, tone: \"sky\", label: \"Read file\", summaryOnly: true },\n Write: {\n icon: UiDiff,\n tone: \"amber\",\n label: \"Write file\",\n summaryOnly: true,\n },\n Edit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit file\",\n summaryOnly: true,\n },\n MultiEdit: {\n icon: UiStack,\n tone: \"violet\",\n label: \"Multi-edit\",\n summaryOnly: true,\n },\n NotebookEdit: {\n icon: UiPencilSimpleLine,\n tone: \"violet\",\n label: \"Edit notebook\",\n summaryOnly: true,\n },\n // Search & navigation\n Grep: { icon: UiSearch, tone: \"amber\", label: \"Grep\" },\n Glob: { icon: UiAsterisk, tone: \"sky\", label: \"Glob\" },\n // Execution & shell\n Bash: { icon: UiTerminal, tone: \"emerald\", label: \"Run command\" },\n BashOutput: { icon: UiCode2, tone: \"emerald\", label: \"Shell output\" },\n KillShell: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n KillBash: { icon: UiProhibit, tone: \"rose\", label: \"Kill shell\" },\n // Agents & planning\n Task: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Agent: { icon: UiRobotAi, tone: \"indigo\", label: \"Sub-agent task\" },\n Skill: { icon: UiMagicWand, tone: \"fuchsia\", label: \"Invoke skill\" },\n TodoWrite: { icon: UiListChecks, tone: \"sky\", label: \"Update todos\" },\n Plan: { icon: UiStrategy, tone: \"sky\", label: \"Plan\" },\n TaskCreate: { icon: UiKanban, tone: \"sky\", label: \"Create task\" },\n TaskUpdate: { icon: UiKanban, tone: \"sky\", label: \"Update task\" },\n TaskList: { icon: UiKanban, tone: \"sky\", label: \"List tasks\" },\n TaskGet: { icon: UiKanban, tone: \"sky\", label: \"Get task\" },\n TaskOutput: { icon: UiKanban, tone: \"sky\", label: \"Task output\" },\n TaskStop: { icon: UiProhibit, tone: \"rose\", label: \"Stop task\" },\n ToolSearch: { icon: UiSearch, tone: \"amber\", label: \"Search tools\" },\n AskUserQuestion: { icon: UiQuestion, tone: \"sky\", label: \"Ask user\" },\n EnterPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Enter plan mode\" },\n ExitPlanMode: { icon: UiStrategy, tone: \"sky\", label: \"Exit plan mode\" },\n // Web & browser automation\n WebFetch: { icon: UiCloudDownload, tone: \"sky\", label: \"Fetch URL\" },\n WebSearch: { icon: UiGlobe, tone: \"sky\", label: \"Web search\" },\n browser_navigate: { icon: UiCompass, tone: \"sky\", label: \"Navigate\" },\n browser_navigate_back: {\n icon: UiCompass,\n tone: \"sky\",\n label: \"Navigate back\",\n },\n browser_click: { icon: UiCursorClick, tone: \"sky\", label: \"Click\" },\n browser_triple_click: {\n icon: UiCursorText,\n tone: \"sky\",\n label: \"Triple click\",\n },\n browser_type: { icon: UiKeyboard, tone: \"emerald\", label: \"Type text\" },\n browser_press_key: { icon: UiCommand, tone: \"amber\", label: \"Press key\" },\n browser_snapshot: { icon: UiScan, tone: \"violet\", label: \"Snapshot\" },\n browser_take_screenshot: {\n icon: UiCamera,\n tone: \"indigo\",\n label: \"Screenshot\",\n },\n browser_evaluate: { icon: UiCode2, tone: \"violet\", label: \"Evaluate JS\" },\n browser_console_messages: { icon: UiScroll, tone: \"slate\", label: \"Console\" },\n browser_network_requests: {\n icon: UiShare,\n tone: \"emerald\",\n label: \"Network\",\n },\n browser_wait_for: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n Wait: { icon: UiHourglass, tone: \"amber\", label: \"Wait\" },\n browser_close: { icon: UiClose, tone: \"rose\", label: \"Close browser\" },\n};\n\n// MCP tools surface as `mcp__<server>__<name>` or `<server>__<name>`. Icon\n// servers get a distinct accent (palette); generative servers reuse the sparkle;\n// the rest fall back to the puzzle piece.\nconst MCP_ICON_SERVERS = new Set([\n \"iconify\",\n \"icons8\",\n \"lucide\",\n \"react-icons\",\n]);\nconst MCP_GEN_SERVERS = new Set([\"gemini\", \"openai\", \"anthropic\"]);\n\ninterface McpTool {\n server: string;\n name: string;\n}\n\nexport function splitMcpTool(tool: string): McpTool | null {\n const rest = tool.startsWith(\"mcp__\") ? tool.slice(\"mcp__\".length) : tool;\n const idx = rest.indexOf(\"__\");\n if (idx < 0) return null;\n return { server: rest.slice(0, idx), name: rest.slice(idx + 2) };\n}\n\n/** Resolve the icon, tone, and label for a tool name. */\nexport function getSessionAction(tool: string): SessionActionMeta {\n const exact = ACTIONS[tool];\n if (exact) return exact;\n\n const mcp = splitMcpTool(tool);\n if (mcp) {\n const label = `${mcp.server}: ${mcp.name.replace(/_/g, \" \")}`;\n if (MCP_ICON_SERVERS.has(mcp.server))\n return { icon: UiPalette, tone: \"pink\", label };\n if (MCP_GEN_SERVERS.has(mcp.server))\n return { icon: UiSparkles, tone: \"violet\", label };\n return { icon: UiPuzzle, tone: \"violet\", label };\n }\n\n return { icon: UiWrench, tone: \"slate\", label: tool };\n}\n\n/** Count tool-call events, the dominant model, and totals for the header. */\nexport function summarizeSession(events: SessionEvent[]): {\n toolCount: number;\n messageCount: number;\n model?: string;\n} {\n let toolCount = 0;\n let messageCount = 0;\n const modelCounts = new Map<string, number>();\n for (const event of events) {\n if (event.kind === \"tool\") toolCount += 1;\n if (\n event.kind === \"system\" ||\n event.kind === \"user\" ||\n event.kind === \"assistant\"\n ) {\n messageCount += 1;\n }\n if (event.model)\n modelCounts.set(event.model, (modelCounts.get(event.model) ?? 0) + 1);\n }\n let model: string | undefined;\n let best = 0;\n for (const [name, count] of modelCounts) {\n if (count > best) {\n best = count;\n model = name;\n }\n }\n return { toolCount, messageCount, ...(model ? { model } : {}) };\n}\n"],"names":["WORKFLOW_PHASES","UiEye","UiDiff","UiPencilSimpleLine","UiStack","UiSearch","UiAsterisk","UiTerminal","UiCode2","UiProhibit","UiRobotAi","UiMagicWand","UiListChecks","UiStrategy","UiKanban","UiQuestion","UiCloudDownload","UiGlobe","UiCompass","UiCursorClick","UiCursorText","UiKeyboard","UiCommand","UiScan","UiCamera","UiScroll","UiShare","UiHourglass","UiClose","UiPalette","UiSparkles","UiPuzzle","UiWrench"],"mappings":"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"}
@@ -96,6 +96,14 @@ export interface SessionEvent {
96
96
  raw?: unknown;
97
97
  errorType?: string;
98
98
  errorStatus?: number;
99
+ /** Set for a `verified`/`verify_failed` role — the workflow verify verdict. */
100
+ verifyPassed?: boolean;
101
+ /** Row icon override (e.g. the verify glyph). Renderers fall back to the
102
+ * kind's default icon when absent. */
103
+ icon?: StaticIconComponent;
104
+ /** Row tone override (e.g. pass/fail for a verify row). Renderers fall back
105
+ * to the kind's default tone when absent. */
106
+ tone?: SessionTone;
99
107
  }
100
108
  export declare function truncate(text: string, max: number): string;
101
109
  /** Flatten a captain session (unified messages, entries, or raw log text) into
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewer.model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionViewer.model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.model.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { WORKFLOW_PHASES } from "./agent-action-icons.js";
1
2
  import { UiClose } from "../../icons/components/UiClose.js";
2
3
  import { UiHourglass } from "../../icons/components/UiHourglass.js";
3
4
  import { UiShare } from "../../icons/components/UiShare.js";
@@ -53,7 +54,7 @@ function parseEntries(input) {
53
54
  });
54
55
  }
55
56
  function roleFromType(type) {
56
- return type === "system" || type === "user" || type === "assistant" ? type : "assistant";
57
+ return type === "system" || type === "user" || type === "assistant" || type === "verified" || type === "verify_failed" ? type : "assistant";
57
58
  }
58
59
  function toolEvent(id, tool, input, response, timestamp, meta = {}) {
59
60
  return {
@@ -78,7 +79,7 @@ function toolEvent(id, tool, input, response, timestamp, meta = {}) {
78
79
  ...meta.raw !== void 0 ? { raw: meta.raw } : {}
79
80
  };
80
81
  }
81
- function blockEvent(block, role, id, timestamp, cwd) {
82
+ function blockEvent(block, role, id, timestamp, cwd, verifyPassed) {
82
83
  if (block.type === "tool_use" || block.name && block.input) {
83
84
  if (!block.name) return null;
84
85
  return toolEvent(id, block.name, block.input, void 0, timestamp, {
@@ -93,9 +94,14 @@ function blockEvent(block, role, id, timestamp, cwd) {
93
94
  if (block.text) {
94
95
  return {
95
96
  id,
96
- kind: role === "system" ? "system" : role === "user" ? "user" : "assistant",
97
+ kind: role === "system" || verifyPassed !== void 0 ? "system" : role === "user" ? "user" : "assistant",
97
98
  text: block.text,
98
- ...timestamp ? { timestamp } : {}
99
+ ...timestamp ? { timestamp } : {},
100
+ ...verifyPassed !== void 0 ? {
101
+ verifyPassed,
102
+ tone: verifyPassed ? "emerald" : "rose",
103
+ icon: WORKFLOW_PHASES.verify.icon
104
+ } : {}
99
105
  };
100
106
  }
101
107
  return null;
@@ -148,13 +154,15 @@ function normalizeSession(input) {
148
154
  return;
149
155
  }
150
156
  const role = roleFromType(((_a = entry.message) == null ? void 0 : _a.role) ?? entry.type);
157
+ const verifyPassed = role === "verified" ? true : role === "verify_failed" ? false : void 0;
151
158
  for (const [i, block] of (((_b = entry.message) == null ? void 0 : _b.content) ?? []).entries()) {
152
159
  const ev = blockEvent(
153
160
  block,
154
161
  role,
155
162
  `${baseId}-${i}`,
156
163
  entry.timestamp,
157
- entry.cwd
164
+ entry.cwd,
165
+ verifyPassed
158
166
  );
159
167
  if (ev) events.push(ev);
160
168
  }
@@ -246,7 +254,12 @@ function partEvent(part, role, id, meta) {
246
254
  ...meta.timestamp ? { timestamp: meta.timestamp } : {},
247
255
  ...meta.turnId ? { turnId: meta.turnId } : {},
248
256
  ...meta.agentId ? { agentId: meta.agentId } : {},
249
- ...meta.raw !== void 0 ? { raw: meta.raw } : {}
257
+ ...meta.raw !== void 0 ? { raw: meta.raw } : {},
258
+ ...meta.verifyPassed !== void 0 ? {
259
+ verifyPassed: meta.verifyPassed,
260
+ tone: meta.verifyPassed ? "emerald" : "rose",
261
+ icon: WORKFLOW_PHASES.verify.icon
262
+ } : {}
250
263
  } : null;
251
264
  }
252
265
  return null;
@@ -278,7 +291,8 @@ function normalizeMessages(messages) {
278
291
  });
279
292
  return;
280
293
  }
281
- const role = msg.role === "system" ? "system" : msg.role === "user" ? "user" : "assistant";
294
+ const verifyPassed = msg.role === "verified" ? true : msg.role === "verify_failed" ? false : void 0;
295
+ const role = msg.role === "system" || verifyPassed !== void 0 ? "system" : msg.role === "user" ? "user" : "assistant";
282
296
  const meta = {
283
297
  ...(prov == null ? void 0 : prov.timestamp) ? { timestamp: prov.timestamp } : {},
284
298
  ...(prov == null ? void 0 : prov.cwd) ? { cwd: prov.cwd } : {},
@@ -288,7 +302,8 @@ function normalizeMessages(messages) {
288
302
  ...msg.turnId ? { turnId: msg.turnId } : {},
289
303
  ...(prov == null ? void 0 : prov.agentId) ? { agentId: prov.agentId } : {},
290
304
  ...(prov == null ? void 0 : prov.sessionId) ? { sessionId: prov.sessionId } : {},
291
- ...msg.raw !== void 0 ? { raw: msg.raw } : {}
305
+ ...msg.raw !== void 0 ? { raw: msg.raw } : {},
306
+ ...verifyPassed !== void 0 ? { verifyPassed } : {}
292
307
  };
293
308
  msg.parts.forEach((part, i) => {
294
309
  const ev = partEvent(part, role, `${baseId}-${i}`, meta);