@flanksource/clicky-ui 0.3.58 → 0.3.60

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 (504) hide show
  1. package/NOTICE.md +58 -0
  2. package/dist/clicky.cjs +3 -1
  3. package/dist/clicky.d.ts +1 -0
  4. package/dist/clicky.d.ts.map +1 -1
  5. package/dist/clicky.js +3 -1
  6. package/dist/data/Clicky.cjs +23 -270
  7. package/dist/data/Clicky.cjs.map +1 -1
  8. package/dist/data/Clicky.d.ts +5 -29
  9. package/dist/data/Clicky.d.ts.map +1 -1
  10. package/dist/data/Clicky.js +11 -259
  11. package/dist/data/Clicky.js.map +1 -1
  12. package/dist/data/PromptBanner.model.cjs +10 -0
  13. package/dist/data/PromptBanner.model.cjs.map +1 -1
  14. package/dist/data/PromptBanner.model.d.ts +2 -0
  15. package/dist/data/PromptBanner.model.d.ts.map +1 -1
  16. package/dist/data/PromptBanner.model.js +10 -1
  17. package/dist/data/PromptBanner.model.js.map +1 -1
  18. package/dist/data/PromptDialog.cjs +16 -49
  19. package/dist/data/PromptDialog.cjs.map +1 -1
  20. package/dist/data/PromptDialog.d.ts +7 -1
  21. package/dist/data/PromptDialog.d.ts.map +1 -1
  22. package/dist/data/PromptDialog.js +17 -50
  23. package/dist/data/PromptDialog.js.map +1 -1
  24. package/dist/data/PromptForm.cjs +79 -0
  25. package/dist/data/PromptForm.cjs.map +1 -0
  26. package/dist/data/PromptForm.d.ts +26 -0
  27. package/dist/data/PromptForm.d.ts.map +1 -0
  28. package/dist/data/PromptForm.js +79 -0
  29. package/dist/data/PromptForm.js.map +1 -0
  30. package/dist/data/PromptIndicator.cjs +82 -0
  31. package/dist/data/PromptIndicator.cjs.map +1 -0
  32. package/dist/data/PromptIndicator.d.ts +19 -0
  33. package/dist/data/PromptIndicator.d.ts.map +1 -0
  34. package/dist/data/PromptIndicator.js +82 -0
  35. package/dist/data/PromptIndicator.js.map +1 -0
  36. package/dist/data/PromptList.cjs +67 -0
  37. package/dist/data/PromptList.cjs.map +1 -0
  38. package/dist/data/PromptList.d.ts +13 -0
  39. package/dist/data/PromptList.d.ts.map +1 -0
  40. package/dist/data/PromptList.js +67 -0
  41. package/dist/data/PromptList.js.map +1 -0
  42. package/dist/data/clicky-download.cjs +251 -0
  43. package/dist/data/clicky-download.cjs.map +1 -0
  44. package/dist/data/clicky-download.d.ts +55 -0
  45. package/dist/data/clicky-download.d.ts.map +1 -0
  46. package/dist/data/clicky-download.js +244 -0
  47. package/dist/data/clicky-download.js.map +1 -0
  48. package/dist/data/git/GitChangeList.cjs +11 -4
  49. package/dist/data/git/GitChangeList.cjs.map +1 -1
  50. package/dist/data/git/GitChangeList.d.ts +2 -35
  51. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  52. package/dist/data/git/GitChangeList.js +11 -4
  53. package/dist/data/git/GitChangeList.js.map +1 -1
  54. package/dist/data/git/GitLink.cjs +13 -0
  55. package/dist/data/git/GitLink.cjs.map +1 -0
  56. package/dist/data/git/GitLink.d.ts +8 -0
  57. package/dist/data/git/GitLink.d.ts.map +1 -0
  58. package/dist/data/git/GitLink.js +13 -0
  59. package/dist/data/git/GitLink.js.map +1 -0
  60. package/dist/data/git/git-links.cjs +54 -0
  61. package/dist/data/git/git-links.cjs.map +1 -0
  62. package/dist/data/git/git-links.d.ts +4 -0
  63. package/dist/data/git/git-links.d.ts.map +1 -0
  64. package/dist/data/git/git-links.js +53 -0
  65. package/dist/data/git/git-links.js.map +1 -0
  66. package/dist/data/git/index.d.ts +3 -0
  67. package/dist/data/git/index.d.ts.map +1 -1
  68. package/dist/data/git/types.d.ts +54 -0
  69. package/dist/data/git/types.d.ts.map +1 -0
  70. package/dist/data/test-runner/MatrixMarks.cjs +4 -3
  71. package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
  72. package/dist/data/test-runner/MatrixMarks.d.ts +7 -4
  73. package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
  74. package/dist/data/test-runner/MatrixMarks.js +4 -3
  75. package/dist/data/test-runner/MatrixMarks.js.map +1 -1
  76. package/dist/data/test-runner/TestRunSummary.cjs +1 -1
  77. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  78. package/dist/data/test-runner/TestRunSummary.js +1 -1
  79. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  80. package/dist/data/test-runner/TestTree.cjs +1 -1
  81. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  82. package/dist/data/test-runner/TestTree.js +1 -1
  83. package/dist/data/test-runner/TestTree.js.map +1 -1
  84. package/dist/data/test-runner/TestTreeNode.cjs +2 -2
  85. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  86. package/dist/data/test-runner/TestTreeNode.js +2 -2
  87. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  88. package/dist/data/test-runner/adapter.cjs +7 -0
  89. package/dist/data/test-runner/adapter.cjs.map +1 -1
  90. package/dist/data/test-runner/adapter.d.ts +7 -0
  91. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  92. package/dist/data/test-runner/adapter.js +7 -0
  93. package/dist/data/test-runner/adapter.js.map +1 -1
  94. package/dist/data/test-runner/index.d.ts +1 -1
  95. package/dist/data/test-runner/index.d.ts.map +1 -1
  96. package/dist/data/test-runner/marks.cjs +3 -3
  97. package/dist/data/test-runner/marks.cjs.map +1 -1
  98. package/dist/data/test-runner/marks.js +3 -3
  99. package/dist/data/test-runner/marks.js.map +1 -1
  100. package/dist/data/test-runner/matrix-marks.cjs +12 -3
  101. package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
  102. package/dist/data/test-runner/matrix-marks.d.ts +13 -0
  103. package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
  104. package/dist/data/test-runner/matrix-marks.js +12 -3
  105. package/dist/data/test-runner/matrix-marks.js.map +1 -1
  106. package/dist/data/test-runner/status.cjs +1 -1
  107. package/dist/data/test-runner/status.cjs.map +1 -1
  108. package/dist/data/test-runner/status.js +1 -1
  109. package/dist/data/test-runner/status.js.map +1 -1
  110. package/dist/data/test-runner/types.d.ts +2 -0
  111. package/dist/data/test-runner/types.d.ts.map +1 -1
  112. package/dist/data/traces/index.d.ts +2 -0
  113. package/dist/data/traces/index.d.ts.map +1 -1
  114. package/dist/data/traces/otel/OtelTraceDetail.cjs +102 -78
  115. package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -1
  116. package/dist/data/traces/otel/OtelTraceDetail.d.ts +6 -2
  117. package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -1
  118. package/dist/data/traces/otel/OtelTraceDetail.js +102 -78
  119. package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -1
  120. package/dist/data/traces/otel/OtelTraceTable.cjs +43 -7
  121. package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -1
  122. package/dist/data/traces/otel/OtelTraceTable.d.ts +14 -3
  123. package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -1
  124. package/dist/data/traces/otel/OtelTraceTable.js +44 -8
  125. package/dist/data/traces/otel/OtelTraceTable.js.map +1 -1
  126. package/dist/data/traces/otel/profile-listing.cjs +61 -0
  127. package/dist/data/traces/otel/profile-listing.cjs.map +1 -0
  128. package/dist/data/traces/otel/profile-listing.d.ts +23 -0
  129. package/dist/data/traces/otel/profile-listing.d.ts.map +1 -0
  130. package/dist/data/traces/otel/profile-listing.js +60 -0
  131. package/dist/data/traces/otel/profile-listing.js.map +1 -0
  132. package/dist/data/traces/otel/profile-spans.cjs +22 -0
  133. package/dist/data/traces/otel/profile-spans.cjs.map +1 -0
  134. package/dist/data/traces/otel/profile-spans.d.ts +4 -0
  135. package/dist/data/traces/otel/profile-spans.d.ts.map +1 -0
  136. package/dist/data/traces/otel/profile-spans.js +22 -0
  137. package/dist/data/traces/otel/profile-spans.js.map +1 -0
  138. package/dist/data/traces/otel/span-traces.cjs +7 -1
  139. package/dist/data/traces/otel/span-traces.cjs.map +1 -1
  140. package/dist/data/traces/otel/span-traces.d.ts +2 -0
  141. package/dist/data/traces/otel/span-traces.d.ts.map +1 -1
  142. package/dist/data/traces/otel/span-traces.js +7 -2
  143. package/dist/data/traces/otel/span-traces.js.map +1 -1
  144. package/dist/data/useClickyTableMenu.cjs +33 -0
  145. package/dist/data/useClickyTableMenu.cjs.map +1 -0
  146. package/dist/data/useClickyTableMenu.d.ts +17 -0
  147. package/dist/data/useClickyTableMenu.d.ts.map +1 -0
  148. package/dist/data/useClickyTableMenu.js +33 -0
  149. package/dist/data/useClickyTableMenu.js.map +1 -0
  150. package/dist/data/verification/adapterViews.cjs +3 -1
  151. package/dist/data/verification/adapterViews.cjs.map +1 -1
  152. package/dist/data/verification/adapterViews.d.ts +5 -2
  153. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  154. package/dist/data/verification/adapterViews.js +4 -2
  155. package/dist/data/verification/adapterViews.js.map +1 -1
  156. package/dist/data/verification/adapters.cjs +28 -7
  157. package/dist/data/verification/adapters.cjs.map +1 -1
  158. package/dist/data/verification/adapters.d.ts +7 -1
  159. package/dist/data/verification/adapters.d.ts.map +1 -1
  160. package/dist/data/verification/adapters.js +28 -7
  161. package/dist/data/verification/adapters.js.map +1 -1
  162. package/dist/data/verification/stepKind.cjs +1 -0
  163. package/dist/data/verification/stepKind.cjs.map +1 -1
  164. package/dist/data/verification/stepKind.d.ts.map +1 -1
  165. package/dist/data/verification/stepKind.js +1 -0
  166. package/dist/data/verification/stepKind.js.map +1 -1
  167. package/dist/data/verification/stepKindViews.cjs +17 -0
  168. package/dist/data/verification/stepKindViews.cjs.map +1 -1
  169. package/dist/data/verification/stepKindViews.d.ts +4 -0
  170. package/dist/data/verification/stepKindViews.d.ts.map +1 -1
  171. package/dist/data/verification/stepKindViews.js +17 -1
  172. package/dist/data/verification/stepKindViews.js.map +1 -1
  173. package/dist/data/version-info.cjs +3 -3
  174. package/dist/data/version-info.js +3 -3
  175. package/dist/data.cjs +121 -2
  176. package/dist/data.d.ts +3 -0
  177. package/dist/data.d.ts.map +1 -1
  178. package/dist/data.js +55 -3
  179. package/dist/git.cjs +6 -0
  180. package/dist/git.d.ts +4 -0
  181. package/dist/git.d.ts.map +1 -0
  182. package/dist/git.js +3 -0
  183. package/dist/hooks/use-prompts.cjs +18 -11
  184. package/dist/hooks/use-prompts.cjs.map +1 -1
  185. package/dist/hooks/use-prompts.d.ts.map +1 -1
  186. package/dist/hooks/use-prompts.js +18 -11
  187. package/dist/hooks/use-prompts.js.map +1 -1
  188. package/dist/icons/components/UiApi.cjs +37 -0
  189. package/dist/icons/components/UiApi.cjs.map +1 -0
  190. package/dist/icons/components/UiApi.d.ts +9 -0
  191. package/dist/icons/components/UiApi.d.ts.map +1 -0
  192. package/dist/icons/components/UiApi.js +35 -0
  193. package/dist/icons/components/UiApi.js.map +1 -0
  194. package/dist/icons/components/UiApiBridge.cjs +38 -0
  195. package/dist/icons/components/UiApiBridge.cjs.map +1 -0
  196. package/dist/icons/components/UiApiBridge.d.ts +9 -0
  197. package/dist/icons/components/UiApiBridge.d.ts.map +1 -0
  198. package/dist/icons/components/UiApiBridge.js +36 -0
  199. package/dist/icons/components/UiApiBridge.js.map +1 -0
  200. package/dist/icons/components/UiApiGateway.cjs +33 -0
  201. package/dist/icons/components/UiApiGateway.cjs.map +1 -0
  202. package/dist/icons/components/UiApiGateway.d.ts +9 -0
  203. package/dist/icons/components/UiApiGateway.d.ts.map +1 -0
  204. package/dist/icons/components/UiApiGateway.js +31 -0
  205. package/dist/icons/components/UiApiGateway.js.map +1 -0
  206. package/dist/icons/components/UiApiRequest.cjs +37 -0
  207. package/dist/icons/components/UiApiRequest.cjs.map +1 -0
  208. package/dist/icons/components/UiApiRequest.d.ts +9 -0
  209. package/dist/icons/components/UiApiRequest.d.ts.map +1 -0
  210. package/dist/icons/components/UiApiRequest.js +35 -0
  211. package/dist/icons/components/UiApiRequest.js.map +1 -0
  212. package/dist/icons/components/UiArrowDecision.cjs +51 -0
  213. package/dist/icons/components/UiArrowDecision.cjs.map +1 -0
  214. package/dist/icons/components/UiArrowDecision.d.ts +15 -0
  215. package/dist/icons/components/UiArrowDecision.d.ts.map +1 -0
  216. package/dist/icons/components/UiArrowDecision.js +48 -0
  217. package/dist/icons/components/UiArrowDecision.js.map +1 -0
  218. package/dist/icons/components/UiArrowSquareIn.cjs +51 -0
  219. package/dist/icons/components/UiArrowSquareIn.cjs.map +1 -0
  220. package/dist/icons/components/UiArrowSquareIn.d.ts +15 -0
  221. package/dist/icons/components/UiArrowSquareIn.d.ts.map +1 -0
  222. package/dist/icons/components/UiArrowSquareIn.js +48 -0
  223. package/dist/icons/components/UiArrowSquareIn.js.map +1 -0
  224. package/dist/icons/components/UiBatchCheck.cjs +55 -0
  225. package/dist/icons/components/UiBatchCheck.cjs.map +1 -0
  226. package/dist/icons/components/UiBatchCheck.d.ts +15 -0
  227. package/dist/icons/components/UiBatchCheck.d.ts.map +1 -0
  228. package/dist/icons/components/UiBatchCheck.js +52 -0
  229. package/dist/icons/components/UiBatchCheck.js.map +1 -0
  230. package/dist/icons/components/UiBatchJob.cjs +39 -0
  231. package/dist/icons/components/UiBatchJob.cjs.map +1 -0
  232. package/dist/icons/components/UiBatchJob.d.ts +9 -0
  233. package/dist/icons/components/UiBatchJob.d.ts.map +1 -0
  234. package/dist/icons/components/UiBatchJob.js +37 -0
  235. package/dist/icons/components/UiBatchJob.js.map +1 -0
  236. package/dist/icons/components/UiBatchRequest.cjs +39 -0
  237. package/dist/icons/components/UiBatchRequest.cjs.map +1 -0
  238. package/dist/icons/components/UiBatchRequest.d.ts +9 -0
  239. package/dist/icons/components/UiBatchRequest.d.ts.map +1 -0
  240. package/dist/icons/components/UiBatchRequest.js +37 -0
  241. package/dist/icons/components/UiBatchRequest.js.map +1 -0
  242. package/dist/icons/components/UiBpmnConditional.cjs +29 -0
  243. package/dist/icons/components/UiBpmnConditional.cjs.map +1 -0
  244. package/dist/icons/components/UiBpmnConditional.d.ts +9 -0
  245. package/dist/icons/components/UiBpmnConditional.d.ts.map +1 -0
  246. package/dist/icons/components/UiBpmnConditional.js +27 -0
  247. package/dist/icons/components/UiBpmnConditional.js.map +1 -0
  248. package/dist/icons/components/UiBranchFlow.cjs +33 -0
  249. package/dist/icons/components/UiBranchFlow.cjs.map +1 -0
  250. package/dist/icons/components/UiBranchFlow.d.ts +9 -0
  251. package/dist/icons/components/UiBranchFlow.d.ts.map +1 -0
  252. package/dist/icons/components/UiBranchFlow.js +31 -0
  253. package/dist/icons/components/UiBranchFlow.js.map +1 -0
  254. package/dist/icons/components/UiClassicBatch.cjs +29 -0
  255. package/dist/icons/components/UiClassicBatch.cjs.map +1 -0
  256. package/dist/icons/components/UiClassicBatch.d.ts +9 -0
  257. package/dist/icons/components/UiClassicBatch.d.ts.map +1 -0
  258. package/dist/icons/components/UiClassicBatch.js +27 -0
  259. package/dist/icons/components/UiClassicBatch.js.map +1 -0
  260. package/dist/icons/components/UiCodeFile.cjs +29 -0
  261. package/dist/icons/components/UiCodeFile.cjs.map +1 -0
  262. package/dist/icons/components/UiCodeFile.d.ts +9 -0
  263. package/dist/icons/components/UiCodeFile.d.ts.map +1 -0
  264. package/dist/icons/components/UiCodeFile.js +27 -0
  265. package/dist/icons/components/UiCodeFile.js.map +1 -0
  266. package/dist/icons/components/UiColumnsLayout.cjs +29 -0
  267. package/dist/icons/components/UiColumnsLayout.cjs.map +1 -0
  268. package/dist/icons/components/UiColumnsLayout.d.ts +9 -0
  269. package/dist/icons/components/UiColumnsLayout.d.ts.map +1 -0
  270. package/dist/icons/components/UiColumnsLayout.js +27 -0
  271. package/dist/icons/components/UiColumnsLayout.js.map +1 -0
  272. package/dist/icons/components/UiCondition.cjs +37 -0
  273. package/dist/icons/components/UiCondition.cjs.map +1 -0
  274. package/dist/icons/components/UiCondition.d.ts +9 -0
  275. package/dist/icons/components/UiCondition.d.ts.map +1 -0
  276. package/dist/icons/components/UiCondition.js +35 -0
  277. package/dist/icons/components/UiCondition.js.map +1 -0
  278. package/dist/icons/components/UiConditions.cjs +29 -0
  279. package/dist/icons/components/UiConditions.cjs.map +1 -0
  280. package/dist/icons/components/UiConditions.d.ts +9 -0
  281. package/dist/icons/components/UiConditions.d.ts.map +1 -0
  282. package/dist/icons/components/UiConditions.js +27 -0
  283. package/dist/icons/components/UiConditions.js.map +1 -0
  284. package/dist/icons/components/UiDelayQueue.cjs +40 -0
  285. package/dist/icons/components/UiDelayQueue.cjs.map +1 -0
  286. package/dist/icons/components/UiDelayQueue.d.ts +9 -0
  287. package/dist/icons/components/UiDelayQueue.d.ts.map +1 -0
  288. package/dist/icons/components/UiDelayQueue.js +38 -0
  289. package/dist/icons/components/UiDelayQueue.js.map +1 -0
  290. package/dist/icons/components/UiDynamicForm.cjs +51 -0
  291. package/dist/icons/components/UiDynamicForm.cjs.map +1 -0
  292. package/dist/icons/components/UiDynamicForm.d.ts +15 -0
  293. package/dist/icons/components/UiDynamicForm.d.ts.map +1 -0
  294. package/dist/icons/components/UiDynamicForm.js +48 -0
  295. package/dist/icons/components/UiDynamicForm.js.map +1 -0
  296. package/dist/icons/components/UiFlowArrow.cjs +51 -0
  297. package/dist/icons/components/UiFlowArrow.cjs.map +1 -0
  298. package/dist/icons/components/UiFlowArrow.d.ts +15 -0
  299. package/dist/icons/components/UiFlowArrow.d.ts.map +1 -0
  300. package/dist/icons/components/UiFlowArrow.js +48 -0
  301. package/dist/icons/components/UiFlowArrow.js.map +1 -0
  302. package/dist/icons/components/UiFormFields.cjs +33 -0
  303. package/dist/icons/components/UiFormFields.cjs.map +1 -0
  304. package/dist/icons/components/UiFormFields.d.ts +9 -0
  305. package/dist/icons/components/UiFormFields.d.ts.map +1 -0
  306. package/dist/icons/components/UiFormFields.js +31 -0
  307. package/dist/icons/components/UiFormFields.js.map +1 -0
  308. package/dist/icons/components/UiFormStep.cjs +38 -0
  309. package/dist/icons/components/UiFormStep.cjs.map +1 -0
  310. package/dist/icons/components/UiFormStep.d.ts +9 -0
  311. package/dist/icons/components/UiFormStep.d.ts.map +1 -0
  312. package/dist/icons/components/UiFormStep.js +36 -0
  313. package/dist/icons/components/UiFormStep.js.map +1 -0
  314. package/dist/icons/components/UiGatewayApi.cjs +32 -0
  315. package/dist/icons/components/UiGatewayApi.cjs.map +1 -0
  316. package/dist/icons/components/UiGatewayApi.d.ts +9 -0
  317. package/dist/icons/components/UiGatewayApi.d.ts.map +1 -0
  318. package/dist/icons/components/UiGatewayApi.js +30 -0
  319. package/dist/icons/components/UiGatewayApi.js.map +1 -0
  320. package/dist/icons/components/UiImportArrow.cjs +29 -0
  321. package/dist/icons/components/UiImportArrow.cjs.map +1 -0
  322. package/dist/icons/components/UiImportArrow.d.ts +9 -0
  323. package/dist/icons/components/UiImportArrow.d.ts.map +1 -0
  324. package/dist/icons/components/UiImportArrow.js +27 -0
  325. package/dist/icons/components/UiImportArrow.js.map +1 -0
  326. package/dist/icons/components/UiInputField.cjs +33 -0
  327. package/dist/icons/components/UiInputField.cjs.map +1 -0
  328. package/dist/icons/components/UiInputField.d.ts +9 -0
  329. package/dist/icons/components/UiInputField.d.ts.map +1 -0
  330. package/dist/icons/components/UiInputField.js +31 -0
  331. package/dist/icons/components/UiInputField.js.map +1 -0
  332. package/dist/icons/components/UiInsertTable.cjs +29 -0
  333. package/dist/icons/components/UiInsertTable.cjs.map +1 -0
  334. package/dist/icons/components/UiInsertTable.d.ts +9 -0
  335. package/dist/icons/components/UiInsertTable.d.ts.map +1 -0
  336. package/dist/icons/components/UiInsertTable.js +27 -0
  337. package/dist/icons/components/UiInsertTable.js.map +1 -0
  338. package/dist/icons/components/UiLayoutTemplate.cjs +32 -0
  339. package/dist/icons/components/UiLayoutTemplate.cjs.map +1 -0
  340. package/dist/icons/components/UiLayoutTemplate.d.ts +9 -0
  341. package/dist/icons/components/UiLayoutTemplate.d.ts.map +1 -0
  342. package/dist/icons/components/UiLayoutTemplate.js +30 -0
  343. package/dist/icons/components/UiLayoutTemplate.js.map +1 -0
  344. package/dist/icons/components/UiLayoutWindow.cjs +56 -0
  345. package/dist/icons/components/UiLayoutWindow.cjs.map +1 -0
  346. package/dist/icons/components/UiLayoutWindow.d.ts +15 -0
  347. package/dist/icons/components/UiLayoutWindow.d.ts.map +1 -0
  348. package/dist/icons/components/UiLayoutWindow.js +53 -0
  349. package/dist/icons/components/UiLayoutWindow.js.map +1 -0
  350. package/dist/icons/components/UiListEnd.cjs +33 -0
  351. package/dist/icons/components/UiListEnd.cjs.map +1 -0
  352. package/dist/icons/components/UiListEnd.d.ts +9 -0
  353. package/dist/icons/components/UiListEnd.d.ts.map +1 -0
  354. package/dist/icons/components/UiListEnd.js +31 -0
  355. package/dist/icons/components/UiListEnd.js.map +1 -0
  356. package/dist/icons/components/UiListEndLine.cjs +51 -0
  357. package/dist/icons/components/UiListEndLine.cjs.map +1 -0
  358. package/dist/icons/components/UiListEndLine.d.ts +15 -0
  359. package/dist/icons/components/UiListEndLine.d.ts.map +1 -0
  360. package/dist/icons/components/UiListEndLine.js +48 -0
  361. package/dist/icons/components/UiListEndLine.js.map +1 -0
  362. package/dist/icons/components/UiListNumbers.cjs +51 -0
  363. package/dist/icons/components/UiListNumbers.cjs.map +1 -0
  364. package/dist/icons/components/UiListNumbers.d.ts +15 -0
  365. package/dist/icons/components/UiListNumbers.d.ts.map +1 -0
  366. package/dist/icons/components/UiListNumbers.js +48 -0
  367. package/dist/icons/components/UiListNumbers.js.map +1 -0
  368. package/dist/icons/components/UiLowPriority.cjs +29 -0
  369. package/dist/icons/components/UiLowPriority.cjs.map +1 -0
  370. package/dist/icons/components/UiLowPriority.d.ts +9 -0
  371. package/dist/icons/components/UiLowPriority.d.ts.map +1 -0
  372. package/dist/icons/components/UiLowPriority.js +27 -0
  373. package/dist/icons/components/UiLowPriority.js.map +1 -0
  374. package/dist/icons/components/UiMergeQueue.cjs +38 -0
  375. package/dist/icons/components/UiMergeQueue.cjs.map +1 -0
  376. package/dist/icons/components/UiMergeQueue.d.ts +9 -0
  377. package/dist/icons/components/UiMergeQueue.d.ts.map +1 -0
  378. package/dist/icons/components/UiMergeQueue.js +36 -0
  379. package/dist/icons/components/UiMergeQueue.js.map +1 -0
  380. package/dist/icons/components/UiPipelineStage.cjs +33 -0
  381. package/dist/icons/components/UiPipelineStage.cjs.map +1 -0
  382. package/dist/icons/components/UiPipelineStage.d.ts +9 -0
  383. package/dist/icons/components/UiPipelineStage.d.ts.map +1 -0
  384. package/dist/icons/components/UiPipelineStage.js +31 -0
  385. package/dist/icons/components/UiPipelineStage.js.map +1 -0
  386. package/dist/icons/components/UiPlaylistRemove.cjs +29 -0
  387. package/dist/icons/components/UiPlaylistRemove.cjs.map +1 -0
  388. package/dist/icons/components/UiPlaylistRemove.d.ts +9 -0
  389. package/dist/icons/components/UiPlaylistRemove.d.ts.map +1 -0
  390. package/dist/icons/components/UiPlaylistRemove.js +27 -0
  391. package/dist/icons/components/UiPlaylistRemove.js.map +1 -0
  392. package/dist/icons/components/UiReportForms.cjs +51 -0
  393. package/dist/icons/components/UiReportForms.cjs.map +1 -0
  394. package/dist/icons/components/UiReportForms.d.ts +15 -0
  395. package/dist/icons/components/UiReportForms.d.ts.map +1 -0
  396. package/dist/icons/components/UiReportForms.js +48 -0
  397. package/dist/icons/components/UiReportForms.js.map +1 -0
  398. package/dist/icons/components/UiScreenTemplate.cjs +29 -0
  399. package/dist/icons/components/UiScreenTemplate.cjs.map +1 -0
  400. package/dist/icons/components/UiScreenTemplate.d.ts +9 -0
  401. package/dist/icons/components/UiScreenTemplate.d.ts.map +1 -0
  402. package/dist/icons/components/UiScreenTemplate.js +27 -0
  403. package/dist/icons/components/UiScreenTemplate.js.map +1 -0
  404. package/dist/icons/components/UiServices.cjs +29 -0
  405. package/dist/icons/components/UiServices.cjs.map +1 -0
  406. package/dist/icons/components/UiServices.d.ts +9 -0
  407. package/dist/icons/components/UiServices.d.ts.map +1 -0
  408. package/dist/icons/components/UiServices.js +27 -0
  409. package/dist/icons/components/UiServices.js.map +1 -0
  410. package/dist/icons/components/UiSkipCircle.cjs +51 -0
  411. package/dist/icons/components/UiSkipCircle.cjs.map +1 -0
  412. package/dist/icons/components/UiSkipCircle.d.ts +15 -0
  413. package/dist/icons/components/UiSkipCircle.d.ts.map +1 -0
  414. package/dist/icons/components/UiSkipCircle.js +48 -0
  415. package/dist/icons/components/UiSkipCircle.js.map +1 -0
  416. package/dist/icons/components/UiTaskBatch.cjs +33 -0
  417. package/dist/icons/components/UiTaskBatch.cjs.map +1 -0
  418. package/dist/icons/components/UiTaskBatch.d.ts +9 -0
  419. package/dist/icons/components/UiTaskBatch.d.ts.map +1 -0
  420. package/dist/icons/components/UiTaskBatch.js +31 -0
  421. package/dist/icons/components/UiTaskBatch.js.map +1 -0
  422. package/dist/icons/components/UiTodoList.cjs +29 -0
  423. package/dist/icons/components/UiTodoList.cjs.map +1 -0
  424. package/dist/icons/components/UiTodoList.d.ts +9 -0
  425. package/dist/icons/components/UiTodoList.d.ts.map +1 -0
  426. package/dist/icons/components/UiTodoList.js +27 -0
  427. package/dist/icons/components/UiTodoList.js.map +1 -0
  428. package/dist/icons/components/UiTrayArrowDown.cjs +51 -0
  429. package/dist/icons/components/UiTrayArrowDown.cjs.map +1 -0
  430. package/dist/icons/components/UiTrayArrowDown.d.ts +15 -0
  431. package/dist/icons/components/UiTrayArrowDown.d.ts.map +1 -0
  432. package/dist/icons/components/UiTrayArrowDown.js +48 -0
  433. package/dist/icons/components/UiTrayArrowDown.js.map +1 -0
  434. package/dist/icons/components/UiVault.cjs +51 -0
  435. package/dist/icons/components/UiVault.cjs.map +1 -0
  436. package/dist/icons/components/UiVault.d.ts +15 -0
  437. package/dist/icons/components/UiVault.d.ts.map +1 -0
  438. package/dist/icons/components/UiVault.js +48 -0
  439. package/dist/icons/components/UiVault.js.map +1 -0
  440. package/dist/icons/components/UiWebServiceDefinition.cjs +39 -0
  441. package/dist/icons/components/UiWebServiceDefinition.cjs.map +1 -0
  442. package/dist/icons/components/UiWebServiceDefinition.d.ts +9 -0
  443. package/dist/icons/components/UiWebServiceDefinition.d.ts.map +1 -0
  444. package/dist/icons/components/UiWebServiceDefinition.js +37 -0
  445. package/dist/icons/components/UiWebServiceDefinition.js.map +1 -0
  446. package/dist/icons/components/UiWebhook.cjs +29 -0
  447. package/dist/icons/components/UiWebhook.cjs.map +1 -0
  448. package/dist/icons/components/UiWebhook.d.ts +9 -0
  449. package/dist/icons/components/UiWebhook.d.ts.map +1 -0
  450. package/dist/icons/components/UiWebhook.js +27 -0
  451. package/dist/icons/components/UiWebhook.js.map +1 -0
  452. package/dist/icons/components/UiWebhookLine.cjs +51 -0
  453. package/dist/icons/components/UiWebhookLine.cjs.map +1 -0
  454. package/dist/icons/components/UiWebhookLine.d.ts +15 -0
  455. package/dist/icons/components/UiWebhookLine.d.ts.map +1 -0
  456. package/dist/icons/components/UiWebhookLine.js +48 -0
  457. package/dist/icons/components/UiWebhookLine.js.map +1 -0
  458. package/dist/icons/index.d.ts +58 -0
  459. package/dist/icons/index.d.ts.map +1 -1
  460. package/dist/icons/registry.cjs +90 -0
  461. package/dist/icons/registry.cjs.map +1 -1
  462. package/dist/icons/registry.d.ts.map +1 -1
  463. package/dist/icons/registry.js +90 -0
  464. package/dist/icons/registry.js.map +1 -1
  465. package/dist/icons.cjs +103 -0
  466. package/dist/icons.js +46 -1
  467. package/dist/index.cjs +128 -3
  468. package/dist/index.js +59 -4
  469. package/dist/overlay/DropdownMenu.cjs +17 -14
  470. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  471. package/dist/overlay/DropdownMenu.d.ts +1 -0
  472. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  473. package/dist/overlay/DropdownMenu.js +18 -15
  474. package/dist/overlay/DropdownMenu.js.map +1 -1
  475. package/dist/rpc/EntityExplorerApp.cjs +49 -12
  476. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  477. package/dist/rpc/EntityExplorerApp.d.ts +10 -1
  478. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  479. package/dist/rpc/EntityExplorerApp.js +51 -14
  480. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  481. package/dist/rpc/EntitySurface.cjs +38 -0
  482. package/dist/rpc/EntitySurface.cjs.map +1 -0
  483. package/dist/rpc/EntitySurface.d.ts +17 -0
  484. package/dist/rpc/EntitySurface.d.ts.map +1 -0
  485. package/dist/rpc/EntitySurface.js +38 -0
  486. package/dist/rpc/EntitySurface.js.map +1 -0
  487. package/dist/rpc/ExplorerNav.cjs +48 -0
  488. package/dist/rpc/ExplorerNav.cjs.map +1 -0
  489. package/dist/rpc/ExplorerNav.d.ts +12 -0
  490. package/dist/rpc/ExplorerNav.d.ts.map +1 -0
  491. package/dist/rpc/ExplorerNav.js +48 -0
  492. package/dist/rpc/ExplorerNav.js.map +1 -0
  493. package/dist/rpc/explorer-nav-context.cjs +5 -0
  494. package/dist/rpc/explorer-nav-context.cjs.map +1 -0
  495. package/dist/rpc/explorer-nav-context.d.ts +11 -0
  496. package/dist/rpc/explorer-nav-context.d.ts.map +1 -0
  497. package/dist/rpc/explorer-nav-context.js +6 -0
  498. package/dist/rpc/explorer-nav-context.js.map +1 -0
  499. package/dist/rpc.cjs +4 -0
  500. package/dist/rpc.d.ts +2 -0
  501. package/dist/rpc.d.ts.map +1 -1
  502. package/dist/rpc.js +3 -1
  503. package/dist/styles.css +1 -1
  504. package/package.json +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"adapterViews.cjs","names":["OutcomeIcon","readStepDetail","waitDecidedBy","Expectation","FailureCallout","splitExecutionDetail","withoutSource","ExecutionHeaderView","TestOutput","StepSourceSection","readStepSource","StepKindSections","MalformedStepDetail","JsonView"],"sources":["../../../src/data/verification/adapterViews.tsx"],"sourcesContent":["// Detail-body components for the verification node adapters. Split from\n// adapters.ts (react/only-export-components: a file mixing component\n// declarations with the plain TestNodeAdapter/registry exports loses Fast\n// Refresh). Ported from gavel's VerificationStepOutput.tsx (the checklist list\n// and the CelDetails block).\n\nimport type { ReactNode } from \"react\";\nimport { JsonView } from \"../JsonView\";\nimport { readStepDetail, splitExecutionDetail, waitDecidedBy, type WaitDetail } from \"./stepKind\";\nimport { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepSourceSection } from \"./stepKindViews\";\nimport { readStepSource, withoutSource } from \"./stepSource\";\nimport {\n Expectation,\n OutcomeIcon,\n TestOutput,\n type FixtureContext,\n type Test,\n type TestOutcome,\n} from \"../test-runner\";\n\n// ── Checklist: the synthesized \"Acceptance criteria\" node and its items ────\n\nfunction checklistItemOutcome(item: Test): TestOutcome {\n if (item.failed) return \"failed\";\n if (item.passed) return \"passed\";\n return \"pending\";\n}\n\nfunction ChecklistItemRow({ item }: { item: Test }) {\n return (\n <li className=\"flex items-start gap-1.5 text-xs\">\n <OutcomeIcon outcome={checklistItemOutcome(item)} className=\"mt-0.5 text-sm\" />\n <span className=\"min-w-0\">\n {item.name}\n {item.message ? (\n <span className=\"block text-[11px] text-muted-foreground\">{item.message}</span>\n ) : null}\n </span>\n </li>\n );\n}\n\n/** Renders every checklist item for the \"Acceptance criteria\" parent, or the\n * single item itself when a leaf criterion is selected directly. */\nexport function ChecklistDetail({ node }: { node: Test }) {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n return (\n <div className=\"space-y-2 p-density-4\">\n <ul className=\"space-y-1\">\n {items.map((item, index) => (\n <ChecklistItemRow key={item.task_id ?? index} item={item} />\n ))}\n </ul>\n </div>\n );\n}\n\n// ── Fixture / CEL: the failing-step detail (command + CelDetails) ──────────\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// A command step with no CEL assertion stores the whole command result object\n// in `actual` — the command/output is already rendered above, so dumping it\n// again as JSON is noise. Anything a CEL expression compared is shown as-is,\n// structured values included. `hasCelGate` mirrors gavel's own gate: a plain\n// `context.cel_expression`, or a trace recorded in `node.detail` when the\n// expression itself wasn't preserved on `context`.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\n// CEL detail is rendered only for a failing node: the expression and the\n// values it saw are what explain the verdict.\nexport function CelDetails({ node }: { node: Test }) {\n if (node.passed) return null;\n const context = node.context as FixtureContext | undefined;\n const vars = context?.cel_vars ?? {};\n const expression = readCelTrace(node.detail) || context?.cel_expression;\n const hasCelGate = !!expression;\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const hasComparison = expected !== undefined || actual !== undefined;\n if (!expression && Object.keys(vars).length === 0 && !hasComparison) return null;\n const stepDetail = readStepDetail(node.detail);\n const wait = stepDetail.kind === \"step\" ? stepDetail.step.wait : undefined;\n const checkLabel = wait && wait.outcome !== \"satisfied\" ? waitDecidedBy(wait) : \"expression\";\n return (\n <Expectation\n check={expression}\n checkLabel={checkLabel}\n vars={vars}\n expected={expected}\n actual={actual}\n />\n );\n}\n\n// The texts explaining a failure, most specific first. A text already contained\n// in another (a wait cause that the result message embeds) is not repeated.\nfunction failureTexts(...candidates: (string | undefined)[]): string[] {\n const texts = candidates.filter((text): text is string => !!text);\n return texts.filter((text, i) => !texts.some((other, j) => j !== i && other.includes(text) && (other.length > text.length || j < i)));\n}\n\nfunction FailureMessage({ node, cause, error }: { node: Test; cause: string | undefined; error: string | undefined }) {\n const texts = failureTexts(cause, node.message, error);\n if (texts.length === 0) return null;\n if (!(node.failed || node.timed_out || cause)) return <p className=\"whitespace-pre-wrap break-words text-sm\">{texts.join(\"\\n\")}</p>;\n return (\n <FailureCallout>\n {texts.map((text, i) => <div key={i} className={i > 0 ? \"mt-1 text-xs opacity-90\" : undefined}>{text}</div>)}\n </FailureCallout>\n );\n}\n\nexport function FixtureDetail({ node, renderWait }: { node: Test; renderWait?: (wait: WaitDetail) => ReactNode }) {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const cwd = context?.cwd ?? node.work_dir;\n const stepDetail = readStepDetail(node.detail);\n const { header, rest } = splitExecutionDetail(node.detail);\n // A typed step shows its own sections, so the raw block keeps only what they don't cover.\n const rawDetail = withoutSource(stepDetail.kind === \"step\" ? splitExecutionDetail(stepDetail.step.rest).rest : rest);\n return (\n <div className=\"space-y-4 p-density-4\">\n <ExecutionHeaderView header={header} {...(stepDetail.kind === \"step\" ? { stepKind: stepDetail.step.step.kind } : {})} />\n <FailureMessage node={node} cause={stepDetail.kind === \"step\" ? stepDetail.step.wait?.cause : undefined} error={header.error} />\n {command && (\n <div className=\"min-w-0 space-y-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">Command</div>\n <code className=\"block overflow-x-auto whitespace-pre rounded bg-muted px-2 py-1.5 text-xs\">\n {command}\n </code>\n <div className=\"flex flex-wrap items-center gap-2 text-[10px] text-muted-foreground\">\n {cwd && <span>in {cwd}</span>}\n {typeof context?.exit_code === \"number\" && (\n <span className={context.exit_code === 0 ? undefined : \"text-red-600\"}>\n exit {context.exit_code}\n </span>\n )}\n </div>\n </div>\n )}\n <TestOutput node={node} />\n <CelDetails node={node} />\n <StepSourceSection result={readStepSource(node.detail)} />\n {stepDetail.kind === \"step\" && <StepKindSections step={stepDetail.step} {...(renderWait ? { renderWait } : {})} />}\n {stepDetail.kind === \"invalid\" && <MalformedStepDetail error={stepDetail.error} />}\n {rawDetail != null && (\n <details className=\"text-muted-foreground\" data-raw-detail=\"\">\n <summary className=\"cursor-pointer text-[10px] uppercase tracking-wide\">Raw detail</summary>\n <div className=\"mt-1 text-foreground\">\n <JsonView data={rawDetail} />\n </div>\n </details>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapterViews.cjs","names":["OutcomeIcon","readStepDetail","waitDecidedBy","Expectation","FailureCallout","splitExecutionDetail","withoutSource","ExecutionHeaderView","StepPendingFormSection","TestOutput","StepSourceSection","readStepSource","StepKindSections","MalformedStepDetail","JsonView"],"sources":["../../../src/data/verification/adapterViews.tsx"],"sourcesContent":["// Detail-body components for the verification node adapters. Split from\n// adapters.ts (react/only-export-components: a file mixing component\n// declarations with the plain TestNodeAdapter/registry exports loses Fast\n// Refresh). Ported from gavel's VerificationStepOutput.tsx (the checklist list\n// and the CelDetails block).\n\nimport type { ReactNode } from \"react\";\nimport { JsonView } from \"../JsonView\";\nimport { readStepDetail, splitExecutionDetail, waitDecidedBy, type WaitDetail } from \"./stepKind\";\nimport { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepPendingFormSection, StepSourceSection } from \"./stepKindViews\";\nimport { readStepSource, withoutSource } from \"./stepSource\";\nimport {\n Expectation,\n OutcomeIcon,\n TestOutput,\n type FixtureContext,\n type Test,\n type TestOutcome,\n} from \"../test-runner\";\n\n// ── Checklist: the synthesized \"Acceptance criteria\" node and its items ────\n\nfunction checklistItemOutcome(item: Test): TestOutcome {\n if (item.failed) return \"failed\";\n if (item.passed) return \"passed\";\n return \"pending\";\n}\n\nfunction ChecklistItemRow({ item }: { item: Test }) {\n return (\n <li className=\"flex items-start gap-1.5 text-xs\">\n <OutcomeIcon outcome={checklistItemOutcome(item)} className=\"mt-0.5 text-sm\" />\n <span className=\"min-w-0\">\n {item.name}\n {item.message ? (\n <span className=\"block text-[11px] text-muted-foreground\">{item.message}</span>\n ) : null}\n </span>\n </li>\n );\n}\n\n/** Renders every checklist item for the \"Acceptance criteria\" parent, or the\n * single item itself when a leaf criterion is selected directly. */\nexport function ChecklistDetail({ node }: { node: Test }) {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n return (\n <div className=\"space-y-2 p-density-4\">\n <ul className=\"space-y-1\">\n {items.map((item, index) => (\n <ChecklistItemRow key={item.task_id ?? index} item={item} />\n ))}\n </ul>\n </div>\n );\n}\n\n// ── Fixture / CEL: the failing-step detail (command + CelDetails) ──────────\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// A command step with no CEL assertion stores the whole command result object\n// in `actual` — the command/output is already rendered above, so dumping it\n// again as JSON is noise. Anything a CEL expression compared is shown as-is,\n// structured values included. `hasCelGate` mirrors gavel's own gate: a plain\n// `context.cel_expression`, or a trace recorded in `node.detail` when the\n// expression itself wasn't preserved on `context`.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\n// CEL detail is rendered only for a failing node: the expression and the\n// values it saw are what explain the verdict.\nexport function CelDetails({ node }: { node: Test }) {\n if (node.passed) return null;\n const context = node.context as FixtureContext | undefined;\n const vars = context?.cel_vars ?? {};\n const expression = readCelTrace(node.detail) || context?.cel_expression;\n const hasCelGate = !!expression;\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const hasComparison = expected !== undefined || actual !== undefined;\n if (!expression && Object.keys(vars).length === 0 && !hasComparison) return null;\n const stepDetail = readStepDetail(node.detail);\n const wait = stepDetail.kind === \"step\" ? stepDetail.step.wait : undefined;\n const checkLabel = wait && wait.outcome !== \"satisfied\" ? waitDecidedBy(wait) : \"expression\";\n return (\n <Expectation\n check={expression}\n checkLabel={checkLabel}\n vars={vars}\n expected={expected}\n actual={actual}\n />\n );\n}\n\n// The texts explaining a failure, most specific first. A text already contained\n// in another (a wait cause that the result message embeds) is not repeated.\nfunction failureTexts(...candidates: (string | undefined)[]): string[] {\n const texts = candidates.filter((text): text is string => !!text);\n return texts.filter((text, i) => !texts.some((other, j) => j !== i && other.includes(text) && (other.length > text.length || j < i)));\n}\n\nfunction FailureMessage({ node, cause, error }: { node: Test; cause: string | undefined; error: string | undefined }) {\n const texts = failureTexts(cause, node.message, error);\n if (texts.length === 0) return null;\n if (!(node.failed || node.timed_out || cause)) return <p className=\"whitespace-pre-wrap break-words text-sm\">{texts.join(\"\\n\")}</p>;\n return (\n <FailureCallout>\n {texts.map((text, i) => <div key={i} className={i > 0 ? \"mt-1 text-xs opacity-90\" : undefined}>{text}</div>)}\n </FailureCallout>\n );\n}\n\nexport type FixtureDetailProps = {\n node: Test;\n renderWait?: (wait: WaitDetail) => ReactNode;\n /** The answerable form of a step waiting on a person (`node.waiting`); the host owns the prompt it answers. */\n renderPendingPrompt?: (node: Test) => ReactNode;\n};\n\nexport function FixtureDetail({ node, renderWait, renderPendingPrompt }: FixtureDetailProps) {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const cwd = context?.cwd ?? node.work_dir;\n const stepDetail = readStepDetail(node.detail);\n const { header, rest } = splitExecutionDetail(node.detail);\n // A typed step shows its own sections, so the raw block keeps only what they don't cover.\n const rawDetail = withoutSource(stepDetail.kind === \"step\" ? splitExecutionDetail(stepDetail.step.rest).rest : rest);\n const pendingForm = node.waiting === true && renderPendingPrompt ? renderPendingPrompt(node) : null;\n return (\n <div className=\"space-y-4 p-density-4\">\n <ExecutionHeaderView header={header} {...(stepDetail.kind === \"step\" ? { stepKind: stepDetail.step.step.kind } : {})} />\n {pendingForm != null && <StepPendingFormSection>{pendingForm}</StepPendingFormSection>}\n <FailureMessage node={node} cause={stepDetail.kind === \"step\" ? stepDetail.step.wait?.cause : undefined} error={header.error} />\n {command && (\n <div className=\"min-w-0 space-y-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">Command</div>\n <code className=\"block overflow-x-auto whitespace-pre rounded bg-muted px-2 py-1.5 text-xs\">\n {command}\n </code>\n <div className=\"flex flex-wrap items-center gap-2 text-[10px] text-muted-foreground\">\n {cwd && <span>in {cwd}</span>}\n {typeof context?.exit_code === \"number\" && (\n <span className={context.exit_code === 0 ? undefined : \"text-red-600\"}>\n exit {context.exit_code}\n </span>\n )}\n </div>\n </div>\n )}\n <TestOutput node={node} />\n <CelDetails node={node} />\n <StepSourceSection result={readStepSource(node.detail)} />\n {stepDetail.kind === \"step\" && <StepKindSections step={stepDetail.step} {...(renderWait ? { renderWait } : {})} />}\n {stepDetail.kind === \"invalid\" && <MalformedStepDetail error={stepDetail.error} />}\n {rawDetail != null && (\n <details className=\"text-muted-foreground\" data-raw-detail=\"\">\n <summary className=\"cursor-pointer text-[10px] uppercase tracking-wide\">Raw detail</summary>\n <div className=\"mt-1 text-foreground\">\n <JsonView data={rawDetail} />\n </div>\n </details>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAsBA,SAAS,qBAAqB,MAAyB;CACrD,IAAI,KAAK,QAAQ,OAAO;CACxB,IAAI,KAAK,QAAQ,OAAO;CACxB,OAAO;AACT;AAEA,SAAS,iBAAiB,EAAE,QAAwB;CAClD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;EAAI,WAAU;EAAd,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,kBAAAA,aAAD;GAAa,SAAS,qBAAqB,IAAI;GAAG,WAAU;EAAkB,CAAA,GAC9E,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACG,KAAK,MACL,KAAK,UACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAU;IAA2C,UAAA,KAAK;GAAc,CAAA,IAC5E,IACA;EACJ,CAAA,CAAA;;AAER;;;AAIA,SAAgB,gBAAgB,EAAE,QAAwB;CACxD,MAAM,QAAQ,KAAK,YAAY,KAAK,SAAS,SAAS,IAAI,KAAK,WAAW,CAAC,IAAI;CAC/E,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAU;EACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM,KAAK,MAAM,UAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD,EAAoD,KAAO,GAApC,KAAK,WAAW,KAAoB,CAC5D;EACC,CAAA;CACD,CAAA;AAET;AAIA,SAAS,aAAa,QAAqC;CACzD,IAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;EAClE,MAAM,QAAS,OAAmC;EAClD,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG,OAAO;CAC5D;AAEF;AAQA,SAAS,gBAAgB,YAAqB,OAAyB;CACrE,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,IAAI,YAAY,OAAO;CACvB,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO,KAAA;CACjF,OAAO;AACT;AAIA,SAAgB,WAAW,EAAE,QAAwB;CACnD,IAAI,KAAK,QAAQ,OAAO;CACxB,MAAM,UAAU,KAAK;CACrB,MAAM,OAAO,SAAS,YAAY,CAAC;CACnC,MAAM,aAAa,aAAa,KAAK,MAAM,KAAK,SAAS;CACzD,MAAM,aAAa,CAAC,CAAC;CACrB,MAAM,WAAW,gBAAgB,YAAY,SAAS,QAAQ;CAC9D,MAAM,SAAS,gBAAgB,YAAY,SAAS,MAAM;CAC1D,MAAM,gBAAgB,aAAa,KAAA,KAAa,WAAW,KAAA;CAC3D,IAAI,CAAC,cAAc,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,eAAe,OAAO;CAC5E,MAAM,aAAaC,iBAAAA,eAAe,KAAK,MAAM;CAC7C,MAAM,OAAO,WAAW,SAAS,SAAS,WAAW,KAAK,OAAO,KAAA;CACjE,MAAM,aAAa,QAAQ,KAAK,YAAY,cAAcC,iBAAAA,cAAc,IAAI,IAAI;CAChF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,aAAD;EACE,OAAO;EACK;EACN;EACI;EACF;CACT,CAAA;AAEL;AAIA,SAAS,aAAa,GAAG,YAA8C;CACrE,MAAM,QAAQ,WAAW,QAAQ,SAAyB,CAAC,CAAC,IAAI;CAChE,OAAO,MAAM,QAAQ,MAAM,MAAM,CAAC,MAAM,MAAM,OAAO,MAAM,MAAM,KAAK,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,KAAK,UAAU,IAAI,EAAE,CAAC;AACtI;AAEA,SAAS,eAAe,EAAE,MAAM,OAAO,SAA+E;CACpH,MAAM,QAAQ,aAAa,OAAO,KAAK,SAAS,KAAK;CACrD,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,IAAI,EAAE,KAAK,UAAU,KAAK,aAAa,QAAQ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;EAAG,WAAU;EAA2C,UAAA,MAAM,KAAK,IAAI;CAAK,CAAA;CAClI,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,gBAAD,EAAA,UACG,MAAM,KAAK,MAAM,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAa,WAAW,IAAI,IAAI,4BAA4B,KAAA;EAAY,UAAA;CAAU,GAAxE,CAAwE,CAAC,EAC7F,CAAA;AAEpB;AASA,SAAgB,cAAc,EAAE,MAAM,YAAY,uBAA2C;CAC3F,MAAM,UAAU,KAAK;CACrB,MAAM,UAAU,SAAS,WAAW,KAAK;CACzC,MAAM,MAAM,SAAS,OAAO,KAAK;CACjC,MAAM,aAAaH,iBAAAA,eAAe,KAAK,MAAM;CAC7C,MAAM,EAAE,QAAQ,SAASI,iBAAAA,qBAAqB,KAAK,MAAM;CAEzD,MAAM,YAAYC,mBAAAA,cAAc,WAAW,SAAS,SAASD,iBAAAA,qBAAqB,WAAW,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI;CACnH,MAAM,cAAc,KAAK,YAAY,QAAQ,sBAAsB,oBAAoB,IAAI,IAAI;CAC/F,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,sBAAAA,qBAAD;IAA6B;IAAQ,GAAK,WAAW,SAAS,SAAS,EAAE,UAAU,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC;GAAK,CAAA;GACtH,eAAe,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,wBAAD,EAAA,UAAyB,YAAoC,CAAA;GACrF,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;IAAsB;IAAM,OAAO,WAAW,SAAS,SAAS,WAAW,KAAK,MAAM,QAAQ,KAAA;IAAW,OAAO,OAAO;GAAQ,CAAA;GAC9H,WACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MAA4D,UAAA;KAAY,CAAA;KACvF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAU;MACb,UAAA;KACG,CAAA;KACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACG,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,OAAI,GAAU,EAAA,CAAA,GAC3B,OAAO,SAAS,cAAc,YAC7B,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAW,QAAQ,cAAc,IAAI,KAAA,IAAY;OAAvD,UAAA,CAAuE,SAC/D,QAAQ,SACV;MAEL,CAAA,CAAA;;IACF;;GAEP,iBAAA,GAAA,kBAAA,IAAA,CAACC,0BAAAA,YAAD,EAAkB,KAAO,CAAA;GACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD,EAAkB,KAAO,CAAA;GACzB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,mBAAD,EAAmB,QAAQC,mBAAAA,eAAe,KAAK,MAAM,EAAI,CAAA;GACxD,WAAW,SAAS,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,kBAAD;IAAkB,MAAM,WAAW;IAAM,GAAK,aAAa,EAAE,WAAW,IAAI,CAAC;GAAK,CAAA;GAChH,WAAW,SAAS,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,qBAAD,EAAqB,OAAO,WAAW,MAAQ,CAAA;GAChF,aAAa,QACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAwB,mBAAgB;IAA3D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAS,WAAU;KAAqD,UAAA;IAAmB,CAAA,GAC3F,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAU;KACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,UAAD,EAAU,MAAM,UAAY,CAAA;IACzB,CAAA,CACE;;EAER;;AAET"}
@@ -9,8 +9,11 @@ export declare function ChecklistDetail({ node }: {
9
9
  export declare function CelDetails({ node }: {
10
10
  node: Test;
11
11
  }): import("react").JSX.Element | null;
12
- export declare function FixtureDetail({ node, renderWait }: {
12
+ export type FixtureDetailProps = {
13
13
  node: Test;
14
14
  renderWait?: (wait: WaitDetail) => ReactNode;
15
- }): import("react").JSX.Element;
15
+ /** The answerable form of a step waiting on a person (`node.waiting`); the host owns the prompt it answers. */
16
+ renderPendingPrompt?: (node: Test) => ReactNode;
17
+ };
18
+ export declare function FixtureDetail({ node, renderWait, renderPendingPrompt }: FixtureDetailProps): import("react").JSX.Element;
16
19
  //# sourceMappingURL=adapterViews.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapterViews.d.ts","sourceRoot":"","sources":["../../../src/data/verification/adapterViews.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAuD,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGlG,OAAO,EAKL,KAAK,IAAI,EAEV,MAAM,gBAAgB,CAAC;AAwBxB;qEACqE;AACrE,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,+BAWvD;AA2BD,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,sCAsBlD;AAoBD,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAA;CAAE,+BA2C/G"}
1
+ {"version":3,"file":"adapterViews.d.ts","sourceRoot":"","sources":["../../../src/data/verification/adapterViews.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAuD,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGlG,OAAO,EAKL,KAAK,IAAI,EAEV,MAAM,gBAAgB,CAAC;AAwBxB;qEACqE;AACrE,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,+BAWvD;AA2BD,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,sCAsBlD;AAoBD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;IAC7C,+GAA+G;IAC/G,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC;CACjD,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,mBAAmB,EAAE,EAAE,kBAAkB,+BA6C1F"}
@@ -3,7 +3,7 @@ import { OutcomeIcon } from "../test-runner/MarkIcons.js";
3
3
  import { Expectation } from "../test-runner/Expectation.js";
4
4
  import { TestOutput } from "../test-runner/TestFailureDetail.js";
5
5
  import { readStepDetail, splitExecutionDetail, waitDecidedBy } from "./stepKind.js";
6
- import { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepSourceSection } from "./stepKindViews.js";
6
+ import { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepPendingFormSection, StepSourceSection } from "./stepKindViews.js";
7
7
  import { readStepSource, withoutSource } from "./stepSource.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  // src/data/verification/adapterViews.tsx
@@ -88,13 +88,14 @@ function FailureMessage({ node, cause, error }) {
88
88
  children: text
89
89
  }, i)) });
90
90
  }
91
- function FixtureDetail({ node, renderWait }) {
91
+ function FixtureDetail({ node, renderWait, renderPendingPrompt }) {
92
92
  const context = node.context;
93
93
  const command = context?.command ?? node.command;
94
94
  const cwd = context?.cwd ?? node.work_dir;
95
95
  const stepDetail = readStepDetail(node.detail);
96
96
  const { header, rest } = splitExecutionDetail(node.detail);
97
97
  const rawDetail = withoutSource(stepDetail.kind === "step" ? splitExecutionDetail(stepDetail.step.rest).rest : rest);
98
+ const pendingForm = node.waiting === true && renderPendingPrompt ? renderPendingPrompt(node) : null;
98
99
  return /* @__PURE__ */ jsxs("div", {
99
100
  className: "space-y-4 p-density-4",
100
101
  children: [
@@ -102,6 +103,7 @@ function FixtureDetail({ node, renderWait }) {
102
103
  header,
103
104
  ...stepDetail.kind === "step" ? { stepKind: stepDetail.step.step.kind } : {}
104
105
  }),
106
+ pendingForm != null && /* @__PURE__ */ jsx(StepPendingFormSection, { children: pendingForm }),
105
107
  /* @__PURE__ */ jsx(FailureMessage, {
106
108
  node,
107
109
  cause: stepDetail.kind === "step" ? stepDetail.step.wait?.cause : void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"adapterViews.js","names":[],"sources":["../../../src/data/verification/adapterViews.tsx"],"sourcesContent":["// Detail-body components for the verification node adapters. Split from\n// adapters.ts (react/only-export-components: a file mixing component\n// declarations with the plain TestNodeAdapter/registry exports loses Fast\n// Refresh). Ported from gavel's VerificationStepOutput.tsx (the checklist list\n// and the CelDetails block).\n\nimport type { ReactNode } from \"react\";\nimport { JsonView } from \"../JsonView\";\nimport { readStepDetail, splitExecutionDetail, waitDecidedBy, type WaitDetail } from \"./stepKind\";\nimport { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepSourceSection } from \"./stepKindViews\";\nimport { readStepSource, withoutSource } from \"./stepSource\";\nimport {\n Expectation,\n OutcomeIcon,\n TestOutput,\n type FixtureContext,\n type Test,\n type TestOutcome,\n} from \"../test-runner\";\n\n// ── Checklist: the synthesized \"Acceptance criteria\" node and its items ────\n\nfunction checklistItemOutcome(item: Test): TestOutcome {\n if (item.failed) return \"failed\";\n if (item.passed) return \"passed\";\n return \"pending\";\n}\n\nfunction ChecklistItemRow({ item }: { item: Test }) {\n return (\n <li className=\"flex items-start gap-1.5 text-xs\">\n <OutcomeIcon outcome={checklistItemOutcome(item)} className=\"mt-0.5 text-sm\" />\n <span className=\"min-w-0\">\n {item.name}\n {item.message ? (\n <span className=\"block text-[11px] text-muted-foreground\">{item.message}</span>\n ) : null}\n </span>\n </li>\n );\n}\n\n/** Renders every checklist item for the \"Acceptance criteria\" parent, or the\n * single item itself when a leaf criterion is selected directly. */\nexport function ChecklistDetail({ node }: { node: Test }) {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n return (\n <div className=\"space-y-2 p-density-4\">\n <ul className=\"space-y-1\">\n {items.map((item, index) => (\n <ChecklistItemRow key={item.task_id ?? index} item={item} />\n ))}\n </ul>\n </div>\n );\n}\n\n// ── Fixture / CEL: the failing-step detail (command + CelDetails) ──────────\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// A command step with no CEL assertion stores the whole command result object\n// in `actual` — the command/output is already rendered above, so dumping it\n// again as JSON is noise. Anything a CEL expression compared is shown as-is,\n// structured values included. `hasCelGate` mirrors gavel's own gate: a plain\n// `context.cel_expression`, or a trace recorded in `node.detail` when the\n// expression itself wasn't preserved on `context`.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\n// CEL detail is rendered only for a failing node: the expression and the\n// values it saw are what explain the verdict.\nexport function CelDetails({ node }: { node: Test }) {\n if (node.passed) return null;\n const context = node.context as FixtureContext | undefined;\n const vars = context?.cel_vars ?? {};\n const expression = readCelTrace(node.detail) || context?.cel_expression;\n const hasCelGate = !!expression;\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const hasComparison = expected !== undefined || actual !== undefined;\n if (!expression && Object.keys(vars).length === 0 && !hasComparison) return null;\n const stepDetail = readStepDetail(node.detail);\n const wait = stepDetail.kind === \"step\" ? stepDetail.step.wait : undefined;\n const checkLabel = wait && wait.outcome !== \"satisfied\" ? waitDecidedBy(wait) : \"expression\";\n return (\n <Expectation\n check={expression}\n checkLabel={checkLabel}\n vars={vars}\n expected={expected}\n actual={actual}\n />\n );\n}\n\n// The texts explaining a failure, most specific first. A text already contained\n// in another (a wait cause that the result message embeds) is not repeated.\nfunction failureTexts(...candidates: (string | undefined)[]): string[] {\n const texts = candidates.filter((text): text is string => !!text);\n return texts.filter((text, i) => !texts.some((other, j) => j !== i && other.includes(text) && (other.length > text.length || j < i)));\n}\n\nfunction FailureMessage({ node, cause, error }: { node: Test; cause: string | undefined; error: string | undefined }) {\n const texts = failureTexts(cause, node.message, error);\n if (texts.length === 0) return null;\n if (!(node.failed || node.timed_out || cause)) return <p className=\"whitespace-pre-wrap break-words text-sm\">{texts.join(\"\\n\")}</p>;\n return (\n <FailureCallout>\n {texts.map((text, i) => <div key={i} className={i > 0 ? \"mt-1 text-xs opacity-90\" : undefined}>{text}</div>)}\n </FailureCallout>\n );\n}\n\nexport function FixtureDetail({ node, renderWait }: { node: Test; renderWait?: (wait: WaitDetail) => ReactNode }) {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const cwd = context?.cwd ?? node.work_dir;\n const stepDetail = readStepDetail(node.detail);\n const { header, rest } = splitExecutionDetail(node.detail);\n // A typed step shows its own sections, so the raw block keeps only what they don't cover.\n const rawDetail = withoutSource(stepDetail.kind === \"step\" ? splitExecutionDetail(stepDetail.step.rest).rest : rest);\n return (\n <div className=\"space-y-4 p-density-4\">\n <ExecutionHeaderView header={header} {...(stepDetail.kind === \"step\" ? { stepKind: stepDetail.step.step.kind } : {})} />\n <FailureMessage node={node} cause={stepDetail.kind === \"step\" ? stepDetail.step.wait?.cause : undefined} error={header.error} />\n {command && (\n <div className=\"min-w-0 space-y-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">Command</div>\n <code className=\"block overflow-x-auto whitespace-pre rounded bg-muted px-2 py-1.5 text-xs\">\n {command}\n </code>\n <div className=\"flex flex-wrap items-center gap-2 text-[10px] text-muted-foreground\">\n {cwd && <span>in {cwd}</span>}\n {typeof context?.exit_code === \"number\" && (\n <span className={context.exit_code === 0 ? undefined : \"text-red-600\"}>\n exit {context.exit_code}\n </span>\n )}\n </div>\n </div>\n )}\n <TestOutput node={node} />\n <CelDetails node={node} />\n <StepSourceSection result={readStepSource(node.detail)} />\n {stepDetail.kind === \"step\" && <StepKindSections step={stepDetail.step} {...(renderWait ? { renderWait } : {})} />}\n {stepDetail.kind === \"invalid\" && <MalformedStepDetail error={stepDetail.error} />}\n {rawDetail != null && (\n <details className=\"text-muted-foreground\" data-raw-detail=\"\">\n <summary className=\"cursor-pointer text-[10px] uppercase tracking-wide\">Raw detail</summary>\n <div className=\"mt-1 text-foreground\">\n <JsonView data={rawDetail} />\n </div>\n </details>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapterViews.js","names":[],"sources":["../../../src/data/verification/adapterViews.tsx"],"sourcesContent":["// Detail-body components for the verification node adapters. Split from\n// adapters.ts (react/only-export-components: a file mixing component\n// declarations with the plain TestNodeAdapter/registry exports loses Fast\n// Refresh). Ported from gavel's VerificationStepOutput.tsx (the checklist list\n// and the CelDetails block).\n\nimport type { ReactNode } from \"react\";\nimport { JsonView } from \"../JsonView\";\nimport { readStepDetail, splitExecutionDetail, waitDecidedBy, type WaitDetail } from \"./stepKind\";\nimport { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepPendingFormSection, StepSourceSection } from \"./stepKindViews\";\nimport { readStepSource, withoutSource } from \"./stepSource\";\nimport {\n Expectation,\n OutcomeIcon,\n TestOutput,\n type FixtureContext,\n type Test,\n type TestOutcome,\n} from \"../test-runner\";\n\n// ── Checklist: the synthesized \"Acceptance criteria\" node and its items ────\n\nfunction checklistItemOutcome(item: Test): TestOutcome {\n if (item.failed) return \"failed\";\n if (item.passed) return \"passed\";\n return \"pending\";\n}\n\nfunction ChecklistItemRow({ item }: { item: Test }) {\n return (\n <li className=\"flex items-start gap-1.5 text-xs\">\n <OutcomeIcon outcome={checklistItemOutcome(item)} className=\"mt-0.5 text-sm\" />\n <span className=\"min-w-0\">\n {item.name}\n {item.message ? (\n <span className=\"block text-[11px] text-muted-foreground\">{item.message}</span>\n ) : null}\n </span>\n </li>\n );\n}\n\n/** Renders every checklist item for the \"Acceptance criteria\" parent, or the\n * single item itself when a leaf criterion is selected directly. */\nexport function ChecklistDetail({ node }: { node: Test }) {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n return (\n <div className=\"space-y-2 p-density-4\">\n <ul className=\"space-y-1\">\n {items.map((item, index) => (\n <ChecklistItemRow key={item.task_id ?? index} item={item} />\n ))}\n </ul>\n </div>\n );\n}\n\n// ── Fixture / CEL: the failing-step detail (command + CelDetails) ──────────\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// A command step with no CEL assertion stores the whole command result object\n// in `actual` — the command/output is already rendered above, so dumping it\n// again as JSON is noise. Anything a CEL expression compared is shown as-is,\n// structured values included. `hasCelGate` mirrors gavel's own gate: a plain\n// `context.cel_expression`, or a trace recorded in `node.detail` when the\n// expression itself wasn't preserved on `context`.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\n// CEL detail is rendered only for a failing node: the expression and the\n// values it saw are what explain the verdict.\nexport function CelDetails({ node }: { node: Test }) {\n if (node.passed) return null;\n const context = node.context as FixtureContext | undefined;\n const vars = context?.cel_vars ?? {};\n const expression = readCelTrace(node.detail) || context?.cel_expression;\n const hasCelGate = !!expression;\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const hasComparison = expected !== undefined || actual !== undefined;\n if (!expression && Object.keys(vars).length === 0 && !hasComparison) return null;\n const stepDetail = readStepDetail(node.detail);\n const wait = stepDetail.kind === \"step\" ? stepDetail.step.wait : undefined;\n const checkLabel = wait && wait.outcome !== \"satisfied\" ? waitDecidedBy(wait) : \"expression\";\n return (\n <Expectation\n check={expression}\n checkLabel={checkLabel}\n vars={vars}\n expected={expected}\n actual={actual}\n />\n );\n}\n\n// The texts explaining a failure, most specific first. A text already contained\n// in another (a wait cause that the result message embeds) is not repeated.\nfunction failureTexts(...candidates: (string | undefined)[]): string[] {\n const texts = candidates.filter((text): text is string => !!text);\n return texts.filter((text, i) => !texts.some((other, j) => j !== i && other.includes(text) && (other.length > text.length || j < i)));\n}\n\nfunction FailureMessage({ node, cause, error }: { node: Test; cause: string | undefined; error: string | undefined }) {\n const texts = failureTexts(cause, node.message, error);\n if (texts.length === 0) return null;\n if (!(node.failed || node.timed_out || cause)) return <p className=\"whitespace-pre-wrap break-words text-sm\">{texts.join(\"\\n\")}</p>;\n return (\n <FailureCallout>\n {texts.map((text, i) => <div key={i} className={i > 0 ? \"mt-1 text-xs opacity-90\" : undefined}>{text}</div>)}\n </FailureCallout>\n );\n}\n\nexport type FixtureDetailProps = {\n node: Test;\n renderWait?: (wait: WaitDetail) => ReactNode;\n /** The answerable form of a step waiting on a person (`node.waiting`); the host owns the prompt it answers. */\n renderPendingPrompt?: (node: Test) => ReactNode;\n};\n\nexport function FixtureDetail({ node, renderWait, renderPendingPrompt }: FixtureDetailProps) {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const cwd = context?.cwd ?? node.work_dir;\n const stepDetail = readStepDetail(node.detail);\n const { header, rest } = splitExecutionDetail(node.detail);\n // A typed step shows its own sections, so the raw block keeps only what they don't cover.\n const rawDetail = withoutSource(stepDetail.kind === \"step\" ? splitExecutionDetail(stepDetail.step.rest).rest : rest);\n const pendingForm = node.waiting === true && renderPendingPrompt ? renderPendingPrompt(node) : null;\n return (\n <div className=\"space-y-4 p-density-4\">\n <ExecutionHeaderView header={header} {...(stepDetail.kind === \"step\" ? { stepKind: stepDetail.step.step.kind } : {})} />\n {pendingForm != null && <StepPendingFormSection>{pendingForm}</StepPendingFormSection>}\n <FailureMessage node={node} cause={stepDetail.kind === \"step\" ? stepDetail.step.wait?.cause : undefined} error={header.error} />\n {command && (\n <div className=\"min-w-0 space-y-1\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">Command</div>\n <code className=\"block overflow-x-auto whitespace-pre rounded bg-muted px-2 py-1.5 text-xs\">\n {command}\n </code>\n <div className=\"flex flex-wrap items-center gap-2 text-[10px] text-muted-foreground\">\n {cwd && <span>in {cwd}</span>}\n {typeof context?.exit_code === \"number\" && (\n <span className={context.exit_code === 0 ? undefined : \"text-red-600\"}>\n exit {context.exit_code}\n </span>\n )}\n </div>\n </div>\n )}\n <TestOutput node={node} />\n <CelDetails node={node} />\n <StepSourceSection result={readStepSource(node.detail)} />\n {stepDetail.kind === \"step\" && <StepKindSections step={stepDetail.step} {...(renderWait ? { renderWait } : {})} />}\n {stepDetail.kind === \"invalid\" && <MalformedStepDetail error={stepDetail.error} />}\n {rawDetail != null && (\n <details className=\"text-muted-foreground\" data-raw-detail=\"\">\n <summary className=\"cursor-pointer text-[10px] uppercase tracking-wide\">Raw detail</summary>\n <div className=\"mt-1 text-foreground\">\n <JsonView data={rawDetail} />\n </div>\n </details>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -164,6 +164,22 @@ var fixtureStepCopyAdapter = {
164
164
  match: isFixtureStepNode,
165
165
  copy: ({ node }) => fixtureCopy(node)
166
166
  };
167
+ function liveAttemptNode(step, attempt, ref) {
168
+ const live = {
169
+ ...attempt,
170
+ name: step.name,
171
+ ...step.task_id !== void 0 ? { task_id: step.task_id } : {},
172
+ waiting: true
173
+ };
174
+ if (isFixtureNode(live)) return live;
175
+ return {
176
+ ...live,
177
+ detail: {
178
+ ...attempt.detail,
179
+ step: ref
180
+ }
181
+ };
182
+ }
167
183
  function verificationAdapters(options = {}) {
168
184
  return require_adapter.createTestRunnerRegistry([
169
185
  checklistAdapter,
@@ -177,16 +193,21 @@ function verificationAdapters(options = {}) {
177
193
  detailAttempts: ({ node }) => {
178
194
  const detail = require_stepKind.readStepDetail(node.detail);
179
195
  if (detail.kind !== "step") return [];
180
- return detail.step.attempts.map((attempt) => ({
181
- id: attempt.attempt,
182
- status: attempt.status,
183
- ...attempt.durationMs !== void 0 ? { durationMs: attempt.durationMs } : {},
184
- node: attempt.result ? require_verifyReportTests.verifyNodeTest(attempt.result) : {
196
+ const live = detail.step.attempts.length - 1;
197
+ return detail.step.attempts.map((attempt, index) => {
198
+ const attemptNode = attempt.result ? require_verifyReportTests.verifyNodeTest(attempt.result) : {
185
199
  name: node.name,
186
200
  message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,
187
201
  detail: { step: detail.step.step }
188
- }
189
- }));
202
+ };
203
+ const waiting = node.waiting === true && index === live;
204
+ return {
205
+ id: attempt.attempt,
206
+ status: attempt.status,
207
+ ...attempt.durationMs !== void 0 ? { durationMs: attempt.durationMs } : {},
208
+ node: waiting ? liveAttemptNode(node, attemptNode, detail.step.step) : attemptNode
209
+ };
210
+ });
190
211
  },
191
212
  detailTabs: ({ node }) => {
192
213
  const detail = require_stepKind.readStepDetail(node.detail);
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.cjs","names":["ChecklistDetail","hasStepDetail","outcomeFor","readStepDetail","readStepSource","stepSourceCopy","stepKindCopy","UiTerminal","createTestRunnerRegistry","FixtureDetail","verifyNodeTest","StepOutputs"],"sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport { readStepSource, stepSourceCopy } from \"./stepSource\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well. A \"fixture\" leaf is a step whose\n// result has not arrived yet (a live or background step): it carries only the\n// execution node, which FixtureDetail renders as a header. Fixture parents\n// (markdown tables, runner steps) have children and stay with the default body.\nfunction isFixtureNode(node: Test): boolean {\n if (node.context !== undefined || hasStepDetail(node.detail)) return true;\n return node.framework === \"fixture\" && (node.children?.length ?? 0) === 0;\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n aborted: \"■\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n const source = readStepSource(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(source.kind === \"source\" ? stepSourceCopy(source.source) : []),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n};\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n return detail.step.attempts.map((attempt) => ({\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n },\n }));\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapters.cjs","names":["ChecklistDetail","hasStepDetail","outcomeFor","readStepDetail","readStepSource","stepSourceCopy","stepKindCopy","UiTerminal","createTestRunnerRegistry","FixtureDetail","verifyNodeTest","StepOutputs"],"sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport { readStepSource, stepSourceCopy } from \"./stepSource\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well. A \"fixture\" leaf is a step whose\n// result has not arrived yet (a live or background step): it carries only the\n// execution node, which FixtureDetail renders as a header. Fixture parents\n// (markdown tables, runner steps) have children and stay with the default body.\nfunction isFixtureNode(node: Test): boolean {\n if (node.context !== undefined || hasStepDetail(node.detail)) return true;\n return node.framework === \"fixture\" && (node.children?.length ?? 0) === 0;\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n aborted: \"■\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n const source = readStepSource(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(source.kind === \"source\" ? stepSourceCopy(source.source) : []),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n /**\n * The answerable form of a step waiting on a person (`node.waiting`), shown in\n * its own section at the top of the step's detail. The host resolves which\n * pending prompt belongs to the node and answers it (e.g. with PromptForm).\n */\n renderPendingPrompt?: (node: Test) => ReactNode;\n};\n\n// The attempt a step is waiting in: it carries the step's name and task id (the\n// host finds the step's prompt by them) and `waiting`, and, when its result has\n// nothing marking it a fixture step, the step reference, so the fixture detail\n// (and its pending form) still renders it.\nfunction liveAttemptNode(step: Test, attempt: Test, ref: { id: string; kind: string }): Test {\n const live: Test = { ...attempt, name: step.name, ...(step.task_id !== undefined ? { task_id: step.task_id } : {}), waiting: true };\n if (isFixtureNode(live)) return live;\n // readStepDetail has already checked that an attempt result's detail is an object.\n return { ...live, detail: { ...(attempt.detail as Record<string, unknown> | undefined), step: ref } };\n}\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n const live = detail.step.attempts.length - 1;\n return detail.step.attempts.map((attempt, index) => {\n const attemptNode: Test = attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n };\n // The step waits in its last attempt; that one keeps the step's identity so the host finds its prompt.\n const waiting = node.waiting === true && index === live;\n return {\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: waiting ? liveAttemptNode(node, attemptNode, detail.step.step) : attemptNode,\n };\n });\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { WaitDetail } from './stepKind.js';
3
- import { TestNodeAdapterRegistry } from '../test-runner/index.js';
3
+ import { Test, TestNodeAdapterRegistry } from '../test-runner/index.js';
4
4
  /** Default node adapters for VerificationResults: checklist items and
5
5
  * fixture/CEL steps. Registration order matters only when a node could match
6
6
  * both — a checklist node never carries a `context`, so the two never race. */
7
7
  export type VerificationAdapterOptions = {
8
8
  /** Override the wait section while retaining the fixture's other detail sections. */
9
9
  renderWait?: (wait: WaitDetail) => ReactNode;
10
+ /**
11
+ * The answerable form of a step waiting on a person (`node.waiting`), shown in
12
+ * its own section at the top of the step's detail. The host resolves which
13
+ * pending prompt belongs to the node and answers it (e.g. with PromptForm).
14
+ */
15
+ renderPendingPrompt?: (node: Test) => ReactNode;
10
16
  };
11
17
  export declare function verificationAdapters(options?: VerificationAdapterOptions): TestNodeAdapterRegistry;
12
18
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../../src/data/verification/adapters.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1F,OAAO,EAQL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AAmLxB;;gFAEgF;AAChF,MAAM,MAAM,0BAA0B,GAAG;IACvC,qFAAqF;IACrF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;CAC9C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,0BAA+B,GAAG,uBAAuB,CAyBtG"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../../src/data/verification/adapters.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1F,OAAO,EAML,KAAK,IAAI,EAET,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AAmLxB;;gFAEgF;AAChF,MAAM,MAAM,0BAA0B,GAAG;IACvC,qFAAqF;IACrF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;IAC7C;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC;CACjD,CAAC;AAaF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,0BAA+B,GAAG,uBAAuB,CA+BtG"}
@@ -164,6 +164,22 @@ var fixtureStepCopyAdapter = {
164
164
  match: isFixtureStepNode,
165
165
  copy: ({ node }) => fixtureCopy(node)
166
166
  };
167
+ function liveAttemptNode(step, attempt, ref) {
168
+ const live = {
169
+ ...attempt,
170
+ name: step.name,
171
+ ...step.task_id !== void 0 ? { task_id: step.task_id } : {},
172
+ waiting: true
173
+ };
174
+ if (isFixtureNode(live)) return live;
175
+ return {
176
+ ...live,
177
+ detail: {
178
+ ...attempt.detail,
179
+ step: ref
180
+ }
181
+ };
182
+ }
167
183
  function verificationAdapters(options = {}) {
168
184
  return createTestRunnerRegistry([
169
185
  checklistAdapter,
@@ -177,16 +193,21 @@ function verificationAdapters(options = {}) {
177
193
  detailAttempts: ({ node }) => {
178
194
  const detail = readStepDetail(node.detail);
179
195
  if (detail.kind !== "step") return [];
180
- return detail.step.attempts.map((attempt) => ({
181
- id: attempt.attempt,
182
- status: attempt.status,
183
- ...attempt.durationMs !== void 0 ? { durationMs: attempt.durationMs } : {},
184
- node: attempt.result ? verifyNodeTest(attempt.result) : {
196
+ const live = detail.step.attempts.length - 1;
197
+ return detail.step.attempts.map((attempt, index) => {
198
+ const attemptNode = attempt.result ? verifyNodeTest(attempt.result) : {
185
199
  name: node.name,
186
200
  message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,
187
201
  detail: { step: detail.step.step }
188
- }
189
- }));
202
+ };
203
+ const waiting = node.waiting === true && index === live;
204
+ return {
205
+ id: attempt.attempt,
206
+ status: attempt.status,
207
+ ...attempt.durationMs !== void 0 ? { durationMs: attempt.durationMs } : {},
208
+ node: waiting ? liveAttemptNode(node, attemptNode, detail.step.step) : attemptNode
209
+ };
210
+ });
190
211
  },
191
212
  detailTabs: ({ node }) => {
192
213
  const detail = readStepDetail(node.detail);
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","names":[],"sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport { readStepSource, stepSourceCopy } from \"./stepSource\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well. A \"fixture\" leaf is a step whose\n// result has not arrived yet (a live or background step): it carries only the\n// execution node, which FixtureDetail renders as a header. Fixture parents\n// (markdown tables, runner steps) have children and stay with the default body.\nfunction isFixtureNode(node: Test): boolean {\n if (node.context !== undefined || hasStepDetail(node.detail)) return true;\n return node.framework === \"fixture\" && (node.children?.length ?? 0) === 0;\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n aborted: \"■\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n const source = readStepSource(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(source.kind === \"source\" ? stepSourceCopy(source.source) : []),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n};\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n return detail.step.attempts.map((attempt) => ({\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n },\n }));\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapters.js","names":[],"sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport { readStepSource, stepSourceCopy } from \"./stepSource\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well. A \"fixture\" leaf is a step whose\n// result has not arrived yet (a live or background step): it carries only the\n// execution node, which FixtureDetail renders as a header. Fixture parents\n// (markdown tables, runner steps) have children and stay with the default body.\nfunction isFixtureNode(node: Test): boolean {\n if (node.context !== undefined || hasStepDetail(node.detail)) return true;\n return node.framework === \"fixture\" && (node.children?.length ?? 0) === 0;\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n aborted: \"■\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n const source = readStepSource(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(source.kind === \"source\" ? stepSourceCopy(source.source) : []),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n /**\n * The answerable form of a step waiting on a person (`node.waiting`), shown in\n * its own section at the top of the step's detail. The host resolves which\n * pending prompt belongs to the node and answers it (e.g. with PromptForm).\n */\n renderPendingPrompt?: (node: Test) => ReactNode;\n};\n\n// The attempt a step is waiting in: it carries the step's name and task id (the\n// host finds the step's prompt by them) and `waiting`, and, when its result has\n// nothing marking it a fixture step, the step reference, so the fixture detail\n// (and its pending form) still renders it.\nfunction liveAttemptNode(step: Test, attempt: Test, ref: { id: string; kind: string }): Test {\n const live: Test = { ...attempt, name: step.name, ...(step.task_id !== undefined ? { task_id: step.task_id } : {}), waiting: true };\n if (isFixtureNode(live)) return live;\n // readStepDetail has already checked that an attempt result's detail is an object.\n return { ...live, detail: { ...(attempt.detail as Record<string, unknown> | undefined), step: ref } };\n}\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n const live = detail.step.attempts.length - 1;\n return detail.step.attempts.map((attempt, index) => {\n const attemptNode: Test = attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n };\n // The step waits in its last attempt; that one keeps the step's identity so the host finds its prompt.\n const waiting = node.waiting === true && index === live;\n return {\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: waiting ? liveAttemptNode(node, attemptNode, detail.step.step) : attemptNode,\n };\n });\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"mappings":"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"}
@@ -115,6 +115,7 @@ function readAttemptResult(value, path) {
115
115
  "running"
116
116
  ]) if (node[key] !== void 0) bool(node[key], `${path}.${key}`);
117
117
  if (node.duration !== void 0) nonnegative(node.duration, `${path}.duration`);
118
+ if (node.detail !== void 0) record(node.detail, `${path}.detail`);
118
119
  if (node.children !== void 0) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));
119
120
  return {
120
121
  ...node,