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