@flanksource/clicky-ui 0.3.46 → 0.3.48

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 (474) hide show
  1. package/NOTICE.md +11 -0
  2. package/README.md +49 -0
  3. package/dist/ai.cjs +13 -8
  4. package/dist/ai.cjs.map +1 -1
  5. package/dist/ai.js +7 -2
  6. package/dist/ai.js.map +1 -1
  7. package/dist/comments/CommentSidePanel.cjs +10 -4
  8. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  9. package/dist/comments/CommentSidePanel.d.ts +2 -0
  10. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  11. package/dist/comments/CommentSidePanel.js +10 -4
  12. package/dist/comments/CommentSidePanel.js.map +1 -1
  13. package/dist/comments/CommentThread.cjs +2 -0
  14. package/dist/comments/CommentThread.cjs.map +1 -1
  15. package/dist/comments/CommentThread.d.ts +2 -1
  16. package/dist/comments/CommentThread.d.ts.map +1 -1
  17. package/dist/comments/CommentThread.js +2 -0
  18. package/dist/comments/CommentThread.js.map +1 -1
  19. package/dist/comments/CommentThreadList.cjs +3 -0
  20. package/dist/comments/CommentThreadList.cjs.map +1 -1
  21. package/dist/comments/CommentThreadList.d.ts +3 -1
  22. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  23. package/dist/comments/CommentThreadList.js +3 -0
  24. package/dist/comments/CommentThreadList.js.map +1 -1
  25. package/dist/components/ErrorWrapper.cjs +2 -3
  26. package/dist/components/ErrorWrapper.cjs.map +1 -1
  27. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  28. package/dist/components/ErrorWrapper.js +3 -4
  29. package/dist/components/ErrorWrapper.js.map +1 -1
  30. package/dist/data/Clicky.cjs +3 -0
  31. package/dist/data/Clicky.cjs.map +1 -1
  32. package/dist/data/Clicky.js +3 -0
  33. package/dist/data/Clicky.js.map +1 -1
  34. package/dist/data/CodeLine.cjs +4 -2
  35. package/dist/data/CodeLine.cjs.map +1 -1
  36. package/dist/data/CodeLine.d.ts.map +1 -1
  37. package/dist/data/CodeLine.js +4 -2
  38. package/dist/data/CodeLine.js.map +1 -1
  39. package/dist/data/FilterPill.cjs +15 -2
  40. package/dist/data/FilterPill.cjs.map +1 -1
  41. package/dist/data/FilterPill.d.ts +1 -1
  42. package/dist/data/FilterPill.d.ts.map +1 -1
  43. package/dist/data/FilterPill.js +15 -2
  44. package/dist/data/FilterPill.js.map +1 -1
  45. package/dist/data/LogViewer.cjs +27 -8
  46. package/dist/data/LogViewer.cjs.map +1 -1
  47. package/dist/data/LogViewer.d.ts +11 -3
  48. package/dist/data/LogViewer.d.ts.map +1 -1
  49. package/dist/data/LogViewer.js +27 -8
  50. package/dist/data/LogViewer.js.map +1 -1
  51. package/dist/data/Properties.cjs +2 -15
  52. package/dist/data/Properties.cjs.map +1 -1
  53. package/dist/data/Properties.d.ts +4 -0
  54. package/dist/data/Properties.d.ts.map +1 -1
  55. package/dist/data/Properties.js +2 -15
  56. package/dist/data/Properties.js.map +1 -1
  57. package/dist/data/PropertyValue.cjs +37 -0
  58. package/dist/data/PropertyValue.cjs.map +1 -0
  59. package/dist/data/PropertyValue.d.ts +6 -0
  60. package/dist/data/PropertyValue.d.ts.map +1 -0
  61. package/dist/data/PropertyValue.js +37 -0
  62. package/dist/data/PropertyValue.js.map +1 -0
  63. package/dist/data/SymbolBadge.cjs +61 -0
  64. package/dist/data/SymbolBadge.cjs.map +1 -0
  65. package/dist/data/SymbolBadge.d.ts +21 -0
  66. package/dist/data/SymbolBadge.d.ts.map +1 -0
  67. package/dist/data/SymbolBadge.js +61 -0
  68. package/dist/data/SymbolBadge.js.map +1 -0
  69. package/dist/data/Tree.cjs +4 -3
  70. package/dist/data/Tree.cjs.map +1 -1
  71. package/dist/data/Tree.d.ts +3 -1
  72. package/dist/data/Tree.d.ts.map +1 -1
  73. package/dist/data/Tree.js +4 -3
  74. package/dist/data/Tree.js.map +1 -1
  75. package/dist/data/ai/ChatFab.cjs +1 -1
  76. package/dist/data/ai/ChatFab.cjs.map +1 -1
  77. package/dist/data/ai/ChatFab.js +1 -1
  78. package/dist/data/ai/ChatFab.js.map +1 -1
  79. package/dist/data/ai/ChatWindow.cjs +106 -171
  80. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  81. package/dist/data/ai/ChatWindow.d.ts +6 -2
  82. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  83. package/dist/data/ai/ChatWindow.header.cjs +104 -0
  84. package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
  85. package/dist/data/ai/ChatWindow.header.d.ts +29 -0
  86. package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
  87. package/dist/data/ai/ChatWindow.header.js +104 -0
  88. package/dist/data/ai/ChatWindow.header.js.map +1 -0
  89. package/dist/data/ai/ChatWindow.js +107 -172
  90. package/dist/data/ai/ChatWindow.js.map +1 -1
  91. package/dist/data/ai/ChatWindow.placement.cjs +95 -0
  92. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
  93. package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
  94. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
  95. package/dist/data/ai/ChatWindow.placement.js +95 -0
  96. package/dist/data/ai/ChatWindow.placement.js.map +1 -0
  97. package/dist/data/ai/SessionChatComposer.cjs +3 -1
  98. package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
  99. package/dist/data/ai/SessionChatComposer.d.ts +4 -1
  100. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
  101. package/dist/data/ai/SessionChatComposer.js +3 -1
  102. package/dist/data/ai/SessionChatComposer.js.map +1 -1
  103. package/dist/data/ai/SessionInspector.cjs +68 -72
  104. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  105. package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
  106. package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
  107. package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
  108. package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
  109. package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
  110. package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
  111. package/dist/data/ai/SessionInspector.d.ts +6 -1
  112. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  113. package/dist/data/ai/SessionInspector.js +69 -73
  114. package/dist/data/ai/SessionInspector.js.map +1 -1
  115. package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
  116. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
  117. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
  118. package/dist/data/ai/SessionInspector.legacy.js +41 -42
  119. package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
  120. package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
  121. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
  122. package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
  123. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
  124. package/dist/data/ai/SessionInspector.remote-view.js +14 -9
  125. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
  126. package/dist/data/ai/SessionInspector.remote.cjs +84 -16
  127. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
  128. package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
  129. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
  130. package/dist/data/ai/SessionInspector.remote.js +86 -18
  131. package/dist/data/ai/SessionInspector.remote.js.map +1 -1
  132. package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
  133. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  134. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  135. package/dist/data/ai/SessionInspector.transcript.js +5 -0
  136. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  137. package/dist/data/ai/SessionTail.cjs +63 -0
  138. package/dist/data/ai/SessionTail.cjs.map +1 -0
  139. package/dist/data/ai/SessionTail.d.ts +14 -0
  140. package/dist/data/ai/SessionTail.d.ts.map +1 -0
  141. package/dist/data/ai/SessionTail.js +63 -0
  142. package/dist/data/ai/SessionTail.js.map +1 -0
  143. package/dist/data/ai/SessionViewer.cjs +10 -3
  144. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  145. package/dist/data/ai/SessionViewer.d.ts +7 -1
  146. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  147. package/dist/data/ai/SessionViewer.js +10 -3
  148. package/dist/data/ai/SessionViewer.js.map +1 -1
  149. package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
  150. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  151. package/dist/data/ai/index.d.ts +4 -3
  152. package/dist/data/ai/index.d.ts.map +1 -1
  153. package/dist/data/ai/use-session-scroll.cjs +30 -6
  154. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  155. package/dist/data/ai/use-session-scroll.d.ts +7 -0
  156. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  157. package/dist/data/ai/use-session-scroll.js +30 -6
  158. package/dist/data/ai/use-session-scroll.js.map +1 -1
  159. package/dist/data/chat/Chat.cjs +1 -1
  160. package/dist/data/chat/Chat.cjs.map +1 -1
  161. package/dist/data/chat/Chat.js +1 -1
  162. package/dist/data/chat/Chat.js.map +1 -1
  163. package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
  164. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  165. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  166. package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
  167. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  168. package/dist/data/chat/PromptInput.cjs +4 -2
  169. package/dist/data/chat/PromptInput.cjs.map +1 -1
  170. package/dist/data/chat/PromptInput.d.ts +5 -1
  171. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  172. package/dist/data/chat/PromptInput.js +4 -2
  173. package/dist/data/chat/PromptInput.js.map +1 -1
  174. package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
  175. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  176. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  177. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  178. package/dist/data/diagnostics/ErrorDetails.js +14 -3
  179. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  180. package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
  181. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  182. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  183. package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
  184. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  185. package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
  186. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  187. package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
  188. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  189. package/dist/data/diagnostics/error-diagnostics.js +6 -1
  190. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  191. package/dist/data/har/HarPanel.cjs +3 -1
  192. package/dist/data/har/HarPanel.cjs.map +1 -1
  193. package/dist/data/har/HarPanel.d.ts +4 -1
  194. package/dist/data/har/HarPanel.d.ts.map +1 -1
  195. package/dist/data/har/HarPanel.js +3 -1
  196. package/dist/data/har/HarPanel.js.map +1 -1
  197. package/dist/data/test-runner/Expectation.cjs +57 -0
  198. package/dist/data/test-runner/Expectation.cjs.map +1 -0
  199. package/dist/data/test-runner/Expectation.d.ts +19 -0
  200. package/dist/data/test-runner/Expectation.d.ts.map +1 -0
  201. package/dist/data/test-runner/Expectation.js +57 -0
  202. package/dist/data/test-runner/Expectation.js.map +1 -0
  203. package/dist/data/test-runner/MarkIcons.cjs +38 -0
  204. package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
  205. package/dist/data/test-runner/MarkIcons.d.ts +15 -0
  206. package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
  207. package/dist/data/test-runner/MarkIcons.js +38 -0
  208. package/dist/data/test-runner/MarkIcons.js.map +1 -0
  209. package/dist/data/test-runner/TestDetailPanel.cjs +99 -53
  210. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  211. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  212. package/dist/data/test-runner/TestDetailPanel.js +101 -55
  213. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  214. package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
  215. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  216. package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
  217. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  218. package/dist/data/test-runner/TestFailureDetail.js +23 -27
  219. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  220. package/dist/data/test-runner/TestFilterBar.cjs +87 -93
  221. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  222. package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
  223. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  224. package/dist/data/test-runner/TestFilterBar.js +89 -95
  225. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  226. package/dist/data/test-runner/TestRunSummary.cjs +35 -21
  227. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  228. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  229. package/dist/data/test-runner/TestRunSummary.js +35 -21
  230. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  231. package/dist/data/test-runner/TestRunner.cjs +58 -30
  232. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  233. package/dist/data/test-runner/TestRunner.d.ts +6 -3
  234. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  235. package/dist/data/test-runner/TestRunner.js +58 -30
  236. package/dist/data/test-runner/TestRunner.js.map +1 -1
  237. package/dist/data/test-runner/TestTree.cjs +5 -2
  238. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  239. package/dist/data/test-runner/TestTree.d.ts +5 -2
  240. package/dist/data/test-runner/TestTree.d.ts.map +1 -1
  241. package/dist/data/test-runner/TestTree.js +5 -2
  242. package/dist/data/test-runner/TestTree.js.map +1 -1
  243. package/dist/data/test-runner/TestTreeNode.cjs +28 -19
  244. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  245. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  246. package/dist/data/test-runner/TestTreeNode.js +29 -20
  247. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  248. package/dist/data/test-runner/adapter.cjs +15 -0
  249. package/dist/data/test-runner/adapter.cjs.map +1 -1
  250. package/dist/data/test-runner/adapter.d.ts +27 -7
  251. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  252. package/dist/data/test-runner/adapter.js +15 -0
  253. package/dist/data/test-runner/adapter.js.map +1 -1
  254. package/dist/data/test-runner/context.cjs.map +1 -1
  255. package/dist/data/test-runner/context.d.ts +2 -0
  256. package/dist/data/test-runner/context.d.ts.map +1 -1
  257. package/dist/data/test-runner/context.js.map +1 -1
  258. package/dist/data/test-runner/copy.cjs +114 -0
  259. package/dist/data/test-runner/copy.cjs.map +1 -0
  260. package/dist/data/test-runner/copy.d.ts +47 -0
  261. package/dist/data/test-runner/copy.d.ts.map +1 -0
  262. package/dist/data/test-runner/copy.js +114 -0
  263. package/dist/data/test-runner/copy.js.map +1 -0
  264. package/dist/data/test-runner/index.d.ts +6 -3
  265. package/dist/data/test-runner/index.d.ts.map +1 -1
  266. package/dist/data/test-runner/marks.cjs +184 -0
  267. package/dist/data/test-runner/marks.cjs.map +1 -0
  268. package/dist/data/test-runner/marks.d.ts +40 -0
  269. package/dist/data/test-runner/marks.d.ts.map +1 -0
  270. package/dist/data/test-runner/marks.js +184 -0
  271. package/dist/data/test-runner/marks.js.map +1 -0
  272. package/dist/data/test-runner/status.cjs +27 -44
  273. package/dist/data/test-runner/status.cjs.map +1 -1
  274. package/dist/data/test-runner/status.d.ts +12 -3
  275. package/dist/data/test-runner/status.d.ts.map +1 -1
  276. package/dist/data/test-runner/status.js +27 -44
  277. package/dist/data/test-runner/status.js.map +1 -1
  278. package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
  279. package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
  280. package/dist/data/traces/TraceHarView.d.ts +13 -0
  281. package/dist/data/traces/TraceHarView.d.ts.map +1 -0
  282. package/dist/data/traces/cast.d.ts +9 -0
  283. package/dist/data/traces/cast.d.ts.map +1 -0
  284. package/dist/data/traces/fixtures.d.ts +8 -0
  285. package/dist/data/traces/fixtures.d.ts.map +1 -0
  286. package/dist/data/traces/har-adapter.d.ts +13 -0
  287. package/dist/data/traces/har-adapter.d.ts.map +1 -0
  288. package/dist/data/traces/terminal-screen.d.ts +45 -0
  289. package/dist/data/traces/terminal-screen.d.ts.map +1 -0
  290. package/dist/data/traces/terminal-timeline.d.ts +26 -0
  291. package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
  292. package/dist/data/traces/types.d.ts +141 -0
  293. package/dist/data/traces/types.d.ts.map +1 -0
  294. package/dist/data/verification/VerificationResults.cjs +4 -0
  295. package/dist/data/verification/VerificationResults.cjs.map +1 -1
  296. package/dist/data/verification/VerificationResults.d.ts +3 -1
  297. package/dist/data/verification/VerificationResults.d.ts.map +1 -1
  298. package/dist/data/verification/VerificationResults.js +4 -0
  299. package/dist/data/verification/VerificationResults.js.map +1 -1
  300. package/dist/data/verification/adapterViews.cjs +28 -44
  301. package/dist/data/verification/adapterViews.cjs.map +1 -1
  302. package/dist/data/verification/adapterViews.d.ts +4 -1
  303. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  304. package/dist/data/verification/adapterViews.js +28 -44
  305. package/dist/data/verification/adapterViews.js.map +1 -1
  306. package/dist/data/verification/adapters.cjs +163 -8
  307. package/dist/data/verification/adapters.cjs.map +1 -1
  308. package/dist/data/verification/adapters.d.ts +7 -1
  309. package/dist/data/verification/adapters.d.ts.map +1 -1
  310. package/dist/data/verification/adapters.js +163 -8
  311. package/dist/data/verification/adapters.js.map +1 -1
  312. package/dist/data/verification/index.d.ts +4 -2
  313. package/dist/data/verification/index.d.ts.map +1 -1
  314. package/dist/data/verification/stepKind.cjs +217 -0
  315. package/dist/data/verification/stepKind.cjs.map +1 -0
  316. package/dist/data/verification/stepKind.d.ts +87 -0
  317. package/dist/data/verification/stepKind.d.ts.map +1 -0
  318. package/dist/data/verification/stepKind.js +217 -0
  319. package/dist/data/verification/stepKind.js.map +1 -0
  320. package/dist/data/verification/stepKindViews.cjs +111 -0
  321. package/dist/data/verification/stepKindViews.cjs.map +1 -0
  322. package/dist/data/verification/stepKindViews.d.ts +18 -0
  323. package/dist/data/verification/stepKindViews.d.ts.map +1 -0
  324. package/dist/data/verification/stepKindViews.js +111 -0
  325. package/dist/data/verification/stepKindViews.js.map +1 -0
  326. package/dist/data/verification/verifyReportTests.cjs +1 -0
  327. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  328. package/dist/data/verification/verifyReportTests.d.ts +2 -1
  329. package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
  330. package/dist/data/verification/verifyReportTests.js +1 -0
  331. package/dist/data/verification/verifyReportTests.js.map +1 -1
  332. package/dist/data/version-info.cjs +3 -3
  333. package/dist/data/version-info.js +3 -3
  334. package/dist/data.cjs +58 -3
  335. package/dist/data.cjs.map +1 -1
  336. package/dist/data.d.ts +3 -0
  337. package/dist/data.d.ts.map +1 -1
  338. package/dist/data.js +60 -5
  339. package/dist/data.js.map +1 -1
  340. package/dist/icons/components/UiLogoEslint.cjs +10 -0
  341. package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
  342. package/dist/icons/components/UiLogoEslint.d.ts +9 -0
  343. package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
  344. package/dist/icons/components/UiLogoEslint.js +10 -0
  345. package/dist/icons/components/UiLogoEslint.js.map +1 -0
  346. package/dist/icons/components/UiLogoGo.cjs +10 -0
  347. package/dist/icons/components/UiLogoGo.cjs.map +1 -0
  348. package/dist/icons/components/UiLogoGo.d.ts +9 -0
  349. package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
  350. package/dist/icons/components/UiLogoGo.js +10 -0
  351. package/dist/icons/components/UiLogoGo.js.map +1 -0
  352. package/dist/icons/components/UiLogoJest.cjs +10 -0
  353. package/dist/icons/components/UiLogoJest.cjs.map +1 -0
  354. package/dist/icons/components/UiLogoJest.d.ts +9 -0
  355. package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
  356. package/dist/icons/components/UiLogoJest.js +10 -0
  357. package/dist/icons/components/UiLogoJest.js.map +1 -0
  358. package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
  359. package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
  360. package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
  361. package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
  362. package/dist/icons/components/UiLogoMarkdown.js +10 -0
  363. package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
  364. package/dist/icons/components/UiLogoOxc.cjs +10 -0
  365. package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
  366. package/dist/icons/components/UiLogoOxc.d.ts +9 -0
  367. package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
  368. package/dist/icons/components/UiLogoOxc.js +10 -0
  369. package/dist/icons/components/UiLogoOxc.js.map +1 -0
  370. package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
  371. package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
  372. package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
  373. package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
  374. package/dist/icons/components/UiLogoPlaywright.js +10 -0
  375. package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
  376. package/dist/icons/components/UiLogoPython.cjs +10 -0
  377. package/dist/icons/components/UiLogoPython.cjs.map +1 -0
  378. package/dist/icons/components/UiLogoPython.d.ts +9 -0
  379. package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
  380. package/dist/icons/components/UiLogoPython.js +10 -0
  381. package/dist/icons/components/UiLogoPython.js.map +1 -0
  382. package/dist/icons/components/UiLogoReact.cjs +10 -0
  383. package/dist/icons/components/UiLogoReact.cjs.map +1 -0
  384. package/dist/icons/components/UiLogoReact.d.ts +9 -0
  385. package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
  386. package/dist/icons/components/UiLogoReact.js +10 -0
  387. package/dist/icons/components/UiLogoReact.js.map +1 -0
  388. package/dist/icons/components/UiLogoRuff.cjs +10 -0
  389. package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
  390. package/dist/icons/components/UiLogoRuff.d.ts +9 -0
  391. package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
  392. package/dist/icons/components/UiLogoRuff.js +10 -0
  393. package/dist/icons/components/UiLogoRuff.js.map +1 -0
  394. package/dist/icons/components/UiLogoTypescript.cjs +10 -0
  395. package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
  396. package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
  397. package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
  398. package/dist/icons/components/UiLogoTypescript.js +10 -0
  399. package/dist/icons/components/UiLogoTypescript.js.map +1 -0
  400. package/dist/icons/components/UiLogoVitest.cjs +10 -0
  401. package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
  402. package/dist/icons/components/UiLogoVitest.d.ts +9 -0
  403. package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
  404. package/dist/icons/components/UiLogoVitest.js +10 -0
  405. package/dist/icons/components/UiLogoVitest.js.map +1 -0
  406. package/dist/icons/index.d.ts +11 -0
  407. package/dist/icons/index.d.ts.map +1 -1
  408. package/dist/icons/registry.cjs +22 -0
  409. package/dist/icons/registry.cjs.map +1 -1
  410. package/dist/icons/registry.d.ts.map +1 -1
  411. package/dist/icons/registry.js +22 -0
  412. package/dist/icons/registry.js.map +1 -1
  413. package/dist/icons.cjs +22 -0
  414. package/dist/icons.cjs.map +1 -1
  415. package/dist/icons.js +22 -0
  416. package/dist/icons.js.map +1 -1
  417. package/dist/index.cjs +60 -3
  418. package/dist/index.cjs.map +1 -1
  419. package/dist/index.js +62 -5
  420. package/dist/index.js.map +1 -1
  421. package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
  422. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  423. package/dist/overlay/DropdownMenuSubmenu.js +4 -4
  424. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  425. package/dist/rpc/FilterForm.cjs +9 -0
  426. package/dist/rpc/FilterForm.cjs.map +1 -1
  427. package/dist/rpc/FilterForm.d.ts +5 -1
  428. package/dist/rpc/FilterForm.d.ts.map +1 -1
  429. package/dist/rpc/FilterForm.js +9 -0
  430. package/dist/rpc/FilterForm.js.map +1 -1
  431. package/dist/rpc/InlineError.cjs +12 -43
  432. package/dist/rpc/InlineError.cjs.map +1 -1
  433. package/dist/rpc/InlineError.d.ts.map +1 -1
  434. package/dist/rpc/InlineError.js +13 -44
  435. package/dist/rpc/InlineError.js.map +1 -1
  436. package/dist/rpc/OperationArgsForm.cjs +153 -0
  437. package/dist/rpc/OperationArgsForm.cjs.map +1 -0
  438. package/dist/rpc/OperationArgsForm.d.ts +16 -0
  439. package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
  440. package/dist/rpc/OperationArgsForm.js +153 -0
  441. package/dist/rpc/OperationArgsForm.js.map +1 -0
  442. package/dist/rpc/OperationScheduleDialog.cjs +119 -22
  443. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  444. package/dist/rpc/OperationScheduleDialog.d.ts +7 -0
  445. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  446. package/dist/rpc/OperationScheduleDialog.js +120 -23
  447. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  448. package/dist/rpc/OperationSchedules.cjs +17 -2
  449. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  450. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  451. package/dist/rpc/OperationSchedules.js +17 -2
  452. package/dist/rpc/OperationSchedules.js.map +1 -1
  453. package/dist/rpc/operation-schedule-model.cjs +2 -7
  454. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  455. package/dist/rpc/operation-schedule-model.d.ts +0 -2
  456. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  457. package/dist/rpc/operation-schedule-model.js +2 -7
  458. package/dist/rpc/operation-schedule-model.js.map +1 -1
  459. package/dist/rpc/operation-schedule-types.d.ts +12 -1
  460. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  461. package/dist/rpc.cjs +2 -0
  462. package/dist/rpc.cjs.map +1 -1
  463. package/dist/rpc.d.ts +1 -0
  464. package/dist/rpc.d.ts.map +1 -1
  465. package/dist/rpc.js +2 -0
  466. package/dist/rpc.js.map +1 -1
  467. package/dist/styles.css +1 -1
  468. package/package.json +1 -1
  469. package/dist/data/test-runner/frameworkIcon.cjs +0 -27
  470. package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
  471. package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
  472. package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
  473. package/dist/data/test-runner/frameworkIcon.js +0 -27
  474. package/dist/data/test-runner/frameworkIcon.js.map +0 -1
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const status = require("./status.cjs");
4
+ const OUTPUT_TITLES = /* @__PURE__ */ new Set(["stdout", "stderr"]);
5
+ function fact(label, value) {
6
+ return value ? [{ label, value }] : [];
7
+ }
8
+ function section(title, body, lang) {
9
+ if (!body) return [];
10
+ return [lang ? { title, lang, body } : { title, body }];
11
+ }
12
+ function nodeLocation(node) {
13
+ if (!node.file) return void 0;
14
+ return node.line ? `${node.file}:${node.line}` : node.file;
15
+ }
16
+ function errorBody(node) {
17
+ var _a;
18
+ const summary = (_a = node.failure_detail) == null ? void 0 : _a.summary;
19
+ const lines = [node.message, summary !== node.message ? summary : void 0];
20
+ return lines.filter(Boolean).join("\n");
21
+ }
22
+ function expectationBody(node) {
23
+ const failure = node.failure_detail;
24
+ if (!failure) return "";
25
+ return [
26
+ failure.matcher && `matcher: ${failure.matcher}`,
27
+ failure.expected && `expected: ${failure.expected}`,
28
+ failure.actual && `actual: ${failure.actual}`,
29
+ failure.location && `at: ${failure.location}`
30
+ ].filter(Boolean).join("\n");
31
+ }
32
+ function genericCopySections(node) {
33
+ var _a;
34
+ const duration = node.duration ? status.formatTestDuration(node.duration) : void 0;
35
+ return {
36
+ facts: [
37
+ ...fact("Result", status.outcomeFor(node) ?? void 0),
38
+ ...fact("Tool", node.framework),
39
+ ...fact("Location", nodeLocation(node)),
40
+ ...fact("Duration", duration)
41
+ ],
42
+ brief: [
43
+ ...section("Error", errorBody(node)),
44
+ ...section("Expectation", expectationBody(node)),
45
+ ...section("Stack", (_a = node.failure_detail) == null ? void 0 : _a.stack),
46
+ ...section("stdout", node.stdout),
47
+ ...section("stderr", node.stderr)
48
+ ],
49
+ items: []
50
+ };
51
+ }
52
+ function uniqueBy(values, key) {
53
+ const seen = /* @__PURE__ */ new Set();
54
+ return values.filter((value) => {
55
+ const k = key(value);
56
+ if (seen.has(k)) return false;
57
+ seen.add(k);
58
+ return true;
59
+ });
60
+ }
61
+ function mergeCopySections(parts) {
62
+ return {
63
+ facts: uniqueBy(
64
+ parts.flatMap((p) => p.facts ?? []),
65
+ (f) => f.label
66
+ ),
67
+ brief: uniqueBy(
68
+ parts.flatMap((p) => p.brief ?? []),
69
+ (s) => s.title
70
+ ),
71
+ items: uniqueBy(
72
+ parts.flatMap((p) => p.items ?? []),
73
+ (i) => i.label
74
+ )
75
+ };
76
+ }
77
+ function fence(body) {
78
+ const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));
79
+ return "`".repeat(Math.max(3, longest + 1));
80
+ }
81
+ function buildBrief(node, sections, facts) {
82
+ const lines = [`# ${node.name}`];
83
+ if (facts.length > 0) lines.push("", ...facts.map((f) => `- **${f.label}:** ${f.value}`));
84
+ for (const s of sections) {
85
+ if (!s.body) continue;
86
+ lines.push("", `## ${s.title}`, "");
87
+ if (s.markdown) {
88
+ lines.push(s.body);
89
+ continue;
90
+ }
91
+ const marker = fence(s.body);
92
+ lines.push(`${marker}${s.lang ?? ""}`, s.body, marker);
93
+ }
94
+ return lines.join("\n");
95
+ }
96
+ function buildNodeBrief(node, adapter) {
97
+ const generic = genericCopySections(node);
98
+ const merged = mergeCopySections([
99
+ { facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },
100
+ adapter,
101
+ { brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) }
102
+ ]);
103
+ return buildBrief(node, merged.brief, merged.facts);
104
+ }
105
+ function buildNodeJson(node) {
106
+ const { children: _children, ...rest } = node;
107
+ return JSON.stringify(rest, null, 2);
108
+ }
109
+ exports.buildBrief = buildBrief;
110
+ exports.buildNodeBrief = buildNodeBrief;
111
+ exports.buildNodeJson = buildNodeJson;
112
+ exports.genericCopySections = genericCopySections;
113
+ exports.mergeCopySections = mergeCopySections;
114
+ //# sourceMappingURL=copy.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.cjs","sources":["../../../src/data/test-runner/copy.ts"],"sourcesContent":["// Clipboard payloads for the detail header's \"Copy details\" split button. The\n// primary payload is a Markdown brief: a `# name` heading, `- **Label:** value`\n// facts, then one fenced `## Title` section per piece of evidence. The generic\n// sections here read only common `Test` fields; node adapters contribute the\n// domain sections (a command, a CEL assertion, a recording) and extra menu items\n// through `TestNodeAdapter.copy`. Pure — no React, no clipboard — so every\n// payload is unit-testable as a string.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport type { Test } from \"./types\";\nimport { formatTestDuration, outcomeFor } from \"./status\";\n\n/** One `- **label:** value` line under the brief's heading. */\nexport type BriefFact = { label: string; value: string };\n\n/**\n * One `## title` block of the brief: fenced (tagged with `lang`) by default, or\n * inserted as-is when `markdown` — for lists and links that must stay live.\n */\nexport type BriefSection = { title: string; lang?: string; markdown?: boolean; body: string };\n\ntype CopyItemBase = { label: string; icon?: StaticIconComponent | string };\n\n/** A copy menu item: the text it copies, or why there is nothing to copy. */\nexport type CopyItem = (CopyItemBase & { value: string }) | (CopyItemBase & { reason: string });\n\nexport type CopySections = {\n facts?: BriefFact[];\n brief?: BriefSection[];\n items?: CopyItem[];\n};\n\n/** Generic sections rendered after every adapter section, so evidence reads before raw output. */\nconst OUTPUT_TITLES = new Set([\"stdout\", \"stderr\"]);\n\nfunction fact(label: string, value: string | undefined): BriefFact[] {\n return value ? [{ label, value }] : [];\n}\n\nfunction section(title: string, body: string | undefined, lang?: string): BriefSection[] {\n if (!body) return [];\n return [lang ? { title, lang, body } : { title, body }];\n}\n\nfunction nodeLocation(node: Test): string | undefined {\n if (!node.file) return undefined;\n return node.line ? `${node.file}:${node.line}` : node.file;\n}\n\nfunction errorBody(node: Test): string {\n const summary = node.failure_detail?.summary;\n const lines = [node.message, summary !== node.message ? summary : undefined];\n return lines.filter(Boolean).join(\"\\n\");\n}\n\nfunction expectationBody(node: Test): string {\n const failure = node.failure_detail;\n if (!failure) return \"\";\n return [\n failure.matcher && `matcher: ${failure.matcher}`,\n failure.expected && `expected: ${failure.expected}`,\n failure.actual && `actual: ${failure.actual}`,\n failure.location && `at: ${failure.location}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/** Sections every node gets, read from the common `Test` fields only. */\nexport function genericCopySections(node: Test): Required<CopySections> {\n const duration = node.duration ? formatTestDuration(node.duration) : undefined;\n return {\n facts: [\n ...fact(\"Result\", outcomeFor(node) ?? undefined),\n ...fact(\"Tool\", node.framework),\n ...fact(\"Location\", nodeLocation(node)),\n ...fact(\"Duration\", duration),\n ],\n brief: [\n ...section(\"Error\", errorBody(node)),\n ...section(\"Expectation\", expectationBody(node)),\n ...section(\"Stack\", node.failure_detail?.stack),\n ...section(\"stdout\", node.stdout),\n ...section(\"stderr\", node.stderr),\n ],\n items: [],\n };\n}\n\nfunction uniqueBy<T>(values: T[], key: (value: T) => string): T[] {\n const seen = new Set<string>();\n return values.filter((value) => {\n const k = key(value);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\n/** Concatenates sections in order, keeping the first fact/section/item per label or title. */\nexport function mergeCopySections(parts: CopySections[]): Required<CopySections> {\n return {\n facts: uniqueBy(\n parts.flatMap((p) => p.facts ?? []),\n (f) => f.label,\n ),\n brief: uniqueBy(\n parts.flatMap((p) => p.brief ?? []),\n (s) => s.title,\n ),\n items: uniqueBy(\n parts.flatMap((p) => p.items ?? []),\n (i) => i.label,\n ),\n };\n}\n\n// A fence one backtick longer than any run in the body, so captured output that\n// itself contains ``` cannot close the block early (CommonMark).\nfunction fence(body: string): string {\n const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));\n return \"`\".repeat(Math.max(3, longest + 1));\n}\n\n/** The Markdown brief: `# name`, the facts as bullets, then each non-empty section (fenced unless `markdown`). */\nexport function buildBrief(node: Test, sections: BriefSection[], facts: BriefFact[]): string {\n const lines = [`# ${node.name}`];\n if (facts.length > 0) lines.push(\"\", ...facts.map((f) => `- **${f.label}:** ${f.value}`));\n for (const s of sections) {\n if (!s.body) continue;\n lines.push(\"\", `## ${s.title}`, \"\");\n if (s.markdown) {\n lines.push(s.body);\n continue;\n }\n const marker = fence(s.body);\n lines.push(`${marker}${s.lang ?? \"\"}`, s.body, marker);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The primary \"Copy details\" payload: generic facts and error/expectation\n * sections, then the adapters' sections, then the captured stdout/stderr.\n */\nexport function buildNodeBrief(node: Test, adapter: CopySections): string {\n const generic = genericCopySections(node);\n const merged = mergeCopySections([\n { facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },\n adapter,\n { brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) },\n ]);\n return buildBrief(node, merged.brief, merged.facts);\n}\n\n/** \"Copy as JSON\": the node without its children subtree, 2-space indented. */\nexport function buildNodeJson(node: Test): string {\n const { children: _children, ...rest } = node;\n return JSON.stringify(rest, null, 2);\n}\n"],"names":["formatTestDuration","outcomeFor"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { StaticIconComponent } from '../Icon.js';
2
+ import { Test } from './types.js';
3
+ /** One `- **label:** value` line under the brief's heading. */
4
+ export type BriefFact = {
5
+ label: string;
6
+ value: string;
7
+ };
8
+ /**
9
+ * One `## title` block of the brief: fenced (tagged with `lang`) by default, or
10
+ * inserted as-is when `markdown` — for lists and links that must stay live.
11
+ */
12
+ export type BriefSection = {
13
+ title: string;
14
+ lang?: string;
15
+ markdown?: boolean;
16
+ body: string;
17
+ };
18
+ type CopyItemBase = {
19
+ label: string;
20
+ icon?: StaticIconComponent | string;
21
+ };
22
+ /** A copy menu item: the text it copies, or why there is nothing to copy. */
23
+ export type CopyItem = (CopyItemBase & {
24
+ value: string;
25
+ }) | (CopyItemBase & {
26
+ reason: string;
27
+ });
28
+ export type CopySections = {
29
+ facts?: BriefFact[];
30
+ brief?: BriefSection[];
31
+ items?: CopyItem[];
32
+ };
33
+ /** Sections every node gets, read from the common `Test` fields only. */
34
+ export declare function genericCopySections(node: Test): Required<CopySections>;
35
+ /** Concatenates sections in order, keeping the first fact/section/item per label or title. */
36
+ export declare function mergeCopySections(parts: CopySections[]): Required<CopySections>;
37
+ /** The Markdown brief: `# name`, the facts as bullets, then each non-empty section (fenced unless `markdown`). */
38
+ export declare function buildBrief(node: Test, sections: BriefSection[], facts: BriefFact[]): string;
39
+ /**
40
+ * The primary "Copy details" payload: generic facts and error/expectation
41
+ * sections, then the adapters' sections, then the captured stdout/stderr.
42
+ */
43
+ export declare function buildNodeBrief(node: Test, adapter: CopySections): string;
44
+ /** "Copy as JSON": the node without its children subtree, 2-space indented. */
45
+ export declare function buildNodeJson(node: Test): string;
46
+ export {};
47
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/copy.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAGpC,+DAA+D;AAC/D,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9F,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAA;CAAE,CAAC;AAE3E,6EAA6E;AAC7E,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,CAAC,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhG,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB,CAAC;AAsCF,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAkBtE;AAYD,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,CAe/E;AASD,kHAAkH;AAClH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAc3F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAQxE;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAGhD"}
@@ -0,0 +1,114 @@
1
+ import { formatTestDuration, outcomeFor } from "./status.js";
2
+ const OUTPUT_TITLES = /* @__PURE__ */ new Set(["stdout", "stderr"]);
3
+ function fact(label, value) {
4
+ return value ? [{ label, value }] : [];
5
+ }
6
+ function section(title, body, lang) {
7
+ if (!body) return [];
8
+ return [lang ? { title, lang, body } : { title, body }];
9
+ }
10
+ function nodeLocation(node) {
11
+ if (!node.file) return void 0;
12
+ return node.line ? `${node.file}:${node.line}` : node.file;
13
+ }
14
+ function errorBody(node) {
15
+ var _a;
16
+ const summary = (_a = node.failure_detail) == null ? void 0 : _a.summary;
17
+ const lines = [node.message, summary !== node.message ? summary : void 0];
18
+ return lines.filter(Boolean).join("\n");
19
+ }
20
+ function expectationBody(node) {
21
+ const failure = node.failure_detail;
22
+ if (!failure) return "";
23
+ return [
24
+ failure.matcher && `matcher: ${failure.matcher}`,
25
+ failure.expected && `expected: ${failure.expected}`,
26
+ failure.actual && `actual: ${failure.actual}`,
27
+ failure.location && `at: ${failure.location}`
28
+ ].filter(Boolean).join("\n");
29
+ }
30
+ function genericCopySections(node) {
31
+ var _a;
32
+ const duration = node.duration ? formatTestDuration(node.duration) : void 0;
33
+ return {
34
+ facts: [
35
+ ...fact("Result", outcomeFor(node) ?? void 0),
36
+ ...fact("Tool", node.framework),
37
+ ...fact("Location", nodeLocation(node)),
38
+ ...fact("Duration", duration)
39
+ ],
40
+ brief: [
41
+ ...section("Error", errorBody(node)),
42
+ ...section("Expectation", expectationBody(node)),
43
+ ...section("Stack", (_a = node.failure_detail) == null ? void 0 : _a.stack),
44
+ ...section("stdout", node.stdout),
45
+ ...section("stderr", node.stderr)
46
+ ],
47
+ items: []
48
+ };
49
+ }
50
+ function uniqueBy(values, key) {
51
+ const seen = /* @__PURE__ */ new Set();
52
+ return values.filter((value) => {
53
+ const k = key(value);
54
+ if (seen.has(k)) return false;
55
+ seen.add(k);
56
+ return true;
57
+ });
58
+ }
59
+ function mergeCopySections(parts) {
60
+ return {
61
+ facts: uniqueBy(
62
+ parts.flatMap((p) => p.facts ?? []),
63
+ (f) => f.label
64
+ ),
65
+ brief: uniqueBy(
66
+ parts.flatMap((p) => p.brief ?? []),
67
+ (s) => s.title
68
+ ),
69
+ items: uniqueBy(
70
+ parts.flatMap((p) => p.items ?? []),
71
+ (i) => i.label
72
+ )
73
+ };
74
+ }
75
+ function fence(body) {
76
+ const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));
77
+ return "`".repeat(Math.max(3, longest + 1));
78
+ }
79
+ function buildBrief(node, sections, facts) {
80
+ const lines = [`# ${node.name}`];
81
+ if (facts.length > 0) lines.push("", ...facts.map((f) => `- **${f.label}:** ${f.value}`));
82
+ for (const s of sections) {
83
+ if (!s.body) continue;
84
+ lines.push("", `## ${s.title}`, "");
85
+ if (s.markdown) {
86
+ lines.push(s.body);
87
+ continue;
88
+ }
89
+ const marker = fence(s.body);
90
+ lines.push(`${marker}${s.lang ?? ""}`, s.body, marker);
91
+ }
92
+ return lines.join("\n");
93
+ }
94
+ function buildNodeBrief(node, adapter) {
95
+ const generic = genericCopySections(node);
96
+ const merged = mergeCopySections([
97
+ { facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },
98
+ adapter,
99
+ { brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) }
100
+ ]);
101
+ return buildBrief(node, merged.brief, merged.facts);
102
+ }
103
+ function buildNodeJson(node) {
104
+ const { children: _children, ...rest } = node;
105
+ return JSON.stringify(rest, null, 2);
106
+ }
107
+ export {
108
+ buildBrief,
109
+ buildNodeBrief,
110
+ buildNodeJson,
111
+ genericCopySections,
112
+ mergeCopySections
113
+ };
114
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sources":["../../../src/data/test-runner/copy.ts"],"sourcesContent":["// Clipboard payloads for the detail header's \"Copy details\" split button. The\n// primary payload is a Markdown brief: a `# name` heading, `- **Label:** value`\n// facts, then one fenced `## Title` section per piece of evidence. The generic\n// sections here read only common `Test` fields; node adapters contribute the\n// domain sections (a command, a CEL assertion, a recording) and extra menu items\n// through `TestNodeAdapter.copy`. Pure — no React, no clipboard — so every\n// payload is unit-testable as a string.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport type { Test } from \"./types\";\nimport { formatTestDuration, outcomeFor } from \"./status\";\n\n/** One `- **label:** value` line under the brief's heading. */\nexport type BriefFact = { label: string; value: string };\n\n/**\n * One `## title` block of the brief: fenced (tagged with `lang`) by default, or\n * inserted as-is when `markdown` — for lists and links that must stay live.\n */\nexport type BriefSection = { title: string; lang?: string; markdown?: boolean; body: string };\n\ntype CopyItemBase = { label: string; icon?: StaticIconComponent | string };\n\n/** A copy menu item: the text it copies, or why there is nothing to copy. */\nexport type CopyItem = (CopyItemBase & { value: string }) | (CopyItemBase & { reason: string });\n\nexport type CopySections = {\n facts?: BriefFact[];\n brief?: BriefSection[];\n items?: CopyItem[];\n};\n\n/** Generic sections rendered after every adapter section, so evidence reads before raw output. */\nconst OUTPUT_TITLES = new Set([\"stdout\", \"stderr\"]);\n\nfunction fact(label: string, value: string | undefined): BriefFact[] {\n return value ? [{ label, value }] : [];\n}\n\nfunction section(title: string, body: string | undefined, lang?: string): BriefSection[] {\n if (!body) return [];\n return [lang ? { title, lang, body } : { title, body }];\n}\n\nfunction nodeLocation(node: Test): string | undefined {\n if (!node.file) return undefined;\n return node.line ? `${node.file}:${node.line}` : node.file;\n}\n\nfunction errorBody(node: Test): string {\n const summary = node.failure_detail?.summary;\n const lines = [node.message, summary !== node.message ? summary : undefined];\n return lines.filter(Boolean).join(\"\\n\");\n}\n\nfunction expectationBody(node: Test): string {\n const failure = node.failure_detail;\n if (!failure) return \"\";\n return [\n failure.matcher && `matcher: ${failure.matcher}`,\n failure.expected && `expected: ${failure.expected}`,\n failure.actual && `actual: ${failure.actual}`,\n failure.location && `at: ${failure.location}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/** Sections every node gets, read from the common `Test` fields only. */\nexport function genericCopySections(node: Test): Required<CopySections> {\n const duration = node.duration ? formatTestDuration(node.duration) : undefined;\n return {\n facts: [\n ...fact(\"Result\", outcomeFor(node) ?? undefined),\n ...fact(\"Tool\", node.framework),\n ...fact(\"Location\", nodeLocation(node)),\n ...fact(\"Duration\", duration),\n ],\n brief: [\n ...section(\"Error\", errorBody(node)),\n ...section(\"Expectation\", expectationBody(node)),\n ...section(\"Stack\", node.failure_detail?.stack),\n ...section(\"stdout\", node.stdout),\n ...section(\"stderr\", node.stderr),\n ],\n items: [],\n };\n}\n\nfunction uniqueBy<T>(values: T[], key: (value: T) => string): T[] {\n const seen = new Set<string>();\n return values.filter((value) => {\n const k = key(value);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\n/** Concatenates sections in order, keeping the first fact/section/item per label or title. */\nexport function mergeCopySections(parts: CopySections[]): Required<CopySections> {\n return {\n facts: uniqueBy(\n parts.flatMap((p) => p.facts ?? []),\n (f) => f.label,\n ),\n brief: uniqueBy(\n parts.flatMap((p) => p.brief ?? []),\n (s) => s.title,\n ),\n items: uniqueBy(\n parts.flatMap((p) => p.items ?? []),\n (i) => i.label,\n ),\n };\n}\n\n// A fence one backtick longer than any run in the body, so captured output that\n// itself contains ``` cannot close the block early (CommonMark).\nfunction fence(body: string): string {\n const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));\n return \"`\".repeat(Math.max(3, longest + 1));\n}\n\n/** The Markdown brief: `# name`, the facts as bullets, then each non-empty section (fenced unless `markdown`). */\nexport function buildBrief(node: Test, sections: BriefSection[], facts: BriefFact[]): string {\n const lines = [`# ${node.name}`];\n if (facts.length > 0) lines.push(\"\", ...facts.map((f) => `- **${f.label}:** ${f.value}`));\n for (const s of sections) {\n if (!s.body) continue;\n lines.push(\"\", `## ${s.title}`, \"\");\n if (s.markdown) {\n lines.push(s.body);\n continue;\n }\n const marker = fence(s.body);\n lines.push(`${marker}${s.lang ?? \"\"}`, s.body, marker);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The primary \"Copy details\" payload: generic facts and error/expectation\n * sections, then the adapters' sections, then the captured stdout/stderr.\n */\nexport function buildNodeBrief(node: Test, adapter: CopySections): string {\n const generic = genericCopySections(node);\n const merged = mergeCopySections([\n { facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },\n adapter,\n { brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) },\n ]);\n return buildBrief(node, merged.brief, merged.facts);\n}\n\n/** \"Copy as JSON\": the node without its children subtree, 2-space indented. */\nexport function buildNodeJson(node: Test): string {\n const { children: _children, ...rest } = node;\n return JSON.stringify(rest, null, 2);\n}\n"],"names":[],"mappings":";AAiCA,MAAM,gBAAgB,oBAAI,IAAI,CAAC,UAAU,QAAQ,CAAC;AAElD,SAAS,KAAK,OAAe,OAAwC;AACnE,SAAO,QAAQ,CAAC,EAAE,OAAO,MAAA,CAAO,IAAI,CAAA;AACtC;AAEA,SAAS,QAAQ,OAAe,MAA0B,MAA+B;AACvF,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,SAAO,CAAC,OAAO,EAAE,OAAO,MAAM,SAAS,EAAE,OAAO,MAAM;AACxD;AAEA,SAAS,aAAa,MAAgC;AACpD,MAAI,CAAC,KAAK,KAAM,QAAO;AACvB,SAAO,KAAK,OAAO,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK;AACxD;AAEA,SAAS,UAAU,MAAoB;;AACrC,QAAM,WAAU,UAAK,mBAAL,mBAAqB;AACrC,QAAM,QAAQ,CAAC,KAAK,SAAS,YAAY,KAAK,UAAU,UAAU,MAAS;AAC3E,SAAO,MAAM,OAAO,OAAO,EAAE,KAAK,IAAI;AACxC;AAEA,SAAS,gBAAgB,MAAoB;AAC3C,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO;AAAA,IACL,QAAQ,WAAW,YAAY,QAAQ,OAAO;AAAA,IAC9C,QAAQ,YAAY,aAAa,QAAQ,QAAQ;AAAA,IACjD,QAAQ,UAAU,WAAW,QAAQ,MAAM;AAAA,IAC3C,QAAQ,YAAY,OAAO,QAAQ,QAAQ;AAAA,EAAA,EAE1C,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAGO,SAAS,oBAAoB,MAAoC;;AACtE,QAAM,WAAW,KAAK,WAAW,mBAAmB,KAAK,QAAQ,IAAI;AACrE,SAAO;AAAA,IACL,OAAO;AAAA,MACL,GAAG,KAAK,UAAU,WAAW,IAAI,KAAK,MAAS;AAAA,MAC/C,GAAG,KAAK,QAAQ,KAAK,SAAS;AAAA,MAC9B,GAAG,KAAK,YAAY,aAAa,IAAI,CAAC;AAAA,MACtC,GAAG,KAAK,YAAY,QAAQ;AAAA,IAAA;AAAA,IAE9B,OAAO;AAAA,MACL,GAAG,QAAQ,SAAS,UAAU,IAAI,CAAC;AAAA,MACnC,GAAG,QAAQ,eAAe,gBAAgB,IAAI,CAAC;AAAA,MAC/C,GAAG,QAAQ,UAAS,UAAK,mBAAL,mBAAqB,KAAK;AAAA,MAC9C,GAAG,QAAQ,UAAU,KAAK,MAAM;AAAA,MAChC,GAAG,QAAQ,UAAU,KAAK,MAAM;AAAA,IAAA;AAAA,IAElC,OAAO,CAAA;AAAA,EAAC;AAEZ;AAEA,SAAS,SAAY,QAAa,KAAgC;AAChE,QAAM,2BAAW,IAAA;AACjB,SAAO,OAAO,OAAO,CAAC,UAAU;AAC9B,UAAM,IAAI,IAAI,KAAK;AACnB,QAAI,KAAK,IAAI,CAAC,EAAG,QAAO;AACxB,SAAK,IAAI,CAAC;AACV,WAAO;AAAA,EACT,CAAC;AACH;AAGO,SAAS,kBAAkB,OAA+C;AAC/E,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA,CAAE;AAAA,MAClC,CAAC,MAAM,EAAE;AAAA,IAAA;AAAA,IAEX,OAAO;AAAA,MACL,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA,CAAE;AAAA,MAClC,CAAC,MAAM,EAAE;AAAA,IAAA;AAAA,IAEX,OAAO;AAAA,MACL,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA,CAAE;AAAA,MAClC,CAAC,MAAM,EAAE;AAAA,IAAA;AAAA,EACX;AAEJ;AAIA,SAAS,MAAM,MAAsB;AACnC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK,KAAK,CAAA,GAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;AACjF,SAAO,IAAI,OAAO,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;AAC5C;AAGO,SAAS,WAAW,MAAY,UAA0B,OAA4B;AAC3F,QAAM,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE;AAC/B,MAAI,MAAM,SAAS,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,EAAE,CAAC;AACxF,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,EAAE,KAAM;AACb,UAAM,KAAK,IAAI,MAAM,EAAE,KAAK,IAAI,EAAE;AAClC,QAAI,EAAE,UAAU;AACd,YAAM,KAAK,EAAE,IAAI;AACjB;AAAA,IACF;AACA,UAAM,SAAS,MAAM,EAAE,IAAI;AAC3B,UAAM,KAAK,GAAG,MAAM,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM;AAAA,EACvD;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,eAAe,MAAY,SAA+B;AACxE,QAAM,UAAU,oBAAoB,IAAI;AACxC,QAAM,SAAS,kBAAkB;AAAA,IAC/B,EAAE,OAAO,QAAQ,OAAO,OAAO,QAAQ,MAAM,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,KAAK,CAAC,EAAA;AAAA,IACtF;AAAA,IACA,EAAE,OAAO,QAAQ,MAAM,OAAO,CAAC,MAAM,cAAc,IAAI,EAAE,KAAK,CAAC,EAAA;AAAA,EAAE,CAClE;AACD,SAAO,WAAW,MAAM,OAAO,OAAO,OAAO,KAAK;AACpD;AAGO,SAAS,cAAc,MAAoB;AAChD,QAAM,EAAE,UAAU,WAAW,GAAG,SAAS;AACzC,SAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACrC;"}
@@ -3,12 +3,15 @@ export { TestTree } from './TestTree.js';
3
3
  export { TestTreeNode } from './TestTreeNode.js';
4
4
  export { TestDetailPanel } from './TestDetailPanel.js';
5
5
  export { TestFailureDetail, TestOutput, TestAttempts, } from './TestFailureDetail.js';
6
+ export { Expectation, type ExpectationProps } from './Expectation.js';
6
7
  export { TestRunSummary, type TestRunSummaryProps } from './TestRunSummary.js';
7
8
  export { TestFilterBar, type TestFilterBarProps } from './TestFilterBar.js';
8
9
  export { TestRunnerProvider, useTestRunner, type TestRunnerContext, } from './context.js';
9
- export { TestNodeAdapterRegistry, createTestRunnerRegistry, type TestNodeAdapter, type AdapterContext, type DetailTab, } from './adapter.js';
10
- export { type StatusCounts, type TestStatus, sum, sumNonTaskTests, aggregateStatusCounts, STATUS_LABELS, hasFailed, hasPending, testStatus, totalDuration, statusIconFor, statusToneFor, formatTestDuration, formatCount, humanizeName, collectFrameworks, collapseSingleChildChains, filterTests, } from './status.js';
11
- export { frameworkIcon } from './frameworkIcon.js';
10
+ export { TestNodeAdapterRegistry, createTestRunnerRegistry, type TestNodeAdapter, type AdapterContext, type DetailTab, type DetailAttempt, } from './adapter.js';
11
+ export { genericCopySections, mergeCopySections, buildBrief, buildNodeBrief, buildNodeJson, type BriefFact, type BriefSection, type CopyItem, type CopySections, } from './copy.js';
12
+ export { type StatusCounts, type TestStatus, sum, sumNonTaskTests, aggregateStatusCounts, STATUS_LABELS, hasFailed, hasPending, testStatus, totalDuration, outcomeFor, type TestOutcome, statusToneFor, formatTestDuration, formatCount, humanizeName, collectFrameworks, collapseSingleChildChains, filterTests, } from './status.js';
13
+ export { TEST_OUTCOMES, LINT_SEVERITIES, TEST_TOOLS, toolMark, toolKeyFor, type ResultMark, type LintSeverity, type ToolKind, type ToolMark, } from './marks.js';
14
+ export { OutcomeIcon, LintSeverityIcon, ToolIcon } from './MarkIcons.js';
12
15
  export { slugify, annotateRoutePaths, findNodeByRoutePath } from './routePath.js';
13
16
  export { type FilterMode, type FilterState, type TestFilters, emptyTestFilters, decodeFilterState, encodeFilterState, cycleFilterState, matchesFilterState, filterStateToRecord, recordToFilterState, } from './filterState.js';
14
17
  export type { Test, TestSummary, TestAttempt, FailureDetail, FailureKind, GoTestContext, GinkgoContext, FixtureContext, TaskContext, RunMeta, Snapshot, SnapshotGit, SnapshotStatus, } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,KAAK,WAAW,EAChB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,aAAa,EACb,eAAe,EACf,UAAU,EACV,QAAQ,EACR,UAAU,EACV,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const status = require("./status.cjs");
4
+ const UiInfo = require("../../icons/components/UiInfo.cjs");
5
+ const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
6
+ const UiCircleX = require("../../icons/components/UiCircleX.cjs");
7
+ const UiLoader = require("../../icons/components/UiLoader.cjs");
8
+ const UiCircleOutline = require("../../icons/components/UiCircleOutline.cjs");
9
+ const UiSkipForward = require("../../icons/components/UiSkipForward.cjs");
10
+ const UiPass = require("../../icons/components/UiPass.cjs");
11
+ const UiTimer = require("../../icons/components/UiTimer.cjs");
12
+ const UiProhibit = require("../../icons/components/UiProhibit.cjs");
13
+ const UiLogoReact = require("../../icons/components/UiLogoReact.cjs");
14
+ const UiCopy = require("../../icons/components/UiCopy.cjs");
15
+ const UiKey = require("../../icons/components/UiKey.cjs");
16
+ const UiLogoRuff = require("../../icons/components/UiLogoRuff.cjs");
17
+ const UiLogoPython = require("../../icons/components/UiLogoPython.cjs");
18
+ const UiLogoMarkdown = require("../../icons/components/UiLogoMarkdown.cjs");
19
+ const UiLogoTypescript = require("../../icons/components/UiLogoTypescript.cjs");
20
+ const UiLogoOxc = require("../../icons/components/UiLogoOxc.cjs");
21
+ const UiLogoEslint = require("../../icons/components/UiLogoEslint.cjs");
22
+ const UiLogoGo = require("../../icons/components/UiLogoGo.cjs");
23
+ const UiSealCheck = require("../../icons/components/UiSealCheck.cjs");
24
+ const UiCursorClick = require("../../icons/components/UiCursorClick.cjs");
25
+ const UiLogoPlaywright = require("../../icons/components/UiLogoPlaywright.cjs");
26
+ const UiGlobe = require("../../icons/components/UiGlobe.cjs");
27
+ const UiRobotAi = require("../../icons/components/UiRobotAi.cjs");
28
+ const UiChatDots = require("../../icons/components/UiChatDots.cjs");
29
+ const UiClipboardText = require("../../icons/components/UiClipboardText.cjs");
30
+ const UiServer = require("../../icons/components/UiServer.cjs");
31
+ const UiDatabase = require("../../icons/components/UiDatabase.cjs");
32
+ const UiSparkles = require("../../icons/components/UiSparkles.cjs");
33
+ const UiListChecks = require("../../icons/components/UiListChecks.cjs");
34
+ const UiBeaker = require("../../icons/components/UiBeaker.cjs");
35
+ const UiTerminal = require("../../icons/components/UiTerminal.cjs");
36
+ const UiLogoJest = require("../../icons/components/UiLogoJest.cjs");
37
+ const UiLogoVitest = require("../../icons/components/UiLogoVitest.cjs");
38
+ const LABEL = Object.fromEntries(status.STATUS_LABELS.map((s) => [s.key, s.label]));
39
+ const RED = "text-red-600 dark:text-red-400";
40
+ const AMBER = "text-amber-600 dark:text-amber-400";
41
+ const TEST_OUTCOMES = {
42
+ failed: { icon: UiCircleX.UiCircleX, label: LABEL.failed, className: RED },
43
+ errored: { icon: UiProhibit.UiProhibit, label: "Could not run", className: RED },
44
+ timedout: { icon: UiTimer.UiTimer, label: LABEL.timedout, className: AMBER },
45
+ warned: { icon: UiWarningTriangle.UiWarningTriangle, label: LABEL.warned, className: AMBER },
46
+ passed: {
47
+ icon: UiPass.UiPass,
48
+ label: LABEL.passed,
49
+ className: "text-emerald-600 dark:text-emerald-400"
50
+ },
51
+ skipped: { icon: UiSkipForward.UiSkipForward, label: LABEL.skipped, className: "text-slate-500" },
52
+ pending: {
53
+ icon: UiCircleOutline.UiCircleOutline,
54
+ label: LABEL.pending,
55
+ className: "text-slate-400 dark:text-slate-500"
56
+ },
57
+ running: {
58
+ icon: UiLoader.UiLoader,
59
+ label: LABEL.running,
60
+ className: "text-blue-600 dark:text-blue-400",
61
+ spin: true
62
+ }
63
+ };
64
+ const LINT_SEVERITIES = {
65
+ error: { ...TEST_OUTCOMES.failed, label: "Error" },
66
+ warning: { ...TEST_OUTCOMES.warned, label: "Warning" },
67
+ info: { icon: UiInfo.UiInfo, label: "Info", className: "text-sky-600 dark:text-sky-400" }
68
+ };
69
+ const GO = "text-[#00add8]";
70
+ const MARKDOWN = "text-foreground";
71
+ const MUTED = "text-muted-foreground";
72
+ const TEST_TOOLS = {
73
+ "go test": { icon: UiLogoGo.UiLogoGo, label: "go test", kind: "test", className: GO },
74
+ ginkgo: { icon: UiLogoGo.UiLogoGo, label: "Ginkgo", kind: "test", className: GO },
75
+ vitest: { icon: UiLogoVitest.UiLogoVitest, label: "Vitest", kind: "test", className: "text-[#6e9f18]" },
76
+ jest: { icon: UiLogoJest.UiLogoJest, label: "Jest", kind: "test", className: "text-[#c21325] dark:text-[#e5576a]" },
77
+ playwright: {
78
+ icon: UiLogoPlaywright.UiLogoPlaywright,
79
+ label: "Playwright",
80
+ kind: "test",
81
+ className: "text-[#2ead33]"
82
+ },
83
+ fixture: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "Markdown fixture", kind: "test", className: MARKDOWN },
84
+ task: { icon: UiTerminal.UiTerminal, label: "Task", kind: "runner", className: MUTED },
85
+ // Fixture step types (gavel fixtures FixtureResult.Type) and the
86
+ // "checklist" node verifyReportTests synthesizes for acceptance criteria.
87
+ exec: { icon: UiTerminal.UiTerminal, label: "Command", kind: "fixture", className: MUTED },
88
+ test: { icon: UiBeaker.UiBeaker, label: "Test step", kind: "fixture", className: MUTED },
89
+ lint: { icon: UiListChecks.UiListChecks, label: "Lint step", kind: "fixture", className: MUTED },
90
+ verify: {
91
+ icon: UiSparkles.UiSparkles,
92
+ label: "AI review",
93
+ kind: "fixture",
94
+ className: "text-violet-600 dark:text-violet-400"
95
+ },
96
+ query: { icon: UiDatabase.UiDatabase, label: "Query", kind: "fixture", className: MUTED },
97
+ // Typed step kinds (gavel fixtures/kind registry): the node's `framework`
98
+ // is the kind name. `ai` is the runner behind `verify` but is a prompt/CEL
99
+ // round-trip rather than an acceptance-criteria review, so it takes the
100
+ // same violet family with its own glyph and label.
101
+ services: { icon: UiServer.UiServer, label: "Services", kind: "fixture", className: MUTED },
102
+ todo: { icon: UiClipboardText.UiClipboardText, label: "TODO step", kind: "fixture", className: MUTED },
103
+ todo_prompt: { icon: UiChatDots.UiChatDots, label: "TODO prompt run", kind: "fixture", className: MUTED },
104
+ ai: {
105
+ icon: UiRobotAi.UiRobotAi,
106
+ label: "AI step",
107
+ kind: "fixture",
108
+ className: "text-violet-600 dark:text-violet-400"
109
+ },
110
+ browser: { icon: UiGlobe.UiGlobe, label: "Browser", kind: "fixture", className: MUTED },
111
+ // The fixture-step twin of the `playwright` test framework above; both
112
+ // arrive as framework "playwright", so toolKeyFor() picks this key when the
113
+ // node carries `detail.step`. Muted like every other fixture step, so the
114
+ // brand green stays on the spec results the framework reports.
115
+ "playwright-step": {
116
+ icon: UiLogoPlaywright.UiLogoPlaywright,
117
+ label: "Playwright step",
118
+ kind: "fixture",
119
+ className: MUTED
120
+ },
121
+ "agent-browser": { icon: UiCursorClick.UiCursorClick, label: "Agent browser", kind: "fixture", className: MUTED },
122
+ criterion: { icon: UiSealCheck.UiSealCheck, label: "Acceptance criterion", kind: "fixture", className: MUTED },
123
+ checklist: { icon: UiSealCheck.UiSealCheck, label: "Acceptance criteria", kind: "fixture", className: MUTED },
124
+ "golangci-lint": { icon: UiLogoGo.UiLogoGo, label: "golangci-lint", kind: "lint", className: GO },
125
+ eslint: {
126
+ icon: UiLogoEslint.UiLogoEslint,
127
+ label: "ESLint",
128
+ kind: "lint",
129
+ className: "text-[#4b32c3] dark:text-[#8080f2]"
130
+ },
131
+ oxlint: {
132
+ icon: UiLogoOxc.UiLogoOxc,
133
+ label: "oxlint",
134
+ kind: "lint",
135
+ className: "text-[#0891b2] dark:text-[#00f7f1]"
136
+ },
137
+ tsc: {
138
+ icon: UiLogoTypescript.UiLogoTypescript,
139
+ label: "TypeScript compiler",
140
+ kind: "lint",
141
+ className: "text-[#3178c6]"
142
+ },
143
+ markdownlint: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "markdownlint", kind: "lint", className: MARKDOWN },
144
+ vale: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "Vale (prose)", kind: "lint", className: MARKDOWN },
145
+ pyright: {
146
+ icon: UiLogoPython.UiLogoPython,
147
+ label: "Pyright",
148
+ kind: "lint",
149
+ className: "text-[#3776ab] dark:text-[#ffd43b]"
150
+ },
151
+ ruff: {
152
+ icon: UiLogoRuff.UiLogoRuff,
153
+ label: "Ruff",
154
+ kind: "lint",
155
+ className: "text-[#261230] dark:text-[#d7ff64]"
156
+ },
157
+ // A secret scanner's finding is about a credential, not a language.
158
+ betterleaks: { icon: UiKey.UiKey, label: "betterleaks (secrets)", kind: "lint", className: MUTED },
159
+ jscpd: { icon: UiCopy.UiCopy, label: "jscpd (duplicate code)", kind: "lint", className: MUTED },
160
+ reactdoctor: {
161
+ icon: UiLogoReact.UiLogoReact,
162
+ label: "React Doctor",
163
+ kind: "lint",
164
+ className: "text-[#0e7490] dark:text-[#61dafb]"
165
+ }
166
+ };
167
+ function toolMark(tool) {
168
+ return tool && TEST_TOOLS[tool] || null;
169
+ }
170
+ function hasStepInfo(detail) {
171
+ if (detail === null || typeof detail !== "object" || Array.isArray(detail)) return false;
172
+ const step = detail.step;
173
+ return step !== null && typeof step === "object" && !Array.isArray(step);
174
+ }
175
+ function toolKeyFor(node) {
176
+ if (node.framework === "playwright" && hasStepInfo(node.detail)) return "playwright-step";
177
+ return node.framework;
178
+ }
179
+ exports.LINT_SEVERITIES = LINT_SEVERITIES;
180
+ exports.TEST_OUTCOMES = TEST_OUTCOMES;
181
+ exports.TEST_TOOLS = TEST_TOOLS;
182
+ exports.toolKeyFor = toolKeyFor;
183
+ exports.toolMark = toolMark;
184
+ //# sourceMappingURL=marks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.cjs","sources":["../../../src/data/test-runner/marks.ts"],"sourcesContent":["// The shared iconography for test and lint results: what happened (outcome),\n// how bad a finding is (lint severity), and what produced it (tool).\n//\n// Every outcome has its own outline glyph, so a result never reads by colour\n// alone.\n// Tool marks are bundled Simple Icons brand glyphs (offline, no runtime icon\n// names), coloured per theme here because one brand hex can't hold up on both\n// light and dark surfaces.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport {\n UiCircleOutline,\n UiCircleX,\n UiBeaker,\n UiChatDots,\n UiClipboardText,\n UiCopy,\n UiCursorClick,\n UiDatabase,\n UiGlobe,\n UiInfo,\n UiKey,\n UiListChecks,\n UiLoader,\n UiLogoEslint,\n UiLogoGo,\n UiLogoJest,\n UiLogoMarkdown,\n UiLogoOxc,\n UiLogoPlaywright,\n UiLogoPython,\n UiLogoReact,\n UiLogoRuff,\n UiLogoTypescript,\n UiLogoVitest,\n UiPass,\n UiProhibit,\n UiRobotAi,\n UiSealCheck,\n UiServer,\n UiSkipForward,\n UiSparkles,\n UiTerminal,\n UiTimer,\n UiWarningTriangle,\n} from \"../../icons\";\nimport { STATUS_LABELS, type TestOutcome } from \"./status\";\n\nexport type { TestOutcome } from \"./status\";\n\nexport type ResultMark = {\n icon: StaticIconComponent;\n label: string;\n /** Text colour classes for light and dark themes. */\n className: string;\n spin?: boolean;\n};\n\nconst LABEL = Object.fromEntries(STATUS_LABELS.map((s) => [s.key, s.label]));\n\nconst RED = \"text-red-600 dark:text-red-400\";\nconst AMBER = \"text-amber-600 dark:text-amber-400\";\n\nexport const TEST_OUTCOMES: Record<TestOutcome, ResultMark> = {\n failed: { icon: UiCircleX, label: LABEL.failed!, className: RED },\n errored: { icon: UiProhibit, label: \"Could not run\", className: RED },\n timedout: { icon: UiTimer, label: LABEL.timedout!, className: AMBER },\n warned: { icon: UiWarningTriangle, label: LABEL.warned!, className: AMBER },\n passed: {\n icon: UiPass,\n label: LABEL.passed!,\n className: \"text-emerald-600 dark:text-emerald-400\",\n },\n skipped: { icon: UiSkipForward, label: LABEL.skipped!, className: \"text-slate-500\" },\n pending: {\n icon: UiCircleOutline,\n label: LABEL.pending!,\n className: \"text-slate-400 dark:text-slate-500\",\n },\n running: {\n icon: UiLoader,\n label: LABEL.running!,\n className: \"text-blue-600 dark:text-blue-400\",\n spin: true,\n },\n};\n\nexport type LintSeverity = \"error\" | \"warning\" | \"info\";\n\n/** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */\nexport const LINT_SEVERITIES: Record<LintSeverity, ResultMark> = {\n error: { ...TEST_OUTCOMES.failed, label: \"Error\" },\n warning: { ...TEST_OUTCOMES.warned, label: \"Warning\" },\n info: { icon: UiInfo, label: \"Info\", className: \"text-sky-600 dark:text-sky-400\" },\n};\n\nexport type ToolKind = \"test\" | \"lint\" | \"fixture\" | \"runner\";\n\nexport type ToolMark = {\n icon: StaticIconComponent;\n label: string;\n kind: ToolKind;\n className: string;\n};\n\nconst GO = \"text-[#00add8]\";\nconst MARKDOWN = \"text-foreground\";\nconst MUTED = \"text-muted-foreground\";\n\n/**\n * Keyed by the identifiers gavel reports: testrunner/parsers Framework values\n * and each linter's Name(). A tool without a mark of its own takes its\n * language's (golangci-lint → Go, pyright → Python).\n */\nexport const TEST_TOOLS: Record<string, ToolMark> = {\n \"go test\": { icon: UiLogoGo, label: \"go test\", kind: \"test\", className: GO },\n ginkgo: { icon: UiLogoGo, label: \"Ginkgo\", kind: \"test\", className: GO },\n vitest: { icon: UiLogoVitest, label: \"Vitest\", kind: \"test\", className: \"text-[#6e9f18]\" },\n jest: { icon: UiLogoJest, label: \"Jest\", kind: \"test\", className: \"text-[#c21325] dark:text-[#e5576a]\" },\n playwright: {\n icon: UiLogoPlaywright,\n label: \"Playwright\",\n kind: \"test\",\n className: \"text-[#2ead33]\",\n },\n fixture: { icon: UiLogoMarkdown, label: \"Markdown fixture\", kind: \"test\", className: MARKDOWN },\n task: { icon: UiTerminal, label: \"Task\", kind: \"runner\", className: MUTED },\n // Fixture step types (gavel fixtures FixtureResult.Type) and the\n // \"checklist\" node verifyReportTests synthesizes for acceptance criteria.\n exec: { icon: UiTerminal, label: \"Command\", kind: \"fixture\", className: MUTED },\n test: { icon: UiBeaker, label: \"Test step\", kind: \"fixture\", className: MUTED },\n lint: { icon: UiListChecks, label: \"Lint step\", kind: \"fixture\", className: MUTED },\n verify: {\n icon: UiSparkles,\n label: \"AI review\",\n kind: \"fixture\",\n className: \"text-violet-600 dark:text-violet-400\",\n },\n query: { icon: UiDatabase, label: \"Query\", kind: \"fixture\", className: MUTED },\n // Typed step kinds (gavel fixtures/kind registry): the node's `framework`\n // is the kind name. `ai` is the runner behind `verify` but is a prompt/CEL\n // round-trip rather than an acceptance-criteria review, so it takes the\n // same violet family with its own glyph and label.\n services: { icon: UiServer, label: \"Services\", kind: \"fixture\", className: MUTED },\n todo: { icon: UiClipboardText, label: \"TODO step\", kind: \"fixture\", className: MUTED },\n todo_prompt: { icon: UiChatDots, label: \"TODO prompt run\", kind: \"fixture\", className: MUTED },\n ai: {\n icon: UiRobotAi,\n label: \"AI step\",\n kind: \"fixture\",\n className: \"text-violet-600 dark:text-violet-400\",\n },\n browser: { icon: UiGlobe, label: \"Browser\", kind: \"fixture\", className: MUTED },\n // The fixture-step twin of the `playwright` test framework above; both\n // arrive as framework \"playwright\", so toolKeyFor() picks this key when the\n // node carries `detail.step`. Muted like every other fixture step, so the\n // brand green stays on the spec results the framework reports.\n \"playwright-step\": {\n icon: UiLogoPlaywright,\n label: \"Playwright step\",\n kind: \"fixture\",\n className: MUTED,\n },\n \"agent-browser\": { icon: UiCursorClick, label: \"Agent browser\", kind: \"fixture\", className: MUTED },\n criterion: { icon: UiSealCheck, label: \"Acceptance criterion\", kind: \"fixture\", className: MUTED },\n checklist: { icon: UiSealCheck, label: \"Acceptance criteria\", kind: \"fixture\", className: MUTED },\n \"golangci-lint\": { icon: UiLogoGo, label: \"golangci-lint\", kind: \"lint\", className: GO },\n eslint: {\n icon: UiLogoEslint,\n label: \"ESLint\",\n kind: \"lint\",\n className: \"text-[#4b32c3] dark:text-[#8080f2]\",\n },\n oxlint: {\n icon: UiLogoOxc,\n label: \"oxlint\",\n kind: \"lint\",\n className: \"text-[#0891b2] dark:text-[#00f7f1]\",\n },\n tsc: {\n icon: UiLogoTypescript,\n label: \"TypeScript compiler\",\n kind: \"lint\",\n className: \"text-[#3178c6]\",\n },\n markdownlint: { icon: UiLogoMarkdown, label: \"markdownlint\", kind: \"lint\", className: MARKDOWN },\n vale: { icon: UiLogoMarkdown, label: \"Vale (prose)\", kind: \"lint\", className: MARKDOWN },\n pyright: {\n icon: UiLogoPython,\n label: \"Pyright\",\n kind: \"lint\",\n className: \"text-[#3776ab] dark:text-[#ffd43b]\",\n },\n ruff: {\n icon: UiLogoRuff,\n label: \"Ruff\",\n kind: \"lint\",\n className: \"text-[#261230] dark:text-[#d7ff64]\",\n },\n // A secret scanner's finding is about a credential, not a language.\n betterleaks: { icon: UiKey, label: \"betterleaks (secrets)\", kind: \"lint\", className: MUTED },\n jscpd: { icon: UiCopy, label: \"jscpd (duplicate code)\", kind: \"lint\", className: MUTED },\n reactdoctor: {\n icon: UiLogoReact,\n label: \"React Doctor\",\n kind: \"lint\",\n className: \"text-[#0e7490] dark:text-[#61dafb]\",\n },\n};\n\n/** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */\nexport function toolMark(tool: string | undefined): ToolMark | null {\n return (tool && TEST_TOOLS[tool]) || null;\n}\n\nfunction hasStepInfo(detail: unknown): boolean {\n if (detail === null || typeof detail !== \"object\" || Array.isArray(detail)) return false;\n const step = (detail as Record<string, unknown>).step;\n return step !== null && typeof step === \"object\" && !Array.isArray(step);\n}\n\n/**\n * The TEST_TOOLS key for a node. A node's `framework` is the key, except that\n * \"playwright\" names both the test framework and the `playwright` fixture-step\n * kind: a node carrying `detail.step` (the fixture verifier's step id and\n * kind) is the step.\n */\nexport function toolKeyFor(node: { framework?: string | undefined; detail?: unknown }): string | undefined {\n if (node.framework === \"playwright\" && hasStepInfo(node.detail)) return \"playwright-step\";\n return node.framework;\n}\n\n"],"names":["STATUS_LABELS","UiCircleX","UiProhibit","UiTimer","UiWarningTriangle","UiPass","UiSkipForward","UiCircleOutline","UiLoader","UiInfo","UiLogoGo","UiLogoVitest","UiLogoJest","UiLogoPlaywright","UiLogoMarkdown","UiTerminal","UiBeaker","UiListChecks","UiSparkles","UiDatabase","UiServer","UiClipboardText","UiChatDots","UiRobotAi","UiGlobe","UiCursorClick","UiSealCheck","UiLogoEslint","UiLogoOxc","UiLogoTypescript","UiLogoPython","UiLogoRuff","UiKey","UiCopy","UiLogoReact"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { StaticIconComponent } from '../Icon.js';
2
+ import { TestOutcome } from './status.js';
3
+ export type { TestOutcome } from './status.js';
4
+ export type ResultMark = {
5
+ icon: StaticIconComponent;
6
+ label: string;
7
+ /** Text colour classes for light and dark themes. */
8
+ className: string;
9
+ spin?: boolean;
10
+ };
11
+ export declare const TEST_OUTCOMES: Record<TestOutcome, ResultMark>;
12
+ export type LintSeverity = "error" | "warning" | "info";
13
+ /** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */
14
+ export declare const LINT_SEVERITIES: Record<LintSeverity, ResultMark>;
15
+ export type ToolKind = "test" | "lint" | "fixture" | "runner";
16
+ export type ToolMark = {
17
+ icon: StaticIconComponent;
18
+ label: string;
19
+ kind: ToolKind;
20
+ className: string;
21
+ };
22
+ /**
23
+ * Keyed by the identifiers gavel reports: testrunner/parsers Framework values
24
+ * and each linter's Name(). A tool without a mark of its own takes its
25
+ * language's (golangci-lint → Go, pyright → Python).
26
+ */
27
+ export declare const TEST_TOOLS: Record<string, ToolMark>;
28
+ /** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */
29
+ export declare function toolMark(tool: string | undefined): ToolMark | null;
30
+ /**
31
+ * The TEST_TOOLS key for a node. A node's `framework` is the key, except that
32
+ * "playwright" names both the test framework and the `playwright` fixture-step
33
+ * kind: a node carrying `detail.step` (the fixture verifier's step id and
34
+ * kind) is the step.
35
+ */
36
+ export declare function toolKeyFor(node: {
37
+ framework?: string | undefined;
38
+ detail?: unknown;
39
+ }): string | undefined;
40
+ //# sourceMappingURL=marks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/marks.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAqCnD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAOF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,CAsBzD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,+GAA+G;AAC/G,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,CAI5D,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CA8F/C,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAElE;AAQD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAGzG"}