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,21 @@
|
|
|
1
|
+
import type { SigningKeyProvider } from './signer.js';
|
|
2
|
+
export interface AccessTokenClaims {
|
|
3
|
+
/** Token issuer — the Noodle self-hosted authorization server (`NOODLE_OAUTH_ISSUER`). */
|
|
4
|
+
readonly issuer: string;
|
|
5
|
+
/** Subject — the Google subject of the authenticated owner. */
|
|
6
|
+
readonly subject: string;
|
|
7
|
+
/** Audience — the canonical tenant MCP URL the token is bound to (RFC 8707). */
|
|
8
|
+
readonly audience: string;
|
|
9
|
+
/** End-user email, when available. */
|
|
10
|
+
readonly email?: string;
|
|
11
|
+
/** Space-delimited scopes, when any. */
|
|
12
|
+
readonly scope?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Mint a short-lived RS256 access token for the owner-only data plane (OA-2, [ADR 0042]). This is exactly the
|
|
16
|
+
* token the OA-1 resource-server verifier (`createJwtVerifier`) validates: `iss` = the Noodle AS, `aud` = the
|
|
17
|
+
* canonical tenant MCP URL (RFC 8707 resource binding), `sub` = the Google subject. The raw token is opaque to
|
|
18
|
+
* the MCP client; only the resource server reads it, and the raw value dies at the verifier ([ADR 0005]).
|
|
19
|
+
*/
|
|
20
|
+
export declare function mintAccessToken(provider: SigningKeyProvider, claims: AccessTokenClaims, ttlSeconds: number): Promise<string>;
|
|
21
|
+
//# sourceMappingURL=jwt-issuer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-issuer.d.ts","sourceRoot":"","sources":["../src/jwt-issuer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAcjB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { SignJWT } from 'jose';
|
|
3
|
+
/**
|
|
4
|
+
* Mint a short-lived RS256 access token for the owner-only data plane (OA-2, [ADR 0042]). This is exactly the
|
|
5
|
+
* token the OA-1 resource-server verifier (`createJwtVerifier`) validates: `iss` = the Noodle AS, `aud` = the
|
|
6
|
+
* canonical tenant MCP URL (RFC 8707 resource binding), `sub` = the Google subject. The raw token is opaque to
|
|
7
|
+
* the MCP client; only the resource server reads it, and the raw value dies at the verifier ([ADR 0005]).
|
|
8
|
+
*/
|
|
9
|
+
export async function mintAccessToken(provider, claims, ttlSeconds) {
|
|
10
|
+
const key = await provider.signingKey();
|
|
11
|
+
const jwt = new SignJWT({
|
|
12
|
+
...(claims.email !== undefined ? { email: claims.email } : {}),
|
|
13
|
+
...(claims.scope !== undefined ? { scope: claims.scope } : {}),
|
|
14
|
+
})
|
|
15
|
+
.setProtectedHeader({ alg: key.alg, kid: key.kid, typ: 'at+jwt' })
|
|
16
|
+
.setIssuer(claims.issuer)
|
|
17
|
+
.setSubject(claims.subject)
|
|
18
|
+
.setAudience(claims.audience)
|
|
19
|
+
.setIssuedAt()
|
|
20
|
+
.setJti(randomUUID())
|
|
21
|
+
.setExpirationTime(`${ttlSeconds}s`);
|
|
22
|
+
return jwt.sign(key.privateKey);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=jwt-issuer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-issuer.js","sourceRoot":"","sources":["../src/jwt-issuer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAgB/B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA4B,EAC5B,MAAyB,EACzB,UAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC;QACtB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;SACC,kBAAkB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;SACjE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;SACxB,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;SAC1B,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC5B,WAAW,EAAE;SACb,MAAM,CAAC,UAAU,EAAE,CAAC;SACpB,iBAAiB,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Protected Resource Metadata (RFC 9728), the document an MCP client fetches after a `401` to
|
|
3
|
+
* discover which authorization server(s) protect a resource. The shape mirrors the MCP authorization spec
|
|
4
|
+
* (`2025-11-25`) and the official SDK's `OAuthProtectedResourceMetadata`; re-verify against the live spec
|
|
5
|
+
* before relying on optional fields (see `docs/references/mcp-source-notes.md`).
|
|
6
|
+
*/
|
|
7
|
+
export interface ProtectedResourceMetadata {
|
|
8
|
+
/** Canonical resource identifier — the tenant MCP endpoint URL the token must be audience-bound to. */
|
|
9
|
+
readonly resource: string;
|
|
10
|
+
/** Authorization servers that can issue tokens for this resource (the Noodle self-hosted AS, OA-2). */
|
|
11
|
+
readonly authorization_servers?: readonly string[];
|
|
12
|
+
/** How the bearer token may be presented. Noodle accepts the `Authorization` header only. */
|
|
13
|
+
readonly bearer_methods_supported?: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
/** Build the protected-resource-metadata document for one resource. */
|
|
16
|
+
export declare function protectedResourceMetadata(input: {
|
|
17
|
+
readonly resource: string;
|
|
18
|
+
readonly authorizationServers?: readonly string[];
|
|
19
|
+
}): ProtectedResourceMetadata;
|
|
20
|
+
/**
|
|
21
|
+
* Construct the RFC 9728 protected-resource-metadata URL for a resource URL: the well-known prefix is
|
|
22
|
+
* inserted **before** the resource path (e.g. `https://h/o/a/b/mcp` →
|
|
23
|
+
* `https://h/.well-known/oauth-protected-resource/o/a/b/mcp`). Mirrors the MCP SDK's
|
|
24
|
+
* `getOAuthProtectedResourceMetadataUrl`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function protectedResourceMetadataUrl(resource: string | URL): string;
|
|
27
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,uGAAuG;IACvG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnD,6FAA6F;IAC7F,QAAQ,CAAC,wBAAwB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvD;AAED,uEAAuE;AACvE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnD,GAAG,yBAAyB,CAQ5B;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,MAAM,CAG3E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Build the protected-resource-metadata document for one resource. */
|
|
2
|
+
export function protectedResourceMetadata(input) {
|
|
3
|
+
return {
|
|
4
|
+
resource: input.resource,
|
|
5
|
+
...(input.authorizationServers && input.authorizationServers.length > 0
|
|
6
|
+
? { authorization_servers: input.authorizationServers }
|
|
7
|
+
: {}),
|
|
8
|
+
bearer_methods_supported: ['header'],
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Construct the RFC 9728 protected-resource-metadata URL for a resource URL: the well-known prefix is
|
|
13
|
+
* inserted **before** the resource path (e.g. `https://h/o/a/b/mcp` →
|
|
14
|
+
* `https://h/.well-known/oauth-protected-resource/o/a/b/mcp`). Mirrors the MCP SDK's
|
|
15
|
+
* `getOAuthProtectedResourceMetadataUrl`.
|
|
16
|
+
*/
|
|
17
|
+
export function protectedResourceMetadataUrl(resource) {
|
|
18
|
+
const url = new URL(resource);
|
|
19
|
+
return `${url.origin}/.well-known/oauth-protected-resource${url.pathname}`;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAeA,uEAAuE;AACvE,MAAM,UAAU,yBAAyB,CAAC,KAGzC;IACC,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC;YACrE,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,CAAC,oBAAoB,EAAE;YACvD,CAAC,CAAC,EAAE,CAAC;QACP,wBAAwB,EAAE,CAAC,QAAQ,CAAC;KACrC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAsB;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,OAAO,GAAG,GAAG,CAAC,MAAM,wCAAwC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { JSONWebKeySet, JWTVerifyGetKey } from 'jose';
|
|
2
|
+
import { importPKCS8 } from 'jose';
|
|
3
|
+
/** The key type jose accepts for signing (CryptoKey/KeyObject), referenced without the DOM `CryptoKey` global. */
|
|
4
|
+
type SigningCryptoKey = Awaited<ReturnType<typeof importPKCS8>>;
|
|
5
|
+
/**
|
|
6
|
+
* Signing-key custody for the self-hosted authorization server (OA-2, [ADR 0042]). The provider owns the
|
|
7
|
+
* private key used to sign access tokens and publishes the matching public key as a JWKS (read by the OA-1
|
|
8
|
+
* resource-server verifier via its `jwksUri`, or in-process via {@link verifierKey}).
|
|
9
|
+
*
|
|
10
|
+
* Two implementations are anticipated: a **static** RS256 key for alpha (this file) and a **KMS-wrapped**
|
|
11
|
+
* key as a fast-follow (mirroring [ADR 0037]) — the private key would then never leave KMS. The interface is
|
|
12
|
+
* async on purpose so the KMS variant slots in behind it unchanged.
|
|
13
|
+
*/
|
|
14
|
+
export interface SigningKey {
|
|
15
|
+
/** JWS algorithm (RS256 for alpha). */
|
|
16
|
+
readonly alg: string;
|
|
17
|
+
/** Stable key id (JWK thumbprint) — set in the token header and the published JWK. */
|
|
18
|
+
readonly kid: string;
|
|
19
|
+
/** The private signing key. */
|
|
20
|
+
readonly privateKey: SigningCryptoKey;
|
|
21
|
+
}
|
|
22
|
+
export interface SigningKeyProvider {
|
|
23
|
+
/** The active signing key (custody owns the private material). */
|
|
24
|
+
signingKey(): Promise<SigningKey>;
|
|
25
|
+
/** The public JWK Set served at the JWKS endpoint and consumed by the resource-server verifier. */
|
|
26
|
+
publicJwks(): Promise<JSONWebKeySet>;
|
|
27
|
+
/** A local verify resolver over the public key(s) — no HTTP fetch (tests + same-process verification). */
|
|
28
|
+
verifierKey(): Promise<JWTVerifyGetKey>;
|
|
29
|
+
}
|
|
30
|
+
export interface StaticSigningKeyOptions {
|
|
31
|
+
/**
|
|
32
|
+
* A PKCS#8 PEM-encoded RSA private key (e.g. from `NOODLE_OAUTH_SIGNING_KEY`). When omitted, a fresh
|
|
33
|
+
* keypair is generated at construction — convenient for dev/tests, but the key is lost on restart, so
|
|
34
|
+
* production must supply one.
|
|
35
|
+
*/
|
|
36
|
+
readonly privateKeyPem?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A {@link SigningKeyProvider} backed by a single static RS256 key. With `privateKeyPem` the key is imported
|
|
40
|
+
* (extractable, so the public JWK can be derived); otherwise one is generated. The public JWK is stripped to
|
|
41
|
+
* its public members only — private fields never reach {@link publicJwks}.
|
|
42
|
+
*/
|
|
43
|
+
export declare function createStaticSigningKeyProvider(options?: StaticSigningKeyOptions): Promise<SigningKeyProvider>;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAO,eAAe,EAAE,MAAM,MAAM,CAAC;AAChE,OAAO,EAKL,WAAW,EACZ,MAAM,MAAM,CAAC;AAEd,kHAAkH;AAClH,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,mGAAmG;IACnG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,0GAA0G;IAC1G,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACzC;AAID,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAkB7B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { calculateJwkThumbprint, createLocalJWKSet, exportJWK, generateKeyPair, importPKCS8, } from 'jose';
|
|
2
|
+
const RS256 = 'RS256';
|
|
3
|
+
/**
|
|
4
|
+
* A {@link SigningKeyProvider} backed by a single static RS256 key. With `privateKeyPem` the key is imported
|
|
5
|
+
* (extractable, so the public JWK can be derived); otherwise one is generated. The public JWK is stripped to
|
|
6
|
+
* its public members only — private fields never reach {@link publicJwks}.
|
|
7
|
+
*/
|
|
8
|
+
export async function createStaticSigningKeyProvider(options = {}) {
|
|
9
|
+
const privateKey = options.privateKeyPem
|
|
10
|
+
? await importPKCS8(options.privateKeyPem, RS256, { extractable: true })
|
|
11
|
+
: (await generateKeyPair(RS256, { extractable: true })).privateKey;
|
|
12
|
+
// Derive the public JWK from the private key, keeping only public members (never publish d/p/q/...).
|
|
13
|
+
const publicJwk = toPublicJwk(await exportJWK(privateKey));
|
|
14
|
+
const kid = await calculateJwkThumbprint(publicJwk);
|
|
15
|
+
const publishedJwk = { ...publicJwk, kid, alg: RS256, use: 'sig' };
|
|
16
|
+
const jwks = { keys: [publishedJwk] };
|
|
17
|
+
const resolver = createLocalJWKSet(jwks);
|
|
18
|
+
const key = { alg: RS256, kid, privateKey };
|
|
19
|
+
return {
|
|
20
|
+
signingKey: () => Promise.resolve(key),
|
|
21
|
+
publicJwks: () => Promise.resolve(jwks),
|
|
22
|
+
verifierKey: () => Promise.resolve(resolver),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Keep only the public members of a JWK by key type — strips RSA `d/p/q/...` and EC/OKP private `d`. */
|
|
26
|
+
function toPublicJwk(jwk) {
|
|
27
|
+
switch (jwk.kty) {
|
|
28
|
+
case 'RSA':
|
|
29
|
+
return pick(jwk, ['kty', 'n', 'e']);
|
|
30
|
+
case 'EC':
|
|
31
|
+
return pick(jwk, ['kty', 'crv', 'x', 'y']);
|
|
32
|
+
case 'OKP':
|
|
33
|
+
return pick(jwk, ['kty', 'crv', 'x']);
|
|
34
|
+
default:
|
|
35
|
+
throw new Error(`unsupported signing key type: ${String(jwk.kty)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function pick(jwk, keys) {
|
|
39
|
+
const out = {};
|
|
40
|
+
for (const key of keys) {
|
|
41
|
+
const value = jwk[key];
|
|
42
|
+
if (value !== undefined)
|
|
43
|
+
out[key] = value;
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,WAAW,GACZ,MAAM,MAAM,CAAC;AAgCd,MAAM,KAAK,GAAG,OAAO,CAAC;AAWtB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa;QACtC,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IAErE,qGAAqG;IACrG,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,YAAY,GAAQ,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxE,MAAM,IAAI,GAAkB,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,GAAG,GAAe,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IAExD,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QACtC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACvC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,yGAAyG;AACzG,SAAS,WAAW,CAAC,GAAQ;IAC3B,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACtC,KAAK,IAAI;YACP,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC;YACE,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,GAAQ,EAAE,IAA4B;IAClD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5C,CAAC;IACD,OAAO,GAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { JWTVerifyGetKey } from 'jose';
|
|
2
|
+
/**
|
|
3
|
+
* A verified end-user identity, derived from a validated access token. This is **claims only** — the raw
|
|
4
|
+
* bearer token dies at the verifier and never crosses into execution (ADR 0005 / 0018). It is the minimum
|
|
5
|
+
* the data plane needs to make an owner-only authorization decision.
|
|
6
|
+
*/
|
|
7
|
+
export interface VerifiedIdentity {
|
|
8
|
+
/** Stable subject identifier (the upstream Google subject, threaded through the Noodle AS). */
|
|
9
|
+
readonly subject: string;
|
|
10
|
+
/** OAuth scopes carried by the token (empty when none). */
|
|
11
|
+
readonly scopes: readonly string[];
|
|
12
|
+
/** The token's audience (RFC 8707 resource binding), when present. */
|
|
13
|
+
readonly audience?: string;
|
|
14
|
+
/** The end-user email, when the token carries one. */
|
|
15
|
+
readonly email?: string;
|
|
16
|
+
/** Expiry in seconds since the epoch, when present. */
|
|
17
|
+
readonly expiresAt?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface JwtVerifierConfig {
|
|
20
|
+
/** Expected token issuer — the Noodle self-hosted authorization server (OA-2). */
|
|
21
|
+
readonly issuer: string;
|
|
22
|
+
/** JWKS endpoint of the issuer (signature keys). Required unless {@link keyResolver} is supplied. */
|
|
23
|
+
readonly jwksUri?: string;
|
|
24
|
+
/**
|
|
25
|
+
* A pre-resolved JWK key resolver, used instead of fetching {@link jwksUri}. This is the seam tests and
|
|
26
|
+
* a future static/KMS signer use to validate without a live JWKS endpoint.
|
|
27
|
+
*/
|
|
28
|
+
readonly keyResolver?: JWTVerifyGetKey;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Verify an access token and return its identity, or `null` if the token is missing/invalid/expired. When a
|
|
32
|
+
* `resource` is supplied, the token's `aud` MUST equal it (RFC 8707 resource binding) — this is how the data
|
|
33
|
+
* plane binds a token to the specific tenant MCP endpoint it was issued for.
|
|
34
|
+
*/
|
|
35
|
+
export type TokenVerifier = (token: string, resource?: string) => Promise<VerifiedIdentity | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Build a {@link TokenVerifier} backed by `jose` (ADR 0023). Validates the signature (via JWKS or an injected
|
|
38
|
+
* resolver), the issuer, expiry, and — when a `resource` is given at call time — the audience. Any failure
|
|
39
|
+
* resolves to `null`; the verifier never throws, so a bad token is a clean `401`, not a `500`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createJwtVerifier(config: JwtVerifierConfig): TokenVerifier;
|
|
42
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,MAAM,CAAC;AAGxD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qGAAqG;IACrG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;AAEnG;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,aAAa,CAc1E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createRemoteJWKSet, jwtVerify } from 'jose';
|
|
2
|
+
/**
|
|
3
|
+
* Build a {@link TokenVerifier} backed by `jose` (ADR 0023). Validates the signature (via JWKS or an injected
|
|
4
|
+
* resolver), the issuer, expiry, and — when a `resource` is given at call time — the audience. Any failure
|
|
5
|
+
* resolves to `null`; the verifier never throws, so a bad token is a clean `401`, not a `500`.
|
|
6
|
+
*/
|
|
7
|
+
export function createJwtVerifier(config) {
|
|
8
|
+
const getKey = config.keyResolver ?? createRemoteJWKSet(new URL(requireJwksUri(config)));
|
|
9
|
+
return async (token, resource) => {
|
|
10
|
+
try {
|
|
11
|
+
const { payload } = await jwtVerify(token, getKey, {
|
|
12
|
+
issuer: config.issuer,
|
|
13
|
+
...(resource !== undefined ? { audience: resource } : {}),
|
|
14
|
+
});
|
|
15
|
+
return toIdentity(payload);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function requireJwksUri(config) {
|
|
23
|
+
if (config.jwksUri === undefined || config.jwksUri === '') {
|
|
24
|
+
throw new Error('createJwtVerifier requires either a jwksUri or a keyResolver');
|
|
25
|
+
}
|
|
26
|
+
return config.jwksUri;
|
|
27
|
+
}
|
|
28
|
+
function toIdentity(payload) {
|
|
29
|
+
if (typeof payload.sub !== 'string' || payload.sub.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
const aud = Array.isArray(payload.aud) ? payload.aud[0] : payload.aud;
|
|
32
|
+
return {
|
|
33
|
+
subject: payload.sub,
|
|
34
|
+
scopes: parseScopes(payload),
|
|
35
|
+
...(typeof aud === 'string' ? { audience: aud } : {}),
|
|
36
|
+
...(typeof payload.email === 'string' ? { email: payload.email } : {}),
|
|
37
|
+
...(typeof payload.exp === 'number' ? { expiresAt: payload.exp } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function parseScopes(payload) {
|
|
41
|
+
const raw = payload.scope ?? payload.scopes;
|
|
42
|
+
if (typeof raw === 'string')
|
|
43
|
+
return raw.split(' ').filter((s) => s.length > 0);
|
|
44
|
+
if (Array.isArray(raw))
|
|
45
|
+
return raw.filter((s) => typeof s === 'string');
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAuCrD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,MAAM,GACV,MAAM,CAAC,WAAW,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE;gBACjD,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAyB;IAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,OAAmB;IACrC,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACtE,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG;QACpB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;QAC5B,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAmB;IACtC,MAAM,GAAG,GACN,OAAmC,CAAC,KAAK,IAAK,OAAmC,CAAC,MAAM,CAAC;IAC5F,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACrF,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@noodle-borg/auth",
|
|
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
|
+
"jose": "^6.2.3"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^24.0.0"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import type { Manifest, OperationField, OperationSignature } from '@noodle-borg/compiler';
|
|
2
|
+
import { type ConnectorFile, type HttpConnectorDef } from '@noodle-borg/connector-defs';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export type { ConnectorFile, HttpConnectorDef };
|
|
5
|
+
export { z };
|
|
6
|
+
/**
|
|
7
|
+
* Options for `ConnectorBuilder.http(...)` — an HTTP connector's transport, auth, and operations. `id`
|
|
8
|
+
* and `version` come from `connector(id).version(v)`; `kind` defaults to `custom`. The shape is derived
|
|
9
|
+
* from the canonical `HttpConnectorDef`, so it stays in lockstep with `@noodle-borg/connector-defs`.
|
|
10
|
+
*/
|
|
11
|
+
export type HttpConnectorOptions = HttpConnectorDef['http'] & Pick<HttpConnectorDef, 'operations'>;
|
|
12
|
+
type JsonSchema = Record<string, unknown>;
|
|
13
|
+
export interface ServerOptions {
|
|
14
|
+
readonly title: string;
|
|
15
|
+
readonly version: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ToolOptions {
|
|
18
|
+
readonly description: string;
|
|
19
|
+
readonly input: JsonSchema | z.ZodType;
|
|
20
|
+
readonly output?: JsonSchema | z.ZodType;
|
|
21
|
+
/**
|
|
22
|
+
* Tool-surface visibility (SEP-1865 `_meta.ui.visibility`). Default `['model', 'app']`. Set `['app']`
|
|
23
|
+
* for a **UI-only helper** — hidden from `tools/list` (the model never sees it) but still callable from
|
|
24
|
+
* a widget via `callServerTool`. A model-surface concern, not authorization.
|
|
25
|
+
*/
|
|
26
|
+
readonly visibility?: ('model' | 'app')[];
|
|
27
|
+
readonly fulfil: (ctx: ToolContext) => unknown | Promise<unknown>;
|
|
28
|
+
}
|
|
29
|
+
export interface ToolContext {
|
|
30
|
+
readonly input: SymbolicScope;
|
|
31
|
+
readonly connectors: Record<string, ConnectorClient>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The `fulfil` context for a resource or prompt. `args` is the input scope — a templated resource's
|
|
35
|
+
* extracted URI variables, or a prompt's supplied arguments — and `connectors` are the `.use()`
|
|
36
|
+
* connectors. The return value (a string, a symbolic ref, or a structure) becomes the content/messages.
|
|
37
|
+
*/
|
|
38
|
+
export interface ResourceContext {
|
|
39
|
+
readonly args: SymbolicScope;
|
|
40
|
+
readonly connectors: Record<string, ConnectorClient>;
|
|
41
|
+
}
|
|
42
|
+
export interface ResourceOptions {
|
|
43
|
+
/** A fixed URI (`docs://changelog`) or a simple `{var}` URI template (`tickets://{id}`). */
|
|
44
|
+
readonly uri: string;
|
|
45
|
+
readonly title?: string;
|
|
46
|
+
readonly description?: string;
|
|
47
|
+
readonly mimeType?: string;
|
|
48
|
+
readonly fulfil: (ctx: ResourceContext) => unknown | Promise<unknown>;
|
|
49
|
+
}
|
|
50
|
+
/** A prompt argument descriptor when not derived from a Zod object. */
|
|
51
|
+
export interface PromptArgument {
|
|
52
|
+
readonly name: string;
|
|
53
|
+
readonly description?: string;
|
|
54
|
+
readonly required?: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface PromptOptions {
|
|
57
|
+
readonly title?: string;
|
|
58
|
+
readonly description?: string;
|
|
59
|
+
/** Either a Zod object (descriptors derived from its shape) or an explicit descriptor list. */
|
|
60
|
+
readonly arguments?: z.ZodType | readonly PromptArgument[];
|
|
61
|
+
readonly fulfil: (ctx: ResourceContext) => unknown | Promise<unknown>;
|
|
62
|
+
}
|
|
63
|
+
/** Host-enforced CSP capability metadata for a widget (mirrors the manifest `widgets[].csp` block). */
|
|
64
|
+
export interface WidgetCsp {
|
|
65
|
+
readonly connectDomains?: string[];
|
|
66
|
+
readonly resourceDomains?: string[];
|
|
67
|
+
readonly frameDomains?: string[];
|
|
68
|
+
readonly baseUriDomains?: string[];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* An MCP Apps widget: a `ui://` UI resource (the self-contained `html` body) linked to `tool` via
|
|
72
|
+
* `_meta.ui.resourceUri`. The compiler emits the resource + the tool link ([ADR 0022]). `html` is the
|
|
73
|
+
* raw-`text/html` escape hatch (a declarative `screen` surface is a later slice); `csp`/`permissions`
|
|
74
|
+
* are host-enforced capability metadata. Secrets/tokens never reach widget HTML.
|
|
75
|
+
*/
|
|
76
|
+
export interface WidgetOptions {
|
|
77
|
+
readonly tool: string;
|
|
78
|
+
readonly html: string;
|
|
79
|
+
readonly title?: string;
|
|
80
|
+
readonly description?: string;
|
|
81
|
+
readonly csp?: WidgetCsp;
|
|
82
|
+
readonly permissions?: Record<string, boolean>;
|
|
83
|
+
}
|
|
84
|
+
export type SymbolicScope = Ref & Record<string, Ref>;
|
|
85
|
+
export type ConnectorClient = Record<string, (args?: Readonly<Record<string, unknown>>) => Ref>;
|
|
86
|
+
export interface ConnectorOperationOptions {
|
|
87
|
+
readonly type: OperationSignature['type'];
|
|
88
|
+
readonly input?: Readonly<Record<string, OperationField>>;
|
|
89
|
+
readonly output?: Readonly<Record<string, OperationField>>;
|
|
90
|
+
}
|
|
91
|
+
/** Optional resource bounds for a sandboxed compute operation. */
|
|
92
|
+
export interface ComputeLimits {
|
|
93
|
+
readonly timeoutMs?: number;
|
|
94
|
+
readonly memoryBytes?: number;
|
|
95
|
+
readonly maxOutputBytes?: number;
|
|
96
|
+
readonly maxHostCalls?: number;
|
|
97
|
+
}
|
|
98
|
+
export interface ComputeHost {
|
|
99
|
+
callOperation(name: string, args: Readonly<Record<string, unknown>>): unknown;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A sandboxed-compute operation authored in TypeScript. `run` is your actual function — it is serialized
|
|
103
|
+
* to source (via `Function.prototype.toString`) and shipped as the connector's `code`, then executed in a
|
|
104
|
+
* WASM/QuickJS sandbox with no ambient authority. It must be **self-contained** (no references to
|
|
105
|
+
* surrounding scope, imports, `fetch`, `process`, etc.). When it needs backing systems, declare `calls`
|
|
106
|
+
* and use the sandbox `callOperation` capability rather than ambient network access.
|
|
107
|
+
*/
|
|
108
|
+
export interface ComputeOperationOptions {
|
|
109
|
+
readonly type?: OperationSignature['type'];
|
|
110
|
+
readonly input?: Readonly<Record<string, OperationField>>;
|
|
111
|
+
readonly output?: Readonly<Record<string, OperationField>>;
|
|
112
|
+
readonly run: (input: any, host: ComputeHost) => unknown;
|
|
113
|
+
readonly limits?: ComputeLimits;
|
|
114
|
+
readonly calls?: Readonly<Record<string, string>>;
|
|
115
|
+
}
|
|
116
|
+
/** A connector operation's fulfilment, carried by the builder so it can be emitted to a catalog. */
|
|
117
|
+
export interface ConnectorOpDefinition {
|
|
118
|
+
readonly kind: 'compute';
|
|
119
|
+
readonly type: OperationSignature['type'];
|
|
120
|
+
readonly input: Readonly<Record<string, OperationField>>;
|
|
121
|
+
readonly output: Readonly<Record<string, OperationField>>;
|
|
122
|
+
readonly code: string;
|
|
123
|
+
readonly limits?: ComputeLimits;
|
|
124
|
+
readonly calls?: Readonly<Record<string, string>>;
|
|
125
|
+
}
|
|
126
|
+
export interface ConnectorRef {
|
|
127
|
+
readonly id: string;
|
|
128
|
+
readonly version: string;
|
|
129
|
+
readonly operations: Readonly<Record<string, OperationSignature>>;
|
|
130
|
+
/** Per-operation fulfilment (present for operations declared with `.compute()`), used to emit a catalog. */
|
|
131
|
+
readonly definitions?: Readonly<Record<string, ConnectorOpDefinition>>;
|
|
132
|
+
/** HTTP fulfilment (present for connectors declared with `.http()`), emitted to the catalog verbatim. */
|
|
133
|
+
readonly httpDef?: HttpConnectorDef;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The connector-catalog document the SDK emits — the exact shape `compileConnectors` consumes (YAML or
|
|
137
|
+
* JSON). It is the canonical `ConnectorFile` from `@noodle-borg/connector-defs`, so an emitted catalog is
|
|
138
|
+
* validated against the same schema a hand-written `connectors.yaml` is.
|
|
139
|
+
*/
|
|
140
|
+
export type ConnectorCatalogDoc = ConnectorFile;
|
|
141
|
+
export interface ServerDefinition {
|
|
142
|
+
/** Tool-facing connectors: aliased in the manifest `connectors` block and callable inside `fulfil`. */
|
|
143
|
+
use(connectors: Readonly<Record<string, ConnectorRef>>): ServerDefinition;
|
|
144
|
+
/**
|
|
145
|
+
* Catalog-only connectors reached *only* via a compute connector's `callOperation` (never by a tool).
|
|
146
|
+
* They are emitted to the catalog but **not** aliased in the manifest, so they don't trip the
|
|
147
|
+
* compiler's `unused_connector_alias` check. A connector must be in `use` **or** `provides` to be
|
|
148
|
+
* emitted.
|
|
149
|
+
*/
|
|
150
|
+
provides(connectors: Readonly<Record<string, ConnectorRef>>): ServerDefinition;
|
|
151
|
+
tool(name: string, options: ToolOptions): ServerDefinition;
|
|
152
|
+
/** Attach an MCP resource (fulfilment-backed, like a tool). Its URI may be fixed or a `{var}` template. */
|
|
153
|
+
resource(name: string, options: ResourceOptions): ServerDefinition;
|
|
154
|
+
/** Attach an MCP prompt (fulfilment-backed). Its `arguments` feed the fulfilment's input scope. */
|
|
155
|
+
prompt(name: string, options: PromptOptions): ServerDefinition;
|
|
156
|
+
/** Attach an MCP Apps widget: a `ui://` UI resource linked to `options.tool` by `_meta.ui.resourceUri`. */
|
|
157
|
+
widget(name: string, options: WidgetOptions): ServerDefinition;
|
|
158
|
+
toManifest(): Promise<Manifest>;
|
|
159
|
+
/**
|
|
160
|
+
* Emit the connector catalog: every `use`/`provides` connector that has fulfilment — `.http()` and
|
|
161
|
+
* `.compute()` connectors — validated against `connectorFileSchema`. Returns `undefined` when no
|
|
162
|
+
* connector has fulfilment (e.g. a pure signature-only server).
|
|
163
|
+
*/
|
|
164
|
+
toConnectorCatalog(): ConnectorCatalogDoc | undefined;
|
|
165
|
+
}
|
|
166
|
+
export declare function server(name: string, options: ServerOptions): ServerDefinition;
|
|
167
|
+
export declare function connector(id: string): {
|
|
168
|
+
version(version: string): ConnectorBuilder;
|
|
169
|
+
};
|
|
170
|
+
export declare function when<T>(condition: Cond, record: () => T): T;
|
|
171
|
+
export declare function isServerDefinition(value: unknown): value is ServerDefinition;
|
|
172
|
+
export declare class ConnectorBuilder implements ConnectorRef {
|
|
173
|
+
readonly id: string;
|
|
174
|
+
readonly version: string;
|
|
175
|
+
readonly operations: Readonly<Record<string, OperationSignature>>;
|
|
176
|
+
readonly definitions: Readonly<Record<string, ConnectorOpDefinition>>;
|
|
177
|
+
readonly httpDef?: HttpConnectorDef;
|
|
178
|
+
constructor(id: string, version: string, operations?: Readonly<Record<string, OperationSignature>>, definitions?: Readonly<Record<string, ConnectorOpDefinition>>, httpDef?: HttpConnectorDef);
|
|
179
|
+
/** Declare an operation by signature only (fulfilment supplied elsewhere, e.g. a catalog by `id@version`). */
|
|
180
|
+
operation(name: string, options: ConnectorOperationOptions): ConnectorBuilder;
|
|
181
|
+
/**
|
|
182
|
+
* Declare this as an **HTTP connector**: transport (`baseUrl`/`allowedOrigins`), `bearer`/`apiKey` auth
|
|
183
|
+
* naming a secret reference, and `${...}`-mapped operations. The connector carries its own fulfilment
|
|
184
|
+
* (mirroring how `.compute()` carries its `code`) and is emitted to the catalog when `.use()`/
|
|
185
|
+
* `.provides()`-d. The typed options are validated against the canonical schema at author time.
|
|
186
|
+
*/
|
|
187
|
+
http(options: HttpConnectorOptions): ConnectorBuilder;
|
|
188
|
+
/** Declare a sandboxed-compute operation: `run` is your function, shipped as the connector's `code`. */
|
|
189
|
+
compute(name: string, options: ComputeOperationOptions): ConnectorBuilder;
|
|
190
|
+
}
|
|
191
|
+
export interface Ref {
|
|
192
|
+
readonly path: string;
|
|
193
|
+
equals(value: unknown): Cond;
|
|
194
|
+
optional(): Ref;
|
|
195
|
+
toExpression(): string;
|
|
196
|
+
}
|
|
197
|
+
export interface Cond {
|
|
198
|
+
toExpression(): string;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|