@adea-ai/ui 0.140.0 → 0.142.0

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 (455) hide show
  1. package/dist/components/composites/appearance-editor/appearance-editor.js +2 -2
  2. package/dist/components/composites/appearance-editor/appearance-editor.js.map +1 -1
  3. package/dist/components/composites/catalog-browser/catalog-browser-group.js +1 -1
  4. package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts +56 -0
  5. package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts.map +1 -0
  6. package/dist/components/composites/chain-of-thought/chain-of-thought.js +117 -0
  7. package/dist/components/composites/chain-of-thought/chain-of-thought.js.map +1 -0
  8. package/dist/components/composites/chain-of-thought/index.d.ts +2 -0
  9. package/dist/components/composites/chain-of-thought/index.d.ts.map +1 -0
  10. package/dist/components/composites/chain-of-thought/index.js +2 -0
  11. package/dist/components/composites/chat/chat.d.ts +67 -0
  12. package/dist/components/composites/chat/chat.d.ts.map +1 -0
  13. package/dist/components/composites/chat/chat.js +179 -0
  14. package/dist/components/composites/chat/chat.js.map +1 -0
  15. package/dist/components/composites/chat/index.d.ts +2 -0
  16. package/dist/components/composites/chat/index.d.ts.map +1 -0
  17. package/dist/components/composites/chat/index.js +2 -0
  18. package/dist/components/composites/checkpoint/checkpoint-model.d.ts +34 -0
  19. package/dist/components/composites/checkpoint/checkpoint-model.d.ts.map +1 -0
  20. package/dist/components/composites/checkpoint/checkpoint-model.js +48 -0
  21. package/dist/components/composites/checkpoint/checkpoint-model.js.map +1 -0
  22. package/dist/components/composites/checkpoint/checkpoint.d.ts +48 -0
  23. package/dist/components/composites/checkpoint/checkpoint.d.ts.map +1 -0
  24. package/dist/components/composites/checkpoint/checkpoint.js +160 -0
  25. package/dist/components/composites/checkpoint/checkpoint.js.map +1 -0
  26. package/dist/components/composites/checkpoint/index.d.ts +3 -0
  27. package/dist/components/composites/checkpoint/index.d.ts.map +1 -0
  28. package/dist/components/composites/checkpoint/index.js +3 -0
  29. package/dist/components/composites/confirmation/confirmation-model.d.ts +45 -0
  30. package/dist/components/composites/confirmation/confirmation-model.d.ts.map +1 -0
  31. package/dist/components/composites/confirmation/confirmation-model.js +51 -0
  32. package/dist/components/composites/confirmation/confirmation-model.js.map +1 -0
  33. package/dist/components/composites/confirmation/confirmation.d.ts +72 -0
  34. package/dist/components/composites/confirmation/confirmation.d.ts.map +1 -0
  35. package/dist/components/composites/confirmation/confirmation.js +300 -0
  36. package/dist/components/composites/confirmation/confirmation.js.map +1 -0
  37. package/dist/components/composites/confirmation/index.d.ts +3 -0
  38. package/dist/components/composites/confirmation/index.d.ts.map +1 -0
  39. package/dist/components/composites/confirmation/index.js +3 -0
  40. package/dist/components/composites/context/context-model.d.ts +69 -0
  41. package/dist/components/composites/context/context-model.d.ts.map +1 -0
  42. package/dist/components/composites/context/context-model.js +122 -0
  43. package/dist/components/composites/context/context-model.js.map +1 -0
  44. package/dist/components/composites/context/context.d.ts +38 -0
  45. package/dist/components/composites/context/context.d.ts.map +1 -0
  46. package/dist/components/composites/context/context.js +234 -0
  47. package/dist/components/composites/context/context.js.map +1 -0
  48. package/dist/components/composites/context/index.d.ts +3 -0
  49. package/dist/components/composites/context/index.d.ts.map +1 -0
  50. package/dist/components/composites/context/index.js +3 -0
  51. package/dist/components/composites/file-tree/build-file-tree.d.ts +138 -0
  52. package/dist/components/composites/file-tree/build-file-tree.d.ts.map +1 -0
  53. package/dist/components/composites/file-tree/build-file-tree.js +325 -0
  54. package/dist/components/composites/file-tree/build-file-tree.js.map +1 -0
  55. package/dist/components/composites/file-tree/file-tree.d.ts +74 -0
  56. package/dist/components/composites/file-tree/file-tree.d.ts.map +1 -0
  57. package/dist/components/composites/file-tree/file-tree.js +389 -0
  58. package/dist/components/composites/file-tree/file-tree.js.map +1 -0
  59. package/dist/components/composites/file-tree/index.d.ts +3 -0
  60. package/dist/components/composites/file-tree/index.d.ts.map +1 -0
  61. package/dist/components/composites/file-tree/index.js +3 -0
  62. package/dist/components/composites/inline-citation/citation.d.ts +37 -0
  63. package/dist/components/composites/inline-citation/citation.d.ts.map +1 -0
  64. package/dist/components/composites/inline-citation/citation.js +52 -0
  65. package/dist/components/composites/inline-citation/citation.js.map +1 -0
  66. package/dist/components/composites/inline-citation/index.d.ts +3 -0
  67. package/dist/components/composites/inline-citation/index.d.ts.map +1 -0
  68. package/dist/components/composites/inline-citation/index.js +3 -0
  69. package/dist/components/composites/inline-citation/inline-citation.d.ts +64 -0
  70. package/dist/components/composites/inline-citation/inline-citation.d.ts.map +1 -0
  71. package/dist/components/composites/inline-citation/inline-citation.js +272 -0
  72. package/dist/components/composites/inline-citation/inline-citation.js.map +1 -0
  73. package/dist/components/composites/message-scroller/index.d.ts +3 -0
  74. package/dist/components/composites/message-scroller/index.d.ts.map +1 -0
  75. package/dist/components/composites/message-scroller/index.js +3 -0
  76. package/dist/components/composites/message-scroller/message-scroller.d.ts +55 -0
  77. package/dist/components/composites/message-scroller/message-scroller.d.ts.map +1 -0
  78. package/dist/components/composites/message-scroller/message-scroller.js +201 -0
  79. package/dist/components/composites/message-scroller/message-scroller.js.map +1 -0
  80. package/dist/components/composites/message-scroller/scroll-anchor.d.ts +66 -0
  81. package/dist/components/composites/message-scroller/scroll-anchor.d.ts.map +1 -0
  82. package/dist/components/composites/message-scroller/scroll-anchor.js +122 -0
  83. package/dist/components/composites/message-scroller/scroll-anchor.js.map +1 -0
  84. package/dist/components/composites/model-selector/index.d.ts +3 -0
  85. package/dist/components/composites/model-selector/index.d.ts.map +1 -0
  86. package/dist/components/composites/model-selector/index.js +3 -0
  87. package/dist/components/composites/model-selector/model-selector.d.ts +55 -0
  88. package/dist/components/composites/model-selector/model-selector.d.ts.map +1 -0
  89. package/dist/components/composites/model-selector/model-selector.js +490 -0
  90. package/dist/components/composites/model-selector/model-selector.js.map +1 -0
  91. package/dist/components/composites/model-selector/models.d.ts +51 -0
  92. package/dist/components/composites/model-selector/models.d.ts.map +1 -0
  93. package/dist/components/composites/model-selector/models.js +71 -0
  94. package/dist/components/composites/model-selector/models.js.map +1 -0
  95. package/dist/components/composites/plan/index.d.ts +2 -0
  96. package/dist/components/composites/plan/index.d.ts.map +1 -0
  97. package/dist/components/composites/plan/index.js +2 -0
  98. package/dist/components/composites/plan/plan.d.ts +61 -0
  99. package/dist/components/composites/plan/plan.d.ts.map +1 -0
  100. package/dist/components/composites/plan/plan.js +130 -0
  101. package/dist/components/composites/plan/plan.js.map +1 -0
  102. package/dist/components/composites/queue/index.d.ts +2 -0
  103. package/dist/components/composites/queue/index.d.ts.map +1 -0
  104. package/dist/components/composites/queue/index.js +2 -0
  105. package/dist/components/composites/queue/queue.d.ts +77 -0
  106. package/dist/components/composites/queue/queue.d.ts.map +1 -0
  107. package/dist/components/composites/queue/queue.js +271 -0
  108. package/dist/components/composites/queue/queue.js.map +1 -0
  109. package/dist/components/composites/reasoning/index.d.ts +2 -0
  110. package/dist/components/composites/reasoning/index.d.ts.map +1 -0
  111. package/dist/components/composites/reasoning/index.js +2 -0
  112. package/dist/components/composites/reasoning/reasoning.d.ts +62 -0
  113. package/dist/components/composites/reasoning/reasoning.d.ts.map +1 -0
  114. package/dist/components/composites/reasoning/reasoning.js +156 -0
  115. package/dist/components/composites/reasoning/reasoning.js.map +1 -0
  116. package/dist/components/composites/sources/index.d.ts +3 -0
  117. package/dist/components/composites/sources/index.d.ts.map +1 -0
  118. package/dist/components/composites/sources/index.js +3 -0
  119. package/dist/components/composites/sources/source.d.ts +46 -0
  120. package/dist/components/composites/sources/source.d.ts.map +1 -0
  121. package/dist/components/composites/sources/source.js +74 -0
  122. package/dist/components/composites/sources/source.js.map +1 -0
  123. package/dist/components/composites/sources/sources.d.ts +45 -0
  124. package/dist/components/composites/sources/sources.d.ts.map +1 -0
  125. package/dist/components/composites/sources/sources.js +175 -0
  126. package/dist/components/composites/sources/sources.js.map +1 -0
  127. package/dist/components/composites/stack-trace/index.d.ts +3 -0
  128. package/dist/components/composites/stack-trace/index.d.ts.map +1 -0
  129. package/dist/components/composites/stack-trace/index.js +3 -0
  130. package/dist/components/composites/stack-trace/parse-stack-trace.d.ts +118 -0
  131. package/dist/components/composites/stack-trace/parse-stack-trace.d.ts.map +1 -0
  132. package/dist/components/composites/stack-trace/parse-stack-trace.js +376 -0
  133. package/dist/components/composites/stack-trace/parse-stack-trace.js.map +1 -0
  134. package/dist/components/composites/stack-trace/stack-trace.d.ts +63 -0
  135. package/dist/components/composites/stack-trace/stack-trace.d.ts.map +1 -0
  136. package/dist/components/composites/stack-trace/stack-trace.js +491 -0
  137. package/dist/components/composites/stack-trace/stack-trace.js.map +1 -0
  138. package/dist/components/composites/subagent/index.d.ts +2 -0
  139. package/dist/components/composites/subagent/index.d.ts.map +1 -0
  140. package/dist/components/composites/subagent/index.js +2 -0
  141. package/dist/components/composites/subagent/subagent.d.ts +55 -0
  142. package/dist/components/composites/subagent/subagent.d.ts.map +1 -0
  143. package/dist/components/composites/subagent/subagent.js +138 -0
  144. package/dist/components/composites/subagent/subagent.js.map +1 -0
  145. package/dist/components/composites/suggestion/index.d.ts +2 -0
  146. package/dist/components/composites/suggestion/index.d.ts.map +1 -0
  147. package/dist/components/composites/suggestion/index.js +2 -0
  148. package/dist/components/composites/suggestion/suggestion.d.ts +37 -0
  149. package/dist/components/composites/suggestion/suggestion.d.ts.map +1 -0
  150. package/dist/components/composites/suggestion/suggestion.js +100 -0
  151. package/dist/components/composites/suggestion/suggestion.js.map +1 -0
  152. package/dist/components/composites/task/index.d.ts +2 -0
  153. package/dist/components/composites/task/index.d.ts.map +1 -0
  154. package/dist/components/composites/task/index.js +2 -0
  155. package/dist/components/composites/task/task.d.ts +96 -0
  156. package/dist/components/composites/task/task.d.ts.map +1 -0
  157. package/dist/components/composites/task/task.js +311 -0
  158. package/dist/components/composites/task/task.js.map +1 -0
  159. package/dist/components/composites/terminal/ansi.d.ts +101 -0
  160. package/dist/components/composites/terminal/ansi.d.ts.map +1 -0
  161. package/dist/components/composites/terminal/ansi.js +544 -0
  162. package/dist/components/composites/terminal/ansi.js.map +1 -0
  163. package/dist/components/composites/terminal/index.d.ts +4 -0
  164. package/dist/components/composites/terminal/index.d.ts.map +1 -0
  165. package/dist/components/composites/terminal/index.js +4 -0
  166. package/dist/components/composites/terminal/terminal-model.d.ts +63 -0
  167. package/dist/components/composites/terminal/terminal-model.d.ts.map +1 -0
  168. package/dist/components/composites/terminal/terminal-model.js +69 -0
  169. package/dist/components/composites/terminal/terminal-model.js.map +1 -0
  170. package/dist/components/composites/terminal/terminal.d.ts +88 -0
  171. package/dist/components/composites/terminal/terminal.d.ts.map +1 -0
  172. package/dist/components/composites/terminal/terminal.js +500 -0
  173. package/dist/components/composites/terminal/terminal.js.map +1 -0
  174. package/dist/components/composites/test-results/index.d.ts +3 -0
  175. package/dist/components/composites/test-results/index.d.ts.map +1 -0
  176. package/dist/components/composites/test-results/index.js +3 -0
  177. package/dist/components/composites/test-results/test-results-model.d.ts +154 -0
  178. package/dist/components/composites/test-results/test-results-model.d.ts.map +1 -0
  179. package/dist/components/composites/test-results/test-results-model.js +252 -0
  180. package/dist/components/composites/test-results/test-results-model.js.map +1 -0
  181. package/dist/components/composites/test-results/test-results.d.ts +60 -0
  182. package/dist/components/composites/test-results/test-results.d.ts.map +1 -0
  183. package/dist/components/composites/test-results/test-results.js +631 -0
  184. package/dist/components/composites/test-results/test-results.js.map +1 -0
  185. package/dist/components/composites/tool/format-tool-value.d.ts +37 -0
  186. package/dist/components/composites/tool/format-tool-value.d.ts.map +1 -0
  187. package/dist/components/composites/tool/format-tool-value.js +135 -0
  188. package/dist/components/composites/tool/format-tool-value.js.map +1 -0
  189. package/dist/components/composites/tool/index.d.ts +3 -0
  190. package/dist/components/composites/tool/index.d.ts.map +1 -0
  191. package/dist/components/composites/tool/index.js +3 -0
  192. package/dist/components/composites/tool/tool.d.ts +69 -0
  193. package/dist/components/composites/tool/tool.d.ts.map +1 -0
  194. package/dist/components/composites/tool/tool.js +214 -0
  195. package/dist/components/composites/tool/tool.js.map +1 -0
  196. package/dist/components/composites/update-dialog/update-dialog.js +1 -1
  197. package/dist/components/conversation/conversation-surface.d.ts +7 -0
  198. package/dist/components/conversation/conversation-surface.d.ts.map +1 -1
  199. package/dist/components/conversation/conversation-surface.js +2 -0
  200. package/dist/components/conversation/conversation-surface.js.map +1 -1
  201. package/dist/components/conversation/scroll-follow-core.d.ts +24 -0
  202. package/dist/components/conversation/scroll-follow-core.d.ts.map +1 -1
  203. package/dist/components/conversation/scroll-follow-core.js +23 -1
  204. package/dist/components/conversation/scroll-follow-core.js.map +1 -1
  205. package/dist/components/conversation/scroll-follow.d.ts +3 -0
  206. package/dist/components/conversation/scroll-follow.d.ts.map +1 -1
  207. package/dist/components/conversation/scroll-follow.js +80 -1
  208. package/dist/components/conversation/scroll-follow.js.map +1 -1
  209. package/dist/components/ui/attachment/attachment.d.ts +58 -0
  210. package/dist/components/ui/attachment/attachment.d.ts.map +1 -0
  211. package/dist/components/ui/attachment/attachment.js +279 -0
  212. package/dist/components/ui/attachment/attachment.js.map +1 -0
  213. package/dist/components/ui/attachment/index.d.ts +2 -0
  214. package/dist/components/ui/attachment/index.d.ts.map +1 -0
  215. package/dist/components/ui/attachment/index.js +2 -0
  216. package/dist/components/ui/badge/badge.d.ts +1 -1
  217. package/dist/components/ui/bubble/bubble.d.ts +33 -0
  218. package/dist/components/ui/bubble/bubble.d.ts.map +1 -0
  219. package/dist/components/ui/bubble/bubble.js +95 -0
  220. package/dist/components/ui/bubble/bubble.js.map +1 -0
  221. package/dist/components/ui/bubble/index.d.ts +2 -0
  222. package/dist/components/ui/bubble/index.d.ts.map +1 -0
  223. package/dist/components/ui/bubble/index.js +2 -0
  224. package/dist/components/ui/button/button.d.ts +1 -1
  225. package/dist/components/ui/code-block/code-block.d.ts +56 -3
  226. package/dist/components/ui/code-block/code-block.d.ts.map +1 -1
  227. package/dist/components/ui/code-block/code-block.js +231 -50
  228. package/dist/components/ui/code-block/code-block.js.map +1 -1
  229. package/dist/components/ui/code-block/index.d.ts +1 -1
  230. package/dist/components/ui/code-block/index.d.ts.map +1 -1
  231. package/dist/components/ui/code-block/index.js +2 -2
  232. package/dist/components/ui/field/number-field.d.ts +21 -4
  233. package/dist/components/ui/field/number-field.d.ts.map +1 -1
  234. package/dist/components/ui/field/number-field.js +22 -11
  235. package/dist/components/ui/field/number-field.js.map +1 -1
  236. package/dist/components/ui/marker/index.d.ts +2 -0
  237. package/dist/components/ui/marker/index.d.ts.map +1 -0
  238. package/dist/components/ui/marker/index.js +2 -0
  239. package/dist/components/ui/marker/marker.d.ts +35 -0
  240. package/dist/components/ui/marker/marker.d.ts.map +1 -0
  241. package/dist/components/ui/marker/marker.js +123 -0
  242. package/dist/components/ui/marker/marker.js.map +1 -0
  243. package/dist/components/ui/message/cite-ranges.d.ts +42 -0
  244. package/dist/components/ui/message/cite-ranges.d.ts.map +1 -0
  245. package/dist/components/ui/message/cite-ranges.js +105 -0
  246. package/dist/components/ui/message/cite-ranges.js.map +1 -0
  247. package/dist/components/ui/message/index.d.ts +4 -0
  248. package/dist/components/ui/message/index.d.ts.map +1 -0
  249. package/dist/components/ui/message/index.js +4 -0
  250. package/dist/components/ui/message/message.d.ts +95 -0
  251. package/dist/components/ui/message/message.d.ts.map +1 -0
  252. package/dist/components/ui/message/message.js +443 -0
  253. package/dist/components/ui/message/message.js.map +1 -0
  254. package/dist/components/ui/message/parse-message-text.d.ts +93 -0
  255. package/dist/components/ui/message/parse-message-text.d.ts.map +1 -0
  256. package/dist/components/ui/message/parse-message-text.js +365 -0
  257. package/dist/components/ui/message/parse-message-text.js.map +1 -0
  258. package/dist/components/ui/questionnaire/index.d.ts +2 -0
  259. package/dist/components/ui/questionnaire/index.d.ts.map +1 -0
  260. package/dist/components/ui/questionnaire/index.js +2 -0
  261. package/dist/components/ui/questionnaire/questionnaire.d.ts +83 -0
  262. package/dist/components/ui/questionnaire/questionnaire.d.ts.map +1 -0
  263. package/dist/components/ui/questionnaire/questionnaire.js +470 -0
  264. package/dist/components/ui/questionnaire/questionnaire.js.map +1 -0
  265. package/dist/components/ui/status-chip/status-chip.d.ts +1 -1
  266. package/dist/components/ui/switch/switch.js +11 -11
  267. package/dist/components/ui/switch/switch.js.map +1 -1
  268. package/dist/components/ui/trace/index.d.ts +2 -0
  269. package/dist/components/ui/trace/index.d.ts.map +1 -0
  270. package/dist/components/ui/trace/index.js +2 -0
  271. package/dist/components/ui/trace/trace.d.ts +72 -0
  272. package/dist/components/ui/trace/trace.d.ts.map +1 -0
  273. package/dist/components/ui/trace/trace.js +340 -0
  274. package/dist/components/ui/trace/trace.js.map +1 -0
  275. package/dist/index.d.ts +26 -0
  276. package/dist/index.d.ts.map +1 -1
  277. package/dist/index.js +46 -5
  278. package/dist/r/attachment.json +25 -0
  279. package/dist/r/bubble.json +22 -0
  280. package/dist/r/chain-of-thought.json +26 -0
  281. package/dist/r/chat.json +24 -0
  282. package/dist/r/checkpoint.json +35 -0
  283. package/dist/r/confirmation.json +34 -0
  284. package/dist/r/context.json +33 -0
  285. package/dist/r/file-tree.json +32 -0
  286. package/dist/r/inline-citation.json +35 -0
  287. package/dist/r/marker.json +22 -0
  288. package/dist/r/message-scroller.json +31 -0
  289. package/dist/r/message.json +33 -0
  290. package/dist/r/model-selector.json +34 -0
  291. package/dist/r/plan.json +26 -0
  292. package/dist/r/questionnaire.json +28 -0
  293. package/dist/r/queue.json +26 -0
  294. package/dist/r/reasoning.json +26 -0
  295. package/dist/r/registry.json +811 -52
  296. package/dist/r/sources.json +32 -0
  297. package/dist/r/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
  298. package/dist/r/src/components/composites/chain-of-thought/index.ts +11 -0
  299. package/dist/r/src/components/composites/chat/chat.tsx +190 -0
  300. package/dist/r/src/components/composites/chat/index.ts +11 -0
  301. package/dist/r/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
  302. package/dist/r/src/components/composites/checkpoint/checkpoint.tsx +214 -0
  303. package/dist/r/src/components/composites/checkpoint/index.ts +8 -0
  304. package/dist/r/src/components/composites/confirmation/confirmation-model.ts +83 -0
  305. package/dist/r/src/components/composites/confirmation/confirmation.tsx +311 -0
  306. package/dist/r/src/components/composites/confirmation/index.ts +9 -0
  307. package/dist/r/src/components/composites/context/context-model.ts +168 -0
  308. package/dist/r/src/components/composites/context/context.tsx +187 -0
  309. package/dist/r/src/components/composites/context/index.ts +18 -0
  310. package/dist/r/src/components/composites/file-tree/build-file-tree.ts +456 -0
  311. package/dist/r/src/components/composites/file-tree/file-tree.tsx +405 -0
  312. package/dist/r/src/components/composites/file-tree/index.ts +25 -0
  313. package/dist/r/src/components/composites/inline-citation/citation.ts +78 -0
  314. package/dist/r/src/components/composites/inline-citation/index.ts +9 -0
  315. package/dist/r/src/components/composites/inline-citation/inline-citation.tsx +285 -0
  316. package/dist/r/src/components/composites/message-scroller/index.ts +2 -0
  317. package/dist/r/src/components/composites/message-scroller/message-scroller.tsx +301 -0
  318. package/dist/r/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
  319. package/dist/r/src/components/composites/model-selector/index.ts +14 -0
  320. package/dist/r/src/components/composites/model-selector/model-selector.tsx +420 -0
  321. package/dist/r/src/components/composites/model-selector/models.ts +103 -0
  322. package/dist/r/src/components/composites/plan/index.ts +1 -0
  323. package/dist/r/src/components/composites/plan/plan.tsx +155 -0
  324. package/dist/r/src/components/composites/queue/index.ts +10 -0
  325. package/dist/r/src/components/composites/queue/queue.tsx +264 -0
  326. package/dist/r/src/components/composites/reasoning/index.ts +1 -0
  327. package/dist/r/src/components/composites/reasoning/reasoning.tsx +176 -0
  328. package/dist/r/src/components/composites/sources/index.ts +11 -0
  329. package/dist/r/src/components/composites/sources/source.ts +116 -0
  330. package/dist/r/src/components/composites/sources/sources.tsx +163 -0
  331. package/dist/r/src/components/composites/stack-trace/index.ts +19 -0
  332. package/dist/r/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
  333. package/dist/r/src/components/composites/stack-trace/stack-trace.tsx +395 -0
  334. package/dist/r/src/components/composites/subagent/index.ts +1 -0
  335. package/dist/r/src/components/composites/subagent/subagent.tsx +159 -0
  336. package/dist/r/src/components/composites/suggestion/index.ts +1 -0
  337. package/dist/r/src/components/composites/suggestion/suggestion.tsx +140 -0
  338. package/dist/r/src/components/composites/task/index.ts +14 -0
  339. package/dist/r/src/components/composites/task/task.tsx +317 -0
  340. package/dist/r/src/components/composites/terminal/ansi.ts +674 -0
  341. package/dist/r/src/components/composites/terminal/index.ts +20 -0
  342. package/dist/r/src/components/composites/terminal/terminal-model.ts +111 -0
  343. package/dist/r/src/components/composites/terminal/terminal.tsx +574 -0
  344. package/dist/r/src/components/composites/test-results/index.ts +20 -0
  345. package/dist/r/src/components/composites/test-results/test-results-model.ts +368 -0
  346. package/dist/r/src/components/composites/test-results/test-results.tsx +586 -0
  347. package/dist/r/src/components/composites/tool/format-tool-value.ts +221 -0
  348. package/dist/r/src/components/composites/tool/index.ts +2 -0
  349. package/dist/r/src/components/composites/tool/tool.tsx +228 -0
  350. package/dist/r/src/components/conversation/conversation-surface.tsx +9 -0
  351. package/dist/r/src/components/conversation/scroll-follow-core.ts +31 -0
  352. package/dist/r/src/components/conversation/scroll-follow.ts +92 -0
  353. package/dist/r/src/components/ui/attachment/attachment.tsx +282 -0
  354. package/dist/r/src/components/ui/attachment/index.ts +10 -0
  355. package/dist/r/src/components/ui/bubble/bubble.tsx +86 -0
  356. package/dist/r/src/components/ui/bubble/index.ts +1 -0
  357. package/dist/r/src/components/ui/code-block/code-block.tsx +256 -26
  358. package/dist/r/src/components/ui/code-block/index.ts +9 -1
  359. package/dist/r/src/components/ui/field/number-field.tsx +51 -14
  360. package/dist/r/src/components/ui/marker/index.ts +1 -0
  361. package/dist/r/src/components/ui/marker/marker.tsx +90 -0
  362. package/dist/r/src/components/ui/message/cite-ranges.ts +144 -0
  363. package/dist/r/src/components/ui/message/index.ts +23 -0
  364. package/dist/r/src/components/ui/message/message.tsx +434 -0
  365. package/dist/r/src/components/ui/message/parse-message-text.ts +450 -0
  366. package/dist/r/src/components/ui/questionnaire/index.ts +10 -0
  367. package/dist/r/src/components/ui/questionnaire/questionnaire.tsx +446 -0
  368. package/dist/r/src/components/ui/trace/index.ts +9 -0
  369. package/dist/r/src/components/ui/trace/trace.tsx +334 -0
  370. package/dist/r/src/styles/base.css +34 -0
  371. package/dist/r/stack-trace.json +32 -0
  372. package/dist/r/subagent.json +27 -0
  373. package/dist/r/suggestion.json +24 -0
  374. package/dist/r/task.json +28 -0
  375. package/dist/r/terminal.json +35 -0
  376. package/dist/r/test-results.json +33 -0
  377. package/dist/r/tool.json +31 -0
  378. package/dist/r/trace.json +25 -0
  379. package/package.json +6 -3
  380. package/registry.json +811 -52
  381. package/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
  382. package/src/components/composites/chain-of-thought/index.ts +11 -0
  383. package/src/components/composites/chat/chat.tsx +190 -0
  384. package/src/components/composites/chat/index.ts +11 -0
  385. package/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
  386. package/src/components/composites/checkpoint/checkpoint.tsx +214 -0
  387. package/src/components/composites/checkpoint/index.ts +8 -0
  388. package/src/components/composites/confirmation/confirmation-model.ts +83 -0
  389. package/src/components/composites/confirmation/confirmation.tsx +311 -0
  390. package/src/components/composites/confirmation/index.ts +9 -0
  391. package/src/components/composites/context/context-model.ts +168 -0
  392. package/src/components/composites/context/context.tsx +187 -0
  393. package/src/components/composites/context/index.ts +18 -0
  394. package/src/components/composites/file-tree/build-file-tree.ts +456 -0
  395. package/src/components/composites/file-tree/file-tree.tsx +405 -0
  396. package/src/components/composites/file-tree/index.ts +25 -0
  397. package/src/components/composites/inline-citation/citation.ts +78 -0
  398. package/src/components/composites/inline-citation/index.ts +9 -0
  399. package/src/components/composites/inline-citation/inline-citation.tsx +285 -0
  400. package/src/components/composites/message-scroller/index.ts +2 -0
  401. package/src/components/composites/message-scroller/message-scroller.tsx +301 -0
  402. package/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
  403. package/src/components/composites/model-selector/index.ts +14 -0
  404. package/src/components/composites/model-selector/model-selector.tsx +420 -0
  405. package/src/components/composites/model-selector/models.ts +103 -0
  406. package/src/components/composites/plan/index.ts +1 -0
  407. package/src/components/composites/plan/plan.tsx +155 -0
  408. package/src/components/composites/queue/index.ts +10 -0
  409. package/src/components/composites/queue/queue.tsx +264 -0
  410. package/src/components/composites/reasoning/index.ts +1 -0
  411. package/src/components/composites/reasoning/reasoning.tsx +176 -0
  412. package/src/components/composites/sources/index.ts +11 -0
  413. package/src/components/composites/sources/source.ts +116 -0
  414. package/src/components/composites/sources/sources.tsx +163 -0
  415. package/src/components/composites/stack-trace/index.ts +19 -0
  416. package/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
  417. package/src/components/composites/stack-trace/stack-trace.tsx +395 -0
  418. package/src/components/composites/subagent/index.ts +1 -0
  419. package/src/components/composites/subagent/subagent.tsx +159 -0
  420. package/src/components/composites/suggestion/index.ts +1 -0
  421. package/src/components/composites/suggestion/suggestion.tsx +140 -0
  422. package/src/components/composites/task/index.ts +14 -0
  423. package/src/components/composites/task/task.tsx +317 -0
  424. package/src/components/composites/terminal/ansi.ts +674 -0
  425. package/src/components/composites/terminal/index.ts +20 -0
  426. package/src/components/composites/terminal/terminal-model.ts +111 -0
  427. package/src/components/composites/terminal/terminal.tsx +574 -0
  428. package/src/components/composites/test-results/index.ts +20 -0
  429. package/src/components/composites/test-results/test-results-model.ts +368 -0
  430. package/src/components/composites/test-results/test-results.tsx +586 -0
  431. package/src/components/composites/tool/format-tool-value.ts +221 -0
  432. package/src/components/composites/tool/index.ts +2 -0
  433. package/src/components/composites/tool/tool.tsx +228 -0
  434. package/src/components/conversation/conversation-surface.tsx +9 -0
  435. package/src/components/conversation/scroll-follow-core.ts +31 -0
  436. package/src/components/conversation/scroll-follow.ts +92 -0
  437. package/src/components/ui/attachment/attachment.tsx +282 -0
  438. package/src/components/ui/attachment/index.ts +10 -0
  439. package/src/components/ui/bubble/bubble.tsx +86 -0
  440. package/src/components/ui/bubble/index.ts +1 -0
  441. package/src/components/ui/code-block/code-block.tsx +256 -26
  442. package/src/components/ui/code-block/index.ts +9 -1
  443. package/src/components/ui/field/number-field.tsx +51 -14
  444. package/src/components/ui/marker/index.ts +1 -0
  445. package/src/components/ui/marker/marker.tsx +90 -0
  446. package/src/components/ui/message/cite-ranges.ts +144 -0
  447. package/src/components/ui/message/index.ts +23 -0
  448. package/src/components/ui/message/message.tsx +434 -0
  449. package/src/components/ui/message/parse-message-text.ts +450 -0
  450. package/src/components/ui/questionnaire/index.ts +10 -0
  451. package/src/components/ui/questionnaire/questionnaire.tsx +446 -0
  452. package/src/components/ui/trace/index.ts +9 -0
  453. package/src/components/ui/trace/trace.tsx +334 -0
  454. package/src/index.ts +26 -0
  455. package/src/styles/base.css +34 -0
@@ -0,0 +1,20 @@
1
+ export { TestResults, TEST_RESULTS_LIST_LIMIT, type TestResultsProps } from './test-results'
2
+ export {
3
+ describeCount,
4
+ firstFailureKey,
5
+ formatDuration as formatTestDuration,
6
+ listedCounts,
7
+ reconcileCounts,
8
+ suiteKey,
9
+ suiteState,
10
+ testKey,
11
+ type CountLine,
12
+ type ListedCounts,
13
+ type RunCounts,
14
+ type SuiteState,
15
+ type TestCase,
16
+ type TestCaseStatus,
17
+ type TestOutcome,
18
+ type TestSuite,
19
+ type TestSummary,
20
+ } from './test-results-model'
@@ -0,0 +1,368 @@
1
+ /**
2
+ * The test run's pure rules: what the listed tests add up to, how that compares
3
+ * with the counts the host reported, and how a duration is said.
4
+ *
5
+ * The one rule that shapes everything here is that a count is a claim. There are
6
+ * two honest sources for one — the host's own tally (`summary`), and the tests it
7
+ * chose to list — and they are allowed to disagree: a host may list only the
8
+ * failures, a runner may count tests it did not stream, a suite may have been cut
9
+ * short. So nothing is silently recomputed. A supplied count is shown as given; if
10
+ * the tests listed do not add up to it, the listed number is shown beside it; and
11
+ * when no summary was supplied, the counts that are shown are labelled as coming
12
+ * from the tests listed, not presented as the run's totals.
13
+ */
14
+
15
+ export type TestOutcome = 'passed' | 'failed' | 'skipped'
16
+ /** `running` and `pending` are states of a test that has no outcome yet; they are not counted. */
17
+ export type TestCaseStatus = TestOutcome | 'running' | 'pending'
18
+
19
+ export type TestCase = Readonly<{
20
+ /** Stable identity for keyed rendering. Defaults to the position. */
21
+ id?: string
22
+ name: string
23
+ /** Absent means the host did not say; the test is listed and nothing is claimed. */
24
+ status?: TestCaseStatus
25
+ durationMs?: number
26
+ /** The failure message, as text. */
27
+ message?: string
28
+ /** A stack trace for `StackTrace` to read. */
29
+ stack?: string
30
+ /** A unified diff of expected against actual for `DiffBlock`. */
31
+ diff?: string
32
+ }>
33
+
34
+ export type TestSuite = Readonly<{
35
+ id?: string
36
+ name: string
37
+ /** The file the suite lives in, shown as text. */
38
+ file?: string
39
+ durationMs?: number
40
+ tests?: readonly TestCase[]
41
+ suites?: readonly TestSuite[]
42
+ }>
43
+
44
+ /** The host's own tally. Every field is optional; only supplied ones are shown. */
45
+ export type TestSummary = Readonly<{
46
+ passed?: number
47
+ failed?: number
48
+ skipped?: number
49
+ total?: number
50
+ durationMs?: number
51
+ }>
52
+
53
+ export type ListedCounts = Readonly<{
54
+ passed: number
55
+ failed: number
56
+ skipped: number
57
+ running: number
58
+ pending: number
59
+ /** Tests listed with no status. */
60
+ unknown: number
61
+ /** Every test listed, whatever its status. */
62
+ total: number
63
+ }>
64
+
65
+ const empty: ListedCounts = {
66
+ passed: 0,
67
+ failed: 0,
68
+ skipped: 0,
69
+ running: 0,
70
+ pending: 0,
71
+ unknown: 0,
72
+ total: 0,
73
+ }
74
+
75
+ const KNOWN_STATUSES: ReadonlySet<string> = new Set([
76
+ 'passed',
77
+ 'failed',
78
+ 'skipped',
79
+ 'running',
80
+ 'pending',
81
+ ])
82
+
83
+ /** Count the tests in a list of suites, at any depth. Iterative: suites come from a host. */
84
+ export function listedCounts(suites: readonly TestSuite[]): ListedCounts {
85
+ const counts = { ...empty }
86
+ const stack = [...suites]
87
+ while (stack.length > 0) {
88
+ const suite = stack.pop()!
89
+ for (const test of suite.tests ?? []) {
90
+ counts.total += 1
91
+ // A status the host invented is as good as none.
92
+ if (test.status !== undefined && KNOWN_STATUSES.has(test.status)) counts[test.status] += 1
93
+ else counts.unknown += 1
94
+ }
95
+ for (const child of suite.suites ?? []) stack.push(child)
96
+ }
97
+ return counts
98
+ }
99
+
100
+ export type CountLine = Readonly<{
101
+ outcome: TestOutcome
102
+ /** The number to show: the host's if it gave one, otherwise the listed one. */
103
+ count: number
104
+ /** How many tests of this outcome are listed. */
105
+ listed: number
106
+ /** The host gave a count and the list does not agree with it. */
107
+ differs: boolean
108
+ }>
109
+
110
+ export type RunCounts = Readonly<{
111
+ /** Whose numbers these are. `listed` must be labelled as such. */
112
+ basis: 'reported' | 'listed'
113
+ lines: readonly CountLine[]
114
+ /** The host's total, when supplied. */
115
+ reportedTotal?: number
116
+ /** The reported total, when the host gave one and the list disagrees. */
117
+ totalNote?: Readonly<{ reported: number; listed: number }>
118
+ }>
119
+
120
+ function validCount(value: unknown): value is number {
121
+ return typeof value === 'number' && Number.isInteger(value) && value >= 0
122
+ }
123
+
124
+ const OUTCOMES: readonly TestOutcome[] = ['failed', 'passed', 'skipped']
125
+
126
+ /**
127
+ * Decide which numbers to show.
128
+ *
129
+ * With a summary: exactly the counts it supplied, as given. `differs` is set
130
+ * when tests are listed at all and the listed number for that outcome is not the
131
+ * supplied one — a host that lists only failures will see "40 passed (0 listed)",
132
+ * which is true and tells the reader the list is partial. Without a summary: the
133
+ * outcomes that occur among the listed tests, with `basis: 'listed'`.
134
+ */
135
+ export function reconcileCounts(summary: TestSummary | undefined, listed: ListedCounts): RunCounts {
136
+ const supplied = OUTCOMES.filter((outcome) => validCount(summary?.[outcome]))
137
+ const hasTotal = validCount(summary?.total)
138
+
139
+ if (summary && (supplied.length > 0 || hasTotal)) {
140
+ const lines: CountLine[] = supplied.map((outcome) => {
141
+ const count = summary[outcome] as number
142
+ return {
143
+ outcome,
144
+ count,
145
+ listed: listed[outcome],
146
+ differs: listed.total > 0 && listed[outcome] !== count,
147
+ }
148
+ })
149
+ const totalNote =
150
+ hasTotal && listed.total > 0 && summary.total !== listed.total
151
+ ? { reported: summary.total as number, listed: listed.total }
152
+ : undefined
153
+ return {
154
+ basis: 'reported',
155
+ lines,
156
+ ...(hasTotal && { reportedTotal: summary.total as number }),
157
+ ...(totalNote && { totalNote }),
158
+ }
159
+ }
160
+
161
+ const lines: CountLine[] = OUTCOMES.filter((outcome) => listed[outcome] > 0).map((outcome) => ({
162
+ outcome,
163
+ count: listed[outcome],
164
+ listed: listed[outcome],
165
+ differs: false,
166
+ }))
167
+ return { basis: 'listed', lines }
168
+ }
169
+
170
+ /** The words for one count: "38 passed", or "40 passed (38 listed)" when the list disagrees. */
171
+ export function describeCount(line: CountLine): string {
172
+ const base = `${line.count.toLocaleString()} ${line.outcome}`
173
+ return line.differs ? `${base} (${line.listed.toLocaleString()} listed)` : base
174
+ }
175
+
176
+ const plural = (n: number, one: string) => (n === 1 ? one : `${one}s`)
177
+
178
+ /**
179
+ * A duration. `short` is for a meta column ("120 ms", "3.4 s"); `long` is for a
180
+ * sentence ("120 milliseconds", "3.4 seconds", "2 minutes 5 seconds"). Anything
181
+ * that is not a finite non-negative number has no duration, so none is drawn.
182
+ */
183
+ export function formatDuration(ms: unknown, style: 'short' | 'long' = 'short'): string | undefined {
184
+ if (typeof ms !== 'number' || !Number.isFinite(ms) || ms < 0) return undefined
185
+ if (ms > 0 && ms < 1) return style === 'short' ? '<1 ms' : 'less than 1 millisecond'
186
+ if (ms < 1000) {
187
+ const whole = Math.round(ms)
188
+ return style === 'short' ? `${whole} ms` : `${whole} ${plural(whole, 'millisecond')}`
189
+ }
190
+ if (ms < 60_000) {
191
+ const seconds = ms < 10_000 ? Math.round(ms / 100) / 10 : Math.round(ms / 1000)
192
+ const text = Number.isInteger(seconds) ? String(seconds) : seconds.toFixed(1)
193
+ return style === 'short' ? `${text} s` : `${text} ${seconds === 1 ? 'second' : 'seconds'}`
194
+ }
195
+ const totalSeconds = Math.round(ms / 1000)
196
+ const minutes = Math.floor(totalSeconds / 60)
197
+ const seconds = totalSeconds % 60
198
+ if (style === 'short') return seconds === 0 ? `${minutes} min` : `${minutes} min ${seconds} s`
199
+ const m = `${minutes.toLocaleString()} ${plural(minutes, 'minute')}`
200
+ return seconds === 0 ? m : `${m} ${seconds} ${plural(seconds, 'second')}`
201
+ }
202
+
203
+ export type SuiteState = 'failed' | 'passed' | 'running' | undefined
204
+
205
+ /**
206
+ * What a suite can say about itself from the tests listed in it. Any listed
207
+ * failure makes it `failed`; a listed test still running makes it `running`;
208
+ * `passed` needs at least one passed test and every listed test to be passed or
209
+ * skipped. Anything else — no tests, a test with no status — is silence.
210
+ */
211
+ export function suiteState(counts: ListedCounts): SuiteState {
212
+ if (counts.failed > 0) return 'failed'
213
+ if (counts.running > 0) return 'running'
214
+ if (counts.passed > 0 && counts.pending === 0 && counts.unknown === 0) return 'passed'
215
+ return undefined
216
+ }
217
+
218
+ /** A suite's key among its siblings: its id if it has one, otherwise its position. */
219
+ export function suiteKey(parent: string, suite: TestSuite, index: number): string {
220
+ return `${parent}/${suite.id ?? `s${index}`}`
221
+ }
222
+
223
+ export function testKey(parent: string, test: TestCase, index: number): string {
224
+ return `${parent}:${test.id ?? `t${index}`}`
225
+ }
226
+
227
+ /** Distinguish repeated ids without tying a row to the object instance it renders. */
228
+ export function repeatedKey(key: string, occurrence: number): string {
229
+ return JSON.stringify([key, occurrence])
230
+ }
231
+
232
+ /**
233
+ * A row's identity among its siblings only: the host id verbatim, or its
234
+ * position when it has none. The leading letter keeps the two apart, so an id
235
+ * that looks like a position never collides with one. A row's place in the tree
236
+ * is the list of these keys from the root, never one string that nests its
237
+ * parent's, so a key stays as long as its own id however deep the row sits.
238
+ */
239
+ export function siblingKey(item: Readonly<{ id?: string }>, index: number): string {
240
+ return item.id === undefined ? `p${index}` : `i${item.id}`
241
+ }
242
+
243
+ export type BoundedEntry<T> = Readonly<{
244
+ key: string
245
+ item: T
246
+ index: number
247
+ }>
248
+
249
+ /** Build keyed rows only for the currently visible prefix of a bounded list. */
250
+ export function boundedEntries<T>(
251
+ items: readonly T[],
252
+ visibleCount: number,
253
+ itemKey: (item: T, index: number) => string
254
+ ): Readonly<{
255
+ entries: readonly BoundedEntry<T>[]
256
+ byKey: ReadonlyMap<string, BoundedEntry<T>>
257
+ }> {
258
+ const entries: BoundedEntry<T>[] = []
259
+ const byKey = new Map<string, BoundedEntry<T>>()
260
+ const occurrences = new Map<string, number>()
261
+ const count = Math.max(0, Math.min(items.length, Math.floor(visibleCount)))
262
+
263
+ for (let index = 0; index < count; index += 1) {
264
+ const item = items[index]!
265
+ const base = itemKey(item, index)
266
+ const occurrence = occurrences.get(base) ?? 0
267
+ occurrences.set(base, occurrence + 1)
268
+ const entry = { key: repeatedKey(base, occurrence), item, index }
269
+ entries.push(entry)
270
+ byKey.set(entry.key, entry)
271
+ }
272
+
273
+ return { entries, byKey }
274
+ }
275
+
276
+ /** The key of the first failing test in reading order. */
277
+ export function firstFailureKey(suites: readonly TestSuite[]): string | undefined {
278
+ type Frame = { suites: readonly TestSuite[]; parent: string; index: number }
279
+ const stack: Frame[] = [{ suites, parent: '', index: 0 }]
280
+ while (stack.length > 0) {
281
+ const frame = stack[stack.length - 1]!
282
+ const suite = frame.suites[frame.index]
283
+ if (!suite) {
284
+ stack.pop()
285
+ continue
286
+ }
287
+ frame.index += 1
288
+ const key = suiteKey(frame.parent, suite, frame.index - 1)
289
+ for (let i = 0; i < (suite.tests?.length ?? 0); i += 1) {
290
+ if (suite.tests![i]!.status === 'failed') return testKey(key, suite.tests![i]!, i)
291
+ }
292
+ if (suite.suites?.length) stack.push({ suites: suite.suites, parent: key, index: 0 })
293
+ }
294
+ return undefined
295
+ }
296
+
297
+ export type FirstFailureRenderPath = Readonly<{
298
+ /**
299
+ * The rendering key of each suite from the root through the suite containing
300
+ * the failure, one entry per level. A key is unique among its siblings, so
301
+ * a suite is on the path when its entry at its own depth is its key and its
302
+ * parent was on the path.
303
+ */
304
+ suites: readonly string[]
305
+ /** The failed test's rendering key among the tests of the last suite on the path. */
306
+ test: string
307
+ }>
308
+
309
+ /** True when both describe the same failure at the same place in the tree. */
310
+ export function sameFailure(
311
+ left: FirstFailureRenderPath | undefined,
312
+ right: FirstFailureRenderPath | undefined
313
+ ): boolean {
314
+ if (left === right) return true
315
+ if (!left || !right) return false
316
+ if (left.test !== right.test || left.suites.length !== right.suites.length) return false
317
+ for (let index = 0; index < left.suites.length; index += 1)
318
+ if (left.suites[index] !== right.suites[index]) return false
319
+ return true
320
+ }
321
+
322
+ /**
323
+ * The first failure's unique rendering keys, including its ancestor suites. The
324
+ * work is linear in the suites visited and the path it returns is linear in the
325
+ * depth, so a long chain of nested suites costs no more than a wide list.
326
+ */
327
+ export function firstFailureRenderPath(
328
+ suites: readonly TestSuite[]
329
+ ): FirstFailureRenderPath | undefined {
330
+ type Frame = {
331
+ suites: readonly TestSuite[]
332
+ index: number
333
+ occurrences: Map<string, number>
334
+ /** The rendering key of the suite these are the children of; absent at the root. */
335
+ key?: string
336
+ }
337
+ const stack: Frame[] = [{ suites, index: 0, occurrences: new Map() }]
338
+ while (stack.length > 0) {
339
+ const frame = stack[stack.length - 1]!
340
+ const suite = frame.suites[frame.index]
341
+ if (!suite) {
342
+ stack.pop()
343
+ continue
344
+ }
345
+ frame.index += 1
346
+ const base = siblingKey(suite, frame.index - 1)
347
+ const occurrence = frame.occurrences.get(base) ?? 0
348
+ frame.occurrences.set(base, occurrence + 1)
349
+ const key = repeatedKey(base, occurrence)
350
+ const tests = suite.tests ?? []
351
+ const testOccurrences = new Map<string, number>()
352
+ for (let i = 0; i < tests.length; i += 1) {
353
+ const testBase = siblingKey(tests[i]!, i)
354
+ const testOccurrence = testOccurrences.get(testBase) ?? 0
355
+ testOccurrences.set(testBase, testOccurrence + 1)
356
+ if (tests[i]!.status === 'failed') {
357
+ const path: string[] = []
358
+ for (let depth = 1; depth < stack.length; depth += 1) path.push(stack[depth]!.key!)
359
+ path.push(key)
360
+ return { suites: path, test: repeatedKey(testBase, testOccurrence) }
361
+ }
362
+ }
363
+ if (suite.suites?.length) {
364
+ stack.push({ suites: suite.suites, index: 0, occurrences: new Map(), key })
365
+ }
366
+ }
367
+ return undefined
368
+ }