@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,405 @@
1
+ import { File, Folder, FolderOpen } from 'lucide-solid'
2
+ import {
3
+ createComputed,
4
+ createMemo,
5
+ createSignal,
6
+ For,
7
+ onCleanup,
8
+ Show,
9
+ splitProps,
10
+ untrack,
11
+ type ComponentProps,
12
+ } from 'solid-js'
13
+ import { keyedRows } from '#lib/keyed-rows'
14
+ import { cn } from '#lib/utils'
15
+ import { Button } from '../../ui/button'
16
+ import { Badge } from '../../ui/badge'
17
+ import { Tree, TreeRow, type TreeItemDescriptor } from '../tree'
18
+ import {
19
+ buildFileTree,
20
+ clampWindow,
21
+ countChanges,
22
+ describeChanges,
23
+ FILE_CHANGE_LABELS,
24
+ flattenFileTree,
25
+ indexFileTree,
26
+ initialExpanded,
27
+ revealInWindow,
28
+ typeaheadIndex,
29
+ type RowWindow,
30
+ type FileChangeInput,
31
+ type FileChangeKind,
32
+ type FileTreeExpansion,
33
+ type FileTreeNode,
34
+ type FileTreeRow,
35
+ } from './build-file-tree'
36
+
37
+ /**
38
+ * FileTree.
39
+ *
40
+ * The files an agent changed, as a folder tree. It is for a change set — dozens
41
+ * to thousands of paths with an optional change kind each — and not for browsing
42
+ * a workspace: it has no rename, drag, or filesystem action, and it never opens
43
+ * anything. Reach for `Trace` lines when the agent touched two or three files, and
44
+ * for the shared `Tree` directly when the host owns a real file explorer.
45
+ *
46
+ * ## Built on `Tree`, and why that fits
47
+ *
48
+ * `Tree` supplies the treeitem semantics and the WAI-ARIA keyboard model (arrows,
49
+ * Home/End, roving tab stop) and leaves the projection to the host. A changed-file
50
+ * tree is small enough that the whole projection can live in memory, and the
51
+ * `Tree` contract for a mounted window — a complete `visibleItems` list with only
52
+ * some rows rendered, `onRequestReveal` to mount a row the keyboard moved to — is
53
+ * exactly the seam a bounded render needs, so this adds no navigation code of
54
+ * its own. What it adds is typeahead, which `Tree` does not provide: a typed
55
+ * prefix jumps to the next row whose name starts with it.
56
+ *
57
+ * ## Large trees
58
+ *
59
+ * A collapsed folder's subtree is never visited or rendered, so a 5 000-file tree
60
+ * costs what is visible. A tree of more than 100 files starts with only its top
61
+ * level open (`defaultExpanded` overrides). Past `maxRows` visible rows only a
62
+ * window of them is mounted, with a control above and below to move it a page at
63
+ * a time. The full list is what keyboard navigation walks: an arrow key at the
64
+ * window's edge grows it by a page, and a jump (End, Home, a typed letter) moves
65
+ * it to the page holding the target instead of mounting every row between, so End
66
+ * on a tree of thousands of open rows stays one page of work.
67
+ *
68
+ * ## Changes are claims
69
+ *
70
+ * A change kind is drawn — as a word on the row, so it is also spoken — only for a
71
+ * file the host gave one. A file without one is listed and nothing more is said.
72
+ * The summary counts what was supplied, and is silent about files with no kind.
73
+ * Paths that are not acceptable (`..` segments, control characters) are not drawn;
74
+ * their number is stated, so the list is never quietly shorter than the input.
75
+ *
76
+ * ## Selection is the host's
77
+ *
78
+ * Rows select only when `onSelect` is supplied; without it no row is selectable
79
+ * and `aria-selected` is not set. Enter or a click on a folder expands it; on a
80
+ * file it selects. Space selects either. The tree never opens a file itself — the
81
+ * path is untrusted text, and what it means on this machine is the host's call.
82
+ */
83
+ export type FileTreeProps = Omit<ComponentProps<'div'>, 'children' | 'onSelect'> & {
84
+ /** Paths, or paths with a change kind. Both `/` and `\` separate segments. */
85
+ files: readonly (string | FileChangeInput)[]
86
+ /** The tree's accessible name. Default "Changed files". */
87
+ label?: string
88
+ /**
89
+ * Which folders start open: `true` all, `false` none, a number to that depth,
90
+ * or a list of ids. Unset opens a small tree fully and a large one at its top level.
91
+ */
92
+ defaultExpanded?: FileTreeExpansion
93
+ /** Merge a folder with a single folder child into one row. Default true. */
94
+ compact?: boolean
95
+ /** The selected node's id. Meaningful only with `onSelect`. */
96
+ selected?: string
97
+ /** Make rows selectable. Omit and nothing is selectable. */
98
+ onSelect?: (path: string, node: FileTreeNode) => void
99
+ /** Height of the tree box, which scrolls past it. A number is pixels. Default `20rem`. */
100
+ maxHeight?: number | string
101
+ /** Visible rows mounted at once; more are added a page at a time. Default 500. */
102
+ maxRows?: number
103
+ /** Show the count of changes above the tree. Default true. */
104
+ showSummary?: boolean
105
+ }
106
+
107
+ export const FILE_TREE_MAX_ROWS = 500
108
+
109
+ const CHANGE_VARIANT: Readonly<
110
+ Record<FileChangeKind, 'success' | 'warning' | 'destructive' | 'info'>
111
+ > = {
112
+ added: 'success',
113
+ modified: 'warning',
114
+ deleted: 'destructive',
115
+ renamed: 'info',
116
+ }
117
+
118
+ function descriptor(row: FileTreeRow): TreeItemDescriptor {
119
+ return {
120
+ id: row.node.id,
121
+ parentId: row.parentId,
122
+ level: row.level,
123
+ expandable: row.node.kind === 'directory',
124
+ expanded: row.expanded,
125
+ }
126
+ }
127
+
128
+ function RowContent(props: { row: FileTreeRow }) {
129
+ const node = () => props.row.node
130
+ return (
131
+ <>
132
+ <span
133
+ class={cn('truncate', {
134
+ 'text-muted-foreground line-through': node().change === 'deleted',
135
+ })}
136
+ title={node().id}
137
+ >
138
+ {node().name}
139
+ </span>
140
+ <Show when={node().renamedFrom}>
141
+ <span class="sr-only">, renamed from {node().renamedFrom}</span>
142
+ </Show>
143
+ </>
144
+ )
145
+ }
146
+
147
+ function RowTrailing(props: { row: FileTreeRow }) {
148
+ const node = () => props.row.node
149
+ return (
150
+ <>
151
+ <Show when={node().kind === 'file' && (node().additions || node().deletions)}>
152
+ <span class="font-code text-2xs tabular-nums">
153
+ <Show when={node().additions !== undefined}>
154
+ <span class="text-foreground">+{node().additions}</span>
155
+ </Show>{' '}
156
+ <Show when={node().deletions !== undefined}>
157
+ <span class="text-foreground">−{node().deletions}</span>
158
+ </Show>
159
+ </span>
160
+ </Show>
161
+ <Show when={node().kind === 'directory' && !props.row.expanded}>
162
+ <span class="text-2xs tabular-nums">
163
+ {node().fileCount.toLocaleString()} {node().fileCount === 1 ? 'file' : 'files'}
164
+ </span>
165
+ </Show>
166
+ {/* The word is the signal; the tint only helps a sighted reader find it. */}
167
+ <Show when={node().change}>
168
+ {(change) => (
169
+ <Badge variant={CHANGE_VARIANT[change()]} size="sm">
170
+ {FILE_CHANGE_LABELS[change()]}
171
+ </Badge>
172
+ )}
173
+ </Show>
174
+ </>
175
+ )
176
+ }
177
+
178
+ export function FileTree(props: FileTreeProps) {
179
+ const [local, rest] = splitProps(props, [
180
+ 'files',
181
+ 'label',
182
+ 'defaultExpanded',
183
+ 'compact',
184
+ 'selected',
185
+ 'onSelect',
186
+ 'maxHeight',
187
+ 'maxRows',
188
+ 'showSummary',
189
+ 'class',
190
+ ])
191
+
192
+ const build = createMemo(() => buildFileTree(local.files, { compact: local.compact }))
193
+ const nodes = createMemo(() => indexFileTree(build().roots))
194
+ const counts = createMemo(() => countChanges(build().roots))
195
+
196
+ // Folders the tree has already decided about. A change set that grows while
197
+ // the agent works opens its new folders by the same rule as the first render,
198
+ // and never reopens one the reader closed.
199
+ const [expanded, setExpanded] = createSignal<ReadonlySet<string>>(new Set())
200
+ let seen = new Set<string>()
201
+ createComputed(() => {
202
+ const { roots, fileCount } = build()
203
+ const wanted = initialExpanded(roots, local.defaultExpanded, fileCount)
204
+ const folders = new Set<string>()
205
+ for (const [id, node] of nodes()) if (node.kind === 'directory') folders.add(id)
206
+ untrack(() => {
207
+ const next = new Set([...expanded()].filter((id) => folders.has(id)))
208
+ for (const id of wanted) if (!seen.has(id)) next.add(id)
209
+ seen = folders
210
+ setExpanded(next)
211
+ })
212
+ })
213
+
214
+ const rows = createMemo(() => flattenFileTree(build().roots, expanded()))
215
+ const pageSize = () => Math.max(1, Math.floor(local.maxRows ?? FILE_TREE_MAX_ROWS))
216
+ const [requested, setRequested] = createSignal<RowWindow>({ start: 0, end: 0 })
217
+ const mountedWindow = createMemo(() =>
218
+ clampWindow(
219
+ requested().end === 0 ? { start: 0, end: pageSize() } : requested(),
220
+ rows().length,
221
+ pageSize()
222
+ )
223
+ )
224
+ const items = createMemo(() => rows().map(descriptor))
225
+ const mounted = keyedRows(
226
+ () => rows().slice(mountedWindow().start, mountedWindow().end),
227
+ (row) => row.node.id
228
+ )
229
+ const rowsBefore = () => mountedWindow().start
230
+ const rowsAfter = () => Math.max(0, rows().length - mountedWindow().end)
231
+
232
+ const [activeId, setActiveId] = createSignal<string | null>(null)
233
+ const selectable = () => local.onSelect !== undefined
234
+
235
+ const toggle = (id: string, open: boolean) => {
236
+ setExpanded((current) => {
237
+ const next = new Set(current)
238
+ if (open) next.add(id)
239
+ else next.delete(id)
240
+ return next
241
+ })
242
+ }
243
+
244
+ /** Mount the rows around one the keyboard is moving to, so focus can land on it. */
245
+ const reveal = (id: string) => {
246
+ const index = rows().findIndex((row) => row.node.id === id)
247
+ setRequested(revealInWindow(mountedWindow(), index, rows().length, pageSize()))
248
+ }
249
+
250
+ const select = (id: string) => {
251
+ const node = nodes().get(id)
252
+ if (node) local.onSelect?.(id, node)
253
+ }
254
+ const activate = (id: string) => {
255
+ const node = nodes().get(id)
256
+ if (!node) return
257
+ if (node.kind === 'directory') toggle(id, !expanded().has(id))
258
+ else select(id)
259
+ }
260
+
261
+ let container: HTMLDivElement | undefined
262
+ let typed = ''
263
+ let typedTimer: ReturnType<typeof setTimeout> | undefined
264
+ onCleanup(() => clearTimeout(typedTimer))
265
+ const typeahead = (event: KeyboardEvent) => {
266
+ if (
267
+ event.defaultPrevented ||
268
+ event.ctrlKey ||
269
+ event.metaKey ||
270
+ event.altKey ||
271
+ event.key.length !== 1 ||
272
+ event.key === ' '
273
+ ) {
274
+ return
275
+ }
276
+ typed += event.key
277
+ clearTimeout(typedTimer)
278
+ typedTimer = setTimeout(() => (typed = ''), 700)
279
+ const all = rows()
280
+ const active = all.findIndex((row) => row.node.id === activeId())
281
+ const target = typeaheadIndex(
282
+ all.map((row) => row.node.name),
283
+ active,
284
+ typed
285
+ )
286
+ const row = all[target]
287
+ if (!row) return
288
+ event.preventDefault()
289
+ const id = row.node.id
290
+ reveal(id)
291
+ setActiveId(id)
292
+ queueMicrotask(() => {
293
+ for (const element of container?.querySelectorAll<HTMLElement>('[data-tree-id]') ?? []) {
294
+ if (element.dataset.treeId === id) {
295
+ element.focus()
296
+ break
297
+ }
298
+ }
299
+ })
300
+ }
301
+
302
+ const maxHeight = () =>
303
+ typeof local.maxHeight === 'number' ? `${local.maxHeight}px` : (local.maxHeight ?? '20rem')
304
+
305
+ return (
306
+ <div
307
+ data-slot="file-tree"
308
+ class={cn('flex min-w-0 flex-col gap-1', local.class)}
309
+ ref={(element) => (container = element)}
310
+ {...rest}
311
+ >
312
+ <Show when={local.showSummary !== false}>
313
+ <p data-slot="file-tree-summary" class="m-0 text-xs text-muted-foreground">
314
+ {describeChanges(counts())}
315
+ <Show when={build().rejected.length > 0}>
316
+ {' '}
317
+ · {build().rejected.length.toLocaleString()}{' '}
318
+ {build().rejected.length === 1 ? 'path' : 'paths'} ignored as not valid
319
+ </Show>
320
+ </p>
321
+ </Show>
322
+ <Show when={rows().length === 0 && local.showSummary === false}>
323
+ <p class="m-0 text-xs text-muted-foreground">No changed files</p>
324
+ </Show>
325
+ <Show when={rows().length > 0}>
326
+ {/* The listener sits on the wrapper because `Tree` owns its own keydown
327
+ and ignores printable keys; typeahead picks up where it stops. */}
328
+ <Show when={rowsBefore() > 0}>
329
+ <div>
330
+ <Button
331
+ variant="ghost"
332
+ size="2xs"
333
+ onClick={() =>
334
+ setRequested({
335
+ start: Math.max(0, mountedWindow().start - pageSize()),
336
+ end: mountedWindow().end,
337
+ })
338
+ }
339
+ >
340
+ Show {Math.min(rowsBefore(), pageSize()).toLocaleString()} earlier rows (
341
+ {rowsBefore().toLocaleString()} not shown)
342
+ </Button>
343
+ </div>
344
+ </Show>
345
+ <div
346
+ class="scroll-fade overflow-auto rounded-md"
347
+ style={{ 'max-height': maxHeight() }}
348
+ onKeyDown={typeahead}
349
+ >
350
+ <Tree
351
+ aria-label={local.label ?? 'Changed files'}
352
+ visibleItems={items()}
353
+ activeId={activeId()}
354
+ onActiveIdChange={setActiveId}
355
+ onExpand={toggle}
356
+ onActivate={(id) => activate(id)}
357
+ onSelectItem={(id) => select(id)}
358
+ onRequestReveal={reveal}
359
+ selectionMode={selectable() ? 'single' : undefined}
360
+ >
361
+ <For each={mounted()}>
362
+ {(entry) => (
363
+ <TreeRow
364
+ item={descriptor(entry.item())}
365
+ selected={selectable() ? local.selected === entry.item().node.id : undefined}
366
+ leading={
367
+ entry.item().node.kind === 'directory' ? (
368
+ entry.item().expanded ? (
369
+ <FolderOpen aria-hidden="true" class="text-muted-foreground" />
370
+ ) : (
371
+ <Folder aria-hidden="true" class="text-muted-foreground" />
372
+ )
373
+ ) : (
374
+ <File aria-hidden="true" class="text-muted-foreground" />
375
+ )
376
+ }
377
+ trailing={<RowTrailing row={entry.item()} />}
378
+ >
379
+ <RowContent row={entry.item()} />
380
+ </TreeRow>
381
+ )}
382
+ </For>
383
+ </Tree>
384
+ </div>
385
+ <Show when={rowsAfter() > 0}>
386
+ <div>
387
+ <Button
388
+ variant="ghost"
389
+ size="2xs"
390
+ onClick={() =>
391
+ setRequested({
392
+ start: mountedWindow().start,
393
+ end: Math.min(rows().length, mountedWindow().end + pageSize()),
394
+ })
395
+ }
396
+ >
397
+ Show {Math.min(rowsAfter(), pageSize()).toLocaleString()} more rows (
398
+ {rowsAfter().toLocaleString()} not shown)
399
+ </Button>
400
+ </div>
401
+ </Show>
402
+ </Show>
403
+ </div>
404
+ )
405
+ }
@@ -0,0 +1,25 @@
1
+ export { FileTree, FILE_TREE_MAX_ROWS, type FileTreeProps } from './file-tree'
2
+ export {
3
+ buildFileTree,
4
+ clampWindow,
5
+ countChanges,
6
+ describeChanges,
7
+ FILE_CHANGE_LABELS,
8
+ FILE_TREE_AUTO_EXPAND_LIMIT,
9
+ FILE_TREE_MAX_DEPTH,
10
+ flattenFileTree,
11
+ indexFileTree,
12
+ initialExpanded,
13
+ normalizePath,
14
+ revealInWindow,
15
+ typeaheadIndex,
16
+ type BuildFileTreeOptions,
17
+ type ChangeCounts,
18
+ type FileChangeInput,
19
+ type FileChangeKind,
20
+ type FileTreeBuild,
21
+ type FileTreeExpansion,
22
+ type FileTreeNode,
23
+ type FileTreeRow,
24
+ type RowWindow,
25
+ } from './build-file-tree'
@@ -0,0 +1,78 @@
1
+ import { boundText, sourceHost, sourceTitle, type Source } from '../sources/source'
2
+
3
+ /** Characters of a host or title that fit in a badge before it is clipped. */
4
+ const LABEL_LIMIT = 24
5
+
6
+ /**
7
+ * The text on a citation badge.
8
+ *
9
+ * A 1-based `index` wins, because a number is what the sentence's own markers
10
+ * and the Sources list use. Without one the badge shows the source's host (read
11
+ * from the parsed URL, so it cannot be spoofed by a title), then a clipped title,
12
+ * and only then a neutral word — never an invented number.
13
+ */
14
+ export function citationLabel(index: number | undefined, source: Source | undefined): string {
15
+ if (index !== undefined && Number.isInteger(index) && index >= 1 && index <= 9999) {
16
+ return String(index)
17
+ }
18
+ if (source === undefined) return 'source'
19
+ const host = sourceHost(source.url)
20
+ if (host !== undefined) return boundText(host, LABEL_LIMIT)
21
+ return boundText(source.title, LABEL_LIMIT) || 'source'
22
+ }
23
+
24
+ /**
25
+ * The badge's accessible name. The visible label is a number or a host, which
26
+ * says nothing on its own, so the name carries the title and host: a screen-reader
27
+ * or voice-control user learns what is cited without opening the popover.
28
+ */
29
+ export function citationName(sources: readonly Source[], index: number | undefined): string {
30
+ const first = sources[0]
31
+ if (first === undefined) return 'Citation'
32
+ const label = citationLabel(index, first)
33
+ if (sources.length > 1) return `Sources ${label} and ${sources.length - 1} more`
34
+ const host = sourceHost(first.url)
35
+ const title = sourceTitle(first)
36
+ return host !== undefined && host !== title
37
+ ? `Source ${label}: ${title}, ${host}`
38
+ : `Source ${label}: ${title}`
39
+ }
40
+
41
+ /** Wrap a position into 0..count-1, so Previous on the first source goes to the last. */
42
+ export function wrapIndex(position: number, count: number): number {
43
+ if (count <= 0) return 0
44
+ return ((position % count) + count) % count
45
+ }
46
+
47
+ /**
48
+ * How a citation's popover is open.
49
+ *
50
+ * - `peek` is a hover or keyboard-focus preview: it does not take focus, and it
51
+ * goes away when the pointer or focus does.
52
+ * - `pinned` is a deliberate open (click, tap, Enter, Space): focus moves into
53
+ * the popover so its link and Previous/Next are reachable, and it stays until
54
+ * Escape, an outside press, or the badge is pressed again.
55
+ *
56
+ * A popover that only opened on hover would exclude keyboard and touch readers;
57
+ * one that only opened on press would make pointer users click to glance at a
58
+ * source. This is the smallest model that serves both, and it is a pure function
59
+ * so the awkward transitions (hover then click must pin, not toggle shut) are
60
+ * tested rather than argued about.
61
+ */
62
+ export type CitationMode = 'closed' | 'peek' | 'pinned'
63
+ export type CitationEvent = 'enter' | 'leave' | 'focus' | 'blur' | 'press' | 'dismiss'
64
+
65
+ export function nextCitationMode(mode: CitationMode, event: CitationEvent): CitationMode {
66
+ switch (event) {
67
+ case 'press':
68
+ return mode === 'pinned' ? 'closed' : 'pinned'
69
+ case 'dismiss':
70
+ return 'closed'
71
+ case 'enter':
72
+ case 'focus':
73
+ return mode === 'closed' ? 'peek' : mode
74
+ case 'leave':
75
+ case 'blur':
76
+ return mode === 'peek' ? 'closed' : mode
77
+ }
78
+ }
@@ -0,0 +1,9 @@
1
+ export { InlineCitation, messageCitations, type InlineCitationProps } from './inline-citation'
2
+ export {
3
+ citationLabel,
4
+ citationName,
5
+ nextCitationMode,
6
+ wrapIndex,
7
+ type CitationEvent,
8
+ type CitationMode,
9
+ } from './citation'