@cyanheads/mcp-ts-core 0.11.4 → 0.12.0
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/AGENTS.md +28 -24
- package/CLAUDE.md +28 -24
- package/README.md +10 -10
- package/biome.json +1 -1
- package/changelog/0.11.x/0.11.5.md +28 -0
- package/changelog/0.12.x/0.12.0.md +96 -0
- package/changelog/template.md +55 -16
- package/dist/cli/init.js +1 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/config/index.d.ts +0 -18
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +0 -25
- package/dist/config/index.js.map +1 -1
- package/dist/core/app.d.ts +5 -7
- package/dist/core/app.d.ts.map +1 -1
- package/dist/core/app.js +18 -27
- package/dist/core/app.js.map +1 -1
- package/dist/core/context.d.ts +90 -57
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +32 -33
- package/dist/core/context.js.map +1 -1
- package/dist/core/gcPressure.d.ts.map +1 -1
- package/dist/core/gcPressure.js +3 -4
- package/dist/core/gcPressure.js.map +1 -1
- package/dist/core/index.d.ts +6 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +10 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/serverManifest.d.ts +1 -3
- package/dist/core/serverManifest.d.ts.map +1 -1
- package/dist/core/serverManifest.js +9 -4
- package/dist/core/serverManifest.js.map +1 -1
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js +32 -35
- package/dist/core/worker.js.map +1 -1
- package/dist/logs/combined.log +10 -0
- package/dist/logs/error.log +6 -0
- package/dist/logs/interactions.log +0 -0
- package/dist/mcp-server/inputRequired.d.ts +52 -0
- package/dist/mcp-server/inputRequired.d.ts.map +1 -0
- package/dist/mcp-server/inputRequired.js +76 -0
- package/dist/mcp-server/inputRequired.js.map +1 -0
- package/dist/mcp-server/notifications.d.ts +33 -31
- package/dist/mcp-server/notifications.d.ts.map +1 -1
- package/dist/mcp-server/notifications.js +34 -26
- package/dist/mcp-server/notifications.js.map +1 -1
- package/dist/mcp-server/prompts/prompt-registration.d.ts +2 -2
- package/dist/mcp-server/prompts/prompt-registration.d.ts.map +1 -1
- package/dist/mcp-server/prompts/prompt-registration.js +15 -5
- package/dist/mcp-server/prompts/prompt-registration.js.map +1 -1
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts +1 -1
- package/dist/mcp-server/prompts/utils/promptDefinition.d.ts.map +1 -1
- package/dist/mcp-server/resources/resource-registration.d.ts +3 -3
- package/dist/mcp-server/resources/resource-registration.d.ts.map +1 -1
- package/dist/mcp-server/resources/resource-registration.js +8 -15
- package/dist/mcp-server/resources/resource-registration.js.map +1 -1
- package/dist/mcp-server/resources/resourceSubscriptions.d.ts +45 -0
- package/dist/mcp-server/resources/resourceSubscriptions.d.ts.map +1 -0
- package/dist/mcp-server/resources/resourceSubscriptions.js +51 -0
- package/dist/mcp-server/resources/resourceSubscriptions.js.map +1 -0
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts +3 -5
- package/dist/mcp-server/resources/utils/resourceDefinition.d.ts.map +1 -1
- package/dist/mcp-server/resources/utils/resourceDefinition.js +1 -1
- package/dist/mcp-server/resources/utils/resourceDefinition.js.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts +8 -15
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +21 -22
- package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
- package/dist/mcp-server/server.d.ts +12 -21
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +38 -28
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/mcp-server/tools/tool-registration.d.ts +11 -33
- package/dist/mcp-server/tools/tool-registration.d.ts.map +1 -1
- package/dist/mcp-server/tools/tool-registration.js +17 -243
- package/dist/mcp-server/tools/tool-registration.js.map +1 -1
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts +1 -3
- package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
- package/dist/mcp-server/tools/utils/toolDefinition.js +48 -1
- package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +46 -20
- package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js +131 -25
- package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
- package/dist/mcp-server/transports/ITransport.d.ts +2 -2
- package/dist/mcp-server/transports/ITransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/authFactory.js +1 -1
- package/dist/mcp-server/transports/auth/authFactory.js.map +1 -1
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts +1 -1
- package/dist/mcp-server/transports/auth/lib/authTypes.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/lib/authUtils.js +5 -13
- package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -1
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js +5 -11
- package/dist/mcp-server/transports/auth/strategies/jwtStrategy.js.map +1 -1
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.d.ts.map +1 -1
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js +9 -22
- package/dist/mcp-server/transports/auth/strategies/oauthStrategy.js.map +1 -1
- package/dist/mcp-server/transports/heartbeat.d.ts.map +1 -1
- package/dist/mcp-server/transports/heartbeat.js +4 -8
- package/dist/mcp-server/transports/heartbeat.js.map +1 -1
- package/dist/mcp-server/transports/http/httpErrorHandler.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpErrorHandler.js +6 -24
- package/dist/mcp-server/transports/http/httpErrorHandler.js.map +1 -1
- package/dist/mcp-server/transports/http/httpServer.d.ts +3 -3
- package/dist/mcp-server/transports/http/httpServer.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpServer.js +15 -32
- package/dist/mcp-server/transports/http/httpServer.js.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.d.ts +25 -8
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.js +156 -310
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js +0 -1
- package/dist/mcp-server/transports/http/landing-page/assets/styles.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/handler.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/handler.js +4 -8
- package/dist/mcp-server/transports/http/landing-page/handler.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js +0 -2
- package/dist/mcp-server/transports/http/landing-page/sections/tools.js.map +1 -1
- package/dist/mcp-server/transports/http/protectedResourceMetadata.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js +2 -6
- package/dist/mcp-server/transports/http/protectedResourceMetadata.js.map +1 -1
- package/dist/mcp-server/transports/http/robotsTxt.js +2 -2
- package/dist/mcp-server/transports/http/robotsTxt.js.map +1 -1
- package/dist/mcp-server/transports/http/serverCard.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/serverCard.js +2 -6
- package/dist/mcp-server/transports/http/serverCard.js.map +1 -1
- package/dist/mcp-server/transports/http/sessionStore.d.ts +48 -45
- package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/sessionStore.js +141 -185
- package/dist/mcp-server/transports/http/sessionStore.js.map +1 -1
- package/dist/mcp-server/transports/manager.d.ts +12 -4
- package/dist/mcp-server/transports/manager.d.ts.map +1 -1
- package/dist/mcp-server/transports/manager.js +35 -33
- package/dist/mcp-server/transports/manager.js.map +1 -1
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts +24 -31
- package/dist/mcp-server/transports/stdio/stdioTransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/stdio/stdioTransport.js +23 -38
- package/dist/mcp-server/transports/stdio/stdioTransport.js.map +1 -1
- package/dist/mcp-server/types.d.ts +25 -0
- package/dist/mcp-server/types.d.ts.map +1 -0
- package/dist/mcp-server/types.js +10 -0
- package/dist/mcp-server/types.js.map +1 -0
- package/dist/services/canvas/core/CanvasInstance.d.ts +2 -2
- package/dist/services/canvas/core/CanvasInstance.d.ts.map +1 -1
- package/dist/services/canvas/core/CanvasInstance.js.map +1 -1
- package/dist/services/canvas/core/CanvasRegistry.d.ts +4 -4
- package/dist/services/canvas/core/CanvasRegistry.d.ts.map +1 -1
- package/dist/services/canvas/core/CanvasRegistry.js +8 -18
- package/dist/services/canvas/core/CanvasRegistry.js.map +1 -1
- package/dist/services/canvas/core/DataCanvas.d.ts +5 -5
- package/dist/services/canvas/core/DataCanvas.d.ts.map +1 -1
- package/dist/services/canvas/core/DataCanvas.js +2 -3
- package/dist/services/canvas/core/DataCanvas.js.map +1 -1
- package/dist/services/canvas/core/IDataCanvasProvider.d.ts +11 -11
- package/dist/services/canvas/core/IDataCanvasProvider.d.ts.map +1 -1
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts +11 -11
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -1
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.js +4 -10
- package/dist/services/canvas/providers/duckdb/DuckdbProvider.js.map +1 -1
- package/dist/services/llm/providers/openrouter.provider.d.ts.map +1 -1
- package/dist/services/llm/providers/openrouter.provider.js +2 -5
- package/dist/services/llm/providers/openrouter.provider.js.map +1 -1
- package/dist/services/mirror/core/defineMirror.js +1 -1
- package/dist/services/mirror/core/defineMirror.js.map +1 -1
- package/dist/services/mirror/types.d.ts +5 -5
- package/dist/services/mirror/types.d.ts.map +1 -1
- package/dist/services/speech/providers/elevenlabs.provider.js +1 -1
- package/dist/services/speech/providers/elevenlabs.provider.js.map +1 -1
- package/dist/services/speech/providers/whisper.provider.js +1 -1
- package/dist/services/speech/providers/whisper.provider.js.map +1 -1
- package/dist/storage/core/StorageService.d.ts +1 -1
- package/dist/storage/core/StorageService.d.ts.map +1 -1
- package/dist/storage/core/StorageService.js +12 -20
- package/dist/storage/core/StorageService.js.map +1 -1
- package/dist/storage/core/storageFactory.d.ts.map +1 -1
- package/dist/storage/core/storageFactory.js.map +1 -1
- package/dist/storage/core/storageValidation.d.ts +1 -1
- package/dist/storage/core/storageValidation.d.ts.map +1 -1
- package/dist/storage/core/storageValidation.js +2 -2
- package/dist/storage/core/storageValidation.js.map +1 -1
- package/dist/storage/providers/cloudflare/d1Provider.d.ts +1 -1
- package/dist/storage/providers/cloudflare/d1Provider.d.ts.map +1 -1
- package/dist/storage/providers/cloudflare/d1Provider.js +4 -12
- package/dist/storage/providers/cloudflare/d1Provider.js.map +1 -1
- package/dist/storage/providers/cloudflare/kvProvider.d.ts +1 -1
- package/dist/storage/providers/cloudflare/kvProvider.d.ts.map +1 -1
- package/dist/storage/providers/cloudflare/kvProvider.js +3 -8
- package/dist/storage/providers/cloudflare/kvProvider.js.map +1 -1
- package/dist/storage/providers/cloudflare/r2Provider.d.ts +1 -1
- package/dist/storage/providers/cloudflare/r2Provider.d.ts.map +1 -1
- package/dist/storage/providers/cloudflare/r2Provider.js +3 -8
- package/dist/storage/providers/cloudflare/r2Provider.js.map +1 -1
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts +1 -1
- package/dist/storage/providers/inMemory/inMemoryProvider.d.ts.map +1 -1
- package/dist/storage/providers/inMemory/inMemoryProvider.js +2 -4
- package/dist/storage/providers/inMemory/inMemoryProvider.js.map +1 -1
- package/dist/testing/index.d.ts +35 -12
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +53 -38
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/vitest.d.ts +1 -1
- package/dist/testing/vitest.d.ts.map +1 -1
- package/dist/types-global/errors.d.ts +28 -15
- package/dist/types-global/errors.d.ts.map +1 -1
- package/dist/types-global/errors.js +8 -1
- package/dist/types-global/errors.js.map +1 -1
- package/dist/utils/formatting/diffFormatter.d.ts +5 -5
- package/dist/utils/formatting/diffFormatter.d.ts.map +1 -1
- package/dist/utils/formatting/diffFormatter.js +7 -20
- package/dist/utils/formatting/diffFormatter.js.map +1 -1
- package/dist/utils/formatting/tableFormatter.d.ts +3 -3
- package/dist/utils/formatting/tableFormatter.d.ts.map +1 -1
- package/dist/utils/formatting/tableFormatter.js +6 -17
- package/dist/utils/formatting/tableFormatter.js.map +1 -1
- package/dist/utils/formatting/treeFormatter.d.ts +3 -3
- package/dist/utils/formatting/treeFormatter.d.ts.map +1 -1
- package/dist/utils/formatting/treeFormatter.js +5 -18
- package/dist/utils/formatting/treeFormatter.js.map +1 -1
- package/dist/utils/index.d.ts +4 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/internal/error-handler/errorHandler.d.ts +1 -1
- package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -1
- package/dist/utils/internal/error-handler/errorHandler.js +23 -11
- package/dist/utils/internal/error-handler/errorHandler.js.map +1 -1
- package/dist/utils/internal/error-handler/types.d.ts +10 -13
- package/dist/utils/internal/error-handler/types.d.ts.map +1 -1
- package/dist/utils/internal/logger.d.ts +3 -3
- package/dist/utils/internal/logger.d.ts.map +1 -1
- package/dist/utils/internal/logger.js +11 -5
- package/dist/utils/internal/logger.js.map +1 -1
- package/dist/utils/internal/performance.d.ts +1 -1
- package/dist/utils/internal/performance.d.ts.map +1 -1
- package/dist/utils/internal/performance.js +57 -13
- package/dist/utils/internal/performance.js.map +1 -1
- package/dist/utils/internal/requestContext.d.ts +79 -55
- package/dist/utils/internal/requestContext.d.ts.map +1 -1
- package/dist/utils/internal/requestContext.js +77 -32
- package/dist/utils/internal/requestContext.js.map +1 -1
- package/dist/utils/metrics/tokenCounter.d.ts +3 -3
- package/dist/utils/metrics/tokenCounter.d.ts.map +1 -1
- package/dist/utils/metrics/tokenCounter.js.map +1 -1
- package/dist/utils/network/fetchWithTimeout.d.ts +2 -2
- package/dist/utils/network/fetchWithTimeout.d.ts.map +1 -1
- package/dist/utils/network/fetchWithTimeout.js +8 -24
- package/dist/utils/network/fetchWithTimeout.js.map +1 -1
- package/dist/utils/network/retry.d.ts +2 -2
- package/dist/utils/network/retry.d.ts.map +1 -1
- package/dist/utils/overflow/outlineOnOverflow.d.ts +1 -1
- package/dist/utils/overflow/outlineOnOverflow.d.ts.map +1 -1
- package/dist/utils/pagination/pagination.d.ts +3 -3
- package/dist/utils/pagination/pagination.d.ts.map +1 -1
- package/dist/utils/pagination/pagination.js +3 -3
- package/dist/utils/pagination/pagination.js.map +1 -1
- package/dist/utils/parsing/csvParser.d.ts +2 -2
- package/dist/utils/parsing/csvParser.d.ts.map +1 -1
- package/dist/utils/parsing/csvParser.js +4 -8
- package/dist/utils/parsing/csvParser.js.map +1 -1
- package/dist/utils/parsing/dateParser.d.ts +3 -3
- package/dist/utils/parsing/dateParser.d.ts.map +1 -1
- package/dist/utils/parsing/dateParser.js +3 -2
- package/dist/utils/parsing/dateParser.js.map +1 -1
- package/dist/utils/parsing/frontmatterParser.d.ts +2 -2
- package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -1
- package/dist/utils/parsing/frontmatterParser.js +7 -10
- package/dist/utils/parsing/frontmatterParser.js.map +1 -1
- package/dist/utils/parsing/htmlExtractor.d.ts +2 -2
- package/dist/utils/parsing/htmlExtractor.d.ts.map +1 -1
- package/dist/utils/parsing/htmlExtractor.js +6 -11
- package/dist/utils/parsing/htmlExtractor.js.map +1 -1
- package/dist/utils/parsing/jsonParser.d.ts +2 -2
- package/dist/utils/parsing/jsonParser.d.ts.map +1 -1
- package/dist/utils/parsing/jsonParser.js +4 -8
- package/dist/utils/parsing/jsonParser.js.map +1 -1
- package/dist/utils/parsing/pdfParser.d.ts +10 -10
- package/dist/utils/parsing/pdfParser.d.ts.map +1 -1
- package/dist/utils/parsing/pdfParser.js +26 -89
- package/dist/utils/parsing/pdfParser.js.map +1 -1
- package/dist/utils/parsing/xmlParser.d.ts +2 -2
- package/dist/utils/parsing/xmlParser.d.ts.map +1 -1
- package/dist/utils/parsing/xmlParser.js +4 -8
- package/dist/utils/parsing/xmlParser.js.map +1 -1
- package/dist/utils/parsing/yamlParser.d.ts +2 -2
- package/dist/utils/parsing/yamlParser.d.ts.map +1 -1
- package/dist/utils/parsing/yamlParser.js +4 -8
- package/dist/utils/parsing/yamlParser.js.map +1 -1
- package/dist/utils/scheduling/scheduler.d.ts.map +1 -1
- package/dist/utils/scheduling/scheduler.js +5 -6
- package/dist/utils/scheduling/scheduler.js.map +1 -1
- package/dist/utils/security/rateLimiter.d.ts +2 -2
- package/dist/utils/security/rateLimiter.d.ts.map +1 -1
- package/dist/utils/security/rateLimiter.js +1 -1
- package/dist/utils/security/rateLimiter.js.map +1 -1
- package/dist/utils/telemetry/attributes.d.ts +23 -7
- package/dist/utils/telemetry/attributes.d.ts.map +1 -1
- package/dist/utils/telemetry/attributes.js +23 -10
- package/dist/utils/telemetry/attributes.js.map +1 -1
- package/dist/utils/telemetry/trace.d.ts +3 -3
- package/dist/utils/telemetry/trace.d.ts.map +1 -1
- package/dist/utils/telemetry/trace.js +4 -2
- package/dist/utils/telemetry/trace.js.map +1 -1
- package/package.json +22 -26
- package/scripts/lint-mcp.ts +1 -3
- package/scripts/lint-packaging.ts +1 -1
- package/skills/add-service/SKILL.md +2 -2
- package/skills/add-test/SKILL.md +42 -20
- package/skills/add-tool/SKILL.md +68 -19
- package/skills/api-canvas/SKILL.md +2 -2
- package/skills/api-config/SKILL.md +1 -11
- package/skills/api-context/SKILL.md +175 -111
- package/skills/api-linter/SKILL.md +2 -2
- package/skills/api-telemetry/SKILL.md +8 -12
- package/skills/api-testing/SKILL.md +53 -52
- package/skills/code-simplifier/SKILL.md +2 -2
- package/skills/design-mcp-server/SKILL.md +34 -18
- package/skills/field-test/SKILL.md +4 -2
- package/skills/git-wrapup/SKILL.md +3 -3
- package/skills/polish-docs-meta/SKILL.md +1 -1
- package/skills/polish-docs-meta/references/agent-protocol.md +2 -2
- package/skills/polish-docs-meta/references/readme.md +1 -1
- package/skills/release-and-publish/SKILL.md +3 -1
- package/skills/report-issue-framework/SKILL.md +2 -2
- package/skills/report-issue-local/SKILL.md +2 -2
- package/skills/security-pass/SKILL.md +16 -14
- package/templates/.github/CODE_OF_CONDUCT.md +28 -0
- package/templates/.github/CONTRIBUTING.md +50 -0
- package/templates/.github/SECURITY.md +24 -0
- package/templates/AGENTS.md +6 -6
- package/templates/CLAUDE.md +6 -6
- package/templates/changelog/template.md +55 -16
- package/templates/tests/resources/echo.resource.test.ts +16 -9
- package/dist/mcp-server/elicitation.d.ts +0 -64
- package/dist/mcp-server/elicitation.d.ts.map +0 -1
- package/dist/mcp-server/elicitation.js +0 -81
- package/dist/mcp-server/elicitation.js.map +0 -1
- package/dist/mcp-server/protocolSession.d.ts +0 -34
- package/dist/mcp-server/protocolSession.d.ts.map +0 -1
- package/dist/mcp-server/protocolSession.js +0 -13
- package/dist/mcp-server/protocolSession.js.map +0 -1
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts +0 -53
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js +0 -65
- package/dist/mcp-server/tasks/core/evictingTaskMessageQueue.js.map +0 -1
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts +0 -70
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js +0 -130
- package/dist/mcp-server/tasks/core/sessionAwareTaskStore.js.map +0 -1
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts +0 -109
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js +0 -209
- package/dist/mcp-server/tasks/core/storageBackedTaskStore.js.map +0 -1
- package/dist/mcp-server/tasks/core/taskManager.d.ts +0 -91
- package/dist/mcp-server/tasks/core/taskManager.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/taskManager.js +0 -210
- package/dist/mcp-server/tasks/core/taskManager.js.map +0 -1
- package/dist/mcp-server/tasks/core/taskTypes.d.ts +0 -18
- package/dist/mcp-server/tasks/core/taskTypes.d.ts.map +0 -1
- package/dist/mcp-server/tasks/core/taskTypes.js +0 -20
- package/dist/mcp-server/tasks/core/taskTypes.js.map +0 -1
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts +0 -101
- package/dist/mcp-server/tasks/utils/taskToolDefinition.d.ts.map +0 -1
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js +0 -14
- package/dist/mcp-server/tasks/utils/taskToolDefinition.js.map +0 -1
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wraps a {@link TaskMessageQueue} so each task's queue is reclaimed once its
|
|
3
|
-
* TTL elapses.
|
|
4
|
-
*
|
|
5
|
-
* Eviction is lazy and traffic-driven rather than timer-based: a deadline is
|
|
6
|
-
* refreshed whenever a task's queue is touched, expired queues are dropped on
|
|
7
|
-
* the next operation, and `dequeueAll` releases the deadline outright. That
|
|
8
|
-
* keeps the wrapper free of per-task timers and correct on runtimes where a
|
|
9
|
-
* timer would never fire.
|
|
10
|
-
*
|
|
11
|
-
* @experimental
|
|
12
|
-
*/
|
|
13
|
-
export class EvictingTaskMessageQueue {
|
|
14
|
-
inner;
|
|
15
|
-
ttlMs;
|
|
16
|
-
deadlines = new Map();
|
|
17
|
-
/**
|
|
18
|
-
* @param inner - Queue to delegate to.
|
|
19
|
-
* @param ttlMs - Lifetime of an untouched queue. A non-positive value
|
|
20
|
-
* disables eviction, matching a task store configured without a TTL.
|
|
21
|
-
*/
|
|
22
|
-
constructor(inner, ttlMs) {
|
|
23
|
-
this.inner = inner;
|
|
24
|
-
this.ttlMs = ttlMs;
|
|
25
|
-
}
|
|
26
|
-
get evicts() {
|
|
27
|
-
return this.ttlMs > 0;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Drain queues whose deadline has passed, then extend `taskId`'s.
|
|
31
|
-
*
|
|
32
|
-
* `dequeueAll` is the inner queue's only delete path, so it doubles as the
|
|
33
|
-
* eviction primitive here — dropping the messages and the map entry in one
|
|
34
|
-
* call.
|
|
35
|
-
*/
|
|
36
|
-
async expireAndTouch(taskId) {
|
|
37
|
-
if (!this.evicts)
|
|
38
|
-
return;
|
|
39
|
-
const now = Date.now();
|
|
40
|
-
for (const [id, deadline] of this.deadlines) {
|
|
41
|
-
if (now < deadline)
|
|
42
|
-
continue;
|
|
43
|
-
this.deadlines.delete(id);
|
|
44
|
-
await this.inner.dequeueAll(id);
|
|
45
|
-
}
|
|
46
|
-
this.deadlines.set(taskId, now + this.ttlMs);
|
|
47
|
-
}
|
|
48
|
-
async enqueue(taskId, message, sessionId, maxSize) {
|
|
49
|
-
await this.expireAndTouch(taskId);
|
|
50
|
-
await this.inner.enqueue(taskId, message, sessionId, maxSize);
|
|
51
|
-
}
|
|
52
|
-
async dequeue(taskId, sessionId) {
|
|
53
|
-
await this.expireAndTouch(taskId);
|
|
54
|
-
return await this.inner.dequeue(taskId, sessionId);
|
|
55
|
-
}
|
|
56
|
-
async dequeueAll(taskId, sessionId) {
|
|
57
|
-
this.deadlines.delete(taskId);
|
|
58
|
-
return await this.inner.dequeueAll(taskId, sessionId);
|
|
59
|
-
}
|
|
60
|
-
/** Number of queues currently tracked for eviction. Exposed for tests. */
|
|
61
|
-
get trackedCount() {
|
|
62
|
-
return this.deadlines.size;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=evictingTaskMessageQueue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evictingTaskMessageQueue.js","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/evictingTaskMessageQueue.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,wBAAwB;IAShB,KAAK;IACL,KAAK;IATP,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD;;;;OAIG;IACH,YACmB,KAAuB,EACvB,KAAa;qBADb,KAAK;qBACL,KAAK;IACrB,CAAC;IAEJ,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,cAAc,CAAC,MAAc;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,IAAI,GAAG,GAAG,QAAQ;gBAAE,SAAS;YAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAc,EACd,OAAsB,EACtB,SAAkB,EAClB,OAAgB;QAEhB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,SAAkB;QAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,SAAkB;QACjD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,0EAA0E;IAC1E,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview A TaskStore wrapper that enforces session ownership on top of
|
|
3
|
-
* the SDK's InMemoryTaskStore (which ignores sessionId parameters).
|
|
4
|
-
*
|
|
5
|
-
* This ensures that in HTTP mode, tasks created by one session cannot be
|
|
6
|
-
* accessed by another session, even when using the in-memory store.
|
|
7
|
-
*
|
|
8
|
-
* @experimental These APIs are experimental and may change without notice.
|
|
9
|
-
* @module src/mcp-server/tasks/core/sessionAwareTaskStore
|
|
10
|
-
*/
|
|
11
|
-
import type { Request, RequestId, Result } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
-
import { type CreateTaskOptions, type Task, type TaskStore } from './taskTypes.js';
|
|
13
|
-
/**
|
|
14
|
-
* Wraps an InMemoryTaskStore to add session ownership enforcement.
|
|
15
|
-
*
|
|
16
|
-
* Tracks which session created each task and rejects access from
|
|
17
|
-
* non-owning sessions. Tasks created without a sessionId are accessible
|
|
18
|
-
* by any session (backwards-compatible with stdio/unauth flows).
|
|
19
|
-
*
|
|
20
|
-
* @experimental
|
|
21
|
-
*/
|
|
22
|
-
export declare class SessionAwareTaskStore implements TaskStore {
|
|
23
|
-
private readonly inner;
|
|
24
|
-
/**
|
|
25
|
-
* Maps taskId -> owning sessionId and the deadline past which the row is
|
|
26
|
-
* reclaimable.
|
|
27
|
-
*
|
|
28
|
-
* The inner store drops a task once its TTL elapses, so an ownership row
|
|
29
|
-
* that outlives it is pure leak — one permanent entry per task call, since
|
|
30
|
-
* every HTTP request transport carries a sessionId. Mirroring the inner
|
|
31
|
-
* store's own expiry keeps this map's lifetime bounded by the tasks it
|
|
32
|
-
* describes. `Infinity` covers a task created without a TTL, which the
|
|
33
|
-
* inner store likewise never evicts.
|
|
34
|
-
*/
|
|
35
|
-
private readonly ownership;
|
|
36
|
-
constructor(inner: TaskStore);
|
|
37
|
-
/**
|
|
38
|
-
* Owning session for a task, or `undefined` when unowned or expired.
|
|
39
|
-
* Prunes the row on the way past — a lazy sweep costs one comparison on a
|
|
40
|
-
* path that is already touching the entry.
|
|
41
|
-
*/
|
|
42
|
-
private ownerOf;
|
|
43
|
-
/**
|
|
44
|
-
* Refresh a row's deadline, mirroring the inner store's TTL reset. The TTL
|
|
45
|
-
* is fixed when the task is created, so this needs no read of the inner
|
|
46
|
-
* store.
|
|
47
|
-
*/
|
|
48
|
-
private touch;
|
|
49
|
-
/** Drop every expired row. Runs on task creation, where the map grows. */
|
|
50
|
-
private sweepExpired;
|
|
51
|
-
createTask(taskParams: CreateTaskOptions, requestId: RequestId, request: Request, sessionId?: string): Promise<Task>;
|
|
52
|
-
getTask(taskId: string, sessionId?: string): Promise<Task | null>;
|
|
53
|
-
storeTaskResult(taskId: string, status: 'completed' | 'failed', result: Result, sessionId?: string): Promise<void>;
|
|
54
|
-
getTaskResult(taskId: string, sessionId?: string): Promise<Result>;
|
|
55
|
-
updateTaskStatus(taskId: string, status: Task['status'], statusMessage?: string, sessionId?: string): Promise<void>;
|
|
56
|
-
listTasks(cursor?: string, sessionId?: string): Promise<{
|
|
57
|
-
tasks: Task[];
|
|
58
|
-
nextCursor?: string;
|
|
59
|
-
}>;
|
|
60
|
-
/**
|
|
61
|
-
* Validates that the caller's session matches the task's owner.
|
|
62
|
-
* Tasks created without a sessionId are accessible by any session.
|
|
63
|
-
*
|
|
64
|
-
* Once the row expires this falls through rather than throwing, so a probe
|
|
65
|
-
* for an evicted taskId gets the inner store's uniform not-found instead of
|
|
66
|
-
* a `Forbidden` that would confirm the id had once existed.
|
|
67
|
-
*/
|
|
68
|
-
private assertOwnership;
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=sessionAwareTaskStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionAwareTaskStore.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/sessionAwareTaskStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAGrF,OAAO,EAAE,KAAK,iBAAiB,EAAc,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE/F;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,SAAS;IAiBzC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAhBlC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGtB;IAEJ,YAA6B,KAAK,EAAE,SAAS,EAAI;IAEjD;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAUf;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAMb,0EAA0E;IAC1E,OAAO,CAAC,YAAY;IAOd,UAAU,CACd,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAYf;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAGtE;IAEK,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGvE;IAEK,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAKf;IAEK,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAYjD;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;CAOxB"}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { forbidden } from '../../../types-global/errors.js';
|
|
2
|
-
import { isTerminal } from './taskTypes.js';
|
|
3
|
-
/**
|
|
4
|
-
* Wraps an InMemoryTaskStore to add session ownership enforcement.
|
|
5
|
-
*
|
|
6
|
-
* Tracks which session created each task and rejects access from
|
|
7
|
-
* non-owning sessions. Tasks created without a sessionId are accessible
|
|
8
|
-
* by any session (backwards-compatible with stdio/unauth flows).
|
|
9
|
-
*
|
|
10
|
-
* @experimental
|
|
11
|
-
*/
|
|
12
|
-
export class SessionAwareTaskStore {
|
|
13
|
-
inner;
|
|
14
|
-
/**
|
|
15
|
-
* Maps taskId -> owning sessionId and the deadline past which the row is
|
|
16
|
-
* reclaimable.
|
|
17
|
-
*
|
|
18
|
-
* The inner store drops a task once its TTL elapses, so an ownership row
|
|
19
|
-
* that outlives it is pure leak — one permanent entry per task call, since
|
|
20
|
-
* every HTTP request transport carries a sessionId. Mirroring the inner
|
|
21
|
-
* store's own expiry keeps this map's lifetime bounded by the tasks it
|
|
22
|
-
* describes. `Infinity` covers a task created without a TTL, which the
|
|
23
|
-
* inner store likewise never evicts.
|
|
24
|
-
*/
|
|
25
|
-
ownership = new Map();
|
|
26
|
-
constructor(inner) {
|
|
27
|
-
this.inner = inner;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Owning session for a task, or `undefined` when unowned or expired.
|
|
31
|
-
* Prunes the row on the way past — a lazy sweep costs one comparison on a
|
|
32
|
-
* path that is already touching the entry.
|
|
33
|
-
*/
|
|
34
|
-
ownerOf(taskId) {
|
|
35
|
-
const record = this.ownership.get(taskId);
|
|
36
|
-
if (!record)
|
|
37
|
-
return;
|
|
38
|
-
if (Date.now() >= record.expiresAt) {
|
|
39
|
-
this.ownership.delete(taskId);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
return record.sessionId;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Refresh a row's deadline, mirroring the inner store's TTL reset. The TTL
|
|
46
|
-
* is fixed when the task is created, so this needs no read of the inner
|
|
47
|
-
* store.
|
|
48
|
-
*/
|
|
49
|
-
touch(taskId) {
|
|
50
|
-
const record = this.ownership.get(taskId);
|
|
51
|
-
if (!record)
|
|
52
|
-
return;
|
|
53
|
-
record.expiresAt = record.ttl ? Date.now() + record.ttl : Number.POSITIVE_INFINITY;
|
|
54
|
-
}
|
|
55
|
-
/** Drop every expired row. Runs on task creation, where the map grows. */
|
|
56
|
-
sweepExpired() {
|
|
57
|
-
const now = Date.now();
|
|
58
|
-
for (const [taskId, record] of this.ownership) {
|
|
59
|
-
if (now >= record.expiresAt)
|
|
60
|
-
this.ownership.delete(taskId);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
async createTask(taskParams, requestId, request, sessionId) {
|
|
64
|
-
const task = await this.inner.createTask(taskParams, requestId, request, sessionId);
|
|
65
|
-
if (sessionId) {
|
|
66
|
-
this.sweepExpired();
|
|
67
|
-
const ttl = task.ttl ?? null;
|
|
68
|
-
this.ownership.set(task.taskId, {
|
|
69
|
-
sessionId,
|
|
70
|
-
ttl,
|
|
71
|
-
expiresAt: ttl ? Date.now() + ttl : Number.POSITIVE_INFINITY,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
return task;
|
|
75
|
-
}
|
|
76
|
-
async getTask(taskId, sessionId) {
|
|
77
|
-
this.assertOwnership(taskId, sessionId);
|
|
78
|
-
return await this.inner.getTask(taskId, sessionId);
|
|
79
|
-
}
|
|
80
|
-
async storeTaskResult(taskId, status, result, sessionId) {
|
|
81
|
-
this.assertOwnership(taskId, sessionId);
|
|
82
|
-
await this.inner.storeTaskResult(taskId, status, result, sessionId);
|
|
83
|
-
// The inner store restarts the task's cleanup timer here; keep the
|
|
84
|
-
// ownership row alive exactly as long as the task it describes.
|
|
85
|
-
this.touch(taskId);
|
|
86
|
-
}
|
|
87
|
-
async getTaskResult(taskId, sessionId) {
|
|
88
|
-
this.assertOwnership(taskId, sessionId);
|
|
89
|
-
return await this.inner.getTaskResult(taskId, sessionId);
|
|
90
|
-
}
|
|
91
|
-
async updateTaskStatus(taskId, status, statusMessage, sessionId) {
|
|
92
|
-
this.assertOwnership(taskId, sessionId);
|
|
93
|
-
await this.inner.updateTaskStatus(taskId, status, statusMessage, sessionId);
|
|
94
|
-
// Terminal status starts the inner store's TTL countdown afresh.
|
|
95
|
-
if (isTerminal(status))
|
|
96
|
-
this.touch(taskId);
|
|
97
|
-
}
|
|
98
|
-
async listTasks(cursor, sessionId) {
|
|
99
|
-
const result = await this.inner.listTasks(cursor, sessionId);
|
|
100
|
-
// Filter: session-bound tasks are only visible to their owning session.
|
|
101
|
-
// Sessionless callers see only unowned tasks (consistent with StorageBackedTaskStore).
|
|
102
|
-
const filtered = result.tasks.filter((task) => {
|
|
103
|
-
const owner = this.ownerOf(task.taskId);
|
|
104
|
-
if (!owner)
|
|
105
|
-
return true; // Unowned — visible to everyone
|
|
106
|
-
return owner === sessionId; // Session-bound — visible only to owner
|
|
107
|
-
});
|
|
108
|
-
const out = { tasks: filtered };
|
|
109
|
-
if (result.nextCursor)
|
|
110
|
-
out.nextCursor = result.nextCursor;
|
|
111
|
-
return out;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Validates that the caller's session matches the task's owner.
|
|
115
|
-
* Tasks created without a sessionId are accessible by any session.
|
|
116
|
-
*
|
|
117
|
-
* Once the row expires this falls through rather than throwing, so a probe
|
|
118
|
-
* for an evicted taskId gets the inner store's uniform not-found instead of
|
|
119
|
-
* a `Forbidden` that would confirm the id had once existed.
|
|
120
|
-
*/
|
|
121
|
-
assertOwnership(taskId, callerSessionId) {
|
|
122
|
-
const owner = this.ownerOf(taskId);
|
|
123
|
-
if (!owner)
|
|
124
|
-
return; // No owner recorded — accessible by anyone
|
|
125
|
-
if (owner !== callerSessionId) {
|
|
126
|
-
throw forbidden(`Access denied to task ${taskId}`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=sessionAwareTaskStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionAwareTaskStore.js","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/sessionAwareTaskStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview A TaskStore implementation backed by the framework's StorageService.
|
|
3
|
-
* This provides persistent task storage that survives server restarts, using
|
|
4
|
-
* whatever storage backend is configured (filesystem, Supabase, SurrealDB, etc.).
|
|
5
|
-
*
|
|
6
|
-
* Use this instead of InMemoryTaskStore when you need task durability.
|
|
7
|
-
*
|
|
8
|
-
* @experimental These APIs are experimental and may change without notice.
|
|
9
|
-
* @module src/mcp-server/tasks/core/storageBackedTaskStore
|
|
10
|
-
*/
|
|
11
|
-
import type { Request, RequestId, Result } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
-
import type { StorageService } from '../../../storage/core/StorageService.js';
|
|
13
|
-
import type { CreateTaskOptions, Task, TaskStore } from './taskTypes.js';
|
|
14
|
-
/**
|
|
15
|
-
* Configuration options for StorageBackedTaskStore.
|
|
16
|
-
*/
|
|
17
|
-
export interface StorageBackedTaskStoreOptions {
|
|
18
|
-
/**
|
|
19
|
-
* Default TTL in milliseconds if not specified in task creation.
|
|
20
|
-
* Set to null for unlimited lifetime.
|
|
21
|
-
* @default null
|
|
22
|
-
*/
|
|
23
|
-
defaultTtl?: number | null;
|
|
24
|
-
/**
|
|
25
|
-
* Prefix for storage keys.
|
|
26
|
-
* @default 'tasks'
|
|
27
|
-
*/
|
|
28
|
-
keyPrefix?: string;
|
|
29
|
-
/**
|
|
30
|
-
* Page size for listTasks pagination.
|
|
31
|
-
* @default 10
|
|
32
|
-
*/
|
|
33
|
-
pageSize?: number;
|
|
34
|
-
/**
|
|
35
|
-
* The tenant ID to use for storage operations.
|
|
36
|
-
* Tasks are stored under this tenant for isolation.
|
|
37
|
-
* @default 'system-tasks'
|
|
38
|
-
*/
|
|
39
|
-
tenantId?: string;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* A TaskStore implementation backed by StorageService for persistent task storage.
|
|
43
|
-
*
|
|
44
|
-
* Unlike InMemoryTaskStore, this implementation:
|
|
45
|
-
* - Persists tasks across server restarts
|
|
46
|
-
* - Works with any configured storage backend (filesystem, Supabase, SurrealDB, etc.)
|
|
47
|
-
* - Supports TTL via storage provider options
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```typescript
|
|
51
|
-
* const taskStore = new StorageBackedTaskStore(storageService, {
|
|
52
|
-
* tenantId: 'my-app-tasks',
|
|
53
|
-
* defaultTtl: 3600000, // 1 hour
|
|
54
|
-
* });
|
|
55
|
-
* ```
|
|
56
|
-
*
|
|
57
|
-
* @experimental
|
|
58
|
-
*/
|
|
59
|
-
export declare class StorageBackedTaskStore implements TaskStore {
|
|
60
|
-
private readonly storage;
|
|
61
|
-
private readonly tenantId;
|
|
62
|
-
private readonly keyPrefix;
|
|
63
|
-
private readonly defaultTtl;
|
|
64
|
-
private readonly pageSize;
|
|
65
|
-
constructor(storage: StorageService, options?: StorageBackedTaskStoreOptions);
|
|
66
|
-
/**
|
|
67
|
-
* Creates a request context for storage operations.
|
|
68
|
-
*/
|
|
69
|
-
private createContext;
|
|
70
|
-
/**
|
|
71
|
-
* Generates the storage key for a task.
|
|
72
|
-
*/
|
|
73
|
-
private getTaskKey;
|
|
74
|
-
/**
|
|
75
|
-
* Validates that the caller's sessionId matches the stored task's sessionId.
|
|
76
|
-
* Tasks created without a sessionId (legacy/pre-ownership) are accessible by any session.
|
|
77
|
-
* @throws {McpError} Forbidden if sessionId mismatch
|
|
78
|
-
*/
|
|
79
|
-
private assertOwnership;
|
|
80
|
-
/**
|
|
81
|
-
* Generates a unique task ID.
|
|
82
|
-
* Uses the framework's idGenerator for consistent ID format.
|
|
83
|
-
*/
|
|
84
|
-
private generateTaskId;
|
|
85
|
-
createTask(taskParams: CreateTaskOptions, requestId: RequestId, request: Request, sessionId?: string): Promise<Task>;
|
|
86
|
-
getTask(taskId: string, sessionId?: string): Promise<Task | null>;
|
|
87
|
-
storeTaskResult(taskId: string, status: 'completed' | 'failed', result: Result, sessionId?: string): Promise<void>;
|
|
88
|
-
getTaskResult(taskId: string, sessionId?: string): Promise<Result>;
|
|
89
|
-
updateTaskStatus(taskId: string, status: Task['status'], statusMessage?: string, sessionId?: string): Promise<void>;
|
|
90
|
-
listTasks(cursor?: string, sessionId?: string): Promise<{
|
|
91
|
-
tasks: Task[];
|
|
92
|
-
nextCursor?: string;
|
|
93
|
-
}>;
|
|
94
|
-
/**
|
|
95
|
-
* Deletes a task from storage.
|
|
96
|
-
* Useful for manual cleanup or testing.
|
|
97
|
-
*
|
|
98
|
-
* @param taskId - The task ID to delete
|
|
99
|
-
*/
|
|
100
|
-
deleteTask(taskId: string): Promise<void>;
|
|
101
|
-
/**
|
|
102
|
-
* Clears all tasks from storage.
|
|
103
|
-
* Useful for testing or administrative purposes.
|
|
104
|
-
*
|
|
105
|
-
* WARNING: This deletes ALL tasks for the configured tenant.
|
|
106
|
-
*/
|
|
107
|
-
clearAllTasks(): Promise<void>;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=storageBackedTaskStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storageBackedTaskStore.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/storageBackedTaskStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAIvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgBzE;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,sBAAuB,YAAW,SAAS;IAOpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YACmB,OAAO,EAAE,cAAc,EACxC,OAAO,GAAE,6BAAkC,EAM5C;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAKhB,UAAU,CACd,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAoCf;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAMtE;IAEK,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA4Bf;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcvE;IAEK,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Bf;IAEK,SAAS,CACb,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CA+BjD;IAED;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9C;IAED;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBnC;CACF"}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import { forbidden, invalidRequest, notFound } from '../../../types-global/errors.js';
|
|
2
|
-
import { idGenerator } from '../../../utils/security/idGenerator.js';
|
|
3
|
-
import { isTerminal } from './taskTypes.js';
|
|
4
|
-
/**
|
|
5
|
-
* A TaskStore implementation backed by StorageService for persistent task storage.
|
|
6
|
-
*
|
|
7
|
-
* Unlike InMemoryTaskStore, this implementation:
|
|
8
|
-
* - Persists tasks across server restarts
|
|
9
|
-
* - Works with any configured storage backend (filesystem, Supabase, SurrealDB, etc.)
|
|
10
|
-
* - Supports TTL via storage provider options
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const taskStore = new StorageBackedTaskStore(storageService, {
|
|
15
|
-
* tenantId: 'my-app-tasks',
|
|
16
|
-
* defaultTtl: 3600000, // 1 hour
|
|
17
|
-
* });
|
|
18
|
-
* ```
|
|
19
|
-
*
|
|
20
|
-
* @experimental
|
|
21
|
-
*/
|
|
22
|
-
export class StorageBackedTaskStore {
|
|
23
|
-
storage;
|
|
24
|
-
tenantId;
|
|
25
|
-
keyPrefix;
|
|
26
|
-
defaultTtl;
|
|
27
|
-
pageSize;
|
|
28
|
-
constructor(storage, options = {}) {
|
|
29
|
-
this.storage = storage;
|
|
30
|
-
this.tenantId = options.tenantId ?? 'system-tasks';
|
|
31
|
-
this.keyPrefix = options.keyPrefix ?? 'tasks';
|
|
32
|
-
this.defaultTtl = options.defaultTtl ?? null;
|
|
33
|
-
this.pageSize = options.pageSize ?? 10;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Creates a request context for storage operations.
|
|
37
|
-
*/
|
|
38
|
-
createContext(operation) {
|
|
39
|
-
return {
|
|
40
|
-
operation: `StorageBackedTaskStore.${operation}`,
|
|
41
|
-
requestId: idGenerator.generate('req'),
|
|
42
|
-
timestamp: new Date().toISOString(),
|
|
43
|
-
tenantId: this.tenantId,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Generates the storage key for a task.
|
|
48
|
-
*/
|
|
49
|
-
getTaskKey(taskId) {
|
|
50
|
-
return `${this.keyPrefix}/${taskId}`;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Validates that the caller's sessionId matches the stored task's sessionId.
|
|
54
|
-
* Tasks created without a sessionId (legacy/pre-ownership) are accessible by any session.
|
|
55
|
-
* @throws {McpError} Forbidden if sessionId mismatch
|
|
56
|
-
*/
|
|
57
|
-
assertOwnership(stored, callerSessionId, taskId) {
|
|
58
|
-
if (!stored.sessionId)
|
|
59
|
-
return;
|
|
60
|
-
if (stored.sessionId !== callerSessionId) {
|
|
61
|
-
throw forbidden(`Access denied to task ${taskId}`);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Generates a unique task ID.
|
|
66
|
-
* Uses the framework's idGenerator for consistent ID format.
|
|
67
|
-
*/
|
|
68
|
-
generateTaskId() {
|
|
69
|
-
// Generate a longer ID for global uniqueness (16 chars)
|
|
70
|
-
return idGenerator.generate('task', { length: 16 });
|
|
71
|
-
}
|
|
72
|
-
async createTask(taskParams, requestId, request, sessionId) {
|
|
73
|
-
const context = this.createContext('createTask');
|
|
74
|
-
const taskId = this.generateTaskId();
|
|
75
|
-
const actualTtl = taskParams.ttl ?? this.defaultTtl;
|
|
76
|
-
const createdAt = new Date().toISOString();
|
|
77
|
-
const task = {
|
|
78
|
-
taskId,
|
|
79
|
-
status: 'working',
|
|
80
|
-
ttl: actualTtl,
|
|
81
|
-
createdAt,
|
|
82
|
-
lastUpdatedAt: createdAt,
|
|
83
|
-
pollInterval: taskParams.pollInterval ?? 1000,
|
|
84
|
-
};
|
|
85
|
-
const storedTask = {
|
|
86
|
-
task,
|
|
87
|
-
request,
|
|
88
|
-
requestId,
|
|
89
|
-
};
|
|
90
|
-
// Bind session ownership if provided
|
|
91
|
-
if (sessionId) {
|
|
92
|
-
storedTask.sessionId = sessionId;
|
|
93
|
-
}
|
|
94
|
-
// Store with TTL if specified (convert ms to seconds for StorageService)
|
|
95
|
-
await this.storage.set(this.getTaskKey(taskId), storedTask, context, actualTtl ? { ttl: Math.ceil(actualTtl / 1000) } : undefined);
|
|
96
|
-
return task;
|
|
97
|
-
}
|
|
98
|
-
async getTask(taskId, sessionId) {
|
|
99
|
-
const context = this.createContext('getTask');
|
|
100
|
-
const stored = await this.storage.get(this.getTaskKey(taskId), context);
|
|
101
|
-
if (!stored)
|
|
102
|
-
return null;
|
|
103
|
-
this.assertOwnership(stored, sessionId, taskId);
|
|
104
|
-
return { ...stored.task };
|
|
105
|
-
}
|
|
106
|
-
async storeTaskResult(taskId, status, result, sessionId) {
|
|
107
|
-
const context = this.createContext('storeTaskResult');
|
|
108
|
-
const key = this.getTaskKey(taskId);
|
|
109
|
-
const stored = await this.storage.get(key, context);
|
|
110
|
-
if (!stored) {
|
|
111
|
-
throw notFound(`Task with ID ${taskId} not found`);
|
|
112
|
-
}
|
|
113
|
-
this.assertOwnership(stored, sessionId, taskId);
|
|
114
|
-
// Don't allow storing results for tasks already in terminal state
|
|
115
|
-
if (isTerminal(stored.task.status)) {
|
|
116
|
-
throw invalidRequest(`Cannot store result for task ${taskId} in terminal status '${stored.task.status}'. Task results can only be stored once.`);
|
|
117
|
-
}
|
|
118
|
-
stored.result = result;
|
|
119
|
-
stored.task.status = status;
|
|
120
|
-
stored.task.lastUpdatedAt = new Date().toISOString();
|
|
121
|
-
// Re-store with TTL reset (if ttl is set, convert ms to seconds)
|
|
122
|
-
await this.storage.set(key, stored, context, stored.task.ttl ? { ttl: Math.ceil(stored.task.ttl / 1000) } : undefined);
|
|
123
|
-
}
|
|
124
|
-
async getTaskResult(taskId, sessionId) {
|
|
125
|
-
const context = this.createContext('getTaskResult');
|
|
126
|
-
const stored = await this.storage.get(this.getTaskKey(taskId), context);
|
|
127
|
-
if (!stored) {
|
|
128
|
-
throw notFound(`Task with ID ${taskId} not found`);
|
|
129
|
-
}
|
|
130
|
-
this.assertOwnership(stored, sessionId, taskId);
|
|
131
|
-
if (!stored.result) {
|
|
132
|
-
throw invalidRequest(`Task ${taskId} has no result stored`);
|
|
133
|
-
}
|
|
134
|
-
return stored.result;
|
|
135
|
-
}
|
|
136
|
-
async updateTaskStatus(taskId, status, statusMessage, sessionId) {
|
|
137
|
-
const context = this.createContext('updateTaskStatus');
|
|
138
|
-
const key = this.getTaskKey(taskId);
|
|
139
|
-
const stored = await this.storage.get(key, context);
|
|
140
|
-
if (!stored) {
|
|
141
|
-
throw notFound(`Task with ID ${taskId} not found`);
|
|
142
|
-
}
|
|
143
|
-
this.assertOwnership(stored, sessionId, taskId);
|
|
144
|
-
// Don't allow transitions from terminal states
|
|
145
|
-
if (isTerminal(stored.task.status)) {
|
|
146
|
-
throw invalidRequest(`Cannot update task ${taskId} from terminal status '${stored.task.status}' to '${status}'. Terminal states (completed, failed, cancelled) cannot transition to other states.`);
|
|
147
|
-
}
|
|
148
|
-
stored.task.status = status;
|
|
149
|
-
if (statusMessage) {
|
|
150
|
-
stored.task.statusMessage = statusMessage;
|
|
151
|
-
}
|
|
152
|
-
stored.task.lastUpdatedAt = new Date().toISOString();
|
|
153
|
-
// Re-store, reset TTL if transitioning to terminal state (convert ms to seconds)
|
|
154
|
-
const shouldResetTtl = isTerminal(status) && stored.task.ttl;
|
|
155
|
-
await this.storage.set(key, stored, context, shouldResetTtl ? { ttl: Math.ceil(stored.task.ttl / 1000) } : undefined);
|
|
156
|
-
}
|
|
157
|
-
async listTasks(cursor, sessionId) {
|
|
158
|
-
const context = this.createContext('listTasks');
|
|
159
|
-
// List all task keys with pagination
|
|
160
|
-
const listResult = await this.storage.list(this.keyPrefix, context, cursor ? { cursor, limit: this.pageSize } : { limit: this.pageSize });
|
|
161
|
-
// Fetch all tasks in parallel, filtering by session ownership
|
|
162
|
-
const taskPromises = listResult.keys.map(async (key) => {
|
|
163
|
-
const stored = await this.storage.get(key, context);
|
|
164
|
-
if (!stored)
|
|
165
|
-
return null;
|
|
166
|
-
// Filter: hide tasks whose sessionId doesn't match the caller's.
|
|
167
|
-
// Consistent with assertOwnership: session-bound tasks are only
|
|
168
|
-
// visible to the session that created them.
|
|
169
|
-
if (stored.sessionId && stored.sessionId !== sessionId) {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
return { ...stored.task };
|
|
173
|
-
});
|
|
174
|
-
const tasksOrNull = await Promise.all(taskPromises);
|
|
175
|
-
const tasks = tasksOrNull.filter((t) => t !== null);
|
|
176
|
-
// Handle exactOptionalPropertyTypes - only include nextCursor if defined
|
|
177
|
-
if (listResult.nextCursor !== undefined) {
|
|
178
|
-
return { tasks, nextCursor: listResult.nextCursor };
|
|
179
|
-
}
|
|
180
|
-
return { tasks };
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Deletes a task from storage.
|
|
184
|
-
* Useful for manual cleanup or testing.
|
|
185
|
-
*
|
|
186
|
-
* @param taskId - The task ID to delete
|
|
187
|
-
*/
|
|
188
|
-
async deleteTask(taskId) {
|
|
189
|
-
const context = this.createContext('deleteTask');
|
|
190
|
-
await this.storage.delete(this.getTaskKey(taskId), context);
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Clears all tasks from storage.
|
|
194
|
-
* Useful for testing or administrative purposes.
|
|
195
|
-
*
|
|
196
|
-
* WARNING: This deletes ALL tasks for the configured tenant.
|
|
197
|
-
*/
|
|
198
|
-
async clearAllTasks() {
|
|
199
|
-
const context = this.createContext('clearAllTasks');
|
|
200
|
-
// List and delete all tasks
|
|
201
|
-
let cursor;
|
|
202
|
-
do {
|
|
203
|
-
const result = await this.storage.list(this.keyPrefix, context, cursor ? { cursor, limit: 100 } : { limit: 100 });
|
|
204
|
-
await Promise.all(result.keys.map((key) => this.storage.delete(key, context)));
|
|
205
|
-
cursor = result.nextCursor;
|
|
206
|
-
} while (cursor);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
//# sourceMappingURL=storageBackedTaskStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storageBackedTaskStore.js","sourceRoot":"","sources":["../../../../src/mcp-server/tasks/core/storageBackedTaskStore.ts"],"names":[],"mappings":"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"}
|