@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,395 @@
1
+ import { Check, CircleAlert, Copy, Package } from 'lucide-solid'
2
+ import {
3
+ createMemo,
4
+ createSignal,
5
+ For,
6
+ Match,
7
+ Show,
8
+ splitProps,
9
+ Switch,
10
+ type ComponentProps,
11
+ } from 'solid-js'
12
+ import { writeClipboardText } from '../../../lib/clipboard'
13
+ import { cn } from '../../../lib/utils'
14
+ import { Button } from '../../ui/button'
15
+ import { CodeBlock } from '../../ui/code-block'
16
+ import { TraceLine } from '../../ui/trace'
17
+ import {
18
+ boundLines,
19
+ dedentLines,
20
+ describeFrameGroup,
21
+ frameLocation,
22
+ groupStackEntries,
23
+ parseStackTrace,
24
+ type ParseStackTraceOptions,
25
+ type StackBlock,
26
+ type StackFrame,
27
+ } from './parse-stack-trace'
28
+
29
+ /**
30
+ * StackTrace.
31
+ *
32
+ * A failed call and the frames it failed through. Put it in the body of the
33
+ * `TraceLine` for the call that failed, or under a failing test; reach for
34
+ * `CodeBlock` when the text is not a trace, and for `Terminal` when it is the
35
+ * live output of a command rather than one error.
36
+ *
37
+ * ## The reader's code first
38
+ *
39
+ * A trace is mostly someone else's frames. Runs of dependency and runtime frames
40
+ * (`node_modules`, `site-packages`, `.cargo/registry`, `node:` internals, Rust's
41
+ * `std`) fold into one disclosure line that says what it holds, and a lone
42
+ * dependency frame is dimmed rather than folded. When *none* of the frames is the
43
+ * reader's, nothing folds: hiding the whole trace behind a button helps nobody.
44
+ * Whose code a frame is comes from its path; a host that knows the project layout
45
+ * passes `classify`.
46
+ *
47
+ * ## It never hides a line
48
+ *
49
+ * Every line of `text` is on screen in order — as a frame, as a header, or as
50
+ * muted text — and a trace in a format this does not know is shown whole in a
51
+ * `CodeBlock`, which also copies it. Copy writes `text` exactly as given, not a
52
+ * reformatted version of what was parsed.
53
+ *
54
+ * ## Opening a frame is the host's decision
55
+ *
56
+ * A frame is a button only when `onOpenFrame` is supplied, and only when the
57
+ * frame names a file; without it frames are plain text, because a control that
58
+ * does nothing is a tab stop with no purpose. The component never builds a path
59
+ * or tries to open one — the trace is untrusted text, and what a path in it means
60
+ * on this machine is the host's call.
61
+ *
62
+ * Text is text throughout: frames, messages and source lines are rendered as text
63
+ * nodes, long unbroken tokens wrap rather than widening the column, and what is
64
+ * drawn is bounded with the omission stated every time: a text line or a header
65
+ * message beyond 10 000 characters, a frame's printed lines beyond 40 lines or
66
+ * 10 000 characters, and the frames of a folded group, which are built only while
67
+ * it is open and then `maxBlocks` at a time. Copy and `onOpenFrame` still get all of
68
+ * it.
69
+ */
70
+ export type StackTraceProps = Omit<ComponentProps<'div'>, 'children'> & {
71
+ /** The trace exactly as the runtime printed it. */
72
+ text: string
73
+ /** Make frames that name a file open it. Omit to render them as plain text. */
74
+ onOpenFrame?: (frame: StackFrame) => void
75
+ classify?: ParseStackTraceOptions['classify']
76
+ /** Fold runs of dependency and runtime frames. Default true. */
77
+ collapseDependencies?: boolean
78
+ /** Start folded groups open. */
79
+ defaultDependenciesOpen?: boolean
80
+ /** Blocks (frames, groups, text) shown before "show more". Default 200. */
81
+ maxBlocks?: number
82
+ copyLabel?: string
83
+ copiedLabel?: string
84
+ /** Called after each copy attempt with whether the clipboard accepted it. */
85
+ onCopy?: (ok: boolean) => void
86
+ }
87
+
88
+ export const STACK_TRACE_MAX_BLOCKS = 200
89
+ const TEXT_DISPLAY_LIMIT = 10_000
90
+ /** What a frame's own printed lines (a Python source line, a locals dump) may show. */
91
+ const DETAIL_LINE_LIMIT = 40
92
+ const DETAIL_CHAR_LIMIT = 10_000
93
+
94
+ const rowClass =
95
+ 'flex min-w-0 flex-wrap items-baseline gap-x-2 rounded-md px-1.5 py-0.5 text-start text-xs outline-none'
96
+ const interactiveClass =
97
+ 'w-full cursor-pointer transition-colors ease-out hover:bg-muted/60 focus-visible:ring-3 focus-visible:ring-primary-subtle focus-visible:border-ring'
98
+
99
+ function omissionNote(lines: number, chars: number): string {
100
+ return lines > 0
101
+ ? `… ${lines.toLocaleString()} more ${lines === 1 ? 'line' : 'lines'} (${chars.toLocaleString()} characters) not shown`
102
+ : `… ${chars.toLocaleString()} more characters not shown`
103
+ }
104
+
105
+ /** A frame's printed lines, bounded so one frame cannot be the whole page. */
106
+ function FrameDetail(props: { lines: readonly string[] }) {
107
+ const bounded = createMemo(() => boundLines(props.lines, DETAIL_LINE_LIMIT, DETAIL_CHAR_LIMIT))
108
+ return (
109
+ <>
110
+ <pre class="m-0 ms-1.5 px-1.5 font-code text-code whitespace-pre-wrap text-muted-foreground [overflow-wrap:anywhere]">
111
+ {dedentLines(bounded().lines).join('\n')}
112
+ </pre>
113
+ <Show when={bounded().omittedLines > 0 || bounded().omittedChars > 0}>
114
+ <p class="m-0 ms-1.5 px-1.5 text-xs text-muted-foreground italic">
115
+ {omissionNote(bounded().omittedLines, bounded().omittedChars)}
116
+ {' (copy has all of it)'}
117
+ </p>
118
+ </Show>
119
+ </>
120
+ )
121
+ }
122
+
123
+ /** Header text, cut to the display limit with what was cut stated. */
124
+ function ClippedText(props: { text: string; class?: string }) {
125
+ const clipped = () => props.text.length > TEXT_DISPLAY_LIMIT
126
+ return (
127
+ <>
128
+ <span class={props.class}>
129
+ {clipped() ? props.text.slice(0, TEXT_DISPLAY_LIMIT) : props.text}
130
+ </span>
131
+ <Show when={clipped()}>
132
+ <span class="block text-xs text-muted-foreground italic">
133
+ … {(props.text.length - TEXT_DISPLAY_LIMIT).toLocaleString()} more characters not shown
134
+ (copy has all of it)
135
+ </span>
136
+ </Show>
137
+ </>
138
+ )
139
+ }
140
+
141
+ /**
142
+ * A folded run of dependency or runtime frames. Its rows are built only while it
143
+ * is open and then a page at a time, so a run of ten thousand frames costs the
144
+ * same as one of a few hundred until the reader asks for more.
145
+ */
146
+ function FrameGroup(props: {
147
+ frames: readonly StackFrame[]
148
+ defaultOpen?: boolean
149
+ pageSize: number
150
+ onOpen?: (frame: StackFrame) => void
151
+ }) {
152
+ const [open, setOpen] = createSignal(props.defaultOpen === true)
153
+ const [limit, setLimit] = createSignal<number | undefined>()
154
+ const title = createMemo(() => describeFrameGroup(props.frames))
155
+ const shown = createMemo(() => props.frames.slice(0, limit() ?? props.pageSize))
156
+ const hidden = () => props.frames.length - shown().length
157
+ return (
158
+ <TraceLine icon={<Package />} title={title()} open={open()} onOpenChange={setOpen}>
159
+ <Show when={open()}>
160
+ <ol role="list" aria-label={title()} class="m-0 flex min-w-0 list-none flex-col gap-px p-0">
161
+ <For each={shown()}>{(frame) => <FrameRow frame={frame} onOpen={props.onOpen} />}</For>
162
+ </ol>
163
+ <Show when={hidden() > 0}>
164
+ <ShowMore
165
+ hidden={hidden()}
166
+ pageSize={props.pageSize}
167
+ onClick={() => setLimit(shown().length + props.pageSize)}
168
+ />
169
+ </Show>
170
+ </Show>
171
+ </TraceLine>
172
+ )
173
+ }
174
+
175
+ function ShowMore(props: { hidden: number; pageSize: number; onClick: () => void }) {
176
+ return (
177
+ <div class="ps-1.5">
178
+ <Button variant="ghost" size="2xs" onClick={props.onClick}>
179
+ Show {Math.min(props.hidden, props.pageSize).toLocaleString()} more (
180
+ {props.hidden.toLocaleString()} hidden)
181
+ </Button>
182
+ </div>
183
+ )
184
+ }
185
+
186
+ function FrameRow(props: { frame: StackFrame; onOpen?: (frame: StackFrame) => void }) {
187
+ const location = () => frameLocation(props.frame)
188
+ const first = () => props.frame.kind === 'first-party'
189
+ const content = () => (
190
+ <>
191
+ <span
192
+ class={cn('font-code text-code', {
193
+ 'text-foreground': first(),
194
+ 'text-muted-foreground': !first(),
195
+ })}
196
+ >
197
+ {props.frame.async ? 'async ' : ''}
198
+ {props.frame.function ?? '(anonymous)'}
199
+ </span>
200
+ <Show when={location()}>
201
+ <span class="min-w-0 font-code text-code text-muted-foreground [overflow-wrap:anywhere]">
202
+ {location()}
203
+ </span>
204
+ </Show>
205
+ {/* The dimming is a colour; the kind is also spoken. */}
206
+ <Show when={!first()}>
207
+ <span class="sr-only">
208
+ {props.frame.kind === 'dependency' ? 'in a dependency' : 'in the runtime'}
209
+ </span>
210
+ </Show>
211
+ </>
212
+ )
213
+ return (
214
+ <li data-slot="stack-frame" data-kind={props.frame.kind} class="min-w-0">
215
+ <Show
216
+ when={props.onOpen !== undefined && props.frame.file !== undefined}
217
+ fallback={<div class={rowClass}>{content()}</div>}
218
+ >
219
+ <button
220
+ type="button"
221
+ aria-label={`Open ${props.frame.function ?? 'frame'} at ${location()}`}
222
+ class={cn(rowClass, interactiveClass)}
223
+ onClick={() => props.onOpen?.(props.frame)}
224
+ >
225
+ {content()}
226
+ </button>
227
+ </Show>
228
+ <Show when={props.frame.detail && props.frame.detail.length > 0}>
229
+ <FrameDetail lines={props.frame.detail!} />
230
+ </Show>
231
+ </li>
232
+ )
233
+ }
234
+
235
+ function TextRow(props: { text: string }) {
236
+ const clipped = () => props.text.length > TEXT_DISPLAY_LIMIT
237
+ return (
238
+ <li class="min-w-0 px-1.5 py-0.5 font-code text-code whitespace-pre-wrap text-muted-foreground [overflow-wrap:anywhere]">
239
+ {clipped() ? props.text.slice(0, TEXT_DISPLAY_LIMIT) : props.text}
240
+ <Show when={clipped()}>
241
+ <span class="block font-sans text-xs italic">
242
+ … {(props.text.length - TEXT_DISPLAY_LIMIT).toLocaleString()} more characters not shown
243
+ </span>
244
+ </Show>
245
+ </li>
246
+ )
247
+ }
248
+
249
+ export function StackTrace(props: StackTraceProps) {
250
+ const [local, rest] = splitProps(props, [
251
+ 'text',
252
+ 'onOpenFrame',
253
+ 'classify',
254
+ 'collapseDependencies',
255
+ 'defaultDependenciesOpen',
256
+ 'maxBlocks',
257
+ 'copyLabel',
258
+ 'copiedLabel',
259
+ 'onCopy',
260
+ 'class',
261
+ ])
262
+
263
+ const parsed = createMemo(() => parseStackTrace(local.text, { classify: local.classify }))
264
+ const blocks = createMemo<readonly StackBlock[]>(() =>
265
+ groupStackEntries(parsed().entries, local.collapseDependencies !== false).filter(
266
+ // A blank line between paragraphs of a trace carries nothing to draw.
267
+ (block) => block.type !== 'text' || block.text.trim() !== ''
268
+ )
269
+ )
270
+ const pageSize = () => Math.max(1, Math.floor(local.maxBlocks ?? STACK_TRACE_MAX_BLOCKS))
271
+ const [limit, setLimit] = createSignal<number | undefined>()
272
+ const shown = createMemo(() => blocks().slice(0, limit() ?? pageSize()))
273
+ const hidden = () => blocks().length - shown().length
274
+
275
+ const [copied, setCopied] = createSignal(false)
276
+ const [copyFailed, setCopyFailed] = createSignal(false)
277
+ const copy = async () => {
278
+ let ok = true
279
+ try {
280
+ await writeClipboardText(local.text)
281
+ } catch {
282
+ ok = false
283
+ }
284
+ setCopied(ok)
285
+ setCopyFailed(!ok)
286
+ local.onCopy?.(ok)
287
+ if (ok) setTimeout(() => setCopied(false), 1500)
288
+ }
289
+
290
+ return (
291
+ <div
292
+ data-slot="stack-trace"
293
+ data-format={parsed().format}
294
+ class={cn('flex min-w-0 flex-col gap-1', local.class)}
295
+ {...rest}
296
+ >
297
+ <Show
298
+ when={parsed().format !== 'unknown'}
299
+ fallback={
300
+ // Nothing recognised: the whole text, in the block that copies it.
301
+ <CodeBlock size="sm" title="Error output" code={local.text} complete wrap />
302
+ }
303
+ >
304
+ <div class="group/stack flex items-start gap-2">
305
+ <CircleAlert aria-hidden="true" class="mt-0.5 size-4 shrink-0 text-destructive" />
306
+ <div class="min-w-0 flex-1 text-sm">
307
+ <Show
308
+ when={parsed().header}
309
+ fallback={<span class="text-muted-foreground">Stack trace</span>}
310
+ >
311
+ {(header) => (
312
+ <>
313
+ <p class="m-0 whitespace-pre-wrap [overflow-wrap:anywhere]">
314
+ <Show when={header().type}>
315
+ <ClippedText class="font-semibold text-destructive" text={header().type!} />
316
+ <Show when={header().message !== ''}>
317
+ <span class="text-muted-foreground">: </span>
318
+ </Show>
319
+ </Show>
320
+ <ClippedText class="text-foreground" text={header().message} />
321
+ </p>
322
+ <Show when={header().location}>
323
+ <p class="m-0 font-code text-code text-muted-foreground [overflow-wrap:anywhere]">
324
+ <ClippedText text={header().location!} />
325
+ </p>
326
+ </Show>
327
+ </>
328
+ )}
329
+ </Show>
330
+ </div>
331
+ <div class="flex items-center gap-1 opacity-0 transition-opacity group-focus-within/stack:opacity-100 group-hover/stack:opacity-100 [@media(hover:none)]:opacity-100">
332
+ <Button
333
+ variant="ghost"
334
+ size="icon-2xs"
335
+ aria-label={
336
+ copied() ? (local.copiedLabel ?? 'Copied') : (local.copyLabel ?? 'Copy stack trace')
337
+ }
338
+ title={copyFailed() ? 'Copying is unavailable in this context' : undefined}
339
+ onClick={() => void copy()}
340
+ >
341
+ <Show when={copied()} fallback={<Copy aria-hidden="true" />}>
342
+ <Check aria-hidden="true" />
343
+ </Show>
344
+ </Button>
345
+ </div>
346
+ </div>
347
+
348
+ <ol
349
+ role="list"
350
+ aria-label="Stack frames"
351
+ class="m-0 ms-2 flex min-w-0 list-none flex-col gap-px border-s border-border p-0 ps-2"
352
+ >
353
+ <For each={shown()}>
354
+ {(block) => (
355
+ <Switch>
356
+ <Match when={block.type === 'frame' && block}>
357
+ {(entry) => (
358
+ <FrameRow
359
+ frame={(entry() as Extract<StackBlock, { type: 'frame' }>).frame}
360
+ onOpen={local.onOpenFrame}
361
+ />
362
+ )}
363
+ </Match>
364
+ <Match when={block.type === 'text' && block}>
365
+ {(entry) => (
366
+ <TextRow text={(entry() as Extract<StackBlock, { type: 'text' }>).text} />
367
+ )}
368
+ </Match>
369
+ <Match when={block.type === 'group' && block}>
370
+ {(entry) => (
371
+ <FrameGroup
372
+ frames={(entry() as Extract<StackBlock, { type: 'group' }>).frames}
373
+ defaultOpen={local.defaultDependenciesOpen}
374
+ pageSize={pageSize()}
375
+ onOpen={local.onOpenFrame}
376
+ />
377
+ )}
378
+ </Match>
379
+ </Switch>
380
+ )}
381
+ </For>
382
+ </ol>
383
+ <Show when={hidden() > 0}>
384
+ <div class="ms-2">
385
+ <ShowMore
386
+ hidden={hidden()}
387
+ pageSize={pageSize()}
388
+ onClick={() => setLimit(shown().length + pageSize())}
389
+ />
390
+ </div>
391
+ </Show>
392
+ </Show>
393
+ </div>
394
+ )
395
+ }
@@ -0,0 +1 @@
1
+ export { stepCountLabel, Subagent, type SubagentProps } from './subagent'
@@ -0,0 +1,159 @@
1
+ import { Bot } from 'lucide-solid'
2
+ import { children as resolveChildren, Show, splitProps, type JSX } from 'solid-js'
3
+ import { CodeBlock } from '../../ui/code-block'
4
+ import { ScrollArea } from '../../ui/scroll-area'
5
+ import {
6
+ Trace,
7
+ TraceDetail,
8
+ TraceLine,
9
+ type TraceLineProps,
10
+ type TraceStatus,
11
+ } from '../../ui/trace'
12
+ import { formatDuration } from '../reasoning'
13
+
14
+ // A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
15
+ const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
16
+
17
+ /**
18
+ * Subagent.
19
+ *
20
+ * Another agent the main one handed work to, as a `TraceLine`: its name, the task
21
+ * it was given, its status, and — folded away — everything it did. The body is a
22
+ * nested `Trace`, so a subagent's tool calls, reasoning and own subagents are the
23
+ * same lines as the parent's, one level in; nothing about "a run inside a run"
24
+ * needs a new visual. Reach for `Tool` when the call has an input and an output
25
+ * and no steps of its own, and for `Task` when the items are a statement of work
26
+ * rather than a record of what ran.
27
+ *
28
+ * ## The collapsed line is the summary
29
+ *
30
+ * Folded, the line carries what a reader scanning the turn needs: the name, the
31
+ * task, the status, and — in the trailing text — the model, the number of steps
32
+ * and how long it took. Each of those appears only when known: `model` and
33
+ * `duration` are the host's, and the step count is the number of lines passed as
34
+ * `children` unless the host knows better (`stepCount`, for a run whose earlier
35
+ * steps are not loaded). No count is shown for a run with no steps.
36
+ *
37
+ * ## Result and failure
38
+ *
39
+ * `result` is a slot for the answer the subagent returned — usually prose or a
40
+ * `CodeBlock` — below its steps, labelled "Result". `errorText` is a failure as
41
+ * text. Neither is invented: a subagent that finished without a result shows
42
+ * none, and one with no steps, result or error yet is a plain line (there is
43
+ * nothing to open; the line becomes a disclosure when its first step arrives).
44
+ *
45
+ * A `Subagent` is a line: place it inside a `Trace`, and its `children` are
46
+ * `TraceLine`s.
47
+ */
48
+ export type SubagentProps = Omit<
49
+ TraceLineProps,
50
+ 'title' | 'description' | 'href' | 'onSelect' | 'selectHaspopup' | 'meta'
51
+ > & {
52
+ /** The subagent's name. Rendered as text. */
53
+ name: string
54
+ /** The task it was given, on the line. */
55
+ task?: JSX.Element
56
+ status?: TraceStatus
57
+ /** A model label, e.g. `sonnet-5`. Rendered as text. */
58
+ model?: string
59
+ /** Seconds the run took, if the host measured it. */
60
+ duration?: number
61
+ /** Overrides the count taken from `children`. */
62
+ stepCount?: number
63
+ /** What the subagent returned. */
64
+ result?: JSX.Element
65
+ errorText?: string
66
+ /** Trailing text appended after the derived summary. */
67
+ meta?: JSX.Element
68
+ }
69
+
70
+ /** `3 steps`, `1 step`. */
71
+ export function stepCountLabel(count: number): string {
72
+ return `${count} ${count === 1 ? 'step' : 'steps'}`
73
+ }
74
+
75
+ export function Subagent(props: SubagentProps) {
76
+ const [local, rest] = splitProps(props, [
77
+ 'name',
78
+ 'task',
79
+ 'status',
80
+ 'model',
81
+ 'duration',
82
+ 'stepCount',
83
+ 'result',
84
+ 'errorText',
85
+ 'icon',
86
+ 'meta',
87
+ 'children',
88
+ ])
89
+ // Resolved once: the steps are created once and keep their own state (an open
90
+ // tool call, a scrolled output) while the run is folded and unfolded.
91
+ const steps = resolveChildren(() => local.children)
92
+ const count = () => local.stepCount ?? steps.toArray().length
93
+ const hasError = () => local.errorText !== undefined && local.errorText !== ''
94
+ const hasResult = () => local.result !== undefined && local.result !== null
95
+ const hasDetail = () => steps.toArray().length > 0 || hasResult() || hasError()
96
+
97
+ const summary = () => {
98
+ const parts = [
99
+ local.model,
100
+ count() > 0 ? stepCountLabel(count()) : undefined,
101
+ formatDuration(local.duration),
102
+ ].filter((part): part is string => part !== undefined && part !== '')
103
+ return parts.length > 0 ? parts.join(' · ') : undefined
104
+ }
105
+
106
+ // A model label is host text and may be long; it must not widen the line.
107
+ const meta = () =>
108
+ summary() || local.meta ? (
109
+ <>
110
+ <Show when={summary()}>
111
+ <span class="inline-block max-w-72 truncate align-bottom">{summary()}</span>
112
+ </Show>
113
+ {local.meta}
114
+ </>
115
+ ) : undefined
116
+
117
+ const detail = () => (
118
+ <TraceDetail class="flex flex-col gap-2">
119
+ <Show when={steps.toArray().length > 0}>
120
+ <Trace size="sm" aria-label={`${local.name} steps`}>
121
+ {steps()}
122
+ </Trace>
123
+ </Show>
124
+ <Show when={hasError()}>
125
+ <CodeBlock
126
+ size="sm"
127
+ title="Error"
128
+ language="error"
129
+ code={local.errorText ?? ''}
130
+ lineMarks={{ 1: 'error' }}
131
+ complete
132
+ maxHeight="12rem"
133
+ wrap
134
+ />
135
+ </Show>
136
+ <Show when={hasResult()}>
137
+ <div class="flex min-w-0 flex-col gap-1">
138
+ <p class="m-0 font-medium text-foreground">Result</p>
139
+ <ScrollArea role="region" aria-label={`${local.name} result`} class="max-h-72">
140
+ {local.result}
141
+ </ScrollArea>
142
+ </div>
143
+ </Show>
144
+ </TraceDetail>
145
+ )
146
+
147
+ return (
148
+ <TraceLine
149
+ icon={local.icon ?? <Bot />}
150
+ title={local.name}
151
+ description={local.task}
152
+ status={local.status}
153
+ meta={meta()}
154
+ {...rest}
155
+ >
156
+ {hasDetail() ? deferred(detail) : undefined}
157
+ </TraceLine>
158
+ )
159
+ }
@@ -0,0 +1 @@
1
+ export { Suggestion, Suggestions, type SuggestionProps, type SuggestionsProps } from './suggestion'