skybridge 0.0.0-dev.ddf8a13 → 0.0.0-dev.ddfb4e5
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/header.js.map +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-command.js.map +1 -1
- package/dist/cli/run-plain.d.ts +18 -0
- package/dist/cli/run-plain.js +89 -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/tunnel-control-server.js.map +1 -1
- package/dist/cli/tunnel-control-server.test.js.map +1 -1
- package/dist/cli/tunnel-handler.js.map +1 -1
- package/dist/cli/tunnel-handler.test.js.map +1 -1
- package/dist/cli/tunnel.js +2 -2
- package/dist/cli/tunnel.js.map +1 -1
- package/dist/cli/tunnel.test.js.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/cli/use-execute-steps.d.ts +1 -1
- package/dist/cli/use-execute-steps.js.map +1 -1
- package/dist/cli/use-messages.js.map +1 -1
- package/dist/cli/use-nodemon.d.ts +14 -0
- package/dist/cli/use-nodemon.js +82 -54
- package/dist/cli/use-nodemon.js.map +1 -1
- package/dist/cli/use-open-browser.d.ts +1 -0
- package/dist/cli/use-open-browser.js +44 -0
- package/dist/cli/use-open-browser.js.map +1 -0
- package/dist/cli/use-tunnel.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 -38
- 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 +2 -0
- package/dist/commands/dev.js +55 -0
- 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/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/telemetry/status.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/content-helpers.test.js.map +1 -1
- package/dist/server/express.d.ts +23 -7
- package/dist/server/express.js +42 -30
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.test.js +345 -85
- 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/inferUtilityTypes.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/metric.js.map +1 -1
- 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 +300 -53
- package/dist/server/server.js +407 -297
- 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 -5
- package/dist/server/templateHelper.js +3 -22
- package/dist/server/templateHelper.js.map +1 -1
- package/dist/server/templates.generated.d.ts +4 -0
- package/dist/server/templates.generated.js +43 -0
- package/dist/server/templates.generated.js.map +1 -0
- 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/tunnel-proxy-router.js.map +1 -1
- package/dist/server/tunnel-proxy-router.test.js.map +1 -1
- 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/version.js +1 -3
- package/dist/version.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 +8 -1
- 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/index.js.map +1 -1
- 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 +115 -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 +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/helpers/state.js.map +1 -1
- package/dist/web/helpers/state.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-d.js.map +1 -1
- package/dist/web/hooks/use-call-tool.test.js +64 -29
- 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-d.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 +19 -1
- package/dist/web/hooks/use-send-follow-up-message.js +19 -2
- 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/index.js.map +1 -1
- 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/proxy.js.map +1 -1
- package/dist/web/types.d.ts +4 -0
- package/dist/web/types.js.map +1 -1
- package/package.json +40 -26
- package/dist/server/templates/development.hbs +0 -12
- package/dist/server/templates/production.hbs +0 -6
- package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -24
- package/dist/web/bridges/apps-sdk/adaptor.js +0 -93
- 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 -268
- 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,13 +1,13 @@
|
|
|
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
|
}));
|
|
7
8
|
vi.mock("./viewsDevServer.js", () => ({
|
|
8
9
|
viewsDevServer: (_httpServer) => ((_req, _res, next) => next()),
|
|
9
10
|
}));
|
|
10
|
-
const fakeServer = {};
|
|
11
11
|
async function listen(app) {
|
|
12
12
|
const server = http.createServer(app);
|
|
13
13
|
await new Promise((resolve) => server.listen(0, resolve));
|
|
@@ -26,6 +26,152 @@ async function postMcp(port) {
|
|
|
26
26
|
async function postApi(port) {
|
|
27
27
|
return fetch(`http://localhost:${port}/api/test`, { method: "POST" });
|
|
28
28
|
}
|
|
29
|
+
describe("Skybridge.express", () => {
|
|
30
|
+
it("exposes a ready Express app immediately after construction", () => {
|
|
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");
|
|
39
|
+
});
|
|
40
|
+
it("app.express.get registers a route reachable alongside /mcp", async () => {
|
|
41
|
+
const { createApp } = await import("./express.js");
|
|
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) => {
|
|
48
|
+
res.json({ status: "ok" });
|
|
49
|
+
});
|
|
50
|
+
const httpServer = http.createServer();
|
|
51
|
+
await createApp({ app, httpServer });
|
|
52
|
+
const { port, server: listening } = await listen(app.express);
|
|
53
|
+
openServer = listening;
|
|
54
|
+
const health = await fetch(`http://localhost:${port}/health`);
|
|
55
|
+
expect(health.status).toBe(200);
|
|
56
|
+
expect(await health.json()).toEqual({ status: "ok" });
|
|
57
|
+
// /mcp still works (POST returns 200/4xx, not 404)
|
|
58
|
+
const mcp = await postMcp(port);
|
|
59
|
+
expect(mcp.status).not.toBe(404);
|
|
60
|
+
});
|
|
61
|
+
it("app.use and app.express.use produce the same registration order", async () => {
|
|
62
|
+
const { createApp } = await import("./express.js");
|
|
63
|
+
const callsA = [];
|
|
64
|
+
const callsB = [];
|
|
65
|
+
const buildApp = () => new Skybridge({
|
|
66
|
+
name: "t",
|
|
67
|
+
version: "0.0.0",
|
|
68
|
+
handler: (server) => server,
|
|
69
|
+
});
|
|
70
|
+
const sA = buildApp();
|
|
71
|
+
sA.use((_req, _res, next) => {
|
|
72
|
+
callsA.push("first");
|
|
73
|
+
next();
|
|
74
|
+
});
|
|
75
|
+
sA.express.use((_req, _res, next) => {
|
|
76
|
+
callsA.push("second");
|
|
77
|
+
next();
|
|
78
|
+
});
|
|
79
|
+
const sB = buildApp();
|
|
80
|
+
sB.express.use((_req, _res, next) => {
|
|
81
|
+
callsB.push("first");
|
|
82
|
+
next();
|
|
83
|
+
});
|
|
84
|
+
sB.use((_req, _res, next) => {
|
|
85
|
+
callsB.push("second");
|
|
86
|
+
next();
|
|
87
|
+
});
|
|
88
|
+
for (const s of [sA, sB]) {
|
|
89
|
+
s.express.get("/probe", (_req, res) => res.json({ ok: true }));
|
|
90
|
+
const httpServer = http.createServer();
|
|
91
|
+
await createApp({ app: s, httpServer });
|
|
92
|
+
const { port, server: listening } = await listen(s.express);
|
|
93
|
+
openServer = listening;
|
|
94
|
+
await fetch(`http://localhost:${port}/probe`);
|
|
95
|
+
listening.close();
|
|
96
|
+
}
|
|
97
|
+
expect(callsA).toEqual(["first", "second"]);
|
|
98
|
+
expect(callsB).toEqual(["first", "second"]);
|
|
99
|
+
});
|
|
100
|
+
it("useOnError still wraps thrown /mcp errors after the route is mounted", async () => {
|
|
101
|
+
const { createApp } = await import("./express.js");
|
|
102
|
+
const app = new Skybridge({
|
|
103
|
+
name: "t",
|
|
104
|
+
version: "0.0.0",
|
|
105
|
+
handler: (server) => server,
|
|
106
|
+
});
|
|
107
|
+
// Register the error handler BEFORE createApp — useOnError should still
|
|
108
|
+
// apply it after /mcp, so /mcp errors hit it.
|
|
109
|
+
const seen = [];
|
|
110
|
+
app.useOnError((_err, _req, res, _next) => {
|
|
111
|
+
seen.push("useOnError");
|
|
112
|
+
res.status(503).json({ from: "useOnError" });
|
|
113
|
+
});
|
|
114
|
+
// Force the /mcp handler to throw so the error pipeline runs.
|
|
115
|
+
app.use("/mcp", () => {
|
|
116
|
+
throw new Error("boom");
|
|
117
|
+
});
|
|
118
|
+
const httpServer = http.createServer();
|
|
119
|
+
await createApp({
|
|
120
|
+
app,
|
|
121
|
+
httpServer,
|
|
122
|
+
// Mirror what run() does: forward the app's useOnError handlers
|
|
123
|
+
// to createApp so they get applied after /mcp.
|
|
124
|
+
// biome-ignore lint/complexity/useLiteralKeys: test mirrors run() internals to verify useOnError ordering
|
|
125
|
+
errorMiddleware: app["errorMiddleware"],
|
|
126
|
+
});
|
|
127
|
+
const { port, server: listening } = await listen(app.express);
|
|
128
|
+
openServer = listening;
|
|
129
|
+
const res = await postMcp(port);
|
|
130
|
+
expect(seen).toEqual(["useOnError"]);
|
|
131
|
+
expect(res.status).toBe(503);
|
|
132
|
+
expect(await res.json()).toEqual({ from: "useOnError" });
|
|
133
|
+
});
|
|
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
|
+
});
|
|
29
175
|
describe("createApp", () => {
|
|
30
176
|
it("runs global custom middleware before the /mcp handler", async () => {
|
|
31
177
|
const { createApp } = await import("./express.js");
|
|
@@ -34,14 +180,16 @@ describe("createApp", () => {
|
|
|
34
180
|
calls.push("custom");
|
|
35
181
|
next();
|
|
36
182
|
};
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
customMiddleware: [{ handlers: [mw] }],
|
|
183
|
+
const app = new Skybridge({
|
|
184
|
+
name: "t",
|
|
185
|
+
version: "0.0.0",
|
|
186
|
+
handler: (server) => server,
|
|
42
187
|
});
|
|
43
|
-
|
|
44
|
-
|
|
188
|
+
app.use(mw);
|
|
189
|
+
const httpServer = http.createServer();
|
|
190
|
+
const expressApp = await createApp({ app, httpServer });
|
|
191
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
192
|
+
openServer = httpListening;
|
|
45
193
|
await postMcp(port);
|
|
46
194
|
expect(calls).toEqual(["custom"]);
|
|
47
195
|
});
|
|
@@ -52,14 +200,16 @@ describe("createApp", () => {
|
|
|
52
200
|
calls.push("auth");
|
|
53
201
|
next();
|
|
54
202
|
};
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
customMiddleware: [{ path: "/mcp", handlers: [mw] }],
|
|
203
|
+
const app = new Skybridge({
|
|
204
|
+
name: "t",
|
|
205
|
+
version: "0.0.0",
|
|
206
|
+
handler: (server) => server,
|
|
60
207
|
});
|
|
61
|
-
|
|
62
|
-
|
|
208
|
+
app.use("/mcp", mw);
|
|
209
|
+
const httpServer = http.createServer();
|
|
210
|
+
const expressApp = await createApp({ app, httpServer });
|
|
211
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
212
|
+
openServer = httpListening;
|
|
63
213
|
await postMcp(port);
|
|
64
214
|
expect(calls).toEqual(["auth"]);
|
|
65
215
|
});
|
|
@@ -70,14 +220,16 @@ describe("createApp", () => {
|
|
|
70
220
|
calls.push("reject");
|
|
71
221
|
res.status(401).json({ error: "Unauthorized" });
|
|
72
222
|
};
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
customMiddleware: [{ path: "/mcp", handlers: [reject] }],
|
|
223
|
+
const app = new Skybridge({
|
|
224
|
+
name: "t",
|
|
225
|
+
version: "0.0.0",
|
|
226
|
+
handler: (server) => server,
|
|
78
227
|
});
|
|
79
|
-
|
|
80
|
-
|
|
228
|
+
app.use("/mcp", reject);
|
|
229
|
+
const httpServer = http.createServer();
|
|
230
|
+
const expressApp = await createApp({ app, httpServer });
|
|
231
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
232
|
+
openServer = httpListening;
|
|
81
233
|
const res = await postMcp(port);
|
|
82
234
|
expect(calls).toEqual(["reject"]);
|
|
83
235
|
expect(res.status).toBe(401);
|
|
@@ -94,14 +246,17 @@ describe("createApp", () => {
|
|
|
94
246
|
calls.push("B");
|
|
95
247
|
next();
|
|
96
248
|
};
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
customMiddleware: [{ handlers: [mwA] }, { handlers: [mwB] }],
|
|
249
|
+
const app = new Skybridge({
|
|
250
|
+
name: "t",
|
|
251
|
+
version: "0.0.0",
|
|
252
|
+
handler: (server) => server,
|
|
102
253
|
});
|
|
103
|
-
|
|
104
|
-
|
|
254
|
+
app.use(mwA);
|
|
255
|
+
app.use(mwB);
|
|
256
|
+
const httpServer = http.createServer();
|
|
257
|
+
const expressApp = await createApp({ app, httpServer });
|
|
258
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
259
|
+
openServer = httpListening;
|
|
105
260
|
await postMcp(port);
|
|
106
261
|
expect(calls).toEqual(["A", "B"]);
|
|
107
262
|
});
|
|
@@ -112,14 +267,16 @@ describe("createApp", () => {
|
|
|
112
267
|
calls.push("api");
|
|
113
268
|
next();
|
|
114
269
|
};
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
customMiddleware: [{ path: "/api", handlers: [apiMw] }],
|
|
270
|
+
const app = new Skybridge({
|
|
271
|
+
name: "t",
|
|
272
|
+
version: "0.0.0",
|
|
273
|
+
handler: (server) => server,
|
|
120
274
|
});
|
|
121
|
-
|
|
122
|
-
|
|
275
|
+
app.use("/api", apiMw);
|
|
276
|
+
const httpServer = http.createServer();
|
|
277
|
+
const expressApp = await createApp({ app, httpServer });
|
|
278
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
279
|
+
openServer = httpListening;
|
|
123
280
|
// Hit /mcp — the /api middleware should NOT fire
|
|
124
281
|
await postMcp(port);
|
|
125
282
|
expect(calls).toEqual([]);
|
|
@@ -131,14 +288,16 @@ describe("createApp", () => {
|
|
|
131
288
|
router.get("/health", (_req, res) => {
|
|
132
289
|
res.json({ status: "ok" });
|
|
133
290
|
});
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
customMiddleware: [{ handlers: [router] }],
|
|
291
|
+
const app = new Skybridge({
|
|
292
|
+
name: "t",
|
|
293
|
+
version: "0.0.0",
|
|
294
|
+
handler: (server) => server,
|
|
139
295
|
});
|
|
140
|
-
|
|
141
|
-
|
|
296
|
+
app.use(router);
|
|
297
|
+
const httpServer = http.createServer();
|
|
298
|
+
const expressApp = await createApp({ app, httpServer });
|
|
299
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
300
|
+
openServer = httpListening;
|
|
142
301
|
const res = await fetch(`http://localhost:${port}/health`);
|
|
143
302
|
expect(res.status).toBe(200);
|
|
144
303
|
expect(await res.json()).toEqual({ status: "ok" });
|
|
@@ -150,16 +309,16 @@ describe("createApp", () => {
|
|
|
150
309
|
router.get("/data", (_req, res) => {
|
|
151
310
|
res.json({ value: 42 });
|
|
152
311
|
});
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
customMiddleware: [
|
|
158
|
-
{ path: "/api", handlers: [router] },
|
|
159
|
-
],
|
|
312
|
+
const app = new Skybridge({
|
|
313
|
+
name: "t",
|
|
314
|
+
version: "0.0.0",
|
|
315
|
+
handler: (server) => server,
|
|
160
316
|
});
|
|
161
|
-
|
|
162
|
-
|
|
317
|
+
app.use("/api", router);
|
|
318
|
+
const httpServer = http.createServer();
|
|
319
|
+
const expressApp = await createApp({ app, httpServer });
|
|
320
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
321
|
+
openServer = httpListening;
|
|
163
322
|
const res = await fetch(`http://localhost:${port}/api/data`);
|
|
164
323
|
expect(res.status).toBe(200);
|
|
165
324
|
expect(await res.json()).toEqual({ value: 42 });
|
|
@@ -169,14 +328,16 @@ describe("createApp", () => {
|
|
|
169
328
|
const throwing = () => {
|
|
170
329
|
throw new Error("boom");
|
|
171
330
|
};
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
customMiddleware: [{ path: "/explode", handlers: [throwing] }],
|
|
331
|
+
const app = new Skybridge({
|
|
332
|
+
name: "t",
|
|
333
|
+
version: "0.0.0",
|
|
334
|
+
handler: (server) => server,
|
|
177
335
|
});
|
|
178
|
-
|
|
179
|
-
|
|
336
|
+
app.use("/explode", throwing);
|
|
337
|
+
const httpServer = http.createServer();
|
|
338
|
+
const expressApp = await createApp({ app, httpServer });
|
|
339
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
340
|
+
openServer = httpListening;
|
|
180
341
|
const res = await fetch(`http://localhost:${port}/explode`);
|
|
181
342
|
expect(res.status).toBe(500);
|
|
182
343
|
// Server process did not crash — it still accepts connections
|
|
@@ -186,10 +347,20 @@ describe("createApp", () => {
|
|
|
186
347
|
it("returns 500 JSON-RPC error when the MCP handler throws and no error middleware is registered", async () => {
|
|
187
348
|
const { createApp } = await import("./express.js");
|
|
188
349
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
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
|
+
});
|
|
189
360
|
const httpServer = http.createServer();
|
|
190
|
-
const
|
|
191
|
-
const { port, server } = await listen(
|
|
192
|
-
openServer =
|
|
361
|
+
const expressApp = await createApp({ app, httpServer });
|
|
362
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
363
|
+
openServer = httpListening;
|
|
193
364
|
const res = await postMcp(port);
|
|
194
365
|
expect(res.status).toBe(500);
|
|
195
366
|
expect(await res.json()).toEqual({
|
|
@@ -207,14 +378,22 @@ describe("createApp", () => {
|
|
|
207
378
|
calls.push("error-handler");
|
|
208
379
|
res.status(503).json({ custom: true });
|
|
209
380
|
};
|
|
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
|
+
});
|
|
210
389
|
const httpServer = http.createServer();
|
|
211
|
-
const
|
|
212
|
-
|
|
390
|
+
const expressApp = await createApp({
|
|
391
|
+
app,
|
|
213
392
|
httpServer,
|
|
214
393
|
errorMiddleware: [{ handlers: [errorHandler] }],
|
|
215
394
|
});
|
|
216
|
-
const { port, server } = await listen(
|
|
217
|
-
openServer =
|
|
395
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
396
|
+
openServer = httpListening;
|
|
218
397
|
const res = await postMcp(port);
|
|
219
398
|
expect(calls).toEqual(["error-handler"]);
|
|
220
399
|
expect(res.status).toBe(503);
|
|
@@ -230,15 +409,23 @@ describe("createApp", () => {
|
|
|
230
409
|
const throwingApiRoute = (_req, _res, next) => {
|
|
231
410
|
next(new Error("api error"));
|
|
232
411
|
};
|
|
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);
|
|
233
421
|
const httpServer = http.createServer();
|
|
234
|
-
const
|
|
235
|
-
|
|
422
|
+
const expressApp = await createApp({
|
|
423
|
+
app,
|
|
236
424
|
httpServer,
|
|
237
|
-
customMiddleware: [{ path: "/api/test", handlers: [throwingApiRoute] }],
|
|
238
425
|
errorMiddleware: [{ path: "/mcp", handlers: [mcpErrorHandler] }],
|
|
239
426
|
});
|
|
240
|
-
const { port, server } = await listen(
|
|
241
|
-
openServer =
|
|
427
|
+
const { port, server: httpListening } = await listen(expressApp);
|
|
428
|
+
openServer = httpListening;
|
|
242
429
|
const mcpRes = await postMcp(port);
|
|
243
430
|
expect(calls).toEqual(["mcp-error-handler"]);
|
|
244
431
|
expect(mcpRes.status).toBe(503);
|
|
@@ -251,20 +438,20 @@ describe("createApp", () => {
|
|
|
251
438
|
});
|
|
252
439
|
it("handles concurrent /mcp requests without 'Already connected to a transport'", async () => {
|
|
253
440
|
const { createApp } = await import("./express.js");
|
|
254
|
-
const mcpServer = new McpServer({
|
|
255
|
-
name: "concurrent-test",
|
|
256
|
-
version: "0.0.0",
|
|
257
|
-
});
|
|
258
441
|
// Slow tool: keeps the underlying transport bound long enough to overlap
|
|
259
442
|
// with concurrent requests, exposing the shared-McpServer race.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
+
}),
|
|
263
450
|
});
|
|
264
451
|
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
265
452
|
const httpServer = http.createServer();
|
|
266
|
-
const
|
|
267
|
-
const { port, server } = await listen(
|
|
453
|
+
const expressApp = await createApp({ app, httpServer });
|
|
454
|
+
const { port, server } = await listen(expressApp);
|
|
268
455
|
openServer = server;
|
|
269
456
|
const callBody = (id) => JSON.stringify({
|
|
270
457
|
jsonrpc: "2.0",
|
|
@@ -286,6 +473,40 @@ describe("createApp", () => {
|
|
|
286
473
|
consoleSpy.mockRestore();
|
|
287
474
|
});
|
|
288
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
|
+
});
|
|
289
510
|
describe("createApp tunnel routes", () => {
|
|
290
511
|
it("proxies POST /__skybridge/tunnel to the cli control server in dev mode", async () => {
|
|
291
512
|
// Stand up a fake control listener that returns a known JSON body.
|
|
@@ -304,9 +525,14 @@ describe("createApp tunnel routes", () => {
|
|
|
304
525
|
process.env.__TUNNEL_CONTROL_PORT = String(controlPort);
|
|
305
526
|
try {
|
|
306
527
|
const { createApp } = await import("./express.js");
|
|
528
|
+
const app = new Skybridge({
|
|
529
|
+
name: "t",
|
|
530
|
+
version: "0.0.0",
|
|
531
|
+
handler: (server) => server,
|
|
532
|
+
});
|
|
307
533
|
const httpServer = http.createServer();
|
|
308
|
-
const
|
|
309
|
-
const { port, server } = await listen(
|
|
534
|
+
const expressApp = await createApp({ app, httpServer });
|
|
535
|
+
const { port, server } = await listen(expressApp);
|
|
310
536
|
openServer = server;
|
|
311
537
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
312
538
|
method: "POST",
|
|
@@ -330,9 +556,15 @@ describe("createApp tunnel routes", () => {
|
|
|
330
556
|
try {
|
|
331
557
|
vi.resetModules();
|
|
332
558
|
const { createApp } = await import("./express.js");
|
|
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
|
+
});
|
|
333
565
|
const httpServer = http.createServer();
|
|
334
|
-
const
|
|
335
|
-
const { port, server } = await listen(
|
|
566
|
+
const expressApp = await createApp({ app, httpServer });
|
|
567
|
+
const { port, server } = await listen(expressApp);
|
|
336
568
|
openServer = server;
|
|
337
569
|
const res = await fetch(`http://localhost:${port}/__skybridge/tunnel`, {
|
|
338
570
|
method: "POST",
|
|
@@ -345,4 +577,32 @@ describe("createApp tunnel routes", () => {
|
|
|
345
577
|
}
|
|
346
578
|
});
|
|
347
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
|
+
});
|
|
348
608
|
//# sourceMappingURL=express.test.js.map
|