@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,674 @@
1
+ /**
2
+ * A terminal's text, read safely.
3
+ *
4
+ * Command output is untrusted bytes, not text: it carries colour for the human
5
+ * who ran the command, cursor control for a screen that is not here, and — from
6
+ * a hostile program — sequences that ask a terminal emulator to rewrite its
7
+ * title, write to the clipboard (OSC 52) or hide what it printed. This parser
8
+ * accepts exactly the part a transcript can honour and drops the rest:
9
+ *
10
+ * - **Kept:** printable text, `\n`, `\r` (the cursor returns to column 0 and
11
+ * later text overwrites, which is how a progress bar redraws itself), `\b`
12
+ * (the cursor steps back one column), tab, `ESC[…K` (erase in line, which
13
+ * progress bars pair with `\r`), and SGR `ESC[…m` for the sixteen theme
14
+ * colours, bold, dim, italic, underline, strike-through and reverse video.
15
+ * - **Mapped:** 256-colour and truecolour SGR become the nearest of the sixteen,
16
+ * so the output keeps the theme's palette and its contrast guarantees instead
17
+ * of a program's idea of "dark blue" on a light terminal.
18
+ * - **Dropped, never echoed:** every other CSI (cursor movement, scrolling,
19
+ * private modes), OSC, DCS/SOS/PM/APC strings, charset designations, the 8-bit
20
+ * C1 forms of all of these, every other control character, and the Unicode
21
+ * bidirectional overrides that make text read differently from how it is
22
+ * stored. A malformed or truncated sequence is dropped with its payload, so a
23
+ * half-received `ESC[3` never shows up as the text "3".
24
+ *
25
+ * Nothing here produces markup. The result is plain strings with a style object,
26
+ * and the renderer decides what a style looks like.
27
+ *
28
+ * ## Why a stateful parser
29
+ *
30
+ * Output arrives in chunks that split anywhere — inside an escape sequence, in
31
+ * the middle of a line. `createAnsiParser` keeps the half-read sequence, the
32
+ * current style and the line being written between `write` calls, so a chunk
33
+ * boundary changes nothing about the result. Finished lines are immutable and
34
+ * never touched again, which is what lets a renderer keep their DOM while the
35
+ * last line keeps growing. `parseAnsi` is the same thing run once.
36
+ */
37
+
38
+ /** An index into the sixteen-colour palette: 0–7 normal, 8–15 bright. */
39
+ export type AnsiColor = number
40
+
41
+ export type AnsiStyle = Readonly<{
42
+ fg?: AnsiColor
43
+ bg?: AnsiColor
44
+ bold?: true
45
+ dim?: true
46
+ italic?: true
47
+ underline?: true
48
+ strike?: true
49
+ inverse?: true
50
+ }>
51
+
52
+ export type AnsiSegment = Readonly<{ text: string; style: AnsiStyle }>
53
+
54
+ export type AnsiLine = Readonly<{
55
+ segments: readonly AnsiSegment[]
56
+ /** Characters past `maxLineLength` that were not kept. Zero for most lines. */
57
+ truncated: number
58
+ }>
59
+
60
+ export type AnsiParserOptions = {
61
+ /** Characters kept per line; the rest are counted in `truncated`. Default 10 000. */
62
+ maxLineLength?: number
63
+ /**
64
+ * Finished lines kept. The oldest are discarded (and counted in `droppedLines`)
65
+ * past this, so a command that prints for an hour cannot grow the parser
66
+ * without bound. Default 200 000.
67
+ */
68
+ retainLines?: number
69
+ }
70
+
71
+ export type AnsiParser = {
72
+ /** Feed the next chunk. Chunks may split anywhere, including inside an escape. */
73
+ write(chunk: string): void
74
+ /** Finished lines, oldest first. The array is mutated in place as lines arrive. */
75
+ readonly lines: readonly AnsiLine[]
76
+ /** The line still being written, or `undefined` while it is empty. */
77
+ openLine(): AnsiLine | undefined
78
+ /** Finished lines discarded because of `retainLines`. */
79
+ readonly droppedLines: number
80
+ }
81
+
82
+ export const ANSI_MAX_LINE_LENGTH = 10_000
83
+ export const ANSI_RETAIN_LINES = 200_000
84
+
85
+ /** Longest CSI parameter string worth reading; a real SGR is under 40 characters. */
86
+ const CSI_MAX = 256
87
+
88
+ const PLAIN: AnsiStyle = Object.freeze({})
89
+ const styleCache = new Map<string, AnsiStyle>()
90
+ const STYLE_CACHE_LIMIT = 4096
91
+
92
+ /**
93
+ * Styles are shared by value so a long run of identical style compares by
94
+ * reference when cells are merged into segments, and so a million coloured
95
+ * characters do not allocate a million style objects.
96
+ */
97
+ function intern(style: {
98
+ fg?: AnsiColor
99
+ bg?: AnsiColor
100
+ bold?: boolean
101
+ dim?: boolean
102
+ italic?: boolean
103
+ underline?: boolean
104
+ strike?: boolean
105
+ inverse?: boolean
106
+ }): AnsiStyle {
107
+ const key = [
108
+ style.fg ?? '',
109
+ style.bg ?? '',
110
+ style.bold ? 'b' : '',
111
+ style.dim ? 'd' : '',
112
+ style.italic ? 'i' : '',
113
+ style.underline ? 'u' : '',
114
+ style.strike ? 's' : '',
115
+ style.inverse ? 'r' : '',
116
+ ].join('|')
117
+ if (key === '|||||||') return PLAIN
118
+ const cached = styleCache.get(key)
119
+ if (cached) return cached
120
+ const next: AnsiStyle = Object.freeze({
121
+ ...(style.fg !== undefined && { fg: style.fg }),
122
+ ...(style.bg !== undefined && { bg: style.bg }),
123
+ ...(style.bold && { bold: true as const }),
124
+ ...(style.dim && { dim: true as const }),
125
+ ...(style.italic && { italic: true as const }),
126
+ ...(style.underline && { underline: true as const }),
127
+ ...(style.strike && { strike: true as const }),
128
+ ...(style.inverse && { inverse: true as const }),
129
+ })
130
+ if (styleCache.size < STYLE_CACHE_LIMIT) styleCache.set(key, next)
131
+ return next
132
+ }
133
+
134
+ /** Whether a style paints nothing, so the renderer can emit a bare text node. */
135
+ export function isPlainStyle(style: AnsiStyle): boolean {
136
+ return (
137
+ style.fg === undefined &&
138
+ style.bg === undefined &&
139
+ !style.bold &&
140
+ !style.dim &&
141
+ !style.italic &&
142
+ !style.underline &&
143
+ !style.strike &&
144
+ !style.inverse
145
+ )
146
+ }
147
+
148
+ /**
149
+ * The colours a style actually paints. Reverse video swaps them; a swapped side
150
+ * with no colour of its own resolves to the terminal's default foreground or
151
+ * background (`'default-fg'`, `'default-bg'`), which are themselves theme tokens.
152
+ */
153
+ export type ResolvedColors = Readonly<{
154
+ fg: AnsiColor | 'default-bg' | undefined
155
+ bg: AnsiColor | 'default-fg' | undefined
156
+ }>
157
+
158
+ export function resolveColors(style: AnsiStyle): ResolvedColors {
159
+ if (!style.inverse) return { fg: style.fg, bg: style.bg }
160
+ return { fg: style.bg ?? 'default-bg', bg: style.fg ?? 'default-fg' }
161
+ }
162
+
163
+ // The xterm default palette, used only to decide which of the sixteen theme
164
+ // colours an extended colour is closest to.
165
+ const XTERM_16: readonly (readonly [number, number, number])[] = [
166
+ [0, 0, 0],
167
+ [205, 0, 0],
168
+ [0, 205, 0],
169
+ [205, 205, 0],
170
+ [0, 0, 238],
171
+ [205, 0, 205],
172
+ [0, 205, 205],
173
+ [229, 229, 229],
174
+ [127, 127, 127],
175
+ [255, 0, 0],
176
+ [0, 255, 0],
177
+ [255, 255, 0],
178
+ [92, 92, 255],
179
+ [255, 0, 255],
180
+ [0, 255, 255],
181
+ [255, 255, 255],
182
+ ]
183
+ const CUBE_LEVELS = [0, 95, 135, 175, 215, 255] as const
184
+
185
+ const clamp = (value: number) => Math.min(255, Math.max(0, Math.round(value) || 0))
186
+
187
+ /** The palette index (0–15) nearest to an RGB colour. Channels are clamped to 0–255. */
188
+ export function nearestAnsiColor(r: number, g: number, b: number): AnsiColor {
189
+ const red = clamp(r)
190
+ const green = clamp(g)
191
+ const blue = clamp(b)
192
+ let best = 0
193
+ let bestDistance = Infinity
194
+ for (let index = 0; index < XTERM_16.length; index += 1) {
195
+ const [pr, pg, pb] = XTERM_16[index]!
196
+ // The weights are the "redmean" approximation: cheap, and much closer to how
197
+ // the eye separates two colours than plain Euclidean distance.
198
+ const meanRed = (red + pr) / 2
199
+ const dr = red - pr
200
+ const dg = green - pg
201
+ const db = blue - pb
202
+ const distance =
203
+ (2 + meanRed / 256) * dr * dr + 4 * dg * dg + (2 + (255 - meanRed) / 256) * db * db
204
+ if (distance < bestDistance) {
205
+ bestDistance = distance
206
+ best = index
207
+ }
208
+ }
209
+ return best
210
+ }
211
+
212
+ /** Map a 256-colour index to the sixteen. Out-of-range indices give `undefined`. */
213
+ export function ansi256ToColor(index: number): AnsiColor | undefined {
214
+ if (!Number.isInteger(index) || index < 0 || index > 255) return undefined
215
+ if (index < 16) return index
216
+ if (index >= 232) {
217
+ const grey = 8 + (index - 232) * 10
218
+ return nearestAnsiColor(grey, grey, grey)
219
+ }
220
+ const cube = index - 16
221
+ return nearestAnsiColor(
222
+ CUBE_LEVELS[Math.floor(cube / 36)]!,
223
+ CUBE_LEVELS[Math.floor(cube / 6) % 6]!,
224
+ CUBE_LEVELS[cube % 6]!
225
+ )
226
+ }
227
+
228
+ type MutableStyle = {
229
+ fg?: AnsiColor
230
+ bg?: AnsiColor
231
+ bold?: boolean
232
+ dim?: boolean
233
+ italic?: boolean
234
+ underline?: boolean
235
+ strike?: boolean
236
+ inverse?: boolean
237
+ }
238
+
239
+ /** A parameter is a short run of digits; anything else is not a number we trust. */
240
+ function toNumber(token: string | undefined): number | undefined {
241
+ if (token === undefined) return undefined
242
+ if (token === '') return 0
243
+ if (token.length > 5 || !/^\d+$/.test(token)) return undefined
244
+ return Number(token)
245
+ }
246
+
247
+ /**
248
+ * Apply one SGR parameter list to a style. Unknown parameters are skipped one
249
+ * at a time, so a program using a code we ignore still gets the colours around
250
+ * it. Extended colours (38/48) consume their operands whether or not they are
251
+ * valid, so a malformed one cannot be re-read as unrelated codes.
252
+ */
253
+ function applySgr(current: AnsiStyle, params: string): AnsiStyle {
254
+ const style: MutableStyle = { ...current }
255
+ const tokens = params === '' ? ['0'] : params.split(';')
256
+
257
+ for (let i = 0; i < tokens.length; i += 1) {
258
+ const token = tokens[i]!
259
+ // The colon form `38:2::r:g:b` carries its operands in one token.
260
+ if (token.includes(':')) {
261
+ const parts = token.split(':')
262
+ const head = toNumber(parts[0])
263
+ if (head === 38 || head === 48) {
264
+ const color = extendedColor(parts[1] === undefined ? [] : parts.slice(1), true)
265
+ if (color !== null) assign(style, head, color)
266
+ } else if (head === 4) {
267
+ if (parts[1] === '0') style.underline = false
268
+ else style.underline = true
269
+ }
270
+ continue
271
+ }
272
+
273
+ const code = toNumber(token)
274
+ if (code === undefined) continue
275
+
276
+ if (code === 38 || code === 48) {
277
+ const mode = toNumber(tokens[i + 1])
278
+ const count = mode === 5 ? 1 : mode === 2 ? 3 : 0
279
+ const operands = tokens.slice(i + 2, i + 2 + count)
280
+ i += 1 + count
281
+ const color = extendedColor([String(mode ?? ''), ...operands], false)
282
+ if (color !== null) assign(style, code, color)
283
+ continue
284
+ }
285
+ if (code === 58) {
286
+ // Underline colour: consumed so its operands are not read as codes, then ignored.
287
+ const mode = toNumber(tokens[i + 1])
288
+ i += 1 + (mode === 5 ? 1 : mode === 2 ? 3 : 0)
289
+ continue
290
+ }
291
+
292
+ if (code === 0) {
293
+ delete style.fg
294
+ delete style.bg
295
+ style.bold = style.dim = style.italic = style.underline = false
296
+ style.strike = style.inverse = false
297
+ } else if (code === 1) style.bold = true
298
+ else if (code === 2) style.dim = true
299
+ else if (code === 3) style.italic = true
300
+ else if (code === 4 || code === 21) style.underline = true
301
+ else if (code === 7) style.inverse = true
302
+ else if (code === 9) style.strike = true
303
+ else if (code === 22) style.bold = style.dim = false
304
+ else if (code === 23) style.italic = false
305
+ else if (code === 24) style.underline = false
306
+ else if (code === 27) style.inverse = false
307
+ else if (code === 29) style.strike = false
308
+ else if (code >= 30 && code <= 37) style.fg = code - 30
309
+ else if (code === 39) delete style.fg
310
+ else if (code >= 40 && code <= 47) style.bg = code - 40
311
+ else if (code === 49) delete style.bg
312
+ else if (code >= 90 && code <= 97) style.fg = code - 90 + 8
313
+ else if (code >= 100 && code <= 107) style.bg = code - 100 + 8
314
+ // Blink (5, 6), conceal (8), overline (53) and the rest are ignored. Conceal
315
+ // in particular is not honoured: output must not be able to hide itself.
316
+ }
317
+ return intern(style)
318
+ }
319
+
320
+ /** The colour an extended-colour operand list names, or `null` when it is invalid. */
321
+ function extendedColor(parts: readonly string[], colon: boolean): AnsiColor | null {
322
+ const mode = toNumber(parts[0])
323
+ if (mode === 5) {
324
+ const index = toNumber(parts[1])
325
+ const color = index === undefined ? undefined : ansi256ToColor(index)
326
+ return color ?? null
327
+ }
328
+ if (mode === 2) {
329
+ // In the colon form a colour-space id may precede the channels, empty or not.
330
+ const channels = colon && parts.length > 4 ? parts.slice(2) : parts.slice(1)
331
+ const [r, g, b] = channels.slice(0, 3).map(toNumber)
332
+ if (r === undefined || g === undefined || b === undefined) return null
333
+ if (r > 255 || g > 255 || b > 255) return null
334
+ return nearestAnsiColor(r, g, b)
335
+ }
336
+ return null
337
+ }
338
+
339
+ function assign(style: MutableStyle, code: number, color: AnsiColor): void {
340
+ if (code === 38) style.fg = color
341
+ else style.bg = color
342
+ }
343
+
344
+ /** Characters that are never rendered: C0 except tab, DEL, C1, and bidi controls. */
345
+ function isDroppedControl(code: number): boolean {
346
+ return (
347
+ (code < 0x20 && code !== 0x09) ||
348
+ code === 0x7f ||
349
+ (code >= 0x80 && code <= 0x9f) ||
350
+ (code >= 0x202a && code <= 0x202e) ||
351
+ (code >= 0x2066 && code <= 0x2069) ||
352
+ code === 0x2028 ||
353
+ code === 0x2029
354
+ )
355
+ }
356
+
357
+ type Run = { text: string; style: AnsiStyle }
358
+
359
+ /**
360
+ * The line being written. While the cursor only ever moves right it is a list of
361
+ * styled runs, which is cheap; the first time something moves it left (`\r`,
362
+ * `\b`) it becomes one cell per UTF-16 unit so later text can overwrite.
363
+ */
364
+ class LineBuffer {
365
+ private runs: Run[] = []
366
+ private cells: string[] | undefined
367
+ private cellStyles: AnsiStyle[] | undefined
368
+ private cursor = 0
369
+ private length = 0
370
+ private dropped = 0
371
+ /** A `\r` seen but not yet applied: `\r\n` is by far the common case. */
372
+ private pendingReturn = false
373
+
374
+ constructor(private readonly max: number) {}
375
+
376
+ isEmpty(): boolean {
377
+ return this.length === 0 && this.dropped === 0
378
+ }
379
+
380
+ put(text: string, style: AnsiStyle): void {
381
+ if (text === '') return
382
+ this.applyReturn()
383
+ if (this.cells === undefined) {
384
+ const room = this.max - this.length
385
+ if (room <= 0) {
386
+ this.dropped += text.length
387
+ return
388
+ }
389
+ const kept = text.length > room ? text.slice(0, room) : text
390
+ this.dropped += text.length - kept.length
391
+ const last = this.runs[this.runs.length - 1]
392
+ if (last && last.style === style) last.text += kept
393
+ else this.runs.push({ text: kept, style })
394
+ this.length += kept.length
395
+ this.cursor = this.length
396
+ return
397
+ }
398
+ for (let i = 0; i < text.length; i += 1) this.putCell(text[i]!, style)
399
+ }
400
+
401
+ private putCell(char: string, style: AnsiStyle): void {
402
+ const cells = this.cells!
403
+ const styles = this.cellStyles!
404
+ if (this.cursor >= this.max) {
405
+ this.dropped += 1
406
+ return
407
+ }
408
+ while (cells.length < this.cursor) {
409
+ cells.push(' ')
410
+ styles.push(PLAIN)
411
+ }
412
+ cells[this.cursor] = char
413
+ styles[this.cursor] = style
414
+ this.cursor += 1
415
+ this.length = cells.length
416
+ }
417
+
418
+ carriageReturn(): void {
419
+ this.pendingReturn = true
420
+ }
421
+
422
+ backspace(): void {
423
+ this.applyReturn()
424
+ if (this.cursor === 0) return
425
+ this.toCells()
426
+ this.cursor -= 1
427
+ }
428
+
429
+ /** `ESC[nK`: 0 from the cursor to the end, 1 start to cursor, 2 the whole line. */
430
+ eraseInLine(mode: number): void {
431
+ this.applyReturn()
432
+ if (mode === 0 && this.cursor >= this.length) return
433
+ this.toCells()
434
+ const cells = this.cells!
435
+ const styles = this.cellStyles!
436
+ if (mode === 0) {
437
+ cells.length = this.cursor
438
+ styles.length = this.cursor
439
+ } else if (mode === 1) {
440
+ for (let i = 0; i <= this.cursor && i < cells.length; i += 1) {
441
+ cells[i] = ' '
442
+ styles[i] = PLAIN
443
+ }
444
+ } else if (mode === 2) {
445
+ cells.length = 0
446
+ styles.length = 0
447
+ }
448
+ this.length = cells.length
449
+ }
450
+
451
+ private applyReturn(): void {
452
+ if (!this.pendingReturn) return
453
+ this.pendingReturn = false
454
+ if (this.length === 0) {
455
+ this.cursor = 0
456
+ return
457
+ }
458
+ this.toCells()
459
+ this.cursor = 0
460
+ }
461
+
462
+ private toCells(): void {
463
+ if (this.cells !== undefined) return
464
+ const cells: string[] = []
465
+ const styles: AnsiStyle[] = []
466
+ for (const run of this.runs) {
467
+ for (let i = 0; i < run.text.length; i += 1) {
468
+ cells.push(run.text[i]!)
469
+ styles.push(run.style)
470
+ }
471
+ }
472
+ this.cells = cells
473
+ this.cellStyles = styles
474
+ this.runs = []
475
+ this.cursor = Math.min(this.cursor, cells.length)
476
+ }
477
+
478
+ snapshot(): AnsiLine {
479
+ const segments: AnsiSegment[] = []
480
+ if (this.cells === undefined) {
481
+ for (const run of this.runs) segments.push({ text: run.text, style: run.style })
482
+ } else {
483
+ const cells = this.cells
484
+ const styles = this.cellStyles!
485
+ let start = 0
486
+ for (let i = 1; i <= cells.length; i += 1) {
487
+ if (i === cells.length || styles[i] !== styles[start]) {
488
+ segments.push({ text: cells.slice(start, i).join(''), style: styles[start]! })
489
+ start = i
490
+ }
491
+ }
492
+ }
493
+ return { segments, truncated: this.dropped }
494
+ }
495
+
496
+ reset(): void {
497
+ this.runs = []
498
+ this.cells = undefined
499
+ this.cellStyles = undefined
500
+ this.cursor = 0
501
+ this.length = 0
502
+ this.dropped = 0
503
+ this.pendingReturn = false
504
+ }
505
+ }
506
+
507
+ type State = 'text' | 'esc' | 'esc-intermediate' | 'csi' | 'string' | 'string-esc'
508
+
509
+ export function createAnsiParser(options: AnsiParserOptions = {}): AnsiParser {
510
+ const maxLine = Math.max(1, Math.floor(options.maxLineLength ?? ANSI_MAX_LINE_LENGTH))
511
+ const retain = Math.max(1, Math.floor(options.retainLines ?? ANSI_RETAIN_LINES))
512
+ const lines: AnsiLine[] = []
513
+ let droppedLines = 0
514
+ const line = new LineBuffer(maxLine)
515
+ let style: AnsiStyle = PLAIN
516
+ let state: State = 'text'
517
+ let csi = ''
518
+ let csiOverflow = false
519
+ // Only the 7-bit `ESC [` introducer is honoured. The 8-bit form is consumed so
520
+ // its parameters are not echoed, but it never changes the style: it is a rarity
521
+ // in real output and a favourite of filter-evasion payloads.
522
+ let csiHonoured = true
523
+
524
+ const finishLine = () => {
525
+ lines.push(line.snapshot())
526
+ line.reset()
527
+ // Trim in blocks so the common append stays O(1) amortised.
528
+ if (lines.length > retain + Math.max(64, retain >> 3)) {
529
+ const excess = lines.length - retain
530
+ lines.splice(0, excess)
531
+ droppedLines += excess
532
+ }
533
+ }
534
+
535
+ const runCsi = (final: string) => {
536
+ if (csiOverflow || !csiHonoured) return
537
+ // Only plain numeric parameters are honoured; a private marker (`?`, `>`,
538
+ // `<`, `=`) or an intermediate byte makes this some other command entirely.
539
+ if (!/^[\d;:]*$/.test(csi)) return
540
+ if (final === 'm') style = applySgr(style, csi)
541
+ else if (final === 'K') {
542
+ const mode = toNumber(csi.split(';')[0])
543
+ if (mode !== undefined && mode <= 2) line.eraseInLine(mode)
544
+ }
545
+ }
546
+
547
+ function write(chunk: string): void {
548
+ for (let i = 0; i < chunk.length; i += 1) {
549
+ const code = chunk.charCodeAt(i)
550
+
551
+ switch (state) {
552
+ case 'text': {
553
+ if (!isDroppedControl(code)) {
554
+ // Take the whole run of ordinary characters at once.
555
+ let end = i + 1
556
+ while (end < chunk.length && !isDroppedControl(chunk.charCodeAt(end))) end += 1
557
+ line.put(chunk.slice(i, end), style)
558
+ i = end - 1
559
+ break
560
+ }
561
+ if (code === 0x1b) state = 'esc'
562
+ else if (code === 0x0a) finishLine()
563
+ else if (code === 0x0d) line.carriageReturn()
564
+ else if (code === 0x08) line.backspace()
565
+ else if (code === 0x9b) {
566
+ state = 'csi'
567
+ csi = ''
568
+ csiOverflow = false
569
+ csiHonoured = false
570
+ } else if (
571
+ code === 0x9d ||
572
+ code === 0x90 ||
573
+ code === 0x98 ||
574
+ code === 0x9e ||
575
+ code === 0x9f
576
+ ) {
577
+ state = 'string'
578
+ }
579
+ // Every other control character is dropped.
580
+ break
581
+ }
582
+ case 'esc': {
583
+ if (code === 0x5b) {
584
+ state = 'csi'
585
+ csi = ''
586
+ csiOverflow = false
587
+ csiHonoured = true
588
+ } else if (
589
+ code === 0x5d ||
590
+ code === 0x50 ||
591
+ code === 0x58 ||
592
+ code === 0x5e ||
593
+ code === 0x5f
594
+ ) {
595
+ state = 'string'
596
+ } else if (code >= 0x20 && code <= 0x2f) state = 'esc-intermediate'
597
+ else if (code >= 0x30 && code <= 0x7e) state = 'text'
598
+ else if (code === 0x1b) state = 'esc'
599
+ else {
600
+ state = 'text'
601
+ i -= 1
602
+ }
603
+ break
604
+ }
605
+ case 'esc-intermediate': {
606
+ if (code >= 0x20 && code <= 0x2f) break
607
+ if (code >= 0x30 && code <= 0x7e) state = 'text'
608
+ else {
609
+ state = 'text'
610
+ i -= 1
611
+ }
612
+ break
613
+ }
614
+ case 'csi': {
615
+ if (code >= 0x20 && code <= 0x3f) {
616
+ if (csi.length < CSI_MAX) csi += chunk[i]
617
+ else csiOverflow = true
618
+ } else if (code >= 0x40 && code <= 0x7e) {
619
+ runCsi(chunk[i]!)
620
+ state = 'text'
621
+ } else if (code === 0x1b) state = 'esc'
622
+ else {
623
+ // A control character or non-ASCII byte cannot be part of a CSI: the
624
+ // sequence was malformed. Drop it and read this character normally.
625
+ state = 'text'
626
+ i -= 1
627
+ }
628
+ break
629
+ }
630
+ case 'string': {
631
+ if (code === 0x07 || code === 0x9c) state = 'text'
632
+ else if (code === 0x1b) state = 'string-esc'
633
+ else if (code === 0x0a || code === 0x0d) {
634
+ // No real title or clipboard payload spans a line. Ending here bounds
635
+ // what an unterminated string can swallow to the rest of its line.
636
+ state = 'text'
637
+ i -= 1
638
+ }
639
+ break
640
+ }
641
+ case 'string-esc': {
642
+ if (code === 0x5c) state = 'text'
643
+ else {
644
+ state = 'esc'
645
+ i -= 1
646
+ }
647
+ break
648
+ }
649
+ }
650
+ }
651
+ }
652
+
653
+ return {
654
+ write,
655
+ lines,
656
+ openLine: () => (line.isEmpty() ? undefined : line.snapshot()),
657
+ get droppedLines() {
658
+ return droppedLines
659
+ },
660
+ }
661
+ }
662
+
663
+ /** Parse a whole output at once: finished lines plus the open one, if any. */
664
+ export function parseAnsi(text: string, options?: AnsiParserOptions): AnsiLine[] {
665
+ const parser = createAnsiParser(options)
666
+ parser.write(text)
667
+ const open = parser.openLine()
668
+ return open ? [...parser.lines, open] : [...parser.lines]
669
+ }
670
+
671
+ /** A line's text with styling removed, for tests and for accessible names. */
672
+ export function ansiLineText(line: AnsiLine): string {
673
+ return line.segments.map((segment) => segment.text).join('')
674
+ }
@@ -0,0 +1,20 @@
1
+ export { Terminal, TERMINAL_MAX_LINES, type TerminalProps } from './terminal'
2
+ export {
3
+ ANSI_MAX_LINE_LENGTH,
4
+ ANSI_RETAIN_LINES,
5
+ ansi256ToColor,
6
+ ansiLineText,
7
+ createAnsiParser,
8
+ isPlainStyle,
9
+ nearestAnsiColor,
10
+ parseAnsi,
11
+ resolveColors,
12
+ type AnsiColor,
13
+ type AnsiLine,
14
+ type AnsiParser,
15
+ type AnsiParserOptions,
16
+ type AnsiSegment,
17
+ type AnsiStyle,
18
+ type ResolvedColors,
19
+ } from './ansi'
20
+ export { isFailedExit, terminalStatusLabel, type TerminalStatus } from './terminal-model'