@assistant-ui/mcp-docs-server 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +8 -12
- 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 -675
- package/.docs/organized/code-examples/with-ag-ui.md +0 -553
- package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -466
- package/.docs/organized/code-examples/with-artifacts.md +0 -815
- package/.docs/organized/code-examples/with-assistant-transport.md +0 -576
- package/.docs/organized/code-examples/with-browser-extension.md +0 -371
- package/.docs/organized/code-examples/with-chain-of-thought.md +0 -962
- package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
- package/.docs/organized/code-examples/with-cloud.md +0 -439
- package/.docs/organized/code-examples/with-custom-thread-list.md +0 -569
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -527
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -697
- package/.docs/organized/code-examples/with-eve.md +0 -405
- package/.docs/organized/code-examples/with-expo.md +0 -2246
- package/.docs/organized/code-examples/with-external-store.md +0 -421
- package/.docs/organized/code-examples/with-ffmpeg.md +0 -829
- package/.docs/organized/code-examples/with-generative-ui.md +0 -1810
- package/.docs/organized/code-examples/with-google-adk.md +0 -368
- package/.docs/organized/code-examples/with-heat-graph.md +0 -304
- package/.docs/organized/code-examples/with-image-generation.md +0 -463
- package/.docs/organized/code-examples/with-interactables.md +0 -733
- package/.docs/organized/code-examples/with-langchain.md +0 -446
- package/.docs/organized/code-examples/with-langgraph.md +0 -855
- package/.docs/organized/code-examples/with-livekit.md +0 -643
- package/.docs/organized/code-examples/with-mcp.md +0 -782
- 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 -450
- package/.docs/organized/code-examples/with-pi.md +0 -2084
- package/.docs/organized/code-examples/with-react-hook-form.md +0 -727
- package/.docs/organized/code-examples/with-react-ink-web.md +0 -740
- package/.docs/organized/code-examples/with-react-ink.md +0 -473
- package/.docs/organized/code-examples/with-react-router.md +0 -936
- package/.docs/organized/code-examples/with-resumable-stream.md +0 -668
- 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 -812
- package/.docs/organized/code-examples/with-tap-runtime.md +0 -813
- package/.docs/organized/code-examples/with-virtualized-thread.md +0 -681
- package/.docs/organized/code-examples/with-vue.md +0 -408
- package/.docs/raw/docs/(getting-started)/architecture.mdx +0 -146
- package/.docs/raw/docs/(getting-started)/base-ui.mdx +0 -39
- package/.docs/raw/docs/(getting-started)/cli.mdx +0 -542
- package/.docs/raw/docs/(getting-started)/devtools.mdx +0 -79
- package/.docs/raw/docs/(getting-started)/index.mdx +0 -23
- package/.docs/raw/docs/(getting-started)/installation.mdx +0 -483
- package/.docs/raw/docs/(getting-started)/llm.mdx +0 -211
- package/.docs/raw/docs/(getting-started)/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 -26
- 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 -57
- 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/ai-sdk.mdx +0 -200
- 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 -118
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
- 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 -637
- 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 -152
- 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 -604
- 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 -411
- 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 -215
- 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 -237
- 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.mdx +0 -283
- 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 -976
- 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 -267
- 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 -731
- 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 -363
- 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 -1020
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
- 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 -279
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -247
- package/.docs/raw/docs/ui/context-display.mdx +0 -148
- package/.docs/raw/docs/ui/directive-text.mdx +0 -114
- 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 -103
- 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/part-grouping.mdx +0 -614
- package/.docs/raw/docs/ui/quote.mdx +0 -211
- package/.docs/raw/docs/ui/reasoning.mdx +0 -214
- package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
- package/.docs/raw/docs/ui/sources.mdx +0 -186
- package/.docs/raw/docs/ui/streamdown.mdx +0 -392
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
- package/.docs/raw/docs/ui/thread-list.mdx +0 -411
- package/.docs/raw/docs/ui/thread.mdx +0 -559
- package/.docs/raw/docs/ui/tool-fallback.mdx +0 -141
- 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 -112
- 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 -147
- 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 -84
- 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 -325
- 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 -150
- 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 -64
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Slash Commands
|
|
3
|
-
description: Trigger predefined actions in your AI chat by typing / — slash command palette with popover, search, and action handlers in React via assistant-ui.
|
|
4
|
-
platforms: ["react"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Slash commands let users type `/` in the composer to open a popover, browse available commands, and execute one. Unlike [mentions](/docs/guides/mentions) (which only insert a directive into the message), slash commands additionally fire an **action callback** at the moment of selection.
|
|
8
|
-
|
|
9
|
-
## How It Works
|
|
10
|
-
|
|
11
|
-
```mermaid
|
|
12
|
-
flowchart LR
|
|
13
|
-
type["User types /"] --> trigger["Trigger detected"] --> adapter["Adapter provides<br/>commands"] --> select["User selects command<br/>from popover"] --> callback["Callback fired"] --> chip["Directive chip left in composer<br/>(or removed if removeOnExecute)"]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
The slash command system is built on the same [trigger popover architecture](#trigger-popover-architecture) as mentions. A slash command declares its behavior with a `<TriggerPopover.Action>` sub-primitive whose `onExecute` callback fires when an item is chosen.
|
|
17
|
-
|
|
18
|
-
By default `Action` leaves a directive chip in the composer — giving the user (and the LLM) an audit trail of which commands were invoked. Pass `removeOnExecute` to strip the `/command` text entirely.
|
|
19
|
-
|
|
20
|
-
## Quick Start
|
|
21
|
-
|
|
22
|
-
### 1. Define Commands with `unstable_useSlashCommandAdapter`
|
|
23
|
-
|
|
24
|
-
Declare commands (data + `execute` bundled together, like a toolkit entry). The hook returns `{ adapter, action }` — wire both into a single `<TriggerPopover>`:
|
|
25
|
-
|
|
26
|
-
```tsx
|
|
27
|
-
import {
|
|
28
|
-
ComposerPrimitive,
|
|
29
|
-
unstable_useSlashCommandAdapter,
|
|
30
|
-
type Unstable_SlashCommand,
|
|
31
|
-
} from "@assistant-ui/react";
|
|
32
|
-
|
|
33
|
-
const SLASH_COMMANDS: readonly Unstable_SlashCommand[] = [
|
|
34
|
-
{
|
|
35
|
-
id: "summarize",
|
|
36
|
-
description: "Summarize the conversation",
|
|
37
|
-
execute: () => console.log("Summarize!"),
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
id: "translate",
|
|
41
|
-
description: "Translate text to another language",
|
|
42
|
-
execute: () => console.log("Translate!"),
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: "help",
|
|
46
|
-
description: "List all available commands",
|
|
47
|
-
execute: () => console.log("Help!"),
|
|
48
|
-
},
|
|
49
|
-
];
|
|
50
|
-
|
|
51
|
-
function MyComposer() {
|
|
52
|
-
const slash = unstable_useSlashCommandAdapter({ commands: SLASH_COMMANDS });
|
|
53
|
-
|
|
54
|
-
return (
|
|
55
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
56
|
-
<ComposerPrimitive.Root>
|
|
57
|
-
<ComposerPrimitive.Input placeholder="Type / for commands..." />
|
|
58
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
59
|
-
|
|
60
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
61
|
-
char="/"
|
|
62
|
-
adapter={slash.adapter}
|
|
63
|
-
className="popover"
|
|
64
|
-
>
|
|
65
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Action {...slash.action} />
|
|
66
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
67
|
-
{(items) =>
|
|
68
|
-
items.map((item, index) => (
|
|
69
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem
|
|
70
|
-
key={item.id}
|
|
71
|
-
item={item}
|
|
72
|
-
index={index}
|
|
73
|
-
className="popover-item"
|
|
74
|
-
>
|
|
75
|
-
<strong>{item.label}</strong>
|
|
76
|
-
{item.description && <span>{item.description}</span>}
|
|
77
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
78
|
-
))
|
|
79
|
-
}
|
|
80
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
81
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
82
|
-
</ComposerPrimitive.Root>
|
|
83
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
The label defaults to `/${id}`; override via `label` on the command. Icons are strings that your `iconMap` on the picker UI resolves to components (see [ComposerTriggerPopover](/docs/ui/composer-trigger-popover)).
|
|
89
|
-
|
|
90
|
-
### `unstable_useSlashCommandAdapter` options
|
|
91
|
-
|
|
92
|
-
| Option | Type | Default | Description |
|
|
93
|
-
| --- | --- | --- | --- |
|
|
94
|
-
| `commands` | `Unstable_SlashCommand[]` | — | Command definitions — each has `id`, optional `label`, `description`, `icon`, and an `execute` callback (required) |
|
|
95
|
-
| `removeOnExecute` | `boolean` | `false` | When `true`, strips the trigger text from the composer after executing instead of leaving a directive chip |
|
|
96
|
-
| `iconMap` | `Record<string, IconComponent>` | — | Maps `metadata.icon` / category `id` strings to React icon components; forwarded to `ComposerTriggerPopover` |
|
|
97
|
-
| `fallbackIcon` | `IconComponent` | — | Fallback when no `iconMap` entry matches; forwarded to `ComposerTriggerPopover` |
|
|
98
|
-
|
|
99
|
-
The hook returns `{ adapter, action, iconMap?, fallbackIcon? }` — spread directly into `<ComposerTriggerPopover char="/" {...slash} />` for one-line wiring.
|
|
100
|
-
|
|
101
|
-
### 2. Controlling the Chip
|
|
102
|
-
|
|
103
|
-
By default, a selected `/summarize` is converted into a directive chip (`:command[/summarize]{name=summarize}`) in the composer text and the command's `execute` fires. This keeps an audit trail of which commands were invoked.
|
|
104
|
-
|
|
105
|
-
To strip the trigger text entirely — useful for purely transient commands — pass `removeOnExecute` on the hook options:
|
|
106
|
-
|
|
107
|
-
```tsx
|
|
108
|
-
const slash = unstable_useSlashCommandAdapter({
|
|
109
|
-
commands: SLASH_COMMANDS,
|
|
110
|
-
removeOnExecute: true,
|
|
111
|
-
});
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### 3. Custom Dispatch
|
|
115
|
-
|
|
116
|
-
For side effects on top of `execute` (logging, analytics, intercept), wrap the hook's `onExecute`:
|
|
117
|
-
|
|
118
|
-
```tsx
|
|
119
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Action
|
|
120
|
-
onExecute={(item) => {
|
|
121
|
-
logCommandUsed(item.id);
|
|
122
|
-
slash.action.onExecute(item);
|
|
123
|
-
}}
|
|
124
|
-
/>
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Categorized Commands
|
|
128
|
-
|
|
129
|
-
For **categorized navigation** (drill-down into groups), return categories from `categories()` and items from `categoryItems()`. The popover shows categories first, then items within the selected category:
|
|
130
|
-
|
|
131
|
-
```ts
|
|
132
|
-
import type { Unstable_TriggerAdapter } from "@assistant-ui/core";
|
|
133
|
-
|
|
134
|
-
const adapter: Unstable_TriggerAdapter = {
|
|
135
|
-
categories() {
|
|
136
|
-
return [
|
|
137
|
-
{ id: "actions", label: "Actions" },
|
|
138
|
-
{ id: "export", label: "Export" },
|
|
139
|
-
];
|
|
140
|
-
},
|
|
141
|
-
|
|
142
|
-
categoryItems(categoryId) {
|
|
143
|
-
if (categoryId === "actions") {
|
|
144
|
-
return [
|
|
145
|
-
{ id: "summarize", type: "command", label: "/summarize", description: "Summarize the conversation" },
|
|
146
|
-
{ id: "translate", type: "command", label: "/translate", description: "Translate text" },
|
|
147
|
-
];
|
|
148
|
-
}
|
|
149
|
-
if (categoryId === "export") {
|
|
150
|
-
return [
|
|
151
|
-
{ id: "pdf", type: "command", label: "/export pdf", description: "Export as PDF" },
|
|
152
|
-
{ id: "markdown", type: "command", label: "/export md", description: "Export as Markdown" },
|
|
153
|
-
];
|
|
154
|
-
}
|
|
155
|
-
return [];
|
|
156
|
-
},
|
|
157
|
-
|
|
158
|
-
// Optional — enables search across all categories
|
|
159
|
-
search(query) {
|
|
160
|
-
const lower = query.toLowerCase();
|
|
161
|
-
const all = [...this.categoryItems("actions"), ...this.categoryItems("export")];
|
|
162
|
-
return all.filter(
|
|
163
|
-
(item) => item.label.toLowerCase().includes(lower) || item.description?.toLowerCase().includes(lower),
|
|
164
|
-
);
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
When using a categorized adapter, add `TriggerPopoverCategories` to your popover UI:
|
|
170
|
-
|
|
171
|
-
```tsx
|
|
172
|
-
const commandHandlers: Record<string, () => void> = {
|
|
173
|
-
summarize: () => {/* ... */},
|
|
174
|
-
pdf: () => {/* ... */},
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
178
|
-
char="/"
|
|
179
|
-
adapter={adapter}
|
|
180
|
-
>
|
|
181
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Action
|
|
182
|
-
formatter={unstable_defaultDirectiveFormatter}
|
|
183
|
-
onExecute={(item) => commandHandlers[item.id]?.()}
|
|
184
|
-
/>
|
|
185
|
-
<ComposerPrimitive.Unstable_TriggerPopoverBack>← Back</ComposerPrimitive.Unstable_TriggerPopoverBack>
|
|
186
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
187
|
-
{(categories) => categories.map((cat) => (
|
|
188
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategoryItem key={cat.id} categoryId={cat.id}>
|
|
189
|
-
{cat.label}
|
|
190
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategoryItem>
|
|
191
|
-
))}
|
|
192
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
193
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
194
|
-
{(items) => items.map((item, index) => (
|
|
195
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem key={item.id} item={item} index={index}>
|
|
196
|
-
{item.label}
|
|
197
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
198
|
-
))}
|
|
199
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
200
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
## Combining with Mentions
|
|
204
|
-
|
|
205
|
-
Slash commands and mentions live under the same `TriggerPopoverRoot`. Declare one `TriggerPopover` per trigger — each with its own behavior sub-primitive:
|
|
206
|
-
|
|
207
|
-
```tsx
|
|
208
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
209
|
-
<ComposerPrimitive.Root>
|
|
210
|
-
<ComposerPrimitive.Input placeholder="Type @ to mention, / for commands..." />
|
|
211
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
212
|
-
|
|
213
|
-
{/* @ mention popover */}
|
|
214
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
215
|
-
char="@"
|
|
216
|
-
adapter={mention.adapter}
|
|
217
|
-
>
|
|
218
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive {...mention.directive} />
|
|
219
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
220
|
-
{(items) => items.map((item) => (
|
|
221
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem key={item.id} item={item}>
|
|
222
|
-
{item.label}
|
|
223
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
224
|
-
))}
|
|
225
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
226
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
227
|
-
|
|
228
|
-
{/* / slash command popover */}
|
|
229
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
230
|
-
char="/"
|
|
231
|
-
adapter={slash.adapter}
|
|
232
|
-
>
|
|
233
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Action {...slash.action} />
|
|
234
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
235
|
-
{(items) => items.map((item, index) => (
|
|
236
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem key={item.id} item={item} index={index}>
|
|
237
|
-
{item.label}
|
|
238
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
239
|
-
))}
|
|
240
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
241
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
242
|
-
</ComposerPrimitive.Root>
|
|
243
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
Each `TriggerPopover` is its own scope — the `@` popover and the `/` popover read state from their own declaration and never collide. Keyboard events route to whichever popover is currently active.
|
|
247
|
-
|
|
248
|
-
## Commands with Arguments
|
|
249
|
-
|
|
250
|
-
Some commands accept inline arguments typed after the command word — for example `/translate en` or `/ask what is TypeScript`. Because the adapter's `search` method receives the full text after `/`, you can split on the first space to separate the command from its arguments:
|
|
251
|
-
|
|
252
|
-
```tsx
|
|
253
|
-
const SLASH_COMMANDS: readonly Unstable_SlashCommand[] = [
|
|
254
|
-
{
|
|
255
|
-
id: "translate",
|
|
256
|
-
description: "Translate to a language, e.g. /translate en",
|
|
257
|
-
execute: () => {/* arguments extracted separately, see below */},
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
id: "ask",
|
|
261
|
-
description: "Ask about a topic, e.g. /ask what is TypeScript",
|
|
262
|
-
execute: () => {/* arguments extracted separately, see below */},
|
|
263
|
-
},
|
|
264
|
-
];
|
|
265
|
-
|
|
266
|
-
function MyComposer() {
|
|
267
|
-
const composerRef = useRef<HTMLTextAreaElement>(null);
|
|
268
|
-
const slash = unstable_useSlashCommandAdapter({
|
|
269
|
-
commands: SLASH_COMMANDS.map((cmd) => ({
|
|
270
|
-
...cmd,
|
|
271
|
-
execute: () => {
|
|
272
|
-
// Read the full composer text to extract arguments
|
|
273
|
-
const raw = composerRef.current?.value ?? "";
|
|
274
|
-
// Match "/<id> <args>" at start of input
|
|
275
|
-
const match = raw.match(new RegExp(`^\\/${cmd.id}\\s+(.*)`));
|
|
276
|
-
const args = match?.[1]?.trim() ?? "";
|
|
277
|
-
handleCommand(cmd.id, args);
|
|
278
|
-
},
|
|
279
|
-
})),
|
|
280
|
-
removeOnExecute: true,
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
return (
|
|
284
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
285
|
-
<ComposerPrimitive.Root>
|
|
286
|
-
<ComposerPrimitive.Input ref={composerRef} placeholder="Type / for commands..." />
|
|
287
|
-
<ComposerPrimitive.Unstable_TriggerPopover char="/" adapter={slash.adapter}>
|
|
288
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Action {...slash.action} />
|
|
289
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
290
|
-
{(items) => items.map((item, i) => (
|
|
291
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem key={item.id} item={item} index={i}>
|
|
292
|
-
<strong>{item.label}</strong>
|
|
293
|
-
{item.description && <span>{item.description}</span>}
|
|
294
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
295
|
-
))}
|
|
296
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
297
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
298
|
-
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
299
|
-
</ComposerPrimitive.Root>
|
|
300
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
301
|
-
);
|
|
302
|
-
}
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
`removeOnExecute: true` strips the `/translate en` text from the composer so the argument is consumed by the handler rather than sent to the LLM.
|
|
306
|
-
|
|
307
|
-
## Async Command Loading
|
|
308
|
-
|
|
309
|
-
The adapter interface is synchronous, but the command list can come from any async source. Load commands into state (or a query cache) and pass the current snapshot to the hook. Because `unstable_useSlashCommandAdapter` re-runs on every render, the adapter always reflects the latest list.
|
|
310
|
-
|
|
311
|
-
**With React state:**
|
|
312
|
-
|
|
313
|
-
```tsx
|
|
314
|
-
function MyComposer() {
|
|
315
|
-
const [commands, setCommands] = useState<Unstable_SlashCommand[]>([]);
|
|
316
|
-
|
|
317
|
-
useEffect(() => {
|
|
318
|
-
fetchAvailableCommands().then(setCommands);
|
|
319
|
-
}, []);
|
|
320
|
-
|
|
321
|
-
const slash = unstable_useSlashCommandAdapter({ commands });
|
|
322
|
-
|
|
323
|
-
return (/* ... */);
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
**With React Query:**
|
|
328
|
-
|
|
329
|
-
```tsx
|
|
330
|
-
function MyComposer() {
|
|
331
|
-
const { data: commands = [] } = useQuery({
|
|
332
|
-
queryKey: ["slash-commands"],
|
|
333
|
-
queryFn: fetchAvailableCommands,
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
const slash = unstable_useSlashCommandAdapter({ commands });
|
|
337
|
-
|
|
338
|
-
return (/* ... */);
|
|
339
|
-
}
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
## Keyboard Navigation
|
|
343
|
-
|
|
344
|
-
See [ComposerTriggerPopover keyboard navigation](/docs/ui/composer-trigger-popover#keyboard-navigation) for the full key bindings table.
|
|
345
|
-
|
|
346
|
-
## Trigger Popover Architecture
|
|
347
|
-
|
|
348
|
-
Both mentions and slash commands are built on a generic trigger popover system where each `Unstable_TriggerPopover` declares one trigger character, an adapter, and exactly one behavior sub-primitive (`Directive` or `Action`). Multiple triggers coexist under a single `Unstable_TriggerPopoverRoot`. See the [Composer Primitives](/docs/primitives/composer) reference for the complete API.
|
|
349
|
-
|
|
350
|
-
## Primitives Reference
|
|
351
|
-
|
|
352
|
-
See the [Composer Primitives](/docs/primitives/composer) reference for the full list of trigger popover primitives and their props.
|
|
353
|
-
|
|
354
|
-
## Related
|
|
355
|
-
|
|
356
|
-
- [Mentions Guide](/docs/guides/mentions) — `@`-mention system built on the same architecture
|
|
357
|
-
- [Suggestions Guide](/docs/guides/suggestions) — static follow-up prompts (different from slash commands)
|
|
358
|
-
- [Composer Primitives](/docs/primitives/composer) — underlying composer primitives
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Text-to-Speech for Chat
|
|
3
|
-
description: Read AI chat messages aloud with the Web Speech API or a custom TTS adapter. Speech synthesis for React chat UIs, integrated with assistant-ui.
|
|
4
|
-
platforms: ["react"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
import { SpeechSample } from "@/components/pages/docs/samples/speech";
|
|
8
|
-
|
|
9
|
-
assistant-ui supports text-to-speech via the `SpeechSynthesisAdapter` interface. When a speech adapter is configured, users can trigger playback for any assistant message.
|
|
10
|
-
|
|
11
|
-
Speech is the read-aloud mode: one message at a time, text to audio. For a live duplex conversation, see [Realtime Voice](/docs/guides/voice). For push-to-talk input into the composer, see [Dictation](/docs/guides/dictation).
|
|
12
|
-
|
|
13
|
-
<SpeechSample />
|
|
14
|
-
|
|
15
|
-
## SpeechSynthesisAdapter
|
|
16
|
-
|
|
17
|
-
The adapter has a single method. The type lives in `@assistant-ui/core` and is re-exported from `@assistant-ui/react`:
|
|
18
|
-
|
|
19
|
-
```tsx
|
|
20
|
-
import type { SpeechSynthesisAdapter } from "@assistant-ui/react";
|
|
21
|
-
|
|
22
|
-
type SpeechSynthesisAdapter = {
|
|
23
|
-
speak: (text: string) => SpeechSynthesisAdapter.Utterance;
|
|
24
|
-
};
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
`speak` receives the plain text of an assistant message and returns an `Utterance`:
|
|
28
|
-
|
|
29
|
-
```tsx
|
|
30
|
-
namespace SpeechSynthesisAdapter {
|
|
31
|
-
type Status =
|
|
32
|
-
| { type: "starting" | "running" }
|
|
33
|
-
| {
|
|
34
|
-
type: "ended";
|
|
35
|
-
reason: "finished" | "cancelled" | "error";
|
|
36
|
-
error?: unknown;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
type Utterance = {
|
|
40
|
-
status: Status;
|
|
41
|
-
cancel: () => void;
|
|
42
|
-
subscribe: (callback: () => void) => Unsubscribe;
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## WebSpeechSynthesisAdapter
|
|
48
|
-
|
|
49
|
-
The built-in adapter uses the browser's Web Speech API (`SpeechSynthesis` / `SpeechSynthesisUtterance`):
|
|
50
|
-
|
|
51
|
-
```tsx
|
|
52
|
-
import { WebSpeechSynthesisAdapter } from "@assistant-ui/react";
|
|
53
|
-
|
|
54
|
-
const runtime = useChatRuntime({
|
|
55
|
-
adapters: {
|
|
56
|
-
speech: new WebSpeechSynthesisAdapter(),
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
When a speech adapter is provided, `capabilities.speech` is set to `true` automatically.
|
|
62
|
-
|
|
63
|
-
## UI: ActionBarPrimitive.Speak
|
|
64
|
-
|
|
65
|
-
The default action bar does not include a speech button. Add `ActionBarPrimitive.Speak` and `ActionBarPrimitive.StopSpeaking` to your assistant message action bar:
|
|
66
|
-
|
|
67
|
-
```tsx
|
|
68
|
-
import { ActionBarPrimitive, AuiIf } from "@assistant-ui/react";
|
|
69
|
-
import { AudioLinesIcon, StopCircleIcon } from "lucide-react";
|
|
70
|
-
|
|
71
|
-
const AssistantActionBar = () => {
|
|
72
|
-
return (
|
|
73
|
-
<ActionBarPrimitive.Root>
|
|
74
|
-
<AuiIf condition={(s) => s.message.speech == null}>
|
|
75
|
-
<ActionBarPrimitive.Speak>
|
|
76
|
-
<AudioLinesIcon />
|
|
77
|
-
</ActionBarPrimitive.Speak>
|
|
78
|
-
</AuiIf>
|
|
79
|
-
<AuiIf condition={(s) => s.message.speech != null}>
|
|
80
|
-
<ActionBarPrimitive.StopSpeaking>
|
|
81
|
-
<StopCircleIcon />
|
|
82
|
-
</ActionBarPrimitive.StopSpeaking>
|
|
83
|
-
</AuiIf>
|
|
84
|
-
<ActionBarPrimitive.Copy />
|
|
85
|
-
</ActionBarPrimitive.Root>
|
|
86
|
-
);
|
|
87
|
-
};
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
`ActionBarPrimitive.Speak` is disabled when no speech adapter is configured. While playback is active, `message.speech` holds the current speech state so the UI can switch to `StopSpeaking`.
|
|
91
|
-
|
|
92
|
-
## Custom adapters
|
|
93
|
-
|
|
94
|
-
Implement `SpeechSynthesisAdapter` to call any external TTS provider. Fetch audio from your API, play it with `HTMLAudioElement`, and drive utterance status through `subscribe`:
|
|
95
|
-
|
|
96
|
-
```tsx title="lib/custom-tts-adapter.ts"
|
|
97
|
-
import type { SpeechSynthesisAdapter } from "@assistant-ui/react";
|
|
98
|
-
|
|
99
|
-
export class CustomTTSAdapter implements SpeechSynthesisAdapter {
|
|
100
|
-
constructor(private apiUrl: string) {}
|
|
101
|
-
|
|
102
|
-
speak(text: string): SpeechSynthesisAdapter.Utterance {
|
|
103
|
-
const subscribers = new Set<() => void>();
|
|
104
|
-
let status: SpeechSynthesisAdapter.Status = { type: "starting" };
|
|
105
|
-
let audio: HTMLAudioElement | null = null;
|
|
106
|
-
|
|
107
|
-
const notify = () => {
|
|
108
|
-
for (const cb of subscribers) cb();
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const finish = (
|
|
112
|
-
reason: "finished" | "cancelled" | "error",
|
|
113
|
-
error?: unknown,
|
|
114
|
-
) => {
|
|
115
|
-
if (status.type === "ended") return;
|
|
116
|
-
status = { type: "ended", reason, error };
|
|
117
|
-
notify();
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
fetch(this.apiUrl, {
|
|
121
|
-
method: "POST",
|
|
122
|
-
headers: { "Content-Type": "application/json" },
|
|
123
|
-
body: JSON.stringify({ text }),
|
|
124
|
-
})
|
|
125
|
-
.then((res) => res.blob())
|
|
126
|
-
.then((blob) => {
|
|
127
|
-
if (status.type === "ended") return;
|
|
128
|
-
audio = new Audio(URL.createObjectURL(blob));
|
|
129
|
-
status = { type: "running" };
|
|
130
|
-
notify();
|
|
131
|
-
audio.onended = () => finish("finished");
|
|
132
|
-
audio.onerror = (e) => finish("error", e);
|
|
133
|
-
audio.play().catch((err) => finish("error", err));
|
|
134
|
-
})
|
|
135
|
-
.catch((err) => finish("error", err));
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
get status() {
|
|
139
|
-
return status;
|
|
140
|
-
},
|
|
141
|
-
cancel: () => {
|
|
142
|
-
audio?.pause();
|
|
143
|
-
finish("cancelled");
|
|
144
|
-
},
|
|
145
|
-
subscribe: (cb) => {
|
|
146
|
-
subscribers.add(cb);
|
|
147
|
-
return () => subscribers.delete(cb);
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
Wire it on the same `adapters.speech` slot as the built-in adapter:
|
|
155
|
-
|
|
156
|
-
```tsx
|
|
157
|
-
import { CustomTTSAdapter } from "@/lib/custom-tts-adapter";
|
|
158
|
-
|
|
159
|
-
const runtime = useChatRuntime({
|
|
160
|
-
adapters: {
|
|
161
|
-
speech: new CustomTTSAdapter("/api/tts"),
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
Use this shape for any provider TTS (OpenAI, ElevenLabs, cloud speech APIs, and so on). Keep the server route responsible for API keys; the adapter only needs a URL that returns audio bytes.
|
|
167
|
-
|
|
168
|
-
## Related guides
|
|
169
|
-
|
|
170
|
-
- [Realtime Voice](/docs/guides/voice): duplex voice sessions with `RealtimeVoiceAdapter`, `createVoiceSession`, and the voice UI component.
|
|
171
|
-
- [Dictation](/docs/guides/dictation): speech-to-text into the composer with `DictationAdapter` and `ComposerPrimitive.Dictate`.
|
|
172
|
-
- [Speech and Dictation API reference](/docs/api-reference/voice/speech-dictation): generated type docs.
|