@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,365 @@
1
+ //#region src/components/ui/message/parse-message-text.ts
2
+ var WHITESPACE = /\s/;
3
+ /**
4
+ * An opening fence: up to three spaces, a run of three or more backticks or of
5
+ * three or more tildes, then an info string that holds no backtick. The first
6
+ * word of the info string is the language. This is a scan, not one pattern,
7
+ * because a pattern whose classes overlap (`[^\s`]*` then `[^`]*`) retries every
8
+ * split of a long info string when a stray backtick ends it: three backticks, a
9
+ * long run of `a` and a trailing backtick took quadratic time.
10
+ */
11
+ function fenceOpen(line) {
12
+ let start = 0;
13
+ while (start < 3 && line.charCodeAt(start) === 32) start += 1;
14
+ const mark = line[start];
15
+ if (mark !== "`" && mark !== "~") return void 0;
16
+ let end = start + 1;
17
+ while (line[end] === mark) end += 1;
18
+ if (end - start < 3) return void 0;
19
+ if (line.includes("`", end)) return void 0;
20
+ let wordStart = end;
21
+ while (line[wordStart] === " " || line[wordStart] === " ") wordStart += 1;
22
+ let wordEnd = wordStart;
23
+ while (wordEnd < line.length && !WHITESPACE.test(line[wordEnd])) wordEnd += 1;
24
+ return {
25
+ marker: line.slice(start, end),
26
+ language: line.slice(wordStart, wordEnd)
27
+ };
28
+ }
29
+ var BULLET = /^ {0,3}[-*+][ \t]+(?![ \t])(.*)$/;
30
+ var ORDERED = /^ {0,3}(\d{1,9})[.)][ \t]+(?![ \t])(.*)$/;
31
+ var QUOTE = /^ {0,3}>[ \t]?(.*)$/;
32
+ var isBlank = (char) => char === " " || char === " ";
33
+ var LINE_TERMINATOR = /[\n\r\u2028\u2029]/;
34
+ /**
35
+ * An ATX heading: up to three spaces, one to four `#`, spaces or tabs, then the
36
+ * text, with any trailing spaces and closing `#` run removed. This is a scan for
37
+ * the reason `fenceOpen` is: the equivalent pattern (`(.+?)[ \t]*#*[ \t]*$`)
38
+ * retries the closing check from every position of a long run of spaces.
39
+ */
40
+ function headingOf(line) {
41
+ let start = 0;
42
+ while (start < 3 && line.charCodeAt(start) === 32) start += 1;
43
+ let marks = start;
44
+ while (line[marks] === "#") marks += 1;
45
+ const level = marks - start;
46
+ if (level < 1 || level > 4 || !isBlank(line[marks])) return void 0;
47
+ let textStart = marks;
48
+ while (isBlank(line[textStart])) textStart += 1;
49
+ if (textStart === line.length) return textStart - marks >= 2 ? {
50
+ level,
51
+ text: line[line.length - 1]
52
+ } : void 0;
53
+ if (LINE_TERMINATOR.test(line.slice(textStart))) return void 0;
54
+ let textEnd = line.length;
55
+ while (textEnd > textStart && isBlank(line[textEnd - 1])) textEnd -= 1;
56
+ while (textEnd > textStart && line[textEnd - 1] === "#") textEnd -= 1;
57
+ while (textEnd > textStart && isBlank(line[textEnd - 1])) textEnd -= 1;
58
+ return {
59
+ level,
60
+ text: line.slice(textStart, Math.max(textEnd, textStart + 1))
61
+ };
62
+ }
63
+ /** Only these schemes become links; everything else is shown as its text. */
64
+ function safeHref(value) {
65
+ const trimmed = value.trim();
66
+ if (trimmed.length === 0 || trimmed.length > 2048) return void 0;
67
+ if (/[\u0000- \u007f]/.test(trimmed)) return void 0;
68
+ try {
69
+ const url = new URL(trimmed);
70
+ return url.protocol === "http:" || url.protocol === "https:" || url.protocol === "mailto:" ? trimmed : void 0;
71
+ } catch {
72
+ return;
73
+ }
74
+ }
75
+ var MAX_INLINE_DEPTH = 4;
76
+ /** A marker may cite at most this many sources, so one cannot flood a sentence. */
77
+ var MAX_CITED_SOURCES = 6;
78
+ var CITATION = /\[\^(\d{1,4}(?:[ \t]*,[ \t]*\d{1,4}){0,5})\]/y;
79
+ function citationAt(text, index, count) {
80
+ CITATION.lastIndex = index;
81
+ const match = CITATION.exec(text);
82
+ if (!match) return void 0;
83
+ const numbers = [...new Set(match[1].split(",").map((part) => Number(part.trim())))];
84
+ if (numbers.length > MAX_CITED_SOURCES) return void 0;
85
+ if (numbers.some((number) => number < 1 || number > count)) return void 0;
86
+ return {
87
+ kind: "cite",
88
+ numbers,
89
+ raw: match[0]
90
+ };
91
+ }
92
+ /** Inline spans. Delimiters must close on the same block, or they stay literal. */
93
+ function parseInline(text, depth = 0, options = {}) {
94
+ const out = [];
95
+ let brackets;
96
+ let paren = -2;
97
+ let buffer = "";
98
+ const flush = () => {
99
+ if (buffer) out.push({
100
+ kind: "text",
101
+ text: buffer
102
+ });
103
+ buffer = "";
104
+ };
105
+ let index = 0;
106
+ while (index < text.length) {
107
+ const char = text[index];
108
+ if (char === "`") {
109
+ let ticks = 1;
110
+ while (text[index + ticks] === "`") ticks += 1;
111
+ const fence = "`".repeat(ticks);
112
+ const close = text.indexOf(fence, index + ticks);
113
+ if (close > index + ticks) {
114
+ flush();
115
+ out.push({
116
+ kind: "code",
117
+ text: text.slice(index + ticks, close).replace(/^ (.*) $/, "$1")
118
+ });
119
+ index = close + ticks;
120
+ continue;
121
+ }
122
+ buffer += fence;
123
+ index += ticks;
124
+ continue;
125
+ }
126
+ if (depth < MAX_INLINE_DEPTH && (char === "*" || char === "_")) {
127
+ const double = text[index + 1] === char;
128
+ const delimiter = double ? char + char : char;
129
+ const start = index + delimiter.length;
130
+ if (char === "_" && index > 0 && /[A-Za-z0-9]/.test(text[index - 1] ?? "")) {
131
+ buffer += delimiter;
132
+ index = start;
133
+ continue;
134
+ }
135
+ const next = text[start];
136
+ if (next !== void 0 && !/\s/.test(next)) {
137
+ const close = findClosing(text, delimiter, start);
138
+ if (double && !(close > start && !/\s/.test(text[close - 1] ?? " "))) {
139
+ buffer += delimiter;
140
+ index = start;
141
+ continue;
142
+ }
143
+ if (close > start && !/\s/.test(text[close - 1] ?? " ")) {
144
+ flush();
145
+ out.push({
146
+ kind: double ? "strong" : "em",
147
+ children: parseInline(text.slice(start, close), depth + 1, options)
148
+ });
149
+ index = close + delimiter.length;
150
+ continue;
151
+ }
152
+ }
153
+ }
154
+ if (char === "[" && text[index + 1] === "^" && options.citations && !options.inLink) {
155
+ const cite = citationAt(text, index, options.citations);
156
+ if (cite && cite.kind === "cite") {
157
+ flush();
158
+ out.push(cite);
159
+ index += cite.raw.length;
160
+ continue;
161
+ }
162
+ }
163
+ if (depth < MAX_INLINE_DEPTH && char === "[") {
164
+ brackets ??= bracketMatches(text);
165
+ const labelEnd = brackets.get(index) ?? -1;
166
+ if (labelEnd > index && text[labelEnd + 1] === "(") {
167
+ if (paren !== -1 && paren < labelEnd + 2) paren = text.indexOf(")", labelEnd + 2);
168
+ const hrefEnd = paren;
169
+ if (hrefEnd > labelEnd + 1) {
170
+ const href = safeHref(text.slice(labelEnd + 2, hrefEnd));
171
+ if (href) {
172
+ flush();
173
+ out.push({
174
+ kind: "link",
175
+ href,
176
+ children: parseInline(text.slice(index + 1, labelEnd), depth + 1, {
177
+ ...options,
178
+ inLink: true
179
+ })
180
+ });
181
+ index = hrefEnd + 1;
182
+ continue;
183
+ }
184
+ }
185
+ }
186
+ }
187
+ buffer += char;
188
+ index += 1;
189
+ }
190
+ flush();
191
+ return out;
192
+ }
193
+ function findClosing(text, delimiter, from) {
194
+ let index = from;
195
+ while (index < text.length) {
196
+ if (text[index] === "`") {
197
+ const close = text.indexOf("`", index + 1);
198
+ if (close < 0) return -1;
199
+ index = close + 1;
200
+ continue;
201
+ }
202
+ if (text[index] === delimiter[0]) {
203
+ let end = index + 1;
204
+ while (text[end] === delimiter[0]) end += 1;
205
+ const run = end - index;
206
+ if (delimiter.length === 1) {
207
+ if (run % 2 === 1) return end - 1;
208
+ } else if (run >= delimiter.length) return end - delimiter.length;
209
+ index = end;
210
+ continue;
211
+ }
212
+ index += 1;
213
+ }
214
+ return -1;
215
+ }
216
+ /**
217
+ * The `]` that closes each `[`, found in one pass. A match never crosses a
218
+ * newline, and an unmatched `[` has no entry. Scanning forward from every `[`
219
+ * instead is quadratic on a long line of unclosed brackets, which a pasted page
220
+ * or a hostile model can use to hang the renderer.
221
+ */
222
+ function bracketMatches(text) {
223
+ const matches = /* @__PURE__ */ new Map();
224
+ const open = [];
225
+ for (let index = 0; index < text.length; index += 1) {
226
+ const char = text[index];
227
+ if (char === "[") open.push(index);
228
+ else if (char === "]") {
229
+ const start = open.pop();
230
+ if (start !== void 0) matches.set(start, index);
231
+ } else if (char === "\n") open.length = 0;
232
+ }
233
+ return matches;
234
+ }
235
+ /** Parse text into blocks. Pure, total, and linear in the length of `text`. */
236
+ function parseMessageText(text, options = {}) {
237
+ const inline = (source) => parseInline(source, 0, { citations: options.citations });
238
+ const lines = text.replace(/\r\n?/g, "\n").split("\n");
239
+ const blocks = [];
240
+ let paragraph = [];
241
+ const flushParagraph = () => {
242
+ if (paragraph.length === 0) return;
243
+ const raw = paragraph.join("\n");
244
+ blocks.push({
245
+ kind: "paragraph",
246
+ inline: inline(raw),
247
+ raw
248
+ });
249
+ paragraph = [];
250
+ };
251
+ let index = 0;
252
+ while (index < lines.length) {
253
+ const line = lines[index];
254
+ const fence = fenceOpen(line);
255
+ if (fence) {
256
+ flushParagraph();
257
+ const marker = fence.marker;
258
+ const language = fence.language || void 0;
259
+ const body = [];
260
+ let closed = false;
261
+ index += 1;
262
+ while (index < lines.length) {
263
+ const candidate = lines[index];
264
+ const close = /^ {0,3}(`{3,}|~{3,})[ \t]*$/.exec(candidate);
265
+ if (close && close[1][0] === marker[0] && close[1].length >= marker.length) {
266
+ closed = true;
267
+ index += 1;
268
+ break;
269
+ }
270
+ body.push(candidate);
271
+ index += 1;
272
+ }
273
+ const code = body.join("\n");
274
+ blocks.push({
275
+ kind: "code",
276
+ language,
277
+ code,
278
+ complete: closed || !options.streaming,
279
+ raw: `${marker}${language ?? ""}\n${code}${closed ? `\n${marker}` : ""}`
280
+ });
281
+ continue;
282
+ }
283
+ if (line.trim() === "") {
284
+ flushParagraph();
285
+ index += 1;
286
+ continue;
287
+ }
288
+ const heading = headingOf(line);
289
+ if (heading) {
290
+ flushParagraph();
291
+ blocks.push({
292
+ kind: "heading",
293
+ level: heading.level,
294
+ inline: inline(heading.text),
295
+ raw: line
296
+ });
297
+ index += 1;
298
+ continue;
299
+ }
300
+ const bullet = BULLET.exec(line);
301
+ const ordered = bullet ? null : ORDERED.exec(line);
302
+ if (bullet || ordered) {
303
+ flushParagraph();
304
+ const items = [];
305
+ const rawLines = [];
306
+ const isOrdered = ordered !== null;
307
+ const start = ordered ? Number(ordered[1]) : 1;
308
+ while (index < lines.length) {
309
+ const current = lines[index];
310
+ const match = isOrdered ? ORDERED.exec(current) : BULLET.exec(current);
311
+ if (match) {
312
+ items.push([...inline(isOrdered ? match[2] : match[1])]);
313
+ rawLines.push(current);
314
+ index += 1;
315
+ continue;
316
+ }
317
+ if (/^ {2,}\S/.test(current) && items.length > 0) {
318
+ const item = items[items.length - 1];
319
+ item.push({
320
+ kind: "text",
321
+ text: " "
322
+ });
323
+ for (const span of inline(current.trim())) item.push(span);
324
+ rawLines.push(current);
325
+ index += 1;
326
+ continue;
327
+ }
328
+ break;
329
+ }
330
+ blocks.push({
331
+ kind: "list",
332
+ ordered: isOrdered,
333
+ start,
334
+ items,
335
+ raw: rawLines.join("\n")
336
+ });
337
+ continue;
338
+ }
339
+ if (QUOTE.exec(line)) {
340
+ flushParagraph();
341
+ const quoted = [];
342
+ while (index < lines.length) {
343
+ const match = QUOTE.exec(lines[index]);
344
+ if (!match) break;
345
+ quoted.push(match[1]);
346
+ index += 1;
347
+ }
348
+ const raw = quoted.join("\n");
349
+ blocks.push({
350
+ kind: "quote",
351
+ inline: inline(raw),
352
+ raw
353
+ });
354
+ continue;
355
+ }
356
+ paragraph.push(line);
357
+ index += 1;
358
+ }
359
+ flushParagraph();
360
+ return blocks;
361
+ }
362
+ //#endregion
363
+ export { parseInline, parseMessageText, safeHref };
364
+
365
+ //# sourceMappingURL=parse-message-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-message-text.js","names":[],"sources":["../../../../src/components/ui/message/parse-message-text.ts"],"sourcesContent":["/**\n * A small, safe reading of model and user text.\n *\n * Assistant output is untrusted: it can contain anything a model, a tool result\n * or a pasted web page put there. This parser therefore produces *data* —\n * blocks and inline spans — and the renderer turns that data into text nodes and\n * a fixed set of elements. There is no HTML pass, no `innerHTML`, and no\n * attribute built from the text other than a link `href` that has passed\n * `safeHref`.\n *\n * It reads a deliberately small subset of Markdown: fenced code, headings,\n * flat lists, block quotes, paragraphs, and inline code, bold, italic and links.\n * Anything it does not recognise stays as paragraph text with its line breaks\n * (the paragraph renders `white-space: pre-wrap`), so unsupported syntax\n * degrades to readable source instead of vanishing.\n *\n * A citation marker, `[^1]` or `[^1,2]`, is read only when the caller says how\n * many sources it has (`citations`) and every number names one of them. A marker\n * the host cannot resolve stays literal text: it is never a citation by shape\n * alone, and `arr[1]` or a footnote the model invented is not one either.\n *\n * Streaming is a first-class input. `streaming: true` means the text may end\n * mid-construct, so an unterminated fence is a *partial* code block — shown as\n * code from its first line, flagged incomplete — and an unterminated inline\n * span stays literal until its closing delimiter arrives. Once streaming stops,\n * an unterminated fence is just a code block that ends at the end of the text.\n */\n\nexport type MessageInline =\n | Readonly<{ kind: 'text'; text: string }>\n | Readonly<{ kind: 'code'; text: string }>\n | Readonly<{ kind: 'strong'; children: readonly MessageInline[] }>\n | Readonly<{ kind: 'em'; children: readonly MessageInline[] }>\n | Readonly<{ kind: 'link'; href: string; children: readonly MessageInline[] }>\n /** A resolved citation marker: 1-based source numbers, each within `citations`. */\n | Readonly<{ kind: 'cite'; numbers: readonly number[]; raw: string }>\n\nexport type MessageBlock =\n | Readonly<{ kind: 'paragraph'; inline: readonly MessageInline[]; raw: string }>\n | Readonly<{\n kind: 'heading'\n level: 1 | 2 | 3 | 4\n inline: readonly MessageInline[]\n raw: string\n }>\n | Readonly<{\n kind: 'list'\n ordered: boolean\n start: number\n items: readonly (readonly MessageInline[])[]\n raw: string\n }>\n | Readonly<{ kind: 'quote'; inline: readonly MessageInline[]; raw: string }>\n | Readonly<{\n kind: 'code'\n language: string | undefined\n code: string\n /** False while the fence is still open and the text may still grow. */\n complete: boolean\n raw: string\n }>\n\nconst WHITESPACE = /\\s/\n\n/**\n * An opening fence: up to three spaces, a run of three or more backticks or of\n * three or more tildes, then an info string that holds no backtick. The first\n * word of the info string is the language. This is a scan, not one pattern,\n * because a pattern whose classes overlap (`[^\\s`]*` then `[^`]*`) retries every\n * split of a long info string when a stray backtick ends it: three backticks, a\n * long run of `a` and a trailing backtick took quadratic time.\n */\nfunction fenceOpen(line: string): Readonly<{ marker: string; language: string }> | undefined {\n let start = 0\n while (start < 3 && line.charCodeAt(start) === 32) start += 1\n const mark = line[start]\n if (mark !== '`' && mark !== '~') return undefined\n let end = start + 1\n while (line[end] === mark) end += 1\n if (end - start < 3) return undefined\n if (line.includes('`', end)) return undefined\n let wordStart = end\n while (line[wordStart] === ' ' || line[wordStart] === '\\t') wordStart += 1\n let wordEnd = wordStart\n while (wordEnd < line.length && !WHITESPACE.test(line[wordEnd]!)) wordEnd += 1\n return { marker: line.slice(start, end), language: line.slice(wordStart, wordEnd) }\n}\n// The lookahead after each marker's spaces makes that run maximal, so a line\n// that fails later (`.` stops at U+2028) cannot retry every shorter run.\nconst BULLET = /^ {0,3}[-*+][ \\t]+(?![ \\t])(.*)$/\nconst ORDERED = /^ {0,3}(\\d{1,9})[.)][ \\t]+(?![ \\t])(.*)$/\nconst QUOTE = /^ {0,3}>[ \\t]?(.*)$/\n\nconst isBlank = (char: string | undefined) => char === ' ' || char === '\\t'\nconst LINE_TERMINATOR = /[\\n\\r\\u2028\\u2029]/\n\n/**\n * An ATX heading: up to three spaces, one to four `#`, spaces or tabs, then the\n * text, with any trailing spaces and closing `#` run removed. This is a scan for\n * the reason `fenceOpen` is: the equivalent pattern (`(.+?)[ \\t]*#*[ \\t]*$`)\n * retries the closing check from every position of a long run of spaces.\n */\nfunction headingOf(line: string): Readonly<{ level: 1 | 2 | 3 | 4; text: string }> | undefined {\n let start = 0\n while (start < 3 && line.charCodeAt(start) === 32) start += 1\n let marks = start\n while (line[marks] === '#') marks += 1\n const level = marks - start\n if (level < 1 || level > 4 || !isBlank(line[marks])) return undefined\n let textStart = marks\n while (isBlank(line[textStart])) textStart += 1\n if (textStart === line.length) {\n // Only blanks follow the marker: the text is the last of them, which needs a second one.\n return textStart - marks >= 2\n ? { level: level as 1 | 2 | 3 | 4, text: line[line.length - 1]! }\n : undefined\n }\n if (LINE_TERMINATOR.test(line.slice(textStart))) return undefined\n // Drop the longest tail of blanks, a run of `#`, and blanks again.\n let textEnd = line.length\n while (textEnd > textStart && isBlank(line[textEnd - 1])) textEnd -= 1\n while (textEnd > textStart && line[textEnd - 1] === '#') textEnd -= 1\n while (textEnd > textStart && isBlank(line[textEnd - 1])) textEnd -= 1\n // Text that is nothing but a closing run keeps its first character.\n return {\n level: level as 1 | 2 | 3 | 4,\n text: line.slice(textStart, Math.max(textEnd, textStart + 1)),\n }\n}\n\n/** Only these schemes become links; everything else is shown as its text. */\nexport function safeHref(value: string): string | undefined {\n const trimmed = value.trim()\n if (trimmed.length === 0 || trimmed.length > 2048) return undefined\n // Control characters and whitespace inside a URL are a scheme-smuggling vector.\n // oxlint-disable-next-line no-control-regex\n if (/[\\u0000- \\u007f]/.test(trimmed)) return undefined\n try {\n const url = new URL(trimmed)\n return url.protocol === 'http:' || url.protocol === 'https:' || url.protocol === 'mailto:'\n ? trimmed\n : undefined\n } catch {\n return undefined\n }\n}\n\nconst MAX_INLINE_DEPTH = 4\n\n/** A marker may cite at most this many sources, so one cannot flood a sentence. */\nconst MAX_CITED_SOURCES = 6\nconst CITATION = /\\[\\^(\\d{1,4}(?:[ \\t]*,[ \\t]*\\d{1,4}){0,5})\\]/y\n\nexport type ParseInlineOptions = {\n /** How many sources the host has. Without it no marker is a citation. */\n citations?: number\n /** Inside a link label, where a citation (itself a button) must not nest. */\n inLink?: boolean\n}\n\nfunction citationAt(text: string, index: number, count: number): MessageInline | undefined {\n CITATION.lastIndex = index\n const match = CITATION.exec(text)\n if (!match) return undefined\n const numbers = [...new Set(match[1]!.split(',').map((part) => Number(part.trim())))]\n if (numbers.length > MAX_CITED_SOURCES) return undefined\n if (numbers.some((number) => number < 1 || number > count)) return undefined\n return { kind: 'cite', numbers, raw: match[0] }\n}\n\n/** Inline spans. Delimiters must close on the same block, or they stay literal. */\nexport function parseInline(\n text: string,\n depth = 0,\n options: ParseInlineOptions = {}\n): readonly MessageInline[] {\n const out: MessageInline[] = []\n let brackets: ReadonlyMap<number, number> | undefined\n let paren = -2\n let buffer = ''\n const flush = () => {\n if (buffer) out.push({ kind: 'text', text: buffer })\n buffer = ''\n }\n let index = 0\n while (index < text.length) {\n const char = text[index]!\n if (char === '`') {\n let ticks = 1\n while (text[index + ticks] === '`') ticks += 1\n const fence = '`'.repeat(ticks)\n const close = text.indexOf(fence, index + ticks)\n if (close > index + ticks) {\n flush()\n out.push({ kind: 'code', text: text.slice(index + ticks, close).replace(/^ (.*) $/, '$1') })\n index = close + ticks\n continue\n }\n buffer += fence\n index += ticks\n continue\n }\n if (depth < MAX_INLINE_DEPTH && (char === '*' || char === '_')) {\n const double = text[index + 1] === char\n const delimiter = double ? char + char : char\n const start = index + delimiter.length\n // Word-internal underscores cannot open emphasis. Reject before scanning,\n // and consume both marks so the second cannot rescan the remaining pairs.\n if (char === '_' && index > 0 && /[A-Za-z0-9]/.test(text[index - 1] ?? '')) {\n buffer += delimiter\n index = start\n continue\n }\n const next = text[start]\n // A delimiter opens only before a non-space, so `a * b * c` and `2 * 3` stay arithmetic.\n if (next !== undefined && !/\\s/.test(next)) {\n const close = findClosing(text, delimiter, start)\n if (double && !(close > start && !/\\s/.test(text[close - 1] ?? ' '))) {\n // An opener that does not close stays literal as a pair. Retrying its\n // second mark as emphasis would scan to the end of the line again, so a\n // line of unclosed `**a ` would be quadratic.\n buffer += delimiter\n index = start\n continue\n }\n if (close > start && !/\\s/.test(text[close - 1] ?? ' ')) {\n flush()\n out.push({\n kind: double ? 'strong' : 'em',\n children: parseInline(text.slice(start, close), depth + 1, options),\n })\n index = close + delimiter.length\n continue\n }\n }\n }\n if (char === '[' && text[index + 1] === '^' && options.citations && !options.inLink) {\n const cite = citationAt(text, index, options.citations)\n if (cite && cite.kind === 'cite') {\n flush()\n out.push(cite)\n index += cite.raw.length\n continue\n }\n }\n if (depth < MAX_INLINE_DEPTH && char === '[') {\n brackets ??= bracketMatches(text)\n const labelEnd = brackets.get(index) ?? -1\n if (labelEnd > index && text[labelEnd + 1] === '(') {\n // The nearest `)` is remembered: a run of `[a](` with no `)` after it\n // would otherwise search to the end of the text from every opener.\n if (paren !== -1 && paren < labelEnd + 2) paren = text.indexOf(')', labelEnd + 2)\n const hrefEnd = paren\n if (hrefEnd > labelEnd + 1) {\n const href = safeHref(text.slice(labelEnd + 2, hrefEnd))\n if (href) {\n flush()\n out.push({\n kind: 'link',\n href,\n children: parseInline(text.slice(index + 1, labelEnd), depth + 1, {\n ...options,\n inLink: true,\n }),\n })\n index = hrefEnd + 1\n continue\n }\n }\n }\n }\n buffer += char\n index += 1\n }\n flush()\n return out\n}\n\nfunction findClosing(text: string, delimiter: string, from: number): number {\n let index = from\n while (index < text.length) {\n if (text[index] === '`') {\n // Skip a code span so `**a `**` b**` closes where the code ends.\n const close = text.indexOf('`', index + 1)\n if (close < 0) return -1\n index = close + 1\n continue\n }\n if (text[index] === delimiter[0]) {\n let end = index + 1\n while (text[end] === delimiter[0]) end += 1\n const run = end - index\n if (delimiter.length === 1) {\n // Emphasis closes on a run of one (or an odd run, whose last mark closes).\n // An even run is `**` pairs: strong spans inside the emphasis, which the\n // inner parse reads. One pass, and the scan stops at the next odd run, so\n // a line of unclosed delimiters is still linear.\n if (run % 2 === 1) return end - 1\n } else if (run >= delimiter.length) {\n // Strong closes on the last two marks of a run.\n return end - delimiter.length\n }\n index = end\n continue\n }\n index += 1\n }\n return -1\n}\n\n/**\n * The `]` that closes each `[`, found in one pass. A match never crosses a\n * newline, and an unmatched `[` has no entry. Scanning forward from every `[`\n * instead is quadratic on a long line of unclosed brackets, which a pasted page\n * or a hostile model can use to hang the renderer.\n */\nfunction bracketMatches(text: string): ReadonlyMap<number, number> {\n const matches = new Map<number, number>()\n const open: number[] = []\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index]\n if (char === '[') open.push(index)\n else if (char === ']') {\n const start = open.pop()\n if (start !== undefined) matches.set(start, index)\n } else if (char === '\\n') open.length = 0\n }\n return matches\n}\n\n/** Parse text into blocks. Pure, total, and linear in the length of `text`. */\nexport function parseMessageText(\n text: string,\n options: { streaming?: boolean; citations?: number } = {}\n): readonly MessageBlock[] {\n const inline = (source: string) => parseInline(source, 0, { citations: options.citations })\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n')\n const blocks: MessageBlock[] = []\n let paragraph: string[] = []\n const flushParagraph = () => {\n if (paragraph.length === 0) return\n const raw = paragraph.join('\\n')\n blocks.push({ kind: 'paragraph', inline: inline(raw), raw })\n paragraph = []\n }\n\n let index = 0\n while (index < lines.length) {\n const line = lines[index]!\n const fence = fenceOpen(line)\n if (fence) {\n flushParagraph()\n const marker = fence.marker\n const language = fence.language || undefined\n const body: string[] = []\n let closed = false\n index += 1\n while (index < lines.length) {\n const candidate = lines[index]!\n const close = /^ {0,3}(`{3,}|~{3,})[ \\t]*$/.exec(candidate)\n if (close && close[1]![0] === marker[0] && close[1]!.length >= marker.length) {\n closed = true\n index += 1\n break\n }\n body.push(candidate)\n index += 1\n }\n const code = body.join('\\n')\n blocks.push({\n kind: 'code',\n language,\n code,\n complete: closed || !options.streaming,\n raw: `${marker}${language ?? ''}\\n${code}${closed ? `\\n${marker}` : ''}`,\n })\n continue\n }\n if (line.trim() === '') {\n flushParagraph()\n index += 1\n continue\n }\n const heading = headingOf(line)\n if (heading) {\n flushParagraph()\n blocks.push({\n kind: 'heading',\n level: heading.level,\n inline: inline(heading.text),\n raw: line,\n })\n index += 1\n continue\n }\n const bullet = BULLET.exec(line)\n const ordered = bullet ? null : ORDERED.exec(line)\n if (bullet || ordered) {\n flushParagraph()\n const items: MessageInline[][] = []\n const rawLines: string[] = []\n const isOrdered = ordered !== null\n const start = ordered ? Number(ordered[1]) : 1\n while (index < lines.length) {\n const current = lines[index]!\n const match = isOrdered ? ORDERED.exec(current) : BULLET.exec(current)\n if (match) {\n items.push([...inline(isOrdered ? match[2]! : match[1]!)])\n rawLines.push(current)\n index += 1\n continue\n }\n // An indented continuation belongs to the previous item.\n if (/^ {2,}\\S/.test(current) && items.length > 0) {\n // Append in place: copying the accumulated spans on every continuation\n // makes a long item quadratic in its number of lines. Push one span at\n // a time, because spreading a line of many spans into `push` exceeds\n // the engine's argument limit and throws.\n const item = items[items.length - 1]!\n item.push({ kind: 'text', text: ' ' })\n for (const span of inline(current.trim())) item.push(span)\n rawLines.push(current)\n index += 1\n continue\n }\n break\n }\n blocks.push({ kind: 'list', ordered: isOrdered, start, items, raw: rawLines.join('\\n') })\n continue\n }\n const quote = QUOTE.exec(line)\n if (quote) {\n flushParagraph()\n const quoted: string[] = []\n while (index < lines.length) {\n const match = QUOTE.exec(lines[index]!)\n if (!match) break\n quoted.push(match[1]!)\n index += 1\n }\n const raw = quoted.join('\\n')\n blocks.push({ kind: 'quote', inline: inline(raw), raw })\n continue\n }\n paragraph.push(line)\n index += 1\n }\n flushParagraph()\n return blocks\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { isQuestionAnswered, Questionnaire, type QuestionnaireAnswer, type QuestionnaireAnswers, type QuestionnaireOption, type QuestionnaireProps, type QuestionnaireQuestion, type QuestionnaireStatus, } from './questionnaire';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/questionnaire/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Questionnaire, isQuestionAnswered } from "./questionnaire.js";
2
+ export { Questionnaire, isQuestionAnswered };
@@ -0,0 +1,83 @@
1
+ import { type ComponentProps, type JSX } from 'solid-js';
2
+ /**
3
+ * Questionnaire.
4
+ *
5
+ * The agent has stopped and is asking the person something before it continues.
6
+ * This is the one place in a transcript where the reader *must* act, so it is
7
+ * the one element allowed to look like a card — and it only ever asks what the
8
+ * runtime actually asked.
9
+ *
10
+ * ## What it models
11
+ *
12
+ * One question or several. Each has a prompt and, optionally, a closed set of
13
+ * options (single choice, or `multiple`) and/or a free-text answer. A question
14
+ * with only a prompt is a text box; the runtime contract that exists today is
15
+ * exactly that. Options are shown only when the producer supplied them, which is
16
+ * why they are data here and not something this component can invent.
17
+ *
18
+ * Several questions are asked one at a time, with "Question 2 of 3" and Back /
19
+ * Next, because a wall of unrelated fields is how a person answers none of them
20
+ * well. Moving between them returns focus to the question, so a screen-reader
21
+ * user hears what they are now answering.
22
+ *
23
+ * ## It does not decide whether you may answer
24
+ *
25
+ * `status` and `disabledReason` come from the host, which owns authority (is
26
+ * this session connected, is the generation current, does this client have the
27
+ * input). A disabled questionnaire says *why* in words next to the button.
28
+ * `answered` and `expired` render the exchange read-only, so a settled question
29
+ * stays in the record as what was asked and what was answered.
30
+ *
31
+ * Submit is `Cmd/Ctrl+Enter` from any text field; plain Enter stays a newline.
32
+ */
33
+ export type QuestionnaireOption = Readonly<{
34
+ id: string;
35
+ label: string;
36
+ description?: string;
37
+ }>;
38
+ export type QuestionnaireQuestion = Readonly<{
39
+ id: string;
40
+ prompt: string;
41
+ description?: string;
42
+ options?: readonly QuestionnaireOption[];
43
+ /** Allow more than one option. */
44
+ multiple?: boolean;
45
+ /** Offer a free-text answer (always present when there are no options). */
46
+ allowText?: boolean;
47
+ textLabel?: string;
48
+ textPlaceholder?: string;
49
+ /** The question may be skipped. */
50
+ optional?: boolean;
51
+ }>;
52
+ export type QuestionnaireAnswer = Readonly<{
53
+ optionIds: readonly string[];
54
+ text: string;
55
+ }>;
56
+ export type QuestionnaireAnswers = Readonly<Record<string, QuestionnaireAnswer>>;
57
+ export type QuestionnaireStatus = 'open' | 'submitting' | 'answered' | 'expired';
58
+ /**
59
+ * The answer a record holds for a question. Question ids are host strings, and
60
+ * the record is an ordinary object, so `constructor`, `toString` and `__proto__`
61
+ * are valid ids that a plain index would resolve to inherited values and a
62
+ * summary or a validity check would then read `optionIds` from.
63
+ */
64
+ export declare function answerFor(record: QuestionnaireAnswers, question: Pick<QuestionnaireQuestion, 'id'>): QuestionnaireAnswer | undefined;
65
+ /** Whether a question has what it needs. */
66
+ export declare function isQuestionAnswered(question: QuestionnaireQuestion, answer: QuestionnaireAnswer | undefined): boolean;
67
+ export type QuestionnaireProps = Omit<ComponentProps<'section'>, 'onSubmit' | 'title'> & {
68
+ questions: readonly QuestionnaireQuestion[];
69
+ title?: string;
70
+ description?: string;
71
+ status?: QuestionnaireStatus;
72
+ answers?: QuestionnaireAnswers;
73
+ defaultAnswers?: QuestionnaireAnswers;
74
+ onAnswersChange?: (answers: QuestionnaireAnswers) => void;
75
+ onSubmit?: (answers: QuestionnaireAnswers) => void | Promise<void>;
76
+ /** Why answering is not possible right now; shown beside the button. */
77
+ disabledReason?: string;
78
+ /** A failed submit, in words. */
79
+ error?: string;
80
+ submitLabel?: string;
81
+ };
82
+ export declare function Questionnaire(props: QuestionnaireProps): JSX.Element;
83
+ //# sourceMappingURL=questionnaire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaire.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/questionnaire/questionnaire.tsx"],"names":[],"mappings":"AACA,OAAO,EASL,KAAK,cAAc,EACnB,KAAK,GAAG,EACT,MAAM,UAAU,CAAA;AAOjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACxC,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IAAE,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAC1F,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAA;AAChF,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,CAAA;AAIhF;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,GAC1C,mBAAmB,GAAG,SAAS,CAEjC;AAED,4CAA4C;AAC5C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,mBAAmB,GAAG,SAAS,GACtC,OAAO,CAGT;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACvF,SAAS,EAAE,SAAS,qBAAqB,EAAE,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,OAAO,CAAC,EAAE,oBAAoB,CAAA;IAC9B,cAAc,CAAC,EAAE,oBAAoB,CAAA;IACrC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IACzD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,eA0UtD"}