@intentius/chant 0.124.12 → 0.124.14
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/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +36 -6
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +5 -30
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam between core and whatever answers its request (#2357),
|
|
3
|
+
* on the contract's transport (#2373, decided in #2359).
|
|
4
|
+
*
|
|
5
|
+
* `packages/core/src/behaviour.ts` says what a prediction may mean, how an
|
|
6
|
+
* absent engine must refuse, and — since #2359 — how a request reaches an
|
|
7
|
+
* engine: a `BehaviourTransport` carries the rendered request and brings back
|
|
8
|
+
* the engine's text or a finished refusal. This file adds what is core's on
|
|
9
|
+
* top of that and nothing more: the parse of a `behaviour/v1` answer, a command
|
|
10
|
+
* transport for an address that is a program on `PATH`, and the chooser that
|
|
11
|
+
* turns an address into one transport or the other.
|
|
12
|
+
*
|
|
13
|
+
* {@link BehaviourEngine} is what `./predict-behaviour.ts` talks to. It is
|
|
14
|
+
* one level above the transport — request in, parsed answer or refusal out —
|
|
15
|
+
* so the fixture engine in `__fixtures__` can be one without pretending to be
|
|
16
|
+
* a wire, and so `predict-behaviour.ts` never sees a byte. {@link
|
|
17
|
+
* transportEngine} is the only bridge between the two levels.
|
|
18
|
+
*
|
|
19
|
+
* ## The two transports
|
|
20
|
+
*
|
|
21
|
+
* A **URL** is dialled by core's `httpBehaviourTransport`
|
|
22
|
+
* (`packages/core/src/behaviour-http.ts`): `POST`, a bearer token from
|
|
23
|
+
* `CHANT_BEHAVIOUR_TOKEN` → `BEHAVIOUR_TOKEN`,
|
|
24
|
+
* and the status mapping the contract fixes. Nothing about that is core's,
|
|
25
|
+
* which is why it does not live here.
|
|
26
|
+
*
|
|
27
|
+
* A **command on PATH** is {@link commandTransport}, below: request on stdin,
|
|
28
|
+
* answer on stdout, no shell — a shell would make the address a
|
|
29
|
+
* code-execution surface for whatever set the variable. The child gets
|
|
30
|
+
* `behaviourEngineChildEnvironment()` and nothing else, for the reason given
|
|
31
|
+
* on that function: the request-side screen cannot see an inherited
|
|
32
|
+
* `process.env`. An engine that answered and still refused says so on stderr,
|
|
33
|
+
* and the words it uses pick the cause.
|
|
34
|
+
*
|
|
35
|
+
* ## A malformed answer is unreachable, not a report with holes
|
|
36
|
+
*
|
|
37
|
+
* Taking the fields that parsed and reporting the rest unpredicted would turn
|
|
38
|
+
* an engine emitting garbage into an estate that looks partly free — the
|
|
39
|
+
* failure the refusal arm exists to prevent, one level down. So the parse
|
|
40
|
+
* refuses whole, with a detail naming the entity and the field.
|
|
41
|
+
*
|
|
42
|
+
* With one exception, and it is the same rule the command transport applies
|
|
43
|
+
* to stderr: an engine that took the request, answered `200`, and wrote
|
|
44
|
+
* `{"error": "out of credit"}` has refused for a reason a status never
|
|
45
|
+
* carried. {@link transportEngine} reads that body's words after the parse
|
|
46
|
+
* has failed and never before, so an answer that priced the estate and
|
|
47
|
+
* declined one node "rate limit reached for this region" stays the report it
|
|
48
|
+
* is. Both transports reach the same three causes; only the evidence differs.
|
|
49
|
+
*/
|
|
50
|
+
import { execFile } from "node:child_process";
|
|
51
|
+
import { behaviourEngineChildEnvironment, behaviourWireRefusal, isBehaviourBasis, isResilienceVerdict, unreachableBehaviourEngineRefusal, } from "./behaviour.js";
|
|
52
|
+
import { httpBehaviourTransport, isHttpBehaviourAddress } from "./behaviour-http.js";
|
|
53
|
+
import { renderEngineRequest } from "./behaviour-request.js";
|
|
54
|
+
/**
|
|
55
|
+
* The name a refusal is built under.
|
|
56
|
+
*
|
|
57
|
+
* It was the predicting lexicon's name while a lexicon predicted. Core
|
|
58
|
+
* predicts for the whole project since #2382, so there is no lexicon to scope
|
|
59
|
+
* the variable chain by: the chain is the chant-wide one, and this is the word
|
|
60
|
+
* a message uses for the thing that refused.
|
|
61
|
+
*/
|
|
62
|
+
export const BEHAVIOUR_SCOPE = "chant";
|
|
63
|
+
/**
|
|
64
|
+
* A {@link BehaviourEngine} over a contract transport: render the request
|
|
65
|
+
* canonically, send it, parse what came back. The one bridge between the
|
|
66
|
+
* transport level and the engine level, so the parse runs on every wire and
|
|
67
|
+
* no transport gets its own.
|
|
68
|
+
*/
|
|
69
|
+
export function transportEngine(transport, endpoint) {
|
|
70
|
+
return {
|
|
71
|
+
async predict(request) {
|
|
72
|
+
const sent = await transport.send(renderEngineRequest(request));
|
|
73
|
+
if (!sent.ok)
|
|
74
|
+
return { ok: false, refusal: sent.refusal };
|
|
75
|
+
const parsed = parseEngineAnswer(sent.body);
|
|
76
|
+
if (!parsed.ok) {
|
|
77
|
+
// An engine that answers 200 with an error envelope is a real shape,
|
|
78
|
+
// and its own words are the only thing that says which refusal it is.
|
|
79
|
+
// Read after the parse and never before: an answer that priced the
|
|
80
|
+
// estate and declined one node "rate limit reached for this region"
|
|
81
|
+
// parses, and a vocabulary check running first would turn a report
|
|
82
|
+
// about the other nodes into an over-quota refusal about none.
|
|
83
|
+
const said = causeFromEngineWords(sent.body);
|
|
84
|
+
if (said) {
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
refusal: behaviourWireRefusal(BEHAVIOUR_SCOPE, endpoint, said, `the engine answered ${firstLine(sent.body)}`),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return { ok: false, refusal: unreachableBehaviourEngineRefusal(BEHAVIOUR_SCOPE, endpoint, parsed.detail) };
|
|
91
|
+
}
|
|
92
|
+
return { ok: true, answer: parsed.answer };
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** How long a command engine is given before it is treated as unreachable. */
|
|
97
|
+
const COMMAND_TIMEOUT_MS = 30000;
|
|
98
|
+
/** How much stdout is read before the answer is treated as malformed. */
|
|
99
|
+
const COMMAND_MAX_BUFFER = 8 * 1024 * 1024;
|
|
100
|
+
/**
|
|
101
|
+
* A `command on PATH` address, run as a subprocess: the contract's
|
|
102
|
+
* `BehaviourTransport` for the third kind of address it names.
|
|
103
|
+
*
|
|
104
|
+
* The address is split on whitespace into a program and its arguments, which
|
|
105
|
+
* is the shape `CHANT_BEHAVIOUR_ENGINE="my-engine --model tiny"` produces.
|
|
106
|
+
* No shell: a shell would make the address a code-execution surface for
|
|
107
|
+
* whatever set the variable, and every argument the address needs can be
|
|
108
|
+
* written without one.
|
|
109
|
+
*/
|
|
110
|
+
export function commandTransport(endpoint) {
|
|
111
|
+
const [program, ...args] = endpoint.value.trim().split(/\s+/);
|
|
112
|
+
return {
|
|
113
|
+
async send(body) {
|
|
114
|
+
const raw = await new Promise((resolve) => {
|
|
115
|
+
const child = execFile(program, args, {
|
|
116
|
+
timeout: COMMAND_TIMEOUT_MS,
|
|
117
|
+
maxBuffer: COMMAND_MAX_BUFFER,
|
|
118
|
+
// Not `process.env`. The contract's rule, and its reason, are on
|
|
119
|
+
// `behaviourEngineChildEnvironment`; the test below pins it.
|
|
120
|
+
env: behaviourEngineChildEnvironment(),
|
|
121
|
+
}, (error, stdout, stderr) => {
|
|
122
|
+
resolve({ stdout: String(stdout), stderr: String(stderr), ...(error ? { error } : {}) });
|
|
123
|
+
});
|
|
124
|
+
child.stdin?.end(body);
|
|
125
|
+
});
|
|
126
|
+
if (raw.error) {
|
|
127
|
+
return {
|
|
128
|
+
ok: false,
|
|
129
|
+
refusal: behaviourWireRefusal(BEHAVIOUR_SCOPE, endpoint, causeFromEngineWords(raw.stderr) ?? "engine-unreachable", firstLine(raw.stderr) || raw.error.message),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return { ok: true, body: raw.stdout };
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** {@link commandTransport}, bridged to the engine level. */
|
|
137
|
+
export function commandEngine(endpoint) {
|
|
138
|
+
return transportEngine(commandTransport(endpoint), endpoint);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* An engine that answered and still refused says so in words, and the three
|
|
142
|
+
* causes want three different actions (`behaviour.ts`'s remedy table). Matched
|
|
143
|
+
* on the words an engine would use rather than on an exit code or an HTTP
|
|
144
|
+
* status, because the contract fixes no exit codes, inventing some would bind
|
|
145
|
+
* every future engine to this file, and a status is only available on one of
|
|
146
|
+
* the two transports anyway.
|
|
147
|
+
*
|
|
148
|
+
* Both transports read it, on the text each has: a command's stderr, and an
|
|
149
|
+
* HTTP body that failed to parse as an answer. `./behaviour-http.ts` has
|
|
150
|
+
* already classified every status that carries one, so this runs on the case
|
|
151
|
+
* a status does not cover — the engine that took the request, answered 200,
|
|
152
|
+
* and put its refusal in the envelope.
|
|
153
|
+
*/
|
|
154
|
+
function causeFromEngineWords(said) {
|
|
155
|
+
const text = said.toLowerCase();
|
|
156
|
+
if (/\b(out of credit|insufficient (funds|balance)|no balance|payment required)\b/.test(text)) {
|
|
157
|
+
return "engine-out-of-credit";
|
|
158
|
+
}
|
|
159
|
+
if (/\b(over quota|quota exceeded|rate limit|too many requests|throttl)/.test(text)) {
|
|
160
|
+
return "engine-over-quota";
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
function firstLine(text) {
|
|
165
|
+
return text.split("\n").find((line) => line.trim().length > 0)?.trim() ?? "";
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Everything wrong with one figure, as readable field paths. Empty means the
|
|
169
|
+
* figure is usable.
|
|
170
|
+
*
|
|
171
|
+
* Pure and exported so the shapes an engine can get wrong are testable without
|
|
172
|
+
* a subprocess. Every check here mirrors one `validateBehaviourBlock` applies
|
|
173
|
+
* downstream (`packages/core/src/behaviour.ts`) — the difference is *when*:
|
|
174
|
+
* that one throws, and a throw is the whole-lexicon failure `lexicon.ts`
|
|
175
|
+
* reserves for a live credential. A third party emitting one bad number is not
|
|
176
|
+
* that, and reporting it as that is how an operator goes looking for a leak.
|
|
177
|
+
*/
|
|
178
|
+
export function figureProblems(name, figure) {
|
|
179
|
+
const at = (field) => `figures.${name}.${field}`;
|
|
180
|
+
if (typeof figure !== "object" || figure === null || Array.isArray(figure)) {
|
|
181
|
+
return [`${at("")} is ${Array.isArray(figure) ? "an array" : typeof figure}, not an object`];
|
|
182
|
+
}
|
|
183
|
+
const f = figure;
|
|
184
|
+
const out = [];
|
|
185
|
+
const fraction = (field, value) => {
|
|
186
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > 1) {
|
|
187
|
+
out.push(`${at(field)} is not a number in 0..1`);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
if (typeof f.perHour !== "number" || !Number.isFinite(f.perHour) || f.perHour < 0) {
|
|
191
|
+
out.push(`${at("perHour")} is not a non-negative finite number`);
|
|
192
|
+
}
|
|
193
|
+
if (typeof f.currency !== "string" || f.currency.trim().length === 0) {
|
|
194
|
+
out.push(`${at("currency")} is empty`);
|
|
195
|
+
}
|
|
196
|
+
fraction("errorRate", f.errorRate);
|
|
197
|
+
const headroom = f.headroom;
|
|
198
|
+
if (typeof headroom !== "object" || headroom === null || Array.isArray(headroom)) {
|
|
199
|
+
out.push(`${at("headroom")} is missing`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
const h = headroom;
|
|
203
|
+
// At least one axis, and an axis the engine did not model must be absent
|
|
204
|
+
// rather than zero — zero headroom means saturated, the opposite claim.
|
|
205
|
+
if (h.cpu === undefined && h.latency === undefined) {
|
|
206
|
+
out.push(`${at("headroom")} carries neither cpu nor latency`);
|
|
207
|
+
}
|
|
208
|
+
for (const axis of ["cpu", "latency"]) {
|
|
209
|
+
if (h[axis] !== undefined)
|
|
210
|
+
fraction(`headroom.${axis}`, h[axis]);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const resilience = f.resilience;
|
|
214
|
+
if (typeof resilience !== "object" || resilience === null || Array.isArray(resilience)) {
|
|
215
|
+
out.push(`${at("resilience")} is missing`);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
const r = resilience;
|
|
219
|
+
if (typeof r.failure !== "string" || r.failure.trim().length === 0) {
|
|
220
|
+
out.push(`${at("resilience.failure")} names no failure`);
|
|
221
|
+
}
|
|
222
|
+
if (!isResilienceVerdict(r.verdict)) {
|
|
223
|
+
out.push(`${at("resilience.verdict")} is not survives/degrades/fails`);
|
|
224
|
+
}
|
|
225
|
+
if (r.note !== undefined && typeof r.note !== "string") {
|
|
226
|
+
out.push(`${at("resilience.note")} is not a string`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const rightSize = f.rightSize;
|
|
230
|
+
if (rightSize !== undefined) {
|
|
231
|
+
if (typeof rightSize !== "object" || rightSize === null || Array.isArray(rightSize)) {
|
|
232
|
+
out.push(`${at("rightSize")} is not an object`);
|
|
233
|
+
}
|
|
234
|
+
else if (typeof rightSize.suggestion !== "string") {
|
|
235
|
+
out.push(`${at("rightSize.suggestion")} is missing`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return out;
|
|
239
|
+
}
|
|
240
|
+
/** One malformed verdict, with the detail the refusal will scrub and print. */
|
|
241
|
+
function malformed(detail) {
|
|
242
|
+
return { ok: false, detail };
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Parse an engine's text into an {@link EngineAnswer}.
|
|
246
|
+
*
|
|
247
|
+
* A malformed answer is `engine-unreachable` and not a report full of holes.
|
|
248
|
+
* The alternative — taking the fields that parsed and reporting the rest as
|
|
249
|
+
* unpredicted — would turn an engine emitting garbage into an estate that
|
|
250
|
+
* looks partially free, which is the failure the refusal arm exists to
|
|
251
|
+
* prevent, one level down.
|
|
252
|
+
*
|
|
253
|
+
* **Every figure is validated here, not only the envelope.** The first version
|
|
254
|
+
* of this function checked `engine`/`version`/`tolerance`/`basis` and that
|
|
255
|
+
* `figures` was an object, and then handed each figure's contents straight to
|
|
256
|
+
* `block()` in `./predict-behaviour.ts`, which dereferenced
|
|
257
|
+
* `figure.resilience.failure`. Seven malformed shapes were executed against
|
|
258
|
+
* it and all seven threw: three as bare `TypeError`s with no chant message,
|
|
259
|
+
* four through `validateBehaviourBlock` after the fact. A throw is the
|
|
260
|
+
* whole-lexicon failure `lexicon.ts` reserves for a live credential in the
|
|
261
|
+
* request, so a third-party engine emitting one bad number was indistinguishable
|
|
262
|
+
* from a leak — and the doc above claimed the opposite was happening.
|
|
263
|
+
*
|
|
264
|
+
* The detail names the entity and the field, because "the engine sent
|
|
265
|
+
* something wrong" is not a thing anybody can act on and "figures.web.headroom
|
|
266
|
+
* carries neither cpu nor latency" is. It flows into
|
|
267
|
+
* `unreachableBehaviourEngineRefusal`, which runs it through
|
|
268
|
+
* `scrubEngineDetail` and bounds it.
|
|
269
|
+
*/
|
|
270
|
+
export function parseEngineAnswer(text) {
|
|
271
|
+
let parsed;
|
|
272
|
+
try {
|
|
273
|
+
parsed = JSON.parse(text);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return malformed(`the engine wrote ${text.length} byte(s) that are not JSON`);
|
|
277
|
+
}
|
|
278
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
279
|
+
return malformed("the engine's answer is not an object");
|
|
280
|
+
}
|
|
281
|
+
const answer = parsed;
|
|
282
|
+
const missing = ["engine", "version", "tolerance"].filter((key) => typeof answer[key] !== "string" || answer[key].trim().length === 0);
|
|
283
|
+
if (missing.length > 0) {
|
|
284
|
+
return malformed(`the engine's answer states no ${missing.join(", ")}. Every figure carries provenance, so an ` +
|
|
285
|
+
"answer that cannot say who produced it is not a usable answer");
|
|
286
|
+
}
|
|
287
|
+
// A closed enum downstream, so a free-form basis is caught here rather than
|
|
288
|
+
// by a throw from `validateBehaviourBlock` after the report is half built.
|
|
289
|
+
if (!isBehaviourBasis(answer.basis)) {
|
|
290
|
+
return malformed(`the engine's answer states a basis of ${JSON.stringify(answer.basis)}, which is not ` +
|
|
291
|
+
"modeled or validated");
|
|
292
|
+
}
|
|
293
|
+
if (typeof answer.figures !== "object" || answer.figures === null || Array.isArray(answer.figures)) {
|
|
294
|
+
// `Array.isArray` explicitly: `typeof [] === "object"`, so `figures: []`
|
|
295
|
+
// parsed clean and produced a report in which every node had been lost.
|
|
296
|
+
return malformed("the engine's answer carries no figures map");
|
|
297
|
+
}
|
|
298
|
+
if (answer.total !== undefined) {
|
|
299
|
+
const total = answer.total;
|
|
300
|
+
if (typeof total !== "object" ||
|
|
301
|
+
total === null ||
|
|
302
|
+
typeof total.perHour !== "number" ||
|
|
303
|
+
!Number.isFinite(total.perHour) ||
|
|
304
|
+
total.perHour < 0 ||
|
|
305
|
+
typeof total.currency !== "string" ||
|
|
306
|
+
total.currency.trim().length === 0) {
|
|
307
|
+
return malformed("the engine's answer states a total that is not a non-negative rate in a named currency");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (answer.declined !== undefined) {
|
|
311
|
+
const declined = answer.declined;
|
|
312
|
+
if (typeof declined !== "object" || declined === null || Array.isArray(declined)) {
|
|
313
|
+
return malformed("the engine's answer carries a declined list that is not a map");
|
|
314
|
+
}
|
|
315
|
+
for (const [name, reason] of Object.entries(declined)) {
|
|
316
|
+
if (typeof reason !== "string") {
|
|
317
|
+
return malformed(`the engine declined ${name} with a reason that is not a string`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const problems = [];
|
|
322
|
+
for (const [name, figure] of Object.entries(answer.figures)) {
|
|
323
|
+
problems.push(...figureProblems(name, figure));
|
|
324
|
+
if (problems.length >= 5)
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
if (problems.length > 0) {
|
|
328
|
+
return malformed(`the engine's answer is malformed: ${problems.slice(0, 5).join("; ")}` +
|
|
329
|
+
(problems.length >= 5 ? " (and possibly more)" : ""));
|
|
330
|
+
}
|
|
331
|
+
return { ok: true, answer: answer };
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* The transport chooser, with what the HTTP transport needs injectable.
|
|
335
|
+
*
|
|
336
|
+
* A `http://` or `https://` address gets core's `httpBehaviourTransport`,
|
|
337
|
+
* with its token read from `env` — the same `env` the address was read from,
|
|
338
|
+
* so a test drives both chains from one object. A bare address gets
|
|
339
|
+
* {@link commandTransport}. Any other scheme (`grpc://`, `unix://`) gets
|
|
340
|
+
* `undefined`, and the caller refuses naming the address: no transport here
|
|
341
|
+
* speaks it, and saying so beats a guess.
|
|
342
|
+
*/
|
|
343
|
+
export function connectWith(deps = {}) {
|
|
344
|
+
return (endpoint, env) => {
|
|
345
|
+
const address = endpoint.value.trim();
|
|
346
|
+
if (address.length === 0)
|
|
347
|
+
return undefined;
|
|
348
|
+
if (isHttpBehaviourAddress(address)) {
|
|
349
|
+
return transportEngine(httpBehaviourTransport(BEHAVIOUR_SCOPE, endpoint, env, deps), endpoint);
|
|
350
|
+
}
|
|
351
|
+
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(address))
|
|
352
|
+
return undefined;
|
|
353
|
+
return commandEngine(endpoint);
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
/** The chooser the shipped plugin uses: the process's own `fetch`, the default deadline. */
|
|
357
|
+
export const defaultConnect = connectWith();
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam between a graph read and a prediction (#2377, epic #2355).
|
|
3
|
+
*
|
|
4
|
+
* `./behaviour-overlay.ts` projects a {@link BehaviourResult} onto the two
|
|
5
|
+
* channels the IR carries it on. This module is the other half: it builds the
|
|
6
|
+
* request from the graph the read already holds, and puts the projection back
|
|
7
|
+
* onto that graph. Both halves are pure, and neither calls an engine — the
|
|
8
|
+
* plugin call itself lives in `./cli/handlers/graph.ts`, which is the only
|
|
9
|
+
* place that has plugins to call.
|
|
10
|
+
*
|
|
11
|
+
* ## The request is the graph, not a second read
|
|
12
|
+
*
|
|
13
|
+
* The epic's rule is that the engine never sees credentials, and the way this
|
|
14
|
+
* path keeps that true is by never reading anything: `chant graph --live`
|
|
15
|
+
* already observed the estate, and {@link behaviourRequestFromIr} reshapes
|
|
16
|
+
* exactly those nodes and edges into the contract's options. There is no
|
|
17
|
+
* provider call here and nothing to leak, because there is no second read to
|
|
18
|
+
* leak from. `screenBehaviourRequest` (`./behaviour-predict.ts`) still screens
|
|
19
|
+
* what this produces; a node whose observed `attrs` picked up a secret is
|
|
20
|
+
* caught there, on the one path every prediction goes through.
|
|
21
|
+
*
|
|
22
|
+
* ## Why `attrs` are the props verbatim
|
|
23
|
+
*
|
|
24
|
+
* An IR node's `attrs` are what the read resolved — literals, and `{ $ref }`
|
|
25
|
+
* for a reference. The contract's `props` is the same thing, so this passes
|
|
26
|
+
* them across unchanged rather than filtering to a "useful" subset. Filtering
|
|
27
|
+
* would be chant deciding which properties can affect a price, and chant does
|
|
28
|
+
* not price anything; an engine that needs a field chant thought irrelevant
|
|
29
|
+
* would get a silently wrong figure with nothing to say so.
|
|
30
|
+
*/
|
|
31
|
+
import { BEHAVIOUR_OVERLAY_ATTR } from "./behaviour-overlay.js";
|
|
32
|
+
/**
|
|
33
|
+
* Reshape an already-read graph into `predictBehaviour`'s options.
|
|
34
|
+
*
|
|
35
|
+
* Entity identity is the node's `id` and nothing derived from it. That is the
|
|
36
|
+
* same key the drift overlay writes `_status` under and the same key
|
|
37
|
+
* {@link applyBehaviourOverlay} reads back, so in a multi-stack project where
|
|
38
|
+
* ids are `${stack}::${logicalId}`, the block lands on the node it was
|
|
39
|
+
* predicted for without this module knowing that qualification exists.
|
|
40
|
+
*/
|
|
41
|
+
export function behaviourRequestFromIr(ir, ctx) {
|
|
42
|
+
const entities = new Map();
|
|
43
|
+
for (const node of ir.nodes) {
|
|
44
|
+
entities.set(node.id, { entityType: node.kind, props: node.attrs });
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
environment: ctx.environment,
|
|
48
|
+
buildOutput: ctx.buildOutput,
|
|
49
|
+
entityNames: [...entities.keys()],
|
|
50
|
+
entities,
|
|
51
|
+
edges: ir.edges,
|
|
52
|
+
edgeCoverage: ctx.edgeCoverage,
|
|
53
|
+
from: ctx.from,
|
|
54
|
+
traffic: ctx.traffic,
|
|
55
|
+
...(ctx.stack === undefined ? {} : { stack: ctx.stack }),
|
|
56
|
+
...(ctx.region === undefined ? {} : { region: ctx.region }),
|
|
57
|
+
...(ctx.owned === undefined ? {} : { owned: ctx.owned }),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Put a projection back onto the graph: each entity's block on its node's
|
|
62
|
+
* `attrs`, the graph-level half on `ir.meta`.
|
|
63
|
+
*
|
|
64
|
+
* A node with no entry keeps the `attrs` object it already had, untouched —
|
|
65
|
+
* an unpriced entity carries no `_behaviour` key rather than an empty or
|
|
66
|
+
* zeroed one, because zero cost and "not priced" are different claims and a
|
|
67
|
+
* renderer cannot tell them apart after the fact.
|
|
68
|
+
*
|
|
69
|
+
* Returns a new graph and mutates nothing: the caller's `ir` is shared with
|
|
70
|
+
* the lens pipeline downstream, and a prediction is not allowed to be the
|
|
71
|
+
* reason a later pass sees different nodes.
|
|
72
|
+
*/
|
|
73
|
+
export function applyBehaviourOverlay(ir, overlay) {
|
|
74
|
+
const nodes = ir.nodes.map((node) => {
|
|
75
|
+
const block = overlay.attrs[node.id];
|
|
76
|
+
return block === undefined ? node : { ...node, attrs: { ...node.attrs, ...block } };
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
...ir,
|
|
80
|
+
nodes,
|
|
81
|
+
meta: { ...(ir.meta ?? {}), [BEHAVIOUR_OVERLAY_ATTR]: overlay.meta[BEHAVIOUR_OVERLAY_ATTR] },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The first engine adapter (#2359): a {@link BehaviourTransport} that dials a
|
|
3
|
+
* URL with a bearer token, and maps what the wire says onto the contract's
|
|
4
|
+
* refusals.
|
|
5
|
+
*
|
|
6
|
+
* Unnamed on purpose. Nothing here is a vendor's API; it is the shape any
|
|
7
|
+
* metered HTTP engine has — an address, an account, a request body, and four
|
|
8
|
+
* ways the account or the wire can say no — so a second engine behind the
|
|
9
|
+
* same shape is a second address and a second token, not a second adapter.
|
|
10
|
+
* What this file knows about the engine is that it accepts a JSON body by
|
|
11
|
+
* `POST`, answers with a JSON body, and uses the HTTP status the way HTTP
|
|
12
|
+
* says to: `402` for an account with nothing left on it, `429` for a limit
|
|
13
|
+
* that is spent, `401`/`403` for a token it does not accept.
|
|
14
|
+
*
|
|
15
|
+
* ## The token is on the wire and nowhere else
|
|
16
|
+
*
|
|
17
|
+
* Rule 3 of the contract — the engine is never handed a credential — is about
|
|
18
|
+
* the request body, and `screenBehaviourRequest` has already walked the body
|
|
19
|
+
* by the time a transport exists. The bearer token here is a different thing:
|
|
20
|
+
* it is how the engine knows whose account to bill, it travels in the
|
|
21
|
+
* `authorization` header, and this module is the only code that holds its
|
|
22
|
+
* value. Four things follow, and each has a test:
|
|
23
|
+
*
|
|
24
|
+
* - it is resolved from {@link behaviourTokenFrom}'s chain, never from the
|
|
25
|
+
* address chain, so no message that prints the address can print it;
|
|
26
|
+
* - it is never interpolated into a refusal, a `detail`, or an error — the
|
|
27
|
+
* variable's *name* is what a refusal carries;
|
|
28
|
+
* - whatever the engine writes back is passed through {@link concealing}
|
|
29
|
+
* before it becomes a `detail`, because an engine that echoes its request
|
|
30
|
+
* headers into an error page would otherwise put the token in a
|
|
31
|
+
* merge-request comment (#2358 posts refusals publicly);
|
|
32
|
+
* - the request is sent with `redirect: "error"`, so a `3xx` from the
|
|
33
|
+
* address named is a refusal rather than a second request carrying the
|
|
34
|
+
* header to whatever host the redirect names.
|
|
35
|
+
*
|
|
36
|
+
* ## No token, nothing sent
|
|
37
|
+
*
|
|
38
|
+
* This adapter is for an engine that bills an account: `engine-out-of-credit`
|
|
39
|
+
* and `engine-over-quota` are statements about an account, and an engine
|
|
40
|
+
* with no account has neither. So a token is required, and a missing one is
|
|
41
|
+
* refused before anything is sent — {@link noBehaviourTokenRefusal}, naming
|
|
42
|
+
* the chain — rather than sent bare and reported as whatever the engine's
|
|
43
|
+
* 401 page said. An engine that needs no token is not this adapter's, and
|
|
44
|
+
* the address chain still reaches it through a command on `PATH`.
|
|
45
|
+
*
|
|
46
|
+
* ## What the wire says, and what it becomes
|
|
47
|
+
*
|
|
48
|
+
* | Wire | Cause | Why |
|
|
49
|
+
* |---|---|---|
|
|
50
|
+
* | `2xx` | — | the body is the answer; the lexicon validates it |
|
|
51
|
+
* | `401`, `403` | `no-engine` | the token was rejected; the remedy is to set the variable |
|
|
52
|
+
* | `402` | `engine-out-of-credit` | the address answered; the account is empty |
|
|
53
|
+
* | `429` | `engine-over-quota` | the address answered; a limit is spent; `retry-after` is echoed |
|
|
54
|
+
* | any other status | `engine-unreachable` | the engine did not answer the question — a `5xx`, a `404`, a `3xx` |
|
|
55
|
+
* | `fetch` threw | `engine-unreachable` | connection refused, no such host, TLS, or the timeout |
|
|
56
|
+
*
|
|
57
|
+
* `4xx` outside the three named is deliberately `engine-unreachable` rather
|
|
58
|
+
* than a fifth cause. The contract's four causes are four remedies, and "the
|
|
59
|
+
* engine rejected this request as malformed" has no remedy an operator can
|
|
60
|
+
* apply — it is a bug on one side of the wire or the other, and the detail
|
|
61
|
+
* names the status so whoever reads it can tell which side.
|
|
62
|
+
*/
|
|
63
|
+
import { behaviourTokenFrom, behaviourWireRefusal, noBehaviourTokenRefusal, rejectedBehaviourTokenRefusal, } from "./behaviour.js";
|
|
64
|
+
import { REDACTED } from "./identity.js";
|
|
65
|
+
/** The default deadline: the same one the command transport gives a child. */
|
|
66
|
+
export const HTTP_BEHAVIOUR_TIMEOUT_MS = 30000;
|
|
67
|
+
/** How much of an error body a `detail` repeats. `scrubEngineDetail` bounds it again downstream. */
|
|
68
|
+
const MAX_BODY_IN_DETAIL = 300;
|
|
69
|
+
/** True when an address is one this adapter dials. `grpc://` and friends are not. */
|
|
70
|
+
export function isHttpBehaviourAddress(value) {
|
|
71
|
+
return /^https?:\/\//i.test(value.trim());
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Every occurrence of the token's value replaced, in text that came from the
|
|
75
|
+
* engine or from an error. Exported so a test can assert on the one function
|
|
76
|
+
* every `detail` passes through.
|
|
77
|
+
*
|
|
78
|
+
* `split`/`join` rather than a `RegExp`, so a token containing `.` or `+` is
|
|
79
|
+
* matched as itself. Nothing shorter than four characters is concealed: a
|
|
80
|
+
* one-letter "token" would blank every occurrence of that letter, which is a
|
|
81
|
+
* detail nobody can read and a false sense that something was protected.
|
|
82
|
+
*/
|
|
83
|
+
export function concealing(token, text) {
|
|
84
|
+
if (token.value.length < 4 || !text.includes(token.value))
|
|
85
|
+
return text;
|
|
86
|
+
return text.split(token.value).join(REDACTED);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The refusal an HTTP status earns, or `undefined` for a status that carries
|
|
90
|
+
* an answer. Pure and exported so the whole table in the module doc is one
|
|
91
|
+
* function a test can walk.
|
|
92
|
+
*
|
|
93
|
+
* `detail` is the first non-empty line of the response body, already
|
|
94
|
+
* concealed; this adds the status in front of it so a `detail` never reads as
|
|
95
|
+
* the engine's prose alone.
|
|
96
|
+
*/
|
|
97
|
+
export function httpStatusRefusal(lexicon, endpoint, token, status, detail, retryAfter) {
|
|
98
|
+
if (status >= 200 && status < 300)
|
|
99
|
+
return undefined;
|
|
100
|
+
const said = detail.trim().length > 0 ? `: ${detail.trim()}` : "";
|
|
101
|
+
if (status === 401 || status === 403) {
|
|
102
|
+
return rejectedBehaviourTokenRefusal(lexicon, endpoint, token, `HTTP ${status}${said}`);
|
|
103
|
+
}
|
|
104
|
+
if (status === 402) {
|
|
105
|
+
// The account is the token's, so the variable that named the token is
|
|
106
|
+
// the one an operator funds — put it first, ahead of whatever the
|
|
107
|
+
// engine said, so `scrubEngineDetail`'s bound never drops it.
|
|
108
|
+
return behaviourWireRefusal(lexicon, endpoint, "engine-out-of-credit", `the account ${token.source} authenticates answered HTTP 402${said}`);
|
|
109
|
+
}
|
|
110
|
+
if (status === 429) {
|
|
111
|
+
const window = retryAfter && retryAfter.trim().length > 0 ? `, retry after ${retryAfter.trim()}` : "";
|
|
112
|
+
return behaviourWireRefusal(lexicon, endpoint, "engine-over-quota", `the account ${token.source} authenticates answered HTTP 429${window}${said}`);
|
|
113
|
+
}
|
|
114
|
+
return behaviourWireRefusal(lexicon, endpoint, "engine-unreachable", `HTTP ${status}${said || " with no body"}`);
|
|
115
|
+
}
|
|
116
|
+
/** The first non-empty line of a body, bounded, for a `detail`. */
|
|
117
|
+
function firstLine(text) {
|
|
118
|
+
const line = text.split("\n").find((l) => l.trim().length > 0)?.trim() ?? "";
|
|
119
|
+
return line.length > MAX_BODY_IN_DETAIL ? `${line.slice(0, MAX_BODY_IN_DETAIL)}…` : line;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Build the transport for one lexicon against one URL.
|
|
123
|
+
*
|
|
124
|
+
* The token is resolved here, once, from `env` — never from `process.env`
|
|
125
|
+
* unless that is what was passed — so a test can drive the whole wire with an
|
|
126
|
+
* environment of its own. A missing token makes a transport whose every
|
|
127
|
+
* `send` refuses by name and sends nothing; see the module doc for why that is
|
|
128
|
+
* the honest shape for an adapter whose engine bills an account.
|
|
129
|
+
*/
|
|
130
|
+
export function httpBehaviourTransport(lexicon, endpoint, env, deps = {}) {
|
|
131
|
+
const token = behaviourTokenFrom(lexicon, env);
|
|
132
|
+
const send = deps.fetch ?? globalThis.fetch;
|
|
133
|
+
const timeoutMs = deps.timeoutMs ?? HTTP_BEHAVIOUR_TIMEOUT_MS;
|
|
134
|
+
if (!token) {
|
|
135
|
+
const refusal = noBehaviourTokenRefusal(lexicon, endpoint);
|
|
136
|
+
return { async send() { return { ok: false, refusal }; } };
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
async send(body) {
|
|
140
|
+
let response;
|
|
141
|
+
try {
|
|
142
|
+
response = await send(endpoint.value.trim(), {
|
|
143
|
+
method: "POST",
|
|
144
|
+
headers: {
|
|
145
|
+
"content-type": "application/json",
|
|
146
|
+
accept: "application/json",
|
|
147
|
+
authorization: `Bearer ${token.value}`,
|
|
148
|
+
},
|
|
149
|
+
body,
|
|
150
|
+
// A redirect would carry the header above to whatever host the
|
|
151
|
+
// engine named. Refused here, reported as unreachable below.
|
|
152
|
+
redirect: "error",
|
|
153
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
return {
|
|
158
|
+
ok: false,
|
|
159
|
+
refusal: behaviourWireRefusal(lexicon, endpoint, "engine-unreachable", concealing(token, describeFetchError(err, timeoutMs))),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const text = await response.text().catch(() => "");
|
|
163
|
+
const refusal = httpStatusRefusal(lexicon, endpoint, token, response.status, concealing(token, firstLine(text)), response.headers.get("retry-after") ?? undefined);
|
|
164
|
+
if (refusal)
|
|
165
|
+
return { ok: false, refusal };
|
|
166
|
+
return { ok: true, body: concealing(token, text) };
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* A thrown `fetch` in words an operator can act on. Node's `fetch` wraps the
|
|
172
|
+
* socket error one level down (`err.cause.code`), and the timeout arrives as
|
|
173
|
+
* a `TimeoutError` DOMException; both are named here rather than left as
|
|
174
|
+
* `fetch failed`, which says nothing about which of the two it was.
|
|
175
|
+
*/
|
|
176
|
+
function describeFetchError(err, timeoutMs) {
|
|
177
|
+
if (err instanceof Error) {
|
|
178
|
+
if (err.name === "TimeoutError" || err.name === "AbortError") {
|
|
179
|
+
return `no answer within ${timeoutMs} ms`;
|
|
180
|
+
}
|
|
181
|
+
const cause = err.cause;
|
|
182
|
+
const code = typeof cause?.code === "string" ? cause.code : undefined;
|
|
183
|
+
if (code)
|
|
184
|
+
return `${code}: ${err.message}`;
|
|
185
|
+
return err.message;
|
|
186
|
+
}
|
|
187
|
+
return String(err);
|
|
188
|
+
}
|