@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.
- package/README.md +16 -43
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -91
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +9 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +76 -0
- package/dist/proxy.js.map +1 -0
- package/package.json +9 -13
- package/src/index.ts +3 -115
- package/src/proxy.test.ts +250 -0
- package/src/proxy.ts +111 -0
- package/.docs/organized/code-examples/waterfall.md +0 -807
- package/.docs/organized/code-examples/with-a2a.md +0 -674
- package/.docs/organized/code-examples/with-ag-ui.md +0 -552
- package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -465
- package/.docs/organized/code-examples/with-artifacts.md +0 -814
- package/.docs/organized/code-examples/with-assistant-transport.md +0 -575
- package/.docs/organized/code-examples/with-browser-extension.md +0 -371
- package/.docs/organized/code-examples/with-chain-of-thought.md +0 -960
- package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
- package/.docs/organized/code-examples/with-cloud.md +0 -438
- package/.docs/organized/code-examples/with-custom-thread-list.md +0 -568
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -526
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -696
- package/.docs/organized/code-examples/with-eve.md +0 -404
- package/.docs/organized/code-examples/with-expo.md +0 -2063
- package/.docs/organized/code-examples/with-external-store.md +0 -420
- package/.docs/organized/code-examples/with-ffmpeg.md +0 -828
- package/.docs/organized/code-examples/with-generative-ui.md +0 -1812
- package/.docs/organized/code-examples/with-google-adk.md +0 -367
- package/.docs/organized/code-examples/with-heat-graph.md +0 -304
- package/.docs/organized/code-examples/with-image-generation.md +0 -462
- package/.docs/organized/code-examples/with-interactables.md +0 -732
- package/.docs/organized/code-examples/with-langchain.md +0 -445
- package/.docs/organized/code-examples/with-langgraph.md +0 -854
- package/.docs/organized/code-examples/with-livekit.md +0 -642
- package/.docs/organized/code-examples/with-mcp.md +0 -780
- package/.docs/organized/code-examples/with-nuxt.md +0 -2428
- package/.docs/organized/code-examples/with-opencode.md +0 -1974
- package/.docs/organized/code-examples/with-openui.md +0 -449
- package/.docs/organized/code-examples/with-pi.md +0 -2083
- package/.docs/organized/code-examples/with-react-hook-form.md +0 -724
- package/.docs/organized/code-examples/with-react-ink-web.md +0 -690
- package/.docs/organized/code-examples/with-react-ink.md +0 -472
- package/.docs/organized/code-examples/with-react-router.md +0 -935
- package/.docs/organized/code-examples/with-resumable-stream.md +0 -667
- package/.docs/organized/code-examples/with-store.md +0 -679
- package/.docs/organized/code-examples/with-svelte.md +0 -415
- package/.docs/organized/code-examples/with-sveltekit.md +0 -1061
- package/.docs/organized/code-examples/with-tanstack.md +0 -811
- package/.docs/organized/code-examples/with-tap-runtime.md +0 -812
- package/.docs/organized/code-examples/with-virtualized-thread.md +0 -680
- package/.docs/organized/code-examples/with-vue.md +0 -408
- package/.docs/raw/docs/(docs)/architecture.mdx +0 -146
- package/.docs/raw/docs/(docs)/base-ui.mdx +0 -39
- package/.docs/raw/docs/(docs)/cli.mdx +0 -542
- package/.docs/raw/docs/(docs)/devtools.mdx +0 -79
- package/.docs/raw/docs/(docs)/index.mdx +0 -21
- package/.docs/raw/docs/(docs)/installation.mdx +0 -483
- package/.docs/raw/docs/(docs)/llm.mdx +0 -211
- package/.docs/raw/docs/(docs)/rtl.mdx +0 -78
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/adapters/model.mdx +0 -44
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +0 -59
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/suggestions.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/context-providers/assistant-runtime-provider.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/context-providers/scoped-providers.mdx +0 -64
- package/.docs/raw/docs/(reference)/api-reference/external-store/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/external-store/message-conversion.mdx +0 -52
- package/.docs/raw/docs/(reference)/api-reference/external-store/runtime.mdx +0 -49
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/a2ui.mdx +0 -40
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +0 -56
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +0 -86
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +0 -39
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +0 -42
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/spec.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +0 -93
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/hooks/composer-triggers.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +0 -31
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/hooks/primitives.mdx +0 -350
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/cloud-ai-sdk.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/integrations/eve.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-ai-sdk.mdx +0 -200
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +0 -37
- package/.docs/raw/docs/(reference)/api-reference/model-context/context.mdx +0 -50
- package/.docs/raw/docs/(reference)/api-reference/model-context/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/model-context/registry.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +0 -566
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +0 -152
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar.mdx +0 -239
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +0 -208
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-modal.mdx +0 -108
- package/.docs/raw/docs/(reference)/api-reference/primitives/attachment.mdx +0 -99
- package/.docs/raw/docs/(reference)/api-reference/primitives/branch-picker.mdx +0 -145
- package/.docs/raw/docs/(reference)/api-reference/primitives/chain-of-thought.mdx +0 -82
- package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +0 -619
- package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/primitives/error.mdx +0 -65
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +0 -73
- package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +0 -117
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +0 -339
- package/.docs/raw/docs/(reference)/api-reference/primitives/queue-item.mdx +0 -77
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +0 -88
- package/.docs/raw/docs/(reference)/api-reference/primitives/suggestion.mdx +0 -81
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item.mdx +0 -138
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +0 -122
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +0 -289
- package/.docs/raw/docs/(reference)/api-reference/runtimes/assistant-runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/attachment-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/composer-runtime.mdx +0 -32
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-part-runtime.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/queue-state.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-item-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-runtime.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/tools/component-tools.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/tools/index.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables-legacy.mdx +0 -55
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables.mdx +0 -151
- package/.docs/raw/docs/(reference)/api-reference/tools/rendering.mdx +0 -106
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +0 -178
- package/.docs/raw/docs/(reference)/api-reference/transport/assistant-transport.mdx +0 -48
- package/.docs/raw/docs/(reference)/api-reference/transport/frame.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/transport/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/utilities/index.mdx +0 -19
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +0 -149
- package/.docs/raw/docs/(reference)/api-reference/voice/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/voice/session.mdx +0 -54
- package/.docs/raw/docs/(reference)/api-reference/voice/speech-dictation.mdx +0 -36
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +0 -527
- package/.docs/raw/docs/cloud/ai-sdk.mdx +0 -602
- package/.docs/raw/docs/cloud/authorization.mdx +0 -252
- package/.docs/raw/docs/cloud/index.mdx +0 -46
- package/.docs/raw/docs/cloud/langgraph.mdx +0 -554
- package/.docs/raw/docs/copilots/assistant-frame.mdx +0 -400
- package/.docs/raw/docs/copilots/make-assistant-visible.mdx +0 -82
- package/.docs/raw/docs/copilots/model-context.mdx +0 -156
- package/.docs/raw/docs/copilots/motivation.mdx +0 -202
- package/.docs/raw/docs/copilots/use-assistant-instructions.mdx +0 -64
- package/.docs/raw/docs/guides/attachments.mdx +0 -619
- package/.docs/raw/docs/guides/branching.mdx +0 -76
- package/.docs/raw/docs/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/guides/chatgpt-subscription.mdx +0 -108
- package/.docs/raw/docs/guides/context-api.mdx +0 -619
- package/.docs/raw/docs/guides/dictation.mdx +0 -298
- package/.docs/raw/docs/guides/editing.mdx +0 -102
- package/.docs/raw/docs/guides/electron.mdx +0 -369
- package/.docs/raw/docs/guides/headless-composer-input.mdx +0 -113
- package/.docs/raw/docs/guides/image-generation.mdx +0 -74
- package/.docs/raw/docs/guides/index.mdx +0 -117
- package/.docs/raw/docs/guides/input-history.mdx +0 -55
- package/.docs/raw/docs/guides/latex.mdx +0 -158
- package/.docs/raw/docs/guides/mentions.mdx +0 -575
- package/.docs/raw/docs/guides/message-timing.mdx +0 -209
- package/.docs/raw/docs/guides/quoting.mdx +0 -169
- package/.docs/raw/docs/guides/resumable-stream-deployment.mdx +0 -212
- package/.docs/raw/docs/guides/resumable-stream-stores.mdx +0 -152
- package/.docs/raw/docs/guides/resumable-streams.mdx +0 -292
- package/.docs/raw/docs/guides/slash-commands.mdx +0 -358
- package/.docs/raw/docs/guides/speech.mdx +0 -172
- package/.docs/raw/docs/guides/suggestions.mdx +0 -384
- package/.docs/raw/docs/guides/virtualization.mdx +0 -133
- package/.docs/raw/docs/guides/voice.mdx +0 -310
- package/.docs/raw/docs/ink/adapters.mdx +0 -99
- package/.docs/raw/docs/ink/custom-backend.mdx +0 -254
- package/.docs/raw/docs/ink/hooks.mdx +0 -469
- package/.docs/raw/docs/ink/index.mdx +0 -236
- package/.docs/raw/docs/ink/migration.mdx +0 -138
- package/.docs/raw/docs/ink/primitives.mdx +0 -1259
- package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +0 -528
- package/.docs/raw/docs/integrations/auth/better-auth.mdx +0 -188
- package/.docs/raw/docs/integrations/auth/clerk.mdx +0 -166
- package/.docs/raw/docs/integrations/auth/next-auth.mdx +0 -191
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +0 -88
- package/.docs/raw/docs/integrations/frameworks/cloudflare-agents/overview.mdx +0 -282
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +0 -188
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +0 -57
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +0 -201
- package/.docs/raw/docs/integrations/gateways/index.mdx +0 -162
- package/.docs/raw/docs/integrations/index.mdx +0 -178
- package/.docs/raw/docs/integrations/observability/helicone.mdx +0 -129
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +0 -161
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +0 -151
- package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +0 -773
- package/.docs/raw/docs/migrations/deprecation-policy.mdx +0 -42
- package/.docs/raw/docs/migrations/index.mdx +0 -50
- package/.docs/raw/docs/migrations/react-compatibility.mdx +0 -74
- package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +0 -328
- package/.docs/raw/docs/migrations/toolkit-tools.mdx +0 -236
- package/.docs/raw/docs/migrations/v0-11.mdx +0 -172
- package/.docs/raw/docs/migrations/v0-12.mdx +0 -302
- package/.docs/raw/docs/migrations/v0-14.mdx +0 -297
- package/.docs/raw/docs/migrations/v0-15.mdx +0 -270
- package/.docs/raw/docs/primitives/action-bar.mdx +0 -352
- package/.docs/raw/docs/primitives/assistant-modal.mdx +0 -216
- package/.docs/raw/docs/primitives/attachment.mdx +0 -217
- package/.docs/raw/docs/primitives/branch-picker.mdx +0 -222
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +0 -315
- package/.docs/raw/docs/primitives/composer.mdx +0 -659
- package/.docs/raw/docs/primitives/error.mdx +0 -142
- package/.docs/raw/docs/primitives/index.mdx +0 -99
- package/.docs/raw/docs/primitives/message.mdx +0 -618
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +0 -191
- package/.docs/raw/docs/primitives/suggestion.mdx +0 -254
- package/.docs/raw/docs/primitives/thread-list.mdx +0 -467
- package/.docs/raw/docs/primitives/thread.mdx +0 -509
- package/.docs/raw/docs/react-native/adapters.mdx +0 -94
- package/.docs/raw/docs/react-native/custom-backend.mdx +0 -207
- package/.docs/raw/docs/react-native/hooks.mdx +0 -339
- package/.docs/raw/docs/react-native/index.mdx +0 -289
- package/.docs/raw/docs/react-native/migration.mdx +0 -142
- package/.docs/raw/docs/react-native/primitives.mdx +0 -839
- package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +0 -399
- package/.docs/raw/docs/runtimes/a2a/overview.mdx +0 -60
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +0 -216
- package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +0 -124
- package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +0 -70
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +0 -243
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +0 -255
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +0 -61
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +0 -122
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +0 -135
- package/.docs/raw/docs/runtimes/ai-sdk/v6-legacy.mdx +0 -636
- package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +0 -716
- package/.docs/raw/docs/runtimes/claude-managed-agents.mdx +0 -118
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +0 -265
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +0 -167
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +0 -68
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +0 -513
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +0 -763
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +0 -339
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +0 -957
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +0 -902
- package/.docs/raw/docs/runtimes/custom/overview.mdx +0 -71
- package/.docs/raw/docs/runtimes/eve/overview.mdx +0 -151
- package/.docs/raw/docs/runtimes/eve/quickstart.mdx +0 -192
- package/.docs/raw/docs/runtimes/google-adk/api.mdx +0 -256
- package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +0 -784
- package/.docs/raw/docs/runtimes/google-adk/overview.mdx +0 -69
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +0 -229
- package/.docs/raw/docs/runtimes/langchain.mdx +0 -901
- package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +0 -181
- package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +0 -305
- package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +0 -104
- package/.docs/raw/docs/runtimes/langgraph/overview.mdx +0 -84
- package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +0 -496
- package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +0 -144
- package/.docs/raw/docs/runtimes/langgraph/threads.mdx +0 -113
- package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +0 -29
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -93
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +0 -347
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +0 -393
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +0 -194
- package/.docs/raw/docs/runtimes/opencode/overview.mdx +0 -58
- package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +0 -119
- package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +0 -133
- package/.docs/raw/docs/tools/a2ui.mdx +0 -107
- package/.docs/raw/docs/tools/backend.mdx +0 -147
- package/.docs/raw/docs/tools/defining-tools.mdx +0 -574
- package/.docs/raw/docs/tools/dynamic-tools.mdx +0 -112
- package/.docs/raw/docs/tools/generative-ui-primitive.mdx +0 -180
- package/.docs/raw/docs/tools/generative-ui-slack.mdx +0 -167
- package/.docs/raw/docs/tools/generative-ui-teams.mdx +0 -160
- package/.docs/raw/docs/tools/generative-ui.mdx +0 -322
- package/.docs/raw/docs/tools/index.mdx +0 -72
- package/.docs/raw/docs/tools/interactables.mdx +0 -1084
- package/.docs/raw/docs/tools/mcp-apps.mdx +0 -346
- package/.docs/raw/docs/tools/mcp.mdx +0 -466
- package/.docs/raw/docs/tools/multi-agent.mdx +0 -237
- package/.docs/raw/docs/tools/openui.mdx +0 -175
- package/.docs/raw/docs/tools/tool-ui.mdx +0 -1008
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
- package/.docs/raw/docs/ui/accordion.mdx +0 -266
- package/.docs/raw/docs/ui/assistant-modal.mdx +0 -166
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +0 -89
- package/.docs/raw/docs/ui/attachment.mdx +0 -259
- package/.docs/raw/docs/ui/badge.mdx +0 -150
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -212
- package/.docs/raw/docs/ui/context-display.mdx +0 -148
- package/.docs/raw/docs/ui/diff-viewer.mdx +0 -280
- package/.docs/raw/docs/ui/directive-text.mdx +0 -114
- package/.docs/raw/docs/ui/dot-matrix.mdx +0 -133
- package/.docs/raw/docs/ui/file.mdx +0 -159
- package/.docs/raw/docs/ui/follow-up-suggestions.mdx +0 -82
- package/.docs/raw/docs/ui/image.mdx +0 -102
- package/.docs/raw/docs/ui/markdown.mdx +0 -64
- package/.docs/raw/docs/ui/mcp-config.mdx +0 -107
- package/.docs/raw/docs/ui/mermaid.mdx +0 -92
- package/.docs/raw/docs/ui/message-timing.mdx +0 -93
- package/.docs/raw/docs/ui/model-selector.mdx +0 -455
- package/.docs/raw/docs/ui/number-roll.mdx +0 -154
- package/.docs/raw/docs/ui/part-grouping.mdx +0 -614
- package/.docs/raw/docs/ui/quote.mdx +0 -211
- package/.docs/raw/docs/ui/reasoning.mdx +0 -186
- package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
- package/.docs/raw/docs/ui/select.mdx +0 -254
- package/.docs/raw/docs/ui/sources.mdx +0 -177
- package/.docs/raw/docs/ui/streamdown.mdx +0 -392
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
- package/.docs/raw/docs/ui/tabs.mdx +0 -271
- package/.docs/raw/docs/ui/thread-list.mdx +0 -372
- package/.docs/raw/docs/ui/thread.mdx +0 -512
- package/.docs/raw/docs/ui/tool-fallback.mdx +0 -127
- package/.docs/raw/docs/ui/tool-group.mdx +0 -240
- package/.docs/raw/docs/ui/voice.mdx +0 -173
- package/.docs/raw/docs/utilities/heat-graph.mdx +0 -237
- package/.docs/raw/docs/utilities/react-o11y.mdx +0 -362
- package/.docs/raw/docs/utilities/tw-shimmer.mdx +0 -212
- package/dist/constants.d.ts +0 -14
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -19
- package/dist/constants.js.map +0 -1
- package/dist/prepare-docs/code-examples.d.ts +0 -5
- package/dist/prepare-docs/code-examples.d.ts.map +0 -1
- package/dist/prepare-docs/code-examples.js +0 -117
- package/dist/prepare-docs/code-examples.js.map +0 -1
- package/dist/prepare-docs/copy-raw.d.ts +0 -5
- package/dist/prepare-docs/copy-raw.d.ts.map +0 -1
- package/dist/prepare-docs/copy-raw.js +0 -49
- package/dist/prepare-docs/copy-raw.js.map +0 -1
- package/dist/prepare-docs/prepare.d.ts +0 -1
- package/dist/prepare-docs/prepare.js +0 -22
- package/dist/prepare-docs/prepare.js.map +0 -1
- package/dist/prompts/xulux-playground.d.ts +0 -12
- package/dist/prompts/xulux-playground.d.ts.map +0 -1
- package/dist/prompts/xulux-playground.js +0 -33
- package/dist/prompts/xulux-playground.js.map +0 -1
- package/dist/tools/docs.d.ts +0 -22
- package/dist/tools/docs.d.ts.map +0 -1
- package/dist/tools/docs.js +0 -177
- package/dist/tools/docs.js.map +0 -1
- package/dist/tools/examples.d.ts +0 -24
- package/dist/tools/examples.d.ts.map +0 -1
- package/dist/tools/examples.js +0 -87
- package/dist/tools/examples.js.map +0 -1
- package/dist/tools/resources.d.ts +0 -6
- package/dist/tools/resources.d.ts.map +0 -1
- package/dist/tools/resources.js +0 -75
- package/dist/tools/resources.js.map +0 -1
- package/dist/tools/search.d.ts +0 -24
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -39
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/tests/mcp-test-client.d.ts +0 -15
- package/dist/tools/tests/mcp-test-client.d.ts.map +0 -1
- package/dist/tools/tests/mcp-test-client.js +0 -68
- package/dist/tools/tests/mcp-test-client.js.map +0 -1
- package/dist/tools/tests/test-setup.d.ts +0 -7
- package/dist/tools/tests/test-setup.d.ts.map +0 -1
- package/dist/tools/tests/test-setup.js +0 -36
- package/dist/tools/tests/test-setup.js.map +0 -1
- package/dist/tools/xulux-templates.d.ts +0 -58
- package/dist/tools/xulux-templates.d.ts.map +0 -1
- package/dist/tools/xulux-templates.js +0 -84
- package/dist/tools/xulux-templates.js.map +0 -1
- package/dist/utils/cache.d.ts +0 -5
- package/dist/utils/cache.d.ts.map +0 -1
- package/dist/utils/cache.js +0 -18
- package/dist/utils/cache.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -10
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -20
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/mcp-format.d.ts +0 -11
- package/dist/utils/mcp-format.d.ts.map +0 -1
- package/dist/utils/mcp-format.js +0 -14
- package/dist/utils/mcp-format.js.map +0 -1
- package/dist/utils/mdx.d.ts +0 -12
- package/dist/utils/mdx.d.ts.map +0 -1
- package/dist/utils/mdx.js +0 -45
- package/dist/utils/mdx.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -12
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -93
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/search.d.ts +0 -10
- package/dist/utils/search.d.ts.map +0 -1
- package/dist/utils/search.js +0 -97
- package/dist/utils/search.js.map +0 -1
- package/dist/utils/security.d.ts +0 -5
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -22
- package/dist/utils/security.js.map +0 -1
- package/dist/xulux/catalog-client.d.ts +0 -14
- package/dist/xulux/catalog-client.d.ts.map +0 -1
- package/dist/xulux/catalog-client.js +0 -67
- package/dist/xulux/catalog-client.js.map +0 -1
- package/dist/xulux/fallback-catalog.d.ts +0 -7
- package/dist/xulux/fallback-catalog.d.ts.map +0 -1
- package/dist/xulux/fallback-catalog.js +0 -47
- package/dist/xulux/fallback-catalog.js.map +0 -1
- package/dist/xulux/fetch-sandbox.d.ts +0 -5
- package/dist/xulux/fetch-sandbox.d.ts.map +0 -1
- package/dist/xulux/fetch-sandbox.js +0 -40
- package/dist/xulux/fetch-sandbox.js.map +0 -1
- package/dist/xulux/template-service.d.ts +0 -84
- package/dist/xulux/template-service.d.ts.map +0 -1
- package/dist/xulux/template-service.js +0 -223
- package/dist/xulux/template-service.js.map +0 -1
- package/dist/xulux/types.d.ts +0 -55
- package/dist/xulux/types.d.ts.map +0 -1
- package/dist/xulux/types.js +0 -6
- package/dist/xulux/types.js.map +0 -1
- package/src/constants.ts +0 -24
- package/src/prepare-docs/code-examples.ts +0 -158
- package/src/prepare-docs/copy-raw.ts +0 -50
- package/src/prepare-docs/prepare.ts +0 -24
- package/src/prompts/xulux-playground.ts +0 -36
- package/src/tools/docs.ts +0 -255
- package/src/tools/examples.ts +0 -114
- package/src/tools/resources.ts +0 -111
- package/src/tools/search.ts +0 -46
- package/src/tools/tests/completions.test.ts +0 -60
- package/src/tools/tests/directory-size-cap.test.ts +0 -50
- package/src/tools/tests/docs.test.ts +0 -144
- package/src/tools/tests/examples.test.ts +0 -94
- package/src/tools/tests/integration.test.ts +0 -45
- package/src/tools/tests/json-parsing.test.ts +0 -23
- package/src/tools/tests/listings-cache.test.ts +0 -19
- package/src/tools/tests/mcp-protocol.test.ts +0 -216
- package/src/tools/tests/mcp-test-client.ts +0 -111
- package/src/tools/tests/path-traversal.test.ts +0 -81
- package/src/tools/tests/resources.test.ts +0 -133
- package/src/tools/tests/search.test.ts +0 -37
- package/src/tools/tests/test-setup.ts +0 -50
- package/src/tools/tests/xulux-templates.test.ts +0 -262
- package/src/tools/xulux-templates.ts +0 -141
- package/src/utils/cache.ts +0 -20
- package/src/utils/logger.ts +0 -20
- package/src/utils/mcp-format.ts +0 -14
- package/src/utils/mdx.ts +0 -59
- package/src/utils/paths.ts +0 -139
- package/src/utils/search.ts +0 -131
- package/src/utils/security.ts +0 -52
- package/src/utils/tests/cache.test.ts +0 -51
- package/src/utils/tests/mcp-format.test.ts +0 -22
- package/src/utils/tests/security.test.ts +0 -119
- package/src/xulux/catalog-client.ts +0 -105
- package/src/xulux/fallback-catalog.ts +0 -63
- package/src/xulux/fetch-sandbox.ts +0 -56
- package/src/xulux/template-service.ts +0 -406
- 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>
|