@nodetool-ai/websocket 0.7.0-rc.22 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/agent/run-node-tool.d.ts +39 -0
- package/dist/agent/run-node-tool.d.ts.map +1 -0
- package/dist/agent/run-node-tool.js +55 -0
- package/dist/agent/run-node-tool.js.map +1 -0
- package/dist/chat-prediction-forwarder.d.ts +13 -0
- package/dist/chat-prediction-forwarder.d.ts.map +1 -0
- package/dist/chat-prediction-forwarder.js +22 -0
- package/dist/chat-prediction-forwarder.js.map +1 -0
- package/dist/chat-tool-call-repair.d.ts +45 -0
- package/dist/chat-tool-call-repair.d.ts.map +1 -0
- package/dist/chat-tool-call-repair.js +100 -0
- package/dist/chat-tool-call-repair.js.map +1 -0
- package/dist/chat-turn-registry.d.ts +169 -0
- package/dist/chat-turn-registry.d.ts.map +1 -0
- package/dist/chat-turn-registry.js +326 -0
- package/dist/chat-turn-registry.js.map +1 -0
- package/dist/collection-api.d.ts +2 -2
- package/dist/collection-api.d.ts.map +1 -1
- package/dist/collection-api.js +44 -13
- package/dist/collection-api.js.map +1 -1
- package/dist/configured-providers.d.ts +52 -0
- package/dist/configured-providers.d.ts.map +1 -0
- package/dist/configured-providers.js +85 -0
- package/dist/configured-providers.js.map +1 -0
- package/dist/cors.d.ts +22 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +91 -0
- package/dist/cors.js.map +1 -0
- package/dist/credit-gate.d.ts +36 -0
- package/dist/credit-gate.d.ts.map +1 -0
- package/dist/credit-gate.js +76 -0
- package/dist/credit-gate.js.map +1 -0
- package/dist/custom-providers.d.ts +40 -0
- package/dist/custom-providers.d.ts.map +1 -0
- package/dist/custom-providers.js +134 -0
- package/dist/custom-providers.js.map +1 -0
- package/dist/debug-sessions.d.ts +10 -0
- package/dist/debug-sessions.d.ts.map +1 -0
- package/dist/debug-sessions.js +9 -0
- package/dist/debug-sessions.js.map +1 -0
- package/dist/drain.d.ts +34 -0
- package/dist/drain.d.ts.map +1 -0
- package/dist/drain.js +68 -0
- package/dist/drain.js.map +1 -0
- package/dist/e2e-server.d.ts +30 -0
- package/dist/e2e-server.d.ts.map +1 -0
- package/dist/e2e-server.js +111 -0
- package/dist/e2e-server.js.map +1 -0
- package/dist/example-workflows.d.ts +20 -0
- package/dist/example-workflows.d.ts.map +1 -0
- package/dist/example-workflows.js +123 -0
- package/dist/example-workflows.js.map +1 -0
- package/dist/extension-cdp-bridge.d.ts +85 -0
- package/dist/extension-cdp-bridge.d.ts.map +1 -0
- package/dist/extension-cdp-bridge.js +163 -0
- package/dist/extension-cdp-bridge.js.map +1 -0
- package/dist/external-mcp.d.ts +58 -0
- package/dist/external-mcp.d.ts.map +1 -0
- package/dist/external-mcp.js +288 -0
- package/dist/external-mcp.js.map +1 -0
- package/dist/fake-runtime.d.ts +114 -0
- package/dist/fake-runtime.d.ts.map +1 -0
- package/dist/fake-runtime.js +270 -0
- package/dist/fake-runtime.js.map +1 -0
- package/dist/file-api.d.ts +4 -7
- package/dist/file-api.d.ts.map +1 -1
- package/dist/file-api.js +122 -39
- package/dist/file-api.js.map +1 -1
- package/dist/frontend-renderer-registry.d.ts +75 -0
- package/dist/frontend-renderer-registry.d.ts.map +1 -0
- package/dist/frontend-renderer-registry.js +111 -0
- package/dist/frontend-renderer-registry.js.map +1 -0
- package/dist/generation-recovery.d.ts +13 -0
- package/dist/generation-recovery.d.ts.map +1 -0
- package/dist/generation-recovery.js +197 -0
- package/dist/generation-recovery.js.map +1 -0
- package/dist/headless-job-runner.d.ts +71 -0
- package/dist/headless-job-runner.d.ts.map +1 -0
- package/dist/headless-job-runner.js +198 -0
- package/dist/headless-job-runner.js.map +1 -0
- package/dist/http-api.d.ts +157 -24
- package/dist/http-api.d.ts.map +1 -1
- package/dist/http-api.js +613 -646
- package/dist/http-api.js.map +1 -1
- package/dist/http-body-schemas.d.ts +109 -0
- package/dist/http-body-schemas.d.ts.map +1 -0
- package/dist/http-body-schemas.js +146 -0
- package/dist/http-body-schemas.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/job-control.d.ts +57 -0
- package/dist/job-control.d.ts.map +1 -0
- package/dist/job-control.js +134 -0
- package/dist/job-control.js.map +1 -0
- package/dist/job-queue.d.ts +47 -0
- package/dist/job-queue.d.ts.map +1 -0
- package/dist/job-queue.js +52 -0
- package/dist/job-queue.js.map +1 -0
- package/dist/job-run-registry.d.ts +176 -0
- package/dist/job-run-registry.d.ts.map +1 -0
- package/dist/job-run-registry.js +312 -0
- package/dist/job-run-registry.js.map +1 -0
- package/dist/lib/app-build-service.d.ts +16 -0
- package/dist/lib/app-build-service.d.ts.map +1 -0
- package/dist/lib/app-build-service.js +39 -0
- package/dist/lib/app-build-service.js.map +1 -0
- package/dist/lib/app-debug-service.d.ts +16 -0
- package/dist/lib/app-debug-service.d.ts.map +1 -0
- package/dist/lib/app-debug-service.js +48 -0
- package/dist/lib/app-debug-service.js.map +1 -0
- package/dist/lib/app-deployment-service.d.ts +82 -0
- package/dist/lib/app-deployment-service.d.ts.map +1 -0
- package/dist/lib/app-deployment-service.js +282 -0
- package/dist/lib/app-deployment-service.js.map +1 -0
- package/dist/lib/app-run-server.d.ts +7 -0
- package/dist/lib/app-run-server.d.ts.map +1 -0
- package/dist/lib/app-run-server.js +6 -0
- package/dist/lib/app-run-server.js.map +1 -0
- package/dist/lib/app-session-scope.d.ts +91 -0
- package/dist/lib/app-session-scope.d.ts.map +1 -0
- package/dist/lib/app-session-scope.js +91 -0
- package/dist/lib/app-session-scope.js.map +1 -0
- package/dist/lib/applications-service.d.ts +173 -0
- package/dist/lib/applications-service.d.ts.map +1 -0
- package/dist/lib/applications-service.js +491 -0
- package/dist/lib/applications-service.js.map +1 -0
- package/dist/lib/asset-duration.d.ts +7 -0
- package/dist/lib/asset-duration.d.ts.map +1 -0
- package/dist/lib/asset-duration.js +24 -0
- package/dist/lib/asset-duration.js.map +1 -0
- package/dist/lib/asset-export.d.ts +34 -0
- package/dist/lib/asset-export.d.ts.map +1 -0
- package/dist/lib/asset-export.js +113 -0
- package/dist/lib/asset-export.js.map +1 -0
- package/dist/lib/asset-model-interface.d.ts +41 -0
- package/dist/lib/asset-model-interface.d.ts.map +1 -0
- package/dist/lib/asset-model-interface.js +74 -0
- package/dist/lib/asset-model-interface.js.map +1 -0
- package/dist/lib/asset-paths.d.ts +52 -0
- package/dist/lib/asset-paths.d.ts.map +1 -1
- package/dist/lib/asset-paths.js +145 -1
- package/dist/lib/asset-paths.js.map +1 -1
- package/dist/lib/asset-response.d.ts +12 -0
- package/dist/lib/asset-response.d.ts.map +1 -0
- package/dist/lib/asset-response.js +88 -0
- package/dist/lib/asset-response.js.map +1 -0
- package/dist/lib/audio-peaks.d.ts +23 -0
- package/dist/lib/audio-peaks.d.ts.map +1 -0
- package/dist/lib/audio-peaks.js +331 -0
- package/dist/lib/audio-peaks.js.map +1 -0
- package/dist/lib/bridge.d.ts +9 -1
- package/dist/lib/bridge.d.ts.map +1 -1
- package/dist/lib/bridge.js +27 -4
- package/dist/lib/bridge.js.map +1 -1
- package/dist/lib/compression.d.ts +3 -0
- package/dist/lib/compression.d.ts.map +1 -0
- package/dist/lib/compression.js +3 -0
- package/dist/lib/compression.js.map +1 -0
- package/dist/lib/document-model-interfaces.d.ts +30 -0
- package/dist/lib/document-model-interfaces.d.ts.map +1 -0
- package/dist/lib/document-model-interfaces.js +295 -0
- package/dist/lib/document-model-interfaces.js.map +1 -0
- package/dist/lib/env-config.d.ts +9 -0
- package/dist/lib/env-config.d.ts.map +1 -0
- package/dist/lib/env-config.js +18 -0
- package/dist/lib/env-config.js.map +1 -0
- package/dist/lib/example-apps.d.ts +43 -0
- package/dist/lib/example-apps.d.ts.map +1 -0
- package/dist/lib/example-apps.js +145 -0
- package/dist/lib/example-apps.js.map +1 -0
- package/dist/lib/example-games.d.ts +5 -0
- package/dist/lib/example-games.d.ts.map +1 -0
- package/dist/lib/example-games.js +13 -0
- package/dist/lib/example-games.js.map +1 -0
- package/dist/lib/example-recipes.d.ts +33 -0
- package/dist/lib/example-recipes.d.ts.map +1 -0
- package/dist/lib/example-recipes.js +213 -0
- package/dist/lib/example-recipes.js.map +1 -0
- package/dist/lib/example-storyboards.d.ts +40 -0
- package/dist/lib/example-storyboards.d.ts.map +1 -0
- package/dist/lib/example-storyboards.js +131 -0
- package/dist/lib/example-storyboards.js.map +1 -0
- package/dist/lib/example-thumbnail.d.ts +21 -0
- package/dist/lib/example-thumbnail.d.ts.map +1 -0
- package/dist/lib/example-thumbnail.js +50 -0
- package/dist/lib/example-thumbnail.js.map +1 -0
- package/dist/lib/example-timelines.d.ts +9 -0
- package/dist/lib/example-timelines.d.ts.map +1 -0
- package/dist/lib/example-timelines.js +25 -0
- package/dist/lib/example-timelines.js.map +1 -0
- package/dist/lib/extension-dist.d.ts +24 -0
- package/dist/lib/extension-dist.d.ts.map +1 -0
- package/dist/lib/extension-dist.js +67 -0
- package/dist/lib/extension-dist.js.map +1 -0
- package/dist/lib/external-asset-lookup.d.ts +30 -0
- package/dist/lib/external-asset-lookup.d.ts.map +1 -0
- package/dist/lib/external-asset-lookup.js +99 -0
- package/dist/lib/external-asset-lookup.js.map +1 -0
- package/dist/lib/external-assets.d.ts +13 -0
- package/dist/lib/external-assets.d.ts.map +1 -0
- package/dist/lib/external-assets.js +46 -0
- package/dist/lib/external-assets.js.map +1 -0
- package/dist/lib/fly-replay.d.ts +34 -0
- package/dist/lib/fly-replay.d.ts.map +1 -0
- package/dist/lib/fly-replay.js +111 -0
- package/dist/lib/fly-replay.js.map +1 -0
- package/dist/lib/http-rate-limit.d.ts +32 -0
- package/dist/lib/http-rate-limit.d.ts.map +1 -0
- package/dist/lib/http-rate-limit.js +47 -0
- package/dist/lib/http-rate-limit.js.map +1 -0
- package/dist/lib/instance-id.d.ts +25 -0
- package/dist/lib/instance-id.d.ts.map +1 -0
- package/dist/lib/instance-id.js +44 -0
- package/dist/lib/instance-id.js.map +1 -0
- package/dist/lib/link-codes.d.ts +82 -0
- package/dist/lib/link-codes.d.ts.map +1 -0
- package/dist/lib/link-codes.js +100 -0
- package/dist/lib/link-codes.js.map +1 -0
- package/dist/lib/local-asset-upload.d.ts +5 -0
- package/dist/lib/local-asset-upload.d.ts.map +1 -0
- package/dist/lib/local-asset-upload.js +69 -0
- package/dist/lib/local-asset-upload.js.map +1 -0
- package/dist/lib/local-file-access.d.ts +31 -0
- package/dist/lib/local-file-access.d.ts.map +1 -0
- package/dist/lib/local-file-access.js +169 -0
- package/dist/lib/local-file-access.js.map +1 -0
- package/dist/lib/localhost-trust.d.ts +59 -0
- package/dist/lib/localhost-trust.d.ts.map +1 -0
- package/dist/lib/localhost-trust.js +139 -0
- package/dist/lib/localhost-trust.js.map +1 -0
- package/dist/lib/mcp-mount.d.ts +25 -0
- package/dist/lib/mcp-mount.d.ts.map +1 -0
- package/dist/lib/mcp-mount.js +32 -0
- package/dist/lib/mcp-mount.js.map +1 -0
- package/dist/lib/media-size.d.ts +21 -0
- package/dist/lib/media-size.d.ts.map +1 -0
- package/dist/lib/media-size.js +48 -0
- package/dist/lib/media-size.js.map +1 -0
- package/dist/lib/media.d.ts +38 -0
- package/dist/lib/media.d.ts.map +1 -0
- package/dist/lib/media.js +146 -0
- package/dist/lib/media.js.map +1 -0
- package/dist/lib/package-asset-export.d.ts +83 -0
- package/dist/lib/package-asset-export.d.ts.map +1 -0
- package/dist/lib/package-asset-export.js +212 -0
- package/dist/lib/package-asset-export.js.map +1 -0
- package/dist/lib/package-assets.d.ts +41 -0
- package/dist/lib/package-assets.d.ts.map +1 -0
- package/dist/lib/package-assets.js +155 -0
- package/dist/lib/package-assets.js.map +1 -0
- package/dist/lib/project-delete.d.ts +11 -0
- package/dist/lib/project-delete.d.ts.map +1 -0
- package/dist/lib/project-delete.js +67 -0
- package/dist/lib/project-delete.js.map +1 -0
- package/dist/lib/project-document-copy.d.ts +31 -0
- package/dist/lib/project-document-copy.d.ts.map +1 -0
- package/dist/lib/project-document-copy.js +473 -0
- package/dist/lib/project-document-copy.js.map +1 -0
- package/dist/lib/public-app-assets.d.ts +8 -0
- package/dist/lib/public-app-assets.d.ts.map +1 -0
- package/dist/lib/public-app-assets.js +77 -0
- package/dist/lib/public-app-assets.js.map +1 -0
- package/dist/lib/public-routes.d.ts +95 -0
- package/dist/lib/public-routes.d.ts.map +1 -0
- package/dist/lib/public-routes.js +154 -0
- package/dist/lib/public-routes.js.map +1 -0
- package/dist/lib/runtime-detection.d.ts +17 -0
- package/dist/lib/runtime-detection.d.ts.map +1 -0
- package/dist/lib/runtime-detection.js +90 -0
- package/dist/lib/runtime-detection.js.map +1 -0
- package/dist/lib/storage-access.d.ts +21 -0
- package/dist/lib/storage-access.d.ts.map +1 -0
- package/dist/lib/storage-access.js +74 -0
- package/dist/lib/storage-access.js.map +1 -0
- package/dist/lib/storage.d.ts +9 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +28 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/storyboard-export.d.ts +64 -0
- package/dist/lib/storyboard-export.d.ts.map +1 -0
- package/dist/lib/storyboard-export.js +183 -0
- package/dist/lib/storyboard-export.js.map +1 -0
- package/dist/lib/style-presets.d.ts +34 -0
- package/dist/lib/style-presets.d.ts.map +1 -0
- package/dist/lib/style-presets.js +62 -0
- package/dist/lib/style-presets.js.map +1 -0
- package/dist/lib/temp-url-resolver.d.ts +35 -0
- package/dist/lib/temp-url-resolver.d.ts.map +1 -0
- package/dist/lib/temp-url-resolver.js +88 -0
- package/dist/lib/temp-url-resolver.js.map +1 -0
- package/dist/lib/thumbnail.d.ts +74 -0
- package/dist/lib/thumbnail.d.ts.map +1 -0
- package/dist/lib/thumbnail.js +302 -0
- package/dist/lib/thumbnail.js.map +1 -0
- package/dist/lib/timeline-bundle.d.ts +1689 -0
- package/dist/lib/timeline-bundle.d.ts.map +1 -0
- package/dist/lib/timeline-bundle.js +330 -0
- package/dist/lib/timeline-bundle.js.map +1 -0
- package/dist/lib/video-proxy.d.ts +114 -0
- package/dist/lib/video-proxy.d.ts.map +1 -0
- package/dist/lib/video-proxy.js +545 -0
- package/dist/lib/video-proxy.js.map +1 -0
- package/dist/lib/wire-values.d.ts +31 -0
- package/dist/lib/wire-values.d.ts.map +1 -0
- package/dist/lib/wire-values.js +49 -0
- package/dist/lib/wire-values.js.map +1 -0
- package/dist/lib/workflow-bundle.d.ts +102 -0
- package/dist/lib/workflow-bundle.d.ts.map +1 -0
- package/dist/lib/workflow-bundle.js +306 -0
- package/dist/lib/workflow-bundle.js.map +1 -0
- package/dist/lib/workflow-service.d.ts +82 -0
- package/dist/lib/workflow-service.d.ts.map +1 -0
- package/dist/lib/workflow-service.js +194 -0
- package/dist/lib/workflow-service.js.map +1 -0
- package/dist/lib/workflow-workspace.d.ts +20 -0
- package/dist/lib/workflow-workspace.d.ts.map +1 -0
- package/dist/lib/workflow-workspace.js +65 -0
- package/dist/lib/workflow-workspace.js.map +1 -0
- package/dist/lib/ws-connection-health.d.ts +10 -0
- package/dist/lib/ws-connection-health.d.ts.map +1 -0
- package/dist/lib/ws-connection-health.js +38 -0
- package/dist/lib/ws-connection-health.js.map +1 -0
- package/dist/lib/ws-rate-limit.d.ts +22 -0
- package/dist/lib/ws-rate-limit.d.ts.map +1 -0
- package/dist/lib/ws-rate-limit.js +45 -0
- package/dist/lib/ws-rate-limit.js.map +1 -0
- package/dist/lib/ws-upgrade.d.ts +40 -0
- package/dist/lib/ws-upgrade.d.ts.map +1 -0
- package/dist/lib/ws-upgrade.js +66 -0
- package/dist/lib/ws-upgrade.js.map +1 -0
- package/dist/lib/zip-stream.d.ts +46 -0
- package/dist/lib/zip-stream.d.ts.map +1 -0
- package/dist/lib/zip-stream.js +140 -0
- package/dist/lib/zip-stream.js.map +1 -0
- package/dist/mcp-agent-tools.d.ts +56 -0
- package/dist/mcp-agent-tools.d.ts.map +1 -0
- package/dist/mcp-agent-tools.js +1216 -0
- package/dist/mcp-agent-tools.js.map +1 -0
- package/dist/mcp-server.d.ts +56 -7
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +255 -762
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tool-deps.d.ts +20 -0
- package/dist/mcp-tool-deps.d.ts.map +1 -0
- package/dist/mcp-tool-deps.js +61 -0
- package/dist/mcp-tool-deps.js.map +1 -0
- package/dist/messagepack.d.ts +7 -0
- package/dist/messagepack.d.ts.map +1 -0
- package/dist/messagepack.js +19 -0
- package/dist/messagepack.js.map +1 -0
- package/dist/model-download-runtime.d.ts +9 -0
- package/dist/model-download-runtime.d.ts.map +1 -0
- package/dist/model-download-runtime.js +77 -0
- package/dist/model-download-runtime.js.map +1 -0
- package/dist/model-execution-availability.d.ts +14 -0
- package/dist/model-execution-availability.d.ts.map +1 -0
- package/dist/model-execution-availability.js +161 -0
- package/dist/model-execution-availability.js.map +1 -0
- package/dist/models-api.d.ts +51 -5
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +160 -690
- package/dist/models-api.js.map +1 -1
- package/dist/node-registry-setup.d.ts +84 -0
- package/dist/node-registry-setup.d.ts.map +1 -0
- package/dist/node-registry-setup.js +256 -0
- package/dist/node-registry-setup.js.map +1 -0
- package/dist/oauth/cimd.d.ts +28 -0
- package/dist/oauth/cimd.d.ts.map +1 -0
- package/dist/oauth/cimd.js +177 -0
- package/dist/oauth/cimd.js.map +1 -0
- package/dist/oauth/gate.d.ts +38 -0
- package/dist/oauth/gate.d.ts.map +1 -0
- package/dist/oauth/gate.js +77 -0
- package/dist/oauth/gate.js.map +1 -0
- package/dist/oauth/metadata.d.ts +35 -0
- package/dist/oauth/metadata.d.ts.map +1 -0
- package/dist/oauth/metadata.js +56 -0
- package/dist/oauth/metadata.js.map +1 -0
- package/dist/oauth/pending-store.d.ts +79 -0
- package/dist/oauth/pending-store.d.ts.map +1 -0
- package/dist/oauth/pending-store.js +133 -0
- package/dist/oauth/pending-store.js.map +1 -0
- package/dist/oauth/pkce.d.ts +16 -0
- package/dist/oauth/pkce.d.ts.map +1 -0
- package/dist/oauth/pkce.js +29 -0
- package/dist/oauth/pkce.js.map +1 -0
- package/dist/oauth/validate.d.ts +25 -0
- package/dist/oauth/validate.d.ts.map +1 -0
- package/dist/oauth/validate.js +62 -0
- package/dist/oauth/validate.js.map +1 -0
- package/dist/oauth/www-authenticate.d.ts +9 -0
- package/dist/oauth/www-authenticate.d.ts.map +1 -0
- package/dist/oauth/www-authenticate.js +33 -0
- package/dist/oauth/www-authenticate.js.map +1 -0
- package/dist/oauth-api.d.ts +19 -0
- package/dist/oauth-api.d.ts.map +1 -1
- package/dist/oauth-api.js +531 -12
- package/dist/oauth-api.js.map +1 -1
- package/dist/openai-api.d.ts.map +1 -1
- package/dist/openai-api.js +4 -9
- package/dist/openai-api.js.map +1 -1
- package/dist/pack-snapshot.d.ts +24 -0
- package/dist/pack-snapshot.d.ts.map +1 -0
- package/dist/pack-snapshot.js +35 -0
- package/dist/pack-snapshot.js.map +1 -0
- package/dist/plugins/websocket.d.ts +21 -4
- package/dist/plugins/websocket.d.ts.map +1 -1
- package/dist/plugins/websocket.js +136 -290
- package/dist/plugins/websocket.js.map +1 -1
- package/dist/resolve-media-urls.d.ts +17 -3
- package/dist/resolve-media-urls.d.ts.map +1 -1
- package/dist/resolve-media-urls.js +117 -31
- package/dist/resolve-media-urls.js.map +1 -1
- package/dist/resource-events.d.ts +28 -0
- package/dist/resource-events.d.ts.map +1 -0
- package/dist/resource-events.js +20 -0
- package/dist/resource-events.js.map +1 -0
- package/dist/routes/account.d.ts +100 -0
- package/dist/routes/account.d.ts.map +1 -0
- package/dist/routes/account.js +197 -0
- package/dist/routes/account.js.map +1 -0
- package/dist/routes/applications.d.ts +36 -0
- package/dist/routes/applications.d.ts.map +1 -0
- package/dist/routes/applications.js +183 -0
- package/dist/routes/applications.js.map +1 -0
- package/dist/routes/assets.d.ts +3 -3
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +78 -44
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/atlascloud-webhook.d.ts +93 -0
- package/dist/routes/atlascloud-webhook.d.ts.map +1 -0
- package/dist/routes/atlascloud-webhook.js +369 -0
- package/dist/routes/atlascloud-webhook.js.map +1 -0
- package/dist/routes/collections.d.ts.map +1 -1
- package/dist/routes/config.d.ts +26 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +64 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/documents.d.ts +27 -0
- package/dist/routes/documents.d.ts.map +1 -0
- package/dist/routes/documents.js +155 -0
- package/dist/routes/documents.js.map +1 -0
- package/dist/routes/fal-credits.d.ts +4 -0
- package/dist/routes/fal-credits.d.ts.map +1 -0
- package/dist/routes/fal-credits.js +101 -0
- package/dist/routes/fal-credits.js.map +1 -0
- package/dist/routes/fal-pricing-estimate.d.ts +4 -0
- package/dist/routes/fal-pricing-estimate.d.ts.map +1 -0
- package/dist/routes/fal-pricing-estimate.js +114 -0
- package/dist/routes/fal-pricing-estimate.js.map +1 -0
- package/dist/routes/fal-pricing.d.ts +4 -0
- package/dist/routes/fal-pricing.d.ts.map +1 -0
- package/dist/routes/fal-pricing.js +93 -0
- package/dist/routes/fal-pricing.js.map +1 -0
- package/dist/routes/fal-webhook.d.ts +102 -0
- package/dist/routes/fal-webhook.d.ts.map +1 -0
- package/dist/routes/fal-webhook.js +379 -0
- package/dist/routes/fal-webhook.js.map +1 -0
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +4 -3
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/health.d.ts +1 -0
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +41 -7
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/integrations.d.ts +39 -0
- package/dist/routes/integrations.d.ts.map +1 -0
- package/dist/routes/integrations.js +211 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/js-scripts.d.ts +26 -0
- package/dist/routes/js-scripts.d.ts.map +1 -0
- package/dist/routes/js-scripts.js +116 -0
- package/dist/routes/js-scripts.js.map +1 -0
- package/dist/routes/kie-credits.d.ts +4 -0
- package/dist/routes/kie-credits.d.ts.map +1 -0
- package/dist/routes/kie-credits.js +93 -0
- package/dist/routes/kie-credits.js.map +1 -0
- package/dist/routes/kie-pricing.d.ts +4 -0
- package/dist/routes/kie-pricing.d.ts.map +1 -0
- package/dist/routes/kie-pricing.js +45 -0
- package/dist/routes/kie-pricing.js.map +1 -0
- package/dist/routes/kie-webhook.d.ts +4 -0
- package/dist/routes/kie-webhook.d.ts.map +1 -0
- package/dist/routes/kie-webhook.js +70 -0
- package/dist/routes/kie-webhook.js.map +1 -0
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +6 -59
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/oauth-as.d.ts +30 -0
- package/dist/routes/oauth-as.d.ts.map +1 -0
- package/dist/routes/oauth-as.js +412 -0
- package/dist/routes/oauth-as.js.map +1 -0
- package/dist/routes/oauth.d.ts.map +1 -1
- package/dist/routes/openai.d.ts.map +1 -1
- package/dist/routes/public-apps.d.ts +27 -0
- package/dist/routes/public-apps.d.ts.map +1 -0
- package/dist/routes/public-apps.js +99 -0
- package/dist/routes/public-apps.js.map +1 -0
- package/dist/routes/sandbox-modules.d.ts +17 -0
- package/dist/routes/sandbox-modules.d.ts.map +1 -0
- package/dist/routes/sandbox-modules.js +85 -0
- package/dist/routes/sandbox-modules.js.map +1 -0
- package/dist/routes/sdk-v1.d.ts +24 -0
- package/dist/routes/sdk-v1.d.ts.map +1 -0
- package/dist/routes/sdk-v1.js +320 -0
- package/dist/routes/sdk-v1.js.map +1 -0
- package/dist/routes/storage.d.ts.map +1 -1
- package/dist/routes/storyboards.d.ts +16 -0
- package/dist/routes/storyboards.d.ts.map +1 -0
- package/dist/routes/storyboards.js +97 -0
- package/dist/routes/storyboards.js.map +1 -0
- package/dist/routes/timeline-animations.d.ts +23 -0
- package/dist/routes/timeline-animations.d.ts.map +1 -0
- package/dist/routes/timeline-animations.js +99 -0
- package/dist/routes/timeline-animations.js.map +1 -0
- package/dist/routes/timeline-audio-bake.d.ts +51 -0
- package/dist/routes/timeline-audio-bake.d.ts.map +1 -0
- package/dist/routes/timeline-audio-bake.js +110 -0
- package/dist/routes/timeline-audio-bake.js.map +1 -0
- package/dist/routes/timeline-fonts.d.ts +29 -0
- package/dist/routes/timeline-fonts.d.ts.map +1 -0
- package/dist/routes/timeline-fonts.js +64 -0
- package/dist/routes/timeline-fonts.js.map +1 -0
- package/dist/routes/timeline-isolate-subject.d.ts +55 -0
- package/dist/routes/timeline-isolate-subject.d.ts.map +1 -0
- package/dist/routes/timeline-isolate-subject.js +128 -0
- package/dist/routes/timeline-isolate-subject.js.map +1 -0
- package/dist/routes/timeline-track-object.d.ts +39 -0
- package/dist/routes/timeline-track-object.d.ts.map +1 -0
- package/dist/routes/timeline-track-object.js +97 -0
- package/dist/routes/timeline-track-object.js.map +1 -0
- package/dist/routes/timelines.d.ts +18 -0
- package/dist/routes/timelines.d.ts.map +1 -0
- package/dist/routes/timelines.js +191 -0
- package/dist/routes/timelines.js.map +1 -0
- package/dist/routes/workflows.d.ts +6 -9
- package/dist/routes/workflows.d.ts.map +1 -1
- package/dist/routes/workflows.js +100 -11
- package/dist/routes/workflows.js.map +1 -1
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/run-supervisor.d.ts +30 -0
- package/dist/run-supervisor.d.ts.map +1 -0
- package/dist/run-supervisor.js +86 -0
- package/dist/run-supervisor.js.map +1 -0
- package/dist/sandbox-catalog.d.ts +28 -0
- package/dist/sandbox-catalog.d.ts.map +1 -0
- package/dist/sandbox-catalog.js +74 -0
- package/dist/sandbox-catalog.js.map +1 -0
- package/dist/screenshot-projects.d.ts +27 -0
- package/dist/screenshot-projects.d.ts.map +1 -0
- package/dist/screenshot-projects.js +880 -0
- package/dist/screenshot-projects.js.map +1 -0
- package/dist/screenshot-server.js +947 -43
- package/dist/screenshot-server.js.map +1 -1
- package/dist/sdk/sdk-cached-model-inventory.d.ts +21 -0
- package/dist/sdk/sdk-cached-model-inventory.d.ts.map +1 -0
- package/dist/sdk/sdk-cached-model-inventory.js +51 -0
- package/dist/sdk/sdk-cached-model-inventory.js.map +1 -0
- package/dist/sdk/sdk-capabilities-service.d.ts +32 -0
- package/dist/sdk/sdk-capabilities-service.d.ts.map +1 -0
- package/dist/sdk/sdk-capabilities-service.js +47 -0
- package/dist/sdk/sdk-capabilities-service.js.map +1 -0
- package/dist/sdk/sdk-execution-readiness-probe.d.ts +19 -0
- package/dist/sdk/sdk-execution-readiness-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-execution-readiness-probe.js +90 -0
- package/dist/sdk/sdk-execution-readiness-probe.js.map +1 -0
- package/dist/sdk/sdk-execution-target-readiness.d.ts +15 -0
- package/dist/sdk/sdk-execution-target-readiness.d.ts.map +1 -0
- package/dist/sdk/sdk-execution-target-readiness.js +50 -0
- package/dist/sdk/sdk-execution-target-readiness.js.map +1 -0
- package/dist/sdk/sdk-feature-flags.d.ts +18 -0
- package/dist/sdk/sdk-feature-flags.d.ts.map +1 -0
- package/dist/sdk/sdk-feature-flags.js +30 -0
- package/dist/sdk/sdk-feature-flags.js.map +1 -0
- package/dist/sdk/sdk-huggingface-download-state.d.ts +15 -0
- package/dist/sdk/sdk-huggingface-download-state.d.ts.map +1 -0
- package/dist/sdk/sdk-huggingface-download-state.js +25 -0
- package/dist/sdk/sdk-huggingface-download-state.js.map +1 -0
- package/dist/sdk/sdk-live-runner-registry.d.ts +21 -0
- package/dist/sdk/sdk-live-runner-registry.d.ts.map +1 -0
- package/dist/sdk/sdk-live-runner-registry.js +26 -0
- package/dist/sdk/sdk-live-runner-registry.js.map +1 -0
- package/dist/sdk/sdk-model-catalog-service.d.ts +20 -0
- package/dist/sdk/sdk-model-catalog-service.d.ts.map +1 -0
- package/dist/sdk/sdk-model-catalog-service.js +219 -0
- package/dist/sdk/sdk-model-catalog-service.js.map +1 -0
- package/dist/sdk/sdk-model-download-service.d.ts +39 -0
- package/dist/sdk/sdk-model-download-service.d.ts.map +1 -0
- package/dist/sdk/sdk-model-download-service.js +274 -0
- package/dist/sdk/sdk-model-download-service.js.map +1 -0
- package/dist/sdk/sdk-model-requirement-probe.d.ts +30 -0
- package/dist/sdk/sdk-model-requirement-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-model-requirement-probe.js +120 -0
- package/dist/sdk/sdk-model-requirement-probe.js.map +1 -0
- package/dist/sdk/sdk-node-package-requirement-probe.d.ts +20 -0
- package/dist/sdk/sdk-node-package-requirement-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-node-package-requirement-probe.js +44 -0
- package/dist/sdk/sdk-node-package-requirement-probe.js.map +1 -0
- package/dist/sdk/sdk-node-type-inventory-service.d.ts +11 -0
- package/dist/sdk/sdk-node-type-inventory-service.d.ts.map +1 -0
- package/dist/sdk/sdk-node-type-inventory-service.js +36 -0
- package/dist/sdk/sdk-node-type-inventory-service.js.map +1 -0
- package/dist/sdk/sdk-preflight-orchestrator.d.ts +54 -0
- package/dist/sdk/sdk-preflight-orchestrator.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-orchestrator.js +63 -0
- package/dist/sdk/sdk-preflight-orchestrator.js.map +1 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.d.ts +35 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.js +67 -0
- package/dist/sdk/sdk-preflight-requirement-resolver.js.map +1 -0
- package/dist/sdk/sdk-preflight-service.d.ts +61 -0
- package/dist/sdk/sdk-preflight-service.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-service.js +104 -0
- package/dist/sdk/sdk-preflight-service.js.map +1 -0
- package/dist/sdk/sdk-preflight-workflow-source.d.ts +18 -0
- package/dist/sdk/sdk-preflight-workflow-source.d.ts.map +1 -0
- package/dist/sdk/sdk-preflight-workflow-source.js +42 -0
- package/dist/sdk/sdk-preflight-workflow-source.js.map +1 -0
- package/dist/sdk/sdk-route-policy.d.ts +3 -0
- package/dist/sdk/sdk-route-policy.d.ts.map +1 -0
- package/dist/sdk/sdk-route-policy.js +18 -0
- package/dist/sdk/sdk-route-policy.js.map +1 -0
- package/dist/sdk/sdk-runtime-capabilities-service.d.ts +60 -0
- package/dist/sdk/sdk-runtime-capabilities-service.d.ts.map +1 -0
- package/dist/sdk/sdk-runtime-capabilities-service.js +30 -0
- package/dist/sdk/sdk-runtime-capabilities-service.js.map +1 -0
- package/dist/sdk/sdk-runtime-requirement-probe.d.ts +13 -0
- package/dist/sdk/sdk-runtime-requirement-probe.d.ts.map +1 -0
- package/dist/sdk/sdk-runtime-requirement-probe.js +55 -0
- package/dist/sdk/sdk-runtime-requirement-probe.js.map +1 -0
- package/dist/sdk/sdk-static-preflight-service.d.ts +66 -0
- package/dist/sdk/sdk-static-preflight-service.d.ts.map +1 -0
- package/dist/sdk/sdk-static-preflight-service.js +492 -0
- package/dist/sdk/sdk-static-preflight-service.js.map +1 -0
- package/dist/sdk/sdk-temporary-asset-service.d.ts +18 -0
- package/dist/sdk/sdk-temporary-asset-service.d.ts.map +1 -0
- package/dist/sdk/sdk-temporary-asset-service.js +33 -0
- package/dist/sdk/sdk-temporary-asset-service.js.map +1 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts +9 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.d.ts.map +1 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.js +65 -0
- package/dist/sdk/sdk-temporary-asset-upload-http-handler.js.map +1 -0
- package/dist/sdk/sdk-v1-handler-map.d.ts +44 -0
- package/dist/sdk/sdk-v1-handler-map.d.ts.map +1 -0
- package/dist/sdk/sdk-v1-handler-map.js +37 -0
- package/dist/sdk/sdk-v1-handler-map.js.map +1 -0
- package/dist/sdk/sdk-v1-service-error.d.ts +21 -0
- package/dist/sdk/sdk-v1-service-error.d.ts.map +1 -0
- package/dist/sdk/sdk-v1-service-error.js +62 -0
- package/dist/sdk/sdk-v1-service-error.js.map +1 -0
- package/dist/sdk/sdk-v1-service.d.ts +74 -0
- package/dist/sdk/sdk-v1-service.d.ts.map +1 -0
- package/dist/sdk/sdk-v1-service.js +219 -0
- package/dist/sdk/sdk-v1-service.js.map +1 -0
- package/dist/sdk/sdk-worker-readiness-adapter.d.ts +22 -0
- package/dist/sdk/sdk-worker-readiness-adapter.d.ts.map +1 -0
- package/dist/sdk/sdk-worker-readiness-adapter.js +29 -0
- package/dist/sdk/sdk-worker-readiness-adapter.js.map +1 -0
- package/dist/server.js +1019 -201
- package/dist/server.js.map +1 -1
- package/dist/session/asset-autosave.d.ts +80 -0
- package/dist/session/asset-autosave.d.ts.map +1 -0
- package/dist/session/asset-autosave.js +456 -0
- package/dist/session/asset-autosave.js.map +1 -0
- package/dist/session/chat-compaction.d.ts +107 -0
- package/dist/session/chat-compaction.d.ts.map +1 -0
- package/dist/session/chat-compaction.js +191 -0
- package/dist/session/chat-compaction.js.map +1 -0
- package/dist/session/chat-history.d.ts +75 -0
- package/dist/session/chat-history.d.ts.map +1 -0
- package/dist/session/chat-history.js +194 -0
- package/dist/session/chat-history.js.map +1 -0
- package/dist/session/chat-prompt.d.ts +45 -0
- package/dist/session/chat-prompt.d.ts.map +1 -0
- package/dist/session/chat-prompt.js +480 -0
- package/dist/session/chat-prompt.js.map +1 -0
- package/dist/session/chat-turn.d.ts +336 -0
- package/dist/session/chat-turn.d.ts.map +1 -0
- package/dist/session/chat-turn.js +3516 -0
- package/dist/session/chat-turn.js.map +1 -0
- package/dist/session/client-session.d.ts +59 -0
- package/dist/session/client-session.d.ts.map +1 -0
- package/dist/session/client-session.js +2 -0
- package/dist/session/client-session.js.map +1 -0
- package/dist/session/commands.d.ts +133 -0
- package/dist/session/commands.d.ts.map +1 -0
- package/dist/session/commands.js +778 -0
- package/dist/session/commands.js.map +1 -0
- package/dist/session/inference.d.ts +213 -0
- package/dist/session/inference.d.ts.map +1 -0
- package/dist/session/inference.js +1072 -0
- package/dist/session/inference.js.map +1 -0
- package/dist/session/job-execution.d.ts +477 -0
- package/dist/session/job-execution.d.ts.map +1 -0
- package/dist/session/job-execution.js +2089 -0
- package/dist/session/job-execution.js.map +1 -0
- package/dist/session/media-generation.d.ts +94 -0
- package/dist/session/media-generation.d.ts.map +1 -0
- package/dist/session/media-generation.js +234 -0
- package/dist/session/media-generation.js.map +1 -0
- package/dist/session/model-interfaces.d.ts +27 -0
- package/dist/session/model-interfaces.d.ts.map +1 -0
- package/dist/session/model-interfaces.js +132 -0
- package/dist/session/model-interfaces.js.map +1 -0
- package/dist/session/sanitize.d.ts +7 -0
- package/dist/session/sanitize.d.ts.map +1 -0
- package/dist/session/sanitize.js +64 -0
- package/dist/session/sanitize.js.map +1 -0
- package/dist/settings-registry.d.ts +6 -15
- package/dist/settings-registry.d.ts.map +1 -1
- package/dist/settings-registry.js +6 -103
- package/dist/settings-registry.js.map +1 -1
- package/dist/storage-api.d.ts +20 -0
- package/dist/storage-api.d.ts.map +1 -1
- package/dist/storage-api.js +260 -77
- package/dist/storage-api.js.map +1 -1
- package/dist/storage-retention.d.ts +9 -0
- package/dist/storage-retention.d.ts.map +1 -0
- package/dist/storage-retention.js +74 -0
- package/dist/storage-retention.js.map +1 -0
- package/dist/system-stats.d.ts +52 -0
- package/dist/system-stats.d.ts.map +1 -0
- package/dist/system-stats.js +134 -0
- package/dist/system-stats.js.map +1 -0
- package/dist/test-ui-server.d.ts +46 -0
- package/dist/test-ui-server.d.ts.map +1 -1
- package/dist/test-ui-server.js +188 -41
- package/dist/test-ui-server.js.map +1 -1
- package/dist/triggers/boot.d.ts +73 -0
- package/dist/triggers/boot.d.ts.map +1 -0
- package/dist/triggers/boot.js +149 -0
- package/dist/triggers/boot.js.map +1 -0
- package/dist/triggers/dispatcher.d.ts +234 -0
- package/dist/triggers/dispatcher.d.ts.map +1 -0
- package/dist/triggers/dispatcher.js +525 -0
- package/dist/triggers/dispatcher.js.map +1 -0
- package/dist/triggers/file-watch.d.ts +90 -0
- package/dist/triggers/file-watch.d.ts.map +1 -0
- package/dist/triggers/file-watch.js +405 -0
- package/dist/triggers/file-watch.js.map +1 -0
- package/dist/triggers/registration-sync.d.ts +34 -0
- package/dist/triggers/registration-sync.d.ts.map +1 -0
- package/dist/triggers/registration-sync.js +162 -0
- package/dist/triggers/registration-sync.js.map +1 -0
- package/dist/triggers/schedule-timing.d.ts +52 -0
- package/dist/triggers/schedule-timing.d.ts.map +1 -0
- package/dist/triggers/schedule-timing.js +90 -0
- package/dist/triggers/schedule-timing.js.map +1 -0
- package/dist/triggers/scheduler.d.ts +55 -0
- package/dist/triggers/scheduler.d.ts.map +1 -0
- package/dist/triggers/scheduler.js +122 -0
- package/dist/triggers/scheduler.js.map +1 -0
- package/dist/triggers/settle.d.ts +66 -0
- package/dist/triggers/settle.d.ts.map +1 -0
- package/dist/triggers/settle.js +99 -0
- package/dist/triggers/settle.js.map +1 -0
- package/dist/triggers/stores.d.ts +38 -0
- package/dist/triggers/stores.d.ts.map +1 -0
- package/dist/triggers/stores.js +168 -0
- package/dist/triggers/stores.js.map +1 -0
- package/dist/triggers/webhook-route.d.ts +49 -0
- package/dist/triggers/webhook-route.d.ts.map +1 -0
- package/dist/triggers/webhook-route.js +148 -0
- package/dist/triggers/webhook-route.js.map +1 -0
- package/dist/trpc/context.d.ts +52 -5
- package/dist/trpc/context.d.ts.map +1 -1
- package/dist/trpc/context.js +4 -1
- package/dist/trpc/context.js.map +1 -1
- package/dist/trpc/error-formatter.d.ts.map +1 -1
- package/dist/trpc/error-formatter.js +23 -2
- package/dist/trpc/error-formatter.js.map +1 -1
- package/dist/trpc/error-logging.d.ts +14 -0
- package/dist/trpc/error-logging.d.ts.map +1 -0
- package/dist/trpc/error-logging.js +27 -0
- package/dist/trpc/error-logging.js.map +1 -0
- package/dist/trpc/index.d.ts +2 -2
- package/dist/trpc/index.d.ts.map +1 -1
- package/dist/trpc/index.js +0 -2
- package/dist/trpc/index.js.map +1 -1
- package/dist/trpc/middleware.d.ts +6 -3
- package/dist/trpc/middleware.d.ts.map +1 -1
- package/dist/trpc/router.d.ts +29791 -1303
- package/dist/trpc/router.d.ts.map +1 -1
- package/dist/trpc/router.js +46 -3
- package/dist/trpc/router.js.map +1 -1
- package/dist/trpc/routers/agent-access.d.ts +149 -0
- package/dist/trpc/routers/agent-access.d.ts.map +1 -0
- package/dist/trpc/routers/agent-access.js +224 -0
- package/dist/trpc/routers/agent-access.js.map +1 -0
- package/dist/trpc/routers/applications.d.ts +1117 -0
- package/dist/trpc/routers/applications.d.ts.map +1 -0
- package/dist/trpc/routers/applications.js +218 -0
- package/dist/trpc/routers/applications.js.map +1 -0
- package/dist/trpc/routers/assets.d.ts +184 -42
- package/dist/trpc/routers/assets.d.ts.map +1 -1
- package/dist/trpc/routers/assets.js +499 -105
- package/dist/trpc/routers/assets.js.map +1 -1
- package/dist/trpc/routers/code-gen.d.ts +99 -0
- package/dist/trpc/routers/code-gen.d.ts.map +1 -0
- package/dist/trpc/routers/code-gen.js +164 -0
- package/dist/trpc/routers/code-gen.js.map +1 -0
- package/dist/trpc/routers/collections.d.ts +1 -26
- package/dist/trpc/routers/collections.d.ts.map +1 -1
- package/dist/trpc/routers/collections.js +145 -78
- package/dist/trpc/routers/collections.js.map +1 -1
- package/dist/trpc/routers/costs.d.ts +40 -96
- package/dist/trpc/routers/costs.d.ts.map +1 -1
- package/dist/trpc/routers/costs.js +14 -89
- package/dist/trpc/routers/costs.js.map +1 -1
- package/dist/trpc/routers/credits.d.ts +110 -0
- package/dist/trpc/routers/credits.d.ts.map +1 -0
- package/dist/trpc/routers/credits.js +69 -0
- package/dist/trpc/routers/credits.js.map +1 -0
- package/dist/trpc/routers/custom-providers.d.ts +88 -0
- package/dist/trpc/routers/custom-providers.d.ts.map +1 -0
- package/dist/trpc/routers/custom-providers.js +140 -0
- package/dist/trpc/routers/custom-providers.js.map +1 -0
- package/dist/trpc/routers/documents.d.ts +61 -0
- package/dist/trpc/routers/documents.d.ts.map +1 -0
- package/dist/trpc/routers/documents.js +23 -0
- package/dist/trpc/routers/documents.js.map +1 -0
- package/dist/trpc/routers/extension.d.ts +24 -0
- package/dist/trpc/routers/extension.d.ts.map +1 -0
- package/dist/trpc/routers/extension.js +28 -0
- package/dist/trpc/routers/extension.js.map +1 -0
- package/dist/trpc/routers/external-mcp.d.ts +108 -0
- package/dist/trpc/routers/external-mcp.d.ts.map +1 -0
- package/dist/trpc/routers/external-mcp.js +70 -0
- package/dist/trpc/routers/external-mcp.js.map +1 -0
- package/dist/trpc/routers/files.d.ts +9 -2
- package/dist/trpc/routers/files.d.ts.map +1 -1
- package/dist/trpc/routers/files.js +67 -37
- package/dist/trpc/routers/files.js.map +1 -1
- package/dist/trpc/routers/fonts.d.ts +30 -0
- package/dist/trpc/routers/fonts.d.ts.map +1 -0
- package/dist/trpc/routers/fonts.js +112 -0
- package/dist/trpc/routers/fonts.js.map +1 -0
- package/dist/trpc/routers/games.d.ts +7610 -0
- package/dist/trpc/routers/games.d.ts.map +1 -0
- package/dist/trpc/routers/games.js +456 -0
- package/dist/trpc/routers/games.js.map +1 -0
- package/dist/trpc/routers/integrations.d.ts +86 -0
- package/dist/trpc/routers/integrations.d.ts.map +1 -0
- package/dist/trpc/routers/integrations.js +129 -0
- package/dist/trpc/routers/integrations.js.map +1 -0
- package/dist/trpc/routers/jobs.d.ts +88 -27
- package/dist/trpc/routers/jobs.d.ts.map +1 -1
- package/dist/trpc/routers/jobs.js +113 -35
- package/dist/trpc/routers/jobs.js.map +1 -1
- package/dist/trpc/routers/js-scripts.d.ts +410 -0
- package/dist/trpc/routers/js-scripts.d.ts.map +1 -0
- package/dist/trpc/routers/js-scripts.js +303 -0
- package/dist/trpc/routers/js-scripts.js.map +1 -0
- package/dist/trpc/routers/mcp-config.d.ts +1 -1
- package/dist/trpc/routers/mcp-config.js +5 -3
- package/dist/trpc/routers/mcp-config.js.map +1 -1
- package/dist/trpc/routers/memories.d.ts +79 -0
- package/dist/trpc/routers/memories.d.ts.map +1 -0
- package/dist/trpc/routers/memories.js +66 -0
- package/dist/trpc/routers/memories.js.map +1 -0
- package/dist/trpc/routers/messages.d.ts +4 -77
- package/dist/trpc/routers/messages.d.ts.map +1 -1
- package/dist/trpc/routers/messages.js +9 -58
- package/dist/trpc/routers/messages.js.map +1 -1
- package/dist/trpc/routers/models.d.ts +1403 -238
- package/dist/trpc/routers/models.d.ts.map +1 -1
- package/dist/trpc/routers/models.js +532 -294
- package/dist/trpc/routers/models.js.map +1 -1
- package/dist/trpc/routers/nodes.d.ts +32 -16
- package/dist/trpc/routers/nodes.d.ts.map +1 -1
- package/dist/trpc/routers/nodes.js +70 -31
- package/dist/trpc/routers/nodes.js.map +1 -1
- package/dist/trpc/routers/packs.d.ts +184 -0
- package/dist/trpc/routers/packs.d.ts.map +1 -0
- package/dist/trpc/routers/packs.js +259 -0
- package/dist/trpc/routers/packs.js.map +1 -0
- package/dist/trpc/routers/projects.d.ts +422 -0
- package/dist/trpc/routers/projects.d.ts.map +1 -0
- package/dist/trpc/routers/projects.js +373 -0
- package/dist/trpc/routers/projects.js.map +1 -0
- package/dist/trpc/routers/resources.d.ts +120 -0
- package/dist/trpc/routers/resources.d.ts.map +1 -0
- package/dist/trpc/routers/resources.js +212 -0
- package/dist/trpc/routers/resources.js.map +1 -0
- package/dist/trpc/routers/scripts.d.ts +1116 -0
- package/dist/trpc/routers/scripts.d.ts.map +1 -0
- package/dist/trpc/routers/scripts.js +131 -0
- package/dist/trpc/routers/scripts.js.map +1 -0
- package/dist/trpc/routers/segmentation.d.ts +62 -0
- package/dist/trpc/routers/segmentation.d.ts.map +1 -0
- package/dist/trpc/routers/segmentation.js +146 -0
- package/dist/trpc/routers/segmentation.js.map +1 -0
- package/dist/trpc/routers/settings.d.ts +177 -10
- package/dist/trpc/routers/settings.d.ts.map +1 -1
- package/dist/trpc/routers/settings.js +123 -33
- package/dist/trpc/routers/settings.js.map +1 -1
- package/dist/trpc/routers/sketch.d.ts +854 -0
- package/dist/trpc/routers/sketch.d.ts.map +1 -0
- package/dist/trpc/routers/sketch.js +617 -0
- package/dist/trpc/routers/sketch.js.map +1 -0
- package/dist/trpc/routers/skills.d.ts +76 -22
- package/dist/trpc/routers/skills.d.ts.map +1 -1
- package/dist/trpc/routers/skills.js +195 -170
- package/dist/trpc/routers/skills.js.map +1 -1
- package/dist/trpc/routers/storage.d.ts +3 -30
- package/dist/trpc/routers/storage.d.ts.map +1 -1
- package/dist/trpc/routers/storage.js +60 -117
- package/dist/trpc/routers/storage.js.map +1 -1
- package/dist/trpc/routers/storyboards.d.ts +5907 -0
- package/dist/trpc/routers/storyboards.d.ts.map +1 -0
- package/dist/trpc/routers/storyboards.js +156 -0
- package/dist/trpc/routers/storyboards.js.map +1 -0
- package/dist/trpc/routers/threads.d.ts +33 -21
- package/dist/trpc/routers/threads.d.ts.map +1 -1
- package/dist/trpc/routers/threads.js +36 -30
- package/dist/trpc/routers/threads.js.map +1 -1
- package/dist/trpc/routers/timeline.d.ts +8516 -0
- package/dist/trpc/routers/timeline.d.ts.map +1 -0
- package/dist/trpc/routers/timeline.js +493 -0
- package/dist/trpc/routers/timeline.js.map +1 -0
- package/dist/trpc/routers/triggers.d.ts +46 -0
- package/dist/trpc/routers/triggers.d.ts.map +1 -0
- package/dist/trpc/routers/triggers.js +117 -0
- package/dist/trpc/routers/triggers.js.map +1 -0
- package/dist/trpc/routers/users.d.ts +1 -14
- package/dist/trpc/routers/users.d.ts.map +1 -1
- package/dist/trpc/routers/users.js +1 -12
- package/dist/trpc/routers/users.js.map +1 -1
- package/dist/trpc/routers/worker.d.ts +242 -0
- package/dist/trpc/routers/worker.d.ts.map +1 -0
- package/dist/trpc/routers/worker.js +220 -0
- package/dist/trpc/routers/worker.js.map +1 -0
- package/dist/trpc/routers/workflows.d.ts +385 -197
- package/dist/trpc/routers/workflows.d.ts.map +1 -1
- package/dist/trpc/routers/workflows.js +326 -345
- package/dist/trpc/routers/workflows.js.map +1 -1
- package/dist/trpc/routers/workspace.d.ts +59 -33
- package/dist/trpc/routers/workspace.d.ts.map +1 -1
- package/dist/trpc/routers/workspace.js +230 -93
- package/dist/trpc/routers/workspace.js.map +1 -1
- package/dist/trpc/sandbox-coverage.d.ts +64 -0
- package/dist/trpc/sandbox-coverage.d.ts.map +1 -0
- package/dist/trpc/sandbox-coverage.js +1049 -0
- package/dist/trpc/sandbox-coverage.js.map +1 -0
- package/dist/websocket-client-session.d.ts +320 -0
- package/dist/websocket-client-session.d.ts.map +1 -0
- package/dist/websocket-client-session.js +1253 -0
- package/dist/websocket-client-session.js.map +1 -0
- package/dist/workflow-interface-service.d.ts +87 -0
- package/dist/workflow-interface-service.d.ts.map +1 -0
- package/dist/workflow-interface-service.js +131 -0
- package/dist/workflow-interface-service.js.map +1 -0
- package/dist/workspace-api.d.ts.map +1 -1
- package/dist/workspace-api.js +33 -23
- package/dist/workspace-api.js.map +1 -1
- package/dist/ws-adapter.d.ts +46 -3
- package/dist/ws-adapter.d.ts.map +1 -1
- package/dist/ws-adapter.js +164 -26
- package/dist/ws-adapter.js.map +1 -1
- package/package.json +81 -35
- package/dist/agent/agent-runtime.d.ts +0 -47
- package/dist/agent/agent-runtime.d.ts.map +0 -1
- package/dist/agent/agent-runtime.js +0 -579
- package/dist/agent/agent-runtime.js.map +0 -1
- package/dist/agent/codex-agent.d.ts +0 -41
- package/dist/agent/codex-agent.d.ts.map +0 -1
- package/dist/agent/codex-agent.js +0 -334
- package/dist/agent/codex-agent.js.map +0 -1
- package/dist/agent/index.d.ts +0 -6
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js +0 -4
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/llm-agent.d.ts +0 -51
- package/dist/agent/llm-agent.d.ts.map +0 -1
- package/dist/agent/llm-agent.js +0 -526
- package/dist/agent/llm-agent.js.map +0 -1
- package/dist/agent/mcp-tool-server.d.ts +0 -33
- package/dist/agent/mcp-tool-server.d.ts.map +0 -1
- package/dist/agent/mcp-tool-server.js +0 -292
- package/dist/agent/mcp-tool-server.js.map +0 -1
- package/dist/agent/opencode-agent.d.ts +0 -32
- package/dist/agent/opencode-agent.d.ts.map +0 -1
- package/dist/agent/opencode-agent.js +0 -332
- package/dist/agent/opencode-agent.js.map +0 -1
- package/dist/agent/pi-agent.d.ts +0 -42
- package/dist/agent/pi-agent.d.ts.map +0 -1
- package/dist/agent/pi-agent.js +0 -429
- package/dist/agent/pi-agent.js.map +0 -1
- package/dist/agent/sdk-provider.d.ts +0 -46
- package/dist/agent/sdk-provider.d.ts.map +0 -1
- package/dist/agent/sdk-provider.js +0 -50
- package/dist/agent/sdk-provider.js.map +0 -1
- package/dist/agent/socket-route.d.ts +0 -11
- package/dist/agent/socket-route.d.ts.map +0 -1
- package/dist/agent/socket-route.js +0 -262
- package/dist/agent/socket-route.js.map +0 -1
- package/dist/agent/transport.d.ts +0 -39
- package/dist/agent/transport.d.ts.map +0 -1
- package/dist/agent/transport.js +0 -17
- package/dist/agent/transport.js.map +0 -1
- package/dist/agent/types.d.ts +0 -11
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/agent/types.js +0 -10
- package/dist/agent/types.js.map +0 -1
- package/dist/routes/jobs.d.ts +0 -16
- package/dist/routes/jobs.d.ts.map +0 -1
- package/dist/routes/jobs.js +0 -25
- package/dist/routes/jobs.js.map +0 -1
- package/dist/trpc/routers/sandboxes.d.ts +0 -64
- package/dist/trpc/routers/sandboxes.d.ts.map +0 -1
- package/dist/trpc/routers/sandboxes.js +0 -327
- package/dist/trpc/routers/sandboxes.js.map +0 -1
- package/dist/unified-websocket-runner.d.ts +0 -280
- package/dist/unified-websocket-runner.d.ts.map +0 -1
- package/dist/unified-websocket-runner.js +0 -3840
- package/dist/unified-websocket-runner.js.map +0 -1
package/dist/mcp-server.js
CHANGED
|
@@ -1,796 +1,246 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP (Model Context Protocol) server for NodeTool.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The mount exposes the CodeAct action, direct image/discovery tools, and
|
|
5
|
+
* renderer steering tools on the CodeAct belt. A connected editor is reached
|
|
6
|
+
* through the shared `/ws` renderer registry.
|
|
6
7
|
*/
|
|
7
8
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
10
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
8
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
12
|
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
10
|
-
import {
|
|
13
|
+
import { MCP_GUEST_CONTRACT } from "@nodetool-ai/agents";
|
|
11
14
|
import { createLogger } from "@nodetool-ai/config";
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
import { registerKieNodes } from "@nodetool-ai/kie-nodes";
|
|
21
|
-
import { registerReplicateNodes } from "@nodetool-ai/replicate-nodes";
|
|
22
|
-
import { PythonNodeExecutor, PythonStdioBridge } from "@nodetool-ai/runtime";
|
|
23
|
-
import { WorkflowRunner } from "@nodetool-ai/kernel";
|
|
15
|
+
import { registerAgentMcpTools } from "./mcp-agent-tools.js";
|
|
16
|
+
/**
|
|
17
|
+
* Refusal message for a session that cannot be bound to a user. Names the fix,
|
|
18
|
+
* because the caller cannot see which mount answered them.
|
|
19
|
+
*/
|
|
20
|
+
export const MCP_SCOPE_REQUIRED_MESSAGE = "NodeTool MCP sessions must be bound to a user. This mount could not " +
|
|
21
|
+
"authenticate one. Fix: sign in so the mount can bind the session's user id, " +
|
|
22
|
+
"or run `nodetool mcp serve` for a single-user stdio mount.";
|
|
24
23
|
const log = createLogger("nodetool.websocket.mcp-server");
|
|
25
|
-
const GLOBAL_FRONTEND_SESSION_ID = "global-mcp";
|
|
26
|
-
let activeFrontendTransport = null;
|
|
27
|
-
let runtimeEnvironmentPromise = null;
|
|
28
|
-
async function getUnifiedNodeMetadata(options) {
|
|
29
|
-
if (options?.registry) {
|
|
30
|
-
return options.registry
|
|
31
|
-
.listMetadata()
|
|
32
|
-
.sort((a, b) => a.node_type.localeCompare(b.node_type));
|
|
33
|
-
}
|
|
34
|
-
const runtime = await getRuntimeEnvironment(options);
|
|
35
|
-
return runtime.registry
|
|
36
|
-
.listMetadata()
|
|
37
|
-
.sort((a, b) => a.node_type.localeCompare(b.node_type));
|
|
38
|
-
}
|
|
39
|
-
function getRuntimeEnvironment(options) {
|
|
40
|
-
if (!runtimeEnvironmentPromise) {
|
|
41
|
-
runtimeEnvironmentPromise = (async () => {
|
|
42
|
-
const registry = new NodeRegistry();
|
|
43
|
-
registry.loadPythonMetadata({
|
|
44
|
-
roots: options?.metadataRoots,
|
|
45
|
-
maxDepth: options?.metadataMaxDepth ?? 8
|
|
46
|
-
});
|
|
47
|
-
registerBaseNodes(registry);
|
|
48
|
-
registerElevenLabsNodes(registry);
|
|
49
|
-
registerTransformersJsNodes(registry);
|
|
50
|
-
registerFalNodes(registry);
|
|
51
|
-
registerKieNodes(registry);
|
|
52
|
-
registerReplicateNodes(registry);
|
|
53
|
-
const pythonBridge = new PythonStdioBridge({
|
|
54
|
-
workerArgs: process.env["NODETOOL_WORKER_NAMESPACES"]
|
|
55
|
-
? ["--namespaces", process.env["NODETOOL_WORKER_NAMESPACES"]]
|
|
56
|
-
: []
|
|
57
|
-
});
|
|
58
|
-
const logPythonBridgeDiagnostics = (context) => {
|
|
59
|
-
const loadErrors = pythonBridge.getLoadErrors?.() ?? [];
|
|
60
|
-
if (loadErrors.length === 0)
|
|
61
|
-
return;
|
|
62
|
-
log.warn(`MCP Python bridge ${context} with ${loadErrors.length} load error(s)`);
|
|
63
|
-
for (const entry of loadErrors.slice(0, 10)) {
|
|
64
|
-
log.warn(`[python-worker][load-error] ${entry.module} (${entry.phase}): ${entry.error}`);
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
let pythonBridgeReady = false;
|
|
68
|
-
pythonBridge.on("stderr", (msg) => {
|
|
69
|
-
for (const line of msg.split("\n")) {
|
|
70
|
-
if (line.trim())
|
|
71
|
-
log.debug(`[python-worker] ${line}`);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
pythonBridge.on("exit", (code) => {
|
|
75
|
-
log.warn(`MCP Python worker exited with code ${code}`);
|
|
76
|
-
pythonBridgeReady = false;
|
|
77
|
-
});
|
|
78
|
-
const ensurePythonBridge = async () => {
|
|
79
|
-
log.info("MCP lazily starting Python bridge");
|
|
80
|
-
try {
|
|
81
|
-
await pythonBridge.ensureConnected();
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
log.warn("MCP Python bridge lazy start failed", err instanceof Error ? err : new Error(String(err)));
|
|
85
|
-
throw err;
|
|
86
|
-
}
|
|
87
|
-
pythonBridgeReady = true;
|
|
88
|
-
log.info("MCP Python bridge lazy start completed");
|
|
89
|
-
const meta = pythonBridge.getNodeMetadata();
|
|
90
|
-
log.info(`MCP Python bridge connected — ${meta.length} Python nodes`);
|
|
91
|
-
pythonBridge
|
|
92
|
-
.getWorkerStatus?.()
|
|
93
|
-
?.then((status) => {
|
|
94
|
-
log.info("MCP Python bridge status", {
|
|
95
|
-
protocol_version: status.protocol_version,
|
|
96
|
-
node_count: status.node_count,
|
|
97
|
-
provider_count: status.provider_count,
|
|
98
|
-
namespaces: status.namespaces,
|
|
99
|
-
transport: status.transport,
|
|
100
|
-
max_frame_size: status.max_frame_size,
|
|
101
|
-
load_error_count: status.load_errors.length
|
|
102
|
-
});
|
|
103
|
-
})
|
|
104
|
-
.catch((err) => {
|
|
105
|
-
log.warn("MCP failed to fetch Python bridge status", err instanceof Error ? err : new Error(String(err)));
|
|
106
|
-
});
|
|
107
|
-
logPythonBridgeDiagnostics("connected");
|
|
108
|
-
};
|
|
109
|
-
const resolveExecutor = (node) => {
|
|
110
|
-
if (registry.has(node.type)) {
|
|
111
|
-
return registry.resolve(node);
|
|
112
|
-
}
|
|
113
|
-
if (pythonBridgeReady && pythonBridge.hasNodeType(node.type)) {
|
|
114
|
-
const meta = pythonBridge
|
|
115
|
-
.getNodeMetadata()
|
|
116
|
-
.find((n) => n.node_type === node.type);
|
|
117
|
-
const nodeRec = node;
|
|
118
|
-
const props = (nodeRec.properties ?? nodeRec.data ?? {});
|
|
119
|
-
return new PythonNodeExecutor(pythonBridge, node.type, props, Object.fromEntries((meta?.outputs ?? []).map((o) => [o.name, o.type.type])), meta?.required_settings ?? []);
|
|
120
|
-
}
|
|
121
|
-
if (registry.getMetadata(node.type) && !registry.has(node.type)) {
|
|
122
|
-
const stderrSummary = pythonBridge.getRecentStderrSummary?.() ?? null;
|
|
123
|
-
const loadErrors = pythonBridge.getLoadErrors?.() ?? [];
|
|
124
|
-
const matchingLoadError = loadErrors.find((entry) => entry.module.includes(node.type) ||
|
|
125
|
-
node.type.startsWith(entry.module.split(".").slice(2).join(".")));
|
|
126
|
-
throw new Error(pythonBridgeReady
|
|
127
|
-
? `Python node "${node.type}" cannot execute: it is declared in metadata but was not loaded by the Python worker.${matchingLoadError ? ` Load error: ${matchingLoadError.module}: ${matchingLoadError.error}.` : stderrSummary ? ` Recent Python worker stderr: ${stderrSummary}` : " Check Python worker status/load errors for import failures."}`
|
|
128
|
-
: `Python node "${node.type}" cannot execute: Python worker is not connected.${stderrSummary ? ` Recent Python worker stderr: ${stderrSummary}` : ""}`);
|
|
129
|
-
}
|
|
130
|
-
return registry.resolve(node);
|
|
131
|
-
};
|
|
132
|
-
return {
|
|
133
|
-
registry,
|
|
134
|
-
pythonBridge,
|
|
135
|
-
ensurePythonBridge,
|
|
136
|
-
resolveExecutor
|
|
137
|
-
};
|
|
138
|
-
})();
|
|
139
|
-
}
|
|
140
|
-
return runtimeEnvironmentPromise;
|
|
141
|
-
}
|
|
142
24
|
/**
|
|
143
|
-
* Create a configured MCP server
|
|
25
|
+
* Create a configured MCP server: `execute_code`, `view_image`, the
|
|
26
|
+
* capabilities and sandbox resources, and the guest-contract instructions.
|
|
27
|
+
*
|
|
28
|
+
* Throws when `agentToolsScope` is missing — a session with no user binding
|
|
29
|
+
* would hold zero tools, which is a server that answers and cannot act.
|
|
144
30
|
*/
|
|
145
31
|
export function createMcpServer(options) {
|
|
32
|
+
if (!options?.agentToolsScope) {
|
|
33
|
+
throw new Error(MCP_SCOPE_REQUIRED_MESSAGE);
|
|
34
|
+
}
|
|
146
35
|
const server = new McpServer({
|
|
147
36
|
name: "NodeTool API Server",
|
|
148
37
|
version: "1.0.0"
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
try {
|
|
167
|
-
const result = await transport.executeTool(GLOBAL_FRONTEND_SESSION_ID, `mcp-ui-${toolName}-${crypto.randomUUID()}`, toolName, args);
|
|
168
|
-
return {
|
|
169
|
-
content: [
|
|
170
|
-
{
|
|
171
|
-
type: "text",
|
|
172
|
-
text: typeof result === "string"
|
|
173
|
-
? result
|
|
174
|
-
: JSON.stringify(result ?? null)
|
|
175
|
-
}
|
|
176
|
-
]
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
return {
|
|
181
|
-
content: [
|
|
182
|
-
{
|
|
183
|
-
type: "text",
|
|
184
|
-
text: JSON.stringify({ error: String(err) })
|
|
185
|
-
}
|
|
186
|
-
],
|
|
187
|
-
isError: true
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
});
|
|
38
|
+
}, { instructions: MCP_GUEST_CONTRACT });
|
|
39
|
+
registerAgentMcpTools(server, options);
|
|
40
|
+
return server;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a stdio transport for CLI mode.
|
|
44
|
+
*/
|
|
45
|
+
export function createMcpStdioTransport() {
|
|
46
|
+
return new StdioServerTransport();
|
|
47
|
+
}
|
|
48
|
+
/** Connect stdio to the local API process when its MCP mount is available. */
|
|
49
|
+
export async function forwardMcpStdioToLocalServer(url = getLocalMcpServerUrl(), stdio = createMcpStdioTransport()) {
|
|
50
|
+
const endpoint = new URL(url);
|
|
51
|
+
if (endpoint.hostname !== "127.0.0.1" && endpoint.hostname !== "localhost") {
|
|
52
|
+
throw new Error("The stdio MCP forwarder only connects to loopback");
|
|
191
53
|
}
|
|
192
|
-
//
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}, async ({ limit, user_id }) => {
|
|
201
|
-
try {
|
|
202
|
-
const [workflows, next] = await Workflow.paginate(user_id, { limit });
|
|
203
|
-
return {
|
|
204
|
-
content: [
|
|
205
|
-
{
|
|
206
|
-
type: "text",
|
|
207
|
-
text: JSON.stringify({
|
|
208
|
-
workflows: workflows.map((workflow) => toWorkflowResponse(workflow)),
|
|
209
|
-
next: next || null
|
|
210
|
-
})
|
|
211
|
-
}
|
|
212
|
-
]
|
|
213
|
-
};
|
|
54
|
+
// An MCP handshake proves that the port belongs to a reachable NodeTool MCP
|
|
55
|
+
// mount. A health check alone could select an unrelated process on this port.
|
|
56
|
+
const probe = new Client({ name: "nodetool-mcp-probe", version: "1.0.0" });
|
|
57
|
+
const probeTransport = new StreamableHTTPClientTransport(endpoint);
|
|
58
|
+
try {
|
|
59
|
+
await probe.connect(probeTransport, { timeout: 5000 });
|
|
60
|
+
if (probe.getServerVersion()?.name !== "NodeTool API Server") {
|
|
61
|
+
return false;
|
|
214
62
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
],
|
|
223
|
-
isError: true
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
server.tool("get_workflow", "Get detailed information about a specific workflow.", {
|
|
228
|
-
workflow_id: z.string().describe("The workflow ID"),
|
|
229
|
-
user_id: z.string().optional().default("1").describe("User ID")
|
|
230
|
-
}, async ({ workflow_id, user_id }) => {
|
|
231
|
-
try {
|
|
232
|
-
const workflow = await Workflow.find(user_id, workflow_id);
|
|
233
|
-
if (!workflow) {
|
|
234
|
-
return {
|
|
235
|
-
content: [
|
|
236
|
-
{
|
|
237
|
-
type: "text",
|
|
238
|
-
text: JSON.stringify({ error: "Workflow not found" })
|
|
239
|
-
}
|
|
240
|
-
],
|
|
241
|
-
isError: true
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
return {
|
|
245
|
-
content: [
|
|
246
|
-
{
|
|
247
|
-
type: "text",
|
|
248
|
-
text: JSON.stringify(toWorkflowResponse(workflow))
|
|
249
|
-
}
|
|
250
|
-
]
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
catch (err) {
|
|
254
|
-
return {
|
|
255
|
-
content: [
|
|
256
|
-
{
|
|
257
|
-
type: "text",
|
|
258
|
-
text: JSON.stringify({ error: String(err) })
|
|
259
|
-
}
|
|
260
|
-
],
|
|
261
|
-
isError: true
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
server.tool("run_workflow", "Run a workflow on the backend, optionally passing parameters.", {
|
|
266
|
-
workflow_id: z.string().describe("Workflow id to target."),
|
|
267
|
-
params: z
|
|
268
|
-
.record(z.string(), z.unknown())
|
|
269
|
-
.optional()
|
|
270
|
-
.default({})
|
|
271
|
-
.describe("Optional workflow run parameters."),
|
|
272
|
-
user_id: z.string().optional().default("1").describe("User ID")
|
|
273
|
-
}, async ({ workflow_id, params, user_id }) => {
|
|
274
|
-
try {
|
|
275
|
-
const workflow = await Workflow.find(user_id, workflow_id);
|
|
276
|
-
if (!workflow) {
|
|
277
|
-
return {
|
|
278
|
-
content: [
|
|
279
|
-
{
|
|
280
|
-
type: "text",
|
|
281
|
-
text: JSON.stringify({ error: "Workflow not found" })
|
|
282
|
-
}
|
|
283
|
-
],
|
|
284
|
-
isError: true
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
const runMode = workflow.run_mode ?? "workflow";
|
|
288
|
-
if (runMode !== "workflow") {
|
|
289
|
-
return {
|
|
290
|
-
content: [
|
|
291
|
-
{
|
|
292
|
-
type: "text",
|
|
293
|
-
text: JSON.stringify({
|
|
294
|
-
error: `Workflow run mode "${runMode}" is not supported by the backend MCP runner.`
|
|
295
|
-
})
|
|
296
|
-
}
|
|
297
|
-
],
|
|
298
|
-
isError: true
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
const graph = workflow.getGraph();
|
|
302
|
-
const runnableGraph = {
|
|
303
|
-
nodes: graph.nodes.map((node) => {
|
|
304
|
-
const record = node;
|
|
305
|
-
return {
|
|
306
|
-
...record,
|
|
307
|
-
id: String(record.id ?? ""),
|
|
308
|
-
type: String(record.type ?? ""),
|
|
309
|
-
properties: (record.properties ?? record.data ?? {})
|
|
310
|
-
};
|
|
311
|
-
}),
|
|
312
|
-
edges: graph.edges.map((edge) => {
|
|
313
|
-
const record = edge;
|
|
314
|
-
return {
|
|
315
|
-
...record,
|
|
316
|
-
id: typeof record.id === "string" || record.id == null
|
|
317
|
-
? record.id
|
|
318
|
-
: String(record.id),
|
|
319
|
-
source: String(record.source ?? ""),
|
|
320
|
-
target: String(record.target ?? ""),
|
|
321
|
-
sourceHandle: String(record.sourceHandle ?? ""),
|
|
322
|
-
targetHandle: String(record.targetHandle ?? ""),
|
|
323
|
-
edge_type: record.edge_type === "control" ? "control" : "data"
|
|
324
|
-
};
|
|
325
|
-
})
|
|
326
|
-
};
|
|
327
|
-
const runtime = await getRuntimeEnvironment(options);
|
|
328
|
-
const hasPythonNode = runnableGraph.nodes.some((node) => {
|
|
329
|
-
const nodeType = typeof node.type === "string" ? node.type : "";
|
|
330
|
-
return (nodeType !== "" &&
|
|
331
|
-
Boolean(runtime.registry.getMetadata(nodeType)) &&
|
|
332
|
-
!runtime.registry.has(nodeType));
|
|
333
|
-
});
|
|
334
|
-
if (hasPythonNode) {
|
|
335
|
-
await runtime.ensurePythonBridge();
|
|
336
|
-
}
|
|
337
|
-
const job = await Job.create({
|
|
338
|
-
workflow_id,
|
|
339
|
-
user_id,
|
|
340
|
-
status: "running",
|
|
341
|
-
params,
|
|
342
|
-
graph: runnableGraph
|
|
343
|
-
});
|
|
344
|
-
const runner = new WorkflowRunner(job.id, {
|
|
345
|
-
resolveExecutor: (node) => runtime.resolveExecutor(node)
|
|
346
|
-
});
|
|
347
|
-
const result = await runner.run({ job_id: job.id, workflow_id, params }, runnableGraph);
|
|
348
|
-
if (result.status === "completed") {
|
|
349
|
-
job.markCompleted();
|
|
350
|
-
}
|
|
351
|
-
else if (result.status === "cancelled") {
|
|
352
|
-
job.markCancelled();
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
job.markFailed(result.error ?? "Workflow run failed");
|
|
356
|
-
}
|
|
357
|
-
await job.save();
|
|
358
|
-
return {
|
|
359
|
-
content: [
|
|
360
|
-
{
|
|
361
|
-
type: "text",
|
|
362
|
-
text: JSON.stringify({
|
|
363
|
-
job_id: job.id,
|
|
364
|
-
workflow_id,
|
|
365
|
-
status: result.status,
|
|
366
|
-
outputs: result.outputs,
|
|
367
|
-
error: result.error ?? null,
|
|
368
|
-
message_count: result.messages.length,
|
|
369
|
-
background: false
|
|
370
|
-
})
|
|
371
|
-
}
|
|
372
|
-
]
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
catch (err) {
|
|
376
|
-
return {
|
|
377
|
-
content: [
|
|
378
|
-
{
|
|
379
|
-
type: "text",
|
|
380
|
-
text: JSON.stringify({ error: String(err) })
|
|
381
|
-
}
|
|
382
|
-
],
|
|
383
|
-
isError: true
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
// ── Asset tools ─────────────────────────────────────────────────
|
|
388
|
-
server.tool("list_assets", "List or search assets with flexible filtering options.", {
|
|
389
|
-
parent_id: z.string().optional().describe("Filter by parent asset ID"),
|
|
390
|
-
content_type: z.string().optional().describe("Filter by content type"),
|
|
391
|
-
limit: z
|
|
392
|
-
.number()
|
|
393
|
-
.optional()
|
|
394
|
-
.default(100)
|
|
395
|
-
.describe("Maximum number of assets to return"),
|
|
396
|
-
user_id: z.string().optional().default("1").describe("User ID")
|
|
397
|
-
}, async ({ parent_id, content_type, limit, user_id }) => {
|
|
398
|
-
try {
|
|
399
|
-
const opts = { limit };
|
|
400
|
-
if (parent_id)
|
|
401
|
-
opts.parentId = parent_id;
|
|
402
|
-
if (content_type)
|
|
403
|
-
opts.contentType = content_type;
|
|
404
|
-
const [assets, next] = await Asset.paginate(user_id, opts);
|
|
405
|
-
return {
|
|
406
|
-
content: [
|
|
407
|
-
{
|
|
408
|
-
type: "text",
|
|
409
|
-
text: JSON.stringify({
|
|
410
|
-
assets: assets.map((asset) => toAssetResponse(asset)),
|
|
411
|
-
next: next || null
|
|
412
|
-
})
|
|
413
|
-
}
|
|
414
|
-
]
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
catch (err) {
|
|
418
|
-
return {
|
|
419
|
-
content: [
|
|
420
|
-
{
|
|
421
|
-
type: "text",
|
|
422
|
-
text: JSON.stringify({ error: String(err) })
|
|
423
|
-
}
|
|
424
|
-
],
|
|
425
|
-
isError: true
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
});
|
|
429
|
-
server.tool("get_asset", "Get detailed information about a specific asset.", {
|
|
430
|
-
asset_id: z.string().describe("The asset ID"),
|
|
431
|
-
user_id: z.string().optional().default("1").describe("User ID")
|
|
432
|
-
}, async ({ asset_id, user_id }) => {
|
|
433
|
-
try {
|
|
434
|
-
const asset = await Asset.find(user_id, asset_id);
|
|
435
|
-
if (!asset) {
|
|
436
|
-
return {
|
|
437
|
-
content: [
|
|
438
|
-
{
|
|
439
|
-
type: "text",
|
|
440
|
-
text: JSON.stringify({ error: "Asset not found" })
|
|
441
|
-
}
|
|
442
|
-
],
|
|
443
|
-
isError: true
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
return {
|
|
447
|
-
content: [
|
|
448
|
-
{
|
|
449
|
-
type: "text",
|
|
450
|
-
text: JSON.stringify(toAssetResponse(asset))
|
|
451
|
-
}
|
|
452
|
-
]
|
|
453
|
-
};
|
|
454
|
-
}
|
|
455
|
-
catch (err) {
|
|
456
|
-
return {
|
|
457
|
-
content: [
|
|
458
|
-
{
|
|
459
|
-
type: "text",
|
|
460
|
-
text: JSON.stringify({ error: String(err) })
|
|
461
|
-
}
|
|
462
|
-
],
|
|
463
|
-
isError: true
|
|
464
|
-
};
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
if (probeTransport.sessionId) {
|
|
69
|
+
await probeTransport.terminateSession().catch(() => undefined);
|
|
465
70
|
}
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
.
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
.describe("Maximum number of nodes to return")
|
|
475
|
-
}, async ({ namespace, limit }) => {
|
|
476
|
-
try {
|
|
477
|
-
let nodes = await getUnifiedNodeMetadata(options);
|
|
478
|
-
if (namespace) {
|
|
479
|
-
nodes = nodes.filter((n) => n.namespace.startsWith(namespace));
|
|
480
|
-
}
|
|
481
|
-
nodes.sort((a, b) => a.node_type.localeCompare(b.node_type));
|
|
482
|
-
const result = nodes.slice(0, limit).map((n) => ({
|
|
483
|
-
node_type: n.node_type,
|
|
484
|
-
title: n.title,
|
|
485
|
-
description: n.description,
|
|
486
|
-
namespace: n.namespace
|
|
487
|
-
}));
|
|
488
|
-
return {
|
|
489
|
-
content: [{ type: "text", text: JSON.stringify(result) }]
|
|
490
|
-
};
|
|
71
|
+
await probe.close();
|
|
72
|
+
}
|
|
73
|
+
const http = new StreamableHTTPClientTransport(endpoint);
|
|
74
|
+
http.onmessage = (message) => {
|
|
75
|
+
if ("result" in message && "protocolVersion" in message.result) {
|
|
76
|
+
const version = message.result.protocolVersion;
|
|
77
|
+
if (typeof version === "string")
|
|
78
|
+
http.setProtocolVersion(version);
|
|
491
79
|
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
80
|
+
void stdio.send(message);
|
|
81
|
+
};
|
|
82
|
+
http.onerror = (error) => {
|
|
83
|
+
log.warn("Local MCP HTTP transport failed", { error: error.message });
|
|
84
|
+
};
|
|
85
|
+
let initialization = Promise.resolve();
|
|
86
|
+
stdio.onmessage = (message) => {
|
|
87
|
+
const send = initialization.then(() => http.send(message));
|
|
88
|
+
if ("method" in message && message.method === "initialize") {
|
|
89
|
+
initialization = send;
|
|
502
90
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
n_results: z.number().optional().default(10).describe("Maximum results"),
|
|
507
|
-
namespace: z
|
|
508
|
-
.string()
|
|
509
|
-
.optional()
|
|
510
|
-
.describe("Optional namespace prefix to scope the search (e.g. 'nodetool.control')."),
|
|
511
|
-
include_provider_nodes: z
|
|
512
|
-
.boolean()
|
|
513
|
-
.optional()
|
|
514
|
-
.default(false)
|
|
515
|
-
.describe("Include provider-specific nodes. Default false — set true only when the user named a provider.")
|
|
516
|
-
}, async ({ query, n_results, namespace, include_provider_nodes }) => {
|
|
517
|
-
try {
|
|
518
|
-
const nodes = await getUnifiedNodeMetadata(options);
|
|
519
|
-
const ranked = rankNodeMetadata(nodes, query, {
|
|
520
|
-
includeProviderNodes: include_provider_nodes,
|
|
521
|
-
namespacePrefix: namespace
|
|
91
|
+
void send.catch((error) => {
|
|
92
|
+
log.warn("Forwarding MCP request failed", {
|
|
93
|
+
error: error instanceof Error ? error.message : String(error)
|
|
522
94
|
});
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
return {
|
|
531
|
-
content: [{ type: "text", text: JSON.stringify(matches) }]
|
|
532
|
-
};
|
|
533
|
-
}
|
|
534
|
-
catch (err) {
|
|
535
|
-
return {
|
|
536
|
-
content: [
|
|
537
|
-
{
|
|
538
|
-
type: "text",
|
|
539
|
-
text: JSON.stringify({ error: String(err) })
|
|
540
|
-
}
|
|
541
|
-
],
|
|
542
|
-
isError: true
|
|
543
|
-
};
|
|
544
|
-
}
|
|
545
|
-
});
|
|
546
|
-
server.tool("get_node_info", "Get detailed metadata for a node type.", {
|
|
547
|
-
node_type: z.string().describe("The fully-qualified node type")
|
|
548
|
-
}, async ({ node_type }) => {
|
|
549
|
-
try {
|
|
550
|
-
const nodes = await getUnifiedNodeMetadata(options);
|
|
551
|
-
const node = nodes.find((candidate) => candidate.node_type === node_type);
|
|
552
|
-
if (!node) {
|
|
553
|
-
return {
|
|
554
|
-
content: [
|
|
555
|
-
{
|
|
556
|
-
type: "text",
|
|
557
|
-
text: JSON.stringify({ error: "Node type not found" })
|
|
558
|
-
}
|
|
559
|
-
],
|
|
560
|
-
isError: true
|
|
561
|
-
};
|
|
562
|
-
}
|
|
563
|
-
return {
|
|
564
|
-
content: [{ type: "text", text: JSON.stringify(node) }]
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
|
-
catch (err) {
|
|
568
|
-
return {
|
|
569
|
-
content: [
|
|
570
|
-
{
|
|
571
|
-
type: "text",
|
|
572
|
-
text: JSON.stringify({ error: String(err) })
|
|
573
|
-
}
|
|
574
|
-
],
|
|
575
|
-
isError: true
|
|
576
|
-
};
|
|
577
|
-
}
|
|
578
|
-
});
|
|
579
|
-
// ── Job tools ───────────────────────────────────────────────────
|
|
580
|
-
server.tool("list_jobs", "List jobs for user, optionally filtered by workflow.", {
|
|
581
|
-
workflow_id: z.string().optional().describe("Filter by workflow ID"),
|
|
582
|
-
limit: z
|
|
583
|
-
.number()
|
|
584
|
-
.optional()
|
|
585
|
-
.default(100)
|
|
586
|
-
.describe("Maximum number of jobs to return"),
|
|
587
|
-
user_id: z.string().optional().default("1").describe("User ID")
|
|
588
|
-
}, async ({ workflow_id, limit, user_id }) => {
|
|
589
|
-
try {
|
|
590
|
-
const opts = { limit };
|
|
591
|
-
if (workflow_id)
|
|
592
|
-
opts.workflowId = workflow_id;
|
|
593
|
-
const [jobs, nextStartKey] = await Job.paginate(user_id, opts);
|
|
594
|
-
return {
|
|
595
|
-
content: [
|
|
596
|
-
{
|
|
597
|
-
type: "text",
|
|
598
|
-
text: JSON.stringify({
|
|
599
|
-
jobs: jobs.map((job) => toJobResponse(job)),
|
|
600
|
-
next_start_key: nextStartKey || null
|
|
601
|
-
})
|
|
602
|
-
}
|
|
603
|
-
]
|
|
604
|
-
};
|
|
605
|
-
}
|
|
606
|
-
catch (err) {
|
|
607
|
-
return {
|
|
608
|
-
content: [
|
|
609
|
-
{
|
|
610
|
-
type: "text",
|
|
611
|
-
text: JSON.stringify({ error: String(err) })
|
|
612
|
-
}
|
|
613
|
-
],
|
|
614
|
-
isError: true
|
|
615
|
-
};
|
|
616
|
-
}
|
|
617
|
-
});
|
|
618
|
-
server.tool("get_job", "Get a job by ID for user.", {
|
|
619
|
-
job_id: z.string().describe("The job ID"),
|
|
620
|
-
user_id: z.string().optional().default("1").describe("User ID")
|
|
621
|
-
}, async ({ job_id, user_id }) => {
|
|
622
|
-
try {
|
|
623
|
-
const job = await Job.find(user_id, job_id);
|
|
624
|
-
if (!job) {
|
|
625
|
-
return {
|
|
626
|
-
content: [
|
|
627
|
-
{
|
|
628
|
-
type: "text",
|
|
629
|
-
text: JSON.stringify({ error: "Job not found" })
|
|
630
|
-
}
|
|
631
|
-
],
|
|
632
|
-
isError: true
|
|
633
|
-
};
|
|
95
|
+
void stdio.close();
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
stdio.onclose = () => {
|
|
99
|
+
void (async () => {
|
|
100
|
+
if (http.sessionId) {
|
|
101
|
+
await http.terminateSession().catch(() => undefined);
|
|
634
102
|
}
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
]
|
|
642
|
-
};
|
|
643
|
-
}
|
|
644
|
-
catch (err) {
|
|
645
|
-
return {
|
|
646
|
-
content: [
|
|
647
|
-
{
|
|
648
|
-
type: "text",
|
|
649
|
-
text: JSON.stringify({ error: String(err) })
|
|
650
|
-
}
|
|
651
|
-
],
|
|
652
|
-
isError: true
|
|
653
|
-
};
|
|
654
|
-
}
|
|
655
|
-
});
|
|
656
|
-
// ── Collection tools (sqlite-vec) ───────────────────────────────
|
|
657
|
-
server.tool("list_collections", "List all vector database collections.", {
|
|
658
|
-
limit: z
|
|
659
|
-
.number()
|
|
660
|
-
.optional()
|
|
661
|
-
.default(50)
|
|
662
|
-
.describe("Maximum collections to return")
|
|
663
|
-
}, async ({ limit }) => {
|
|
664
|
-
try {
|
|
665
|
-
const { getVecStore } = await import("@nodetool-ai/vectorstore");
|
|
666
|
-
const store = await getVecStore();
|
|
667
|
-
const collections = await store.listCollections();
|
|
668
|
-
const result = await Promise.all(collections.slice(0, limit).map(async (c) => {
|
|
669
|
-
const count = await c.count();
|
|
670
|
-
const metadata = c.metadata ?? {};
|
|
671
|
-
let workflowName = null;
|
|
672
|
-
const workflowId = metadata.workflow;
|
|
673
|
-
if (workflowId) {
|
|
674
|
-
const workflow = (await Workflow.get(workflowId));
|
|
675
|
-
if (workflow)
|
|
676
|
-
workflowName = workflow.name;
|
|
677
|
-
}
|
|
678
|
-
return {
|
|
679
|
-
name: c.name,
|
|
680
|
-
count,
|
|
681
|
-
metadata,
|
|
682
|
-
workflow_name: workflowName
|
|
683
|
-
};
|
|
684
|
-
}));
|
|
685
|
-
return {
|
|
686
|
-
content: [
|
|
687
|
-
{
|
|
688
|
-
type: "text",
|
|
689
|
-
text: JSON.stringify({ collections: result, count: result.length })
|
|
690
|
-
}
|
|
691
|
-
]
|
|
692
|
-
};
|
|
693
|
-
}
|
|
694
|
-
catch {
|
|
695
|
-
return {
|
|
696
|
-
content: [
|
|
697
|
-
{
|
|
698
|
-
type: "text",
|
|
699
|
-
text: JSON.stringify({ error: "Vector store not available" })
|
|
700
|
-
}
|
|
701
|
-
],
|
|
702
|
-
isError: true
|
|
703
|
-
};
|
|
704
|
-
}
|
|
705
|
-
});
|
|
706
|
-
server.tool("get_collection", "Get details about a specific collection.", {
|
|
707
|
-
name: z.string().describe("Collection name")
|
|
708
|
-
}, async ({ name }) => {
|
|
709
|
-
try {
|
|
710
|
-
const { getVecStore } = await import("@nodetool-ai/vectorstore");
|
|
711
|
-
const store = await getVecStore();
|
|
712
|
-
const collection = await store.getCollection({ name });
|
|
713
|
-
const count = await collection.count();
|
|
714
|
-
return {
|
|
715
|
-
content: [
|
|
716
|
-
{
|
|
717
|
-
type: "text",
|
|
718
|
-
text: JSON.stringify({
|
|
719
|
-
name: collection.name,
|
|
720
|
-
metadata: collection.metadata,
|
|
721
|
-
count
|
|
722
|
-
})
|
|
723
|
-
}
|
|
724
|
-
]
|
|
725
|
-
};
|
|
726
|
-
}
|
|
727
|
-
catch {
|
|
728
|
-
return {
|
|
729
|
-
content: [
|
|
730
|
-
{
|
|
731
|
-
type: "text",
|
|
732
|
-
text: JSON.stringify({ error: "Vector store not available" })
|
|
733
|
-
}
|
|
734
|
-
],
|
|
735
|
-
isError: true
|
|
736
|
-
};
|
|
737
|
-
}
|
|
738
|
-
});
|
|
739
|
-
server.tool("query_collection", "Query a collection for similar documents using semantic search.", {
|
|
740
|
-
name: z.string().describe("Collection name"),
|
|
741
|
-
query_texts: z
|
|
742
|
-
.array(z.string())
|
|
743
|
-
.describe("Query texts for semantic search"),
|
|
744
|
-
n_results: z.number().optional().default(10).describe("Number of results")
|
|
745
|
-
}, async ({ name, query_texts, n_results }) => {
|
|
746
|
-
try {
|
|
747
|
-
const { getVecStore } = await import("@nodetool-ai/vectorstore");
|
|
748
|
-
const store = await getVecStore();
|
|
749
|
-
const collection = await store.getCollection({ name });
|
|
750
|
-
const results = await collection.query({
|
|
751
|
-
queryTexts: query_texts,
|
|
752
|
-
nResults: n_results
|
|
753
|
-
});
|
|
754
|
-
return {
|
|
755
|
-
content: [{ type: "text", text: JSON.stringify(results) }]
|
|
756
|
-
};
|
|
757
|
-
}
|
|
758
|
-
catch {
|
|
759
|
-
return {
|
|
760
|
-
content: [
|
|
761
|
-
{
|
|
762
|
-
type: "text",
|
|
763
|
-
text: JSON.stringify({ error: "Vector store not available" })
|
|
764
|
-
}
|
|
765
|
-
],
|
|
766
|
-
isError: true
|
|
767
|
-
};
|
|
768
|
-
}
|
|
769
|
-
});
|
|
770
|
-
return server;
|
|
103
|
+
await http.close();
|
|
104
|
+
})();
|
|
105
|
+
};
|
|
106
|
+
await http.start();
|
|
107
|
+
await stdio.start();
|
|
108
|
+
return true;
|
|
771
109
|
}
|
|
772
110
|
/**
|
|
773
|
-
*
|
|
111
|
+
* How long an HTTP session may sit idle before it is closed. Every session
|
|
112
|
+
* holds a transport, an `McpServer`, and that session's whole tool registry,
|
|
113
|
+
* and `onclose` only fires when the transport is explicitly closed — normally
|
|
114
|
+
* a DELETE. A client that simply goes away never sends one, so without this
|
|
115
|
+
* sweep the maps grow for the life of the process.
|
|
774
116
|
*/
|
|
775
|
-
export
|
|
776
|
-
|
|
777
|
-
|
|
117
|
+
export const MCP_SESSION_IDLE_TTL_MS = 30 * 60 * 1000;
|
|
118
|
+
/** Concurrent sessions one user may hold; opening another closes their oldest. */
|
|
119
|
+
export const MCP_MAX_SESSIONS_PER_USER = 8;
|
|
120
|
+
/** Concurrent sessions across every user. A new one past this is refused. */
|
|
121
|
+
export const MCP_MAX_SESSIONS = 256;
|
|
778
122
|
// Per-session transport map for stateful HTTP MCP
|
|
779
123
|
const sessionTransports = new Map();
|
|
780
|
-
|
|
781
|
-
|
|
124
|
+
// The user each HTTP session was initialized for. A multi-user mount hands out
|
|
125
|
+
// session ids over an authenticated channel, but the id alone must not be a
|
|
126
|
+
// bearer credential: every later request is checked against the owner recorded
|
|
127
|
+
// here.
|
|
128
|
+
const sessionOwners = new Map();
|
|
129
|
+
// When each session was last used, for idle eviction and for picking a user's
|
|
130
|
+
// oldest session when they are over their cap.
|
|
131
|
+
const sessionLastSeen = new Map();
|
|
132
|
+
function forgetSession(sessionId) {
|
|
133
|
+
sessionTransports.delete(sessionId);
|
|
134
|
+
sessionOwners.delete(sessionId);
|
|
135
|
+
sessionLastSeen.delete(sessionId);
|
|
136
|
+
}
|
|
137
|
+
function touchSession(sessionId, now = Date.now()) {
|
|
138
|
+
if (sessionTransports.has(sessionId))
|
|
139
|
+
sessionLastSeen.set(sessionId, now);
|
|
782
140
|
}
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Drop a session and close its transport, which releases the `McpServer`
|
|
143
|
+
* behind it. `forgetSession` runs first so the transport's own `onclose`
|
|
144
|
+
* finds nothing left to do.
|
|
145
|
+
*/
|
|
146
|
+
function closeSession(sessionId) {
|
|
147
|
+
const transport = sessionTransports.get(sessionId);
|
|
148
|
+
forgetSession(sessionId);
|
|
149
|
+
void transport?.close().catch((err) => {
|
|
150
|
+
log.warn("Closing MCP session transport failed", {
|
|
151
|
+
sessionId,
|
|
152
|
+
error: err instanceof Error ? err.message : String(err)
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/** Close every session idle for longer than the TTL. Lazy — runs per request,
|
|
157
|
+
* so an idle process holds no timer. */
|
|
158
|
+
function sweepIdleSessions(now) {
|
|
159
|
+
for (const [sessionId, lastSeen] of sessionLastSeen) {
|
|
160
|
+
if (now - lastSeen > MCP_SESSION_IDLE_TTL_MS) {
|
|
161
|
+
log.debug("Evicting idle MCP session", { sessionId });
|
|
162
|
+
closeSession(sessionId);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Close a user's oldest sessions until opening one more keeps them at the cap. */
|
|
167
|
+
function evictOverflowForUser(userId) {
|
|
168
|
+
const owned = [...sessionOwners]
|
|
169
|
+
.filter(([, owner]) => owner === userId)
|
|
170
|
+
.map(([sessionId]) => sessionId);
|
|
171
|
+
const overflow = owned.length - (MCP_MAX_SESSIONS_PER_USER - 1);
|
|
172
|
+
if (overflow <= 0)
|
|
173
|
+
return;
|
|
174
|
+
const oldestFirst = owned.sort((a, b) => (sessionLastSeen.get(a) ?? 0) - (sessionLastSeen.get(b) ?? 0));
|
|
175
|
+
for (const sessionId of oldestFirst.slice(0, overflow)) {
|
|
176
|
+
log.debug("Evicting oldest MCP session for user over cap", {
|
|
177
|
+
userId,
|
|
178
|
+
sessionId
|
|
179
|
+
});
|
|
180
|
+
closeSession(sessionId);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** Close every open HTTP session. For shutdown, and for tests that need a
|
|
184
|
+
* clean process-wide session table. */
|
|
185
|
+
export function closeAllMcpHttpSessions() {
|
|
186
|
+
for (const sessionId of [...sessionTransports.keys()]) {
|
|
187
|
+
closeSession(sessionId);
|
|
786
188
|
}
|
|
787
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* True when the session exists and belongs to somebody other than the caller.
|
|
192
|
+
* A session with no recorded owner (stdio, or a mount that predates the
|
|
193
|
+
* binding) is left alone — the transport map is the authority there.
|
|
194
|
+
*/
|
|
195
|
+
function isForeignSession(sessionId, options) {
|
|
196
|
+
const owner = sessionOwners.get(sessionId);
|
|
197
|
+
if (owner === undefined)
|
|
198
|
+
return false;
|
|
199
|
+
return owner !== options?.agentToolsScope?.userId;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Answer as if the session did not exist. A 403 would confirm the id is real to
|
|
203
|
+
* a caller who guessed it; a 404 tells them nothing.
|
|
204
|
+
*/
|
|
205
|
+
function sessionNotFound() {
|
|
206
|
+
return new Response("Session not found", { status: 404 });
|
|
207
|
+
}
|
|
208
|
+
/** Refusal for an initialize the mount has no room for. Retryable: an idle
|
|
209
|
+
* session frees a slot on the next sweep. */
|
|
210
|
+
function sessionsExhausted() {
|
|
211
|
+
return new Response(JSON.stringify({
|
|
212
|
+
jsonrpc: "2.0",
|
|
213
|
+
id: null,
|
|
214
|
+
error: {
|
|
215
|
+
code: -32002,
|
|
216
|
+
message: "This server is holding its maximum number of MCP sessions. " +
|
|
217
|
+
"Close an existing session with DELETE /mcp, or retry later."
|
|
218
|
+
}
|
|
219
|
+
}), {
|
|
220
|
+
status: 503,
|
|
221
|
+
headers: {
|
|
222
|
+
"content-type": "application/json",
|
|
223
|
+
"retry-after": "60"
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
788
227
|
export function getLocalMcpServerUrl() {
|
|
789
228
|
const port = Number(process.env["PORT"] ?? 7777);
|
|
790
229
|
const tlsEnabled = Boolean(process.env["TLS_CERT"] && process.env["TLS_KEY"]);
|
|
791
230
|
const protocol = tlsEnabled ? "https" : "http";
|
|
792
231
|
return `${protocol}://127.0.0.1:${port}/mcp`;
|
|
793
232
|
}
|
|
233
|
+
/** JSON-RPC refusal for an initialize the mount cannot scope to a user. */
|
|
234
|
+
function scopeRefusal(challenge) {
|
|
235
|
+
const headers = new Headers({ "content-type": "application/json" });
|
|
236
|
+
if (challenge)
|
|
237
|
+
headers.set("WWW-Authenticate", challenge);
|
|
238
|
+
return new Response(JSON.stringify({
|
|
239
|
+
jsonrpc: "2.0",
|
|
240
|
+
id: null,
|
|
241
|
+
error: { code: -32001, message: MCP_SCOPE_REQUIRED_MESSAGE }
|
|
242
|
+
}), { status: 401, headers });
|
|
243
|
+
}
|
|
794
244
|
/**
|
|
795
245
|
* Handle an MCP HTTP request at the /mcp path.
|
|
796
246
|
* Uses WebStandardStreamableHTTPServerTransport for stateful sessions.
|
|
@@ -800,42 +250,85 @@ export async function handleMcpHttpRequest(request, options) {
|
|
|
800
250
|
if (!url.pathname.startsWith("/mcp"))
|
|
801
251
|
return null;
|
|
802
252
|
const method = request.method;
|
|
253
|
+
const now = Date.now();
|
|
254
|
+
sweepIdleSessions(now);
|
|
803
255
|
if (method === "POST") {
|
|
804
256
|
// Check for existing session
|
|
805
257
|
const sessionId = request.headers.get("mcp-session-id");
|
|
806
258
|
if (sessionId && sessionTransports.has(sessionId)) {
|
|
259
|
+
if (isForeignSession(sessionId, options))
|
|
260
|
+
return sessionNotFound();
|
|
807
261
|
const transport = sessionTransports.get(sessionId);
|
|
262
|
+
touchSession(sessionId, now);
|
|
808
263
|
return transport.handleRequest(request);
|
|
809
264
|
}
|
|
265
|
+
// A session id that is present but unknown must NOT fall through to the
|
|
266
|
+
// new-session path: that constructed a fresh transport + server per stale
|
|
267
|
+
// request (leaking both). Reject it — only an initialize request without a
|
|
268
|
+
// session id creates a new session.
|
|
269
|
+
if (sessionId) {
|
|
270
|
+
return sessionNotFound();
|
|
271
|
+
}
|
|
272
|
+
// A session this mount cannot bind to a user is refused here, at
|
|
273
|
+
// initialize, rather than answering with an empty surface.
|
|
274
|
+
if (!options?.agentToolsScope) {
|
|
275
|
+
log.warn("Refusing MCP session: no authenticated user to bind");
|
|
276
|
+
return scopeRefusal(options?.unauthorizedChallenge);
|
|
277
|
+
}
|
|
810
278
|
// New session — create transport and server
|
|
279
|
+
const ownerUserId = options.agentToolsScope.userId;
|
|
280
|
+
// One user's clients cannot crowd out everyone else's: their oldest
|
|
281
|
+
// session goes first. The global cap is what is left after that, and it
|
|
282
|
+
// refuses rather than evicting a stranger's live session.
|
|
283
|
+
evictOverflowForUser(ownerUserId);
|
|
284
|
+
if (sessionTransports.size >= MCP_MAX_SESSIONS) {
|
|
285
|
+
log.warn("Refusing MCP session: server session cap reached", {
|
|
286
|
+
cap: MCP_MAX_SESSIONS
|
|
287
|
+
});
|
|
288
|
+
return sessionsExhausted();
|
|
289
|
+
}
|
|
811
290
|
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
812
291
|
enableJsonResponse: true,
|
|
813
292
|
sessionIdGenerator: () => crypto.randomUUID(),
|
|
814
293
|
onsessioninitialized: (id) => {
|
|
815
294
|
sessionTransports.set(id, transport);
|
|
295
|
+
sessionOwners.set(id, ownerUserId);
|
|
296
|
+
sessionLastSeen.set(id, Date.now());
|
|
816
297
|
}
|
|
817
298
|
});
|
|
299
|
+
// Evict the session when the transport closes (client disconnect without an
|
|
300
|
+
// explicit DELETE) so sessionTransports — and the McpServer each entry keeps
|
|
301
|
+
// alive — does not grow unbounded over the process lifetime.
|
|
302
|
+
transport.onclose = () => {
|
|
303
|
+
if (transport.sessionId)
|
|
304
|
+
forgetSession(transport.sessionId);
|
|
305
|
+
};
|
|
818
306
|
const server = createMcpServer(options);
|
|
819
307
|
await server.connect(transport);
|
|
820
308
|
return transport.handleRequest(request);
|
|
821
309
|
}
|
|
822
310
|
if (method === "GET") {
|
|
823
311
|
const sessionId = request.headers.get("mcp-session-id");
|
|
824
|
-
if (sessionId &&
|
|
312
|
+
if (sessionId &&
|
|
313
|
+
sessionTransports.has(sessionId) &&
|
|
314
|
+
!isForeignSession(sessionId, options)) {
|
|
825
315
|
const transport = sessionTransports.get(sessionId);
|
|
316
|
+
touchSession(sessionId, now);
|
|
826
317
|
return transport.handleRequest(request);
|
|
827
318
|
}
|
|
828
|
-
return
|
|
319
|
+
return sessionNotFound();
|
|
829
320
|
}
|
|
830
321
|
if (method === "DELETE") {
|
|
831
322
|
const sessionId = request.headers.get("mcp-session-id");
|
|
832
|
-
if (sessionId &&
|
|
323
|
+
if (sessionId &&
|
|
324
|
+
sessionTransports.has(sessionId) &&
|
|
325
|
+
!isForeignSession(sessionId, options)) {
|
|
833
326
|
const transport = sessionTransports.get(sessionId);
|
|
834
327
|
const response = await transport.handleRequest(request);
|
|
835
|
-
|
|
328
|
+
forgetSession(sessionId);
|
|
836
329
|
return response;
|
|
837
330
|
}
|
|
838
|
-
return
|
|
331
|
+
return sessionNotFound();
|
|
839
332
|
}
|
|
840
333
|
return new Response("Method not allowed", { status: 405 });
|
|
841
334
|
}
|