@assistant-ui/mcp-docs-server 0.2.3 → 0.3.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 (452) hide show
  1. package/README.md +16 -43
  2. package/dist/index.d.ts +2 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -91
  5. package/dist/index.js.map +1 -1
  6. package/dist/proxy.d.ts +9 -0
  7. package/dist/proxy.d.ts.map +1 -0
  8. package/dist/proxy.js +76 -0
  9. package/dist/proxy.js.map +1 -0
  10. package/package.json +8 -12
  11. package/src/index.ts +3 -115
  12. package/src/proxy.test.ts +250 -0
  13. package/src/proxy.ts +111 -0
  14. package/.docs/organized/code-examples/waterfall.md +0 -807
  15. package/.docs/organized/code-examples/with-a2a.md +0 -675
  16. package/.docs/organized/code-examples/with-ag-ui.md +0 -553
  17. package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -466
  18. package/.docs/organized/code-examples/with-artifacts.md +0 -815
  19. package/.docs/organized/code-examples/with-assistant-transport.md +0 -576
  20. package/.docs/organized/code-examples/with-browser-extension.md +0 -371
  21. package/.docs/organized/code-examples/with-chain-of-thought.md +0 -962
  22. package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
  23. package/.docs/organized/code-examples/with-cloud.md +0 -439
  24. package/.docs/organized/code-examples/with-custom-thread-list.md +0 -569
  25. package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -527
  26. package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -697
  27. package/.docs/organized/code-examples/with-eve.md +0 -405
  28. package/.docs/organized/code-examples/with-expo.md +0 -2246
  29. package/.docs/organized/code-examples/with-external-store.md +0 -421
  30. package/.docs/organized/code-examples/with-ffmpeg.md +0 -829
  31. package/.docs/organized/code-examples/with-generative-ui.md +0 -1810
  32. package/.docs/organized/code-examples/with-google-adk.md +0 -368
  33. package/.docs/organized/code-examples/with-heat-graph.md +0 -304
  34. package/.docs/organized/code-examples/with-image-generation.md +0 -463
  35. package/.docs/organized/code-examples/with-interactables.md +0 -733
  36. package/.docs/organized/code-examples/with-langchain.md +0 -446
  37. package/.docs/organized/code-examples/with-langgraph.md +0 -855
  38. package/.docs/organized/code-examples/with-livekit.md +0 -643
  39. package/.docs/organized/code-examples/with-mcp.md +0 -782
  40. package/.docs/organized/code-examples/with-nuxt.md +0 -2428
  41. package/.docs/organized/code-examples/with-opencode.md +0 -1974
  42. package/.docs/organized/code-examples/with-openui.md +0 -450
  43. package/.docs/organized/code-examples/with-pi.md +0 -2084
  44. package/.docs/organized/code-examples/with-react-hook-form.md +0 -727
  45. package/.docs/organized/code-examples/with-react-ink-web.md +0 -740
  46. package/.docs/organized/code-examples/with-react-ink.md +0 -473
  47. package/.docs/organized/code-examples/with-react-router.md +0 -936
  48. package/.docs/organized/code-examples/with-resumable-stream.md +0 -668
  49. package/.docs/organized/code-examples/with-store.md +0 -679
  50. package/.docs/organized/code-examples/with-svelte.md +0 -415
  51. package/.docs/organized/code-examples/with-sveltekit.md +0 -1061
  52. package/.docs/organized/code-examples/with-tanstack.md +0 -812
  53. package/.docs/organized/code-examples/with-tap-runtime.md +0 -813
  54. package/.docs/organized/code-examples/with-virtualized-thread.md +0 -681
  55. package/.docs/organized/code-examples/with-vue.md +0 -408
  56. package/.docs/raw/docs/(getting-started)/architecture.mdx +0 -146
  57. package/.docs/raw/docs/(getting-started)/base-ui.mdx +0 -39
  58. package/.docs/raw/docs/(getting-started)/cli.mdx +0 -542
  59. package/.docs/raw/docs/(getting-started)/devtools.mdx +0 -79
  60. package/.docs/raw/docs/(getting-started)/index.mdx +0 -23
  61. package/.docs/raw/docs/(getting-started)/installation.mdx +0 -483
  62. package/.docs/raw/docs/(getting-started)/llm.mdx +0 -211
  63. package/.docs/raw/docs/(getting-started)/rtl.mdx +0 -78
  64. package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +0 -36
  65. package/.docs/raw/docs/(reference)/api-reference/adapters/feedback.mdx +0 -20
  66. package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +0 -34
  67. package/.docs/raw/docs/(reference)/api-reference/adapters/model.mdx +0 -44
  68. package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +0 -59
  69. package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +0 -20
  70. package/.docs/raw/docs/(reference)/api-reference/adapters/suggestions.mdx +0 -26
  71. package/.docs/raw/docs/(reference)/api-reference/context-providers/assistant-runtime-provider.mdx +0 -84
  72. package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +0 -22
  73. package/.docs/raw/docs/(reference)/api-reference/context-providers/scoped-providers.mdx +0 -64
  74. package/.docs/raw/docs/(reference)/api-reference/external-store/index.mdx +0 -22
  75. package/.docs/raw/docs/(reference)/api-reference/external-store/message-conversion.mdx +0 -57
  76. package/.docs/raw/docs/(reference)/api-reference/external-store/runtime.mdx +0 -49
  77. package/.docs/raw/docs/(reference)/api-reference/generative-ui/a2ui.mdx +0 -40
  78. package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +0 -56
  79. package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +0 -86
  80. package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +0 -39
  81. package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +0 -42
  82. package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +0 -84
  83. package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +0 -85
  84. package/.docs/raw/docs/(reference)/api-reference/generative-ui/spec.mdx +0 -45
  85. package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +0 -93
  86. package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +0 -62
  87. package/.docs/raw/docs/(reference)/api-reference/hooks/composer-triggers.mdx +0 -129
  88. package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +0 -31
  89. package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +0 -34
  90. package/.docs/raw/docs/(reference)/api-reference/hooks/primitives.mdx +0 -350
  91. package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +0 -28
  92. package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +0 -97
  93. package/.docs/raw/docs/(reference)/api-reference/integrations/ai-sdk.mdx +0 -200
  94. package/.docs/raw/docs/(reference)/api-reference/integrations/cloud-ai-sdk.mdx +0 -24
  95. package/.docs/raw/docs/(reference)/api-reference/integrations/eve.mdx +0 -118
  96. package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
  97. package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +0 -37
  98. package/.docs/raw/docs/(reference)/api-reference/model-context/context.mdx +0 -50
  99. package/.docs/raw/docs/(reference)/api-reference/model-context/index.mdx +0 -22
  100. package/.docs/raw/docs/(reference)/api-reference/model-context/registry.mdx +0 -20
  101. package/.docs/raw/docs/(reference)/api-reference/overview.mdx +0 -566
  102. package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +0 -152
  103. package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar.mdx +0 -239
  104. package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +0 -208
  105. package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-modal.mdx +0 -108
  106. package/.docs/raw/docs/(reference)/api-reference/primitives/attachment.mdx +0 -99
  107. package/.docs/raw/docs/(reference)/api-reference/primitives/branch-picker.mdx +0 -145
  108. package/.docs/raw/docs/(reference)/api-reference/primitives/chain-of-thought.mdx +0 -82
  109. package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +0 -637
  110. package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +0 -22
  111. package/.docs/raw/docs/(reference)/api-reference/primitives/error.mdx +0 -65
  112. package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +0 -73
  113. package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +0 -117
  114. package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +0 -339
  115. package/.docs/raw/docs/(reference)/api-reference/primitives/queue-item.mdx +0 -77
  116. package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +0 -88
  117. package/.docs/raw/docs/(reference)/api-reference/primitives/suggestion.mdx +0 -81
  118. package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +0 -129
  119. package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item.mdx +0 -138
  120. package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +0 -122
  121. package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +0 -289
  122. package/.docs/raw/docs/(reference)/api-reference/runtimes/assistant-runtime.mdx +0 -20
  123. package/.docs/raw/docs/(reference)/api-reference/runtimes/attachment-runtime.mdx +0 -24
  124. package/.docs/raw/docs/(reference)/api-reference/runtimes/composer-runtime.mdx +0 -32
  125. package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +0 -43
  126. package/.docs/raw/docs/(reference)/api-reference/runtimes/message-part-runtime.mdx +0 -43
  127. package/.docs/raw/docs/(reference)/api-reference/runtimes/message-runtime.mdx +0 -24
  128. package/.docs/raw/docs/(reference)/api-reference/runtimes/queue-state.mdx +0 -20
  129. package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-item-runtime.mdx +0 -24
  130. package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +0 -24
  131. package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-runtime.mdx +0 -36
  132. package/.docs/raw/docs/(reference)/api-reference/tools/component-tools.mdx +0 -85
  133. package/.docs/raw/docs/(reference)/api-reference/tools/index.mdx +0 -45
  134. package/.docs/raw/docs/(reference)/api-reference/tools/interactables-legacy.mdx +0 -55
  135. package/.docs/raw/docs/(reference)/api-reference/tools/interactables.mdx +0 -151
  136. package/.docs/raw/docs/(reference)/api-reference/tools/rendering.mdx +0 -106
  137. package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -62
  138. package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +0 -178
  139. package/.docs/raw/docs/(reference)/api-reference/transport/assistant-transport.mdx +0 -48
  140. package/.docs/raw/docs/(reference)/api-reference/transport/frame.mdx +0 -62
  141. package/.docs/raw/docs/(reference)/api-reference/transport/index.mdx +0 -22
  142. package/.docs/raw/docs/(reference)/api-reference/utilities/index.mdx +0 -19
  143. package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +0 -152
  144. package/.docs/raw/docs/(reference)/api-reference/voice/index.mdx +0 -22
  145. package/.docs/raw/docs/(reference)/api-reference/voice/session.mdx +0 -54
  146. package/.docs/raw/docs/(reference)/api-reference/voice/speech-dictation.mdx +0 -36
  147. package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +0 -527
  148. package/.docs/raw/docs/cloud/ai-sdk.mdx +0 -604
  149. package/.docs/raw/docs/cloud/authorization.mdx +0 -252
  150. package/.docs/raw/docs/cloud/index.mdx +0 -46
  151. package/.docs/raw/docs/cloud/langgraph.mdx +0 -554
  152. package/.docs/raw/docs/copilots/assistant-frame.mdx +0 -411
  153. package/.docs/raw/docs/copilots/make-assistant-visible.mdx +0 -82
  154. package/.docs/raw/docs/copilots/model-context.mdx +0 -156
  155. package/.docs/raw/docs/copilots/motivation.mdx +0 -202
  156. package/.docs/raw/docs/copilots/use-assistant-instructions.mdx +0 -64
  157. package/.docs/raw/docs/guides/attachments.mdx +0 -619
  158. package/.docs/raw/docs/guides/branching.mdx +0 -76
  159. package/.docs/raw/docs/guides/chain-of-thought.mdx +0 -164
  160. package/.docs/raw/docs/guides/chatgpt-subscription.mdx +0 -108
  161. package/.docs/raw/docs/guides/context-api.mdx +0 -619
  162. package/.docs/raw/docs/guides/dictation.mdx +0 -298
  163. package/.docs/raw/docs/guides/editing.mdx +0 -102
  164. package/.docs/raw/docs/guides/electron.mdx +0 -369
  165. package/.docs/raw/docs/guides/headless-composer-input.mdx +0 -113
  166. package/.docs/raw/docs/guides/image-generation.mdx +0 -74
  167. package/.docs/raw/docs/guides/index.mdx +0 -117
  168. package/.docs/raw/docs/guides/input-history.mdx +0 -55
  169. package/.docs/raw/docs/guides/latex.mdx +0 -158
  170. package/.docs/raw/docs/guides/mentions.mdx +0 -575
  171. package/.docs/raw/docs/guides/message-timing.mdx +0 -215
  172. package/.docs/raw/docs/guides/quoting.mdx +0 -169
  173. package/.docs/raw/docs/guides/resumable-stream-deployment.mdx +0 -212
  174. package/.docs/raw/docs/guides/resumable-stream-stores.mdx +0 -152
  175. package/.docs/raw/docs/guides/resumable-streams.mdx +0 -292
  176. package/.docs/raw/docs/guides/slash-commands.mdx +0 -358
  177. package/.docs/raw/docs/guides/speech.mdx +0 -172
  178. package/.docs/raw/docs/guides/suggestions.mdx +0 -384
  179. package/.docs/raw/docs/guides/virtualization.mdx +0 -133
  180. package/.docs/raw/docs/guides/voice.mdx +0 -310
  181. package/.docs/raw/docs/ink/adapters.mdx +0 -99
  182. package/.docs/raw/docs/ink/custom-backend.mdx +0 -254
  183. package/.docs/raw/docs/ink/hooks.mdx +0 -469
  184. package/.docs/raw/docs/ink/index.mdx +0 -237
  185. package/.docs/raw/docs/ink/migration.mdx +0 -138
  186. package/.docs/raw/docs/ink/primitives.mdx +0 -1259
  187. package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +0 -528
  188. package/.docs/raw/docs/integrations/auth/better-auth.mdx +0 -188
  189. package/.docs/raw/docs/integrations/auth/clerk.mdx +0 -166
  190. package/.docs/raw/docs/integrations/auth/next-auth.mdx +0 -191
  191. package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +0 -88
  192. package/.docs/raw/docs/integrations/frameworks/cloudflare-agents.mdx +0 -283
  193. package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +0 -188
  194. package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +0 -57
  195. package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +0 -201
  196. package/.docs/raw/docs/integrations/gateways/index.mdx +0 -162
  197. package/.docs/raw/docs/integrations/index.mdx +0 -178
  198. package/.docs/raw/docs/integrations/observability/helicone.mdx +0 -129
  199. package/.docs/raw/docs/integrations/observability/langfuse.mdx +0 -161
  200. package/.docs/raw/docs/integrations/observability/langsmith.mdx +0 -151
  201. package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +0 -773
  202. package/.docs/raw/docs/migrations/deprecation-policy.mdx +0 -42
  203. package/.docs/raw/docs/migrations/index.mdx +0 -50
  204. package/.docs/raw/docs/migrations/react-compatibility.mdx +0 -74
  205. package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +0 -328
  206. package/.docs/raw/docs/migrations/toolkit-tools.mdx +0 -236
  207. package/.docs/raw/docs/migrations/v0-11.mdx +0 -172
  208. package/.docs/raw/docs/migrations/v0-12.mdx +0 -302
  209. package/.docs/raw/docs/migrations/v0-14.mdx +0 -297
  210. package/.docs/raw/docs/migrations/v0-15.mdx +0 -270
  211. package/.docs/raw/docs/primitives/action-bar.mdx +0 -352
  212. package/.docs/raw/docs/primitives/assistant-modal.mdx +0 -216
  213. package/.docs/raw/docs/primitives/attachment.mdx +0 -217
  214. package/.docs/raw/docs/primitives/branch-picker.mdx +0 -222
  215. package/.docs/raw/docs/primitives/chain-of-thought.mdx +0 -315
  216. package/.docs/raw/docs/primitives/composer.mdx +0 -659
  217. package/.docs/raw/docs/primitives/error.mdx +0 -142
  218. package/.docs/raw/docs/primitives/index.mdx +0 -99
  219. package/.docs/raw/docs/primitives/message.mdx +0 -618
  220. package/.docs/raw/docs/primitives/selection-toolbar.mdx +0 -191
  221. package/.docs/raw/docs/primitives/suggestion.mdx +0 -254
  222. package/.docs/raw/docs/primitives/thread-list.mdx +0 -467
  223. package/.docs/raw/docs/primitives/thread.mdx +0 -509
  224. package/.docs/raw/docs/react-native/adapters.mdx +0 -94
  225. package/.docs/raw/docs/react-native/custom-backend.mdx +0 -207
  226. package/.docs/raw/docs/react-native/hooks.mdx +0 -339
  227. package/.docs/raw/docs/react-native/index.mdx +0 -289
  228. package/.docs/raw/docs/react-native/migration.mdx +0 -142
  229. package/.docs/raw/docs/react-native/primitives.mdx +0 -976
  230. package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +0 -399
  231. package/.docs/raw/docs/runtimes/a2a/overview.mdx +0 -60
  232. package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +0 -216
  233. package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +0 -124
  234. package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +0 -70
  235. package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +0 -243
  236. package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +0 -267
  237. package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +0 -61
  238. package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +0 -122
  239. package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +0 -135
  240. package/.docs/raw/docs/runtimes/ai-sdk/v6-legacy.mdx +0 -636
  241. package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +0 -731
  242. package/.docs/raw/docs/runtimes/claude-managed-agents.mdx +0 -118
  243. package/.docs/raw/docs/runtimes/concepts/adapters.mdx +0 -265
  244. package/.docs/raw/docs/runtimes/concepts/architecture.mdx +0 -167
  245. package/.docs/raw/docs/runtimes/concepts/stability.mdx +0 -68
  246. package/.docs/raw/docs/runtimes/concepts/threads.mdx +0 -513
  247. package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +0 -763
  248. package/.docs/raw/docs/runtimes/custom/data-stream.mdx +0 -339
  249. package/.docs/raw/docs/runtimes/custom/external-store.mdx +0 -957
  250. package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +0 -902
  251. package/.docs/raw/docs/runtimes/custom/overview.mdx +0 -71
  252. package/.docs/raw/docs/runtimes/eve/overview.mdx +0 -151
  253. package/.docs/raw/docs/runtimes/eve/quickstart.mdx +0 -192
  254. package/.docs/raw/docs/runtimes/google-adk/api.mdx +0 -256
  255. package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +0 -784
  256. package/.docs/raw/docs/runtimes/google-adk/overview.mdx +0 -69
  257. package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +0 -229
  258. package/.docs/raw/docs/runtimes/langchain.mdx +0 -901
  259. package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +0 -181
  260. package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +0 -305
  261. package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +0 -104
  262. package/.docs/raw/docs/runtimes/langgraph/overview.mdx +0 -84
  263. package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +0 -496
  264. package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +0 -144
  265. package/.docs/raw/docs/runtimes/langgraph/threads.mdx +0 -113
  266. package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +0 -29
  267. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -93
  268. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +0 -347
  269. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +0 -393
  270. package/.docs/raw/docs/runtimes/opencode/hooks.mdx +0 -194
  271. package/.docs/raw/docs/runtimes/opencode/overview.mdx +0 -58
  272. package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +0 -119
  273. package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +0 -133
  274. package/.docs/raw/docs/tools/a2ui.mdx +0 -107
  275. package/.docs/raw/docs/tools/backend.mdx +0 -147
  276. package/.docs/raw/docs/tools/defining-tools.mdx +0 -574
  277. package/.docs/raw/docs/tools/dynamic-tools.mdx +0 -112
  278. package/.docs/raw/docs/tools/generative-ui-primitive.mdx +0 -180
  279. package/.docs/raw/docs/tools/generative-ui-slack.mdx +0 -167
  280. package/.docs/raw/docs/tools/generative-ui-teams.mdx +0 -160
  281. package/.docs/raw/docs/tools/generative-ui.mdx +0 -322
  282. package/.docs/raw/docs/tools/index.mdx +0 -72
  283. package/.docs/raw/docs/tools/interactables.mdx +0 -1084
  284. package/.docs/raw/docs/tools/mcp-apps.mdx +0 -363
  285. package/.docs/raw/docs/tools/mcp.mdx +0 -466
  286. package/.docs/raw/docs/tools/multi-agent.mdx +0 -237
  287. package/.docs/raw/docs/tools/openui.mdx +0 -175
  288. package/.docs/raw/docs/tools/tool-ui.mdx +0 -1020
  289. package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
  290. package/.docs/raw/docs/ui/assistant-modal.mdx +0 -166
  291. package/.docs/raw/docs/ui/assistant-sidebar.mdx +0 -89
  292. package/.docs/raw/docs/ui/attachment.mdx +0 -279
  293. package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -247
  294. package/.docs/raw/docs/ui/context-display.mdx +0 -148
  295. package/.docs/raw/docs/ui/directive-text.mdx +0 -114
  296. package/.docs/raw/docs/ui/file.mdx +0 -159
  297. package/.docs/raw/docs/ui/follow-up-suggestions.mdx +0 -82
  298. package/.docs/raw/docs/ui/image.mdx +0 -102
  299. package/.docs/raw/docs/ui/markdown.mdx +0 -103
  300. package/.docs/raw/docs/ui/mcp-config.mdx +0 -107
  301. package/.docs/raw/docs/ui/mermaid.mdx +0 -92
  302. package/.docs/raw/docs/ui/message-timing.mdx +0 -93
  303. package/.docs/raw/docs/ui/model-selector.mdx +0 -455
  304. package/.docs/raw/docs/ui/part-grouping.mdx +0 -614
  305. package/.docs/raw/docs/ui/quote.mdx +0 -211
  306. package/.docs/raw/docs/ui/reasoning.mdx +0 -214
  307. package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
  308. package/.docs/raw/docs/ui/sources.mdx +0 -186
  309. package/.docs/raw/docs/ui/streamdown.mdx +0 -392
  310. package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
  311. package/.docs/raw/docs/ui/thread-list.mdx +0 -411
  312. package/.docs/raw/docs/ui/thread.mdx +0 -559
  313. package/.docs/raw/docs/ui/tool-fallback.mdx +0 -141
  314. package/.docs/raw/docs/ui/tool-group.mdx +0 -240
  315. package/.docs/raw/docs/ui/voice.mdx +0 -173
  316. package/.docs/raw/docs/utilities/heat-graph.mdx +0 -237
  317. package/.docs/raw/docs/utilities/react-o11y.mdx +0 -362
  318. package/.docs/raw/docs/utilities/tw-shimmer.mdx +0 -212
  319. package/dist/constants.d.ts +0 -14
  320. package/dist/constants.d.ts.map +0 -1
  321. package/dist/constants.js +0 -19
  322. package/dist/constants.js.map +0 -1
  323. package/dist/prepare-docs/code-examples.d.ts +0 -5
  324. package/dist/prepare-docs/code-examples.d.ts.map +0 -1
  325. package/dist/prepare-docs/code-examples.js +0 -117
  326. package/dist/prepare-docs/code-examples.js.map +0 -1
  327. package/dist/prepare-docs/copy-raw.d.ts +0 -5
  328. package/dist/prepare-docs/copy-raw.d.ts.map +0 -1
  329. package/dist/prepare-docs/copy-raw.js +0 -49
  330. package/dist/prepare-docs/copy-raw.js.map +0 -1
  331. package/dist/prepare-docs/prepare.d.ts +0 -1
  332. package/dist/prepare-docs/prepare.js +0 -22
  333. package/dist/prepare-docs/prepare.js.map +0 -1
  334. package/dist/prompts/xulux-playground.d.ts +0 -12
  335. package/dist/prompts/xulux-playground.d.ts.map +0 -1
  336. package/dist/prompts/xulux-playground.js +0 -33
  337. package/dist/prompts/xulux-playground.js.map +0 -1
  338. package/dist/tools/docs.d.ts +0 -22
  339. package/dist/tools/docs.d.ts.map +0 -1
  340. package/dist/tools/docs.js +0 -177
  341. package/dist/tools/docs.js.map +0 -1
  342. package/dist/tools/examples.d.ts +0 -24
  343. package/dist/tools/examples.d.ts.map +0 -1
  344. package/dist/tools/examples.js +0 -87
  345. package/dist/tools/examples.js.map +0 -1
  346. package/dist/tools/resources.d.ts +0 -6
  347. package/dist/tools/resources.d.ts.map +0 -1
  348. package/dist/tools/resources.js +0 -75
  349. package/dist/tools/resources.js.map +0 -1
  350. package/dist/tools/search.d.ts +0 -24
  351. package/dist/tools/search.d.ts.map +0 -1
  352. package/dist/tools/search.js +0 -39
  353. package/dist/tools/search.js.map +0 -1
  354. package/dist/tools/tests/mcp-test-client.d.ts +0 -15
  355. package/dist/tools/tests/mcp-test-client.d.ts.map +0 -1
  356. package/dist/tools/tests/mcp-test-client.js +0 -68
  357. package/dist/tools/tests/mcp-test-client.js.map +0 -1
  358. package/dist/tools/tests/test-setup.d.ts +0 -7
  359. package/dist/tools/tests/test-setup.d.ts.map +0 -1
  360. package/dist/tools/tests/test-setup.js +0 -36
  361. package/dist/tools/tests/test-setup.js.map +0 -1
  362. package/dist/tools/xulux-templates.d.ts +0 -58
  363. package/dist/tools/xulux-templates.d.ts.map +0 -1
  364. package/dist/tools/xulux-templates.js +0 -84
  365. package/dist/tools/xulux-templates.js.map +0 -1
  366. package/dist/utils/cache.d.ts +0 -5
  367. package/dist/utils/cache.d.ts.map +0 -1
  368. package/dist/utils/cache.js +0 -18
  369. package/dist/utils/cache.js.map +0 -1
  370. package/dist/utils/logger.d.ts +0 -10
  371. package/dist/utils/logger.d.ts.map +0 -1
  372. package/dist/utils/logger.js +0 -20
  373. package/dist/utils/logger.js.map +0 -1
  374. package/dist/utils/mcp-format.d.ts +0 -11
  375. package/dist/utils/mcp-format.d.ts.map +0 -1
  376. package/dist/utils/mcp-format.js +0 -14
  377. package/dist/utils/mcp-format.js.map +0 -1
  378. package/dist/utils/mdx.d.ts +0 -12
  379. package/dist/utils/mdx.d.ts.map +0 -1
  380. package/dist/utils/mdx.js +0 -45
  381. package/dist/utils/mdx.js.map +0 -1
  382. package/dist/utils/paths.d.ts +0 -12
  383. package/dist/utils/paths.d.ts.map +0 -1
  384. package/dist/utils/paths.js +0 -93
  385. package/dist/utils/paths.js.map +0 -1
  386. package/dist/utils/search.d.ts +0 -10
  387. package/dist/utils/search.d.ts.map +0 -1
  388. package/dist/utils/search.js +0 -97
  389. package/dist/utils/search.js.map +0 -1
  390. package/dist/utils/security.d.ts +0 -5
  391. package/dist/utils/security.d.ts.map +0 -1
  392. package/dist/utils/security.js +0 -22
  393. package/dist/utils/security.js.map +0 -1
  394. package/dist/xulux/catalog-client.d.ts +0 -14
  395. package/dist/xulux/catalog-client.d.ts.map +0 -1
  396. package/dist/xulux/catalog-client.js +0 -112
  397. package/dist/xulux/catalog-client.js.map +0 -1
  398. package/dist/xulux/fallback-catalog.d.ts +0 -7
  399. package/dist/xulux/fallback-catalog.d.ts.map +0 -1
  400. package/dist/xulux/fallback-catalog.js +0 -47
  401. package/dist/xulux/fallback-catalog.js.map +0 -1
  402. package/dist/xulux/fetch-sandbox.d.ts +0 -5
  403. package/dist/xulux/fetch-sandbox.d.ts.map +0 -1
  404. package/dist/xulux/fetch-sandbox.js +0 -40
  405. package/dist/xulux/fetch-sandbox.js.map +0 -1
  406. package/dist/xulux/template-service.d.ts +0 -84
  407. package/dist/xulux/template-service.d.ts.map +0 -1
  408. package/dist/xulux/template-service.js +0 -223
  409. package/dist/xulux/template-service.js.map +0 -1
  410. package/dist/xulux/types.d.ts +0 -55
  411. package/dist/xulux/types.d.ts.map +0 -1
  412. package/dist/xulux/types.js +0 -6
  413. package/dist/xulux/types.js.map +0 -1
  414. package/src/constants.ts +0 -24
  415. package/src/prepare-docs/code-examples.ts +0 -158
  416. package/src/prepare-docs/copy-raw.ts +0 -50
  417. package/src/prepare-docs/prepare.ts +0 -24
  418. package/src/prompts/xulux-playground.ts +0 -36
  419. package/src/tools/docs.ts +0 -255
  420. package/src/tools/examples.ts +0 -114
  421. package/src/tools/resources.ts +0 -111
  422. package/src/tools/search.ts +0 -46
  423. package/src/tools/tests/completions.test.ts +0 -60
  424. package/src/tools/tests/directory-size-cap.test.ts +0 -50
  425. package/src/tools/tests/docs.test.ts +0 -147
  426. package/src/tools/tests/examples.test.ts +0 -94
  427. package/src/tools/tests/integration.test.ts +0 -45
  428. package/src/tools/tests/json-parsing.test.ts +0 -23
  429. package/src/tools/tests/listings-cache.test.ts +0 -19
  430. package/src/tools/tests/mcp-protocol.test.ts +0 -216
  431. package/src/tools/tests/mcp-test-client.ts +0 -111
  432. package/src/tools/tests/path-traversal.test.ts +0 -84
  433. package/src/tools/tests/resources.test.ts +0 -133
  434. package/src/tools/tests/search.test.ts +0 -37
  435. package/src/tools/tests/test-setup.ts +0 -50
  436. package/src/tools/tests/xulux-templates.test.ts +0 -325
  437. package/src/tools/xulux-templates.ts +0 -141
  438. package/src/utils/cache.ts +0 -20
  439. package/src/utils/logger.ts +0 -20
  440. package/src/utils/mcp-format.ts +0 -14
  441. package/src/utils/mdx.ts +0 -59
  442. package/src/utils/paths.ts +0 -139
  443. package/src/utils/search.ts +0 -131
  444. package/src/utils/security.ts +0 -52
  445. package/src/utils/tests/cache.test.ts +0 -51
  446. package/src/utils/tests/mcp-format.test.ts +0 -22
  447. package/src/utils/tests/security.test.ts +0 -119
  448. package/src/xulux/catalog-client.ts +0 -150
  449. package/src/xulux/fallback-catalog.ts +0 -63
  450. package/src/xulux/fetch-sandbox.ts +0 -56
  451. package/src/xulux/template-service.ts +0 -406
  452. package/src/xulux/types.ts +0 -64
@@ -1,614 +0,0 @@
1
- ---
2
- title: Message Part Grouping
3
- description: Organize message parts into custom groups with flexible grouping functions.
4
- platforms: ["react"]
5
- ---
6
-
7
- import { PartGroupingSample } from "@/components/pages/docs/samples/part-grouping";
8
-
9
- <PartGroupingSample />
10
-
11
- ## Basic Usage
12
-
13
- For adjacent grouping, use `MessagePrimitive.GroupedParts`. For the common case — grouping by `part.type` — pass `groupPartByType` to map each part type to a group-key path. Adjacent parts that share a group key are coalesced and rendered through the group case.
14
-
15
- ```tsx title="/components/assistant-ui/thread.tsx"
16
- import { MessagePrimitive, groupPartByType } from "@assistant-ui/react";
17
-
18
- const AssistantMessage: FC = () => {
19
- return (
20
- <MessagePrimitive.Root className="...">
21
- <div className="...">
22
- <MessagePrimitive.GroupedParts
23
- groupBy={groupPartByType({
24
- "tool-call": ["group-tool"],
25
- })}
26
- >
27
- {({ part, children }) => {
28
- switch (part.type) {
29
- case "group-tool":
30
- return <div className="group">{children}</div>;
31
- case "tool-call":
32
- return part.toolUI ?? null;
33
- default:
34
- return null;
35
- }
36
- }}
37
- </MessagePrimitive.GroupedParts>
38
- </div>
39
- <AssistantActionBar />
40
- <BranchPicker className="..." />
41
- </MessagePrimitive.Root>
42
- );
43
- };
44
- ```
45
-
46
- Reach for an inline `groupBy={(part) => …}` only when the helper isn't expressive enough — e.g. you need to branch on `part.toolName`, `part.parentId`, or part metadata.
47
-
48
- ## How Adjacent Grouping Works
49
-
50
- `groupBy` receives each part and returns either `null` for an ungrouped leaf or a group-key path such as `["group-chainOfThought", "group-tool"]`. Group keys must start with `"group-"` so your render function can distinguish synthetic groups from real part types.
51
-
52
- The render function receives both group nodes and leaf parts through `{ part, children }`. Only group cases should render `children`; leaf cases should render their own UI or return `null`.
53
-
54
- <Callout type="warn">
55
- `MessagePrimitive.Unstable_PartsGrouped` remains available for rare non-adjacent clustering where one group needs to collect parts from different positions in the message. For normal consecutive reasoning/tool grouping, use `GroupedParts`.
56
- </Callout>
57
-
58
- ## Use Cases & Examples
59
-
60
- ### Group by Parent ID
61
-
62
- Group adjacent content that shares the same parent relationship:
63
-
64
- ```tsx
65
- import { useState, type PropsWithChildren } from "react";
66
- import { ChevronDownIcon, ChevronUpIcon } from "lucide-react";
67
- import { MessagePrimitive } from "@assistant-ui/react";
68
-
69
- function ParentGroup({
70
- id,
71
- count,
72
- children,
73
- }: PropsWithChildren<{ id: string; count: number }>) {
74
- const [collapsed, setCollapsed] = useState(false);
75
-
76
- return (
77
- <div className="my-2 overflow-hidden rounded-lg border">
78
- <button
79
- type="button"
80
- onClick={() => setCollapsed((value) => !value)}
81
- className="hover:bg-muted/50 flex w-full items-center justify-between p-3"
82
- >
83
- <span>
84
- Group {id} ({count} items)
85
- </span>
86
- {collapsed ? <ChevronDownIcon /> : <ChevronUpIcon />}
87
- </button>
88
- {!collapsed && <div className="border-t p-3">{children}</div>}
89
- </div>
90
- );
91
- }
92
-
93
- <MessagePrimitive.GroupedParts
94
- groupBy={(part) => {
95
- if (!part.parentId) return [];
96
- return [`group-parent-${part.parentId}`];
97
- }}
98
- >
99
- {({ part, children }) => {
100
- if (part.type.startsWith("group-parent-")) {
101
- const id = part.type.replace("group-parent-", "");
102
- return (
103
- <ParentGroup id={id} count={part.indices.length}>
104
- {children}
105
- </ParentGroup>
106
- );
107
- }
108
-
109
- if (part.type === "text") return <MarkdownText />;
110
- if (part.type === "tool-call") return part.toolUI ?? <ToolFallback {...part} />;
111
- return null;
112
- }}
113
- </MessagePrimitive.GroupedParts>
114
- ```
115
-
116
- ### Group by Tool Name
117
-
118
- Organize adjacent tool calls by tool name:
119
-
120
- ```tsx
121
- <MessagePrimitive.GroupedParts
122
- groupBy={(part) => {
123
- if (part.type !== "tool-call") return [];
124
- return [`group-tool-${part.toolName}`];
125
- }}
126
- >
127
- {({ part, children }) => {
128
- if (part.type.startsWith("group-tool-")) {
129
- const toolName = part.type.replace("group-tool-", "");
130
- return (
131
- <div className="tool-group my-2 rounded-lg border">
132
- <div className="bg-muted/50 px-4 py-2 text-sm font-medium">
133
- Tool: {toolName} ({part.indices.length} calls)
134
- </div>
135
- <div className="p-4">{children}</div>
136
- </div>
137
- );
138
- }
139
-
140
- if (part.type === "text") return <MarkdownText />;
141
- if (part.type === "tool-call") return part.toolUI ?? <ToolFallback {...part} />;
142
- return null;
143
- }}
144
- </MessagePrimitive.GroupedParts>
145
- ```
146
-
147
- ### Group Consecutive Text Parts
148
-
149
- Combine multiple text parts into cohesive blocks:
150
-
151
- ```tsx
152
- <MessagePrimitive.GroupedParts
153
- groupBy={groupPartByType({
154
- text: ["group-text-block"],
155
- })}
156
- >
157
- {({ part, children }) => {
158
- switch (part.type) {
159
- case "group-text-block":
160
- return (
161
- <div className="prose prose-sm my-2 rounded-lg bg-gray-50 p-4">
162
- {children}
163
- </div>
164
- );
165
- case "text":
166
- return <MarkdownText />;
167
- case "tool-call":
168
- return part.toolUI ?? <ToolFallback {...part} />;
169
- default:
170
- return null;
171
- }
172
- }}
173
- </MessagePrimitive.GroupedParts>
174
- ```
175
-
176
- ### Group by Content Type
177
-
178
- Separate different types of content for distinct visual treatment:
179
-
180
- ```tsx
181
- <MessagePrimitive.GroupedParts
182
- groupBy={groupPartByType({
183
- text: ["group-content-text"],
184
- "tool-call": ["group-content-tools"],
185
- reasoning: ["group-content-reasoning"],
186
- })}
187
- >
188
- {({ part, children }) => {
189
- switch (part.type) {
190
- case "group-content-text":
191
- return <div className="space-y-2">{children}</div>;
192
- case "group-content-tools":
193
- return <div className="my-2 rounded-lg border p-3">{children}</div>;
194
- case "group-content-reasoning":
195
- return <div className="my-2 text-muted-foreground">{children}</div>;
196
- case "text":
197
- return <MarkdownText />;
198
- case "reasoning":
199
- return <Reasoning {...part} />;
200
- case "tool-call":
201
- return part.toolUI ?? <ToolFallback {...part} />;
202
- default:
203
- return null;
204
- }
205
- }}
206
- </MessagePrimitive.GroupedParts>
207
- ```
208
-
209
- ### Keep Standalone Tool UIs Out of the Trace
210
-
211
- Tool UIs fall into three buckets: prompting the user (human-in-the-loop), informing the user (generative UI), and traces of what the model is doing (routine tool calls). The first two should be surfaced on their own, while the last belongs folded into a collapsible chain-of-thought group.
212
-
213
- Mark a tool with `display: "standalone"` to keep its UI out of the grouped trace. `human` tools and MCP apps are standalone automatically; every other tool defaults to `"inline"` and opts in explicitly:
214
-
215
- ```tsx
216
- const toolkit = defineToolkit({
217
- ask_user: { type: "human", render: AskUI }, // standalone (forced)
218
- search_web: { type: "frontend", render: SearchUI }, // inline trace (default)
219
- checkout: {
220
- type: "frontend",
221
- render: CheckoutUI,
222
- display: "standalone", // opt in
223
- },
224
- });
225
- ```
226
-
227
- The synthetic `"standalone-tool-call"` key on `groupPartByType` matches all of these. `MessagePrimitive.GroupedParts` passes the live tool-UI registry to `groupBy` as a second `context` argument, and the helper reads it to resolve the registry-driven cases — MCP-app calls are detected from the part alone, so nothing is threaded in:
228
-
229
- ```tsx
230
- <MessagePrimitive.GroupedParts
231
- groupBy={groupPartByType({
232
- reasoning: ["group-chainOfThought", "group-reasoning"],
233
- "tool-call": ["group-chainOfThought", "group-tool"],
234
- "standalone-tool-call": [], // ungrouped — rendered on its own
235
- })}
236
- >
237
- {({ part, children }) => {
238
- switch (part.type) {
239
- case "group-chainOfThought":
240
- return <div className="chain-of-thought">{children}</div>;
241
- case "tool-call":
242
- return part.toolUI ?? <ToolFallback {...part} />;
243
- // ...
244
- default:
245
- return null;
246
- }
247
- }}
248
- </MessagePrimitive.GroupedParts>;
249
- ```
250
-
251
- ### Render Tool Calls as Flat Rows
252
-
253
- The previous section keeps `"tool-call"` folded into the chain-of-thought and only lifts standalone tool UIs out. To keep reasoning collapsed in a group while every tool call renders as its own row in the message flow, map both tool keys to `[]`:
254
-
255
- ```tsx
256
- <MessagePrimitive.GroupedParts
257
- groupBy={groupPartByType({
258
- reasoning: ["group-thought", "group-reasoning"],
259
- "tool-call": [],
260
- "standalone-tool-call": [],
261
- })}
262
- >
263
- {({ part, children }) => {
264
- switch (part.type) {
265
- case "group-thought":
266
- case "group-reasoning":
267
- return <ReasoningBlock>{children}</ReasoningBlock>;
268
- case "reasoning":
269
- return <Reasoning {...part} />;
270
- case "tool-call":
271
- return part.toolUI ?? <ToolFallback {...part} />;
272
- case "text":
273
- return <MarkdownText />;
274
- case "indicator":
275
- return <LoadingDots />;
276
- default:
277
- return null;
278
- }
279
- }}
280
- </MessagePrimitive.GroupedParts>
281
- ```
282
-
283
- Adjacent `reasoning` parts still coalesce into one `group-thought`, while each tool call is a leaf at the same level as text — the `"standalone-tool-call"` entry is mapped to `[]` too so human-in-the-loop and generative-UI tools stay flat alongside routine calls instead of falling through to `"tool-call"`. Tool-call leaves keep their stable identity keys across re-renders, so rows don't remount as the message streams.
284
-
285
- <Callout type="warn">
286
- This renders tool calls flat **in the message flow** — each leaf sits where the part appears, in order. It does not pin, portal, float, or otherwise move tool UIs out of the flow into a sidebar or fixed region. For out-of-flow placement you still own the layout outside `GroupedParts`.
287
- </Callout>
288
-
289
- ### Group by Custom Metadata
290
-
291
- Use any custom metadata in your parts for grouping:
292
-
293
- ```tsx
294
- const priorityStyles = {
295
- high: "border-red-500 bg-red-50",
296
- normal: "border-gray-300 bg-white",
297
- low: "border-gray-200 bg-gray-50",
298
- };
299
-
300
- <MessagePrimitive.GroupedParts
301
- groupBy={(part) => {
302
- const priority = part.metadata?.priority;
303
- if (!priority) return [];
304
- return [`group-priority-${priority}`];
305
- }}
306
- >
307
- {({ part, children }) => {
308
- if (part.type.startsWith("group-priority-")) {
309
- const priority = part.type.replace("group-priority-", "");
310
- return (
311
- <div
312
- className={`my-2 rounded-lg border-2 p-4 ${priorityStyles[priority] || ""}`}
313
- >
314
- <div className="mb-2 text-xs font-semibold uppercase text-gray-600">
315
- {priority} Priority
316
- </div>
317
- {children}
318
- </div>
319
- );
320
- }
321
-
322
- if (part.type === "text") return <MarkdownText />;
323
- if (part.type === "tool-call") return part.toolUI ?? <ToolFallback {...part} />;
324
- return null;
325
- }}
326
- </MessagePrimitive.GroupedParts>
327
- ```
328
-
329
- ## Integration with Assistant Streams
330
-
331
- When using assistant-stream libraries, you can add custom metadata to parts:
332
-
333
- ### Python (assistant-stream)
334
-
335
- ```python
336
- from assistant_stream import create_run
337
-
338
- async def my_run(controller):
339
- # Add parts with custom parentId
340
- research_controller = controller.with_parent_id("research-123")
341
-
342
- tool = await research_controller.add_tool_call("search")
343
- tool.append_args_text('{"query": "climate data"}')
344
- tool.set_response("climate data results")
345
- research_controller.append_text("Key findings from the research:")
346
-
347
- # Add text with a different parent_id
348
- controller.append_text("High priority finding")
349
- ```
350
-
351
- ### TypeScript (assistant-stream)
352
-
353
- ```typescript
354
- import { createAssistantStream } from "assistant-stream";
355
-
356
- const stream = createAssistantStream(async (controller) => {
357
- // Add parts with parentId
358
- const researchController = controller.withParentId("research-123");
359
-
360
- await researchController.addToolCallPart({
361
- toolName: "search",
362
- args: { query: "climate data" },
363
- });
364
-
365
- // Add parts with custom metadata
366
- controller.appendPart({
367
- type: "text",
368
- text: "High priority finding",
369
- priority: "high",
370
- category: "findings",
371
- });
372
- });
373
- ```
374
-
375
- ## API Reference
376
-
377
- ### MessagePrimitive.GroupedParts
378
-
379
- <ParametersTable
380
- type="MessagePrimitiveGroupedPartsProps"
381
- parameters={[
382
- {
383
- name: "groupBy",
384
- type: "(part: PartState) => readonly `group-${string}`[]",
385
- description:
386
- "Maps a part to a group-key path. Return `[]` to leave the part ungrouped. Group keys must start with `group-`. Prefer `groupPartByType` for the common `part.type → path` case.",
387
- required: true,
388
- },
389
- {
390
- name: "children",
391
- type: "({ part, children }) => ReactNode",
392
- description:
393
- "Render function called for group nodes and leaf parts. Group nodes expose children; leaf parts should render their own UI or return null.",
394
- required: true,
395
- },
396
- ]}
397
- />
398
-
399
- ### groupPartByType helper
400
-
401
- `groupPartByType` builds a `groupBy` from a `part.type → group-key path` map. Part types missing from the map are left ungrouped. The returned function carries an internal memo fingerprint so the tree survives unrelated re-renders.
402
-
403
- ```typescript
404
- import { groupPartByType } from "@assistant-ui/react";
405
-
406
- groupPartByType({
407
- reasoning: ["group-thought", "group-reasoning"],
408
- "tool-call": ["group-thought", "group-tool"],
409
- });
410
- ```
411
-
412
- ### GroupPart Type
413
-
414
- ```typescript
415
- type GroupPart<TKey extends `group-${string}` = `group-${string}`> = {
416
- readonly type: TKey;
417
- readonly status: MessagePartStatus | ToolCallMessagePartStatus;
418
- readonly indices: readonly number[];
419
- };
420
- ```
421
-
422
- ## Best Practices
423
-
424
- 1. **Keep grouping local**: `GroupedParts` groups adjacent runs. If the same key appears again later, it becomes a new group in that position.
425
- 2. **Handle ungrouped parts**: Always include leaf cases for the part types your message can render.
426
- 3. **Only render `children` for groups**: Leaf parts receive a sentinel `children` value that throws if rendered accidentally.
427
- 4. **Use `group-` prefixes**: Synthetic group keys must start with `group-` so they cannot collide with real part types.
428
-
429
- ## Common Patterns
430
-
431
- ### Nested Grouping
432
-
433
- Create hierarchical adjacent groups by returning multiple keys:
434
-
435
- ```tsx
436
- <MessagePrimitive.GroupedParts
437
- groupBy={(part) => {
438
- if (part.type === "reasoning")
439
- return ["group-chainOfThought", "group-reasoning"];
440
- if (part.type === "tool-call")
441
- return ["group-chainOfThought", `group-tool-${part.toolName}`];
442
- return [];
443
- }}
444
- >
445
- {({ part, children }) => {
446
- if (part.type === "group-chainOfThought") return <div>{children}</div>;
447
- if (part.type === "group-reasoning") return <ReasoningRoot>{children}</ReasoningRoot>;
448
- if (part.type.startsWith("group-tool-")) return <div>{children}</div>;
449
- if (part.type === "reasoning") return <Reasoning {...part} />;
450
- if (part.type === "tool-call") return part.toolUI ?? <ToolFallback {...part} />;
451
- if (part.type === "text") return <MarkdownText />;
452
- return null;
453
- }}
454
- </MessagePrimitive.GroupedParts>
455
- ```
456
-
457
- ### Dynamic Group Rendering
458
-
459
- Adjust group appearance based on the group node's status or indices:
460
-
461
- ```tsx
462
- <MessagePrimitive.GroupedParts
463
- groupBy={groupPartByType({
464
- "tool-call": ["group-tools"],
465
- })}
466
- >
467
- {({ part, children }) => {
468
- if (part.type === "group-tools") {
469
- const isRunning = part.status.type === "running";
470
-
471
- return (
472
- <div
473
- className={`my-2 rounded-lg border p-4 ${
474
- isRunning ? "animate-pulse border-blue-500" : ""
475
- }`}
476
- >
477
- <div className="mb-2 text-sm text-muted-foreground">
478
- {part.indices.length} tool calls
479
- </div>
480
- {children}
481
- </div>
482
- );
483
- }
484
-
485
- if (part.type === "tool-call") return part.toolUI ?? <ToolFallback {...part} />;
486
- if (part.type === "text") return <MarkdownText />;
487
- return null;
488
- }}
489
- </MessagePrimitive.GroupedParts>
490
- ```
491
-
492
- ## Non-adjacent grouping (Unstable)
493
-
494
- Use `MessagePrimitive.Unstable_PartsGrouped` only when you need to collect non-adjacent parts into the same rendered group, such as gathering every part with the same parent ID even when other parts appear between them. This API is unstable and should not be used for normal consecutive reasoning or tool-call grouping.
495
-
496
- ```tsx
497
- <MessagePrimitive.Unstable_PartsGrouped
498
- groupingFunction={(parts) => {
499
- const groups = new Map<string, number[]>();
500
-
501
- parts.forEach((part, index) => {
502
- const key = part.parentId ?? `__ungrouped_${index}`;
503
- const indices = groups.get(key) ?? [];
504
- indices.push(index);
505
- groups.set(key, indices);
506
- });
507
-
508
- return Array.from(groups.entries()).map(([key, indices]) => ({
509
- groupKey: key.startsWith("__ungrouped_") ? undefined : key,
510
- indices,
511
- }));
512
- }}
513
- components={{
514
- Text: MarkdownText,
515
- tools: { Fallback: ToolFallback },
516
- Group: ({ groupKey, children }) => {
517
- if (!groupKey) return <>{children}</>;
518
- return <div className="rounded-lg border p-3">{children}</div>;
519
- },
520
- }}
521
- />
522
- ```
523
-
524
- <ParametersTable
525
- type="MessagePrimitiveUnstable_PartsGroupedProps"
526
- parameters={[
527
- {
528
- name: "groupingFunction",
529
- type: "(parts: readonly PartState[]) => MessagePartGroup[]",
530
- description:
531
- "Function that takes all message parts and returns non-adjacent group descriptors.",
532
- required: true,
533
- },
534
- {
535
- name: "components",
536
- type: "object",
537
- description:
538
- "Legacy component map used to render message part types and group wrappers.",
539
- children: [
540
- {
541
- type: "Components",
542
- parameters: [
543
- {
544
- name: "Empty",
545
- type: "EmptyMessagePartComponent",
546
- description: "Component for rendering empty messages",
547
- },
548
- {
549
- name: "Text",
550
- type: "TextMessagePartComponent",
551
- description: "Component for rendering text content",
552
- },
553
- {
554
- name: "Reasoning",
555
- type: "ReasoningMessagePartComponent",
556
- description:
557
- "Component for rendering reasoning content (typically hidden)",
558
- },
559
- {
560
- name: "Source",
561
- type: "SourceMessagePartComponent",
562
- description: "Component for rendering source content",
563
- },
564
- {
565
- name: "Image",
566
- type: "ImageMessagePartComponent",
567
- description: "Component for rendering image content",
568
- },
569
- {
570
- name: "File",
571
- type: "FileMessagePartComponent",
572
- description: "Component for rendering file content",
573
- },
574
- {
575
- name: "Unstable_Audio",
576
- type: "Unstable_AudioMessagePartComponent",
577
- description:
578
- "Component for rendering audio content (deprecated, render audio/* from File)",
579
- },
580
- {
581
- name: "tools",
582
- type: "object | { Override: ComponentType }",
583
- description:
584
- "Configuration for tool call rendering. Can be an object with by_name map and Fallback component, or an Override component.",
585
- },
586
- {
587
- name: "Group",
588
- type: "ComponentType<PropsWithChildren<{ groupKey: string | undefined; indices: number[] }>>",
589
- description:
590
- "Component for rendering grouped message parts. Receives groupKey, indices array, and children to render.",
591
- },
592
- ],
593
- },
594
- ],
595
- },
596
- ]}
597
- />
598
-
599
- ### MessagePartGroup Type
600
-
601
- ```typescript
602
- type MessagePartGroup = {
603
- groupKey: string | undefined; // The group identifier (undefined for ungrouped parts)
604
- indices: number[]; // Array of part indices belonging to this group
605
- };
606
- ```
607
-
608
- ### Group Component Props
609
-
610
- The `Group` component receives:
611
-
612
- - `groupKey`: The group identifier (or `undefined` for ungrouped parts)
613
- - `indices`: Array of indices for the parts in this group
614
- - `children`: The rendered message part components