@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,728 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin interpret driver — Phase 1 (#556), saga rollback hardened in Phase 4
|
|
3
|
+
* (#565, epic #551).
|
|
4
|
+
*
|
|
5
|
+
* One generic orchestrator that runs an arbitrary set of components on the
|
|
6
|
+
* local in-process executor: it orders components by `dependsOn` (reusing the
|
|
7
|
+
* same Kahn-layering approach `computeStackGraph` uses for `chant graph
|
|
8
|
+
* --stacks`, see ../build.ts), then for each component in order runs its
|
|
9
|
+
* `deploy` composition by dispatching every step to the `CapabilityRegistry`
|
|
10
|
+
* by `kind`. It resolves the three wiring reference forms from
|
|
11
|
+
* component.schema.json (`@Phase.field` prior-step references,
|
|
12
|
+
* `@<component>.publish.<field>` cross-component artifact references, and
|
|
13
|
+
* passes through `$env.*`/`stackOutput` values as opaque env config), runs
|
|
14
|
+
* `parallel` phases concurrently, decides a `gate` against the gate ledger
|
|
15
|
+
* (#2119 — the same `../op/gate.ts` the Op executor uses, so `chant run
|
|
16
|
+
* --components` and `chant run <op>` can never disagree about what a gate
|
|
17
|
+
* means), and on terminal failure unwinds every executed step in reverse via
|
|
18
|
+
* that step's capability `rollback`, then runs `onFailure` phases in reverse
|
|
19
|
+
* order (best-effort), mirroring the Op local executor's saga semantics.
|
|
20
|
+
*
|
|
21
|
+
* A gate nobody has approved is not a failure: the component stops there with
|
|
22
|
+
* status `gated`, the pending fact is on the ledger, and no rollback and no
|
|
23
|
+
* `onFailure` phase runs — nothing failed and the steps that did run are the
|
|
24
|
+
* steps the author meant to run before the approval. The next run re-reads the
|
|
25
|
+
* ledger and continues past the gate if `chant approve` has answered it.
|
|
26
|
+
*
|
|
27
|
+
* A step whose capability declares no `rollback` is never silently passed
|
|
28
|
+
* over during unwind: it gets a `"rollback-opted-out"` record (see
|
|
29
|
+
* `rollbackExecuted`), carrying the step's `noRollback` reason when the
|
|
30
|
+
* composition declared one. This mirrors, at run time, the opt-out the
|
|
31
|
+
* COMP003 lint rule (../lint/rules/comp/comp003-mutating-no-rollback.ts)
|
|
32
|
+
* already requires at author time — the driver reports the same fact the
|
|
33
|
+
* lint rule already made a component author state.
|
|
34
|
+
*
|
|
35
|
+
* This unwind runs entirely in-process: if the process crashes mid-rollback,
|
|
36
|
+
* nothing resumes it — there is no persisted run state to resume from (see
|
|
37
|
+
* docs/components/orchestration.mdx#rollback-comes-free). The *mechanism*
|
|
38
|
+
* (reverse-order unwind calling each capability's `rollback`) is
|
|
39
|
+
* capability-agnostic; *durable resume of a rollback already in progress*
|
|
40
|
+
* would be a hosting runtime's to offer, the same boundary that already
|
|
41
|
+
* applies to forward `onFailure` compensation on an Op.
|
|
42
|
+
*
|
|
43
|
+
* Contains zero per-component logic: nothing in this module branches on a
|
|
44
|
+
* component or capability `kind`/name. All behavior is either generic
|
|
45
|
+
* (ordering, phase/step dispatch, wiring resolution) or delegated to the
|
|
46
|
+
* `CapabilityRegistry` the caller supplies.
|
|
47
|
+
*/
|
|
48
|
+
import { topoSort } from "../codegen/topo-sort.js";
|
|
49
|
+
import { kahnLayers } from "./layers.js";
|
|
50
|
+
import { evaluateGate, gitGateLedgerPort } from "../op/gate.js";
|
|
51
|
+
import { gateName } from "../op/gate-name.js";
|
|
52
|
+
import { componentPlanDigest } from "./gate-plan.js";
|
|
53
|
+
import { isPromotedArtifact } from "./auto-release.js";
|
|
54
|
+
function isGateStep(step) {
|
|
55
|
+
return step.kind === "gate";
|
|
56
|
+
}
|
|
57
|
+
function isPhaseStep(step) {
|
|
58
|
+
return typeof step.phase === "string" && Array.isArray(step.steps);
|
|
59
|
+
}
|
|
60
|
+
// ── Errors ────────────────────────────────────────────────────────────────
|
|
61
|
+
/** Thrown when a dependency cycle is found among `dependsOn` edges. */
|
|
62
|
+
export class DependencyCycleError extends Error {
|
|
63
|
+
constructor(cycle) {
|
|
64
|
+
super(`dependency cycle among components: ${cycle.join(" -> ")}`);
|
|
65
|
+
this.cycle = cycle;
|
|
66
|
+
this.name = "DependencyCycleError";
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Thrown when a component's `dependsOn` names a component not present in the run set. */
|
|
70
|
+
export class UnknownDependencyError extends Error {
|
|
71
|
+
constructor(component, dependency) {
|
|
72
|
+
super(`component "${component}" depends on unknown component "${dependency}"`);
|
|
73
|
+
this.component = component;
|
|
74
|
+
this.dependency = dependency;
|
|
75
|
+
this.name = "UnknownDependencyError";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Thrown on terminal run failure; carries the partial run result for rendering/inspection. */
|
|
79
|
+
export class DriverRunFailure extends Error {
|
|
80
|
+
constructor(result) {
|
|
81
|
+
super(`interpret run failed at component "${result.failedComponent ?? "unknown"}"`);
|
|
82
|
+
this.result = result;
|
|
83
|
+
this.name = "DriverRunFailure";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve run order and parallel-safe waves from each component's `dependsOn`.
|
|
88
|
+
* Reuses the generic `topoSort` (../codegen/topo-sort.ts) for the flat order,
|
|
89
|
+
* and the same Kahn-layering approach `computeStackGraph` uses for `chant
|
|
90
|
+
* graph --stacks` (../build.ts) to additionally group independent components
|
|
91
|
+
* into waves. This is a plain string-graph algorithm — no lexicon/AttrRef
|
|
92
|
+
* machinery — since a component's `dependsOn` is already a flat name list.
|
|
93
|
+
*/
|
|
94
|
+
export function resolveComponentGraph(components) {
|
|
95
|
+
const byName = new Map(components.map((c) => [c.name, c]));
|
|
96
|
+
for (const c of components) {
|
|
97
|
+
for (const dep of c.dependsOn ?? []) {
|
|
98
|
+
if (!byName.has(dep))
|
|
99
|
+
throw new UnknownDependencyError(c.name, dep);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Kahn layering (mirrors computeStackGraph's wave computation in ../build.ts):
|
|
103
|
+
// a component is ready once every dependency it names has already been placed.
|
|
104
|
+
// Computed first because it doubles as cycle detection: `topoSort` below is a
|
|
105
|
+
// plain DFS with no cycle guard, so it must only run once a cycle is ruled out.
|
|
106
|
+
const deps = new Map();
|
|
107
|
+
for (const c of components)
|
|
108
|
+
deps.set(c.name, new Set(c.dependsOn ?? []));
|
|
109
|
+
const layered = kahnLayers(deps);
|
|
110
|
+
if (layered.cycle)
|
|
111
|
+
throw new DependencyCycleError(layered.cycle);
|
|
112
|
+
const waves = layered.waves;
|
|
113
|
+
const order = topoSort(components, (c) => c.name, (c) => c.dependsOn ?? []).map((c) => c.name);
|
|
114
|
+
return { order, waves };
|
|
115
|
+
}
|
|
116
|
+
// ── Wiring resolution ─────────────────────────────────────────────────────
|
|
117
|
+
const PRIOR_STEP_REF = /^@([A-Za-z0-9_ ]+)\.([A-Za-z0-9_.]+)$/;
|
|
118
|
+
const COMPONENT_ARTIFACT_REF = /^@([a-z0-9]+(?:-[a-z0-9]+)*)\.publish\.(uri|digest|key)$/;
|
|
119
|
+
/** Dot-path lookup, matching ../op/local-executor.ts's resolvePath. */
|
|
120
|
+
function resolvePath(value, path) {
|
|
121
|
+
return path
|
|
122
|
+
.split(".")
|
|
123
|
+
.reduce((acc, key) => (acc == null ? acc : acc[key]), value);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Resolve one wiring value against already-produced outputs. Three reference
|
|
127
|
+
* forms, all resolved here rather than by any component-specific code:
|
|
128
|
+
* - `@Phase.field` — a prior step's output within the same component, keyed
|
|
129
|
+
* by phase name (`phaseOutputs`).
|
|
130
|
+
* - `@<component>.publish.uri|digest|key` — another component's published
|
|
131
|
+
* artifact output (`componentOutputs`), per composition-and-wiring.mdx.
|
|
132
|
+
* - `{ stackOutput: { stack, name } }` — a cross-stack output; Phase 1 has no
|
|
133
|
+
* cross-stack apply-order integration (out of scope per #556), so this
|
|
134
|
+
* resolves via the same `componentOutputs` map keyed by `stack`/`name`,
|
|
135
|
+
* letting tests and callers seed cross-stack values the same way as
|
|
136
|
+
* artifact outputs. `$env.*` and plain literals pass through unchanged —
|
|
137
|
+
* env resolution is the caller's `DeployContext.vars`, not the driver's.
|
|
138
|
+
*/
|
|
139
|
+
export function resolveWiring(value, phaseOutputs, componentOutputs) {
|
|
140
|
+
if (typeof value === "string") {
|
|
141
|
+
const priorStep = value.match(PRIOR_STEP_REF);
|
|
142
|
+
if (priorStep) {
|
|
143
|
+
const [, phaseName, field] = priorStep;
|
|
144
|
+
return resolvePath(phaseOutputs[phaseName], field);
|
|
145
|
+
}
|
|
146
|
+
const artifactRef = value.match(COMPONENT_ARTIFACT_REF);
|
|
147
|
+
if (artifactRef) {
|
|
148
|
+
const [, componentName, field] = artifactRef;
|
|
149
|
+
return resolvePath(componentOutputs[componentName]?.publish, field);
|
|
150
|
+
}
|
|
151
|
+
return value; // literal, or `$env.*` — left for the caller to resolve via DeployContext.
|
|
152
|
+
}
|
|
153
|
+
if (value && typeof value === "object" && "stackOutput" in value) {
|
|
154
|
+
const { stack, name } = value.stackOutput;
|
|
155
|
+
return resolvePath(componentOutputs[stack], name);
|
|
156
|
+
}
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Deep-walk an object, resolving every string/stackOutput wiring value found.
|
|
161
|
+
* Arrays and nested objects are walked too.
|
|
162
|
+
*
|
|
163
|
+
* Exported (not just used internally) so a hosting runtime that runs steps
|
|
164
|
+
* out of process can resolve a step's wiring the same way — the orchestrator
|
|
165
|
+
* only accumulates `phaseOutputs`/`componentOutputs` and passes them through;
|
|
166
|
+
* resolution logic stays in one place so local and hosted execution can never
|
|
167
|
+
* silently diverge.
|
|
168
|
+
*/
|
|
169
|
+
export function resolveStepInput(input, phaseOutputs, componentOutputs) {
|
|
170
|
+
const walk = (value) => {
|
|
171
|
+
if (typeof value === "string")
|
|
172
|
+
return resolveWiring(value, phaseOutputs, componentOutputs);
|
|
173
|
+
if (Array.isArray(value))
|
|
174
|
+
return value.map(walk);
|
|
175
|
+
if (value && typeof value === "object") {
|
|
176
|
+
if ("stackOutput" in value)
|
|
177
|
+
return resolveWiring(value, phaseOutputs, componentOutputs);
|
|
178
|
+
const out = {};
|
|
179
|
+
for (const [k, v] of Object.entries(value))
|
|
180
|
+
out[k] = walk(v);
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
return value;
|
|
184
|
+
};
|
|
185
|
+
return walk(input);
|
|
186
|
+
}
|
|
187
|
+
class StepFailure extends Error {
|
|
188
|
+
constructor(records, executed) {
|
|
189
|
+
super("step failed");
|
|
190
|
+
this.records = records;
|
|
191
|
+
this.executed = executed;
|
|
192
|
+
this.name = "StepFailure";
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Internal: a phase stopped at an unapproved gate (#2119). Carries what ran before it, so the records survive; not a failure, so no unwind follows. */
|
|
196
|
+
class GateStop extends Error {
|
|
197
|
+
constructor(records, executed, pending,
|
|
198
|
+
/** Whether this run's own append reached the remote — see {@link DriverComponentResult.gatePushed} (#2310). */
|
|
199
|
+
pushed, pushWarning,
|
|
200
|
+
/** Set when an approval stands for this gate but not for this plan (#2574). */
|
|
201
|
+
mismatch) {
|
|
202
|
+
super(`gate "${pending.gate}" is pending approval`);
|
|
203
|
+
this.records = records;
|
|
204
|
+
this.executed = executed;
|
|
205
|
+
this.pending = pending;
|
|
206
|
+
this.pushed = pushed;
|
|
207
|
+
this.pushWarning = pushWarning;
|
|
208
|
+
this.mismatch = mismatch;
|
|
209
|
+
this.name = "GateStop";
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** A result status as the progress stream spells it — the only difference is `fail` vs `failed`, which the two vocabularies have always disagreed on. */
|
|
213
|
+
function progressStatus(status) {
|
|
214
|
+
return status === "fail" ? "failed" : status;
|
|
215
|
+
}
|
|
216
|
+
/** Run a single capability step. Never throws for a capability-run failure; returns a fail record instead. */
|
|
217
|
+
async function runCapabilityStep(step, phaseName, ctx, registry, phaseOutputs, componentOutputs) {
|
|
218
|
+
const { kind, ...rest } = step;
|
|
219
|
+
const resolvedInput = resolveStepInput(rest, phaseOutputs, componentOutputs);
|
|
220
|
+
const start = Date.now();
|
|
221
|
+
try {
|
|
222
|
+
const capability = registry.resolve(kind);
|
|
223
|
+
const output = await capability.run(ctx, resolvedInput);
|
|
224
|
+
return {
|
|
225
|
+
record: {
|
|
226
|
+
component: ctx.component,
|
|
227
|
+
phase: phaseName,
|
|
228
|
+
kind,
|
|
229
|
+
status: "ok",
|
|
230
|
+
durationMs: Date.now() - start,
|
|
231
|
+
output,
|
|
232
|
+
},
|
|
233
|
+
resolvedInput,
|
|
234
|
+
output,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
return {
|
|
239
|
+
record: {
|
|
240
|
+
component: ctx.component,
|
|
241
|
+
phase: phaseName,
|
|
242
|
+
kind,
|
|
243
|
+
status: "fail",
|
|
244
|
+
durationMs: Date.now() - start,
|
|
245
|
+
error: errMessage(err),
|
|
246
|
+
},
|
|
247
|
+
resolvedInput,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Run a phase's steps. A step may be a `Gate` (decided against the gate
|
|
253
|
+
* ledger, in authored order — a resolution newer than the gate's newest
|
|
254
|
+
* pending fact lets it pass carrying the approver, anything else records the
|
|
255
|
+
* fact and stops the component) or a nested `Phase` (a fan-out unit; recursed
|
|
256
|
+
* into, inheriting `parallel` from its own definition, not its parent's).
|
|
257
|
+
* Steps run sequentially unless `phase.parallel` is set, in which case they run
|
|
258
|
+
* via `Promise.all`, matching ../op/local-executor.ts's phase semantics — and
|
|
259
|
+
* as there, a gate in a parallel phase is decided before the fan-out, since a
|
|
260
|
+
* gate is a read of the ledger rather than work, and starting activities a
|
|
261
|
+
* pending gate is about to strand defeats the point of stopping at it.
|
|
262
|
+
*
|
|
263
|
+
* `onProgress`, when supplied, is called with a `phase-start` event before any
|
|
264
|
+
* step runs, a `step` event around each capability invocation (`"running"`
|
|
265
|
+
* then `"ok"`/`"failed"`), and a `phase-done` event once the phase settles —
|
|
266
|
+
* purely additive observation, never consulted for control flow. Recursion
|
|
267
|
+
* into a nested fan-out phase passes the same callback through, so a nested
|
|
268
|
+
* phase's events use its own name. Left `undefined` by every caller that
|
|
269
|
+
* doesn't opt into `--progress-json` (see ./run-progress.ts), in which case
|
|
270
|
+
* every `onProgress?.(...)` call below is a no-op and behavior is unchanged.
|
|
271
|
+
*/
|
|
272
|
+
async function runPhase(phaseDef, ctx, registry, phaseOutputs, componentOutputs, gates, onProgress) {
|
|
273
|
+
/** Decide this phase's gates against the ledger, in authored order, before any of its work starts. Throws `GateStop` at the first one nobody has approved. */
|
|
274
|
+
const decideGates = async () => {
|
|
275
|
+
const gateRecords = [];
|
|
276
|
+
for (const gate of phaseDef.steps.filter(isGateStep)) {
|
|
277
|
+
const start = Date.now();
|
|
278
|
+
const check = await evaluateGate(gates.port, {
|
|
279
|
+
op: ctx.component,
|
|
280
|
+
gate: gateName(gate),
|
|
281
|
+
// #2574: an approval counts only for this environment and this plan.
|
|
282
|
+
environment: ctx.env,
|
|
283
|
+
...(gates.planDigest !== undefined ? { planDigest: gates.planDigest } : {}),
|
|
284
|
+
...(gate.description ? { description: gate.description } : {}),
|
|
285
|
+
...(gate.timeout ? { timeout: gate.timeout } : {}),
|
|
286
|
+
...(gates.now ? { now: gates.now } : {}),
|
|
287
|
+
});
|
|
288
|
+
const base = { component: ctx.component, phase: phaseDef.phase, kind: `gate:${gateName(gate)}` };
|
|
289
|
+
if (!check.satisfied) {
|
|
290
|
+
gateRecords.push({ ...base, status: "skipped", durationMs: Date.now() - start });
|
|
291
|
+
for (const skipped of phaseDef.steps.filter((s) => !isGateStep(s))) {
|
|
292
|
+
gateRecords.push(skippedRecord(skipped));
|
|
293
|
+
}
|
|
294
|
+
throw new GateStop(gateRecords, [], check.pending, check.pushed, check.pushWarning, check.mismatch);
|
|
295
|
+
}
|
|
296
|
+
gateRecords.push({
|
|
297
|
+
...base,
|
|
298
|
+
status: "ok",
|
|
299
|
+
durationMs: Date.now() - start,
|
|
300
|
+
approval: {
|
|
301
|
+
gate: gateName(gate),
|
|
302
|
+
resolvedBy: check.resolution.resolvedBy,
|
|
303
|
+
timestamp: check.resolution.timestamp,
|
|
304
|
+
...(check.resolution.url ? { url: check.resolution.url } : {}),
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
return gateRecords;
|
|
309
|
+
};
|
|
310
|
+
const entries = phaseDef.steps.filter((s) => !isGateStep(s));
|
|
311
|
+
const runEntry = async (entry) => {
|
|
312
|
+
if (isPhaseStep(entry)) {
|
|
313
|
+
try {
|
|
314
|
+
const nested = await runPhase(entry, ctx, registry, phaseOutputs, componentOutputs, gates, onProgress);
|
|
315
|
+
return { ...nested, failed: false };
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
if (err instanceof StepFailure)
|
|
319
|
+
return { records: err.records, executed: err.executed, failed: true };
|
|
320
|
+
// A nested fan-out phase's gate stops the whole component, but the
|
|
321
|
+
// records it produced before the gate still belong in the run.
|
|
322
|
+
if (err instanceof GateStop) {
|
|
323
|
+
return {
|
|
324
|
+
records: err.records,
|
|
325
|
+
executed: err.executed,
|
|
326
|
+
failed: false,
|
|
327
|
+
pending: err.pending,
|
|
328
|
+
pushed: err.pushed,
|
|
329
|
+
pushWarning: err.pushWarning,
|
|
330
|
+
mismatch: err.mismatch,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
throw err;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
onProgress?.({ type: "step", component: ctx.component, phase: phaseDef.phase, step: entry.kind, status: "running" });
|
|
337
|
+
const { record, resolvedInput, output } = await runCapabilityStep(entry, phaseDef.phase, ctx, registry, phaseOutputs, componentOutputs);
|
|
338
|
+
onProgress?.({
|
|
339
|
+
type: "step",
|
|
340
|
+
component: ctx.component,
|
|
341
|
+
phase: phaseDef.phase,
|
|
342
|
+
step: entry.kind,
|
|
343
|
+
status: record.status === "ok" ? "ok" : "failed",
|
|
344
|
+
...(record.error !== undefined ? { error: record.error } : {}),
|
|
345
|
+
});
|
|
346
|
+
if (record.status === "ok") {
|
|
347
|
+
phaseOutputs[phaseDef.phase] = { ...(phaseOutputs[phaseDef.phase] ?? {}), ...output };
|
|
348
|
+
// The release's service.version is the digest a later deploy step stamps (#3061): the
|
|
349
|
+
// last artifact this component promoted, the same one auto-release records.
|
|
350
|
+
if (ctx.release && isPromotedArtifact(output) && typeof output.digest === "string" && output.digest !== "") {
|
|
351
|
+
ctx.release.version = output.digest;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
records: [record],
|
|
356
|
+
executed: record.status === "ok" ? [{ step: entry, resolvedInput, phaseName: phaseDef.phase, output }] : [],
|
|
357
|
+
failed: record.status === "fail",
|
|
358
|
+
};
|
|
359
|
+
};
|
|
360
|
+
const skippedRecord = (entry) => ({
|
|
361
|
+
component: ctx.component,
|
|
362
|
+
phase: phaseDef.phase,
|
|
363
|
+
kind: isPhaseStep(entry) ? entry.phase : entry.kind,
|
|
364
|
+
status: "skipped",
|
|
365
|
+
durationMs: 0,
|
|
366
|
+
});
|
|
367
|
+
const runEntries = async () => {
|
|
368
|
+
const gateRecords = await decideGates();
|
|
369
|
+
if (phaseDef.parallel) {
|
|
370
|
+
const results = await Promise.all(entries.map(runEntry));
|
|
371
|
+
const records = gateRecords.concat(results.flatMap((r) => r.records));
|
|
372
|
+
const executed = results.flatMap((r) => r.executed);
|
|
373
|
+
const withPending = results.find((r) => r.pending);
|
|
374
|
+
if (withPending?.pending) {
|
|
375
|
+
throw new GateStop(records, executed, withPending.pending, withPending.pushed, withPending.pushWarning, withPending.mismatch);
|
|
376
|
+
}
|
|
377
|
+
if (results.some((r) => r.failed))
|
|
378
|
+
throw new StepFailure(records, executed);
|
|
379
|
+
return { records, executed };
|
|
380
|
+
}
|
|
381
|
+
const records = [...gateRecords];
|
|
382
|
+
const executed = [];
|
|
383
|
+
for (let i = 0; i < entries.length; i++) {
|
|
384
|
+
const result = await runEntry(entries[i]);
|
|
385
|
+
records.push(...result.records);
|
|
386
|
+
executed.push(...result.executed);
|
|
387
|
+
if (result.pending) {
|
|
388
|
+
for (const skipped of entries.slice(i + 1))
|
|
389
|
+
records.push(skippedRecord(skipped));
|
|
390
|
+
throw new GateStop(records, executed, result.pending, result.pushed, result.pushWarning, result.mismatch);
|
|
391
|
+
}
|
|
392
|
+
if (result.failed) {
|
|
393
|
+
for (const skipped of entries.slice(i + 1))
|
|
394
|
+
records.push(skippedRecord(skipped));
|
|
395
|
+
throw new StepFailure(records, executed);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return { records, executed };
|
|
399
|
+
};
|
|
400
|
+
onProgress?.({ type: "phase-start", component: ctx.component, phase: phaseDef.phase });
|
|
401
|
+
try {
|
|
402
|
+
const result = await runEntries();
|
|
403
|
+
onProgress?.({ type: "phase-done", component: ctx.component, phase: phaseDef.phase, status: "ok" });
|
|
404
|
+
return result;
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
if (err instanceof GateStop) {
|
|
408
|
+
onProgress?.({ type: "phase-done", component: ctx.component, phase: phaseDef.phase, status: "gated" });
|
|
409
|
+
}
|
|
410
|
+
else if (err instanceof StepFailure) {
|
|
411
|
+
onProgress?.({ type: "phase-done", component: ctx.component, phase: phaseDef.phase, status: "failed" });
|
|
412
|
+
}
|
|
413
|
+
throw err;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Roll back every executed step in reverse order via its capability's
|
|
418
|
+
* `rollback`, if declared. Best-effort: a rollback failure is recorded but
|
|
419
|
+
* does not stop the unwind.
|
|
420
|
+
*
|
|
421
|
+
* A step whose capability declares no `rollback` is not silently passed over:
|
|
422
|
+
* it gets its own `"rollback-opted-out"` record, carrying the step's
|
|
423
|
+
* `noRollback` reason when the composition declared one (the same opt-out
|
|
424
|
+
* property COMP003 lint requires at author time — see
|
|
425
|
+
* ../lint/rules/comp/comp003-mutating-no-rollback.ts) or a generic fallback
|
|
426
|
+
* message otherwise. This is decided purely by whether `capability.rollback`
|
|
427
|
+
* exists — never by the step's `kind` or the component's name — so it stays
|
|
428
|
+
* capability-agnostic like the rest of this module.
|
|
429
|
+
*/
|
|
430
|
+
async function rollbackExecuted(executed, ctx, registry) {
|
|
431
|
+
const records = [];
|
|
432
|
+
for (const { step, resolvedInput, phaseName, output } of [...executed].reverse()) {
|
|
433
|
+
const start = Date.now();
|
|
434
|
+
try {
|
|
435
|
+
const capability = registry.resolve(step.kind);
|
|
436
|
+
if (!capability.rollback) {
|
|
437
|
+
const reason = typeof step.noRollback === "string" ? step.noRollback : undefined;
|
|
438
|
+
records.push({
|
|
439
|
+
component: ctx.component,
|
|
440
|
+
phase: phaseName,
|
|
441
|
+
kind: step.kind,
|
|
442
|
+
status: "rollback-opted-out",
|
|
443
|
+
durationMs: Date.now() - start,
|
|
444
|
+
error: reason ?? `capability "${step.kind}" declares no rollback and the step has no "noRollback" reason`,
|
|
445
|
+
});
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
await capability.rollback(ctx, resolvedInput, output);
|
|
449
|
+
records.push({
|
|
450
|
+
component: ctx.component,
|
|
451
|
+
phase: phaseName,
|
|
452
|
+
kind: step.kind,
|
|
453
|
+
status: "rolled-back",
|
|
454
|
+
durationMs: Date.now() - start,
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
catch (err) {
|
|
458
|
+
records.push({
|
|
459
|
+
component: ctx.component,
|
|
460
|
+
phase: phaseName,
|
|
461
|
+
kind: step.kind,
|
|
462
|
+
status: "fail",
|
|
463
|
+
durationMs: Date.now() - start,
|
|
464
|
+
error: errMessage(err),
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return records;
|
|
469
|
+
}
|
|
470
|
+
// ── Per-component deploy ─────────────────────────────────────────────────
|
|
471
|
+
/**
|
|
472
|
+
* Run one component's `deploy` composition. On terminal failure: unwind every
|
|
473
|
+
* executed step in reverse via its capability's `rollback` (saga
|
|
474
|
+
* compensation), then run the component's declared `rollback` phases in
|
|
475
|
+
* reverse order (best-effort), matching ../op/local-executor.ts's `onFailure`
|
|
476
|
+
* handling. Cross-component artifact outputs this component published (if
|
|
477
|
+
* any) are recorded into `componentOutputs` under its own name so downstream
|
|
478
|
+
* components can reference `@<name>.publish.*`.
|
|
479
|
+
*
|
|
480
|
+
* `onProgress`, when supplied, is forwarded to every `runPhase` call (both the
|
|
481
|
+
* forward `deploy` phases and, on failure, the component's own authored
|
|
482
|
+
* `rollback` phases) so a `--progress-json` consumer sees `phase-start`/
|
|
483
|
+
* `step`/`phase-done` events for whichever phases actually ran. The saga
|
|
484
|
+
* unwind step-by-step compensation (`rollbackExecuted` below) is not part of
|
|
485
|
+
* the `RunProgressEvent` contract and stays silent — it isn't a `deploy`
|
|
486
|
+
* phase, and its record statuses (`rolled-back`/`rollback-opted-out`) don't
|
|
487
|
+
* map onto the `step` event's `running`/`ok`/`failed` shape.
|
|
488
|
+
*/
|
|
489
|
+
export async function runComponentDeploy(component, ctx, registry, componentOutputs, onProgress, gateContext = { port: gitGateLedgerPort() }) {
|
|
490
|
+
// Each component tracks its own release: a digest one component promoted never stamps another's deploy.
|
|
491
|
+
if (ctx.release)
|
|
492
|
+
ctx = { ...ctx, release: { ...ctx.release } };
|
|
493
|
+
const phaseOutputs = {};
|
|
494
|
+
// #2574: every gate this component reaches binds its approval to this
|
|
495
|
+
// environment and this composition, so an approval for staging or for last
|
|
496
|
+
// week's deploy cannot pass it.
|
|
497
|
+
const release = gateContext.releases?.get(component.name);
|
|
498
|
+
// A promote or rollback deploys a recorded digest without publishing one (#2574); that digest is the release's version.
|
|
499
|
+
if (ctx.release && release !== undefined && ctx.release.version === undefined)
|
|
500
|
+
ctx.release.version = release;
|
|
501
|
+
const gates = {
|
|
502
|
+
...gateContext,
|
|
503
|
+
planDigest: componentPlanDigest({
|
|
504
|
+
environment: ctx.env,
|
|
505
|
+
component,
|
|
506
|
+
...(ctx.vars ? { vars: ctx.vars } : {}),
|
|
507
|
+
...(release !== undefined ? { release } : {}),
|
|
508
|
+
}),
|
|
509
|
+
};
|
|
510
|
+
const records = [];
|
|
511
|
+
const allExecuted = [];
|
|
512
|
+
try {
|
|
513
|
+
for (const phaseDef of component.deploy) {
|
|
514
|
+
const result = await runPhase(phaseDef, ctx, registry, phaseOutputs, componentOutputs, gates, onProgress);
|
|
515
|
+
records.push(...result.records);
|
|
516
|
+
allExecuted.push(...result.executed);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
catch (err) {
|
|
520
|
+
// A pending gate stops the component where it stands (#2119): no saga
|
|
521
|
+
// unwind and no `rollback` phase. The steps before the gate ran on
|
|
522
|
+
// purpose and are meant to survive the wait for an approval — undoing
|
|
523
|
+
// them would make every gated run a no-op with a rollback attached.
|
|
524
|
+
if (err instanceof GateStop) {
|
|
525
|
+
records.push(...err.records);
|
|
526
|
+
return {
|
|
527
|
+
component: component.name,
|
|
528
|
+
ok: false,
|
|
529
|
+
status: "gated",
|
|
530
|
+
records,
|
|
531
|
+
gate: err.pending,
|
|
532
|
+
...(err.pushed !== undefined ? { gatePushed: err.pushed } : {}),
|
|
533
|
+
...(err.pushWarning ? { gatePushWarning: err.pushWarning } : {}),
|
|
534
|
+
...(err.mismatch ? { gateMismatch: err.mismatch } : {}),
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
if (err instanceof StepFailure) {
|
|
538
|
+
records.push(...err.records);
|
|
539
|
+
allExecuted.push(...err.executed);
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
throw err;
|
|
543
|
+
}
|
|
544
|
+
records.push(...(await rollbackExecuted(allExecuted, ctx, registry)));
|
|
545
|
+
for (const phaseDef of [...(component.rollback ?? [])].reverse()) {
|
|
546
|
+
try {
|
|
547
|
+
const result = await runPhase(phaseDef, ctx, registry, phaseOutputs, componentOutputs, gates, onProgress);
|
|
548
|
+
records.push(...result.records);
|
|
549
|
+
}
|
|
550
|
+
catch (compErr) {
|
|
551
|
+
if (compErr instanceof StepFailure || compErr instanceof GateStop)
|
|
552
|
+
records.push(...compErr.records);
|
|
553
|
+
else
|
|
554
|
+
throw compErr;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return { component: component.name, ok: false, status: "fail", records };
|
|
558
|
+
}
|
|
559
|
+
// Publish-family and stack outputs become this component's entry in
|
|
560
|
+
// `componentOutputs` — through the same exported accumulator a hosted
|
|
561
|
+
// runtime calls (#700), so local and hosted runs can never diverge on what
|
|
562
|
+
// downstream references see.
|
|
563
|
+
accumulateComponentOutputs(componentOutputs, component.name, phaseOutputs);
|
|
564
|
+
return { component: component.name, ok: true, status: "ok", records };
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Collect the cross-component outputs one finished component exposes to its
|
|
568
|
+
* downstream consumers, from every phase output it produced:
|
|
569
|
+
*
|
|
570
|
+
* - publish-family outputs (publish-image / publish-artifact /
|
|
571
|
+
* load-image-on-host all return at least one of uri/digest/key — see
|
|
572
|
+
* ./verbs/publish.ts) are namespaced under `publish`, so downstream
|
|
573
|
+
* `@<name>.publish.*` references resolve;
|
|
574
|
+
* - stack outputs from an apply step (cfn-deploy returns
|
|
575
|
+
* `CfnDeployOutput.outputs`) are merged at the top level, peer to
|
|
576
|
+
* `publish`, so `resolveWiring`'s stackOutput branch —
|
|
577
|
+
* `resolvePath(componentOutputs[stack], name)` — finds each output by
|
|
578
|
+
* name (the cross-stack apply-order integration deferred in #556, closed
|
|
579
|
+
* in #699). The entry is keyed by the component's own name, which by
|
|
580
|
+
* convention is the stack name a `stackOutput` reference targets (see the
|
|
581
|
+
* pilots and composition-and-wiring.mdx).
|
|
582
|
+
*
|
|
583
|
+
* Both halves are generic by output *shape*, not by capability `kind`, keeping
|
|
584
|
+
* the driver free of per-capability branching. Returns `undefined` when the
|
|
585
|
+
* component exposed nothing.
|
|
586
|
+
*
|
|
587
|
+
* Exported, like `resolveStepInput`, so a hosting runtime accumulates outputs
|
|
588
|
+
* via this exact function rather than re-deriving it (#700). The resolver and the
|
|
589
|
+
* accumulator are the two halves of one contract; sharing only the resolver
|
|
590
|
+
* is how the cross-stack gap #699 closed locally could reopen durably.
|
|
591
|
+
*/
|
|
592
|
+
export function collectComponentOutputs(phaseOutputs) {
|
|
593
|
+
const publishOutput = findPublishOutput(phaseOutputs);
|
|
594
|
+
const stackOutputs = findStackOutputs(phaseOutputs);
|
|
595
|
+
if (!publishOutput && !stackOutputs)
|
|
596
|
+
return undefined;
|
|
597
|
+
return { ...(stackOutputs ?? {}), ...(publishOutput ? { publish: publishOutput } : {}) };
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Record a finished component's outputs (`collectComponentOutputs`) into the
|
|
601
|
+
* shared `componentOutputs` map under the component's own name, merging over
|
|
602
|
+
* any seeded entry (`--seed-outputs`, or a parent orchestrator's
|
|
603
|
+
* thread-through). Mutates and returns `componentOutputs`, so an out-of-process
|
|
604
|
+
* step can hand the updated map back over a JSON boundary — every value in it
|
|
605
|
+
* is plain result data, so the map is serializable by construction. A no-op
|
|
606
|
+
* when the component exposed nothing.
|
|
607
|
+
*/
|
|
608
|
+
export function accumulateComponentOutputs(componentOutputs, componentName, phaseOutputs) {
|
|
609
|
+
const collected = collectComponentOutputs(phaseOutputs);
|
|
610
|
+
if (collected) {
|
|
611
|
+
componentOutputs[componentName] = { ...componentOutputs[componentName], ...collected };
|
|
612
|
+
}
|
|
613
|
+
return componentOutputs;
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Find the output of the last step that looks like a publish result (carries
|
|
617
|
+
* `uri`, `digest`, or `key`) across every phase this component ran, so
|
|
618
|
+
* `collectComponentOutputs` can populate `@<component>.publish.*` for a
|
|
619
|
+
* downstream consumer.
|
|
620
|
+
*/
|
|
621
|
+
function findPublishOutput(phaseOutputs) {
|
|
622
|
+
let found;
|
|
623
|
+
for (const output of Object.values(phaseOutputs)) {
|
|
624
|
+
if (output && ("uri" in output || "digest" in output || "key" in output)) {
|
|
625
|
+
found = { ...found, ...output };
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
return found;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Find the stack `outputs` map produced by an apply-style step (cfn-deploy
|
|
632
|
+
* returns `CfnDeployOutput.outputs`) across every phase this component ran, so
|
|
633
|
+
* a deployed stack's outputs can seed downstream `stackOutput()` resolution.
|
|
634
|
+
*/
|
|
635
|
+
function findStackOutputs(phaseOutputs) {
|
|
636
|
+
let found;
|
|
637
|
+
for (const output of Object.values(phaseOutputs)) {
|
|
638
|
+
const outputs = output?.outputs;
|
|
639
|
+
if (outputs && typeof outputs === "object" && !Array.isArray(outputs)) {
|
|
640
|
+
found = { ...found, ...outputs };
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return found;
|
|
644
|
+
}
|
|
645
|
+
function errMessage(err) {
|
|
646
|
+
return err instanceof Error ? err.message : String(err);
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Run a set of components to completion on the local in-process executor:
|
|
650
|
+
* resolve dependency order and parallel-safe waves from `dependsOn`, then run
|
|
651
|
+
* each wave's components (independent components within a wave run
|
|
652
|
+
* concurrently; components across waves run in wave order), dispatching
|
|
653
|
+
* every step to `registry` by `kind`. Stops the whole run at the first failed
|
|
654
|
+
* component (after that component's own saga rollback completes), returning
|
|
655
|
+
* a result with `ok: false`; throws `DriverRunFailure` carrying that result
|
|
656
|
+
* so callers can choose to inspect or propagate it.
|
|
657
|
+
*
|
|
658
|
+
* A component that stops at an unapproved gate (#2119) ends the run the same
|
|
659
|
+
* way, with `status: "gated"` and the pending fact on `gate` — but it is
|
|
660
|
+
* *returned*, never thrown, because nothing failed. Downstream waves do not
|
|
661
|
+
* run: a gate is the author saying a human decides before the rest happens.
|
|
662
|
+
*
|
|
663
|
+
* Zero per-component logic: this function and everything it calls dispatches
|
|
664
|
+
* purely on the generic `Component`/`Phase`/`Step` shapes and the registry —
|
|
665
|
+
* no branch anywhere names a specific component or capability.
|
|
666
|
+
*/
|
|
667
|
+
/** A component's `DeployContext` for a run: its env, vars and, when the caller knows it, its release. */
|
|
668
|
+
export function deployContext(options, component) {
|
|
669
|
+
const release = options.releaseIdentity?.(component);
|
|
670
|
+
return { env: options.env, component, ...(options.vars ? { vars: options.vars } : {}), ...(release ? { release: { ...release } } : {}) };
|
|
671
|
+
}
|
|
672
|
+
export async function runInterpretDriver(components, registry, options) {
|
|
673
|
+
const { order, waves } = resolveComponentGraph(components);
|
|
674
|
+
const byName = new Map(components.map((c) => [c.name, c]));
|
|
675
|
+
const componentOutputs = { ...(options.componentOutputs ?? {}) };
|
|
676
|
+
const { onProgress } = options;
|
|
677
|
+
const gates = {
|
|
678
|
+
port: options.gates ?? gitGateLedgerPort(),
|
|
679
|
+
...(options.now ? { now: options.now } : {}),
|
|
680
|
+
...(options.releases ? { releases: options.releases } : {}),
|
|
681
|
+
};
|
|
682
|
+
onProgress?.({ type: "run-start", waves });
|
|
683
|
+
const results = [];
|
|
684
|
+
let failedComponent;
|
|
685
|
+
let gated;
|
|
686
|
+
waveLoop: for (const [waveIndex, wave] of waves.entries()) {
|
|
687
|
+
const waveNum = waveIndex + 1;
|
|
688
|
+
onProgress?.({ type: "wave-start", wave: waveNum, components: wave });
|
|
689
|
+
const waveComponents = wave.map((name) => byName.get(name));
|
|
690
|
+
const waveResults = await Promise.all(waveComponents.map(async (component) => {
|
|
691
|
+
onProgress?.({ type: "component-start", wave: waveNum, component: component.name });
|
|
692
|
+
const result = await runComponentDeploy(component, deployContext(options, component.name), registry, componentOutputs, onProgress, gates);
|
|
693
|
+
onProgress?.({ type: "component-done", wave: waveNum, component: component.name, status: progressStatus(result.status) });
|
|
694
|
+
return result;
|
|
695
|
+
}));
|
|
696
|
+
results.push(...waveResults);
|
|
697
|
+
const stopped = waveResults.find((r) => r.status !== "ok");
|
|
698
|
+
onProgress?.({ type: "wave-done", wave: waveNum, status: progressStatus(stopped?.status ?? "ok") });
|
|
699
|
+
if (stopped) {
|
|
700
|
+
// A failure in the same wave outranks a gate: something is actually
|
|
701
|
+
// broken, and reporting the run as "waiting on a human" would hide it.
|
|
702
|
+
const failure = waveResults.find((r) => r.status === "fail");
|
|
703
|
+
if (failure)
|
|
704
|
+
failedComponent = failure.component;
|
|
705
|
+
else
|
|
706
|
+
gated = stopped;
|
|
707
|
+
break waveLoop;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
const status = failedComponent ? "fail" : gated ? "gated" : "ok";
|
|
711
|
+
const ok = status === "ok";
|
|
712
|
+
onProgress?.({ type: "run-done", status: progressStatus(status) });
|
|
713
|
+
const result = {
|
|
714
|
+
order, waves, results, ok, status, failedComponent, componentOutputs,
|
|
715
|
+
...(gated
|
|
716
|
+
? {
|
|
717
|
+
gatedComponent: gated.component,
|
|
718
|
+
gate: gated.gate,
|
|
719
|
+
...(gated.gatePushed !== undefined ? { gatePushed: gated.gatePushed } : {}),
|
|
720
|
+
...(gated.gatePushWarning ? { gatePushWarning: gated.gatePushWarning } : {}),
|
|
721
|
+
...(gated.gateMismatch ? { gateMismatch: gated.gateMismatch } : {}),
|
|
722
|
+
}
|
|
723
|
+
: {}),
|
|
724
|
+
};
|
|
725
|
+
if (status === "fail")
|
|
726
|
+
throw new DriverRunFailure(result);
|
|
727
|
+
return result;
|
|
728
|
+
}
|