@flanksource/clicky-ui 0.3.59 → 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 (428) hide show
  1. package/NOTICE.md +58 -0
  2. package/dist/data/Clicky.cjs +2 -1
  3. package/dist/data/Clicky.cjs.map +1 -1
  4. package/dist/data/Clicky.d.ts +2 -0
  5. package/dist/data/Clicky.d.ts.map +1 -1
  6. package/dist/data/Clicky.js +2 -1
  7. package/dist/data/Clicky.js.map +1 -1
  8. package/dist/data/PromptBanner.model.cjs +10 -0
  9. package/dist/data/PromptBanner.model.cjs.map +1 -1
  10. package/dist/data/PromptBanner.model.d.ts +2 -0
  11. package/dist/data/PromptBanner.model.d.ts.map +1 -1
  12. package/dist/data/PromptBanner.model.js +10 -1
  13. package/dist/data/PromptBanner.model.js.map +1 -1
  14. package/dist/data/PromptDialog.cjs +16 -49
  15. package/dist/data/PromptDialog.cjs.map +1 -1
  16. package/dist/data/PromptDialog.d.ts +7 -1
  17. package/dist/data/PromptDialog.d.ts.map +1 -1
  18. package/dist/data/PromptDialog.js +17 -50
  19. package/dist/data/PromptDialog.js.map +1 -1
  20. package/dist/data/PromptForm.cjs +79 -0
  21. package/dist/data/PromptForm.cjs.map +1 -0
  22. package/dist/data/PromptForm.d.ts +26 -0
  23. package/dist/data/PromptForm.d.ts.map +1 -0
  24. package/dist/data/PromptForm.js +79 -0
  25. package/dist/data/PromptForm.js.map +1 -0
  26. package/dist/data/PromptIndicator.cjs +82 -0
  27. package/dist/data/PromptIndicator.cjs.map +1 -0
  28. package/dist/data/PromptIndicator.d.ts +19 -0
  29. package/dist/data/PromptIndicator.d.ts.map +1 -0
  30. package/dist/data/PromptIndicator.js +82 -0
  31. package/dist/data/PromptIndicator.js.map +1 -0
  32. package/dist/data/PromptList.cjs +67 -0
  33. package/dist/data/PromptList.cjs.map +1 -0
  34. package/dist/data/PromptList.d.ts +13 -0
  35. package/dist/data/PromptList.d.ts.map +1 -0
  36. package/dist/data/PromptList.js +67 -0
  37. package/dist/data/PromptList.js.map +1 -0
  38. package/dist/data/git/GitChangeList.cjs +11 -4
  39. package/dist/data/git/GitChangeList.cjs.map +1 -1
  40. package/dist/data/git/GitChangeList.d.ts +2 -35
  41. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  42. package/dist/data/git/GitChangeList.js +11 -4
  43. package/dist/data/git/GitChangeList.js.map +1 -1
  44. package/dist/data/git/GitLink.cjs +13 -0
  45. package/dist/data/git/GitLink.cjs.map +1 -0
  46. package/dist/data/git/GitLink.d.ts +8 -0
  47. package/dist/data/git/GitLink.d.ts.map +1 -0
  48. package/dist/data/git/GitLink.js +13 -0
  49. package/dist/data/git/GitLink.js.map +1 -0
  50. package/dist/data/git/git-links.cjs +54 -0
  51. package/dist/data/git/git-links.cjs.map +1 -0
  52. package/dist/data/git/git-links.d.ts +4 -0
  53. package/dist/data/git/git-links.d.ts.map +1 -0
  54. package/dist/data/git/git-links.js +53 -0
  55. package/dist/data/git/git-links.js.map +1 -0
  56. package/dist/data/git/index.d.ts +3 -0
  57. package/dist/data/git/index.d.ts.map +1 -1
  58. package/dist/data/git/types.d.ts +54 -0
  59. package/dist/data/git/types.d.ts.map +1 -0
  60. package/dist/data/test-runner/MatrixMarks.cjs +4 -3
  61. package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
  62. package/dist/data/test-runner/MatrixMarks.d.ts +7 -4
  63. package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
  64. package/dist/data/test-runner/MatrixMarks.js +4 -3
  65. package/dist/data/test-runner/MatrixMarks.js.map +1 -1
  66. package/dist/data/test-runner/TestRunSummary.cjs +1 -1
  67. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  68. package/dist/data/test-runner/TestRunSummary.js +1 -1
  69. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  70. package/dist/data/test-runner/TestTree.cjs +1 -1
  71. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  72. package/dist/data/test-runner/TestTree.js +1 -1
  73. package/dist/data/test-runner/TestTree.js.map +1 -1
  74. package/dist/data/test-runner/TestTreeNode.cjs +2 -2
  75. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  76. package/dist/data/test-runner/TestTreeNode.js +2 -2
  77. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  78. package/dist/data/test-runner/adapter.cjs +7 -0
  79. package/dist/data/test-runner/adapter.cjs.map +1 -1
  80. package/dist/data/test-runner/adapter.d.ts +7 -0
  81. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  82. package/dist/data/test-runner/adapter.js +7 -0
  83. package/dist/data/test-runner/adapter.js.map +1 -1
  84. package/dist/data/test-runner/index.d.ts +1 -1
  85. package/dist/data/test-runner/index.d.ts.map +1 -1
  86. package/dist/data/test-runner/marks.cjs +3 -3
  87. package/dist/data/test-runner/marks.cjs.map +1 -1
  88. package/dist/data/test-runner/marks.js +3 -3
  89. package/dist/data/test-runner/marks.js.map +1 -1
  90. package/dist/data/test-runner/matrix-marks.cjs +12 -3
  91. package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
  92. package/dist/data/test-runner/matrix-marks.d.ts +13 -0
  93. package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
  94. package/dist/data/test-runner/matrix-marks.js +12 -3
  95. package/dist/data/test-runner/matrix-marks.js.map +1 -1
  96. package/dist/data/test-runner/status.cjs +1 -1
  97. package/dist/data/test-runner/status.cjs.map +1 -1
  98. package/dist/data/test-runner/status.js +1 -1
  99. package/dist/data/test-runner/status.js.map +1 -1
  100. package/dist/data/test-runner/types.d.ts +2 -0
  101. package/dist/data/test-runner/types.d.ts.map +1 -1
  102. package/dist/data/verification/adapterViews.cjs +3 -1
  103. package/dist/data/verification/adapterViews.cjs.map +1 -1
  104. package/dist/data/verification/adapterViews.d.ts +5 -2
  105. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  106. package/dist/data/verification/adapterViews.js +4 -2
  107. package/dist/data/verification/adapterViews.js.map +1 -1
  108. package/dist/data/verification/adapters.cjs +28 -7
  109. package/dist/data/verification/adapters.cjs.map +1 -1
  110. package/dist/data/verification/adapters.d.ts +7 -1
  111. package/dist/data/verification/adapters.d.ts.map +1 -1
  112. package/dist/data/verification/adapters.js +28 -7
  113. package/dist/data/verification/adapters.js.map +1 -1
  114. package/dist/data/verification/stepKind.cjs +1 -0
  115. package/dist/data/verification/stepKind.cjs.map +1 -1
  116. package/dist/data/verification/stepKind.d.ts.map +1 -1
  117. package/dist/data/verification/stepKind.js +1 -0
  118. package/dist/data/verification/stepKind.js.map +1 -1
  119. package/dist/data/verification/stepKindViews.cjs +17 -0
  120. package/dist/data/verification/stepKindViews.cjs.map +1 -1
  121. package/dist/data/verification/stepKindViews.d.ts +4 -0
  122. package/dist/data/verification/stepKindViews.d.ts.map +1 -1
  123. package/dist/data/verification/stepKindViews.js +17 -1
  124. package/dist/data/verification/stepKindViews.js.map +1 -1
  125. package/dist/data/version-info.cjs +3 -3
  126. package/dist/data/version-info.js +3 -3
  127. package/dist/data.cjs +114 -0
  128. package/dist/data.d.ts +3 -0
  129. package/dist/data.d.ts.map +1 -1
  130. package/dist/data.js +51 -1
  131. package/dist/git.cjs +6 -0
  132. package/dist/git.d.ts +4 -0
  133. package/dist/git.d.ts.map +1 -0
  134. package/dist/git.js +3 -0
  135. package/dist/hooks/use-prompts.cjs +18 -11
  136. package/dist/hooks/use-prompts.cjs.map +1 -1
  137. package/dist/hooks/use-prompts.d.ts.map +1 -1
  138. package/dist/hooks/use-prompts.js +18 -11
  139. package/dist/hooks/use-prompts.js.map +1 -1
  140. package/dist/icons/components/UiApi.cjs +37 -0
  141. package/dist/icons/components/UiApi.cjs.map +1 -0
  142. package/dist/icons/components/UiApi.d.ts +9 -0
  143. package/dist/icons/components/UiApi.d.ts.map +1 -0
  144. package/dist/icons/components/UiApi.js +35 -0
  145. package/dist/icons/components/UiApi.js.map +1 -0
  146. package/dist/icons/components/UiApiBridge.cjs +38 -0
  147. package/dist/icons/components/UiApiBridge.cjs.map +1 -0
  148. package/dist/icons/components/UiApiBridge.d.ts +9 -0
  149. package/dist/icons/components/UiApiBridge.d.ts.map +1 -0
  150. package/dist/icons/components/UiApiBridge.js +36 -0
  151. package/dist/icons/components/UiApiBridge.js.map +1 -0
  152. package/dist/icons/components/UiApiGateway.cjs +33 -0
  153. package/dist/icons/components/UiApiGateway.cjs.map +1 -0
  154. package/dist/icons/components/UiApiGateway.d.ts +9 -0
  155. package/dist/icons/components/UiApiGateway.d.ts.map +1 -0
  156. package/dist/icons/components/UiApiGateway.js +31 -0
  157. package/dist/icons/components/UiApiGateway.js.map +1 -0
  158. package/dist/icons/components/UiApiRequest.cjs +37 -0
  159. package/dist/icons/components/UiApiRequest.cjs.map +1 -0
  160. package/dist/icons/components/UiApiRequest.d.ts +9 -0
  161. package/dist/icons/components/UiApiRequest.d.ts.map +1 -0
  162. package/dist/icons/components/UiApiRequest.js +35 -0
  163. package/dist/icons/components/UiApiRequest.js.map +1 -0
  164. package/dist/icons/components/UiArrowDecision.cjs +51 -0
  165. package/dist/icons/components/UiArrowDecision.cjs.map +1 -0
  166. package/dist/icons/components/UiArrowDecision.d.ts +15 -0
  167. package/dist/icons/components/UiArrowDecision.d.ts.map +1 -0
  168. package/dist/icons/components/UiArrowDecision.js +48 -0
  169. package/dist/icons/components/UiArrowDecision.js.map +1 -0
  170. package/dist/icons/components/UiArrowSquareIn.cjs +51 -0
  171. package/dist/icons/components/UiArrowSquareIn.cjs.map +1 -0
  172. package/dist/icons/components/UiArrowSquareIn.d.ts +15 -0
  173. package/dist/icons/components/UiArrowSquareIn.d.ts.map +1 -0
  174. package/dist/icons/components/UiArrowSquareIn.js +48 -0
  175. package/dist/icons/components/UiArrowSquareIn.js.map +1 -0
  176. package/dist/icons/components/UiBatchCheck.cjs +55 -0
  177. package/dist/icons/components/UiBatchCheck.cjs.map +1 -0
  178. package/dist/icons/components/UiBatchCheck.d.ts +15 -0
  179. package/dist/icons/components/UiBatchCheck.d.ts.map +1 -0
  180. package/dist/icons/components/UiBatchCheck.js +52 -0
  181. package/dist/icons/components/UiBatchCheck.js.map +1 -0
  182. package/dist/icons/components/UiBatchJob.cjs +39 -0
  183. package/dist/icons/components/UiBatchJob.cjs.map +1 -0
  184. package/dist/icons/components/UiBatchJob.d.ts +9 -0
  185. package/dist/icons/components/UiBatchJob.d.ts.map +1 -0
  186. package/dist/icons/components/UiBatchJob.js +37 -0
  187. package/dist/icons/components/UiBatchJob.js.map +1 -0
  188. package/dist/icons/components/UiBatchRequest.cjs +39 -0
  189. package/dist/icons/components/UiBatchRequest.cjs.map +1 -0
  190. package/dist/icons/components/UiBatchRequest.d.ts +9 -0
  191. package/dist/icons/components/UiBatchRequest.d.ts.map +1 -0
  192. package/dist/icons/components/UiBatchRequest.js +37 -0
  193. package/dist/icons/components/UiBatchRequest.js.map +1 -0
  194. package/dist/icons/components/UiBpmnConditional.cjs +29 -0
  195. package/dist/icons/components/UiBpmnConditional.cjs.map +1 -0
  196. package/dist/icons/components/UiBpmnConditional.d.ts +9 -0
  197. package/dist/icons/components/UiBpmnConditional.d.ts.map +1 -0
  198. package/dist/icons/components/UiBpmnConditional.js +27 -0
  199. package/dist/icons/components/UiBpmnConditional.js.map +1 -0
  200. package/dist/icons/components/UiBranchFlow.cjs +33 -0
  201. package/dist/icons/components/UiBranchFlow.cjs.map +1 -0
  202. package/dist/icons/components/UiBranchFlow.d.ts +9 -0
  203. package/dist/icons/components/UiBranchFlow.d.ts.map +1 -0
  204. package/dist/icons/components/UiBranchFlow.js +31 -0
  205. package/dist/icons/components/UiBranchFlow.js.map +1 -0
  206. package/dist/icons/components/UiClassicBatch.cjs +29 -0
  207. package/dist/icons/components/UiClassicBatch.cjs.map +1 -0
  208. package/dist/icons/components/UiClassicBatch.d.ts +9 -0
  209. package/dist/icons/components/UiClassicBatch.d.ts.map +1 -0
  210. package/dist/icons/components/UiClassicBatch.js +27 -0
  211. package/dist/icons/components/UiClassicBatch.js.map +1 -0
  212. package/dist/icons/components/UiCodeFile.cjs +29 -0
  213. package/dist/icons/components/UiCodeFile.cjs.map +1 -0
  214. package/dist/icons/components/UiCodeFile.d.ts +9 -0
  215. package/dist/icons/components/UiCodeFile.d.ts.map +1 -0
  216. package/dist/icons/components/UiCodeFile.js +27 -0
  217. package/dist/icons/components/UiCodeFile.js.map +1 -0
  218. package/dist/icons/components/UiColumnsLayout.cjs +29 -0
  219. package/dist/icons/components/UiColumnsLayout.cjs.map +1 -0
  220. package/dist/icons/components/UiColumnsLayout.d.ts +9 -0
  221. package/dist/icons/components/UiColumnsLayout.d.ts.map +1 -0
  222. package/dist/icons/components/UiColumnsLayout.js +27 -0
  223. package/dist/icons/components/UiColumnsLayout.js.map +1 -0
  224. package/dist/icons/components/UiCondition.cjs +37 -0
  225. package/dist/icons/components/UiCondition.cjs.map +1 -0
  226. package/dist/icons/components/UiCondition.d.ts +9 -0
  227. package/dist/icons/components/UiCondition.d.ts.map +1 -0
  228. package/dist/icons/components/UiCondition.js +35 -0
  229. package/dist/icons/components/UiCondition.js.map +1 -0
  230. package/dist/icons/components/UiConditions.cjs +29 -0
  231. package/dist/icons/components/UiConditions.cjs.map +1 -0
  232. package/dist/icons/components/UiConditions.d.ts +9 -0
  233. package/dist/icons/components/UiConditions.d.ts.map +1 -0
  234. package/dist/icons/components/UiConditions.js +27 -0
  235. package/dist/icons/components/UiConditions.js.map +1 -0
  236. package/dist/icons/components/UiDelayQueue.cjs +40 -0
  237. package/dist/icons/components/UiDelayQueue.cjs.map +1 -0
  238. package/dist/icons/components/UiDelayQueue.d.ts +9 -0
  239. package/dist/icons/components/UiDelayQueue.d.ts.map +1 -0
  240. package/dist/icons/components/UiDelayQueue.js +38 -0
  241. package/dist/icons/components/UiDelayQueue.js.map +1 -0
  242. package/dist/icons/components/UiDynamicForm.cjs +51 -0
  243. package/dist/icons/components/UiDynamicForm.cjs.map +1 -0
  244. package/dist/icons/components/UiDynamicForm.d.ts +15 -0
  245. package/dist/icons/components/UiDynamicForm.d.ts.map +1 -0
  246. package/dist/icons/components/UiDynamicForm.js +48 -0
  247. package/dist/icons/components/UiDynamicForm.js.map +1 -0
  248. package/dist/icons/components/UiFlowArrow.cjs +51 -0
  249. package/dist/icons/components/UiFlowArrow.cjs.map +1 -0
  250. package/dist/icons/components/UiFlowArrow.d.ts +15 -0
  251. package/dist/icons/components/UiFlowArrow.d.ts.map +1 -0
  252. package/dist/icons/components/UiFlowArrow.js +48 -0
  253. package/dist/icons/components/UiFlowArrow.js.map +1 -0
  254. package/dist/icons/components/UiFormFields.cjs +33 -0
  255. package/dist/icons/components/UiFormFields.cjs.map +1 -0
  256. package/dist/icons/components/UiFormFields.d.ts +9 -0
  257. package/dist/icons/components/UiFormFields.d.ts.map +1 -0
  258. package/dist/icons/components/UiFormFields.js +31 -0
  259. package/dist/icons/components/UiFormFields.js.map +1 -0
  260. package/dist/icons/components/UiFormStep.cjs +38 -0
  261. package/dist/icons/components/UiFormStep.cjs.map +1 -0
  262. package/dist/icons/components/UiFormStep.d.ts +9 -0
  263. package/dist/icons/components/UiFormStep.d.ts.map +1 -0
  264. package/dist/icons/components/UiFormStep.js +36 -0
  265. package/dist/icons/components/UiFormStep.js.map +1 -0
  266. package/dist/icons/components/UiGatewayApi.cjs +32 -0
  267. package/dist/icons/components/UiGatewayApi.cjs.map +1 -0
  268. package/dist/icons/components/UiGatewayApi.d.ts +9 -0
  269. package/dist/icons/components/UiGatewayApi.d.ts.map +1 -0
  270. package/dist/icons/components/UiGatewayApi.js +30 -0
  271. package/dist/icons/components/UiGatewayApi.js.map +1 -0
  272. package/dist/icons/components/UiImportArrow.cjs +29 -0
  273. package/dist/icons/components/UiImportArrow.cjs.map +1 -0
  274. package/dist/icons/components/UiImportArrow.d.ts +9 -0
  275. package/dist/icons/components/UiImportArrow.d.ts.map +1 -0
  276. package/dist/icons/components/UiImportArrow.js +27 -0
  277. package/dist/icons/components/UiImportArrow.js.map +1 -0
  278. package/dist/icons/components/UiInputField.cjs +33 -0
  279. package/dist/icons/components/UiInputField.cjs.map +1 -0
  280. package/dist/icons/components/UiInputField.d.ts +9 -0
  281. package/dist/icons/components/UiInputField.d.ts.map +1 -0
  282. package/dist/icons/components/UiInputField.js +31 -0
  283. package/dist/icons/components/UiInputField.js.map +1 -0
  284. package/dist/icons/components/UiInsertTable.cjs +29 -0
  285. package/dist/icons/components/UiInsertTable.cjs.map +1 -0
  286. package/dist/icons/components/UiInsertTable.d.ts +9 -0
  287. package/dist/icons/components/UiInsertTable.d.ts.map +1 -0
  288. package/dist/icons/components/UiInsertTable.js +27 -0
  289. package/dist/icons/components/UiInsertTable.js.map +1 -0
  290. package/dist/icons/components/UiLayoutTemplate.cjs +32 -0
  291. package/dist/icons/components/UiLayoutTemplate.cjs.map +1 -0
  292. package/dist/icons/components/UiLayoutTemplate.d.ts +9 -0
  293. package/dist/icons/components/UiLayoutTemplate.d.ts.map +1 -0
  294. package/dist/icons/components/UiLayoutTemplate.js +30 -0
  295. package/dist/icons/components/UiLayoutTemplate.js.map +1 -0
  296. package/dist/icons/components/UiLayoutWindow.cjs +56 -0
  297. package/dist/icons/components/UiLayoutWindow.cjs.map +1 -0
  298. package/dist/icons/components/UiLayoutWindow.d.ts +15 -0
  299. package/dist/icons/components/UiLayoutWindow.d.ts.map +1 -0
  300. package/dist/icons/components/UiLayoutWindow.js +53 -0
  301. package/dist/icons/components/UiLayoutWindow.js.map +1 -0
  302. package/dist/icons/components/UiListEnd.cjs +33 -0
  303. package/dist/icons/components/UiListEnd.cjs.map +1 -0
  304. package/dist/icons/components/UiListEnd.d.ts +9 -0
  305. package/dist/icons/components/UiListEnd.d.ts.map +1 -0
  306. package/dist/icons/components/UiListEnd.js +31 -0
  307. package/dist/icons/components/UiListEnd.js.map +1 -0
  308. package/dist/icons/components/UiListEndLine.cjs +51 -0
  309. package/dist/icons/components/UiListEndLine.cjs.map +1 -0
  310. package/dist/icons/components/UiListEndLine.d.ts +15 -0
  311. package/dist/icons/components/UiListEndLine.d.ts.map +1 -0
  312. package/dist/icons/components/UiListEndLine.js +48 -0
  313. package/dist/icons/components/UiListEndLine.js.map +1 -0
  314. package/dist/icons/components/UiListNumbers.cjs +51 -0
  315. package/dist/icons/components/UiListNumbers.cjs.map +1 -0
  316. package/dist/icons/components/UiListNumbers.d.ts +15 -0
  317. package/dist/icons/components/UiListNumbers.d.ts.map +1 -0
  318. package/dist/icons/components/UiListNumbers.js +48 -0
  319. package/dist/icons/components/UiListNumbers.js.map +1 -0
  320. package/dist/icons/components/UiLowPriority.cjs +29 -0
  321. package/dist/icons/components/UiLowPriority.cjs.map +1 -0
  322. package/dist/icons/components/UiLowPriority.d.ts +9 -0
  323. package/dist/icons/components/UiLowPriority.d.ts.map +1 -0
  324. package/dist/icons/components/UiLowPriority.js +27 -0
  325. package/dist/icons/components/UiLowPriority.js.map +1 -0
  326. package/dist/icons/components/UiMergeQueue.cjs +38 -0
  327. package/dist/icons/components/UiMergeQueue.cjs.map +1 -0
  328. package/dist/icons/components/UiMergeQueue.d.ts +9 -0
  329. package/dist/icons/components/UiMergeQueue.d.ts.map +1 -0
  330. package/dist/icons/components/UiMergeQueue.js +36 -0
  331. package/dist/icons/components/UiMergeQueue.js.map +1 -0
  332. package/dist/icons/components/UiPipelineStage.cjs +33 -0
  333. package/dist/icons/components/UiPipelineStage.cjs.map +1 -0
  334. package/dist/icons/components/UiPipelineStage.d.ts +9 -0
  335. package/dist/icons/components/UiPipelineStage.d.ts.map +1 -0
  336. package/dist/icons/components/UiPipelineStage.js +31 -0
  337. package/dist/icons/components/UiPipelineStage.js.map +1 -0
  338. package/dist/icons/components/UiPlaylistRemove.cjs +29 -0
  339. package/dist/icons/components/UiPlaylistRemove.cjs.map +1 -0
  340. package/dist/icons/components/UiPlaylistRemove.d.ts +9 -0
  341. package/dist/icons/components/UiPlaylistRemove.d.ts.map +1 -0
  342. package/dist/icons/components/UiPlaylistRemove.js +27 -0
  343. package/dist/icons/components/UiPlaylistRemove.js.map +1 -0
  344. package/dist/icons/components/UiReportForms.cjs +51 -0
  345. package/dist/icons/components/UiReportForms.cjs.map +1 -0
  346. package/dist/icons/components/UiReportForms.d.ts +15 -0
  347. package/dist/icons/components/UiReportForms.d.ts.map +1 -0
  348. package/dist/icons/components/UiReportForms.js +48 -0
  349. package/dist/icons/components/UiReportForms.js.map +1 -0
  350. package/dist/icons/components/UiScreenTemplate.cjs +29 -0
  351. package/dist/icons/components/UiScreenTemplate.cjs.map +1 -0
  352. package/dist/icons/components/UiScreenTemplate.d.ts +9 -0
  353. package/dist/icons/components/UiScreenTemplate.d.ts.map +1 -0
  354. package/dist/icons/components/UiScreenTemplate.js +27 -0
  355. package/dist/icons/components/UiScreenTemplate.js.map +1 -0
  356. package/dist/icons/components/UiServices.cjs +29 -0
  357. package/dist/icons/components/UiServices.cjs.map +1 -0
  358. package/dist/icons/components/UiServices.d.ts +9 -0
  359. package/dist/icons/components/UiServices.d.ts.map +1 -0
  360. package/dist/icons/components/UiServices.js +27 -0
  361. package/dist/icons/components/UiServices.js.map +1 -0
  362. package/dist/icons/components/UiSkipCircle.cjs +51 -0
  363. package/dist/icons/components/UiSkipCircle.cjs.map +1 -0
  364. package/dist/icons/components/UiSkipCircle.d.ts +15 -0
  365. package/dist/icons/components/UiSkipCircle.d.ts.map +1 -0
  366. package/dist/icons/components/UiSkipCircle.js +48 -0
  367. package/dist/icons/components/UiSkipCircle.js.map +1 -0
  368. package/dist/icons/components/UiTaskBatch.cjs +33 -0
  369. package/dist/icons/components/UiTaskBatch.cjs.map +1 -0
  370. package/dist/icons/components/UiTaskBatch.d.ts +9 -0
  371. package/dist/icons/components/UiTaskBatch.d.ts.map +1 -0
  372. package/dist/icons/components/UiTaskBatch.js +31 -0
  373. package/dist/icons/components/UiTaskBatch.js.map +1 -0
  374. package/dist/icons/components/UiTodoList.cjs +29 -0
  375. package/dist/icons/components/UiTodoList.cjs.map +1 -0
  376. package/dist/icons/components/UiTodoList.d.ts +9 -0
  377. package/dist/icons/components/UiTodoList.d.ts.map +1 -0
  378. package/dist/icons/components/UiTodoList.js +27 -0
  379. package/dist/icons/components/UiTodoList.js.map +1 -0
  380. package/dist/icons/components/UiTrayArrowDown.cjs +51 -0
  381. package/dist/icons/components/UiTrayArrowDown.cjs.map +1 -0
  382. package/dist/icons/components/UiTrayArrowDown.d.ts +15 -0
  383. package/dist/icons/components/UiTrayArrowDown.d.ts.map +1 -0
  384. package/dist/icons/components/UiTrayArrowDown.js +48 -0
  385. package/dist/icons/components/UiTrayArrowDown.js.map +1 -0
  386. package/dist/icons/components/UiVault.cjs +51 -0
  387. package/dist/icons/components/UiVault.cjs.map +1 -0
  388. package/dist/icons/components/UiVault.d.ts +15 -0
  389. package/dist/icons/components/UiVault.d.ts.map +1 -0
  390. package/dist/icons/components/UiVault.js +48 -0
  391. package/dist/icons/components/UiVault.js.map +1 -0
  392. package/dist/icons/components/UiWebServiceDefinition.cjs +39 -0
  393. package/dist/icons/components/UiWebServiceDefinition.cjs.map +1 -0
  394. package/dist/icons/components/UiWebServiceDefinition.d.ts +9 -0
  395. package/dist/icons/components/UiWebServiceDefinition.d.ts.map +1 -0
  396. package/dist/icons/components/UiWebServiceDefinition.js +37 -0
  397. package/dist/icons/components/UiWebServiceDefinition.js.map +1 -0
  398. package/dist/icons/components/UiWebhook.cjs +29 -0
  399. package/dist/icons/components/UiWebhook.cjs.map +1 -0
  400. package/dist/icons/components/UiWebhook.d.ts +9 -0
  401. package/dist/icons/components/UiWebhook.d.ts.map +1 -0
  402. package/dist/icons/components/UiWebhook.js +27 -0
  403. package/dist/icons/components/UiWebhook.js.map +1 -0
  404. package/dist/icons/components/UiWebhookLine.cjs +51 -0
  405. package/dist/icons/components/UiWebhookLine.cjs.map +1 -0
  406. package/dist/icons/components/UiWebhookLine.d.ts +15 -0
  407. package/dist/icons/components/UiWebhookLine.d.ts.map +1 -0
  408. package/dist/icons/components/UiWebhookLine.js +48 -0
  409. package/dist/icons/components/UiWebhookLine.js.map +1 -0
  410. package/dist/icons/index.d.ts +58 -0
  411. package/dist/icons/index.d.ts.map +1 -1
  412. package/dist/icons/registry.cjs +90 -0
  413. package/dist/icons/registry.cjs.map +1 -1
  414. package/dist/icons/registry.d.ts.map +1 -1
  415. package/dist/icons/registry.js +90 -0
  416. package/dist/icons/registry.js.map +1 -1
  417. package/dist/icons.cjs +103 -0
  418. package/dist/icons.js +46 -1
  419. package/dist/index.cjs +114 -0
  420. package/dist/index.js +51 -1
  421. package/dist/overlay/DropdownMenu.cjs +17 -14
  422. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  423. package/dist/overlay/DropdownMenu.d.ts +1 -0
  424. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  425. package/dist/overlay/DropdownMenu.js +18 -15
  426. package/dist/overlay/DropdownMenu.js.map +1 -1
  427. package/dist/styles.css +1 -1
  428. package/package.json +6 -1
@@ -5,6 +5,7 @@ import { UiCircleOutline } from "../../icons/components/UiCircleOutline.js";
5
5
  import { UiLoader } from "../../icons/components/UiLoader.js";
6
6
  import { UiPass } from "../../icons/components/UiPass.js";
7
7
  import { UiSkipForward } from "../../icons/components/UiSkipForward.js";
8
+ import { UiSkipCircle } from "../../icons/components/UiSkipCircle.js";
8
9
  import { UiHourglass } from "../../icons/components/UiHourglass.js";
9
10
  import { UiProhibit } from "../../icons/components/UiProhibit.js";
10
11
  // src/data/test-runner/matrix-marks.ts
@@ -39,9 +40,9 @@ var MATRIX_MARKS = {
39
40
  spin: true
40
41
  },
41
42
  aborted: {
42
- icon: UiProhibit,
43
- tone: "text-red-400 dark:text-red-300",
44
- bar: "bg-red-300 dark:bg-red-800",
43
+ icon: UiSkipCircle,
44
+ tone: "text-muted-foreground",
45
+ bar: "bg-slate-300 dark:bg-slate-600",
45
46
  label: "aborted",
46
47
  attention: true
47
48
  },
@@ -72,6 +73,14 @@ var MATRIX_MARKS = {
72
73
  tone: "text-muted-foreground/60",
73
74
  label: "not in this run",
74
75
  attention: false
76
+ },
77
+ /** A plan or case its country does not apply to: not run here, by design. */
78
+ na: {
79
+ icon: UiProhibit,
80
+ tone: "text-muted-foreground/60",
81
+ label: "N/A",
82
+ legend: "N/A · not for this country",
83
+ attention: false
75
84
  }
76
85
  };
77
86
  var MATRIX_ORDER = Object.keys(MATRIX_MARKS);
@@ -1 +1 @@
1
- {"version":3,"file":"matrix-marks.js","names":[],"sources":["../../../src/data/test-runner/matrix-marks.ts"],"sourcesContent":["// The glyph vocabulary of a bulk test matrix (plans × environments): plan\n// cells, sub-steps, the environment header's verdict row and the legend all\n// read MATRIX_MARKS, in this order. The live web matrix and its printed report\n// draw from this one table. MatrixMarks.tsx renders it; this file holds only\n// the tokens and pure helpers (react/only-export-components).\n\nimport {\n UiCircleOutline,\n UiCircleX,\n UiHourglass,\n UiLoader,\n UiPass,\n UiProhibit,\n UiSkipForward,\n UiWarningCircle,\n UiWarningTriangleFilled,\n type IconComponent,\n} from \"../../icons\";\n\nexport type MatrixMarkToken = {\n icon: IconComponent;\n tone: string;\n /** Progress-bar fill; absent for states a bar leaves as its track. */\n bar?: string;\n label: string;\n legend?: string;\n /** Whether a sub-step spells the outcome out beside its glyph. */\n attention: boolean;\n spin?: boolean;\n};\n\nexport const MATRIX_MARKS = {\n passed: { icon: UiPass, tone: \"text-emerald-600 dark:text-emerald-400\", bar: \"bg-emerald-500\", label: \"passed\", attention: false },\n warned: { icon: UiWarningCircle, tone: \"text-amber-600 dark:text-amber-400\", bar: \"bg-amber-400\", label: \"warned\", attention: true },\n skipped: { icon: UiSkipForward, tone: \"text-slate-400 dark:text-slate-500\", bar: \"bg-slate-300 dark:bg-slate-600\", label: \"skipped\", attention: false },\n running: { icon: UiLoader, tone: \"text-blue-600 dark:text-blue-400\", bar: \"bg-blue-500 animate-pulse\", label: \"running\", attention: true, spin: true },\n aborted: { icon: UiProhibit, tone: \"text-red-400 dark:text-red-300\", bar: \"bg-red-300 dark:bg-red-800\", label: \"aborted\", attention: true },\n failed: { icon: UiCircleX, tone: \"text-red-600 dark:text-red-400\", bar: \"bg-red-600\", label: \"failed\", attention: true },\n error: { icon: UiWarningTriangleFilled, tone: \"text-red-600 dark:text-red-400\", bar: \"bg-red-800\", label: \"error\", legend: \"error · never started\", attention: true },\n pending: { icon: UiHourglass, tone: \"text-muted-foreground\", label: \"pending\", legend: \"pending · queued\", attention: false },\n absent: { icon: UiCircleOutline, tone: \"text-muted-foreground/60\", label: \"not in this run\", attention: false },\n} satisfies Record<string, MatrixMarkToken>;\n\nexport type MatrixMarkKey = keyof typeof MATRIX_MARKS;\nexport type MatrixCounts = Partial<Record<MatrixMarkKey, number>>;\n\nexport const MATRIX_ORDER = Object.keys(MATRIX_MARKS) as readonly MatrixMarkKey[];\n\n/** One environment's plan totals, as its matrix column header reads them. */\nexport type MatrixEnvCounts = {\n passed: number;\n warned: number;\n failed: number;\n error: number;\n running: number;\n queued: number;\n total: number;\n};\n\nexport function matrixMarkKey(outcome: string): MatrixMarkKey {\n if (!Object.hasOwn(MATRIX_MARKS, outcome)) throw new Error(`matrix has no mark for outcome \"${outcome}\"`);\n return outcome as MatrixMarkKey;\n}\n\n/**\n * Whether a mix holds only the outcome a mark beside it already shows, so\n * drawing both would repeat the glyph.\n */\nexport function repeatsMark(counts: MatrixCounts, mark: MatrixMarkKey): boolean {\n const nonZero = MATRIX_ORDER.filter((key) => (counts[key] ?? 0) > 0);\n return nonZero.length === 1 && nonZero[0] === mark;\n}\n\n/** A mark's progress-bar fill, the muted track for one with none; static (print) drops its animate-* classes. */\nexport function matrixBarClass(mark: MatrixMarkKey, isStatic: boolean): string {\n const bar: string = (MATRIX_MARKS[mark] as MatrixMarkToken).bar ?? \"bg-muted\";\n return isStatic ? bar.split(\" \").filter((c) => !c.startsWith(\"animate-\")).join(\" \") : bar;\n}\n\n/** The matrix's one duration format: 42s, 4m 12s, 1h 03m. */\nexport function formatMatrixDuration(ms: number): string {\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, \"0\")}s`;\n return `${Math.floor(m / 60)}h ${String(m % 60).padStart(2, \"0\")}m`;\n}\n"],"mappings":";;;;;;;;;;AA+BA,IAAa,eAAe;CAC1B,QAAQ;EAAE,MAAM;EAAQ,MAAM;EAA0C,KAAK;EAAkB,OAAO;EAAU,WAAW;CAAM;CACjI,QAAQ;EAAE,MAAM;EAAiB,MAAM;EAAsC,KAAK;EAAgB,OAAO;EAAU,WAAW;CAAK;CACnI,SAAS;EAAE,MAAM;EAAe,MAAM;EAAsC,KAAK;EAAkC,OAAO;EAAW,WAAW;CAAM;CACtJ,SAAS;EAAE,MAAM;EAAU,MAAM;EAAoC,KAAK;EAA6B,OAAO;EAAW,WAAW;EAAM,MAAM;CAAK;CACrJ,SAAS;EAAE,MAAM;EAAY,MAAM;EAAkC,KAAK;EAA8B,OAAO;EAAW,WAAW;CAAK;CAC1I,QAAQ;EAAE,MAAM;EAAW,MAAM;EAAkC,KAAK;EAAc,OAAO;EAAU,WAAW;CAAK;CACvH,OAAO;EAAE,MAAM;EAAyB,MAAM;EAAkC,KAAK;EAAc,OAAO;EAAS,QAAQ;EAAyB,WAAW;CAAK;CACpK,SAAS;EAAE,MAAM;EAAa,MAAM;EAAyB,OAAO;EAAW,QAAQ;EAAoB,WAAW;CAAM;CAC5H,QAAQ;EAAE,MAAM;EAAiB,MAAM;EAA4B,OAAO;EAAmB,WAAW;CAAM;AAChH;AAKA,IAAa,eAAe,OAAO,KAAK,YAAY;AAapD,SAAgB,cAAc,SAAgC;CAC5D,IAAI,CAAC,OAAO,OAAO,cAAc,OAAO,GAAG,MAAM,IAAI,MAAM,mCAAmC,QAAQ,EAAE;CACxG,OAAO;AACT;;;;;AAMA,SAAgB,YAAY,QAAsB,MAA8B;CAC9E,MAAM,UAAU,aAAa,QAAQ,SAAS,OAAO,QAAQ,KAAK,CAAC;CACnE,OAAO,QAAQ,WAAW,KAAK,QAAQ,OAAO;AAChD;;AAGA,SAAgB,eAAe,MAAqB,UAA2B;CAC7E,MAAM,MAAe,aAAa,KAAK,CAAqB,OAAO;CACnE,OAAO,WAAW,IAAI,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,CAAC,EAAE,WAAW,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI;AACxF;;AAGA,SAAgB,qBAAqB,IAAoB;CACvD,MAAM,IAAI,KAAK,MAAM,KAAK,GAAI;CAC9B,IAAI,IAAI,IAAI,OAAO,GAAG,EAAE;CACxB,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE;CAC3B,IAAI,IAAI,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE;CAC5D,OAAO,GAAG,KAAK,MAAM,IAAI,EAAE,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE;AACnE"}
1
+ {"version":3,"file":"matrix-marks.js","names":[],"sources":["../../../src/data/test-runner/matrix-marks.ts"],"sourcesContent":["// The glyph vocabulary of a bulk test matrix (plans × environments): plan\n// cells, sub-steps, the environment header's verdict row and the legend all\n// read MATRIX_MARKS, in this order. The live web matrix and its printed report\n// draw from this one table. MatrixMarks.tsx renders it; this file holds only\n// the tokens and pure helpers (react/only-export-components).\n\nimport {\n UiCircleOutline,\n UiCircleX,\n UiHourglass,\n UiLoader,\n UiPass,\n UiProhibit,\n UiSkipCircle,\n UiSkipForward,\n UiWarningCircle,\n UiWarningTriangleFilled,\n type IconComponent,\n} from \"../../icons\";\n\nexport type MatrixMarkToken = {\n icon: IconComponent;\n tone: string;\n /** Progress-bar fill; absent for states a bar leaves as its track. */\n bar?: string;\n label: string;\n legend?: string;\n /** Whether a sub-step spells the outcome out beside its glyph. */\n attention: boolean;\n spin?: boolean;\n};\n\nexport const MATRIX_MARKS = {\n passed: { icon: UiPass, tone: \"text-emerald-600 dark:text-emerald-400\", bar: \"bg-emerald-500\", label: \"passed\", attention: false },\n warned: { icon: UiWarningCircle, tone: \"text-amber-600 dark:text-amber-400\", bar: \"bg-amber-400\", label: \"warned\", attention: true },\n skipped: { icon: UiSkipForward, tone: \"text-slate-400 dark:text-slate-500\", bar: \"bg-slate-300 dark:bg-slate-600\", label: \"skipped\", attention: false },\n running: { icon: UiLoader, tone: \"text-blue-600 dark:text-blue-400\", bar: \"bg-blue-500 animate-pulse\", label: \"running\", attention: true, spin: true },\n aborted: { icon: UiSkipCircle, tone: \"text-muted-foreground\", bar: \"bg-slate-300 dark:bg-slate-600\", label: \"aborted\", attention: true },\n failed: { icon: UiCircleX, tone: \"text-red-600 dark:text-red-400\", bar: \"bg-red-600\", label: \"failed\", attention: true },\n error: { icon: UiWarningTriangleFilled, tone: \"text-red-600 dark:text-red-400\", bar: \"bg-red-800\", label: \"error\", legend: \"error · never started\", attention: true },\n pending: { icon: UiHourglass, tone: \"text-muted-foreground\", label: \"pending\", legend: \"pending · queued\", attention: false },\n absent: { icon: UiCircleOutline, tone: \"text-muted-foreground/60\", label: \"not in this run\", attention: false },\n /** A plan or case its country does not apply to: not run here, by design. */\n na: { icon: UiProhibit, tone: \"text-muted-foreground/60\", label: \"N/A\", legend: \"N/A · not for this country\", attention: false },\n} satisfies Record<string, MatrixMarkToken>;\n\nexport type MatrixMarkKey = keyof typeof MATRIX_MARKS;\nexport type MatrixCounts = Partial<Record<MatrixMarkKey, number>>;\n\nexport const MATRIX_ORDER = Object.keys(MATRIX_MARKS) as readonly MatrixMarkKey[];\n\n/** One environment's plan totals, as its matrix column header reads them. */\nexport type MatrixEnvCounts = {\n passed: number;\n warned: number;\n failed: number;\n error: number;\n running: number;\n queued: number;\n total: number;\n};\n\nexport function matrixMarkKey(outcome: string): MatrixMarkKey {\n if (!Object.hasOwn(MATRIX_MARKS, outcome)) throw new Error(`matrix has no mark for outcome \"${outcome}\"`);\n return outcome as MatrixMarkKey;\n}\n\n/**\n * Whether a mix holds only the outcome a mark beside it already shows, so\n * drawing both would repeat the glyph.\n */\nexport function repeatsMark(counts: MatrixCounts, mark: MatrixMarkKey): boolean {\n const nonZero = MATRIX_ORDER.filter((key) => (counts[key] ?? 0) > 0);\n return nonZero.length === 1 && nonZero[0] === mark;\n}\n\n/** A mark's progress-bar fill, the muted track for one with none; static (print) drops its animate-* classes. */\nexport function matrixBarClass(mark: MatrixMarkKey, isStatic: boolean): string {\n const bar: string = (MATRIX_MARKS[mark] as MatrixMarkToken).bar ?? \"bg-muted\";\n return isStatic ? bar.split(\" \").filter((c) => !c.startsWith(\"animate-\")).join(\" \") : bar;\n}\n\n/** The matrix's one duration format: 42s, 4m 12s, 1h 03m. */\nexport function formatMatrixDuration(ms: number): string {\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, \"0\")}s`;\n return `${Math.floor(m / 60)}h ${String(m % 60).padStart(2, \"0\")}m`;\n}\n"],"mappings":";;;;;;;;;;;AAgCA,IAAa,eAAe;CAC1B,QAAQ;EAAE,MAAM;EAAQ,MAAM;EAA0C,KAAK;EAAkB,OAAO;EAAU,WAAW;CAAM;CACjI,QAAQ;EAAE,MAAM;EAAiB,MAAM;EAAsC,KAAK;EAAgB,OAAO;EAAU,WAAW;CAAK;CACnI,SAAS;EAAE,MAAM;EAAe,MAAM;EAAsC,KAAK;EAAkC,OAAO;EAAW,WAAW;CAAM;CACtJ,SAAS;EAAE,MAAM;EAAU,MAAM;EAAoC,KAAK;EAA6B,OAAO;EAAW,WAAW;EAAM,MAAM;CAAK;CACrJ,SAAS;EAAE,MAAM;EAAc,MAAM;EAAyB,KAAK;EAAkC,OAAO;EAAW,WAAW;CAAK;CACvI,QAAQ;EAAE,MAAM;EAAW,MAAM;EAAkC,KAAK;EAAc,OAAO;EAAU,WAAW;CAAK;CACvH,OAAO;EAAE,MAAM;EAAyB,MAAM;EAAkC,KAAK;EAAc,OAAO;EAAS,QAAQ;EAAyB,WAAW;CAAK;CACpK,SAAS;EAAE,MAAM;EAAa,MAAM;EAAyB,OAAO;EAAW,QAAQ;EAAoB,WAAW;CAAM;CAC5H,QAAQ;EAAE,MAAM;EAAiB,MAAM;EAA4B,OAAO;EAAmB,WAAW;CAAM;;CAE9G,IAAI;EAAE,MAAM;EAAY,MAAM;EAA4B,OAAO;EAAO,QAAQ;EAA8B,WAAW;CAAM;AACjI;AAKA,IAAa,eAAe,OAAO,KAAK,YAAY;AAapD,SAAgB,cAAc,SAAgC;CAC5D,IAAI,CAAC,OAAO,OAAO,cAAc,OAAO,GAAG,MAAM,IAAI,MAAM,mCAAmC,QAAQ,EAAE;CACxG,OAAO;AACT;;;;;AAMA,SAAgB,YAAY,QAAsB,MAA8B;CAC9E,MAAM,UAAU,aAAa,QAAQ,SAAS,OAAO,QAAQ,KAAK,CAAC;CACnE,OAAO,QAAQ,WAAW,KAAK,QAAQ,OAAO;AAChD;;AAGA,SAAgB,eAAe,MAAqB,UAA2B;CAC7E,MAAM,MAAe,aAAa,KAAK,CAAqB,OAAO;CACnE,OAAO,WAAW,IAAI,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,CAAC,EAAE,WAAW,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI;AACxF;;AAGA,SAAgB,qBAAqB,IAAoB;CACvD,MAAM,IAAI,KAAK,MAAM,KAAK,GAAI;CAC9B,IAAI,IAAI,IAAI,OAAO,GAAG,EAAE;CACxB,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE;CAC3B,IAAI,IAAI,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE;CAC5D,OAAO,GAAG,KAAK,MAAM,IAAI,EAAE,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE;AACnE"}
@@ -169,7 +169,7 @@ var OUTCOME_TONE = {
169
169
  errored: "danger",
170
170
  timedout: "warning",
171
171
  warned: "warning",
172
- aborted: "danger",
172
+ aborted: "neutral",
173
173
  skipped: "neutral",
174
174
  running: "info",
175
175
  pending: "neutral",
@@ -1 +1 @@
1
- {"version":3,"file":"status.cjs","names":["matchesFilterState"],"sources":["../../../src/data/test-runner/status.ts"],"sourcesContent":["// Pure status/roll-up helpers for the test runner — ported from Gavel's\n// utils.ts (Tests-only subset). No JSX here. `outcomeFor` resolves the outcome\n// marks.tsx draws; `statusToneFor` maps it to a semantic Badge tone.\n\nimport type { BadgeTone } from \"../Badge\";\nimport type { Test, TestSummary } from \"./types\";\nimport { matchesFilterState, type FilterState } from \"./filterState\";\n\n// --- roll-up counts ------------------------------------------------------\n\n/**\n * Tallied verdict breakdown a `Test` subtree rolls up to. `warned` is amber and\n * orthogonal to a real failure — a warned-only leaf counts in total + warned,\n * never in failed.\n */\nexport type StatusCounts = {\n total: number;\n passed: number;\n failed: number;\n warned: number;\n /** Never ran because the run stopped after an earlier failure; not an intentional skip. */\n aborted: number;\n skipped: number;\n pending: number;\n running: number;\n timedout: number;\n};\n\nconst emptyCounts = (): StatusCounts => ({\n total: 0,\n passed: 0,\n failed: 0,\n warned: 0,\n aborted: 0,\n skipped: 0,\n pending: 0,\n running: 0,\n timedout: 0,\n});\n\nconst addCounts = (r: StatusCounts, s: StatusCounts) => {\n r.total += s.total;\n r.passed += s.passed;\n r.failed += s.failed;\n r.warned += s.warned;\n r.aborted += s.aborted;\n r.skipped += s.skipped;\n r.pending += s.pending;\n r.running += s.running;\n r.timedout += s.timedout;\n};\n\nconst countsFromSummary = (summary: TestSummary): StatusCounts => ({\n total: summary.Total,\n passed: summary.Passed,\n failed: summary.Failed,\n warned: summary.Warned || 0,\n aborted: summary.Aborted || 0,\n skipped: summary.Skipped,\n pending: summary.Pending || 0,\n running: summary.Running || 0,\n timedout: summary.Timedout || 0,\n});\n\nconst countsFromLeaf = (t: Test): StatusCounts => {\n const isTimedOut = !!t.timed_out;\n const counted =\n isTimedOut ||\n t.passed ||\n t.failed ||\n t.warned ||\n t.aborted ||\n t.skipped ||\n t.pending ||\n t.running;\n return {\n total: counted ? 1 : 0,\n passed: !isTimedOut && t.passed ? 1 : 0,\n failed: !isTimedOut && t.failed ? 1 : 0,\n warned: !isTimedOut && t.warned ? 1 : 0,\n aborted: !isTimedOut && t.aborted ? 1 : 0,\n skipped: !isTimedOut && !t.aborted && t.skipped ? 1 : 0,\n pending: !isTimedOut && t.pending ? 1 : 0,\n running: !isTimedOut && t.running ? 1 : 0,\n timedout: isTimedOut ? 1 : 0,\n };\n};\n\nexport function sum(t: Test): StatusCounts {\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sum(c));\n return r;\n}\n\n/** Roll up a forest's non-task status counts. Shared by `TestRunner`'s filter\n * bar and `TestRunSummary`'s chips so both read the same tally. */\nexport function aggregateStatusCounts(tests: Test[]): StatusCounts {\n const r = emptyCounts();\n for (const t of tests) addCounts(r, sumNonTaskTests(t));\n return r;\n}\n\n/** Ordered status key → label list, driving both the filter bar's pills and a\n * host's status filter option list, so the seven rows aren't hand-duplicated. */\nexport const STATUS_LABELS: { key: keyof StatusCounts; label: string }[] = [\n { key: \"failed\", label: \"Failed\" },\n { key: \"warned\", label: \"Warned\" },\n { key: \"aborted\", label: \"Aborted\" },\n { key: \"timedout\", label: \"Timed out\" },\n { key: \"passed\", label: \"Passed\" },\n { key: \"skipped\", label: \"Skipped\" },\n { key: \"running\", label: \"Running\" },\n { key: \"pending\", label: \"Queued\" },\n];\n\n/** Like {@link sum} but excludes `task`-framework pseudo-nodes from the tally. */\nexport function sumNonTaskTests(t: Test): StatusCounts {\n if (t.framework === \"task\") {\n const r = emptyCounts();\n for (const c of t.children || []) addCounts(r, sumNonTaskTests(c));\n return r;\n }\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sumNonTaskTests(c));\n return r;\n}\n\nexport function hasFailed(t: Test): boolean {\n if (t.failed) return true;\n return (t.children || []).some(hasFailed);\n}\n\nexport function hasPending(t: Test): boolean {\n if (t.pending) return true;\n return (t.children || []).some(hasPending);\n}\n\nfunction hasTimedOutDescendant(t: Test): boolean {\n if (t.timed_out) return true;\n return (t.children || []).some(hasTimedOutDescendant);\n}\n\nexport function totalDuration(t: Test): number {\n if (t.duration && t.duration > 0) return t.duration;\n let d = 0;\n for (const c of t.children || []) d += totalDuration(c);\n return d;\n}\n\n// --- status classification ----------------------------------------------\n\nexport type TestStatus =\n | \"passed\"\n | \"failed\"\n | \"warned\"\n | \"aborted\"\n | \"skipped\"\n | \"pending\"\n | \"running\"\n | \"timedout\";\n\n/** Resolve a leaf node's single status, or null for a status-less container. */\nexport function testStatus(t: Test): TestStatus | null {\n if (t.timed_out) return \"timedout\";\n if (t.running) return \"running\";\n if (t.pending) return \"pending\";\n if (t.failed) return \"failed\";\n if (t.warned) return \"warned\";\n if (t.aborted) return \"aborted\";\n if (t.skipped) return \"skipped\";\n if (t.passed) return \"passed\";\n return null;\n}\n\n/**\n * A test or lint result's outcome. `errored` is a result the runner could not\n * produce at all (the engine crashed, the child run never reported) — distinct\n * from a test that ran and failed.\n */\nexport type TestOutcome = TestStatus | \"errored\";\n\n/**\n * Resolve a node's outcome, rolling a container up to its worst child: a\n * timeout anywhere, then failed, warned, running, queued, else passed. Null for\n * a status-less leaf.\n */\nexport function outcomeFor(t: Test): TestOutcome | null {\n const own = testStatus(t);\n if (own) return own;\n if (!t.children?.length) return null;\n const s = sum(t);\n if (hasTimedOutDescendant(t)) return \"timedout\";\n if (s.failed > 0) return \"failed\";\n if (s.warned > 0) return \"warned\";\n if (s.aborted > 0) return \"aborted\";\n if (s.running > 0) return \"running\";\n if (s.pending > 0) return \"pending\";\n if (s.total > 0 && s.skipped === s.total) return \"skipped\";\n return \"passed\";\n}\n\n/** Map a node's status to a semantic Badge tone, rolling up container state. */\nexport function statusToneFor(t: Test): BadgeTone {\n const outcome = outcomeFor(t);\n return outcome ? OUTCOME_TONE[outcome] : \"neutral\";\n}\n\nconst OUTCOME_TONE: Record<TestOutcome, BadgeTone> = {\n failed: \"danger\",\n errored: \"danger\",\n timedout: \"warning\",\n warned: \"warning\",\n aborted: \"danger\",\n skipped: \"neutral\",\n running: \"info\",\n pending: \"neutral\",\n passed: \"success\",\n};\n\n// --- formatting ----------------------------------------------------------\n\n/**\n * Format a nanosecond duration as \"123ms\" or \"1.2s\". Empty for non-positive.\n * Named distinctly from clicky's ms/s `formatDuration` (lib/format) since the\n * test-runner wire format is nanoseconds.\n */\nexport function formatTestDuration(ns: number): string {\n if (ns <= 0) return \"\";\n const ms = ns / 1e6;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction compactWithUnit(value: number, unit: string): string {\n const rounded =\n Math.abs(value) >= 10 ? Math.round(value).toString() : value.toFixed(1).replace(/\\.0$/, \"\");\n return `${rounded}${unit}`;\n}\n\n/** Compact integer counts: <1000 raw, then \"k\", then \"M\". */\nexport function formatCount(n: number): string {\n const abs = Math.abs(n);\n if (abs < 1000) return String(n);\n if (abs < 1_000_000) return compactWithUnit(n / 1000, \"k\");\n return compactWithUnit(n / 1_000_000, \"M\");\n}\n\n/** Strip Go's `Test` prefix and split CamelCase / subtest names into words. */\nexport function humanizeName(name: string, framework?: string): string {\n if (!name) return \"\";\n if (framework !== \"go test\") return name;\n if (name.endsWith(\"/\")) return name;\n return name\n .split(\"/\")\n .map((p, i) => {\n if (i === 0) {\n return p.replace(/^Test/, \"\").replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n }\n return p.replace(/_/g, \" \");\n })\n .join(\" / \");\n}\n\n// --- tree transforms -----------------------------------------------------\n\n/** Unique non-task frameworks present in the forest, sorted. */\nexport function collectFrameworks(tests: Test[]): string[] {\n const set = new Set<string>();\n const walk = (t: Test) => {\n if (t.framework && t.framework !== \"task\") set.add(t.framework);\n (t.children || []).forEach(walk);\n };\n tests.forEach(walk);\n return Array.from(set).sort();\n}\n\nfunction joinChainNames(parent: string | undefined, child: string | undefined): string {\n const p = (parent ?? \"\").trim();\n const c = (child ?? \"\").trim();\n if (!p) return c;\n if (!c) return p;\n return `${p} > ${c}`;\n}\n\nfunction isCollapsibleContainer(t: Test): boolean {\n return !(t.passed || t.failed || t.aborted || t.skipped || t.pending);\n}\n\n// Re-deriving a collapsed/filtered node invalidates any cached summary; drop it\n// so callers re-roll-up from the surviving children.\nfunction withoutSummary(t: Test): Omit<Test, \"summary\"> & { summary?: never } {\n const { summary: _summary, ...rest } = t;\n return rest;\n}\n\nfunction collapseNode(t: Test): Test {\n const children = t.children ?? [];\n if (children.length === 0) return t;\n\n const collapsedChildren = children.map(collapseNode);\n\n const onlyChild = collapsedChildren.length === 1 ? collapsedChildren[0] : undefined;\n if (onlyChild && isCollapsibleContainer(t)) {\n return { ...withoutSummary(onlyChild), name: joinChainNames(t.name, onlyChild.name) };\n }\n\n return { ...t, children: collapsedChildren };\n}\n\n/**\n * Compress any status-less container with exactly one child into that child,\n * joining names with \" > \". Recursive, so chains collapse into a single row.\n */\nexport function collapseSingleChildChains(tests: Test[]): Test[] {\n return tests.map(collapseNode);\n}\n\nfunction matchesLeaf(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): boolean {\n const s = testStatus(t);\n if (s === null) return false;\n return matchesFilterState(s, statusFilter) && matchesFilterState(t.framework, frameworkFilter);\n}\n\nfunction filterNode(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test | null {\n if (t.children && t.children.length > 0) {\n const filtered = t.children\n .map((c) => filterNode(c, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n if (filtered.length === 0) return null;\n return { ...withoutSummary(t), children: filtered };\n }\n return matchesLeaf(t, statusFilter, frameworkFilter) ? t : null;\n}\n\n/** Prune leaves not matching the status/framework filters; drop empty branches. */\nexport function filterTests(\n tests: Test[],\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test[] {\n if (statusFilter.size === 0 && frameworkFilter.size === 0) return tests;\n return tests\n .map((t) => filterNode(t, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"status.cjs","names":["matchesFilterState"],"sources":["../../../src/data/test-runner/status.ts"],"sourcesContent":["// Pure status/roll-up helpers for the test runner — ported from Gavel's\n// utils.ts (Tests-only subset). No JSX here. `outcomeFor` resolves the outcome\n// marks.tsx draws; `statusToneFor` maps it to a semantic Badge tone.\n\nimport type { BadgeTone } from \"../Badge\";\nimport type { Test, TestSummary } from \"./types\";\nimport { matchesFilterState, type FilterState } from \"./filterState\";\n\n// --- roll-up counts ------------------------------------------------------\n\n/**\n * Tallied verdict breakdown a `Test` subtree rolls up to. `warned` is amber and\n * orthogonal to a real failure — a warned-only leaf counts in total + warned,\n * never in failed.\n */\nexport type StatusCounts = {\n total: number;\n passed: number;\n failed: number;\n warned: number;\n /** Never ran because the run stopped after an earlier failure; not an intentional skip. */\n aborted: number;\n skipped: number;\n pending: number;\n running: number;\n timedout: number;\n};\n\nconst emptyCounts = (): StatusCounts => ({\n total: 0,\n passed: 0,\n failed: 0,\n warned: 0,\n aborted: 0,\n skipped: 0,\n pending: 0,\n running: 0,\n timedout: 0,\n});\n\nconst addCounts = (r: StatusCounts, s: StatusCounts) => {\n r.total += s.total;\n r.passed += s.passed;\n r.failed += s.failed;\n r.warned += s.warned;\n r.aborted += s.aborted;\n r.skipped += s.skipped;\n r.pending += s.pending;\n r.running += s.running;\n r.timedout += s.timedout;\n};\n\nconst countsFromSummary = (summary: TestSummary): StatusCounts => ({\n total: summary.Total,\n passed: summary.Passed,\n failed: summary.Failed,\n warned: summary.Warned || 0,\n aborted: summary.Aborted || 0,\n skipped: summary.Skipped,\n pending: summary.Pending || 0,\n running: summary.Running || 0,\n timedout: summary.Timedout || 0,\n});\n\nconst countsFromLeaf = (t: Test): StatusCounts => {\n const isTimedOut = !!t.timed_out;\n const counted =\n isTimedOut ||\n t.passed ||\n t.failed ||\n t.warned ||\n t.aborted ||\n t.skipped ||\n t.pending ||\n t.running;\n return {\n total: counted ? 1 : 0,\n passed: !isTimedOut && t.passed ? 1 : 0,\n failed: !isTimedOut && t.failed ? 1 : 0,\n warned: !isTimedOut && t.warned ? 1 : 0,\n aborted: !isTimedOut && t.aborted ? 1 : 0,\n skipped: !isTimedOut && !t.aborted && t.skipped ? 1 : 0,\n pending: !isTimedOut && t.pending ? 1 : 0,\n running: !isTimedOut && t.running ? 1 : 0,\n timedout: isTimedOut ? 1 : 0,\n };\n};\n\nexport function sum(t: Test): StatusCounts {\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sum(c));\n return r;\n}\n\n/** Roll up a forest's non-task status counts. Shared by `TestRunner`'s filter\n * bar and `TestRunSummary`'s chips so both read the same tally. */\nexport function aggregateStatusCounts(tests: Test[]): StatusCounts {\n const r = emptyCounts();\n for (const t of tests) addCounts(r, sumNonTaskTests(t));\n return r;\n}\n\n/** Ordered status key → label list, driving both the filter bar's pills and a\n * host's status filter option list, so the seven rows aren't hand-duplicated. */\nexport const STATUS_LABELS: { key: keyof StatusCounts; label: string }[] = [\n { key: \"failed\", label: \"Failed\" },\n { key: \"warned\", label: \"Warned\" },\n { key: \"aborted\", label: \"Aborted\" },\n { key: \"timedout\", label: \"Timed out\" },\n { key: \"passed\", label: \"Passed\" },\n { key: \"skipped\", label: \"Skipped\" },\n { key: \"running\", label: \"Running\" },\n { key: \"pending\", label: \"Queued\" },\n];\n\n/** Like {@link sum} but excludes `task`-framework pseudo-nodes from the tally. */\nexport function sumNonTaskTests(t: Test): StatusCounts {\n if (t.framework === \"task\") {\n const r = emptyCounts();\n for (const c of t.children || []) addCounts(r, sumNonTaskTests(c));\n return r;\n }\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sumNonTaskTests(c));\n return r;\n}\n\nexport function hasFailed(t: Test): boolean {\n if (t.failed) return true;\n return (t.children || []).some(hasFailed);\n}\n\nexport function hasPending(t: Test): boolean {\n if (t.pending) return true;\n return (t.children || []).some(hasPending);\n}\n\nfunction hasTimedOutDescendant(t: Test): boolean {\n if (t.timed_out) return true;\n return (t.children || []).some(hasTimedOutDescendant);\n}\n\nexport function totalDuration(t: Test): number {\n if (t.duration && t.duration > 0) return t.duration;\n let d = 0;\n for (const c of t.children || []) d += totalDuration(c);\n return d;\n}\n\n// --- status classification ----------------------------------------------\n\nexport type TestStatus =\n | \"passed\"\n | \"failed\"\n | \"warned\"\n | \"aborted\"\n | \"skipped\"\n | \"pending\"\n | \"running\"\n | \"timedout\";\n\n/** Resolve a leaf node's single status, or null for a status-less container. */\nexport function testStatus(t: Test): TestStatus | null {\n if (t.timed_out) return \"timedout\";\n if (t.running) return \"running\";\n if (t.pending) return \"pending\";\n if (t.failed) return \"failed\";\n if (t.warned) return \"warned\";\n if (t.aborted) return \"aborted\";\n if (t.skipped) return \"skipped\";\n if (t.passed) return \"passed\";\n return null;\n}\n\n/**\n * A test or lint result's outcome. `errored` is a result the runner could not\n * produce at all (the engine crashed, the child run never reported) — distinct\n * from a test that ran and failed.\n */\nexport type TestOutcome = TestStatus | \"errored\";\n\n/**\n * Resolve a node's outcome, rolling a container up to its worst child: a\n * timeout anywhere, then failed, warned, running, queued, else passed. Null for\n * a status-less leaf.\n */\nexport function outcomeFor(t: Test): TestOutcome | null {\n const own = testStatus(t);\n if (own) return own;\n if (!t.children?.length) return null;\n const s = sum(t);\n if (hasTimedOutDescendant(t)) return \"timedout\";\n if (s.failed > 0) return \"failed\";\n if (s.warned > 0) return \"warned\";\n if (s.aborted > 0) return \"aborted\";\n if (s.running > 0) return \"running\";\n if (s.pending > 0) return \"pending\";\n if (s.total > 0 && s.skipped === s.total) return \"skipped\";\n return \"passed\";\n}\n\n/** Map a node's status to a semantic Badge tone, rolling up container state. */\nexport function statusToneFor(t: Test): BadgeTone {\n const outcome = outcomeFor(t);\n return outcome ? OUTCOME_TONE[outcome] : \"neutral\";\n}\n\nconst OUTCOME_TONE: Record<TestOutcome, BadgeTone> = {\n failed: \"danger\",\n errored: \"danger\",\n timedout: \"warning\",\n warned: \"warning\",\n aborted: \"neutral\",\n skipped: \"neutral\",\n running: \"info\",\n pending: \"neutral\",\n passed: \"success\",\n};\n\n// --- formatting ----------------------------------------------------------\n\n/**\n * Format a nanosecond duration as \"123ms\" or \"1.2s\". Empty for non-positive.\n * Named distinctly from clicky's ms/s `formatDuration` (lib/format) since the\n * test-runner wire format is nanoseconds.\n */\nexport function formatTestDuration(ns: number): string {\n if (ns <= 0) return \"\";\n const ms = ns / 1e6;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction compactWithUnit(value: number, unit: string): string {\n const rounded =\n Math.abs(value) >= 10 ? Math.round(value).toString() : value.toFixed(1).replace(/\\.0$/, \"\");\n return `${rounded}${unit}`;\n}\n\n/** Compact integer counts: <1000 raw, then \"k\", then \"M\". */\nexport function formatCount(n: number): string {\n const abs = Math.abs(n);\n if (abs < 1000) return String(n);\n if (abs < 1_000_000) return compactWithUnit(n / 1000, \"k\");\n return compactWithUnit(n / 1_000_000, \"M\");\n}\n\n/** Strip Go's `Test` prefix and split CamelCase / subtest names into words. */\nexport function humanizeName(name: string, framework?: string): string {\n if (!name) return \"\";\n if (framework !== \"go test\") return name;\n if (name.endsWith(\"/\")) return name;\n return name\n .split(\"/\")\n .map((p, i) => {\n if (i === 0) {\n return p.replace(/^Test/, \"\").replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n }\n return p.replace(/_/g, \" \");\n })\n .join(\" / \");\n}\n\n// --- tree transforms -----------------------------------------------------\n\n/** Unique non-task frameworks present in the forest, sorted. */\nexport function collectFrameworks(tests: Test[]): string[] {\n const set = new Set<string>();\n const walk = (t: Test) => {\n if (t.framework && t.framework !== \"task\") set.add(t.framework);\n (t.children || []).forEach(walk);\n };\n tests.forEach(walk);\n return Array.from(set).sort();\n}\n\nfunction joinChainNames(parent: string | undefined, child: string | undefined): string {\n const p = (parent ?? \"\").trim();\n const c = (child ?? \"\").trim();\n if (!p) return c;\n if (!c) return p;\n return `${p} > ${c}`;\n}\n\nfunction isCollapsibleContainer(t: Test): boolean {\n return !(t.passed || t.failed || t.aborted || t.skipped || t.pending);\n}\n\n// Re-deriving a collapsed/filtered node invalidates any cached summary; drop it\n// so callers re-roll-up from the surviving children.\nfunction withoutSummary(t: Test): Omit<Test, \"summary\"> & { summary?: never } {\n const { summary: _summary, ...rest } = t;\n return rest;\n}\n\nfunction collapseNode(t: Test): Test {\n const children = t.children ?? [];\n if (children.length === 0) return t;\n\n const collapsedChildren = children.map(collapseNode);\n\n const onlyChild = collapsedChildren.length === 1 ? collapsedChildren[0] : undefined;\n if (onlyChild && isCollapsibleContainer(t)) {\n return { ...withoutSummary(onlyChild), name: joinChainNames(t.name, onlyChild.name) };\n }\n\n return { ...t, children: collapsedChildren };\n}\n\n/**\n * Compress any status-less container with exactly one child into that child,\n * joining names with \" > \". Recursive, so chains collapse into a single row.\n */\nexport function collapseSingleChildChains(tests: Test[]): Test[] {\n return tests.map(collapseNode);\n}\n\nfunction matchesLeaf(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): boolean {\n const s = testStatus(t);\n if (s === null) return false;\n return matchesFilterState(s, statusFilter) && matchesFilterState(t.framework, frameworkFilter);\n}\n\nfunction filterNode(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test | null {\n if (t.children && t.children.length > 0) {\n const filtered = t.children\n .map((c) => filterNode(c, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n if (filtered.length === 0) return null;\n return { ...withoutSummary(t), children: filtered };\n }\n return matchesLeaf(t, statusFilter, frameworkFilter) ? t : null;\n}\n\n/** Prune leaves not matching the status/framework filters; drop empty branches. */\nexport function filterTests(\n tests: Test[],\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test[] {\n if (statusFilter.size === 0 && frameworkFilter.size === 0) return tests;\n return tests\n .map((t) => filterNode(t, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n}\n"],"mappings":"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"}
@@ -169,7 +169,7 @@ var OUTCOME_TONE = {
169
169
  errored: "danger",
170
170
  timedout: "warning",
171
171
  warned: "warning",
172
- aborted: "danger",
172
+ aborted: "neutral",
173
173
  skipped: "neutral",
174
174
  running: "info",
175
175
  pending: "neutral",
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","names":[],"sources":["../../../src/data/test-runner/status.ts"],"sourcesContent":["// Pure status/roll-up helpers for the test runner — ported from Gavel's\n// utils.ts (Tests-only subset). No JSX here. `outcomeFor` resolves the outcome\n// marks.tsx draws; `statusToneFor` maps it to a semantic Badge tone.\n\nimport type { BadgeTone } from \"../Badge\";\nimport type { Test, TestSummary } from \"./types\";\nimport { matchesFilterState, type FilterState } from \"./filterState\";\n\n// --- roll-up counts ------------------------------------------------------\n\n/**\n * Tallied verdict breakdown a `Test` subtree rolls up to. `warned` is amber and\n * orthogonal to a real failure — a warned-only leaf counts in total + warned,\n * never in failed.\n */\nexport type StatusCounts = {\n total: number;\n passed: number;\n failed: number;\n warned: number;\n /** Never ran because the run stopped after an earlier failure; not an intentional skip. */\n aborted: number;\n skipped: number;\n pending: number;\n running: number;\n timedout: number;\n};\n\nconst emptyCounts = (): StatusCounts => ({\n total: 0,\n passed: 0,\n failed: 0,\n warned: 0,\n aborted: 0,\n skipped: 0,\n pending: 0,\n running: 0,\n timedout: 0,\n});\n\nconst addCounts = (r: StatusCounts, s: StatusCounts) => {\n r.total += s.total;\n r.passed += s.passed;\n r.failed += s.failed;\n r.warned += s.warned;\n r.aborted += s.aborted;\n r.skipped += s.skipped;\n r.pending += s.pending;\n r.running += s.running;\n r.timedout += s.timedout;\n};\n\nconst countsFromSummary = (summary: TestSummary): StatusCounts => ({\n total: summary.Total,\n passed: summary.Passed,\n failed: summary.Failed,\n warned: summary.Warned || 0,\n aborted: summary.Aborted || 0,\n skipped: summary.Skipped,\n pending: summary.Pending || 0,\n running: summary.Running || 0,\n timedout: summary.Timedout || 0,\n});\n\nconst countsFromLeaf = (t: Test): StatusCounts => {\n const isTimedOut = !!t.timed_out;\n const counted =\n isTimedOut ||\n t.passed ||\n t.failed ||\n t.warned ||\n t.aborted ||\n t.skipped ||\n t.pending ||\n t.running;\n return {\n total: counted ? 1 : 0,\n passed: !isTimedOut && t.passed ? 1 : 0,\n failed: !isTimedOut && t.failed ? 1 : 0,\n warned: !isTimedOut && t.warned ? 1 : 0,\n aborted: !isTimedOut && t.aborted ? 1 : 0,\n skipped: !isTimedOut && !t.aborted && t.skipped ? 1 : 0,\n pending: !isTimedOut && t.pending ? 1 : 0,\n running: !isTimedOut && t.running ? 1 : 0,\n timedout: isTimedOut ? 1 : 0,\n };\n};\n\nexport function sum(t: Test): StatusCounts {\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sum(c));\n return r;\n}\n\n/** Roll up a forest's non-task status counts. Shared by `TestRunner`'s filter\n * bar and `TestRunSummary`'s chips so both read the same tally. */\nexport function aggregateStatusCounts(tests: Test[]): StatusCounts {\n const r = emptyCounts();\n for (const t of tests) addCounts(r, sumNonTaskTests(t));\n return r;\n}\n\n/** Ordered status key → label list, driving both the filter bar's pills and a\n * host's status filter option list, so the seven rows aren't hand-duplicated. */\nexport const STATUS_LABELS: { key: keyof StatusCounts; label: string }[] = [\n { key: \"failed\", label: \"Failed\" },\n { key: \"warned\", label: \"Warned\" },\n { key: \"aborted\", label: \"Aborted\" },\n { key: \"timedout\", label: \"Timed out\" },\n { key: \"passed\", label: \"Passed\" },\n { key: \"skipped\", label: \"Skipped\" },\n { key: \"running\", label: \"Running\" },\n { key: \"pending\", label: \"Queued\" },\n];\n\n/** Like {@link sum} but excludes `task`-framework pseudo-nodes from the tally. */\nexport function sumNonTaskTests(t: Test): StatusCounts {\n if (t.framework === \"task\") {\n const r = emptyCounts();\n for (const c of t.children || []) addCounts(r, sumNonTaskTests(c));\n return r;\n }\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sumNonTaskTests(c));\n return r;\n}\n\nexport function hasFailed(t: Test): boolean {\n if (t.failed) return true;\n return (t.children || []).some(hasFailed);\n}\n\nexport function hasPending(t: Test): boolean {\n if (t.pending) return true;\n return (t.children || []).some(hasPending);\n}\n\nfunction hasTimedOutDescendant(t: Test): boolean {\n if (t.timed_out) return true;\n return (t.children || []).some(hasTimedOutDescendant);\n}\n\nexport function totalDuration(t: Test): number {\n if (t.duration && t.duration > 0) return t.duration;\n let d = 0;\n for (const c of t.children || []) d += totalDuration(c);\n return d;\n}\n\n// --- status classification ----------------------------------------------\n\nexport type TestStatus =\n | \"passed\"\n | \"failed\"\n | \"warned\"\n | \"aborted\"\n | \"skipped\"\n | \"pending\"\n | \"running\"\n | \"timedout\";\n\n/** Resolve a leaf node's single status, or null for a status-less container. */\nexport function testStatus(t: Test): TestStatus | null {\n if (t.timed_out) return \"timedout\";\n if (t.running) return \"running\";\n if (t.pending) return \"pending\";\n if (t.failed) return \"failed\";\n if (t.warned) return \"warned\";\n if (t.aborted) return \"aborted\";\n if (t.skipped) return \"skipped\";\n if (t.passed) return \"passed\";\n return null;\n}\n\n/**\n * A test or lint result's outcome. `errored` is a result the runner could not\n * produce at all (the engine crashed, the child run never reported) — distinct\n * from a test that ran and failed.\n */\nexport type TestOutcome = TestStatus | \"errored\";\n\n/**\n * Resolve a node's outcome, rolling a container up to its worst child: a\n * timeout anywhere, then failed, warned, running, queued, else passed. Null for\n * a status-less leaf.\n */\nexport function outcomeFor(t: Test): TestOutcome | null {\n const own = testStatus(t);\n if (own) return own;\n if (!t.children?.length) return null;\n const s = sum(t);\n if (hasTimedOutDescendant(t)) return \"timedout\";\n if (s.failed > 0) return \"failed\";\n if (s.warned > 0) return \"warned\";\n if (s.aborted > 0) return \"aborted\";\n if (s.running > 0) return \"running\";\n if (s.pending > 0) return \"pending\";\n if (s.total > 0 && s.skipped === s.total) return \"skipped\";\n return \"passed\";\n}\n\n/** Map a node's status to a semantic Badge tone, rolling up container state. */\nexport function statusToneFor(t: Test): BadgeTone {\n const outcome = outcomeFor(t);\n return outcome ? OUTCOME_TONE[outcome] : \"neutral\";\n}\n\nconst OUTCOME_TONE: Record<TestOutcome, BadgeTone> = {\n failed: \"danger\",\n errored: \"danger\",\n timedout: \"warning\",\n warned: \"warning\",\n aborted: \"danger\",\n skipped: \"neutral\",\n running: \"info\",\n pending: \"neutral\",\n passed: \"success\",\n};\n\n// --- formatting ----------------------------------------------------------\n\n/**\n * Format a nanosecond duration as \"123ms\" or \"1.2s\". Empty for non-positive.\n * Named distinctly from clicky's ms/s `formatDuration` (lib/format) since the\n * test-runner wire format is nanoseconds.\n */\nexport function formatTestDuration(ns: number): string {\n if (ns <= 0) return \"\";\n const ms = ns / 1e6;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction compactWithUnit(value: number, unit: string): string {\n const rounded =\n Math.abs(value) >= 10 ? Math.round(value).toString() : value.toFixed(1).replace(/\\.0$/, \"\");\n return `${rounded}${unit}`;\n}\n\n/** Compact integer counts: <1000 raw, then \"k\", then \"M\". */\nexport function formatCount(n: number): string {\n const abs = Math.abs(n);\n if (abs < 1000) return String(n);\n if (abs < 1_000_000) return compactWithUnit(n / 1000, \"k\");\n return compactWithUnit(n / 1_000_000, \"M\");\n}\n\n/** Strip Go's `Test` prefix and split CamelCase / subtest names into words. */\nexport function humanizeName(name: string, framework?: string): string {\n if (!name) return \"\";\n if (framework !== \"go test\") return name;\n if (name.endsWith(\"/\")) return name;\n return name\n .split(\"/\")\n .map((p, i) => {\n if (i === 0) {\n return p.replace(/^Test/, \"\").replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n }\n return p.replace(/_/g, \" \");\n })\n .join(\" / \");\n}\n\n// --- tree transforms -----------------------------------------------------\n\n/** Unique non-task frameworks present in the forest, sorted. */\nexport function collectFrameworks(tests: Test[]): string[] {\n const set = new Set<string>();\n const walk = (t: Test) => {\n if (t.framework && t.framework !== \"task\") set.add(t.framework);\n (t.children || []).forEach(walk);\n };\n tests.forEach(walk);\n return Array.from(set).sort();\n}\n\nfunction joinChainNames(parent: string | undefined, child: string | undefined): string {\n const p = (parent ?? \"\").trim();\n const c = (child ?? \"\").trim();\n if (!p) return c;\n if (!c) return p;\n return `${p} > ${c}`;\n}\n\nfunction isCollapsibleContainer(t: Test): boolean {\n return !(t.passed || t.failed || t.aborted || t.skipped || t.pending);\n}\n\n// Re-deriving a collapsed/filtered node invalidates any cached summary; drop it\n// so callers re-roll-up from the surviving children.\nfunction withoutSummary(t: Test): Omit<Test, \"summary\"> & { summary?: never } {\n const { summary: _summary, ...rest } = t;\n return rest;\n}\n\nfunction collapseNode(t: Test): Test {\n const children = t.children ?? [];\n if (children.length === 0) return t;\n\n const collapsedChildren = children.map(collapseNode);\n\n const onlyChild = collapsedChildren.length === 1 ? collapsedChildren[0] : undefined;\n if (onlyChild && isCollapsibleContainer(t)) {\n return { ...withoutSummary(onlyChild), name: joinChainNames(t.name, onlyChild.name) };\n }\n\n return { ...t, children: collapsedChildren };\n}\n\n/**\n * Compress any status-less container with exactly one child into that child,\n * joining names with \" > \". Recursive, so chains collapse into a single row.\n */\nexport function collapseSingleChildChains(tests: Test[]): Test[] {\n return tests.map(collapseNode);\n}\n\nfunction matchesLeaf(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): boolean {\n const s = testStatus(t);\n if (s === null) return false;\n return matchesFilterState(s, statusFilter) && matchesFilterState(t.framework, frameworkFilter);\n}\n\nfunction filterNode(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test | null {\n if (t.children && t.children.length > 0) {\n const filtered = t.children\n .map((c) => filterNode(c, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n if (filtered.length === 0) return null;\n return { ...withoutSummary(t), children: filtered };\n }\n return matchesLeaf(t, statusFilter, frameworkFilter) ? t : null;\n}\n\n/** Prune leaves not matching the status/framework filters; drop empty branches. */\nexport function filterTests(\n tests: Test[],\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test[] {\n if (statusFilter.size === 0 && frameworkFilter.size === 0) return tests;\n return tests\n .map((t) => filterNode(t, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"status.js","names":[],"sources":["../../../src/data/test-runner/status.ts"],"sourcesContent":["// Pure status/roll-up helpers for the test runner — ported from Gavel's\n// utils.ts (Tests-only subset). No JSX here. `outcomeFor` resolves the outcome\n// marks.tsx draws; `statusToneFor` maps it to a semantic Badge tone.\n\nimport type { BadgeTone } from \"../Badge\";\nimport type { Test, TestSummary } from \"./types\";\nimport { matchesFilterState, type FilterState } from \"./filterState\";\n\n// --- roll-up counts ------------------------------------------------------\n\n/**\n * Tallied verdict breakdown a `Test` subtree rolls up to. `warned` is amber and\n * orthogonal to a real failure — a warned-only leaf counts in total + warned,\n * never in failed.\n */\nexport type StatusCounts = {\n total: number;\n passed: number;\n failed: number;\n warned: number;\n /** Never ran because the run stopped after an earlier failure; not an intentional skip. */\n aborted: number;\n skipped: number;\n pending: number;\n running: number;\n timedout: number;\n};\n\nconst emptyCounts = (): StatusCounts => ({\n total: 0,\n passed: 0,\n failed: 0,\n warned: 0,\n aborted: 0,\n skipped: 0,\n pending: 0,\n running: 0,\n timedout: 0,\n});\n\nconst addCounts = (r: StatusCounts, s: StatusCounts) => {\n r.total += s.total;\n r.passed += s.passed;\n r.failed += s.failed;\n r.warned += s.warned;\n r.aborted += s.aborted;\n r.skipped += s.skipped;\n r.pending += s.pending;\n r.running += s.running;\n r.timedout += s.timedout;\n};\n\nconst countsFromSummary = (summary: TestSummary): StatusCounts => ({\n total: summary.Total,\n passed: summary.Passed,\n failed: summary.Failed,\n warned: summary.Warned || 0,\n aborted: summary.Aborted || 0,\n skipped: summary.Skipped,\n pending: summary.Pending || 0,\n running: summary.Running || 0,\n timedout: summary.Timedout || 0,\n});\n\nconst countsFromLeaf = (t: Test): StatusCounts => {\n const isTimedOut = !!t.timed_out;\n const counted =\n isTimedOut ||\n t.passed ||\n t.failed ||\n t.warned ||\n t.aborted ||\n t.skipped ||\n t.pending ||\n t.running;\n return {\n total: counted ? 1 : 0,\n passed: !isTimedOut && t.passed ? 1 : 0,\n failed: !isTimedOut && t.failed ? 1 : 0,\n warned: !isTimedOut && t.warned ? 1 : 0,\n aborted: !isTimedOut && t.aborted ? 1 : 0,\n skipped: !isTimedOut && !t.aborted && t.skipped ? 1 : 0,\n pending: !isTimedOut && t.pending ? 1 : 0,\n running: !isTimedOut && t.running ? 1 : 0,\n timedout: isTimedOut ? 1 : 0,\n };\n};\n\nexport function sum(t: Test): StatusCounts {\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sum(c));\n return r;\n}\n\n/** Roll up a forest's non-task status counts. Shared by `TestRunner`'s filter\n * bar and `TestRunSummary`'s chips so both read the same tally. */\nexport function aggregateStatusCounts(tests: Test[]): StatusCounts {\n const r = emptyCounts();\n for (const t of tests) addCounts(r, sumNonTaskTests(t));\n return r;\n}\n\n/** Ordered status key → label list, driving both the filter bar's pills and a\n * host's status filter option list, so the seven rows aren't hand-duplicated. */\nexport const STATUS_LABELS: { key: keyof StatusCounts; label: string }[] = [\n { key: \"failed\", label: \"Failed\" },\n { key: \"warned\", label: \"Warned\" },\n { key: \"aborted\", label: \"Aborted\" },\n { key: \"timedout\", label: \"Timed out\" },\n { key: \"passed\", label: \"Passed\" },\n { key: \"skipped\", label: \"Skipped\" },\n { key: \"running\", label: \"Running\" },\n { key: \"pending\", label: \"Queued\" },\n];\n\n/** Like {@link sum} but excludes `task`-framework pseudo-nodes from the tally. */\nexport function sumNonTaskTests(t: Test): StatusCounts {\n if (t.framework === \"task\") {\n const r = emptyCounts();\n for (const c of t.children || []) addCounts(r, sumNonTaskTests(c));\n return r;\n }\n if (t.summary) return countsFromSummary(t.summary);\n if (!t.children || t.children.length === 0) return countsFromLeaf(t);\n const r = emptyCounts();\n for (const c of t.children) addCounts(r, sumNonTaskTests(c));\n return r;\n}\n\nexport function hasFailed(t: Test): boolean {\n if (t.failed) return true;\n return (t.children || []).some(hasFailed);\n}\n\nexport function hasPending(t: Test): boolean {\n if (t.pending) return true;\n return (t.children || []).some(hasPending);\n}\n\nfunction hasTimedOutDescendant(t: Test): boolean {\n if (t.timed_out) return true;\n return (t.children || []).some(hasTimedOutDescendant);\n}\n\nexport function totalDuration(t: Test): number {\n if (t.duration && t.duration > 0) return t.duration;\n let d = 0;\n for (const c of t.children || []) d += totalDuration(c);\n return d;\n}\n\n// --- status classification ----------------------------------------------\n\nexport type TestStatus =\n | \"passed\"\n | \"failed\"\n | \"warned\"\n | \"aborted\"\n | \"skipped\"\n | \"pending\"\n | \"running\"\n | \"timedout\";\n\n/** Resolve a leaf node's single status, or null for a status-less container. */\nexport function testStatus(t: Test): TestStatus | null {\n if (t.timed_out) return \"timedout\";\n if (t.running) return \"running\";\n if (t.pending) return \"pending\";\n if (t.failed) return \"failed\";\n if (t.warned) return \"warned\";\n if (t.aborted) return \"aborted\";\n if (t.skipped) return \"skipped\";\n if (t.passed) return \"passed\";\n return null;\n}\n\n/**\n * A test or lint result's outcome. `errored` is a result the runner could not\n * produce at all (the engine crashed, the child run never reported) — distinct\n * from a test that ran and failed.\n */\nexport type TestOutcome = TestStatus | \"errored\";\n\n/**\n * Resolve a node's outcome, rolling a container up to its worst child: a\n * timeout anywhere, then failed, warned, running, queued, else passed. Null for\n * a status-less leaf.\n */\nexport function outcomeFor(t: Test): TestOutcome | null {\n const own = testStatus(t);\n if (own) return own;\n if (!t.children?.length) return null;\n const s = sum(t);\n if (hasTimedOutDescendant(t)) return \"timedout\";\n if (s.failed > 0) return \"failed\";\n if (s.warned > 0) return \"warned\";\n if (s.aborted > 0) return \"aborted\";\n if (s.running > 0) return \"running\";\n if (s.pending > 0) return \"pending\";\n if (s.total > 0 && s.skipped === s.total) return \"skipped\";\n return \"passed\";\n}\n\n/** Map a node's status to a semantic Badge tone, rolling up container state. */\nexport function statusToneFor(t: Test): BadgeTone {\n const outcome = outcomeFor(t);\n return outcome ? OUTCOME_TONE[outcome] : \"neutral\";\n}\n\nconst OUTCOME_TONE: Record<TestOutcome, BadgeTone> = {\n failed: \"danger\",\n errored: \"danger\",\n timedout: \"warning\",\n warned: \"warning\",\n aborted: \"neutral\",\n skipped: \"neutral\",\n running: \"info\",\n pending: \"neutral\",\n passed: \"success\",\n};\n\n// --- formatting ----------------------------------------------------------\n\n/**\n * Format a nanosecond duration as \"123ms\" or \"1.2s\". Empty for non-positive.\n * Named distinctly from clicky's ms/s `formatDuration` (lib/format) since the\n * test-runner wire format is nanoseconds.\n */\nexport function formatTestDuration(ns: number): string {\n if (ns <= 0) return \"\";\n const ms = ns / 1e6;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction compactWithUnit(value: number, unit: string): string {\n const rounded =\n Math.abs(value) >= 10 ? Math.round(value).toString() : value.toFixed(1).replace(/\\.0$/, \"\");\n return `${rounded}${unit}`;\n}\n\n/** Compact integer counts: <1000 raw, then \"k\", then \"M\". */\nexport function formatCount(n: number): string {\n const abs = Math.abs(n);\n if (abs < 1000) return String(n);\n if (abs < 1_000_000) return compactWithUnit(n / 1000, \"k\");\n return compactWithUnit(n / 1_000_000, \"M\");\n}\n\n/** Strip Go's `Test` prefix and split CamelCase / subtest names into words. */\nexport function humanizeName(name: string, framework?: string): string {\n if (!name) return \"\";\n if (framework !== \"go test\") return name;\n if (name.endsWith(\"/\")) return name;\n return name\n .split(\"/\")\n .map((p, i) => {\n if (i === 0) {\n return p.replace(/^Test/, \"\").replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n }\n return p.replace(/_/g, \" \");\n })\n .join(\" / \");\n}\n\n// --- tree transforms -----------------------------------------------------\n\n/** Unique non-task frameworks present in the forest, sorted. */\nexport function collectFrameworks(tests: Test[]): string[] {\n const set = new Set<string>();\n const walk = (t: Test) => {\n if (t.framework && t.framework !== \"task\") set.add(t.framework);\n (t.children || []).forEach(walk);\n };\n tests.forEach(walk);\n return Array.from(set).sort();\n}\n\nfunction joinChainNames(parent: string | undefined, child: string | undefined): string {\n const p = (parent ?? \"\").trim();\n const c = (child ?? \"\").trim();\n if (!p) return c;\n if (!c) return p;\n return `${p} > ${c}`;\n}\n\nfunction isCollapsibleContainer(t: Test): boolean {\n return !(t.passed || t.failed || t.aborted || t.skipped || t.pending);\n}\n\n// Re-deriving a collapsed/filtered node invalidates any cached summary; drop it\n// so callers re-roll-up from the surviving children.\nfunction withoutSummary(t: Test): Omit<Test, \"summary\"> & { summary?: never } {\n const { summary: _summary, ...rest } = t;\n return rest;\n}\n\nfunction collapseNode(t: Test): Test {\n const children = t.children ?? [];\n if (children.length === 0) return t;\n\n const collapsedChildren = children.map(collapseNode);\n\n const onlyChild = collapsedChildren.length === 1 ? collapsedChildren[0] : undefined;\n if (onlyChild && isCollapsibleContainer(t)) {\n return { ...withoutSummary(onlyChild), name: joinChainNames(t.name, onlyChild.name) };\n }\n\n return { ...t, children: collapsedChildren };\n}\n\n/**\n * Compress any status-less container with exactly one child into that child,\n * joining names with \" > \". Recursive, so chains collapse into a single row.\n */\nexport function collapseSingleChildChains(tests: Test[]): Test[] {\n return tests.map(collapseNode);\n}\n\nfunction matchesLeaf(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): boolean {\n const s = testStatus(t);\n if (s === null) return false;\n return matchesFilterState(s, statusFilter) && matchesFilterState(t.framework, frameworkFilter);\n}\n\nfunction filterNode(\n t: Test,\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test | null {\n if (t.children && t.children.length > 0) {\n const filtered = t.children\n .map((c) => filterNode(c, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n if (filtered.length === 0) return null;\n return { ...withoutSummary(t), children: filtered };\n }\n return matchesLeaf(t, statusFilter, frameworkFilter) ? t : null;\n}\n\n/** Prune leaves not matching the status/framework filters; drop empty branches. */\nexport function filterTests(\n tests: Test[],\n statusFilter: FilterState<string>,\n frameworkFilter: FilterState<string>,\n): Test[] {\n if (statusFilter.size === 0 && frameworkFilter.size === 0) return tests;\n return tests\n .map((t) => filterNode(t, statusFilter, frameworkFilter))\n .filter(Boolean) as Test[];\n}\n"],"mappings":"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"}
@@ -34,6 +34,8 @@ export interface Test {
34
34
  * and pending with a static hollow icon.
35
35
  */
36
36
  running?: boolean;
37
+ /** A running node blocked on a person answering a form (gavel's fixture `form` step). */
38
+ waiting?: boolean;
37
39
  timed_out?: boolean;
38
40
  task_id?: string;
39
41
  can_stop?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/types.ts"],"names":[],"mappings":"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"}
@@ -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 = require_stepKind.readStepDetail(node.detail);
96
96
  const { header, rest } = require_stepKind.splitExecutionDetail(node.detail);
97
97
  const rawDetail = require_stepSource.withoutSource(stepDetail.kind === "step" ? require_stepKind.splitExecutionDetail(stepDetail.step.rest).rest : rest);
98
+ const pendingForm = node.waiting === true && renderPendingPrompt ? renderPendingPrompt(node) : null;
98
99
  return /* @__PURE__ */ (0, react_jsx_runtime.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__ */ (0, react_jsx_runtime.jsx)(require_stepKindViews.StepPendingFormSection, { children: pendingForm }),
105
107
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FailureMessage, {
106
108
  node,
107
109
  cause: stepDetail.kind === "step" ? stepDetail.step.wait?.cause : void 0,
@@ -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":"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"}
@@ -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":";;;;;;;;;AAsBA,SAAS,qBAAqB,MAAyB;CACrD,IAAI,KAAK,QAAQ,OAAO;CACxB,IAAI,KAAK,QAAQ,OAAO;CACxB,OAAO;AACT;AAEA,SAAS,iBAAiB,EAAE,QAAwB;CAClD,OACE,qBAAC,MAAD;EAAI,WAAU;EAAd,UAAA,CACE,oBAAC,aAAD;GAAa,SAAS,qBAAqB,IAAI;GAAG,WAAU;EAAkB,CAAA,GAC9E,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACG,KAAK,MACL,KAAK,UACJ,oBAAC,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,oBAAC,OAAD;EAAK,WAAU;EACb,UAAA,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM,KAAK,MAAM,UAChB,oBAAC,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,aAAa,eAAe,KAAK,MAAM;CAC7C,MAAM,OAAO,WAAW,SAAS,SAAS,WAAW,KAAK,OAAO,KAAA;CACjE,MAAM,aAAa,QAAQ,KAAK,YAAY,cAAc,cAAc,IAAI,IAAI;CAChF,OACE,oBAAC,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,oBAAC,KAAD;EAAG,WAAU;EAA2C,UAAA,MAAM,KAAK,IAAI;CAAK,CAAA;CAClI,OACE,oBAAC,gBAAD,EAAA,UACG,MAAM,KAAK,MAAM,MAAM,oBAAC,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,aAAa,eAAe,KAAK,MAAM;CAC7C,MAAM,EAAE,QAAQ,SAAS,qBAAqB,KAAK,MAAM;CAEzD,MAAM,YAAY,cAAc,WAAW,SAAS,SAAS,qBAAqB,WAAW,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI;CACnH,MAAM,cAAc,KAAK,YAAY,QAAQ,sBAAsB,oBAAoB,IAAI,IAAI;CAC/F,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,oBAAC,qBAAD;IAA6B;IAAQ,GAAK,WAAW,SAAS,SAAS,EAAE,UAAU,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC;GAAK,CAAA;GACtH,eAAe,QAAQ,oBAAC,wBAAD,EAAA,UAAyB,YAAoC,CAAA;GACrF,oBAAC,gBAAD;IAAsB;IAAM,OAAO,WAAW,SAAS,SAAS,WAAW,KAAK,MAAM,QAAQ,KAAA;IAAW,OAAO,OAAO;GAAQ,CAAA;GAC9H,WACC,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,OAAD;MAAK,WAAU;MAA4D,UAAA;KAAY,CAAA;KACvF,oBAAC,QAAD;MAAM,WAAU;MACb,UAAA;KACG,CAAA;KACN,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACG,OAAO,qBAAC,QAAD,EAAA,UAAA,CAAM,OAAI,GAAU,EAAA,CAAA,GAC3B,OAAO,SAAS,cAAc,YAC7B,qBAAC,QAAD;OAAM,WAAW,QAAQ,cAAc,IAAI,KAAA,IAAY;OAAvD,UAAA,CAAuE,SAC/D,QAAQ,SACV;MAEL,CAAA,CAAA;;IACF;;GAEP,oBAAC,YAAD,EAAkB,KAAO,CAAA;GACzB,oBAAC,YAAD,EAAkB,KAAO,CAAA;GACzB,oBAAC,mBAAD,EAAmB,QAAQ,eAAe,KAAK,MAAM,EAAI,CAAA;GACxD,WAAW,SAAS,UAAU,oBAAC,kBAAD;IAAkB,MAAM,WAAW;IAAM,GAAK,aAAa,EAAE,WAAW,IAAI,CAAC;GAAK,CAAA;GAChH,WAAW,SAAS,aAAa,oBAAC,qBAAD,EAAqB,OAAO,WAAW,MAAQ,CAAA;GAChF,aAAa,QACZ,qBAAC,WAAD;IAAS,WAAU;IAAwB,mBAAgB;IAA3D,UAAA,CACE,oBAAC,WAAD;KAAS,WAAU;KAAqD,UAAA;IAAmB,CAAA,GAC3F,oBAAC,OAAD;KAAK,WAAU;KACb,UAAA,oBAAC,UAAD,EAAU,MAAM,UAAY,CAAA;IACzB,CAAA,CACE;;EAER;;AAET"}
@@ -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);