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,719 @@
|
|
|
1
|
+
import { parse as parseYaml, YAMLParseError } from 'yaml';
|
|
2
|
+
import { ARTIFACT_SCHEMA_VERSION, MCP_APP_MIME_TYPE, } from './artifact/types.js';
|
|
3
|
+
import { computeSignatureHash } from './catalog/signature.js';
|
|
4
|
+
import { collectPaths, parseCondition, parseValue, } from './manifest/expression.js';
|
|
5
|
+
import { parseOperationRef } from './manifest/naming.js';
|
|
6
|
+
import { manifestSchema } from './manifest/schema.js';
|
|
7
|
+
import { resolveSchemaUses } from './manifest/schema-refs.js';
|
|
8
|
+
import { docAnchorFor, suggestionFields } from './suggest.js';
|
|
9
|
+
import { parseUriTemplate } from './uri-template.js';
|
|
10
|
+
const JSON_SCHEMA_2020_12 = 'https://json-schema.org/draft/2020-12/schema';
|
|
11
|
+
const NO_STEPS = { stepIndexById: new Map(), currentIdx: null };
|
|
12
|
+
/**
|
|
13
|
+
* Compile a YAML manifest into a normalized runtime artifact.
|
|
14
|
+
*
|
|
15
|
+
* Pipeline: parse YAML -> validate static shape (Zod) -> structural passes (duplicate names,
|
|
16
|
+
* `$use` schema resolution, external `$ref` rejection, fulfilment parsing — flow steps + `${...}`
|
|
17
|
+
* expressions to AST) -> emit artifact. Expression and `$use` resolution are catalog-independent and
|
|
18
|
+
* always run. With a catalog in {@link CompileOptions}, connector resolution follows (alias/operation
|
|
19
|
+
* lookup, argument signature checks) and the artifact is `resolved`; without one it is `shape-only`
|
|
20
|
+
* (only connector resolution deferred). Returns every error it can find rather than stopping at the
|
|
21
|
+
* first. See docs/SPEC.md and docs/IMPLEMENTATION-LOG.md.
|
|
22
|
+
*/
|
|
23
|
+
export function compile(source, options = {}) {
|
|
24
|
+
// 1. Parse YAML.
|
|
25
|
+
let raw;
|
|
26
|
+
try {
|
|
27
|
+
raw = parseYaml(source);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err instanceof YAMLParseError) {
|
|
31
|
+
const pos = err.linePos?.[0];
|
|
32
|
+
const where = pos ? ` at line ${pos.line}, column ${pos.col}` : '';
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
errors: [{ code: 'yaml_parse_error', path: '', message: `${err.message}${where}` }],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
return compileManifest(raw, options);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validate an already-materialized manifest **object** for authoring-contract conformance **without** a
|
|
44
|
+
* connector catalog: Zod shape validation plus every catalog-independent structural pass (duplicate
|
|
45
|
+
* names, `$use` resolution, external-`$ref` rejection, fulfilment + `${...}` expression parsing,
|
|
46
|
+
* URI-template classification, resource/prompt namespacing). Connector-resolution errors (unknown
|
|
47
|
+
* alias/operation, unused alias, argument signature) are **not** reported here — they require a catalog
|
|
48
|
+
* and are produced by {@link compile} / {@link compileManifest} with `{ catalog }`.
|
|
49
|
+
*
|
|
50
|
+
* This is the stable, in-process contract a *machine* manifest generator targets: an object in,
|
|
51
|
+
* structured {@link CompileError}s out (carrying GT-1's `didYouMean`/`expected`/`got` where relevant).
|
|
52
|
+
* To also parse YAML, use {@link compile}; to resolve against a catalog, pass one to
|
|
53
|
+
* {@link compileManifest}. See GT-2 in docs/STATUS.md. It is a faithful projection of
|
|
54
|
+
* `compileManifest(raw)` — the artifact is dropped, the error set is identical.
|
|
55
|
+
*/
|
|
56
|
+
export function validateManifest(raw) {
|
|
57
|
+
const result = compileManifest(raw);
|
|
58
|
+
return result.ok ? { ok: true, errors: [] } : { ok: false, errors: result.errors };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Compile an already-materialized manifest object into the same normalized runtime artifact emitted by
|
|
62
|
+
* {@link compile}. This is the shared path for YAML manifests and TypeScript authoring SDK output.
|
|
63
|
+
*/
|
|
64
|
+
export function compileManifest(raw, options = {}) {
|
|
65
|
+
// 1. Validate static shape.
|
|
66
|
+
const parsed = manifestSchema.safeParse(raw);
|
|
67
|
+
if (!parsed.success) {
|
|
68
|
+
return { ok: false, errors: parsed.error.issues.map(translateIssue) };
|
|
69
|
+
}
|
|
70
|
+
const manifest = parsed.data;
|
|
71
|
+
// 2. Structural passes (catalog-independent): duplicate names, `$use` resolution, external refs,
|
|
72
|
+
// fulfilment parsing. `$use` is resolved first so external-ref detection also scans bundled defs.
|
|
73
|
+
const errors = [];
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
const schemasMap = manifest.schemas ?? {};
|
|
76
|
+
const structural = [];
|
|
77
|
+
manifest.tools.forEach((tool, i) => {
|
|
78
|
+
if (seen.has(tool.name)) {
|
|
79
|
+
errors.push({
|
|
80
|
+
code: 'duplicate_name',
|
|
81
|
+
path: `tools.${i}.name`,
|
|
82
|
+
message: `duplicate tool name "${tool.name}"`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
seen.add(tool.name);
|
|
86
|
+
const input = resolveSchemaUses(tool.inputSchema, schemasMap, `tools.${i}.inputSchema`);
|
|
87
|
+
errors.push(...input.errors);
|
|
88
|
+
const inputExternalRef = findExternalRef(input.schema, `tools.${i}.inputSchema`);
|
|
89
|
+
if (inputExternalRef)
|
|
90
|
+
errors.push(inputExternalRef);
|
|
91
|
+
let outputSchema;
|
|
92
|
+
if (tool.outputSchema) {
|
|
93
|
+
const output = resolveSchemaUses(tool.outputSchema, schemasMap, `tools.${i}.outputSchema`);
|
|
94
|
+
errors.push(...output.errors);
|
|
95
|
+
const outputExternalRef = findExternalRef(output.schema, `tools.${i}.outputSchema`);
|
|
96
|
+
if (outputExternalRef)
|
|
97
|
+
errors.push(outputExternalRef);
|
|
98
|
+
outputSchema = output.schema;
|
|
99
|
+
}
|
|
100
|
+
const fulfilment = parseFulfilment(tool.fulfilment, `tools.${i}.fulfilment`, schemasMap, errors);
|
|
101
|
+
if (!fulfilment)
|
|
102
|
+
return; // a structural fulfilment error was already recorded
|
|
103
|
+
structural.push({
|
|
104
|
+
tool,
|
|
105
|
+
index: i,
|
|
106
|
+
inputSchema: input.schema,
|
|
107
|
+
...(outputSchema ? { outputSchema } : {}),
|
|
108
|
+
fulfilment,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// Resources: separate name namespace, unique URIs, `{var}` template classification. Fulfilment may be
|
|
112
|
+
// a steps-less flow (a static constant), so empty flows are allowed.
|
|
113
|
+
const structResources = [];
|
|
114
|
+
const resourceSeen = new Set();
|
|
115
|
+
const resourceUriSeen = new Set();
|
|
116
|
+
(manifest.resources ?? []).forEach((resource, i) => {
|
|
117
|
+
if (resourceSeen.has(resource.name)) {
|
|
118
|
+
errors.push({
|
|
119
|
+
code: 'duplicate_resource',
|
|
120
|
+
path: `resources.${i}.name`,
|
|
121
|
+
message: `duplicate resource name "${resource.name}"`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
resourceSeen.add(resource.name);
|
|
125
|
+
const parsedUri = parseUriTemplate(resource.uri);
|
|
126
|
+
if (!parsedUri.ok) {
|
|
127
|
+
errors.push({
|
|
128
|
+
code: 'unsupported_uri_template',
|
|
129
|
+
path: `resources.${i}.uri`,
|
|
130
|
+
message: parsedUri.error,
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (resourceUriSeen.has(resource.uri)) {
|
|
135
|
+
errors.push({
|
|
136
|
+
code: 'duplicate_resource_uri',
|
|
137
|
+
path: `resources.${i}.uri`,
|
|
138
|
+
message: `duplicate resource uri "${resource.uri}"`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
resourceUriSeen.add(resource.uri);
|
|
142
|
+
const fulfilment = parseFulfilment(resource.fulfilment, `resources.${i}.fulfilment`, schemasMap, errors);
|
|
143
|
+
if (!fulfilment)
|
|
144
|
+
return;
|
|
145
|
+
structResources.push({
|
|
146
|
+
resource,
|
|
147
|
+
isTemplate: parsedUri.value.kind === 'template',
|
|
148
|
+
variables: parsedUri.value.kind === 'template' ? parsedUri.value.variables : [],
|
|
149
|
+
fulfilment,
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
// Prompts: separate name namespace; fulfilment input scope is the supplied arguments.
|
|
153
|
+
const structPrompts = [];
|
|
154
|
+
const promptSeen = new Set();
|
|
155
|
+
(manifest.prompts ?? []).forEach((prompt, i) => {
|
|
156
|
+
if (promptSeen.has(prompt.name)) {
|
|
157
|
+
errors.push({
|
|
158
|
+
code: 'duplicate_prompt',
|
|
159
|
+
path: `prompts.${i}.name`,
|
|
160
|
+
message: `duplicate prompt name "${prompt.name}"`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
promptSeen.add(prompt.name);
|
|
164
|
+
const fulfilment = parseFulfilment(prompt.fulfilment, `prompts.${i}.fulfilment`, schemasMap, errors);
|
|
165
|
+
if (!fulfilment)
|
|
166
|
+
return;
|
|
167
|
+
structPrompts.push({ prompt, fulfilment });
|
|
168
|
+
});
|
|
169
|
+
// Widgets (MCP Apps; ADR 0022): each links an existing tool and desugars to a fixed `ui://` resource.
|
|
170
|
+
// Validate name uniqueness, the tool link, one-widget-per-tool, and that the synthesized resource
|
|
171
|
+
// name/uri do not collide with a declared resource (widgets share the resources/list namespace). `seen`
|
|
172
|
+
// holds the tool names accumulated above; `resourceSeen`/`resourceUriSeen` hold the declared resources.
|
|
173
|
+
const widgetSeen = new Set();
|
|
174
|
+
const widgetToolSeen = new Set();
|
|
175
|
+
(manifest.widgets ?? []).forEach((widget, i) => {
|
|
176
|
+
if (widgetSeen.has(widget.name)) {
|
|
177
|
+
errors.push({
|
|
178
|
+
code: 'duplicate_widget',
|
|
179
|
+
path: `widgets.${i}.name`,
|
|
180
|
+
message: `duplicate widget name "${widget.name}"`,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
widgetSeen.add(widget.name);
|
|
184
|
+
if (!seen.has(widget.tool)) {
|
|
185
|
+
// The actionable root cause is the missing tool; do not also flag a "duplicate link" below.
|
|
186
|
+
errors.push({
|
|
187
|
+
code: 'unknown_widget_tool',
|
|
188
|
+
path: `widgets.${i}.tool`,
|
|
189
|
+
message: `widget "${widget.name}" links unknown tool "${widget.tool}"`,
|
|
190
|
+
got: widget.tool,
|
|
191
|
+
...suggestionFields('unknown_widget_tool', widget.tool, [...seen]),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
if (widgetToolSeen.has(widget.tool)) {
|
|
196
|
+
errors.push({
|
|
197
|
+
code: 'duplicate_widget_tool',
|
|
198
|
+
path: `widgets.${i}.tool`,
|
|
199
|
+
message: `tool "${widget.tool}" is already linked to a widget (a tool declares at most one widget)`,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
widgetToolSeen.add(widget.tool);
|
|
203
|
+
}
|
|
204
|
+
if (resourceSeen.has(widget.name)) {
|
|
205
|
+
errors.push({
|
|
206
|
+
code: 'duplicate_resource',
|
|
207
|
+
path: `widgets.${i}.name`,
|
|
208
|
+
message: `widget name "${widget.name}" collides with a declared resource name`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
resourceSeen.add(widget.name);
|
|
212
|
+
const uri = widgetUri(manifest.server.name, widget.name);
|
|
213
|
+
if (resourceUriSeen.has(uri)) {
|
|
214
|
+
errors.push({
|
|
215
|
+
code: 'duplicate_resource_uri',
|
|
216
|
+
path: `widgets.${i}.name`,
|
|
217
|
+
message: `widget resource uri "${uri}" collides with a declared resource uri`,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
resourceUriSeen.add(uri);
|
|
221
|
+
});
|
|
222
|
+
if (errors.length > 0) {
|
|
223
|
+
return { ok: false, errors };
|
|
224
|
+
}
|
|
225
|
+
// Desugar widgets to fixed `ui://` resources + a `_meta.ui.resourceUri` link on the named tool. The
|
|
226
|
+
// `html` body is emitted as a constant `literal` expression — never run through the expression parser —
|
|
227
|
+
// so inline `<script>` `${...}` in widget HTML stays opaque (it is not our mapping language).
|
|
228
|
+
const widgetResources = (manifest.widgets ?? []).map((widget) => {
|
|
229
|
+
const uri = widgetUri(manifest.server.name, widget.name);
|
|
230
|
+
const uiMeta = resourceUiMeta(widget);
|
|
231
|
+
return {
|
|
232
|
+
name: widget.name,
|
|
233
|
+
uri,
|
|
234
|
+
...(widget.title ? { title: widget.title } : {}),
|
|
235
|
+
...(widget.description ? { description: widget.description } : {}),
|
|
236
|
+
mimeType: MCP_APP_MIME_TYPE,
|
|
237
|
+
isTemplate: false,
|
|
238
|
+
fulfilment: {
|
|
239
|
+
kind: 'flow',
|
|
240
|
+
steps: [],
|
|
241
|
+
output: { value: { kind: 'literal', value: widget.html } },
|
|
242
|
+
},
|
|
243
|
+
...(uiMeta ? { _meta: { ui: uiMeta } } : {}),
|
|
244
|
+
};
|
|
245
|
+
});
|
|
246
|
+
const toolUiMetaByName = new Map((manifest.widgets ?? []).map((widget) => [
|
|
247
|
+
widget.tool,
|
|
248
|
+
{ ui: { resourceUri: widgetUri(manifest.server.name, widget.name) } },
|
|
249
|
+
]));
|
|
250
|
+
// 3. Resolve connector references and emit per-tool fulfilment.
|
|
251
|
+
const declared = manifest.connectors ?? {};
|
|
252
|
+
const usedAliases = new Set();
|
|
253
|
+
const artifactTools = structural.map((s) => {
|
|
254
|
+
const fulfilment = emitFulfilment(s.fulfilment, options.catalog, declared, usedAliases, errors);
|
|
255
|
+
const inputSchema = withDialect(s.inputSchema);
|
|
256
|
+
// A tool's `_meta.ui` merges the widget link (`resourceUri`, when a widget targets this tool) with
|
|
257
|
+
// its declared `visibility` (`['app']` = UI-only). Emit `_meta` only when `ui` carries something.
|
|
258
|
+
const linkedUi = toolUiMetaByName.get(s.tool.name)?.ui;
|
|
259
|
+
const ui = {
|
|
260
|
+
...(linkedUi ?? {}),
|
|
261
|
+
...(s.tool.visibility ? { visibility: s.tool.visibility } : {}),
|
|
262
|
+
};
|
|
263
|
+
const meta = Object.keys(ui).length > 0 ? { ui } : undefined;
|
|
264
|
+
return {
|
|
265
|
+
name: s.tool.name,
|
|
266
|
+
description: s.tool.description,
|
|
267
|
+
inputSchema,
|
|
268
|
+
...(s.outputSchema ? { outputSchema: withDialect(s.outputSchema) } : {}),
|
|
269
|
+
fulfilment,
|
|
270
|
+
...(meta ? { _meta: meta } : {}),
|
|
271
|
+
};
|
|
272
|
+
});
|
|
273
|
+
// Emit resources/prompts. Their connector aliases also count toward `usedAliases`, so a connector
|
|
274
|
+
// referenced only by a resource/prompt is not falsely flagged as unused.
|
|
275
|
+
const artifactResources = structResources.map((s) => {
|
|
276
|
+
const fulfilment = emitFulfilment(s.fulfilment, options.catalog, declared, usedAliases, errors);
|
|
277
|
+
return {
|
|
278
|
+
name: s.resource.name,
|
|
279
|
+
uri: s.resource.uri,
|
|
280
|
+
...(s.resource.title ? { title: s.resource.title } : {}),
|
|
281
|
+
...(s.resource.description ? { description: s.resource.description } : {}),
|
|
282
|
+
...(s.resource.mimeType ? { mimeType: s.resource.mimeType } : {}),
|
|
283
|
+
isTemplate: s.isTemplate,
|
|
284
|
+
...(s.variables.length > 0 ? { variables: s.variables } : {}),
|
|
285
|
+
fulfilment,
|
|
286
|
+
};
|
|
287
|
+
});
|
|
288
|
+
const artifactPrompts = structPrompts.map((s) => {
|
|
289
|
+
const fulfilment = emitFulfilment(s.fulfilment, options.catalog, declared, usedAliases, errors);
|
|
290
|
+
const args = s.prompt.arguments?.map((a) => ({
|
|
291
|
+
name: a.name,
|
|
292
|
+
...(a.description !== undefined ? { description: a.description } : {}),
|
|
293
|
+
...(a.required !== undefined ? { required: a.required } : {}),
|
|
294
|
+
}));
|
|
295
|
+
return {
|
|
296
|
+
name: s.prompt.name,
|
|
297
|
+
...(s.prompt.title ? { title: s.prompt.title } : {}),
|
|
298
|
+
...(s.prompt.description ? { description: s.prompt.description } : {}),
|
|
299
|
+
...(args ? { arguments: args } : {}),
|
|
300
|
+
fulfilment,
|
|
301
|
+
};
|
|
302
|
+
});
|
|
303
|
+
// Reject connector aliases that are declared but never referenced (docs/SPEC.md line 166).
|
|
304
|
+
if (options.catalog) {
|
|
305
|
+
for (const alias of Object.keys(declared)) {
|
|
306
|
+
if (!usedAliases.has(alias)) {
|
|
307
|
+
errors.push({
|
|
308
|
+
code: 'unused_connector_alias',
|
|
309
|
+
path: `connectors.${alias}`,
|
|
310
|
+
message: `connector alias "${alias}" is declared but never used`,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (errors.length > 0) {
|
|
316
|
+
return { ok: false, errors };
|
|
317
|
+
}
|
|
318
|
+
// Widget `ui://` resources are appended after the hand-declared resources; both share the resources
|
|
319
|
+
// surface (resources/list + resources/read), so widgets are served by the existing wire path.
|
|
320
|
+
const allResources = [...artifactResources, ...widgetResources];
|
|
321
|
+
// 4. Assemble the artifact. `resources`/`prompts` and their capability lists are emitted only when
|
|
322
|
+
// present, keeping a tools-only artifact byte-identical to before this slice.
|
|
323
|
+
const capabilities = {
|
|
324
|
+
tools: manifest.tools.map((tool) => tool.name),
|
|
325
|
+
...(allResources.length > 0 ? { resources: allResources.map((r) => r.name) } : {}),
|
|
326
|
+
...(artifactPrompts.length > 0 ? { prompts: artifactPrompts.map((p) => p.name) } : {}),
|
|
327
|
+
};
|
|
328
|
+
const artifact = {
|
|
329
|
+
artifactSchemaVersion: ARTIFACT_SCHEMA_VERSION,
|
|
330
|
+
resolution: options.catalog ? 'resolved' : 'shape-only',
|
|
331
|
+
source: { manifestName: manifest.server.name, manifestVersion: manifest.server.version },
|
|
332
|
+
server: {
|
|
333
|
+
name: manifest.server.name,
|
|
334
|
+
version: manifest.server.version,
|
|
335
|
+
title: manifest.server.title,
|
|
336
|
+
},
|
|
337
|
+
tools: artifactTools,
|
|
338
|
+
...(allResources.length > 0 ? { resources: allResources } : {}),
|
|
339
|
+
...(artifactPrompts.length > 0 ? { prompts: artifactPrompts } : {}),
|
|
340
|
+
capabilities,
|
|
341
|
+
};
|
|
342
|
+
return { ok: true, artifact };
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Parse a fulfilment into a {@link StructFulfilment} with all `${...}` expressions resolved to AST and
|
|
346
|
+
* all step references validated. `prefix` is the dotted path of the fulfilment (e.g.
|
|
347
|
+
* `tools.0.fulfilment`). A steps-less flow (pure `output`, no connector call) is valid — a static
|
|
348
|
+
* resource/prompt or a pure-computation tool — but a flow still needs an `output`. Returns `null` (after
|
|
349
|
+
* recording an error) when the fulfilment is structurally invalid.
|
|
350
|
+
*/
|
|
351
|
+
function parseFulfilment(raw, prefix, schemasMap, errors) {
|
|
352
|
+
const hasUse = raw.use !== undefined;
|
|
353
|
+
const hasSteps = raw.steps !== undefined;
|
|
354
|
+
if (hasUse === hasSteps) {
|
|
355
|
+
errors.push({
|
|
356
|
+
code: 'invalid_fulfilment',
|
|
357
|
+
path: prefix,
|
|
358
|
+
message: 'fulfilment must have exactly one of "use" (single operation) or "steps" (flow)',
|
|
359
|
+
});
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
if (hasUse) {
|
|
363
|
+
if (raw.output !== undefined) {
|
|
364
|
+
errors.push({
|
|
365
|
+
code: 'invalid_fulfilment',
|
|
366
|
+
path: `${prefix}.output`,
|
|
367
|
+
message: '"output" is only valid in a flow ("steps")',
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
const op = parseOp(raw.use, raw.args, prefix, NO_STEPS, errors);
|
|
371
|
+
return op ? { kind: 'operation', op } : null;
|
|
372
|
+
}
|
|
373
|
+
// Flow.
|
|
374
|
+
const steps = raw.steps;
|
|
375
|
+
if (raw.args !== undefined) {
|
|
376
|
+
errors.push({
|
|
377
|
+
code: 'invalid_fulfilment',
|
|
378
|
+
path: `${prefix}.args`,
|
|
379
|
+
message: '"args" is only valid on a single operation or a step, not on a flow',
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
if (raw.output === undefined) {
|
|
383
|
+
errors.push({
|
|
384
|
+
code: 'invalid_fulfilment',
|
|
385
|
+
path: `${prefix}.output`,
|
|
386
|
+
message: 'a flow needs an "output" mapping',
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
// First pass: step ids + duplicate detection.
|
|
390
|
+
const stepIndexById = new Map();
|
|
391
|
+
steps.forEach((step, m) => {
|
|
392
|
+
if (stepIndexById.has(step.id)) {
|
|
393
|
+
errors.push({
|
|
394
|
+
code: 'duplicate_step_id',
|
|
395
|
+
path: `${prefix}.steps.${m}.id`,
|
|
396
|
+
message: `duplicate step id "${step.id}"`,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
stepIndexById.set(step.id, m);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
// Second pass: parse each step with reference checks against earlier steps.
|
|
404
|
+
const structSteps = [];
|
|
405
|
+
steps.forEach((step, m) => {
|
|
406
|
+
const parsed = parseStep(step, `${prefix}.steps.${m}`, { stepIndexById, currentIdx: m }, schemasMap, errors);
|
|
407
|
+
if (parsed)
|
|
408
|
+
structSteps.push(parsed);
|
|
409
|
+
});
|
|
410
|
+
// Output mapping runs after all steps, so any declared step is in scope.
|
|
411
|
+
const output = parseExprMap(raw.output, `${prefix}.output`, { stepIndexById, currentIdx: null }, errors);
|
|
412
|
+
return { kind: 'flow', steps: structSteps, output };
|
|
413
|
+
}
|
|
414
|
+
/** Parse a single operation occurrence: its operation reference and its parsed argument expressions. */
|
|
415
|
+
function parseOp(use, rawArgs, path, ctx, errors) {
|
|
416
|
+
const ref = parseOperationRef(use);
|
|
417
|
+
if (!ref) {
|
|
418
|
+
errors.push({
|
|
419
|
+
code: 'invalid_operation_ref',
|
|
420
|
+
path: `${path}.use`,
|
|
421
|
+
message: `invalid operation reference "${use}"; expected <connector>.<operation>`,
|
|
422
|
+
});
|
|
423
|
+
return null;
|
|
424
|
+
}
|
|
425
|
+
const args = parseExprMap(rawArgs, `${path}.args`, ctx, errors);
|
|
426
|
+
return { connectorAlias: ref.connector, operation: ref.operation, args, path };
|
|
427
|
+
}
|
|
428
|
+
/** Parse a flow step, enforcing exactly one verb (`use`/`map`/`elicit`) and parsing its expressions. */
|
|
429
|
+
function parseStep(step, path, ctx, schemasMap, errors) {
|
|
430
|
+
const verbs = [step.use !== undefined, step.map !== undefined, step.elicit !== undefined].filter(Boolean).length;
|
|
431
|
+
if (verbs !== 1) {
|
|
432
|
+
errors.push({
|
|
433
|
+
code: 'invalid_fulfilment',
|
|
434
|
+
path,
|
|
435
|
+
message: 'a step must have exactly one of "use", "map", or "elicit"',
|
|
436
|
+
});
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
if (step.args !== undefined && step.use === undefined) {
|
|
440
|
+
errors.push({
|
|
441
|
+
code: 'invalid_fulfilment',
|
|
442
|
+
path: `${path}.args`,
|
|
443
|
+
message: '"args" is only valid on an operation ("use") step',
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
let cond;
|
|
447
|
+
if (step.if !== undefined) {
|
|
448
|
+
const parsed = parseCondition(step.if, `${path}.if`);
|
|
449
|
+
errors.push(...parsed.errors);
|
|
450
|
+
validateRefs(parsed.node, `${path}.if`, ctx, errors);
|
|
451
|
+
cond = parsed.node;
|
|
452
|
+
}
|
|
453
|
+
if (step.use !== undefined) {
|
|
454
|
+
const op = parseOp(step.use, step.args, path, ctx, errors);
|
|
455
|
+
if (!op)
|
|
456
|
+
return null;
|
|
457
|
+
return { id: step.id, kind: 'operation', ...(cond ? { cond } : {}), op };
|
|
458
|
+
}
|
|
459
|
+
if (step.map !== undefined) {
|
|
460
|
+
const value = parseExprMap(step.map, `${path}.map`, ctx, errors);
|
|
461
|
+
return { id: step.id, kind: 'map', ...(cond ? { cond } : {}), value };
|
|
462
|
+
}
|
|
463
|
+
// elicit: resolve its requested-input schema through the standard schema pipeline.
|
|
464
|
+
const resolved = resolveSchemaUses(step.elicit, schemasMap, `${path}.elicit`);
|
|
465
|
+
errors.push(...resolved.errors);
|
|
466
|
+
const ext = findExternalRef(resolved.schema, `${path}.elicit`);
|
|
467
|
+
if (ext)
|
|
468
|
+
errors.push(ext);
|
|
469
|
+
return { id: step.id, kind: 'elicit', ...(cond ? { cond } : {}), schema: resolved.schema };
|
|
470
|
+
}
|
|
471
|
+
/** Parse an `args`/`map`/`output` map of raw values into expression nodes and validate step refs. */
|
|
472
|
+
function parseExprMap(raw, pathPrefix, ctx, errors) {
|
|
473
|
+
const out = {};
|
|
474
|
+
for (const [key, value] of Object.entries(raw ?? {})) {
|
|
475
|
+
const path = `${pathPrefix}.${key}`;
|
|
476
|
+
const { node, errors: e } = parseValue(value, path);
|
|
477
|
+
errors.push(...e);
|
|
478
|
+
validateRefs(node, path, ctx, errors);
|
|
479
|
+
out[key] = node;
|
|
480
|
+
}
|
|
481
|
+
return out;
|
|
482
|
+
}
|
|
483
|
+
/** Validate every `${steps.<id>}` reference in a node against declared step order. */
|
|
484
|
+
function validateRefs(node, path, ctx, errors) {
|
|
485
|
+
for (const p of collectPaths(node)) {
|
|
486
|
+
if (p.root !== 'steps')
|
|
487
|
+
continue;
|
|
488
|
+
const first = p.segments[0];
|
|
489
|
+
if (first?.kind !== 'prop') {
|
|
490
|
+
errors.push({
|
|
491
|
+
code: 'unknown_step_ref',
|
|
492
|
+
path,
|
|
493
|
+
message: 'a "steps" reference must name a step (`${steps.<id>...}`)',
|
|
494
|
+
});
|
|
495
|
+
continue;
|
|
496
|
+
}
|
|
497
|
+
const id = first.name;
|
|
498
|
+
const idx = ctx.stepIndexById.get(id);
|
|
499
|
+
if (idx === undefined) {
|
|
500
|
+
errors.push({ code: 'unknown_step_ref', path, message: `unknown step "${id}"` });
|
|
501
|
+
}
|
|
502
|
+
else if (ctx.currentIdx !== null) {
|
|
503
|
+
if (idx === ctx.currentIdx) {
|
|
504
|
+
errors.push({ code: 'self_step_ref', path, message: `step "${id}" references itself` });
|
|
505
|
+
}
|
|
506
|
+
else if (idx > ctx.currentIdx) {
|
|
507
|
+
errors.push({
|
|
508
|
+
code: 'forward_step_ref',
|
|
509
|
+
path,
|
|
510
|
+
message: `step "${id}" is referenced before it runs`,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
// ─── Connector resolution + emit ───────────────────────────────────────────────
|
|
517
|
+
/** Build the artifact fulfilment, resolving each operation occurrence against the catalog (if any). */
|
|
518
|
+
function emitFulfilment(struct, catalog, declared, usedAliases, errors) {
|
|
519
|
+
if (struct.kind === 'operation') {
|
|
520
|
+
const operationRef = resolveOp(struct.op, catalog, declared, usedAliases, errors);
|
|
521
|
+
return { kind: 'operation', operationRef, args: struct.op.args };
|
|
522
|
+
}
|
|
523
|
+
const steps = struct.steps.map((s) => {
|
|
524
|
+
const cond = s.cond ? { if: s.cond } : {};
|
|
525
|
+
if (s.kind === 'operation') {
|
|
526
|
+
const operationRef = resolveOp(s.op, catalog, declared, usedAliases, errors);
|
|
527
|
+
return { id: s.id, kind: 'operation', ...cond, operationRef, args: s.op.args };
|
|
528
|
+
}
|
|
529
|
+
if (s.kind === 'map') {
|
|
530
|
+
return { id: s.id, kind: 'map', ...cond, value: s.value };
|
|
531
|
+
}
|
|
532
|
+
return { id: s.id, kind: 'elicit', ...cond, schema: withDialect(s.schema) };
|
|
533
|
+
});
|
|
534
|
+
return { kind: 'flow', steps, output: struct.output };
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Resolve one operation occurrence against the catalog (docs/SPEC.md "Runtime Invariants"). Without a
|
|
538
|
+
* catalog, returns an unresolved reference (shape-only). Pushes a CompileError per failure.
|
|
539
|
+
*/
|
|
540
|
+
function resolveOp(op, catalog, declared, usedAliases, errors) {
|
|
541
|
+
const unresolved = {
|
|
542
|
+
connector: op.connectorAlias,
|
|
543
|
+
operation: op.operation,
|
|
544
|
+
resolved: false,
|
|
545
|
+
};
|
|
546
|
+
if (!catalog)
|
|
547
|
+
return unresolved;
|
|
548
|
+
usedAliases.add(op.connectorAlias);
|
|
549
|
+
const connectorRef = declared[op.connectorAlias];
|
|
550
|
+
if (!connectorRef) {
|
|
551
|
+
errors.push({
|
|
552
|
+
code: 'unknown_connector_alias',
|
|
553
|
+
path: `${op.path}.use`,
|
|
554
|
+
message: `connector alias "${op.connectorAlias}" is not declared in the "connectors" block`,
|
|
555
|
+
got: op.connectorAlias,
|
|
556
|
+
...suggestionFields('unknown_connector_alias', op.connectorAlias, Object.keys(declared)),
|
|
557
|
+
});
|
|
558
|
+
return unresolved;
|
|
559
|
+
}
|
|
560
|
+
const connector = catalog.get(connectorRef.id, connectorRef.version);
|
|
561
|
+
if (!connector) {
|
|
562
|
+
errors.push({
|
|
563
|
+
code: 'connector_not_in_catalog',
|
|
564
|
+
path: `connectors.${op.connectorAlias}`,
|
|
565
|
+
message: `connector "${connectorRef.id}" version "${connectorRef.version}" is not in the catalog`,
|
|
566
|
+
expected: `a catalog entry for connector "${connectorRef.id}" version "${connectorRef.version}"`,
|
|
567
|
+
got: `${connectorRef.id}@${connectorRef.version}`,
|
|
568
|
+
docAnchor: docAnchorFor('connector_not_in_catalog'),
|
|
569
|
+
});
|
|
570
|
+
return unresolved;
|
|
571
|
+
}
|
|
572
|
+
const operation = connector.operations[op.operation];
|
|
573
|
+
if (!operation) {
|
|
574
|
+
errors.push({
|
|
575
|
+
code: 'unknown_operation',
|
|
576
|
+
path: `${op.path}.use`,
|
|
577
|
+
message: `operation "${op.operation}" does not exist on connector "${connector.id}" version "${connector.version}"`,
|
|
578
|
+
got: op.operation,
|
|
579
|
+
...suggestionFields('unknown_operation', op.operation, Object.keys(connector.operations)),
|
|
580
|
+
});
|
|
581
|
+
return unresolved;
|
|
582
|
+
}
|
|
583
|
+
checkArgs(op.args, connector, op.operation, operation, `${op.path}.args`, errors);
|
|
584
|
+
return {
|
|
585
|
+
alias: op.connectorAlias,
|
|
586
|
+
connectorId: connector.id,
|
|
587
|
+
connectorVersion: connector.version,
|
|
588
|
+
operation: op.operation,
|
|
589
|
+
signatureHash: computeSignatureHash(op.operation, operation),
|
|
590
|
+
resolved: true,
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Check parsed `args` against an operation's input signature (docs/SPEC.md line 165): reject argument
|
|
595
|
+
* keys the operation does not accept, require every required input field, and — where statically
|
|
596
|
+
* possible — reject a literal/template value whose primitive type does not match the field. Argument
|
|
597
|
+
* *path* expressions are not type-inferred here (deferred to a later slice).
|
|
598
|
+
*/
|
|
599
|
+
function checkArgs(args, connector, opName, operation, argsPathPrefix, errors) {
|
|
600
|
+
for (const [key, node] of Object.entries(args)) {
|
|
601
|
+
const field = operation.input[key];
|
|
602
|
+
if (!field) {
|
|
603
|
+
errors.push({
|
|
604
|
+
code: 'arg_mismatch',
|
|
605
|
+
path: `${argsPathPrefix}.${key}`,
|
|
606
|
+
message: `operation "${connector.id}.${opName}" does not accept argument "${key}"`,
|
|
607
|
+
});
|
|
608
|
+
continue;
|
|
609
|
+
}
|
|
610
|
+
const got = primitiveType(node);
|
|
611
|
+
if (got && !typeMatches(node, got, field.type)) {
|
|
612
|
+
errors.push({
|
|
613
|
+
code: 'arg_type_mismatch',
|
|
614
|
+
path: `${argsPathPrefix}.${key}`,
|
|
615
|
+
message: `argument "${key}" expects ${field.type} but got ${got}`,
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
for (const [field, spec] of Object.entries(operation.input)) {
|
|
620
|
+
if (spec.required && !(field in args)) {
|
|
621
|
+
errors.push({
|
|
622
|
+
code: 'arg_mismatch',
|
|
623
|
+
path: `${argsPathPrefix}.${field}`,
|
|
624
|
+
message: `operation "${connector.id}.${opName}" requires argument "${field}"`,
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
/** The statically-known primitive type of a value node, or `null` when it cannot be determined. */
|
|
630
|
+
function primitiveType(node) {
|
|
631
|
+
if (node.kind === 'template')
|
|
632
|
+
return 'string';
|
|
633
|
+
if (node.kind === 'literal') {
|
|
634
|
+
if (typeof node.value === 'string')
|
|
635
|
+
return 'string';
|
|
636
|
+
if (typeof node.value === 'number')
|
|
637
|
+
return 'number';
|
|
638
|
+
if (typeof node.value === 'boolean')
|
|
639
|
+
return 'boolean';
|
|
640
|
+
}
|
|
641
|
+
return null; // path (deferred inference) or literal null (nullable)
|
|
642
|
+
}
|
|
643
|
+
/** Whether a known primitive type satisfies a JSON Schema field type. */
|
|
644
|
+
function typeMatches(node, got, fieldType) {
|
|
645
|
+
if (got === 'number') {
|
|
646
|
+
if (fieldType === 'integer') {
|
|
647
|
+
return (node.kind === 'literal' && typeof node.value === 'number' && Number.isInteger(node.value));
|
|
648
|
+
}
|
|
649
|
+
return fieldType === 'number';
|
|
650
|
+
}
|
|
651
|
+
return got === fieldType;
|
|
652
|
+
}
|
|
653
|
+
/** Map a Zod issue to a CompileError, deriving a stable error code from its path. */
|
|
654
|
+
function translateIssue(issue) {
|
|
655
|
+
const path = issue.path.map(String).join('.');
|
|
656
|
+
const leaf = issue.path.length > 0 ? String(issue.path[issue.path.length - 1]) : '';
|
|
657
|
+
let code = 'invalid_shape';
|
|
658
|
+
if (path === 'manifestVersion')
|
|
659
|
+
code = 'unsupported_manifest_version';
|
|
660
|
+
else if (leaf === 'name')
|
|
661
|
+
code = 'invalid_name';
|
|
662
|
+
return { code, path, message: issue.message };
|
|
663
|
+
}
|
|
664
|
+
/** Ensure an emitted tool schema advertises the JSON Schema 2020-12 dialect. */
|
|
665
|
+
function withDialect(schema) {
|
|
666
|
+
if (typeof schema.$schema === 'string')
|
|
667
|
+
return schema;
|
|
668
|
+
return { $schema: JSON_SCHEMA_2020_12, ...schema };
|
|
669
|
+
}
|
|
670
|
+
/** The canonical `ui://` URI for a widget: `ui://<server>/<widget>` (a fixed, non-template resource). */
|
|
671
|
+
function widgetUri(serverName, widgetName) {
|
|
672
|
+
return `ui://${serverName}/${widgetName}`;
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* The widget UI resource's `_meta.ui` value — its host-enforced CSP/permission metadata — or `undefined`
|
|
676
|
+
* when the widget declares neither, so a metadata-free widget stays `_meta`-free on the wire.
|
|
677
|
+
*/
|
|
678
|
+
function resourceUiMeta(widget) {
|
|
679
|
+
const csp = widget.csp;
|
|
680
|
+
const hasCsp = csp !== undefined && Object.values(csp).some((v) => v !== undefined);
|
|
681
|
+
const permissions = widget.permissions;
|
|
682
|
+
const hasPermissions = permissions !== undefined && Object.keys(permissions).length > 0;
|
|
683
|
+
if (!hasCsp && !hasPermissions)
|
|
684
|
+
return undefined;
|
|
685
|
+
return {
|
|
686
|
+
...(csp && hasCsp ? { csp } : {}),
|
|
687
|
+
...(permissions && hasPermissions ? { permissions } : {}),
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Recursively scan an authored JSON Schema for an external `$ref` (any `$ref` that is not a local
|
|
692
|
+
* `#`-fragment). External refs are rejected per docs/SPEC.md "Schemas". Returns the first one found.
|
|
693
|
+
*/
|
|
694
|
+
function findExternalRef(value, path) {
|
|
695
|
+
if (Array.isArray(value)) {
|
|
696
|
+
for (let i = 0; i < value.length; i++) {
|
|
697
|
+
const found = findExternalRef(value[i], `${path}.${i}`);
|
|
698
|
+
if (found)
|
|
699
|
+
return found;
|
|
700
|
+
}
|
|
701
|
+
return null;
|
|
702
|
+
}
|
|
703
|
+
if (value !== null && typeof value === 'object') {
|
|
704
|
+
for (const [key, val] of Object.entries(value)) {
|
|
705
|
+
if (key === '$ref' && typeof val === 'string' && !val.startsWith('#')) {
|
|
706
|
+
return {
|
|
707
|
+
code: 'external_ref',
|
|
708
|
+
path: `${path}.$ref`,
|
|
709
|
+
message: `external $ref "${val}" is not allowed; use $use or a local "#/" reference`,
|
|
710
|
+
};
|
|
711
|
+
}
|
|
712
|
+
const found = findExternalRef(val, `${path}.${key}`);
|
|
713
|
+
if (found)
|
|
714
|
+
return found;
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
return null;
|
|
718
|
+
}
|
|
719
|
+
//# sourceMappingURL=compile.js.map
|