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,271 @@
|
|
|
1
|
+
import { getQuickJS, newAsyncContext, shouldInterruptAfterDeadline, } from 'quickjs-emscripten';
|
|
2
|
+
import { ComputeError, digestSource, } from './engine.js';
|
|
3
|
+
/**
|
|
4
|
+
* The first {@link ComputeEngine} backend: a QuickJS interpreter compiled to WebAssembly
|
|
5
|
+
* (`quickjs-emscripten`). It runs tenant-authored JavaScript with **no ambient authority** — a fresh
|
|
6
|
+
* QuickJS runtime per invocation, configured with nothing injected (no `fetch`, `console`, `process`,
|
|
7
|
+
* `require`, or other host bindings), nondeterministic globals removed (`Date`, `Math.random`), and hard,
|
|
8
|
+
* fail-closed bounds (wall-clock timeout, memory cap, output-size cap).
|
|
9
|
+
*
|
|
10
|
+
* The unit of code is **a JavaScript expression that evaluates to a function** `fn(input) -> output`
|
|
11
|
+
* (e.g. `(input) => { ... }`). Input is JSON-marshaled in, output JSON-marshaled out — the boundary never
|
|
12
|
+
* shares object references. When a host is provided, `callOperation` is the only injected capability and
|
|
13
|
+
* routes through the runtime's policy/broker/connector path.
|
|
14
|
+
*
|
|
15
|
+
* "Interpreter, code-as-data" is the dev-mode backend; the production AOT backend (extism/wasmtime, true
|
|
16
|
+
* instruction-fuel) plugs in behind the same {@link ComputeEngine} interface
|
|
17
|
+
* ([ADR 0014](../../../docs/decisions/0014-compute-engine-interface.md)).
|
|
18
|
+
*/
|
|
19
|
+
export class QuickJsComputeEngine {
|
|
20
|
+
kind = 'interpreter';
|
|
21
|
+
#sources = new Map();
|
|
22
|
+
#wasm;
|
|
23
|
+
/** Hash and retain the source. (An AOT backend would emit and store a WASM module here instead.) */
|
|
24
|
+
async compile(source) {
|
|
25
|
+
return this.registerSource(source);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Synchronous content-addressing for the interpreter backend (hash + retain). Lets a synchronous
|
|
29
|
+
* caller (the connector-catalog compiler) register sources without going async; the AOT backend, whose
|
|
30
|
+
* compile genuinely does work, exposes only the async {@link compile}.
|
|
31
|
+
*/
|
|
32
|
+
registerSource(source) {
|
|
33
|
+
const digest = digestSource(source);
|
|
34
|
+
this.#sources.set(digest, source);
|
|
35
|
+
return { digest, engine: 'interpreter' };
|
|
36
|
+
}
|
|
37
|
+
async instantiate(module) {
|
|
38
|
+
const source = this.#sources.get(module.digest);
|
|
39
|
+
if (source === undefined) {
|
|
40
|
+
throw new ComputeError('unknown_module', `no source registered for module ${module.digest}`);
|
|
41
|
+
}
|
|
42
|
+
this.#wasm ??= await getQuickJS();
|
|
43
|
+
return new QuickJsComputeInstance(this.#wasm, source);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** A runnable instance: each {@link invoke} spins a fresh, disposable QuickJS runtime for isolation. */
|
|
47
|
+
class QuickJsComputeInstance {
|
|
48
|
+
#wasm;
|
|
49
|
+
#source;
|
|
50
|
+
constructor(wasm, source) {
|
|
51
|
+
this.#wasm = wasm;
|
|
52
|
+
this.#source = source;
|
|
53
|
+
}
|
|
54
|
+
async invoke(input, limits, host) {
|
|
55
|
+
if (host)
|
|
56
|
+
return this.invokeWithHost(input, limits, host);
|
|
57
|
+
const runtime = this.#wasm.newRuntime();
|
|
58
|
+
runtime.setMemoryLimit(limits.memoryBytes);
|
|
59
|
+
runtime.setInterruptHandler(shouldInterruptAfterDeadline(Date.now() + limits.timeoutMs));
|
|
60
|
+
const context = runtime.newContext();
|
|
61
|
+
try {
|
|
62
|
+
const wrapper = buildWrapper(this.#source, input);
|
|
63
|
+
const result = context.evalCode(wrapper, 'module.js');
|
|
64
|
+
if (result.error) {
|
|
65
|
+
const described = describeError(context, result.error);
|
|
66
|
+
result.error.dispose();
|
|
67
|
+
throw classifyError(described);
|
|
68
|
+
}
|
|
69
|
+
const out = readResult(context, result.value, limits.maxOutputBytes);
|
|
70
|
+
result.value.dispose();
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
context.dispose();
|
|
75
|
+
runtime.dispose();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
dispose() {
|
|
79
|
+
// No retained per-instance resources; runtimes are created and disposed per invoke.
|
|
80
|
+
}
|
|
81
|
+
async invokeWithHost(input, limits, host) {
|
|
82
|
+
const context = await newAsyncContext();
|
|
83
|
+
const runtime = context.runtime;
|
|
84
|
+
runtime.setMemoryLimit(limits.memoryBytes);
|
|
85
|
+
runtime.setInterruptHandler(shouldInterruptAfterDeadline(Date.now() + limits.timeoutMs));
|
|
86
|
+
try {
|
|
87
|
+
installHostCall(context, host, limits);
|
|
88
|
+
const result = await context.evalCodeAsync(buildWrapper(this.#source, input, true), 'module.js');
|
|
89
|
+
if (result.error) {
|
|
90
|
+
const described = describeError(context, result.error);
|
|
91
|
+
result.error.dispose();
|
|
92
|
+
throw classifyError(described);
|
|
93
|
+
}
|
|
94
|
+
const pendingResult = context.resolvePromise(result.value);
|
|
95
|
+
await drainPendingJobs(runtime, context);
|
|
96
|
+
const resolved = await pendingResult;
|
|
97
|
+
result.value.dispose();
|
|
98
|
+
if (resolved.error) {
|
|
99
|
+
const described = describeError(context, resolved.error);
|
|
100
|
+
resolved.error.dispose();
|
|
101
|
+
throw classifyError(described);
|
|
102
|
+
}
|
|
103
|
+
const out = readResult(context, resolved.value, limits.maxOutputBytes);
|
|
104
|
+
resolved.value.dispose();
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
context.setProp(context.global, '__hostCallOperation', context.undefined);
|
|
109
|
+
context.dispose();
|
|
110
|
+
runtime.dispose();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function drainPendingJobs(runtime, context) {
|
|
115
|
+
while (runtime.hasPendingJob()) {
|
|
116
|
+
const jobs = await runtime.executePendingJobs();
|
|
117
|
+
if (jobs.error) {
|
|
118
|
+
const described = describeError(context, jobs.error);
|
|
119
|
+
jobs.error.dispose();
|
|
120
|
+
throw classifyError(described);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Build the script run inside the sandbox. The handler source is wrapped as an expression, called with
|
|
126
|
+
* the JSON-marshaled input, and its result re-serialized to a string. A prelude removes nondeterministic
|
|
127
|
+
* globals so "deterministic by default" holds for the future resume/idempotency model
|
|
128
|
+
* ([ADR 0004](../../../docs/decisions/0004-code-as-sandboxed-connector.md)).
|
|
129
|
+
*/
|
|
130
|
+
function buildWrapper(source, input, hostEnabled = false) {
|
|
131
|
+
const callOperationPrelude = hostEnabled
|
|
132
|
+
? `
|
|
133
|
+
var callOperation = function(name, args) {
|
|
134
|
+
var __hostEnvelope = JSON.parse(globalThis.__hostCallOperation(String(name), JSON.stringify(args ?? {})));
|
|
135
|
+
if (!__hostEnvelope.ok) {
|
|
136
|
+
var __err = new Error(__hostEnvelope.error.message || "host call failed");
|
|
137
|
+
__err.name = __hostEnvelope.error.code || "host_call_failed";
|
|
138
|
+
__err.code = __hostEnvelope.error.code;
|
|
139
|
+
__err.path = __hostEnvelope.error.path;
|
|
140
|
+
throw __err;
|
|
141
|
+
}
|
|
142
|
+
return __hostEnvelope.output;
|
|
143
|
+
};
|
|
144
|
+
`
|
|
145
|
+
: '';
|
|
146
|
+
const handlerArgs = hostEnabled
|
|
147
|
+
? `${jsLiteral(input ?? null)}, { callOperation: callOperation }`
|
|
148
|
+
: jsLiteral(input ?? null);
|
|
149
|
+
const bodyPrefix = `"use strict";
|
|
150
|
+
delete globalThis.Date;
|
|
151
|
+
delete Math.random;
|
|
152
|
+
${callOperationPrelude}
|
|
153
|
+
var __handler = (${source});
|
|
154
|
+
if (typeof __handler !== "function") { throw new TypeError("compute module must evaluate to a function"); }`;
|
|
155
|
+
if (hostEnabled) {
|
|
156
|
+
return `${bodyPrefix}
|
|
157
|
+
Promise.resolve(__handler(${handlerArgs})).then(function(__value) {
|
|
158
|
+
var __out = JSON.stringify(__value);
|
|
159
|
+
return (typeof __out === "string") ? __out : "null";
|
|
160
|
+
});`;
|
|
161
|
+
}
|
|
162
|
+
return `${bodyPrefix}
|
|
163
|
+
var __out = JSON.stringify(__handler(${handlerArgs}));
|
|
164
|
+
(typeof __out === "string") ? __out : "null";`;
|
|
165
|
+
}
|
|
166
|
+
function installHostCall(context, host, limits) {
|
|
167
|
+
let calls = 0;
|
|
168
|
+
const fn = context.newAsyncifiedFunction('__hostCallOperation', async (nameHandle, argsJsonHandle) => {
|
|
169
|
+
const envelope = async () => {
|
|
170
|
+
if (calls >= limits.maxHostCalls) {
|
|
171
|
+
return {
|
|
172
|
+
ok: false,
|
|
173
|
+
error: {
|
|
174
|
+
code: 'host_call_denied',
|
|
175
|
+
message: 'host call budget exceeded',
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
calls += 1;
|
|
180
|
+
const name = context.getString(nameHandle);
|
|
181
|
+
let args;
|
|
182
|
+
try {
|
|
183
|
+
args = JSON.parse(context.getString(argsJsonHandle));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return {
|
|
187
|
+
ok: false,
|
|
188
|
+
error: { code: 'host_call_denied', message: 'host call arguments must be JSON' },
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (args === null || typeof args !== 'object' || Array.isArray(args)) {
|
|
192
|
+
return {
|
|
193
|
+
ok: false,
|
|
194
|
+
error: { code: 'host_call_denied', message: 'host call arguments must be an object' },
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
return {
|
|
199
|
+
ok: true,
|
|
200
|
+
output: await host.callOperation(name, args),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
const err = error;
|
|
205
|
+
return {
|
|
206
|
+
ok: false,
|
|
207
|
+
error: {
|
|
208
|
+
code: typeof err.code === 'string' ? err.code : 'host_call_failed',
|
|
209
|
+
message: typeof err.message === 'string' && err.message !== ''
|
|
210
|
+
? err.message.slice(0, 256)
|
|
211
|
+
: 'host call failed',
|
|
212
|
+
...(typeof err.path === 'string' ? { path: err.path } : {}),
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
return context.newString(JSON.stringify(await envelope()));
|
|
218
|
+
});
|
|
219
|
+
context.setProp(context.global, '__hostCallOperation', fn);
|
|
220
|
+
fn.dispose();
|
|
221
|
+
}
|
|
222
|
+
/** Read the string completion value, enforcing the output-size cap, and parse it as JSON. */
|
|
223
|
+
function readResult(context, value, maxOutputBytes) {
|
|
224
|
+
const text = context.getString(value);
|
|
225
|
+
if (Buffer.byteLength(text, 'utf8') > maxOutputBytes) {
|
|
226
|
+
throw new ComputeError('output_too_large', 'compute output exceeds the size limit');
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
return JSON.parse(text);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
throw new ComputeError('invalid_output', 'compute output is not valid JSON');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** Extract a bounded `{ name, message }` from a sandbox error handle without leaking host state. */
|
|
236
|
+
function describeError(context, handle) {
|
|
237
|
+
let dumped;
|
|
238
|
+
try {
|
|
239
|
+
dumped = context.dump(handle);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return { name: 'Error', message: 'sandbox error' };
|
|
243
|
+
}
|
|
244
|
+
if (dumped !== null && typeof dumped === 'object') {
|
|
245
|
+
const o = dumped;
|
|
246
|
+
const name = typeof o.name === 'string' ? o.name : 'Error';
|
|
247
|
+
const message = typeof o.message === 'string' ? o.message : '';
|
|
248
|
+
return { name, message };
|
|
249
|
+
}
|
|
250
|
+
return { name: 'Error', message: String(dumped) };
|
|
251
|
+
}
|
|
252
|
+
/** Map a sandbox error to a stable {@link ComputeError} code; truncate the relayed message. */
|
|
253
|
+
function classifyError(described) {
|
|
254
|
+
const lower = described.message.toLowerCase();
|
|
255
|
+
if (lower.includes('interrupted')) {
|
|
256
|
+
return new ComputeError('timeout', 'compute exceeded its time budget');
|
|
257
|
+
}
|
|
258
|
+
if (lower.includes('out of memory')) {
|
|
259
|
+
return new ComputeError('memory', 'compute exceeded its memory limit');
|
|
260
|
+
}
|
|
261
|
+
if (described.name === 'host_call_denied' || described.name === 'host_call_failed') {
|
|
262
|
+
return new ComputeError(described.name, described.message.slice(0, 256) || 'host call failed');
|
|
263
|
+
}
|
|
264
|
+
const detail = `${described.name}: ${described.message}`.slice(0, 256);
|
|
265
|
+
return new ComputeError('runtime_error', detail);
|
|
266
|
+
}
|
|
267
|
+
/** Embed a JSON-safe value as a JavaScript literal, escaping the line/paragraph separators. */
|
|
268
|
+
function jsLiteral(value) {
|
|
269
|
+
return JSON.stringify(value).replace(/[\u2028\u2029]/g, (c) => c === '\u2028' ? '\\u2028' : '\\u2029');
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=quickjs-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickjs-engine.js","sourceRoot":"","sources":["../src/quickjs-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@noodle-borg/compute",
|
|
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
|
+
"quickjs-emscripten": "^0.32.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^24.0.0"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type CatalogConnector } from '@noodle-borg/compiler';
|
|
2
|
+
import { type Connector } from '@noodle-borg/runtime';
|
|
3
|
+
/** A connector-definition compile error (structurally compatible with the compiler's `CompileError`). */
|
|
4
|
+
export interface ConnectorCompileError {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A binding from a connector operation to the *named* secret its auth scheme needs. It carries the
|
|
11
|
+
* reference only — never a value. The deploy plane joins these with out-of-band secret values to build a
|
|
12
|
+
* credential broker; the runtime and the operation signature never see auth or secret refs.
|
|
13
|
+
*/
|
|
14
|
+
export interface SecretBinding {
|
|
15
|
+
readonly connectorId: string;
|
|
16
|
+
readonly connectorVersion: string;
|
|
17
|
+
/** `undefined` => the connector-level default auth (applies to any op without its own scheme). */
|
|
18
|
+
readonly operation?: string;
|
|
19
|
+
readonly secretRef: string;
|
|
20
|
+
}
|
|
21
|
+
export type CompileConnectorsResult = {
|
|
22
|
+
readonly ok: true;
|
|
23
|
+
readonly catalog: CatalogConnector[];
|
|
24
|
+
readonly connectors: Connector[];
|
|
25
|
+
/** Secret references declared by connector auth schemes; empty when no connector declares auth. */
|
|
26
|
+
readonly secretBindings: SecretBinding[];
|
|
27
|
+
} | {
|
|
28
|
+
readonly ok: false;
|
|
29
|
+
readonly errors: ConnectorCompileError[];
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Compile a declarative connector-catalog document (YAML or JSON) into:
|
|
33
|
+
* - `catalog`: `CatalogConnector[]` — operation signatures fed to the manifest compiler's catalog so
|
|
34
|
+
* signature-hash resolution is unchanged; and
|
|
35
|
+
* - `connectors`: `Connector[]` — the runnable connectors. An **HTTP** connector maps request/response
|
|
36
|
+
* with the declared `${...}` expressions; a **compute** connector runs sandboxed JavaScript through
|
|
37
|
+
* `@noodle-borg/compute` (ADR 0004 / ADR 0014). Both are plain `Connector`s, so the runtime resolves
|
|
38
|
+
* and invokes them identically; and
|
|
39
|
+
* - `secretBindings`: the named secret references declared by HTTP connector `auth` schemes (ADR 0015).
|
|
40
|
+
* They carry references only — never values — for the deploy plane to join with out-of-band secrets.
|
|
41
|
+
*
|
|
42
|
+
* A compute connector may call declared catalog operations only through the runtime-supplied host ABI
|
|
43
|
+
* ([ADR 0004](../../../docs/decisions/0004-code-as-sandboxed-connector.md) `callOperation`).
|
|
44
|
+
*/
|
|
45
|
+
export declare function compileConnectors(source: string): CompileConnectorsResult;
|
|
46
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EAOtB,MAAM,uBAAuB,CAAC;AAc/B,OAAO,EAAE,KAAK,SAAS,EAAiC,MAAM,sBAAsB,CAAC;AAWrF,yGAAyG;AACzG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,kGAAkG;IAClG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,uBAAuB,GAC/B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;IACjC,mGAAmG;IACnG,QAAQ,CAAC,cAAc,EAAE,aAAa,EAAE,CAAC;CAC1C,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC;AAKrE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CA0CzE"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { computeSignatureHash, parseValue, } from '@noodle-borg/compiler';
|
|
2
|
+
import { CodeConnector, DEFAULT_LIMITS, QuickJsComputeEngine, } from '@noodle-borg/compute';
|
|
3
|
+
import { HttpConnector, } from '@noodle-borg/connector-http';
|
|
4
|
+
import { evaluateValue } from '@noodle-borg/runtime';
|
|
5
|
+
import { parse as parseYaml } from 'yaml';
|
|
6
|
+
import { connectorFileSchema } from './schema.js';
|
|
7
|
+
const REQUEST_ROOTS = new Set(['args']);
|
|
8
|
+
const RESPONSE_ROOTS = new Set(['args', 'response']);
|
|
9
|
+
/**
|
|
10
|
+
* Compile a declarative connector-catalog document (YAML or JSON) into:
|
|
11
|
+
* - `catalog`: `CatalogConnector[]` — operation signatures fed to the manifest compiler's catalog so
|
|
12
|
+
* signature-hash resolution is unchanged; and
|
|
13
|
+
* - `connectors`: `Connector[]` — the runnable connectors. An **HTTP** connector maps request/response
|
|
14
|
+
* with the declared `${...}` expressions; a **compute** connector runs sandboxed JavaScript through
|
|
15
|
+
* `@noodle-borg/compute` (ADR 0004 / ADR 0014). Both are plain `Connector`s, so the runtime resolves
|
|
16
|
+
* and invokes them identically; and
|
|
17
|
+
* - `secretBindings`: the named secret references declared by HTTP connector `auth` schemes (ADR 0015).
|
|
18
|
+
* They carry references only — never values — for the deploy plane to join with out-of-band secrets.
|
|
19
|
+
*
|
|
20
|
+
* A compute connector may call declared catalog operations only through the runtime-supplied host ABI
|
|
21
|
+
* ([ADR 0004](../../../docs/decisions/0004-code-as-sandboxed-connector.md) `callOperation`).
|
|
22
|
+
*/
|
|
23
|
+
export function compileConnectors(source) {
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = parseYaml(source);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
errors: [{ code: 'invalid_yaml', path: '', message: error.message }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const parsed = connectorFileSchema.safeParse(raw);
|
|
35
|
+
if (!parsed.success) {
|
|
36
|
+
return {
|
|
37
|
+
ok: false,
|
|
38
|
+
errors: parsed.error.issues.map((issue) => ({
|
|
39
|
+
code: 'invalid_connector',
|
|
40
|
+
path: issue.path.join('.'),
|
|
41
|
+
message: issue.message,
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const errors = [];
|
|
46
|
+
const catalog = [];
|
|
47
|
+
const connectors = [];
|
|
48
|
+
const secretBindings = [];
|
|
49
|
+
const targets = buildTargetIndex(parsed.data.connectors, errors);
|
|
50
|
+
// One shared sandbox engine per compile: every compute operation registers its source here, keyed by
|
|
51
|
+
// content digest, so the CodeConnectors built below can resolve their modules at invoke time.
|
|
52
|
+
const computeEngine = new QuickJsComputeEngine();
|
|
53
|
+
for (const def of parsed.data.connectors) {
|
|
54
|
+
if ('http' in def) {
|
|
55
|
+
compileHttpConnector(def, errors, catalog, connectors, secretBindings);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
compileComputeConnector(def, computeEngine, targets, errors, catalog, connectors);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (errors.length > 0)
|
|
62
|
+
return { ok: false, errors };
|
|
63
|
+
return { ok: true, catalog, connectors, secretBindings };
|
|
64
|
+
}
|
|
65
|
+
/** Compile one HTTP connector: signatures into the catalog, a runnable `HttpConnector` with `${...}` mapping. */
|
|
66
|
+
function compileHttpConnector(def, errors, catalog, connectors, secretBindings) {
|
|
67
|
+
const operations = {};
|
|
68
|
+
const signatures = {};
|
|
69
|
+
for (const [opName, op] of Object.entries(def.operations)) {
|
|
70
|
+
const base = `connectors.${def.id}.operations.${opName}`;
|
|
71
|
+
const signature = toSignature(op.type, op.input, op.output);
|
|
72
|
+
signatures[opName] = signature;
|
|
73
|
+
const requestAst = op.request
|
|
74
|
+
? compileExprMap(op.request, REQUEST_ROOTS, `${base}.request`, errors)
|
|
75
|
+
: undefined;
|
|
76
|
+
const responseAst = op.response
|
|
77
|
+
? compileExprMap(op.response, RESPONSE_ROOTS, `${base}.response`, errors)
|
|
78
|
+
: undefined;
|
|
79
|
+
operations[opName] = buildOperation(op, signature, requestAst, responseAst);
|
|
80
|
+
// Per-operation auth declares its own secret reference (overrides any connector-level default).
|
|
81
|
+
if (op.auth) {
|
|
82
|
+
secretBindings.push({
|
|
83
|
+
connectorId: def.id,
|
|
84
|
+
connectorVersion: def.version,
|
|
85
|
+
operation: opName,
|
|
86
|
+
secretRef: op.auth.secret,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catalog.push({
|
|
91
|
+
id: def.id,
|
|
92
|
+
version: def.version,
|
|
93
|
+
kind: def.kind ?? 'custom',
|
|
94
|
+
operations: signatures,
|
|
95
|
+
});
|
|
96
|
+
// Connector-level default auth binds every operation that doesn't carry its own scheme.
|
|
97
|
+
if (def.http.auth) {
|
|
98
|
+
secretBindings.push({
|
|
99
|
+
connectorId: def.id,
|
|
100
|
+
connectorVersion: def.version,
|
|
101
|
+
secretRef: def.http.auth.secret,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const config = {
|
|
105
|
+
id: def.id,
|
|
106
|
+
version: def.version,
|
|
107
|
+
baseUrl: def.http.baseUrl,
|
|
108
|
+
...(def.http.allowedOrigins ? { allowedOrigins: def.http.allowedOrigins } : {}),
|
|
109
|
+
...(def.http.auth ? { auth: toAuthScheme(def.http.auth) } : {}),
|
|
110
|
+
operations,
|
|
111
|
+
};
|
|
112
|
+
connectors.push(new HttpConnector(config));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Strip a declarative auth def down to the runtime `HttpAuthScheme` the connector applies — dropping the
|
|
116
|
+
* `secret` *reference*. The reference lives only in the {@link SecretBinding} table; the runtime scheme
|
|
117
|
+
* carries the shape (bearer / api-key header), and the broker supplies the token at invoke time.
|
|
118
|
+
*/
|
|
119
|
+
function toAuthScheme(auth) {
|
|
120
|
+
return auth.kind === 'bearer' ? { kind: 'bearer' } : { kind: 'apiKey', header: auth.header };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Compile one compute connector: register each operation's code with the shared sandbox engine (producing
|
|
124
|
+
* a content-addressed module) and emit a `CodeConnector`. The catalog signatures are identical to what
|
|
125
|
+
* `CodeConnector.signature()` reports, so signature-hash parity (ADR 0002) holds; the module digest and
|
|
126
|
+
* limits never enter the signature.
|
|
127
|
+
*/
|
|
128
|
+
function compileComputeConnector(def, engine, targets, errors, catalog, connectors) {
|
|
129
|
+
const signatures = {};
|
|
130
|
+
const operations = {};
|
|
131
|
+
for (const [opName, op] of Object.entries(def.operations)) {
|
|
132
|
+
const base = `connectors.${def.id}.operations.${opName}`;
|
|
133
|
+
const signature = toSignature(op.type, op.input, op.output);
|
|
134
|
+
signatures[opName] = signature;
|
|
135
|
+
const limits = {
|
|
136
|
+
timeoutMs: op.limits?.timeoutMs ?? DEFAULT_LIMITS.timeoutMs,
|
|
137
|
+
memoryBytes: op.limits?.memoryBytes ?? DEFAULT_LIMITS.memoryBytes,
|
|
138
|
+
maxOutputBytes: op.limits?.maxOutputBytes ?? DEFAULT_LIMITS.maxOutputBytes,
|
|
139
|
+
maxHostCalls: op.limits?.maxHostCalls ?? DEFAULT_LIMITS.maxHostCalls,
|
|
140
|
+
};
|
|
141
|
+
const calls = compileCalls(op, targets, `${base}.calls`, errors);
|
|
142
|
+
operations[opName] = {
|
|
143
|
+
signature,
|
|
144
|
+
module: engine.registerSource(op.code),
|
|
145
|
+
limits,
|
|
146
|
+
...(calls ? { calls } : {}),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catalog.push({
|
|
150
|
+
id: def.id,
|
|
151
|
+
version: def.version,
|
|
152
|
+
kind: def.kind ?? 'custom',
|
|
153
|
+
operations: signatures,
|
|
154
|
+
});
|
|
155
|
+
connectors.push(new CodeConnector({ id: def.id, version: def.version, engine, operations }));
|
|
156
|
+
}
|
|
157
|
+
function buildTargetIndex(defs, errors) {
|
|
158
|
+
const byId = new Map();
|
|
159
|
+
for (const def of defs) {
|
|
160
|
+
const signatures = {};
|
|
161
|
+
for (const [opName, op] of Object.entries(def.operations)) {
|
|
162
|
+
signatures[opName] = toSignature(op.type, op.input, op.output);
|
|
163
|
+
}
|
|
164
|
+
if (byId.has(def.id)) {
|
|
165
|
+
byId.set(def.id, 'ambiguous');
|
|
166
|
+
errors.push({
|
|
167
|
+
code: 'duplicate_connector_id',
|
|
168
|
+
path: `connectors.${def.id}`,
|
|
169
|
+
message: `connector id "${def.id}" appears more than once; compute call targets would be ambiguous`,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
byId.set(def.id, { id: def.id, version: def.version, operations: signatures });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return { byId };
|
|
177
|
+
}
|
|
178
|
+
function compileCalls(op, targets, prefix, errors) {
|
|
179
|
+
if (!op.calls)
|
|
180
|
+
return undefined;
|
|
181
|
+
const calls = {};
|
|
182
|
+
for (const [localName, target] of Object.entries(op.calls)) {
|
|
183
|
+
if (!/^[a-z0-9_]+$/.test(localName)) {
|
|
184
|
+
errors.push({
|
|
185
|
+
code: 'invalid_call_name',
|
|
186
|
+
path: `${prefix}.${localName}`,
|
|
187
|
+
message: `call name "${localName}" must use lowercase letters, numbers, and underscores`,
|
|
188
|
+
});
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const parsed = parseCallTarget(target);
|
|
192
|
+
if (!parsed) {
|
|
193
|
+
errors.push({
|
|
194
|
+
code: 'invalid_call_target',
|
|
195
|
+
path: `${prefix}.${localName}`,
|
|
196
|
+
message: `call target "${target}" must be "<connectorId>.<operation>"`,
|
|
197
|
+
});
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const entry = targets.byId.get(parsed.connectorId);
|
|
201
|
+
if (!entry) {
|
|
202
|
+
errors.push({
|
|
203
|
+
code: 'unknown_call_connector',
|
|
204
|
+
path: `${prefix}.${localName}`,
|
|
205
|
+
message: `call target connector "${parsed.connectorId}" is not declared`,
|
|
206
|
+
});
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (entry === 'ambiguous') {
|
|
210
|
+
errors.push({
|
|
211
|
+
code: 'ambiguous_call_connector',
|
|
212
|
+
path: `${prefix}.${localName}`,
|
|
213
|
+
message: `call target connector "${parsed.connectorId}" is ambiguous`,
|
|
214
|
+
});
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const signature = entry.operations[parsed.operation];
|
|
218
|
+
if (!signature) {
|
|
219
|
+
errors.push({
|
|
220
|
+
code: 'unknown_call_operation',
|
|
221
|
+
path: `${prefix}.${localName}`,
|
|
222
|
+
message: `call target operation "${parsed.operation}" is not declared on "${parsed.connectorId}"`,
|
|
223
|
+
});
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
calls[localName] = {
|
|
227
|
+
resolved: true,
|
|
228
|
+
alias: parsed.connectorId,
|
|
229
|
+
connectorId: entry.id,
|
|
230
|
+
connectorVersion: entry.version,
|
|
231
|
+
operation: parsed.operation,
|
|
232
|
+
signatureHash: computeSignatureHash(parsed.operation, signature),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return Object.keys(calls).length > 0 ? calls : undefined;
|
|
236
|
+
}
|
|
237
|
+
function parseCallTarget(target) {
|
|
238
|
+
const parts = target.split('.');
|
|
239
|
+
if (parts.length !== 2 || parts[0] === '' || parts[1] === '')
|
|
240
|
+
return null;
|
|
241
|
+
return { connectorId: parts[0], operation: parts[1] };
|
|
242
|
+
}
|
|
243
|
+
/** Build an `OperationSignature` from the declared type and input/output field maps. */
|
|
244
|
+
function toSignature(type, input, output) {
|
|
245
|
+
return {
|
|
246
|
+
type,
|
|
247
|
+
input: (input ?? {}),
|
|
248
|
+
output: (output ?? {}),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/** Build a runnable `HttpOperation` whose body/response mapping evaluate the compiled expression ASTs. */
|
|
252
|
+
function buildOperation(op, signature, requestAst, responseAst) {
|
|
253
|
+
return {
|
|
254
|
+
method: op.method ?? 'GET',
|
|
255
|
+
path: op.path,
|
|
256
|
+
...(op.query ? { query: op.query } : {}),
|
|
257
|
+
signature,
|
|
258
|
+
...(op.auth ? { auth: toAuthScheme(op.auth) } : {}),
|
|
259
|
+
...(requestAst ? { body: (args) => evalMap(requestAst, { args }) } : {}),
|
|
260
|
+
...(responseAst
|
|
261
|
+
? { mapResponse: (json, args) => evalMap(responseAst, { args, response: json }) }
|
|
262
|
+
: {}),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/** Parse each field of a mapping into an expression AST under the given roots; collect parse errors. */
|
|
266
|
+
function compileExprMap(map, roots, prefix, errors) {
|
|
267
|
+
const out = {};
|
|
268
|
+
for (const [field, value] of Object.entries(map)) {
|
|
269
|
+
const result = parseValue(value, `${prefix}.${field}`, roots);
|
|
270
|
+
if (result.errors.length > 0) {
|
|
271
|
+
errors.push(...result.errors.map((e) => ({ code: e.code, path: e.path, message: e.message })));
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
out[field] = result.node;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return out;
|
|
278
|
+
}
|
|
279
|
+
/** Evaluate every value in a compiled expression map against the scope; omit `undefined` results. */
|
|
280
|
+
function evalMap(map, scope) {
|
|
281
|
+
const out = {};
|
|
282
|
+
for (const [field, node] of Object.entries(map)) {
|
|
283
|
+
const value = evaluateValue(node, scope, field);
|
|
284
|
+
if (value !== undefined)
|
|
285
|
+
out[field] = value;
|
|
286
|
+
}
|
|
287
|
+
return out;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=compile.js.map
|