@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,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converge ledger (#1484) — the append-only record of what a `ConvergeOp`
|
|
3
|
+
* tick did, one line per tick, at `<env>/converge.jsonl` on the
|
|
4
|
+
* `chant/lifecycle` orphan branch. Same storage shape as the release ledger
|
|
5
|
+
* (./release-ledger.ts): immutable, append-only JSONL, reusing
|
|
6
|
+
* `writeBlobToPath`/`readBlobFromPath` (./git.ts) directly rather than a new
|
|
7
|
+
* git-plumbing path — the exact reuse `appendReleaseRecordLine` already
|
|
8
|
+
* demonstrates for a second filename under the same env directory.
|
|
9
|
+
*
|
|
10
|
+
* This is also where flap-damping state lives (issue: "consecutive-fire
|
|
11
|
+
* counts go in the ledger ... not process memory, so damping survives worker
|
|
12
|
+
* restarts"): each record's `firedRuleIds` names every rule whose predicate
|
|
13
|
+
* matched this tick, independent of what action was actually taken (run,
|
|
14
|
+
* report, or skipped for budget/flap reasons) — {@link consecutiveRuleFires}
|
|
15
|
+
* walks the ledger backward from the newest record and counts how many in a
|
|
16
|
+
* row include a given rule id, stopping at the first tick where it didn't
|
|
17
|
+
* fire (the symptom cleared).
|
|
18
|
+
*/
|
|
19
|
+
import { randomUUID } from "node:crypto";
|
|
20
|
+
import { sortedJsonReplacer } from "../utils.js";
|
|
21
|
+
import { readBlobFromPath, readPathSha, readBlobBySha, writeBlobToPath, RefCASConflictError } from "./git.js";
|
|
22
|
+
const FILENAME = "converge.jsonl";
|
|
23
|
+
/**
|
|
24
|
+
* Cap a piece of free text to one sanitized line before it goes into a
|
|
25
|
+
* record. A record here is one line of JSON, so a multi-line or unbounded
|
|
26
|
+
* string folded into any field would break the line the ledger is built out
|
|
27
|
+
* of. Every free-text field a tick writes goes through this: a dispatch
|
|
28
|
+
* failure's `stderr` (a hosting lexicon's own one-line sanitizer delegates
|
|
29
|
+
* here) and a component verdict's lexicon-authored `detail`.
|
|
30
|
+
*/
|
|
31
|
+
const MAX_LEDGER_TEXT_LEN = 300;
|
|
32
|
+
export function sanitizeLedgerText(raw, maxLen = MAX_LEDGER_TEXT_LEN) {
|
|
33
|
+
const firstLine = raw.split(/\r?\n/, 1)[0] ?? "";
|
|
34
|
+
// Strips literal control bytes; it is not matching on a range boundary.
|
|
35
|
+
const stripped = firstLine.replace(/[\x00-\x1f\x7f]/g, " ").trim();
|
|
36
|
+
return stripped.length > maxLen ? `${stripped.slice(0, maxLen)}…` : stripped;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Read-modify-append retry budget for {@link appendConvergeRecord} (#1485).
|
|
40
|
+
* `writeBlobToPath`'s ref write is now CAS-guarded (./git.ts) — a conflict
|
|
41
|
+
* (another writer, e.g. a second operator ticking a different env on the
|
|
42
|
+
* same orphan branch, updated the branch tip between our read and our
|
|
43
|
+
* write) throws `RefCASConflictError` instead of silently clobbering. This
|
|
44
|
+
* many attempts, re-reading the ledger fresh each time, absorbs that race
|
|
45
|
+
* rather than surfacing it as a tick failure — the whole point of the CAS
|
|
46
|
+
* guard is correctness, not a new way for a tick to fail.
|
|
47
|
+
*/
|
|
48
|
+
const APPEND_RETRY_ATTEMPTS = 5;
|
|
49
|
+
/**
|
|
50
|
+
* Project the tick's `ComponentStatusRow[]` down to what the ledger keeps.
|
|
51
|
+
* Pure; row order is preserved, so a consumer sees components in the same
|
|
52
|
+
* order the status join produced them.
|
|
53
|
+
*/
|
|
54
|
+
export function componentVerdicts(rows) {
|
|
55
|
+
return rows.map((row) => ({
|
|
56
|
+
component: row.component,
|
|
57
|
+
reconciliation: row.reconciliation,
|
|
58
|
+
detail: sanitizeLedgerText(row.detail ?? ""),
|
|
59
|
+
...(row.live !== undefined ? { live: row.live } : {}),
|
|
60
|
+
...(row.unobserved
|
|
61
|
+
? {
|
|
62
|
+
unobserved: {
|
|
63
|
+
reason: row.unobserved.reason,
|
|
64
|
+
...(row.unobserved.detail !== undefined ? { detail: sanitizeLedgerText(row.unobserved.detail) } : {}),
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
: {}),
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Append one immutable tick record. Does not push to the remote — call
|
|
72
|
+
* `pushLifecycle` (./git.ts) afterward, same two-step shape every other
|
|
73
|
+
* ledger write here uses.
|
|
74
|
+
*
|
|
75
|
+
* Mints `record.id` (#2027) when the input doesn't carry one, so every tick
|
|
76
|
+
* written from here on is referenceable. Unlike `timestamp`, which stays
|
|
77
|
+
* caller-supplied because library code never calls `Date.now()` internally,
|
|
78
|
+
* an id has nothing for a caller to decide — the mint lives here so no
|
|
79
|
+
* writer can forget it. An explicit `input.id` still wins, which is what a
|
|
80
|
+
* test asserting an exact record uses.
|
|
81
|
+
*
|
|
82
|
+
* Retries the whole read-modify-write cycle (#1485) on `RefCASConflictError`
|
|
83
|
+
* — `writeBlobToPath`'s ref write is CAS-guarded, so a concurrent writer to
|
|
84
|
+
* a *different* env's file on the same orphan branch (two operators ticking
|
|
85
|
+
* two environments at once is the ordinary case, not an edge case) can lose
|
|
86
|
+
* the race and needs to re-read the branch tip and retry, not fail the
|
|
87
|
+
* tick. Each retry re-reads `existing` fresh, so it always appends onto
|
|
88
|
+
* whatever the other writer just committed rather than reintroducing a stale
|
|
89
|
+
* read. Exhausting the budget re-throws the conflict — a real, sustained
|
|
90
|
+
* pile-up of writers is a signal worth surfacing, not silently swallowing.
|
|
91
|
+
*
|
|
92
|
+
* The baseline read must be `readPathSha` + `readBlobBySha` rather than
|
|
93
|
+
* `readBlobFromPath`, so the exact sha `existing` came from can be passed as
|
|
94
|
+
* `expectPriorPathSha`. See `writeBlobToPath` (./git.ts) for the race that
|
|
95
|
+
* closes.
|
|
96
|
+
*/
|
|
97
|
+
export async function appendConvergeRecord(input, opts) {
|
|
98
|
+
const record = { version: 1, ...input, id: input.id ?? randomUUID() };
|
|
99
|
+
const json = JSON.stringify(record, sortedJsonReplacer);
|
|
100
|
+
let lastErr;
|
|
101
|
+
for (let attempt = 1; attempt <= APPEND_RETRY_ATTEMPTS; attempt++) {
|
|
102
|
+
try {
|
|
103
|
+
const priorSha = await readPathSha(record.env, FILENAME, opts);
|
|
104
|
+
const existing = priorSha ? await readBlobBySha(priorSha, opts) : null;
|
|
105
|
+
const content = `${existing ? `${existing.replace(/\n$/, "")}\n` : ""}${json}\n`;
|
|
106
|
+
const commit = await writeBlobToPath(record.env, FILENAME, content, "Converge tick record", {
|
|
107
|
+
...opts,
|
|
108
|
+
expectPriorPathSha: priorSha,
|
|
109
|
+
});
|
|
110
|
+
return { commit, record };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (!(err instanceof RefCASConflictError))
|
|
114
|
+
throw err;
|
|
115
|
+
lastErr = err;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
throw lastErr;
|
|
119
|
+
}
|
|
120
|
+
/** Read every tick record for `environment`, oldest first. Malformed lines are skipped, not thrown on — a corrupted or hand-edited ledger degrades gracefully, the same stance `readReleaseLedger` takes. */
|
|
121
|
+
export async function readConvergeLedger(environment, opts) {
|
|
122
|
+
const content = await readBlobFromPath(environment, FILENAME, opts);
|
|
123
|
+
if (!content)
|
|
124
|
+
return { records: [], malformed: 0 };
|
|
125
|
+
const lines = content.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
126
|
+
const records = [];
|
|
127
|
+
let malformed = 0;
|
|
128
|
+
for (const line of lines) {
|
|
129
|
+
try {
|
|
130
|
+
const parsed = JSON.parse(line);
|
|
131
|
+
if (parsed.version !== 1 ||
|
|
132
|
+
typeof parsed.op !== "string" ||
|
|
133
|
+
typeof parsed.env !== "string" ||
|
|
134
|
+
typeof parsed.timestamp !== "string" ||
|
|
135
|
+
!Array.isArray(parsed.firedRuleIds)) {
|
|
136
|
+
malformed++;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
records.push(parsed);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
malformed++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return { records, malformed };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* How many consecutive most-recent ticks (newest first) fired `ruleId`,
|
|
149
|
+
* stopping at the first tick where it did not — the count a rule's
|
|
150
|
+
* `flapThreshold` is compared against. `0` when the newest tick didn't fire
|
|
151
|
+
* it (including an empty ledger).
|
|
152
|
+
*/
|
|
153
|
+
export function consecutiveRuleFires(records, ruleId) {
|
|
154
|
+
let count = 0;
|
|
155
|
+
for (let i = records.length - 1; i >= 0; i--) {
|
|
156
|
+
if (!records[i].firedRuleIds.includes(ruleId))
|
|
157
|
+
break;
|
|
158
|
+
count++;
|
|
159
|
+
}
|
|
160
|
+
return count;
|
|
161
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Property-level live drift (#1014) — declared vs live vs accepted baseline.
|
|
3
|
+
*
|
|
4
|
+
* The thin diff (./live-diff.ts) compares whole entities on status, physical id
|
|
5
|
+
* and a few outputs. This compares their property trees, path by path, which is
|
|
6
|
+
* where a console edit actually shows up. Pure function; the reading happens in
|
|
7
|
+
* ./deep-observe.ts and the CLI.
|
|
8
|
+
*
|
|
9
|
+
* Three axes, and all three matter:
|
|
10
|
+
*
|
|
11
|
+
* - **declared** — the property tree chant synthesized, normalized with the
|
|
12
|
+
* lexicon's own hooks so it is in the same shape as the live tree.
|
|
13
|
+
* - **live** — what the provider returned, normalized with the same hooks.
|
|
14
|
+
* - **baseline** — the value somebody accepted (./observation-baseline.ts). A
|
|
15
|
+
* deviation whose live value matches the accepted value is not drift; one
|
|
16
|
+
* that has moved away from the accepted value is drift again, and the
|
|
17
|
+
* report shows all three so the reader can see what changed and from what.
|
|
18
|
+
*
|
|
19
|
+
* A path is skipped entirely when the declared value is
|
|
20
|
+
* {@link UNRESOLVED} — an unevaluated intrinsic (`Fn::Sub`, `Ref`) has no
|
|
21
|
+
* source-side value to compare, and reporting one as drift would light up every
|
|
22
|
+
* interpolated property forever.
|
|
23
|
+
*
|
|
24
|
+
* ## The claim decides what counts as drift (#2160)
|
|
25
|
+
*
|
|
26
|
+
* The declared tree is not only one side of a comparison, it is a statement of
|
|
27
|
+
* which fields chant ever set — the claimed-field set (../claimed-fields.ts).
|
|
28
|
+
* A live value on a path outside it is somebody else's field: an autoscaler's
|
|
29
|
+
* replica count, a controller's annotation, a value a person typed into a
|
|
30
|
+
* console. It is reported in {@link DeepDiffResult.unclaimed}, with the
|
|
31
|
+
* manager's name where the substrate records one, and it is not drift. Only a
|
|
32
|
+
* claimed path that moved is, and drift is the only thing that may become an
|
|
33
|
+
* update.
|
|
34
|
+
*/
|
|
35
|
+
import { UNRESOLVED, deepValueEqual, flattenDeepProperties, } from "../deep-observation.js";
|
|
36
|
+
import { claimedFieldsFromPaths, heldBy, isClaimed } from "../claimed-fields.js";
|
|
37
|
+
import { isNormalizedHeldElsewhere } from "../held-elsewhere.js";
|
|
38
|
+
import { originOfPath } from "../provenance.js";
|
|
39
|
+
import { acceptedDeviation } from "./observation-baseline.js";
|
|
40
|
+
/**
|
|
41
|
+
* Compare declared and live property trees path by path, subtracting accepted
|
|
42
|
+
* deviations. Deterministic: every list is sorted.
|
|
43
|
+
*/
|
|
44
|
+
export function diffDeep(input) {
|
|
45
|
+
const baseline = input.baseline ?? {};
|
|
46
|
+
const drifted = [];
|
|
47
|
+
const accepted = [];
|
|
48
|
+
const unclaimed = [];
|
|
49
|
+
const held = [];
|
|
50
|
+
const unchanged = [];
|
|
51
|
+
const unobserved = [];
|
|
52
|
+
const undeclaredEntities = [];
|
|
53
|
+
const liveNames = new Set(Object.keys(input.live.resources));
|
|
54
|
+
for (const [name, entry] of Object.entries(input.live.unobserved)) {
|
|
55
|
+
// Present beats not-observed, exactly as the thin contract resolves it.
|
|
56
|
+
if (liveNames.has(name))
|
|
57
|
+
continue;
|
|
58
|
+
unobserved.push({
|
|
59
|
+
name,
|
|
60
|
+
...(entry.type ? { type: entry.type } : {}),
|
|
61
|
+
reason: entry.reason,
|
|
62
|
+
...(entry.detail ? { detail: entry.detail } : {}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
for (const name of liveNames) {
|
|
66
|
+
if (!(name in input.declared))
|
|
67
|
+
undeclaredEntities.push(name);
|
|
68
|
+
}
|
|
69
|
+
for (const name of Object.keys(input.declared).sort()) {
|
|
70
|
+
const liveEntity = input.live.resources[name];
|
|
71
|
+
// Not observed deeply → already recorded above; no properties to compare.
|
|
72
|
+
// Observed absent by the deep reader is the thin diff's `missing` case and
|
|
73
|
+
// is not restated here: a resource that does not exist has no property
|
|
74
|
+
// drift, and reporting every one of its declared properties as `absent`
|
|
75
|
+
// would bury the one line that matters.
|
|
76
|
+
if (!liveEntity)
|
|
77
|
+
continue;
|
|
78
|
+
const declaredEntity = input.declared[name];
|
|
79
|
+
const type = liveEntity.type || declaredEntity.type;
|
|
80
|
+
const declaredFlat = flattenDeepProperties(declaredEntity.properties, {
|
|
81
|
+
entityType: type,
|
|
82
|
+
side: "declared",
|
|
83
|
+
hooks: input.hooks,
|
|
84
|
+
});
|
|
85
|
+
const liveFlat = flattenDeepProperties(liveEntity.properties, {
|
|
86
|
+
entityType: type,
|
|
87
|
+
side: "live",
|
|
88
|
+
hooks: input.hooks,
|
|
89
|
+
});
|
|
90
|
+
// The claim (#2160): every path this declaration's props flatten to, in the
|
|
91
|
+
// grammar this loop addresses paths by. Derived here rather than read off
|
|
92
|
+
// `liveEntity.claimedFields` so `diffDeep` stays a pure function of its two
|
|
93
|
+
// trees; `lifecycle/deep-observe.ts` computes the identical set from the
|
|
94
|
+
// identical normalized tree and carries it on the observation for consumers.
|
|
95
|
+
const claimed = claimedFieldsFromPaths(declaredFlat.keys());
|
|
96
|
+
const paths = [...new Set([...declaredFlat.keys(), ...liveFlat.keys()])].sort();
|
|
97
|
+
const reported = [];
|
|
98
|
+
const suppressed = [];
|
|
99
|
+
const unclaimedFields = [];
|
|
100
|
+
const heldHere = [];
|
|
101
|
+
for (const path of paths) {
|
|
102
|
+
const hasDeclared = isClaimed(claimed, path);
|
|
103
|
+
const hasLive = liveFlat.has(path);
|
|
104
|
+
const declaredValue = declaredFlat.get(path);
|
|
105
|
+
const liveValue = liveFlat.get(path);
|
|
106
|
+
// A `heldElsewhere()` marker (#2162): never drift, whatever the live
|
|
107
|
+
// value is (or isn't) — reported in its own section instead, with its
|
|
108
|
+
// holder and reason, and never proposed for update. Checked ahead of
|
|
109
|
+
// the UNRESOLVED/equality shortcuts below: a held path is not "no
|
|
110
|
+
// source-side value" (UNRESOLVED) and its declared side will never
|
|
111
|
+
// structurally equal a live value, so without this check every held
|
|
112
|
+
// property would fall through and report as ordinary `changed` drift.
|
|
113
|
+
if (hasDeclared && isNormalizedHeldElsewhere(declaredValue)) {
|
|
114
|
+
heldHere.push({
|
|
115
|
+
path,
|
|
116
|
+
by: declaredValue.by,
|
|
117
|
+
reason: declaredValue.reason,
|
|
118
|
+
...(hasLive ? { live: liveValue } : {}),
|
|
119
|
+
// No live value at all is the one thing chant can check in a
|
|
120
|
+
// single observation: a claimed hand-over that produced no
|
|
121
|
+
// evidence — not even a provider default — is worth a look.
|
|
122
|
+
suspicious: !hasLive,
|
|
123
|
+
...(hasLive && liveEntity.fieldOwners?.[path] ? { owner: liveEntity.fieldOwners[path] } : {}),
|
|
124
|
+
});
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// An unevaluated intrinsic has no source-side value to compare against.
|
|
128
|
+
if (hasDeclared && declaredValue === UNRESOLVED)
|
|
129
|
+
continue;
|
|
130
|
+
if (hasDeclared && hasLive && deepValueEqual(declaredValue, liveValue))
|
|
131
|
+
continue;
|
|
132
|
+
const acceptedEntry = acceptedDeviation(baseline, name, path);
|
|
133
|
+
// A live value on a path nobody claimed is somebody else's field, not a
|
|
134
|
+
// difference chant proposes to close (#2160). Reported, never drift,
|
|
135
|
+
// never a candidate for an update — and the manager name, where the
|
|
136
|
+
// substrate records one, is the whole answer an operator wants.
|
|
137
|
+
if (!hasDeclared) {
|
|
138
|
+
const { holder, source } = heldBy(liveEntity.fieldOwners, path);
|
|
139
|
+
unclaimedFields.push({
|
|
140
|
+
path,
|
|
141
|
+
live: liveValue,
|
|
142
|
+
...(holder ? { heldBy: holder } : {}),
|
|
143
|
+
source,
|
|
144
|
+
...(acceptedEntry ? { baseline: acceptedEntry.value } : {}),
|
|
145
|
+
});
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const kind = !hasLive ? "absent" : "changed";
|
|
149
|
+
// Who owns the path live, where the substrate records it (#1189). Only
|
|
150
|
+
// meaningful for a path that exists live — an `absent` drift has no live
|
|
151
|
+
// field for anyone to own.
|
|
152
|
+
const owner = hasLive ? liveEntity.fieldOwners?.[path] : undefined;
|
|
153
|
+
// The declared-side counterpart (#1443).
|
|
154
|
+
const origin = originOfPath(declaredEntity.pathOrigins, path);
|
|
155
|
+
const drift = {
|
|
156
|
+
path,
|
|
157
|
+
kind,
|
|
158
|
+
declared: declaredValue,
|
|
159
|
+
...(hasLive ? { live: liveValue } : {}),
|
|
160
|
+
...(owner ? { owner } : {}),
|
|
161
|
+
...(origin ? { origin } : {}),
|
|
162
|
+
...(hasLive && liveEntity.observedOn ? { seenOn: liveEntity.observedOn } : {}),
|
|
163
|
+
};
|
|
164
|
+
if (acceptedEntry) {
|
|
165
|
+
drift.baseline = acceptedEntry.value;
|
|
166
|
+
// Value-bound acceptance: the accepted value is not drift, a different
|
|
167
|
+
// one is drift again.
|
|
168
|
+
if (hasLive && deepValueEqual(liveValue, acceptedEntry.value)) {
|
|
169
|
+
suppressed.push(drift);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
reported.push(drift);
|
|
174
|
+
}
|
|
175
|
+
if (suppressed.length > 0)
|
|
176
|
+
accepted.push({ name, type, changes: suppressed });
|
|
177
|
+
if (unclaimedFields.length > 0)
|
|
178
|
+
unclaimed.push({ name, type, fields: unclaimedFields });
|
|
179
|
+
if (reported.length > 0)
|
|
180
|
+
drifted.push({ name, type, changes: reported });
|
|
181
|
+
// Held fields do not disqualify an entity from `unchanged`: every property
|
|
182
|
+
// chant declared matches, and the epic's whole point is that a controller's
|
|
183
|
+
// field stops being a finding chant restates on every tick.
|
|
184
|
+
else if (suppressed.length === 0)
|
|
185
|
+
unchanged.push(name);
|
|
186
|
+
if (heldHere.length > 0)
|
|
187
|
+
held.push({ name, type, held: heldHere });
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
drifted: drifted.sort((a, b) => a.name.localeCompare(b.name)),
|
|
191
|
+
accepted: accepted.sort((a, b) => a.name.localeCompare(b.name)),
|
|
192
|
+
unclaimed: unclaimed.sort((a, b) => a.name.localeCompare(b.name)),
|
|
193
|
+
held: held.sort((a, b) => a.name.localeCompare(b.name)),
|
|
194
|
+
unchanged: unchanged.sort(),
|
|
195
|
+
unobserved: unobserved.sort((a, b) => a.name.localeCompare(b.name)),
|
|
196
|
+
undeclaredEntities: undeclaredEntities.sort(),
|
|
197
|
+
...(input.live.pending && input.live.pending.length > 0
|
|
198
|
+
? { pending: [...input.live.pending].sort((a, b) => a.subject.localeCompare(b.subject) || a.change.localeCompare(b.change)) }
|
|
199
|
+
: {}),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/** Total reported property differences across every entity. */
|
|
203
|
+
export function countPropertyDrift(result) {
|
|
204
|
+
return result.drifted.reduce((n, e) => n + e.changes.length, 0);
|
|
205
|
+
}
|
|
206
|
+
/** The pending changes (#3706): drift, though on no one entity's properties. */
|
|
207
|
+
export function countPending(result) {
|
|
208
|
+
return result.pending?.length ?? 0;
|
|
209
|
+
}
|
|
210
|
+
/** Total live values on paths no declaration claimed, across every entity (#2160). Never added to the drift count. */
|
|
211
|
+
export function countUnclaimed(result) {
|
|
212
|
+
return result.unclaimed.reduce((n, e) => n + e.fields.length, 0);
|
|
213
|
+
}
|
|
214
|
+
/** Total held properties (#2162) across every entity. */
|
|
215
|
+
export function countHeld(result) {
|
|
216
|
+
return result.held.reduce((n, e) => n + e.held.length, 0);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Every held property whose declaration looks like a hand-over that never
|
|
220
|
+
* happened — no live value ever showed up for it. Worth a look: either the
|
|
221
|
+
* named holder never ran, or this is not the field it actually writes.
|
|
222
|
+
* Sorted by entity name, then path.
|
|
223
|
+
*/
|
|
224
|
+
export function suspiciousHeld(result) {
|
|
225
|
+
const out = [];
|
|
226
|
+
for (const entity of result.held) {
|
|
227
|
+
for (const h of entity.held) {
|
|
228
|
+
if (h.suspicious)
|
|
229
|
+
out.push({ name: entity.name, type: entity.type, ...h });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return out.sort((a, b) => a.name.localeCompare(b.name) || a.path.localeCompare(b.path));
|
|
233
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep observation orchestration (#1014) — call one lexicon's
|
|
3
|
+
* `observeResourcesDeep()`, put the declared trees in the same shape, and diff.
|
|
4
|
+
*
|
|
5
|
+
* The sibling of ./observe.ts on the thin path, and it inherits that path's
|
|
6
|
+
* rules: a reader that throws does not vanish, it reports every declared entity
|
|
7
|
+
* NOT-OBSERVED with `read-failed` (#1089); a multi-stack read merges with
|
|
8
|
+
* present > not-observed > absent. A deep read that fails is a hole with a
|
|
9
|
+
* reason, never a thin-but-clean answer.
|
|
10
|
+
*
|
|
11
|
+
* The normalization is applied here, on both sides, with the lexicon's own
|
|
12
|
+
* hooks. The reader already normalized what it returned — that is the contract
|
|
13
|
+
* — but only core can normalize the *declared* tree, and only core knows which
|
|
14
|
+
* paths exist on the other side, which is what
|
|
15
|
+
* {@link import("../deep-observation.js").DeepNode.counterpart} needs for default
|
|
16
|
+
* subtraction. Re-running the pass over an already-normalized live tree is
|
|
17
|
+
* idempotent for every hook that does not consult `counterpart`.
|
|
18
|
+
*/
|
|
19
|
+
import { deepPathSet, normalizeDeepObservation, normalizeDeepProperties, } from "../deep-observation.js";
|
|
20
|
+
import { claimedFieldPaths, claimedFieldsOfTree } from "../claimed-fields.js";
|
|
21
|
+
import { unobservedAll } from "../observation.js";
|
|
22
|
+
import { diffDeep } from "./deep-diff.js";
|
|
23
|
+
/**
|
|
24
|
+
* Merge several deep observations of the same lexicon (the multi-stack read).
|
|
25
|
+
* Precedence matches the thin contract: present > not-observed > absent.
|
|
26
|
+
*/
|
|
27
|
+
export function mergeDeepObservations(parts) {
|
|
28
|
+
const resources = {};
|
|
29
|
+
const unobserved = {};
|
|
30
|
+
const pending = [];
|
|
31
|
+
for (const part of parts) {
|
|
32
|
+
Object.assign(resources, part.resources);
|
|
33
|
+
Object.assign(unobserved, part.unobserved);
|
|
34
|
+
pending.push(...(part.pending ?? []));
|
|
35
|
+
}
|
|
36
|
+
for (const name of Object.keys(resources))
|
|
37
|
+
delete unobserved[name];
|
|
38
|
+
return { resources, unobserved, ...(pending.length > 0 ? { pending } : {}) };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Read one lexicon's live property trees. Never throws: a thrown reader becomes
|
|
42
|
+
* a NOT-OBSERVED verdict for every declared entity, with the error as the
|
|
43
|
+
* detail, so the caller sees a hole rather than an empty tree that reads as
|
|
44
|
+
* "no properties drifted".
|
|
45
|
+
*/
|
|
46
|
+
export async function observeDeep(plugin, opts) {
|
|
47
|
+
const entityNames = Array.from(opts.entities.keys());
|
|
48
|
+
if (!plugin.observeResourcesDeep) {
|
|
49
|
+
return { resources: {}, unobserved: {} };
|
|
50
|
+
}
|
|
51
|
+
const base = {
|
|
52
|
+
environment: opts.environment,
|
|
53
|
+
buildOutput: opts.buildOutput,
|
|
54
|
+
entityNames,
|
|
55
|
+
entities: opts.entities,
|
|
56
|
+
...(opts.region ? { region: opts.region } : {}),
|
|
57
|
+
...(opts.owned !== undefined ? { owned: opts.owned } : {}),
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
if (opts.componentStacks && opts.componentStacks.length > 0) {
|
|
61
|
+
const parts = [];
|
|
62
|
+
for (const stack of opts.componentStacks) {
|
|
63
|
+
parts.push(normalizeDeepObservation(await plugin.observeResourcesDeep({ ...base, stack })));
|
|
64
|
+
}
|
|
65
|
+
return mergeDeepObservations(parts);
|
|
66
|
+
}
|
|
67
|
+
return normalizeDeepObservation(await plugin.observeResourcesDeep({ ...base, ...(opts.stack ? { stack: opts.stack } : {}) }));
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
+
return {
|
|
72
|
+
resources: {},
|
|
73
|
+
unobserved: unobservedAll(entityNames, "read-failed", message, opts.entities),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Normalize both sides into the same shape, then diff.
|
|
79
|
+
*
|
|
80
|
+
* Split out from {@link deepDiffForLexicon} so the pure half is testable
|
|
81
|
+
* without a plugin: given declared entities, a live observation and a baseline,
|
|
82
|
+
* this is a deterministic function.
|
|
83
|
+
*/
|
|
84
|
+
export function diffDeepObservation(entities, live, hooks, baseline) {
|
|
85
|
+
const declared = {};
|
|
86
|
+
const normalizedLive = {};
|
|
87
|
+
for (const [name, entity] of entities) {
|
|
88
|
+
const liveEntity = live.resources[name];
|
|
89
|
+
const declaredRaw = entity.props ?? {};
|
|
90
|
+
const liveRaw = liveEntity?.properties ?? {};
|
|
91
|
+
const declaredPaths = deepPathSet(declaredRaw);
|
|
92
|
+
const livePaths = deepPathSet(liveRaw);
|
|
93
|
+
const declaredProperties = normalizeDeepProperties(declaredRaw, {
|
|
94
|
+
entityType: entity.entityType,
|
|
95
|
+
side: "declared",
|
|
96
|
+
hooks,
|
|
97
|
+
counterpartPaths: livePaths,
|
|
98
|
+
});
|
|
99
|
+
declared[name] = {
|
|
100
|
+
type: entity.entityType,
|
|
101
|
+
properties: declaredProperties,
|
|
102
|
+
...(entity.pathOrigins ? { pathOrigins: entity.pathOrigins } : {}),
|
|
103
|
+
};
|
|
104
|
+
if (liveEntity) {
|
|
105
|
+
normalizedLive[name] = {
|
|
106
|
+
type: liveEntity.type || entity.entityType,
|
|
107
|
+
...(liveEntity.physicalId ? { physicalId: liveEntity.physicalId } : {}),
|
|
108
|
+
// Per-path owners (#1189) ride through unchanged; the diff looks them
|
|
109
|
+
// up by the flattened path, so a keyed list element (`[#name]`) has
|
|
110
|
+
// no owner today — its raw index path is what the reader recorded.
|
|
111
|
+
...(liveEntity.fieldOwners ? { fieldOwners: liveEntity.fieldOwners } : {}),
|
|
112
|
+
// Which server's copy was read, when the reader read several (#3664).
|
|
113
|
+
...(liveEntity.observedOn ? { observedOn: liveEntity.observedOn } : {}),
|
|
114
|
+
// The claimed-field set (#2160), computed from the declaration and
|
|
115
|
+
// carried on the observation so a consumer holding only this envelope
|
|
116
|
+
// can classify a live value three ways rather than two. Same normalized
|
|
117
|
+
// tree and same hooks `diffDeep` flattens, so the two never disagree
|
|
118
|
+
// about a path.
|
|
119
|
+
claimedFields: claimedFieldPaths(claimedFieldsOfTree(declaredProperties, { entityType: entity.entityType, ...(hooks ? { hooks } : {}) })),
|
|
120
|
+
properties: normalizeDeepProperties(liveRaw, {
|
|
121
|
+
entityType: liveEntity.type || entity.entityType,
|
|
122
|
+
side: "live",
|
|
123
|
+
hooks,
|
|
124
|
+
counterpartPaths: declaredPaths,
|
|
125
|
+
}),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Live entities nobody declared keep their reader-normalized trees — there is
|
|
130
|
+
// no declared side to normalize them against, and `diffDeep` reports them as
|
|
131
|
+
// undeclared entities rather than diffing their properties.
|
|
132
|
+
for (const [name, liveEntity] of Object.entries(live.resources)) {
|
|
133
|
+
if (!normalizedLive[name])
|
|
134
|
+
normalizedLive[name] = liveEntity;
|
|
135
|
+
}
|
|
136
|
+
return diffDeep({
|
|
137
|
+
declared,
|
|
138
|
+
live: { resources: normalizedLive, unobserved: live.unobserved, ...(live.pending ? { pending: live.pending } : {}) },
|
|
139
|
+
baseline,
|
|
140
|
+
hooks,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/** Read one lexicon deeply and diff it against source and the accepted baseline. */
|
|
144
|
+
export async function deepDiffForLexicon(plugin, opts) {
|
|
145
|
+
const live = await observeDeep(plugin, opts);
|
|
146
|
+
return diffDeepObservation(opts.entities, live, plugin.deepNormalizationHooks, opts.baseline);
|
|
147
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { canonicalJson } from "../effect-receipt.js";
|
|
2
|
+
import { contentDigest } from "../content-digest.js";
|
|
3
|
+
import { isAttrRefLike, LOGICAL_NAME_SYMBOL } from "../utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Hash an entity's props deterministically: bare hex SHA-256 over their
|
|
6
|
+
* `canonicalJson` (chant #2514). Props are first passed through
|
|
7
|
+
* `JSON.stringify`, which applies `toJSON` and drops what JSON cannot hold
|
|
8
|
+
* (a function-valued prop, say), so a prop that serialises today still
|
|
9
|
+
* hashes rather than throwing.
|
|
10
|
+
*/
|
|
11
|
+
export function hashProps(props) {
|
|
12
|
+
const plain = JSON.parse(JSON.stringify(namedRefs(props)) ?? "null");
|
|
13
|
+
return contentDigest(canonicalJson(plain)).slice("sha256:".length);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* `props` with each AttrRef that has no logical name of its own written as
|
|
17
|
+
* the envelope its `toJSON` gives, named by its parent's logical name. The
|
|
18
|
+
* build names only an entity's top-level AttrRefs; one held in a record,
|
|
19
|
+
* such as a sql table's `columns`, is never named, and `toJSON` throws on
|
|
20
|
+
* it (chant#3642). Plain objects and arrays are walked; anything else is
|
|
21
|
+
* left for `JSON.stringify`, so a named AttrRef hashes as it always has.
|
|
22
|
+
*/
|
|
23
|
+
function namedRefs(value) {
|
|
24
|
+
if (isAttrRefLike(value)) {
|
|
25
|
+
if (value.getLogicalName())
|
|
26
|
+
return value;
|
|
27
|
+
const parent = value.parent.deref();
|
|
28
|
+
const entity = parent?.[LOGICAL_NAME_SYMBOL];
|
|
29
|
+
return { __attrRef: { entity: typeof entity === "string" ? entity : null, attribute: value.attribute } };
|
|
30
|
+
}
|
|
31
|
+
if (Array.isArray(value))
|
|
32
|
+
return value.map(namedRefs);
|
|
33
|
+
if (value !== null && typeof value === "object") {
|
|
34
|
+
const proto = Object.getPrototypeOf(value);
|
|
35
|
+
if (proto !== Object.prototype && proto !== null)
|
|
36
|
+
return value;
|
|
37
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, namedRefs(v)]));
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The fingerprint of one entity's declared definition (#3652): its type and
|
|
43
|
+
* its build props, hashed by {@link hashProps}. A live diff and a lifecycle
|
|
44
|
+
* plan print it beside each create, so the plan digest a gate binds moves
|
|
45
|
+
* when what would be created changes, not only when its name does.
|
|
46
|
+
*/
|
|
47
|
+
export function definitionDigest(entityType, props) {
|
|
48
|
+
return hashProps({ type: entityType, props: props ?? {} });
|
|
49
|
+
}
|
|
50
|
+
/** {@link definitionDigest} for every entity in `entities`, keyed by name. */
|
|
51
|
+
export function declaredDefinitions(entities) {
|
|
52
|
+
const out = {};
|
|
53
|
+
for (const [name, entity] of entities)
|
|
54
|
+
out[name] = definitionDigest(entity.entityType, entity.props);
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Compute a full build digest from a BuildResult.
|
|
59
|
+
*/
|
|
60
|
+
export function computeBuildDigest(buildResult) {
|
|
61
|
+
const resources = {};
|
|
62
|
+
for (const [name, entity] of buildResult.entities) {
|
|
63
|
+
const props = "props" in entity && entity.props != null ? entity.props : {};
|
|
64
|
+
resources[name] = {
|
|
65
|
+
type: entity.entityType,
|
|
66
|
+
lexicon: entity.lexicon,
|
|
67
|
+
propsHash: hashProps(props),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Convert dependency Map<string, Set<string>> to Record<string, string[]>
|
|
71
|
+
const dependencies = {};
|
|
72
|
+
for (const [name, deps] of buildResult.dependencies) {
|
|
73
|
+
dependencies[name] = Array.from(deps);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
resources,
|
|
77
|
+
// chant #1442 — what interpreted the declarations, alongside what was
|
|
78
|
+
// declared. Always present on a freshly computed digest, so "absent"
|
|
79
|
+
// unambiguously means "recorded before #1442".
|
|
80
|
+
lexiconVersions: { ...buildResult.lexiconVersions },
|
|
81
|
+
dependencies,
|
|
82
|
+
outputs: buildResult.manifest.outputs,
|
|
83
|
+
deployOrder: buildResult.manifest.deployOrder,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Compare two digests and categorize resources.
|
|
88
|
+
*/
|
|
89
|
+
export function diffDigests(current, previous) {
|
|
90
|
+
const added = [];
|
|
91
|
+
const removed = [];
|
|
92
|
+
const changed = [];
|
|
93
|
+
const unchanged = [];
|
|
94
|
+
if (!previous) {
|
|
95
|
+
// No previous digest — everything is added, and there is no version to
|
|
96
|
+
// have moved away from.
|
|
97
|
+
added.push(...Object.keys(current.resources));
|
|
98
|
+
return { added, removed, changed, unchanged, lexiconVersionChanges: [] };
|
|
99
|
+
}
|
|
100
|
+
// Check current resources against previous
|
|
101
|
+
for (const name of Object.keys(current.resources)) {
|
|
102
|
+
const prev = previous.resources[name];
|
|
103
|
+
if (!prev) {
|
|
104
|
+
added.push(name);
|
|
105
|
+
}
|
|
106
|
+
else if (current.resources[name].propsHash !== prev.propsHash) {
|
|
107
|
+
changed.push(name);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
unchanged.push(name);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Check for removed resources
|
|
114
|
+
for (const name of Object.keys(previous.resources)) {
|
|
115
|
+
if (!(name in current.resources)) {
|
|
116
|
+
removed.push(name);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { added, removed, changed, unchanged, lexiconVersionChanges: diffLexiconVersions(current, previous) };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Lexicons whose version moved between two digests (chant #1442).
|
|
123
|
+
*
|
|
124
|
+
* A digest recorded before this existed has no `lexiconVersions` at all. That
|
|
125
|
+
* is reported as no change rather than as every lexicon appearing — comparing
|
|
126
|
+
* against an older snapshot must not manufacture a difference that the older
|
|
127
|
+
* build simply never recorded.
|
|
128
|
+
*/
|
|
129
|
+
function diffLexiconVersions(current, previous) {
|
|
130
|
+
if (!current.lexiconVersions || !previous.lexiconVersions)
|
|
131
|
+
return [];
|
|
132
|
+
const changes = [];
|
|
133
|
+
for (const lexicon of new Set([
|
|
134
|
+
...Object.keys(current.lexiconVersions),
|
|
135
|
+
...Object.keys(previous.lexiconVersions),
|
|
136
|
+
])) {
|
|
137
|
+
const now = current.lexiconVersions[lexicon];
|
|
138
|
+
const before = previous.lexiconVersions[lexicon];
|
|
139
|
+
if (now !== before)
|
|
140
|
+
changes.push({ lexicon, previous: before, current: now });
|
|
141
|
+
}
|
|
142
|
+
return changes.sort((a, b) => a.lexicon.localeCompare(b.lexicon));
|
|
143
|
+
}
|