dotdo 0.0.1 → 0.1.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/LICENSE +1 -1
- package/README.md +446 -315
- package/cli/README.md +238 -0
- package/cli/agent.ts +72 -0
- package/cli/bin.js +44 -0
- package/cli/bin.ts +38 -0
- package/cli/build.ts +157 -0
- package/cli/commands/auth/login.ts +14 -0
- package/cli/commands/auth/logout.ts +6 -0
- package/cli/commands/auth/whoami.ts +16 -0
- package/cli/commands/deploy-multi.ts +245 -0
- package/cli/commands/dev/deploy.ts +100 -0
- package/cli/commands/dev/dev.ts +95 -0
- package/cli/commands/dev/logs.ts +91 -0
- package/cli/commands/dev-local.ts +88 -0
- package/cli/commands/do-ops.ts +314 -0
- package/cli/commands/index.ts +100 -0
- package/cli/commands/init.ts +247 -0
- package/cli/commands/introspect/emitter.ts +315 -0
- package/cli/commands/introspect/index.ts +193 -0
- package/cli/commands/link.ts +598 -0
- package/cli/commands/snippets.ts +415 -0
- package/cli/commands/tunnel.ts +239 -0
- package/cli/device-auth.ts +289 -0
- package/cli/fallback.ts +12 -0
- package/cli/index.ts +121 -0
- package/cli/main.ts +246 -0
- package/cli/mcp-stdio.ts +790 -0
- package/cli/package.json +62 -0
- package/cli/runtime/do-registry.ts +193 -0
- package/cli/runtime/embedded-db.ts +344 -0
- package/cli/runtime/index.ts +9 -0
- package/cli/runtime/miniflare-adapter.ts +162 -0
- package/cli/sandbox.ts +82 -0
- package/cli/src/args.ts +174 -0
- package/cli/src/auth.ts +55 -0
- package/cli/src/commands/call.ts +84 -0
- package/cli/src/commands/charge.ts +96 -0
- package/cli/src/commands/config.ts +115 -0
- package/cli/src/commands/email.ts +112 -0
- package/cli/src/commands/llm.ts +115 -0
- package/cli/src/commands/queue.ts +134 -0
- package/cli/src/commands/text.ts +86 -0
- package/cli/src/config.ts +185 -0
- package/cli/src/output.ts +246 -0
- package/cli/src/rpc.ts +192 -0
- package/cli/utils/config.ts +282 -0
- package/cli/utils/detect.ts +73 -0
- package/cli/utils/index.ts +15 -0
- package/cli/utils/logger.ts +232 -0
- package/dist/ai/index.js +19 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/template-literals.js +852 -0
- package/dist/ai/template-literals.js.map +1 -0
- package/dist/api/middleware/auth-federation.js +573 -0
- package/dist/api/middleware/auth-federation.js.map +1 -0
- package/dist/api/middleware/auth.js +545 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/db/actions.js +212 -0
- package/dist/db/actions.js.map +1 -0
- package/dist/db/auth.js +506 -0
- package/dist/db/auth.js.map +1 -0
- package/dist/db/branches.js +65 -0
- package/dist/db/branches.js.map +1 -0
- package/dist/db/clickhouse.js +1074 -0
- package/dist/db/clickhouse.js.map +1 -0
- package/dist/db/dlq.js +39 -0
- package/dist/db/dlq.js.map +1 -0
- package/dist/db/events.js +28 -0
- package/dist/db/events.js.map +1 -0
- package/dist/db/exec.js +64 -0
- package/dist/db/exec.js.map +1 -0
- package/dist/db/files.js +85 -0
- package/dist/db/files.js.map +1 -0
- package/dist/db/flags.js +24 -0
- package/dist/db/flags.js.map +1 -0
- package/dist/db/git.js +116 -0
- package/dist/db/git.js.map +1 -0
- package/dist/db/iceberg/inverted-index.js +862 -0
- package/dist/db/iceberg/inverted-index.js.map +1 -0
- package/dist/db/iceberg/puffin.js +878 -0
- package/dist/db/iceberg/puffin.js.map +1 -0
- package/dist/db/iceberg/search-manifest.js +422 -0
- package/dist/db/iceberg/search-manifest.js.map +1 -0
- package/dist/db/iceberg/types.js +8 -0
- package/dist/db/iceberg/types.js.map +1 -0
- package/dist/db/index.js +121 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/integrations.js +368 -0
- package/dist/db/integrations.js.map +1 -0
- package/dist/db/json-indexes.js +332 -0
- package/dist/db/json-indexes.js.map +1 -0
- package/dist/db/linked-accounts.js +287 -0
- package/dist/db/linked-accounts.js.map +1 -0
- package/dist/db/nouns.js +183 -0
- package/dist/db/nouns.js.map +1 -0
- package/dist/db/objects.js +170 -0
- package/dist/db/objects.js.map +1 -0
- package/dist/db/primitives/dag-scheduler/index.js +869 -0
- package/dist/db/primitives/dag-scheduler/index.js.map +1 -0
- package/dist/db/primitives/exactly-once-context.js +237 -0
- package/dist/db/primitives/exactly-once-context.js.map +1 -0
- package/dist/db/primitives/index.js +62 -0
- package/dist/db/primitives/index.js.map +1 -0
- package/dist/db/primitives/keyed-router.js +145 -0
- package/dist/db/primitives/keyed-router.js.map +1 -0
- package/dist/db/primitives/observability.js +162 -0
- package/dist/db/primitives/observability.js.map +1 -0
- package/dist/db/primitives/schema-evolution.js +643 -0
- package/dist/db/primitives/schema-evolution.js.map +1 -0
- package/dist/db/primitives/stateful-operator/index.js +770 -0
- package/dist/db/primitives/stateful-operator/index.js.map +1 -0
- package/dist/db/primitives/temporal-store.js +306 -0
- package/dist/db/primitives/temporal-store.js.map +1 -0
- package/dist/db/primitives/typed-column-store.js +1229 -0
- package/dist/db/primitives/typed-column-store.js.map +1 -0
- package/dist/db/primitives/utils/duration.js +162 -0
- package/dist/db/primitives/utils/duration.js.map +1 -0
- package/dist/db/primitives/utils/murmur3.js +116 -0
- package/dist/db/primitives/utils/murmur3.js.map +1 -0
- package/dist/db/primitives/watermark-service.js +136 -0
- package/dist/db/primitives/watermark-service.js.map +1 -0
- package/dist/db/primitives/window-manager.js +764 -0
- package/dist/db/primitives/window-manager.js.map +1 -0
- package/dist/db/relationships.js +66 -0
- package/dist/db/relationships.js.map +1 -0
- package/dist/db/schema-minimal.js +61 -0
- package/dist/db/schema-minimal.js.map +1 -0
- package/dist/db/search.js +28 -0
- package/dist/db/search.js.map +1 -0
- package/dist/db/stores.js +1665 -0
- package/dist/db/stores.js.map +1 -0
- package/dist/db/things.js +297 -0
- package/dist/db/things.js.map +1 -0
- package/dist/db/vault.js +171 -0
- package/dist/db/vault.js.map +1 -0
- package/dist/db/verbs.js +102 -0
- package/dist/db/verbs.js.map +1 -0
- package/dist/do/base.js +48 -0
- package/dist/do/base.js.map +1 -0
- package/dist/do/tiny.js +31 -0
- package/dist/do/tiny.js.map +1 -0
- package/dist/lib/DOAuth.js +261 -0
- package/dist/lib/DOAuth.js.map +1 -0
- package/dist/lib/DODispatcher.js +72 -0
- package/dist/lib/DODispatcher.js.map +1 -0
- package/dist/lib/Modifier.js +189 -0
- package/dist/lib/Modifier.js.map +1 -0
- package/dist/lib/StateStorage.js +403 -0
- package/dist/lib/StateStorage.js.map +1 -0
- package/dist/lib/TypeRegistry.js +122 -0
- package/dist/lib/TypeRegistry.js.map +1 -0
- package/dist/lib/ai/gateway.js +247 -0
- package/dist/lib/ai/gateway.js.map +1 -0
- package/dist/lib/ai/tool-loop-agent.js +591 -0
- package/dist/lib/ai/tool-loop-agent.js.map +1 -0
- package/dist/lib/auto-wiring.js +439 -0
- package/dist/lib/auto-wiring.js.map +1 -0
- package/dist/lib/browse/browserbase.js +163 -0
- package/dist/lib/browse/browserbase.js.map +1 -0
- package/dist/lib/browse/cloudflare.js +144 -0
- package/dist/lib/browse/cloudflare.js.map +1 -0
- package/dist/lib/browse/index.js +62 -0
- package/dist/lib/browse/index.js.map +1 -0
- package/dist/lib/browse/types.js +13 -0
- package/dist/lib/browse/types.js.map +1 -0
- package/dist/lib/cache/index.js +37 -0
- package/dist/lib/cache/index.js.map +1 -0
- package/dist/lib/cache/visibility.js +638 -0
- package/dist/lib/cache/visibility.js.map +1 -0
- package/dist/lib/capabilities.js +268 -0
- package/dist/lib/capabilities.js.map +1 -0
- package/dist/lib/channels/base.js +106 -0
- package/dist/lib/channels/base.js.map +1 -0
- package/dist/lib/channels/discord.js +94 -0
- package/dist/lib/channels/discord.js.map +1 -0
- package/dist/lib/channels/email.js +204 -0
- package/dist/lib/channels/email.js.map +1 -0
- package/dist/lib/channels/index.js +90 -0
- package/dist/lib/channels/index.js.map +1 -0
- package/dist/lib/channels/mdxui-chat.js +95 -0
- package/dist/lib/channels/mdxui-chat.js.map +1 -0
- package/dist/lib/channels/slack-blockkit.js +121 -0
- package/dist/lib/channels/slack-blockkit.js.map +1 -0
- package/dist/lib/channels/types.js +7 -0
- package/dist/lib/channels/types.js.map +1 -0
- package/dist/lib/cloudflare/ai.js +654 -0
- package/dist/lib/cloudflare/ai.js.map +1 -0
- package/dist/lib/cloudflare/index.js +88 -0
- package/dist/lib/cloudflare/index.js.map +1 -0
- package/dist/lib/cloudflare/kv.js +342 -0
- package/dist/lib/cloudflare/kv.js.map +1 -0
- package/dist/lib/cloudflare/queues.js +434 -0
- package/dist/lib/cloudflare/queues.js.map +1 -0
- package/dist/lib/cloudflare/r2.js +604 -0
- package/dist/lib/cloudflare/r2.js.map +1 -0
- package/dist/lib/cloudflare/vectorize.js +494 -0
- package/dist/lib/cloudflare/vectorize.js.map +1 -0
- package/dist/lib/cloudflare/workflows.js +569 -0
- package/dist/lib/cloudflare/workflows.js.map +1 -0
- package/dist/lib/colo/caching.js +196 -0
- package/dist/lib/colo/caching.js.map +1 -0
- package/dist/lib/colo/detection.js +194 -0
- package/dist/lib/colo/detection.js.map +1 -0
- package/dist/lib/colo/external-data.js +219 -0
- package/dist/lib/colo/external-data.js.map +1 -0
- package/dist/lib/colo/globe-data.js +179 -0
- package/dist/lib/colo/globe-data.js.map +1 -0
- package/dist/lib/colo/index.js +16 -0
- package/dist/lib/colo/index.js.map +1 -0
- package/dist/lib/decorators.js +37 -0
- package/dist/lib/decorators.js.map +1 -0
- package/dist/lib/discovery.js +81 -0
- package/dist/lib/discovery.js.map +1 -0
- package/dist/lib/executors/AgenticFunctionExecutor.js +619 -0
- package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/BaseFunctionExecutor.js +328 -0
- package/dist/lib/executors/BaseFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/CascadeExecutor.js +418 -0
- package/dist/lib/executors/CascadeExecutor.js.map +1 -0
- package/dist/lib/executors/CodeFunctionExecutor.js +904 -0
- package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/GenerativeFunctionExecutor.js +904 -0
- package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/HumanFunctionExecutor.js +884 -0
- package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/ParallelStepExecutor.js +308 -0
- package/dist/lib/executors/ParallelStepExecutor.js.map +1 -0
- package/dist/lib/executors/types.js +12 -0
- package/dist/lib/executors/types.js.map +1 -0
- package/dist/lib/experiments.js +89 -0
- package/dist/lib/experiments.js.map +1 -0
- package/dist/lib/flags/store.js +262 -0
- package/dist/lib/flags/store.js.map +1 -0
- package/dist/lib/functions/FunctionComposition.js +467 -0
- package/dist/lib/functions/FunctionComposition.js.map +1 -0
- package/dist/lib/functions/FunctionMiddleware.js +457 -0
- package/dist/lib/functions/FunctionMiddleware.js.map +1 -0
- package/dist/lib/functions/FunctionRegistry.js +426 -0
- package/dist/lib/functions/FunctionRegistry.js.map +1 -0
- package/dist/lib/functions/createFunction.js +1048 -0
- package/dist/lib/functions/createFunction.js.map +1 -0
- package/dist/lib/humans/index.js +68 -0
- package/dist/lib/humans/index.js.map +1 -0
- package/dist/lib/humans/templates.js +117 -0
- package/dist/lib/humans/templates.js.map +1 -0
- package/dist/lib/identity.js +98 -0
- package/dist/lib/identity.js.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logging/error-logger.js +163 -0
- package/dist/lib/logging/error-logger.js.map +1 -0
- package/dist/lib/logging/index.js +160 -0
- package/dist/lib/logging/index.js.map +1 -0
- package/dist/lib/mixins/bash.js +753 -0
- package/dist/lib/mixins/bash.js.map +1 -0
- package/dist/lib/mixins/fs.js +648 -0
- package/dist/lib/mixins/fs.js.map +1 -0
- package/dist/lib/mixins/git.js +1006 -0
- package/dist/lib/mixins/git.js.map +1 -0
- package/dist/lib/mixins/npm.js +662 -0
- package/dist/lib/mixins/npm.js.map +1 -0
- package/dist/lib/noun-id.js +278 -0
- package/dist/lib/noun-id.js.map +1 -0
- package/dist/lib/rate-limit/sliding-window.js +148 -0
- package/dist/lib/rate-limit/sliding-window.js.map +1 -0
- package/dist/lib/rate-limit.js +110 -0
- package/dist/lib/rate-limit.js.map +1 -0
- package/dist/lib/rpc/bindings.js +548 -0
- package/dist/lib/rpc/bindings.js.map +1 -0
- package/dist/lib/rpc/index.js +64 -0
- package/dist/lib/rpc/index.js.map +1 -0
- package/dist/lib/safe-stringify.js +223 -0
- package/dist/lib/safe-stringify.js.map +1 -0
- package/dist/lib/sandbox/miniflare-sandbox.js +1007 -0
- package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -0
- package/dist/lib/sqids.js +110 -0
- package/dist/lib/sqids.js.map +1 -0
- package/dist/lib/sql/adapters/index.js +10 -0
- package/dist/lib/sql/adapters/index.js.map +1 -0
- package/dist/lib/sql/adapters/node-sql-parser.js +552 -0
- package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -0
- package/dist/lib/sql/adapters/pgsql-parser.js +1190 -0
- package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -0
- package/dist/lib/sql/index.js +277 -0
- package/dist/lib/sql/index.js.map +1 -0
- package/dist/lib/sql/types.js +56 -0
- package/dist/lib/sql/types.js.map +1 -0
- package/dist/lib/type-classifier.js +126 -0
- package/dist/lib/type-classifier.js.map +1 -0
- package/dist/lib/utils/html.js +47 -0
- package/dist/lib/utils/html.js.map +1 -0
- package/dist/lib/validation.js +48 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/vault/store.js +411 -0
- package/dist/lib/vault/store.js.map +1 -0
- package/dist/metrics/hunch.js +739 -0
- package/dist/metrics/hunch.js.map +1 -0
- package/dist/objects/API.js +302 -0
- package/dist/objects/API.js.map +1 -0
- package/dist/objects/Agent.js +179 -0
- package/dist/objects/Agent.js.map +1 -0
- package/dist/objects/AgenticFunctionExecutor.js +8 -0
- package/dist/objects/AgenticFunctionExecutor.js.map +1 -0
- package/dist/objects/App.js +83 -0
- package/dist/objects/App.js.map +1 -0
- package/dist/objects/Browser.js +884 -0
- package/dist/objects/Browser.js.map +1 -0
- package/dist/objects/Business.js +107 -0
- package/dist/objects/Business.js.map +1 -0
- package/dist/objects/CLI.js +221 -0
- package/dist/objects/CLI.js.map +1 -0
- package/dist/objects/CodeFunctionExecutor.js +8 -0
- package/dist/objects/CodeFunctionExecutor.js.map +1 -0
- package/dist/objects/Collection.js +161 -0
- package/dist/objects/Collection.js.map +1 -0
- package/dist/objects/DO.js +41 -0
- package/dist/objects/DO.js.map +1 -0
- package/dist/objects/DOBase.js +2309 -0
- package/dist/objects/DOBase.js.map +1 -0
- package/dist/objects/DOCache.js +153 -0
- package/dist/objects/DOCache.js.map +1 -0
- package/dist/objects/DOFull.js +1676 -0
- package/dist/objects/DOFull.js.map +1 -0
- package/dist/objects/DOTiny.js +207 -0
- package/dist/objects/DOTiny.js.map +1 -0
- package/dist/objects/Directory.js +199 -0
- package/dist/objects/Directory.js.map +1 -0
- package/dist/objects/Entity.js +413 -0
- package/dist/objects/Entity.js.map +1 -0
- package/dist/objects/Function.js +116 -0
- package/dist/objects/Function.js.map +1 -0
- package/dist/objects/Human.js +231 -0
- package/dist/objects/Human.js.map +1 -0
- package/dist/objects/HumanFunctionExecutor.js +8 -0
- package/dist/objects/HumanFunctionExecutor.js.map +1 -0
- package/dist/objects/IcebergMetadataDO.js +938 -0
- package/dist/objects/IcebergMetadataDO.js.map +1 -0
- package/dist/objects/IntegrationsDO.js +1174 -0
- package/dist/objects/IntegrationsDO.js.map +1 -0
- package/dist/objects/ObservabilityBroadcaster.js +149 -0
- package/dist/objects/ObservabilityBroadcaster.js.map +1 -0
- package/dist/objects/Package.js +154 -0
- package/dist/objects/Package.js.map +1 -0
- package/dist/objects/Product.js +193 -0
- package/dist/objects/Product.js.map +1 -0
- package/dist/objects/SDK.js +152 -0
- package/dist/objects/SDK.js.map +1 -0
- package/dist/objects/SaaS.js +235 -0
- package/dist/objects/SaaS.js.map +1 -0
- package/dist/objects/SandboxDO.js +759 -0
- package/dist/objects/SandboxDO.js.map +1 -0
- package/dist/objects/Service.js +337 -0
- package/dist/objects/Service.js.map +1 -0
- package/dist/objects/Site.js +80 -0
- package/dist/objects/Site.js.map +1 -0
- package/dist/objects/Startup.js +479 -0
- package/dist/objects/Startup.js.map +1 -0
- package/dist/objects/ThingsDO.js +170 -0
- package/dist/objects/ThingsDO.js.map +1 -0
- package/dist/objects/VectorShardDO.js +650 -0
- package/dist/objects/VectorShardDO.js.map +1 -0
- package/dist/objects/Worker.js +144 -0
- package/dist/objects/Worker.js.map +1 -0
- package/dist/objects/Workflow.js +196 -0
- package/dist/objects/Workflow.js.map +1 -0
- package/dist/objects/WorkflowFactory.js +313 -0
- package/dist/objects/WorkflowFactory.js.map +1 -0
- package/dist/objects/WorkflowRuntime.js +863 -0
- package/dist/objects/WorkflowRuntime.js.map +1 -0
- package/dist/objects/circuit-breaker-bulkhead.js +178 -0
- package/dist/objects/circuit-breaker-bulkhead.js.map +1 -0
- package/dist/objects/createFunction.js +934 -0
- package/dist/objects/createFunction.js.map +1 -0
- package/dist/objects/index.js +80 -0
- package/dist/objects/index.js.map +1 -0
- package/dist/objects/lifecycle/Branch.js +275 -0
- package/dist/objects/lifecycle/Branch.js.map +1 -0
- package/dist/objects/lifecycle/Clone.js +1499 -0
- package/dist/objects/lifecycle/Clone.js.map +1 -0
- package/dist/objects/lifecycle/Compact.js +237 -0
- package/dist/objects/lifecycle/Compact.js.map +1 -0
- package/dist/objects/lifecycle/Promote.js +476 -0
- package/dist/objects/lifecycle/Promote.js.map +1 -0
- package/dist/objects/lifecycle/Shard.js +560 -0
- package/dist/objects/lifecycle/Shard.js.map +1 -0
- package/dist/objects/lifecycle/index.js +15 -0
- package/dist/objects/lifecycle/index.js.map +1 -0
- package/dist/objects/lifecycle/types.js +33 -0
- package/dist/objects/lifecycle/types.js.map +1 -0
- package/dist/objects/mixins/infrastructure.js +171 -0
- package/dist/objects/mixins/infrastructure.js.map +1 -0
- package/dist/objects/modules/StoresModule.js +153 -0
- package/dist/objects/modules/StoresModule.js.map +1 -0
- package/dist/objects/persistence/checkpoint-manager.js +606 -0
- package/dist/objects/persistence/checkpoint-manager.js.map +1 -0
- package/dist/objects/persistence/index.js +72 -0
- package/dist/objects/persistence/index.js.map +1 -0
- package/dist/objects/persistence/migration-runner.js +562 -0
- package/dist/objects/persistence/migration-runner.js.map +1 -0
- package/dist/objects/persistence/replication-manager.js +501 -0
- package/dist/objects/persistence/replication-manager.js.map +1 -0
- package/dist/objects/persistence/tiered-storage-manager.js +595 -0
- package/dist/objects/persistence/tiered-storage-manager.js.map +1 -0
- package/dist/objects/persistence/types.js +14 -0
- package/dist/objects/persistence/types.js.map +1 -0
- package/dist/objects/persistence/wal-manager.js +653 -0
- package/dist/objects/persistence/wal-manager.js.map +1 -0
- package/dist/objects/presets/index.js +20 -0
- package/dist/objects/presets/index.js.map +1 -0
- package/dist/objects/presets/primitives.js +188 -0
- package/dist/objects/presets/primitives.js.map +1 -0
- package/dist/objects/primitives/alarm-adapter.js +141 -0
- package/dist/objects/primitives/alarm-adapter.js.map +1 -0
- package/dist/objects/primitives/index.js +337 -0
- package/dist/objects/primitives/index.js.map +1 -0
- package/dist/objects/primitives/storage-adapter.js +182 -0
- package/dist/objects/primitives/storage-adapter.js.map +1 -0
- package/dist/objects/primitives/with-primitives.js +102 -0
- package/dist/objects/primitives/with-primitives.js.map +1 -0
- package/dist/objects/services/StoreManager.js +227 -0
- package/dist/objects/services/StoreManager.js.map +1 -0
- package/dist/objects/services/index.js +13 -0
- package/dist/objects/services/index.js.map +1 -0
- package/dist/objects/transport/auth-layer.js +1451 -0
- package/dist/objects/transport/auth-layer.js.map +1 -0
- package/dist/objects/transport/capnweb-target.js +355 -0
- package/dist/objects/transport/capnweb-target.js.map +1 -0
- package/dist/objects/transport/chain.js +441 -0
- package/dist/objects/transport/chain.js.map +1 -0
- package/dist/objects/transport/handler.js +58 -0
- package/dist/objects/transport/handler.js.map +1 -0
- package/dist/objects/transport/index.js +53 -0
- package/dist/objects/transport/index.js.map +1 -0
- package/dist/objects/transport/mcp-server.js +691 -0
- package/dist/objects/transport/mcp-server.js.map +1 -0
- package/dist/objects/transport/rest-autowire.js +1508 -0
- package/dist/objects/transport/rest-autowire.js.map +1 -0
- package/dist/objects/transport/rest-router.js +440 -0
- package/dist/objects/transport/rest-router.js.map +1 -0
- package/dist/objects/transport/rpc-server.js +1539 -0
- package/dist/objects/transport/rpc-server.js.map +1 -0
- package/dist/objects/transport/shared.js +576 -0
- package/dist/objects/transport/shared.js.map +1 -0
- package/dist/objects/transport/sync-engine.js +291 -0
- package/dist/objects/transport/sync-engine.js.map +1 -0
- package/dist/objects/transport/types.js +8 -0
- package/dist/objects/transport/types.js.map +1 -0
- package/dist/sandbox/index.js +258 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/snippets/artifacts-config.js +241 -0
- package/dist/snippets/artifacts-config.js.map +1 -0
- package/dist/snippets/artifacts-ingest.js +832 -0
- package/dist/snippets/artifacts-ingest.js.map +1 -0
- package/dist/snippets/artifacts-serve.js +1035 -0
- package/dist/snippets/artifacts-serve.js.map +1 -0
- package/dist/snippets/artifacts-types.js +161 -0
- package/dist/snippets/artifacts-types.js.map +1 -0
- package/dist/snippets/cache-probe.js +376 -0
- package/dist/snippets/cache-probe.js.map +1 -0
- package/dist/snippets/cache.js +10 -0
- package/dist/snippets/cache.js.map +1 -0
- package/dist/snippets/events.js +469 -0
- package/dist/snippets/events.js.map +1 -0
- package/dist/snippets/index.js +7 -0
- package/dist/snippets/index.js.map +1 -0
- package/dist/snippets/proxy.js +495 -0
- package/dist/snippets/proxy.js.map +1 -0
- package/dist/snippets/search.js +1759 -0
- package/dist/snippets/search.js.map +1 -0
- package/dist/streams/index.js +30 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams/observability.js +68 -0
- package/dist/streams/observability.js.map +1 -0
- package/dist/types/AI.js +92 -0
- package/dist/types/AI.js.map +1 -0
- package/dist/types/AIFunction.js +171 -0
- package/dist/types/AIFunction.js.map +1 -0
- package/dist/types/BrowseVerb.js +89 -0
- package/dist/types/BrowseVerb.js.map +1 -0
- package/dist/types/Browser.js +31 -0
- package/dist/types/Browser.js.map +1 -0
- package/dist/types/Chaos.js +15 -0
- package/dist/types/Chaos.js.map +1 -0
- package/dist/types/CloudflareBindings.js +109 -0
- package/dist/types/CloudflareBindings.js.map +1 -0
- package/dist/types/Collection.js +50 -0
- package/dist/types/Collection.js.map +1 -0
- package/dist/types/DO.js +2 -0
- package/dist/types/DO.js.map +1 -0
- package/dist/types/DOLocation.js +63 -0
- package/dist/types/DOLocation.js.map +1 -0
- package/dist/types/EventHandler.js +57 -0
- package/dist/types/EventHandler.js.map +1 -0
- package/dist/types/Experiment.js +33 -0
- package/dist/types/Experiment.js.map +1 -0
- package/dist/types/Flag.js +57 -0
- package/dist/types/Flag.js.map +1 -0
- package/dist/types/Lifecycle.js +13 -0
- package/dist/types/Lifecycle.js.map +1 -0
- package/dist/types/Location.js +169 -0
- package/dist/types/Location.js.map +1 -0
- package/dist/types/Noun.js +66 -0
- package/dist/types/Noun.js.map +1 -0
- package/dist/types/SessionEvent.js +194 -0
- package/dist/types/SessionEvent.js.map +1 -0
- package/dist/types/Thing.js +55 -0
- package/dist/types/Thing.js.map +1 -0
- package/dist/types/ThingDO.js +153 -0
- package/dist/types/ThingDO.js.map +1 -0
- package/dist/types/Things.js +2 -0
- package/dist/types/Things.js.map +1 -0
- package/dist/types/Verb.js +119 -0
- package/dist/types/Verb.js.map +1 -0
- package/dist/types/WorkflowContext.js +70 -0
- package/dist/types/WorkflowContext.js.map +1 -0
- package/dist/types/analytics-api.js +13 -0
- package/dist/types/analytics-api.js.map +1 -0
- package/dist/types/capabilities.js +135 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/drizzle.js +12 -0
- package/dist/types/drizzle.js.map +1 -0
- package/dist/types/event.js +201 -0
- package/dist/types/event.js.map +1 -0
- package/dist/types/fn.js +12 -0
- package/dist/types/fn.js.map +1 -0
- package/dist/types/iceberg.js +48 -0
- package/dist/types/iceberg.js.map +1 -0
- package/dist/types/ids.js +170 -0
- package/dist/types/ids.js.map +1 -0
- package/dist/types/index.js +41 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/introspect.js +54 -0
- package/dist/types/introspect.js.map +1 -0
- package/dist/types/observability.js +124 -0
- package/dist/types/observability.js.map +1 -0
- package/dist/types/sync-protocol.js +175 -0
- package/dist/types/sync-protocol.js.map +1 -0
- package/dist/types/vector.js +13 -0
- package/dist/types/vector.js.map +1 -0
- package/dist/workflows/ScheduleManager.js +473 -0
- package/dist/workflows/ScheduleManager.js.map +1 -0
- package/dist/workflows/StepDOBridge.js +149 -0
- package/dist/workflows/StepDOBridge.js.map +1 -0
- package/dist/workflows/StepResultStorage.js +232 -0
- package/dist/workflows/StepResultStorage.js.map +1 -0
- package/dist/workflows/WaitForEventManager.js +461 -0
- package/dist/workflows/WaitForEventManager.js.map +1 -0
- package/dist/workflows/analyzer.js +332 -0
- package/dist/workflows/analyzer.js.map +1 -0
- package/dist/workflows/compat/activity-router.js +484 -0
- package/dist/workflows/compat/activity-router.js.map +1 -0
- package/dist/workflows/compat/backends/cloudflare-workflows.js +431 -0
- package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -0
- package/dist/workflows/compat/backends/index.js +14 -0
- package/dist/workflows/compat/backends/index.js.map +1 -0
- package/dist/workflows/compat/errors/index.js +375 -0
- package/dist/workflows/compat/errors/index.js.map +1 -0
- package/dist/workflows/compat/index.js +79 -0
- package/dist/workflows/compat/index.js.map +1 -0
- package/dist/workflows/compat/inngest/index.js +989 -0
- package/dist/workflows/compat/inngest/index.js.map +1 -0
- package/dist/workflows/compat/qstash/index.js +1263 -0
- package/dist/workflows/compat/qstash/index.js.map +1 -0
- package/dist/workflows/compat/temporal/activities.js +739 -0
- package/dist/workflows/compat/temporal/activities.js.map +1 -0
- package/dist/workflows/compat/temporal/child-workflows.js +154 -0
- package/dist/workflows/compat/temporal/child-workflows.js.map +1 -0
- package/dist/workflows/compat/temporal/client.js +381 -0
- package/dist/workflows/compat/temporal/client.js.map +1 -0
- package/dist/workflows/compat/temporal/context.js +309 -0
- package/dist/workflows/compat/temporal/context.js.map +1 -0
- package/dist/workflows/compat/temporal/determinism.js +216 -0
- package/dist/workflows/compat/temporal/determinism.js.map +1 -0
- package/dist/workflows/compat/temporal/errors.js +128 -0
- package/dist/workflows/compat/temporal/errors.js.map +1 -0
- package/dist/workflows/compat/temporal/index.js +2464 -0
- package/dist/workflows/compat/temporal/index.js.map +1 -0
- package/dist/workflows/compat/temporal/saga.js +504 -0
- package/dist/workflows/compat/temporal/saga.js.map +1 -0
- package/dist/workflows/compat/temporal/signals.js +364 -0
- package/dist/workflows/compat/temporal/signals.js.map +1 -0
- package/dist/workflows/compat/temporal/storage.js +271 -0
- package/dist/workflows/compat/temporal/storage.js.map +1 -0
- package/dist/workflows/compat/temporal/timers.js +347 -0
- package/dist/workflows/compat/temporal/timers.js.map +1 -0
- package/dist/workflows/compat/temporal/types.js +7 -0
- package/dist/workflows/compat/temporal/types.js.map +1 -0
- package/dist/workflows/compat/temporal/unified-primitives.js +339 -0
- package/dist/workflows/compat/temporal/unified-primitives.js.map +1 -0
- package/dist/workflows/compat/trigger/index.js +468 -0
- package/dist/workflows/compat/trigger/index.js.map +1 -0
- package/dist/workflows/compat/utils/index.js +69 -0
- package/dist/workflows/compat/utils/index.js.map +1 -0
- package/dist/workflows/context/correlation-capability.js +266 -0
- package/dist/workflows/context/correlation-capability.js.map +1 -0
- package/dist/workflows/context/correlation.js +484 -0
- package/dist/workflows/context/correlation.js.map +1 -0
- package/dist/workflows/context/experiment.js +289 -0
- package/dist/workflows/context/experiment.js.map +1 -0
- package/dist/workflows/context/flag.js +244 -0
- package/dist/workflows/context/flag.js.map +1 -0
- package/dist/workflows/context/foundation.js +648 -0
- package/dist/workflows/context/foundation.js.map +1 -0
- package/dist/workflows/context/human-base.js +106 -0
- package/dist/workflows/context/human-base.js.map +1 -0
- package/dist/workflows/context/human.js +368 -0
- package/dist/workflows/context/human.js.map +1 -0
- package/dist/workflows/context/measure.js +354 -0
- package/dist/workflows/context/measure.js.map +1 -0
- package/dist/workflows/context/rate-limit.js +358 -0
- package/dist/workflows/context/rate-limit.js.map +1 -0
- package/dist/workflows/context/user.js +117 -0
- package/dist/workflows/context/user.js.map +1 -0
- package/dist/workflows/context/vault.js +360 -0
- package/dist/workflows/context/vault.js.map +1 -0
- package/dist/workflows/data/entity-events/entity-events.js +489 -0
- package/dist/workflows/data/entity-events/entity-events.js.map +1 -0
- package/dist/workflows/data/experiment/index.js +599 -0
- package/dist/workflows/data/experiment/index.js.map +1 -0
- package/dist/workflows/data/goal/context.js +558 -0
- package/dist/workflows/data/goal/context.js.map +1 -0
- package/dist/workflows/data/goal/index.js +32 -0
- package/dist/workflows/data/goal/index.js.map +1 -0
- package/dist/workflows/data/measure/index.js +840 -0
- package/dist/workflows/data/measure/index.js.map +1 -0
- package/dist/workflows/data/stream/index.js +1149 -0
- package/dist/workflows/data/stream/index.js.map +1 -0
- package/dist/workflows/data/track/context.js +883 -0
- package/dist/workflows/data/track/context.js.map +1 -0
- package/dist/workflows/data/track/index.js +15 -0
- package/dist/workflows/data/track/index.js.map +1 -0
- package/dist/workflows/data/view/context.js +864 -0
- package/dist/workflows/data/view/context.js.map +1 -0
- package/dist/workflows/domain.js +93 -0
- package/dist/workflows/domain.js.map +1 -0
- package/dist/workflows/flag.js +176 -0
- package/dist/workflows/flag.js.map +1 -0
- package/dist/workflows/flags.js +217 -0
- package/dist/workflows/flags.js.map +1 -0
- package/dist/workflows/hash.js +209 -0
- package/dist/workflows/hash.js.map +1 -0
- package/dist/workflows/index.js +50 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/on.js +378 -0
- package/dist/workflows/on.js.map +1 -0
- package/dist/workflows/pipeline-promise.js +481 -0
- package/dist/workflows/pipeline-promise.js.map +1 -0
- package/dist/workflows/pipeline-types.js +20 -0
- package/dist/workflows/pipeline-types.js.map +1 -0
- package/dist/workflows/proxy.js +76 -0
- package/dist/workflows/proxy.js.map +1 -0
- package/dist/workflows/runtime.js +310 -0
- package/dist/workflows/runtime.js.map +1 -0
- package/dist/workflows/schedule-builder.js +327 -0
- package/dist/workflows/schedule-builder.js.map +1 -0
- package/dist/workflows/visibility/index.js +146 -0
- package/dist/workflows/visibility/index.js.map +1 -0
- package/dist/workflows/visibility/query-parser.js +150 -0
- package/dist/workflows/visibility/query-parser.js.map +1 -0
- package/dist/workflows/visibility/store.js +223 -0
- package/dist/workflows/visibility/store.js.map +1 -0
- package/dist/workflows/visibility/types.js +30 -0
- package/dist/workflows/visibility/types.js.map +1 -0
- package/dist/workflows/workflow.js +53 -0
- package/dist/workflows/workflow.js.map +1 -0
- package/package.json +294 -46
|
@@ -0,0 +1,691 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Integration for Durable Objects
|
|
3
|
+
*
|
|
4
|
+
* Provides MCP (Model Context Protocol) support for DO classes.
|
|
5
|
+
* Allows DO methods to be exposed as MCP tools and DO data as MCP resources.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Static $mcp configuration for tool/resource definitions
|
|
9
|
+
* - JSON-RPC 2.0 protocol compliance
|
|
10
|
+
* - Session management with Mcp-Session-Id header
|
|
11
|
+
* - Auto-generated JSON schemas from tool configurations
|
|
12
|
+
* - SSE stream support for server notifications
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* class MyDO extends DO {
|
|
17
|
+
* static $mcp = {
|
|
18
|
+
* tools: {
|
|
19
|
+
* search: {
|
|
20
|
+
* description: 'Search items',
|
|
21
|
+
* inputSchema: {
|
|
22
|
+
* query: { type: 'string', description: 'Search query' },
|
|
23
|
+
* },
|
|
24
|
+
* required: ['query'],
|
|
25
|
+
* },
|
|
26
|
+
* },
|
|
27
|
+
* resources: ['items', 'users'],
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* search(query: string) {
|
|
31
|
+
* // Implementation
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// JSON-RPC ERROR CODES
|
|
38
|
+
// ============================================================================
|
|
39
|
+
export const JSON_RPC_ERRORS = {
|
|
40
|
+
PARSE_ERROR: -32700,
|
|
41
|
+
INVALID_REQUEST: -32600,
|
|
42
|
+
METHOD_NOT_FOUND: -32601,
|
|
43
|
+
INVALID_PARAMS: -32602,
|
|
44
|
+
INTERNAL_ERROR: -32603,
|
|
45
|
+
};
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// MCP PROTOCOL CONSTANTS
|
|
48
|
+
// ============================================================================
|
|
49
|
+
const MCP_PROTOCOL_VERSION = '2024-11-05';
|
|
50
|
+
const MCP_SERVER_NAME = 'dotdo-do-mcp-server';
|
|
51
|
+
const MCP_SERVER_VERSION = '0.1.0';
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// HELPER FUNCTIONS
|
|
54
|
+
// ============================================================================
|
|
55
|
+
/**
|
|
56
|
+
* Create a JSON-RPC error response
|
|
57
|
+
*/
|
|
58
|
+
function jsonRpcError(id, code, message, data) {
|
|
59
|
+
return {
|
|
60
|
+
jsonrpc: '2.0',
|
|
61
|
+
id,
|
|
62
|
+
error: { code, message, data },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a JSON-RPC success response
|
|
67
|
+
*/
|
|
68
|
+
function jsonRpcSuccess(id, result) {
|
|
69
|
+
return {
|
|
70
|
+
jsonrpc: '2.0',
|
|
71
|
+
id,
|
|
72
|
+
result,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// SCHEMA GENERATION
|
|
77
|
+
// ============================================================================
|
|
78
|
+
/**
|
|
79
|
+
* Generate a JSON Schema from a tool configuration
|
|
80
|
+
*/
|
|
81
|
+
export function generateToolSchema(toolConfig) {
|
|
82
|
+
const properties = {};
|
|
83
|
+
for (const [name, config] of Object.entries(toolConfig.inputSchema)) {
|
|
84
|
+
properties[name] = {
|
|
85
|
+
type: config.type,
|
|
86
|
+
...(config.description && { description: config.description }),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
type: 'object',
|
|
91
|
+
properties,
|
|
92
|
+
...(toolConfig.required && toolConfig.required.length > 0 && { required: toolConfig.required }),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// TOOL AND RESOURCE DISCOVERY
|
|
97
|
+
// ============================================================================
|
|
98
|
+
/**
|
|
99
|
+
* Get MCP tools from a DO class's $mcp configuration
|
|
100
|
+
*/
|
|
101
|
+
export function getMcpTools(DOClass) {
|
|
102
|
+
const config = DOClass.$mcp;
|
|
103
|
+
if (!config?.tools) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
const tools = [];
|
|
107
|
+
for (const [name, toolConfig] of Object.entries(config.tools)) {
|
|
108
|
+
tools.push({
|
|
109
|
+
name,
|
|
110
|
+
description: toolConfig.description,
|
|
111
|
+
inputSchema: generateToolSchema(toolConfig),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return tools;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get MCP resources from a DO class's $mcp configuration
|
|
118
|
+
*/
|
|
119
|
+
export function getMcpResources(DOClass, ns) {
|
|
120
|
+
const config = DOClass.$mcp;
|
|
121
|
+
if (!config?.resources) {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
// Parse the namespace URL to extract host
|
|
125
|
+
let host = 'do';
|
|
126
|
+
try {
|
|
127
|
+
const url = new URL(ns);
|
|
128
|
+
host = url.host;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Use default host
|
|
132
|
+
}
|
|
133
|
+
return config.resources.map((resourceName) => ({
|
|
134
|
+
uri: `do://${host}/${resourceName}`,
|
|
135
|
+
name: resourceName,
|
|
136
|
+
mimeType: 'application/json',
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// MCP HANDLER FACTORY
|
|
141
|
+
// ============================================================================
|
|
142
|
+
/**
|
|
143
|
+
* Create an MCP request handler for a DO class
|
|
144
|
+
*
|
|
145
|
+
* @param DOClass - The DO class with $mcp configuration
|
|
146
|
+
* @returns A function that handles MCP requests
|
|
147
|
+
*/
|
|
148
|
+
export function createMcpHandler(DOClass) {
|
|
149
|
+
const tools = getMcpTools(DOClass);
|
|
150
|
+
const toolsByName = new Map(tools.map((t) => [t.name, t]));
|
|
151
|
+
const toolConfigByName = new Map(Object.entries(DOClass.$mcp?.tools ?? {}).map(([name, config]) => [name, config]));
|
|
152
|
+
return async function handleMcp(instance, request, sessions) {
|
|
153
|
+
const method = request.method;
|
|
154
|
+
// GET: SSE stream for notifications
|
|
155
|
+
if (method === 'GET') {
|
|
156
|
+
const sessionId = request.headers.get('mcp-session-id') || request.headers.get('Mcp-Session-Id');
|
|
157
|
+
if (!sessionId) {
|
|
158
|
+
return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Missing Mcp-Session-Id header')), {
|
|
159
|
+
status: 400,
|
|
160
|
+
headers: { 'Content-Type': 'application/json' },
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const session = sessions.get(sessionId);
|
|
164
|
+
if (!session) {
|
|
165
|
+
return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found')), {
|
|
166
|
+
status: 404,
|
|
167
|
+
headers: { 'Content-Type': 'application/json' },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Return SSE stream
|
|
171
|
+
const stream = new ReadableStream({
|
|
172
|
+
start(controller) {
|
|
173
|
+
controller.enqueue(new TextEncoder().encode(': keep-alive\n\n'));
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
return new Response(stream, {
|
|
177
|
+
status: 200,
|
|
178
|
+
headers: {
|
|
179
|
+
'Content-Type': 'text/event-stream',
|
|
180
|
+
'Cache-Control': 'no-cache',
|
|
181
|
+
'Connection': 'keep-alive',
|
|
182
|
+
'Mcp-Session-Id': sessionId,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// DELETE: Terminate session
|
|
187
|
+
if (method === 'DELETE') {
|
|
188
|
+
const sessionId = request.headers.get('mcp-session-id') || request.headers.get('Mcp-Session-Id');
|
|
189
|
+
if (!sessionId) {
|
|
190
|
+
return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Missing Mcp-Session-Id header')), {
|
|
191
|
+
status: 400,
|
|
192
|
+
headers: { 'Content-Type': 'application/json' },
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
const deleted = sessions.delete(sessionId);
|
|
196
|
+
if (!deleted) {
|
|
197
|
+
return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found')), {
|
|
198
|
+
status: 404,
|
|
199
|
+
headers: { 'Content-Type': 'application/json' },
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return new Response(null, { status: 204 });
|
|
203
|
+
}
|
|
204
|
+
// Only POST allowed for JSON-RPC
|
|
205
|
+
if (method !== 'POST') {
|
|
206
|
+
return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Method not allowed')), {
|
|
207
|
+
status: 405,
|
|
208
|
+
headers: {
|
|
209
|
+
'Content-Type': 'application/json',
|
|
210
|
+
'Allow': 'GET, POST, DELETE',
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
// Parse request body
|
|
215
|
+
let body;
|
|
216
|
+
try {
|
|
217
|
+
body = (await request.json());
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return new Response(JSON.stringify(jsonRpcError(null, JSON_RPC_ERRORS.PARSE_ERROR, 'Parse error')), {
|
|
221
|
+
status: 200,
|
|
222
|
+
headers: { 'Content-Type': 'application/json' },
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
// Get or validate session
|
|
226
|
+
let sessionId = request.headers.get('mcp-session-id') || request.headers.get('Mcp-Session-Id');
|
|
227
|
+
let currentSession = sessionId ? sessions.get(sessionId) : undefined;
|
|
228
|
+
// Check if we need to validate session before processing
|
|
229
|
+
// If session ID was provided but session not found, and request is not initialize/ping, return 404
|
|
230
|
+
const requests = Array.isArray(body) ? body : [body];
|
|
231
|
+
const firstRequest = requests[0];
|
|
232
|
+
const firstMethod = firstRequest?.method;
|
|
233
|
+
// Define known MCP methods
|
|
234
|
+
const knownMethods = new Set([
|
|
235
|
+
'initialize',
|
|
236
|
+
'ping',
|
|
237
|
+
'tools/list',
|
|
238
|
+
'tools/call',
|
|
239
|
+
'resources/list',
|
|
240
|
+
'resources/read',
|
|
241
|
+
'prompts/list',
|
|
242
|
+
]);
|
|
243
|
+
// For non-notification requests (has id), check if the request is valid JSON-RPC
|
|
244
|
+
// and if the method is known
|
|
245
|
+
if (firstRequest?.id !== undefined) {
|
|
246
|
+
// Check JSON-RPC version first
|
|
247
|
+
if (firstRequest?.jsonrpc !== '2.0') {
|
|
248
|
+
return new Response(JSON.stringify(jsonRpcError(firstRequest?.id ?? null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Invalid JSON-RPC version')), {
|
|
249
|
+
status: 200,
|
|
250
|
+
headers: { 'Content-Type': 'application/json' },
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
// Check for unknown method (before session check)
|
|
254
|
+
if (firstMethod && !knownMethods.has(firstMethod)) {
|
|
255
|
+
return new Response(JSON.stringify(jsonRpcError(firstRequest?.id ?? null, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${firstMethod}`)), {
|
|
256
|
+
status: 200,
|
|
257
|
+
headers: { 'Content-Type': 'application/json' },
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const requiresSession = firstMethod && firstMethod !== 'initialize' && firstMethod !== 'ping';
|
|
262
|
+
// Only validate session for non-notification requests
|
|
263
|
+
if (sessionId && !currentSession && requiresSession && firstRequest?.id !== undefined) {
|
|
264
|
+
return new Response(JSON.stringify(jsonRpcError(firstRequest?.id ?? null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found')), {
|
|
265
|
+
status: 404,
|
|
266
|
+
headers: { 'Content-Type': 'application/json' },
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
// Handle batch requests
|
|
270
|
+
const responses = [];
|
|
271
|
+
const responseHeaders = {
|
|
272
|
+
'Content-Type': 'application/json',
|
|
273
|
+
};
|
|
274
|
+
// Track if all requests are notifications
|
|
275
|
+
let allNotifications = true;
|
|
276
|
+
for (const req of requests) {
|
|
277
|
+
// Validate JSON-RPC format
|
|
278
|
+
if (req.jsonrpc !== '2.0') {
|
|
279
|
+
responses.push(jsonRpcError(req.id ?? null, JSON_RPC_ERRORS.INVALID_REQUEST, 'Invalid JSON-RPC version'));
|
|
280
|
+
allNotifications = false;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
// Notifications have no id - no response expected
|
|
284
|
+
if (req.id === undefined) {
|
|
285
|
+
// Process notification but don't add to responses
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
allNotifications = false;
|
|
289
|
+
// Handle MCP methods
|
|
290
|
+
const response = await handleMcpMethod(req, instance, DOClass, sessions, sessionId, currentSession, tools, toolsByName, toolConfigByName);
|
|
291
|
+
// Update session reference if created
|
|
292
|
+
if (response.session) {
|
|
293
|
+
currentSession = response.session;
|
|
294
|
+
sessionId = response.session.id;
|
|
295
|
+
}
|
|
296
|
+
responses.push(response.response);
|
|
297
|
+
}
|
|
298
|
+
// If all requests were notifications, return 204
|
|
299
|
+
if (allNotifications && responses.length === 0) {
|
|
300
|
+
return new Response(null, { status: 204 });
|
|
301
|
+
}
|
|
302
|
+
// If session was created/used, include it in response headers
|
|
303
|
+
if (currentSession) {
|
|
304
|
+
responseHeaders['Mcp-Session-Id'] = currentSession.id;
|
|
305
|
+
}
|
|
306
|
+
// Return single response or batch
|
|
307
|
+
const responseBody = Array.isArray(body) ? responses : responses[0];
|
|
308
|
+
return new Response(JSON.stringify(responseBody), {
|
|
309
|
+
status: 200,
|
|
310
|
+
headers: responseHeaders,
|
|
311
|
+
});
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Handle a single MCP method call
|
|
316
|
+
*/
|
|
317
|
+
async function handleMcpMethod(req, instance, DOClass, sessions, sessionId, currentSession, tools, toolsByName, toolConfigByName) {
|
|
318
|
+
// Methods that don't require session
|
|
319
|
+
if (req.method === 'ping') {
|
|
320
|
+
return { response: jsonRpcSuccess(req.id, {}) };
|
|
321
|
+
}
|
|
322
|
+
if (req.method === 'initialize') {
|
|
323
|
+
// Create new session if not exists
|
|
324
|
+
if (!currentSession) {
|
|
325
|
+
const newSession = {
|
|
326
|
+
id: crypto.randomUUID(),
|
|
327
|
+
createdAt: new Date(),
|
|
328
|
+
lastAccessedAt: new Date(),
|
|
329
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
330
|
+
};
|
|
331
|
+
const params = req.params;
|
|
332
|
+
if (params?.clientInfo) {
|
|
333
|
+
newSession.clientInfo = params.clientInfo;
|
|
334
|
+
}
|
|
335
|
+
sessions.set(newSession.id, newSession);
|
|
336
|
+
currentSession = newSession;
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
response: jsonRpcSuccess(req.id, {
|
|
340
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
341
|
+
capabilities: {
|
|
342
|
+
tools: { listChanged: true },
|
|
343
|
+
resources: { subscribe: true, listChanged: true },
|
|
344
|
+
prompts: { listChanged: true },
|
|
345
|
+
},
|
|
346
|
+
serverInfo: {
|
|
347
|
+
name: MCP_SERVER_NAME,
|
|
348
|
+
version: MCP_SERVER_VERSION,
|
|
349
|
+
},
|
|
350
|
+
}),
|
|
351
|
+
session: currentSession,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
// Methods that require session
|
|
355
|
+
if (req.method !== 'initialize' && req.method !== 'ping') {
|
|
356
|
+
// Check if session ID was provided but session not found
|
|
357
|
+
if (sessionId && !currentSession) {
|
|
358
|
+
return {
|
|
359
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not found'),
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
// Check if session is required but not provided
|
|
363
|
+
if (!currentSession) {
|
|
364
|
+
return {
|
|
365
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_REQUEST, 'Session not initialized'),
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
switch (req.method) {
|
|
370
|
+
case 'tools/list': {
|
|
371
|
+
return {
|
|
372
|
+
response: jsonRpcSuccess(req.id, { tools }),
|
|
373
|
+
session: currentSession,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
case 'tools/call': {
|
|
377
|
+
const params = req.params;
|
|
378
|
+
if (!params?.name) {
|
|
379
|
+
return {
|
|
380
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, 'Missing tool name'),
|
|
381
|
+
session: currentSession,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
const tool = toolsByName.get(params.name);
|
|
385
|
+
if (!tool) {
|
|
386
|
+
return {
|
|
387
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Tool not found: ${params.name}`),
|
|
388
|
+
session: currentSession,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
// Validate required arguments
|
|
392
|
+
const toolConfig = toolConfigByName.get(params.name);
|
|
393
|
+
const toolArgs = params.arguments || {};
|
|
394
|
+
const requiredFields = toolConfig?.required || [];
|
|
395
|
+
for (const field of requiredFields) {
|
|
396
|
+
if (!(field in toolArgs)) {
|
|
397
|
+
return {
|
|
398
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Missing required argument: ${field}`),
|
|
399
|
+
session: currentSession,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Invoke the method on the DO instance
|
|
404
|
+
try {
|
|
405
|
+
const methodFn = instance[params.name];
|
|
406
|
+
if (typeof methodFn !== 'function') {
|
|
407
|
+
return {
|
|
408
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${params.name}`),
|
|
409
|
+
session: currentSession,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
// Build arguments array from schema order
|
|
413
|
+
const argNames = Object.keys(toolConfig?.inputSchema || {});
|
|
414
|
+
const args = argNames.map((name) => toolArgs[name]);
|
|
415
|
+
const result = await methodFn.apply(instance, args);
|
|
416
|
+
const resultText = typeof result === 'string' ? result : JSON.stringify(result);
|
|
417
|
+
return {
|
|
418
|
+
response: jsonRpcSuccess(req.id, {
|
|
419
|
+
content: [{ type: 'text', text: resultText }],
|
|
420
|
+
}),
|
|
421
|
+
session: currentSession,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
426
|
+
return {
|
|
427
|
+
response: jsonRpcSuccess(req.id, {
|
|
428
|
+
content: [{ type: 'text', text: errorMessage }],
|
|
429
|
+
isError: true,
|
|
430
|
+
}),
|
|
431
|
+
session: currentSession,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
case 'resources/list': {
|
|
436
|
+
const resources = getMcpResources(DOClass, instance.ns);
|
|
437
|
+
return {
|
|
438
|
+
response: jsonRpcSuccess(req.id, { resources }),
|
|
439
|
+
session: currentSession,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
case 'resources/read': {
|
|
443
|
+
const params = req.params;
|
|
444
|
+
if (!params?.uri) {
|
|
445
|
+
return {
|
|
446
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, 'Missing resource URI'),
|
|
447
|
+
session: currentSession,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
// Parse URI: do://host/resourceName or do://host/resourceName/id
|
|
451
|
+
const uriMatch = params.uri.match(/^do:\/\/([^/]+)\/([^/]+)(?:\/(.+))?$/);
|
|
452
|
+
if (!uriMatch) {
|
|
453
|
+
return {
|
|
454
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Invalid resource URI: ${params.uri}`),
|
|
455
|
+
session: currentSession,
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
const [, , resourceName, resourceId] = uriMatch;
|
|
459
|
+
const safeResourceName = resourceName;
|
|
460
|
+
// Check if resource is defined in $mcp.resources
|
|
461
|
+
const configResources = DOClass.$mcp?.resources || [];
|
|
462
|
+
if (!configResources.includes(safeResourceName)) {
|
|
463
|
+
return {
|
|
464
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Resource not found: ${safeResourceName}`),
|
|
465
|
+
session: currentSession,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
// Try to get the resource data from the DO instance
|
|
469
|
+
// First, check for a getter method like getItems(), getUsers(), etc.
|
|
470
|
+
const getterName = `get${safeResourceName.charAt(0).toUpperCase()}${safeResourceName.slice(1)}`;
|
|
471
|
+
const getter = instance[getterName];
|
|
472
|
+
let data;
|
|
473
|
+
if (typeof getter === 'function') {
|
|
474
|
+
const allData = await getter.call(instance);
|
|
475
|
+
if (resourceId) {
|
|
476
|
+
// Filter to specific item
|
|
477
|
+
if (Array.isArray(allData)) {
|
|
478
|
+
data = allData.find((item) => item.id === resourceId);
|
|
479
|
+
if (!data) {
|
|
480
|
+
return {
|
|
481
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Resource item not found: ${safeResourceName}/${resourceId}`),
|
|
482
|
+
session: currentSession,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
data = allData;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
data = allData;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
// Try direct property access
|
|
496
|
+
const prop = instance[safeResourceName];
|
|
497
|
+
if (prop !== undefined) {
|
|
498
|
+
data = prop;
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
return {
|
|
502
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.INVALID_PARAMS, `Resource accessor not found: ${safeResourceName}`),
|
|
503
|
+
session: currentSession,
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return {
|
|
508
|
+
response: jsonRpcSuccess(req.id, {
|
|
509
|
+
contents: [
|
|
510
|
+
{
|
|
511
|
+
uri: params.uri,
|
|
512
|
+
mimeType: 'application/json',
|
|
513
|
+
text: JSON.stringify(data),
|
|
514
|
+
},
|
|
515
|
+
],
|
|
516
|
+
}),
|
|
517
|
+
session: currentSession,
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
case 'prompts/list': {
|
|
521
|
+
return {
|
|
522
|
+
response: jsonRpcSuccess(req.id, { prompts: [] }),
|
|
523
|
+
session: currentSession,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
default:
|
|
527
|
+
return {
|
|
528
|
+
response: jsonRpcError(req.id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${req.method}`),
|
|
529
|
+
session: currentSession,
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
// ============================================================================
|
|
534
|
+
// MCP MIXIN FOR DO CLASSES
|
|
535
|
+
// ============================================================================
|
|
536
|
+
/**
|
|
537
|
+
* MCP session storage per DO instance
|
|
538
|
+
*/
|
|
539
|
+
const mcpSessions = new WeakMap();
|
|
540
|
+
/**
|
|
541
|
+
* Get or create session storage for a DO instance
|
|
542
|
+
*/
|
|
543
|
+
function getSessionStorage(instance) {
|
|
544
|
+
let sessions = mcpSessions.get(instance);
|
|
545
|
+
if (!sessions) {
|
|
546
|
+
sessions = new Map();
|
|
547
|
+
mcpSessions.set(instance, sessions);
|
|
548
|
+
}
|
|
549
|
+
return sessions;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Add handleMcp method to a DO instance
|
|
553
|
+
* This is called internally to attach MCP support to DO classes
|
|
554
|
+
*/
|
|
555
|
+
export function attachMcpHandler(instance, DOClass) {
|
|
556
|
+
const handler = createMcpHandler(DOClass);
|
|
557
|
+
const sessions = getSessionStorage(instance);
|
|
558
|
+
instance.handleMcp =
|
|
559
|
+
async function (request) {
|
|
560
|
+
return handler(instance, request, sessions);
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Type guard to check if a DO class has $mcp configuration
|
|
565
|
+
*/
|
|
566
|
+
export function hasMcpConfig(DOClass) {
|
|
567
|
+
return DOClass.$mcp !== undefined && ((DOClass.$mcp.tools !== undefined && Object.keys(DOClass.$mcp.tools).length > 0) ||
|
|
568
|
+
(DOClass.$mcp.resources !== undefined && DOClass.$mcp.resources.length > 0));
|
|
569
|
+
}
|
|
570
|
+
import { buildErrorResponse, } from './shared';
|
|
571
|
+
/**
|
|
572
|
+
* Cache for MCP tools per DO class
|
|
573
|
+
*/
|
|
574
|
+
const mcpToolsCache = new Map();
|
|
575
|
+
/**
|
|
576
|
+
* MCP (Model Context Protocol) Handler implementing TransportHandler interface
|
|
577
|
+
*
|
|
578
|
+
* Provides JSON-RPC 2.0 based MCP support:
|
|
579
|
+
* - Tool discovery and invocation
|
|
580
|
+
* - Resource listing and reading
|
|
581
|
+
* - Session management
|
|
582
|
+
* - SSE streaming for notifications
|
|
583
|
+
*
|
|
584
|
+
* @example
|
|
585
|
+
* ```typescript
|
|
586
|
+
* const mcpHandler = new McpHandler({
|
|
587
|
+
* path: '/mcp',
|
|
588
|
+
* debug: true,
|
|
589
|
+
* })
|
|
590
|
+
*
|
|
591
|
+
* // Use in handler chain (higher priority than REST)
|
|
592
|
+
* chain.use(mcpHandler, 50)
|
|
593
|
+
* ```
|
|
594
|
+
*/
|
|
595
|
+
export class McpHandler {
|
|
596
|
+
name = 'mcp';
|
|
597
|
+
options;
|
|
598
|
+
sessions = new Map();
|
|
599
|
+
handler = null;
|
|
600
|
+
DOClass = null;
|
|
601
|
+
constructor(options = {}) {
|
|
602
|
+
this.options = {
|
|
603
|
+
path: '/mcp',
|
|
604
|
+
...options,
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Check if this handler can process the request
|
|
609
|
+
* MCP handler processes requests to the /mcp endpoint
|
|
610
|
+
*/
|
|
611
|
+
canHandle(request) {
|
|
612
|
+
const url = new URL(request.url);
|
|
613
|
+
const mcpPath = this.options.path || '/mcp';
|
|
614
|
+
// Check if request is to MCP endpoint
|
|
615
|
+
if (url.pathname === mcpPath || url.pathname.startsWith(`${mcpPath}/`)) {
|
|
616
|
+
// MCP handler has higher priority than REST
|
|
617
|
+
return {
|
|
618
|
+
canHandle: true,
|
|
619
|
+
priority: 50,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
return { canHandle: false, reason: 'Path does not match MCP endpoint' };
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Handle the MCP request
|
|
626
|
+
*/
|
|
627
|
+
async handle(request, context) {
|
|
628
|
+
// Initialize handler if needed
|
|
629
|
+
if (!this.handler || this.needsHandlerRefresh(context)) {
|
|
630
|
+
this.initializeHandler(context);
|
|
631
|
+
}
|
|
632
|
+
if (!this.handler) {
|
|
633
|
+
return buildErrorResponse({ message: 'MCP handler not initialized', code: 'HANDLER_NOT_INITIALIZED' }, 500);
|
|
634
|
+
}
|
|
635
|
+
const instance = context.instance;
|
|
636
|
+
return this.handler(instance, request, this.sessions);
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Check if handler needs refresh
|
|
640
|
+
*/
|
|
641
|
+
needsHandlerRefresh(context) {
|
|
642
|
+
if (!this.DOClass)
|
|
643
|
+
return true;
|
|
644
|
+
return this.DOClass !== context.instance.constructor;
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Initialize the MCP handler from context
|
|
648
|
+
*/
|
|
649
|
+
initializeHandler(context) {
|
|
650
|
+
this.DOClass = context.instance.constructor;
|
|
651
|
+
this.handler = createMcpHandler(this.DOClass);
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* Get cached tools for a DO class
|
|
655
|
+
*/
|
|
656
|
+
static getCachedTools(DOClass) {
|
|
657
|
+
if (mcpToolsCache.has(DOClass)) {
|
|
658
|
+
return mcpToolsCache.get(DOClass);
|
|
659
|
+
}
|
|
660
|
+
const tools = getMcpTools(DOClass);
|
|
661
|
+
mcpToolsCache.set(DOClass, tools);
|
|
662
|
+
return tools;
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Clear tools cache
|
|
666
|
+
*/
|
|
667
|
+
static clearCache() {
|
|
668
|
+
mcpToolsCache.clear();
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Get active sessions
|
|
672
|
+
*/
|
|
673
|
+
getSessions() {
|
|
674
|
+
return this.sessions;
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Clear all sessions
|
|
678
|
+
*/
|
|
679
|
+
clearSessions() {
|
|
680
|
+
this.sessions.clear();
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Dispose handler resources
|
|
684
|
+
*/
|
|
685
|
+
dispose() {
|
|
686
|
+
this.sessions.clear();
|
|
687
|
+
this.handler = null;
|
|
688
|
+
this.DOClass = null;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
//# sourceMappingURL=mcp-server.js.map
|