noodleseed-cli 0.1.4
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 +176 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +625 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +52 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +77 -0
- package/dist/config.js.map +1 -0
- package/dist/control-plane.d.ts +33 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +223 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/deploy.d.ts +62 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +182 -0
- package/dist/deploy.js.map +1 -0
- package/dist/dev.d.ts +50 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +223 -0
- package/dist/dev.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/validate.d.ts +37 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +46 -0
- package/dist/validate.js.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/index.d.ts +14 -0
- package/node_modules/@noodle-borg/auth/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/index.js +14 -0
- package/node_modules/@noodle-borg/auth/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts +21 -0
- package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js +24 -0
- package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/metadata.d.ts +27 -0
- package/node_modules/@noodle-borg/auth/dist/metadata.d.ts.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/metadata.js +21 -0
- package/node_modules/@noodle-borg/auth/dist/metadata.js.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/signer.d.ts +45 -0
- package/node_modules/@noodle-borg/auth/dist/signer.d.ts.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/signer.js +47 -0
- package/node_modules/@noodle-borg/auth/dist/signer.js.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/verify.d.ts +42 -0
- package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -0
- package/node_modules/@noodle-borg/auth/dist/verify.js +48 -0
- package/node_modules/@noodle-borg/auth/dist/verify.js.map +1 -0
- package/node_modules/@noodle-borg/auth/package.json +27 -0
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +200 -0
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/authoring/dist/index.js +504 -0
- package/node_modules/@noodle-borg/authoring/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/authoring/package.json +29 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +203 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.js +20 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.d.ts +13 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.js +19 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/in-memory.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/signature.d.ts +11 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/signature.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/signature.js +31 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/signature.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/types.d.ts +43 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/types.js +11 -0
- package/node_modules/@noodle-borg/compiler/dist/catalog/types.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/cli.d.ts +3 -0
- package/node_modules/@noodle-borg/compiler/dist/cli.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/cli.js +19 -0
- package/node_modules/@noodle-borg/compiler/dist/cli.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.d.ts +50 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.js +719 -0
- package/node_modules/@noodle-borg/compiler/dist/compile.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts +27 -0
- package/node_modules/@noodle-borg/compiler/dist/errors.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/errors.js +2 -0
- package/node_modules/@noodle-borg/compiler/dist/errors.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/index.d.ts +13 -0
- package/node_modules/@noodle-borg/compiler/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/index.js +11 -0
- package/node_modules/@noodle-borg/compiler/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/expression.d.ts +136 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/expression.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/expression.js +552 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/expression.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/naming.d.ts +14 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/naming.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/naming.js +18 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/naming.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.d.ts +24 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.js +149 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema-refs.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +97 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +157 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/schema-export.d.ts +6 -0
- package/node_modules/@noodle-borg/compiler/dist/schema-export.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/schema-export.js +28 -0
- package/node_modules/@noodle-borg/compiler/dist/schema-export.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/suggest.d.ts +41 -0
- package/node_modules/@noodle-borg/compiler/dist/suggest.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/suggest.js +105 -0
- package/node_modules/@noodle-borg/compiler/dist/suggest.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/uri-template.d.ts +33 -0
- package/node_modules/@noodle-borg/compiler/dist/uri-template.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compiler/dist/uri-template.js +83 -0
- package/node_modules/@noodle-borg/compiler/dist/uri-template.js.map +1 -0
- package/node_modules/@noodle-borg/compiler/package.json +32 -0
- package/node_modules/@noodle-borg/compute/dist/code-connector.d.ts +45 -0
- package/node_modules/@noodle-borg/compute/dist/code-connector.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compute/dist/code-connector.js +53 -0
- package/node_modules/@noodle-borg/compute/dist/code-connector.js.map +1 -0
- package/node_modules/@noodle-borg/compute/dist/engine.d.ts +73 -0
- package/node_modules/@noodle-borg/compute/dist/engine.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compute/dist/engine.js +31 -0
- package/node_modules/@noodle-borg/compute/dist/engine.js.map +1 -0
- package/node_modules/@noodle-borg/compute/dist/index.d.ts +4 -0
- package/node_modules/@noodle-borg/compute/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compute/dist/index.js +4 -0
- package/node_modules/@noodle-borg/compute/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/compute/dist/quickjs-engine.d.ts +31 -0
- package/node_modules/@noodle-borg/compute/dist/quickjs-engine.d.ts.map +1 -0
- package/node_modules/@noodle-borg/compute/dist/quickjs-engine.js +271 -0
- package/node_modules/@noodle-borg/compute/dist/quickjs-engine.js.map +1 -0
- package/node_modules/@noodle-borg/compute/package.json +29 -0
- package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts +46 -0
- package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/compile.js +289 -0
- package/node_modules/@noodle-borg/connector-defs/dist/compile.js.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts +3 -0
- package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/index.js +3 -0
- package/node_modules/@noodle-borg/connector-defs/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +332 -0
- package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/dist/schema.js +105 -0
- package/node_modules/@noodle-borg/connector-defs/dist/schema.js.map +1 -0
- package/node_modules/@noodle-borg/connector-defs/package.json +32 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +86 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +138 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.js.map +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/index.d.ts +3 -0
- package/node_modules/@noodle-borg/connector-http/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/index.js +3 -0
- package/node_modules/@noodle-borg/connector-http/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/ssrf.d.ts +45 -0
- package/node_modules/@noodle-borg/connector-http/dist/ssrf.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/ssrf.js +57 -0
- package/node_modules/@noodle-borg/connector-http/dist/ssrf.js.map +1 -0
- package/node_modules/@noodle-borg/connector-http/package.json +30 -0
- package/node_modules/@noodle-borg/protocol/dist/adapter.d.ts +73 -0
- package/node_modules/@noodle-borg/protocol/dist/adapter.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/adapter.js +2 -0
- package/node_modules/@noodle-borg/protocol/dist/adapter.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.d.ts +19 -0
- package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.js +34 -0
- package/node_modules/@noodle-borg/protocol/dist/adapters/mcp-2025-11-25.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/index.d.ts +5 -0
- package/node_modules/@noodle-borg/protocol/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/index.js +5 -0
- package/node_modules/@noodle-borg/protocol/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/jsonrpc.d.ts +19 -0
- package/node_modules/@noodle-borg/protocol/dist/jsonrpc.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/jsonrpc.js +14 -0
- package/node_modules/@noodle-borg/protocol/dist/jsonrpc.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts +133 -0
- package/node_modules/@noodle-borg/protocol/dist/mapping.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/mapping.js +181 -0
- package/node_modules/@noodle-borg/protocol/dist/mapping.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/negotiate.d.ts +13 -0
- package/node_modules/@noodle-borg/protocol/dist/negotiate.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/negotiate.js +18 -0
- package/node_modules/@noodle-borg/protocol/dist/negotiate.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/registry.d.ts +17 -0
- package/node_modules/@noodle-borg/protocol/dist/registry.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/registry.js +33 -0
- package/node_modules/@noodle-borg/protocol/dist/registry.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +22 -0
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.js +91 -0
- package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/server.d.ts +38 -0
- package/node_modules/@noodle-borg/protocol/dist/server.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/server.js +89 -0
- package/node_modules/@noodle-borg/protocol/dist/server.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/stateless.d.ts +14 -0
- package/node_modules/@noodle-borg/protocol/dist/stateless.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/stateless.js +28 -0
- package/node_modules/@noodle-borg/protocol/dist/stateless.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.d.ts +24 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js +165 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/bootstrap.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.d.ts +4 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.js +10 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/ext-apps-bundle.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/inject.d.ts +8 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/inject.d.ts.map +1 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/inject.js +36 -0
- package/node_modules/@noodle-borg/protocol/dist/widget/inject.js.map +1 -0
- package/node_modules/@noodle-borg/protocol/package.json +29 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/map.d.ts +29 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/map.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/map.js +38 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/map.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.d.ts +103 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.js +118 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/static.d.ts +12 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/static.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/static.js +15 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/static.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts +28 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/types.js +2 -0
- package/node_modules/@noodle-borg/runtime/dist/broker/types.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.d.ts +29 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.js +37 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/in-memory.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +41 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/types.js +2 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/types.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.d.ts +39 -0
- package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.js +117 -0
- package/node_modules/@noodle-borg/runtime/dist/eval/evaluate.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +47 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.js +297 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts +12 -0
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/index.js +8 -0
- package/node_modules/@noodle-borg/runtime/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.d.ts +10 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.js +13 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/allow-all.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/types.d.ts +25 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/types.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/types.js +2 -0
- package/node_modules/@noodle-borg/runtime/dist/policy/types.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/result.d.ts +19 -0
- package/node_modules/@noodle-borg/runtime/dist/result.d.ts.map +1 -0
- package/node_modules/@noodle-borg/runtime/dist/result.js +2 -0
- package/node_modules/@noodle-borg/runtime/dist/result.js.map +1 -0
- package/node_modules/@noodle-borg/runtime/package.json +27 -0
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +48 -0
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +79 -0
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/index.d.ts +7 -0
- package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/index.js +7 -0
- package/node_modules/@noodle-borg/service/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/main.d.ts +3 -0
- package/node_modules/@noodle-borg/service/dist/main.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/main.js +171 -0
- package/node_modules/@noodle-borg/service/dist/main.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts +14 -0
- package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/app.js +48 -0
- package/node_modules/@noodle-borg/service/dist/oauth/app.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/consent.d.ts +18 -0
- package/node_modules/@noodle-borg/service/dist/oauth/consent.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/consent.js +55 -0
- package/node_modules/@noodle-borg/service/dist/oauth/consent.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/google.d.ts +31 -0
- package/node_modules/@noodle-borg/service/dist/oauth/google.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/google.js +39 -0
- package/node_modules/@noodle-borg/service/dist/oauth/google.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/paths.d.ts +3 -0
- package/node_modules/@noodle-borg/service/dist/oauth/paths.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/paths.js +19 -0
- package/node_modules/@noodle-borg/service/dist/oauth/paths.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts +61 -0
- package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/provider.js +313 -0
- package/node_modules/@noodle-borg/service/dist/oauth/provider.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts +29 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js +176 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store-postgres.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts +85 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store.js +57 -0
- package/node_modules/@noodle-borg/service/dist/oauth/store.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts +8 -0
- package/node_modules/@noodle-borg/service/dist/oauth/tokens.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/tokens.js +13 -0
- package/node_modules/@noodle-borg/service/dist/oauth/tokens.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.d.ts +36 -0
- package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.js +51 -0
- package/node_modules/@noodle-borg/service/dist/secret/kms-master-key.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/service.d.ts +221 -0
- package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/service.js +1163 -0
- package/node_modules/@noodle-borg/service/dist/service.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.d.ts +34 -0
- package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js +38 -0
- package/node_modules/@noodle-borg/service/dist/store/cloudsql-pool.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +56 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres.js +372 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store.d.ts +192 -0
- package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/store.js +230 -0
- package/node_modules/@noodle-borg/service/dist/store.js.map +1 -0
- package/node_modules/@noodle-borg/service/package.json +44 -0
- package/node_modules/@noodle-borg/transport-http/dist/caller-auth.d.ts +15 -0
- package/node_modules/@noodle-borg/transport-http/dist/caller-auth.d.ts.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/caller-auth.js +38 -0
- package/node_modules/@noodle-borg/transport-http/dist/caller-auth.js.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.d.ts +2 -0
- package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.d.ts.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.js +129 -0
- package/node_modules/@noodle-borg/transport-http/dist/examples/serve-demo.js.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/front-door.d.ts +46 -0
- package/node_modules/@noodle-borg/transport-http/dist/front-door.d.ts.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/front-door.js +75 -0
- package/node_modules/@noodle-borg/transport-http/dist/front-door.js.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +142 -0
- package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/handler.js +387 -0
- package/node_modules/@noodle-borg/transport-http/dist/handler.js.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/index.d.ts +6 -0
- package/node_modules/@noodle-borg/transport-http/dist/index.d.ts.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/index.js +6 -0
- package/node_modules/@noodle-borg/transport-http/dist/index.js.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/logging.d.ts +41 -0
- package/node_modules/@noodle-borg/transport-http/dist/logging.d.ts.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/logging.js +71 -0
- package/node_modules/@noodle-borg/transport-http/dist/logging.js.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/serve.d.ts +22 -0
- package/node_modules/@noodle-borg/transport-http/dist/serve.d.ts.map +1 -0
- package/node_modules/@noodle-borg/transport-http/dist/serve.js +25 -0
- package/node_modules/@noodle-borg/transport-http/dist/serve.js.map +1 -0
- package/node_modules/@noodle-borg/transport-http/package.json +30 -0
- package/package.json +78 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { createGuardedAgent, needsGuard } from './ssrf.js';
|
|
2
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
3
|
+
const DEFAULT_MAX_BYTES = 1 << 20;
|
|
4
|
+
/**
|
|
5
|
+
* A real outbound HTTP connector: it calls a backing JSON API and maps the response to the operation's
|
|
6
|
+
* output. Supports authenticated `GET`/`POST` across one or more declared hosts.
|
|
7
|
+
*
|
|
8
|
+
* **Security posture.** It enforces a static origin allowlist (a request can never resolve to an
|
|
9
|
+
* undeclared host), a request timeout, and a best-effort size cap, and it only ever sends the
|
|
10
|
+
* broker-minted credential (never an inbound token, never a manifest secret). For DNS-name hosts it
|
|
11
|
+
* additionally attaches an undici dispatcher that pins the resolved IP and rejects loopback/private/
|
|
12
|
+
* link-local/reserved addresses (incl. cloud metadata `169.254.169.254`), defeating DNS rebinding —
|
|
13
|
+
* the SSRF defenses required by
|
|
14
|
+
* [ADR 0008](../../../docs/decisions/0008-custom-connector-ssrf-dns-pinning.md) /
|
|
15
|
+
* [ADR 0026](../../../docs/decisions/0026-ssrf-egress-hardening-lib.md). Literal-IP hosts are allowed
|
|
16
|
+
* only via the explicit, auditable origin allowlist.
|
|
17
|
+
*/
|
|
18
|
+
export class HttpConnector {
|
|
19
|
+
id;
|
|
20
|
+
version;
|
|
21
|
+
#config;
|
|
22
|
+
#allowed;
|
|
23
|
+
#guardedDispatcher;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.id = config.id;
|
|
26
|
+
this.version = config.version;
|
|
27
|
+
this.#config = config;
|
|
28
|
+
const origins = config.allowedOrigins ?? [config.baseUrl];
|
|
29
|
+
this.#allowed = new Set(origins.map((o) => new URL(o).origin));
|
|
30
|
+
}
|
|
31
|
+
/** Lazily build (and reuse) the SSRF-guarded dispatcher used for DNS-name hosts. */
|
|
32
|
+
#dispatcher() {
|
|
33
|
+
this.#guardedDispatcher ??= createGuardedAgent(this.#config.timeoutMs ?? DEFAULT_TIMEOUT_MS, this.#config.lookup);
|
|
34
|
+
return this.#guardedDispatcher;
|
|
35
|
+
}
|
|
36
|
+
signature(operation) {
|
|
37
|
+
return this.#config.operations[operation]?.signature;
|
|
38
|
+
}
|
|
39
|
+
async invoke(call) {
|
|
40
|
+
const op = this.#config.operations[call.operation];
|
|
41
|
+
if (!op)
|
|
42
|
+
throw new Error(`connector "${this.id}" has no operation "${call.operation}"`);
|
|
43
|
+
const base = op.baseUrl ?? this.#config.baseUrl;
|
|
44
|
+
const url = this.#buildUrl(op, call.args, base);
|
|
45
|
+
// Validate the *resolved* origin (never the declared base) so a path that escapes to another host
|
|
46
|
+
// is still rejected.
|
|
47
|
+
if (!this.#allowed.has(url.origin)) {
|
|
48
|
+
throw new Error(`request resolved to a disallowed origin "${url.origin}"`);
|
|
49
|
+
}
|
|
50
|
+
const method = op.method ?? 'GET';
|
|
51
|
+
const payload = method !== 'GET' && op.body !== undefined ? JSON.stringify(op.body(call.args)) : undefined;
|
|
52
|
+
const headers = {
|
|
53
|
+
accept: 'application/json',
|
|
54
|
+
'user-agent': 'noodle-borg/0.0',
|
|
55
|
+
...this.#config.headers,
|
|
56
|
+
...this.#authHeaders(op, call.credential),
|
|
57
|
+
};
|
|
58
|
+
if (payload !== undefined)
|
|
59
|
+
headers['content-type'] = 'application/json';
|
|
60
|
+
// For DNS-name hosts, route through the SSRF-guarded dispatcher (pins the resolved IP, rejects
|
|
61
|
+
// private/reserved ranges). Literal-IP hosts were already vetted by the origin allowlist above.
|
|
62
|
+
// `dispatcher` is an undici fetch option absent from the global `RequestInit` type, so the cast
|
|
63
|
+
// carries it at runtime without a type clash between undici and @types/node's bundled undici-types.
|
|
64
|
+
const init = {
|
|
65
|
+
method,
|
|
66
|
+
headers,
|
|
67
|
+
...(payload !== undefined ? { body: payload } : {}),
|
|
68
|
+
signal: AbortSignal.timeout(this.#config.timeoutMs ?? DEFAULT_TIMEOUT_MS),
|
|
69
|
+
};
|
|
70
|
+
const response = await fetch(url, needsGuard(url)
|
|
71
|
+
? { ...init, dispatcher: this.#dispatcher() }
|
|
72
|
+
: init);
|
|
73
|
+
if (!response.ok)
|
|
74
|
+
throw new Error(`backend responded ${response.status}`);
|
|
75
|
+
const max = this.#config.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
76
|
+
const declaredLength = Number(response.headers.get('content-length') ?? '0');
|
|
77
|
+
if (declaredLength > max)
|
|
78
|
+
throw new Error('response exceeds the size limit');
|
|
79
|
+
const text = await readTextWithLimit(response, max);
|
|
80
|
+
const json = JSON.parse(text);
|
|
81
|
+
return op.mapResponse ? op.mapResponse(json, call.args) : json;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Resolve auth headers by precedence: operation `auth` → connector `auth` → legacy `authHeader`.
|
|
85
|
+
* The secret only ever lands in a header value here — never a URL, query, log, or error.
|
|
86
|
+
*/
|
|
87
|
+
#authHeaders(op, credential) {
|
|
88
|
+
const scheme = op.auth ?? this.#config.auth;
|
|
89
|
+
if (scheme) {
|
|
90
|
+
if (scheme.kind === 'bearer')
|
|
91
|
+
return { authorization: `Bearer ${credential.token}` };
|
|
92
|
+
return { [scheme.header.toLowerCase()]: credential.token };
|
|
93
|
+
}
|
|
94
|
+
return this.#config.authHeader ? this.#config.authHeader(credential) : {};
|
|
95
|
+
}
|
|
96
|
+
/** Build the request URL: substitute `{name}` path params and append `query` args. */
|
|
97
|
+
#buildUrl(op, args, base) {
|
|
98
|
+
const path = op.path.replace(/\{(\w+)\}/g, (_match, name) => encodeURIComponent(String(args[name])));
|
|
99
|
+
const url = new URL(path, base);
|
|
100
|
+
if (op.query) {
|
|
101
|
+
for (const name of op.query) {
|
|
102
|
+
const value = args[name];
|
|
103
|
+
if (value !== undefined)
|
|
104
|
+
url.searchParams.set(name, String(value));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return url;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function readTextWithLimit(response, max) {
|
|
111
|
+
if (!response.body)
|
|
112
|
+
return '';
|
|
113
|
+
const reader = response.body.getReader();
|
|
114
|
+
const chunks = [];
|
|
115
|
+
let size = 0;
|
|
116
|
+
try {
|
|
117
|
+
while (true) {
|
|
118
|
+
const { done, value } = await reader.read();
|
|
119
|
+
if (done)
|
|
120
|
+
break;
|
|
121
|
+
size += value.byteLength;
|
|
122
|
+
if (size > max)
|
|
123
|
+
throw new Error('response exceeds the size limit');
|
|
124
|
+
chunks.push(value);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
reader.releaseLock();
|
|
129
|
+
}
|
|
130
|
+
const buffer = new Uint8Array(size);
|
|
131
|
+
let offset = 0;
|
|
132
|
+
for (const chunk of chunks) {
|
|
133
|
+
buffer.set(chunk, offset);
|
|
134
|
+
offset += chunk.byteLength;
|
|
135
|
+
}
|
|
136
|
+
return new TextDecoder().decode(buffer);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=http-connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-connector.js","sourceRoot":"","sources":["../src/http-connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,KAAK,SAAS,EACd,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,GAGd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAElB,eAAe,EACf,UAAU,EACV,YAAY,GACb,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Agent } from 'undici';
|
|
2
|
+
/**
|
|
3
|
+
* SSRF egress guard for outbound connector traffic
|
|
4
|
+
* ([ADR 0008](../../../docs/decisions/0008-custom-connector-ssrf-dns-pinning.md),
|
|
5
|
+
* [ADR 0026](../../../docs/decisions/0026-ssrf-egress-hardening-lib.md)).
|
|
6
|
+
*
|
|
7
|
+
* Native `fetch` (undici) exposes no hook to validate the resolved IP before connecting, so we attach a
|
|
8
|
+
* custom undici `Agent` whose DNS `lookup` rejects any address that is not a **public unicast** address.
|
|
9
|
+
* Because the same lookup that validates is the one undici connects to (and TLS SNI stays the original
|
|
10
|
+
* hostname), this defeats DNS rebinding to loopback/private/link-local/reserved ranges — including the
|
|
11
|
+
* cloud-metadata address `169.254.169.254`.
|
|
12
|
+
*
|
|
13
|
+
* Literal-IP hosts are intentionally **not** guarded here: they carry no DNS step (no rebinding window)
|
|
14
|
+
* and are already vetted by the connector's static origin allowlist (ADR 0008 layer 1) — an explicit,
|
|
15
|
+
* auditable operator declaration.
|
|
16
|
+
*
|
|
17
|
+
* NOTE (spec drift vs ADR 0026): the ADR named `request-filtering-agent`, but that ships an
|
|
18
|
+
* `http(s).Agent` which native `fetch`/undici ignores. The fetch-compatible mechanism is an undici
|
|
19
|
+
* `Agent` with a custom `lookup`; `ipaddr.js` still does the address classification. ADR 0026 records
|
|
20
|
+
* this correction.
|
|
21
|
+
*/
|
|
22
|
+
interface ResolvedAddress {
|
|
23
|
+
readonly address: string;
|
|
24
|
+
readonly family: number;
|
|
25
|
+
}
|
|
26
|
+
type LookupCallback = (err: NodeJS.ErrnoException | null, address?: string | readonly ResolvedAddress[], family?: number) => void;
|
|
27
|
+
/** A `dns.lookup`-compatible function (loosened so it is trivially injectable for tests). */
|
|
28
|
+
export type DnsLookup = (hostname: string, options: Record<string, unknown>, callback: LookupCallback) => void;
|
|
29
|
+
/**
|
|
30
|
+
* True for a public unicast address; false for loopback / private / link-local / CGNAT / multicast /
|
|
31
|
+
* reserved / unspecified / broadcast — and for anything unparseable (fail closed). `ipaddr.process`
|
|
32
|
+
* normalizes IPv4-mapped IPv6 (`::ffff:a.b.c.d`) to IPv4 so that bypass is covered.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isPublicUnicast(ip: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Wrap a base resolver so a hostname that resolves **only** to non-public addresses fails closed
|
|
37
|
+
* (anti-rebinding), and any non-public address is filtered out of the result set.
|
|
38
|
+
*/
|
|
39
|
+
export declare function pinnedLookup(base?: DnsLookup): DnsLookup;
|
|
40
|
+
/** An undici `Agent` that pins+validates DNS resolutions for SSRF protection. */
|
|
41
|
+
export declare function createGuardedAgent(connectTimeoutMs: number, base?: DnsLookup): Agent;
|
|
42
|
+
/** Whether a URL needs the guarded dispatcher: DNS-name hosts yes, literal-IP hosts no. */
|
|
43
|
+
export declare function needsGuard(url: URL): boolean;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=ssrf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf.d.ts","sourceRoot":"","sources":["../src/ssrf.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,cAAc,GAAG,CACpB,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EACjC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE,EAC7C,MAAM,CAAC,EAAE,MAAM,KACZ,IAAI,CAAC;AAEV,6FAA6F;AAC7F,MAAM,MAAM,SAAS,GAAG,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,cAAc,KACrB,IAAI,CAAC;AAIV;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,SAAyB,GAAG,SAAS,CAqBvE;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,CAIpF;AAED,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAI5C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { lookup as nodeLookup } from 'node:dns';
|
|
2
|
+
import { isIP } from 'node:net';
|
|
3
|
+
import ipaddr from 'ipaddr.js';
|
|
4
|
+
import { Agent } from 'undici';
|
|
5
|
+
const baseDnsLookup = nodeLookup;
|
|
6
|
+
/**
|
|
7
|
+
* True for a public unicast address; false for loopback / private / link-local / CGNAT / multicast /
|
|
8
|
+
* reserved / unspecified / broadcast — and for anything unparseable (fail closed). `ipaddr.process`
|
|
9
|
+
* normalizes IPv4-mapped IPv6 (`::ffff:a.b.c.d`) to IPv4 so that bypass is covered.
|
|
10
|
+
*/
|
|
11
|
+
export function isPublicUnicast(ip) {
|
|
12
|
+
try {
|
|
13
|
+
return ipaddr.process(ip).range() === 'unicast';
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Wrap a base resolver so a hostname that resolves **only** to non-public addresses fails closed
|
|
21
|
+
* (anti-rebinding), and any non-public address is filtered out of the result set.
|
|
22
|
+
*/
|
|
23
|
+
export function pinnedLookup(base = baseDnsLookup) {
|
|
24
|
+
return (hostname, options, callback) => {
|
|
25
|
+
base(hostname, { ...options, all: true }, (err, addresses) => {
|
|
26
|
+
if (err) {
|
|
27
|
+
callback(err);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const all = Array.isArray(addresses) ? addresses : [];
|
|
31
|
+
const safe = all.filter((a) => isPublicUnicast(a.address));
|
|
32
|
+
const first = safe[0];
|
|
33
|
+
if (first === undefined) {
|
|
34
|
+
callback(new Error(`egress blocked: "${hostname}" resolved only to non-public addresses`));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (options.all === true) {
|
|
38
|
+
callback(null, safe);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
callback(null, first.address, first.family);
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** An undici `Agent` that pins+validates DNS resolutions for SSRF protection. */
|
|
46
|
+
export function createGuardedAgent(connectTimeoutMs, base) {
|
|
47
|
+
const connect = { lookup: pinnedLookup(base), timeout: connectTimeoutMs };
|
|
48
|
+
// undici's `LookupFunction` typing is stricter than our structural `DnsLookup`; the shapes match.
|
|
49
|
+
return new Agent({ connect });
|
|
50
|
+
}
|
|
51
|
+
/** Whether a URL needs the guarded dispatcher: DNS-name hosts yes, literal-IP hosts no. */
|
|
52
|
+
export function needsGuard(url) {
|
|
53
|
+
// `URL.hostname` keeps the brackets on IPv6 literals (e.g. `[::1]`); strip them before classifying.
|
|
54
|
+
const host = url.hostname.replace(/^\[|\]$/g, '');
|
|
55
|
+
return isIP(host) === 0;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ssrf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssrf.js","sourceRoot":"","sources":["../src/ssrf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAyC/B,MAAM,aAAa,GAAG,UAAkC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,SAAS,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAkB,aAAa;IAC1D,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QACrC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;YAC3D,IAAI,GAAG,EAAE,CAAC;gBACR,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,SAAwC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,KAAK,CAAC,oBAAoB,QAAQ,yCAAyC,CAAC,CAAC,CAAC;gBAC3F,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,gBAAwB,EAAE,IAAgB;IAC3E,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC1E,kGAAkG;IAClG,OAAO,IAAI,KAAK,CAAC,EAAE,OAAO,EAA8B,CAAC,CAAC;AAC5D,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,oGAAoG;IACpG,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@noodle-borg/connector-http",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -p tsconfig.json",
|
|
19
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@noodle-borg/compiler": "0.0.0",
|
|
23
|
+
"@noodle-borg/runtime": "0.0.0",
|
|
24
|
+
"ipaddr.js": "^2.4.0",
|
|
25
|
+
"undici": "^6.26.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^24.0.0"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { RuntimeArtifact } from '@noodle-borg/compiler';
|
|
2
|
+
import type { ExecuteDeps } from '@noodle-borg/runtime';
|
|
3
|
+
import type { JsonRpcErrorObject } from './jsonrpc.js';
|
|
4
|
+
/**
|
|
5
|
+
* A protocol adapter translates one MCP protocol version's wire shapes to and from the
|
|
6
|
+
* version-agnostic execution plane. One adapter per supported version; the agreed version is chosen
|
|
7
|
+
* at `initialize` (see negotiate.ts). The execution plane never sees protocol concerns — adapters
|
|
8
|
+
* are pure translation. Version-specific behaviour (capability sets, content blocks, RC-only Apps/
|
|
9
|
+
* Tasks metadata) lives in the adapter, not the core (docs/decisions/0006-protocol-adapter-versioning.md).
|
|
10
|
+
*/
|
|
11
|
+
export interface ProtocolAdapter {
|
|
12
|
+
/** The MCP protocol version this adapter speaks, e.g. `"2025-11-25"`. */
|
|
13
|
+
readonly version: string;
|
|
14
|
+
/** Whether this version is stable or a not-yet-final release candidate. */
|
|
15
|
+
readonly status: 'stable' | 'rc';
|
|
16
|
+
initializeResult(artifact: RuntimeArtifact, params: InitializeParams): InitializeResult;
|
|
17
|
+
listTools(artifact: RuntimeArtifact): ToolsListResult;
|
|
18
|
+
callTool(artifact: RuntimeArtifact, params: ToolsCallParams, deps: ExecuteDeps): Promise<CallToolOutcome>;
|
|
19
|
+
}
|
|
20
|
+
/** A `tools/call` either yields a tool result (possibly `isError`) or a JSON-RPC protocol error. */
|
|
21
|
+
export type CallToolOutcome = {
|
|
22
|
+
readonly result: ToolsCallResult;
|
|
23
|
+
} | {
|
|
24
|
+
readonly error: JsonRpcErrorObject;
|
|
25
|
+
};
|
|
26
|
+
export interface InitializeParams {
|
|
27
|
+
readonly protocolVersion?: string;
|
|
28
|
+
readonly capabilities?: unknown;
|
|
29
|
+
readonly clientInfo?: unknown;
|
|
30
|
+
}
|
|
31
|
+
/** Server capabilities advertised at initialize. Phase 1 advertises only `tools`. */
|
|
32
|
+
export interface ServerCapabilities {
|
|
33
|
+
readonly tools?: {
|
|
34
|
+
readonly listChanged?: boolean;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface ServerInfo {
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly title?: string;
|
|
40
|
+
readonly version: string;
|
|
41
|
+
}
|
|
42
|
+
export interface InitializeResult {
|
|
43
|
+
readonly protocolVersion: string;
|
|
44
|
+
readonly capabilities: ServerCapabilities;
|
|
45
|
+
readonly serverInfo: ServerInfo;
|
|
46
|
+
readonly instructions?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface ToolDescriptor {
|
|
49
|
+
readonly name: string;
|
|
50
|
+
readonly title?: string;
|
|
51
|
+
readonly description: string;
|
|
52
|
+
readonly inputSchema: Record<string, unknown>;
|
|
53
|
+
readonly outputSchema?: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
export interface ToolsListResult {
|
|
56
|
+
readonly tools: readonly ToolDescriptor[];
|
|
57
|
+
readonly nextCursor?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ToolsCallParams {
|
|
60
|
+
readonly name: string;
|
|
61
|
+
readonly arguments?: Record<string, unknown>;
|
|
62
|
+
}
|
|
63
|
+
/** An MCP content block. Phase 1 emits only text blocks. */
|
|
64
|
+
export interface TextContent {
|
|
65
|
+
readonly type: 'text';
|
|
66
|
+
readonly text: string;
|
|
67
|
+
}
|
|
68
|
+
export interface ToolsCallResult {
|
|
69
|
+
readonly content: readonly TextContent[];
|
|
70
|
+
readonly structuredContent?: unknown;
|
|
71
|
+
readonly isError: boolean;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RuntimeArtifact } from '@noodle-borg/compiler';
|
|
2
|
+
import { type ExecuteDeps } from '@noodle-borg/runtime';
|
|
3
|
+
import type { CallToolOutcome, InitializeParams, InitializeResult, ProtocolAdapter, ToolsCallParams, ToolsListResult } from '../adapter.js';
|
|
4
|
+
/** The current stable MCP protocol version. */
|
|
5
|
+
export declare const MCP_2025_11_25 = "2025-11-25";
|
|
6
|
+
/**
|
|
7
|
+
* Adapter for the stable MCP `2025-11-25` protocol version. Implements the core tools surface
|
|
8
|
+
* (`initialize`, `tools/list`, `tools/call`); `resources`/`prompts`/`elicit`/Apps/Tasks are later
|
|
9
|
+
* slices. Wire shapes verified against the official `2025-11-25` specification
|
|
10
|
+
* (docs/references/mcp-source-notes.md).
|
|
11
|
+
*/
|
|
12
|
+
export declare class Mcp20251125Adapter implements ProtocolAdapter {
|
|
13
|
+
readonly version = "2025-11-25";
|
|
14
|
+
readonly status: "stable";
|
|
15
|
+
initializeResult(artifact: RuntimeArtifact, _params: InitializeParams): InitializeResult;
|
|
16
|
+
listTools(artifact: RuntimeArtifact): ToolsListResult;
|
|
17
|
+
callTool(artifact: RuntimeArtifact, params: ToolsCallParams, deps: ExecuteDeps): Promise<CallToolOutcome>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=mcp-2025-11-25.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-2025-11-25.d.ts","sourceRoot":"","sources":["../../src/adapters/mcp-2025-11-25.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAEf,eAAe,EACf,eAAe,EAChB,MAAM,eAAe,CAAC;AAGvB,+CAA+C;AAC/C,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,QAAQ,CAAC,OAAO,gBAAkB;IAClC,QAAQ,CAAC,MAAM,EAAG,QAAQ,CAAU;IAEpC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,GAAG,gBAAgB;IAaxF,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,eAAe;IAI/C,QAAQ,CACZ,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,eAAe,CAAC;CAI5B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { executeTool } from '@noodle-borg/runtime';
|
|
2
|
+
import { mapExecutionError, mapToolOutput, mapToolsList } from '../mapping.js';
|
|
3
|
+
/** The current stable MCP protocol version. */
|
|
4
|
+
export const MCP_2025_11_25 = '2025-11-25';
|
|
5
|
+
/**
|
|
6
|
+
* Adapter for the stable MCP `2025-11-25` protocol version. Implements the core tools surface
|
|
7
|
+
* (`initialize`, `tools/list`, `tools/call`); `resources`/`prompts`/`elicit`/Apps/Tasks are later
|
|
8
|
+
* slices. Wire shapes verified against the official `2025-11-25` specification
|
|
9
|
+
* (docs/references/mcp-source-notes.md).
|
|
10
|
+
*/
|
|
11
|
+
export class Mcp20251125Adapter {
|
|
12
|
+
version = MCP_2025_11_25;
|
|
13
|
+
status = 'stable';
|
|
14
|
+
initializeResult(artifact, _params) {
|
|
15
|
+
const serverInfo = {
|
|
16
|
+
name: artifact.server.name,
|
|
17
|
+
title: artifact.server.title,
|
|
18
|
+
version: artifact.server.version,
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
protocolVersion: this.version,
|
|
22
|
+
capabilities: { tools: { listChanged: false } },
|
|
23
|
+
serverInfo,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
listTools(artifact) {
|
|
27
|
+
return mapToolsList(artifact);
|
|
28
|
+
}
|
|
29
|
+
async callTool(artifact, params, deps) {
|
|
30
|
+
const result = await executeTool(artifact, params.name, params.arguments ?? {}, deps);
|
|
31
|
+
return result.ok ? { result: mapToolOutput(result.output) } : mapExecutionError(result.error);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=mcp-2025-11-25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-2025-11-25.js","sourceRoot":"","sources":["../../src/adapters/mcp-2025-11-25.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUrE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACpB,OAAO,GAAG,cAAc,CAAC;IACzB,MAAM,GAAG,QAAiB,CAAC;IAEpC,gBAAgB,CAAC,QAAyB,EAAE,OAAyB;QACnE,MAAM,UAAU,GAAe;YAC7B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI;YAC1B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK;YAC5B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO;SACjC,CAAC;QACF,OAAO;YACL,eAAe,EAAE,IAAI,CAAC,OAAO;YAC7B,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;YAC/C,UAAU;SACX,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAAyB;QACjC,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAyB,EACzB,MAAuB,EACvB,IAAiB;QAEjB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChG,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { JSON_RPC, type JsonRpcErrorObject } from './jsonrpc.js';
|
|
2
|
+
export { type CallToolOutcome, type GetPromptResult, mapExecutionError, mapPromptMessages, mapPromptsList, mapResourceContents, mapResourcesList, mapResourceTemplatesList, mapTool, mapToolOutput, mapToolsList, type PromptMessage, type ReadResourceResult, type ResourceContent, type TextContent, type ToolDescriptor, type ToolsCallResult, type ToolsListResult, } from './mapping.js';
|
|
3
|
+
export { buildMcpServer, type ServedArtifact } from './sdk-server.js';
|
|
4
|
+
export { handleStatelessHttp } from './stateless.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { JSON_RPC } from './jsonrpc.js';
|
|
2
|
+
export { mapExecutionError, mapPromptMessages, mapPromptsList, mapResourceContents, mapResourcesList, mapResourceTemplatesList, mapTool, mapToolOutput, mapToolsList, } from './mapping.js';
|
|
3
|
+
export { buildMcpServer } from './sdk-server.js';
|
|
4
|
+
export { handleStatelessHttp } from './stateless.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA2B,MAAM,cAAc,CAAC;AACjE,OAAO,EAGL,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,OAAO,EACP,aAAa,EACb,YAAY,GAQb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAuB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard JSON-RPC 2.0 error codes. The official `@modelcontextprotocol/sdk` owns the wire envelope;
|
|
3
|
+
* these constants remain for the two SDK-agnostic users: the artifact→wire {@link mapping} (which picks
|
|
4
|
+
* the channel for an execution error) and the HTTP front-door (which emits transport-level errors
|
|
5
|
+
* before a request ever reaches the SDK).
|
|
6
|
+
*/
|
|
7
|
+
export declare const JSON_RPC: {
|
|
8
|
+
readonly PARSE_ERROR: -32700;
|
|
9
|
+
readonly INVALID_REQUEST: -32600;
|
|
10
|
+
readonly METHOD_NOT_FOUND: -32601;
|
|
11
|
+
readonly INVALID_PARAMS: -32602;
|
|
12
|
+
readonly INTERNAL_ERROR: -32603;
|
|
13
|
+
};
|
|
14
|
+
export interface JsonRpcErrorObject {
|
|
15
|
+
readonly code: number;
|
|
16
|
+
readonly message: string;
|
|
17
|
+
readonly data?: unknown;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=jsonrpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../src/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard JSON-RPC 2.0 error codes. The official `@modelcontextprotocol/sdk` owns the wire envelope;
|
|
3
|
+
* these constants remain for the two SDK-agnostic users: the artifact→wire {@link mapping} (which picks
|
|
4
|
+
* the channel for an execution error) and the HTTP front-door (which emits transport-level errors
|
|
5
|
+
* before a request ever reaches the SDK).
|
|
6
|
+
*/
|
|
7
|
+
export const JSON_RPC = {
|
|
8
|
+
PARSE_ERROR: -32700,
|
|
9
|
+
INVALID_REQUEST: -32600,
|
|
10
|
+
METHOD_NOT_FOUND: -32601,
|
|
11
|
+
INVALID_PARAMS: -32602,
|
|
12
|
+
INTERNAL_ERROR: -32603,
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=jsonrpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../src/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,WAAW,EAAE,CAAC,KAAK;IACnB,eAAe,EAAE,CAAC,KAAK;IACvB,gBAAgB,EAAE,CAAC,KAAK;IACxB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;CACd,CAAC"}
|