@assistant-ui/mcp-docs-server 0.2.2 → 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 (459) 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 +9 -13
  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 -674
  16. package/.docs/organized/code-examples/with-ag-ui.md +0 -552
  17. package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -465
  18. package/.docs/organized/code-examples/with-artifacts.md +0 -814
  19. package/.docs/organized/code-examples/with-assistant-transport.md +0 -575
  20. package/.docs/organized/code-examples/with-browser-extension.md +0 -371
  21. package/.docs/organized/code-examples/with-chain-of-thought.md +0 -960
  22. package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
  23. package/.docs/organized/code-examples/with-cloud.md +0 -438
  24. package/.docs/organized/code-examples/with-custom-thread-list.md +0 -568
  25. package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -526
  26. package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -696
  27. package/.docs/organized/code-examples/with-eve.md +0 -404
  28. package/.docs/organized/code-examples/with-expo.md +0 -2063
  29. package/.docs/organized/code-examples/with-external-store.md +0 -420
  30. package/.docs/organized/code-examples/with-ffmpeg.md +0 -828
  31. package/.docs/organized/code-examples/with-generative-ui.md +0 -1812
  32. package/.docs/organized/code-examples/with-google-adk.md +0 -367
  33. package/.docs/organized/code-examples/with-heat-graph.md +0 -304
  34. package/.docs/organized/code-examples/with-image-generation.md +0 -462
  35. package/.docs/organized/code-examples/with-interactables.md +0 -732
  36. package/.docs/organized/code-examples/with-langchain.md +0 -445
  37. package/.docs/organized/code-examples/with-langgraph.md +0 -854
  38. package/.docs/organized/code-examples/with-livekit.md +0 -642
  39. package/.docs/organized/code-examples/with-mcp.md +0 -780
  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 -449
  43. package/.docs/organized/code-examples/with-pi.md +0 -2083
  44. package/.docs/organized/code-examples/with-react-hook-form.md +0 -724
  45. package/.docs/organized/code-examples/with-react-ink-web.md +0 -690
  46. package/.docs/organized/code-examples/with-react-ink.md +0 -472
  47. package/.docs/organized/code-examples/with-react-router.md +0 -935
  48. package/.docs/organized/code-examples/with-resumable-stream.md +0 -667
  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 -811
  53. package/.docs/organized/code-examples/with-tap-runtime.md +0 -812
  54. package/.docs/organized/code-examples/with-virtualized-thread.md +0 -680
  55. package/.docs/organized/code-examples/with-vue.md +0 -408
  56. package/.docs/raw/docs/(docs)/architecture.mdx +0 -146
  57. package/.docs/raw/docs/(docs)/base-ui.mdx +0 -39
  58. package/.docs/raw/docs/(docs)/cli.mdx +0 -542
  59. package/.docs/raw/docs/(docs)/devtools.mdx +0 -79
  60. package/.docs/raw/docs/(docs)/index.mdx +0 -21
  61. package/.docs/raw/docs/(docs)/installation.mdx +0 -483
  62. package/.docs/raw/docs/(docs)/llm.mdx +0 -211
  63. package/.docs/raw/docs/(docs)/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 -20
  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 -52
  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/cloud-ai-sdk.mdx +0 -24
  94. package/.docs/raw/docs/(reference)/api-reference/integrations/eve.mdx +0 -97
  95. package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
  96. package/.docs/raw/docs/(reference)/api-reference/integrations/react-ai-sdk.mdx +0 -200
  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 -619
  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 -149
  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 -602
  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 -400
  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 -209
  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 -236
  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/overview.mdx +0 -282
  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 -839
  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 -255
  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 -716
  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 -346
  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 -1008
  289. package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
  290. package/.docs/raw/docs/ui/accordion.mdx +0 -266
  291. package/.docs/raw/docs/ui/assistant-modal.mdx +0 -166
  292. package/.docs/raw/docs/ui/assistant-sidebar.mdx +0 -89
  293. package/.docs/raw/docs/ui/attachment.mdx +0 -259
  294. package/.docs/raw/docs/ui/badge.mdx +0 -150
  295. package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -212
  296. package/.docs/raw/docs/ui/context-display.mdx +0 -148
  297. package/.docs/raw/docs/ui/diff-viewer.mdx +0 -280
  298. package/.docs/raw/docs/ui/directive-text.mdx +0 -114
  299. package/.docs/raw/docs/ui/dot-matrix.mdx +0 -133
  300. package/.docs/raw/docs/ui/file.mdx +0 -159
  301. package/.docs/raw/docs/ui/follow-up-suggestions.mdx +0 -82
  302. package/.docs/raw/docs/ui/image.mdx +0 -102
  303. package/.docs/raw/docs/ui/markdown.mdx +0 -64
  304. package/.docs/raw/docs/ui/mcp-config.mdx +0 -107
  305. package/.docs/raw/docs/ui/mermaid.mdx +0 -92
  306. package/.docs/raw/docs/ui/message-timing.mdx +0 -93
  307. package/.docs/raw/docs/ui/model-selector.mdx +0 -455
  308. package/.docs/raw/docs/ui/number-roll.mdx +0 -154
  309. package/.docs/raw/docs/ui/part-grouping.mdx +0 -614
  310. package/.docs/raw/docs/ui/quote.mdx +0 -211
  311. package/.docs/raw/docs/ui/reasoning.mdx +0 -186
  312. package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
  313. package/.docs/raw/docs/ui/select.mdx +0 -254
  314. package/.docs/raw/docs/ui/sources.mdx +0 -177
  315. package/.docs/raw/docs/ui/streamdown.mdx +0 -392
  316. package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
  317. package/.docs/raw/docs/ui/tabs.mdx +0 -271
  318. package/.docs/raw/docs/ui/thread-list.mdx +0 -372
  319. package/.docs/raw/docs/ui/thread.mdx +0 -512
  320. package/.docs/raw/docs/ui/tool-fallback.mdx +0 -127
  321. package/.docs/raw/docs/ui/tool-group.mdx +0 -240
  322. package/.docs/raw/docs/ui/voice.mdx +0 -173
  323. package/.docs/raw/docs/utilities/heat-graph.mdx +0 -237
  324. package/.docs/raw/docs/utilities/react-o11y.mdx +0 -362
  325. package/.docs/raw/docs/utilities/tw-shimmer.mdx +0 -212
  326. package/dist/constants.d.ts +0 -14
  327. package/dist/constants.d.ts.map +0 -1
  328. package/dist/constants.js +0 -19
  329. package/dist/constants.js.map +0 -1
  330. package/dist/prepare-docs/code-examples.d.ts +0 -5
  331. package/dist/prepare-docs/code-examples.d.ts.map +0 -1
  332. package/dist/prepare-docs/code-examples.js +0 -117
  333. package/dist/prepare-docs/code-examples.js.map +0 -1
  334. package/dist/prepare-docs/copy-raw.d.ts +0 -5
  335. package/dist/prepare-docs/copy-raw.d.ts.map +0 -1
  336. package/dist/prepare-docs/copy-raw.js +0 -49
  337. package/dist/prepare-docs/copy-raw.js.map +0 -1
  338. package/dist/prepare-docs/prepare.d.ts +0 -1
  339. package/dist/prepare-docs/prepare.js +0 -22
  340. package/dist/prepare-docs/prepare.js.map +0 -1
  341. package/dist/prompts/xulux-playground.d.ts +0 -12
  342. package/dist/prompts/xulux-playground.d.ts.map +0 -1
  343. package/dist/prompts/xulux-playground.js +0 -33
  344. package/dist/prompts/xulux-playground.js.map +0 -1
  345. package/dist/tools/docs.d.ts +0 -22
  346. package/dist/tools/docs.d.ts.map +0 -1
  347. package/dist/tools/docs.js +0 -177
  348. package/dist/tools/docs.js.map +0 -1
  349. package/dist/tools/examples.d.ts +0 -24
  350. package/dist/tools/examples.d.ts.map +0 -1
  351. package/dist/tools/examples.js +0 -87
  352. package/dist/tools/examples.js.map +0 -1
  353. package/dist/tools/resources.d.ts +0 -6
  354. package/dist/tools/resources.d.ts.map +0 -1
  355. package/dist/tools/resources.js +0 -75
  356. package/dist/tools/resources.js.map +0 -1
  357. package/dist/tools/search.d.ts +0 -24
  358. package/dist/tools/search.d.ts.map +0 -1
  359. package/dist/tools/search.js +0 -39
  360. package/dist/tools/search.js.map +0 -1
  361. package/dist/tools/tests/mcp-test-client.d.ts +0 -15
  362. package/dist/tools/tests/mcp-test-client.d.ts.map +0 -1
  363. package/dist/tools/tests/mcp-test-client.js +0 -68
  364. package/dist/tools/tests/mcp-test-client.js.map +0 -1
  365. package/dist/tools/tests/test-setup.d.ts +0 -7
  366. package/dist/tools/tests/test-setup.d.ts.map +0 -1
  367. package/dist/tools/tests/test-setup.js +0 -36
  368. package/dist/tools/tests/test-setup.js.map +0 -1
  369. package/dist/tools/xulux-templates.d.ts +0 -58
  370. package/dist/tools/xulux-templates.d.ts.map +0 -1
  371. package/dist/tools/xulux-templates.js +0 -84
  372. package/dist/tools/xulux-templates.js.map +0 -1
  373. package/dist/utils/cache.d.ts +0 -5
  374. package/dist/utils/cache.d.ts.map +0 -1
  375. package/dist/utils/cache.js +0 -18
  376. package/dist/utils/cache.js.map +0 -1
  377. package/dist/utils/logger.d.ts +0 -10
  378. package/dist/utils/logger.d.ts.map +0 -1
  379. package/dist/utils/logger.js +0 -20
  380. package/dist/utils/logger.js.map +0 -1
  381. package/dist/utils/mcp-format.d.ts +0 -11
  382. package/dist/utils/mcp-format.d.ts.map +0 -1
  383. package/dist/utils/mcp-format.js +0 -14
  384. package/dist/utils/mcp-format.js.map +0 -1
  385. package/dist/utils/mdx.d.ts +0 -12
  386. package/dist/utils/mdx.d.ts.map +0 -1
  387. package/dist/utils/mdx.js +0 -45
  388. package/dist/utils/mdx.js.map +0 -1
  389. package/dist/utils/paths.d.ts +0 -12
  390. package/dist/utils/paths.d.ts.map +0 -1
  391. package/dist/utils/paths.js +0 -93
  392. package/dist/utils/paths.js.map +0 -1
  393. package/dist/utils/search.d.ts +0 -10
  394. package/dist/utils/search.d.ts.map +0 -1
  395. package/dist/utils/search.js +0 -97
  396. package/dist/utils/search.js.map +0 -1
  397. package/dist/utils/security.d.ts +0 -5
  398. package/dist/utils/security.d.ts.map +0 -1
  399. package/dist/utils/security.js +0 -22
  400. package/dist/utils/security.js.map +0 -1
  401. package/dist/xulux/catalog-client.d.ts +0 -14
  402. package/dist/xulux/catalog-client.d.ts.map +0 -1
  403. package/dist/xulux/catalog-client.js +0 -67
  404. package/dist/xulux/catalog-client.js.map +0 -1
  405. package/dist/xulux/fallback-catalog.d.ts +0 -7
  406. package/dist/xulux/fallback-catalog.d.ts.map +0 -1
  407. package/dist/xulux/fallback-catalog.js +0 -47
  408. package/dist/xulux/fallback-catalog.js.map +0 -1
  409. package/dist/xulux/fetch-sandbox.d.ts +0 -5
  410. package/dist/xulux/fetch-sandbox.d.ts.map +0 -1
  411. package/dist/xulux/fetch-sandbox.js +0 -40
  412. package/dist/xulux/fetch-sandbox.js.map +0 -1
  413. package/dist/xulux/template-service.d.ts +0 -84
  414. package/dist/xulux/template-service.d.ts.map +0 -1
  415. package/dist/xulux/template-service.js +0 -223
  416. package/dist/xulux/template-service.js.map +0 -1
  417. package/dist/xulux/types.d.ts +0 -55
  418. package/dist/xulux/types.d.ts.map +0 -1
  419. package/dist/xulux/types.js +0 -6
  420. package/dist/xulux/types.js.map +0 -1
  421. package/src/constants.ts +0 -24
  422. package/src/prepare-docs/code-examples.ts +0 -158
  423. package/src/prepare-docs/copy-raw.ts +0 -50
  424. package/src/prepare-docs/prepare.ts +0 -24
  425. package/src/prompts/xulux-playground.ts +0 -36
  426. package/src/tools/docs.ts +0 -255
  427. package/src/tools/examples.ts +0 -114
  428. package/src/tools/resources.ts +0 -111
  429. package/src/tools/search.ts +0 -46
  430. package/src/tools/tests/completions.test.ts +0 -60
  431. package/src/tools/tests/directory-size-cap.test.ts +0 -50
  432. package/src/tools/tests/docs.test.ts +0 -144
  433. package/src/tools/tests/examples.test.ts +0 -94
  434. package/src/tools/tests/integration.test.ts +0 -45
  435. package/src/tools/tests/json-parsing.test.ts +0 -23
  436. package/src/tools/tests/listings-cache.test.ts +0 -19
  437. package/src/tools/tests/mcp-protocol.test.ts +0 -216
  438. package/src/tools/tests/mcp-test-client.ts +0 -111
  439. package/src/tools/tests/path-traversal.test.ts +0 -81
  440. package/src/tools/tests/resources.test.ts +0 -133
  441. package/src/tools/tests/search.test.ts +0 -37
  442. package/src/tools/tests/test-setup.ts +0 -50
  443. package/src/tools/tests/xulux-templates.test.ts +0 -262
  444. package/src/tools/xulux-templates.ts +0 -141
  445. package/src/utils/cache.ts +0 -20
  446. package/src/utils/logger.ts +0 -20
  447. package/src/utils/mcp-format.ts +0 -14
  448. package/src/utils/mdx.ts +0 -59
  449. package/src/utils/paths.ts +0 -139
  450. package/src/utils/search.ts +0 -131
  451. package/src/utils/security.ts +0 -52
  452. package/src/utils/tests/cache.test.ts +0 -51
  453. package/src/utils/tests/mcp-format.test.ts +0 -22
  454. package/src/utils/tests/security.test.ts +0 -119
  455. package/src/xulux/catalog-client.ts +0 -105
  456. package/src/xulux/fallback-catalog.ts +0 -63
  457. package/src/xulux/fetch-sandbox.ts +0 -56
  458. package/src/xulux/template-service.ts +0 -406
  459. package/src/xulux/types.ts +0 -60
@@ -1,369 +0,0 @@
1
- ---
2
- title: Electron
3
- description: Run assistant-ui in an Electron renderer with a hosted backend or a secure, streaming preload and IPC bridge.
4
- platforms: ["react"]
5
- ---
6
-
7
- assistant-ui works in Electron through `@assistant-ui/react`. The renderer is a React DOM environment, so there is no separate `@assistant-ui/electron` package to install. The Electron-specific decision is where model requests run and how the renderer reaches them.
8
-
9
- <Callout type="warn">
10
- Never put a provider API key in renderer code, a `VITE_*` variable, or a preload script. Bundled values are readable by anyone with the app. Keep remote credentials on your backend, or keep local credentials in the main process and provision them with an OS-backed secret store.
11
- </Callout>
12
-
13
- ## Choose a connection pattern
14
-
15
- | Pattern | Use it when | Runtime |
16
- | --- | --- | --- |
17
- | Hosted backend | You already have an AI SDK endpoint, need server auth or persistence, or ship the app to other people | `useChatRuntime` with an absolute HTTPS URL |
18
- | Local main process | The desktop app owns the provider or agent process and must work without your web backend | `useLocalRuntime` with a narrow preload/IPC bridge |
19
-
20
- ```mermaid
21
- flowchart LR
22
- Renderer["Electron renderer<br/>assistant-ui React"] -->|"absolute HTTPS"| Backend["Hosted chat backend"]
23
- Renderer -->|"window.assistantAI"| Preload["context-isolated preload"]
24
- Preload -->|"transferred MessagePort"| Main["Electron main process"]
25
- Backend --> Provider["Model or agent"]
26
- Main --> Provider
27
- ```
28
-
29
- Do not send an SDK client, assistant-ui runtime, callback, `AbortSignal`, or `File` through IPC. Electron IPC uses structured clone semantics; define a small data-only protocol instead.
30
-
31
- ## Pattern 1: hosted backend
32
-
33
- This is the smallest integration. Keep your existing AI SDK chat route and point `AssistantChatTransport` at its public URL.
34
-
35
- ```tsx title="renderer/assistant-runtime.tsx"
36
- import type { ReactNode } from "react";
37
- import { AssistantRuntimeProvider } from "@assistant-ui/react";
38
- import {
39
- AssistantChatTransport,
40
- useChatRuntime,
41
- } from "@assistant-ui/react-ai-sdk";
42
-
43
- const transport = new AssistantChatTransport({
44
- api: "https://api.example.com/chat",
45
- });
46
-
47
- export function ElectronRuntimeProvider({ children }: { children: ReactNode }) {
48
- const runtime = useChatRuntime({ transport });
49
-
50
- return (
51
- <AssistantRuntimeProvider runtime={runtime}>
52
- {children}
53
- </AssistantRuntimeProvider>
54
- );
55
- }
56
- ```
57
-
58
- The URL must be absolute in a packaged app. A relative value such as `/api/chat` targets the renderer's `file://` or custom-protocol origin, not your deployed backend. Configure the backend's CORS policy for the packaged origin, allow the endpoint in `connect-src`, and authenticate requests as you would from any desktop client.
59
-
60
- The endpoint must return the AI SDK UI message stream consumed by `AssistantChatTransport`. See the [AI SDK runtime guide](/docs/runtimes/ai-sdk/v7) for the backend route and tool-calling setup.
61
-
62
- ## Pattern 2: local main process
63
-
64
- Use this pattern when the Electron main process calls the model or runs a local agent. Keep `contextIsolation: true`, `sandbox: true`, and `nodeIntegration: false` on the `BrowserWindow`. Register `registerAssistantIpc(mainWindow)` after creating the trusted window.
65
-
66
- The following example is intentionally text-only. It streams one request over a dedicated `MessagePort`; closing that port propagates assistant-ui's Stop action to an `AbortController` in the main process.
67
-
68
- ### 1. Define a data-only protocol
69
-
70
- Place the shared types somewhere all three Electron bundles can import.
71
-
72
- ```ts title="shared/assistant-ipc.ts"
73
- export const ASSISTANT_STREAM_CHANNEL = "assistant:stream";
74
-
75
- export type ChatMessage =
76
- | { role: "user"; content: string }
77
- | { role: "assistant"; content: string };
78
-
79
- export type ChatRequest = {
80
- system?: string;
81
- messages: ChatMessage[];
82
- };
83
-
84
- export type ChatEvent =
85
- | { type: "delta"; text: string }
86
- | { type: "done" }
87
- | { type: "error"; message: string };
88
-
89
- export type AssistantAI = {
90
- streamChat(
91
- request: ChatRequest,
92
- onEvent: (event: ChatEvent) => void,
93
- ): () => void;
94
- };
95
- ```
96
-
97
- ### 2. Expose one preload capability
98
-
99
- Expose the smallest API the renderer needs, not `ipcRenderer` itself. The callback receives only validated event data, never Electron's privileged IPC event object.
100
-
101
- ```ts title="preload/assistant.ts"
102
- import { contextBridge, ipcRenderer } from "electron";
103
- import {
104
- ASSISTANT_STREAM_CHANNEL,
105
- type AssistantAI,
106
- type ChatEvent,
107
- } from "./shared";
108
-
109
- const assistantAI: AssistantAI = {
110
- streamChat(request, onEvent) {
111
- const { port1, port2 } = new MessageChannel();
112
- const onMessage = (event: MessageEvent<ChatEvent>) => onEvent(event.data);
113
-
114
- port1.addEventListener("message", onMessage);
115
- port1.start();
116
- ipcRenderer.postMessage(ASSISTANT_STREAM_CHANNEL, request, [port2]);
117
-
118
- let stopped = false;
119
- return () => {
120
- if (stopped) return;
121
- stopped = true;
122
- port1.removeEventListener("message", onMessage);
123
- port1.close();
124
- };
125
- },
126
- };
127
-
128
- contextBridge.exposeInMainWorld("assistantAI", assistantAI);
129
- ```
130
-
131
- Declare the context-bridge API for renderer TypeScript:
132
-
133
- ```ts title="renderer/electron.d.ts"
134
- import type { AssistantAI } from "./shared";
135
-
136
- declare global {
137
- interface Window {
138
- assistantAI: AssistantAI;
139
- }
140
- }
141
-
142
- export {};
143
- ```
144
-
145
- ### 3. Stream from the main process
146
-
147
- Install the provider packages in the Electron main-process bundle:
148
-
149
- ```sh
150
- pnpm add ai @ai-sdk/openai
151
- ```
152
-
153
- The handler checks both the sending `WebContents` and its main frame, validates the untrusted payload and bounds its size before calling the model. Set `OPENAI_API_KEY` only in the main-process environment.
154
-
155
- ```ts title="main/assistant-ipc.ts"
156
- import { openai } from "@ai-sdk/openai";
157
- import { streamText } from "ai";
158
- import { ipcMain, type BrowserWindow, type IpcMainEvent } from "electron";
159
- import {
160
- ASSISTANT_STREAM_CHANNEL,
161
- type ChatEvent,
162
- type ChatRequest,
163
- } from "./shared";
164
-
165
- const isRecord = (value: unknown): value is Record<string, unknown> =>
166
- typeof value === "object" && value !== null;
167
-
168
- const isChatRequest = (value: unknown): value is ChatRequest => {
169
- if (!isRecord(value) || !Array.isArray(value.messages)) return false;
170
- if (value.system !== undefined && typeof value.system !== "string") {
171
- return false;
172
- }
173
- if (value.messages.length > 200) return false;
174
-
175
- let totalLength = typeof value.system === "string" ? value.system.length : 0;
176
- for (const message of value.messages) {
177
- if (!isRecord(message)) return false;
178
- if (message.role !== "user" && message.role !== "assistant") return false;
179
- if (typeof message.content !== "string") return false;
180
- totalLength += message.content.length;
181
- if (totalLength > 1_000_000) return false;
182
- }
183
-
184
- return true;
185
- };
186
-
187
- export function registerAssistantIpc(mainWindow: BrowserWindow) {
188
- const handleStream = (event: IpcMainEvent, request: unknown) => {
189
- const [port] = event.ports;
190
- if (!port) return;
191
-
192
- if (
193
- event.sender !== mainWindow.webContents ||
194
- event.senderFrame !== mainWindow.webContents.mainFrame
195
- ) {
196
- port.close();
197
- return;
198
- }
199
-
200
- port.start();
201
- if (!isChatRequest(request)) {
202
- port.postMessage({
203
- type: "error",
204
- message: "Invalid chat request.",
205
- } satisfies ChatEvent);
206
- port.close();
207
- return;
208
- }
209
-
210
- const abortController = new AbortController();
211
- port.once("close", () => abortController.abort());
212
- const send = (message: ChatEvent) => port.postMessage(message);
213
-
214
- void (async () => {
215
- try {
216
- const result = streamText({
217
- model: openai("gpt-5.6-luna"),
218
- messages: request.messages,
219
- ...(request.system ? { system: request.system } : {}),
220
- abortSignal: abortController.signal,
221
- });
222
-
223
- for await (const text of result.textStream) {
224
- send({ type: "delta", text });
225
- }
226
- send({ type: "done" });
227
- } catch (error) {
228
- if (abortController.signal.aborted) return;
229
- console.error("Assistant stream failed", error);
230
- send({ type: "error", message: "The model request failed." });
231
- }
232
- })();
233
- };
234
-
235
- ipcMain.on(ASSISTANT_STREAM_CHANNEL, handleStream);
236
- mainWindow.once("closed", () => {
237
- ipcMain.removeListener(ASSISTANT_STREAM_CHANNEL, handleStream);
238
- });
239
- }
240
- ```
241
-
242
- If your app can open more than one trusted assistant window, register a unique channel per window or route requests through one application-level registry. A global `ipcMain.on` listener should not be re-registered under the same channel for every window.
243
-
244
- ### 4. Adapt IPC to assistant-ui
245
-
246
- `ChatModelAdapter` yields complete snapshots, so the renderer accumulates each IPC delta before yielding it. Its cleanup function closes the port on Stop, unmount, or completion.
247
-
248
- ```tsx title="renderer/assistant-runtime.tsx"
249
- import type { ReactNode } from "react";
250
- import {
251
- AssistantRuntimeProvider,
252
- useLocalRuntime,
253
- type ChatModelAdapter,
254
- } from "@assistant-ui/react";
255
- import type { ChatMessage } from "./shared";
256
-
257
- const ipcChatModel: ChatModelAdapter = {
258
- async *run({ messages, context, abortSignal }) {
259
- abortSignal.throwIfAborted();
260
-
261
- const system = [context.system];
262
- const serializedMessages: ChatMessage[] = [];
263
-
264
- for (const message of messages) {
265
- const text = message.content
266
- .flatMap((part) => (part.type === "text" ? [part.text] : []))
267
- .join("\n");
268
- if (!text) continue;
269
-
270
- if (message.role === "system") system.push(text);
271
- if (message.role === "user") {
272
- serializedMessages.push({ role: "user", content: text });
273
- }
274
- if (message.role === "assistant") {
275
- serializedMessages.push({ role: "assistant", content: text });
276
- }
277
- }
278
-
279
- const systemText = system.filter(Boolean).join("\n\n");
280
- let stop: (() => void) | undefined;
281
- let removeAbortListener: (() => void) | undefined;
282
- const deltas = new ReadableStream<string>({
283
- start(controller) {
284
- let settled = false;
285
- const close = () => {
286
- if (settled) return;
287
- settled = true;
288
- controller.close();
289
- };
290
- const fail = (error: unknown) => {
291
- if (settled) return;
292
- settled = true;
293
- controller.error(error);
294
- };
295
-
296
- stop = window.assistantAI.streamChat(
297
- {
298
- ...(systemText ? { system: systemText } : {}),
299
- messages: serializedMessages,
300
- },
301
- (event) => {
302
- if (event.type === "delta") controller.enqueue(event.text);
303
- if (event.type === "done") close();
304
- if (event.type === "error") fail(new Error(event.message));
305
- },
306
- );
307
-
308
- const onAbort = () => {
309
- stop?.();
310
- fail(abortSignal.reason);
311
- };
312
- abortSignal.addEventListener("abort", onAbort, { once: true });
313
- removeAbortListener = () =>
314
- abortSignal.removeEventListener("abort", onAbort);
315
- if (abortSignal.aborted) onAbort();
316
- },
317
- cancel() {
318
- stop?.();
319
- },
320
- });
321
-
322
- const reader = deltas.getReader();
323
- let fullText = "";
324
- try {
325
- while (true) {
326
- const { done, value } = await reader.read();
327
- if (done) return;
328
- fullText += value;
329
- yield { content: [{ type: "text", text: fullText }] };
330
- }
331
- } finally {
332
- removeAbortListener?.();
333
- stop?.();
334
- reader.releaseLock();
335
- }
336
- },
337
- };
338
-
339
- export function ElectronRuntimeProvider({ children }: { children: ReactNode }) {
340
- const runtime = useLocalRuntime(ipcChatModel);
341
- return (
342
- <AssistantRuntimeProvider runtime={runtime}>
343
- {children}
344
- </AssistantRuntimeProvider>
345
- );
346
- }
347
- ```
348
-
349
- Wrap your existing assistant-ui thread with `ElectronRuntimeProvider`. Primitives and installed UI components work exactly as they do in a browser React app.
350
-
351
- ## Extend the protocol deliberately
352
-
353
- The local example drops every non-text content part. Add explicit structured-clone-safe fields before claiming support for more features:
354
-
355
- - Attachments: pass bounded `ArrayBuffer` data or an app-owned file reference after validating type, size, and path in the main process. Do not pass browser `File` objects.
356
- - Tools: define serializable tool-call and tool-result events, and validate every tool invocation in the privileged process. Never expose a generic shell or filesystem IPC method.
357
- - Reasoning and metadata: add distinct event variants and map them to the corresponding assistant-ui content parts.
358
- - Thread persistence: store serializable thread data in the main process or use a remote thread-list adapter; do not try to transfer a runtime object.
359
-
360
- ## Packaged-app checklist
361
-
362
- - Use an absolute HTTPS endpoint, a privileged custom protocol, or the preload bridge. Relative `/api/*` routes that worked against a development server will not follow your backend after packaging.
363
- - Serve local content through a custom protocol instead of `file://` when possible, and define a restrictive Content Security Policy. Do not disable `webSecurity` to work around origin errors.
364
- - Validate every IPC sender and every payload in the main process. Treat renderer data as untrusted even when the renderer is local.
365
- - Intercept new windows and external links with `webContents.setWindowOpenHandler`; do not let model-generated links create unrestricted Electron windows.
366
- - If you render remote HTML with `SafeContentFrame`, allow its documented host in `frame-src`. Ordinary text and Markdown rendering need no Electron-specific change.
367
- - Test the packaged build, not only the Vite or Webpack development server. The scheme, origin, preload path, CSP, and environment loading can all differ.
368
-
369
- For the underlying platform constraints, see Electron's official guides to [IPC and MessagePorts](https://www.electronjs.org/docs/latest/tutorial/message-ports), [context isolation](https://www.electronjs.org/docs/latest/tutorial/context-isolation), and the [security checklist](https://www.electronjs.org/docs/latest/tutorial/security).
@@ -1,113 +0,0 @@
1
- ---
2
- title: Headless Composer Input
3
- description: Build a custom composer input while keeping assistant-ui composer state and send gating.
4
- platforms: ["react"]
5
- ---
6
-
7
- `ComposerPrimitive.Input` is still the recommended composer input for most apps. It owns autosize, keyboard shortcuts, IME handling, paste-to-attachment, focus behavior, and trigger-popover keyboard integration.
8
-
9
- Use `unstable_useComposerInput` when you already own the input surface, such as a custom editor, a `contentEditable` surface, or a textarea wrapper whose behavior cannot be expressed through `ComposerPrimitive.Input`'s props, `asChild`, or `render` APIs.
10
-
11
- <Callout type="warn">
12
- This API is marked unstable and may change without notice. It is a thin bridge
13
- to composer text and send state, not a replacement implementation of
14
- `ComposerPrimitive.Input`.
15
- </Callout>
16
-
17
- ## Usage
18
-
19
- Render the custom input inside a composer and mirror text changes into the assistant-ui composer state:
20
-
21
- ```tsx
22
- "use client";
23
-
24
- import {
25
- ComposerPrimitive,
26
- unstable_useComposerInput,
27
- unstable_useTriggerPopoverAriaProps,
28
- } from "@assistant-ui/react";
29
-
30
- function HeadlessComposer() {
31
- const composer = unstable_useComposerInput();
32
- const popoverAria = unstable_useTriggerPopoverAriaProps();
33
-
34
- return (
35
- <ComposerPrimitive.Root>
36
- <textarea
37
- aria-label="Message"
38
- value={composer.value}
39
- disabled={composer.isDisabled}
40
- onChange={(event) => {
41
- composer.setText(event.currentTarget.value);
42
- }}
43
- onKeyDown={(event) => {
44
- if (event.nativeEvent.isComposing) return;
45
-
46
- if (event.key === "Enter" && !event.shiftKey) {
47
- event.preventDefault();
48
-
49
- if (composer.canSend) {
50
- composer.send();
51
- }
52
- }
53
- }}
54
- {...popoverAria}
55
- />
56
- <ComposerPrimitive.Send />
57
- </ComposerPrimitive.Root>
58
- );
59
- }
60
- ```
61
-
62
- `composer.send()` exposes the same send action used by `ComposerPrimitive.Send`, including send options such as `composer.send({ steer: true })`. It is a no-op unless `composer.canSend` is `true`; check `canSend` in custom keyboard handlers to keep your event handling explicit.
63
-
64
- ## Hook Result
65
-
66
- | Field | Description |
67
- | --- | --- |
68
- | `value` | Current composer text. Returns `""` when the composer is not editing. |
69
- | `setText(text)` | Writes text into the composer while it is editing. |
70
- | `send(options?)` | Sends the current composer message when `canSend` is `true`; otherwise a no-op. |
71
- | `isDisabled` | Combines the hook's `disabled` option with assistant-ui disabled sources, such as thread disabled state and active dictation input lock. |
72
- | `canSend` | Matches `ComposerPrimitive.Send` gating, then also respects `isDisabled`. |
73
-
74
- Pass `disabled` when your editor has an additional read-only state:
75
-
76
- ```tsx
77
- const composer = unstable_useComposerInput({
78
- disabled: editorReadOnly,
79
- });
80
- ```
81
-
82
- ## What You Still Own
83
-
84
- The hook does not recreate the behavior of `ComposerPrimitive.Input`. Your input or editor remains responsible for:
85
-
86
- - Enter/newline shortcuts, steer shortcuts, escape/cancel behavior, and any other keyboard behavior.
87
- - IME and composition handling.
88
- - Cursor and selection tracking.
89
- - Autosize and focus management.
90
- - Paste/drop attachment behavior.
91
- - Rich text state, serialization, and DOM synchronization for `contentEditable` or editor-library integrations.
92
-
93
- For styled textareas, prefer `ComposerPrimitive.Input`. Reach for the headless hook when the editor has its own model or DOM lifecycle and assistant-ui should only supply composer state and send gating.
94
-
95
- ## Trigger Popovers
96
-
97
- `unstable_useTriggerPopoverAriaProps` returns the combobox ARIA attributes for the currently open trigger popover:
98
-
99
- ```tsx
100
- const popoverAria = unstable_useTriggerPopoverAriaProps();
101
-
102
- <textarea {...popoverAria} />;
103
- ```
104
-
105
- Spread these props last so they can mirror `ComposerPrimitive.Input` when a popover is open.
106
-
107
- This helper only describes the open popover to assistive technology. It does not wire a custom editor into mention or slash-command keyboard handling, cursor tracking, or item insertion. For the full built-in trigger-popover experience, use `ComposerPrimitive.Input`; for richer editors, integrate the trigger UI with the editor's own selection and keyboard model.
108
-
109
- ## Related
110
-
111
- - [Composer primitives](/docs/primitives/composer)
112
- - [Composer Trigger Popover](/docs/ui/composer-trigger-popover)
113
- - [Input History](/docs/guides/input-history)
@@ -1,74 +0,0 @@
1
- ---
2
- title: Image Generation
3
- description: Generate images in your backend and render them inline in an assistant-ui thread.
4
- ---
5
-
6
- Image generation needs no dedicated primitive. Generate the image wherever you already run model calls (a route handler or a tool), store the result as an `ImageMessagePart`, and render it with the `@assistant-ui/ui` `Image` component.
7
-
8
- <Callout type="info">
9
- This covers non-streaming generation, rendering, and actions. Streaming partial images and multi-image galleries are out of scope.
10
- </Callout>
11
-
12
- ## Generate in your backend
13
-
14
- Call your provider from a server route. With the AI SDK that is `generateImage`; return the image as a data URI (or an object-store URL) plus any provider metadata you want to keep.
15
-
16
- ```ts
17
- // app/api/image/route.ts
18
- import { generateImage } from "ai";
19
- import { openai } from "@ai-sdk/openai";
20
-
21
- export async function POST(req: Request) {
22
- const { prompt } = await req.json();
23
- const result = await generateImage({
24
- model: openai.image("gpt-image-1"),
25
- prompt,
26
- });
27
- const revisedPrompt = (
28
- result.providerMetadata as
29
- | Record<string, Record<string, unknown>>
30
- | undefined
31
- )?.openai?.revisedPrompt;
32
- return Response.json({
33
- image: `data:${result.image.mediaType};base64,${result.image.base64}`,
34
- mimeType: result.image.mediaType,
35
- ...(typeof revisedPrompt === "string" && { revisedPrompt }),
36
- });
37
- }
38
- ```
39
-
40
- The model provider is irrelevant to rendering; swap `openai.image(...)` for any AI SDK image model.
41
-
42
- ## Store it as an `ImageMessagePart`
43
-
44
- An `ImageMessagePart` only needs `image` (a `data:` URI, an `https://` URL, or a `blob:` URL) plus an optional `filename`. Keep any provenance you want to display, the prompt, a revised prompt, a model id, in your own component state or in message metadata; the part itself stays minimal.
45
-
46
- ```ts
47
- const part: ImageMessagePart = {
48
- type: "image",
49
- image: result.image, // data:, https://, or blob: URL
50
- };
51
- ```
52
-
53
- ## Render with the `Image` component
54
-
55
- The `Image` component in `@assistant-ui/ui` handles the render states for you:
56
-
57
- 1. **Running** (`status.type === "running"`) renders a spinner.
58
- 2. **Content filter** (`status.type === "incomplete"` with `reason: "content-filter"`) renders an error card with no `<img src>`.
59
- 3. **Complete** renders a zoomable `<img>` with optional `Image.Actions`.
60
-
61
- `Image.Actions` provides download and copy buttons, plus a regenerate button when you pass an `onRegenerate` callback. Wire it to the same generation flow you used above; debounce, rate limiting, and confirmation are your call.
62
-
63
- ```tsx
64
- import { Image } from "@assistant-ui/ui";
65
-
66
- <>
67
- <Image {...imagePart} />
68
- <Image.Actions part={imagePart} onRegenerate={() => regenerate(prompt)} />
69
- </>;
70
- ```
71
-
72
- ## Example
73
-
74
- A complete Next.js example (with a mock fallback when `OPENAI_API_KEY` is unset) lives in [`examples/with-image-generation`](https://github.com/assistant-ui/assistant-ui/tree/main/examples/with-image-generation).
@@ -1,117 +0,0 @@
1
- ---
2
- title: Guides
3
- description: Practical recipes for building AI chat features in React with assistant-ui — attachments, branching, multi-agent, voice, slash commands, generative UI, and more.
4
- platforms: ["react"]
5
- ---
6
-
7
- Guides are task-oriented walkthroughs for building specific features on top of assistant-ui. They sit between the [Primitives](/docs/primitives) (low-level building blocks) and [Components](/docs/ui/thread) (pre-styled installs) — pick a guide when you know what you want to build and need the recommended pattern.
8
-
9
- ## Composer
10
-
11
- Extend the message input with file attachments, mentions, slash commands, voice, and quoting.
12
-
13
- <Cards>
14
- <Card title="Attachments" href="/docs/guides/attachments">
15
- Let users attach files, images, and documents to messages. Covers upload adapters, validation, and the typed `attachmentAddError` event.
16
- </Card>
17
- <Card title="Mentions" href="/docs/guides/mentions">
18
- `@`-style triggers that insert directives into the composer. Sync and async search patterns.
19
- </Card>
20
- <Card title="Slash Commands" href="/docs/guides/slash-commands">
21
- `/`-style commands with arguments, async loading, and combining with mentions.
22
- </Card>
23
- <Card title="Quoting" href="/docs/guides/quoting">
24
- Selection toolbar, programmatic `setQuote`, and forwarding quote context to the LLM.
25
- </Card>
26
- <Card title="Dictation" href="/docs/guides/dictation">
27
- Speech-to-text into the composer using `DictationAdapter` and `ComposerPrimitive.Dictate`.
28
- </Card>
29
- </Cards>
30
-
31
- ## Messages
32
-
33
- Customize how messages render, are edited, branched, and suggested.
34
-
35
- <Cards>
36
- <Card title="Suggestions" href="/docs/guides/suggestions">
37
- Welcome-screen prompts, dynamic suggestions, and the `AuiIf` empty-thread pattern.
38
- </Card>
39
- <Card title="Editing" href="/docs/guides/editing">
40
- Edit user messages with `UserEditComposer`, `beginEdit()`, and edit-during-streaming behavior.
41
- </Card>
42
- <Card title="Branching" href="/docs/guides/branching">
43
- Navigate alternative message versions with `BranchPickerPrimitive`, reload, and direct branch-id navigation.
44
- </Card>
45
- <Card title="Message Timing" href="/docs/guides/message-timing">
46
- Display response duration and stream timing with `useMessageTiming` (experimental).
47
- </Card>
48
- </Cards>
49
-
50
- ## Tools & Generative UI
51
-
52
- Tool calling and generative UI have their own [Tools](/docs/tools) section — defining toolkits, rendering tool calls, interactables, MCP, and multi-agent UIs.
53
-
54
- <Cards>
55
- <Card title="Tools" href="/docs/tools">
56
- Define toolkits, render tool calls, connect MCP servers, and build generative UI.
57
- </Card>
58
- </Cards>
59
-
60
- ## Display
61
-
62
- Render specialized message content.
63
-
64
- <Cards>
65
- <Card title="Chain of Thought" href="/docs/guides/chain-of-thought">
66
- Display the assistant's reasoning steps in a collapsible accordion.
67
- </Card>
68
- <Card title="LaTeX" href="/docs/guides/latex">
69
- Render math via React Markdown or Streamdown, with streaming-safe escape rules.
70
- </Card>
71
- <Card title="Thread Virtualization" href="/docs/guides/virtualization">
72
- Render very long threads with @tanstack/react-virtual and per-index message rendering.
73
- </Card>
74
- </Cards>
75
-
76
- ## Audio
77
-
78
- Voice input and output.
79
-
80
- <Cards>
81
- <Card title="Voice" href="/docs/guides/voice">
82
- Realtime bidirectional audio with `RealtimeVoiceAdapter` and `createVoiceSession`.
83
- </Card>
84
- <Card title="Speech" href="/docs/guides/speech">
85
- Text-to-speech for assistant messages via `SpeechSynthesisAdapter`.
86
- </Card>
87
- </Cards>
88
-
89
- ## Programmatic
90
-
91
- Read and drive runtime state from your own code.
92
-
93
- <Cards>
94
- <Card title="Context API" href="/docs/guides/context-api">
95
- Access threads, messages, composer, and tool state via `useAui` and the runtime scope tree.
96
- </Card>
97
- </Cards>
98
-
99
- ## Providers
100
-
101
- Alternative ways to connect a model.
102
-
103
- <Cards>
104
- <Card title="ChatGPT Subscription" href="/docs/guides/chatgpt-subscription">
105
- Run your app locally on a ChatGPT Plus or Pro plan via Codex OAuth, no API key required.
106
- </Card>
107
- </Cards>
108
-
109
- ## Environments
110
-
111
- Run assistant-ui outside a conventional browser deployment.
112
-
113
- <Cards>
114
- <Card title="Electron" href="/docs/guides/electron">
115
- Connect an Electron renderer to a hosted backend or a secure, streaming preload/IPC bridge.
116
- </Card>
117
- </Cards>