@intentius/chant 0.124.13 → 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.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.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.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.js +75 -0
- 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.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 +3 -0
- 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/lexicon-module.ts +3 -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/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/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 +1 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an engine is asked to price, and who gets to say so (#2382).
|
|
3
|
+
*
|
|
4
|
+
* `./behaviour.ts` says what a prediction may mean and `./behaviour-http.ts`
|
|
5
|
+
* carries one to an engine. Between them sits a question neither answers: for
|
|
6
|
+
* a given entity in a project's graph, what *kind* of thing is it, and is it
|
|
7
|
+
* something an engine prices at all? #2357 answered it with one table in one
|
|
8
|
+
* lexicon, keyed by every other lexicon's entity types. That table described
|
|
9
|
+
* 117 types it did not own, and the capability rode on whether an optional
|
|
10
|
+
* package happened to be installed — which gave a consumer a fourth
|
|
11
|
+
* outcome this contract never named: no overlay, no refusal, and no reason.
|
|
12
|
+
*
|
|
13
|
+
* So the resolution lives here, where every other part of the feature already
|
|
14
|
+
* does, and the *rows* are contributed by the lexicon that owns the substrate.
|
|
15
|
+
* Core learns that an entity has an engine kind. It never learns which.
|
|
16
|
+
*
|
|
17
|
+
* ## Why rows are safe to make optional when the capability is not
|
|
18
|
+
*
|
|
19
|
+
* A lexicon that is not installed declared no entities of its types, so it has
|
|
20
|
+
* no rows to contribute and nothing goes missing: the estate simply contains
|
|
21
|
+
* nothing of that substrate. That is the opposite of the capability itself
|
|
22
|
+
* being optional, where an uninstalled package means an estate full of
|
|
23
|
+
* entities nobody will say anything about.
|
|
24
|
+
*
|
|
25
|
+
* ## The three things a lexicon can say about its own types
|
|
26
|
+
*
|
|
27
|
+
* - **mapped** — this type is a `compute`/`database`/`queue`, and its size
|
|
28
|
+
* is read from this declared property, in the provider's own vocabulary.
|
|
29
|
+
* - **declared unmapped** — this type is real and carries no rate an engine
|
|
30
|
+
* can quote, with the sentence saying why. A grant is not a resource; a
|
|
31
|
+
* boundary is not a node; a meter chant cannot read is not a figure.
|
|
32
|
+
* - **nothing priced** — nothing this lexicon declares is an estate an
|
|
33
|
+
* engine prices, once, for the whole substrate. A CI workflow is not an
|
|
34
|
+
* estate, and a policy language has nothing to saturate.
|
|
35
|
+
*
|
|
36
|
+
* A type a contributor claims and has no row for is `unknown-type`: the one
|
|
37
|
+
* verdict that is a defect rather than a decision, and the reason the three
|
|
38
|
+
* above are distinct states instead of one absent row.
|
|
39
|
+
*/
|
|
40
|
+
const ENGINE_KIND_WITNESS = {
|
|
41
|
+
compute: true,
|
|
42
|
+
serverless: true,
|
|
43
|
+
"control-plane": true,
|
|
44
|
+
database: true,
|
|
45
|
+
cache: true,
|
|
46
|
+
queue: true,
|
|
47
|
+
"object-store": true,
|
|
48
|
+
"block-store": true,
|
|
49
|
+
"load-balancer": true,
|
|
50
|
+
cdn: true,
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Every legal {@link EngineKind}, derived from a total witness rather than
|
|
54
|
+
* written out by hand — the construction `behaviour.ts` uses for
|
|
55
|
+
* `BEHAVIOUR_BASES`, for the same reason: a hand-written array is checked for
|
|
56
|
+
* having legal members and never for having all of them.
|
|
57
|
+
*/
|
|
58
|
+
export const ENGINE_KINDS = Object.keys(ENGINE_KIND_WITNESS);
|
|
59
|
+
/** True when `value` is a legal {@link EngineKind}. */
|
|
60
|
+
export function isEngineKind(value) {
|
|
61
|
+
return typeof value === "string" && ENGINE_KINDS.includes(value);
|
|
62
|
+
}
|
|
63
|
+
/** chant's own build-time entities, which no lexicon owns and nothing bills. */
|
|
64
|
+
const CHANT_PSEUDO_PREFIX = "chant:";
|
|
65
|
+
/**
|
|
66
|
+
* Resolve one entity type against the contributed rows.
|
|
67
|
+
*
|
|
68
|
+
* Total by construction: every type reaches one of the four states and there
|
|
69
|
+
* is no fifth arm for "dropped". That is the property the request builder
|
|
70
|
+
* relies on to guarantee every entity it was asked about lands in `entities`
|
|
71
|
+
* or in `unpredicted`.
|
|
72
|
+
*
|
|
73
|
+
* `hasOwnProperty` rather than a truthiness check, because these are plain
|
|
74
|
+
* object literals and an entity named after a prototype member would otherwise
|
|
75
|
+
* resolve to a mapping that does not exist.
|
|
76
|
+
*/
|
|
77
|
+
export function coverageFor(contributors, entityType, props) {
|
|
78
|
+
if (entityType.startsWith(CHANT_PSEUDO_PREFIX)) {
|
|
79
|
+
return {
|
|
80
|
+
status: "declared-unmapped",
|
|
81
|
+
reason: "one of chant's own build-time entities rather than something an account holds — a declared " +
|
|
82
|
+
"output, or a default that rides onto the resources beside it. It is never created and never " +
|
|
83
|
+
"billed",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const owner = contributors.find((c) => c.prefixes.some((p) => entityType.startsWith(p)));
|
|
87
|
+
if (!owner)
|
|
88
|
+
return { status: "unknown-type" };
|
|
89
|
+
if (owner.nothingPriced)
|
|
90
|
+
return { status: "provider-not-modelled", substrate: owner.nothingPriced };
|
|
91
|
+
const type = owner.resolveType ? owner.resolveType(entityType, props) : entityType;
|
|
92
|
+
if (type === undefined)
|
|
93
|
+
return { status: "unknown-type" };
|
|
94
|
+
if (owner.mapped && Object.prototype.hasOwnProperty.call(owner.mapped, type)) {
|
|
95
|
+
const row = owner.mapped[type];
|
|
96
|
+
return { status: "mapped", mapping: { ...row, provider: row.provider ?? owner.provider } };
|
|
97
|
+
}
|
|
98
|
+
if (owner.unmapped && Object.prototype.hasOwnProperty.call(owner.unmapped, type)) {
|
|
99
|
+
return { status: "declared-unmapped", reason: owner.unmapped[type] };
|
|
100
|
+
}
|
|
101
|
+
// Before `unmappedWhen`, and after both tables: a row is this lexicon's
|
|
102
|
+
// decision about a type it models, and a substrate boundary is a statement
|
|
103
|
+
// about types it never will. A type inside the modelled substrate with no
|
|
104
|
+
// row falls past both and stays the defect it is.
|
|
105
|
+
const elsewhere = owner.notModelledWhen?.(type);
|
|
106
|
+
if (elsewhere !== undefined)
|
|
107
|
+
return { status: "provider-not-modelled", substrate: elsewhere };
|
|
108
|
+
const late = owner.unmappedWhen?.(type);
|
|
109
|
+
if (late !== undefined)
|
|
110
|
+
return { status: "declared-unmapped", reason: late };
|
|
111
|
+
return { status: "unknown-type" };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The contributor that owns an entity type, or `undefined` when nobody claims
|
|
115
|
+
* it. Exported because a caller that has already resolved a verdict often
|
|
116
|
+
* needs the owner too — to name it in a detail, or to label the entity the way
|
|
117
|
+
* its own lexicon would.
|
|
118
|
+
*/
|
|
119
|
+
export function ownerOf(contributors, entityType) {
|
|
120
|
+
return contributors.find((c) => c.prefixes.some((p) => entityType.startsWith(p)));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* How a detail names an entity's kind. The chant entity type, except where the
|
|
124
|
+
* owning lexicon keys its rows on something else: `Terraform::Resource` names
|
|
125
|
+
* nothing a reader can act on, and the provider type is the kind, so the label
|
|
126
|
+
* is `aws_vpc (Terraform::Resource)`.
|
|
127
|
+
*/
|
|
128
|
+
export function coverageLabel(contributors, entityType, props) {
|
|
129
|
+
const owner = ownerOf(contributors, entityType);
|
|
130
|
+
if (!owner?.resolveType)
|
|
131
|
+
return entityType;
|
|
132
|
+
const type = owner.resolveType(entityType, props);
|
|
133
|
+
return type === undefined || type === entityType ? entityType : `${type} (${entityType})`;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The `detail` an `unpredicted` entry carries, naming the kind in every case.
|
|
137
|
+
*
|
|
138
|
+
* The kind is named here, in the per-entity decline, because that is the only
|
|
139
|
+
* place in this contract with a per-entity axis: a `BehaviourRefusalReport` is
|
|
140
|
+
* a statement about the whole run and has no `entities` key by design, so a
|
|
141
|
+
* report-level refusal for one unmapped bucket would take the other nineteen
|
|
142
|
+
* entities' figures down with it.
|
|
143
|
+
*
|
|
144
|
+
* The `unknown-type` arm names the lexicon that owns the type rather than a
|
|
145
|
+
* file path, because since #2382 the row belongs to whichever lexicon defines
|
|
146
|
+
* the type, and that is the thing a reader needs to be told.
|
|
147
|
+
*/
|
|
148
|
+
export function unmappedDetail(label, verdict, owner) {
|
|
149
|
+
if (verdict.status === "declared-unmapped") {
|
|
150
|
+
return `${label} is declared unmapped by the ${owner?.provider ?? "declaring"} coverage rows: ${verdict.reason}.`;
|
|
151
|
+
}
|
|
152
|
+
if (verdict.status === "provider-not-modelled") {
|
|
153
|
+
return (`${label} belongs to ${verdict.substrate}, which nothing here models. A substrate is added by ` +
|
|
154
|
+
"the lexicon that owns its types contributing rows for them, not by adding a row elsewhere. " +
|
|
155
|
+
"This is a stated boundary rather than a gap — nothing needs filing.");
|
|
156
|
+
}
|
|
157
|
+
const where = owner
|
|
158
|
+
? `the lexicon that owns ${owner.prefixes.join(", ")}`
|
|
159
|
+
: "the lexicon that owns this entity type";
|
|
160
|
+
return (`${label} has no row in any contributed coverage table. It is a type from a substrate that is ` +
|
|
161
|
+
"modelled, and is neither mapped to an engine kind nor declared unmapped, so nothing has an " +
|
|
162
|
+
`opinion about it rather than a stated one. Add a row in ${where}.`);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compare two strings by UTF-16 code unit.
|
|
166
|
+
*
|
|
167
|
+
* Not `localeCompare`, which reads the ambient locale: under `sv-SE` and
|
|
168
|
+
* `et-EE` it orders these type names differently from `en-US`, which would
|
|
169
|
+
* make the request's bytes — and therefore any golden fixture, and therefore
|
|
170
|
+
* any declared-versus-live delta — a function of the machine that built them.
|
|
171
|
+
*/
|
|
172
|
+
export const byCodeUnit = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A behaviour result, in the shape the overlay carries it (#2360, epic #2355).
|
|
3
|
+
*
|
|
4
|
+
* behold reads a prediction off `chant graph --live --overlay`'s IR and never
|
|
5
|
+
* calls an engine itself: one block per entity on `attrs._behaviour`, the
|
|
6
|
+
* channel every other live fact rides on (`_status`, `_release`, `_carve`),
|
|
7
|
+
* and the graph-level half on `meta._behaviour`. Its reader
|
|
8
|
+
* (`behold/src/behaviour.ts`, `validateBehaviourMeta`) takes `meta._behaviour`
|
|
9
|
+
* as `{ engine?, version?, at?, total?, refusal? }` and short-circuits on
|
|
10
|
+
* `refusal`: a refusal is present *instead of* the engine, and a meta with
|
|
11
|
+
* neither is dropped as "meta.engine missing".
|
|
12
|
+
*
|
|
13
|
+
* That last sentence is the whole reason this module exists. What goes on
|
|
14
|
+
* `meta._behaviour` for a refusal is the **entire** {@link BehaviourRefusalReport}
|
|
15
|
+
* — `{ behaviour: "v1", refusal: { cause, reason, remedy, source? } }` — and
|
|
16
|
+
* not the bare {@link BehaviourRefusal} inside it. A bare refusal has `reason`
|
|
17
|
+
* and `remedy` at its top level and no `refusal` key, so behold's reader finds
|
|
18
|
+
* no refusal, then finds no engine, and drops the meta with a diagnostic that
|
|
19
|
+
* names the wrong thing. The contract doc said the wrong type once
|
|
20
|
+
* (#2360's second review comment); this is written against the reader.
|
|
21
|
+
*
|
|
22
|
+
* For a report, `meta._behaviour` is the report's own `meta`: engine, version,
|
|
23
|
+
* `at`, an optional `total`, and `edgeCoverage`, which behold's reader ignores
|
|
24
|
+
* and a consumer that wants to know what a resilience verdict was computed
|
|
25
|
+
* over reads. Each entity's block goes on its node verbatim — the contract's
|
|
26
|
+
* {@link PredictedBehaviour} is field for field the block behold validates.
|
|
27
|
+
*
|
|
28
|
+
* Pure. Nothing here calls an engine; the result is whatever a lexicon's
|
|
29
|
+
* `predictBehaviour` returned.
|
|
30
|
+
*/
|
|
31
|
+
import { isBehaviourRefusalReport, } from "./behaviour.js";
|
|
32
|
+
/** The attribute a behaviour block rides on, on a node and on the graph's meta. */
|
|
33
|
+
export const BEHAVIOUR_OVERLAY_ATTR = "_behaviour";
|
|
34
|
+
/**
|
|
35
|
+
* Project a result onto the overlay's channels.
|
|
36
|
+
*
|
|
37
|
+
* A refusal keeps its envelope. behold reads `meta._behaviour.refusal`, and
|
|
38
|
+
* the envelope is also what makes the value self-describing to anything else
|
|
39
|
+
* reading the IR: `behaviour: "v1"` says which contract the refusal is in.
|
|
40
|
+
*/
|
|
41
|
+
export function behaviourOverlay(result) {
|
|
42
|
+
if (isBehaviourRefusalReport(result)) {
|
|
43
|
+
return { meta: { [BEHAVIOUR_OVERLAY_ATTR]: result }, attrs: {} };
|
|
44
|
+
}
|
|
45
|
+
const attrs = Object.create(null);
|
|
46
|
+
for (const [name, block] of Object.entries(result.entities)) {
|
|
47
|
+
attrs[name] = { [BEHAVIOUR_OVERLAY_ATTR]: block };
|
|
48
|
+
}
|
|
49
|
+
return { meta: { [BEHAVIOUR_OVERLAY_ATTR]: result.meta }, attrs };
|
|
50
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `predictBehaviour()` — the fourth
|
|
3
|
+
* observation method (#2357, contract #2356).
|
|
4
|
+
*
|
|
5
|
+
* The whole method is four moves, in this order, and the order is the contract:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Screen the request.** `screenBehaviourRequest` and nothing else. It is
|
|
8
|
+
* the only entry point, and calling `assertNoCredentialInOptions` instead
|
|
9
|
+
* applies one rule of three — that was review finding F1 on #2365, where a
|
|
10
|
+
* `ghp_…` past the walk's depth budget and an `awsSecretAccessKey` in
|
|
11
|
+
* `props` both went out with the request.
|
|
12
|
+
* 2. **Resolve the engine.** `behaviourEngineFrom`, walking
|
|
13
|
+
* `CHANT_BEHAVIOUR_ENGINE_BEHAVIOUR_SCOPE` → `CHANT_BEHAVIOUR_ENGINE` →
|
|
14
|
+
* `BEHAVIOUR_ENGINE`. Nothing named means `noBehaviourEngineRefusal`, and
|
|
15
|
+
* it happens **before** anything is priced: a lexicon that prices first and
|
|
16
|
+
* checks the engine afterwards has already decided what zero means.
|
|
17
|
+
* 3. **Build the request.** `buildEngineRequest`, offline and pure
|
|
18
|
+
* (`./request.ts`).
|
|
19
|
+
* 4. **Ask, and translate the answer.** One {@link EngineOutcome} onto the
|
|
20
|
+
* contract's builders. A refusal comes back from the transport already
|
|
21
|
+
* built — the contract's transport (#2373) names the condition and the
|
|
22
|
+
* variable where the wire was seen — and is returned as it stands; this
|
|
23
|
+
* file holds no switch over causes. No figure is ever computed here either:
|
|
24
|
+
* this file has no arithmetic on money in it at all, and that is not an
|
|
25
|
+
* accident. The epic's first rule is that a missing engine produces a
|
|
26
|
+
* refusal and "never a locally faked number", and the surest way to keep
|
|
27
|
+
* that true is for the code that would have faked it not to exist.
|
|
28
|
+
*
|
|
29
|
+
* ## Every entity lands somewhere
|
|
30
|
+
*
|
|
31
|
+
* `behaviourReport` refuses a report that leaves a name in neither map, so the
|
|
32
|
+
* loop below has no `continue` that drops one. Four ways an entity can end up
|
|
33
|
+
* unpredicted, and each names a different thing:
|
|
34
|
+
*
|
|
35
|
+
* | Outcome | Reason | Means |
|
|
36
|
+
* |---|---|---|
|
|
37
|
+
* | the coverage table declares it unmapped | `unsupported-kind` | chant looked, and this kind has no rate |
|
|
38
|
+
* | the coverage table has never seen it | `unsupported-kind` | chant has not looked; the detail says so and where to add the row |
|
|
39
|
+
* | the engine declined it | `read-failed` | chant asked and the engine could not answer |
|
|
40
|
+
* | the engine answered about neither | `read-failed` | the engine lost it, and this says so rather than hiding it |
|
|
41
|
+
*
|
|
42
|
+
* The last row is the one that would otherwise be silent. An engine that
|
|
43
|
+
* returns figures for eleven of twelve nodes and mentions the twelfth nowhere
|
|
44
|
+
* is a bug in the engine, and an estate that quietly renders eleven nodes is
|
|
45
|
+
* how it stays a bug.
|
|
46
|
+
*/
|
|
47
|
+
import { behaviourReport, behaviourEngineFrom, noBehaviourEngineRefusal, predictedRate, screenBehaviourRequest, unreachableBehaviourEngineRefusal, } from "./behaviour.js";
|
|
48
|
+
import { buildEngineRequest } from "./behaviour-request.js";
|
|
49
|
+
import { BEHAVIOUR_SCOPE, defaultConnect } from "./behaviour-engine.js";
|
|
50
|
+
export { BEHAVIOUR_SCOPE };
|
|
51
|
+
/**
|
|
52
|
+
* Build core's `predictBehaviour`, with the environment and the
|
|
53
|
+
* transport injected.
|
|
54
|
+
*
|
|
55
|
+
* Injected rather than read from module scope so a test can drive the whole
|
|
56
|
+
* method — screen, resolve, serialize, translate — against a fixture engine
|
|
57
|
+
* without touching `process.env`, which is what the shared conformance suite's
|
|
58
|
+
* probes need in order to ask the same request twice and compare.
|
|
59
|
+
*/
|
|
60
|
+
export function createBehaviourPredict(deps = {}) {
|
|
61
|
+
const env = deps.env ?? process.env;
|
|
62
|
+
const kinds = deps.kinds ?? [];
|
|
63
|
+
const connect = deps.connect ?? defaultConnect;
|
|
64
|
+
return async function predictBehaviour(options) {
|
|
65
|
+
const unsafe = screenBehaviourRequest(BEHAVIOUR_SCOPE, options);
|
|
66
|
+
if (unsafe)
|
|
67
|
+
return unsafe;
|
|
68
|
+
const endpoint = behaviourEngineFrom(BEHAVIOUR_SCOPE, env);
|
|
69
|
+
if (!endpoint)
|
|
70
|
+
return noBehaviourEngineRefusal(BEHAVIOUR_SCOPE);
|
|
71
|
+
const engine = connect(endpoint, env);
|
|
72
|
+
if (!engine) {
|
|
73
|
+
return unreachableBehaviourEngineRefusal(BEHAVIOUR_SCOPE, endpoint, "no transport speaks that address — a http(s) URL is dialled with a bearer token, and a bare " +
|
|
74
|
+
"address is run as a command on PATH; any other scheme has no transport yet");
|
|
75
|
+
}
|
|
76
|
+
const request = buildEngineRequest(options, kinds);
|
|
77
|
+
const outcome = await engine.predict(request);
|
|
78
|
+
// Built where the wire was seen, and returned as it stands. The three
|
|
79
|
+
// engine-answered causes and the token cases are mapped once, in the
|
|
80
|
+
// contract's transport, rather than re-derived here from a cause.
|
|
81
|
+
if (!outcome.ok)
|
|
82
|
+
return outcome.refusal;
|
|
83
|
+
const { answer } = outcome;
|
|
84
|
+
// `Object.create(null)`, not `{}`. An entity named `constructor` or
|
|
85
|
+
// `toString` writes onto `Object.prototype`'s members on a plain literal,
|
|
86
|
+
// and one named `__proto__` sets the prototype instead of adding a key, so
|
|
87
|
+
// the entry vanishes and `behaviourReport`'s totality check fires on an
|
|
88
|
+
// entity this function believed it had reported. `coverageFor` already
|
|
89
|
+
// guards its own lookups this way (`./mapping.ts`); these are the same
|
|
90
|
+
// hazard on the writing side.
|
|
91
|
+
const entities = Object.create(null);
|
|
92
|
+
const unpredicted = Object.create(null);
|
|
93
|
+
for (const held of request.withheld) {
|
|
94
|
+
unpredicted[held.name] = {
|
|
95
|
+
...(held.entityType === "(undeclared)" ? {} : { type: held.entityType }),
|
|
96
|
+
reason: "unsupported-kind",
|
|
97
|
+
detail: held.detail,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
for (const node of request.nodes) {
|
|
101
|
+
// `hasOwnProperty` for the same reason: `answer.declined` comes from
|
|
102
|
+
// `JSON.parse`, so `declined["constructor"]` is a function rather than
|
|
103
|
+
// `undefined` and the `!== undefined` guard below missed it.
|
|
104
|
+
const declined = has(answer.declined, node.name) ? answer.declined[node.name] : undefined;
|
|
105
|
+
if (declined !== undefined) {
|
|
106
|
+
unpredicted[node.name] = {
|
|
107
|
+
type: node.entityType,
|
|
108
|
+
reason: "read-failed",
|
|
109
|
+
detail: `${answer.engine} was sent ${node.name} as a ${node.kind} and declined it: ${declined}`,
|
|
110
|
+
};
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const figure = has(answer.figures, node.name) ? answer.figures[node.name] : undefined;
|
|
114
|
+
if (figure === undefined) {
|
|
115
|
+
unpredicted[node.name] = {
|
|
116
|
+
type: node.entityType,
|
|
117
|
+
reason: "read-failed",
|
|
118
|
+
detail: `${answer.engine} was sent ${node.name} and its answer names it in neither its figures nor ` +
|
|
119
|
+
"its declined list. An engine that loses a node is reported, not rendered as an estate one " +
|
|
120
|
+
"node smaller.",
|
|
121
|
+
};
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
entities[node.name] = block(options.traffic, figure, answer);
|
|
125
|
+
}
|
|
126
|
+
return behaviourReport(options, {
|
|
127
|
+
engine: answer.engine,
|
|
128
|
+
version: answer.version,
|
|
129
|
+
...(answer.total
|
|
130
|
+
? { total: predictedRate(answer.total.perHour, answer.total.currency) }
|
|
131
|
+
: {}),
|
|
132
|
+
}, entities, unpredicted);
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** An own key, not a prototype member. See the accumulators above. */
|
|
136
|
+
function has(map, key) {
|
|
137
|
+
return map !== undefined && Object.prototype.hasOwnProperty.call(map, key);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* One engine figure as a contract block.
|
|
141
|
+
*
|
|
142
|
+
* `at` comes from the request rather than from the engine's answer. The engine
|
|
143
|
+
* was asked at one level and `behaviourReport` refuses a block priced at a
|
|
144
|
+
* level the run did not ask for, so echoing the engine's own idea of the level
|
|
145
|
+
* would turn an engine that quietly substituted a level it liked better into a
|
|
146
|
+
* report that agrees with itself and answers the wrong question.
|
|
147
|
+
*
|
|
148
|
+
* `headroom` is copied axis by axis. An axis the engine did not model is
|
|
149
|
+
* **absent**, never `0` — zero headroom means saturated, which is the opposite
|
|
150
|
+
* claim, and `BehaviourHeadroom` is a union requiring at least one axis so a
|
|
151
|
+
* figure with neither is a type error rather than a block behold drops.
|
|
152
|
+
*/
|
|
153
|
+
function block(traffic, figure, answer) {
|
|
154
|
+
const cpu = figure.headroom?.cpu;
|
|
155
|
+
const latency = figure.headroom?.latency;
|
|
156
|
+
// Built axis by axis, and the cast the first version used here was a lie:
|
|
157
|
+
// `EngineFigure.headroom` is optional, so a figure stating none produced
|
|
158
|
+
// `{ latency: undefined }` — an object satisfying `BehaviourHeadroom`
|
|
159
|
+
// structurally and carrying no axis at all, which behold drops. The doc
|
|
160
|
+
// claiming a type error caught this was false. `parseEngineAnswer` now
|
|
161
|
+
// refuses such a figure before it reaches here; this stays correct anyway,
|
|
162
|
+
// because a lexicon should not depend on its own validator having run.
|
|
163
|
+
const headroom = cpu !== undefined
|
|
164
|
+
? { cpu, ...(latency !== undefined ? { latency } : {}) }
|
|
165
|
+
: { latency: latency };
|
|
166
|
+
if (cpu === undefined && latency === undefined) {
|
|
167
|
+
throw new Error(`predictBehaviour: the engine's figure for this entity carries neither a cpu nor a latency ` +
|
|
168
|
+
"headroom axis, and parseEngineAnswer should have refused it.");
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
at: { traffic },
|
|
172
|
+
cost: predictedRate(figure.perHour, figure.currency),
|
|
173
|
+
headroom,
|
|
174
|
+
errorRate: figure.errorRate,
|
|
175
|
+
resilience: {
|
|
176
|
+
failure: figure.resilience.failure,
|
|
177
|
+
verdict: figure.resilience.verdict,
|
|
178
|
+
...(figure.resilience.note ? { note: figure.resilience.note } : {}),
|
|
179
|
+
},
|
|
180
|
+
...(figure.rightSize ? { rightSize: figure.rightSize } : {}),
|
|
181
|
+
provenance: {
|
|
182
|
+
engine: answer.engine,
|
|
183
|
+
version: answer.version,
|
|
184
|
+
tolerance: answer.tolerance,
|
|
185
|
+
basis: answer.basis,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The engine's request, built offline from chant's typed source (#2357).
|
|
3
|
+
*
|
|
4
|
+
* `chant build` reaches no network and is byte-identical on re-run
|
|
5
|
+
* (`packages/core/src/components/verbs/reproducibility.ts`, the
|
|
6
|
+
* `deterministic-synthesis` basis). The request an engine is handed is built
|
|
7
|
+
* the same way and holds itself to the same property, for a reason that is not
|
|
8
|
+
* tidiness: the epic wants the declared prediction and the live prediction
|
|
9
|
+
* shown as a delta, and a delta is only a statement about the estate if both
|
|
10
|
+
* sides were assembled the same way from the same source. A request carrying a
|
|
11
|
+
* timestamp, an unsorted map or a floating-point rendering that depends on the
|
|
12
|
+
* platform makes every re-run look like drift.
|
|
13
|
+
*
|
|
14
|
+
* So everything here is pure. No clock, no `Math.random`, no environment, no
|
|
15
|
+
* filesystem, no network. {@link renderEngineRequest} is the only place bytes
|
|
16
|
+
* are produced, and it produces them through a canonical writer that sorts
|
|
17
|
+
* every object key and every list.
|
|
18
|
+
*
|
|
19
|
+
* ## What is in the request, and why the withheld list is in it too
|
|
20
|
+
*
|
|
21
|
+
* Nodes, edges, the traffic level, the caller's edge-coverage claim — and
|
|
22
|
+
* `withheld`, the entities the caller asked about that this lexicon is not
|
|
23
|
+
* asking the engine about, each with the reason from the coverage table.
|
|
24
|
+
*
|
|
25
|
+
* That last one is the same argument `edgeCoverage` won on the contract
|
|
26
|
+
* (#2365, review finding 6). An engine handed twelve nodes cannot tell whether
|
|
27
|
+
* the estate has twelve or twenty, and a resilience verdict computed over a
|
|
28
|
+
* graph with eight nodes missing is a confident answer to a question nobody
|
|
29
|
+
* asked. Omitting them would make the request's own coverage invisible one
|
|
30
|
+
* level down from where the contract made it visible.
|
|
31
|
+
*/
|
|
32
|
+
import { byCodeUnit, coverageFor, coverageLabel, ownerOf, unmappedDetail, } from "./behaviour-kinds.js";
|
|
33
|
+
/** The wire version. Bumped when the shape changes, the way `behaviour: "v1"` is. */
|
|
34
|
+
export const BEHAVIOUR_REQUEST_VERSION = "behaviour/v1";
|
|
35
|
+
/** Read a dotted path out of a declared property bag. Returns `undefined` for any miss. */
|
|
36
|
+
function readPath(props, path) {
|
|
37
|
+
let cursor = props;
|
|
38
|
+
for (const segment of path.split(".")) {
|
|
39
|
+
if (typeof cursor !== "object" || cursor === null)
|
|
40
|
+
return undefined;
|
|
41
|
+
cursor = cursor[segment];
|
|
42
|
+
}
|
|
43
|
+
return cursor;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A declared size, as a string, or absent.
|
|
47
|
+
*
|
|
48
|
+
* `sizeType` says which type the row's property holds, and a value of the
|
|
49
|
+
* other type is **absent** rather than coerced. Without that, a
|
|
50
|
+
* `DBInstanceClass: 42` — a wrong-typed declaration, or a parameter that
|
|
51
|
+
* folded to a number — rendered as `"42"` and went to the engine to be matched
|
|
52
|
+
* against a price table of instance-class names it does not appear in. That is
|
|
53
|
+
* the outcome the paragraph below is written against, arriving through the
|
|
54
|
+
* door the paragraph left open.
|
|
55
|
+
*
|
|
56
|
+
* Anything else — an object, an array, an unresolved intrinsic, a `NaN` — is
|
|
57
|
+
* absent too, because a size an engine cannot read is worse than no size: it
|
|
58
|
+
* will either be ignored silently or matched against nothing.
|
|
59
|
+
*
|
|
60
|
+
* A terraform block's unresolved reference is a string, `"${var.size}"`, and
|
|
61
|
+
* is absent for the same reason a CloudFormation intrinsic object is: it is
|
|
62
|
+
* the name of a value, not the value (#2360).
|
|
63
|
+
*/
|
|
64
|
+
export function sizeOf(props, sizeProp, sizeType) {
|
|
65
|
+
if (!sizeProp)
|
|
66
|
+
return undefined;
|
|
67
|
+
const raw = readPath(props, sizeProp);
|
|
68
|
+
if (sizeType === "number") {
|
|
69
|
+
return typeof raw === "number" && Number.isFinite(raw) ? String(raw) : undefined;
|
|
70
|
+
}
|
|
71
|
+
// `string`, and the default for a row naming a property and no type.
|
|
72
|
+
return isLiteral(raw) ? raw : undefined;
|
|
73
|
+
}
|
|
74
|
+
/** A non-empty string that is a value rather than a terraform `${…}` reference to one. */
|
|
75
|
+
function isLiteral(raw) {
|
|
76
|
+
return typeof raw === "string" && raw.length > 0 && !raw.includes("${");
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Translate one request's worth of chant entities and edges into the engine's
|
|
80
|
+
* shape. Pure, and the same input gives the same output forever.
|
|
81
|
+
*
|
|
82
|
+
* Every name in `entityNames` comes out in exactly one of `nodes` or
|
|
83
|
+
* `withheld`. The caller in `./predict-behaviour.ts` depends on that to satisfy
|
|
84
|
+
* `behaviourReport`'s totality check, and a name the caller asked about that is
|
|
85
|
+
* missing from `options.entities` is `withheld` with an `unknown-type` detail
|
|
86
|
+
* rather than dropped — a `continue` in this loop is the exact silent hole the
|
|
87
|
+
* contract's totality refusal exists to catch.
|
|
88
|
+
*/
|
|
89
|
+
export function buildEngineRequest(options, kinds) {
|
|
90
|
+
const nodes = [];
|
|
91
|
+
const withheld = [];
|
|
92
|
+
for (const name of [...options.entityNames].sort(byCodeUnit)) {
|
|
93
|
+
const declared = options.entities.get(name);
|
|
94
|
+
if (!declared) {
|
|
95
|
+
withheld.push({
|
|
96
|
+
name,
|
|
97
|
+
entityType: "(undeclared)",
|
|
98
|
+
status: "unknown-type",
|
|
99
|
+
detail: `${name} was named in entityNames and is not in the entities map, so this lexicon has ` +
|
|
100
|
+
"nothing to translate. It is reported rather than dropped: an entity that vanished " +
|
|
101
|
+
"between the build and the request is a defect in the caller, and a silent omission " +
|
|
102
|
+
"hides it behind an estate that looks smaller.",
|
|
103
|
+
});
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const verdict = coverageFor(kinds, declared.entityType, declared.props);
|
|
107
|
+
// Where a lexicon keys its rows on something other than the entity type,
|
|
108
|
+
// that key rides beside the entity type on the wire and in the withheld
|
|
109
|
+
// list: `Terraform::Resource` alone names nothing an engine or a reader
|
|
110
|
+
// can act on (#2360), and its provider type is what does. Asked of the
|
|
111
|
+
// owning contributor rather than special-cased here (#2382).
|
|
112
|
+
const owner = ownerOf(kinds, declared.entityType);
|
|
113
|
+
const resolved = owner?.resolveType?.(declared.entityType, declared.props);
|
|
114
|
+
const resourceType = resolved && resolved !== declared.entityType ? resolved : undefined;
|
|
115
|
+
if (verdict.status !== "mapped") {
|
|
116
|
+
withheld.push({
|
|
117
|
+
name,
|
|
118
|
+
entityType: declared.entityType,
|
|
119
|
+
...(resourceType ? { resourceType } : {}),
|
|
120
|
+
status: verdict.status,
|
|
121
|
+
detail: unmappedDetail(coverageLabel(kinds, declared.entityType, declared.props), verdict, owner),
|
|
122
|
+
});
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const { mapping } = verdict;
|
|
126
|
+
const declaredRegion = mapping.regionProp
|
|
127
|
+
? readPath(declared.props, mapping.regionProp)
|
|
128
|
+
: undefined;
|
|
129
|
+
const region = isLiteral(declaredRegion) ? declaredRegion : options.region;
|
|
130
|
+
const size = sizeOf(declared.props, mapping.sizeProp, mapping.sizeType);
|
|
131
|
+
nodes.push({
|
|
132
|
+
name,
|
|
133
|
+
entityType: declared.entityType,
|
|
134
|
+
...(resourceType ? { resourceType } : {}),
|
|
135
|
+
kind: mapping.kind,
|
|
136
|
+
provider: mapping.provider,
|
|
137
|
+
...(region ? { region } : {}),
|
|
138
|
+
...(size ? { size } : {}),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const edges = options.edges
|
|
142
|
+
.map((edge) => ({
|
|
143
|
+
from: edge.from,
|
|
144
|
+
to: edge.to,
|
|
145
|
+
...(edge.viaAttr ? { via: edge.viaAttr } : {}),
|
|
146
|
+
...(edge.toAttr ? { toAttr: edge.toAttr } : {}),
|
|
147
|
+
}))
|
|
148
|
+
// By code unit, like the node order above. `localeCompare` reads the
|
|
149
|
+
// ambient locale, so two machines with different `LANG` values produced
|
|
150
|
+
// two different byte streams from one estate — in a module whose whole
|
|
151
|
+
// claim is that its bytes are a function of its content and nothing else.
|
|
152
|
+
.sort((a, b) => byCodeUnit(a.from, b.from) ||
|
|
153
|
+
byCodeUnit(a.to, b.to) ||
|
|
154
|
+
byCodeUnit(a.via ?? "", b.via ?? "") ||
|
|
155
|
+
byCodeUnit(a.toAttr ?? "", b.toAttr ?? ""));
|
|
156
|
+
return {
|
|
157
|
+
request: BEHAVIOUR_REQUEST_VERSION,
|
|
158
|
+
traffic: options.traffic,
|
|
159
|
+
...(options.region ? { region: options.region } : {}),
|
|
160
|
+
nodes,
|
|
161
|
+
edges,
|
|
162
|
+
coverage: options.edgeCoverage,
|
|
163
|
+
withheld,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Canonical JSON: object keys sorted, arrays in the order they were built,
|
|
168
|
+
* two-space indent, one trailing newline.
|
|
169
|
+
*
|
|
170
|
+
* Key order is where a "deterministic" serializer usually is not. `JSON.stringify`
|
|
171
|
+
* preserves insertion order, and insertion order here follows the order a
|
|
172
|
+
* property bag was assembled in, which follows discovery order, which follows
|
|
173
|
+
* the filesystem. Sorting the keys makes the bytes a function of the content
|
|
174
|
+
* and nothing else — which is what `chant build`'s own reproducibility claim
|
|
175
|
+
* means, and what makes a re-run comparable rather than merely re-run.
|
|
176
|
+
*/
|
|
177
|
+
export function renderEngineRequest(request) {
|
|
178
|
+
return `${JSON.stringify(canonical(request), null, 2)}\n`;
|
|
179
|
+
}
|
|
180
|
+
function canonical(value) {
|
|
181
|
+
if (Array.isArray(value))
|
|
182
|
+
return value.map(canonical);
|
|
183
|
+
if (typeof value === "object" && value !== null) {
|
|
184
|
+
const out = {};
|
|
185
|
+
for (const key of Object.keys(value).sort()) {
|
|
186
|
+
const inner = value[key];
|
|
187
|
+
if (inner === undefined)
|
|
188
|
+
continue;
|
|
189
|
+
out[key] = canonical(inner);
|
|
190
|
+
}
|
|
191
|
+
return out;
|
|
192
|
+
}
|
|
193
|
+
return value;
|
|
194
|
+
}
|