@nadicodeai/ui 0.21.0 → 1.0.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 (354) hide show
  1. package/AGENTS.md +6 -7
  2. package/LICENSES/PAPER-SHADERS-APACHE-2.0.txt +186 -0
  3. package/NOTICE +12 -0
  4. package/README.md +14 -21
  5. package/dist/agents.d.ts +10 -0
  6. package/dist/agents.d.ts.map +1 -0
  7. package/dist/agents.js +10 -0
  8. package/dist/components/agent-card.d.ts +13 -0
  9. package/dist/components/agent-card.d.ts.map +1 -0
  10. package/dist/components/agent-card.js +15 -0
  11. package/dist/components/agent-visual.d.ts +17 -0
  12. package/dist/components/agent-visual.d.ts.map +1 -0
  13. package/dist/components/agent-visual.js +59 -0
  14. package/dist/components/alert-dialog.js +1 -1
  15. package/dist/components/badge.d.ts +1 -1
  16. package/dist/components/badge.d.ts.map +1 -1
  17. package/dist/components/badge.js +9 -0
  18. package/dist/components/button.d.ts +1 -1
  19. package/dist/components/card.d.ts +5 -3
  20. package/dist/components/card.d.ts.map +1 -1
  21. package/dist/components/card.js +7 -7
  22. package/dist/components/chart.js +1 -1
  23. package/dist/components/combobox.js +1 -1
  24. package/dist/components/context-menu.js +1 -1
  25. package/dist/components/dialog.js +1 -1
  26. package/dist/components/drawer.js +1 -1
  27. package/dist/components/dropdown-menu.js +1 -1
  28. package/dist/components/empty.d.ts +5 -2
  29. package/dist/components/empty.d.ts.map +1 -1
  30. package/dist/components/empty.js +3 -3
  31. package/dist/components/feedback-state.js +1 -1
  32. package/dist/components/glass-control.d.ts +7 -0
  33. package/dist/components/glass-control.d.ts.map +1 -0
  34. package/dist/components/glass-control.js +14 -0
  35. package/dist/components/hover-card.js +1 -1
  36. package/dist/components/label-system.d.ts +1 -10
  37. package/dist/components/label-system.d.ts.map +1 -1
  38. package/dist/components/label-system.js +1 -7
  39. package/dist/components/live-demo.js +1 -1
  40. package/dist/components/menubar.js +1 -1
  41. package/dist/components/nav-bar.d.ts +6 -8
  42. package/dist/components/nav-bar.d.ts.map +1 -1
  43. package/dist/components/nav-bar.js +8 -9
  44. package/dist/components/navigation-menu.js +2 -2
  45. package/dist/components/popover.js +1 -1
  46. package/dist/components/select.js +1 -1
  47. package/dist/components/sheet.js +1 -1
  48. package/dist/components/sidebar.js +1 -1
  49. package/dist/components/sonner.js +2 -2
  50. package/dist/components/testimonials.d.ts +1 -1
  51. package/dist/components/testimonials.js +2 -2
  52. package/dist/components/tooltip.js +1 -1
  53. package/dist/components/use-case-bento.d.ts +2 -4
  54. package/dist/components/use-case-bento.d.ts.map +1 -1
  55. package/dist/components/use-case-bento.js +2 -3
  56. package/dist/hooks/index.d.ts +0 -1
  57. package/dist/hooks/index.d.ts.map +1 -1
  58. package/dist/hooks/index.js +0 -1
  59. package/dist/index.d.ts +3 -16
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +3 -16
  62. package/dist/internal/agent-visual/color.d.ts +4 -0
  63. package/dist/internal/agent-visual/color.d.ts.map +1 -0
  64. package/dist/internal/agent-visual/color.js +39 -0
  65. package/dist/internal/agent-visual/poster.d.ts +6 -0
  66. package/dist/internal/agent-visual/poster.d.ts.map +1 -0
  67. package/dist/internal/agent-visual/poster.js +35 -0
  68. package/dist/internal/agent-visual/recipes.d.ts +15 -0
  69. package/dist/internal/agent-visual/recipes.d.ts.map +1 -0
  70. package/dist/internal/agent-visual/recipes.js +72 -0
  71. package/dist/internal/agent-visual/renderer.d.ts +10 -0
  72. package/dist/internal/agent-visual/renderer.d.ts.map +1 -0
  73. package/dist/internal/agent-visual/renderer.js +112 -0
  74. package/dist/internal/agent-visual/shader.d.ts +2 -0
  75. package/dist/internal/agent-visual/shader.d.ts.map +1 -0
  76. package/dist/internal/agent-visual/shader.js +158 -0
  77. package/dist/internal/assistant-ui/attachment.d.ts +5 -0
  78. package/dist/internal/assistant-ui/attachment.d.ts.map +1 -0
  79. package/dist/internal/assistant-ui/attachment.js +93 -0
  80. package/dist/internal/assistant-ui/follow-up-suggestions.d.ts +3 -0
  81. package/dist/internal/assistant-ui/follow-up-suggestions.d.ts.map +1 -0
  82. package/dist/internal/assistant-ui/follow-up-suggestions.js +8 -0
  83. package/dist/internal/assistant-ui/markdown-text.d.ts +2 -0
  84. package/dist/internal/assistant-ui/markdown-text.d.ts.map +1 -0
  85. package/dist/internal/assistant-ui/markdown-text.js +54 -0
  86. package/dist/internal/assistant-ui/reasoning.d.ts +31 -0
  87. package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -0
  88. package/dist/internal/assistant-ui/reasoning.js +118 -0
  89. package/dist/internal/assistant-ui/thread.d.ts +26 -0
  90. package/dist/internal/assistant-ui/thread.d.ts.map +1 -0
  91. package/dist/internal/assistant-ui/thread.js +118 -0
  92. package/dist/internal/assistant-ui/tool-fallback.d.ts +10 -0
  93. package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -0
  94. package/dist/internal/assistant-ui/tool-fallback.js +163 -0
  95. package/dist/internal/assistant-ui/tool-group.d.ts +18 -0
  96. package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -0
  97. package/dist/internal/assistant-ui/tool-group.js +44 -0
  98. package/dist/internal/assistant-ui/tooltip-icon-button.d.ts +8 -0
  99. package/dist/internal/assistant-ui/tooltip-icon-button.d.ts.map +1 -0
  100. package/dist/internal/assistant-ui/tooltip-icon-button.js +10 -0
  101. package/dist/styles/globals.css +24 -209
  102. package/docs/agents/nadicodeai-ui.md +8 -8
  103. package/docs/component-classification.md +1 -1
  104. package/docs/consuming-cross-repo.md +12 -4
  105. package/docs/contract.md +83 -7
  106. package/docs/migration/1.0.0.md +75 -0
  107. package/docs/migration/base-ui-migration.md +0 -11
  108. package/docs/product-compositions.md +1 -1
  109. package/llms.txt +7 -6
  110. package/package.json +17 -29
  111. package/skills/nadicodeai-ui/SKILL.md +11 -7
  112. package/dist/ai-elements.d.ts +0 -49
  113. package/dist/ai-elements.d.ts.map +0 -1
  114. package/dist/ai-elements.js +0 -48
  115. package/dist/components/agent-avatar.d.ts +0 -7
  116. package/dist/components/agent-avatar.d.ts.map +0 -1
  117. package/dist/components/agent-avatar.js +0 -6
  118. package/dist/components/agent-chat.d.ts +0 -20
  119. package/dist/components/agent-chat.d.ts.map +0 -1
  120. package/dist/components/agent-chat.js +0 -10
  121. package/dist/components/agent-composer.d.ts +0 -56
  122. package/dist/components/agent-composer.d.ts.map +0 -1
  123. package/dist/components/agent-composer.js +0 -56
  124. package/dist/components/agent-message.d.ts +0 -117
  125. package/dist/components/agent-message.d.ts.map +0 -1
  126. package/dist/components/agent-message.js +0 -99
  127. package/dist/components/agent-thread.d.ts +0 -26
  128. package/dist/components/agent-thread.d.ts.map +0 -1
  129. package/dist/components/agent-thread.js +0 -63
  130. package/dist/components/agent-tool-approval.d.ts +0 -27
  131. package/dist/components/agent-tool-approval.d.ts.map +0 -1
  132. package/dist/components/agent-tool-approval.js +0 -43
  133. package/dist/components/ai-elements/agent.d.ts +0 -27
  134. package/dist/components/ai-elements/agent.d.ts.map +0 -1
  135. package/dist/components/ai-elements/agent.js +0 -25
  136. package/dist/components/ai-elements/artifact.d.ts +0 -24
  137. package/dist/components/ai-elements/artifact.d.ts.map +0 -1
  138. package/dist/components/ai-elements/artifact.js +0 -20
  139. package/dist/components/ai-elements/attachments.d.ts +0 -55
  140. package/dist/components/ai-elements/attachments.d.ts.map +0 -1
  141. package/dist/components/ai-elements/attachments.js +0 -125
  142. package/dist/components/ai-elements/audio-player.d.ts +0 -30
  143. package/dist/components/ai-elements/audio-player.d.ts.map +0 -1
  144. package/dist/components/ai-elements/audio-player.js +0 -41
  145. package/dist/components/ai-elements/canvas.d.ts +0 -8
  146. package/dist/components/ai-elements/canvas.d.ts.map +0 -1
  147. package/dist/components/ai-elements/canvas.js +0 -5
  148. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -30
  149. package/dist/components/ai-elements/chain-of-thought.d.ts.map +0 -1
  150. package/dist/components/ai-elements/chain-of-thought.js +0 -49
  151. package/dist/components/ai-elements/checkpoint.d.ts +0 -12
  152. package/dist/components/ai-elements/checkpoint.d.ts.map +0 -1
  153. package/dist/components/ai-elements/checkpoint.js +0 -10
  154. package/dist/components/ai-elements/code-block.d.ts +0 -53
  155. package/dist/components/ai-elements/code-block.d.ts.map +0 -1
  156. package/dist/components/ai-elements/code-block.js +0 -239
  157. package/dist/components/ai-elements/commit.d.ts +0 -65
  158. package/dist/components/ai-elements/commit.d.ts.map +0 -1
  159. package/dist/components/ai-elements/commit.js +0 -83
  160. package/dist/components/ai-elements/confirmation.d.ts +0 -50
  161. package/dist/components/ai-elements/confirmation.d.ts.map +0 -1
  162. package/dist/components/ai-elements/confirmation.js +0 -57
  163. package/dist/components/ai-elements/connection.d.ts +0 -6
  164. package/dist/components/ai-elements/connection.d.ts.map +0 -1
  165. package/dist/components/ai-elements/connection.js +0 -10
  166. package/dist/components/ai-elements/context.d.ts +0 -33
  167. package/dist/components/ai-elements/context.d.ts.map +0 -1
  168. package/dist/components/ai-elements/context.js +0 -147
  169. package/dist/components/ai-elements/controls.d.ts +0 -5
  170. package/dist/components/ai-elements/controls.d.ts.map +0 -1
  171. package/dist/components/ai-elements/controls.js +0 -5
  172. package/dist/components/ai-elements/conversation.d.ts +0 -24
  173. package/dist/components/ai-elements/conversation.d.ts.map +0 -1
  174. package/dist/components/ai-elements/conversation.js +0 -41
  175. package/dist/components/ai-elements/edge.d.ts +0 -6
  176. package/dist/components/ai-elements/edge.d.ts.map +0 -1
  177. package/dist/components/ai-elements/edge.js +0 -88
  178. package/dist/components/ai-elements/environment-variables.d.ts +0 -39
  179. package/dist/components/ai-elements/environment-variables.d.ts.map +0 -1
  180. package/dist/components/ai-elements/environment-variables.js +0 -60
  181. package/dist/components/ai-elements/file-tree.d.ts +0 -27
  182. package/dist/components/ai-elements/file-tree.d.ts.map +0 -1
  183. package/dist/components/ai-elements/file-tree.js +0 -73
  184. package/dist/components/ai-elements/image.d.ts +0 -7
  185. package/dist/components/ai-elements/image.d.ts.map +0 -1
  186. package/dist/components/ai-elements/image.js +0 -3
  187. package/dist/components/ai-elements/inline-citation.d.ts +0 -39
  188. package/dist/components/ai-elements/inline-citation.d.ts.map +0 -1
  189. package/dist/components/ai-elements/inline-citation.js +0 -86
  190. package/dist/components/ai-elements/jsx-preview.d.ts +0 -30
  191. package/dist/components/ai-elements/jsx-preview.d.ts.map +0 -1
  192. package/dist/components/ai-elements/jsx-preview.js +0 -159
  193. package/dist/components/ai-elements/message.d.ts +0 -38
  194. package/dist/components/ai-elements/message.d.ts.map +0 -1
  195. package/dist/components/ai-elements/message.js +0 -91
  196. package/dist/components/ai-elements/mic-selector.d.ts +0 -46
  197. package/dist/components/ai-elements/mic-selector.d.ts.map +0 -1
  198. package/dist/components/ai-elements/mic-selector.js +0 -180
  199. package/dist/components/ai-elements/model-selector.d.ts +0 -36
  200. package/dist/components/ai-elements/model-selector.d.ts.map +0 -1
  201. package/dist/components/ai-elements/model-selector.js +0 -18
  202. package/dist/components/ai-elements/node.d.ts +0 -22
  203. package/dist/components/ai-elements/node.d.ts.map +0 -1
  204. package/dist/components/ai-elements/node.js +0 -12
  205. package/dist/components/ai-elements/open-in-chat.d.ts +0 -27
  206. package/dist/components/ai-elements/open-in-chat.d.ts.map +0 -1
  207. package/dist/components/ai-elements/open-in-chat.js +0 -81
  208. package/dist/components/ai-elements/package-info.d.ts +0 -30
  209. package/dist/components/ai-elements/package-info.d.ts.map +0 -1
  210. package/dist/components/ai-elements/package-info.js +0 -50
  211. package/dist/components/ai-elements/panel.d.ts +0 -6
  212. package/dist/components/ai-elements/panel.d.ts.map +0 -1
  213. package/dist/components/ai-elements/panel.js +0 -5
  214. package/dist/components/ai-elements/persona.d.ts +0 -49
  215. package/dist/components/ai-elements/persona.d.ts.map +0 -1
  216. package/dist/components/ai-elements/persona.js +0 -175
  217. package/dist/components/ai-elements/plan.d.ts +0 -27
  218. package/dist/components/ai-elements/plan.d.ts.map +0 -1
  219. package/dist/components/ai-elements/plan.js +0 -34
  220. package/dist/components/ai-elements/prompt-input.d.ts +0 -149
  221. package/dist/components/ai-elements/prompt-input.d.ts.map +0 -1
  222. package/dist/components/ai-elements/prompt-input.js +0 -704
  223. package/dist/components/ai-elements/queue.d.ts +0 -62
  224. package/dist/components/ai-elements/queue.d.ts.map +0 -1
  225. package/dist/components/ai-elements/queue.js +0 -24
  226. package/dist/components/ai-elements/reasoning.d.ts +0 -27
  227. package/dist/components/ai-elements/reasoning.d.ts.map +0 -1
  228. package/dist/components/ai-elements/reasoning.js +0 -92
  229. package/dist/components/ai-elements/sandbox.d.ts +0 -25
  230. package/dist/components/ai-elements/sandbox.d.ts.map +0 -1
  231. package/dist/components/ai-elements/sandbox.js +0 -15
  232. package/dist/components/ai-elements/schema-display.d.ts +0 -56
  233. package/dist/components/ai-elements/schema-display.d.ts.map +0 -1
  234. package/dist/components/ai-elements/schema-display.js +0 -90
  235. package/dist/components/ai-elements/shimmer.d.ts +0 -10
  236. package/dist/components/ai-elements/shimmer.d.ts.map +0 -1
  237. package/dist/components/ai-elements/shimmer.js +0 -11
  238. package/dist/components/ai-elements/snippet.d.ts +0 -19
  239. package/dist/components/ai-elements/snippet.d.ts.map +0 -1
  240. package/dist/components/ai-elements/snippet.js +0 -32
  241. package/dist/components/ai-elements/sources.d.ts +0 -13
  242. package/dist/components/ai-elements/sources.d.ts.map +0 -1
  243. package/dist/components/ai-elements/sources.js +0 -9
  244. package/dist/components/ai-elements/speech-input.d.ts +0 -55
  245. package/dist/components/ai-elements/speech-input.d.ts.map +0 -1
  246. package/dist/components/ai-elements/speech-input.js +0 -187
  247. package/dist/components/ai-elements/stack-trace.d.ts +0 -38
  248. package/dist/components/ai-elements/stack-trace.d.ts.map +0 -1
  249. package/dist/components/ai-elements/stack-trace.js +0 -181
  250. package/dist/components/ai-elements/suggestion.d.ts +0 -11
  251. package/dist/components/ai-elements/suggestion.d.ts.map +0 -1
  252. package/dist/components/ai-elements/suggestion.js +0 -13
  253. package/dist/components/ai-elements/task.d.ts +0 -15
  254. package/dist/components/ai-elements/task.d.ts.map +0 -1
  255. package/dist/components/ai-elements/task.js +0 -10
  256. package/dist/components/ai-elements/terminal.d.ts +0 -28
  257. package/dist/components/ai-elements/terminal.d.ts.map +0 -1
  258. package/dist/components/ai-elements/terminal.js +0 -55
  259. package/dist/components/ai-elements/test-results.d.ts +0 -59
  260. package/dist/components/ai-elements/test-results.d.ts.map +0 -1
  261. package/dist/components/ai-elements/test-results.js +0 -98
  262. package/dist/components/ai-elements/tool.d.ts +0 -32
  263. package/dist/components/ai-elements/tool.d.ts.map +0 -1
  264. package/dist/components/ai-elements/tool.js +0 -49
  265. package/dist/components/ai-elements/toolbar.d.ts +0 -6
  266. package/dist/components/ai-elements/toolbar.d.ts.map +0 -1
  267. package/dist/components/ai-elements/toolbar.js +0 -5
  268. package/dist/components/ai-elements/transcription.d.ts +0 -17
  269. package/dist/components/ai-elements/transcription.d.ts.map +0 -1
  270. package/dist/components/ai-elements/transcription.js +0 -36
  271. package/dist/components/ai-elements/voice-selector.d.ts +0 -65
  272. package/dist/components/ai-elements/voice-selector.d.ts.map +0 -1
  273. package/dist/components/ai-elements/voice-selector.js +0 -224
  274. package/dist/components/ai-elements/web-preview.d.ts +0 -35
  275. package/dist/components/ai-elements/web-preview.d.ts.map +0 -1
  276. package/dist/components/ai-elements/web-preview.js +0 -66
  277. package/dist/components/artifact-panel.d.ts +0 -130
  278. package/dist/components/artifact-panel.d.ts.map +0 -1
  279. package/dist/components/artifact-panel.js +0 -180
  280. package/dist/components/attachment.d.ts +0 -24
  281. package/dist/components/attachment.d.ts.map +0 -1
  282. package/dist/components/attachment.js +0 -68
  283. package/dist/components/bubble.d.ts +0 -17
  284. package/dist/components/bubble.d.ts.map +0 -1
  285. package/dist/components/bubble.js +0 -59
  286. package/dist/components/demo-surface.d.ts +0 -34
  287. package/dist/components/demo-surface.d.ts.map +0 -1
  288. package/dist/components/demo-surface.js +0 -21
  289. package/dist/components/files-preview.d.ts +0 -36
  290. package/dist/components/files-preview.d.ts.map +0 -1
  291. package/dist/components/files-preview.js +0 -85
  292. package/dist/components/marker.d.ts +0 -11
  293. package/dist/components/marker.d.ts.map +0 -1
  294. package/dist/components/marker.js +0 -34
  295. package/dist/components/message-scroller.d.ts +0 -17
  296. package/dist/components/message-scroller.d.ts.map +0 -1
  297. package/dist/components/message-scroller.js +0 -29
  298. package/dist/components/message.d.ts +0 -11
  299. package/dist/components/message.d.ts.map +0 -1
  300. package/dist/components/message.js +0 -21
  301. package/dist/components/state-notice.d.ts +0 -13
  302. package/dist/components/state-notice.d.ts.map +0 -1
  303. package/dist/components/state-notice.js +0 -8
  304. package/dist/components/watch-it-work-band.d.ts +0 -12
  305. package/dist/components/watch-it-work-band.d.ts.map +0 -1
  306. package/dist/components/watch-it-work-band.js +0 -8
  307. package/dist/hooks/use-controllable-state.d.ts +0 -9
  308. package/dist/hooks/use-controllable-state.d.ts.map +0 -1
  309. package/dist/hooks/use-controllable-state.js +0 -23
  310. package/dist/lib/agent-attachment.d.ts +0 -11
  311. package/dist/lib/agent-attachment.d.ts.map +0 -1
  312. package/dist/lib/agent-attachment.js +0 -19
  313. package/dist/lib/agent-contracts.d.ts +0 -132
  314. package/dist/lib/agent-contracts.d.ts.map +0 -1
  315. package/dist/lib/agent-contracts.js +0 -6
  316. package/dist/lib/agent-state.d.ts +0 -22
  317. package/dist/lib/agent-state.d.ts.map +0 -1
  318. package/dist/lib/agent-state.js +0 -96
  319. package/dist/lib/agent-work-state.d.ts +0 -36
  320. package/dist/lib/agent-work-state.d.ts.map +0 -1
  321. package/dist/lib/agent-work-state.js +0 -36
  322. package/dist/lib/message-scroller-primitive/components.d.ts +0 -17
  323. package/dist/lib/message-scroller-primitive/components.d.ts.map +0 -1
  324. package/dist/lib/message-scroller-primitive/components.js +0 -204
  325. package/dist/lib/message-scroller-primitive/geometry.d.ts +0 -51
  326. package/dist/lib/message-scroller-primitive/geometry.d.ts.map +0 -1
  327. package/dist/lib/message-scroller-primitive/geometry.js +0 -199
  328. package/dist/lib/message-scroller-primitive/index.d.ts +0 -12
  329. package/dist/lib/message-scroller-primitive/index.d.ts.map +0 -1
  330. package/dist/lib/message-scroller-primitive/index.js +0 -12
  331. package/dist/lib/message-scroller-primitive/stores.d.ts +0 -6
  332. package/dist/lib/message-scroller-primitive/stores.d.ts.map +0 -1
  333. package/dist/lib/message-scroller-primitive/stores.js +0 -53
  334. package/dist/lib/message-scroller-primitive/types.d.ts +0 -88
  335. package/dist/lib/message-scroller-primitive/types.d.ts.map +0 -1
  336. package/dist/lib/message-scroller-primitive/types.js +0 -40
  337. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts +0 -19
  338. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.d.ts.map +0 -1
  339. package/dist/lib/message-scroller-primitive/use-message-scroller-commands.js +0 -188
  340. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts +0 -7
  341. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.d.ts.map +0 -1
  342. package/dist/lib/message-scroller-primitive/use-message-scroller-controller.js +0 -506
  343. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts +0 -49
  344. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.d.ts.map +0 -1
  345. package/dist/lib/message-scroller-primitive/use-message-scroller-refs.js +0 -90
  346. package/dist/lib/message-scroller-primitive/use-render.d.ts +0 -22
  347. package/dist/lib/message-scroller-primitive/use-render.d.ts.map +0 -1
  348. package/dist/lib/message-scroller-primitive/use-render.js +0 -113
  349. package/dist/lib/message-scroller-primitive/utils.d.ts +0 -4
  350. package/dist/lib/message-scroller-primitive/utils.d.ts.map +0 -1
  351. package/dist/lib/message-scroller-primitive/utils.js +0 -9
  352. package/docs/agent-work-surfaces.md +0 -132
  353. package/docs/migration/ai-elements-vendoring.md +0 -29
  354. package/docs/terminal-tui-semantics.md +0 -172
@@ -0,0 +1,158 @@
1
+ /*
2
+ * Modified from Paper Shaders 0.0.78 Metaballs (Apache-2.0).
3
+ * The metaball field, motion, colour blending, and edge calculation remain
4
+ * Paper's construction. `surfacePattern` clips the four approved NadicodeAI
5
+ * identity materials inside that generated form. Attribution ships in NOTICE.
6
+ */
7
+ export const AGENT_VISUAL_SHADER = `#version 300 es
8
+ precision mediump float;
9
+
10
+ uniform float u_time;
11
+ uniform sampler2D u_noiseTexture;
12
+ uniform vec4 u_colorBack;
13
+ uniform vec4 u_colors[8];
14
+ uniform float u_colorsCount;
15
+ uniform float u_size;
16
+ uniform float u_count;
17
+ uniform float u_material;
18
+ uniform float u_detail;
19
+ uniform vec2 u_resolution;
20
+
21
+ in vec2 v_objectUV;
22
+ out vec4 fragColor;
23
+
24
+ #define TWO_PI 6.28318530718
25
+
26
+ float randomR(vec2 p) {
27
+ vec2 uv = floor(p) / 100. + .5;
28
+ return texture(u_noiseTexture, fract(uv)).r;
29
+ }
30
+
31
+ float noise(float x) {
32
+ float i = floor(x);
33
+ float f = fract(x);
34
+ float u = f * f * (3.0 - 2.0 * f);
35
+ return mix(randomR(vec2(i, 0.0)), randomR(vec2(i + 1.0, 0.0)), u);
36
+ }
37
+
38
+ float getBallShape(vec2 uv, vec2 c, float p) {
39
+ float s = .5 * length(uv - c);
40
+ s = 1. - clamp(s, 0., 1.);
41
+ return pow(s, p);
42
+ }
43
+
44
+ float hash21(vec2 p) {
45
+ p = fract(p * vec2(123.34, 456.21));
46
+ p += dot(p, p + 45.32);
47
+ return fract(p.x * p.y);
48
+ }
49
+
50
+ float orderedPoints(vec2 surfaceUV, float depth) {
51
+ float density = clamp(min(u_resolution.x, u_resolution.y) / 12.0 * u_detail, 6.0, 34.0);
52
+ vec2 pointUV = fract(surfaceUV * density) - 0.5;
53
+ float radius = mix(0.14, 0.23, depth);
54
+ return 1.0 - smoothstep(radius * 0.7, radius, length(pointUV));
55
+ }
56
+
57
+ float triangularWire(vec2 surfaceUV, float depth) {
58
+ float density = clamp(min(u_resolution.x, u_resolution.y) / 16.0 * u_detail, 5.0, 26.0);
59
+ vec2 grid = surfaceUV * density;
60
+ float horizontal = abs(fract(grid.y) - 0.5);
61
+ float diagonalA = abs(fract(grid.x + grid.y * 0.5) - 0.5);
62
+ float diagonalB = abs(fract(grid.x - grid.y * 0.5) - 0.5);
63
+ float nearestLine = min(horizontal, min(diagonalA, diagonalB));
64
+ float width = mix(0.032, 0.072, depth);
65
+ return 1.0 - smoothstep(width * 0.55, width, nearestLine);
66
+ }
67
+
68
+ float particleLayer(vec2 surfaceUV, float density, float depth, float time, float layerSeed, float threshold) {
69
+ vec2 gridUV = surfaceUV * density + layerSeed;
70
+ vec2 cell = floor(gridUV);
71
+ vec2 local = fract(gridUV) - 0.5;
72
+ float seed = hash21(cell + layerSeed);
73
+ vec2 jitter = vec2(hash21(cell + layerSeed + 3.17), hash21(cell + layerSeed + 8.41)) - 0.5;
74
+ jitter *= 0.72;
75
+ jitter += 0.08 * vec2(sin(time * 0.42 + seed * 18.0 + layerSeed), cos(time * 0.31 + seed * 14.0 - layerSeed));
76
+ float radius = mix(0.055, 0.175, hash21(cell + layerSeed + 14.3)) * mix(0.78, 1.35, depth);
77
+ float particle = 1.0 - smoothstep(radius * 0.68, radius, length(local - jitter));
78
+ float brightness = mix(0.45, 1.0, hash21(cell + layerSeed + 24.7));
79
+ return particle * step(threshold, seed) * brightness;
80
+ }
81
+
82
+ float livingParticles(vec2 surfaceUV, float depth, float time) {
83
+ float density = clamp(min(u_resolution.x, u_resolution.y) / 6.5 * u_detail, 13.0, 68.0);
84
+ float dust = particleLayer(surfaceUV, density, depth, time, 0.0, 0.16);
85
+ float motes = particleLayer(surfaceUV, density * 0.46, depth, time * 0.72, 19.7, 0.62);
86
+ return max(dust * 0.78, motes);
87
+ }
88
+
89
+ float surfacePattern(vec2 surfaceUV, float depth, float material, float time) {
90
+ if (material < 0.5) return 1.0;
91
+ if (material < 1.5) return orderedPoints(surfaceUV, depth);
92
+ if (material < 2.5) return triangularWire(surfaceUV, depth);
93
+ return livingParticles(surfaceUV, depth, time);
94
+ }
95
+
96
+ void main() {
97
+ vec2 shape_uv = v_objectUV + .5;
98
+ const float firstFrameOffset = 2503.4;
99
+ float t = .2 * (u_time + firstFrameOffset);
100
+ vec3 totalColor = vec3(0.);
101
+ float totalShape = 0.;
102
+ float totalOpacity = 0.;
103
+ vec2 weightedCenter = vec2(0.);
104
+ vec2 weightedOrientation = vec2(0.);
105
+ float centerWeight = 0.;
106
+
107
+ for (int i = 0; i < 20; i++) {
108
+ if (i >= int(ceil(u_count))) break;
109
+ float idxFract = float(i) / 20.0;
110
+ float angle = TWO_PI * idxFract;
111
+ float speed = 1. - .2 * idxFract;
112
+ vec2 pos = vec2(.5) + 1e-4 + .9 * (vec2(noise(angle * 10. + float(i) + t * speed), noise(angle * 20. + float(i) - t * speed)) - .5);
113
+ int safeIndex = i % int(u_colorsCount + 0.5);
114
+ vec4 ballColor = u_colors[safeIndex];
115
+ ballColor.rgb *= ballColor.a;
116
+ float sizeFrac = 1.;
117
+ if (float(i) > floor(u_count - 1.)) sizeFrac *= fract(u_count);
118
+ float shape = getBallShape(shape_uv, pos, 45. - 30. * u_size * sizeFrac);
119
+ shape *= pow(u_size, .2);
120
+ shape = smoothstep(0., 1., shape);
121
+ totalColor += ballColor.rgb * shape;
122
+ totalShape += shape;
123
+ totalOpacity += ballColor.a * shape;
124
+ float centerContribution = shape * shape;
125
+ weightedCenter += pos * centerContribution;
126
+ weightedOrientation += vec2(cos(angle), sin(angle)) * centerContribution;
127
+ centerWeight += centerContribution;
128
+ }
129
+
130
+ totalColor /= max(totalShape, 1e-4);
131
+ totalOpacity /= max(totalShape, 1e-4);
132
+ float edgeWidth = fwidth(totalShape);
133
+ float finalShape = smoothstep(.4, .4 + edgeWidth, totalShape);
134
+ vec2 fieldCenter = weightedCenter / max(centerWeight, 1e-4);
135
+ vec2 fieldVector = shape_uv - fieldCenter;
136
+ float depth = smoothstep(0.4, 1.45, totalShape);
137
+ float fieldRotation = 0.18 * atan(weightedOrientation.y, weightedOrientation.x);
138
+ float rotationCos = cos(fieldRotation);
139
+ float rotationSin = sin(fieldRotation);
140
+ vec2 surfaceUV = fieldCenter + mat2(rotationCos, rotationSin, -rotationSin, rotationCos) * fieldVector * (1.0 + 0.1 * depth);
141
+ vec2 gradient = vec2(dFdx(totalShape), dFdy(totalShape));
142
+ vec2 gradientDirection = gradient / max(length(gradient), 1e-4);
143
+ surfaceUV += gradientDirection * 0.008 * sin(totalShape * 4.0);
144
+ float feature = surfacePattern(surfaceUV, depth, u_material, t);
145
+ vec3 normal = normalize(vec3(-gradient * 36.0, 1.0));
146
+ vec3 lightDirection = normalize(vec3(-0.45, 0.65, 0.8));
147
+ float surfaceLight = 0.62 + 0.38 * max(dot(normal, lightDirection), 0.0);
148
+ float baseSurface = mix(0.012, 0.06, depth);
149
+ float surface = u_material < 0.5 ? 1.0 : mix(baseSurface, surfaceLight, feature);
150
+ vec3 color = totalColor * finalShape * surface;
151
+ float opacity = totalOpacity * finalShape * surface;
152
+ vec3 bgColor = u_colorBack.rgb * u_colorBack.a;
153
+ color = color + bgColor * (1. - opacity);
154
+ opacity = opacity + u_colorBack.a * (1. - opacity);
155
+ color += 1. / 256. * (fract(sin(dot(.014 * gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453123) - .5);
156
+ fragColor = vec4(color, opacity);
157
+ }
158
+ `;
@@ -0,0 +1,5 @@
1
+ import { type FC } from "react";
2
+ export declare const UserMessageAttachments: FC;
3
+ export declare const ComposerAttachments: FC;
4
+ export declare const ComposerAddAttachment: FC;
5
+ //# sourceMappingURL=attachment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/attachment.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+C,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAkN7F,eAAO,MAAM,sBAAsB,EAAE,EAMpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,EAMjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,EAiBnC,CAAC"}
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState, isValidElement } from "react";
4
+ import { XIcon, PlusIcon, FileText, Loader2Icon, AlertCircleIcon } from "lucide-react";
5
+ import { AttachmentPrimitive, ComposerPrimitive, MessagePrimitive, useAuiState, useAui, } from "@assistant-ui/react";
6
+ import { useShallow } from "zustand/shallow";
7
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../../components/tooltip.js";
8
+ import { Dialog, DialogTitle, DialogContent, DialogTrigger } from "../../components/dialog.js";
9
+ import { Avatar, AvatarImage, AvatarFallback } from "../../components/avatar.js";
10
+ import { TooltipIconButton } from "./tooltip-icon-button.js";
11
+ import { cn } from "../../lib/utils.js";
12
+ const useFileSrc = (file) => {
13
+ const [src, setSrc] = useState(undefined);
14
+ useEffect(() => {
15
+ if (!file) {
16
+ setSrc(undefined);
17
+ return;
18
+ }
19
+ const objectUrl = URL.createObjectURL(file);
20
+ setSrc(objectUrl);
21
+ return () => {
22
+ URL.revokeObjectURL(objectUrl);
23
+ };
24
+ }, [file]);
25
+ return src;
26
+ };
27
+ const useAttachmentSrc = () => {
28
+ const { file, src } = useAuiState(useShallow((s) => {
29
+ if (s.attachment.type !== "image")
30
+ return {};
31
+ if (s.attachment.file)
32
+ return { file: s.attachment.file };
33
+ const src = s.attachment.content?.filter((c) => c.type === "image")[0]?.image;
34
+ if (!src)
35
+ return {};
36
+ return { src };
37
+ }));
38
+ return useFileSrc(file) ?? src;
39
+ };
40
+ const AttachmentPreview = ({ src }) => {
41
+ return (_jsx("img", { src: src, alt: "Attachment preview", className: "aui-attachment-preview-image block h-auto max-h-[80vh] w-auto max-w-full rounded-sm object-contain" }));
42
+ };
43
+ const AttachmentPreviewDialog = ({ children }) => {
44
+ const src = useAttachmentSrc();
45
+ if (!src)
46
+ return children;
47
+ return (_jsxs(Dialog, { children: [_jsx(DialogTrigger, { nativeButton: false, className: "aui-attachment-preview-trigger", render: isValidElement(children) ? children : _jsx("button", { type: "button" }) }), _jsxs(DialogContent, { className: "aui-attachment-preview-dialog-content [&>button]:bg-foreground/60 [&>button]:hover:bg-foreground/80 [&_svg]:text-background p-2 sm:max-w-3xl [&>button]:rounded-full [&>button]:p-1 [&>button]:opacity-100 [&>button]:ring-0!", children: [_jsx(DialogTitle, { className: "aui-sr-only sr-only", children: "Image Attachment Preview" }), _jsx("div", { className: "aui-attachment-preview bg-background relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden rounded-sm", children: _jsx(AttachmentPreview, { src: src }) })] })] }));
48
+ };
49
+ const AttachmentThumb = () => {
50
+ const src = useAttachmentSrc();
51
+ return (_jsxs(Avatar, { className: "aui-attachment-tile-avatar h-full w-full rounded-none after:hidden", children: [_jsx(AvatarImage, { src: src, alt: "Attachment preview", className: "aui-attachment-tile-image object-cover" }), _jsx(AvatarFallback, { children: _jsx(FileText, { className: "aui-attachment-tile-fallback-icon text-muted-foreground/80 size-6 stroke-[1.5]" }) })] }));
52
+ };
53
+ const AttachmentUI = () => {
54
+ const aui = useAui();
55
+ const isComposer = aui.attachment.source !== "message";
56
+ const isImage = useAuiState((s) => s.attachment.type === "image");
57
+ const typeLabel = useAuiState((s) => {
58
+ const type = s.attachment.type;
59
+ switch (type) {
60
+ case "image":
61
+ return "Image";
62
+ case "document":
63
+ return "Document";
64
+ case "file":
65
+ return "File";
66
+ default:
67
+ return type;
68
+ }
69
+ });
70
+ const uploadState = useAuiState((s) => s.attachment.status.type === "running"
71
+ ? "uploading"
72
+ : s.attachment.status.type === "incomplete" && s.attachment.status.reason === "error"
73
+ ? "error"
74
+ : undefined);
75
+ const isUploading = uploadState === "uploading";
76
+ const isError = uploadState === "error";
77
+ const errorMessage = useAuiState((s) => s.attachment.status.type === "incomplete" && s.attachment.status.reason === "error"
78
+ ? (s.attachment.status.message ?? "Upload failed")
79
+ : undefined);
80
+ return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsxs(AttachmentPrimitive.Root, { className: cn("aui-attachment-root relative", isComposer && "nc-transition-opacity", isImage && !isComposer && "aui-attachment-root-message only:*:first:size-24"), children: [_jsx(AttachmentPreviewDialog, { children: _jsxs(TooltipTrigger, { render: _jsx("div", { className: cn("aui-attachment-tile nc-transition-transform relative size-14 cursor-pointer overflow-hidden rounded-[calc(var(--composer-radius)-var(--composer-padding))] bg-muted outline-none after:pointer-events-none after:absolute after:inset-0 after:rounded-[inherit] after:ring-1 after:ring-border after:ring-inset focus-visible:ring-[length:var(--ring-width-focus)] focus-visible:ring-ring/50 hover:after:bg-foreground/10", isError && "after:ring-destructive/60"), role: "button", tabIndex: 0, "aria-label": `${typeLabel} attachment${isError ? ", upload failed" : isUploading ? ", uploading" : ""}` }), children: [_jsx(AttachmentThumb, {}), isUploading && (_jsx("div", { "aria-hidden": "true", className: "aui-attachment-tile-uploading nc-transition-opacity absolute inset-0 flex items-center justify-center bg-background/60 backdrop-blur-[2px]", children: _jsx(Loader2Icon, { className: "size-4 text-muted-foreground motion-safe:animate-spin motion-reduce:animate-pulse" }) })), isError && (_jsx("div", { "aria-hidden": "true", className: "aui-attachment-tile-error nc-transition-opacity absolute inset-0 flex items-center justify-center bg-background/70 backdrop-blur-[2px]", children: _jsx(AlertCircleIcon, { className: "text-destructive size-4" }) }))] }) }), isComposer && _jsx(AttachmentRemove, {})] }), _jsxs(TooltipContent, { side: "top", children: [_jsx(AttachmentPrimitive.Name, {}), errorMessage && _jsx("p", { className: "aui-attachment-error-message", children: errorMessage })] })] }) }));
81
+ };
82
+ const AttachmentRemove = () => {
83
+ return (_jsx(AttachmentPrimitive.Remove, { render: _jsx(TooltipIconButton, { tooltip: "Remove file", className: "aui-attachment-tile-remove absolute end-1 top-1 size-5 rounded-full bg-foreground/70! text-background! backdrop-blur-sm after:absolute after:-inset-1.5 hover:bg-foreground/85!", side: "top" }), children: _jsx(XIcon, { className: "aui-attachment-remove-icon size-3 stroke-[2.5]" }) }));
84
+ };
85
+ export const UserMessageAttachments = () => {
86
+ return (_jsx("div", { className: "aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2", children: _jsx(MessagePrimitive.Attachments, { children: () => _jsx(AttachmentUI, {}) }) }));
87
+ };
88
+ export const ComposerAttachments = () => {
89
+ return (_jsx("div", { className: "aui-composer-attachments flex w-full flex-row items-center gap-2 overflow-x-auto empty:hidden", children: _jsx(ComposerPrimitive.Attachments, { children: () => _jsx(AttachmentUI, {}) }) }));
90
+ };
91
+ export const ComposerAddAttachment = () => {
92
+ return (_jsx(ComposerPrimitive.AddAttachment, { render: _jsx(TooltipIconButton, { tooltip: "Add Attachment", side: "bottom", variant: "ghost", size: "icon", className: "aui-composer-add-attachment size-7 rounded-full p-1 text-xs font-semibold hover:bg-muted", "aria-label": "Add Attachment" }), children: _jsx(PlusIcon, { className: "aui-attachment-add-icon size-4.5 stroke-[1.5px]" }) }));
93
+ };
@@ -0,0 +1,3 @@
1
+ import { type FC } from "react";
2
+ export declare const ThreadFollowupSuggestions: FC;
3
+ //# sourceMappingURL=follow-up-suggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up-suggestions.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/follow-up-suggestions.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAwBhC,eAAO,MAAM,yBAAyB,EAAE,EAMvC,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { AuiIf, ThreadPrimitive, useAuiState } from "@assistant-ui/react";
4
+ const FollowupSuggestionsRow = () => {
5
+ const suggestions = useAuiState((s) => s.thread.suggestions);
6
+ return (_jsx("div", { className: "aui-thread-followup-suggestions -my-1 w-full overflow-x-auto py-1 [-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: _jsx("div", { className: "mx-auto flex min-h-8 w-max items-center gap-2 px-0.5", children: suggestions.map((suggestion, index) => (_jsx(ThreadPrimitive.Suggestion, { className: "aui-thread-followup-suggestion nc-transition-paint rounded-full border bg-background px-3 py-1 text-sm whitespace-nowrap hover:bg-muted/80", prompt: suggestion.prompt, method: "replace", autoSend: true, children: suggestion.prompt }, index))) }) }));
7
+ };
8
+ export const ThreadFollowupSuggestions = () => (_jsx(AuiIf, { condition: (s) => !s.thread.isEmpty && !s.thread.isRunning && s.thread.suggestions.length > 0, children: _jsx(FollowupSuggestionsRow, {}) }));
@@ -0,0 +1,2 @@
1
+ export declare const MarkdownText: import("react").MemoExoticComponent<() => import("react").JSX.Element>;
2
+ //# sourceMappingURL=markdown-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/markdown-text.tsx"],"names":[],"mappings":"AA2BA,eAAO,MAAM,YAAY,wEAAyB,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { MarkdownTextPrimitive, unstable_memoizeMarkdownComponents as memoizeMarkdownComponents, useIsMarkdownCodeBlock, } from "@assistant-ui/react-markdown";
4
+ import remarkGfm from "remark-gfm";
5
+ import { memo } from "react";
6
+ import { CheckIcon, CopyIcon } from "lucide-react";
7
+ import { TooltipIconButton } from "./tooltip-icon-button.js";
8
+ import { useCopyToClipboard } from "../../lib/use-copy-to-clipboard.js";
9
+ import { cn } from "../../lib/utils.js";
10
+ const MarkdownTextImpl = () => {
11
+ return (_jsx(MarkdownTextPrimitive, { remarkPlugins: [remarkGfm], className: "aui-md", components: defaultComponents, defer: true }));
12
+ };
13
+ export const MarkdownText = memo(MarkdownTextImpl);
14
+ const CodeHeader = ({ language, code }) => {
15
+ const { isCopied, copyToClipboard } = useCopyToClipboard({
16
+ text: code,
17
+ timeout: 3000,
18
+ skipWhileCopied: true,
19
+ });
20
+ const onCopy = () => {
21
+ if (!code || isCopied)
22
+ return;
23
+ void copyToClipboard();
24
+ };
25
+ return (_jsxs("div", { className: "aui-code-header-root border-border/50 bg-muted/50 mt-3 flex items-center justify-between rounded-t-xl border border-b-0 px-3.5 py-1.5 text-xs", children: [_jsx("span", { className: "aui-code-header-language text-muted-foreground font-medium lowercase", children: language }), _jsxs(TooltipIconButton, { tooltip: "Copy", onClick: onCopy, children: [!isCopied && _jsx(CopyIcon, {}), isCopied && _jsx(CheckIcon, {})] })] }));
26
+ };
27
+ const defaultComponents = memoizeMarkdownComponents({
28
+ h1: ({ className, ...props }) => (_jsx("h1", { className: cn("aui-md-h1 mt-5 mb-2 scroll-m-20 text-xl font-semibold first:mt-0 last:mb-0", className), ...props })),
29
+ h2: ({ className, ...props }) => (_jsx("h2", { className: cn("aui-md-h2 mt-5 mb-2 scroll-m-20 text-lg font-semibold first:mt-0 last:mb-0", className), ...props })),
30
+ h3: ({ className, ...props }) => (_jsx("h3", { className: cn("aui-md-h3 mt-4 mb-1.5 scroll-m-20 text-base font-semibold first:mt-0 last:mb-0", className), ...props })),
31
+ h4: ({ className, ...props }) => (_jsx("h4", { className: cn("aui-md-h4 mt-3.5 mb-1 scroll-m-20 text-base font-medium first:mt-0 last:mb-0", className), ...props })),
32
+ h5: ({ className, ...props }) => (_jsx("h5", { className: cn("aui-md-h5 mt-3 mb-1 text-sm font-semibold first:mt-0 last:mb-0", className), ...props })),
33
+ h6: ({ className, ...props }) => (_jsx("h6", { className: cn("aui-md-h6 mt-3 mb-1 text-sm font-medium first:mt-0 last:mb-0", className), ...props })),
34
+ p: ({ className, ...props }) => (_jsx("p", { className: cn("aui-md-p my-3 leading-relaxed first:mt-0 last:mb-0", className), ...props })),
35
+ a: ({ className, ...props }) => (_jsx("a", { className: cn("aui-md-a text-primary hover:text-primary/80 underline underline-offset-2", className), ...props })),
36
+ blockquote: ({ className, ...props }) => (_jsx("blockquote", { className: cn("aui-md-blockquote border-muted-foreground/30 text-muted-foreground my-3 border-s-2 ps-4", className), ...props })),
37
+ ul: ({ className, ...props }) => (_jsx("ul", { className: cn("aui-md-ul marker:text-muted-foreground my-3 ms-5 list-disc [&>li]:mt-1", className), ...props })),
38
+ ol: ({ className, ...props }) => (_jsx("ol", { className: cn("aui-md-ol marker:text-muted-foreground my-3 ms-5 list-decimal [&>li]:mt-1", className), ...props })),
39
+ hr: ({ className, ...props }) => (_jsx("hr", { className: cn("aui-md-hr border-muted-foreground/20 my-3", className), ...props })),
40
+ table: ({ className, ...props }) => (_jsx("table", { className: cn("aui-md-table my-3 w-full border-separate border-spacing-0 overflow-y-auto", className), ...props })),
41
+ th: ({ className, ...props }) => (_jsx("th", { className: cn("aui-md-th bg-muted px-3 py-1.5 text-start font-medium first:rounded-ss-lg last:rounded-se-lg [[align=center]]:text-center [[align=right]]:text-right", className), ...props })),
42
+ td: ({ className, ...props }) => (_jsx("td", { className: cn("aui-md-td border-muted-foreground/20 border-s border-b px-3 py-1.5 text-start last:border-e [[align=center]]:text-center [[align=right]]:text-right", className), ...props })),
43
+ tr: ({ className, ...props }) => (_jsx("tr", { className: cn("aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-es-lg [&:last-child>td:last-child]:rounded-ee-lg", className), ...props })),
44
+ li: ({ className, ...props }) => (_jsx("li", { className: cn("aui-md-li leading-relaxed", className), ...props })),
45
+ strong: ({ className, ...props }) => (_jsx("strong", { className: cn("aui-md-strong font-semibold", className), ...props })),
46
+ sup: ({ className, ...props }) => (_jsx("sup", { className: cn("aui-md-sup [&>a]:text-xs [&>a]:no-underline", className), ...props })),
47
+ pre: ({ className, ...props }) => (_jsx("pre", { className: cn("aui-md-pre border-border/50 bg-muted/30 overflow-x-auto rounded-t-none rounded-b-xl border border-t-0 p-3.5 text-[13px] leading-relaxed", className), ...props })),
48
+ code: function Code({ className, ...props }) {
49
+ const isCodeBlock = useIsMarkdownCodeBlock();
50
+ return (_jsx("code", { className: cn(!isCodeBlock &&
51
+ "aui-md-inline-code bg-muted rounded-md px-1.5 py-0.5 font-mono text-[0.85em]", className), ...props }));
52
+ },
53
+ CodeHeader,
54
+ });
@@ -0,0 +1,31 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ import { type ReasoningMessagePartComponent } from "@assistant-ui/react";
3
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../../components/collapsible";
4
+ declare const reasoningVariants: (props?: ({
5
+ variant?: "outline" | "ghost" | "muted" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export type ReasoningRootProps = Omit<React.ComponentProps<typeof Collapsible>, "open" | "onOpenChange"> & VariantProps<typeof reasoningVariants> & {
8
+ open?: boolean;
9
+ onOpenChange?: (open: boolean) => void;
10
+ defaultOpen?: boolean;
11
+ /**
12
+ * Whether the reasoning is currently streaming. While `true` the
13
+ * disclosure is held open with a bottom-pinned live preview; when
14
+ * streaming ends it returns to `defaultOpen`, and the first manual
15
+ * toggle takes over the open/close state permanently. The live preview
16
+ * keeps following the newest tokens while the disclosure is open during
17
+ * streaming, even after a manual toggle, and pauses while the reader is
18
+ * scrolled up.
19
+ */
20
+ streaming?: boolean;
21
+ };
22
+ declare function ReasoningRoot({ className, variant, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen, streaming, children, ...props }: ReasoningRootProps): import("react").JSX.Element;
23
+ declare function ReasoningTrigger({ active, duration, className, ...props }: React.ComponentProps<typeof CollapsibleTrigger> & {
24
+ active?: boolean;
25
+ duration?: number;
26
+ }): import("react").JSX.Element;
27
+ declare function ReasoningContent({ className, children, ...props }: React.ComponentProps<typeof CollapsibleContent>): import("react").JSX.Element;
28
+ declare function ReasoningText({ className, children, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
29
+ declare const Reasoning: ReasoningMessagePartComponent;
30
+ export { Reasoning, ReasoningRoot, ReasoningTrigger, ReasoningContent, ReasoningText };
31
+ //# sourceMappingURL=reasoning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/reasoning.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAiB,KAAK,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAExF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAO/F,QAAA,MAAM,iBAAiB;;8EAWrB,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,EACxC,MAAM,GAAG,cAAc,CACxB,GACC,YAAY,CAAC,OAAO,iBAAiB,CAAC,GAAG;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEJ,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EAAE,cAAc,EACpB,YAAY,EAAE,sBAAsB,EACpC,WAAmB,EACnB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,kBAAkB,+BAsDpB;AAkCD,iBAAS,gBAAgB,CAAC,EACxB,MAAM,EACN,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,GAAG;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,+BA2CA;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,+BAmBjD;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BA6DpF;AAID,QAAA,MAAM,SAAS,EAAqC,6BAA6B,CAAC;AAIlF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,118 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createContext, memo, useCallback, useContext, useEffect, useLayoutEffect, useRef, useState, } from "react";
4
+ import { cva } from "class-variance-authority";
5
+ import { BrainIcon, ChevronDownIcon } from "lucide-react";
6
+ import { useScrollLock } from "@assistant-ui/react";
7
+ import { MarkdownText } from "./markdown-text.js";
8
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../../components/collapsible.js";
9
+ import { cn } from "../../lib/utils.js";
10
+ const ANIMATION_DURATION = 200;
11
+ const ReasoningPreviewContext = createContext(false);
12
+ const reasoningVariants = cva("aui-reasoning-root mb-4 w-full", {
13
+ variants: {
14
+ variant: {
15
+ outline: "rounded-lg border px-3 py-2",
16
+ ghost: "",
17
+ muted: "bg-muted/50 rounded-lg px-3 py-2",
18
+ },
19
+ },
20
+ defaultVariants: {
21
+ variant: "outline",
22
+ },
23
+ });
24
+ function ReasoningRoot({ className, variant, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultOpen = false, streaming, children, ...props }) {
25
+ const collapsibleRef = useRef(null);
26
+ const initialOpenRef = useRef(defaultOpen);
27
+ const [userOpen, setUserOpen] = useState(null);
28
+ const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
29
+ const isControlled = controlledOpen !== undefined;
30
+ const isOpen = isControlled
31
+ ? controlledOpen
32
+ : (userOpen ?? (streaming || initialOpenRef.current));
33
+ const isPreview = streaming === true && isOpen;
34
+ const prevStreamingRef = useRef(streaming);
35
+ useLayoutEffect(() => {
36
+ if (prevStreamingRef.current === streaming)
37
+ return;
38
+ prevStreamingRef.current = streaming;
39
+ // A streaming transition only animates the panel when the resting state
40
+ // is collapsed; with `defaultOpen` the disclosure stays open across it.
41
+ if (!isControlled && userOpen === null && !initialOpenRef.current) {
42
+ lockScroll();
43
+ }
44
+ }, [streaming, isControlled, userOpen, lockScroll]);
45
+ const handleOpenChange = useCallback((open) => {
46
+ lockScroll();
47
+ if (!isControlled) {
48
+ setUserOpen(open);
49
+ }
50
+ controlledOnOpenChange?.(open);
51
+ }, [lockScroll, isControlled, controlledOnOpenChange]);
52
+ return (_jsx(Collapsible, { ref: collapsibleRef, "data-slot": "reasoning-root", "data-variant": variant, open: isOpen, onOpenChange: handleOpenChange, className: cn("group/reasoning-root", reasoningVariants({ variant, className })), style: {
53
+ "--animation-duration": `${ANIMATION_DURATION}ms`,
54
+ }, ...props, children: _jsx(ReasoningPreviewContext.Provider, { value: isPreview, children: children }) }));
55
+ }
56
+ function ReasoningFade({ side = "bottom", className, ...props }) {
57
+ if (side === "top") {
58
+ return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("aui-reasoning-fade pointer-events-none absolute inset-x-0 top-0 z-10 h-8", "bg-background/90 group-data-[variant=muted]/reasoning-root:bg-muted/90", className), ...props }));
59
+ }
60
+ return (_jsx("div", { "data-slot": "reasoning-fade", className: cn("aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-8", "bg-background/90 group-data-[variant=muted]/reasoning-root:bg-muted/90", className), ...props }));
61
+ }
62
+ function ReasoningTrigger({ active, duration, className, ...props }) {
63
+ const durationText = duration ? ` (${duration}s)` : "";
64
+ return (_jsxs(CollapsibleTrigger, { "data-slot": "reasoning-trigger", className: cn("aui-reasoning-trigger nc-transition-paint group/trigger flex max-w-[75%] origin-left items-center gap-2 py-1.5 text-sm text-muted-foreground hover:text-foreground", className), ...props, children: [_jsx(BrainIcon, { "data-slot": "reasoning-trigger-icon", className: "aui-reasoning-trigger-icon size-4 shrink-0" }), _jsxs("span", { "data-slot": "reasoning-trigger-label", className: "aui-reasoning-trigger-label-wrapper relative inline-block leading-none tabular-nums", children: [_jsxs("span", { children: ["Reasoning", durationText] }), active ? (_jsxs("span", { "aria-hidden": true, "data-slot": "reasoning-trigger-shimmer", className: "aui-reasoning-trigger-shimmer shimmer pointer-events-none absolute inset-0 motion-reduce:animate-none", children: ["Reasoning", durationText] })) : null] }), _jsx(ChevronDownIcon, { "data-slot": "reasoning-trigger-chevron", className: cn("aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0", "transition-transform duration-(--animation-duration) ease-[var(--nc-ease-out-strong)] motion-reduce:transition-none", "-rotate-90", "group-data-open/trigger:rotate-0", "group-data-panel-open/trigger:rotate-0") })] }));
65
+ }
66
+ function ReasoningContent({ className, children, ...props }) {
67
+ const isPreview = useContext(ReasoningPreviewContext);
68
+ return (_jsxs(CollapsibleContent, { "data-slot": "reasoning-content", className: cn("aui-reasoning-content text-muted-foreground relative overflow-hidden text-sm outline-none", "group/collapsible-content", "data-closed:pointer-events-none", className), ...props, children: [_jsx(ReasoningFade, { side: "top" }), children, isPreview ? _jsx(ReasoningFade, {}) : null] }));
69
+ }
70
+ function ReasoningText({ className, children, ...props }) {
71
+ const isPreview = useContext(ReasoningPreviewContext);
72
+ const scrollRef = useRef(null);
73
+ const contentRef = useRef(null);
74
+ useEffect(() => {
75
+ if (!isPreview)
76
+ return;
77
+ const scrollEl = scrollRef.current;
78
+ const contentEl = contentRef.current;
79
+ if (!scrollEl || !contentEl)
80
+ return;
81
+ let pinned = true;
82
+ let lastScrollTop = scrollEl.scrollTop;
83
+ let lastScrollHeight = scrollEl.scrollHeight;
84
+ const isAtBottom = () => Math.abs(scrollEl.scrollHeight - scrollEl.scrollTop - scrollEl.clientHeight) <= 1 ||
85
+ scrollEl.scrollHeight <= scrollEl.clientHeight;
86
+ const pin = () => {
87
+ if (!pinned)
88
+ return;
89
+ scrollEl.scrollTop = scrollEl.scrollHeight;
90
+ };
91
+ // A pin's own scroll event can arrive after new content grew the scroll
92
+ // height and read as "not at bottom"; only an upward move at unchanged
93
+ // scroll height is user intent.
94
+ const onScroll = () => {
95
+ if (isAtBottom()) {
96
+ pinned = true;
97
+ }
98
+ else if (scrollEl.scrollTop < lastScrollTop && scrollEl.scrollHeight === lastScrollHeight) {
99
+ pinned = false;
100
+ }
101
+ lastScrollTop = scrollEl.scrollTop;
102
+ lastScrollHeight = scrollEl.scrollHeight;
103
+ };
104
+ pin();
105
+ scrollEl.addEventListener("scroll", onScroll);
106
+ const observer = new ResizeObserver(pin);
107
+ observer.observe(contentEl);
108
+ return () => {
109
+ scrollEl.removeEventListener("scroll", onScroll);
110
+ observer.disconnect();
111
+ };
112
+ }, [isPreview]);
113
+ return (_jsx("div", { ref: scrollRef, "data-slot": "reasoning-text", className: cn("aui-reasoning-text relative z-0 max-h-64 overflow-y-auto ps-6 pt-2 pb-2 leading-relaxed text-pretty", "nc-transition-opacity", className), ...props, children: _jsx("div", { ref: contentRef, className: "aui-reasoning-text-content space-y-4", children: children }) }));
114
+ }
115
+ const ReasoningImpl = () => _jsx(MarkdownText, {});
116
+ const Reasoning = memo(ReasoningImpl);
117
+ Reasoning.displayName = "Reasoning";
118
+ export { Reasoning, ReasoningRoot, ReasoningTrigger, ReasoningContent, ReasoningText };
@@ -0,0 +1,26 @@
1
+ import { MessagePrimitive, type ToolCallMessagePartComponent } from "@assistant-ui/react";
2
+ import { type ComponentType, type FC, type PropsWithChildren } from "react";
3
+ export type ThreadGroupPart = MessagePrimitive.GroupedParts.GroupPart;
4
+ /**
5
+ * Optional component overrides for the thread. `AssistantMessage` and
6
+ * `Welcome` replace whole sections; the remaining slots override how the
7
+ * assistant message renders tool calls and part groups. Tool UIs registered
8
+ * by name (toolkit `render`, `useAssistantDataUI`) take precedence over
9
+ * `ToolFallback`.
10
+ */
11
+ export type ThreadComponents = {
12
+ AssistantMessage?: ComponentType | undefined;
13
+ Welcome?: ComponentType | undefined;
14
+ ToolFallback?: ToolCallMessagePartComponent | undefined;
15
+ ToolGroup?: ComponentType<PropsWithChildren<{
16
+ group: ThreadGroupPart;
17
+ }>> | undefined;
18
+ ReasoningGroup?: ComponentType<PropsWithChildren<{
19
+ group: ThreadGroupPart;
20
+ }>> | undefined;
21
+ };
22
+ export type ThreadProps = {
23
+ components?: ThreadComponents | undefined;
24
+ };
25
+ export declare const Thread: FC<ThreadProps>;
26
+ //# sourceMappingURL=thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/internal/assistant-ui/thread.tsx"],"names":[],"mappings":"AAyBA,OAAO,EASL,gBAAgB,EAGhB,KAAK,4BAA4B,EAElC,MAAM,qBAAqB,CAAC;AAe7B,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,EAAE,EACP,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,YAAY,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;IACxD,SAAS,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IACrF,cAAc,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAAE,KAAK,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;CAC3F,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC3C,CAAC;AAWF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CAQlC,CAAC"}