@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,103 @@
1
+ import { boundText } from '../sources/source'
2
+
3
+ /**
4
+ * An effort level a model supports: just its id (`'high'`), or an id with the
5
+ * words to show. A bare id is labelled by capitalising it, which is right for
6
+ * `low` / `medium` / `high` and wrong for anything else — pass a label then.
7
+ */
8
+ export type ModelEffort = string | Readonly<{ id: string; label?: string; description?: string }>
9
+
10
+ export type EffortOption = Readonly<{ id: string; label: string; description?: string }>
11
+
12
+ /**
13
+ * A model the person may pick. `efforts` lists the effort levels *this* model
14
+ * advertises; a model without it has no effort control, because showing one would
15
+ * claim the model can be told how hard to think. `disabledReason` is the host's
16
+ * authority speaking (plan, quota, region): the model stays in the list, disabled,
17
+ * with the reason beside it.
18
+ */
19
+ export type ModelOption = Readonly<{
20
+ /** Unique within the list. */
21
+ id: string
22
+ label: string
23
+ provider: string
24
+ description?: string
25
+ disabledReason?: string
26
+ efforts?: readonly ModelEffort[]
27
+ }>
28
+
29
+ const LABEL_LIMIT = 60
30
+ const DESCRIPTION_LIMIT = 160
31
+
32
+ function titleCase(id: string): string {
33
+ const clean = boundText(id, LABEL_LIMIT)
34
+ return clean.charAt(0).toUpperCase() + clean.slice(1)
35
+ }
36
+
37
+ /** Efforts as options: blanks dropped, duplicate ids kept once (first wins), text bounded. */
38
+ export function normalizeEfforts(efforts: readonly ModelEffort[] | undefined): EffortOption[] {
39
+ const seen = new Set<string>()
40
+ const out: EffortOption[] = []
41
+ for (const effort of efforts ?? []) {
42
+ const id = typeof effort === 'string' ? effort : effort.id
43
+ if (id.trim() === '' || seen.has(id)) continue
44
+ seen.add(id)
45
+ if (typeof effort === 'string') {
46
+ out.push({ id, label: titleCase(id) })
47
+ } else {
48
+ out.push({
49
+ id,
50
+ label: (effort.label ? boundText(effort.label, LABEL_LIMIT) : '') || titleCase(id),
51
+ description: effort.description
52
+ ? boundText(effort.description, DESCRIPTION_LIMIT)
53
+ : undefined,
54
+ })
55
+ }
56
+ }
57
+ return out
58
+ }
59
+
60
+ export function findModel(
61
+ models: readonly ModelOption[],
62
+ id: string | undefined
63
+ ): ModelOption | undefined {
64
+ return id === undefined ? undefined : models.find((model) => model.id === id)
65
+ }
66
+
67
+ /** The selected effort, only if the selected model actually offers it. */
68
+ export function resolveEffort(
69
+ model: ModelOption | undefined,
70
+ effort: string | undefined
71
+ ): EffortOption | undefined {
72
+ if (!model || effort === undefined) return undefined
73
+ return normalizeEfforts(model.efforts).find((option) => option.id === effort)
74
+ }
75
+
76
+ export type ModelGroup = Readonly<{ provider: string; models: readonly ModelOption[] }>
77
+
78
+ /** Group by provider, in the order providers first appear, so the host controls ranking. */
79
+ export function groupModels(models: readonly ModelOption[]): ModelGroup[] {
80
+ const groups = new Map<string, ModelOption[]>()
81
+ for (const model of models) {
82
+ const provider = boundText(model.provider, LABEL_LIMIT) || 'Other'
83
+ const bucket = groups.get(provider)
84
+ if (bucket) bucket.push(model)
85
+ else groups.set(provider, [model])
86
+ }
87
+ return [...groups].map(([provider, list]) => ({ provider, models: list }))
88
+ }
89
+
90
+ /** Past this many models the list gets a search box; a short list is quicker to read. */
91
+ export const MODEL_SEARCH_THRESHOLD = 7
92
+
93
+ export function needsSearch(count: number, threshold = MODEL_SEARCH_THRESHOLD): boolean {
94
+ return count > threshold
95
+ }
96
+
97
+ /**
98
+ * What the search matches against: everything a person might type to find a model
99
+ * — its name, its provider, its id, and its description.
100
+ */
101
+ export function modelSearchValue(model: ModelOption): string {
102
+ return [model.label, model.provider, model.id, model.description ?? ''].join(' ')
103
+ }
@@ -0,0 +1 @@
1
+ export { Plan, type PlanProps, type PlanStep, type PlanStepStatus } from './plan'
@@ -0,0 +1,155 @@
1
+ import { ListTodo } from 'lucide-solid'
2
+ import { createMemo, Index, Show, splitProps, type JSX } from 'solid-js'
3
+ import { Progress } from '../../ui/progress'
4
+ import { TraceDetail, TraceLine, type TraceLineProps } from '../../ui/trace'
5
+ import {
6
+ TaskItemList,
7
+ TaskItemRow,
8
+ taskProgress,
9
+ taskProgressLabel,
10
+ type TaskItemStatus,
11
+ } from '../task'
12
+
13
+ // A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
14
+ const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
15
+
16
+ /**
17
+ * Plan.
18
+ *
19
+ * What the agent intends to do, as a `TraceLine` that opens onto the steps: a
20
+ * title, an optional description, the steps with their status, how far along
21
+ * they are, and — when the host supplies them — the actions the reader can take
22
+ * (approve, edit, run). Reach for `Task` when the list is a unit of work that is
23
+ * already under way and not a proposal, for `Queue` when it is the agent's
24
+ * running todo list, and for `ChainOfThought` when the steps describe how an
25
+ * answer was reached rather than what will be done.
26
+ *
27
+ * ## It opens by default
28
+ *
29
+ * Unlike a tool call, the plan is the thing being decided or followed, so it
30
+ * starts open (`defaultOpen={false}` folds it). A plan with no steps, no
31
+ * description and no actions is a plain line.
32
+ *
33
+ * ## Progress is derived, in words
34
+ *
35
+ * "2 of 5 steps done" and the bar come from the steps' own `status` and appear
36
+ * only when at least one step has one; a step with no status counts toward the
37
+ * total and not toward "done" (the host did not say it was finished). The bar is
38
+ * the shared `Progress`, which publishes the same phrase to assistive
39
+ * technology, so the number is never only a length.
40
+ *
41
+ * ## Streaming
42
+ *
43
+ * While `streaming` the plan is still being written, so its length is not known
44
+ * and no progress is claimed: the title shimmers, the line says "Drafting", and
45
+ * a caret trails the last step. Finished steps keep their DOM while the last one
46
+ * grows (rows are kept by position).
47
+ *
48
+ * ## The host owns authority
49
+ *
50
+ * `actions` is a slot. The plan neither enables nor disables what is in it, and
51
+ * with no `actions` there are no controls — a plan the reader may not approve
52
+ * simply has no Approve button.
53
+ *
54
+ * A `Plan` is a line: place it inside a `Trace`.
55
+ */
56
+ export type PlanStepStatus = TaskItemStatus
57
+
58
+ export type PlanStep = Readonly<{
59
+ id?: string
60
+ label: string
61
+ description?: string
62
+ status?: PlanStepStatus
63
+ }>
64
+
65
+ export type PlanProps = Omit<
66
+ TraceLineProps,
67
+ 'description' | 'href' | 'onSelect' | 'selectHaspopup' | 'children' | 'status' | 'statusLabel'
68
+ > & {
69
+ steps: readonly PlanStep[]
70
+ /** What the plan is for, above the steps. */
71
+ description?: JSX.Element
72
+ /** True while the plan is still being generated. */
73
+ streaming?: boolean
74
+ /** Controls for the reader: approve, edit, run. Absent means there are none. */
75
+ actions?: JSX.Element
76
+ }
77
+
78
+ export function Plan(props: PlanProps) {
79
+ const [local, rest] = splitProps(props, [
80
+ 'steps',
81
+ 'description',
82
+ 'streaming',
83
+ 'actions',
84
+ 'icon',
85
+ 'meta',
86
+ 'defaultOpen',
87
+ ])
88
+ const progress = createMemo(() => (local.streaming ? undefined : taskProgress(local.steps)))
89
+ const meta = () => {
90
+ if (local.meta !== undefined) return local.meta
91
+ if (local.streaming) return 'Drafting'
92
+ const value = progress()
93
+ return value ? taskProgressLabel(value) : undefined
94
+ }
95
+ const hasDetail = () =>
96
+ local.steps.length > 0 ||
97
+ local.description !== undefined ||
98
+ local.actions !== undefined ||
99
+ local.streaming === true
100
+
101
+ const detail = () => (
102
+ <TraceDetail class="flex flex-col gap-2">
103
+ <Show when={local.description}>
104
+ <div class="text-sm text-muted-foreground">{local.description}</div>
105
+ </Show>
106
+ <Show when={progress()}>
107
+ {(value) => (
108
+ <Progress
109
+ value={value().done}
110
+ minValue={0}
111
+ maxValue={Math.max(1, value().total)}
112
+ aria-label="Plan progress"
113
+ getValueLabel={({ value: done, max }) =>
114
+ `${done} of ${max} ${max === 1 ? 'step' : 'steps'} done`
115
+ }
116
+ />
117
+ )}
118
+ </Show>
119
+ <Show when={local.steps.length > 0}>
120
+ <TaskItemList label="Plan steps">
121
+ <Index each={local.steps}>
122
+ {(step) => (
123
+ <TaskItemRow
124
+ text={step().label}
125
+ description={step().description}
126
+ status={step().status}
127
+ />
128
+ )}
129
+ </Index>
130
+ </TaskItemList>
131
+ </Show>
132
+ <Show when={local.streaming}>
133
+ <span class="streaming-caret" aria-hidden="true" />
134
+ </Show>
135
+ <Show when={local.actions}>
136
+ <div data-slot="plan-actions" class="flex flex-wrap items-center gap-2 pt-1">
137
+ {local.actions}
138
+ </div>
139
+ </Show>
140
+ </TraceDetail>
141
+ )
142
+
143
+ return (
144
+ <TraceLine
145
+ icon={local.icon ?? <ListTodo />}
146
+ status={local.streaming ? 'running' : undefined}
147
+ statusLabel="Generating"
148
+ meta={meta()}
149
+ defaultOpen={local.defaultOpen ?? true}
150
+ {...rest}
151
+ >
152
+ {hasDetail() ? deferred(detail) : undefined}
153
+ </TraceLine>
154
+ )
155
+ }
@@ -0,0 +1,10 @@
1
+ export {
2
+ partitionQueue,
3
+ Queue,
4
+ QueueFollowUps,
5
+ type QueueFollowUp,
6
+ type QueueFollowUpsProps,
7
+ type QueueItem,
8
+ type QueueItemStatus,
9
+ type QueueProps,
10
+ } from './queue'
@@ -0,0 +1,264 @@
1
+ import { CornerDownRight, ListChecks, ListTodo, MessageSquarePlus, X } from 'lucide-solid'
2
+ import {
3
+ createMemo,
4
+ Index,
5
+ onCleanup,
6
+ Show,
7
+ splitProps,
8
+ type ComponentProps,
9
+ type JSX,
10
+ } from 'solid-js'
11
+ import { Button } from '../../ui/button'
12
+ import { Trace, TraceLine } from '../../ui/trace'
13
+ import { TaskItemList, TaskItemRow } from '../task'
14
+
15
+ // A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
16
+ const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
17
+
18
+ /**
19
+ * Queue.
20
+ *
21
+ * The agent's todo list, split the way a reader asks about it: what is still to
22
+ * do, and what is already done. Two collapsible sections with their counts,
23
+ * "Pending" open and "Completed" folded — the finished work is the record, the
24
+ * pending work is the question. Reach for `Plan` when the list is a proposal
25
+ * awaiting a decision, for `Task` when it is one piece of work with files
26
+ * attached, and for `QueueFollowUps` (below) when the things waiting are
27
+ * *messages from the person*, not work the agent set itself.
28
+ *
29
+ * ## Sorting is the host's statement, not ours
30
+ *
31
+ * An item is in the Completed section only if its `status` is `complete`.
32
+ * Everything else — `pending`, `active`, or no status at all — is still to do,
33
+ * which is what "not marked done" means; the mark shown matches (an item with
34
+ * no status gets the pending mark, because it is in the Pending section). An
35
+ * empty section is not drawn: "Completed (0)" is noise, and a list with nothing
36
+ * in either section renders nothing, or the `empty` content if the host gave
37
+ * some, rather than a heading over a void.
38
+ *
39
+ * ## Bounded
40
+ *
41
+ * Each section scrolls inside a capped, keyboard-focusable region, and rows are
42
+ * kept by position, so a list of two hundred items does not push the answer out
43
+ * of view and a status change updates a row instead of recreating it. Item text
44
+ * wraps to three lines and is clamped (see `Task`).
45
+ *
46
+ * A `Queue` is a block (its own `Trace`) and can sit between other parts of a
47
+ * turn.
48
+ */
49
+ export type QueueItemStatus = 'pending' | 'active' | 'complete'
50
+
51
+ export type QueueItem = Readonly<{
52
+ id?: string
53
+ text: string
54
+ description?: string
55
+ status?: QueueItemStatus
56
+ }>
57
+
58
+ /** Split a todo list into the two sections. Order is preserved within each. */
59
+ export function partitionQueue(items: readonly QueueItem[]): Readonly<{
60
+ pending: readonly QueueItem[]
61
+ completed: readonly QueueItem[]
62
+ }> {
63
+ return {
64
+ pending: items.filter((item) => item.status !== 'complete'),
65
+ completed: items.filter((item) => item.status === 'complete'),
66
+ }
67
+ }
68
+
69
+ function itemCount(count: number): string {
70
+ return `${count} ${count === 1 ? 'item' : 'items'}`
71
+ }
72
+
73
+ /** The count, shown as a number and spoken as a phrase. */
74
+ function Count(props: { count: number; noun?: string }) {
75
+ return (
76
+ <>
77
+ <span aria-hidden="true">{props.count}</span>
78
+ <span class="sr-only">{props.noun ?? itemCount(props.count)}</span>
79
+ </>
80
+ )
81
+ }
82
+
83
+ export type QueueProps = Omit<ComponentProps<typeof Trace>, 'children'> & {
84
+ items: readonly QueueItem[]
85
+ pendingLabel?: string
86
+ completedLabel?: string
87
+ /** Shown when there is nothing in either section. Omit to draw nothing. */
88
+ empty?: JSX.Element
89
+ /** Open the Completed section initially. */
90
+ defaultCompletedOpen?: boolean
91
+ }
92
+
93
+ export function Queue(props: QueueProps) {
94
+ const [local, rest] = splitProps(props, [
95
+ 'items',
96
+ 'pendingLabel',
97
+ 'completedLabel',
98
+ 'empty',
99
+ 'defaultCompletedOpen',
100
+ ])
101
+ const sections = createMemo(() => partitionQueue(local.items))
102
+ const pending = () => sections().pending
103
+ const completed = () => sections().completed
104
+ const pendingLabel = () => local.pendingLabel ?? 'Pending'
105
+ const completedLabel = () => local.completedLabel ?? 'Completed'
106
+
107
+ return (
108
+ <Show
109
+ when={local.items.length > 0}
110
+ fallback={
111
+ <Show when={local.empty}>
112
+ <Trace aria-label="Queue" {...rest}>
113
+ <TraceLine title={local.empty} />
114
+ </Trace>
115
+ </Show>
116
+ }
117
+ >
118
+ <Trace aria-label="Queue" {...rest}>
119
+ <Show when={pending().length > 0}>
120
+ <TraceLine
121
+ icon={<ListTodo />}
122
+ title={pendingLabel()}
123
+ meta={<Count count={pending().length} />}
124
+ defaultOpen
125
+ >
126
+ {deferred(() => (
127
+ <TaskItemList label={pendingLabel()}>
128
+ <Index each={pending()}>
129
+ {(item) => (
130
+ <TaskItemRow
131
+ text={item().text}
132
+ description={item().description}
133
+ status={item().status ?? 'pending'}
134
+ />
135
+ )}
136
+ </Index>
137
+ </TaskItemList>
138
+ ))}
139
+ </TraceLine>
140
+ </Show>
141
+ <Show when={completed().length > 0}>
142
+ <TraceLine
143
+ icon={<ListChecks />}
144
+ title={completedLabel()}
145
+ meta={<Count count={completed().length} />}
146
+ defaultOpen={local.defaultCompletedOpen ?? false}
147
+ >
148
+ {deferred(() => (
149
+ <TaskItemList label={completedLabel()}>
150
+ <Index each={completed()}>
151
+ {(item) => (
152
+ <TaskItemRow
153
+ text={item().text}
154
+ description={item().description}
155
+ status="complete"
156
+ />
157
+ )}
158
+ </Index>
159
+ </TaskItemList>
160
+ ))}
161
+ </TraceLine>
162
+ </Show>
163
+ </Trace>
164
+ </Show>
165
+ )
166
+ }
167
+
168
+ export type QueueFollowUp = Readonly<{
169
+ id?: string
170
+ text: string
171
+ /** Removes it from the queue. Omit it and the row has no remove control. */
172
+ onRemove?: () => void
173
+ }>
174
+
175
+ const REMOVE_LABEL_CHARS = 60
176
+
177
+ function FollowUpRow(props: { item: QueueFollowUp }) {
178
+ let remove: HTMLButtonElement | undefined
179
+
180
+ // Rows are kept by position, so removing a middle row leaves the focused
181
+ // button where it is (now on the next message). Only the last row is ever
182
+ // disposed under focus; hand focus to the one before it rather than to `body`.
183
+ onCleanup(() => {
184
+ if (!remove || document.activeElement !== remove) return
185
+ const buttons = remove
186
+ .closest('ul')
187
+ ?.querySelectorAll<HTMLButtonElement>('button[data-slot="queue-follow-up-remove"]')
188
+ const previous = Array.from(buttons ?? []).filter((button) => button !== remove)
189
+ previous.at(-1)?.focus()
190
+ })
191
+
192
+ const text = () =>
193
+ props.item.text.length > 1_000 ? `${props.item.text.slice(0, 1_000)}…` : props.item.text
194
+ const label = () =>
195
+ props.item.text.length > REMOVE_LABEL_CHARS
196
+ ? `${props.item.text.slice(0, REMOVE_LABEL_CHARS)}…`
197
+ : props.item.text
198
+
199
+ return (
200
+ <li data-slot="queue-follow-up" class="flex min-w-0 items-start gap-2 rounded-md px-1.5 py-0.5">
201
+ <CornerDownRight aria-hidden="true" class="mt-0.5 size-3.5 shrink-0 text-muted-foreground" />
202
+ <p
203
+ title={text()}
204
+ class="m-0 line-clamp-3 min-w-0 flex-1 text-sm [overflow-wrap:anywhere] whitespace-pre-wrap text-foreground"
205
+ >
206
+ {text()}
207
+ </p>
208
+ <Show when={props.item.onRemove}>
209
+ {(onRemove) => (
210
+ <Button
211
+ ref={(element) => (remove = element)}
212
+ data-slot="queue-follow-up-remove"
213
+ type="button"
214
+ variant="ghost"
215
+ size="icon-2xs"
216
+ class="shrink-0"
217
+ aria-label={`Remove queued message: ${label()}`}
218
+ onClick={() => onRemove()()}
219
+ >
220
+ <X aria-hidden="true" />
221
+ </Button>
222
+ )}
223
+ </Show>
224
+ </li>
225
+ )
226
+ }
227
+
228
+ export type QueueFollowUpsProps = Omit<ComponentProps<typeof Trace>, 'children'> & {
229
+ items: readonly QueueFollowUp[]
230
+ /** The section's title. */
231
+ title?: string
232
+ defaultOpen?: boolean
233
+ }
234
+
235
+ /**
236
+ * Follow-up messages the person sent that have not been delivered yet. They are
237
+ * the person's words, so they are shown as sent (wrapped, clamped to three
238
+ * lines) rather than as work. The remove control exists per message only when
239
+ * that message carries `onRemove`: whether it may still be withdrawn is the
240
+ * runtime's to say, and a message past recall simply has no button. With no
241
+ * messages the component draws nothing.
242
+ */
243
+ export function QueueFollowUps(props: QueueFollowUpsProps) {
244
+ const [local, rest] = splitProps(props, ['items', 'title', 'defaultOpen'])
245
+ const title = () => local.title ?? 'Queued follow-ups'
246
+ return (
247
+ <Show when={local.items.length > 0}>
248
+ <Trace aria-label={title()} {...rest}>
249
+ <TraceLine
250
+ icon={<MessageSquarePlus />}
251
+ title={title()}
252
+ meta={<Count count={local.items.length} noun={`${local.items.length} waiting`} />}
253
+ defaultOpen={local.defaultOpen ?? true}
254
+ >
255
+ {deferred(() => (
256
+ <TaskItemList label={title()}>
257
+ <Index each={local.items}>{(item) => <FollowUpRow item={item()} />}</Index>
258
+ </TaskItemList>
259
+ ))}
260
+ </TraceLine>
261
+ </Trace>
262
+ </Show>
263
+ )
264
+ }
@@ -0,0 +1 @@
1
+ export { formatDuration, Reasoning, reasoningTitle, type ReasoningProps } from './reasoning'