@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,575 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Mentions in Chat
|
|
3
|
-
description: Let users @-mention tools or custom items in the AI chat composer to guide the LLM. Mention picker built into assistant-ui's React composer.
|
|
4
|
-
platforms: ["react"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Mentions let users type `@` in the composer to open a popover picker, select an item (e.g. a tool), and insert a directive into the message text. The LLM can then use the directive as a hint.
|
|
8
|
-
|
|
9
|
-
## How It Works
|
|
10
|
-
|
|
11
|
-
```mermaid
|
|
12
|
-
flowchart LR
|
|
13
|
-
type["User types @"] --> trigger["Trigger detected"] --> adapter["Adapter provides<br/>categories / items"] --> select["User selects item<br/>from popover"] --> insert["Directive inserted"] --> sent["Message sent with<br/>:tool[Label]{name=id} text"]
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
The mention system has three layers:
|
|
17
|
-
|
|
18
|
-
1. **Trigger detection** — the composer input watches for a trigger character (`@` by default) and extracts the query
|
|
19
|
-
2. **Adapter** — provides the categories and items to display in the popover (e.g. registered tools)
|
|
20
|
-
3. **Formatter** — serializes a selected item into directive text (`:type[label]{name=id}`) and parses it back for rendering
|
|
21
|
-
|
|
22
|
-
Under the hood, mentions are one kind of [trigger popover](/docs/guides/slash-commands#trigger-popover-architecture). A mention declares its behavior with a `<TriggerPopover.Directive>` sub-primitive, which writes the formatter-serialized directive into the composer on selection.
|
|
23
|
-
|
|
24
|
-
## Quick Start
|
|
25
|
-
|
|
26
|
-
The fastest path is the pre-built [Mention UI components](/docs/ui/composer-trigger-popover), which wire everything together with two shadcn components — the popover picker and the message-side chip renderer:
|
|
27
|
-
|
|
28
|
-
<InstallCommand shadcn={["composer-trigger-popover", "directive-text"]} />
|
|
29
|
-
|
|
30
|
-
See the [Composer Trigger Popover](/docs/ui/composer-trigger-popover) and [Directive Text](/docs/ui/directive-text) guides for setup steps.
|
|
31
|
-
|
|
32
|
-
The rest of this guide covers the underlying concepts and customization points.
|
|
33
|
-
|
|
34
|
-
## Trigger Adapter
|
|
35
|
-
|
|
36
|
-
A `Unstable_TriggerAdapter` provides the data for the popover. All methods are **synchronous** — use external state management (React Query, SWR, local state) for async data, then expose loaded results through the adapter.
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
import type { Unstable_TriggerAdapter } from "@assistant-ui/core";
|
|
40
|
-
|
|
41
|
-
const myAdapter: Unstable_TriggerAdapter = {
|
|
42
|
-
categories() {
|
|
43
|
-
return [
|
|
44
|
-
{ id: "tools", label: "Tools" },
|
|
45
|
-
{ id: "users", label: "Users" },
|
|
46
|
-
];
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
categoryItems(categoryId) {
|
|
50
|
-
if (categoryId === "tools") {
|
|
51
|
-
return [
|
|
52
|
-
{ id: "search", type: "tool", label: "Search" },
|
|
53
|
-
{ id: "calculator", type: "tool", label: "Calculator" },
|
|
54
|
-
];
|
|
55
|
-
}
|
|
56
|
-
if (categoryId === "users") {
|
|
57
|
-
return [
|
|
58
|
-
{ id: "alice", type: "user", label: "Alice" },
|
|
59
|
-
{ id: "bob", type: "user", label: "Bob" },
|
|
60
|
-
];
|
|
61
|
-
}
|
|
62
|
-
return [];
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
// Optional — global search across all categories
|
|
66
|
-
search(query) {
|
|
67
|
-
const lower = query.toLowerCase();
|
|
68
|
-
const all = [
|
|
69
|
-
...this.categoryItems("tools"),
|
|
70
|
-
...this.categoryItems("users"),
|
|
71
|
-
];
|
|
72
|
-
return all.filter(
|
|
73
|
-
(item) =>
|
|
74
|
-
item.label.toLowerCase().includes(lower) ||
|
|
75
|
-
item.id.toLowerCase().includes(lower),
|
|
76
|
-
);
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Async Mention Search
|
|
82
|
-
|
|
83
|
-
The built-in `unstable_useLiveCompletionAdapter` wraps an async fetcher with debouncing, stale-request cancellation (results for an outdated query are dropped), and a single-entry cache. Its `search` returns the last results synchronously and schedules a debounced fetch when the query changes; when results arrive the returned `adapter` re-creates, which re-runs the popover lookup so the fresh items render. It also reports `isLoading`, which you pass to the popover to show a loading state.
|
|
84
|
-
|
|
85
|
-
When the fetcher reads from an account- or workspace-specific source, pass that source ID as `cacheKey`. Changing the key clears cached results and cancels any pending result from the previous source.
|
|
86
|
-
|
|
87
|
-
```tsx
|
|
88
|
-
import {
|
|
89
|
-
unstable_useLiveCompletionAdapter,
|
|
90
|
-
unstable_defaultDirectiveFormatter,
|
|
91
|
-
} from "@assistant-ui/react";
|
|
92
|
-
import { ComposerTriggerPopover } from "@/components/assistant-ui/composer-trigger-popover";
|
|
93
|
-
|
|
94
|
-
function MentionPopover() {
|
|
95
|
-
const mentions = unstable_useLiveCompletionAdapter({
|
|
96
|
-
fetcher: async (query) => {
|
|
97
|
-
const users = await fetchUsers(query);
|
|
98
|
-
return users.map((u) => ({ id: u.id, type: "user", label: u.name }));
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
return (
|
|
103
|
-
<ComposerTriggerPopover
|
|
104
|
-
char="@"
|
|
105
|
-
adapter={mentions.adapter}
|
|
106
|
-
isLoading={mentions.isLoading}
|
|
107
|
-
directive={{ formatter: unstable_defaultDirectiveFormatter }}
|
|
108
|
-
/>
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
The adapter interface is itself synchronous, so you can also wire async data by hand when you need a custom cache, no debounce, or an existing query client. Load results into React state (or a query cache) and read the current snapshot inside the adapter methods. The adapter re-creates on each render, so the popover always sees the latest results.
|
|
114
|
-
|
|
115
|
-
**With React state and `useEffect`:**
|
|
116
|
-
|
|
117
|
-
```tsx
|
|
118
|
-
import { useState, useEffect, useMemo } from "react";
|
|
119
|
-
import type { Unstable_TriggerAdapter } from "@assistant-ui/core";
|
|
120
|
-
|
|
121
|
-
function useUserMentionAdapter(query: string) {
|
|
122
|
-
const [users, setUsers] = useState<{ id: string; name: string }[]>([]);
|
|
123
|
-
|
|
124
|
-
useEffect(() => {
|
|
125
|
-
if (!query) return;
|
|
126
|
-
let cancelled = false;
|
|
127
|
-
fetchUsers(query).then((results) => {
|
|
128
|
-
if (!cancelled) setUsers(results);
|
|
129
|
-
});
|
|
130
|
-
return () => { cancelled = true; };
|
|
131
|
-
}, [query]);
|
|
132
|
-
|
|
133
|
-
const adapter: Unstable_TriggerAdapter = useMemo(() => ({
|
|
134
|
-
categories: () => [],
|
|
135
|
-
categoryItems: () => [],
|
|
136
|
-
search: () =>
|
|
137
|
-
users.map((u) => ({ id: u.id, type: "user", label: u.name })),
|
|
138
|
-
}), [users]);
|
|
139
|
-
|
|
140
|
-
return adapter;
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
`query` here is the text the user typed after `@`. You can read it from `unstable_useTriggerPopoverScopeContext` if you need it inside the component tree, or pass it as state from a controlled input.
|
|
145
|
-
|
|
146
|
-
**With React Query:**
|
|
147
|
-
|
|
148
|
-
```tsx
|
|
149
|
-
import { useQuery } from "@tanstack/react-query";
|
|
150
|
-
import type { Unstable_TriggerAdapter } from "@assistant-ui/core";
|
|
151
|
-
|
|
152
|
-
function useMentionAdapter(query: string): Unstable_TriggerAdapter {
|
|
153
|
-
const { data = [] } = useQuery({
|
|
154
|
-
queryKey: ["mention-search", query],
|
|
155
|
-
queryFn: () => fetchUsers(query),
|
|
156
|
-
enabled: query.length > 0,
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
return useMemo(() => ({
|
|
160
|
-
categories: () => [],
|
|
161
|
-
categoryItems: () => [],
|
|
162
|
-
search: () =>
|
|
163
|
-
data.map((u) => ({ id: u.id, type: "user", label: u.name })),
|
|
164
|
-
}), [data]);
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
Pass the adapter to `TriggerPopover` and declare a `Directive` sub-primitive to bind the insertion behavior:
|
|
169
|
-
|
|
170
|
-
```tsx
|
|
171
|
-
import { ComposerPrimitive } from "@assistant-ui/react";
|
|
172
|
-
import { unstable_defaultDirectiveFormatter } from "@assistant-ui/react";
|
|
173
|
-
|
|
174
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
175
|
-
<ComposerPrimitive.Root>
|
|
176
|
-
<ComposerPrimitive.Input placeholder="Type @ to mention..." />
|
|
177
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
178
|
-
char="@"
|
|
179
|
-
adapter={myAdapter}
|
|
180
|
-
>
|
|
181
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive
|
|
182
|
-
formatter={unstable_defaultDirectiveFormatter}
|
|
183
|
-
/>
|
|
184
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
185
|
-
{(categories) =>
|
|
186
|
-
categories.map((cat) => (
|
|
187
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategoryItem
|
|
188
|
-
key={cat.id}
|
|
189
|
-
categoryId={cat.id}
|
|
190
|
-
>
|
|
191
|
-
{cat.label}
|
|
192
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategoryItem>
|
|
193
|
-
))
|
|
194
|
-
}
|
|
195
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
196
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
197
|
-
{(items) =>
|
|
198
|
-
items.map((item) => (
|
|
199
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem
|
|
200
|
-
key={item.id}
|
|
201
|
-
item={item}
|
|
202
|
-
>
|
|
203
|
-
{item.label}
|
|
204
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
205
|
-
))
|
|
206
|
-
}
|
|
207
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
208
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
209
|
-
</ComposerPrimitive.Root>
|
|
210
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
Exactly one behavior sub-primitive (`Directive` or `Action`) is allowed per `TriggerPopover`. The parent reads the registered behavior and wires the selection machinery.
|
|
214
|
-
|
|
215
|
-
### Built-in Mention Adapter
|
|
216
|
-
|
|
217
|
-
`unstable_useMentionAdapter` covers the common cases: mention registered tools, add your own items, mix tools with custom items, or show multi-category drill-down.
|
|
218
|
-
|
|
219
|
-
**Tools from model context (default):**
|
|
220
|
-
|
|
221
|
-
```tsx
|
|
222
|
-
import { unstable_useMentionAdapter } from "@assistant-ui/react";
|
|
223
|
-
|
|
224
|
-
const mention = unstable_useMentionAdapter();
|
|
225
|
-
// → { adapter, directive } — spread into <ComposerTriggerPopover {...mention} />
|
|
226
|
-
// Default: single "Tools" category reading from toolkit registrations
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
**Custom items only (no tools):**
|
|
230
|
-
|
|
231
|
-
```tsx
|
|
232
|
-
const mention = unstable_useMentionAdapter({
|
|
233
|
-
items: [
|
|
234
|
-
{ id: "alice", type: "user", label: "Alice", icon: "User" },
|
|
235
|
-
{ id: "bob", type: "user", label: "Bob", icon: "User" },
|
|
236
|
-
],
|
|
237
|
-
});
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
**Mix custom items with model-context tools (flat):**
|
|
241
|
-
|
|
242
|
-
```tsx
|
|
243
|
-
const mention = unstable_useMentionAdapter({
|
|
244
|
-
items: [{ id: "kb", type: "doc", label: "Knowledge Base", icon: "Book" }],
|
|
245
|
-
includeModelContextTools: true,
|
|
246
|
-
});
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**Multi-category drill-down:**
|
|
250
|
-
|
|
251
|
-
```tsx
|
|
252
|
-
const mention = unstable_useMentionAdapter({
|
|
253
|
-
categories: [
|
|
254
|
-
{
|
|
255
|
-
id: "users",
|
|
256
|
-
label: "Users",
|
|
257
|
-
items: [
|
|
258
|
-
{ id: "alice", type: "user", label: "Alice", icon: "User" },
|
|
259
|
-
{ id: "bob", type: "user", label: "Bob", icon: "User" },
|
|
260
|
-
],
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
id: "files",
|
|
264
|
-
label: "Files",
|
|
265
|
-
items: [
|
|
266
|
-
{ id: "readme", type: "file", label: "README.md", icon: "FileText" },
|
|
267
|
-
],
|
|
268
|
-
},
|
|
269
|
-
],
|
|
270
|
-
// Tools auto-appended as their own category (default id "tools", label "Tools")
|
|
271
|
-
includeModelContextTools: true,
|
|
272
|
-
});
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
**Tool formatting and category override:**
|
|
276
|
-
|
|
277
|
-
```tsx
|
|
278
|
-
const mention = unstable_useMentionAdapter({
|
|
279
|
-
categories: [{ id: "users", label: "Users", items: [...] }],
|
|
280
|
-
includeModelContextTools: {
|
|
281
|
-
category: { id: "integrations", label: "Integrations" },
|
|
282
|
-
formatLabel: (name) =>
|
|
283
|
-
name.replaceAll("_", " ").replace(/\b\w/g, (c) => c.toUpperCase()),
|
|
284
|
-
icon: "Wrench",
|
|
285
|
-
},
|
|
286
|
-
});
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
**Options summary:**
|
|
290
|
-
|
|
291
|
-
| Option | Type | Behavior |
|
|
292
|
-
| --- | --- | --- |
|
|
293
|
-
| `items` | `Unstable_Mention[]` | Flat list (ignored when `categories` is set) |
|
|
294
|
-
| `categories` | `{id, label, items}[]` | Drill-down groups |
|
|
295
|
-
| `includeModelContextTools` | `boolean \| object` | Default: `true` iff neither `items` nor `categories` |
|
|
296
|
-
| `formatter` | `Unstable_DirectiveFormatter` | Override directive serialization (default: `unstable_defaultDirectiveFormatter`) |
|
|
297
|
-
| `onInserted` | `(item) => void` | Fires after the directive is inserted into the composer |
|
|
298
|
-
| `iconMap` | `Record<string, IconComponent>` | Maps `metadata.icon` / category `id` strings to React components |
|
|
299
|
-
| `fallbackIcon` | `IconComponent` | Fallback when no entry in `iconMap` matches |
|
|
300
|
-
|
|
301
|
-
`icon` on each mention is a shortcut for `metadata.icon` that the picker UI resolves via `iconMap`. Dedup between custom items and model-context tools is by `id` — explicit items win.
|
|
302
|
-
|
|
303
|
-
The hook returns `{ adapter, directive, iconMap?, fallbackIcon? }` — spread into `<ComposerTriggerPopover {...mention} />` for one-line wiring. Callers consuming the raw primitives instead destructure: `mention.adapter`, `mention.directive.formatter`, etc.
|
|
304
|
-
|
|
305
|
-
## Directive Format
|
|
306
|
-
|
|
307
|
-
When a user selects a mention item, it is serialized into the composer text as a **directive**. The default format is:
|
|
308
|
-
|
|
309
|
-
```
|
|
310
|
-
:type[label]{name=id}
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
For example, selecting a tool named "get_weather" with label "Get Weather" produces:
|
|
314
|
-
|
|
315
|
-
```
|
|
316
|
-
:tool[Get Weather]{name=get_weather}
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
When `id` equals `label`, the `{name=…}` attribute is omitted for brevity:
|
|
320
|
-
|
|
321
|
-
```
|
|
322
|
-
:tool[search]
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
### Custom Formatter
|
|
326
|
-
|
|
327
|
-
Implement `Unstable_DirectiveFormatter` to use a different format:
|
|
328
|
-
|
|
329
|
-
```ts
|
|
330
|
-
import type { Unstable_DirectiveFormatter } from "@assistant-ui/react";
|
|
331
|
-
|
|
332
|
-
const slashFormatter: Unstable_DirectiveFormatter = {
|
|
333
|
-
serialize(item) {
|
|
334
|
-
return `/${item.id}`;
|
|
335
|
-
},
|
|
336
|
-
|
|
337
|
-
parse(text) {
|
|
338
|
-
const segments = [];
|
|
339
|
-
const re = /\/(\w+)/g;
|
|
340
|
-
let lastIndex = 0;
|
|
341
|
-
let match;
|
|
342
|
-
|
|
343
|
-
while ((match = re.exec(text)) !== null) {
|
|
344
|
-
if (match.index > lastIndex) {
|
|
345
|
-
segments.push({ kind: "text" as const, text: text.slice(lastIndex, match.index) });
|
|
346
|
-
}
|
|
347
|
-
segments.push({
|
|
348
|
-
kind: "mention" as const,
|
|
349
|
-
type: "tool",
|
|
350
|
-
label: match[1]!,
|
|
351
|
-
id: match[1]!,
|
|
352
|
-
});
|
|
353
|
-
lastIndex = re.lastIndex;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
if (lastIndex < text.length) {
|
|
357
|
-
segments.push({ kind: "text" as const, text: text.slice(lastIndex) });
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
return segments;
|
|
361
|
-
},
|
|
362
|
-
};
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
Pass it to the trigger's `Directive` sub-primitive and the message renderer:
|
|
366
|
-
|
|
367
|
-
```tsx
|
|
368
|
-
// Composer
|
|
369
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
370
|
-
char="@"
|
|
371
|
-
adapter={adapter}
|
|
372
|
-
>
|
|
373
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={slashFormatter} />
|
|
374
|
-
...
|
|
375
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
376
|
-
|
|
377
|
-
// User messages
|
|
378
|
-
const SlashDirectiveText = createDirectiveText(slashFormatter);
|
|
379
|
-
<MessagePrimitive.Parts components={{ Text: SlashDirectiveText }} />
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
## Textarea vs Lexical
|
|
383
|
-
|
|
384
|
-
The mention system supports two input modes:
|
|
385
|
-
|
|
386
|
-
| | Textarea (default) | Lexical |
|
|
387
|
-
| --- | --- | --- |
|
|
388
|
-
| **Input component** | `ComposerPrimitive.Input` | `LexicalComposerInput` |
|
|
389
|
-
| **Mention display in composer** | Raw directive text (`:tool[Label]`) | Inline chips (atomic nodes) |
|
|
390
|
-
| **Dependencies** | None | `@assistant-ui/react-lexical`, `lexical`, `@lexical/react` |
|
|
391
|
-
| **Best for** | Simple setups, minimal bundle | Rich editing, polished UX |
|
|
392
|
-
|
|
393
|
-
With **textarea**, selecting a mention inserts the directive string directly into the text. The user sees `:tool[Get Weather]{name=get_weather}` in the input.
|
|
394
|
-
|
|
395
|
-
With **Lexical**, selected mentions appear as styled inline chips that behave as atomic units — they can be selected, deleted, and undone as a whole. The underlying text still uses the directive format.
|
|
396
|
-
|
|
397
|
-
```tsx
|
|
398
|
-
import { LexicalComposerInput } from "@assistant-ui/react-lexical";
|
|
399
|
-
|
|
400
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
401
|
-
<ComposerPrimitive.Root>
|
|
402
|
-
<LexicalComposerInput placeholder="Type @ to mention..." />
|
|
403
|
-
<ComposerPrimitive.Send />
|
|
404
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
405
|
-
char="@"
|
|
406
|
-
adapter={adapter}
|
|
407
|
-
>
|
|
408
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
|
|
409
|
-
...
|
|
410
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
411
|
-
</ComposerPrimitive.Root>
|
|
412
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
`LexicalComposerInput` automatically discovers every `Directive` trigger registered under `TriggerPopoverRoot` and renders their selections as inline chips.
|
|
416
|
-
|
|
417
|
-
### Custom Lexical Plugins
|
|
418
|
-
|
|
419
|
-
Children of `LexicalComposerInput` render inside the `LexicalComposer` context after the built-in plugins, so standard Lexical plugin components built on `useLexicalComposerContext` work for editor concerns the mention system does not cover, such as paste normalization or length limits. Custom plugins import Lexical APIs directly, so install `lexical` and `@lexical/react` as direct dependencies of your app. The example below registers an update listener that flags messages over a maximum length.
|
|
420
|
-
|
|
421
|
-
```tsx
|
|
422
|
-
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
|
423
|
-
import { useEffect } from "react";
|
|
424
|
-
import { $getRoot } from "lexical";
|
|
425
|
-
|
|
426
|
-
function MaxLengthPlugin({ maxLength }: { maxLength: number }) {
|
|
427
|
-
const [editor] = useLexicalComposerContext();
|
|
428
|
-
|
|
429
|
-
useEffect(() => {
|
|
430
|
-
return editor.registerUpdateListener(({ editorState }) => {
|
|
431
|
-
editorState.read(() => {
|
|
432
|
-
if ($getRoot().getTextContent().length > maxLength) {
|
|
433
|
-
console.warn(`Message exceeds ${maxLength} characters`);
|
|
434
|
-
}
|
|
435
|
-
});
|
|
436
|
-
});
|
|
437
|
-
}, [editor, maxLength]);
|
|
438
|
-
|
|
439
|
-
return null;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
<LexicalComposerInput placeholder="Ask anything...">
|
|
443
|
-
<MaxLengthPlugin maxLength={2000} />
|
|
444
|
-
</LexicalComposerInput>
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
## Rendering Mentions in Messages
|
|
448
|
-
|
|
449
|
-
Use `DirectiveText` as the `Text` component for user messages so directives render as inline chips instead of raw syntax. See the [Directive Text](/docs/ui/directive-text) guide for setup and customization.
|
|
450
|
-
|
|
451
|
-
## Processing Mentions on the Backend
|
|
452
|
-
|
|
453
|
-
The message text arrives at your backend with directives inline. Parse them to extract mentioned items:
|
|
454
|
-
|
|
455
|
-
```ts
|
|
456
|
-
// Default format: :type[label]{name=id}
|
|
457
|
-
const DIRECTIVE_RE = /:([\w-]+)\[([^\]]+)\](?:\{name=([^}]+)\})?/g;
|
|
458
|
-
|
|
459
|
-
function parseMentions(text: string) {
|
|
460
|
-
const mentions = [];
|
|
461
|
-
let match;
|
|
462
|
-
while ((match = DIRECTIVE_RE.exec(text)) !== null) {
|
|
463
|
-
mentions.push({
|
|
464
|
-
type: match[1], // e.g. "tool"
|
|
465
|
-
label: match[2], // e.g. "Get Weather"
|
|
466
|
-
id: match[3] ?? match[2], // e.g. "get_weather"
|
|
467
|
-
});
|
|
468
|
-
}
|
|
469
|
-
return mentions;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
// Example:
|
|
473
|
-
// parseMentions("Use :tool[Get Weather]{name=get_weather} to check")
|
|
474
|
-
// → [{ type: "tool", label: "Get Weather", id: "get_weather" }]
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
You can use the extracted mentions to:
|
|
478
|
-
- Force-enable specific tools for the LLM call
|
|
479
|
-
- Add context about mentioned users or documents to the system prompt
|
|
480
|
-
- Log which tools users request most often
|
|
481
|
-
|
|
482
|
-
## Reading Mention State
|
|
483
|
-
|
|
484
|
-
Use `unstable_useTriggerPopoverScopeContext` inside the `TriggerPopover` to programmatically access the popover state for that trigger:
|
|
485
|
-
|
|
486
|
-
```tsx
|
|
487
|
-
import { unstable_useTriggerPopoverScopeContext } from "@assistant-ui/react";
|
|
488
|
-
|
|
489
|
-
function MyPopoverContent() {
|
|
490
|
-
const scope = unstable_useTriggerPopoverScopeContext();
|
|
491
|
-
|
|
492
|
-
// scope.open — whether the popover is visible
|
|
493
|
-
// scope.query — current search text after the trigger
|
|
494
|
-
// scope.categories — filtered category list
|
|
495
|
-
// scope.items — filtered item list
|
|
496
|
-
// scope.highlightedIndex — keyboard-navigated index
|
|
497
|
-
// scope.isSearchMode — true when global search is active
|
|
498
|
-
// scope.selectItem(item) — programmatically select an item
|
|
499
|
-
// scope.close() — close the popover
|
|
500
|
-
|
|
501
|
-
return null;
|
|
502
|
-
}
|
|
503
|
-
```
|
|
504
|
-
|
|
505
|
-
This hook must be used inside a `ComposerPrimitive.Unstable_TriggerPopover`.
|
|
506
|
-
|
|
507
|
-
To iterate every registered trigger (e.g. from a custom input implementation), use `unstable_useTriggerPopoverTriggers` inside `TriggerPopoverRoot`.
|
|
508
|
-
|
|
509
|
-
## Building a Custom Popover
|
|
510
|
-
|
|
511
|
-
Use the trigger popover primitives to build a fully custom popover:
|
|
512
|
-
|
|
513
|
-
```tsx
|
|
514
|
-
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
515
|
-
<ComposerPrimitive.Root>
|
|
516
|
-
<ComposerPrimitive.Input />
|
|
517
|
-
|
|
518
|
-
<ComposerPrimitive.Unstable_TriggerPopover
|
|
519
|
-
char="@"
|
|
520
|
-
adapter={adapter}
|
|
521
|
-
className="popover"
|
|
522
|
-
>
|
|
523
|
-
<ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
|
|
524
|
-
|
|
525
|
-
<ComposerPrimitive.Unstable_TriggerPopoverBack>
|
|
526
|
-
← Back
|
|
527
|
-
</ComposerPrimitive.Unstable_TriggerPopoverBack>
|
|
528
|
-
|
|
529
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
530
|
-
{(categories) =>
|
|
531
|
-
categories.map((cat) => (
|
|
532
|
-
<ComposerPrimitive.Unstable_TriggerPopoverCategoryItem
|
|
533
|
-
key={cat.id}
|
|
534
|
-
categoryId={cat.id}
|
|
535
|
-
>
|
|
536
|
-
{cat.label}
|
|
537
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategoryItem>
|
|
538
|
-
))
|
|
539
|
-
}
|
|
540
|
-
</ComposerPrimitive.Unstable_TriggerPopoverCategories>
|
|
541
|
-
|
|
542
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
543
|
-
{(items) =>
|
|
544
|
-
items.map((item) => (
|
|
545
|
-
<ComposerPrimitive.Unstable_TriggerPopoverItem
|
|
546
|
-
key={item.id}
|
|
547
|
-
item={item}
|
|
548
|
-
>
|
|
549
|
-
{item.label}
|
|
550
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItem>
|
|
551
|
-
))
|
|
552
|
-
}
|
|
553
|
-
</ComposerPrimitive.Unstable_TriggerPopoverItems>
|
|
554
|
-
</ComposerPrimitive.Unstable_TriggerPopover>
|
|
555
|
-
|
|
556
|
-
<ComposerPrimitive.Send />
|
|
557
|
-
</ComposerPrimitive.Root>
|
|
558
|
-
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
559
|
-
```
|
|
560
|
-
|
|
561
|
-
### Primitives Reference
|
|
562
|
-
|
|
563
|
-
See the [Composer Primitives](/docs/primitives/composer) reference for the full list of trigger popover primitives and their props.
|
|
564
|
-
|
|
565
|
-
## Combining with Slash Commands
|
|
566
|
-
|
|
567
|
-
Mentions and slash commands coexist on the same composer. See [Combining Slash Commands and Mentions](/docs/guides/slash-commands#combining-with-mentions) for the full pattern.
|
|
568
|
-
|
|
569
|
-
## Related
|
|
570
|
-
|
|
571
|
-
- [ComposerTriggerPopover UI Component](/docs/ui/composer-trigger-popover) — pre-built shadcn component
|
|
572
|
-
- [DirectiveText UI Component](/docs/ui/directive-text) — renders mention chips in user messages
|
|
573
|
-
- [Slash Commands Guide](/docs/guides/slash-commands) — `/` command system built on the same architecture
|
|
574
|
-
- [Tools Guide](/docs/tools/defining-tools) — register tools that appear in the mention picker
|
|
575
|
-
- [Composer Primitives](/docs/primitives/composer) — underlying composer primitives
|