@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,141 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { logger } from "../utils/logger.js";
|
|
3
|
-
import { formatMCPResponse } from "../utils/mcp-format.js";
|
|
4
|
-
import { getXuluxCatalog } from "../xulux/catalog-client.js";
|
|
5
|
-
import {
|
|
6
|
-
createTemplatePreview,
|
|
7
|
-
getTemplateDetails,
|
|
8
|
-
listTemplates,
|
|
9
|
-
} from "../xulux/template-service.js";
|
|
10
|
-
|
|
11
|
-
const emptyInputSchema = z.object({});
|
|
12
|
-
|
|
13
|
-
const detailsInputSchema = z.object({
|
|
14
|
-
templateId: z.string().describe("The template id from assistantUITemplates"),
|
|
15
|
-
versionId: z
|
|
16
|
-
.string()
|
|
17
|
-
.optional()
|
|
18
|
-
.describe(
|
|
19
|
-
"Optional version id. When provided, exampleConfig reflects that version's resolved defaults.",
|
|
20
|
-
),
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const previewInputSchema = z.object({
|
|
24
|
-
templateId: z.string().describe("The template id from assistantUITemplates"),
|
|
25
|
-
versionId: z
|
|
26
|
-
.string()
|
|
27
|
-
.optional()
|
|
28
|
-
.describe("Version id to use. Uses the template default if omitted."),
|
|
29
|
-
config: z
|
|
30
|
-
.record(z.string(), z.unknown())
|
|
31
|
-
.optional()
|
|
32
|
-
.describe(
|
|
33
|
-
"Customization config for the preview. Must contain only the top-level keys: hostUi, assistant, and brandTheme. " +
|
|
34
|
-
"Use the schemas from assistantUITemplateDetails.configRoots as the source of truth for each root. " +
|
|
35
|
-
"Do not pass any other root keys.",
|
|
36
|
-
),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
function withDegradedNote<T extends Record<string, unknown>>(
|
|
40
|
-
payload: T,
|
|
41
|
-
degraded: boolean,
|
|
42
|
-
degradedReason?: string,
|
|
43
|
-
): T & { catalogDegraded?: true; catalogDegradedReason?: string } {
|
|
44
|
-
if (!degraded) return payload;
|
|
45
|
-
return {
|
|
46
|
-
...payload,
|
|
47
|
-
catalogDegraded: true,
|
|
48
|
-
...(degradedReason ? { catalogDegradedReason: degradedReason } : {}),
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export const xuluxTemplatesListTool = {
|
|
53
|
-
name: "assistantUITemplates",
|
|
54
|
-
description:
|
|
55
|
-
"List the available assistant-ui hosted app templates and fixed demos with their features, customizable surfaces, and versions. " +
|
|
56
|
-
"Call this first for any assistant-ui app-building request. Use the features and customizable fields to decide which template fits. " +
|
|
57
|
-
"If customizable is empty, the entry is a fixed demo that should be used as-is rather than configured. " +
|
|
58
|
-
"Call assistantUITemplateDetails on the chosen template before requesting a preview.",
|
|
59
|
-
parameters: emptyInputSchema,
|
|
60
|
-
execute: async (_args: z.infer<typeof emptyInputSchema>) => {
|
|
61
|
-
logger.info("Listing assistant-ui templates");
|
|
62
|
-
try {
|
|
63
|
-
const { catalog, degraded, degradedReason } = await getXuluxCatalog();
|
|
64
|
-
return formatMCPResponse(
|
|
65
|
-
withDegradedNote(listTemplates(catalog), degraded, degradedReason),
|
|
66
|
-
);
|
|
67
|
-
} catch (error) {
|
|
68
|
-
logger.error("Failed to list assistant-ui templates", error);
|
|
69
|
-
return formatMCPResponse({
|
|
70
|
-
error: "Failed to list assistant-ui templates",
|
|
71
|
-
message: error instanceof Error ? error.message : String(error),
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export const xuluxTemplateDetailsTool = {
|
|
78
|
-
name: "assistantUITemplateDetails",
|
|
79
|
-
description:
|
|
80
|
-
"Get the full authoring surface for a specific assistant-ui hosted template. " +
|
|
81
|
-
"Returns configRoots schemas (with types, defaults, and enums), rules, built-in tool input/outputShape, renderer contracts, and an exampleConfig. " +
|
|
82
|
-
"Fixed demos return no configRoots; use those as-is without config. " +
|
|
83
|
-
"Use this before calling assistantUITemplatePreview to understand exactly what config to write. " +
|
|
84
|
-
"If assistantUITemplatePreview returns validationWarnings, call this again and cross-reference configRoots to correct the config.",
|
|
85
|
-
parameters: detailsInputSchema,
|
|
86
|
-
execute: async (args: z.infer<typeof detailsInputSchema>) => {
|
|
87
|
-
logger.info(
|
|
88
|
-
`Getting assistant-ui template details for: ${args.templateId}`,
|
|
89
|
-
);
|
|
90
|
-
try {
|
|
91
|
-
const { catalog, degraded, degradedReason } = await getXuluxCatalog();
|
|
92
|
-
const details = await getTemplateDetails(catalog, args);
|
|
93
|
-
return formatMCPResponse(
|
|
94
|
-
withDegradedNote(
|
|
95
|
-
details as unknown as Record<string, unknown>,
|
|
96
|
-
degraded,
|
|
97
|
-
degradedReason,
|
|
98
|
-
),
|
|
99
|
-
);
|
|
100
|
-
} catch (error) {
|
|
101
|
-
logger.error("Failed to get assistant-ui template details", error);
|
|
102
|
-
return formatMCPResponse({
|
|
103
|
-
error: "Failed to get assistant-ui template details",
|
|
104
|
-
message: error instanceof Error ? error.message : String(error),
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export const xuluxTemplatePreviewTool = {
|
|
111
|
-
name: "assistantUITemplatePreview",
|
|
112
|
-
description:
|
|
113
|
-
"Return preview and download URLs for a selected assistant-ui hosted template. " +
|
|
114
|
-
"The previewUrl is a hosted app URL; show it to the user first, or open it with an available browser/in-app-browser tool if your client provides one. " +
|
|
115
|
-
"If you pass config, a preview session is created on the hosted template sandbox and the returned URLs reflect that configuration. " +
|
|
116
|
-
"Do not pass config for fixed demos that have no configRoots in assistantUITemplateDetails. " +
|
|
117
|
-
"This tool only returns URLs.",
|
|
118
|
-
parameters: previewInputSchema,
|
|
119
|
-
execute: async (args: z.infer<typeof previewInputSchema>) => {
|
|
120
|
-
logger.info(
|
|
121
|
-
`Creating assistant-ui template preview for: ${args.templateId}`,
|
|
122
|
-
);
|
|
123
|
-
try {
|
|
124
|
-
const { catalog, degraded, degradedReason } = await getXuluxCatalog();
|
|
125
|
-
const result = await createTemplatePreview(catalog, args);
|
|
126
|
-
return formatMCPResponse(
|
|
127
|
-
withDegradedNote(
|
|
128
|
-
result as unknown as Record<string, unknown>,
|
|
129
|
-
degraded,
|
|
130
|
-
degradedReason,
|
|
131
|
-
),
|
|
132
|
-
);
|
|
133
|
-
} catch (error) {
|
|
134
|
-
logger.error("Failed to create assistant-ui template preview", error);
|
|
135
|
-
return formatMCPResponse({
|
|
136
|
-
error: "Failed to create assistant-ui template preview",
|
|
137
|
-
message: error instanceof Error ? error.message : String(error),
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
};
|
package/src/utils/cache.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export function cacheListing(
|
|
2
|
-
scan: () => Promise<string[]>,
|
|
3
|
-
): () => Promise<string[]> {
|
|
4
|
-
let cache: Promise<string[]> | null = null;
|
|
5
|
-
return () => {
|
|
6
|
-
if (!cache) {
|
|
7
|
-
cache = scan().then(
|
|
8
|
-
(result) => {
|
|
9
|
-
if (result.length === 0) cache = null;
|
|
10
|
-
return result;
|
|
11
|
-
},
|
|
12
|
-
(error) => {
|
|
13
|
-
cache = null;
|
|
14
|
-
throw error;
|
|
15
|
-
},
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
return cache;
|
|
19
|
-
};
|
|
20
|
-
}
|
package/src/utils/logger.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { IS_PREPARE_MODE } from "../constants.js";
|
|
2
|
-
|
|
3
|
-
export const logger = {
|
|
4
|
-
debug: (message: string, ...args: any[]) => {
|
|
5
|
-
if (process.env.DEBUG) {
|
|
6
|
-
console.debug(`[DEBUG] ${message}`, ...args);
|
|
7
|
-
}
|
|
8
|
-
},
|
|
9
|
-
info: (message: string, ...args: any[]) => {
|
|
10
|
-
if (IS_PREPARE_MODE) {
|
|
11
|
-
console.log(`[INFO] ${message}`, ...args);
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
error: (message: string, ...args: any[]) => {
|
|
15
|
-
console.error(`[ERROR] ${message}`, ...args);
|
|
16
|
-
},
|
|
17
|
-
warn: (message: string, ...args: any[]) => {
|
|
18
|
-
console.warn(`[WARN] ${message}`, ...args);
|
|
19
|
-
},
|
|
20
|
-
};
|
package/src/utils/mcp-format.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export function formatMCPResponse(data: any): {
|
|
2
|
-
content: Array<{ type: "text"; text: string }>;
|
|
3
|
-
structuredContent?: Record<string, unknown>;
|
|
4
|
-
} {
|
|
5
|
-
const text = typeof data === "string" ? data : JSON.stringify(data, null, 2);
|
|
6
|
-
const isStructured =
|
|
7
|
-
typeof data === "object" && data !== null && !Array.isArray(data);
|
|
8
|
-
return {
|
|
9
|
-
content: [{ type: "text", text }],
|
|
10
|
-
...(isStructured && {
|
|
11
|
-
structuredContent: data as Record<string, unknown>,
|
|
12
|
-
}),
|
|
13
|
-
};
|
|
14
|
-
}
|
package/src/utils/mdx.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { readFile, lstat } from "node:fs/promises";
|
|
2
|
-
import matter from "gray-matter";
|
|
3
|
-
import { MAX_FILE_SIZE } from "../constants.js";
|
|
4
|
-
import { logger } from "./logger.js";
|
|
5
|
-
|
|
6
|
-
interface MDXContent {
|
|
7
|
-
content: string;
|
|
8
|
-
frontmatter: Record<string, any>;
|
|
9
|
-
excerpt?: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function readMDXFile(
|
|
13
|
-
filePath: string,
|
|
14
|
-
): Promise<MDXContent | null> {
|
|
15
|
-
try {
|
|
16
|
-
const fileContent = await readFile(filePath, "utf-8");
|
|
17
|
-
const { content, data } = matter(fileContent);
|
|
18
|
-
|
|
19
|
-
const excerptMatch = content.match(/^(.+?)(?:\n\n|$)/);
|
|
20
|
-
const excerpt =
|
|
21
|
-
excerptMatch?.[1] !== undefined
|
|
22
|
-
? excerptMatch[1].replace(/^#+ /, "")
|
|
23
|
-
: undefined;
|
|
24
|
-
|
|
25
|
-
return {
|
|
26
|
-
content,
|
|
27
|
-
frontmatter: data,
|
|
28
|
-
...(excerpt !== undefined && { excerpt }),
|
|
29
|
-
};
|
|
30
|
-
} catch (error) {
|
|
31
|
-
logger.error(`Failed to read MDX file: ${filePath}`, error);
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export async function readMDXFileSafe(
|
|
37
|
-
filePath: string,
|
|
38
|
-
): Promise<MDXContent | null> {
|
|
39
|
-
try {
|
|
40
|
-
const stats = await lstat(filePath);
|
|
41
|
-
if (stats.isSymbolicLink()) {
|
|
42
|
-
logger.warn(`Attempted to read symlink: ${filePath}`);
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
if (stats.size > MAX_FILE_SIZE) {
|
|
46
|
-
logger.warn(`File size exceeds limit: ${filePath} (${stats.size} bytes)`);
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
} catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
return readMDXFile(filePath);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function formatMDXContent(mdxContent: MDXContent): string {
|
|
56
|
-
const { content, frontmatter } = mdxContent;
|
|
57
|
-
|
|
58
|
-
return matter.stringify(content, frontmatter);
|
|
59
|
-
}
|
package/src/utils/paths.ts
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { readdir, stat } from "node:fs/promises";
|
|
2
|
-
import { join, extname } from "node:path";
|
|
3
|
-
import { DOCS_PATH, MDX_EXTENSION, MD_EXTENSION } from "../constants.js";
|
|
4
|
-
import { cacheListing } from "./cache.js";
|
|
5
|
-
import { logger } from "./logger.js";
|
|
6
|
-
|
|
7
|
-
const SIMILARITY_THRESHOLDS = {
|
|
8
|
-
EXACT_MATCH: 1,
|
|
9
|
-
CONTAINS_MATCH: 0.8,
|
|
10
|
-
PARTIAL_MATCH: 0.5,
|
|
11
|
-
MIN_SUGGESTION: 0.3,
|
|
12
|
-
} as const;
|
|
13
|
-
|
|
14
|
-
export async function listDirContents(dirPath: string): Promise<{
|
|
15
|
-
directories: string[];
|
|
16
|
-
files: string[];
|
|
17
|
-
}> {
|
|
18
|
-
try {
|
|
19
|
-
const items = await readdir(dirPath, { withFileTypes: true });
|
|
20
|
-
|
|
21
|
-
const directories = items
|
|
22
|
-
.filter((item) => item.isDirectory())
|
|
23
|
-
.map((item) => item.name)
|
|
24
|
-
.filter((name) => !name.startsWith("."))
|
|
25
|
-
.sort();
|
|
26
|
-
|
|
27
|
-
const files = items
|
|
28
|
-
.filter(
|
|
29
|
-
(item) =>
|
|
30
|
-
item.isFile() &&
|
|
31
|
-
(extname(item.name) === MDX_EXTENSION ||
|
|
32
|
-
extname(item.name) === MD_EXTENSION),
|
|
33
|
-
)
|
|
34
|
-
.map((item) => item.name)
|
|
35
|
-
.sort();
|
|
36
|
-
|
|
37
|
-
return { directories, files };
|
|
38
|
-
} catch (error) {
|
|
39
|
-
logger.error(`Failed to list directory contents: ${dirPath}`, error);
|
|
40
|
-
return { directories: [], files: [] };
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function getAvailablePaths(): Promise<string[]> {
|
|
45
|
-
const paths: string[] = [];
|
|
46
|
-
|
|
47
|
-
async function scanDirectory(
|
|
48
|
-
dir: string,
|
|
49
|
-
prefix: string = "",
|
|
50
|
-
): Promise<void> {
|
|
51
|
-
const { directories, files } = await listDirContents(dir);
|
|
52
|
-
|
|
53
|
-
for (const file of files) {
|
|
54
|
-
const name = file.replace(MDX_EXTENSION, "").replace(MD_EXTENSION, "");
|
|
55
|
-
paths.push(prefix ? `${prefix}/${name}` : name);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
for (const subdir of directories) {
|
|
59
|
-
const subdirPath = join(dir, subdir);
|
|
60
|
-
const newPrefix = prefix ? `${prefix}/${subdir}` : subdir;
|
|
61
|
-
paths.push(newPrefix);
|
|
62
|
-
await scanDirectory(subdirPath, newPrefix);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
await scanDirectory(DOCS_PATH);
|
|
67
|
-
return paths.sort();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export const getAvailableDocFiles = cacheListing(scanDocFiles);
|
|
71
|
-
|
|
72
|
-
async function scanDocFiles(): Promise<string[]> {
|
|
73
|
-
const files: string[] = [];
|
|
74
|
-
|
|
75
|
-
async function scanDirectory(dir: string, prefix = ""): Promise<void> {
|
|
76
|
-
const { directories, files: dirFiles } = await listDirContents(dir);
|
|
77
|
-
|
|
78
|
-
for (const file of dirFiles) {
|
|
79
|
-
if (extname(file) !== MDX_EXTENSION) continue;
|
|
80
|
-
const name = file.replace(MDX_EXTENSION, "");
|
|
81
|
-
files.push(prefix ? `${prefix}/${name}` : name);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
for (const subdir of directories) {
|
|
85
|
-
const newPrefix = prefix ? `${prefix}/${subdir}` : subdir;
|
|
86
|
-
await scanDirectory(join(dir, subdir), newPrefix);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
await scanDirectory(DOCS_PATH);
|
|
91
|
-
return files.sort();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export function findNearestPaths(
|
|
95
|
-
requestedPath: string,
|
|
96
|
-
availablePaths: string[],
|
|
97
|
-
): string[] {
|
|
98
|
-
const normalizedRequest = requestedPath
|
|
99
|
-
.toLowerCase()
|
|
100
|
-
.replace(/[^a-z0-9]/g, "");
|
|
101
|
-
|
|
102
|
-
const scored = availablePaths.map((path) => {
|
|
103
|
-
const normalizedPath = path.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
104
|
-
|
|
105
|
-
if (normalizedPath.includes(normalizedRequest)) {
|
|
106
|
-
return { path, score: SIMILARITY_THRESHOLDS.EXACT_MATCH };
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (normalizedRequest.includes(normalizedPath)) {
|
|
110
|
-
return { path, score: SIMILARITY_THRESHOLDS.CONTAINS_MATCH };
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const overlap = [...normalizedRequest].filter((char) =>
|
|
114
|
-
normalizedPath.includes(char),
|
|
115
|
-
).length;
|
|
116
|
-
|
|
117
|
-
return {
|
|
118
|
-
path,
|
|
119
|
-
score:
|
|
120
|
-
(overlap / normalizedRequest.length) *
|
|
121
|
-
SIMILARITY_THRESHOLDS.PARTIAL_MATCH,
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
return scored
|
|
126
|
-
.filter((item) => item.score > SIMILARITY_THRESHOLDS.MIN_SUGGESTION)
|
|
127
|
-
.sort((a, b) => b.score - a.score)
|
|
128
|
-
.slice(0, 3)
|
|
129
|
-
.map((item) => item.path);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export async function pathExists(path: string): Promise<boolean> {
|
|
133
|
-
try {
|
|
134
|
-
await stat(path);
|
|
135
|
-
return true;
|
|
136
|
-
} catch {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
}
|
package/src/utils/search.ts
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
2
|
-
import { DOCS_PATH, MDX_EXTENSION } from "../constants.js";
|
|
3
|
-
import { getAvailablePaths, pathExists } from "./paths.js";
|
|
4
|
-
import { readMDXFile } from "./mdx.js";
|
|
5
|
-
|
|
6
|
-
const SCORE_WEIGHTS = {
|
|
7
|
-
FULL_QUERY: { title: 10, path: 8, description: 5 },
|
|
8
|
-
TOKEN: { title: 3, path: 2, description: 1, content: 0.5 },
|
|
9
|
-
} as const;
|
|
10
|
-
|
|
11
|
-
interface IndexEntry {
|
|
12
|
-
path: string;
|
|
13
|
-
title: string;
|
|
14
|
-
description: string;
|
|
15
|
-
content: string;
|
|
16
|
-
excerpt: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface SearchResult {
|
|
20
|
-
path: string;
|
|
21
|
-
title: string;
|
|
22
|
-
snippet: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
let indexPromise: Promise<IndexEntry[]> | null = null;
|
|
26
|
-
|
|
27
|
-
function deriveTitle(
|
|
28
|
-
path: string,
|
|
29
|
-
frontmatter: Record<string, unknown>,
|
|
30
|
-
): string {
|
|
31
|
-
const fmTitle = frontmatter["title"];
|
|
32
|
-
if (typeof fmTitle === "string" && fmTitle.trim()) return fmTitle;
|
|
33
|
-
return path.split("/").pop() ?? path;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async function buildIndex(): Promise<IndexEntry[]> {
|
|
37
|
-
const paths = await getAvailablePaths();
|
|
38
|
-
const entries = await Promise.all(
|
|
39
|
-
paths.map(async (path): Promise<IndexEntry | null> => {
|
|
40
|
-
const filePath = join(DOCS_PATH, `${path}${MDX_EXTENSION}`);
|
|
41
|
-
if (!(await pathExists(filePath))) return null;
|
|
42
|
-
const mdx = await readMDXFile(filePath);
|
|
43
|
-
if (!mdx) return null;
|
|
44
|
-
const description = mdx.frontmatter["description"];
|
|
45
|
-
return {
|
|
46
|
-
path,
|
|
47
|
-
title: deriveTitle(path, mdx.frontmatter),
|
|
48
|
-
description: typeof description === "string" ? description : "",
|
|
49
|
-
content: mdx.content,
|
|
50
|
-
excerpt: mdx.excerpt ?? "",
|
|
51
|
-
};
|
|
52
|
-
}),
|
|
53
|
-
);
|
|
54
|
-
return entries.filter((entry): entry is IndexEntry => entry !== null);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function getIndex(): Promise<IndexEntry[]> {
|
|
58
|
-
if (!indexPromise) {
|
|
59
|
-
indexPromise = buildIndex().catch((error) => {
|
|
60
|
-
indexPromise = null;
|
|
61
|
-
throw error;
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
return indexPromise;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function makeSnippet(
|
|
68
|
-
content: string,
|
|
69
|
-
tokens: string[],
|
|
70
|
-
excerpt: string,
|
|
71
|
-
): string {
|
|
72
|
-
const lower = content.toLowerCase();
|
|
73
|
-
for (const token of tokens) {
|
|
74
|
-
const idx = lower.indexOf(token);
|
|
75
|
-
if (idx >= 0) {
|
|
76
|
-
const start = Math.max(0, idx - 60);
|
|
77
|
-
const end = Math.min(content.length, idx + token.length + 100);
|
|
78
|
-
const slice = content.slice(start, end).replace(/\s+/g, " ").trim();
|
|
79
|
-
return `${start > 0 ? "…" : ""}${slice}${end < content.length ? "…" : ""}`;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
if (excerpt) return excerpt.slice(0, 160);
|
|
83
|
-
const firstLine = content.split("\n").find((line) => line.trim());
|
|
84
|
-
return firstLine ? firstLine.replace(/^#+\s*/, "").slice(0, 160) : "";
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function scoreEntry(
|
|
88
|
-
entry: IndexEntry,
|
|
89
|
-
query: string,
|
|
90
|
-
tokens: string[],
|
|
91
|
-
): number {
|
|
92
|
-
const title = entry.title.toLowerCase();
|
|
93
|
-
const path = entry.path.toLowerCase();
|
|
94
|
-
const description = entry.description.toLowerCase();
|
|
95
|
-
const content = entry.content.toLowerCase();
|
|
96
|
-
|
|
97
|
-
let score = 0;
|
|
98
|
-
if (title.includes(query)) score += SCORE_WEIGHTS.FULL_QUERY.title;
|
|
99
|
-
if (path.includes(query)) score += SCORE_WEIGHTS.FULL_QUERY.path;
|
|
100
|
-
if (description.includes(query))
|
|
101
|
-
score += SCORE_WEIGHTS.FULL_QUERY.description;
|
|
102
|
-
|
|
103
|
-
for (const token of tokens) {
|
|
104
|
-
if (title.includes(token)) score += SCORE_WEIGHTS.TOKEN.title;
|
|
105
|
-
if (path.includes(token)) score += SCORE_WEIGHTS.TOKEN.path;
|
|
106
|
-
if (description.includes(token)) score += SCORE_WEIGHTS.TOKEN.description;
|
|
107
|
-
if (content.includes(token)) score += SCORE_WEIGHTS.TOKEN.content;
|
|
108
|
-
}
|
|
109
|
-
return score;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export async function searchDocs(
|
|
113
|
-
query: string,
|
|
114
|
-
limit = 10,
|
|
115
|
-
): Promise<SearchResult[]> {
|
|
116
|
-
const normalized = query.trim().toLowerCase();
|
|
117
|
-
if (!normalized) return [];
|
|
118
|
-
const tokens = normalized.split(/\s+/).filter(Boolean);
|
|
119
|
-
|
|
120
|
-
const index = await getIndex();
|
|
121
|
-
return index
|
|
122
|
-
.map((entry) => ({ entry, score: scoreEntry(entry, normalized, tokens) }))
|
|
123
|
-
.filter((scored) => scored.score > 0)
|
|
124
|
-
.sort((a, b) => b.score - a.score)
|
|
125
|
-
.slice(0, limit)
|
|
126
|
-
.map(({ entry }) => ({
|
|
127
|
-
path: entry.path,
|
|
128
|
-
title: entry.title,
|
|
129
|
-
snippet: makeSnippet(entry.content, tokens, entry.excerpt),
|
|
130
|
-
}));
|
|
131
|
-
}
|
package/src/utils/security.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
|
|
3
|
-
export function sanitizePath(userPath: string): string {
|
|
4
|
-
if (!userPath || typeof userPath !== "string") {
|
|
5
|
-
throw new Error("Invalid path: Path must be a non-empty string");
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
// Check for traversal patterns before normalization - defense in depth
|
|
9
|
-
if (userPath.includes("../") || userPath.includes("..\\")) {
|
|
10
|
-
throw new Error("Invalid path: Directory traversal attempt detected");
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const normalized = path.normalize(userPath);
|
|
14
|
-
|
|
15
|
-
if (path.isAbsolute(normalized)) {
|
|
16
|
-
throw new Error("Invalid path: Absolute paths are not allowed");
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const relativePath = path.relative("", normalized);
|
|
20
|
-
|
|
21
|
-
if (relativePath.startsWith("..")) {
|
|
22
|
-
throw new Error("Invalid path: Directory traversal attempt detected");
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (relativePath.includes("..")) {
|
|
26
|
-
throw new Error("Invalid path: Path contains invalid traversal sequences");
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (relativePath.includes("\0")) {
|
|
30
|
-
throw new Error("Invalid path: Path contains null bytes");
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (process.platform !== "win32") {
|
|
34
|
-
if (normalized.includes("\\")) {
|
|
35
|
-
throw new Error("Invalid path: Backslashes not allowed");
|
|
36
|
-
}
|
|
37
|
-
} else {
|
|
38
|
-
if (normalized.includes(":") || normalized.startsWith("\\\\")) {
|
|
39
|
-
throw new Error("Invalid path: Path contains invalid Windows characters");
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const segments = relativePath.split(path.sep);
|
|
44
|
-
for (const segment of segments) {
|
|
45
|
-
if (segment.startsWith(".") && segment !== ".") {
|
|
46
|
-
throw new Error("Invalid path: Hidden files are not allowed");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Always return Unix-style paths for consistency across platforms
|
|
51
|
-
return relativePath.replace(/\\/g, "/");
|
|
52
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { cacheListing } from "../cache.js";
|
|
3
|
-
|
|
4
|
-
describe("cacheListing", () => {
|
|
5
|
-
it("scans once and reuses the result", async () => {
|
|
6
|
-
let calls = 0;
|
|
7
|
-
const listing = cacheListing(async () => {
|
|
8
|
-
calls++;
|
|
9
|
-
return ["a", "b"];
|
|
10
|
-
});
|
|
11
|
-
const first = await listing();
|
|
12
|
-
const second = await listing();
|
|
13
|
-
expect(second).toBe(first);
|
|
14
|
-
expect(calls).toBe(1);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it("shares one in-flight scan across concurrent callers", async () => {
|
|
18
|
-
let calls = 0;
|
|
19
|
-
const listing = cacheListing(async () => {
|
|
20
|
-
calls++;
|
|
21
|
-
return ["a"];
|
|
22
|
-
});
|
|
23
|
-
const [first, second] = await Promise.all([listing(), listing()]);
|
|
24
|
-
expect(second).toBe(first);
|
|
25
|
-
expect(calls).toBe(1);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("re-scans after a failed scan", async () => {
|
|
29
|
-
let calls = 0;
|
|
30
|
-
const listing = cacheListing(async () => {
|
|
31
|
-
calls++;
|
|
32
|
-
if (calls === 1) throw new Error("boom");
|
|
33
|
-
return ["a"];
|
|
34
|
-
});
|
|
35
|
-
await expect(listing()).rejects.toThrow("boom");
|
|
36
|
-
expect(await listing()).toEqual(["a"]);
|
|
37
|
-
expect(calls).toBe(2);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("does not cache an empty listing", async () => {
|
|
41
|
-
let calls = 0;
|
|
42
|
-
const listing = cacheListing(async () => {
|
|
43
|
-
calls++;
|
|
44
|
-
return calls === 1 ? [] : ["a"];
|
|
45
|
-
});
|
|
46
|
-
expect(await listing()).toEqual([]);
|
|
47
|
-
expect(await listing()).toEqual(["a"]);
|
|
48
|
-
expect(await listing()).toEqual(["a"]);
|
|
49
|
-
expect(calls).toBe(2);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { formatMCPResponse } from "../mcp-format.js";
|
|
3
|
-
|
|
4
|
-
describe("formatMCPResponse", () => {
|
|
5
|
-
it("attaches structuredContent for object data, mirroring the text block", () => {
|
|
6
|
-
const data = { found: true, path: "getting-started", type: "file" };
|
|
7
|
-
const res = formatMCPResponse(data);
|
|
8
|
-
expect(res.content[0]!.text).toBe(JSON.stringify(data, null, 2));
|
|
9
|
-
expect(res.structuredContent).toEqual(data);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it("omits structuredContent for string data", () => {
|
|
13
|
-
const res = formatMCPResponse("plain text");
|
|
14
|
-
expect(res.content[0]!.text).toBe("plain text");
|
|
15
|
-
expect(res.structuredContent).toBeUndefined();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it("omits structuredContent for array data", () => {
|
|
19
|
-
const res = formatMCPResponse([1, 2, 3] as any);
|
|
20
|
-
expect(res.structuredContent).toBeUndefined();
|
|
21
|
-
});
|
|
22
|
-
});
|