@nodetool-ai/websocket 0.8.1 → 0.8.3
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/dist/.nodetool-build-stamp +1 -1
- package/dist/chat-turn-registry.d.ts +2 -1
- package/dist/chat-turn-registry.d.ts.map +1 -1
- package/dist/chat-turn-registry.js +8 -1
- package/dist/chat-turn-registry.js.map +1 -1
- package/dist/collection-api.d.ts.map +1 -1
- package/dist/collection-api.js +41 -6
- package/dist/collection-api.js.map +1 -1
- package/dist/custom-providers.d.ts.map +1 -1
- package/dist/custom-providers.js +6 -1
- package/dist/custom-providers.js.map +1 -1
- package/dist/error-traces.d.ts +56 -0
- package/dist/error-traces.d.ts.map +1 -0
- package/dist/error-traces.js +179 -0
- package/dist/error-traces.js.map +1 -0
- package/dist/example-workflows.d.ts.map +1 -1
- package/dist/example-workflows.js +6 -0
- package/dist/example-workflows.js.map +1 -1
- package/dist/fake-runtime.d.ts +41 -6
- package/dist/fake-runtime.d.ts.map +1 -1
- package/dist/fake-runtime.js +247 -16
- package/dist/fake-runtime.js.map +1 -1
- package/dist/file-api.d.ts.map +1 -1
- package/dist/file-api.js +6 -8
- package/dist/file-api.js.map +1 -1
- package/dist/generation-recovery.d.ts.map +1 -1
- package/dist/generation-recovery.js +32 -7
- package/dist/generation-recovery.js.map +1 -1
- package/dist/headless-job-runner.d.ts.map +1 -1
- package/dist/headless-job-runner.js +5 -1
- package/dist/headless-job-runner.js.map +1 -1
- package/dist/http-api.d.ts +3 -1
- package/dist/http-api.d.ts.map +1 -1
- package/dist/http-api.js +66 -9
- package/dist/http-api.js.map +1 -1
- package/dist/http-body-schemas.d.ts +2 -0
- package/dist/http-body-schemas.d.ts.map +1 -1
- package/dist/http-body-schemas.js +8 -1
- package/dist/http-body-schemas.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/interrupted-jobs.d.ts +14 -0
- package/dist/interrupted-jobs.d.ts.map +1 -0
- package/dist/interrupted-jobs.js +28 -0
- package/dist/interrupted-jobs.js.map +1 -0
- package/dist/lib/admin.d.ts +7 -0
- package/dist/lib/admin.d.ts.map +1 -0
- package/dist/lib/admin.js +20 -0
- package/dist/lib/admin.js.map +1 -0
- package/dist/lib/app-debug-service.js +1 -1
- package/dist/lib/app-debug-service.js.map +1 -1
- package/dist/lib/app-instances-service.d.ts +1319 -0
- package/dist/lib/app-instances-service.d.ts.map +1 -0
- package/dist/lib/app-instances-service.js +377 -0
- package/dist/lib/app-instances-service.js.map +1 -0
- package/dist/lib/app-project-export.d.ts +12 -0
- package/dist/lib/app-project-export.d.ts.map +1 -0
- package/dist/lib/app-project-export.js +42 -0
- package/dist/lib/app-project-export.js.map +1 -0
- package/dist/lib/app-run-cancellation.d.ts +4 -0
- package/dist/lib/app-run-cancellation.d.ts.map +1 -0
- package/dist/lib/app-run-cancellation.js +28 -0
- package/dist/lib/app-run-cancellation.js.map +1 -0
- package/dist/lib/applications-service.d.ts +182 -1
- package/dist/lib/applications-service.d.ts.map +1 -1
- package/dist/lib/applications-service.js +27 -6
- package/dist/lib/applications-service.js.map +1 -1
- package/dist/lib/asset-export.d.ts +6 -2
- package/dist/lib/asset-export.d.ts.map +1 -1
- package/dist/lib/asset-export.js +15 -7
- package/dist/lib/asset-export.js.map +1 -1
- package/dist/lib/asset-paths.d.ts +7 -11
- package/dist/lib/asset-paths.d.ts.map +1 -1
- package/dist/lib/asset-paths.js +8 -56
- package/dist/lib/asset-paths.js.map +1 -1
- package/dist/lib/asset-response.d.ts.map +1 -1
- package/dist/lib/asset-response.js +3 -1
- package/dist/lib/asset-response.js.map +1 -1
- package/dist/lib/audio-peaks.d.ts.map +1 -1
- package/dist/lib/audio-peaks.js +5 -1
- package/dist/lib/audio-peaks.js.map +1 -1
- package/dist/lib/bridge.d.ts.map +1 -1
- package/dist/lib/bridge.js.map +1 -1
- package/dist/lib/cloud-profile.d.ts +10 -0
- package/dist/lib/cloud-profile.d.ts.map +1 -0
- package/dist/lib/cloud-profile.js +13 -0
- package/dist/lib/cloud-profile.js.map +1 -0
- package/dist/lib/document-model-interfaces.d.ts.map +1 -1
- package/dist/lib/document-model-interfaces.js +9 -8
- package/dist/lib/document-model-interfaces.js.map +1 -1
- package/dist/lib/example-apps.d.ts +9 -0
- package/dist/lib/example-apps.d.ts.map +1 -1
- package/dist/lib/example-apps.js +61 -14
- package/dist/lib/example-apps.js.map +1 -1
- package/dist/lib/http-tracing.d.ts +12 -0
- package/dist/lib/http-tracing.d.ts.map +1 -0
- package/dist/lib/http-tracing.js +81 -0
- package/dist/lib/http-tracing.js.map +1 -0
- package/dist/lib/http-user-id.d.ts +2 -0
- package/dist/lib/http-user-id.d.ts.map +1 -0
- package/dist/lib/http-user-id.js +4 -0
- package/dist/lib/http-user-id.js.map +1 -0
- package/dist/lib/json-body.d.ts +11 -0
- package/dist/lib/json-body.d.ts.map +1 -0
- package/dist/lib/json-body.js +13 -0
- package/dist/lib/json-body.js.map +1 -0
- package/dist/lib/media.d.ts +1 -6
- package/dist/lib/media.d.ts.map +1 -1
- package/dist/lib/media.js +8 -44
- package/dist/lib/media.js.map +1 -1
- package/dist/lib/public-routes.d.ts +22 -0
- package/dist/lib/public-routes.d.ts.map +1 -1
- package/dist/lib/public-routes.js +41 -0
- package/dist/lib/public-routes.js.map +1 -1
- package/dist/lib/public-workflow-share.d.ts +31 -0
- package/dist/lib/public-workflow-share.d.ts.map +1 -0
- package/dist/lib/public-workflow-share.js +88 -0
- package/dist/lib/public-workflow-share.js.map +1 -0
- package/dist/lib/python-metadata-roots.d.ts +27 -0
- package/dist/lib/python-metadata-roots.d.ts.map +1 -0
- package/dist/lib/python-metadata-roots.js +92 -0
- package/dist/lib/python-metadata-roots.js.map +1 -0
- package/dist/lib/run-trace-live-delivery.d.ts +25 -0
- package/dist/lib/run-trace-live-delivery.d.ts.map +1 -0
- package/dist/lib/run-trace-live-delivery.js +91 -0
- package/dist/lib/run-trace-live-delivery.js.map +1 -0
- package/dist/lib/runtime-detection.d.ts +1 -1
- package/dist/lib/runtime-detection.d.ts.map +1 -1
- package/dist/lib/runtime-detection.js +2 -1
- package/dist/lib/runtime-detection.js.map +1 -1
- package/dist/lib/server-auth-token.d.ts +18 -0
- package/dist/lib/server-auth-token.d.ts.map +1 -0
- package/dist/lib/server-auth-token.js +28 -0
- package/dist/lib/server-auth-token.js.map +1 -0
- package/dist/lib/test-ui-run-routes.d.ts +8 -0
- package/dist/lib/test-ui-run-routes.d.ts.map +1 -0
- package/dist/lib/test-ui-run-routes.js +42 -0
- package/dist/lib/test-ui-run-routes.js.map +1 -0
- package/dist/lib/thumbnail.d.ts.map +1 -1
- package/dist/lib/thumbnail.js +12 -9
- package/dist/lib/thumbnail.js.map +1 -1
- package/dist/lib/timeline-bundle.d.ts +159 -16
- package/dist/lib/timeline-bundle.d.ts.map +1 -1
- package/dist/lib/timeline-bundle.js +34 -6
- package/dist/lib/timeline-bundle.js.map +1 -1
- package/dist/lib/timeline-media-export.d.ts +18 -0
- package/dist/lib/timeline-media-export.d.ts.map +1 -0
- package/dist/lib/timeline-media-export.js +66 -0
- package/dist/lib/timeline-media-export.js.map +1 -0
- package/dist/lib/timeline-premiere-import.d.ts +24 -0
- package/dist/lib/timeline-premiere-import.d.ts.map +1 -0
- package/dist/lib/timeline-premiere-import.js +102 -0
- package/dist/lib/timeline-premiere-import.js.map +1 -0
- package/dist/lib/timeline-premiere.d.ts +38 -0
- package/dist/lib/timeline-premiere.d.ts.map +1 -0
- package/dist/lib/timeline-premiere.js +87 -0
- package/dist/lib/timeline-premiere.js.map +1 -0
- package/dist/lib/video-proxy.d.ts.map +1 -1
- package/dist/lib/video-proxy.js +3 -2
- package/dist/lib/video-proxy.js.map +1 -1
- package/dist/lib/workflow-service.d.ts.map +1 -1
- package/dist/lib/workflow-service.js +4 -1
- package/dist/lib/workflow-service.js.map +1 -1
- package/dist/mcp-agent-tools.d.ts.map +1 -1
- package/dist/mcp-agent-tools.js +95 -162
- package/dist/mcp-agent-tools.js.map +1 -1
- package/dist/mcp-client-config.d.ts +64 -0
- package/dist/mcp-client-config.d.ts.map +1 -0
- package/dist/mcp-client-config.js +353 -0
- package/dist/mcp-client-config.js.map +1 -0
- package/dist/mcp-server.d.ts +7 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +163 -16
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-skill-prompts.d.ts +23 -0
- package/dist/mcp-skill-prompts.d.ts.map +1 -0
- package/dist/mcp-skill-prompts.js +91 -0
- package/dist/mcp-skill-prompts.js.map +1 -0
- package/dist/mcp-tool-deps.d.ts.map +1 -1
- package/dist/mcp-tool-deps.js +8 -1
- package/dist/mcp-tool-deps.js.map +1 -1
- package/dist/models-api.d.ts +10 -0
- package/dist/models-api.d.ts.map +1 -1
- package/dist/models-api.js +29 -2
- package/dist/models-api.js.map +1 -1
- package/dist/node-registry-setup.d.ts +1 -1
- package/dist/node-registry-setup.d.ts.map +1 -1
- package/dist/node-registry-setup.js +21 -114
- package/dist/node-registry-setup.js.map +1 -1
- package/dist/oauth-api.d.ts.map +1 -1
- package/dist/oauth-api.js +45 -23
- package/dist/oauth-api.js.map +1 -1
- package/dist/openai-api.d.ts.map +1 -1
- package/dist/openai-api.js +10 -2
- package/dist/openai-api.js.map +1 -1
- package/dist/plugins/websocket.d.ts.map +1 -1
- package/dist/plugins/websocket.js +27 -59
- package/dist/plugins/websocket.js.map +1 -1
- package/dist/python-bridge-gate.d.ts +28 -0
- package/dist/python-bridge-gate.d.ts.map +1 -0
- package/dist/python-bridge-gate.js +36 -0
- package/dist/python-bridge-gate.js.map +1 -0
- package/dist/routes/app-runs.d.ts +4 -0
- package/dist/routes/app-runs.d.ts.map +1 -0
- package/dist/routes/app-runs.js +173 -0
- package/dist/routes/app-runs.js.map +1 -0
- package/dist/routes/applications.d.ts +1 -0
- package/dist/routes/applications.d.ts.map +1 -1
- package/dist/routes/applications.js +24 -0
- package/dist/routes/applications.js.map +1 -1
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +31 -41
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +6 -0
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/documents.d.ts.map +1 -1
- package/dist/routes/documents.js +24 -0
- package/dist/routes/documents.js.map +1 -1
- package/dist/routes/fal-pricing-estimate.d.ts.map +1 -1
- package/dist/routes/fal-pricing-estimate.js +2 -0
- package/dist/routes/fal-pricing-estimate.js.map +1 -1
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +2 -0
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/games.d.ts +38 -0
- package/dist/routes/games.d.ts.map +1 -0
- package/dist/routes/games.js +158 -0
- package/dist/routes/games.js.map +1 -0
- package/dist/routes/integrations.d.ts.map +1 -1
- package/dist/routes/integrations.js +22 -26
- package/dist/routes/integrations.js.map +1 -1
- package/dist/routes/js-scripts.d.ts +10 -4
- package/dist/routes/js-scripts.d.ts.map +1 -1
- package/dist/routes/js-scripts.js +451 -69
- package/dist/routes/js-scripts.js.map +1 -1
- package/dist/routes/nodes.d.ts.map +1 -1
- package/dist/routes/nodes.js +34 -1
- package/dist/routes/nodes.js.map +1 -1
- package/dist/routes/public-shared-workflows.d.ts +16 -0
- package/dist/routes/public-shared-workflows.d.ts.map +1 -0
- package/dist/routes/public-shared-workflows.js +55 -0
- package/dist/routes/public-shared-workflows.js.map +1 -0
- package/dist/routes/run-spans.d.ts +4 -0
- package/dist/routes/run-spans.d.ts.map +1 -0
- package/dist/routes/run-spans.js +53 -0
- package/dist/routes/run-spans.js.map +1 -0
- package/dist/routes/storage.d.ts.map +1 -1
- package/dist/routes/storage.js +2 -0
- package/dist/routes/storage.js.map +1 -1
- package/dist/routes/storyboards.d.ts.map +1 -1
- package/dist/routes/storyboards.js +6 -3
- package/dist/routes/storyboards.js.map +1 -1
- package/dist/routes/timeline-fonts.d.ts +22 -0
- package/dist/routes/timeline-fonts.d.ts.map +1 -1
- package/dist/routes/timeline-fonts.js +138 -7
- package/dist/routes/timeline-fonts.js.map +1 -1
- package/dist/routes/timelines.d.ts +8 -4
- package/dist/routes/timelines.d.ts.map +1 -1
- package/dist/routes/timelines.js +209 -16
- package/dist/routes/timelines.js.map +1 -1
- package/dist/screenshot-docs-seed.d.ts +24 -0
- package/dist/screenshot-docs-seed.d.ts.map +1 -0
- package/dist/screenshot-docs-seed.js +414 -0
- package/dist/screenshot-docs-seed.js.map +1 -0
- package/dist/screenshot-projects.d.ts.map +1 -1
- package/dist/screenshot-projects.js +9 -9
- package/dist/screenshot-projects.js.map +1 -1
- package/dist/screenshot-server.js +114 -20
- package/dist/screenshot-server.js.map +1 -1
- package/dist/sdk/sdk-model-download-service.d.ts.map +1 -1
- package/dist/sdk/sdk-model-download-service.js +5 -2
- package/dist/sdk/sdk-model-download-service.js.map +1 -1
- package/dist/server.js +173 -109
- package/dist/server.js.map +1 -1
- package/dist/session/app-run-fold.d.ts +7 -0
- package/dist/session/app-run-fold.d.ts.map +1 -0
- package/dist/session/app-run-fold.js +45 -0
- package/dist/session/app-run-fold.js.map +1 -0
- package/dist/session/chat-prompt.d.ts.map +1 -1
- package/dist/session/chat-prompt.js +37 -15
- package/dist/session/chat-prompt.js.map +1 -1
- package/dist/session/chat-turn.d.ts +11 -0
- package/dist/session/chat-turn.d.ts.map +1 -1
- package/dist/session/chat-turn.js +270 -116
- package/dist/session/chat-turn.js.map +1 -1
- package/dist/session/commands.d.ts +14 -0
- package/dist/session/commands.d.ts.map +1 -1
- package/dist/session/commands.js +119 -14
- package/dist/session/commands.js.map +1 -1
- package/dist/session/inference.d.ts +30 -2
- package/dist/session/inference.d.ts.map +1 -1
- package/dist/session/inference.js +165 -16
- package/dist/session/inference.js.map +1 -1
- package/dist/session/job-execution.d.ts +7 -1
- package/dist/session/job-execution.d.ts.map +1 -1
- package/dist/session/job-execution.js +329 -42
- package/dist/session/job-execution.js.map +1 -1
- package/dist/session/model-interfaces.d.ts +2 -1
- package/dist/session/model-interfaces.d.ts.map +1 -1
- package/dist/session/model-interfaces.js +1 -0
- package/dist/session/model-interfaces.js.map +1 -1
- package/dist/storage-api.d.ts +0 -4
- package/dist/storage-api.d.ts.map +1 -1
- package/dist/storage-api.js +3 -26
- package/dist/storage-api.js.map +1 -1
- package/dist/storage-retention.d.ts +5 -0
- package/dist/storage-retention.d.ts.map +1 -1
- package/dist/storage-retention.js +22 -1
- package/dist/storage-retention.js.map +1 -1
- package/dist/test-ui-server.d.ts +11 -0
- package/dist/test-ui-server.d.ts.map +1 -1
- package/dist/test-ui-server.js +84 -6
- package/dist/test-ui-server.js.map +1 -1
- package/dist/timeline-generation-recovery.d.ts +4 -0
- package/dist/timeline-generation-recovery.d.ts.map +1 -0
- package/dist/timeline-generation-recovery.js +72 -0
- package/dist/timeline-generation-recovery.js.map +1 -0
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +26 -6
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/triggers/file-watch.d.ts.map +1 -1
- package/dist/triggers/file-watch.js +35 -19
- package/dist/triggers/file-watch.js.map +1 -1
- package/dist/triggers/scheduler.d.ts.map +1 -1
- package/dist/triggers/scheduler.js +7 -5
- package/dist/triggers/scheduler.js.map +1 -1
- package/dist/triggers/stores.js +8 -8
- package/dist/triggers/stores.js.map +1 -1
- package/dist/triggers/webhook-route.js +2 -2
- package/dist/triggers/webhook-route.js.map +1 -1
- package/dist/trpc/error-formatter.d.ts.map +1 -1
- package/dist/trpc/error-formatter.js +2 -1
- package/dist/trpc/error-formatter.js.map +1 -1
- package/dist/trpc/error-logging.d.ts +10 -0
- package/dist/trpc/error-logging.d.ts.map +1 -1
- package/dist/trpc/error-logging.js +21 -0
- package/dist/trpc/error-logging.js.map +1 -1
- package/dist/trpc/router.d.ts +100 -31028
- package/dist/trpc/router.d.ts.map +1 -1
- package/dist/trpc/router.js +12 -3
- package/dist/trpc/router.js.map +1 -1
- package/dist/trpc/routers/app-instances.d.ts +2332 -0
- package/dist/trpc/routers/app-instances.d.ts.map +1 -0
- package/dist/trpc/routers/app-instances.js +52 -0
- package/dist/trpc/routers/app-instances.js.map +1 -0
- package/dist/trpc/routers/app-runs.d.ts +1120 -0
- package/dist/trpc/routers/app-runs.d.ts.map +1 -0
- package/dist/trpc/routers/app-runs.js +28 -0
- package/dist/trpc/routers/app-runs.js.map +1 -0
- package/dist/trpc/routers/applications.d.ts +1102 -0
- package/dist/trpc/routers/applications.d.ts.map +1 -1
- package/dist/trpc/routers/applications.js +5 -2
- package/dist/trpc/routers/applications.js.map +1 -1
- package/dist/trpc/routers/assets.d.ts +18 -0
- package/dist/trpc/routers/assets.d.ts.map +1 -1
- package/dist/trpc/routers/assets.js +20 -5
- package/dist/trpc/routers/assets.js.map +1 -1
- package/dist/trpc/routers/bug-reports.d.ts +33 -0
- package/dist/trpc/routers/bug-reports.d.ts.map +1 -0
- package/dist/trpc/routers/bug-reports.js +69 -0
- package/dist/trpc/routers/bug-reports.js.map +1 -0
- package/dist/trpc/routers/collections.d.ts.map +1 -1
- package/dist/trpc/routers/collections.js +16 -10
- package/dist/trpc/routers/collections.js.map +1 -1
- package/dist/trpc/routers/credits.d.ts.map +1 -1
- package/dist/trpc/routers/credits.js +11 -1
- package/dist/trpc/routers/credits.js.map +1 -1
- package/dist/trpc/routers/documents.d.ts.map +1 -1
- package/dist/trpc/routers/documents.js +8 -2
- package/dist/trpc/routers/documents.js.map +1 -1
- package/dist/trpc/routers/error-traces.d.ts +132 -0
- package/dist/trpc/routers/error-traces.d.ts.map +1 -0
- package/dist/trpc/routers/error-traces.js +118 -0
- package/dist/trpc/routers/error-traces.js.map +1 -0
- package/dist/trpc/routers/extension.d.ts +3 -3
- package/dist/trpc/routers/extension.d.ts.map +1 -1
- package/dist/trpc/routers/extension.js +13 -9
- package/dist/trpc/routers/extension.js.map +1 -1
- package/dist/trpc/routers/gameDraftHistory.d.ts +7 -0
- package/dist/trpc/routers/gameDraftHistory.d.ts.map +1 -0
- package/dist/trpc/routers/gameDraftHistory.js +40 -0
- package/dist/trpc/routers/gameDraftHistory.js.map +1 -0
- package/dist/trpc/routers/games.d.ts +59974 -5414
- package/dist/trpc/routers/games.d.ts.map +1 -1
- package/dist/trpc/routers/games.js +531 -136
- package/dist/trpc/routers/games.js.map +1 -1
- package/dist/trpc/routers/jobs.d.ts +42 -0
- package/dist/trpc/routers/jobs.d.ts.map +1 -1
- package/dist/trpc/routers/jobs.js +89 -4
- package/dist/trpc/routers/jobs.js.map +1 -1
- package/dist/trpc/routers/js-scripts.d.ts.map +1 -1
- package/dist/trpc/routers/js-scripts.js +18 -2
- package/dist/trpc/routers/js-scripts.js.map +1 -1
- package/dist/trpc/routers/mcp-config.d.ts +3 -1
- package/dist/trpc/routers/mcp-config.d.ts.map +1 -1
- package/dist/trpc/routers/mcp-config.js +46 -208
- package/dist/trpc/routers/mcp-config.js.map +1 -1
- package/dist/trpc/routers/messages.d.ts +10 -0
- package/dist/trpc/routers/messages.d.ts.map +1 -1
- package/dist/trpc/routers/messages.js +16 -2
- package/dist/trpc/routers/messages.js.map +1 -1
- package/dist/trpc/routers/models.d.ts +130 -0
- package/dist/trpc/routers/models.d.ts.map +1 -1
- package/dist/trpc/routers/models.js +119 -61
- package/dist/trpc/routers/models.js.map +1 -1
- package/dist/trpc/routers/packs.d.ts.map +1 -1
- package/dist/trpc/routers/packs.js +18 -4
- package/dist/trpc/routers/packs.js.map +1 -1
- package/dist/trpc/routers/projects.d.ts +66 -2
- package/dist/trpc/routers/projects.d.ts.map +1 -1
- package/dist/trpc/routers/projects.js +19 -2
- package/dist/trpc/routers/projects.js.map +1 -1
- package/dist/trpc/routers/runs.d.ts +472 -0
- package/dist/trpc/routers/runs.d.ts.map +1 -0
- package/dist/trpc/routers/runs.js +40 -0
- package/dist/trpc/routers/runs.js.map +1 -0
- package/dist/trpc/routers/settings.d.ts +3 -0
- package/dist/trpc/routers/settings.d.ts.map +1 -1
- package/dist/trpc/routers/settings.js +32 -5
- package/dist/trpc/routers/settings.js.map +1 -1
- package/dist/trpc/routers/sketch.d.ts +44 -0
- package/dist/trpc/routers/sketch.d.ts.map +1 -1
- package/dist/trpc/routers/sketch.js +2 -2
- package/dist/trpc/routers/sketch.js.map +1 -1
- package/dist/trpc/routers/storyboards.d.ts +903 -1
- package/dist/trpc/routers/storyboards.d.ts.map +1 -1
- package/dist/trpc/routers/storyboards.js +8 -5
- package/dist/trpc/routers/storyboards.js.map +1 -1
- package/dist/trpc/routers/threads.d.ts.map +1 -1
- package/dist/trpc/routers/threads.js +8 -2
- package/dist/trpc/routers/threads.js.map +1 -1
- package/dist/trpc/routers/timeline.d.ts +647 -63
- package/dist/trpc/routers/timeline.d.ts.map +1 -1
- package/dist/trpc/routers/timeline.js +193 -4
- package/dist/trpc/routers/timeline.js.map +1 -1
- package/dist/trpc/routers/triggers.d.ts.map +1 -1
- package/dist/trpc/routers/triggers.js +18 -3
- package/dist/trpc/routers/triggers.js.map +1 -1
- package/dist/trpc/routers/users.d.ts +3 -2
- package/dist/trpc/routers/users.d.ts.map +1 -1
- package/dist/trpc/routers/users.js +25 -27
- package/dist/trpc/routers/users.js.map +1 -1
- package/dist/trpc/routers/worker.d.ts +10 -9
- package/dist/trpc/routers/worker.d.ts.map +1 -1
- package/dist/trpc/routers/worker.js +40 -16
- package/dist/trpc/routers/worker.js.map +1 -1
- package/dist/trpc/routers/workflows.d.ts +202 -3
- package/dist/trpc/routers/workflows.d.ts.map +1 -1
- package/dist/trpc/routers/workflows.js +72 -12
- package/dist/trpc/routers/workflows.js.map +1 -1
- package/dist/trpc/sandbox-coverage.d.ts.map +1 -1
- package/dist/trpc/sandbox-coverage.js +119 -0
- package/dist/trpc/sandbox-coverage.js.map +1 -1
- package/dist/websocket-client-session.d.ts +4 -2
- package/dist/websocket-client-session.d.ts.map +1 -1
- package/dist/websocket-client-session.js +23 -3
- package/dist/websocket-client-session.js.map +1 -1
- package/dist/worker-settings-env.d.ts +23 -0
- package/dist/worker-settings-env.d.ts.map +1 -0
- package/dist/worker-settings-env.js +47 -0
- package/dist/worker-settings-env.js.map +1 -0
- package/dist/workflow-interface-service.d.ts +7 -0
- package/dist/workflow-interface-service.d.ts.map +1 -1
- package/package.json +58 -41
- package/dist/extension-cdp-bridge.d.ts +0 -85
- package/dist/extension-cdp-bridge.d.ts.map +0 -1
- package/dist/extension-cdp-bridge.js +0 -163
- package/dist/extension-cdp-bridge.js.map +0 -1
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register the NodeTool MCP server in the config files of local agent
|
|
3
|
+
* harnesses: Claude Code, Codex, and OpenCode.
|
|
4
|
+
*
|
|
5
|
+
* Both `nodetool mcp install` and the Settings → MCP buttons write through this
|
|
6
|
+
* module, so the two surfaces produce the same entry in the same place.
|
|
7
|
+
*
|
|
8
|
+
* An entry launches NodeTool one of two ways:
|
|
9
|
+
* - `stdio`: the harness starts `nodetool mcp serve` itself. This needs no
|
|
10
|
+
* running app. When the app is running, the stdio process forwards to it.
|
|
11
|
+
* - `http`: the harness connects to a running NodeTool server's `/mcp` mount.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { delimiter, join } from "node:path";
|
|
15
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
16
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
17
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
18
|
+
export const MCP_CLIENT_IDS = [
|
|
19
|
+
"claude",
|
|
20
|
+
"codex",
|
|
21
|
+
"opencode"
|
|
22
|
+
];
|
|
23
|
+
export const MCP_CLIENT_LABELS = {
|
|
24
|
+
claude: "Claude Code",
|
|
25
|
+
codex: "Codex",
|
|
26
|
+
opencode: "OpenCode"
|
|
27
|
+
};
|
|
28
|
+
/** The name the server has in every client config. */
|
|
29
|
+
const SERVER_NAME = "nodetool";
|
|
30
|
+
/** The published CLI package. It has two bins, so `npx` needs `--package`. */
|
|
31
|
+
const CLI_PACKAGE = "@nodetool-ai/cli";
|
|
32
|
+
const CODEX_BEGIN = "# BEGIN NODETOOL MCP";
|
|
33
|
+
const CODEX_END = "# END NODETOOL MCP";
|
|
34
|
+
const CODEX_BLOCK = /# BEGIN NODETOOL MCP[\s\S]*?# END NODETOOL MCP\n?/;
|
|
35
|
+
/**
|
|
36
|
+
* Codex and OpenCode give a stdio server a short start window by default. The
|
|
37
|
+
* first `npx` launch downloads the CLI, and a video generation can run for
|
|
38
|
+
* minutes, so both limits are raised.
|
|
39
|
+
*/
|
|
40
|
+
const STARTUP_TIMEOUT_SEC = 120;
|
|
41
|
+
const TOOL_TIMEOUT_SEC = 900;
|
|
42
|
+
/** The stdio launch for `nodetool mcp serve`. */
|
|
43
|
+
export function stdioLaunch(options) {
|
|
44
|
+
if (options.npx) {
|
|
45
|
+
return {
|
|
46
|
+
transport: "stdio",
|
|
47
|
+
command: "npx",
|
|
48
|
+
args: ["-y", `--package=${CLI_PACKAGE}`, "nodetool", "mcp", "serve"]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return { transport: "stdio", command: "nodetool", args: ["mcp", "serve"] };
|
|
52
|
+
}
|
|
53
|
+
/** The first executable with this name on `PATH`, or null. */
|
|
54
|
+
function findOnPath(name, env) {
|
|
55
|
+
const dirs = (env["PATH"] ?? "").split(delimiter).filter(Boolean);
|
|
56
|
+
const exts = process.platform === "win32"
|
|
57
|
+
? (env["PATHEXT"] ?? ".EXE;.CMD;.BAT").split(";")
|
|
58
|
+
: [""];
|
|
59
|
+
for (const dir of dirs) {
|
|
60
|
+
for (const ext of exts) {
|
|
61
|
+
const candidate = join(dir, name + ext);
|
|
62
|
+
if (existsSync(candidate))
|
|
63
|
+
return candidate;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/** True when an executable with this name is on `PATH`. */
|
|
69
|
+
export function isOnPath(name, env = process.env) {
|
|
70
|
+
return findOnPath(name, env) !== null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* True when the `nodetool` a client would run is this TypeScript CLI. The
|
|
74
|
+
* legacy Python installer puts a bash `nodetool` on `PATH` that has no
|
|
75
|
+
* `mcp serve`, so a match by name alone is not enough.
|
|
76
|
+
*/
|
|
77
|
+
export function hasNodetoolCli(env = process.env) {
|
|
78
|
+
const found = findOnPath("nodetool", env);
|
|
79
|
+
if (!found)
|
|
80
|
+
return false;
|
|
81
|
+
try {
|
|
82
|
+
const head = readFileSync(realpathSync(found), "utf8").slice(0, 512);
|
|
83
|
+
return process.platform === "win32"
|
|
84
|
+
? head.includes("nodetool.js")
|
|
85
|
+
: /^#!.*\bnode\b/.test(head);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** One line a person can read: the command, or the URL. */
|
|
92
|
+
export function describeLaunch(launch) {
|
|
93
|
+
return launch.transport === "stdio"
|
|
94
|
+
? [launch.command, ...launch.args].join(" ")
|
|
95
|
+
: launch.url;
|
|
96
|
+
}
|
|
97
|
+
/** The `mcpServers` JSON block most MCP clients accept. */
|
|
98
|
+
export function mcpServersSnippet(launch) {
|
|
99
|
+
const server = launch.transport === "stdio"
|
|
100
|
+
? { command: launch.command, args: launch.args }
|
|
101
|
+
: { type: "http", url: launch.url };
|
|
102
|
+
return JSON.stringify({ mcpServers: { [SERVER_NAME]: server } }, null, 2);
|
|
103
|
+
}
|
|
104
|
+
export function mcpClientConfigPath(client, home) {
|
|
105
|
+
switch (client) {
|
|
106
|
+
case "claude":
|
|
107
|
+
return join(home, ".claude.json");
|
|
108
|
+
case "codex":
|
|
109
|
+
return join(home, ".codex", "config.toml");
|
|
110
|
+
case "opencode":
|
|
111
|
+
return join(home, ".config", "opencode", "opencode.json");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** True when the client looks installed: its config dir or its binary. */
|
|
115
|
+
export function isMcpClientPresent(client, home) {
|
|
116
|
+
switch (client) {
|
|
117
|
+
case "claude":
|
|
118
|
+
return (existsSync(join(home, ".claude.json")) ||
|
|
119
|
+
existsSync(join(home, ".claude")) ||
|
|
120
|
+
isOnPath("claude"));
|
|
121
|
+
case "codex":
|
|
122
|
+
return existsSync(join(home, ".codex")) || isOnPath("codex");
|
|
123
|
+
case "opencode":
|
|
124
|
+
return (existsSync(join(home, ".config", "opencode")) || isOnPath("opencode"));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function readJson(path) {
|
|
128
|
+
if (!existsSync(path))
|
|
129
|
+
return {};
|
|
130
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
131
|
+
}
|
|
132
|
+
function writeJson(path, value) {
|
|
133
|
+
writeFileSync(path, JSON.stringify(value, null, 2) + "\n");
|
|
134
|
+
}
|
|
135
|
+
function asObject(value) {
|
|
136
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
137
|
+
? value
|
|
138
|
+
: {};
|
|
139
|
+
}
|
|
140
|
+
function stringArray(value) {
|
|
141
|
+
return Array.isArray(value)
|
|
142
|
+
? value.filter((item) => typeof item === "string")
|
|
143
|
+
: [];
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Earlier installers wrote the Claude Code entry under `projects[<home>]`. That
|
|
147
|
+
* is the local scope of the home directory, so the server appeared only in
|
|
148
|
+
* sessions started in `~`. Remove that entry when it is the loopback HTTP
|
|
149
|
+
* shape those installers wrote. Anything else there belongs to the user.
|
|
150
|
+
*/
|
|
151
|
+
function removeLegacyClaudeEntry(config, home) {
|
|
152
|
+
const project = asObject(asObject(config["projects"])[home]);
|
|
153
|
+
const servers = asObject(project["mcpServers"]);
|
|
154
|
+
const entry = asObject(servers[SERVER_NAME]);
|
|
155
|
+
const url = typeof entry["url"] === "string" ? entry["url"] : "";
|
|
156
|
+
if (entry["type"] !== "http" || !/^https?:\/\/127\.0\.0\.1:\d+\/mcp$/.test(url)) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
delete servers[SERVER_NAME];
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
function claudeEntry(launch) {
|
|
163
|
+
return launch.transport === "stdio"
|
|
164
|
+
? { type: "stdio", command: launch.command, args: launch.args, env: {} }
|
|
165
|
+
: { type: "http", url: launch.url };
|
|
166
|
+
}
|
|
167
|
+
function opencodeEntry(launch) {
|
|
168
|
+
const timeout = STARTUP_TIMEOUT_SEC * 1000;
|
|
169
|
+
return launch.transport === "stdio"
|
|
170
|
+
? {
|
|
171
|
+
type: "local",
|
|
172
|
+
command: [launch.command, ...launch.args],
|
|
173
|
+
enabled: true,
|
|
174
|
+
timeout
|
|
175
|
+
}
|
|
176
|
+
: { type: "remote", url: launch.url, enabled: true, timeout };
|
|
177
|
+
}
|
|
178
|
+
/** TOML basic strings accept JSON string escaping, so quotes cannot break out. */
|
|
179
|
+
function codexBlock(launch) {
|
|
180
|
+
const location = launch.transport === "stdio"
|
|
181
|
+
? [
|
|
182
|
+
`command = ${JSON.stringify(launch.command)}`,
|
|
183
|
+
`args = ${JSON.stringify(launch.args)}`
|
|
184
|
+
]
|
|
185
|
+
: [`url = ${JSON.stringify(launch.url)}`];
|
|
186
|
+
return [
|
|
187
|
+
CODEX_BEGIN,
|
|
188
|
+
`[mcp_servers.${SERVER_NAME}]`,
|
|
189
|
+
...location,
|
|
190
|
+
`startup_timeout_sec = ${STARTUP_TIMEOUT_SEC}`,
|
|
191
|
+
`tool_timeout_sec = ${TOOL_TIMEOUT_SEC}`,
|
|
192
|
+
CODEX_END
|
|
193
|
+
].join("\n");
|
|
194
|
+
}
|
|
195
|
+
function launchFromEntry(entry) {
|
|
196
|
+
if (typeof entry["url"] === "string") {
|
|
197
|
+
return { transport: "http", url: entry["url"] };
|
|
198
|
+
}
|
|
199
|
+
const command = entry["command"];
|
|
200
|
+
if (typeof command === "string") {
|
|
201
|
+
return { transport: "stdio", command, args: stringArray(entry["args"]) };
|
|
202
|
+
}
|
|
203
|
+
// OpenCode stores the command and its arguments as one array.
|
|
204
|
+
const [head, ...rest] = stringArray(command);
|
|
205
|
+
return head ? { transport: "stdio", command: head, args: rest } : null;
|
|
206
|
+
}
|
|
207
|
+
function parseCodexLaunch(block) {
|
|
208
|
+
const url = /^url\s*=\s*(".*")\s*$/m.exec(block)?.[1];
|
|
209
|
+
if (url)
|
|
210
|
+
return { transport: "http", url: JSON.parse(url) };
|
|
211
|
+
const command = /^command\s*=\s*(".*")\s*$/m.exec(block)?.[1];
|
|
212
|
+
if (!command)
|
|
213
|
+
return null;
|
|
214
|
+
const args = /^args\s*=\s*(\[.*\])\s*$/m.exec(block)?.[1];
|
|
215
|
+
return {
|
|
216
|
+
transport: "stdio",
|
|
217
|
+
command: JSON.parse(command),
|
|
218
|
+
args: args ? stringArray(JSON.parse(args)) : []
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** The NodeTool entry the client has now, or null. Throws on unreadable config. */
|
|
222
|
+
export function readMcpClientEntry(client, home) {
|
|
223
|
+
const path = mcpClientConfigPath(client, home);
|
|
224
|
+
if (!existsSync(path))
|
|
225
|
+
return null;
|
|
226
|
+
switch (client) {
|
|
227
|
+
case "claude": {
|
|
228
|
+
const servers = asObject(readJson(path)["mcpServers"]);
|
|
229
|
+
return launchFromEntry(asObject(servers[SERVER_NAME]));
|
|
230
|
+
}
|
|
231
|
+
case "codex": {
|
|
232
|
+
const block = CODEX_BLOCK.exec(readFileSync(path, "utf8"))?.[0];
|
|
233
|
+
return block ? parseCodexLaunch(block) : null;
|
|
234
|
+
}
|
|
235
|
+
case "opencode": {
|
|
236
|
+
const servers = asObject(readJson(path)["mcp"]);
|
|
237
|
+
return launchFromEntry(asObject(servers[SERVER_NAME]));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** Write the NodeTool entry. Returns the config file path. */
|
|
242
|
+
export function writeMcpClientEntry(client, launch, home) {
|
|
243
|
+
const path = mcpClientConfigPath(client, home);
|
|
244
|
+
switch (client) {
|
|
245
|
+
case "claude": {
|
|
246
|
+
// Top-level `mcpServers` is Claude Code's user scope: every project.
|
|
247
|
+
const config = readJson(path);
|
|
248
|
+
removeLegacyClaudeEntry(config, home);
|
|
249
|
+
const servers = asObject(config["mcpServers"]);
|
|
250
|
+
servers[SERVER_NAME] = claudeEntry(launch);
|
|
251
|
+
config["mcpServers"] = servers;
|
|
252
|
+
writeJson(path, config);
|
|
253
|
+
return path;
|
|
254
|
+
}
|
|
255
|
+
case "codex": {
|
|
256
|
+
mkdirSync(join(home, ".codex"), { recursive: true });
|
|
257
|
+
const block = codexBlock(launch);
|
|
258
|
+
const content = existsSync(path) ? readFileSync(path, "utf8") : "";
|
|
259
|
+
const next = CODEX_BLOCK.test(content)
|
|
260
|
+
? content.replace(CODEX_BLOCK, block + "\n")
|
|
261
|
+
: (content.trim() ? content.trimEnd() + "\n\n" : "") + block + "\n";
|
|
262
|
+
writeFileSync(path, next);
|
|
263
|
+
return path;
|
|
264
|
+
}
|
|
265
|
+
case "opencode": {
|
|
266
|
+
mkdirSync(join(home, ".config", "opencode"), { recursive: true });
|
|
267
|
+
const config = readJson(path);
|
|
268
|
+
const servers = asObject(config["mcp"]);
|
|
269
|
+
servers[SERVER_NAME] = opencodeEntry(launch);
|
|
270
|
+
config["mcp"] = servers;
|
|
271
|
+
writeJson(path, config);
|
|
272
|
+
return path;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/** Remove the NodeTool entry. Returns false when there was none. */
|
|
277
|
+
export function removeMcpClientEntry(client, home) {
|
|
278
|
+
const path = mcpClientConfigPath(client, home);
|
|
279
|
+
if (!existsSync(path))
|
|
280
|
+
return false;
|
|
281
|
+
switch (client) {
|
|
282
|
+
case "claude": {
|
|
283
|
+
const config = readJson(path);
|
|
284
|
+
const servers = asObject(config["mcpServers"]);
|
|
285
|
+
const hadEntry = SERVER_NAME in servers;
|
|
286
|
+
delete servers[SERVER_NAME];
|
|
287
|
+
const hadLegacy = removeLegacyClaudeEntry(config, home);
|
|
288
|
+
if (!hadEntry && !hadLegacy)
|
|
289
|
+
return false;
|
|
290
|
+
writeJson(path, config);
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
case "codex": {
|
|
294
|
+
const content = readFileSync(path, "utf8");
|
|
295
|
+
if (!CODEX_BLOCK.test(content))
|
|
296
|
+
return false;
|
|
297
|
+
writeFileSync(path, content.replace(CODEX_BLOCK, "").trimEnd() + "\n");
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
case "opencode": {
|
|
301
|
+
const config = readJson(path);
|
|
302
|
+
const servers = asObject(config["mcp"]);
|
|
303
|
+
if (!(SERVER_NAME in servers))
|
|
304
|
+
return false;
|
|
305
|
+
delete servers[SERVER_NAME];
|
|
306
|
+
writeJson(path, config);
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Start the server the way a harness would, complete the MCP handshake, and
|
|
313
|
+
* list its tools. A stdio probe also warms the `npx` cache, so the harness's
|
|
314
|
+
* own first start stays inside its startup timeout.
|
|
315
|
+
*/
|
|
316
|
+
export async function probeMcpLaunch(launch, timeoutMs = STARTUP_TIMEOUT_SEC * 1000) {
|
|
317
|
+
const started = Date.now();
|
|
318
|
+
let stderr = "";
|
|
319
|
+
let transport;
|
|
320
|
+
if (launch.transport === "stdio") {
|
|
321
|
+
const stdio = new StdioClientTransport({
|
|
322
|
+
command: launch.command,
|
|
323
|
+
args: launch.args,
|
|
324
|
+
stderr: "pipe"
|
|
325
|
+
});
|
|
326
|
+
stdio.stderr?.on("data", (chunk) => {
|
|
327
|
+
stderr = (stderr + chunk.toString()).slice(-2000);
|
|
328
|
+
});
|
|
329
|
+
transport = stdio;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
transport = new StreamableHTTPClientTransport(new URL(launch.url));
|
|
333
|
+
}
|
|
334
|
+
const client = new Client({ name: "nodetool-mcp-probe", version: "1.0.0" });
|
|
335
|
+
try {
|
|
336
|
+
await client.connect(transport, { timeout: timeoutMs });
|
|
337
|
+
const { tools } = await client.listTools(undefined, { timeout: timeoutMs });
|
|
338
|
+
return {
|
|
339
|
+
serverName: client.getServerVersion()?.name ?? "",
|
|
340
|
+
tools: tools.map((tool) => tool.name),
|
|
341
|
+
elapsedMs: Date.now() - started
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
346
|
+
const tail = stderr.trim().split("\n").slice(-5).join("\n");
|
|
347
|
+
throw new Error(tail ? `${reason}\n${tail}` : reason);
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
await client.close();
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=mcp-client-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client-config.js","sourceRoot":"","sources":["../src/mcp-client-config.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.d.ts
CHANGED
|
@@ -57,6 +57,13 @@ export declare function createMcpServer(options?: McpServerOptions): McpServer;
|
|
|
57
57
|
export declare function createMcpStdioTransport(): StdioServerTransport;
|
|
58
58
|
/** Connect stdio to the local API process when its MCP mount is available. */
|
|
59
59
|
export declare function forwardMcpStdioToLocalServer(url?: string, stdio?: StdioServerTransport): Promise<boolean>;
|
|
60
|
+
/** Time a restarted local server gets to accept connections again. */
|
|
61
|
+
export declare const MCP_FORWARDER_RECONNECT_WINDOW_MS = 30000;
|
|
62
|
+
/**
|
|
63
|
+
* "session-lost" and "unreachable" mean the server never ran the request;
|
|
64
|
+
* "other" covers everything else, including a connection dropped mid-call.
|
|
65
|
+
*/
|
|
66
|
+
export declare function classifyForwardFailure(error: unknown): "session-lost" | "unreachable" | "other";
|
|
60
67
|
/**
|
|
61
68
|
* How long an HTTP session may sit idle before it is closed. Every session
|
|
62
69
|
* holds a transport, an `McpServer`, and that session's whole tool registry,
|
package/dist/mcp-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAejF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAG/E,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,wBAAwB,CAAC,EAAE,uBAAuB,CAAC;IACnD,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,aAAa,GAAG,gBAAgB,GAAG,cAAc,CAAC;KAC3D,CAAC;IACF,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAGuB,CAAC;AAI/D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAgBrE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D;AAED,8EAA8E;AAC9E,wBAAsB,4BAA4B,CAChD,GAAG,GAAE,MAA+B,EACpC,KAAK,GAAE,oBAAgD,GACtD,OAAO,CAAC,OAAO,CAAC,CAkMlB;AAED,sEAAsE;AACtE,eAAO,MAAM,iCAAiC,QAAS,CAAC;AAiBxD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,cAAc,GAAG,aAAa,GAAG,OAAO,CAc1C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AACtD,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,MAAM,CAAC;AA0EpC;uCACuC;AACvC,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AAgDD,wBAAgB,oBAAoB,IAAI,MAAM,CAK7C;AAgBD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA+F1B"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
9
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
10
|
-
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
10
|
+
import { StreamableHTTPClientTransport, StreamableHTTPError } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
11
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
12
|
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
13
|
+
import { ErrorCode, isInitializedNotification, isInitializeRequest, isJSONRPCRequest, isJSONRPCResultResponse } from "@modelcontextprotocol/sdk/types.js";
|
|
14
|
+
import { Agent as UndiciAgent } from "undici";
|
|
13
15
|
import { MCP_GUEST_CONTRACT } from "@nodetool-ai/agents";
|
|
14
16
|
import { createLogger } from "@nodetool-ai/config";
|
|
15
17
|
import { registerAgentMcpTools } from "./mcp-agent-tools.js";
|
|
@@ -70,33 +72,152 @@ export async function forwardMcpStdioToLocalServer(url = getLocalMcpServerUrl(),
|
|
|
70
72
|
}
|
|
71
73
|
await probe.close();
|
|
72
74
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
// The client's own handshake, kept so a replacement session can replay it.
|
|
76
|
+
let initializeRequest;
|
|
77
|
+
let initializedNotification;
|
|
78
|
+
// While a replacement session replays `initialize`, its response belongs to
|
|
79
|
+
// the forwarder, not to the client, which already received one.
|
|
80
|
+
let replayResponse;
|
|
81
|
+
const openTransport = () => {
|
|
82
|
+
const transport = new StreamableHTTPClientTransport(endpoint, {
|
|
83
|
+
fetch: fetchWithoutTimeouts
|
|
84
|
+
});
|
|
85
|
+
transport.onmessage = (message) => {
|
|
86
|
+
if (isJSONRPCResultResponse(message) && "protocolVersion" in message.result) {
|
|
87
|
+
const version = message.result.protocolVersion;
|
|
88
|
+
if (typeof version === "string")
|
|
89
|
+
transport.setProtocolVersion(version);
|
|
90
|
+
}
|
|
91
|
+
if (replayResponse?.transport === transport &&
|
|
92
|
+
"id" in message &&
|
|
93
|
+
message.id === replayResponse.id) {
|
|
94
|
+
replayResponse.resolve();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
void stdio.send(message);
|
|
98
|
+
};
|
|
99
|
+
transport.onerror = (error) => {
|
|
100
|
+
log.warn("Local MCP HTTP transport failed", { error: error.message });
|
|
101
|
+
};
|
|
102
|
+
return transport;
|
|
103
|
+
};
|
|
104
|
+
const replayHandshake = async (transport) => {
|
|
105
|
+
if (!initializeRequest) {
|
|
106
|
+
throw new Error("The client never initialized the MCP session");
|
|
107
|
+
}
|
|
108
|
+
const request = initializeRequest;
|
|
109
|
+
let timer;
|
|
110
|
+
try {
|
|
111
|
+
await Promise.race([
|
|
112
|
+
new Promise((resolve, reject) => {
|
|
113
|
+
replayResponse = { transport, id: request.id, resolve };
|
|
114
|
+
transport.send(request).catch(reject);
|
|
115
|
+
}),
|
|
116
|
+
new Promise((_, reject) => {
|
|
117
|
+
timer = setTimeout(() => reject(new Error("Replaying the MCP handshake timed out")), MCP_FORWARDER_HANDSHAKE_TIMEOUT_MS);
|
|
118
|
+
})
|
|
119
|
+
]);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
clearTimeout(timer);
|
|
123
|
+
replayResponse = undefined;
|
|
124
|
+
}
|
|
125
|
+
if (initializedNotification) {
|
|
126
|
+
await transport.send(initializedNotification);
|
|
79
127
|
}
|
|
80
|
-
void stdio.send(message);
|
|
81
128
|
};
|
|
82
|
-
http
|
|
83
|
-
|
|
129
|
+
let http = openTransport();
|
|
130
|
+
let reconnection;
|
|
131
|
+
// One replacement session for every request that failed on the same one.
|
|
132
|
+
// A restarting server refuses connections for a few seconds, so retry those.
|
|
133
|
+
const reconnect = (failed) => {
|
|
134
|
+
if (http !== failed)
|
|
135
|
+
return reconnection ?? Promise.resolve();
|
|
136
|
+
reconnection ??= (async () => {
|
|
137
|
+
void failed.close().catch(() => undefined);
|
|
138
|
+
const deadline = Date.now() + MCP_FORWARDER_RECONNECT_WINDOW_MS;
|
|
139
|
+
for (;;) {
|
|
140
|
+
const next = openTransport();
|
|
141
|
+
try {
|
|
142
|
+
await next.start();
|
|
143
|
+
await replayHandshake(next);
|
|
144
|
+
http = next;
|
|
145
|
+
log.info("Reopened the local MCP session");
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
await next.close().catch(() => undefined);
|
|
150
|
+
if (classifyForwardFailure(error) !== "unreachable" ||
|
|
151
|
+
Date.now() >= deadline) {
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
await new Promise((resolve) => setTimeout(resolve, MCP_FORWARDER_RECONNECT_DELAY_MS));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
})().finally(() => {
|
|
158
|
+
reconnection = undefined;
|
|
159
|
+
});
|
|
160
|
+
return reconnection;
|
|
161
|
+
};
|
|
162
|
+
// A request is resent only when the server provably never ran it: its
|
|
163
|
+
// session was gone (404) or nothing accepted the connection. A connection
|
|
164
|
+
// that drops mid-call may have run the tool already, so that request fails.
|
|
165
|
+
const forward = async (message) => {
|
|
166
|
+
await reconnection?.catch(() => undefined);
|
|
167
|
+
const transport = http;
|
|
168
|
+
try {
|
|
169
|
+
await transport.send(message);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (!initializeRequest ||
|
|
173
|
+
isInitializeRequest(message) ||
|
|
174
|
+
classifyForwardFailure(error) === "other") {
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
log.info("Local MCP session lost; reconnecting", {
|
|
178
|
+
error: error instanceof Error ? error.message : String(error)
|
|
179
|
+
});
|
|
180
|
+
await reconnect(transport);
|
|
181
|
+
await http.send(message);
|
|
182
|
+
}
|
|
84
183
|
};
|
|
85
184
|
let initialization = Promise.resolve();
|
|
86
185
|
stdio.onmessage = (message) => {
|
|
87
|
-
|
|
88
|
-
|
|
186
|
+
if (isInitializeRequest(message)) {
|
|
187
|
+
initializeRequest = message;
|
|
188
|
+
}
|
|
189
|
+
else if (isInitializedNotification(message)) {
|
|
190
|
+
initializedNotification = message;
|
|
191
|
+
}
|
|
192
|
+
const send = initialization.then(() => forward(message));
|
|
193
|
+
if (isInitializeRequest(message)) {
|
|
89
194
|
initialization = send;
|
|
90
195
|
}
|
|
91
196
|
void send.catch((error) => {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
197
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
198
|
+
log.warn("Forwarding MCP request failed", { error: reason });
|
|
199
|
+
// Without a session there is nothing to keep open.
|
|
200
|
+
if (isInitializeRequest(message)) {
|
|
201
|
+
void stdio.close();
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Fail this one request and keep stdio open: the next request
|
|
205
|
+
// reconnects once the local server is back.
|
|
206
|
+
if (isJSONRPCRequest(message)) {
|
|
207
|
+
void stdio.send({
|
|
208
|
+
jsonrpc: "2.0",
|
|
209
|
+
id: message.id,
|
|
210
|
+
error: {
|
|
211
|
+
code: ErrorCode.ConnectionClosed,
|
|
212
|
+
message: `NodeTool server request failed: ${reason}`
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
96
216
|
});
|
|
97
217
|
};
|
|
98
218
|
stdio.onclose = () => {
|
|
99
219
|
void (async () => {
|
|
220
|
+
await reconnection?.catch(() => undefined);
|
|
100
221
|
if (http.sessionId) {
|
|
101
222
|
await http.terminateSession().catch(() => undefined);
|
|
102
223
|
}
|
|
@@ -107,6 +228,32 @@ export async function forwardMcpStdioToLocalServer(url = getLocalMcpServerUrl(),
|
|
|
107
228
|
await stdio.start();
|
|
108
229
|
return true;
|
|
109
230
|
}
|
|
231
|
+
/** Time a restarted local server gets to accept connections again. */
|
|
232
|
+
export const MCP_FORWARDER_RECONNECT_WINDOW_MS = 30_000;
|
|
233
|
+
const MCP_FORWARDER_RECONNECT_DELAY_MS = 500;
|
|
234
|
+
const MCP_FORWARDER_HANDSHAKE_TIMEOUT_MS = 10_000;
|
|
235
|
+
/**
|
|
236
|
+
* The mount answers with JSON (`enableJsonResponse`), so response headers
|
|
237
|
+
* arrive only when the tool finishes. undici's default 300 s headers timeout
|
|
238
|
+
* would fail every call longer than five minutes.
|
|
239
|
+
*/
|
|
240
|
+
const noTimeoutDispatcher = new UndiciAgent({ headersTimeout: 0, bodyTimeout: 0 });
|
|
241
|
+
const fetchWithoutTimeouts = (url, init) => fetch(url, { ...init, dispatcher: noTimeoutDispatcher });
|
|
242
|
+
/**
|
|
243
|
+
* "session-lost" and "unreachable" mean the server never ran the request;
|
|
244
|
+
* "other" covers everything else, including a connection dropped mid-call.
|
|
245
|
+
*/
|
|
246
|
+
export function classifyForwardFailure(error) {
|
|
247
|
+
if (error instanceof StreamableHTTPError && error.code === 404) {
|
|
248
|
+
return "session-lost";
|
|
249
|
+
}
|
|
250
|
+
for (let current = error; current instanceof Error; current = current.cause) {
|
|
251
|
+
if (current.code === "ECONNREFUSED") {
|
|
252
|
+
return "unreachable";
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return "other";
|
|
256
|
+
}
|
|
110
257
|
/**
|
|
111
258
|
* How long an HTTP session may sit idle before it is closed. Every session
|
|
112
259
|
* holds a transport, an `McpServer`, and that session's whole tool registry,
|