@assistant-ui/mcp-docs-server 0.2.3 → 0.3.1
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 +91 -0
- package/dist/proxy.js.map +1 -0
- package/package.json +8 -12
- package/src/index.ts +3 -115
- package/src/proxy.test.ts +385 -0
- package/src/proxy.ts +126 -0
- package/.docs/organized/code-examples/waterfall.md +0 -807
- package/.docs/organized/code-examples/with-a2a.md +0 -675
- package/.docs/organized/code-examples/with-ag-ui.md +0 -553
- package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -466
- package/.docs/organized/code-examples/with-artifacts.md +0 -815
- package/.docs/organized/code-examples/with-assistant-transport.md +0 -576
- package/.docs/organized/code-examples/with-browser-extension.md +0 -371
- package/.docs/organized/code-examples/with-chain-of-thought.md +0 -962
- package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
- package/.docs/organized/code-examples/with-cloud.md +0 -439
- package/.docs/organized/code-examples/with-custom-thread-list.md +0 -569
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -527
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -697
- package/.docs/organized/code-examples/with-eve.md +0 -405
- package/.docs/organized/code-examples/with-expo.md +0 -2246
- package/.docs/organized/code-examples/with-external-store.md +0 -421
- package/.docs/organized/code-examples/with-ffmpeg.md +0 -829
- package/.docs/organized/code-examples/with-generative-ui.md +0 -1810
- package/.docs/organized/code-examples/with-google-adk.md +0 -368
- package/.docs/organized/code-examples/with-heat-graph.md +0 -304
- package/.docs/organized/code-examples/with-image-generation.md +0 -463
- package/.docs/organized/code-examples/with-interactables.md +0 -733
- package/.docs/organized/code-examples/with-langchain.md +0 -446
- package/.docs/organized/code-examples/with-langgraph.md +0 -855
- package/.docs/organized/code-examples/with-livekit.md +0 -643
- package/.docs/organized/code-examples/with-mcp.md +0 -782
- package/.docs/organized/code-examples/with-nuxt.md +0 -2428
- package/.docs/organized/code-examples/with-opencode.md +0 -1974
- package/.docs/organized/code-examples/with-openui.md +0 -450
- package/.docs/organized/code-examples/with-pi.md +0 -2084
- package/.docs/organized/code-examples/with-react-hook-form.md +0 -727
- package/.docs/organized/code-examples/with-react-ink-web.md +0 -740
- package/.docs/organized/code-examples/with-react-ink.md +0 -473
- package/.docs/organized/code-examples/with-react-router.md +0 -936
- package/.docs/organized/code-examples/with-resumable-stream.md +0 -668
- package/.docs/organized/code-examples/with-store.md +0 -679
- package/.docs/organized/code-examples/with-svelte.md +0 -415
- package/.docs/organized/code-examples/with-sveltekit.md +0 -1061
- package/.docs/organized/code-examples/with-tanstack.md +0 -812
- package/.docs/organized/code-examples/with-tap-runtime.md +0 -813
- package/.docs/organized/code-examples/with-virtualized-thread.md +0 -681
- package/.docs/organized/code-examples/with-vue.md +0 -408
- package/.docs/raw/docs/(getting-started)/architecture.mdx +0 -146
- package/.docs/raw/docs/(getting-started)/base-ui.mdx +0 -39
- package/.docs/raw/docs/(getting-started)/cli.mdx +0 -542
- package/.docs/raw/docs/(getting-started)/devtools.mdx +0 -79
- package/.docs/raw/docs/(getting-started)/index.mdx +0 -23
- package/.docs/raw/docs/(getting-started)/installation.mdx +0 -483
- package/.docs/raw/docs/(getting-started)/llm.mdx +0 -211
- package/.docs/raw/docs/(getting-started)/rtl.mdx +0 -78
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/adapters/model.mdx +0 -44
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +0 -59
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/suggestions.mdx +0 -26
- package/.docs/raw/docs/(reference)/api-reference/context-providers/assistant-runtime-provider.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/context-providers/scoped-providers.mdx +0 -64
- package/.docs/raw/docs/(reference)/api-reference/external-store/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/external-store/message-conversion.mdx +0 -57
- package/.docs/raw/docs/(reference)/api-reference/external-store/runtime.mdx +0 -49
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/a2ui.mdx +0 -40
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +0 -56
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +0 -86
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +0 -39
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +0 -42
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/spec.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +0 -93
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/hooks/composer-triggers.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +0 -31
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/hooks/primitives.mdx +0 -350
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/ai-sdk.mdx +0 -200
- package/.docs/raw/docs/(reference)/api-reference/integrations/cloud-ai-sdk.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/integrations/eve.mdx +0 -118
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +0 -37
- package/.docs/raw/docs/(reference)/api-reference/model-context/context.mdx +0 -50
- package/.docs/raw/docs/(reference)/api-reference/model-context/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/model-context/registry.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +0 -566
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +0 -152
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar.mdx +0 -239
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +0 -208
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-modal.mdx +0 -108
- package/.docs/raw/docs/(reference)/api-reference/primitives/attachment.mdx +0 -99
- package/.docs/raw/docs/(reference)/api-reference/primitives/branch-picker.mdx +0 -145
- package/.docs/raw/docs/(reference)/api-reference/primitives/chain-of-thought.mdx +0 -82
- package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +0 -637
- package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/primitives/error.mdx +0 -65
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +0 -73
- package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +0 -117
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +0 -339
- package/.docs/raw/docs/(reference)/api-reference/primitives/queue-item.mdx +0 -77
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +0 -88
- package/.docs/raw/docs/(reference)/api-reference/primitives/suggestion.mdx +0 -81
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item.mdx +0 -138
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +0 -122
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +0 -289
- package/.docs/raw/docs/(reference)/api-reference/runtimes/assistant-runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/attachment-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/composer-runtime.mdx +0 -32
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-part-runtime.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/queue-state.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-item-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-runtime.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/tools/component-tools.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/tools/index.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables-legacy.mdx +0 -55
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables.mdx +0 -151
- package/.docs/raw/docs/(reference)/api-reference/tools/rendering.mdx +0 -106
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +0 -178
- package/.docs/raw/docs/(reference)/api-reference/transport/assistant-transport.mdx +0 -48
- package/.docs/raw/docs/(reference)/api-reference/transport/frame.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/transport/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/utilities/index.mdx +0 -19
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +0 -152
- package/.docs/raw/docs/(reference)/api-reference/voice/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/voice/session.mdx +0 -54
- package/.docs/raw/docs/(reference)/api-reference/voice/speech-dictation.mdx +0 -36
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +0 -527
- package/.docs/raw/docs/cloud/ai-sdk.mdx +0 -604
- package/.docs/raw/docs/cloud/authorization.mdx +0 -252
- package/.docs/raw/docs/cloud/index.mdx +0 -46
- package/.docs/raw/docs/cloud/langgraph.mdx +0 -554
- package/.docs/raw/docs/copilots/assistant-frame.mdx +0 -411
- package/.docs/raw/docs/copilots/make-assistant-visible.mdx +0 -82
- package/.docs/raw/docs/copilots/model-context.mdx +0 -156
- package/.docs/raw/docs/copilots/motivation.mdx +0 -202
- package/.docs/raw/docs/copilots/use-assistant-instructions.mdx +0 -64
- package/.docs/raw/docs/guides/attachments.mdx +0 -619
- package/.docs/raw/docs/guides/branching.mdx +0 -76
- package/.docs/raw/docs/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/guides/chatgpt-subscription.mdx +0 -108
- package/.docs/raw/docs/guides/context-api.mdx +0 -619
- package/.docs/raw/docs/guides/dictation.mdx +0 -298
- package/.docs/raw/docs/guides/editing.mdx +0 -102
- package/.docs/raw/docs/guides/electron.mdx +0 -369
- package/.docs/raw/docs/guides/headless-composer-input.mdx +0 -113
- package/.docs/raw/docs/guides/image-generation.mdx +0 -74
- package/.docs/raw/docs/guides/index.mdx +0 -117
- package/.docs/raw/docs/guides/input-history.mdx +0 -55
- package/.docs/raw/docs/guides/latex.mdx +0 -158
- package/.docs/raw/docs/guides/mentions.mdx +0 -575
- package/.docs/raw/docs/guides/message-timing.mdx +0 -215
- package/.docs/raw/docs/guides/quoting.mdx +0 -169
- package/.docs/raw/docs/guides/resumable-stream-deployment.mdx +0 -212
- package/.docs/raw/docs/guides/resumable-stream-stores.mdx +0 -152
- package/.docs/raw/docs/guides/resumable-streams.mdx +0 -292
- package/.docs/raw/docs/guides/slash-commands.mdx +0 -358
- package/.docs/raw/docs/guides/speech.mdx +0 -172
- package/.docs/raw/docs/guides/suggestions.mdx +0 -384
- package/.docs/raw/docs/guides/virtualization.mdx +0 -133
- package/.docs/raw/docs/guides/voice.mdx +0 -310
- package/.docs/raw/docs/ink/adapters.mdx +0 -99
- package/.docs/raw/docs/ink/custom-backend.mdx +0 -254
- package/.docs/raw/docs/ink/hooks.mdx +0 -469
- package/.docs/raw/docs/ink/index.mdx +0 -237
- package/.docs/raw/docs/ink/migration.mdx +0 -138
- package/.docs/raw/docs/ink/primitives.mdx +0 -1259
- package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +0 -528
- package/.docs/raw/docs/integrations/auth/better-auth.mdx +0 -188
- package/.docs/raw/docs/integrations/auth/clerk.mdx +0 -166
- package/.docs/raw/docs/integrations/auth/next-auth.mdx +0 -191
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +0 -88
- package/.docs/raw/docs/integrations/frameworks/cloudflare-agents.mdx +0 -283
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +0 -188
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +0 -57
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +0 -201
- package/.docs/raw/docs/integrations/gateways/index.mdx +0 -162
- package/.docs/raw/docs/integrations/index.mdx +0 -178
- package/.docs/raw/docs/integrations/observability/helicone.mdx +0 -129
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +0 -161
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +0 -151
- package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +0 -773
- package/.docs/raw/docs/migrations/deprecation-policy.mdx +0 -42
- package/.docs/raw/docs/migrations/index.mdx +0 -50
- package/.docs/raw/docs/migrations/react-compatibility.mdx +0 -74
- package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +0 -328
- package/.docs/raw/docs/migrations/toolkit-tools.mdx +0 -236
- package/.docs/raw/docs/migrations/v0-11.mdx +0 -172
- package/.docs/raw/docs/migrations/v0-12.mdx +0 -302
- package/.docs/raw/docs/migrations/v0-14.mdx +0 -297
- package/.docs/raw/docs/migrations/v0-15.mdx +0 -270
- package/.docs/raw/docs/primitives/action-bar.mdx +0 -352
- package/.docs/raw/docs/primitives/assistant-modal.mdx +0 -216
- package/.docs/raw/docs/primitives/attachment.mdx +0 -217
- package/.docs/raw/docs/primitives/branch-picker.mdx +0 -222
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +0 -315
- package/.docs/raw/docs/primitives/composer.mdx +0 -659
- package/.docs/raw/docs/primitives/error.mdx +0 -142
- package/.docs/raw/docs/primitives/index.mdx +0 -99
- package/.docs/raw/docs/primitives/message.mdx +0 -618
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +0 -191
- package/.docs/raw/docs/primitives/suggestion.mdx +0 -254
- package/.docs/raw/docs/primitives/thread-list.mdx +0 -467
- package/.docs/raw/docs/primitives/thread.mdx +0 -509
- package/.docs/raw/docs/react-native/adapters.mdx +0 -94
- package/.docs/raw/docs/react-native/custom-backend.mdx +0 -207
- package/.docs/raw/docs/react-native/hooks.mdx +0 -339
- package/.docs/raw/docs/react-native/index.mdx +0 -289
- package/.docs/raw/docs/react-native/migration.mdx +0 -142
- package/.docs/raw/docs/react-native/primitives.mdx +0 -976
- package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +0 -399
- package/.docs/raw/docs/runtimes/a2a/overview.mdx +0 -60
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +0 -216
- package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +0 -124
- package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +0 -70
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +0 -243
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +0 -267
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +0 -61
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +0 -122
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +0 -135
- package/.docs/raw/docs/runtimes/ai-sdk/v6-legacy.mdx +0 -636
- package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +0 -731
- package/.docs/raw/docs/runtimes/claude-managed-agents.mdx +0 -118
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +0 -265
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +0 -167
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +0 -68
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +0 -513
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +0 -763
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +0 -339
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +0 -957
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +0 -902
- package/.docs/raw/docs/runtimes/custom/overview.mdx +0 -71
- package/.docs/raw/docs/runtimes/eve/overview.mdx +0 -151
- package/.docs/raw/docs/runtimes/eve/quickstart.mdx +0 -192
- package/.docs/raw/docs/runtimes/google-adk/api.mdx +0 -256
- package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +0 -784
- package/.docs/raw/docs/runtimes/google-adk/overview.mdx +0 -69
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +0 -229
- package/.docs/raw/docs/runtimes/langchain.mdx +0 -901
- package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +0 -181
- package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +0 -305
- package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +0 -104
- package/.docs/raw/docs/runtimes/langgraph/overview.mdx +0 -84
- package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +0 -496
- package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +0 -144
- package/.docs/raw/docs/runtimes/langgraph/threads.mdx +0 -113
- package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +0 -29
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -93
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +0 -347
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +0 -393
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +0 -194
- package/.docs/raw/docs/runtimes/opencode/overview.mdx +0 -58
- package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +0 -119
- package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +0 -133
- package/.docs/raw/docs/tools/a2ui.mdx +0 -107
- package/.docs/raw/docs/tools/backend.mdx +0 -147
- package/.docs/raw/docs/tools/defining-tools.mdx +0 -574
- package/.docs/raw/docs/tools/dynamic-tools.mdx +0 -112
- package/.docs/raw/docs/tools/generative-ui-primitive.mdx +0 -180
- package/.docs/raw/docs/tools/generative-ui-slack.mdx +0 -167
- package/.docs/raw/docs/tools/generative-ui-teams.mdx +0 -160
- package/.docs/raw/docs/tools/generative-ui.mdx +0 -322
- package/.docs/raw/docs/tools/index.mdx +0 -72
- package/.docs/raw/docs/tools/interactables.mdx +0 -1084
- package/.docs/raw/docs/tools/mcp-apps.mdx +0 -363
- package/.docs/raw/docs/tools/mcp.mdx +0 -466
- package/.docs/raw/docs/tools/multi-agent.mdx +0 -237
- package/.docs/raw/docs/tools/openui.mdx +0 -175
- package/.docs/raw/docs/tools/tool-ui.mdx +0 -1020
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
- package/.docs/raw/docs/ui/assistant-modal.mdx +0 -166
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +0 -89
- package/.docs/raw/docs/ui/attachment.mdx +0 -279
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -247
- package/.docs/raw/docs/ui/context-display.mdx +0 -148
- package/.docs/raw/docs/ui/directive-text.mdx +0 -114
- package/.docs/raw/docs/ui/file.mdx +0 -159
- package/.docs/raw/docs/ui/follow-up-suggestions.mdx +0 -82
- package/.docs/raw/docs/ui/image.mdx +0 -102
- package/.docs/raw/docs/ui/markdown.mdx +0 -103
- package/.docs/raw/docs/ui/mcp-config.mdx +0 -107
- package/.docs/raw/docs/ui/mermaid.mdx +0 -92
- package/.docs/raw/docs/ui/message-timing.mdx +0 -93
- package/.docs/raw/docs/ui/model-selector.mdx +0 -455
- package/.docs/raw/docs/ui/part-grouping.mdx +0 -614
- package/.docs/raw/docs/ui/quote.mdx +0 -211
- package/.docs/raw/docs/ui/reasoning.mdx +0 -214
- package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
- package/.docs/raw/docs/ui/sources.mdx +0 -186
- package/.docs/raw/docs/ui/streamdown.mdx +0 -392
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
- package/.docs/raw/docs/ui/thread-list.mdx +0 -411
- package/.docs/raw/docs/ui/thread.mdx +0 -559
- package/.docs/raw/docs/ui/tool-fallback.mdx +0 -141
- package/.docs/raw/docs/ui/tool-group.mdx +0 -240
- package/.docs/raw/docs/ui/voice.mdx +0 -173
- package/.docs/raw/docs/utilities/heat-graph.mdx +0 -237
- package/.docs/raw/docs/utilities/react-o11y.mdx +0 -362
- package/.docs/raw/docs/utilities/tw-shimmer.mdx +0 -212
- package/dist/constants.d.ts +0 -14
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -19
- package/dist/constants.js.map +0 -1
- package/dist/prepare-docs/code-examples.d.ts +0 -5
- package/dist/prepare-docs/code-examples.d.ts.map +0 -1
- package/dist/prepare-docs/code-examples.js +0 -117
- package/dist/prepare-docs/code-examples.js.map +0 -1
- package/dist/prepare-docs/copy-raw.d.ts +0 -5
- package/dist/prepare-docs/copy-raw.d.ts.map +0 -1
- package/dist/prepare-docs/copy-raw.js +0 -49
- package/dist/prepare-docs/copy-raw.js.map +0 -1
- package/dist/prepare-docs/prepare.d.ts +0 -1
- package/dist/prepare-docs/prepare.js +0 -22
- package/dist/prepare-docs/prepare.js.map +0 -1
- package/dist/prompts/xulux-playground.d.ts +0 -12
- package/dist/prompts/xulux-playground.d.ts.map +0 -1
- package/dist/prompts/xulux-playground.js +0 -33
- package/dist/prompts/xulux-playground.js.map +0 -1
- package/dist/tools/docs.d.ts +0 -22
- package/dist/tools/docs.d.ts.map +0 -1
- package/dist/tools/docs.js +0 -177
- package/dist/tools/docs.js.map +0 -1
- package/dist/tools/examples.d.ts +0 -24
- package/dist/tools/examples.d.ts.map +0 -1
- package/dist/tools/examples.js +0 -87
- package/dist/tools/examples.js.map +0 -1
- package/dist/tools/resources.d.ts +0 -6
- package/dist/tools/resources.d.ts.map +0 -1
- package/dist/tools/resources.js +0 -75
- package/dist/tools/resources.js.map +0 -1
- package/dist/tools/search.d.ts +0 -24
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -39
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/tests/mcp-test-client.d.ts +0 -15
- package/dist/tools/tests/mcp-test-client.d.ts.map +0 -1
- package/dist/tools/tests/mcp-test-client.js +0 -68
- package/dist/tools/tests/mcp-test-client.js.map +0 -1
- package/dist/tools/tests/test-setup.d.ts +0 -7
- package/dist/tools/tests/test-setup.d.ts.map +0 -1
- package/dist/tools/tests/test-setup.js +0 -36
- package/dist/tools/tests/test-setup.js.map +0 -1
- package/dist/tools/xulux-templates.d.ts +0 -58
- package/dist/tools/xulux-templates.d.ts.map +0 -1
- package/dist/tools/xulux-templates.js +0 -84
- package/dist/tools/xulux-templates.js.map +0 -1
- package/dist/utils/cache.d.ts +0 -5
- package/dist/utils/cache.d.ts.map +0 -1
- package/dist/utils/cache.js +0 -18
- package/dist/utils/cache.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -10
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -20
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/mcp-format.d.ts +0 -11
- package/dist/utils/mcp-format.d.ts.map +0 -1
- package/dist/utils/mcp-format.js +0 -14
- package/dist/utils/mcp-format.js.map +0 -1
- package/dist/utils/mdx.d.ts +0 -12
- package/dist/utils/mdx.d.ts.map +0 -1
- package/dist/utils/mdx.js +0 -45
- package/dist/utils/mdx.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -12
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -93
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/search.d.ts +0 -10
- package/dist/utils/search.d.ts.map +0 -1
- package/dist/utils/search.js +0 -97
- package/dist/utils/search.js.map +0 -1
- package/dist/utils/security.d.ts +0 -5
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -22
- package/dist/utils/security.js.map +0 -1
- package/dist/xulux/catalog-client.d.ts +0 -14
- package/dist/xulux/catalog-client.d.ts.map +0 -1
- package/dist/xulux/catalog-client.js +0 -112
- package/dist/xulux/catalog-client.js.map +0 -1
- package/dist/xulux/fallback-catalog.d.ts +0 -7
- package/dist/xulux/fallback-catalog.d.ts.map +0 -1
- package/dist/xulux/fallback-catalog.js +0 -47
- package/dist/xulux/fallback-catalog.js.map +0 -1
- package/dist/xulux/fetch-sandbox.d.ts +0 -5
- package/dist/xulux/fetch-sandbox.d.ts.map +0 -1
- package/dist/xulux/fetch-sandbox.js +0 -40
- package/dist/xulux/fetch-sandbox.js.map +0 -1
- package/dist/xulux/template-service.d.ts +0 -84
- package/dist/xulux/template-service.d.ts.map +0 -1
- package/dist/xulux/template-service.js +0 -223
- package/dist/xulux/template-service.js.map +0 -1
- package/dist/xulux/types.d.ts +0 -55
- package/dist/xulux/types.d.ts.map +0 -1
- package/dist/xulux/types.js +0 -6
- package/dist/xulux/types.js.map +0 -1
- package/src/constants.ts +0 -24
- package/src/prepare-docs/code-examples.ts +0 -158
- package/src/prepare-docs/copy-raw.ts +0 -50
- package/src/prepare-docs/prepare.ts +0 -24
- package/src/prompts/xulux-playground.ts +0 -36
- package/src/tools/docs.ts +0 -255
- package/src/tools/examples.ts +0 -114
- package/src/tools/resources.ts +0 -111
- package/src/tools/search.ts +0 -46
- package/src/tools/tests/completions.test.ts +0 -60
- package/src/tools/tests/directory-size-cap.test.ts +0 -50
- package/src/tools/tests/docs.test.ts +0 -147
- package/src/tools/tests/examples.test.ts +0 -94
- package/src/tools/tests/integration.test.ts +0 -45
- package/src/tools/tests/json-parsing.test.ts +0 -23
- package/src/tools/tests/listings-cache.test.ts +0 -19
- package/src/tools/tests/mcp-protocol.test.ts +0 -216
- package/src/tools/tests/mcp-test-client.ts +0 -111
- package/src/tools/tests/path-traversal.test.ts +0 -84
- package/src/tools/tests/resources.test.ts +0 -133
- package/src/tools/tests/search.test.ts +0 -37
- package/src/tools/tests/test-setup.ts +0 -50
- package/src/tools/tests/xulux-templates.test.ts +0 -325
- package/src/tools/xulux-templates.ts +0 -141
- package/src/utils/cache.ts +0 -20
- package/src/utils/logger.ts +0 -20
- package/src/utils/mcp-format.ts +0 -14
- package/src/utils/mdx.ts +0 -59
- package/src/utils/paths.ts +0 -139
- package/src/utils/search.ts +0 -131
- package/src/utils/security.ts +0 -52
- package/src/utils/tests/cache.test.ts +0 -51
- package/src/utils/tests/mcp-format.test.ts +0 -22
- package/src/utils/tests/security.test.ts +0 -119
- package/src/xulux/catalog-client.ts +0 -150
- package/src/xulux/fallback-catalog.ts +0 -63
- package/src/xulux/fetch-sandbox.ts +0 -56
- package/src/xulux/template-service.ts +0 -406
- package/src/xulux/types.ts +0 -64
|
@@ -1,393 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Part 3: Approval UI"
|
|
3
|
-
description: Add human-in-the-loop approval for tool calls.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## Background: LangGraph implementation details
|
|
7
|
-
|
|
8
|
-
import Image from "next/image";
|
|
9
|
-
import approval from "./images/stockbroker-langgraph.png";
|
|
10
|
-
|
|
11
|
-
<Image
|
|
12
|
-
src={approval}
|
|
13
|
-
alt="LangChain LangGraph"
|
|
14
|
-
width={600}
|
|
15
|
-
className="mx-auto rounded-lg border shadow"
|
|
16
|
-
/>
|
|
17
|
-
|
|
18
|
-
Our LangGraph backend interrupts the `purchase_stock` tool execution in order to ensure the user confirms the purchase. The user confirms the purchase by submitting a tool message with the `approve` field set to `true`.
|
|
19
|
-
|
|
20
|
-
```ts title="assistant-ui-stockbroker/backend/src/index.ts" {6,18-19,32-35}
|
|
21
|
-
const purchaseApproval = async (state: typeof GraphAnnotation.State) => {
|
|
22
|
-
const { messages } = state;
|
|
23
|
-
const lastMessage = messages[messages.length - 1];
|
|
24
|
-
if (!(lastMessage instanceof ToolMessage)) {
|
|
25
|
-
// Interrupt the node to request permission to execute the purchase.
|
|
26
|
-
throw new NodeInterrupt("Please confirm the purchase before executing.");
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const shouldExecutePurchase = (state: typeof GraphAnnotation.State) => {
|
|
31
|
-
const { messages } = state;
|
|
32
|
-
const lastMessage = messages[messages.length - 1];
|
|
33
|
-
if (!(lastMessage instanceof ToolMessage)) {
|
|
34
|
-
// Interrupt the node to request permission to execute the purchase.
|
|
35
|
-
throw new NodeInterrupt("Please confirm the purchase before executing.");
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const { approve } = JSON.parse(lastMessage.content as string);
|
|
39
|
-
return approve ? "execute_purchase" : "agent";
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const workflow = new StateGraph(GraphAnnotation)
|
|
43
|
-
.addNode("agent", callModel)
|
|
44
|
-
.addEdge(START, "agent")
|
|
45
|
-
.addNode("tools", toolNode)
|
|
46
|
-
.addNode("prepare_purchase_details", preparePurchaseDetails)
|
|
47
|
-
.addNode("purchase_approval", purchaseApproval)
|
|
48
|
-
.addNode("execute_purchase", executePurchase)
|
|
49
|
-
.addEdge("prepare_purchase_details", "purchase_approval")
|
|
50
|
-
.addEdge("execute_purchase", END)
|
|
51
|
-
.addEdge("tools", "agent")
|
|
52
|
-
.addConditionalEdges("purchase_approval", shouldExecutePurchase, [
|
|
53
|
-
"agent",
|
|
54
|
-
"execute_purchase",
|
|
55
|
-
])
|
|
56
|
-
.addConditionalEdges("agent", shouldContinue, [
|
|
57
|
-
"tools",
|
|
58
|
-
END,
|
|
59
|
-
"prepare_purchase_details",
|
|
60
|
-
]);
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Add approval UI
|
|
64
|
-
|
|
65
|
-
We create a new file under `/components/tools/purchase-stock/PurchaseStockTool.tsx` to define the tool.
|
|
66
|
-
|
|
67
|
-
First, we define the tool arguments and result types:
|
|
68
|
-
|
|
69
|
-
```ts title="@/components/tools/purchase-stock/PurchaseStockTool.tsx"
|
|
70
|
-
type PurchaseStockArgs = {
|
|
71
|
-
ticker: string;
|
|
72
|
-
companyName: string;
|
|
73
|
-
quantity: number;
|
|
74
|
-
maxPurchasePrice: number;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
type PurchaseStockResult = {
|
|
78
|
-
approve?: boolean;
|
|
79
|
-
cancelled?: boolean;
|
|
80
|
-
error?: string;
|
|
81
|
-
};
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Then we define a tool UI renderer:
|
|
85
|
-
|
|
86
|
-
```tsx title="@/components/tools/purchase-stock/PurchaseStockTool.tsx"
|
|
87
|
-
"use client";
|
|
88
|
-
|
|
89
|
-
import { TransactionConfirmationPending } from "./transaction-confirmation-pending";
|
|
90
|
-
import { TransactionConfirmationFinal } from "./transaction-confirmation-final";
|
|
91
|
-
import type { ToolCallMessagePartComponent } from "@assistant-ui/react";
|
|
92
|
-
|
|
93
|
-
export const PurchaseStockToolUI: ToolCallMessagePartComponent<
|
|
94
|
-
PurchaseStockArgs,
|
|
95
|
-
string
|
|
96
|
-
> = function PurchaseStockUI({ args, result, status, addResult }) {
|
|
97
|
-
const handleReject = async () => {
|
|
98
|
-
addResult(JSON.stringify({ approve: false }));
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const handleConfirm = async () => {
|
|
102
|
-
addResult(JSON.stringify({ approve: true }));
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
return (
|
|
106
|
-
<div className="mb-4 flex flex-col items-center gap-2">
|
|
107
|
-
<div>
|
|
108
|
-
<pre className="whitespace-pre-wrap break-all text-center">
|
|
109
|
-
purchase_stock({JSON.stringify(args)})
|
|
110
|
-
</pre>
|
|
111
|
-
</div>
|
|
112
|
-
{!result && status.type !== "running" && (
|
|
113
|
-
<TransactionConfirmationPending
|
|
114
|
-
{...args}
|
|
115
|
-
onConfirm={handleConfirm}
|
|
116
|
-
onReject={handleReject}
|
|
117
|
-
/>
|
|
118
|
-
)}
|
|
119
|
-
</div>
|
|
120
|
-
);
|
|
121
|
-
};
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
Finally, we add a `TransactionConfirmationPending` component to ask for approval.
|
|
125
|
-
|
|
126
|
-
This requires shadcn/ui's `Card` and `Button` components. We will install them as a dependency.
|
|
127
|
-
|
|
128
|
-
<InstallCommand shadcn={["card", "button"]} />
|
|
129
|
-
|
|
130
|
-
Then create a new file under `/components/tools/purchase-stock/transaction-confirmation-pending.tsx` to define the approval UI.
|
|
131
|
-
|
|
132
|
-
```tsx title="@/components/tools/purchase-stock/transaction-confirmation-pending.tsx"
|
|
133
|
-
"use client";
|
|
134
|
-
|
|
135
|
-
import { CheckIcon, XIcon } from "lucide-react";
|
|
136
|
-
|
|
137
|
-
import { Button } from "@/components/ui/button";
|
|
138
|
-
import {
|
|
139
|
-
Card,
|
|
140
|
-
CardContent,
|
|
141
|
-
CardFooter,
|
|
142
|
-
CardHeader,
|
|
143
|
-
CardTitle,
|
|
144
|
-
} from "@/components/ui/card";
|
|
145
|
-
|
|
146
|
-
type TransactionConfirmation = {
|
|
147
|
-
ticker: string;
|
|
148
|
-
companyName: string;
|
|
149
|
-
quantity: number;
|
|
150
|
-
maxPurchasePrice: number;
|
|
151
|
-
onConfirm: () => void;
|
|
152
|
-
onReject: () => void;
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
export function TransactionConfirmationPending(props: TransactionConfirmation) {
|
|
156
|
-
const {
|
|
157
|
-
ticker,
|
|
158
|
-
companyName,
|
|
159
|
-
quantity,
|
|
160
|
-
maxPurchasePrice,
|
|
161
|
-
onConfirm,
|
|
162
|
-
onReject,
|
|
163
|
-
} = props;
|
|
164
|
-
|
|
165
|
-
return (
|
|
166
|
-
<Card className="mx-auto w-full max-w-md">
|
|
167
|
-
<CardHeader>
|
|
168
|
-
<CardTitle className="text-2xl font-bold">
|
|
169
|
-
Confirm Transaction
|
|
170
|
-
</CardTitle>
|
|
171
|
-
</CardHeader>
|
|
172
|
-
<CardContent className="space-y-4">
|
|
173
|
-
<div className="grid grid-cols-2 gap-2">
|
|
174
|
-
<p className="text-muted-foreground text-sm font-medium">Ticker:</p>
|
|
175
|
-
<p className="text-sm font-bold">{ticker}</p>
|
|
176
|
-
<p className="text-muted-foreground text-sm font-medium">Company:</p>
|
|
177
|
-
<p className="text-sm">{companyName}</p>
|
|
178
|
-
<p className="text-muted-foreground text-sm font-medium">Quantity:</p>
|
|
179
|
-
<p className="text-sm">{quantity} shares</p>
|
|
180
|
-
<p className="text-muted-foreground text-sm font-medium">
|
|
181
|
-
Max Purchase Price:
|
|
182
|
-
</p>
|
|
183
|
-
<p className="text-sm">${maxPurchasePrice?.toFixed(2)}</p>
|
|
184
|
-
</div>
|
|
185
|
-
<div className="bg-muted rounded-md p-3">
|
|
186
|
-
<p className="text-sm font-medium">Total Maximum Cost:</p>
|
|
187
|
-
<p className="text-lg font-bold">
|
|
188
|
-
${(quantity * maxPurchasePrice)?.toFixed(2)}
|
|
189
|
-
</p>
|
|
190
|
-
</div>
|
|
191
|
-
</CardContent>
|
|
192
|
-
<CardFooter className="flex justify-end">
|
|
193
|
-
<Button variant="outline" onClick={onReject}>
|
|
194
|
-
<XIcon className="mr-2 h-4 w-4" />
|
|
195
|
-
Reject
|
|
196
|
-
</Button>
|
|
197
|
-
<Button onClick={onConfirm}>
|
|
198
|
-
<CheckIcon className="mr-2 h-4 w-4" />
|
|
199
|
-
Confirm
|
|
200
|
-
</Button>
|
|
201
|
-
</CardFooter>
|
|
202
|
-
</Card>
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### Bind approval UI
|
|
208
|
-
|
|
209
|
-
```tsx title="@/app/page.tsx" {1-5,12}
|
|
210
|
-
"use client";
|
|
211
|
-
|
|
212
|
-
import { Thread } from "@/components/assistant-ui/thread";
|
|
213
|
-
import { PriceSnapshotToolUI } from "@/components/tools/price-snapshot/PriceSnapshotTool";
|
|
214
|
-
import { PurchaseStockToolUI } from "@/components/tools/purchase-stock/PurchaseStockTool";
|
|
215
|
-
import { AuiConfig, AuiProvider, defineToolkit, Tools, useAui } from "@assistant-ui/react";
|
|
216
|
-
|
|
217
|
-
const toolkit = defineToolkit({
|
|
218
|
-
price_snapshot: {
|
|
219
|
-
type: "backend",
|
|
220
|
-
render: PriceSnapshotToolUI,
|
|
221
|
-
},
|
|
222
|
-
purchase_stock: {
|
|
223
|
-
type: "backend",
|
|
224
|
-
render: PurchaseStockToolUI,
|
|
225
|
-
},
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
export default function Home() {
|
|
229
|
-
const aui = useAui();
|
|
230
|
-
const config = AuiConfig({ tools: Tools({ toolkit }) });
|
|
231
|
-
return (
|
|
232
|
-
<AuiProvider extends={aui} config={config}>
|
|
233
|
-
<Thread />
|
|
234
|
-
</AuiProvider>
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
### Try it out!
|
|
240
|
-
|
|
241
|
-
Ask the assistant to buy 5 shares of Tesla. You should see the following appear:
|
|
242
|
-
|
|
243
|
-
import purchase from "./images/acme-approve.png";
|
|
244
|
-
|
|
245
|
-
<Image
|
|
246
|
-
src={purchase}
|
|
247
|
-
alt="Approval UI"
|
|
248
|
-
width={600}
|
|
249
|
-
className="mx-auto rounded-lg border shadow"
|
|
250
|
-
/>
|
|
251
|
-
|
|
252
|
-
## Add `TransactionConfirmationFinal` to show approval result
|
|
253
|
-
|
|
254
|
-
We will add a component to display the approval result.
|
|
255
|
-
|
|
256
|
-
```ts title="@/components/tools/purchase-stock/transaction-confirmation-final.tsx"
|
|
257
|
-
"use client";
|
|
258
|
-
|
|
259
|
-
import { CheckCircle } from "lucide-react";
|
|
260
|
-
|
|
261
|
-
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
262
|
-
|
|
263
|
-
type TransactionConfirmation = {
|
|
264
|
-
ticker: string;
|
|
265
|
-
companyName: string;
|
|
266
|
-
quantity: number;
|
|
267
|
-
maxPurchasePrice: number;
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
export function TransactionConfirmationFinal(props: TransactionConfirmation) {
|
|
271
|
-
const { ticker, companyName, quantity, maxPurchasePrice } = props;
|
|
272
|
-
|
|
273
|
-
return (
|
|
274
|
-
<Card className="mx-auto w-full max-w-md">
|
|
275
|
-
<CardHeader className="text-center">
|
|
276
|
-
<CheckCircle className="mx-auto mb-4 h-16 w-16 text-green-500" />
|
|
277
|
-
<CardTitle className="text-2xl font-bold text-green-700">
|
|
278
|
-
Transaction Confirmed
|
|
279
|
-
</CardTitle>
|
|
280
|
-
</CardHeader>
|
|
281
|
-
<CardContent className="space-y-4">
|
|
282
|
-
<div className="rounded-md border border-green-200 bg-green-50 p-4">
|
|
283
|
-
<h3 className="mb-2 text-lg font-semibold text-green-800">
|
|
284
|
-
Purchase Summary
|
|
285
|
-
</h3>
|
|
286
|
-
<div className="grid grid-cols-2 gap-2 text-sm">
|
|
287
|
-
<p className="font-medium text-green-700">Ticker:</p>
|
|
288
|
-
<p className="font-bold text-green-900">{ticker}</p>
|
|
289
|
-
<p className="font-medium text-green-700">Company:</p>
|
|
290
|
-
<p className="text-green-900">{companyName}</p>
|
|
291
|
-
<p className="font-medium text-green-700">Quantity:</p>
|
|
292
|
-
<p className="text-green-900">{quantity} shares</p>
|
|
293
|
-
<p className="font-medium text-green-700">Price per Share:</p>
|
|
294
|
-
<p className="text-green-900">${maxPurchasePrice?.toFixed(2)}</p>
|
|
295
|
-
</div>
|
|
296
|
-
</div>
|
|
297
|
-
<div className="rounded-md border border-green-300 bg-green-100 p-4">
|
|
298
|
-
<p className="text-lg font-semibold text-green-800">Total Cost:</p>
|
|
299
|
-
<p className="text-2xl font-bold text-green-900">
|
|
300
|
-
${(quantity * maxPurchasePrice)?.toFixed(2)}
|
|
301
|
-
</p>
|
|
302
|
-
</div>
|
|
303
|
-
<p className="text-center text-sm text-green-600">
|
|
304
|
-
Your purchase of {quantity} shares of {companyName} ({ticker}) has
|
|
305
|
-
been successfully processed.
|
|
306
|
-
</p>
|
|
307
|
-
</CardContent>
|
|
308
|
-
</Card>
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
### Update `PurchaseStockTool`
|
|
314
|
-
|
|
315
|
-
We will import the new `<TransactionConfirmationFinal />` component and use it in the `render` function whenever an approval result is available.
|
|
316
|
-
|
|
317
|
-
```tsx title="@/components/tools/purchase-stock/PurchaseStockTool.tsx" {3,25-30,37-42}
|
|
318
|
-
"use client";
|
|
319
|
-
|
|
320
|
-
import { TransactionConfirmationPending } from "./transaction-confirmation-pending";
|
|
321
|
-
import { TransactionConfirmationFinal } from "./transaction-confirmation-final";
|
|
322
|
-
import type { ToolCallMessagePartComponent } from "@assistant-ui/react";
|
|
323
|
-
|
|
324
|
-
type PurchaseStockArgs = {
|
|
325
|
-
ticker: string;
|
|
326
|
-
companyName: string;
|
|
327
|
-
quantity: number;
|
|
328
|
-
maxPurchasePrice: number;
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
type PurchaseStockResult = {
|
|
332
|
-
approve?: boolean;
|
|
333
|
-
cancelled?: boolean;
|
|
334
|
-
error?: string;
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
export const PurchaseStockToolUI: ToolCallMessagePartComponent<
|
|
338
|
-
PurchaseStockArgs,
|
|
339
|
-
string
|
|
340
|
-
> = function PurchaseStockUI({ args, result, status, addResult }) {
|
|
341
|
-
let resultObj: PurchaseStockResult;
|
|
342
|
-
try {
|
|
343
|
-
resultObj = result ? JSON.parse(result) : {};
|
|
344
|
-
} catch (e) {
|
|
345
|
-
resultObj = { error: result! };
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const handleReject = () => {
|
|
349
|
-
addResult(JSON.stringify({ approve: false }));
|
|
350
|
-
};
|
|
351
|
-
|
|
352
|
-
const handleConfirm = async () => {
|
|
353
|
-
addResult(JSON.stringify({ approve: true }));
|
|
354
|
-
};
|
|
355
|
-
|
|
356
|
-
return (
|
|
357
|
-
<div className="mb-4 flex flex-col items-center gap-2">
|
|
358
|
-
<div>
|
|
359
|
-
<pre className="whitespace-pre-wrap break-all text-center">
|
|
360
|
-
purchase_stock({JSON.stringify(args)})
|
|
361
|
-
</pre>
|
|
362
|
-
</div>
|
|
363
|
-
{!result && status.type !== "running" && (
|
|
364
|
-
<TransactionConfirmationPending
|
|
365
|
-
{...args}
|
|
366
|
-
onConfirm={handleConfirm}
|
|
367
|
-
onReject={handleReject}
|
|
368
|
-
/>
|
|
369
|
-
)}
|
|
370
|
-
{resultObj.approve && <TransactionConfirmationFinal {...args} />}
|
|
371
|
-
{resultObj.approve === false && (
|
|
372
|
-
<pre className="font-bold text-red-600">User rejected purchase</pre>
|
|
373
|
-
)}
|
|
374
|
-
{resultObj.cancelled && (
|
|
375
|
-
<pre className="font-bold text-red-600">Cancelled</pre>
|
|
376
|
-
)}
|
|
377
|
-
</div>
|
|
378
|
-
);
|
|
379
|
-
};
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
### Try it out!
|
|
383
|
-
|
|
384
|
-
Confirm the purchase of shares. You should see the approval confirmation UI appear.
|
|
385
|
-
|
|
386
|
-
import purchase2 from "./images/acme-confirmed.png";
|
|
387
|
-
|
|
388
|
-
<Image
|
|
389
|
-
src={purchase2}
|
|
390
|
-
alt="Approval result"
|
|
391
|
-
width={600}
|
|
392
|
-
className="mx-auto rounded-lg border shadow"
|
|
393
|
-
/>
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Hooks
|
|
3
|
-
description: Permissions, questions, session state, runtime extras.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
import { OpenCodeIcon } from "@/components/icons/opencode";
|
|
7
|
-
|
|
8
|
-
OpenCode-specific React hooks for interacting with the running session. All hooks must be used inside the runtime context (a tree wrapped in `AssistantRuntimeProvider` from a `useOpenCodeRuntime` setup).
|
|
9
|
-
|
|
10
|
-
## Permissions
|
|
11
|
-
|
|
12
|
-
OpenCode pauses tool execution to ask the user for permission (e.g. running shell commands, writing files). Permissions linked to a tool call are projected into assistant-ui's standard tool approval contract, so the default `ToolFallback` renders working **Allow**, **Always allow**, and **Deny** actions without a custom permission component. The always option only appears when OpenCode offers patterns to persist.
|
|
13
|
-
|
|
14
|
-
`useOpenCodePermissions` remains available for custom tool renderers and permission requests that are not linked to a tool call. It returns the pending permission requests and a reply function:
|
|
15
|
-
|
|
16
|
-
```tsx
|
|
17
|
-
import { useOpenCodePermissions } from "@assistant-ui/react-opencode";
|
|
18
|
-
|
|
19
|
-
function PermissionPrompt() {
|
|
20
|
-
const { pending, reply } = useOpenCodePermissions();
|
|
21
|
-
|
|
22
|
-
return pending.map((req) => (
|
|
23
|
-
<div key={req.id}>
|
|
24
|
-
<p>
|
|
25
|
-
Allow <code>{req.toolName}</code>: {req.title ?? req.permission}?
|
|
26
|
-
</p>
|
|
27
|
-
<button onClick={() => reply(req.id, "once")}>Allow once</button>
|
|
28
|
-
<button onClick={() => reply(req.id, "always")}>Always allow</button>
|
|
29
|
-
<button onClick={() => reply(req.id, "reject")}>Reject</button>
|
|
30
|
-
</div>
|
|
31
|
-
));
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Return shape:
|
|
36
|
-
|
|
37
|
-
| Field | Type | Description |
|
|
38
|
-
| --- | --- | --- |
|
|
39
|
-
| `pending` | `OpenCodePermissionRequest[]` | Permission requests waiting for a reply. |
|
|
40
|
-
| `reply` | `(id, response) => Promise<void>` | Send a reply for a pending permission. |
|
|
41
|
-
|
|
42
|
-
Reply values:
|
|
43
|
-
|
|
44
|
-
| Reply | Meaning |
|
|
45
|
-
| --- | --- |
|
|
46
|
-
| `"once"` | Approve this single permission request. |
|
|
47
|
-
| `"always"` | Approve this permission and remember the choice. |
|
|
48
|
-
| `"reject"` | Deny the permission; the tool call is cancelled. |
|
|
49
|
-
|
|
50
|
-
## Questions
|
|
51
|
-
|
|
52
|
-
OpenCode can ask interactive questions during a run. `useOpenCodeQuestions` returns the pending questions as an array:
|
|
53
|
-
|
|
54
|
-
```tsx
|
|
55
|
-
import {
|
|
56
|
-
useOpenCodeQuestions,
|
|
57
|
-
useOpenCodeRuntimeExtras,
|
|
58
|
-
} from "@assistant-ui/react-opencode";
|
|
59
|
-
|
|
60
|
-
function QuestionPrompt() {
|
|
61
|
-
const questions = useOpenCodeQuestions();
|
|
62
|
-
const { replyToQuestion, rejectQuestion } = useOpenCodeRuntimeExtras();
|
|
63
|
-
|
|
64
|
-
return questions.map((req) => (
|
|
65
|
-
<div key={req.id}>
|
|
66
|
-
<p>{req.text}</p>
|
|
67
|
-
<button
|
|
68
|
-
onClick={() =>
|
|
69
|
-
replyToQuestion(req.id, [
|
|
70
|
-
/* QuestionAnswer[] from @opencode-ai/sdk */
|
|
71
|
-
])
|
|
72
|
-
}
|
|
73
|
-
>
|
|
74
|
-
Answer
|
|
75
|
-
</button>
|
|
76
|
-
<button onClick={() => rejectQuestion(req.id)}>Skip</button>
|
|
77
|
-
</div>
|
|
78
|
-
));
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
To reply, use `replyToQuestion(id, answers)` or `rejectQuestion(id)` from [`useOpenCodeRuntimeExtras`](#runtime-extras).
|
|
83
|
-
|
|
84
|
-
## Session
|
|
85
|
-
|
|
86
|
-
`useOpenCodeSession` returns the current OpenCode `Session` object (server-side session metadata):
|
|
87
|
-
|
|
88
|
-
```tsx
|
|
89
|
-
import { useOpenCodeSession } from "@assistant-ui/react-opencode";
|
|
90
|
-
|
|
91
|
-
function SessionInfo() {
|
|
92
|
-
const session = useOpenCodeSession();
|
|
93
|
-
if (!session) return null;
|
|
94
|
-
return <div>Session: {session.id}</div>;
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Thread state
|
|
99
|
-
|
|
100
|
-
`useOpenCodeThreadState` returns the full projected thread state (messages, run state, interactions, sync metadata). Use it for advanced custom views; most apps don't need it.
|
|
101
|
-
|
|
102
|
-
```tsx
|
|
103
|
-
import { useOpenCodeThreadState } from "@assistant-ui/react-opencode";
|
|
104
|
-
|
|
105
|
-
function RunStatus() {
|
|
106
|
-
const state = useOpenCodeThreadState();
|
|
107
|
-
return <div>Run: {state.runState.type}</div>;
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
The returned `OpenCodeThreadState` includes:
|
|
112
|
-
|
|
113
|
-
- `sessionId`, `session`, `sessionStatus`, `loadState`, `runState`
|
|
114
|
-
- `messageOrder`, `messagesById`, `pendingUserMessages`
|
|
115
|
-
- `childSessionsById` (OpenCode `task` child-session projections keyed by session ID)
|
|
116
|
-
- `interactions.permissions` (pending + resolved), `interactions.questions` (pending + answered + rejected)
|
|
117
|
-
- `unhandledEvents`, `sync` timestamps
|
|
118
|
-
|
|
119
|
-
You can also pass a selector to read a specific slice:
|
|
120
|
-
|
|
121
|
-
```tsx
|
|
122
|
-
const isStreaming = useOpenCodeThreadState((s) => s.runState.type === "streaming");
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## Runtime extras
|
|
126
|
-
|
|
127
|
-
`useOpenCodeRuntimeExtras` exposes session-level imperative actions:
|
|
128
|
-
|
|
129
|
-
```tsx
|
|
130
|
-
import { useOpenCodeRuntimeExtras } from "@assistant-ui/react-opencode";
|
|
131
|
-
|
|
132
|
-
function SessionActions() {
|
|
133
|
-
const {
|
|
134
|
-
fork,
|
|
135
|
-
revert,
|
|
136
|
-
unrevert,
|
|
137
|
-
cancel,
|
|
138
|
-
refresh,
|
|
139
|
-
replyToPermission,
|
|
140
|
-
replyToQuestion,
|
|
141
|
-
rejectQuestion,
|
|
142
|
-
} = useOpenCodeRuntimeExtras();
|
|
143
|
-
// ...
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
| Action | Description |
|
|
148
|
-
| --- | --- |
|
|
149
|
-
| `fork(messageId)` | Create a new session forked from the given message; returns the new session id. |
|
|
150
|
-
| `revert(messageId)` | Revert the session to the state at the given message. |
|
|
151
|
-
| `unrevert()` | Undo the last revert. |
|
|
152
|
-
| `cancel()` | Cancel an in-flight run. |
|
|
153
|
-
| `refresh()` | Force re-fetch of session messages. |
|
|
154
|
-
| `replyToPermission(id, response)` | Reply to a permission request (`"once"`, `"always"`, `"reject"`). |
|
|
155
|
-
| `replyToQuestion(id, answers)` | Answer a pending question. |
|
|
156
|
-
| `rejectQuestion(id)` | Reject a pending question. |
|
|
157
|
-
|
|
158
|
-
`useOpenCodePermissions` and `useOpenCodeQuestions` are sugar over `replyToPermission` / `replyToQuestion` / `rejectQuestion` plus the `pending` slices of state.
|
|
159
|
-
|
|
160
|
-
## Lower-level building blocks
|
|
161
|
-
|
|
162
|
-
For custom integrations that bypass `useOpenCodeRuntime`:
|
|
163
|
-
|
|
164
|
-
| Export | Purpose |
|
|
165
|
-
| --- | --- |
|
|
166
|
-
| `OpenCodeEventSource` | Wraps the OpenCode server's event stream into a typed subscription. |
|
|
167
|
-
| `OpenCodeThreadController` | Per-session controller managing message state. |
|
|
168
|
-
| `createOpenCodeThreadState`, `reduceOpenCodeThreadState` | Pure state reducers if you want to drive the state machine yourself. |
|
|
169
|
-
| `projectOpenCodeThreadMessages` | Project raw OpenCode messages into assistant-ui thread messages. |
|
|
170
|
-
| `createOpencodeClient` (re-exported from `@opencode-ai/sdk`) | Build a client with custom config. |
|
|
171
|
-
|
|
172
|
-
These are only needed for advanced cases; most apps should use `useOpenCodeRuntime` directly.
|
|
173
|
-
|
|
174
|
-
## Related
|
|
175
|
-
|
|
176
|
-
<Cards>
|
|
177
|
-
<Card
|
|
178
|
-
icon={<OpenCodeIcon width={20} height={20} />}
|
|
179
|
-
title="OpenCode overview"
|
|
180
|
-
description="What OpenCode is and when to pick it."
|
|
181
|
-
href="/docs/runtimes/opencode/overview"
|
|
182
|
-
/>
|
|
183
|
-
<Card
|
|
184
|
-
title="Quickstart"
|
|
185
|
-
description="Minimal runtime + Thread setup."
|
|
186
|
-
href="/docs/runtimes/opencode/quickstart"
|
|
187
|
-
/>
|
|
188
|
-
<Card
|
|
189
|
-
icon={<OpenCodeIcon width={20} height={20} />}
|
|
190
|
-
title="OpenCode docs"
|
|
191
|
-
description="The OpenCode server itself."
|
|
192
|
-
href="https://opencode.ai/"
|
|
193
|
-
/>
|
|
194
|
-
</Cards>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: OpenCode Runtime
|
|
3
|
-
description: Build a React chat UI for OpenCode coding agents with assistant-ui — streaming, tool calls, file edits, and terminal output rendered in chat.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
`@assistant-ui/react-opencode` is a runtime adapter for [OpenCode](https://opencode.ai/), an open-source AI coding agent. It wires the OpenCode server's session and event APIs into an assistant-ui thread, including tool permissions, interactive questions, and session state.
|
|
7
|
-
|
|
8
|
-
<Callout type="warn">
|
|
9
|
-
This adapter is at v0.0.3 and is experimental. The runtime API and exported hooks may change without notice.
|
|
10
|
-
</Callout>
|
|
11
|
-
|
|
12
|
-
## When to use it
|
|
13
|
-
|
|
14
|
-
Pick the OpenCode runtime when:
|
|
15
|
-
|
|
16
|
-
- You are building a UI on top of an OpenCode agent server.
|
|
17
|
-
- You need first-class support for OpenCode's permission and question flows.
|
|
18
|
-
- You want session-aware features: fork, revert, unrevert, refresh.
|
|
19
|
-
|
|
20
|
-
If your backend is not OpenCode-based, see [picking a runtime](/docs/runtimes/pick-a-runtime) for alternatives.
|
|
21
|
-
|
|
22
|
-
## Architecture
|
|
23
|
-
|
|
24
|
-
`@assistant-ui/react-opencode` is layered on `ExternalStoreRuntime` plus a `RemoteThreadList` for session-backed thread management (see [architecture](/docs/runtimes/concepts/architecture)). OpenCode sessions map to assistant-ui threads; the runtime subscribes to a server-sent event stream and projects messages into the thread.
|
|
25
|
-
|
|
26
|
-
## Requirements
|
|
27
|
-
|
|
28
|
-
- A running [OpenCode](https://opencode.ai/) server (defaults to `http://localhost:4096`).
|
|
29
|
-
- React 18 or 19.
|
|
30
|
-
|
|
31
|
-
## Sub-agent conversations
|
|
32
|
-
|
|
33
|
-
OpenCode `task` tool calls expose their child session through tool metadata. The runtime loads those child sessions, keeps them synchronized from the same OpenCode event stream, and projects their transcripts into `ToolCallMessagePart.messages`. Parallel and recursively nested tasks are supported.
|
|
34
|
-
|
|
35
|
-
Loading is eager, not keyed to what a renderer displays. Once a thread is subscribed, every `task` part in its transcript fetches its child session, and each child does the same for its own nested tasks, so a long session with many task calls fetches every sub-agent transcript whether or not any of them is expanded. Each child session is fetched once and then kept current from the event stream, so re-subscribing a thread does not refetch it.
|
|
36
|
-
|
|
37
|
-
A `task` part carries `messages` only once its child session has loaded. While the child is still loading, the part projects as an ordinary tool call, so an empty `messages` array always means the sub-agent produced nothing rather than that its transcript is still in flight.
|
|
38
|
-
|
|
39
|
-
Use assistant-ui's [`MessagePartPrimitive.Messages`](/docs/tools/multi-agent) inside a `task` tool renderer to display the child conversation. Nested conversations are read-only and inherit the parent thread's tool renderers.
|
|
40
|
-
|
|
41
|
-
## Install
|
|
42
|
-
|
|
43
|
-
<InstallCommand npm={["@assistant-ui/react", "@assistant-ui/react-opencode", "@opencode-ai/sdk"]} />
|
|
44
|
-
|
|
45
|
-
## Next
|
|
46
|
-
|
|
47
|
-
<Cards>
|
|
48
|
-
<Card
|
|
49
|
-
title="Quickstart"
|
|
50
|
-
description="Minimal useOpenCodeRuntime setup against a local OpenCode server."
|
|
51
|
-
href="/docs/runtimes/opencode/quickstart"
|
|
52
|
-
/>
|
|
53
|
-
<Card
|
|
54
|
-
title="Hooks"
|
|
55
|
-
description="Permissions, questions, session state, runtime extras."
|
|
56
|
-
href="/docs/runtimes/opencode/hooks"
|
|
57
|
-
/>
|
|
58
|
-
</Cards>
|