@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,140 @@
1
+ import {
2
+ createContext,
3
+ createUniqueId,
4
+ Show,
5
+ splitProps,
6
+ useContext,
7
+ type ComponentProps,
8
+ } from 'solid-js'
9
+ import { cn } from '../../../lib/utils'
10
+ import { Button } from '../../ui/button'
11
+ import { boundText } from '../sources/source'
12
+
13
+ /**
14
+ * Suggestions.
15
+ *
16
+ * A row of one-click prompts: each chip is the text that will be sent, so choosing
17
+ * one is a single decision and never "fill the composer, then still have to press
18
+ * send". What a chip *does* with its text — send it, drop it in the composer —
19
+ * is the host's `onSelect`; this component only reports which one was chosen.
20
+ *
21
+ * - **Layout.** `wrap` (default) lets chips flow onto further lines, which is the
22
+ * right behaviour at a narrow width. `scroll` keeps a single line that scrolls
23
+ * sideways, for a bar above a composer that must not grow; the chips are real
24
+ * buttons, so keyboard focus scrolls them into view and nothing depends on a
25
+ * pointer to reach the overflow.
26
+ * - **Long text is clipped, not hidden.** A chip is one line and truncates; the
27
+ * full text is the button's accessible name and its `title`.
28
+ * - **The host owns authority.** No `onSelect`, or a `disabledReason`, disables
29
+ * every chip and says why in words under the row. Chips use `aria-disabled`
30
+ * rather than `disabled`, so a keyboard or screen-reader user can still reach
31
+ * them and hear the reason instead of finding a row that is silently skipped.
32
+ */
33
+ export type SuggestionsProps = Omit<ComponentProps<'div'>, 'onSelect'> & {
34
+ /** The row's accessible name. */
35
+ label?: string
36
+ layout?: 'wrap' | 'scroll'
37
+ /** Called with the chosen chip's text. Without it every chip is disabled. */
38
+ onSelect?: (text: string) => void
39
+ /** Why the chips cannot be used right now. Implies disabled. */
40
+ disabledReason?: string
41
+ }
42
+
43
+ type SuggestionsContext = {
44
+ select: (text: string) => void
45
+ blocked: () => boolean
46
+ reasonId: () => string | undefined
47
+ }
48
+
49
+ const SuggestionsContext = createContext<SuggestionsContext>()
50
+
51
+ export function Suggestions(props: SuggestionsProps) {
52
+ const [local, rest] = splitProps(props, [
53
+ 'class',
54
+ 'label',
55
+ 'layout',
56
+ 'onSelect',
57
+ 'disabledReason',
58
+ 'children',
59
+ ])
60
+ const uid = createUniqueId()
61
+ const reasonId = `${uid}-reason`
62
+ const reason = () =>
63
+ local.disabledReason
64
+ ? boundText(local.disabledReason, 240)
65
+ : local.onSelect === undefined
66
+ ? 'Suggestions are not available here.'
67
+ : undefined
68
+
69
+ return (
70
+ <SuggestionsContext.Provider
71
+ value={{
72
+ select: (text) => local.onSelect?.(text),
73
+ blocked: () => reason() !== undefined,
74
+ reasonId: () => (reason() ? reasonId : undefined),
75
+ }}
76
+ >
77
+ <div data-slot="suggestions" class="flex min-w-0 flex-col gap-1.5">
78
+ <div
79
+ role="group"
80
+ aria-label={local.label ?? 'Suggested prompts'}
81
+ class={cn(
82
+ 'flex min-w-0 gap-2',
83
+ {
84
+ 'flex-wrap': local.layout !== 'scroll',
85
+ // Padding below keeps the focus ring of a chip from being clipped by the scroller.
86
+ 'flex-nowrap overflow-x-auto p-1 [&>*]:shrink-0': local.layout === 'scroll',
87
+ },
88
+ local.class
89
+ )}
90
+ {...rest}
91
+ >
92
+ {local.children}
93
+ </div>
94
+ <Show when={reason()}>
95
+ <p id={reasonId} role="status" class="m-0 text-xs text-muted-foreground">
96
+ {reason()}
97
+ </p>
98
+ </Show>
99
+ </div>
100
+ </SuggestionsContext.Provider>
101
+ )
102
+ }
103
+
104
+ export type SuggestionProps = Omit<ComponentProps<'button'>, 'onSelect' | 'children'> & {
105
+ /** The text that is sent when the chip is chosen. Also the chip's name. */
106
+ text: string
107
+ }
108
+
109
+ export function Suggestion(props: SuggestionProps) {
110
+ const [local, rest] = splitProps(props, ['class', 'text', 'onClick'])
111
+ const context = useContext(SuggestionsContext)
112
+ // A chip outside a `Suggestions` row has no handler to call: inert and honest.
113
+ const blocked = () => context === undefined || context.blocked()
114
+ const text = () => boundText(local.text, 400)
115
+
116
+ return (
117
+ <Button
118
+ type="button"
119
+ variant="outline"
120
+ size="sm"
121
+ data-slot="suggestion"
122
+ title={text().length > 40 ? text() : undefined}
123
+ aria-disabled={blocked() || undefined}
124
+ aria-describedby={context?.reasonId()}
125
+ class={cn('max-w-full', local.class)}
126
+ onClick={(event) => {
127
+ if (blocked()) {
128
+ event.preventDefault()
129
+ return
130
+ }
131
+ if (typeof local.onClick === 'function') local.onClick(event)
132
+ // The host's own string, untouched: only the label is clipped, never what is sent.
133
+ context?.select(local.text)
134
+ }}
135
+ {...rest}
136
+ >
137
+ <span class="truncate">{text()}</span>
138
+ </Button>
139
+ )
140
+ }
@@ -0,0 +1,14 @@
1
+ export {
2
+ Task,
3
+ TaskItemList,
4
+ TaskItemRow,
5
+ TASK_ITEM_STATUS_LABELS,
6
+ taskProgress,
7
+ taskProgressLabel,
8
+ type TaskFile,
9
+ type TaskItem,
10
+ type TaskItemListProps,
11
+ type TaskItemRowProps,
12
+ type TaskItemStatus,
13
+ type TaskProps,
14
+ } from './task'
@@ -0,0 +1,317 @@
1
+ import {
2
+ Check,
3
+ CircleAlert,
4
+ CircleDashed,
5
+ CircleSlash,
6
+ ListChecks,
7
+ LoaderCircle,
8
+ } from 'lucide-solid'
9
+ import {
10
+ createMemo,
11
+ createSignal,
12
+ For,
13
+ Index,
14
+ Show,
15
+ splitProps,
16
+ type ComponentProps,
17
+ type JSX,
18
+ } from 'solid-js'
19
+ import { cn } from '../../../lib/utils'
20
+ import { Attachment, AttachmentList, type AttachmentKind } from '../../ui/attachment'
21
+ import { Button } from '../../ui/button'
22
+ import { ScrollArea } from '../../ui/scroll-area'
23
+ import { TraceLine, type TraceLineProps } from '../../ui/trace'
24
+
25
+ // A function child runs once, when the content mounts (see `deferred` in `tool.tsx`).
26
+ const deferred = (render: () => JSX.Element) => render as unknown as JSX.Element
27
+
28
+ /**
29
+ * Task.
30
+ *
31
+ * One piece of work the agent is doing, as a `TraceLine` that opens onto its
32
+ * items: a title, then a list in which each item is a sentence, optionally a
33
+ * status, and optionally the files it touched. Reach for `Plan` when the list is
34
+ * a proposal the person approves, for `Queue` when it is the agent's running
35
+ * todo list, and for a `Trace` of tool calls when the items are things that
36
+ * *ran* — a Task item is a statement about work, not a record of a call.
37
+ *
38
+ * ## Items wrap; lines do not
39
+ *
40
+ * A `TraceLine` truncates its title to one row, which is right for "Read
41
+ * src/app.tsx" and wrong for "Backfill locale from profile.language, falling
42
+ * back to en". Items are therefore their own rows with the same mark and colour
43
+ * vocabulary as a Trace line but wrapping text, clamped to three lines so a
44
+ * pasted paragraph cannot take the column. `TaskItemRow` and `TaskItemList` are
45
+ * exported because `Plan` and `Queue` are built from them.
46
+ *
47
+ * ## Status is a claim
48
+ *
49
+ * An item shows a mark and speaks a word only when the host supplied `status`.
50
+ * The "2 of 4 done" in the header is derived from those statuses and appears
51
+ * only if at least one item has one; items without a status are counted in the
52
+ * total and not in "done" (see `taskProgress`). A task with no items is a plain
53
+ * line: there is nothing to open, and an empty disclosure is a control that
54
+ * does nothing.
55
+ *
56
+ * ## Files are untrusted metadata
57
+ *
58
+ * File chips are `Attachment` chips with no handlers, so they are text: a name
59
+ * is never a link or a path. Past six, the rest sit behind one toggle button
60
+ * whose label changes in place, so keyboard focus survives opening and closing
61
+ * it.
62
+ */
63
+ export type TaskItemStatus = 'complete' | 'active' | 'pending' | 'failed' | 'skipped'
64
+
65
+ export type TaskFile = Readonly<{
66
+ name: string
67
+ kind?: AttachmentKind
68
+ /** Bytes. */
69
+ size?: number
70
+ }>
71
+
72
+ export type TaskItem = Readonly<{
73
+ /** Only needed for the host's own bookkeeping; rows are kept by position. */
74
+ id?: string
75
+ text: string
76
+ description?: string
77
+ status?: TaskItemStatus
78
+ files?: readonly TaskFile[]
79
+ }>
80
+
81
+ /** The words spoken for each item status. */
82
+ export const TASK_ITEM_STATUS_LABELS: Readonly<Record<TaskItemStatus, string>> = {
83
+ complete: 'Completed',
84
+ active: 'In progress',
85
+ pending: 'Pending',
86
+ failed: 'Failed',
87
+ skipped: 'Skipped',
88
+ }
89
+
90
+ /** Visible files per item before the rest go behind a toggle. */
91
+ const VISIBLE_FILES = 6
92
+ /** Characters of item text kept; the rest of a pasted wall is not a todo. */
93
+ const MAX_TEXT = 1_000
94
+
95
+ function bound(text: string, max: number): string {
96
+ return text.length > max ? `${text.slice(0, max)}…` : text
97
+ }
98
+
99
+ /**
100
+ * How many items are done, or nothing at all when no item carries a status.
101
+ * Items without a status count toward the total: the host did not say they were
102
+ * finished, so they are not.
103
+ */
104
+ export function taskProgress(
105
+ items: readonly Pick<TaskItem, 'status'>[]
106
+ ): Readonly<{ done: number; total: number }> | undefined {
107
+ if (!items.some((item) => item.status !== undefined)) return undefined
108
+ return {
109
+ done: items.filter((item) => item.status === 'complete').length,
110
+ total: items.length,
111
+ }
112
+ }
113
+
114
+ /** `2 of 4 done`, in words. */
115
+ export function taskProgressLabel(progress: { done: number; total: number }): string {
116
+ return `${progress.done} of ${progress.total} done`
117
+ }
118
+
119
+ function ItemMark(props: { status?: TaskItemStatus }) {
120
+ return (
121
+ <span
122
+ aria-hidden="true"
123
+ data-slot="task-item-mark"
124
+ class={cn('mt-0.5 grid size-4 shrink-0 place-items-center [&_svg]:size-3.5', {
125
+ 'text-muted-foreground': props.status !== 'active' && props.status !== 'failed',
126
+ 'text-info': props.status === 'active',
127
+ 'text-destructive': props.status === 'failed',
128
+ })}
129
+ >
130
+ <Show
131
+ when={props.status}
132
+ fallback={<span class="size-1 rounded-full bg-muted-foreground/60" />}
133
+ >
134
+ {(status) => (
135
+ <>
136
+ <Show when={status() === 'complete'}>
137
+ <Check />
138
+ </Show>
139
+ <Show when={status() === 'active'}>
140
+ <LoaderCircle class="motion-safe:animate-spin" />
141
+ </Show>
142
+ <Show when={status() === 'pending'}>
143
+ <CircleDashed />
144
+ </Show>
145
+ <Show when={status() === 'failed'}>
146
+ <CircleAlert />
147
+ </Show>
148
+ <Show when={status() === 'skipped'}>
149
+ <CircleSlash />
150
+ </Show>
151
+ </>
152
+ )}
153
+ </Show>
154
+ </span>
155
+ )
156
+ }
157
+
158
+ export type TaskItemRowProps = Omit<ComponentProps<'li'>, 'children'> & {
159
+ text: string
160
+ description?: string
161
+ status?: TaskItemStatus
162
+ files?: readonly TaskFile[]
163
+ /** Spoken in place of the default status word. */
164
+ statusLabel?: string
165
+ }
166
+
167
+ export function TaskItemRow(props: TaskItemRowProps) {
168
+ const [local, rest] = splitProps(props, [
169
+ 'class',
170
+ 'text',
171
+ 'description',
172
+ 'status',
173
+ 'files',
174
+ 'statusLabel',
175
+ ])
176
+ const [showAllFiles, setShowAllFiles] = createSignal(false)
177
+ const files = () => local.files ?? []
178
+ const shownFiles = () => (showAllFiles() ? files() : files().slice(0, VISIBLE_FILES))
179
+ const hiddenFiles = () => files().length - VISIBLE_FILES
180
+ const text = () => bound(local.text, MAX_TEXT)
181
+
182
+ return (
183
+ <li
184
+ data-slot="task-item"
185
+ data-status={local.status}
186
+ class={cn('flex min-w-0 gap-2 rounded-md px-1.5 py-0.5', local.class)}
187
+ {...rest}
188
+ >
189
+ <ItemMark status={local.status} />
190
+ <div class="flex min-w-0 flex-1 flex-col gap-1">
191
+ <p
192
+ title={text()}
193
+ class={cn(
194
+ 'm-0 line-clamp-3 text-sm [overflow-wrap:anywhere] whitespace-pre-wrap text-foreground',
195
+ {
196
+ 'text-muted-foreground': local.status === 'complete' || local.status === 'skipped',
197
+ 'text-destructive': local.status === 'failed',
198
+ }
199
+ )}
200
+ >
201
+ {text()}
202
+ <Show when={local.status}>
203
+ {(status) => (
204
+ <span class="sr-only"> {local.statusLabel ?? TASK_ITEM_STATUS_LABELS[status()]}</span>
205
+ )}
206
+ </Show>
207
+ </p>
208
+ <Show when={local.description}>
209
+ {(description) => (
210
+ <p class="m-0 line-clamp-3 text-xs [overflow-wrap:anywhere] text-muted-foreground/80">
211
+ {bound(description(), MAX_TEXT)}
212
+ </p>
213
+ )}
214
+ </Show>
215
+ <Show when={files().length > 0}>
216
+ <AttachmentList aria-label="Files" class="gap-1">
217
+ <For each={shownFiles()}>
218
+ {(file) => (
219
+ <li class="min-w-0 max-w-full">
220
+ <Attachment variant="chip" name={file.name} kind={file.kind} size={file.size} />
221
+ </li>
222
+ )}
223
+ </For>
224
+ <Show when={hiddenFiles() > 0}>
225
+ <li class="flex items-center">
226
+ <Button
227
+ type="button"
228
+ variant="ghost"
229
+ size="2xs"
230
+ aria-expanded={showAllFiles()}
231
+ onClick={() => setShowAllFiles((value) => !value)}
232
+ >
233
+ {showAllFiles() ? 'Show fewer files' : `Show ${hiddenFiles()} more files`}
234
+ </Button>
235
+ </li>
236
+ </Show>
237
+ </AttachmentList>
238
+ </Show>
239
+ </div>
240
+ </li>
241
+ )
242
+ }
243
+
244
+ export type TaskItemListProps = Omit<ComponentProps<'div'>, 'children'> & {
245
+ /** The list's accessible name. A scrolling region without one is an unlabelled tab stop. */
246
+ label: string
247
+ children?: JSX.Element
248
+ }
249
+
250
+ /**
251
+ * The items, bounded. Two hundred todo items must scroll inside their line and
252
+ * not push the answer out of view; the region is keyboard-focusable and named,
253
+ * which is what makes the overflow reachable without a pointer.
254
+ */
255
+ export function TaskItemList(props: TaskItemListProps) {
256
+ const [local, rest] = splitProps(props, ['class', 'label', 'children'])
257
+ return (
258
+ <ScrollArea
259
+ role="region"
260
+ aria-label={local.label}
261
+ class={cn('max-h-72', local.class)}
262
+ {...rest}
263
+ >
264
+ <ul role="list" class="m-0 flex list-none flex-col gap-0.5 p-0">
265
+ {local.children}
266
+ </ul>
267
+ </ScrollArea>
268
+ )
269
+ }
270
+
271
+ export type TaskProps = Omit<
272
+ TraceLineProps,
273
+ 'description' | 'href' | 'onSelect' | 'selectHaspopup' | 'children'
274
+ > & {
275
+ items: readonly TaskItem[]
276
+ /** The item list's accessible name. Defaults to the title when it is a string. */
277
+ itemsLabel?: string
278
+ }
279
+
280
+ export function Task(props: TaskProps) {
281
+ const [local, rest] = splitProps(props, ['items', 'itemsLabel', 'icon', 'meta', 'title'])
282
+ const progress = createMemo(() => taskProgress(local.items))
283
+ const derivedMeta = () => {
284
+ const value = progress()
285
+ return value ? taskProgressLabel(value) : undefined
286
+ }
287
+ const label = () =>
288
+ local.itemsLabel ?? (typeof local.title === 'string' ? `${local.title} items` : 'Task items')
289
+
290
+ // A function child is only run when the content mounts, so a collapsed task
291
+ // with hundreds of items renders none of them.
292
+ const list = () => (
293
+ <TaskItemList label={label()}>
294
+ <Index each={local.items}>
295
+ {(item) => (
296
+ <TaskItemRow
297
+ text={item().text}
298
+ description={item().description}
299
+ status={item().status}
300
+ files={item().files}
301
+ />
302
+ )}
303
+ </Index>
304
+ </TaskItemList>
305
+ )
306
+
307
+ return (
308
+ <TraceLine
309
+ icon={local.icon ?? <ListChecks />}
310
+ title={local.title}
311
+ meta={local.meta ?? derivedMeta()}
312
+ {...rest}
313
+ >
314
+ {local.items.length > 0 ? deferred(list) : undefined}
315
+ </TraceLine>
316
+ )
317
+ }