@assistant-ui/mcp-docs-server 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -43
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -91
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +9 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +76 -0
- package/dist/proxy.js.map +1 -0
- package/package.json +9 -13
- package/src/index.ts +3 -115
- package/src/proxy.test.ts +250 -0
- package/src/proxy.ts +111 -0
- package/.docs/organized/code-examples/waterfall.md +0 -807
- package/.docs/organized/code-examples/with-a2a.md +0 -674
- package/.docs/organized/code-examples/with-ag-ui.md +0 -552
- package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -465
- package/.docs/organized/code-examples/with-artifacts.md +0 -814
- package/.docs/organized/code-examples/with-assistant-transport.md +0 -575
- package/.docs/organized/code-examples/with-browser-extension.md +0 -371
- package/.docs/organized/code-examples/with-chain-of-thought.md +0 -960
- package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
- package/.docs/organized/code-examples/with-cloud.md +0 -438
- package/.docs/organized/code-examples/with-custom-thread-list.md +0 -568
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -526
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -696
- package/.docs/organized/code-examples/with-eve.md +0 -404
- package/.docs/organized/code-examples/with-expo.md +0 -2063
- package/.docs/organized/code-examples/with-external-store.md +0 -420
- package/.docs/organized/code-examples/with-ffmpeg.md +0 -828
- package/.docs/organized/code-examples/with-generative-ui.md +0 -1812
- package/.docs/organized/code-examples/with-google-adk.md +0 -367
- package/.docs/organized/code-examples/with-heat-graph.md +0 -304
- package/.docs/organized/code-examples/with-image-generation.md +0 -462
- package/.docs/organized/code-examples/with-interactables.md +0 -732
- package/.docs/organized/code-examples/with-langchain.md +0 -445
- package/.docs/organized/code-examples/with-langgraph.md +0 -854
- package/.docs/organized/code-examples/with-livekit.md +0 -642
- package/.docs/organized/code-examples/with-mcp.md +0 -780
- package/.docs/organized/code-examples/with-nuxt.md +0 -2428
- package/.docs/organized/code-examples/with-opencode.md +0 -1974
- package/.docs/organized/code-examples/with-openui.md +0 -449
- package/.docs/organized/code-examples/with-pi.md +0 -2083
- package/.docs/organized/code-examples/with-react-hook-form.md +0 -724
- package/.docs/organized/code-examples/with-react-ink-web.md +0 -690
- package/.docs/organized/code-examples/with-react-ink.md +0 -472
- package/.docs/organized/code-examples/with-react-router.md +0 -935
- package/.docs/organized/code-examples/with-resumable-stream.md +0 -667
- package/.docs/organized/code-examples/with-store.md +0 -679
- package/.docs/organized/code-examples/with-svelte.md +0 -415
- package/.docs/organized/code-examples/with-sveltekit.md +0 -1061
- package/.docs/organized/code-examples/with-tanstack.md +0 -811
- package/.docs/organized/code-examples/with-tap-runtime.md +0 -812
- package/.docs/organized/code-examples/with-virtualized-thread.md +0 -680
- package/.docs/organized/code-examples/with-vue.md +0 -408
- package/.docs/raw/docs/(docs)/architecture.mdx +0 -146
- package/.docs/raw/docs/(docs)/base-ui.mdx +0 -39
- package/.docs/raw/docs/(docs)/cli.mdx +0 -542
- package/.docs/raw/docs/(docs)/devtools.mdx +0 -79
- package/.docs/raw/docs/(docs)/index.mdx +0 -21
- package/.docs/raw/docs/(docs)/installation.mdx +0 -483
- package/.docs/raw/docs/(docs)/llm.mdx +0 -211
- package/.docs/raw/docs/(docs)/rtl.mdx +0 -78
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/adapters/model.mdx +0 -44
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +0 -59
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/suggestions.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/context-providers/assistant-runtime-provider.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/context-providers/scoped-providers.mdx +0 -64
- package/.docs/raw/docs/(reference)/api-reference/external-store/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/external-store/message-conversion.mdx +0 -52
- package/.docs/raw/docs/(reference)/api-reference/external-store/runtime.mdx +0 -49
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/a2ui.mdx +0 -40
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +0 -56
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +0 -86
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +0 -39
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +0 -42
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/spec.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +0 -93
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/hooks/composer-triggers.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +0 -31
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/hooks/primitives.mdx +0 -350
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/cloud-ai-sdk.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/integrations/eve.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-ai-sdk.mdx +0 -200
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +0 -37
- package/.docs/raw/docs/(reference)/api-reference/model-context/context.mdx +0 -50
- package/.docs/raw/docs/(reference)/api-reference/model-context/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/model-context/registry.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +0 -566
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +0 -152
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar.mdx +0 -239
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +0 -208
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-modal.mdx +0 -108
- package/.docs/raw/docs/(reference)/api-reference/primitives/attachment.mdx +0 -99
- package/.docs/raw/docs/(reference)/api-reference/primitives/branch-picker.mdx +0 -145
- package/.docs/raw/docs/(reference)/api-reference/primitives/chain-of-thought.mdx +0 -82
- package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +0 -619
- package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/primitives/error.mdx +0 -65
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +0 -73
- package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +0 -117
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +0 -339
- package/.docs/raw/docs/(reference)/api-reference/primitives/queue-item.mdx +0 -77
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +0 -88
- package/.docs/raw/docs/(reference)/api-reference/primitives/suggestion.mdx +0 -81
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item.mdx +0 -138
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +0 -122
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +0 -289
- package/.docs/raw/docs/(reference)/api-reference/runtimes/assistant-runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/attachment-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/composer-runtime.mdx +0 -32
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-part-runtime.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/queue-state.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-item-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-runtime.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/tools/component-tools.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/tools/index.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables-legacy.mdx +0 -55
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables.mdx +0 -151
- package/.docs/raw/docs/(reference)/api-reference/tools/rendering.mdx +0 -106
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +0 -178
- package/.docs/raw/docs/(reference)/api-reference/transport/assistant-transport.mdx +0 -48
- package/.docs/raw/docs/(reference)/api-reference/transport/frame.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/transport/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/utilities/index.mdx +0 -19
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +0 -149
- package/.docs/raw/docs/(reference)/api-reference/voice/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/voice/session.mdx +0 -54
- package/.docs/raw/docs/(reference)/api-reference/voice/speech-dictation.mdx +0 -36
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +0 -527
- package/.docs/raw/docs/cloud/ai-sdk.mdx +0 -602
- package/.docs/raw/docs/cloud/authorization.mdx +0 -252
- package/.docs/raw/docs/cloud/index.mdx +0 -46
- package/.docs/raw/docs/cloud/langgraph.mdx +0 -554
- package/.docs/raw/docs/copilots/assistant-frame.mdx +0 -400
- package/.docs/raw/docs/copilots/make-assistant-visible.mdx +0 -82
- package/.docs/raw/docs/copilots/model-context.mdx +0 -156
- package/.docs/raw/docs/copilots/motivation.mdx +0 -202
- package/.docs/raw/docs/copilots/use-assistant-instructions.mdx +0 -64
- package/.docs/raw/docs/guides/attachments.mdx +0 -619
- package/.docs/raw/docs/guides/branching.mdx +0 -76
- package/.docs/raw/docs/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/guides/chatgpt-subscription.mdx +0 -108
- package/.docs/raw/docs/guides/context-api.mdx +0 -619
- package/.docs/raw/docs/guides/dictation.mdx +0 -298
- package/.docs/raw/docs/guides/editing.mdx +0 -102
- package/.docs/raw/docs/guides/electron.mdx +0 -369
- package/.docs/raw/docs/guides/headless-composer-input.mdx +0 -113
- package/.docs/raw/docs/guides/image-generation.mdx +0 -74
- package/.docs/raw/docs/guides/index.mdx +0 -117
- package/.docs/raw/docs/guides/input-history.mdx +0 -55
- package/.docs/raw/docs/guides/latex.mdx +0 -158
- package/.docs/raw/docs/guides/mentions.mdx +0 -575
- package/.docs/raw/docs/guides/message-timing.mdx +0 -209
- package/.docs/raw/docs/guides/quoting.mdx +0 -169
- package/.docs/raw/docs/guides/resumable-stream-deployment.mdx +0 -212
- package/.docs/raw/docs/guides/resumable-stream-stores.mdx +0 -152
- package/.docs/raw/docs/guides/resumable-streams.mdx +0 -292
- package/.docs/raw/docs/guides/slash-commands.mdx +0 -358
- package/.docs/raw/docs/guides/speech.mdx +0 -172
- package/.docs/raw/docs/guides/suggestions.mdx +0 -384
- package/.docs/raw/docs/guides/virtualization.mdx +0 -133
- package/.docs/raw/docs/guides/voice.mdx +0 -310
- package/.docs/raw/docs/ink/adapters.mdx +0 -99
- package/.docs/raw/docs/ink/custom-backend.mdx +0 -254
- package/.docs/raw/docs/ink/hooks.mdx +0 -469
- package/.docs/raw/docs/ink/index.mdx +0 -236
- package/.docs/raw/docs/ink/migration.mdx +0 -138
- package/.docs/raw/docs/ink/primitives.mdx +0 -1259
- package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +0 -528
- package/.docs/raw/docs/integrations/auth/better-auth.mdx +0 -188
- package/.docs/raw/docs/integrations/auth/clerk.mdx +0 -166
- package/.docs/raw/docs/integrations/auth/next-auth.mdx +0 -191
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +0 -88
- package/.docs/raw/docs/integrations/frameworks/cloudflare-agents/overview.mdx +0 -282
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +0 -188
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +0 -57
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +0 -201
- package/.docs/raw/docs/integrations/gateways/index.mdx +0 -162
- package/.docs/raw/docs/integrations/index.mdx +0 -178
- package/.docs/raw/docs/integrations/observability/helicone.mdx +0 -129
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +0 -161
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +0 -151
- package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +0 -773
- package/.docs/raw/docs/migrations/deprecation-policy.mdx +0 -42
- package/.docs/raw/docs/migrations/index.mdx +0 -50
- package/.docs/raw/docs/migrations/react-compatibility.mdx +0 -74
- package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +0 -328
- package/.docs/raw/docs/migrations/toolkit-tools.mdx +0 -236
- package/.docs/raw/docs/migrations/v0-11.mdx +0 -172
- package/.docs/raw/docs/migrations/v0-12.mdx +0 -302
- package/.docs/raw/docs/migrations/v0-14.mdx +0 -297
- package/.docs/raw/docs/migrations/v0-15.mdx +0 -270
- package/.docs/raw/docs/primitives/action-bar.mdx +0 -352
- package/.docs/raw/docs/primitives/assistant-modal.mdx +0 -216
- package/.docs/raw/docs/primitives/attachment.mdx +0 -217
- package/.docs/raw/docs/primitives/branch-picker.mdx +0 -222
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +0 -315
- package/.docs/raw/docs/primitives/composer.mdx +0 -659
- package/.docs/raw/docs/primitives/error.mdx +0 -142
- package/.docs/raw/docs/primitives/index.mdx +0 -99
- package/.docs/raw/docs/primitives/message.mdx +0 -618
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +0 -191
- package/.docs/raw/docs/primitives/suggestion.mdx +0 -254
- package/.docs/raw/docs/primitives/thread-list.mdx +0 -467
- package/.docs/raw/docs/primitives/thread.mdx +0 -509
- package/.docs/raw/docs/react-native/adapters.mdx +0 -94
- package/.docs/raw/docs/react-native/custom-backend.mdx +0 -207
- package/.docs/raw/docs/react-native/hooks.mdx +0 -339
- package/.docs/raw/docs/react-native/index.mdx +0 -289
- package/.docs/raw/docs/react-native/migration.mdx +0 -142
- package/.docs/raw/docs/react-native/primitives.mdx +0 -839
- package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +0 -399
- package/.docs/raw/docs/runtimes/a2a/overview.mdx +0 -60
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +0 -216
- package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +0 -124
- package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +0 -70
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +0 -243
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +0 -255
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +0 -61
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +0 -122
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +0 -135
- package/.docs/raw/docs/runtimes/ai-sdk/v6-legacy.mdx +0 -636
- package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +0 -716
- package/.docs/raw/docs/runtimes/claude-managed-agents.mdx +0 -118
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +0 -265
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +0 -167
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +0 -68
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +0 -513
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +0 -763
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +0 -339
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +0 -957
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +0 -902
- package/.docs/raw/docs/runtimes/custom/overview.mdx +0 -71
- package/.docs/raw/docs/runtimes/eve/overview.mdx +0 -151
- package/.docs/raw/docs/runtimes/eve/quickstart.mdx +0 -192
- package/.docs/raw/docs/runtimes/google-adk/api.mdx +0 -256
- package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +0 -784
- package/.docs/raw/docs/runtimes/google-adk/overview.mdx +0 -69
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +0 -229
- package/.docs/raw/docs/runtimes/langchain.mdx +0 -901
- package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +0 -181
- package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +0 -305
- package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +0 -104
- package/.docs/raw/docs/runtimes/langgraph/overview.mdx +0 -84
- package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +0 -496
- package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +0 -144
- package/.docs/raw/docs/runtimes/langgraph/threads.mdx +0 -113
- package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +0 -29
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -93
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +0 -347
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +0 -393
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +0 -194
- package/.docs/raw/docs/runtimes/opencode/overview.mdx +0 -58
- package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +0 -119
- package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +0 -133
- package/.docs/raw/docs/tools/a2ui.mdx +0 -107
- package/.docs/raw/docs/tools/backend.mdx +0 -147
- package/.docs/raw/docs/tools/defining-tools.mdx +0 -574
- package/.docs/raw/docs/tools/dynamic-tools.mdx +0 -112
- package/.docs/raw/docs/tools/generative-ui-primitive.mdx +0 -180
- package/.docs/raw/docs/tools/generative-ui-slack.mdx +0 -167
- package/.docs/raw/docs/tools/generative-ui-teams.mdx +0 -160
- package/.docs/raw/docs/tools/generative-ui.mdx +0 -322
- package/.docs/raw/docs/tools/index.mdx +0 -72
- package/.docs/raw/docs/tools/interactables.mdx +0 -1084
- package/.docs/raw/docs/tools/mcp-apps.mdx +0 -346
- package/.docs/raw/docs/tools/mcp.mdx +0 -466
- package/.docs/raw/docs/tools/multi-agent.mdx +0 -237
- package/.docs/raw/docs/tools/openui.mdx +0 -175
- package/.docs/raw/docs/tools/tool-ui.mdx +0 -1008
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
- package/.docs/raw/docs/ui/accordion.mdx +0 -266
- package/.docs/raw/docs/ui/assistant-modal.mdx +0 -166
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +0 -89
- package/.docs/raw/docs/ui/attachment.mdx +0 -259
- package/.docs/raw/docs/ui/badge.mdx +0 -150
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -212
- package/.docs/raw/docs/ui/context-display.mdx +0 -148
- package/.docs/raw/docs/ui/diff-viewer.mdx +0 -280
- package/.docs/raw/docs/ui/directive-text.mdx +0 -114
- package/.docs/raw/docs/ui/dot-matrix.mdx +0 -133
- package/.docs/raw/docs/ui/file.mdx +0 -159
- package/.docs/raw/docs/ui/follow-up-suggestions.mdx +0 -82
- package/.docs/raw/docs/ui/image.mdx +0 -102
- package/.docs/raw/docs/ui/markdown.mdx +0 -64
- package/.docs/raw/docs/ui/mcp-config.mdx +0 -107
- package/.docs/raw/docs/ui/mermaid.mdx +0 -92
- package/.docs/raw/docs/ui/message-timing.mdx +0 -93
- package/.docs/raw/docs/ui/model-selector.mdx +0 -455
- package/.docs/raw/docs/ui/number-roll.mdx +0 -154
- package/.docs/raw/docs/ui/part-grouping.mdx +0 -614
- package/.docs/raw/docs/ui/quote.mdx +0 -211
- package/.docs/raw/docs/ui/reasoning.mdx +0 -186
- package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
- package/.docs/raw/docs/ui/select.mdx +0 -254
- package/.docs/raw/docs/ui/sources.mdx +0 -177
- package/.docs/raw/docs/ui/streamdown.mdx +0 -392
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
- package/.docs/raw/docs/ui/tabs.mdx +0 -271
- package/.docs/raw/docs/ui/thread-list.mdx +0 -372
- package/.docs/raw/docs/ui/thread.mdx +0 -512
- package/.docs/raw/docs/ui/tool-fallback.mdx +0 -127
- package/.docs/raw/docs/ui/tool-group.mdx +0 -240
- package/.docs/raw/docs/ui/voice.mdx +0 -173
- package/.docs/raw/docs/utilities/heat-graph.mdx +0 -237
- package/.docs/raw/docs/utilities/react-o11y.mdx +0 -362
- package/.docs/raw/docs/utilities/tw-shimmer.mdx +0 -212
- package/dist/constants.d.ts +0 -14
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -19
- package/dist/constants.js.map +0 -1
- package/dist/prepare-docs/code-examples.d.ts +0 -5
- package/dist/prepare-docs/code-examples.d.ts.map +0 -1
- package/dist/prepare-docs/code-examples.js +0 -117
- package/dist/prepare-docs/code-examples.js.map +0 -1
- package/dist/prepare-docs/copy-raw.d.ts +0 -5
- package/dist/prepare-docs/copy-raw.d.ts.map +0 -1
- package/dist/prepare-docs/copy-raw.js +0 -49
- package/dist/prepare-docs/copy-raw.js.map +0 -1
- package/dist/prepare-docs/prepare.d.ts +0 -1
- package/dist/prepare-docs/prepare.js +0 -22
- package/dist/prepare-docs/prepare.js.map +0 -1
- package/dist/prompts/xulux-playground.d.ts +0 -12
- package/dist/prompts/xulux-playground.d.ts.map +0 -1
- package/dist/prompts/xulux-playground.js +0 -33
- package/dist/prompts/xulux-playground.js.map +0 -1
- package/dist/tools/docs.d.ts +0 -22
- package/dist/tools/docs.d.ts.map +0 -1
- package/dist/tools/docs.js +0 -177
- package/dist/tools/docs.js.map +0 -1
- package/dist/tools/examples.d.ts +0 -24
- package/dist/tools/examples.d.ts.map +0 -1
- package/dist/tools/examples.js +0 -87
- package/dist/tools/examples.js.map +0 -1
- package/dist/tools/resources.d.ts +0 -6
- package/dist/tools/resources.d.ts.map +0 -1
- package/dist/tools/resources.js +0 -75
- package/dist/tools/resources.js.map +0 -1
- package/dist/tools/search.d.ts +0 -24
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -39
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/tests/mcp-test-client.d.ts +0 -15
- package/dist/tools/tests/mcp-test-client.d.ts.map +0 -1
- package/dist/tools/tests/mcp-test-client.js +0 -68
- package/dist/tools/tests/mcp-test-client.js.map +0 -1
- package/dist/tools/tests/test-setup.d.ts +0 -7
- package/dist/tools/tests/test-setup.d.ts.map +0 -1
- package/dist/tools/tests/test-setup.js +0 -36
- package/dist/tools/tests/test-setup.js.map +0 -1
- package/dist/tools/xulux-templates.d.ts +0 -58
- package/dist/tools/xulux-templates.d.ts.map +0 -1
- package/dist/tools/xulux-templates.js +0 -84
- package/dist/tools/xulux-templates.js.map +0 -1
- package/dist/utils/cache.d.ts +0 -5
- package/dist/utils/cache.d.ts.map +0 -1
- package/dist/utils/cache.js +0 -18
- package/dist/utils/cache.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -10
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -20
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/mcp-format.d.ts +0 -11
- package/dist/utils/mcp-format.d.ts.map +0 -1
- package/dist/utils/mcp-format.js +0 -14
- package/dist/utils/mcp-format.js.map +0 -1
- package/dist/utils/mdx.d.ts +0 -12
- package/dist/utils/mdx.d.ts.map +0 -1
- package/dist/utils/mdx.js +0 -45
- package/dist/utils/mdx.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -12
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -93
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/search.d.ts +0 -10
- package/dist/utils/search.d.ts.map +0 -1
- package/dist/utils/search.js +0 -97
- package/dist/utils/search.js.map +0 -1
- package/dist/utils/security.d.ts +0 -5
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -22
- package/dist/utils/security.js.map +0 -1
- package/dist/xulux/catalog-client.d.ts +0 -14
- package/dist/xulux/catalog-client.d.ts.map +0 -1
- package/dist/xulux/catalog-client.js +0 -67
- package/dist/xulux/catalog-client.js.map +0 -1
- package/dist/xulux/fallback-catalog.d.ts +0 -7
- package/dist/xulux/fallback-catalog.d.ts.map +0 -1
- package/dist/xulux/fallback-catalog.js +0 -47
- package/dist/xulux/fallback-catalog.js.map +0 -1
- package/dist/xulux/fetch-sandbox.d.ts +0 -5
- package/dist/xulux/fetch-sandbox.d.ts.map +0 -1
- package/dist/xulux/fetch-sandbox.js +0 -40
- package/dist/xulux/fetch-sandbox.js.map +0 -1
- package/dist/xulux/template-service.d.ts +0 -84
- package/dist/xulux/template-service.d.ts.map +0 -1
- package/dist/xulux/template-service.js +0 -223
- package/dist/xulux/template-service.js.map +0 -1
- package/dist/xulux/types.d.ts +0 -55
- package/dist/xulux/types.d.ts.map +0 -1
- package/dist/xulux/types.js +0 -6
- package/dist/xulux/types.js.map +0 -1
- package/src/constants.ts +0 -24
- package/src/prepare-docs/code-examples.ts +0 -158
- package/src/prepare-docs/copy-raw.ts +0 -50
- package/src/prepare-docs/prepare.ts +0 -24
- package/src/prompts/xulux-playground.ts +0 -36
- package/src/tools/docs.ts +0 -255
- package/src/tools/examples.ts +0 -114
- package/src/tools/resources.ts +0 -111
- package/src/tools/search.ts +0 -46
- package/src/tools/tests/completions.test.ts +0 -60
- package/src/tools/tests/directory-size-cap.test.ts +0 -50
- package/src/tools/tests/docs.test.ts +0 -144
- package/src/tools/tests/examples.test.ts +0 -94
- package/src/tools/tests/integration.test.ts +0 -45
- package/src/tools/tests/json-parsing.test.ts +0 -23
- package/src/tools/tests/listings-cache.test.ts +0 -19
- package/src/tools/tests/mcp-protocol.test.ts +0 -216
- package/src/tools/tests/mcp-test-client.ts +0 -111
- package/src/tools/tests/path-traversal.test.ts +0 -81
- package/src/tools/tests/resources.test.ts +0 -133
- package/src/tools/tests/search.test.ts +0 -37
- package/src/tools/tests/test-setup.ts +0 -50
- package/src/tools/tests/xulux-templates.test.ts +0 -262
- package/src/tools/xulux-templates.ts +0 -141
- package/src/utils/cache.ts +0 -20
- package/src/utils/logger.ts +0 -20
- package/src/utils/mcp-format.ts +0 -14
- package/src/utils/mdx.ts +0 -59
- package/src/utils/paths.ts +0 -139
- package/src/utils/search.ts +0 -131
- package/src/utils/security.ts +0 -52
- package/src/utils/tests/cache.test.ts +0 -51
- package/src/utils/tests/mcp-format.test.ts +0 -22
- package/src/utils/tests/security.test.ts +0 -119
- package/src/xulux/catalog-client.ts +0 -105
- package/src/xulux/fallback-catalog.ts +0 -63
- package/src/xulux/fetch-sandbox.ts +0 -56
- package/src/xulux/template-service.ts +0 -406
- package/src/xulux/types.ts +0 -60
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: better-auth
|
|
3
|
-
description: TypeScript-first auth with database-owned sessions; gate the chat route and scope threads to the signed-in user.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
[better-auth](https://www.better-auth.com/) is a TypeScript-first auth library that owns the session, the user table, and the cookie story end to end. It pairs naturally with assistant-ui's [custom thread persistence](/docs/integrations/persistence/custom-adapter): the same database holds users and threads, and `session.user.id` flows directly into your where clauses.
|
|
7
|
-
|
|
8
|
-
This page covers the non-cloud path. AssistantCloud users should see [cloud authorization](/docs/cloud/authorization) for the JWT-exchange pattern.
|
|
9
|
-
|
|
10
|
-
## How it works
|
|
11
|
-
|
|
12
|
-
```mermaid
|
|
13
|
-
flowchart LR
|
|
14
|
-
browser["browser"] --> routes["/api/auth/[...all]<br/>/api/chat<br/>/api/threads/*"]
|
|
15
|
-
routes --> handlers["better-auth handlers"]
|
|
16
|
-
routes --> session["auth.api.getSession({ headers })"]
|
|
17
|
-
handlers --> session
|
|
18
|
-
session --> uid["session.user.id"] --> scope["scope queries by userId"]
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Three integration points:
|
|
22
|
-
|
|
23
|
-
1. **Auth handlers** mounted at `/api/auth/[...all]/route.ts` via `toNextJsHandler(auth)`.
|
|
24
|
-
2. **API routes** read the session server-side with `auth.api.getSession({ headers: await headers() })`.
|
|
25
|
-
3. **Reload-on-auth** uses better-auth's React client to detect sign-in and trigger `aui.threads.reload()`.
|
|
26
|
-
|
|
27
|
-
`session.user.id` is exposed on the session object directly, so route handlers can scope queries against it.
|
|
28
|
-
|
|
29
|
-
## Setup
|
|
30
|
-
|
|
31
|
-
This guide assumes you already have better-auth configured. If not, follow the [better-auth Next.js guide](https://www.better-auth.com/docs/integrations/next) first; the steps below pick up after `auth.ts` exports a `betterAuth(...)` instance.
|
|
32
|
-
|
|
33
|
-
<Steps>
|
|
34
|
-
<Step>
|
|
35
|
-
|
|
36
|
-
### Confirm the auth handler is mounted
|
|
37
|
-
|
|
38
|
-
better-auth ships its own catch-all handler. Make sure it's wired:
|
|
39
|
-
|
|
40
|
-
```ts title="app/api/auth/[...all]/route.ts"
|
|
41
|
-
import { auth } from "@/auth";
|
|
42
|
-
import { toNextJsHandler } from "better-auth/next-js";
|
|
43
|
-
|
|
44
|
-
export const { GET, POST } = toNextJsHandler(auth);
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Without this, sign-in, sign-out, and session refresh requests have nowhere to land.
|
|
48
|
-
|
|
49
|
-
</Step>
|
|
50
|
-
<Step>
|
|
51
|
-
|
|
52
|
-
### Gate the chat route
|
|
53
|
-
|
|
54
|
-
Resolve the session server-side with `auth.api.getSession`. It accepts request headers (which carry the session cookie) and returns `null` for unauthenticated requests.
|
|
55
|
-
|
|
56
|
-
```ts title="app/api/chat/route.ts"
|
|
57
|
-
import { auth } from "@/auth";
|
|
58
|
-
import { headers } from "next/headers";
|
|
59
|
-
import { openai } from "@ai-sdk/openai";
|
|
60
|
-
import { streamText, convertToModelMessages } from "ai";
|
|
61
|
-
import type { UIMessage } from "ai";
|
|
62
|
-
|
|
63
|
-
export async function POST(req: Request) {
|
|
64
|
-
const session = await auth.api.getSession({ headers: await headers() });
|
|
65
|
-
if (!session) return new Response("Unauthorized", { status: 401 });
|
|
66
|
-
|
|
67
|
-
const { messages }: { messages: UIMessage[] } = await req.json();
|
|
68
|
-
const result = streamText({
|
|
69
|
-
model: openai("gpt-5.6-luna"),
|
|
70
|
-
messages: await convertToModelMessages(messages),
|
|
71
|
-
});
|
|
72
|
-
return result.toUIMessageStreamResponse();
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
`headers()` from `next/headers` returns the active request's headers in App Router route handlers. Always `await` it.
|
|
77
|
-
|
|
78
|
-
</Step>
|
|
79
|
-
<Step>
|
|
80
|
-
|
|
81
|
-
### Scope thread queries by user
|
|
82
|
-
|
|
83
|
-
If you use [custom thread persistence](/docs/integrations/persistence/custom-adapter), every endpoint must filter by `session.user.id`. The pattern mirrors the chat route:
|
|
84
|
-
|
|
85
|
-
```ts title="app/api/threads/route.ts"
|
|
86
|
-
import { auth } from "@/auth";
|
|
87
|
-
import { headers } from "next/headers";
|
|
88
|
-
import { db } from "@/db";
|
|
89
|
-
import { threads } from "@/db/schema";
|
|
90
|
-
import { eq, desc } from "drizzle-orm";
|
|
91
|
-
|
|
92
|
-
export async function GET() {
|
|
93
|
-
const session = await auth.api.getSession({ headers: await headers() });
|
|
94
|
-
if (!session) return new Response(null, { status: 401 });
|
|
95
|
-
|
|
96
|
-
const rows = await db
|
|
97
|
-
.select()
|
|
98
|
-
.from(threads)
|
|
99
|
-
.where(eq(threads.userId, session.user.id))
|
|
100
|
-
.orderBy(desc(threads.updatedAt));
|
|
101
|
-
|
|
102
|
-
return Response.json(rows);
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
If your better-auth schema lives in the same database as your threads table, you can also reference `users.id` as a foreign key for cascading deletes.
|
|
107
|
-
|
|
108
|
-
</Step>
|
|
109
|
-
<Step>
|
|
110
|
-
|
|
111
|
-
### Set up the React client
|
|
112
|
-
|
|
113
|
-
Create the client once and import it from a shared module so all hooks share state:
|
|
114
|
-
|
|
115
|
-
```ts title="lib/auth-client.ts"
|
|
116
|
-
import { createAuthClient } from "better-auth/react";
|
|
117
|
-
|
|
118
|
-
export const authClient = createAuthClient();
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
</Step>
|
|
122
|
-
<Step>
|
|
123
|
-
|
|
124
|
-
### Reload threads after async auth
|
|
125
|
-
|
|
126
|
-
`useSession` from the React client tracks the live session. Drop a small effect inside `<AssistantRuntimeProvider>` that reloads the thread list when the user signs in:
|
|
127
|
-
|
|
128
|
-
```tsx title="app/components/ReloadOnAuth.tsx"
|
|
129
|
-
"use client";
|
|
130
|
-
|
|
131
|
-
import { useAui } from "@assistant-ui/react";
|
|
132
|
-
import { authClient } from "@/lib/auth-client";
|
|
133
|
-
import { useEffect } from "react";
|
|
134
|
-
|
|
135
|
-
export function ReloadOnAuth() {
|
|
136
|
-
const aui = useAui();
|
|
137
|
-
const { data: session, isPending } = authClient.useSession();
|
|
138
|
-
useEffect(() => {
|
|
139
|
-
if (!isPending && session) aui.threads.reload();
|
|
140
|
-
}, [isPending, session?.user?.id]);
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Mount this component anywhere inside your `<AssistantRuntimeProvider>` subtree (typically next to the runtime's provider in `MyProvider`). `reload()` discards in-flight responses from superseded calls, so it is safe to invoke on every auth transition.
|
|
146
|
-
|
|
147
|
-
</Step>
|
|
148
|
-
<Step>
|
|
149
|
-
|
|
150
|
-
### Run and verify
|
|
151
|
-
|
|
152
|
-
Sign in. Check:
|
|
153
|
-
|
|
154
|
-
- `/api/chat` returns `200` when authenticated; `401` when not.
|
|
155
|
-
- `/api/threads` returns only the current user's threads.
|
|
156
|
-
- A second user (incognito tab) sees a different thread list.
|
|
157
|
-
- The session cookie set by `/api/auth/sign-in/*` is `HttpOnly` and travels with same-origin fetches.
|
|
158
|
-
|
|
159
|
-
</Step>
|
|
160
|
-
</Steps>
|
|
161
|
-
|
|
162
|
-
## Notes
|
|
163
|
-
|
|
164
|
-
- **`session.user.id` is populated by default.** The `id` field comes from the user row better-auth manages, so route handlers can scope queries without any callback configuration.
|
|
165
|
-
- **Cookie-based, same-origin.** Browser fetches automatically include the session cookie. If you split the API onto a different host, set `credentials: "include"` and configure CORS on the API.
|
|
166
|
-
- **Database alignment.** If you use Drizzle and put both better-auth's user schema and your threads schema in the same database, foreign keys keep deletes consistent. better-auth's CLI generates the user schema; add your `threads` table referencing `user.id`.
|
|
167
|
-
- **Edge runtime.** `auth.api.getSession` works in both Node and Edge runtimes when better-auth is configured for an edge-compatible adapter.
|
|
168
|
-
- **Cloud users.** [AssistantCloud's auth-provider integrations](/docs/cloud/authorization) cover Clerk, Auth0, Supabase, and Firebase via JWT exchange. To pair Cloud with better-auth, use the [backend-server token approach](/docs/cloud/authorization#backend-server-approach): resolve `session.user.id` server-side, mint an Assistant Cloud token with that id as the `userId`, and return it from a token endpoint.
|
|
169
|
-
|
|
170
|
-
## Related
|
|
171
|
-
|
|
172
|
-
<Cards>
|
|
173
|
-
<Card
|
|
174
|
-
title="Custom thread persistence"
|
|
175
|
-
description="The persistence story this page builds on; required for per-user threads outside AssistantCloud."
|
|
176
|
-
href="/docs/integrations/persistence/custom-adapter"
|
|
177
|
-
/>
|
|
178
|
-
<Card
|
|
179
|
-
title="Auth.js (next-auth)"
|
|
180
|
-
description="The other common Next.js auth library. Different session shape; same wiring approach."
|
|
181
|
-
href="/docs/integrations/auth/next-auth"
|
|
182
|
-
/>
|
|
183
|
-
<Card
|
|
184
|
-
title="Threads (concepts)"
|
|
185
|
-
description="The full RemoteThreadListAdapter contract and reload-on-auth pattern."
|
|
186
|
-
href="/docs/runtimes/concepts/threads"
|
|
187
|
-
/>
|
|
188
|
-
</Cards>
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Clerk
|
|
3
|
-
description: Gate the chat route and scope thread persistence to the signed-in user with Clerk.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
[Clerk](https://clerk.com/) is a hosted auth platform that integrates with Next.js through `@clerk/nextjs`. This page covers using it with assistant-ui *without* AssistantCloud: middleware-based route gating, server-side `auth()` checks, and per-user scoping on a custom thread list.
|
|
7
|
-
|
|
8
|
-
If you use AssistantCloud, see [cloud authorization](/docs/cloud/authorization) instead. Cloud handles the Clerk JWT exchange for you and gives you workspace-scoped threads with no DB code.
|
|
9
|
-
|
|
10
|
-
## How it works
|
|
11
|
-
|
|
12
|
-
```mermaid
|
|
13
|
-
flowchart LR
|
|
14
|
-
browser["browser"] --> mw["clerkMiddleware<br/>(proxy.ts)"] --> routes["/api/chat<br/>/api/threads/*"] --> auth["auth() returns { userId }"] --> scope["scope queries by userId"]
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Three places Clerk touches the integration:
|
|
18
|
-
|
|
19
|
-
1. **Middleware** runs before every request and sets up the auth context the rest of the app reads.
|
|
20
|
-
2. **API routes** (`/api/chat`, `/api/threads/*`) call `await auth()` from `@clerk/nextjs/server`, return 401 when `userId` is null, then scope DB queries by that id.
|
|
21
|
-
3. **Reload-on-auth** uses `useUser` from `@clerk/nextjs` so the thread list re-fetches when the user signs in.
|
|
22
|
-
|
|
23
|
-
Clerk's `auth()` returns `userId` directly, so the route handler can scope queries without any callback configuration.
|
|
24
|
-
|
|
25
|
-
## Setup
|
|
26
|
-
|
|
27
|
-
This guide assumes you already have Clerk configured in your Next.js app. If not, follow the [Clerk Next.js quickstart](https://clerk.com/docs/quickstarts/nextjs) first; the steps below pick up after `<ClerkProvider>` wraps your root layout and `clerkMiddleware()` is in place.
|
|
28
|
-
|
|
29
|
-
<Steps>
|
|
30
|
-
<Step>
|
|
31
|
-
|
|
32
|
-
### Gate the chat route
|
|
33
|
-
|
|
34
|
-
Add an `auth()` check to the AI SDK route. Return 401 before calling the model so unauthenticated traffic doesn't burn provider credits.
|
|
35
|
-
|
|
36
|
-
```ts title="app/api/chat/route.ts"
|
|
37
|
-
import { auth } from "@clerk/nextjs/server";
|
|
38
|
-
import { openai } from "@ai-sdk/openai";
|
|
39
|
-
import { streamText, convertToModelMessages } from "ai";
|
|
40
|
-
import type { UIMessage } from "ai";
|
|
41
|
-
|
|
42
|
-
export async function POST(req: Request) {
|
|
43
|
-
const { userId } = await auth();
|
|
44
|
-
if (!userId) return new Response("Unauthorized", { status: 401 });
|
|
45
|
-
|
|
46
|
-
const { messages }: { messages: UIMessage[] } = await req.json();
|
|
47
|
-
const result = streamText({
|
|
48
|
-
model: openai("gpt-5.6-luna"),
|
|
49
|
-
messages: await convertToModelMessages(messages),
|
|
50
|
-
});
|
|
51
|
-
return result.toUIMessageStreamResponse();
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
</Step>
|
|
56
|
-
<Step>
|
|
57
|
-
|
|
58
|
-
### Scope thread queries by user
|
|
59
|
-
|
|
60
|
-
If you also use [custom thread persistence](/docs/integrations/persistence/custom-adapter), every thread-list endpoint must filter by `userId`. Without scoping, any signed-in user can list everyone's threads.
|
|
61
|
-
|
|
62
|
-
```ts title="app/api/threads/route.ts"
|
|
63
|
-
import { auth } from "@clerk/nextjs/server";
|
|
64
|
-
import { db } from "@/db";
|
|
65
|
-
import { threads } from "@/db/schema";
|
|
66
|
-
import { eq, desc } from "drizzle-orm";
|
|
67
|
-
|
|
68
|
-
export async function GET() {
|
|
69
|
-
const { userId } = await auth();
|
|
70
|
-
if (!userId) return new Response(null, { status: 401 });
|
|
71
|
-
|
|
72
|
-
const rows = await db
|
|
73
|
-
.select()
|
|
74
|
-
.from(threads)
|
|
75
|
-
.where(eq(threads.userId, userId))
|
|
76
|
-
.orderBy(desc(threads.updatedAt));
|
|
77
|
-
|
|
78
|
-
return Response.json(rows);
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
For organization-scoped threads (Clerk Orgs), pull `orgId` from `auth()` and add it to the where clause. The combination is a stable workspace key:
|
|
83
|
-
|
|
84
|
-
```ts
|
|
85
|
-
import { and, eq } from "drizzle-orm";
|
|
86
|
-
|
|
87
|
-
const { userId, orgId } = await auth();
|
|
88
|
-
if (!userId) return new Response(null, { status: 401 });
|
|
89
|
-
|
|
90
|
-
const rows = await db
|
|
91
|
-
.select()
|
|
92
|
-
.from(threads)
|
|
93
|
-
.where(
|
|
94
|
-
orgId
|
|
95
|
-
? and(eq(threads.orgId, orgId), eq(threads.userId, userId))
|
|
96
|
-
: eq(threads.userId, userId),
|
|
97
|
-
);
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
</Step>
|
|
101
|
-
<Step>
|
|
102
|
-
|
|
103
|
-
### Reload threads after async auth
|
|
104
|
-
|
|
105
|
-
The first render of `<MyProvider>` may run before Clerk resolves the user on the client. Drop a small effect inside `<AssistantRuntimeProvider>` that calls `aui.threads.reload()` once the user is loaded:
|
|
106
|
-
|
|
107
|
-
```tsx title="app/components/ReloadOnAuth.tsx"
|
|
108
|
-
"use client";
|
|
109
|
-
|
|
110
|
-
import { useAui } from "@assistant-ui/react";
|
|
111
|
-
import { useUser } from "@clerk/nextjs";
|
|
112
|
-
import { useEffect } from "react";
|
|
113
|
-
|
|
114
|
-
export function ReloadOnAuth() {
|
|
115
|
-
const aui = useAui();
|
|
116
|
-
const { isLoaded, isSignedIn, user } = useUser();
|
|
117
|
-
useEffect(() => {
|
|
118
|
-
if (isLoaded && isSignedIn) aui.threads.reload();
|
|
119
|
-
}, [isLoaded, isSignedIn, user?.id]);
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
Mount this component anywhere inside your `<AssistantRuntimeProvider>` subtree (typically next to the runtime's provider in `MyProvider`). `reload()` discards in-flight responses from superseded calls, so it is safe to invoke on every auth transition (sign in, sign out, organization switch).
|
|
125
|
-
|
|
126
|
-
</Step>
|
|
127
|
-
<Step>
|
|
128
|
-
|
|
129
|
-
### Run and verify
|
|
130
|
-
|
|
131
|
-
Sign in. Check:
|
|
132
|
-
|
|
133
|
-
- `/api/chat` returns `200` with a streaming response when authenticated; `401` when not.
|
|
134
|
-
- `/api/threads` returns only the current user's threads.
|
|
135
|
-
- Switching users (incognito tab, different account) shows a different thread list.
|
|
136
|
-
- Switching active organization in Clerk's `<OrganizationSwitcher>` triggers a reload (if you wired `orgId` into the where clause).
|
|
137
|
-
|
|
138
|
-
</Step>
|
|
139
|
-
</Steps>
|
|
140
|
-
|
|
141
|
-
## Notes
|
|
142
|
-
|
|
143
|
-
- **Cookies are automatic.** Clerk's session cookie travels with same-origin fetches; no `credentials: "include"` is needed for browser requests to your own API routes.
|
|
144
|
-
- **Server contexts.** `auth()` from `@clerk/nextjs/server` runs in any Next.js server context: server components, route handlers, and server actions. See Clerk's [`auth()` reference](https://clerk.com/docs/references/nextjs/auth) for the supported surfaces.
|
|
145
|
-
- **Cloud users.** If you use AssistantCloud, prefer the [Clerk JWT template integration](/docs/cloud/authorization) over the pattern on this page. Cloud handles workspace assignment and you don't need to build the thread persistence yourself.
|
|
146
|
-
- **B2B with organizations.** Clerk Orgs map cleanly to multi-tenant chat: scope by `orgId` in addition to `userId`, surface Clerk's `<OrganizationSwitcher>` (from `@clerk/nextjs`), and re-fetch threads on org change.
|
|
147
|
-
|
|
148
|
-
## Related
|
|
149
|
-
|
|
150
|
-
<Cards>
|
|
151
|
-
<Card
|
|
152
|
-
title="Custom thread persistence"
|
|
153
|
-
description="The persistence story this page builds on; required for per-user threads outside AssistantCloud."
|
|
154
|
-
href="/docs/integrations/persistence/custom-adapter"
|
|
155
|
-
/>
|
|
156
|
-
<Card
|
|
157
|
-
title="AssistantCloud authorization"
|
|
158
|
-
description="The cloud-managed alternative: Clerk JWT template plus workspace scoping, no DB code."
|
|
159
|
-
href="/docs/cloud/authorization"
|
|
160
|
-
/>
|
|
161
|
-
<Card
|
|
162
|
-
title="Threads (concepts)"
|
|
163
|
-
description="The full RemoteThreadListAdapter contract and reload-on-auth pattern."
|
|
164
|
-
href="/docs/runtimes/concepts/threads"
|
|
165
|
-
/>
|
|
166
|
-
</Cards>
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Auth.js (next-auth)
|
|
3
|
-
description: Gate the chat route and scope thread persistence to the signed-in user with Auth.js v5.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
[Auth.js](https://authjs.dev/) (formerly NextAuth) is the dominant OSS auth library in the Next.js ecosystem. This page covers using it with assistant-ui *without* AssistantCloud: session-cookie auth, server-side `auth()` checks on the API route, and per-user scoping on a custom thread list.
|
|
7
|
-
|
|
8
|
-
If you use AssistantCloud, see [cloud authorization](/docs/cloud) instead; cloud handles JWT exchange for you.
|
|
9
|
-
|
|
10
|
-
## How it works
|
|
11
|
-
|
|
12
|
-
```mermaid
|
|
13
|
-
flowchart LR
|
|
14
|
-
browser["browser"] --> routes["/api/chat<br/>/api/threads/*"] --> auth["auth() returns session"] --> scope["scope queries by<br/>session.user.id"] --> db["database"]
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Three places auth touches the integration:
|
|
18
|
-
|
|
19
|
-
1. **API routes** (`/api/chat`, `/api/threads/*`) call `auth()` server-side, return 401 if no session, then scope DB queries by `session.user.id`.
|
|
20
|
-
2. **`RemoteThreadListAdapter`** does nothing auth-specific; the cookie travels with the `fetch` calls automatically (same origin).
|
|
21
|
-
3. **Reload-on-auth**: if the session resolves after the initial render, call `aui.threads.reload()` so the list re-fetches with the new identity.
|
|
22
|
-
|
|
23
|
-
## Setup
|
|
24
|
-
|
|
25
|
-
This guide assumes you already have Auth.js configured. If not, follow the [Auth.js installation guide](https://authjs.dev/getting-started/installation?framework=Next.js) first; the steps below pick up after `auth.ts` exports `{ handlers, signIn, signOut, auth }`.
|
|
26
|
-
|
|
27
|
-
<Steps>
|
|
28
|
-
<Step>
|
|
29
|
-
|
|
30
|
-
### Populate `session.user.id`
|
|
31
|
-
|
|
32
|
-
By default, Auth.js v5 does **not** include a stable `id` on `session.user`; only `email`, `name`, and `image` are exposed. Without this step, the scoping queries below all run with `userId: undefined` and silently match every row.
|
|
33
|
-
|
|
34
|
-
Add `jwt` and `session` callbacks to your Auth.js config so the user id flows through. For the JWT session strategy:
|
|
35
|
-
|
|
36
|
-
```ts title="auth.ts"
|
|
37
|
-
import NextAuth from "next-auth";
|
|
38
|
-
|
|
39
|
-
export const { handlers, signIn, signOut, auth } = NextAuth({
|
|
40
|
-
providers: [/* your providers */],
|
|
41
|
-
callbacks: {
|
|
42
|
-
async jwt({ token, user }) {
|
|
43
|
-
if (user) token.id = user.id;
|
|
44
|
-
return token;
|
|
45
|
-
},
|
|
46
|
-
async session({ session, token }) {
|
|
47
|
-
if (token.id) session.user.id = token.id as string;
|
|
48
|
-
return session;
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
If you use the database session strategy, replace the `jwt`/`session` pair with a single `session` callback that copies from the `user` argument: `session.user.id = user.id`. See [Auth.js: extending the session](https://authjs.dev/guides/extending-the-session) for the full pattern.
|
|
55
|
-
|
|
56
|
-
</Step>
|
|
57
|
-
<Step>
|
|
58
|
-
|
|
59
|
-
### Gate the chat route
|
|
60
|
-
|
|
61
|
-
Add an `auth()` check to the existing AI SDK route. Return 401 before calling the model so unauthenticated traffic doesn't burn provider credits.
|
|
62
|
-
|
|
63
|
-
```ts title="app/api/chat/route.ts"
|
|
64
|
-
import { auth } from "@/auth";
|
|
65
|
-
import { openai } from "@ai-sdk/openai";
|
|
66
|
-
import { streamText, convertToModelMessages } from "ai";
|
|
67
|
-
import type { UIMessage } from "ai";
|
|
68
|
-
|
|
69
|
-
export async function POST(req: Request) {
|
|
70
|
-
const session = await auth();
|
|
71
|
-
if (!session?.user) return new Response("Unauthorized", { status: 401 });
|
|
72
|
-
|
|
73
|
-
const { messages }: { messages: UIMessage[] } = await req.json();
|
|
74
|
-
const result = streamText({
|
|
75
|
-
model: openai("gpt-5.6-luna"),
|
|
76
|
-
messages: await convertToModelMessages(messages),
|
|
77
|
-
});
|
|
78
|
-
return result.toUIMessageStreamResponse();
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
</Step>
|
|
83
|
-
<Step>
|
|
84
|
-
|
|
85
|
-
### Scope thread queries by user
|
|
86
|
-
|
|
87
|
-
If you also use [custom thread persistence](/docs/integrations/persistence/custom-adapter), every thread-list endpoint must filter by `session.user.id`. Without scoping, any signed-in user can list everyone's threads.
|
|
88
|
-
|
|
89
|
-
```ts title="app/api/threads/route.ts"
|
|
90
|
-
import { auth } from "@/auth";
|
|
91
|
-
import { db } from "@/db";
|
|
92
|
-
import { threads } from "@/db/schema";
|
|
93
|
-
import { eq, desc } from "drizzle-orm";
|
|
94
|
-
|
|
95
|
-
export async function GET() {
|
|
96
|
-
const session = await auth();
|
|
97
|
-
if (!session?.user) return new Response(null, { status: 401 });
|
|
98
|
-
|
|
99
|
-
const rows = await db
|
|
100
|
-
.select()
|
|
101
|
-
.from(threads)
|
|
102
|
-
.where(eq(threads.userId, session.user.id))
|
|
103
|
-
.orderBy(desc(threads.updatedAt));
|
|
104
|
-
|
|
105
|
-
return Response.json(rows);
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
Apply the same pattern to `POST`, `PATCH`, and `DELETE` handlers. Always verify ownership before mutating.
|
|
110
|
-
|
|
111
|
-
</Step>
|
|
112
|
-
<Step>
|
|
113
|
-
|
|
114
|
-
### Reload threads after async auth
|
|
115
|
-
|
|
116
|
-
The first render of `<MyProvider>` may run before `auth()` resolves on the client. The thread list will be empty until the user refreshes. Drop a small effect into the layout to call `aui.threads.reload()` once the session resolves.
|
|
117
|
-
|
|
118
|
-
`useSession` requires `<SessionProvider>` higher in the tree. Wrap your root layout's client subtree once:
|
|
119
|
-
|
|
120
|
-
```tsx title="app/providers.tsx"
|
|
121
|
-
"use client";
|
|
122
|
-
|
|
123
|
-
import { SessionProvider } from "next-auth/react";
|
|
124
|
-
|
|
125
|
-
export function Providers({ children }: { children: React.ReactNode }) {
|
|
126
|
-
return <SessionProvider>{children}</SessionProvider>;
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
Then inside the assistant runtime provider, mount a small effect:
|
|
131
|
-
|
|
132
|
-
```tsx title="app/components/ReloadOnAuth.tsx"
|
|
133
|
-
"use client";
|
|
134
|
-
|
|
135
|
-
import { useAui } from "@assistant-ui/react";
|
|
136
|
-
import { useSession } from "next-auth/react";
|
|
137
|
-
import { useEffect } from "react";
|
|
138
|
-
|
|
139
|
-
export function ReloadOnAuth() {
|
|
140
|
-
const aui = useAui();
|
|
141
|
-
const { status, data } = useSession();
|
|
142
|
-
useEffect(() => {
|
|
143
|
-
if (status === "authenticated") aui.threads.reload();
|
|
144
|
-
}, [status, data?.user?.id]);
|
|
145
|
-
return null;
|
|
146
|
-
}
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
`reload()` discards in-flight responses from superseded calls, so it is safe to invoke on every auth transition.
|
|
150
|
-
|
|
151
|
-
</Step>
|
|
152
|
-
<Step>
|
|
153
|
-
|
|
154
|
-
### Run and verify
|
|
155
|
-
|
|
156
|
-
Sign in. Check:
|
|
157
|
-
|
|
158
|
-
- `/api/chat` returns `200` with a streaming response when authenticated; `401` when not.
|
|
159
|
-
- `/api/threads` returns only the current user's threads.
|
|
160
|
-
- A second user (incognito tab, different account) sees a different thread list.
|
|
161
|
-
- Signing out and back in does not show the previous user's threads even briefly; if it does, `ReloadOnAuth` isn't mounted or isn't watching the right session field.
|
|
162
|
-
|
|
163
|
-
</Step>
|
|
164
|
-
</Steps>
|
|
165
|
-
|
|
166
|
-
## Notes
|
|
167
|
-
|
|
168
|
-
- **Same-origin cookies.** Browser cookies travel automatically when frontend and API are on the same origin. If you split the API onto a different host, set `credentials: "include"` on every `fetch` and configure CORS on the API.
|
|
169
|
-
- **Edge runtime.** `auth()` runs in Edge contexts only when your DB adapter is edge-compatible. If you use Prisma, Drizzle-over-`pg`, or another non-edge adapter together with Edge route handlers or pre-Next.js 16 middleware, follow Auth.js's [split-config pattern](https://authjs.dev/guides/edge-compatibility): keep a shared `auth.config.ts` without the adapter, instantiate the full `auth.ts` with the adapter elsewhere, and import only the config-instantiated `auth` inside middleware. Next.js 16+ runs `proxy.ts` on Node, so this workaround is generally unnecessary there.
|
|
170
|
-
- **Roles and orgs.** For B2B SaaS where admins see all threads under an org, add `orgId` to the `threads` table, store the user's role in the session via the Auth.js callbacks, and gate `list()` accordingly. The pattern is the same; the `where` clause just gets richer.
|
|
171
|
-
- **OAuth providers.** This page is provider-agnostic. The same `auth()` pattern works whether you wired GitHub, Google, credentials, or a passkey provider in `auth.ts`.
|
|
172
|
-
|
|
173
|
-
## Related
|
|
174
|
-
|
|
175
|
-
<Cards>
|
|
176
|
-
<Card
|
|
177
|
-
title="Custom thread persistence"
|
|
178
|
-
description="The persistence story this page assumes; required for per-user threads outside AssistantCloud."
|
|
179
|
-
href="/docs/integrations/persistence/custom-adapter"
|
|
180
|
-
/>
|
|
181
|
-
<Card
|
|
182
|
-
title="AssistantCloud"
|
|
183
|
-
description="The managed alternative; cloud handles JWT exchange with Clerk, Auth0, Supabase, Firebase."
|
|
184
|
-
href="/docs/cloud"
|
|
185
|
-
/>
|
|
186
|
-
<Card
|
|
187
|
-
title="Threads (concepts)"
|
|
188
|
-
description="The full RemoteThreadListAdapter contract and reload-on-auth pattern."
|
|
189
|
-
href="/docs/runtimes/concepts/threads"
|
|
190
|
-
/>
|
|
191
|
-
</Cards>
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Vercel AI SDK Integration
|
|
3
|
-
description: Wire the Vercel AI SDK into a React chat UI with assistant-ui — useChat, streaming, tools, attachments, multi-step agents, and persistence covered end-to-end.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
import { VercelIcon } from "@/components/icons/vercel";
|
|
7
|
-
|
|
8
|
-
[Vercel AI SDK](https://ai-sdk.dev/) is the most common framework people pair with assistant-ui. The full setup, attachments, persistence, tool-call patterns, and version notes are documented under [runtimes/ai-sdk](/docs/runtimes/ai-sdk/overview); this page is the entry point in the integrations tree for discoverability and architecture context.
|
|
9
|
-
|
|
10
|
-
<Callout type="info">
|
|
11
|
-
If you arrived here looking to wire up your first chat: jump to [AI SDK v7 quickstart](/docs/runtimes/ai-sdk/v7). This page is a high-level pointer.
|
|
12
|
-
</Callout>
|
|
13
|
-
|
|
14
|
-
## Where it slots in
|
|
15
|
-
|
|
16
|
-
```mermaid
|
|
17
|
-
flowchart LR
|
|
18
|
-
client["client"]
|
|
19
|
-
runtime["useChatRuntime (react-ai-sdk)<br/>(thread state · tool calls · attachments<br/>speech · dictation · feedback adapters)"]
|
|
20
|
-
api["/api/chat<br/>(streamText)"]
|
|
21
|
-
provider["provider"]
|
|
22
|
-
|
|
23
|
-
client --> runtime --> api --> provider
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
`@assistant-ui/react-ai-sdk` wraps the AI SDK's `useChat` hook and exposes it as an assistant-ui runtime. The runtime owns conversation state on the client; your `/api/chat` route returns a UI message stream from `streamText`. Everything else (tools, attachments, observability, gateways, custom persistence) layers on top of this base.
|
|
27
|
-
|
|
28
|
-
## Pick a version
|
|
29
|
-
|
|
30
|
-
Four versions of `ai` are supported. New projects should pick **v7**; v6, v5, and v4 are documented for migration and existing apps that haven't upgraded.
|
|
31
|
-
|
|
32
|
-
<Cards>
|
|
33
|
-
<Card
|
|
34
|
-
icon={<VercelIcon width={20} height={20} />}
|
|
35
|
-
title="AI SDK v7 (current)"
|
|
36
|
-
description="Requires ai@^7 and @ai-sdk/react@^4. Async convertToModelMessages, tool inputSchema, toUIMessageStreamResponse."
|
|
37
|
-
href="/docs/runtimes/ai-sdk/v7"
|
|
38
|
-
/>
|
|
39
|
-
<Card
|
|
40
|
-
icon={<VercelIcon width={20} height={20} />}
|
|
41
|
-
title="AI SDK v6 (legacy)"
|
|
42
|
-
description="Requires ai@^6 and @ai-sdk/react@^3. Async convertToModelMessages, tool inputSchema, toUIMessageStreamResponse."
|
|
43
|
-
href="/docs/runtimes/ai-sdk/v6-legacy"
|
|
44
|
-
/>
|
|
45
|
-
<Card
|
|
46
|
-
icon={<VercelIcon width={20} height={20} />}
|
|
47
|
-
title="AI SDK v5 (legacy)"
|
|
48
|
-
description="Requires ai@^5 and @ai-sdk/react@^2. Synchronous convertToModelMessages, transitional API."
|
|
49
|
-
href="/docs/runtimes/ai-sdk/v5-legacy"
|
|
50
|
-
/>
|
|
51
|
-
<Card
|
|
52
|
-
icon={<VercelIcon width={20} height={20} />}
|
|
53
|
-
title="AI SDK v4 (legacy)"
|
|
54
|
-
description="The original useChat-based path. Maintained for migration only."
|
|
55
|
-
href="/docs/runtimes/ai-sdk/v4-legacy"
|
|
56
|
-
/>
|
|
57
|
-
</Cards>
|
|
58
|
-
|
|
59
|
-
## When to pick AI SDK
|
|
60
|
-
|
|
61
|
-
AI SDK is the default choice for new projects on Next.js, Remix, or any framework with a Node-compatible API route. Pick it when:
|
|
62
|
-
|
|
63
|
-
- You want a single direct path from the chat UI to your model with the smallest possible code surface.
|
|
64
|
-
- You will compose with a framework like [Mastra](/docs/integrations/frameworks/mastra/overview), an [observability tool](/docs/integrations/observability/helicone), an [LLM gateway](/docs/integrations/gateways), or [tools through MCP](/docs/tools/mcp), all of which assume an AI SDK route.
|
|
65
|
-
- You want first-party `frontendTools`, attachments, multi-step tool calls, token-usage metadata, and persisted history via `withFormat`.
|
|
66
|
-
|
|
67
|
-
If you need streaming agent state (subgraph events, generative UI messages), look at [LangGraph](/docs/runtimes/langgraph/overview) instead. If you have a different protocol-shaped backend (A2A, AG-UI, OpenCode), see [pick a runtime](/docs/runtimes/pick-a-runtime).
|
|
68
|
-
|
|
69
|
-
## Related
|
|
70
|
-
|
|
71
|
-
<Cards>
|
|
72
|
-
<Card
|
|
73
|
-
icon={<VercelIcon width={20} height={20} />}
|
|
74
|
-
title="AI SDK runtime overview"
|
|
75
|
-
description="The full runtime documentation and version selector."
|
|
76
|
-
href="/docs/runtimes/ai-sdk/overview"
|
|
77
|
-
/>
|
|
78
|
-
<Card
|
|
79
|
-
title="Pick a runtime"
|
|
80
|
-
description="Decision guide if you're not sure AI SDK is the right runtime."
|
|
81
|
-
href="/docs/runtimes/pick-a-runtime"
|
|
82
|
-
/>
|
|
83
|
-
<Card
|
|
84
|
-
title="Mastra"
|
|
85
|
-
description="The other framework integration in this section. Wired through AI SDK."
|
|
86
|
-
href="/docs/integrations/frameworks/mastra/overview"
|
|
87
|
-
/>
|
|
88
|
-
</Cards>
|