@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,667 +0,0 @@
|
|
|
1
|
-
# Example: with-resumable-stream
|
|
2
|
-
|
|
3
|
-
## app/api/chat/resume/[streamId]/route.ts
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
import { UI_MESSAGE_STREAM_HEADERS } from "ai";
|
|
7
|
-
import { RESUMABLE_STREAM_ID_HEADER } from "assistant-stream/resumable";
|
|
8
|
-
import { getResumableStreamContext } from "@/lib/resumable-context";
|
|
9
|
-
|
|
10
|
-
export const maxDuration = 60;
|
|
11
|
-
|
|
12
|
-
export async function GET(
|
|
13
|
-
_req: Request,
|
|
14
|
-
context: { params: Promise<{ streamId: string }> },
|
|
15
|
-
) {
|
|
16
|
-
const { streamId } = await context.params;
|
|
17
|
-
const ctx = await getResumableStreamContext();
|
|
18
|
-
const stream = await ctx.resume(streamId);
|
|
19
|
-
|
|
20
|
-
if (!stream) {
|
|
21
|
-
return new Response(JSON.stringify({ error: "stream not found" }), {
|
|
22
|
-
status: 404,
|
|
23
|
-
headers: { "Content-Type": "application/json" },
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return new Response(stream, {
|
|
28
|
-
headers: {
|
|
29
|
-
...UI_MESSAGE_STREAM_HEADERS,
|
|
30
|
-
[RESUMABLE_STREAM_ID_HEADER]: streamId,
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## app/api/chat/route.ts
|
|
38
|
-
|
|
39
|
-
```typescript
|
|
40
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
41
|
-
import {
|
|
42
|
-
type JSONSchema7,
|
|
43
|
-
streamText,
|
|
44
|
-
convertToModelMessages,
|
|
45
|
-
createUIMessageStream,
|
|
46
|
-
JsonToSseTransformStream,
|
|
47
|
-
type UIMessage,
|
|
48
|
-
tool,
|
|
49
|
-
stepCountIs,
|
|
50
|
-
zodSchema,
|
|
51
|
-
} from "ai";
|
|
52
|
-
import { RESUMABLE_STREAM_ID_HEADER } from "assistant-stream/resumable";
|
|
53
|
-
import { z } from "zod";
|
|
54
|
-
import { getResumableStreamContext } from "@/lib/resumable-context";
|
|
55
|
-
|
|
56
|
-
export const maxDuration = 60;
|
|
57
|
-
|
|
58
|
-
export async function POST(req: Request) {
|
|
59
|
-
const {
|
|
60
|
-
messages,
|
|
61
|
-
system,
|
|
62
|
-
tools,
|
|
63
|
-
}: {
|
|
64
|
-
id?: string;
|
|
65
|
-
messages: UIMessage[];
|
|
66
|
-
system?: string;
|
|
67
|
-
tools?: Record<string, { description?: string; parameters: JSONSchema7 }>;
|
|
68
|
-
} = await req.json();
|
|
69
|
-
|
|
70
|
-
const streamId = crypto.randomUUID();
|
|
71
|
-
|
|
72
|
-
const sourceBody = process.env["OPENAI_API_KEY"]
|
|
73
|
-
? await buildOpenAIBody({
|
|
74
|
-
messages,
|
|
75
|
-
...(system && { system }),
|
|
76
|
-
...(tools && { tools }),
|
|
77
|
-
})
|
|
78
|
-
: buildMockBody({ messages });
|
|
79
|
-
|
|
80
|
-
const context = await getResumableStreamContext();
|
|
81
|
-
const stream = await context.run(streamId, () => sourceBody);
|
|
82
|
-
|
|
83
|
-
return new Response(stream, {
|
|
84
|
-
headers: {
|
|
85
|
-
"Content-Type": "text/event-stream",
|
|
86
|
-
"Cache-Control": "no-cache",
|
|
87
|
-
Connection: "keep-alive",
|
|
88
|
-
[RESUMABLE_STREAM_ID_HEADER]: streamId,
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function convertFrontendTools(
|
|
94
|
-
tools: Record<string, { description?: string; parameters: JSONSchema7 }>,
|
|
95
|
-
): Record<string, ReturnType<typeof tool>> {
|
|
96
|
-
return Object.fromEntries(
|
|
97
|
-
Object.entries(tools).map(([name, t]) => [
|
|
98
|
-
name,
|
|
99
|
-
tool({
|
|
100
|
-
...(t.description ? { description: t.description } : {}),
|
|
101
|
-
inputSchema: t.parameters as never,
|
|
102
|
-
}),
|
|
103
|
-
]),
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async function buildOpenAIBody({
|
|
108
|
-
messages,
|
|
109
|
-
system,
|
|
110
|
-
tools,
|
|
111
|
-
}: {
|
|
112
|
-
messages: UIMessage[];
|
|
113
|
-
system?: string;
|
|
114
|
-
tools?: Record<string, { description?: string; parameters: JSONSchema7 }>;
|
|
115
|
-
}): Promise<ReadableStream<Uint8Array>> {
|
|
116
|
-
const openai = createOpenAI({
|
|
117
|
-
apiKey: process.env["OPENAI_API_KEY"]!,
|
|
118
|
-
...(process.env["OPENAI_BASE_URL"] && {
|
|
119
|
-
baseURL: process.env["OPENAI_BASE_URL"],
|
|
120
|
-
}),
|
|
121
|
-
});
|
|
122
|
-
const result = streamText({
|
|
123
|
-
model: openai("gpt-5.6-luna"),
|
|
124
|
-
messages: await convertToModelMessages(messages),
|
|
125
|
-
...(system ? { system } : {}),
|
|
126
|
-
stopWhen: stepCountIs(10),
|
|
127
|
-
tools: {
|
|
128
|
-
...convertFrontendTools(tools ?? {}),
|
|
129
|
-
get_current_weather: tool({
|
|
130
|
-
description: "Get the current weather",
|
|
131
|
-
inputSchema: zodSchema(z.object({ city: z.string() })),
|
|
132
|
-
execute: async ({ city }) => `The weather in ${city} is sunny`,
|
|
133
|
-
}),
|
|
134
|
-
slow_count: tool({
|
|
135
|
-
description: "Count slowly to N",
|
|
136
|
-
inputSchema: zodSchema(
|
|
137
|
-
z.object({ to: z.number().int().min(1).max(50) }),
|
|
138
|
-
),
|
|
139
|
-
execute: async ({ to }) => {
|
|
140
|
-
await new Promise((r) => setTimeout(r, to * 200));
|
|
141
|
-
return `counted to ${to}`;
|
|
142
|
-
},
|
|
143
|
-
}),
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
const response = result.toUIMessageStreamResponse();
|
|
148
|
-
if (!response.body) throw new Error("expected response body");
|
|
149
|
-
return response.body;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function buildMockBody({
|
|
153
|
-
messages,
|
|
154
|
-
}: {
|
|
155
|
-
messages: UIMessage[];
|
|
156
|
-
}): ReadableStream<Uint8Array> {
|
|
157
|
-
const lastUserText =
|
|
158
|
-
messages
|
|
159
|
-
.filter((m) => m.role === "user")
|
|
160
|
-
.at(-1)
|
|
161
|
-
?.parts.flatMap((p) =>
|
|
162
|
-
p.type === "text" ? [(p as { type: "text"; text: string }).text] : [],
|
|
163
|
-
)
|
|
164
|
-
.join(" ") ?? "your message";
|
|
165
|
-
|
|
166
|
-
const text =
|
|
167
|
-
`(mock response. set OPENAI_API_KEY for the real model)\n\n` +
|
|
168
|
-
`you said: ${lastUserText}\n\n` +
|
|
169
|
-
`here is a slow stream you can interrupt mid-flight by reloading the page. ` +
|
|
170
|
-
`the resumable layer keeps the producer running on the server, so when ` +
|
|
171
|
-
`the browser reconnects it continues right where it left off, with no ` +
|
|
172
|
-
`wasted tokens and no lost progress. ` +
|
|
173
|
-
`lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod ` +
|
|
174
|
-
`tempor incididunt ut labore et dolore magna aliqua. ut enim ad minim ` +
|
|
175
|
-
`veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ` +
|
|
176
|
-
`commodo consequat. duis aute irure dolor in reprehenderit in voluptate ` +
|
|
177
|
-
`velit esse cillum dolore eu fugiat nulla pariatur. excepteur sint ` +
|
|
178
|
-
`occaecat cupidatat non proident, sunt in culpa qui officia deserunt ` +
|
|
179
|
-
`mollit anim id est laborum.\n\n` +
|
|
180
|
-
`done.`;
|
|
181
|
-
|
|
182
|
-
const messageId = `msg-${crypto.randomUUID()}`;
|
|
183
|
-
const textPartId = `text-${crypto.randomUUID()}`;
|
|
184
|
-
const tokens = text.match(/\S+\s*|\s+/g) ?? [text];
|
|
185
|
-
|
|
186
|
-
const uiStream = createUIMessageStream({
|
|
187
|
-
execute: async ({ writer }) => {
|
|
188
|
-
writer.write({ type: "start", messageId });
|
|
189
|
-
writer.write({ type: "start-step" });
|
|
190
|
-
writer.write({ type: "text-start", id: textPartId });
|
|
191
|
-
for (const tok of tokens) {
|
|
192
|
-
await new Promise((r) => setTimeout(r, 250));
|
|
193
|
-
writer.write({
|
|
194
|
-
type: "text-delta",
|
|
195
|
-
id: textPartId,
|
|
196
|
-
delta: tok,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
writer.write({ type: "text-end", id: textPartId });
|
|
200
|
-
writer.write({ type: "finish-step" });
|
|
201
|
-
writer.write({ type: "finish" });
|
|
202
|
-
},
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
return uiStream
|
|
206
|
-
.pipeThrough(new JsonToSseTransformStream())
|
|
207
|
-
.pipeThrough(new TextEncoderStream());
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
## app/globals.css
|
|
213
|
-
|
|
214
|
-
```css
|
|
215
|
-
@import "tailwindcss";
|
|
216
|
-
@import "tw-animate-css";
|
|
217
|
-
|
|
218
|
-
@source "../../../packages/ui/src";
|
|
219
|
-
|
|
220
|
-
@custom-variant dark (&:is(.dark *));
|
|
221
|
-
|
|
222
|
-
@theme inline {
|
|
223
|
-
--radius-sm: calc(var(--radius) - 4px);
|
|
224
|
-
--radius-md: calc(var(--radius) - 2px);
|
|
225
|
-
--radius-lg: var(--radius);
|
|
226
|
-
--radius-xl: calc(var(--radius) + 4px);
|
|
227
|
-
--color-background: var(--background);
|
|
228
|
-
--color-foreground: var(--foreground);
|
|
229
|
-
--color-card: var(--card);
|
|
230
|
-
--color-card-foreground: var(--card-foreground);
|
|
231
|
-
--color-popover: var(--popover);
|
|
232
|
-
--color-popover-foreground: var(--popover-foreground);
|
|
233
|
-
--color-primary: var(--primary);
|
|
234
|
-
--color-primary-foreground: var(--primary-foreground);
|
|
235
|
-
--color-secondary: var(--secondary);
|
|
236
|
-
--color-secondary-foreground: var(--secondary-foreground);
|
|
237
|
-
--color-muted: var(--muted);
|
|
238
|
-
--color-muted-foreground: var(--muted-foreground);
|
|
239
|
-
--color-accent: var(--accent);
|
|
240
|
-
--color-accent-foreground: var(--accent-foreground);
|
|
241
|
-
--color-destructive: var(--destructive);
|
|
242
|
-
--color-border: var(--border);
|
|
243
|
-
--color-input: var(--input);
|
|
244
|
-
--color-ring: var(--ring);
|
|
245
|
-
--color-chart-1: var(--chart-1);
|
|
246
|
-
--color-chart-2: var(--chart-2);
|
|
247
|
-
--color-chart-3: var(--chart-3);
|
|
248
|
-
--color-chart-4: var(--chart-4);
|
|
249
|
-
--color-chart-5: var(--chart-5);
|
|
250
|
-
--color-sidebar: var(--sidebar);
|
|
251
|
-
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
252
|
-
--color-sidebar-primary: var(--sidebar-primary);
|
|
253
|
-
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
254
|
-
--color-sidebar-accent: var(--sidebar-accent);
|
|
255
|
-
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
256
|
-
--color-sidebar-border: var(--sidebar-border);
|
|
257
|
-
--color-sidebar-ring: var(--sidebar-ring);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
:root {
|
|
261
|
-
--radius: 0.625rem;
|
|
262
|
-
--background: oklch(1 0 0);
|
|
263
|
-
--foreground: oklch(0.141 0.005 285.823);
|
|
264
|
-
--card: oklch(1 0 0);
|
|
265
|
-
--card-foreground: oklch(0.141 0.005 285.823);
|
|
266
|
-
--popover: oklch(1 0 0);
|
|
267
|
-
--popover-foreground: oklch(0.141 0.005 285.823);
|
|
268
|
-
--primary: oklch(0.21 0.006 285.885);
|
|
269
|
-
--primary-foreground: oklch(0.985 0 0);
|
|
270
|
-
--secondary: oklch(0.967 0.001 286.375);
|
|
271
|
-
--secondary-foreground: oklch(0.21 0.006 285.885);
|
|
272
|
-
--muted: oklch(0.967 0.001 286.375);
|
|
273
|
-
--muted-foreground: oklch(0.552 0.016 285.938);
|
|
274
|
-
--accent: oklch(0.967 0.001 286.375);
|
|
275
|
-
--accent-foreground: oklch(0.21 0.006 285.885);
|
|
276
|
-
--destructive: oklch(0.577 0.245 27.325);
|
|
277
|
-
--border: oklch(0.92 0.004 286.32);
|
|
278
|
-
--input: oklch(0.92 0.004 286.32);
|
|
279
|
-
--ring: oklch(0.705 0.015 286.067);
|
|
280
|
-
--chart-1: oklch(0.646 0.222 41.116);
|
|
281
|
-
--chart-2: oklch(0.6 0.118 184.704);
|
|
282
|
-
--chart-3: oklch(0.398 0.07 227.392);
|
|
283
|
-
--chart-4: oklch(0.828 0.189 84.429);
|
|
284
|
-
--chart-5: oklch(0.769 0.188 70.08);
|
|
285
|
-
--sidebar: oklch(0.985 0 0);
|
|
286
|
-
--sidebar-foreground: oklch(0.141 0.005 285.823);
|
|
287
|
-
--sidebar-primary: oklch(0.21 0.006 285.885);
|
|
288
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
289
|
-
--sidebar-accent: oklch(0.967 0.001 286.375);
|
|
290
|
-
--sidebar-accent-foreground: oklch(0.21 0.006 285.885);
|
|
291
|
-
--sidebar-border: oklch(0.92 0.004 286.32);
|
|
292
|
-
--sidebar-ring: oklch(0.705 0.015 286.067);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
.dark {
|
|
296
|
-
--background: oklch(0.141 0.005 285.823);
|
|
297
|
-
--foreground: oklch(0.985 0 0);
|
|
298
|
-
--card: oklch(0.21 0.006 285.885);
|
|
299
|
-
--card-foreground: oklch(0.985 0 0);
|
|
300
|
-
--popover: oklch(0.21 0.006 285.885);
|
|
301
|
-
--popover-foreground: oklch(0.985 0 0);
|
|
302
|
-
--primary: oklch(0.92 0.004 286.32);
|
|
303
|
-
--primary-foreground: oklch(0.21 0.006 285.885);
|
|
304
|
-
--secondary: oklch(0.274 0.006 286.033);
|
|
305
|
-
--secondary-foreground: oklch(0.985 0 0);
|
|
306
|
-
--muted: oklch(0.274 0.006 286.033);
|
|
307
|
-
--muted-foreground: oklch(0.705 0.015 286.067);
|
|
308
|
-
--accent: oklch(0.274 0.006 286.033);
|
|
309
|
-
--accent-foreground: oklch(0.985 0 0);
|
|
310
|
-
--destructive: oklch(0.704 0.191 22.216);
|
|
311
|
-
--border: oklch(1 0 0 / 10%);
|
|
312
|
-
--input: oklch(1 0 0 / 15%);
|
|
313
|
-
--ring: oklch(0.552 0.016 285.938);
|
|
314
|
-
--chart-1: oklch(0.488 0.243 264.376);
|
|
315
|
-
--chart-2: oklch(0.696 0.17 162.48);
|
|
316
|
-
--chart-3: oklch(0.769 0.188 70.08);
|
|
317
|
-
--chart-4: oklch(0.627 0.265 303.9);
|
|
318
|
-
--chart-5: oklch(0.645 0.246 16.439);
|
|
319
|
-
--sidebar: oklch(0.21 0.006 285.885);
|
|
320
|
-
--sidebar-foreground: oklch(0.985 0 0);
|
|
321
|
-
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
322
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
323
|
-
--sidebar-accent: oklch(0.274 0.006 286.033);
|
|
324
|
-
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
325
|
-
--sidebar-border: oklch(1 0 0 / 10%);
|
|
326
|
-
--sidebar-ring: oklch(0.552 0.016 285.938);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
@layer base {
|
|
330
|
-
* {
|
|
331
|
-
@apply border-border outline-ring/50;
|
|
332
|
-
}
|
|
333
|
-
body {
|
|
334
|
-
@apply bg-background text-foreground;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
## app/layout.tsx
|
|
341
|
-
|
|
342
|
-
```tsx
|
|
343
|
-
import type { Metadata } from "next";
|
|
344
|
-
import "./globals.css";
|
|
345
|
-
|
|
346
|
-
export const metadata: Metadata = {
|
|
347
|
-
title: "Resumable Stream Example",
|
|
348
|
-
description:
|
|
349
|
-
"Demonstrates assistant-stream/resumable: persist an in-flight LLM response so the client can reload mid-stream and pick up where it left off.",
|
|
350
|
-
};
|
|
351
|
-
|
|
352
|
-
export default function RootLayout({
|
|
353
|
-
children,
|
|
354
|
-
}: Readonly<{
|
|
355
|
-
children: React.ReactNode;
|
|
356
|
-
}>) {
|
|
357
|
-
return (
|
|
358
|
-
<html lang="en">
|
|
359
|
-
<body className="h-dvh">{children}</body>
|
|
360
|
-
</html>
|
|
361
|
-
);
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
## app/page.tsx
|
|
367
|
-
|
|
368
|
-
```tsx
|
|
369
|
-
"use client";
|
|
370
|
-
|
|
371
|
-
import { useMemo } from "react";
|
|
372
|
-
import { AssistantRuntimeProvider } from "@assistant-ui/react";
|
|
373
|
-
import {
|
|
374
|
-
AssistantChatTransport,
|
|
375
|
-
createResumableSessionStorage,
|
|
376
|
-
useChatRuntime,
|
|
377
|
-
} from "@assistant-ui/react-ai-sdk";
|
|
378
|
-
import { Thread } from "@/components/assistant-ui/thread";
|
|
379
|
-
|
|
380
|
-
const storage = createResumableSessionStorage();
|
|
381
|
-
|
|
382
|
-
export default function Home() {
|
|
383
|
-
const transport = useMemo(
|
|
384
|
-
() =>
|
|
385
|
-
new AssistantChatTransport({
|
|
386
|
-
api: "/api/chat",
|
|
387
|
-
resumable: {
|
|
388
|
-
storage,
|
|
389
|
-
resumeApi: (streamId) => `/api/chat/resume/${streamId}`,
|
|
390
|
-
},
|
|
391
|
-
}),
|
|
392
|
-
[],
|
|
393
|
-
);
|
|
394
|
-
|
|
395
|
-
const runtime = useChatRuntime({ transport });
|
|
396
|
-
|
|
397
|
-
return (
|
|
398
|
-
<AssistantRuntimeProvider runtime={runtime}>
|
|
399
|
-
<div className="h-full">
|
|
400
|
-
<Thread />
|
|
401
|
-
</div>
|
|
402
|
-
</AssistantRuntimeProvider>
|
|
403
|
-
);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
## components.json
|
|
409
|
-
|
|
410
|
-
```json
|
|
411
|
-
{
|
|
412
|
-
"$schema": "https://ui.shadcn.com/schema.json",
|
|
413
|
-
"style": "new-york",
|
|
414
|
-
"rsc": true,
|
|
415
|
-
"tsx": true,
|
|
416
|
-
"tailwind": {
|
|
417
|
-
"config": "",
|
|
418
|
-
"css": "app/globals.css",
|
|
419
|
-
"baseColor": "zinc",
|
|
420
|
-
"cssVariables": true,
|
|
421
|
-
"prefix": ""
|
|
422
|
-
},
|
|
423
|
-
"aliases": {
|
|
424
|
-
"components": "@/components",
|
|
425
|
-
"utils": "@/lib/utils",
|
|
426
|
-
"ui": "@/components/ui",
|
|
427
|
-
"lib": "@/lib",
|
|
428
|
-
"hooks": "@/hooks"
|
|
429
|
-
},
|
|
430
|
-
"iconLibrary": "lucide",
|
|
431
|
-
"registries": {
|
|
432
|
-
"@assistant-ui": "https://r.assistant-ui.com/{name}.json"
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
## lib/resumable-context.ts
|
|
439
|
-
|
|
440
|
-
```typescript
|
|
441
|
-
import {
|
|
442
|
-
createInMemoryResumableStreamStore,
|
|
443
|
-
createResumableStreamContext,
|
|
444
|
-
type ResumableStreamContext,
|
|
445
|
-
type ResumableStreamStore,
|
|
446
|
-
} from "assistant-stream/resumable";
|
|
447
|
-
|
|
448
|
-
const GLOBAL_KEY = Symbol.for("assistant-ui.example.resumable-context");
|
|
449
|
-
|
|
450
|
-
type GlobalSlot = typeof globalThis & {
|
|
451
|
-
[GLOBAL_KEY]?: Promise<ResumableStreamContext>;
|
|
452
|
-
};
|
|
453
|
-
|
|
454
|
-
const slot = globalThis as GlobalSlot;
|
|
455
|
-
|
|
456
|
-
export function getResumableStreamContext(): Promise<ResumableStreamContext> {
|
|
457
|
-
if (slot[GLOBAL_KEY]) return slot[GLOBAL_KEY];
|
|
458
|
-
const promise = (async () => {
|
|
459
|
-
const store = await createStore();
|
|
460
|
-
return createResumableStreamContext({ store });
|
|
461
|
-
})();
|
|
462
|
-
// clear the cache on rejection so the next request retries connecting.
|
|
463
|
-
promise.catch(() => {
|
|
464
|
-
if (slot[GLOBAL_KEY] === promise) {
|
|
465
|
-
delete slot[GLOBAL_KEY];
|
|
466
|
-
}
|
|
467
|
-
});
|
|
468
|
-
slot[GLOBAL_KEY] = promise;
|
|
469
|
-
return promise;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
async function createStore(): Promise<ResumableStreamStore> {
|
|
473
|
-
const url = process.env["REDIS_URL"];
|
|
474
|
-
if (!url) {
|
|
475
|
-
return createInMemoryResumableStreamStore();
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
const { createClient } = await import("redis");
|
|
479
|
-
const { createRedisResumableStreamStore } =
|
|
480
|
-
await import("assistant-stream/resumable/redis");
|
|
481
|
-
|
|
482
|
-
const client = createClient({ url });
|
|
483
|
-
client.on("error", (err) => {
|
|
484
|
-
console.error("[resumable-stream] redis client error:", err);
|
|
485
|
-
});
|
|
486
|
-
await client.connect();
|
|
487
|
-
return createRedisResumableStreamStore(client);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
## next.config.js
|
|
493
|
-
|
|
494
|
-
```javascript
|
|
495
|
-
import { withAui } from "@assistant-ui/next";
|
|
496
|
-
/** @type {import('next').NextConfig} */
|
|
497
|
-
const nextConfig = {};
|
|
498
|
-
|
|
499
|
-
export default withAui(nextConfig);
|
|
500
|
-
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
## package.json
|
|
504
|
-
|
|
505
|
-
```json
|
|
506
|
-
{
|
|
507
|
-
"name": "with-resumable-stream",
|
|
508
|
-
"version": "0.0.0",
|
|
509
|
-
"private": true,
|
|
510
|
-
"type": "module",
|
|
511
|
-
"scripts": {
|
|
512
|
-
"dev": "next dev --webpack",
|
|
513
|
-
"build": "next build",
|
|
514
|
-
"start": "next start"
|
|
515
|
-
},
|
|
516
|
-
"dependencies": {
|
|
517
|
-
"@ai-sdk/openai": "^4.0.40",
|
|
518
|
-
"@ai-sdk/react": "^4.0.65",
|
|
519
|
-
"@assistant-ui/react": "workspace:*",
|
|
520
|
-
"@assistant-ui/react-ai-sdk": "workspace:*",
|
|
521
|
-
"@assistant-ui/react-markdown": "workspace:*",
|
|
522
|
-
"@assistant-ui/store": "workspace:*",
|
|
523
|
-
"@assistant-ui/tap": "workspace:*",
|
|
524
|
-
"@assistant-ui/ui": "workspace:*",
|
|
525
|
-
"ai": "^7.0.62",
|
|
526
|
-
"assistant-stream": "workspace:*",
|
|
527
|
-
"class-variance-authority": "^0.7.1",
|
|
528
|
-
"clsx": "^2.1.1",
|
|
529
|
-
"lucide-react": "^1.31.0",
|
|
530
|
-
"next": "^16.3.0",
|
|
531
|
-
"react": "^19.2.8",
|
|
532
|
-
"react-dom": "^19.2.8",
|
|
533
|
-
"redis": "^6.2.1",
|
|
534
|
-
"tailwind-merge": "^3.6.0",
|
|
535
|
-
"zod": "^4.4.3"
|
|
536
|
-
},
|
|
537
|
-
"devDependencies": {
|
|
538
|
-
"@assistant-ui/next": "workspace:*",
|
|
539
|
-
"@assistant-ui/x-buildutils": "workspace:*",
|
|
540
|
-
"@tailwindcss/postcss": "^4.3.3",
|
|
541
|
-
"@types/node": "^26.2.0",
|
|
542
|
-
"@types/react": "^19.2.18",
|
|
543
|
-
"@types/react-dom": "^19.2.4",
|
|
544
|
-
"postcss": "^8.5.26",
|
|
545
|
-
"tailwindcss": "^4.3.3",
|
|
546
|
-
"tw-animate-css": "^1.4.0",
|
|
547
|
-
"typescript": "^7.0.2"
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
## README.md
|
|
554
|
-
|
|
555
|
-
```markdown
|
|
556
|
-
# with-resumable-stream
|
|
557
|
-
|
|
558
|
-
Demonstrates `assistant-stream/resumable`: persist an in-flight LLM response on the server so the client can reload or lose its connection mid-stream and pick up where it left off.
|
|
559
|
-
|
|
560
|
-
## How it works
|
|
561
|
-
|
|
562
|
-
1. Each `POST /api/chat` mints a new UUIDv4 `streamId` server-side and returns it in the `x-resumable-stream-id` header. `AssistantChatTransport` reads that header on the browser and stores the latest pending id in `sessionStorage`.
|
|
563
|
-
2. The route runs `streamText`, then pipes the byte body through `context.run(streamId, () => uiMessageStreamBody)`. The bytes are persisted in the configured store while being streamed to the client.
|
|
564
|
-
3. If the client disconnects mid-stream, the server-side producer task keeps running and continues to append bytes to the store.
|
|
565
|
-
4. On page load, if `sessionStorage` still has a stream id, the client calls `chat.resumeStream()`. The transport's `resumable` adapter rewrites the AI SDK reconnect request to `GET /api/chat/resume/[streamId]`, which calls `context.resume(streamId)` and replays the persisted bytes (plus any new ones) to the reconnecting client.
|
|
566
|
-
5. When the response stream closes naturally, the transport detects the AI SDK `finish` SSE event in the body and clears the stored id. Cancellation does not clear the id, so a reload mid-stream still finds it on next mount.
|
|
567
|
-
|
|
568
|
-
## Quick start
|
|
569
|
-
|
|
570
|
-
```sh
|
|
571
|
-
cp .env.example .env.local
|
|
572
|
-
# Optional: put your OPENAI_API_KEY in .env.local for the real model. Without
|
|
573
|
-
# it, the example falls back to a slow built-in mock so you can demo resume.
|
|
574
|
-
pnpm install
|
|
575
|
-
pnpm dev
|
|
576
|
-
```
|
|
577
|
-
|
|
578
|
-
Open [http://localhost:3000](http://localhost:3000), send a prompt, then reload the page mid-response. The same answer keeps filling in.
|
|
579
|
-
|
|
580
|
-
## Client integration
|
|
581
|
-
|
|
582
|
-
The browser side is wired through two helpers from `@assistant-ui/react-ai-sdk`:
|
|
583
|
-
|
|
584
|
-
- `createResumableSessionStorage()` returns a small `sessionStorage`-backed storage object for the pending stream id. Pass `{ key }` to namespace per route. Use `localStorage` instead if you want a stream that survives full browser restarts (and accept the cross-tab race that comes with it).
|
|
585
|
-
- `AssistantChatTransport` accepts a `resumable` option. When set, the transport captures the `x-resumable-stream-id` response header, watches the SSE body for the `finish` event so the stored id is cleared on natural completion (cancellation leaves it intact), and redirects `chat.resumeStream()` reconnects to the configured `resumeApi`.
|
|
586
|
-
|
|
587
|
-
The example fires `chat.resumeStream()` from a one-shot `useEffect` when storage already has an id at mount time. If you switch to `useChatRuntime`, that resume call is wired automatically.
|
|
588
|
-
|
|
589
|
-
## Server methods
|
|
590
|
-
|
|
591
|
-
The `ResumableStreamContext` returned by `createResumableStreamContext` exposes:
|
|
592
|
-
|
|
593
|
-
- `run(streamId, makeStream)`: producer-or-consumer entrypoint. Auto-elects the role via the store, so concurrent callers with the same id share the persisted output.
|
|
594
|
-
- `resume(streamId)`: strict consumer; returns `null` when the stream does not exist.
|
|
595
|
-
- `requireResume(streamId)`: same as `resume`, but throws `ResumableStreamError("missing")` instead of returning `null`.
|
|
596
|
-
- `status(streamId)`: probe the lifecycle state without opening a reader.
|
|
597
|
-
- `delete(streamId)`: remove all state for a stream.
|
|
598
|
-
|
|
599
|
-
## Storage
|
|
600
|
-
|
|
601
|
-
By default the example uses `createInMemoryResumableStreamStore` from `assistant-stream/resumable`. The store is memoized on `globalThis` via `Symbol.for`, so it survives Next.js hot reload but not full server restart. Default TTL is 24h; configure with `defaultTtlMs` if you want shorter eviction.
|
|
602
|
-
|
|
603
|
-
To use Redis instead, set `REDIS_URL` in `.env.local`:
|
|
604
|
-
|
|
605
|
-
```sh
|
|
606
|
-
REDIS_URL=redis://localhost:6379
|
|
607
|
-
OPENAI_API_KEY=your-api-key-here
|
|
608
|
-
```
|
|
609
|
-
|
|
610
|
-
The example will use the `assistant-stream/resumable/redis` adapter automatically. With Redis, resumable state survives server restarts (until the per-stream TTL expires; default 24h).
|
|
611
|
-
|
|
612
|
-
You can run a local Redis quickly with Docker:
|
|
613
|
-
|
|
614
|
-
```sh
|
|
615
|
-
docker run -d --name redis -p 6379:6379 redis:7-alpine
|
|
616
|
-
```
|
|
617
|
-
|
|
618
|
-
## Production checklist
|
|
619
|
-
|
|
620
|
-
`GET /api/chat/resume/[streamId]` in this example serves any caller who knows the stream id. UUIDv4 is unguessable in practice, but the id leaks into response headers, `sessionStorage`, browser history, and access logs. Before deploying:
|
|
621
|
-
|
|
622
|
-
- Gate the resume endpoint with the same auth your chat endpoint uses.
|
|
623
|
-
- Bind `streamId` to the requesting user at creation time and reject mismatches before calling `context.resume`.
|
|
624
|
-
- On serverless platforms that kill the request handler when the response returns (Vercel, Cloudflare), pass `waitUntil` from `next/server` (`after`) when constructing the context. Otherwise the producer task is interrupted and resume cannot recover the rest of the stream.
|
|
625
|
-
|
|
626
|
-
## Files of interest
|
|
627
|
-
|
|
628
|
-
- `lib/resumable-context.ts`: picks the store based on `REDIS_URL` and memoizes a single `ResumableStreamContext` across module reloads.
|
|
629
|
-
- `app/api/chat/route.ts`: POST endpoint that mints a fresh `streamId`, runs `streamText` (or a mock), and wraps the response body in `context.run`.
|
|
630
|
-
- `app/api/chat/resume/[streamId]/route.ts`: GET endpoint that calls `context.resume` and replays the persisted bytes.
|
|
631
|
-
- `app/page.tsx`: wires `useChat` with `AssistantChatTransport`'s `resumable` adapter and triggers `chat.resumeStream()` on mount when a pending id exists.
|
|
632
|
-
|
|
633
|
-
## Related documentation
|
|
634
|
-
|
|
635
|
-
- [assistant-ui documentation](https://www.assistant-ui.com/docs)
|
|
636
|
-
- [AI SDK reconnect API](https://sdk.vercel.ai/docs)
|
|
637
|
-
|
|
638
|
-
```
|
|
639
|
-
|
|
640
|
-
## tsconfig.json
|
|
641
|
-
|
|
642
|
-
```json
|
|
643
|
-
{
|
|
644
|
-
"extends": "@assistant-ui/x-buildutils/ts/next",
|
|
645
|
-
"compilerOptions": {
|
|
646
|
-
"paths": {
|
|
647
|
-
"@/*": ["./*"],
|
|
648
|
-
"@/components/assistant-ui/*": [
|
|
649
|
-
"../../packages/ui/src/components/assistant-ui/*"
|
|
650
|
-
],
|
|
651
|
-
"@/components/ui/*": [
|
|
652
|
-
"../../packages/ui/src/components/ui/base/*",
|
|
653
|
-
"../../packages/ui/src/components/ui/radix/*"
|
|
654
|
-
],
|
|
655
|
-
"@/components/ui/radix/*": [
|
|
656
|
-
"../../packages/ui/src/components/ui/radix/*"
|
|
657
|
-
],
|
|
658
|
-
"@/lib/utils": ["../../packages/ui/src/lib/utils"],
|
|
659
|
-
"@assistant-ui/ui/*": ["../../packages/ui/src/*"]
|
|
660
|
-
}
|
|
661
|
-
},
|
|
662
|
-
"include": ["**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
663
|
-
"exclude": ["node_modules"]
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
```
|
|
667
|
-
|