skybridge 0.0.0-dev.e97960f → 0.0.0-dev.e99ee17
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 +126 -124
- package/dist/cli/build-helpers.d.ts +11 -0
- package/dist/cli/build-helpers.js +107 -0
- package/dist/cli/build-helpers.js.map +1 -0
- package/dist/cli/build-helpers.test.js +132 -0
- package/dist/cli/build-helpers.test.js.map +1 -0
- package/dist/cli/build-steps.d.ts +2 -0
- package/dist/cli/build-steps.js +73 -0
- package/dist/cli/build-steps.js.map +1 -0
- package/dist/cli/build-steps.test.js +52 -0
- package/dist/cli/build-steps.test.js.map +1 -0
- package/dist/cli/detect-port.d.ts +2 -2
- package/dist/cli/detect-port.js +8 -20
- package/dist/cli/detect-port.js.map +1 -1
- package/dist/cli/header.d.ts +1 -1
- package/dist/cli/resolve-skybridge-config.d.ts +5 -0
- package/dist/cli/resolve-skybridge-config.js +18 -0
- package/dist/cli/resolve-skybridge-config.js.map +1 -0
- package/dist/cli/run-plain.d.ts +18 -0
- package/dist/cli/run-plain.js +90 -0
- package/dist/cli/run-plain.js.map +1 -0
- package/dist/cli/telemetry.js +2 -0
- package/dist/cli/telemetry.js.map +1 -1
- package/dist/cli/use-execute-steps.d.ts +1 -1
- package/dist/cli/use-nodemon.d.ts +25 -1
- package/dist/cli/use-nodemon.js +96 -63
- package/dist/cli/use-nodemon.js.map +1 -1
- package/dist/cli/use-typescript-check.d.ts +8 -2
- package/dist/cli/use-typescript-check.js +71 -68
- package/dist/cli/use-typescript-check.js.map +1 -1
- package/dist/commands/build.d.ts +0 -3
- package/dist/commands/build.js +2 -73
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/create.d.ts +9 -0
- package/dist/commands/create.js +30 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dev.d.ts +1 -0
- package/dist/commands/dev.js +51 -3
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/start.js +7 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/context-warnings.d.ts +5 -0
- package/dist/context-warnings.js +31 -0
- package/dist/context-warnings.js.map +1 -0
- package/dist/context-warnings.test.js +28 -0
- package/dist/context-warnings.test.js.map +1 -0
- package/dist/server/app.d.ts +194 -0
- package/dist/server/app.js +266 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/app.test.js +97 -0
- package/dist/server/app.test.js.map +1 -0
- package/dist/server/asset-base-url-transform-plugin.d.ts +1 -0
- package/dist/server/asset-base-url-transform-plugin.js +16 -1
- package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
- package/dist/server/asset-base-url-transform-plugin.test.js +51 -1
- package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
- package/dist/server/auth/discovery.d.ts +33 -0
- package/dist/server/auth/discovery.js +56 -0
- package/dist/server/auth/discovery.js.map +1 -0
- package/dist/server/auth/discovery.test.d.ts +1 -0
- package/dist/server/auth/discovery.test.js +93 -0
- package/dist/server/auth/discovery.test.js.map +1 -0
- package/dist/server/auth/index.d.ts +48 -0
- package/dist/server/auth/index.js +2 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/server/auth/providers/auth0.d.ts +40 -0
- package/dist/server/auth/providers/auth0.js +36 -0
- package/dist/server/auth/providers/auth0.js.map +1 -0
- package/dist/server/auth/providers/auth0.test.d.ts +1 -0
- package/dist/server/auth/providers/auth0.test.js +50 -0
- package/dist/server/auth/providers/auth0.test.js.map +1 -0
- package/dist/server/auth/providers/authplane.d.ts +49 -0
- package/dist/server/auth/providers/authplane.js +57 -0
- package/dist/server/auth/providers/authplane.js.map +1 -0
- package/dist/server/auth/providers/authplane.test.d.ts +1 -0
- package/dist/server/auth/providers/authplane.test.js +143 -0
- package/dist/server/auth/providers/authplane.test.js.map +1 -0
- package/dist/server/auth/providers/clerk.d.ts +51 -0
- package/dist/server/auth/providers/clerk.js +19 -0
- package/dist/server/auth/providers/clerk.js.map +1 -0
- package/dist/server/auth/providers/clerk.test.d.ts +1 -0
- package/dist/server/auth/providers/clerk.test.js +30 -0
- package/dist/server/auth/providers/clerk.test.js.map +1 -0
- package/dist/server/auth/providers/custom.d.ts +42 -0
- package/dist/server/auth/providers/custom.js +59 -0
- package/dist/server/auth/providers/custom.js.map +1 -0
- package/dist/server/auth/providers/custom.test.d.ts +1 -0
- package/dist/server/auth/providers/custom.test.js +161 -0
- package/dist/server/auth/providers/custom.test.js.map +1 -0
- package/dist/server/auth/providers/descope.d.ts +44 -0
- package/dist/server/auth/providers/descope.js +44 -0
- package/dist/server/auth/providers/descope.js.map +1 -0
- package/dist/server/auth/providers/descope.test.d.ts +1 -0
- package/dist/server/auth/providers/descope.test.js +62 -0
- package/dist/server/auth/providers/descope.test.js.map +1 -0
- package/dist/server/auth/providers/shared.d.ts +2 -0
- package/dist/server/auth/providers/shared.js +6 -0
- package/dist/server/auth/providers/shared.js.map +1 -0
- package/dist/server/auth/providers/shared.test.d.ts +1 -0
- package/dist/server/auth/providers/shared.test.js +10 -0
- package/dist/server/auth/providers/shared.test.js.map +1 -0
- package/dist/server/auth/providers/stytch.d.ts +25 -0
- package/dist/server/auth/providers/stytch.js +16 -0
- package/dist/server/auth/providers/stytch.js.map +1 -0
- package/dist/server/auth/providers/verify-spy.d.ts +12 -0
- package/dist/server/auth/providers/verify-spy.js +21 -0
- package/dist/server/auth/providers/verify-spy.js.map +1 -0
- package/dist/server/auth/providers/workos.d.ts +34 -0
- package/dist/server/auth/providers/workos.js +16 -0
- package/dist/server/auth/providers/workos.js.map +1 -0
- package/dist/server/auth/security-schemes.d.ts +23 -0
- package/dist/server/auth/security-schemes.js +64 -0
- package/dist/server/auth/security-schemes.js.map +1 -0
- package/dist/server/auth/security-schemes.test.d.ts +1 -0
- package/dist/server/auth/security-schemes.test.js +99 -0
- package/dist/server/auth/security-schemes.test.js.map +1 -0
- package/dist/server/auth/setup.d.ts +6 -0
- package/dist/server/auth/setup.js +91 -0
- package/dist/server/auth/setup.js.map +1 -0
- package/dist/server/auth/setup.test.d.ts +1 -0
- package/dist/server/auth/setup.test.js +514 -0
- package/dist/server/auth/setup.test.js.map +1 -0
- package/dist/server/auth/verify.d.ts +48 -0
- package/dist/server/auth/verify.js +62 -0
- package/dist/server/auth/verify.js.map +1 -0
- package/dist/server/auth/verify.test.d.ts +1 -0
- package/dist/server/auth/verify.test.js +165 -0
- package/dist/server/auth/verify.test.js.map +1 -0
- package/dist/server/auth-extra.test-d.js +130 -0
- package/dist/server/auth-extra.test-d.js.map +1 -0
- package/dist/server/auth.d.ts +57 -0
- package/dist/server/auth.js +27 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/build-manifest.test.d.ts +1 -0
- package/dist/server/build-manifest.test.js +28 -0
- package/dist/server/build-manifest.test.js.map +1 -0
- package/dist/server/content-helpers.d.ts +41 -1
- package/dist/server/content-helpers.js +33 -0
- package/dist/server/content-helpers.js.map +1 -1
- package/dist/server/events.d.ts +113 -0
- package/dist/server/events.js +318 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/events.test.d.ts +1 -0
- package/dist/server/events.test.js +172 -0
- package/dist/server/events.test.js.map +1 -0
- package/dist/server/express.d.ts +23 -3
- package/dist/server/express.js +43 -32
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.test.js +269 -90
- package/dist/server/express.test.js.map +1 -1
- package/dist/server/file-ref.d.ts +21 -1
- package/dist/server/file-ref.js +20 -1
- package/dist/server/file-ref.js.map +1 -1
- package/dist/server/form-input.d.ts +120 -0
- package/dist/server/form-input.js +89 -0
- package/dist/server/form-input.js.map +1 -0
- package/dist/server/host.d.ts +2 -0
- package/dist/server/host.js +11 -0
- package/dist/server/host.js.map +1 -0
- package/dist/server/host.test.d.ts +1 -0
- package/dist/server/host.test.js +13 -0
- package/dist/server/host.test.js.map +1 -0
- package/dist/server/index.d.ts +19 -2
- package/dist/server/index.js +16 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp-errors.test.d.ts +1 -0
- package/dist/server/mcp-errors.test.js +41 -0
- package/dist/server/mcp-errors.test.js.map +1 -0
- package/dist/server/middleware.d.ts +51 -13
- package/dist/server/middleware.js +33 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/middleware.test-d.js +1 -1
- package/dist/server/middleware.test-d.js.map +1 -1
- package/dist/server/middleware.test.js +242 -134
- package/dist/server/middleware.test.js.map +1 -1
- package/dist/server/register-tool.test.d.ts +1 -0
- package/dist/server/register-tool.test.js +230 -0
- package/dist/server/register-tool.test.js.map +1 -0
- package/dist/server/requestOrigin.d.ts +7 -0
- package/dist/server/requestOrigin.js +25 -0
- package/dist/server/requestOrigin.js.map +1 -0
- package/dist/server/server.d.ts +532 -67
- package/dist/server/server.js +646 -315
- package/dist/server/server.js.map +1 -1
- package/dist/server/skills-integration.test.d.ts +1 -0
- package/dist/server/skills-integration.test.js +86 -0
- package/dist/server/skills-integration.test.js.map +1 -0
- package/dist/server/skills.d.ts +27 -0
- package/dist/server/skills.js +188 -0
- package/dist/server/skills.js.map +1 -0
- package/dist/server/skills.test.d.ts +1 -0
- package/dist/server/skills.test.js +243 -0
- package/dist/server/skills.test.js.map +1 -0
- package/dist/server/templateHelper.d.ts +0 -3
- package/dist/server/templateHelper.js.map +1 -1
- package/dist/server/templates.generated.js +4 -8
- package/dist/server/templates.generated.js.map +1 -1
- package/dist/server/tool-extra.test.d.ts +1 -0
- package/dist/server/tool-extra.test.js +167 -0
- package/dist/server/tool-extra.test.js.map +1 -0
- package/dist/server/view-name.test-d.d.ts +1 -0
- package/dist/server/view-name.test-d.js +8 -0
- package/dist/server/view-name.test-d.js.map +1 -0
- package/dist/server/view-resource-resolution.test.d.ts +6 -0
- package/dist/server/view-resource-resolution.test.js +176 -0
- package/dist/server/view-resource-resolution.test.js.map +1 -0
- package/dist/server/viewsDevServer.js +4 -1
- package/dist/server/viewsDevServer.js.map +1 -1
- package/dist/test/utils.d.ts +9 -11
- package/dist/test/utils.js +220 -201
- package/dist/test/utils.js.map +1 -1
- package/dist/test/view.test.js +123 -106
- package/dist/test/view.test.js.map +1 -1
- package/dist/views/index.d.ts +10 -0
- package/dist/views/index.js +3 -0
- package/dist/views/index.js.map +1 -0
- package/dist/{web/plugin → views}/scan-views.js +1 -1
- package/dist/views/scan-views.js.map +1 -0
- package/dist/views/scan-views.test.d.ts +1 -0
- package/dist/views/scan-views.test.js.map +1 -0
- package/dist/views/validate-view.d.ts +1 -0
- package/dist/{web/plugin → views}/validate-view.js +2 -2
- package/dist/views/validate-view.js.map +1 -0
- package/dist/views/validate-view.test.d.ts +1 -0
- package/dist/views/validate-view.test.js.map +1 -0
- package/dist/web/bridges/adaptor.d.ts +62 -0
- package/dist/web/bridges/adaptor.js +471 -0
- package/dist/web/bridges/adaptor.js.map +1 -0
- package/dist/web/bridges/adaptor.test.d.ts +1 -0
- package/dist/web/bridges/adaptor.test.js +264 -0
- package/dist/web/bridges/adaptor.test.js.map +1 -0
- package/dist/web/bridges/apps-sdk/bridge.d.ts +6 -1
- package/dist/web/bridges/apps-sdk/bridge.js +15 -3
- package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
- package/dist/web/bridges/apps-sdk/index.d.ts +0 -1
- package/dist/web/bridges/apps-sdk/index.js +0 -1
- package/dist/web/bridges/apps-sdk/index.js.map +1 -1
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
- package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
- package/dist/web/bridges/get-adaptor.d.ts +7 -0
- package/dist/web/bridges/get-adaptor.js +9 -7
- package/dist/web/bridges/get-adaptor.js.map +1 -1
- package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
- package/dist/web/bridges/get-adaptor.test.js +32 -0
- package/dist/web/bridges/get-adaptor.test.js.map +1 -0
- package/dist/web/bridges/mcp-app/bridge.d.ts +15 -2
- package/dist/web/bridges/mcp-app/bridge.js +80 -7
- package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
- package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
- package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
- package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
- package/dist/web/bridges/mcp-app/index.d.ts +0 -1
- package/dist/web/bridges/mcp-app/index.js +0 -1
- package/dist/web/bridges/mcp-app/index.js.map +1 -1
- package/dist/web/bridges/mcp-app/types.d.ts +19 -2
- package/dist/web/bridges/mcp-app/types.js.map +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +13 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js +12 -0
- package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +1 -1
- package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
- package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
- package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
- package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
- package/dist/web/bridges/types.d.ts +160 -5
- package/dist/web/bridges/types.js +14 -1
- package/dist/web/bridges/types.js.map +1 -1
- package/dist/web/bridges/types.test.d.ts +1 -0
- package/dist/web/bridges/types.test.js +19 -0
- package/dist/web/bridges/types.test.js.map +1 -0
- package/dist/web/bridges/use-host-context.d.ts +5 -0
- package/dist/web/bridges/use-host-context.js +5 -0
- package/dist/web/bridges/use-host-context.js.map +1 -1
- package/dist/web/components/modal-provider.d.ts +1 -1
- package/dist/web/components/modal-provider.js +4 -3
- package/dist/web/components/modal-provider.js.map +1 -1
- package/dist/web/create-store.d.ts +26 -0
- package/dist/web/create-store.js +26 -0
- package/dist/web/create-store.js.map +1 -1
- package/dist/web/create-store.test.js +10 -7
- package/dist/web/create-store.test.js.map +1 -1
- package/dist/web/data-llm.d.ts +34 -1
- package/dist/web/data-llm.js +31 -2
- package/dist/web/data-llm.js.map +1 -1
- package/dist/web/data-llm.test.js +26 -7
- package/dist/web/data-llm.test.js.map +1 -1
- package/dist/web/generate-helpers.d.ts +25 -19
- package/dist/web/generate-helpers.js +23 -17
- package/dist/web/generate-helpers.js.map +1 -1
- package/dist/web/generate-helpers.test-d.js +7 -5
- package/dist/web/generate-helpers.test-d.js.map +1 -1
- package/dist/web/generate-helpers.test.js +2 -2
- package/dist/web/generate-helpers.test.js.map +1 -1
- package/dist/web/hooks/index.d.ts +8 -1
- package/dist/web/hooks/index.js +8 -1
- package/dist/web/hooks/index.js.map +1 -1
- package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
- package/dist/web/hooks/openai-extensions.test.js +107 -0
- package/dist/web/hooks/openai-extensions.test.js.map +1 -0
- package/dist/web/hooks/test/utils.d.ts +7 -2
- package/dist/web/hooks/test/utils.js +14 -3
- package/dist/web/hooks/test/utils.js.map +1 -1
- package/dist/web/hooks/use-call-tool.d.ts +47 -2
- package/dist/web/hooks/use-call-tool.js +43 -10
- package/dist/web/hooks/use-call-tool.js.map +1 -1
- package/dist/web/hooks/use-call-tool.test.js +75 -25
- package/dist/web/hooks/use-call-tool.test.js.map +1 -1
- package/dist/web/hooks/use-deep-link.d.ts +22 -0
- package/dist/web/hooks/use-deep-link.js +34 -0
- package/dist/web/hooks/use-deep-link.js.map +1 -0
- package/dist/web/hooks/use-display-mode.d.ts +20 -0
- package/dist/web/hooks/use-display-mode.js +20 -0
- package/dist/web/hooks/use-display-mode.js.map +1 -1
- package/dist/web/hooks/use-display-mode.test.js +57 -21
- package/dist/web/hooks/use-display-mode.test.js.map +1 -1
- package/dist/web/hooks/use-download.d.ts +3 -0
- package/dist/web/hooks/use-download.js +7 -0
- package/dist/web/hooks/use-download.js.map +1 -0
- package/dist/web/hooks/use-download.test.d.ts +1 -0
- package/dist/web/hooks/use-download.test.js +103 -0
- package/dist/web/hooks/use-download.test.js.map +1 -0
- package/dist/web/hooks/use-file-resource.d.ts +37 -0
- package/dist/web/hooks/use-file-resource.js +98 -0
- package/dist/web/hooks/use-file-resource.js.map +1 -0
- package/dist/web/hooks/use-file-resource.test.d.ts +1 -0
- package/dist/web/hooks/use-file-resource.test.js +65 -0
- package/dist/web/hooks/use-file-resource.test.js.map +1 -0
- package/dist/web/hooks/use-files.d.ts +32 -0
- package/dist/web/hooks/use-files.js +32 -0
- package/dist/web/hooks/use-files.js.map +1 -1
- package/dist/web/hooks/use-files.test.js +11 -3
- package/dist/web/hooks/use-files.test.js.map +1 -1
- package/dist/web/hooks/use-host.d.ts +44 -0
- package/dist/web/hooks/use-host.js +45 -0
- package/dist/web/hooks/use-host.js.map +1 -0
- package/dist/web/hooks/use-host.test.d.ts +1 -0
- package/dist/web/hooks/use-host.test.js +59 -0
- package/dist/web/hooks/use-host.test.js.map +1 -0
- package/dist/web/hooks/use-model-context.d.ts +44 -0
- package/dist/web/hooks/use-model-context.js +63 -0
- package/dist/web/hooks/use-model-context.js.map +1 -0
- package/dist/web/hooks/use-open-external.d.ts +17 -0
- package/dist/web/hooks/use-open-external.js +16 -0
- package/dist/web/hooks/use-open-external.js.map +1 -1
- package/dist/web/hooks/use-open-external.test.js +15 -5
- package/dist/web/hooks/use-open-external.test.js.map +1 -1
- package/dist/web/hooks/use-open-file.d.ts +20 -0
- package/dist/web/hooks/use-open-file.js +25 -0
- package/dist/web/hooks/use-open-file.js.map +1 -0
- package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
- package/dist/web/hooks/use-register-view-tool.js +50 -0
- package/dist/web/hooks/use-register-view-tool.js.map +1 -0
- package/dist/web/hooks/use-request-close.d.ts +14 -0
- package/dist/web/hooks/use-request-close.js +13 -0
- package/dist/web/hooks/use-request-close.js.map +1 -1
- package/dist/web/hooks/use-request-close.test.js +35 -40
- package/dist/web/hooks/use-request-close.test.js.map +1 -1
- package/dist/web/hooks/use-request-modal.d.ts +16 -1
- package/dist/web/hooks/use-request-modal.js +16 -1
- package/dist/web/hooks/use-request-modal.js.map +1 -1
- package/dist/web/hooks/use-request-modal.test.js +11 -1
- package/dist/web/hooks/use-request-modal.test.js.map +1 -1
- package/dist/web/hooks/use-request-size.d.ts +17 -0
- package/dist/web/hooks/use-request-size.js +16 -0
- package/dist/web/hooks/use-request-size.js.map +1 -1
- package/dist/web/hooks/use-request-size.test.js +35 -53
- package/dist/web/hooks/use-request-size.test.js.map +1 -1
- package/dist/web/hooks/use-send-follow-up-message.d.ts +25 -2
- package/dist/web/hooks/use-send-follow-up-message.js +23 -0
- package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
- package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
- package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
- package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
- package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
- package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
- package/dist/web/hooks/use-tool-info.d.ts +46 -14
- package/dist/web/hooks/use-tool-info.js +29 -7
- package/dist/web/hooks/use-tool-info.js.map +1 -1
- package/dist/web/hooks/use-tool-info.test-d.js +11 -34
- package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
- package/dist/web/hooks/use-tool-info.test.js +42 -37
- package/dist/web/hooks/use-tool-info.test.js.map +1 -1
- package/dist/web/hooks/use-user.d.ts +5 -2
- package/dist/web/hooks/use-user.js +6 -3
- package/dist/web/hooks/use-user.js.map +1 -1
- package/dist/web/hooks/use-user.test.js +85 -37
- package/dist/web/hooks/use-user.test.js.map +1 -1
- package/dist/web/hooks/use-view-state.d.ts +21 -0
- package/dist/web/hooks/use-view-state.js +19 -9
- package/dist/web/hooks/use-view-state.js.map +1 -1
- package/dist/web/hooks/use-view-state.test.js +39 -4
- package/dist/web/hooks/use-view-state.test.js.map +1 -1
- package/dist/web/hooks/use-viewport.d.ts +20 -0
- package/dist/web/hooks/use-viewport.js +21 -0
- package/dist/web/hooks/use-viewport.js.map +1 -0
- package/dist/web/hooks/use-viewport.test.d.ts +1 -0
- package/dist/web/hooks/use-viewport.test.js +109 -0
- package/dist/web/hooks/use-viewport.test.js.map +1 -0
- package/dist/web/mount-view.d.ts +20 -0
- package/dist/web/mount-view.js +22 -6
- package/dist/web/mount-view.js.map +1 -1
- package/dist/web/types.d.ts +4 -0
- package/dist/web/types.js.map +1 -1
- package/package.json +35 -23
- package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -26
- package/dist/web/bridges/apps-sdk/adaptor.js +0 -102
- package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
- package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -50
- package/dist/web/bridges/mcp-app/adaptor.js +0 -271
- package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
- package/dist/web/hooks/use-layout.d.ts +0 -22
- package/dist/web/hooks/use-layout.js +0 -23
- package/dist/web/hooks/use-layout.js.map +0 -1
- package/dist/web/hooks/use-layout.test.js +0 -96
- package/dist/web/hooks/use-layout.test.js.map +0 -1
- package/dist/web/plugin/data-llm.test.js +0 -81
- package/dist/web/plugin/data-llm.test.js.map +0 -1
- package/dist/web/plugin/plugin.d.ts +0 -5
- package/dist/web/plugin/plugin.js +0 -163
- package/dist/web/plugin/plugin.js.map +0 -1
- package/dist/web/plugin/scan-views.js.map +0 -1
- package/dist/web/plugin/scan-views.test.js.map +0 -1
- package/dist/web/plugin/transform-data-llm.d.ts +0 -12
- package/dist/web/plugin/transform-data-llm.js +0 -96
- package/dist/web/plugin/transform-data-llm.js.map +0 -1
- package/dist/web/plugin/transform-data-llm.test.js +0 -81
- package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
- package/dist/web/plugin/validate-view.d.ts +0 -1
- package/dist/web/plugin/validate-view.js.map +0 -1
- package/dist/web/plugin/validate-view.test.js.map +0 -1
- /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
- /package/dist/{web/plugin/data-llm.test.d.ts → cli/build-steps.test.d.ts} +0 -0
- /package/dist/{web/plugin/scan-views.test.d.ts → context-warnings.test.d.ts} +0 -0
- /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/app.test.d.ts} +0 -0
- /package/dist/{web/plugin/validate-view.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
- /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
- /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
- /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import http from "node:http";
|
|
2
|
+
import { Client, StreamableHTTPClientTransport, } from "@modelcontextprotocol/client";
|
|
2
3
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
3
|
-
import {
|
|
4
|
+
import { Skybridge } from "./app.js";
|
|
4
5
|
vi.mock("@skybridge/devtools", () => ({
|
|
5
6
|
devtoolsStaticServer: () => ((_req, _res, next) => next()),
|
|
6
7
|
}));
|
|
@@ -25,36 +26,49 @@ async function postMcp(port) {
|
|
|
25
26
|
async function postApi(port) {
|
|
26
27
|
return fetch(`http://localhost:${port}/api/test`, { method: "POST" });
|
|
27
28
|
}
|
|
28
|
-
describe("
|
|
29
|
+
describe("Skybridge.express", () => {
|
|
29
30
|
it("exposes a ready Express app immediately after construction", () => {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const app = new Skybridge({
|
|
32
|
+
name: "t",
|
|
33
|
+
version: "0.0.0",
|
|
34
|
+
handler: (server) => server,
|
|
35
|
+
});
|
|
36
|
+
expect(app.express).toBeDefined();
|
|
37
|
+
expect(typeof app.express.use).toBe("function");
|
|
38
|
+
expect(typeof app.express.get).toBe("function");
|
|
34
39
|
});
|
|
35
|
-
it("
|
|
40
|
+
it("app.express.get registers a route reachable alongside /mcp", async () => {
|
|
36
41
|
const { createApp } = await import("./express.js");
|
|
37
|
-
const
|
|
38
|
-
|
|
42
|
+
const app = new Skybridge({
|
|
43
|
+
name: "t",
|
|
44
|
+
version: "0.0.0",
|
|
45
|
+
handler: (server) => server,
|
|
46
|
+
});
|
|
47
|
+
app.express.get("/health", (_req, res) => {
|
|
39
48
|
res.json({ status: "ok" });
|
|
40
49
|
});
|
|
41
50
|
const httpServer = http.createServer();
|
|
42
|
-
await createApp({
|
|
43
|
-
const { port, server: listening } = await listen(
|
|
51
|
+
await createApp({ app, httpServer });
|
|
52
|
+
const { port, server: listening } = await listen(app.express);
|
|
44
53
|
openServer = listening;
|
|
45
54
|
const health = await fetch(`http://localhost:${port}/health`);
|
|
46
55
|
expect(health.status).toBe(200);
|
|
56
|
+
expect(health.headers.get("x-powered-by")).toBe("skybridge");
|
|
47
57
|
expect(await health.json()).toEqual({ status: "ok" });
|
|
48
58
|
// /mcp still works (POST returns 200/4xx, not 404)
|
|
49
59
|
const mcp = await postMcp(port);
|
|
50
60
|
expect(mcp.status).not.toBe(404);
|
|
51
61
|
});
|
|
52
|
-
it("
|
|
62
|
+
it("app.use and app.express.use produce the same registration order", async () => {
|
|
53
63
|
const { createApp } = await import("./express.js");
|
|
54
64
|
const callsA = [];
|
|
55
65
|
const callsB = [];
|
|
56
|
-
const
|
|
57
|
-
|
|
66
|
+
const buildApp = () => new Skybridge({
|
|
67
|
+
name: "t",
|
|
68
|
+
version: "0.0.0",
|
|
69
|
+
handler: (server) => server,
|
|
70
|
+
});
|
|
71
|
+
const sA = buildApp();
|
|
58
72
|
sA.use((_req, _res, next) => {
|
|
59
73
|
callsA.push("first");
|
|
60
74
|
next();
|
|
@@ -63,7 +77,7 @@ describe("McpServer.express", () => {
|
|
|
63
77
|
callsA.push("second");
|
|
64
78
|
next();
|
|
65
79
|
});
|
|
66
|
-
const sB =
|
|
80
|
+
const sB = buildApp();
|
|
67
81
|
sB.express.use((_req, _res, next) => {
|
|
68
82
|
callsB.push("first");
|
|
69
83
|
next();
|
|
@@ -75,7 +89,7 @@ describe("McpServer.express", () => {
|
|
|
75
89
|
for (const s of [sA, sB]) {
|
|
76
90
|
s.express.get("/probe", (_req, res) => res.json({ ok: true }));
|
|
77
91
|
const httpServer = http.createServer();
|
|
78
|
-
await createApp({
|
|
92
|
+
await createApp({ app: s, httpServer });
|
|
79
93
|
const { port, server: listening } = await listen(s.express);
|
|
80
94
|
openServer = listening;
|
|
81
95
|
await fetch(`http://localhost:${port}/probe`);
|
|
@@ -86,26 +100,32 @@ describe("McpServer.express", () => {
|
|
|
86
100
|
});
|
|
87
101
|
it("useOnError still wraps thrown /mcp errors after the route is mounted", async () => {
|
|
88
102
|
const { createApp } = await import("./express.js");
|
|
89
|
-
const
|
|
103
|
+
const app = new Skybridge({
|
|
104
|
+
name: "t",
|
|
105
|
+
version: "0.0.0",
|
|
106
|
+
handler: (server) => server,
|
|
107
|
+
});
|
|
90
108
|
// Register the error handler BEFORE createApp — useOnError should still
|
|
91
109
|
// apply it after /mcp, so /mcp errors hit it.
|
|
92
110
|
const seen = [];
|
|
93
|
-
|
|
111
|
+
app.useOnError((_err, _req, res, _next) => {
|
|
94
112
|
seen.push("useOnError");
|
|
95
113
|
res.status(503).json({ from: "useOnError" });
|
|
96
114
|
});
|
|
97
115
|
// Force the /mcp handler to throw so the error pipeline runs.
|
|
98
|
-
|
|
116
|
+
app.use("/mcp", () => {
|
|
117
|
+
throw new Error("boom");
|
|
118
|
+
});
|
|
99
119
|
const httpServer = http.createServer();
|
|
100
120
|
await createApp({
|
|
101
|
-
|
|
121
|
+
app,
|
|
102
122
|
httpServer,
|
|
103
|
-
// Mirror what run() does: forward the
|
|
123
|
+
// Mirror what run() does: forward the app's useOnError handlers
|
|
104
124
|
// to createApp so they get applied after /mcp.
|
|
105
125
|
// biome-ignore lint/complexity/useLiteralKeys: test mirrors run() internals to verify useOnError ordering
|
|
106
|
-
errorMiddleware:
|
|
126
|
+
errorMiddleware: app["errorMiddleware"],
|
|
107
127
|
});
|
|
108
|
-
const { port, server: listening } = await listen(
|
|
128
|
+
const { port, server: listening } = await listen(app.express);
|
|
109
129
|
openServer = listening;
|
|
110
130
|
const res = await postMcp(port);
|
|
111
131
|
expect(seen).toEqual(["useOnError"]);
|
|
@@ -113,6 +133,46 @@ describe("McpServer.express", () => {
|
|
|
113
133
|
expect(await res.json()).toEqual({ from: "useOnError" });
|
|
114
134
|
});
|
|
115
135
|
});
|
|
136
|
+
describe("Skybridge JSON body parser options", () => {
|
|
137
|
+
const largeBody = JSON.stringify({ data: "x".repeat(200 * 1024) });
|
|
138
|
+
async function postEcho(port, body) {
|
|
139
|
+
return fetch(`http://localhost:${port}/echo`, {
|
|
140
|
+
method: "POST",
|
|
141
|
+
headers: { "Content-Type": "application/json" },
|
|
142
|
+
body,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
it("forwards json options to express.json", async () => {
|
|
146
|
+
const app = new Skybridge({
|
|
147
|
+
name: "t",
|
|
148
|
+
version: "0.0.0",
|
|
149
|
+
json: { limit: "10mb" },
|
|
150
|
+
handler: (server) => server,
|
|
151
|
+
});
|
|
152
|
+
app.express.post("/echo", (req, res) => {
|
|
153
|
+
res.json({ received: req.body.data.length });
|
|
154
|
+
});
|
|
155
|
+
const { port, server: listening } = await listen(app.express);
|
|
156
|
+
openServer = listening;
|
|
157
|
+
const res = await postEcho(port, largeBody);
|
|
158
|
+
expect(res.status).toBe(200);
|
|
159
|
+
expect(await res.json()).toEqual({ received: 200 * 1024 });
|
|
160
|
+
});
|
|
161
|
+
it("keeps the default 100kb limit when no options are passed", async () => {
|
|
162
|
+
const app = new Skybridge({
|
|
163
|
+
name: "t",
|
|
164
|
+
version: "0.0.0",
|
|
165
|
+
handler: (server) => server,
|
|
166
|
+
});
|
|
167
|
+
app.express.post("/echo", (_req, res) => {
|
|
168
|
+
res.json({ ok: true });
|
|
169
|
+
});
|
|
170
|
+
const { port, server: listening } = await listen(app.express);
|
|
171
|
+
openServer = listening;
|
|
172
|
+
const res = await postEcho(port, largeBody);
|
|
173
|
+
expect(res.status).toBe(413);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
116
176
|
describe("createApp", () => {
|
|
117
177
|
it("runs global custom middleware before the /mcp handler", async () => {
|
|
118
178
|
const { createApp } = await import("./express.js");
|
|
@@ -121,11 +181,15 @@ describe("createApp", () => {
|
|
|
121
181
|
calls.push("custom");
|
|
122
182
|
next();
|
|
123
183
|
};
|
|
124
|
-
const
|
|
125
|
-
|
|
184
|
+
const app = new Skybridge({
|
|
185
|
+
name: "t",
|
|
186
|
+
version: "0.0.0",
|
|
187
|
+
handler: (server) => server,
|
|
188
|
+
});
|
|
189
|
+
app.use(mw);
|
|
126
190
|
const httpServer = http.createServer();
|
|
127
|
-
const
|
|
128
|
-
const { port, server: httpListening } = await listen(
|
|
191
|
+
const expressApp = await createApp({ app, httpServer });
|
|
192
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
129
193
|
openServer = httpListening;
|
|
130
194
|
await postMcp(port);
|
|
131
195
|
expect(calls).toEqual(["custom"]);
|
|
@@ -137,11 +201,15 @@ describe("createApp", () => {
|
|
|
137
201
|
calls.push("auth");
|
|
138
202
|
next();
|
|
139
203
|
};
|
|
140
|
-
const
|
|
141
|
-
|
|
204
|
+
const app = new Skybridge({
|
|
205
|
+
name: "t",
|
|
206
|
+
version: "0.0.0",
|
|
207
|
+
handler: (server) => server,
|
|
208
|
+
});
|
|
209
|
+
app.use("/mcp", mw);
|
|
142
210
|
const httpServer = http.createServer();
|
|
143
|
-
const
|
|
144
|
-
const { port, server: httpListening } = await listen(
|
|
211
|
+
const expressApp = await createApp({ app, httpServer });
|
|
212
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
145
213
|
openServer = httpListening;
|
|
146
214
|
await postMcp(port);
|
|
147
215
|
expect(calls).toEqual(["auth"]);
|
|
@@ -153,11 +221,15 @@ describe("createApp", () => {
|
|
|
153
221
|
calls.push("reject");
|
|
154
222
|
res.status(401).json({ error: "Unauthorized" });
|
|
155
223
|
};
|
|
156
|
-
const
|
|
157
|
-
|
|
224
|
+
const app = new Skybridge({
|
|
225
|
+
name: "t",
|
|
226
|
+
version: "0.0.0",
|
|
227
|
+
handler: (server) => server,
|
|
228
|
+
});
|
|
229
|
+
app.use("/mcp", reject);
|
|
158
230
|
const httpServer = http.createServer();
|
|
159
|
-
const
|
|
160
|
-
const { port, server: httpListening } = await listen(
|
|
231
|
+
const expressApp = await createApp({ app, httpServer });
|
|
232
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
161
233
|
openServer = httpListening;
|
|
162
234
|
const res = await postMcp(port);
|
|
163
235
|
expect(calls).toEqual(["reject"]);
|
|
@@ -175,12 +247,16 @@ describe("createApp", () => {
|
|
|
175
247
|
calls.push("B");
|
|
176
248
|
next();
|
|
177
249
|
};
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
250
|
+
const app = new Skybridge({
|
|
251
|
+
name: "t",
|
|
252
|
+
version: "0.0.0",
|
|
253
|
+
handler: (server) => server,
|
|
254
|
+
});
|
|
255
|
+
app.use(mwA);
|
|
256
|
+
app.use(mwB);
|
|
181
257
|
const httpServer = http.createServer();
|
|
182
|
-
const
|
|
183
|
-
const { port, server: httpListening } = await listen(
|
|
258
|
+
const expressApp = await createApp({ app, httpServer });
|
|
259
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
184
260
|
openServer = httpListening;
|
|
185
261
|
await postMcp(port);
|
|
186
262
|
expect(calls).toEqual(["A", "B"]);
|
|
@@ -192,11 +268,15 @@ describe("createApp", () => {
|
|
|
192
268
|
calls.push("api");
|
|
193
269
|
next();
|
|
194
270
|
};
|
|
195
|
-
const
|
|
196
|
-
|
|
271
|
+
const app = new Skybridge({
|
|
272
|
+
name: "t",
|
|
273
|
+
version: "0.0.0",
|
|
274
|
+
handler: (server) => server,
|
|
275
|
+
});
|
|
276
|
+
app.use("/api", apiMw);
|
|
197
277
|
const httpServer = http.createServer();
|
|
198
|
-
const
|
|
199
|
-
const { port, server: httpListening } = await listen(
|
|
278
|
+
const expressApp = await createApp({ app, httpServer });
|
|
279
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
200
280
|
openServer = httpListening;
|
|
201
281
|
// Hit /mcp — the /api middleware should NOT fire
|
|
202
282
|
await postMcp(port);
|
|
@@ -209,11 +289,15 @@ describe("createApp", () => {
|
|
|
209
289
|
router.get("/health", (_req, res) => {
|
|
210
290
|
res.json({ status: "ok" });
|
|
211
291
|
});
|
|
212
|
-
const
|
|
213
|
-
|
|
292
|
+
const app = new Skybridge({
|
|
293
|
+
name: "t",
|
|
294
|
+
version: "0.0.0",
|
|
295
|
+
handler: (server) => server,
|
|
296
|
+
});
|
|
297
|
+
app.use(router);
|
|
214
298
|
const httpServer = http.createServer();
|
|
215
|
-
const
|
|
216
|
-
const { port, server: httpListening } = await listen(
|
|
299
|
+
const expressApp = await createApp({ app, httpServer });
|
|
300
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
217
301
|
openServer = httpListening;
|
|
218
302
|
const res = await fetch(`http://localhost:${port}/health`);
|
|
219
303
|
expect(res.status).toBe(200);
|
|
@@ -226,11 +310,15 @@ describe("createApp", () => {
|
|
|
226
310
|
router.get("/data", (_req, res) => {
|
|
227
311
|
res.json({ value: 42 });
|
|
228
312
|
});
|
|
229
|
-
const
|
|
230
|
-
|
|
313
|
+
const app = new Skybridge({
|
|
314
|
+
name: "t",
|
|
315
|
+
version: "0.0.0",
|
|
316
|
+
handler: (server) => server,
|
|
317
|
+
});
|
|
318
|
+
app.use("/api", router);
|
|
231
319
|
const httpServer = http.createServer();
|
|
232
|
-
const
|
|
233
|
-
const { port, server: httpListening } = await listen(
|
|
320
|
+
const expressApp = await createApp({ app, httpServer });
|
|
321
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
234
322
|
openServer = httpListening;
|
|
235
323
|
const res = await fetch(`http://localhost:${port}/api/data`);
|
|
236
324
|
expect(res.status).toBe(200);
|
|
@@ -241,11 +329,15 @@ describe("createApp", () => {
|
|
|
241
329
|
const throwing = () => {
|
|
242
330
|
throw new Error("boom");
|
|
243
331
|
};
|
|
244
|
-
const
|
|
245
|
-
|
|
332
|
+
const app = new Skybridge({
|
|
333
|
+
name: "t",
|
|
334
|
+
version: "0.0.0",
|
|
335
|
+
handler: (server) => server,
|
|
336
|
+
});
|
|
337
|
+
app.use("/explode", throwing);
|
|
246
338
|
const httpServer = http.createServer();
|
|
247
|
-
const
|
|
248
|
-
const { port, server: httpListening } = await listen(
|
|
339
|
+
const expressApp = await createApp({ app, httpServer });
|
|
340
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
249
341
|
openServer = httpListening;
|
|
250
342
|
const res = await fetch(`http://localhost:${port}/explode`);
|
|
251
343
|
expect(res.status).toBe(500);
|
|
@@ -256,14 +348,19 @@ describe("createApp", () => {
|
|
|
256
348
|
it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
|
|
257
349
|
const { createApp } = await import("./express.js");
|
|
258
350
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
351
|
+
const app = new Skybridge({
|
|
352
|
+
name: "t",
|
|
353
|
+
version: "0.0.0",
|
|
354
|
+
handler: (server) => server,
|
|
355
|
+
});
|
|
356
|
+
// Force the express-level error path: make a /mcp middleware throw so the
|
|
357
|
+
// error pipeline runs and lands in the default /mcp error handler.
|
|
358
|
+
app.use("/mcp", () => {
|
|
359
|
+
throw new Error("boom");
|
|
360
|
+
});
|
|
264
361
|
const httpServer = http.createServer();
|
|
265
|
-
const
|
|
266
|
-
const { port, server: httpListening } = await listen(
|
|
362
|
+
const expressApp = await createApp({ app, httpServer });
|
|
363
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
267
364
|
openServer = httpListening;
|
|
268
365
|
const res = await postMcp(port);
|
|
269
366
|
expect(res.status).toBe(500);
|
|
@@ -282,15 +379,21 @@ describe("createApp", () => {
|
|
|
282
379
|
calls.push("error-handler");
|
|
283
380
|
res.status(503).json({ custom: true });
|
|
284
381
|
};
|
|
285
|
-
const
|
|
286
|
-
|
|
382
|
+
const app = new Skybridge({
|
|
383
|
+
name: "t",
|
|
384
|
+
version: "0.0.0",
|
|
385
|
+
handler: (server) => server,
|
|
386
|
+
});
|
|
387
|
+
app.use("/mcp", () => {
|
|
388
|
+
throw new Error("boom");
|
|
389
|
+
});
|
|
287
390
|
const httpServer = http.createServer();
|
|
288
|
-
const
|
|
289
|
-
|
|
391
|
+
const expressApp = await createApp({
|
|
392
|
+
app,
|
|
290
393
|
httpServer,
|
|
291
394
|
errorMiddleware: [{ handlers: [errorHandler] }],
|
|
292
395
|
});
|
|
293
|
-
const { port, server: httpListening } = await listen(
|
|
396
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
294
397
|
openServer = httpListening;
|
|
295
398
|
const res = await postMcp(port);
|
|
296
399
|
expect(calls).toEqual(["error-handler"]);
|
|
@@ -307,16 +410,22 @@ describe("createApp", () => {
|
|
|
307
410
|
const throwingApiRoute = (_req, _res, next) => {
|
|
308
411
|
next(new Error("api error"));
|
|
309
412
|
};
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
|
|
413
|
+
const app = new Skybridge({
|
|
414
|
+
name: "t",
|
|
415
|
+
version: "0.0.0",
|
|
416
|
+
handler: (server) => server,
|
|
417
|
+
});
|
|
418
|
+
app.use("/mcp", () => {
|
|
419
|
+
throw new Error("boom");
|
|
420
|
+
});
|
|
421
|
+
app.use("/api/test", throwingApiRoute);
|
|
313
422
|
const httpServer = http.createServer();
|
|
314
|
-
const
|
|
315
|
-
|
|
423
|
+
const expressApp = await createApp({
|
|
424
|
+
app,
|
|
316
425
|
httpServer,
|
|
317
426
|
errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
|
|
318
427
|
});
|
|
319
|
-
const { port, server: httpListening } = await listen(
|
|
428
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
320
429
|
openServer = httpListening;
|
|
321
430
|
const mcpRes = await postMcp(port);
|
|
322
431
|
expect(calls).toEqual(["mcp-error-handler"]);
|
|
@@ -330,20 +439,20 @@ describe("createApp", () => {
|
|
|
330
439
|
});
|
|
331
440
|
it("handles concurrent /mcp requests without 'Already connected to a transport'", async () => {
|
|
332
441
|
const { createApp } = await import("./express.js");
|
|
333
|
-
const mcpServer = new McpServer({
|
|
334
|
-
name: "concurrent-test",
|
|
335
|
-
version: "0.0.0",
|
|
336
|
-
});
|
|
337
442
|
// Slow tool: keeps the underlying transport bound long enough to overlap
|
|
338
443
|
// with concurrent requests, exposing the shared-McpServer race.
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
444
|
+
const app = new Skybridge({
|
|
445
|
+
name: "concurrent-test",
|
|
446
|
+
version: "0.0.0",
|
|
447
|
+
handler: (server) => server.registerTool({ name: "slow", description: "slow" }, async () => {
|
|
448
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
449
|
+
return { content: [{ type: "text", text: "done" }] };
|
|
450
|
+
}),
|
|
342
451
|
});
|
|
343
452
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
344
453
|
const httpServer = http.createServer();
|
|
345
|
-
const
|
|
346
|
-
const { port, server } = await listen(
|
|
454
|
+
const expressApp = await createApp({ app, httpServer });
|
|
455
|
+
const { port, server } = await listen(expressApp);
|
|
347
456
|
openServer = server;
|
|
348
457
|
const callBody = (id) => JSON.stringify({
|
|
349
458
|
jsonrpc: "2.0",
|
|
@@ -365,6 +474,40 @@ describe("createApp", () => {
|
|
|
365
474
|
consoleSpy.mockRestore();
|
|
366
475
|
});
|
|
367
476
|
});
|
|
477
|
+
describe("createApp Vercel mode", () => {
|
|
478
|
+
it("app.run() returns the Express app without binding a port when VERCEL=1", async () => {
|
|
479
|
+
const prevVercel = process.env.VERCEL;
|
|
480
|
+
const prevEnv = process.env.NODE_ENV;
|
|
481
|
+
process.env.VERCEL = "1";
|
|
482
|
+
process.env.NODE_ENV = "production";
|
|
483
|
+
try {
|
|
484
|
+
vi.resetModules();
|
|
485
|
+
const { Skybridge: Reloaded } = await import("./app.js");
|
|
486
|
+
const app = new Reloaded({
|
|
487
|
+
name: "t",
|
|
488
|
+
version: "0.0.0",
|
|
489
|
+
handler: (server) => server,
|
|
490
|
+
});
|
|
491
|
+
const result = await app.run();
|
|
492
|
+
expect(typeof result).toBe("function");
|
|
493
|
+
expect(result).toBe(app.express);
|
|
494
|
+
const { port, server: listening } = await listen(app.express);
|
|
495
|
+
openServer = listening;
|
|
496
|
+
const res = await postMcp(port);
|
|
497
|
+
expect(res.status).not.toBe(404);
|
|
498
|
+
}
|
|
499
|
+
finally {
|
|
500
|
+
if (prevVercel === undefined) {
|
|
501
|
+
delete process.env.VERCEL;
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
process.env.VERCEL = prevVercel;
|
|
505
|
+
}
|
|
506
|
+
process.env.NODE_ENV = prevEnv;
|
|
507
|
+
vi.resetModules();
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
});
|
|
368
511
|
describe("createApp tunnel routes", () => {
|
|
369
512
|
it("proxies POST /__skybridge/tunnel to the cli control server in dev mode", async () => {
|
|
370
513
|
// Stand up a fake control listener that returns a known JSON body.
|
|
@@ -383,10 +526,14 @@ describe("createApp tunnel routes", () => {
|
|
|
383
526
|
process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
|
|
384
527
|
try {
|
|
385
528
|
const { createApp } = await import("./express.js");
|
|
386
|
-
const
|
|
529
|
+
const app = new Skybridge({
|
|
530
|
+
name: "t",
|
|
531
|
+
version: "0.0.0",
|
|
532
|
+
handler: (server) => server,
|
|
533
|
+
});
|
|
387
534
|
const httpServer = http.createServer();
|
|
388
|
-
const
|
|
389
|
-
const { port, server } = await listen(
|
|
535
|
+
const expressApp = await createApp({ app, httpServer });
|
|
536
|
+
const { port, server } = await listen(expressApp);
|
|
390
537
|
openServer = server;
|
|
391
538
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
392
539
|
method: "POST",
|
|
@@ -410,11 +557,15 @@ describe("createApp tunnel routes", () => {
|
|
|
410
557
|
try {
|
|
411
558
|
vi.resetModules();
|
|
412
559
|
const { createApp } = await import("./express.js");
|
|
413
|
-
const {
|
|
414
|
-
const
|
|
560
|
+
const { Skybridge: ReloadedSkybridge } = await import("./app.js");
|
|
561
|
+
const app = new ReloadedSkybridge({
|
|
562
|
+
name: "t",
|
|
563
|
+
version: "0.0.0",
|
|
564
|
+
handler: (server) => server,
|
|
565
|
+
});
|
|
415
566
|
const httpServer = http.createServer();
|
|
416
|
-
const
|
|
417
|
-
const { port, server } = await listen(
|
|
567
|
+
const expressApp = await createApp({ app, httpServer });
|
|
568
|
+
const { port, server } = await listen(expressApp);
|
|
418
569
|
openServer = server;
|
|
419
570
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
420
571
|
method: "POST",
|
|
@@ -427,4 +578,32 @@ describe("createApp tunnel routes", () => {
|
|
|
427
578
|
}
|
|
428
579
|
});
|
|
429
580
|
});
|
|
581
|
+
describe("createApp mount path", () => {
|
|
582
|
+
it("serves /mcp with the mount path intact on the request URL", async () => {
|
|
583
|
+
const { createApp } = await import("./express.js");
|
|
584
|
+
const app = new Skybridge({
|
|
585
|
+
name: "t",
|
|
586
|
+
version: "0.0.0",
|
|
587
|
+
handler: (server) => server.registerTool({
|
|
588
|
+
name: "echo-url",
|
|
589
|
+
description: "Echoes the request URL.",
|
|
590
|
+
inputSchema: {},
|
|
591
|
+
}, (_args, extra) => ({
|
|
592
|
+
content: [{ type: "text", text: extra.http?.req?.url ?? "" }],
|
|
593
|
+
})),
|
|
594
|
+
});
|
|
595
|
+
const httpServer = http.createServer();
|
|
596
|
+
const expressApp = await createApp({ app, httpServer });
|
|
597
|
+
const { port, server } = await listen(expressApp);
|
|
598
|
+
openServer = server;
|
|
599
|
+
const client = new Client({ name: "test-client", version: "0.0.0" });
|
|
600
|
+
await client.connect(new StreamableHTTPClientTransport(new URL(`http://localhost:${port}/mcp`)));
|
|
601
|
+
const result = (await client.callTool({
|
|
602
|
+
name: "echo-url",
|
|
603
|
+
arguments: {},
|
|
604
|
+
}));
|
|
605
|
+
await client.close();
|
|
606
|
+
expect(new URL(result.content[0]?.text ?? "").pathname).toBe("/mcp");
|
|
607
|
+
});
|
|
608
|
+
});
|
|
430
609
|
//# sourceMappingURL=express.test.js.map
|