@flanksource/clicky-ui 0.3.49 → 0.3.50

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 (384) hide show
  1. package/dist/connections/ConnectionsPage.cjs +219 -0
  2. package/dist/connections/ConnectionsPage.cjs.map +1 -0
  3. package/dist/connections/ConnectionsPage.d.ts +23 -0
  4. package/dist/connections/ConnectionsPage.d.ts.map +1 -0
  5. package/dist/connections/ConnectionsPage.js +219 -0
  6. package/dist/connections/ConnectionsPage.js.map +1 -0
  7. package/dist/connections/connectionActionStatus.cjs +43 -0
  8. package/dist/connections/connectionActionStatus.cjs.map +1 -0
  9. package/dist/connections/connectionActionStatus.d.ts +5 -0
  10. package/dist/connections/connectionActionStatus.d.ts.map +1 -0
  11. package/dist/connections/connectionActionStatus.js +43 -0
  12. package/dist/connections/connectionActionStatus.js.map +1 -0
  13. package/dist/connections/connectionActionTypes.cjs +24 -0
  14. package/dist/connections/connectionActionTypes.cjs.map +1 -0
  15. package/dist/connections/connectionActionTypes.d.ts +36 -0
  16. package/dist/connections/connectionActionTypes.d.ts.map +1 -0
  17. package/dist/connections/connectionActionTypes.js +24 -0
  18. package/dist/connections/connectionActionTypes.js.map +1 -0
  19. package/dist/connections/connectionActions.cjs +11 -0
  20. package/dist/connections/connectionActions.cjs.map +1 -0
  21. package/dist/connections/connectionActions.d.ts +15 -0
  22. package/dist/connections/connectionActions.d.ts.map +1 -0
  23. package/dist/connections/connectionActions.js +11 -0
  24. package/dist/connections/connectionActions.js.map +1 -0
  25. package/dist/connections/connectionDashboard.cjs +185 -0
  26. package/dist/connections/connectionDashboard.cjs.map +1 -0
  27. package/dist/connections/connectionDashboard.d.ts +25 -0
  28. package/dist/connections/connectionDashboard.d.ts.map +1 -0
  29. package/dist/connections/connectionDashboard.js +185 -0
  30. package/dist/connections/connectionDashboard.js.map +1 -0
  31. package/dist/connections/connectionDashboardModel.cjs +43 -0
  32. package/dist/connections/connectionDashboardModel.cjs.map +1 -0
  33. package/dist/connections/connectionDashboardModel.d.ts +75 -0
  34. package/dist/connections/connectionDashboardModel.d.ts.map +1 -0
  35. package/dist/connections/connectionDashboardModel.js +43 -0
  36. package/dist/connections/connectionDashboardModel.js.map +1 -0
  37. package/dist/connections/connectionDashboardRenderer.cjs +21 -0
  38. package/dist/connections/connectionDashboardRenderer.cjs.map +1 -0
  39. package/dist/connections/connectionDashboardRenderer.d.ts +15 -0
  40. package/dist/connections/connectionDashboardRenderer.d.ts.map +1 -0
  41. package/dist/connections/connectionDashboardRenderer.js +21 -0
  42. package/dist/connections/connectionDashboardRenderer.js.map +1 -0
  43. package/dist/connections/connectionDashboardRow.cjs +169 -0
  44. package/dist/connections/connectionDashboardRow.cjs.map +1 -0
  45. package/dist/connections/connectionDashboardRow.d.ts +12 -0
  46. package/dist/connections/connectionDashboardRow.d.ts.map +1 -0
  47. package/dist/connections/connectionDashboardRow.js +169 -0
  48. package/dist/connections/connectionDashboardRow.js.map +1 -0
  49. package/dist/connections/connectionErrorView.cjs +8 -0
  50. package/dist/connections/connectionErrorView.cjs.map +1 -0
  51. package/dist/connections/connectionErrorView.d.ts +4 -0
  52. package/dist/connections/connectionErrorView.d.ts.map +1 -0
  53. package/dist/connections/connectionErrorView.js +8 -0
  54. package/dist/connections/connectionErrorView.js.map +1 -0
  55. package/dist/connections/connectionHealth.cjs +82 -0
  56. package/dist/connections/connectionHealth.cjs.map +1 -0
  57. package/dist/connections/connectionHealth.d.ts +33 -0
  58. package/dist/connections/connectionHealth.d.ts.map +1 -0
  59. package/dist/connections/connectionHealth.js +82 -0
  60. package/dist/connections/connectionHealth.js.map +1 -0
  61. package/dist/connections/connectionLogging.cjs +29 -0
  62. package/dist/connections/connectionLogging.cjs.map +1 -0
  63. package/dist/connections/connectionLogging.d.ts +11 -0
  64. package/dist/connections/connectionLogging.d.ts.map +1 -0
  65. package/dist/connections/connectionLogging.js +29 -0
  66. package/dist/connections/connectionLogging.js.map +1 -0
  67. package/dist/connections/connectionLoggingField.cjs +37 -0
  68. package/dist/connections/connectionLoggingField.cjs.map +1 -0
  69. package/dist/connections/connectionLoggingField.d.ts +12 -0
  70. package/dist/connections/connectionLoggingField.d.ts.map +1 -0
  71. package/dist/connections/connectionLoggingField.js +37 -0
  72. package/dist/connections/connectionLoggingField.js.map +1 -0
  73. package/dist/connections/connectionLoggingModel.cjs +16 -0
  74. package/dist/connections/connectionLoggingModel.cjs.map +1 -0
  75. package/dist/connections/connectionLoggingModel.d.ts +6 -0
  76. package/dist/connections/connectionLoggingModel.d.ts.map +1 -0
  77. package/dist/connections/connectionLoggingModel.js +16 -0
  78. package/dist/connections/connectionLoggingModel.js.map +1 -0
  79. package/dist/connections/connectionResolveView.cjs +24 -0
  80. package/dist/connections/connectionResolveView.cjs.map +1 -0
  81. package/dist/connections/connectionResolveView.d.ts +5 -0
  82. package/dist/connections/connectionResolveView.d.ts.map +1 -0
  83. package/dist/connections/connectionResolveView.js +24 -0
  84. package/dist/connections/connectionResolveView.js.map +1 -0
  85. package/dist/connections/connectionTestButton.cjs +58 -0
  86. package/dist/connections/connectionTestButton.cjs.map +1 -0
  87. package/dist/connections/connectionTestButton.d.ts +6 -0
  88. package/dist/connections/connectionTestButton.d.ts.map +1 -0
  89. package/dist/connections/connectionTestButton.js +58 -0
  90. package/dist/connections/connectionTestButton.js.map +1 -0
  91. package/dist/connections/connectionTestView.cjs +12 -0
  92. package/dist/connections/connectionTestView.cjs.map +1 -0
  93. package/dist/connections/connectionTestView.d.ts +5 -0
  94. package/dist/connections/connectionTestView.d.ts.map +1 -0
  95. package/dist/connections/connectionTestView.js +12 -0
  96. package/dist/connections/connectionTestView.js.map +1 -0
  97. package/dist/connections/connectionsPageModel.cjs +33 -0
  98. package/dist/connections/connectionsPageModel.cjs.map +1 -0
  99. package/dist/connections/connectionsPageModel.d.ts +24 -0
  100. package/dist/connections/connectionsPageModel.d.ts.map +1 -0
  101. package/dist/connections/connectionsPageModel.js +33 -0
  102. package/dist/connections/connectionsPageModel.js.map +1 -0
  103. package/dist/connections/iconProvider.cjs +20 -0
  104. package/dist/connections/iconProvider.cjs.map +1 -0
  105. package/dist/connections/iconProvider.d.ts +7 -0
  106. package/dist/connections/iconProvider.d.ts.map +1 -0
  107. package/dist/connections/iconProvider.js +20 -0
  108. package/dist/connections/iconProvider.js.map +1 -0
  109. package/dist/connections.cjs +45 -0
  110. package/dist/connections.cjs.map +1 -0
  111. package/dist/connections.d.ts +34 -0
  112. package/dist/connections.d.ts.map +1 -0
  113. package/dist/connections.js +45 -0
  114. package/dist/connections.js.map +1 -0
  115. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +52 -295
  116. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  117. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  118. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +47 -290
  119. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  120. package/dist/data/diagnostics/MetricTile.cjs +44 -0
  121. package/dist/data/diagnostics/MetricTile.cjs.map +1 -0
  122. package/dist/data/diagnostics/MetricTile.d.ts +13 -0
  123. package/dist/data/diagnostics/MetricTile.d.ts.map +1 -0
  124. package/dist/data/diagnostics/MetricTile.js +44 -0
  125. package/dist/data/diagnostics/MetricTile.js.map +1 -0
  126. package/dist/data/diagnostics/StackDumpView.cjs +227 -0
  127. package/dist/data/diagnostics/StackDumpView.cjs.map +1 -0
  128. package/dist/data/diagnostics/StackDumpView.d.ts +53 -0
  129. package/dist/data/diagnostics/StackDumpView.d.ts.map +1 -0
  130. package/dist/data/diagnostics/StackDumpView.js +227 -0
  131. package/dist/data/diagnostics/StackDumpView.js.map +1 -0
  132. package/dist/data/diagnostics/fixtures.d.ts +1 -0
  133. package/dist/data/diagnostics/fixtures.d.ts.map +1 -1
  134. package/dist/data/diagnostics/metric-tone.cjs +18 -0
  135. package/dist/data/diagnostics/metric-tone.cjs.map +1 -0
  136. package/dist/data/diagnostics/metric-tone.d.ts +6 -0
  137. package/dist/data/diagnostics/metric-tone.d.ts.map +1 -0
  138. package/dist/data/diagnostics/metric-tone.js +18 -0
  139. package/dist/data/diagnostics/metric-tone.js.map +1 -0
  140. package/dist/data/diagnostics/stacktrace.cjs +44 -0
  141. package/dist/data/diagnostics/stacktrace.cjs.map +1 -1
  142. package/dist/data/diagnostics/stacktrace.d.ts +7 -0
  143. package/dist/data/diagnostics/stacktrace.d.ts.map +1 -1
  144. package/dist/data/diagnostics/stacktrace.js +44 -0
  145. package/dist/data/diagnostics/stacktrace.js.map +1 -1
  146. package/dist/data/diagnostics/types.d.ts +2 -8
  147. package/dist/data/diagnostics/types.d.ts.map +1 -1
  148. package/dist/data/lint/LintDetail.cjs +339 -0
  149. package/dist/data/lint/LintDetail.cjs.map +1 -0
  150. package/dist/data/lint/LintDetail.d.ts +17 -0
  151. package/dist/data/lint/LintDetail.d.ts.map +1 -0
  152. package/dist/data/lint/LintDetail.js +339 -0
  153. package/dist/data/lint/LintDetail.js.map +1 -0
  154. package/dist/data/lint/LintFilterBar.cjs +103 -0
  155. package/dist/data/lint/LintFilterBar.cjs.map +1 -0
  156. package/dist/data/lint/LintFilterBar.d.ts +16 -0
  157. package/dist/data/lint/LintFilterBar.d.ts.map +1 -0
  158. package/dist/data/lint/LintFilterBar.js +103 -0
  159. package/dist/data/lint/LintFilterBar.js.map +1 -0
  160. package/dist/data/lint/LintResults.cjs +144 -0
  161. package/dist/data/lint/LintResults.cjs.map +1 -0
  162. package/dist/data/lint/LintResults.d.ts +39 -0
  163. package/dist/data/lint/LintResults.d.ts.map +1 -0
  164. package/dist/data/lint/LintResults.fixtures.d.ts +10 -0
  165. package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -0
  166. package/dist/data/lint/LintResults.js +144 -0
  167. package/dist/data/lint/LintResults.js.map +1 -0
  168. package/dist/data/lint/LintTreeNode.cjs +66 -0
  169. package/dist/data/lint/LintTreeNode.cjs.map +1 -0
  170. package/dist/data/lint/LintTreeNode.d.ts +7 -0
  171. package/dist/data/lint/LintTreeNode.d.ts.map +1 -0
  172. package/dist/data/lint/LintTreeNode.js +66 -0
  173. package/dist/data/lint/LintTreeNode.js.map +1 -0
  174. package/dist/data/lint/actions.cjs +195 -0
  175. package/dist/data/lint/actions.cjs.map +1 -0
  176. package/dist/data/lint/actions.d.ts +29 -0
  177. package/dist/data/lint/actions.d.ts.map +1 -0
  178. package/dist/data/lint/actions.js +195 -0
  179. package/dist/data/lint/actions.js.map +1 -0
  180. package/dist/data/lint/grouping-options.cjs +14 -0
  181. package/dist/data/lint/grouping-options.cjs.map +1 -0
  182. package/dist/data/lint/grouping-options.d.ts +9 -0
  183. package/dist/data/lint/grouping-options.d.ts.map +1 -0
  184. package/dist/data/lint/grouping-options.js +14 -0
  185. package/dist/data/lint/grouping-options.js.map +1 -0
  186. package/dist/data/lint/grouping.cjs +450 -0
  187. package/dist/data/lint/grouping.cjs.map +1 -0
  188. package/dist/data/lint/grouping.d.ts +10 -0
  189. package/dist/data/lint/grouping.d.ts.map +1 -0
  190. package/dist/data/lint/grouping.js +450 -0
  191. package/dist/data/lint/grouping.js.map +1 -0
  192. package/dist/data/lint/index.d.ts +10 -0
  193. package/dist/data/lint/index.d.ts.map +1 -0
  194. package/dist/data/lint/paths.cjs +35 -0
  195. package/dist/data/lint/paths.cjs.map +1 -0
  196. package/dist/data/lint/paths.d.ts +13 -0
  197. package/dist/data/lint/paths.d.ts.map +1 -0
  198. package/dist/data/lint/paths.js +35 -0
  199. package/dist/data/lint/paths.js.map +1 -0
  200. package/dist/data/lint/stats.cjs +76 -0
  201. package/dist/data/lint/stats.cjs.map +1 -0
  202. package/dist/data/lint/stats.d.ts +19 -0
  203. package/dist/data/lint/stats.d.ts.map +1 -0
  204. package/dist/data/lint/stats.js +76 -0
  205. package/dist/data/lint/stats.js.map +1 -0
  206. package/dist/data/lint/types.cjs +16 -0
  207. package/dist/data/lint/types.cjs.map +1 -0
  208. package/dist/data/lint/types.d.ts +93 -0
  209. package/dist/data/lint/types.d.ts.map +1 -0
  210. package/dist/data/lint/types.js +16 -0
  211. package/dist/data/lint/types.js.map +1 -0
  212. package/dist/data/test-runner/TestAttemptDetail.cjs +113 -0
  213. package/dist/data/test-runner/TestAttemptDetail.cjs.map +1 -0
  214. package/dist/data/test-runner/TestAttemptDetail.d.ts +19 -0
  215. package/dist/data/test-runner/TestAttemptDetail.d.ts.map +1 -0
  216. package/dist/data/test-runner/TestAttemptDetail.js +113 -0
  217. package/dist/data/test-runner/TestAttemptDetail.js.map +1 -0
  218. package/dist/data/test-runner/TestAttempts.cjs +36 -0
  219. package/dist/data/test-runner/TestAttempts.cjs.map +1 -0
  220. package/dist/data/test-runner/TestAttempts.d.ts +5 -0
  221. package/dist/data/test-runner/TestAttempts.d.ts.map +1 -0
  222. package/dist/data/test-runner/TestAttempts.js +36 -0
  223. package/dist/data/test-runner/TestAttempts.js.map +1 -0
  224. package/dist/data/test-runner/TestDetailPanel.cjs +13 -3
  225. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  226. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  227. package/dist/data/test-runner/TestDetailPanel.js +14 -4
  228. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  229. package/dist/data/test-runner/TestFailureDetail.cjs +9 -29
  230. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  231. package/dist/data/test-runner/TestFailureDetail.d.ts +6 -6
  232. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  233. package/dist/data/test-runner/TestFailureDetail.js +9 -29
  234. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  235. package/dist/data/test-runner/TestRunSummary.cjs +33 -0
  236. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  237. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  238. package/dist/data/test-runner/TestRunSummary.js +34 -1
  239. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  240. package/dist/data/test-runner/TestRunner.cjs +3 -0
  241. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  242. package/dist/data/test-runner/TestRunner.d.ts +8 -1
  243. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  244. package/dist/data/test-runner/TestRunner.js +3 -0
  245. package/dist/data/test-runner/TestRunner.js.map +1 -1
  246. package/dist/data/test-runner/TestTreeNode.cjs +3 -1
  247. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  248. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  249. package/dist/data/test-runner/TestTreeNode.js +3 -1
  250. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  251. package/dist/data/test-runner/adapter.cjs +9 -1
  252. package/dist/data/test-runner/adapter.cjs.map +1 -1
  253. package/dist/data/test-runner/adapter.d.ts +5 -0
  254. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  255. package/dist/data/test-runner/adapter.js +9 -1
  256. package/dist/data/test-runner/adapter.js.map +1 -1
  257. package/dist/data/test-runner/attempts.cjs +62 -0
  258. package/dist/data/test-runner/attempts.cjs.map +1 -0
  259. package/dist/data/test-runner/attempts.d.ts +13 -0
  260. package/dist/data/test-runner/attempts.d.ts.map +1 -0
  261. package/dist/data/test-runner/attempts.js +62 -0
  262. package/dist/data/test-runner/attempts.js.map +1 -0
  263. package/dist/data/test-runner/context.cjs.map +1 -1
  264. package/dist/data/test-runner/context.d.ts +6 -0
  265. package/dist/data/test-runner/context.d.ts.map +1 -1
  266. package/dist/data/test-runner/context.js.map +1 -1
  267. package/dist/data/test-runner/index.d.ts +5 -1
  268. package/dist/data/test-runner/index.d.ts.map +1 -1
  269. package/dist/data/test-runner/marks.cjs +2 -0
  270. package/dist/data/test-runner/marks.cjs.map +1 -1
  271. package/dist/data/test-runner/marks.d.ts.map +1 -1
  272. package/dist/data/test-runner/marks.js +2 -0
  273. package/dist/data/test-runner/marks.js.map +1 -1
  274. package/dist/data/test-runner/process-metrics.cjs +15 -0
  275. package/dist/data/test-runner/process-metrics.cjs.map +1 -0
  276. package/dist/data/test-runner/process-metrics.d.ts +22 -0
  277. package/dist/data/test-runner/process-metrics.d.ts.map +1 -0
  278. package/dist/data/test-runner/process-metrics.js +15 -0
  279. package/dist/data/test-runner/process-metrics.js.map +1 -0
  280. package/dist/data/test-runner/status.cjs +11 -3
  281. package/dist/data/test-runner/status.cjs.map +1 -1
  282. package/dist/data/test-runner/status.d.ts +3 -1
  283. package/dist/data/test-runner/status.d.ts.map +1 -1
  284. package/dist/data/test-runner/status.js +11 -3
  285. package/dist/data/test-runner/status.js.map +1 -1
  286. package/dist/data/test-runner/types.d.ts +14 -0
  287. package/dist/data/test-runner/types.d.ts.map +1 -1
  288. package/dist/data/traces/GoProfileView.cjs +176 -0
  289. package/dist/data/traces/GoProfileView.cjs.map +1 -0
  290. package/dist/data/traces/GoProfileView.d.ts +30 -0
  291. package/dist/data/traces/GoProfileView.d.ts.map +1 -0
  292. package/dist/data/traces/GoProfileView.js +176 -0
  293. package/dist/data/traces/GoProfileView.js.map +1 -0
  294. package/dist/data/traces/ProcessFacetTable.cjs +79 -0
  295. package/dist/data/traces/ProcessFacetTable.cjs.map +1 -0
  296. package/dist/data/traces/ProcessFacetTable.d.ts +21 -0
  297. package/dist/data/traces/ProcessFacetTable.d.ts.map +1 -0
  298. package/dist/data/traces/ProcessFacetTable.js +79 -0
  299. package/dist/data/traces/ProcessFacetTable.js.map +1 -0
  300. package/dist/data/traces/ProcessRecordViews.cjs +41 -0
  301. package/dist/data/traces/ProcessRecordViews.cjs.map +1 -0
  302. package/dist/data/traces/ProcessRecordViews.d.ts +16 -0
  303. package/dist/data/traces/ProcessRecordViews.d.ts.map +1 -0
  304. package/dist/data/traces/ProcessRecordViews.js +41 -0
  305. package/dist/data/traces/ProcessRecordViews.js.map +1 -0
  306. package/dist/data/traces/ProcessTraceDetail.cjs +316 -0
  307. package/dist/data/traces/ProcessTraceDetail.cjs.map +1 -0
  308. package/dist/data/traces/ProcessTraceDetail.d.ts +39 -0
  309. package/dist/data/traces/ProcessTraceDetail.d.ts.map +1 -0
  310. package/dist/data/traces/ProcessTraceDetail.js +316 -0
  311. package/dist/data/traces/ProcessTraceDetail.js.map +1 -0
  312. package/dist/data/traces/ProcessTraceTree.cjs +76 -34
  313. package/dist/data/traces/ProcessTraceTree.cjs.map +1 -1
  314. package/dist/data/traces/ProcessTraceTree.d.ts +21 -4
  315. package/dist/data/traces/ProcessTraceTree.d.ts.map +1 -1
  316. package/dist/data/traces/ProcessTraceTree.js +72 -30
  317. package/dist/data/traces/ProcessTraceTree.js.map +1 -1
  318. package/dist/data/traces/Sparkline.cjs +27 -5
  319. package/dist/data/traces/Sparkline.cjs.map +1 -1
  320. package/dist/data/traces/Sparkline.d.ts +17 -1
  321. package/dist/data/traces/Sparkline.d.ts.map +1 -1
  322. package/dist/data/traces/Sparkline.js +28 -6
  323. package/dist/data/traces/Sparkline.js.map +1 -1
  324. package/dist/data/traces/TraceView.cjs +9 -0
  325. package/dist/data/traces/TraceView.cjs.map +1 -1
  326. package/dist/data/traces/TraceView.d.ts +4 -2
  327. package/dist/data/traces/TraceView.d.ts.map +1 -1
  328. package/dist/data/traces/TraceView.js +9 -0
  329. package/dist/data/traces/TraceView.js.map +1 -1
  330. package/dist/data/traces/TraceWindowList.cjs +117 -0
  331. package/dist/data/traces/TraceWindowList.cjs.map +1 -0
  332. package/dist/data/traces/TraceWindowList.d.ts +48 -0
  333. package/dist/data/traces/TraceWindowList.d.ts.map +1 -0
  334. package/dist/data/traces/TraceWindowList.js +117 -0
  335. package/dist/data/traces/TraceWindowList.js.map +1 -0
  336. package/dist/data/traces/fixtures.d.ts +25 -1
  337. package/dist/data/traces/fixtures.d.ts.map +1 -1
  338. package/dist/data/traces/index.d.ts +10 -3
  339. package/dist/data/traces/index.d.ts.map +1 -1
  340. package/dist/data/traces/process-facets.cjs +48 -0
  341. package/dist/data/traces/process-facets.cjs.map +1 -0
  342. package/dist/data/traces/process-facets.d.ts +38 -0
  343. package/dist/data/traces/process-facets.d.ts.map +1 -0
  344. package/dist/data/traces/process-facets.js +48 -0
  345. package/dist/data/traces/process-facets.js.map +1 -0
  346. package/dist/data/traces/process-tree.cjs +36 -4
  347. package/dist/data/traces/process-tree.cjs.map +1 -1
  348. package/dist/data/traces/process-tree.d.ts +20 -1
  349. package/dist/data/traces/process-tree.d.ts.map +1 -1
  350. package/dist/data/traces/process-tree.js +36 -4
  351. package/dist/data/traces/process-tree.js.map +1 -1
  352. package/dist/data/traces/profile-aggregate.cjs +78 -0
  353. package/dist/data/traces/profile-aggregate.cjs.map +1 -0
  354. package/dist/data/traces/profile-aggregate.d.ts +41 -0
  355. package/dist/data/traces/profile-aggregate.d.ts.map +1 -0
  356. package/dist/data/traces/profile-aggregate.js +78 -0
  357. package/dist/data/traces/profile-aggregate.js.map +1 -0
  358. package/dist/data/traces/stack-checkpoints.cjs +22 -0
  359. package/dist/data/traces/stack-checkpoints.cjs.map +1 -0
  360. package/dist/data/traces/stack-checkpoints.d.ts +18 -0
  361. package/dist/data/traces/stack-checkpoints.d.ts.map +1 -0
  362. package/dist/data/traces/stack-checkpoints.js +22 -0
  363. package/dist/data/traces/stack-checkpoints.js.map +1 -0
  364. package/dist/data/traces/types.d.ts +120 -5
  365. package/dist/data/traces/types.d.ts.map +1 -1
  366. package/dist/data/verification/adapters.cjs +1 -0
  367. package/dist/data/verification/adapters.cjs.map +1 -1
  368. package/dist/data/verification/adapters.d.ts.map +1 -1
  369. package/dist/data/verification/adapters.js +1 -0
  370. package/dist/data/verification/adapters.js.map +1 -1
  371. package/dist/data/version-info.cjs +3 -3
  372. package/dist/data/version-info.js +3 -3
  373. package/dist/data.cjs +85 -7
  374. package/dist/data.cjs.map +1 -1
  375. package/dist/data.d.ts +4 -0
  376. package/dist/data.d.ts.map +1 -1
  377. package/dist/data.js +81 -3
  378. package/dist/data.js.map +1 -1
  379. package/dist/index.cjs +87 -9
  380. package/dist/index.cjs.map +1 -1
  381. package/dist/index.js +81 -3
  382. package/dist/index.js.map +1 -1
  383. package/dist/styles.css +1 -1
  384. package/package.json +6 -1
@@ -0,0 +1,78 @@
1
+ import { formatShort, formatDuration, formatBytes } from "../../lib/format.js";
2
+ function profileValueTypes(samples) {
3
+ const seen = /* @__PURE__ */ new Map();
4
+ for (const sample of samples) {
5
+ if (!seen.has(sample.sampleType)) seen.set(sample.sampleType, { sampleType: sample.sampleType, unit: sample.unit });
6
+ }
7
+ return [...seen.values()];
8
+ }
9
+ function ofType(samples, sampleType) {
10
+ const own = samples.filter((sample) => sample.sampleType === sampleType);
11
+ const units = new Set(own.map((sample) => sample.unit));
12
+ if (units.size > 1) {
13
+ throw new Error(`sample type "${sampleType}" has mixed units ${[...units].map((unit) => `"${unit}"`).join(", ")}`);
14
+ }
15
+ for (const sample of own) {
16
+ if (sample.frames.length === 0) throw new Error(`a "${sampleType}" sample has no frames`);
17
+ }
18
+ return own;
19
+ }
20
+ function aggregateProfile(samples, sampleType) {
21
+ var _a;
22
+ const own = ofType(samples, sampleType);
23
+ const rows = /* @__PURE__ */ new Map();
24
+ let total = 0;
25
+ for (const sample of own) {
26
+ total += sample.value;
27
+ for (const frame of sample.frames) {
28
+ if (!rows.has(frame.func)) {
29
+ rows.set(frame.func, { func: frame.func, file: frame.file, line: frame.line, flat: 0, cum: 0 });
30
+ }
31
+ }
32
+ for (const func of new Set(sample.frames.map((frame) => frame.func))) rows.get(func).cum += sample.value;
33
+ rows.get(sample.frames[0].func).flat += sample.value;
34
+ }
35
+ return {
36
+ total,
37
+ unit: ((_a = own[0]) == null ? void 0 : _a.unit) ?? "",
38
+ functions: [...rows.values()].sort((a, b) => b.flat - a.flat || b.cum - a.cum || a.func.localeCompare(b.func))
39
+ };
40
+ }
41
+ function stacksThrough(samples, sampleType, func, limit) {
42
+ const stacks = /* @__PURE__ */ new Map();
43
+ for (const sample of ofType(samples, sampleType)) {
44
+ if (!sample.frames.some((frame) => frame.func === func)) continue;
45
+ const id = sample.frames.map((frame) => `${frame.func}@${frame.file}:${frame.line}`).join("\n");
46
+ const stack = stacks.get(id);
47
+ if (stack) stack.value += sample.value;
48
+ else stacks.set(id, { frames: sample.frames, value: sample.value });
49
+ }
50
+ return [...stacks.values()].sort((a, b) => b.value - a.value).slice(0, limit);
51
+ }
52
+ const NANOS_PER_MS = 1e6;
53
+ function formatProfileValue(value, unit) {
54
+ switch (unit) {
55
+ case "bytes":
56
+ return formatBytes(value);
57
+ case "nanoseconds":
58
+ return Math.abs(value) < NANOS_PER_MS ? `${formatShort(value / 1e3)} µs` : formatDuration(value / NANOS_PER_MS);
59
+ case "microseconds":
60
+ return Math.abs(value) < 1e3 ? `${formatShort(value)} µs` : formatDuration(value / 1e3);
61
+ case "milliseconds":
62
+ return formatDuration(value);
63
+ case "seconds":
64
+ return formatDuration(value, { from: "s" });
65
+ case "count":
66
+ case "":
67
+ return formatShort(value);
68
+ default:
69
+ return `${formatShort(value)} ${unit}`;
70
+ }
71
+ }
72
+ export {
73
+ aggregateProfile,
74
+ formatProfileValue,
75
+ profileValueTypes,
76
+ stacksThrough
77
+ };
78
+ //# sourceMappingURL=profile-aggregate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-aggregate.js","sources":["../../../src/data/traces/profile-aggregate.ts"],"sourcesContent":["import { formatBytes, formatDuration, formatShort } from \"../../lib/format\";\nimport type { ProfileSample, StackFrame } from \"./types\";\n\n/** A sample type of a profile with its unit, for example `cpu` in `nanoseconds`. */\nexport type ProfileValueType = { sampleType: string; unit: string };\n\n/** One function's share of a profile. */\nexport type ProfileFunctionRow = {\n func: string;\n /** Where the function was first seen in the samples. */\n file: string;\n line: number;\n /** Value of the samples whose innermost frame is this function. */\n flat: number;\n /** Value of the samples whose stack contains this function at all, counted once per sample. */\n cum: number;\n};\n\nexport type ProfileAggregate = {\n total: number;\n unit: string;\n /** Every function, sorted by `flat` descending. */\n functions: ProfileFunctionRow[];\n};\n\n/** A distinct stack and the value of all the samples that shared it. */\nexport type ProfileStack = { frames: StackFrame[]; value: number };\n\n/** The sample types present, in order of first appearance. */\nexport function profileValueTypes(samples: ProfileSample[]): ProfileValueType[] {\n const seen = new Map<string, ProfileValueType>();\n for (const sample of samples) {\n if (!seen.has(sample.sampleType)) seen.set(sample.sampleType, { sampleType: sample.sampleType, unit: sample.unit });\n }\n return [...seen.values()];\n}\n\nfunction ofType(samples: ProfileSample[], sampleType: string): ProfileSample[] {\n const own = samples.filter((sample) => sample.sampleType === sampleType);\n const units = new Set(own.map((sample) => sample.unit));\n if (units.size > 1) {\n throw new Error(`sample type \"${sampleType}\" has mixed units ${[...units].map((unit) => `\"${unit}\"`).join(\", \")}`);\n }\n for (const sample of own) {\n if (sample.frames.length === 0) throw new Error(`a \"${sampleType}\" sample has no frames`);\n }\n return own;\n}\n\n/**\n * Totals one sample type's samples per function: flat (the innermost frame) and\n * cumulative (anywhere in the stack, once per sample even when the function\n * recurses). Frames are innermost first.\n */\nexport function aggregateProfile(samples: ProfileSample[], sampleType: string): ProfileAggregate {\n const own = ofType(samples, sampleType);\n const rows = new Map<string, ProfileFunctionRow>();\n let total = 0;\n for (const sample of own) {\n total += sample.value;\n for (const frame of sample.frames) {\n if (!rows.has(frame.func)) {\n rows.set(frame.func, { func: frame.func, file: frame.file, line: frame.line, flat: 0, cum: 0 });\n }\n }\n for (const func of new Set(sample.frames.map((frame) => frame.func))) rows.get(func)!.cum += sample.value;\n rows.get(sample.frames[0]!.func)!.flat += sample.value;\n }\n return {\n total,\n unit: own[0]?.unit ?? \"\",\n functions: [...rows.values()].sort((a, b) => b.flat - a.flat || b.cum - a.cum || a.func.localeCompare(b.func)),\n };\n}\n\n/** The heaviest distinct stacks of one sample type that pass through `func`, heaviest first. */\nexport function stacksThrough(samples: ProfileSample[], sampleType: string, func: string, limit: number): ProfileStack[] {\n const stacks = new Map<string, ProfileStack>();\n for (const sample of ofType(samples, sampleType)) {\n if (!sample.frames.some((frame) => frame.func === func)) continue;\n const id = sample.frames.map((frame) => `${frame.func}@${frame.file}:${frame.line}`).join(\"\\n\");\n const stack = stacks.get(id);\n if (stack) stack.value += sample.value;\n else stacks.set(id, { frames: sample.frames, value: sample.value });\n }\n return [...stacks.values()].sort((a, b) => b.value - a.value).slice(0, limit);\n}\n\nconst NANOS_PER_MS = 1e6;\n\n/** A profile value for display in its unit: bytes, durations and plain counts. */\nexport function formatProfileValue(value: number, unit: string): string {\n switch (unit) {\n case \"bytes\":\n return formatBytes(value);\n case \"nanoseconds\":\n return Math.abs(value) < NANOS_PER_MS ? `${formatShort(value / 1e3)} µs` : formatDuration(value / NANOS_PER_MS);\n case \"microseconds\":\n return Math.abs(value) < 1e3 ? `${formatShort(value)} µs` : formatDuration(value / 1e3);\n case \"milliseconds\":\n return formatDuration(value);\n case \"seconds\":\n return formatDuration(value, { from: \"s\" });\n case \"count\":\n case \"\":\n return formatShort(value);\n default:\n return `${formatShort(value)} ${unit}`;\n }\n}\n"],"names":[],"mappings":";AA6BO,SAAS,kBAAkB,SAA8C;AAC9E,QAAM,2BAAW,IAAA;AACjB,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,KAAK,IAAI,OAAO,UAAU,EAAG,MAAK,IAAI,OAAO,YAAY,EAAE,YAAY,OAAO,YAAY,MAAM,OAAO,MAAM;AAAA,EACpH;AACA,SAAO,CAAC,GAAG,KAAK,QAAQ;AAC1B;AAEA,SAAS,OAAO,SAA0B,YAAqC;AAC7E,QAAM,MAAM,QAAQ,OAAO,CAAC,WAAW,OAAO,eAAe,UAAU;AACvE,QAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AACtD,MAAI,MAAM,OAAO,GAAG;AAClB,UAAM,IAAI,MAAM,gBAAgB,UAAU,qBAAqB,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACnH;AACA,aAAW,UAAU,KAAK;AACxB,QAAI,OAAO,OAAO,WAAW,SAAS,IAAI,MAAM,MAAM,UAAU,wBAAwB;AAAA,EAC1F;AACA,SAAO;AACT;AAOO,SAAS,iBAAiB,SAA0B,YAAsC;;AAC/F,QAAM,MAAM,OAAO,SAAS,UAAU;AACtC,QAAM,2BAAW,IAAA;AACjB,MAAI,QAAQ;AACZ,aAAW,UAAU,KAAK;AACxB,aAAS,OAAO;AAChB,eAAW,SAAS,OAAO,QAAQ;AACjC,UAAI,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG;AACzB,aAAK,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG;AAAA,MAChG;AAAA,IACF;AACA,eAAW,QAAQ,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,EAAG,MAAK,IAAI,IAAI,EAAG,OAAO,OAAO;AACpG,SAAK,IAAI,OAAO,OAAO,CAAC,EAAG,IAAI,EAAG,QAAQ,OAAO;AAAA,EACnD;AACA,SAAO;AAAA,IACL;AAAA,IACA,QAAM,SAAI,CAAC,MAAL,mBAAQ,SAAQ;AAAA,IACtB,WAAW,CAAC,GAAG,KAAK,OAAA,CAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EAAA;AAEjH;AAGO,SAAS,cAAc,SAA0B,YAAoB,MAAc,OAA+B;AACvH,QAAM,6BAAa,IAAA;AACnB,aAAW,UAAU,OAAO,SAAS,UAAU,GAAG;AAChD,QAAI,CAAC,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI,EAAG;AACzD,UAAM,KAAK,OAAO,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE,KAAK,IAAI;AAC9F,UAAM,QAAQ,OAAO,IAAI,EAAE;AAC3B,QAAI,MAAO,OAAM,SAAS,OAAO;AAAA,QAC5B,QAAO,IAAI,IAAI,EAAE,QAAQ,OAAO,QAAQ,OAAO,OAAO,OAAO;AAAA,EACpE;AACA,SAAO,CAAC,GAAG,OAAO,OAAA,CAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK;AAC9E;AAEA,MAAM,eAAe;AAGd,SAAS,mBAAmB,OAAe,MAAsB;AACtE,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO,YAAY,KAAK;AAAA,IAC1B,KAAK;AACH,aAAO,KAAK,IAAI,KAAK,IAAI,eAAe,GAAG,YAAY,QAAQ,GAAG,CAAC,QAAQ,eAAe,QAAQ,YAAY;AAAA,IAChH,KAAK;AACH,aAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,YAAY,KAAK,CAAC,QAAQ,eAAe,QAAQ,GAAG;AAAA,IACxF,KAAK;AACH,aAAO,eAAe,KAAK;AAAA,IAC7B,KAAK;AACH,aAAO,eAAe,OAAO,EAAE,MAAM,KAAK;AAAA,IAC5C,KAAK;AAAA,IACL,KAAK;AACH,aAAO,YAAY,KAAK;AAAA,IAC1B;AACE,aAAO,GAAG,YAAY,KAAK,CAAC,IAAI,IAAI;AAAA,EAAA;AAE1C;"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function stackCheckpoints(records, key) {
4
+ const byCheckpoint = /* @__PURE__ */ new Map();
5
+ for (const record of records) {
6
+ if (record.key !== key) continue;
7
+ byCheckpoint.set(record.checkpointId, [...byCheckpoint.get(record.checkpointId) ?? [], record]);
8
+ }
9
+ return [...byCheckpoint].map(([checkpointId, group]) => {
10
+ const [first] = group;
11
+ return {
12
+ checkpointId,
13
+ takenAt: first.takenAt,
14
+ reason: first.reason,
15
+ transport: first.transport,
16
+ failed: group.some((record) => record.error),
17
+ records: group
18
+ };
19
+ }).sort((a, b) => Date.parse(a.takenAt) - Date.parse(b.takenAt));
20
+ }
21
+ exports.stackCheckpoints = stackCheckpoints;
22
+ //# sourceMappingURL=stack-checkpoints.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-checkpoints.cjs","sources":["../../../src/data/traces/stack-checkpoints.ts"],"sourcesContent":["import type { StackRecord } from \"./types\";\n\n/** The stack records one checkpoint took of one process. */\nexport type StackCheckpoint = {\n checkpointId: string;\n takenAt: string;\n reason: string;\n transport: string;\n /** The checkpoint's dump failed: its single record carries an error. */\n failed: boolean;\n records: StackRecord[];\n};\n\n/**\n * Groups one process's `stacks` records by checkpoint, oldest first, so the\n * last entry is the latest. Records of other processes are ignored. A\n * checkpoint's time, reason and transport are those of its first record.\n */\nexport function stackCheckpoints(records: StackRecord[], key: string): StackCheckpoint[] {\n const byCheckpoint = new Map<string, StackRecord[]>();\n for (const record of records) {\n if (record.key !== key) continue;\n byCheckpoint.set(record.checkpointId, [...(byCheckpoint.get(record.checkpointId) ?? []), record]);\n }\n return [...byCheckpoint]\n .map(([checkpointId, group]): StackCheckpoint => {\n const [first] = group as [StackRecord, ...StackRecord[]];\n return {\n checkpointId,\n takenAt: first.takenAt,\n reason: first.reason,\n transport: first.transport,\n failed: group.some((record) => record.error),\n records: group,\n };\n })\n .sort((a, b) => Date.parse(a.takenAt) - Date.parse(b.takenAt));\n}\n"],"names":[],"mappings":";;AAkBO,SAAS,iBAAiB,SAAwB,KAAgC;AACvF,QAAM,mCAAmB,IAAA;AACzB,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,QAAQ,IAAK;AACxB,iBAAa,IAAI,OAAO,cAAc,CAAC,GAAI,aAAa,IAAI,OAAO,YAAY,KAAK,CAAA,GAAK,MAAM,CAAC;AAAA,EAClG;AACA,SAAO,CAAC,GAAG,YAAY,EACpB,IAAI,CAAC,CAAC,cAAc,KAAK,MAAuB;AAC/C,UAAM,CAAC,KAAK,IAAI;AAChB,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM,KAAK,CAAC,WAAW,OAAO,KAAK;AAAA,MAC3C,SAAS;AAAA,IAAA;AAAA,EAEb,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,OAAO,IAAI,KAAK,MAAM,EAAE,OAAO,CAAC;AACjE;;"}
@@ -0,0 +1,18 @@
1
+ import { StackRecord } from './types.js';
2
+ /** The stack records one checkpoint took of one process. */
3
+ export type StackCheckpoint = {
4
+ checkpointId: string;
5
+ takenAt: string;
6
+ reason: string;
7
+ transport: string;
8
+ /** The checkpoint's dump failed: its single record carries an error. */
9
+ failed: boolean;
10
+ records: StackRecord[];
11
+ };
12
+ /**
13
+ * Groups one process's `stacks` records by checkpoint, oldest first, so the
14
+ * last entry is the latest. Records of other processes are ignored. A
15
+ * checkpoint's time, reason and transport are those of its first record.
16
+ */
17
+ export declare function stackCheckpoints(records: StackRecord[], key: string): StackCheckpoint[];
18
+ //# sourceMappingURL=stack-checkpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-checkpoints.d.ts","sourceRoot":"","sources":["../../../src/data/traces/stack-checkpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAmBvF"}
@@ -0,0 +1,22 @@
1
+ function stackCheckpoints(records, key) {
2
+ const byCheckpoint = /* @__PURE__ */ new Map();
3
+ for (const record of records) {
4
+ if (record.key !== key) continue;
5
+ byCheckpoint.set(record.checkpointId, [...byCheckpoint.get(record.checkpointId) ?? [], record]);
6
+ }
7
+ return [...byCheckpoint].map(([checkpointId, group]) => {
8
+ const [first] = group;
9
+ return {
10
+ checkpointId,
11
+ takenAt: first.takenAt,
12
+ reason: first.reason,
13
+ transport: first.transport,
14
+ failed: group.some((record) => record.error),
15
+ records: group
16
+ };
17
+ }).sort((a, b) => Date.parse(a.takenAt) - Date.parse(b.takenAt));
18
+ }
19
+ export {
20
+ stackCheckpoints
21
+ };
22
+ //# sourceMappingURL=stack-checkpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-checkpoints.js","sources":["../../../src/data/traces/stack-checkpoints.ts"],"sourcesContent":["import type { StackRecord } from \"./types\";\n\n/** The stack records one checkpoint took of one process. */\nexport type StackCheckpoint = {\n checkpointId: string;\n takenAt: string;\n reason: string;\n transport: string;\n /** The checkpoint's dump failed: its single record carries an error. */\n failed: boolean;\n records: StackRecord[];\n};\n\n/**\n * Groups one process's `stacks` records by checkpoint, oldest first, so the\n * last entry is the latest. Records of other processes are ignored. A\n * checkpoint's time, reason and transport are those of its first record.\n */\nexport function stackCheckpoints(records: StackRecord[], key: string): StackCheckpoint[] {\n const byCheckpoint = new Map<string, StackRecord[]>();\n for (const record of records) {\n if (record.key !== key) continue;\n byCheckpoint.set(record.checkpointId, [...(byCheckpoint.get(record.checkpointId) ?? []), record]);\n }\n return [...byCheckpoint]\n .map(([checkpointId, group]): StackCheckpoint => {\n const [first] = group as [StackRecord, ...StackRecord[]];\n return {\n checkpointId,\n takenAt: first.takenAt,\n reason: first.reason,\n transport: first.transport,\n failed: group.some((record) => record.error),\n records: group,\n };\n })\n .sort((a, b) => Date.parse(a.takenAt) - Date.parse(b.takenAt));\n}\n"],"names":[],"mappings":"AAkBO,SAAS,iBAAiB,SAAwB,KAAgC;AACvF,QAAM,mCAAmB,IAAA;AACzB,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,QAAQ,IAAK;AACxB,iBAAa,IAAI,OAAO,cAAc,CAAC,GAAI,aAAa,IAAI,OAAO,YAAY,KAAK,CAAA,GAAK,MAAM,CAAC;AAAA,EAClG;AACA,SAAO,CAAC,GAAG,YAAY,EACpB,IAAI,CAAC,CAAC,cAAc,KAAK,MAAuB;AAC/C,UAAM,CAAC,KAAK,IAAI;AAChB,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM,KAAK,CAAC,WAAW,OAAO,KAAK;AAAA,MAC3C,SAAS;AAAA,IAAA;AAAA,EAEb,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,OAAO,IAAI,KAAK,MAAM,EAAE,OAAO,CAAC;AACjE;"}
@@ -117,22 +117,137 @@ export type ProcessNodeRow = {
117
117
  startedAt: string;
118
118
  exitedAt?: string | null;
119
119
  lastSeenAt: string;
120
- cpuPercent: number;
120
+ /** CPU % over the last sampling window (per core); unknown until a full window has been observed. */
121
+ cpuPercent?: number | null;
121
122
  rssBytes: number;
122
- peakCpuPercent: number;
123
+ /** Highest known `cpuPercent`; unknown until one is known. */
124
+ peakCpuPercent?: number | null;
123
125
  peakRssBytes: number;
124
- stack?: string;
125
- stackError?: string;
126
+ /**
127
+ * The ways a stack of this process can be collected, as the `stacks` kind's
128
+ * dumpers offer them for it. A destructive transport (sigquit) kills the
129
+ * process. Absent when no dumper can reach it.
130
+ */
131
+ stackTransports?: ProcessStackTransport[];
132
+ /** The environment read once when the node was created, already masked. Absent unless the tree armed `environment`. */
133
+ environment?: ProcessEnv;
134
+ /** Why the environment could not be read. */
135
+ environmentError?: string;
126
136
  };
137
+ /** One way to take a stack dump of a process. */
138
+ export type ProcessStackTransport = {
139
+ /** "inprocess", "native", "pprof", "gops" or "sigquit". */
140
+ transport: string;
141
+ /** Taking the dump terminates the process. */
142
+ destructive: boolean;
143
+ };
144
+ /** The environment of a process: variable name to value. */
145
+ export type ProcessEnv = Record<string, string>;
146
+ /**
147
+ * One file, socket or connection a process holds open, as `process_samples`
148
+ * stores it (the clicky `process.Descriptor` shape).
149
+ */
150
+ export type ProcessDescriptor = {
151
+ fd: string;
152
+ type: string;
153
+ name: string;
154
+ protocol?: string;
155
+ state?: string;
156
+ localAddr?: string;
157
+ remoteAddr?: string;
158
+ port?: number;
159
+ };
160
+ /** The descriptor facets a `process_samples` session can arm. */
161
+ export type ProcessSampleFacet = "openFiles" | "sockets" | "ports" | "connections";
127
162
  /** One `process_samples` record: a process's usage at one tick. */
128
163
  export type ProcessSampleRow = {
129
164
  sampledAt: string;
130
165
  tick: number;
131
166
  key: string;
132
167
  pid: number;
133
- cpuPercent: number;
168
+ /** CPU % over the window ending at this sample; unknown on a process's first sample. */
169
+ cpuPercent?: number | null;
134
170
  memoryPercent: number;
135
171
  rssBytes: number;
172
+ /** Cumulative bytes the process has read from disk. */
173
+ diskReadBytes?: number;
174
+ /** Cumulative bytes the process has written to disk. */
175
+ diskWriteBytes?: number;
176
+ /** Counts, present on every tick of a session that armed the facet and absent otherwise. */
177
+ openFiles?: number;
178
+ sockets?: number;
179
+ ports?: number;
180
+ connections?: number;
181
+ /**
182
+ * The full lists, stored only on a tick where they differ from the process's
183
+ * previously stored list (the first tick always stores them). An empty list is
184
+ * omitted, so a zero count with no list means the list is empty.
185
+ */
186
+ openFileList?: ProcessDescriptor[];
187
+ socketList?: ProcessDescriptor[];
188
+ portList?: ProcessDescriptor[];
189
+ connectionList?: ProcessDescriptor[];
190
+ };
191
+ /** A source location in a stack or profile. */
192
+ export type StackFrame = {
193
+ func: string;
194
+ file: string;
195
+ line: number;
196
+ };
197
+ /** The format of a stack dump: Go goroutines or a native thread sample. Empty on a dump that failed. */
198
+ export type StackFormat = "go" | "native" | "";
199
+ /**
200
+ * One `stacks` record: a goroutine (Go format), or a whole dump (native format,
201
+ * no frames). A dump that failed is one record with `error` set. Records of one
202
+ * checkpoint share a `checkpointId`.
203
+ */
204
+ export type StackRecord = {
205
+ checkpointId: string;
206
+ takenAt: string;
207
+ /** Why the checkpoint was taken, for example a watchdog timeout or a manual request. */
208
+ reason: string;
209
+ /** How it was taken: "inprocess", "native", "pprof", "gops" or "sigquit". */
210
+ transport: string;
211
+ /** The `process_tree` key of the dumped process. */
212
+ key: string;
213
+ pid: number;
214
+ format: StackFormat;
215
+ goroutineId?: number;
216
+ /** The goroutine state, for example "running" or "chan receive". */
217
+ state?: string;
218
+ waitMinutes?: number;
219
+ lockedToThread?: boolean;
220
+ /** Innermost frame first. */
221
+ frames?: StackFrame[];
222
+ createdBy?: StackFrame;
223
+ raw: string;
224
+ error?: string;
225
+ };
226
+ /**
227
+ * What a view needs of a profile sample, whatever produced it (a `goprof` record,
228
+ * later a `jfr` sample): a value of some type and unit, attributed to a stack.
229
+ */
230
+ export type ProfileSample = {
231
+ /** For example "cpu", "samples", "inuse_space" or "alloc_objects". */
232
+ sampleType: string;
233
+ /** For example "nanoseconds", "bytes" or "count". */
234
+ unit: string;
235
+ value: number;
236
+ /** Innermost frame first. */
237
+ frames: StackFrame[];
238
+ };
239
+ /** One `goprof` record: a pprof sample type's value for one stack, at one checkpoint. */
240
+ export type GoProfileRecord = ProfileSample & {
241
+ checkpointId: string;
242
+ takenAt: string;
243
+ reason: string;
244
+ /** Where the profile was read from: "pprof", "gops" or "file". */
245
+ source: string;
246
+ key: string;
247
+ pid: number;
248
+ /** "cpu", "heap", "allocs", "mutex", "block" or "goroutine". */
249
+ profile: string;
250
+ stackHash: string;
136
251
  };
137
252
  /** A record of a kind `TraceView` has no dedicated viewer for. */
138
253
  export type TraceRow = Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/traces/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/traces/types.ts"],"names":[],"mappings":"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"}
@@ -79,6 +79,7 @@ const OUTCOME_GLYPH = {
79
79
  errored: "✗",
80
80
  timedout: "⏱",
81
81
  warned: "!",
82
+ aborted: "■",
82
83
  skipped: "-",
83
84
  pending: "○",
84
85
  running: "…"
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.cjs","sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well.\nfunction isFixtureNode(node: Test): boolean {\n return node.context !== undefined || hasStepDetail(node.detail);\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n};\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n return detail.step.attempts.map((attempt) => ({\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n },\n }));\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"names":["jsx","ChecklistDetail","hasStepDetail","outcomeFor","readStepDetail","stepKindCopy","UiTerminal","FixtureDetail","verifyNodeTest","StepOutputs","createTestRunnerRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"adapters.cjs","sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well.\nfunction isFixtureNode(node: Test): boolean {\n return node.context !== undefined || hasStepDetail(node.detail);\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n aborted: \"■\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n};\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n return detail.step.attempts.map((attempt) => ({\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n },\n }));\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"names":["jsx","ChecklistDetail","hasStepDetail","outcomeFor","readStepDetail","stepKindCopy","UiTerminal","FixtureDetail","verifyNodeTest","StepOutputs","createTestRunnerRegistry"],"mappings":";;;;;;;;;;AAyBA,SAAS,gBAAgB,MAAqB;AAC5C,SAAO,KAAK,cAAc;AAC5B;AAEA,SAAS,cAAc,MAAoB;AACzC,MAAI,KAAK,OAAQ,QAAO;AACxB,MAAI,KAAK,OAAQ,QAAO;AACxB,SAAO;AACT;AAGA,SAAS,cAAc,MAA0B;AAC/C,QAAM,QAAQ,KAAK,YAAY,KAAK,SAAS,SAAS,IAAI,KAAK,WAAW,CAAC,IAAI;AAC/E,QAAM,QAAQ,MAAM;AAAA,IAClB,CAAC,SAAS,KAAK,cAAc,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,OAAO,KAAK,EAAE;AAAA,EAAA;AAE5F,SAAO,EAAE,OAAO,CAAC,EAAE,OAAO,YAAY,MAAM,MAAM,KAAK,IAAI,EAAA,CAAG,EAAA;AAChE;AAEA,MAAM,mBAAoC;AAAA,EACxC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,cAAc,CAAC,EAAE,WAAWA,2BAAAA,IAACC,aAAAA,mBAAgB,MAAY;AAAA,EACzD,MAAM,CAAC,EAAE,KAAA,MAAW,cAAc,IAAI;AACxC;AAIA,SAAS,cAAc,MAAqB;AAC1C,SAAO,KAAK,YAAY,UAAaC,SAAAA,cAAc,KAAK,MAAM;AAChE;AAIA,SAAS,aAAa,QAAqC;AACzD,MAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,QAAS,OAAmC;AAClD,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAAA,EAC5D;AACA,SAAO;AACT;AAIA,SAAS,gBAAgB,YAAqB,OAAyB;AACrE,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,WAAY,QAAO;AACvB,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjF,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,OAAO,MAAM,CAAC;AAC1E;AAEA,SAAS,eAAe,MAAY,SAAqD;AACvF,QAAM,WAAU,mCAAS,YAAW,KAAK;AACzC,MAAI,CAAC,QAAS,QAAO,CAAA;AACrB,QAAM,OAAM,mCAAS,QAAO,KAAK;AACjC,QAAM,OAAO,mCAAS;AACtB,QAAM,QAAQ,CAAC,KAAK,OAAO,IAAI,OAAO,QAAQ,GAAG,IAAI,SAAS,UAAa,SAAS,IAAI,EAAE;AAC1F,SAAO,CAAC,EAAE,OAAO,WAAW,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,EAAE,KAAK,IAAI,GAAG;AAClF;AAEA,SAAS,iBAAiB,MAAY,SAAqD;AACzF,QAAM,aAAa,mCAAS;AAC5B,QAAM,QAAQ,aAAa,KAAK,MAAM;AACtC,QAAM,aAAa,CAAC,EAAE,cAAc;AACpC,QAAM,QAAO,mCAAS,aAAY,CAAA;AAClC,QAAM,WAAW,gBAAgB,YAAY,mCAAS,QAAQ;AAC9D,QAAM,SAAS,gBAAgB,YAAY,mCAAS,MAAM;AAC1D,QAAM,QAAQ;AAAA,IACZ,cAAc,eAAe,UAAU;AAAA,IACvC,SAAS;AAAA,EAAW,KAAK;AAAA,IACzB,OAAO,KAAK,IAAI,EAAE,SAAS,KAAK,SAAS,YAAY,IAAI,CAAC;AAAA,IAC1D,aAAa,UAAa,aAAa,YAAY,QAAQ,CAAC;AAAA,IAC5D,WAAW,UAAa,WAAW,YAAY,MAAM,CAAC;AAAA,EAAA,EACtD,OAAO,OAAO;AAChB,SAAO,MAAM,SAAS,IAAI,CAAC,EAAE,OAAO,aAAa,MAAM,MAAM,KAAK,IAAI,EAAA,CAAG,IAAI,CAAA;AAC/E;AAEA,MAAM,gBAA6C;AAAA,EACjD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AACX;AAEA,SAAS,UAAU,OAAqB;;AACtC,QAAM,UAAUC,OAAAA,WAAW,KAAK;AAChC,QAAM,QAAQ,WAAM,YAAN,mBAA8C;AAC5D,QAAM,SAAS,MAAM,YAAY,OAAO,QAAQ,IAAI,KAAK;AACzD,SAAO,GAAG,UAAU,cAAc,OAAO,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,SAAS,MAAM,MAAM,KAAK,EAAE;AAC/F;AAEA,SAAS,YAAY,SAA8B;AACjD,QAAM,SAAyC;AAAA,IAC7C,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IACzB,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IACzB,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IACzB,CAAC,QAAQ,UAAU,WAAW;AAAA,IAC9B,CAAC,QAAQ,SAAS,SAAS;AAAA,IAC3B,CAAC,QAAQ,SAAS,SAAS;AAAA,IAC3B,CAAC,QAAQ,SAAS,SAAS;AAAA,EAAA;AAE7B,QAAM,QAAQ,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,GAAG,CAAC,IAAI,KAAK,EAAE;AAC7E,SAAO,CAAC,GAAG,QAAQ,KAAK,UAAU,GAAG,KAAK,EAAE,KAAK,KAAK;AACxD;AAEA,SAAS,eAAe,MAA4B;AAClD,QAAM,QAAQ;AAAA,IACZ,GAAI,KAAK,UAAU,CAAC,YAAY,KAAK,OAAO,CAAC,IAAI,CAAA;AAAA,IACjD,IAAI,KAAK,YAAY,CAAA,GAAI,IAAI,SAAS;AAAA,EAAA;AAExC,SAAO,MAAM,SAAS,IAAI,CAAC,EAAE,OAAO,WAAW,MAAM,MAAM,KAAK,IAAI,EAAA,CAAG,IAAI,CAAA;AAC7E;AAGA,SAAS,YAAY,MAA0B;AAC7C,QAAM,UAAU,KAAK;AACrB,QAAM,WAAU,mCAAS,YAAW,KAAK;AACzC,QAAM,aAAaC,SAAAA,eAAe,KAAK,MAAM;AAC7C,SAAO;AAAA,IACL,OAAO;AAAA,MACL,GAAG,eAAe,MAAM,OAAO;AAAA,MAC/B,GAAG,iBAAiB,MAAM,OAAO;AAAA,MACjC,GAAI,WAAW,SAAS,SAASC,SAAAA,aAAa,WAAW,IAAI,IAAI,CAAA;AAAA,MACjE,GAAG,eAAe,IAAI;AAAA,IAAA;AAAA,IAExB,OAAO,UAAU,CAAC,EAAE,OAAO,gBAAgB,MAAMC,uBAAY,OAAO,QAAA,CAAS,IAAI,CAAA;AAAA,EAAC;AAEtF;AAOA,MAAM,8CAA8B,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,kBAAkB,MAAqB;AAC9C,QAAM,YAAY,KAAK,aAAa;AACpC,MAAI,cAAc,aAAc,QAAOJ,SAAAA,cAAc,KAAK,MAAM;AAChE,SAAO,wBAAwB,IAAI,SAAS;AAC9C;AAEA,MAAM,yBAA0C;AAAA,EAC9C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM,CAAC,EAAE,KAAA,MAAW,YAAY,IAAI;AACtC;AAUO,SAAS,qBAAqB,UAAsC,IAA6B;AACtG,QAAM,iBAAkC;AAAA,IACtC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,cAAc,CAAC,EAAE,WAAWF,2BAAAA,IAACO,aAAAA,eAAA,EAAc,MAAa,GAAG,SAAS;AAAA,IACpE,gBAAgB,CAAC,EAAE,WAAW;AAC5B,YAAM,SAASH,SAAAA,eAAe,KAAK,MAAM;AACzC,UAAI,OAAO,SAAS,OAAQ,QAAO,CAAA;AACnC,aAAO,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa;AAAA,QAC5C,IAAI,QAAQ;AAAA,QAAS,QAAQ,QAAQ;AAAA,QACrC,GAAI,QAAQ,eAAe,SAAY,EAAE,YAAY,QAAQ,WAAA,IAAe,CAAA;AAAA,QAC5E,MAAM,QAAQ,SAASI,kBAAAA,eAAe,QAAQ,MAAM,IAAI;AAAA,UACtD,MAAM,KAAK;AAAA,UAAM,SAAS,WAAW,QAAQ,OAAO;AAAA,UACpD,QAAQ,EAAE,MAAM,OAAO,KAAK,KAAA;AAAA,QAAK;AAAA,MACnC,EACA;AAAA,IACJ;AAAA,IACA,YAAY,CAAC,EAAE,WAAW;AACxB,YAAM,SAASJ,SAAAA,eAAe,KAAK,MAAM;AACzC,UAAI,OAAO,SAAS,UAAU,OAAO,KAAK,YAAY,eAAkB,CAAA;AACxE,aAAO,CAAC,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,MAAMJ,2BAAAA,IAACS,cAAAA,eAAY,SAAS,OAAO,KAAK,QAAA,CAAS,GAAI;AAAA,IAC1G;AAAA,IACA,MAAM,CAAC,EAAE,KAAA,MAAW,YAAY,IAAI;AAAA,EAAA;AAEtC,SAAOC,QAAAA,yBAAyB,CAAC,kBAAkB,gBAAgB,sBAAsB,CAAC;AAC5F;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../../src/data/verification/adapters.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAQL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AA4KxB;;gFAEgF;AAChF,MAAM,MAAM,0BAA0B,GAAG;IACvC,qFAAqF;IACrF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;CAC9C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,0BAA+B,GAAG,uBAAuB,CAyBtG"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../../src/data/verification/adapters.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAQL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AA6KxB;;gFAEgF;AAChF,MAAM,MAAM,0BAA0B,GAAG;IACvC,qFAAqF;IACrF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;CAC9C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,0BAA+B,GAAG,uBAAuB,CAyBtG"}
@@ -77,6 +77,7 @@ const OUTCOME_GLYPH = {
77
77
  errored: "✗",
78
78
  timedout: "⏱",
79
79
  warned: "!",
80
+ aborted: "■",
80
81
  skipped: "-",
81
82
  pending: "○",
82
83
  running: "…"
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well.\nfunction isFixtureNode(node: Test): boolean {\n return node.context !== undefined || hasStepDetail(node.detail);\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n};\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n return detail.step.attempts.map((attempt) => ({\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n },\n }));\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapters.js","sources":["../../../src/data/verification/adapters.tsx"],"sourcesContent":["// Domain node adapters for VerificationResults: a checklist adapter for the\n// synthesized \"Acceptance criteria\" node and its items, and a fixture/CEL\n// adapter for the failing-step detail. Rendering lives in adapterViews.tsx —\n// split out so this file's only exports are the registry (react/only-export-\n// components forbids mixing component declarations with plain exports).\n\nimport type { ReactNode } from \"react\";\nimport { ChecklistDetail, FixtureDetail } from \"./adapterViews\";\nimport { StepOutputs } from \"./stepKindViews\";\nimport { verifyNodeTest } from \"./verifyReportTests\";\nimport { UiTerminal } from \"../../icons\";\nimport { hasStepDetail, readStepDetail, stepKindCopy, type WaitDetail } from \"./stepKind\";\nimport {\n createTestRunnerRegistry,\n outcomeFor,\n type BriefSection,\n type CopySections,\n type FixtureContext,\n type Test,\n type TestNodeAdapter,\n type TestNodeAdapterRegistry,\n type TestOutcome,\n type TestSummary,\n} from \"../test-runner\";\n\nfunction isChecklistNode(node: Test): boolean {\n return node.framework === \"checklist\";\n}\n\nfunction checklistMark(item: Test): string {\n if (item.failed) return \"[ ]\";\n if (item.passed) return \"[x]\";\n return \"[?]\";\n}\n\n/** `- [x]/[ ]/[?] criterion — reason` for each item, or the leaf itself. */\nfunction checklistCopy(node: Test): CopySections {\n const items = node.children && node.children.length > 0 ? node.children : [node];\n const lines = items.map(\n (item) => `- ${checklistMark(item)} ${item.name}${item.message ? ` — ${item.message}` : \"\"}`,\n );\n return { brief: [{ title: \"Criteria\", body: lines.join(\"\\n\") }] };\n}\n\nconst checklistAdapter: TestNodeAdapter = {\n id: \"verification-checklist\",\n match: isChecklistNode,\n renderDetail: ({ node }) => <ChecklistDetail node={node} />,\n copy: ({ node }) => checklistCopy(node),\n};\n\n// A typed step kind (services, todo, …) may report no command or CEL context at\n// all, so `detail.step` claims the node as well.\nfunction isFixtureNode(node: Test): boolean {\n return node.context !== undefined || hasStepDetail(node.detail);\n}\n\n// ── Copy sections for fixture steps (exec / query / table / test / lint) ───\n\nfunction readCelTrace(detail: unknown): string | undefined {\n if (detail && typeof detail === \"object\" && !Array.isArray(detail)) {\n const value = (detail as Record<string, unknown>).cel_trace;\n if (typeof value === \"string\" && value.length > 0) return value;\n }\n return undefined;\n}\n\n// Mirrors CelDetails: without a CEL gate, a command step's `actual` is the whole\n// command result object, already covered by the Command section and output.\nfunction comparisonValue(hasCelGate: boolean, value: unknown): unknown {\n if (value === undefined) return undefined;\n if (hasCelGate) return value;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) return undefined;\n return value;\n}\n\nfunction formatValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value, null, 2);\n}\n\nfunction commandSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const command = context?.command ?? node.command;\n if (!command) return [];\n const cwd = context?.cwd ?? node.work_dir;\n const exit = context?.exit_code;\n const lines = [`$ ${command}`, cwd && `cwd: ${cwd}`, exit !== undefined && `exit: ${exit}`];\n return [{ title: \"Command\", lang: \"sh\", body: lines.filter(Boolean).join(\"\\n\") }];\n}\n\nfunction assertionSection(node: Test, context: FixtureContext | undefined): BriefSection[] {\n const expression = context?.cel_expression;\n const trace = readCelTrace(node.detail);\n const hasCelGate = !!(expression || trace);\n const vars = context?.cel_vars ?? {};\n const expected = comparisonValue(hasCelGate, context?.expected);\n const actual = comparisonValue(hasCelGate, context?.actual);\n const lines = [\n expression && `expression: ${expression}`,\n trace && `trace:\\n${trace}`,\n Object.keys(vars).length > 0 && `vars: ${formatValue(vars)}`,\n expected !== undefined && `expected: ${formatValue(expected)}`,\n actual !== undefined && `actual: ${formatValue(actual)}`,\n ].filter(Boolean);\n return lines.length > 0 ? [{ title: \"Assertion\", body: lines.join(\"\\n\") }] : [];\n}\n\nconst OUTCOME_GLYPH: Record<TestOutcome, string> = {\n passed: \"✓\",\n failed: \"✗\",\n errored: \"✗\",\n timedout: \"⏱\",\n warned: \"!\",\n aborted: \"■\",\n skipped: \"-\",\n pending: \"○\",\n running: \"…\",\n};\n\nfunction childLine(child: Test): string {\n const outcome = outcomeFor(child);\n const exit = (child.context as FixtureContext | undefined)?.exit_code;\n const reason = child.message ?? (exit ? `exit ${exit}` : undefined);\n return `${outcome ? OUTCOME_GLYPH[outcome] : \"·\"} ${child.name}${reason ? ` — ${reason}` : \"\"}`;\n}\n\nfunction summaryLine(summary: TestSummary): string {\n const counts: [number | undefined, string][] = [\n [summary.Passed, \"passed\"],\n [summary.Failed, \"failed\"],\n [summary.Warned, \"warned\"],\n [summary.Timedout, \"timed out\"],\n [summary.Skipped, \"skipped\"],\n [summary.Pending, \"pending\"],\n [summary.Running, \"running\"],\n ];\n const parts = counts.filter(([n]) => !!n).map(([n, label]) => `${n} ${label}`);\n return [`${summary.Total} total`, ...parts].join(\" · \");\n}\n\nfunction resultsSection(node: Test): BriefSection[] {\n const lines = [\n ...(node.summary ? [summaryLine(node.summary)] : []),\n ...(node.children ?? []).map(childLine),\n ];\n return lines.length > 0 ? [{ title: \"Results\", body: lines.join(\"\\n\") }] : [];\n}\n\n/** Command, CEL assertion and per-child verdicts for a fixture step or its parent. */\nfunction fixtureCopy(node: Test): CopySections {\n const context = node.context as FixtureContext | undefined;\n const command = context?.command ?? node.command;\n const stepDetail = readStepDetail(node.detail);\n return {\n brief: [\n ...commandSection(node, context),\n ...assertionSection(node, context),\n ...(stepDetail.kind === \"step\" ? stepKindCopy(stepDetail.step) : []),\n ...resultsSection(node),\n ],\n items: command ? [{ label: \"Copy command\", icon: UiTerminal, value: command }] : [],\n };\n}\n\n// gavel's FixtureResult.Type values plus \"fixture\" (a markdown table of rows)\n// and the typed step kinds. Table and runner-step parents carry no `context`,\n// so the fixture adapter never claims them; this copy-only adapter gives them\n// the same sections. \"playwright\" is also a test framework, so it counts as a\n// step only when the node carries `detail.step`.\nconst FIXTURE_STEP_FRAMEWORKS = new Set([\n \"exec\",\n \"query\",\n \"fixture\",\n \"test\",\n \"lint\",\n \"verify\",\n \"services\",\n \"todo\",\n \"todo_prompt\",\n \"ai\",\n \"browser\",\n \"playwright\",\n \"agent-browser\",\n]);\n\nfunction isFixtureStepNode(node: Test): boolean {\n const framework = node.framework ?? \"\";\n if (framework === \"playwright\") return hasStepDetail(node.detail);\n return FIXTURE_STEP_FRAMEWORKS.has(framework);\n}\n\nconst fixtureStepCopyAdapter: TestNodeAdapter = {\n id: \"verification-step-copy\",\n match: isFixtureStepNode,\n copy: ({ node }) => fixtureCopy(node),\n};\n\n/** Default node adapters for VerificationResults: checklist items and\n * fixture/CEL steps. Registration order matters only when a node could match\n * both — a checklist node never carries a `context`, so the two never race. */\nexport type VerificationAdapterOptions = {\n /** Override the wait section while retaining the fixture's other detail sections. */\n renderWait?: (wait: WaitDetail) => ReactNode;\n};\n\nexport function verificationAdapters(options: VerificationAdapterOptions = {}): TestNodeAdapterRegistry {\n const fixtureAdapter: TestNodeAdapter = {\n id: \"verification-fixture\",\n match: isFixtureNode,\n renderDetail: ({ node }) => <FixtureDetail node={node} {...options} />,\n detailAttempts: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\") return [];\n return detail.step.attempts.map((attempt) => ({\n id: attempt.attempt, status: attempt.status,\n ...(attempt.durationMs !== undefined ? { durationMs: attempt.durationMs } : {}),\n node: attempt.result ? verifyNodeTest(attempt.result) : {\n name: node.name, message: `Attempt ${attempt.attempt}: execution evidence was not stored in this report.`,\n detail: { step: detail.step.step },\n },\n }));\n },\n detailTabs: ({ node }) => {\n const detail = readStepDetail(node.detail);\n if (detail.kind !== \"step\" || detail.step.outputs === undefined) return [];\n return [{ id: \"outputs\", label: \"Outputs\", render: () => <StepOutputs outputs={detail.step.outputs} /> }];\n },\n copy: ({ node }) => fixtureCopy(node),\n };\n return createTestRunnerRegistry([checklistAdapter, fixtureAdapter, fixtureStepCopyAdapter]);\n}\n"],"names":[],"mappings":"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"}
@@ -15,9 +15,9 @@ function detectMode() {
15
15
  }
16
16
  function getVersionInfo() {
17
17
  return {
18
- commit: read(() => "187d13f6c", ""),
19
- tag: read(() => "clicky-ui@0.3.48", ""),
20
- date: read(() => "2026-10-16T04:15:25.882Z", ""),
18
+ commit: read(() => "a8f8882e6", ""),
19
+ tag: read(() => "clicky-ui@0.3.49", ""),
20
+ date: read(() => "2026-10-16T10:31:51.127Z", ""),
21
21
  dirty: read(() => true, false),
22
22
  mode: detectMode()
23
23
  };
@@ -13,9 +13,9 @@ function detectMode() {
13
13
  }
14
14
  function getVersionInfo() {
15
15
  return {
16
- commit: read(() => "187d13f6c", ""),
17
- tag: read(() => "clicky-ui@0.3.48", ""),
18
- date: read(() => "2026-10-16T04:14:41.824Z", ""),
16
+ commit: read(() => "a8f8882e6", ""),
17
+ tag: read(() => "clicky-ui@0.3.49", ""),
18
+ date: read(() => "2026-10-16T10:31:24.341Z", ""),
19
19
  dirty: read(() => true, false),
20
20
  mode: detectMode()
21
21
  };