@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,957 +0,0 @@
1
- ---
2
- title: ExternalStoreRuntime
3
- description: Bring your own redux, zustand, or state manager.
4
- ---
5
-
6
- `ExternalStoreRuntime` bridges your existing state management with assistant-ui. You provide messages and callbacks; the runtime renders whatever you give it. UI features turn on based on which callbacks are present.
7
-
8
- ## When to use it
9
-
10
- Pick `ExternalStoreRuntime` when:
11
-
12
- - You already keep messages in redux, zustand, tanstack-query, or another store, and want to keep them there.
13
- - You want full control over message state, persistence, and synchronization.
14
- - You have a custom message format and need automatic conversion to assistant-ui's format.
15
-
16
- If you do not have an existing store, use [`LocalRuntime`](/docs/runtimes/custom/local-runtime) instead; it is lower-friction.
17
-
18
- ## Architecture
19
-
20
- <Flow.Root
21
- llm={`graph TD
22
- A[Your state] -->|messages| B[ExternalStoreAdapter]
23
- B --> C[ExternalStoreRuntime]
24
- C --> D[assistant-ui components]
25
- D -->|user actions| B
26
- B -->|state updates| A`}
27
- >
28
- <Flow.Canvas
29
- className="pr-44"
30
- edges={[
31
- {
32
- from: "components",
33
- to: "adapter",
34
- route: "loop-right",
35
- label: "user actions",
36
- laneOffset: 40,
37
- },
38
- {
39
- from: "adapter",
40
- to: "state",
41
- route: "loop-right",
42
- label: "state updates",
43
- laneOffset: 88,
44
- },
45
- ]}
46
- >
47
- <Flow.Column>
48
- <Flow.Node flowId="state">Your state</Flow.Node>
49
- <Flow.Arrow direction="down" label="messages" length={36} />
50
- <Flow.Node flowId="adapter">ExternalStoreAdapter</Flow.Node>
51
- <Flow.Arrow direction="down" length={36} />
52
- <Flow.Node>ExternalStoreRuntime</Flow.Node>
53
- <Flow.Arrow direction="down" length={36} />
54
- <Flow.Node flowId="components">assistant-ui components</Flow.Node>
55
- </Flow.Column>
56
- </Flow.Canvas>
57
- </Flow.Root>
58
-
59
- Key idea: you own the state, the adapter translates between your format and assistant-ui's. UI features are capability-based; if you provide `setMessages`, branching turns on; if you provide `onEdit`, editing turns on; etc.
60
-
61
- ## Quickstart
62
-
63
- <Steps>
64
- <Step>
65
-
66
- ### Install
67
-
68
- <InstallCommand npm={["@assistant-ui/react"]} />
69
-
70
- </Step>
71
- <Step>
72
-
73
- ### Create the runtime provider
74
-
75
- ```tsx title="app/MyRuntimeProvider.tsx"
76
- "use client";
77
-
78
- import { useState, ReactNode } from "react";
79
- import {
80
- useExternalStoreRuntime,
81
- ThreadMessageLike,
82
- AppendMessage,
83
- AssistantRuntimeProvider,
84
- } from "@assistant-ui/react";
85
-
86
- type MyMessage = { role: "user" | "assistant"; content: string };
87
-
88
- const convertMessage = (message: MyMessage): ThreadMessageLike => ({
89
- role: message.role,
90
- content: [{ type: "text", text: message.content }],
91
- });
92
-
93
- const backendApi = async (input: string): Promise<MyMessage> => {
94
- return { role: "assistant", content: "Hello, world!" };
95
- };
96
-
97
- export function MyRuntimeProvider({
98
- children,
99
- }: Readonly<{ children: ReactNode }>) {
100
- const [isRunning, setIsRunning] = useState(false);
101
- const [messages, setMessages] = useState<MyMessage[]>([]);
102
-
103
- const onNew = async (message: AppendMessage) => {
104
- if (message.content[0]?.type !== "text") {
105
- throw new Error("Only text messages are supported");
106
- }
107
- const input = message.content[0].text;
108
- setMessages((prev) => [...prev, { role: "user", content: input }]);
109
-
110
- setIsRunning(true);
111
- const assistant = await backendApi(input);
112
- setMessages((prev) => [...prev, assistant]);
113
- setIsRunning(false);
114
- };
115
-
116
- const runtime = useExternalStoreRuntime({
117
- isRunning,
118
- messages,
119
- convertMessage,
120
- onNew,
121
- });
122
-
123
- return (
124
- <AssistantRuntimeProvider runtime={runtime}>
125
- {children}
126
- </AssistantRuntimeProvider>
127
- );
128
- }
129
- ```
130
-
131
- </Step>
132
- <Step>
133
-
134
- ### Use in your app
135
-
136
- ```tsx title="app/page.tsx"
137
- import { Thread } from "@/components/assistant-ui/thread";
138
- import { MyRuntimeProvider } from "./MyRuntimeProvider";
139
-
140
- export default function Page() {
141
- return (
142
- <MyRuntimeProvider>
143
- <Thread />
144
- </MyRuntimeProvider>
145
- );
146
- }
147
- ```
148
-
149
- </Step>
150
- </Steps>
151
-
152
- ## Message conversion
153
-
154
- Two approaches.
155
-
156
- ### Inline `convertMessage`
157
-
158
- ```tsx
159
- const convertMessage = (message: MyMessage): ThreadMessageLike => ({
160
- role: message.role,
161
- content: [{ type: "text", text: message.text }],
162
- id: message.id,
163
- createdAt: new Date(message.timestamp),
164
- });
165
-
166
- const runtime = useExternalStoreRuntime({
167
- messages: myMessages,
168
- convertMessage,
169
- onNew,
170
- });
171
- ```
172
-
173
- ### `useExternalMessageConverter` (with join strategy)
174
-
175
- For performance optimization or when you need to merge adjacent assistant messages:
176
-
177
- ```tsx
178
- import { useExternalMessageConverter } from "@assistant-ui/react";
179
-
180
- const convertedMessages = useExternalMessageConverter({
181
- callback: (message: MyMessage): ThreadMessageLike => ({
182
- role: message.role,
183
- content: [{ type: "text", text: message.text }],
184
- id: message.id,
185
- }),
186
- messages,
187
- isRunning: false,
188
- joinStrategy: "concat-content", // merges adjacent assistant messages
189
- });
190
-
191
- const runtime = useExternalStoreRuntime({
192
- messages: convertedMessages,
193
- onNew,
194
- });
195
- ```
196
-
197
- `joinStrategy` controls how adjacent assistant messages combine: `concat-content` (default) merges them into one; `none` keeps them separate.
198
-
199
- ## Handler matrix
200
-
201
- Each handler enables a specific UI feature.
202
-
203
- | Handler | Enables |
204
- | --- | --- |
205
- | `onNew` | Sending new user messages (required) |
206
- | `setMessages` | Branch switching |
207
- | `onEdit` | Message edit button |
208
- | `onReload` | Regenerate button |
209
- | `onCancel` | Cancel button while generating |
210
- | `onRefetchThread` | `threads.reloadMainThread()` refetching the open thread in place |
211
- | `onAddToolResult` | Client-side tool result handoff |
212
- | `queue` | Queueing messages sent while a run is in progress |
213
-
214
- ## Streaming responses
215
-
216
- Stream by mutating the assistant message in place:
217
-
218
- ```tsx
219
- const onNew = async (message: AppendMessage) => {
220
- const userMsg: ThreadMessageLike = {
221
- role: "user",
222
- content: message.content,
223
- id: generateId(),
224
- };
225
- setMessages((prev) => [...prev, userMsg]);
226
-
227
- setIsRunning(true);
228
- const assistantId = generateId();
229
- setMessages((prev) => [
230
- ...prev,
231
- { role: "assistant", content: [{ type: "text", text: "" }], id: assistantId },
232
- ]);
233
-
234
- const stream = await api.streamChat(message);
235
- for await (const chunk of stream) {
236
- setMessages((prev) =>
237
- prev.map((m) =>
238
- m.id === assistantId
239
- ? {
240
- ...m,
241
- content: [
242
- { type: "text", text: (m.content[0] as any).text + chunk },
243
- ],
244
- }
245
- : m,
246
- ),
247
- );
248
- }
249
- setIsRunning(false);
250
- };
251
- ```
252
-
253
- ## Message editing
254
-
255
- ```tsx
256
- const onEdit = async (message: AppendMessage) => {
257
- const index = messages.findIndex((m) => m.id === message.parentId) + 1;
258
- const newMessages = [...messages.slice(0, index)];
259
- newMessages.push({
260
- role: "user",
261
- content: message.content,
262
- id: message.id ?? generateId(),
263
- });
264
- setMessages(newMessages);
265
-
266
- setIsRunning(true);
267
- const response = await api.chat(message);
268
- newMessages.push({ role: "assistant", content: response.content, id: generateId() });
269
- setMessages(newMessages);
270
- setIsRunning(false);
271
- };
272
- ```
273
-
274
- ## Branching
275
-
276
- The linear `messages` array assumes each message's parent is the previous one. For branching (e.g. multiple regenerations), use `ExportedMessageRepository.fromBranchableArray()` and import via `thread.import()`:
277
-
278
- ```tsx
279
- import {
280
- ExportedMessageRepository,
281
- useExternalStoreRuntime,
282
- } from "@assistant-ui/react";
283
-
284
- const backendMessages = [
285
- { id: "user-1", role: "user", content: "Hello", parentId: null },
286
- { id: "asst-1", role: "assistant", content: "Hi!", parentId: "user-1" },
287
- { id: "asst-2", role: "assistant", content: "Hey!", parentId: "user-1" }, // branch
288
- ];
289
-
290
- const repo = ExportedMessageRepository.fromBranchableArray(
291
- backendMessages.map((m) => ({
292
- message: { id: m.id, role: m.role, content: m.content },
293
- parentId: m.parentId,
294
- })),
295
- { headId: "asst-1" },
296
- );
297
-
298
- runtime.thread.import(repo);
299
- ```
300
-
301
- Each message must have an explicit `id` and `parentId`; messages with the same `parentId` create branches. Parents must appear before children in the array.
302
-
303
- ### Exporting a snapshot
304
-
305
- `thread.import()` has a counterpart, `thread.export()`, which captures the current thread (including its full branch tree) as a serializable `ExportedMessageRepository`. Use it to persist a conversation and re-import it later:
306
-
307
- ```tsx
308
- // capture the current thread as a serializable snapshot
309
- const repo = runtime.thread.export();
310
- await saveToBackend(JSON.stringify(repo));
311
-
312
- // later, restore it into a runtime
313
- runtime.thread.import(repo);
314
- ```
315
-
316
- The exported shape round-trips through `thread.import()` directly, so the same value is both your persistence format and what you load back.
317
-
318
- ### Persisting branch selection
319
-
320
- If you store the full branch tree outside assistant-ui, persist the selected branch head too and pass it back as `messageRepository.headId`. `setMessages` still performs the branch switch; `unstable_onBranchChange` is an additional signal that fires after an explicit `switchToBranch` action, such as a BranchPicker click.
321
-
322
- ```tsx
323
- const runtime = useExternalStoreRuntime({
324
- messageRepository: {
325
- messages: storedMessages,
326
- headId: selectedHeadId,
327
- },
328
- setMessages: (messages) => {
329
- setVisibleMessages(messages);
330
- },
331
- unstable_onBranchChange: ({ headId, visibleMessageIds }) => {
332
- saveSelectedBranch({
333
- headId,
334
- visibleMessageIds,
335
- });
336
- },
337
- onNew,
338
- });
339
- ```
340
-
341
- `headId` is the canonical persisted head of the visible branch. Optimistic or transient message ids are not surfaced there. `visibleMessageIds` is the currently visible path in order, which can include an optimistic leaf while `headId` points to its persisted ancestor.
342
-
343
- The callback only fires for explicit branch switches, and consecutive switches that resolve to the same canonical head are de-duped. It does not fire on adapter resync, `messageRepository` reset, append, edit/regenerate, content-only updates, or while the thread is running.
344
-
345
- <Callout type="warn">
346
- `unstable_onBranchChange` is under active development and may change without
347
- notice. It complements `setMessages`; it does not enable branch switching by
348
- itself.
349
- </Callout>
350
-
351
- ## Tool calling
352
-
353
- Handle tool results by updating the matching tool-call entry:
354
-
355
- ```tsx
356
- const onAddToolResult = (options: AddToolResultOptions) => {
357
- setMessages((prev) =>
358
- prev.map((message) =>
359
- message.id === options.messageId
360
- ? {
361
- ...message,
362
- content: message.content.map((part) =>
363
- part.type === "tool-call" &&
364
- part.toolCallId === options.toolCallId
365
- ? { ...part, result: options.result }
366
- : part,
367
- ),
368
- }
369
- : message,
370
- ),
371
- );
372
- };
373
-
374
- const runtime = useExternalStoreRuntime({
375
- messages,
376
- onNew,
377
- onAddToolResult,
378
- });
379
- ```
380
-
381
- The runtime automatically matches tool results to their tool calls by `toolCallId` and groups related messages for display.
382
-
383
- ## Attachments
384
-
385
- Attachments use the standard adapter contract, see [adapters](/docs/runtimes/concepts/adapters#attachment-adapter):
386
-
387
- ```tsx
388
- const runtime = useExternalStoreRuntime({
389
- messages,
390
- onNew,
391
- adapters: { attachments: myAttachmentAdapter },
392
- });
393
- ```
394
-
395
- ## Queueing messages during a run
396
-
397
- By default, sending while the thread is running is disabled. Provide a `queue` adapter to buffer a message sent during a run and process it once the run settles. The pending message is exposed on `composer.queue` and renders through [`ComposerPrimitive.Queue`](/docs/api-reference/primitives/composer).
398
-
399
- The `createMessageQueue` helper owns the two-lane ordering and the in-flight guard: `steerItems` drain before `items`, and within each lane items drain in order. Supply a driver that runs a message, pass its `adapter` to the runtime, and tell the queue when a run starts (`notifyBusy()`, so concurrent sends buffer) and ends (`notifyIdle()`).
400
-
401
- A hand-rolled adapter must implement the same contract: `items` and `steerItems` expose the lanes (each item carries a required `parts` projection of its content), `enqueue`/`steer` add to a lane, and `move(queueItemId, placement)` repositions with fail-fast anchors — unknown ids or anchors throw rather than being coerced. Individual items are addressable through `composer.queueItem({ id })` (or by index).
402
-
403
- ```tsx
404
- import { useEffect, useRef, useState } from "react";
405
- import { createMessageQueue, useExternalStoreRuntime } from "@assistant-ui/react";
406
-
407
- const [queue] = useState(() => createMessageQueue({ run: onNew }));
408
-
409
- const runtime = useExternalStoreRuntime({
410
- messages,
411
- isRunning,
412
- onNew,
413
- queue: queue.adapter,
414
- });
415
-
416
- const wasRunning = useRef(isRunning);
417
- useEffect(() => {
418
- if (!wasRunning.current && isRunning) queue.notifyBusy();
419
- if (wasRunning.current && !isRunning) queue.notifyIdle();
420
- wasRunning.current = isRunning;
421
- }, [isRunning, queue]);
422
- ```
423
-
424
- With a `createMessageQueue` adapter, cancelling pauses the queue for you: the runtime tells the queue before your `onCancel` runs, so the cancelled run's settle keeps the pending items instead of dispatching the next one, and the next send resumes draining. Call `queue.clear()` in `onCancel` instead if you want a cancel to drop them. A hand-rolled adapter has no such channel, so it owns its cancel policy the same way it owns the rest. Edit and reload stay host-owned: call `queue.clear()` in your `onEdit` and `onReload` handlers so stale items do not drain onto the new branch.
425
-
426
- ```tsx
427
- const runtime = useExternalStoreRuntime({
428
- // ...
429
- onCancel: async () => {
430
- // the runtime already paused the queue; clear() here to drop the items
431
- await cancelRun();
432
- },
433
- onEdit: async (message) => {
434
- queue.clear();
435
- // ...
436
- },
437
- onReload: async (parentId) => {
438
- queue.clear();
439
- // ...
440
- },
441
- });
442
- ```
443
-
444
- ## Multi-thread
445
-
446
- `ExternalStoreRuntime` uses `ExternalStoreThreadListAdapter` (synchronous, inline). See [threads](/docs/runtimes/concepts/threads#externalstorethreadlistadapter) for the contract and best practices on keeping `currentThreadId` in sync with your store.
447
-
448
- ## Integration examples
449
-
450
- <Callout type="info">
451
- **Real-world example:** the [Claude Managed Agents guide](/docs/runtimes/claude-managed-agents) maps Anthropic-hosted agent sessions onto this runtime, with Anthropic's official [quickstart](https://github.com/anthropics/claude-quickstarts/tree/main/managed-agents/assistant-ui) as the runnable reference.
452
- </Callout>
453
-
454
- ### Redux
455
-
456
- ```tsx title="app/chatSlice.ts"
457
- import { createSlice, PayloadAction } from "@reduxjs/toolkit";
458
- import { ThreadMessageLike } from "@assistant-ui/react";
459
-
460
- const chatSlice = createSlice({
461
- name: "chat",
462
- initialState: { messages: [] as ThreadMessageLike[], isRunning: false },
463
- reducers: {
464
- setMessages: (state, action: PayloadAction<ThreadMessageLike[]>) => {
465
- state.messages = action.payload;
466
- },
467
- addMessage: (state, action: PayloadAction<ThreadMessageLike>) => {
468
- state.messages.push(action.payload);
469
- },
470
- setIsRunning: (state, action: PayloadAction<boolean>) => {
471
- state.isRunning = action.payload;
472
- },
473
- },
474
- });
475
-
476
- export const { setMessages, addMessage, setIsRunning } = chatSlice.actions;
477
- ```
478
-
479
- ```tsx title="app/ReduxRuntimeProvider.tsx"
480
- import { useSelector, useDispatch } from "react-redux";
481
- import { useExternalStoreRuntime, AssistantRuntimeProvider } from "@assistant-ui/react";
482
-
483
- export function ReduxRuntimeProvider({ children }) {
484
- const messages = useSelector((s: RootState) => s.chat.messages);
485
- const isRunning = useSelector((s: RootState) => s.chat.isRunning);
486
- const dispatch = useDispatch();
487
-
488
- const runtime = useExternalStoreRuntime({
489
- messages,
490
- isRunning,
491
- setMessages: (messages) => dispatch(setMessages(messages)),
492
- onNew: async (message) => {
493
- dispatch(
494
- addMessage({
495
- role: "user",
496
- content: message.content,
497
- id: `msg-${Date.now()}`,
498
- createdAt: new Date(),
499
- }),
500
- );
501
- dispatch(setIsRunning(true));
502
- const response = await api.chat(message);
503
- dispatch(
504
- addMessage({
505
- role: "assistant",
506
- content: response.content,
507
- id: `msg-${Date.now()}`,
508
- createdAt: new Date(),
509
- }),
510
- );
511
- dispatch(setIsRunning(false));
512
- },
513
- });
514
-
515
- return (
516
- <AssistantRuntimeProvider runtime={runtime}>
517
- {children}
518
- </AssistantRuntimeProvider>
519
- );
520
- }
521
- ```
522
-
523
- ### Zustand
524
-
525
- ```tsx title="app/chatStore.ts"
526
- import { create } from "zustand";
527
- import { immer } from "zustand/middleware/immer";
528
- import { ThreadMessageLike } from "@assistant-ui/react";
529
-
530
- interface ChatState {
531
- messages: ThreadMessageLike[];
532
- isRunning: boolean;
533
- addMessage: (message: ThreadMessageLike) => void;
534
- setMessages: (messages: ThreadMessageLike[]) => void;
535
- setIsRunning: (isRunning: boolean) => void;
536
- }
537
-
538
- export const useChatStore = create<ChatState>()(
539
- immer((set) => ({
540
- messages: [],
541
- isRunning: false,
542
- addMessage: (message) => set((s) => { s.messages.push(message); }),
543
- setMessages: (messages) => set((s) => { s.messages = messages; }),
544
- setIsRunning: (isRunning) => set((s) => { s.isRunning = isRunning; }),
545
- })),
546
- );
547
- ```
548
-
549
- ```tsx title="app/ZustandRuntimeProvider.tsx"
550
- import { useShallow } from "zustand/shallow";
551
- import { useExternalStoreRuntime, AssistantRuntimeProvider } from "@assistant-ui/react";
552
-
553
- export function ZustandRuntimeProvider({ children }) {
554
- const { messages, isRunning, addMessage, setMessages, setIsRunning } =
555
- useChatStore(
556
- useShallow((s) => ({
557
- messages: s.messages,
558
- isRunning: s.isRunning,
559
- addMessage: s.addMessage,
560
- setMessages: s.setMessages,
561
- setIsRunning: s.setIsRunning,
562
- })),
563
- );
564
-
565
- const runtime = useExternalStoreRuntime({
566
- messages,
567
- isRunning,
568
- setMessages,
569
- onNew: async (message) => {
570
- addMessage({
571
- role: "user",
572
- content: message.content,
573
- id: `msg-${Date.now()}`,
574
- createdAt: new Date(),
575
- });
576
- setIsRunning(true);
577
- const response = await api.chat(message);
578
- addMessage({
579
- role: "assistant",
580
- content: response.content,
581
- id: `msg-${Date.now()}-a`,
582
- createdAt: new Date(),
583
- });
584
- setIsRunning(false);
585
- },
586
- });
587
-
588
- return (
589
- <AssistantRuntimeProvider runtime={runtime}>
590
- {children}
591
- </AssistantRuntimeProvider>
592
- );
593
- }
594
- ```
595
-
596
- ### TanStack Query
597
-
598
- ```tsx
599
- import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
600
- import { useExternalStoreRuntime } from "@assistant-ui/react";
601
-
602
- const messageKeys = {
603
- all: ["messages"] as const,
604
- thread: (threadId: string) => [...messageKeys.all, threadId] as const,
605
- };
606
-
607
- export function TanStackQueryRuntimeProvider({ children }) {
608
- const queryClient = useQueryClient();
609
- const threadId = "main";
610
-
611
- const { data: messages = [] } = useQuery({
612
- queryKey: messageKeys.thread(threadId),
613
- queryFn: () => fetchMessages(threadId),
614
- });
615
-
616
- const sendMessage = useMutation({
617
- mutationFn: api.chat,
618
- onMutate: async (message: AppendMessage) => {
619
- await queryClient.cancelQueries({
620
- queryKey: messageKeys.thread(threadId),
621
- });
622
- const previous = queryClient.getQueryData<ThreadMessageLike[]>(
623
- messageKeys.thread(threadId),
624
- );
625
- queryClient.setQueryData<ThreadMessageLike[]>(
626
- messageKeys.thread(threadId),
627
- (old = []) => [
628
- ...old,
629
- {
630
- role: "user",
631
- content: message.content,
632
- id: `temp-${Date.now()}`,
633
- createdAt: new Date(),
634
- },
635
- ],
636
- );
637
- return { previous };
638
- },
639
- onError: (_err, _msg, context) => {
640
- if (context?.previous) {
641
- queryClient.setQueryData(messageKeys.thread(threadId), context.previous);
642
- }
643
- },
644
- onSettled: () =>
645
- queryClient.invalidateQueries({ queryKey: messageKeys.thread(threadId) }),
646
- });
647
-
648
- const runtime = useExternalStoreRuntime({
649
- messages,
650
- isRunning: sendMessage.isPending,
651
- onNew: async (message) => {
652
- await sendMessage.mutateAsync(message);
653
- },
654
- setMessages: (newMessages) => {
655
- queryClient.setQueryData(messageKeys.thread(threadId), newMessages);
656
- },
657
- });
658
-
659
- return (
660
- <AssistantRuntimeProvider runtime={runtime}>
661
- {children}
662
- </AssistantRuntimeProvider>
663
- );
664
- }
665
- ```
666
-
667
- ## Working with external messages
668
-
669
- ### `getExternalStoreMessages`
670
-
671
- Retrieve your original message format from any assistant-ui state:
672
-
673
- ```tsx
674
- import { getExternalStoreMessages, useAuiState } from "@assistant-ui/react";
675
-
676
- function MyComponent() {
677
- const originalMessages = useAuiState((s) => getExternalStoreMessages(s.message));
678
- // originalMessages is MyMessage[] (your original type)
679
- }
680
- ```
681
-
682
- <Callout type="warn">
683
- `getExternalStoreMessages` may return multiple messages for a single UI message; assistant-ui merges adjacent assistant and tool messages for display.
684
- </Callout>
685
-
686
- ### `bindExternalStoreMessage`
687
-
688
- Attach your original message to a `ThreadMessage` you constructed manually (outside the built-in converter):
689
-
690
- ```tsx
691
- import {
692
- bindExternalStoreMessage,
693
- getExternalStoreMessages,
694
- } from "@assistant-ui/react";
695
-
696
- bindExternalStoreMessage(threadMessage, originalMessage);
697
- const original = getExternalStoreMessages(threadMessage);
698
- ```
699
-
700
- `bindExternalStoreMessage` is a no-op if the target already has a bound message. It mutates the target in place.
701
-
702
- <Callout type="warn">
703
- This API is experimental and may change without notice.
704
- </Callout>
705
-
706
- ## Best practices
707
-
708
- 1. **Immutable updates.** Always create new arrays:
709
- ```tsx
710
- setMessages([...messages, newMessage]); // not messages.push(newMessage)
711
- ```
712
- 2. **Stable handler references.** Memoize `onNew`, `onEdit`, etc. with `useCallback` to avoid recreating the runtime.
713
- 3. **Use `useShallow`** with zustand to prevent unnecessary re-renders.
714
-
715
- ## Common pitfalls
716
-
717
- **Edit / regenerate / cancel buttons missing.** Each requires its handler:
718
-
719
- ```tsx
720
- useExternalStoreRuntime({
721
- messages,
722
- onNew, // required
723
- setMessages, // branch switching
724
- onEdit, // edit
725
- onReload, // regenerate
726
- onCancel, // cancel
727
- });
728
- ```
729
-
730
- **State not updating.** check for: array mutation instead of new arrays, missing `setMessages`, broken async handling, or invalid `convertMessage` output.
731
-
732
- **Messages going to the wrong thread.** the runtime's `currentThreadId` and your store's selected thread must stay in sync. Centralize thread id in a context, never in component-local state. See [threads](/docs/runtimes/concepts/threads#externalstorethreadlistadapter).
733
-
734
- ## API reference
735
-
736
- ### `ExternalStoreAdapter`
737
-
738
- <ParametersTable
739
- type="ExternalStoreAdapter<T>"
740
- parameters={[
741
- {
742
- name: "messages",
743
- type: "readonly T[]",
744
- description: "Array of messages from your state.",
745
- required: true,
746
- },
747
- {
748
- name: "onNew",
749
- type: "(message: AppendMessage) => Promise<void>",
750
- description: "Handler for new messages from the user.",
751
- required: true,
752
- },
753
- {
754
- name: "isRunning",
755
- type: "boolean",
756
- description:
757
- "Whether the assistant is currently generating a response. When true, shows an optimistic assistant message and flows directly to thread.isRunning.",
758
- default: "false",
759
- },
760
- {
761
- name: "isDisabled",
762
- type: "boolean",
763
- description:
764
- "Disables the entire composer, including the text input. For a narrower gate that keeps the input usable but blocks only sending, use isSendDisabled.",
765
- default: "false",
766
- },
767
- {
768
- name: "isSendDisabled",
769
- type: "boolean",
770
- description:
771
- "Blocks new-message sending while leaving the input usable. When true, the thread composer's canSend becomes false, the Send button is disabled, Enter and the steer hotkey are no-ops, and aui.composer.send() short-circuits. Edit composers (saving message edits) ignore this flag. Use this to gate sending on external React state (e.g. while tools or auth are still loading).",
772
- default: "false",
773
- },
774
- {
775
- name: "isLoading",
776
- type: "boolean",
777
- description:
778
- "Whether the adapter is in a loading state. Displays a loading indicator instead of the composer.",
779
- },
780
- {
781
- name: "suggestions",
782
- type: "readonly ThreadSuggestion[]",
783
- description: "Suggested prompts to display.",
784
- },
785
- {
786
- name: "extras",
787
- type: "unknown",
788
- description: "Additional data accessible via runtime.extras.",
789
- },
790
- {
791
- name: "setMessages",
792
- type: "(messages: readonly T[]) => void",
793
- description: "Update messages (required for branch switching).",
794
- },
795
- {
796
- name: "unstable_onBranchChange",
797
- type: "(event: ExternalStoreBranchChange) => void",
798
- description:
799
- "Called after an explicit branch switch with the canonical persisted head id and visible message path. Complements setMessages and is unstable.",
800
- },
801
- {
802
- name: "onEdit",
803
- type: "(message: AppendMessage) => Promise<void>",
804
- description: "Handler for message edits (required for edit feature).",
805
- },
806
- {
807
- name: "onReload",
808
- type: "(parentId: string | Null, config: StartRunConfig) => Promise<void>",
809
- description:
810
- "Handler for regenerating messages (required for reload feature).",
811
- },
812
- {
813
- name: "onCancel",
814
- type: "() => Promise<void>",
815
- description: "Handler for cancelling the current generation.",
816
- },
817
- {
818
- name: "onRefetchThread",
819
- type: "() => Promise<void>",
820
- description:
821
- "Handler for re-fetching this thread's state in place, driving threads.reloadMainThread(). Unrelated to onReload, which re-generates an assistant message.",
822
- },
823
- {
824
- name: "onAddToolResult",
825
- type: "(options: AddToolResultOptions) => Promise<void> | Void",
826
- description: "Handler for adding tool call results.",
827
- },
828
- {
829
- name: "onResume",
830
- type: "(config: ResumeRunConfig) => Promise<void>",
831
- description:
832
- "Handler for resuming an interrupted run (e.g. after a page reload mid-generation). For AI SDK reload-safe streaming, see the [Resumable Streams](/docs/guides/resumable-streams) guide.",
833
- },
834
- {
835
- name: "onResumeToolCall",
836
- type: "(options: { toolCallId: string; payload: unknown }) => void",
837
- description:
838
- "Handler for resuming a suspended tool call (used with human-in-the-loop tool execution).",
839
- },
840
- {
841
- name: "messageRepository",
842
- type: "ExportedMessageRepository",
843
- description:
844
- "Pre-built message repository with branching history. Use instead of messages when you need to restore branch state.",
845
- },
846
- {
847
- name: "state",
848
- type: "ReadonlyJSONValue",
849
- description:
850
- "Opaque serializable state passed to onLoadExternalState during thread import.",
851
- },
852
- {
853
- name: "onImport",
854
- type: "(messages: readonly ThreadMessage[]) => void",
855
- description:
856
- "Called when the runtime imports messages into the external store (e.g. on thread switch).",
857
- },
858
- {
859
- name: "onExportExternalState",
860
- type: "() => any",
861
- description:
862
- "Called to retrieve external state when the runtime exports a thread snapshot.",
863
- },
864
- {
865
- name: "onLoadExternalState",
866
- type: "(state: any) => void",
867
- description:
868
- "Called with previously exported external state when restoring a thread snapshot.",
869
- },
870
- {
871
- name: "convertMessage",
872
- type: "(message: T, index: number) => ThreadMessageLike",
873
- description:
874
- "Convert your message format to assistant-ui format. Not needed if using ThreadMessage type.",
875
- },
876
- {
877
- name: "adapters",
878
- type: "object",
879
- description:
880
- "Capability adapters: attachments, speech, dictation, feedback, threadList. See /docs/runtimes/concepts/adapters.",
881
- },
882
- {
883
- name: "unstable_capabilities",
884
- type: "object",
885
- description:
886
- "Configure runtime capabilities (e.g. copy). Unstable, may change.",
887
- },
888
- ]}
889
- />
890
-
891
- ### `ThreadMessageLike`
892
-
893
- <ParametersTable
894
- type="ThreadMessageLike"
895
- parameters={[
896
- {
897
- name: "role",
898
- type: '"assistant" | "user" | "system"',
899
- description: "The role of the message sender.",
900
- required: true,
901
- },
902
- {
903
- name: "content",
904
- type: "string | Readonly MessagePart[]",
905
- description:
906
- "Message content as string or structured message parts. Supports data-* prefixed types (e.g. { type: \"data-workflow\", data: {...} }) which are automatically converted to DataMessagePart.",
907
- required: true,
908
- },
909
- {
910
- name: "id",
911
- type: "string",
912
- description: "Unique identifier for the message.",
913
- },
914
- {
915
- name: "createdAt",
916
- type: "Date",
917
- description: "Timestamp when the message was created.",
918
- },
919
- {
920
- name: "status",
921
- type: "MessageStatus",
922
- description:
923
- 'Status of assistant messages ({ type: "running" }, { type: "complete" }, { type: "incomplete" }).',
924
- },
925
- {
926
- name: "attachments",
927
- type: "readonly CompleteAttachment[]",
928
- description:
929
- 'File attachments (user messages only). Type accepts custom strings beyond "image" | "document" | "file"; contentType is optional.',
930
- },
931
- {
932
- name: "metadata",
933
- type: "object",
934
- description: "Additional message metadata (steps, custom fields).",
935
- },
936
- ]}
937
- />
938
-
939
- ## Related
940
-
941
- <Cards>
942
- <Card
943
- title="LocalRuntime"
944
- description="Simpler core runtime when you do not have your own state store."
945
- href="/docs/runtimes/custom/local-runtime"
946
- />
947
- <Card
948
- title="Adapters"
949
- description="Attachments, speech, feedback, history, suggestions."
950
- href="/docs/runtimes/concepts/adapters"
951
- />
952
- <Card
953
- title="Threads"
954
- description="ExternalStoreThreadListAdapter for multi-thread."
955
- href="/docs/runtimes/concepts/threads"
956
- />
957
- </Cards>