@intentius/chant 0.101.0 → 0.104.0
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/dist/agents/checks.d.ts.map +1 -1
- package/dist/attrref.d.ts.map +1 -1
- package/dist/audit/core.d.ts +2 -0
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/nginx.d.ts.map +1 -1
- package/dist/audit/prior-art.d.ts +48 -0
- package/dist/audit/prior-art.d.ts.map +1 -1
- package/dist/behaviour-kinds.d.ts.map +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/change-set.d.ts +232 -0
- package/dist/change-set.d.ts.map +1 -0
- package/dist/cli/commands/audit.d.ts +7 -0
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/carve-emit.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.d.ts +16 -0
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/import.d.ts +8 -0
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts +9 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
- package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/change-set.d.ts +11 -0
- package/dist/cli/handlers/change-set.d.ts.map +1 -0
- package/dist/cli/handlers/dev.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.d.ts +33 -0
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +16 -0
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/pr.d.ts +31 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -0
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/lsp/server.d.ts.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/tools/build.d.ts.map +1 -1
- package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
- package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
- package/dist/cli/mcp/tools/import.d.ts.map +1 -1
- package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
- package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
- package/dist/cli/mcp/tools/search.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.d.ts +4 -3
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +74 -3
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/fetch.d.ts.map +1 -1
- package/dist/codegen/naming.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.d.ts +67 -3
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/registry.d.ts.map +1 -1
- package/dist/components/auto-release.d.ts +16 -0
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability.d.ts +53 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/changed-files.d.ts +31 -0
- package/dist/components/changed-files.d.ts.map +1 -0
- package/dist/components/cli-support.d.ts +9 -1
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +24 -0
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/deploy-units.d.ts.map +1 -1
- package/dist/components/driver.d.ts +13 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/fan-out-output.d.ts +6 -0
- package/dist/components/fan-out-output.d.ts.map +1 -1
- package/dist/components/fan-out-record.d.ts +41 -0
- package/dist/components/fan-out-record.d.ts.map +1 -0
- package/dist/components/fan-out-run.d.ts +65 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-support.d.ts +2 -0
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/fan-out.d.ts +6 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/gated-wave-pipeline.d.ts +50 -0
- package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/layers.d.ts +25 -0
- package/dist/components/layers.d.ts.map +1 -0
- package/dist/components/pr-pipeline.d.ts +61 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -0
- package/dist/components/pr-run.d.ts +119 -0
- package/dist/components/pr-run.d.ts.map +1 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/verbs/process-runner.d.ts.map +1 -1
- package/dist/components/verbs/r2-sync.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
- package/dist/components/verbs/shell.d.ts.map +1 -1
- package/dist/components/verbs/sign.d.ts.map +1 -1
- package/dist/components/verbs/verify.d.ts.map +1 -1
- package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
- package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
- package/dist/components/verbs/wrangler.d.ts.map +1 -1
- package/dist/components/wave-plan.d.ts +49 -0
- package/dist/components/wave-plan.d.ts.map +1 -0
- package/dist/composite.d.ts.map +1 -1
- package/dist/config.d.ts +19 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/declarable.d.ts +16 -0
- package/dist/declarable.d.ts.map +1 -1
- package/dist/discovery/cache.d.ts.map +1 -1
- package/dist/discovery/fold-import.d.ts +15 -5
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/param-deps.d.ts +16 -0
- package/dist/discovery/param-deps.d.ts.map +1 -1
- package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
- package/dist/discovery/specifier-resolve.d.ts +37 -0
- package/dist/discovery/specifier-resolve.d.ts.map +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/fold/fold.d.ts +3 -1
- package/dist/fold/fold.d.ts.map +1 -1
- package/dist/gated-waves.d.ts +147 -0
- package/dist/gated-waves.d.ts.map +1 -0
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-layout.d.ts.map +1 -1
- package/dist/import/base-parser.d.ts.map +1 -1
- package/dist/import/embedded.d.ts +7 -0
- package/dist/import/embedded.d.ts.map +1 -1
- package/dist/import/parser-options.d.ts +14 -0
- package/dist/import/parser-options.d.ts.map +1 -0
- package/dist/import/parser.d.ts +17 -0
- package/dist/import/parser.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/kubectl-context.d.ts.map +1 -1
- package/dist/lexicon-output.d.ts.map +1 -1
- package/dist/lexicon-schema.d.ts +3 -3
- package/dist/lexicon.d.ts +103 -3
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/assert-live.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +22 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +46 -1
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/member-ledger.d.ts.map +1 -1
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/scenario.d.ts.map +1 -1
- package/dist/lifecycle/status.d.ts.map +1 -1
- package/dist/lifecycle/work-lease.d.ts +61 -2
- package/dist/lifecycle/work-lease.d.ts.map +1 -1
- package/dist/lint/config.d.ts +8 -8
- package/dist/lint/engine.d.ts +6 -0
- package/dist/lint/engine.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +18 -0
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lsp/lexicon-providers.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.d.ts +137 -11
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/apply.d.ts +79 -9
- package/dist/op/activities/apply.d.ts.map +1 -1
- package/dist/op/activities/change-set.d.ts +62 -0
- package/dist/op/activities/change-set.d.ts.map +1 -0
- package/dist/op/activities/decide.d.ts +2 -0
- package/dist/op/activities/decide.d.ts.map +1 -1
- package/dist/op/activities/factory.d.ts +137 -0
- package/dist/op/activities/factory.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +5 -1
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
- package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
- package/dist/op/activity-contract.d.ts +1 -1
- package/dist/op/activity-contract.d.ts.map +1 -1
- package/dist/op/activity-failure.d.ts.map +1 -1
- package/dist/op/activity-profiles.d.ts.map +1 -1
- package/dist/op/builders.d.ts +11 -0
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/composites/apply-op.d.ts +12 -5
- package/dist/op/composites/apply-op.d.ts.map +1 -1
- package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
- package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
- package/dist/op/decide-backend.d.ts +5 -1
- package/dist/op/decide-backend.d.ts.map +1 -1
- package/dist/op/decide-read-inputs.d.ts +4 -2
- package/dist/op/decide-read-inputs.d.ts.map +1 -1
- package/dist/op/emulator-lifecycle.d.ts +21 -2
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/factory.d.ts +83 -0
- package/dist/op/factory.d.ts.map +1 -0
- package/dist/op/gate-approval.d.ts +5 -1
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-wait.d.ts.map +1 -1
- package/dist/op/gate.d.ts +19 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/index.d.ts +6 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +6 -0
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/op-ir.d.ts +2 -0
- package/dist/op/op-ir.d.ts.map +1 -1
- package/dist/op/op-verb-class.d.ts.map +1 -1
- package/dist/op/operator.d.ts.map +1 -1
- package/dist/op/run-context.d.ts +39 -0
- package/dist/op/run-context.d.ts.map +1 -0
- package/dist/op/run-live.d.ts.map +1 -1
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/op/source-archive.d.ts.map +1 -1
- package/dist/op/steward-beside.d.ts.map +1 -1
- package/dist/op/steward-points.d.ts.map +1 -1
- package/dist/op/steward.d.ts.map +1 -1
- package/dist/op/types.d.ts +16 -3
- package/dist/op/types.d.ts.map +1 -1
- package/dist/op/work-lease-run.d.ts +24 -4
- package/dist/op/work-lease-run.d.ts.map +1 -1
- package/dist/plan-summary.d.ts +207 -0
- package/dist/plan-summary.d.ts.map +1 -0
- package/dist/pr-forge.d.ts +105 -0
- package/dist/pr-forge.d.ts.map +1 -0
- package/dist/pr-loop.d.ts +178 -0
- package/dist/pr-loop.d.ts.map +1 -0
- package/dist/project-root.d.ts.map +1 -1
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -1
- package/dist/pseudo-parameter.d.ts.map +1 -1
- package/dist/reconcile.d.ts.map +1 -1
- package/dist/secret-materialization.d.ts.map +1 -1
- package/dist/telemetry-attribution.d.ts +31 -0
- package/dist/telemetry-attribution.d.ts.map +1 -1
- package/dist/terraform/emit-source.d.ts.map +1 -1
- package/dist/terraform/hcl2json.d.ts +45 -0
- package/dist/terraform/hcl2json.d.ts.map +1 -0
- package/dist/terraform/parse.d.ts +4 -40
- package/dist/terraform/parse.d.ts.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
- package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
- package/dist/workspace/agent-cli.d.ts +5 -0
- package/dist/workspace/agent-cli.d.ts.map +1 -1
- package/dist/workspace/box-cli.d.ts +12 -0
- package/dist/workspace/box-cli.d.ts.map +1 -0
- package/dist/workspace/box-factory.d.ts +97 -0
- package/dist/workspace/box-factory.d.ts.map +1 -0
- package/dist/workspace/box-listing.d.ts +85 -0
- package/dist/workspace/box-listing.d.ts.map +1 -0
- package/dist/workspace/box-publish.d.ts +147 -0
- package/dist/workspace/box-publish.d.ts.map +1 -0
- package/dist/workspace/broker-protocol.d.ts +190 -0
- package/dist/workspace/broker-protocol.d.ts.map +1 -0
- package/dist/workspace/changes.d.ts.map +1 -1
- package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
- package/dist/workspace/checks/boxes.d.ts.map +1 -1
- package/dist/workspace/checks.d.ts +5 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/compose-graph.d.ts +10 -0
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +2 -2
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
- package/dist/workspace/conformance/broker.d.ts +202 -0
- package/dist/workspace/conformance/broker.d.ts.map +1 -0
- package/dist/workspace/conformance/index.d.ts +68 -6
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/vitest.d.ts +19 -3
- package/dist/workspace/conformance/vitest.d.ts.map +1 -1
- package/dist/workspace/conformance/writer.d.ts +462 -0
- package/dist/workspace/conformance/writer.d.ts.map +1 -0
- package/dist/workspace/decide.d.ts +126 -12
- package/dist/workspace/decide.d.ts.map +1 -1
- package/dist/workspace/decision-points.schema.json +11 -4
- package/dist/workspace/declaration.d.ts +156 -4
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.schema.json +383 -5
- package/dist/workspace/environments.d.ts +36 -10
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/factory-rules.d.ts +180 -0
- package/dist/workspace/factory-rules.d.ts.map +1 -0
- package/dist/workspace/generated-files.d.ts.map +1 -1
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cli.d.ts +2 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/identity.d.ts +111 -0
- package/dist/workspace/identity.d.ts.map +1 -0
- package/dist/workspace/init.d.ts +21 -0
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/intent-cli.d.ts +7 -4
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-record.d.ts +36 -2
- package/dist/workspace/intent-record.d.ts.map +1 -1
- package/dist/workspace/intent.d.ts +249 -8
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/json-edit.d.ts +24 -0
- package/dist/workspace/json-edit.d.ts.map +1 -0
- package/dist/workspace/jsonc.d.ts +11 -0
- package/dist/workspace/jsonc.d.ts.map +1 -1
- package/dist/workspace/kinds.d.ts +66 -4
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/lexicon-symbols.d.ts +29 -0
- package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
- package/dist/workspace/lineage-hash-index.d.ts.map +1 -1
- package/dist/workspace/lineage-lock.d.ts +2 -2
- package/dist/workspace/lineage-lock.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.d.ts +31 -2
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/links.d.ts.map +1 -1
- package/dist/workspace/point-answer.schema.json +42 -2
- package/dist/workspace/points-cli.d.ts +10 -3
- package/dist/workspace/points-cli.d.ts.map +1 -1
- package/dist/workspace/points.d.ts +66 -5
- package/dist/workspace/points.d.ts.map +1 -1
- package/dist/workspace/principal-classes.d.ts +114 -0
- package/dist/workspace/principal-classes.d.ts.map +1 -0
- package/dist/workspace/reason-codes.d.ts +53 -4
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/record-assets.d.ts.map +1 -1
- package/dist/workspace/record-sessions.d.ts +5 -7
- package/dist/workspace/record-sessions.d.ts.map +1 -1
- package/dist/workspace/records-checkout.d.ts +54 -0
- package/dist/workspace/records-checkout.d.ts.map +1 -0
- package/dist/workspace/records-cli.d.ts +34 -1
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-close.d.ts +7 -3
- package/dist/workspace/records-close.d.ts.map +1 -1
- package/dist/workspace/records-since.d.ts.map +1 -1
- package/dist/workspace/records-write.d.ts +68 -7
- package/dist/workspace/records-write.d.ts.map +1 -1
- package/dist/workspace/records.d.ts +43 -9
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/runs-cli.d.ts +296 -0
- package/dist/workspace/runs-cli.d.ts.map +1 -0
- package/dist/workspace/runs.d.ts +544 -0
- package/dist/workspace/runs.d.ts.map +1 -0
- package/dist/workspace/session-kinds.d.ts +1 -1
- package/dist/workspace/session-kinds.d.ts.map +1 -1
- package/dist/workspace/source-block.d.ts +1 -1
- package/dist/workspace/source-block.d.ts.map +1 -1
- package/dist/workspace/squash.d.ts +80 -0
- package/dist/workspace/squash.d.ts.map +1 -0
- package/dist/workspace/status-gates.d.ts +17 -3
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +64 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/symbols.d.ts +63 -0
- package/dist/workspace/symbols.d.ts.map +1 -0
- package/dist/workspace/trailer-joins.d.ts +46 -0
- package/dist/workspace/trailer-joins.d.ts.map +1 -0
- package/dist/workspace/trailers.d.ts +89 -0
- package/dist/workspace/trailers.d.ts.map +1 -0
- package/dist/workspace/trust/attestor.d.ts.map +1 -1
- package/dist/workspace/trust/rotation.d.ts.map +1 -1
- package/dist/workspace/trust/run-commits.d.ts +46 -0
- package/dist/workspace/trust/run-commits.d.ts.map +1 -0
- package/dist/workspace/trust/run-statement.d.ts +128 -0
- package/dist/workspace/trust/run-statement.d.ts.map +1 -0
- package/dist/workspace/trust/seal.d.ts +38 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/test-repo.d.ts.map +1 -1
- package/dist/workspace/trust/verify-cli.d.ts +1 -1
- package/dist/workspace/trust/verify.d.ts +16 -2
- package/dist/workspace/trust/verify.d.ts.map +1 -1
- package/dist/workspace/wip-cli.d.ts +21 -0
- package/dist/workspace/wip-cli.d.ts.map +1 -0
- package/dist/workspace/wip.d.ts +268 -0
- package/dist/workspace/wip.d.ts.map +1 -0
- package/dist/workspace/work-cli.d.ts +39 -3
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-evidence.d.ts +1 -1
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-size.d.ts +55 -0
- package/dist/workspace/work-size.d.ts.map +1 -0
- package/dist/workspace/work.d.ts +26 -1
- package/dist/workspace/work.d.ts.map +1 -1
- package/dist/workspace/workspace-kinds.schema.json +122 -0
- package/dist/workspace/workspace-principals.schema.json +60 -0
- package/dist/workspace/write-lock-cli.d.ts +60 -0
- package/dist/workspace/write-lock-cli.d.ts.map +1 -0
- package/dist/workspace/write-lock.d.ts +152 -0
- package/dist/workspace/write-lock.d.ts.map +1 -0
- package/dist/workspace/write-scope.d.ts +83 -19
- package/dist/workspace/write-scope.d.ts.map +1 -1
- package/dist/yaml.d.ts +21 -39
- package/dist/yaml.d.ts.map +1 -1
- package/package.json +7 -2
- package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
- package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
- package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
- package/src/__fixtures__/change-set/warden.plan.json +44 -0
- package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
- package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
- package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
- package/src/audit/core.test.ts +15 -0
- package/src/audit/core.ts +8 -2
- package/src/audit/discover.test.ts +11 -0
- package/src/audit/discover.ts +7 -2
- package/src/audit/prior-art.ts +15 -0
- package/src/change-set-bundle.test.ts +57 -0
- package/src/change-set.test.ts +215 -0
- package/src/change-set.ts +445 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
- package/src/cli/commands/audit-opt-in.test.ts +54 -0
- package/src/cli/commands/audit.ts +29 -2
- package/src/cli/commands/build.test.ts +19 -0
- package/src/cli/commands/build.ts +3 -2
- package/src/cli/commands/carve-emit-state.test.ts +4 -0
- package/src/cli/commands/carve-emit.ts +5 -19
- package/src/cli/commands/check-lexicon.test.ts +62 -1
- package/src/cli/commands/check-lexicon.ts +36 -6
- package/src/cli/commands/import-live.test.ts +18 -0
- package/src/cli/commands/import-parser-options.test.ts +133 -0
- package/src/cli/commands/import.ts +21 -3
- package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
- package/src/cli/commands/init.test.ts +8 -1
- package/src/cli/commands/init.ts +23 -8
- package/src/cli/commands/lint.test.ts +37 -0
- package/src/cli/commands/onboard.test.ts +53 -3
- package/src/cli/commands/onboard.ts +52 -4
- package/src/cli/commands/pinned-upgrade.ts +73 -33
- package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
- package/src/cli/handlers/build.ts +13 -1
- package/src/cli/handlers/change-set.test.ts +56 -0
- package/src/cli/handlers/change-set.ts +44 -0
- package/src/cli/handlers/components.ts +2 -2
- package/src/cli/handlers/dev.ts +8 -6
- package/src/cli/handlers/fan-out.test.ts +221 -2
- package/src/cli/handlers/fan-out.ts +165 -75
- package/src/cli/handlers/graph.ts +3 -0
- package/src/cli/handlers/lifecycle.test.ts +67 -0
- package/src/cli/handlers/lifecycle.ts +6 -5
- package/src/cli/handlers/misc.ts +2 -0
- package/src/cli/handlers/operator.test.ts +21 -0
- package/src/cli/handlers/operator.ts +121 -6
- package/src/cli/handlers/pr.ts +373 -0
- package/src/cli/handlers/run.test.ts +111 -0
- package/src/cli/handlers/run.ts +86 -24
- package/src/cli/handlers/scenario.ts +2 -2
- package/src/cli/main.test.ts +21 -0
- package/src/cli/main.ts +246 -30
- package/src/cli/mcp/never-over-mcp.test.ts +101 -0
- package/src/cli/mcp/op-tools.ts +24 -2
- package/src/cli/mcp/workspace-tools.test.ts +5 -2
- package/src/cli/mcp/workspace-tools.ts +62 -7
- package/src/cli/registry.ts +74 -3
- package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
- package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
- package/src/codegen/pinned-upgrade.test.ts +104 -0
- package/src/codegen/pinned-upgrade.ts +250 -56
- package/src/codegen/testdata/postgres-tags.json +242 -0
- package/src/components/auto-release.ts +1 -1
- package/src/components/capability.ts +55 -0
- package/src/components/changed-files.ts +66 -0
- package/src/components/cli-support.ts +28 -5
- package/src/components/component.schema.json +17 -0
- package/src/components/component.ts +25 -0
- package/src/components/deploy-units.ts +3 -0
- package/src/components/driver.test.ts +52 -0
- package/src/components/driver.ts +31 -13
- package/src/components/fan-out-output.ts +42 -1
- package/src/components/fan-out-record.ts +69 -0
- package/src/components/fan-out-run.test.ts +17 -0
- package/src/components/fan-out-run.ts +304 -1
- package/src/components/fan-out-support.ts +3 -0
- package/src/components/fan-out-waves.test.ts +375 -0
- package/src/components/fan-out.ts +18 -17
- package/src/components/gated-wave-pipeline.ts +82 -0
- package/src/components/index.ts +1 -0
- package/src/components/layers.ts +30 -0
- package/src/components/pr-pipeline.ts +91 -0
- package/src/components/pr-run.test.ts +205 -0
- package/src/components/pr-run.ts +280 -0
- package/src/components/promote.ts +5 -0
- package/src/components/verbs/shell.test.ts +11 -0
- package/src/components/verbs/shell.ts +7 -3
- package/src/components/wave-plan.ts +124 -0
- package/src/config.test.ts +21 -0
- package/src/config.ts +15 -0
- package/src/declarable.test.ts +21 -0
- package/src/declarable.ts +19 -0
- package/src/discovery/fold-composite.test.ts +41 -5
- package/src/discovery/fold-import.test.ts +129 -0
- package/src/discovery/fold-import.ts +643 -131
- package/src/discovery/fold-package-composite.test.ts +264 -0
- package/src/discovery/fold-specifiers.test.ts +191 -0
- package/src/discovery/param-deps.test.ts +66 -1
- package/src/discovery/param-deps.ts +45 -0
- package/src/discovery/sandbox/bundle.ts +1 -1
- package/src/discovery/specifier-resolve.ts +344 -0
- package/src/fold/fold.test.ts +39 -1
- package/src/fold/fold.ts +83 -9
- package/src/fold-provenance.test.ts +140 -0
- package/src/gated-waves-bundle.test.ts +62 -0
- package/src/gated-waves.test.ts +118 -0
- package/src/gated-waves.ts +240 -0
- package/src/graph-ir.test.ts +83 -0
- package/src/graph-ir.ts +29 -0
- package/src/import/embedded.test.ts +20 -0
- package/src/import/embedded.ts +13 -0
- package/src/import/parser-options.ts +46 -0
- package/src/import/parser.ts +20 -0
- package/src/index.ts +1 -0
- package/src/lexicon.ts +106 -3
- package/src/lifecycle/gate-ledger.ts +23 -0
- package/src/lifecycle/git.ts +102 -16
- package/src/lifecycle/observe.test.ts +18 -0
- package/src/lifecycle/observe.ts +6 -4
- package/src/lifecycle/snapshot.ts +2 -2
- package/src/lifecycle/work-lease.test.ts +1 -1
- package/src/lifecycle/work-lease.ts +93 -2
- package/src/lint/engine.test.ts +55 -0
- package/src/lint/engine.ts +30 -4
- package/src/lint/output-docs.test.ts +59 -56
- package/src/lint/post-synth.test.ts +19 -0
- package/src/lint/post-synth.ts +19 -1
- package/src/meta/declared-imports.test.ts +1 -1
- package/src/op/activities/activity-contracts.ts +84 -0
- package/src/op/activities/apply.test.ts +189 -5
- package/src/op/activities/apply.ts +230 -8
- package/src/op/activities/change-set.ts +114 -0
- package/src/op/activities/decide.ts +3 -0
- package/src/op/activities/factory.ts +675 -0
- package/src/op/activities/index.ts +9 -0
- package/src/op/activities/lexicon-upgrade.test.ts +160 -6
- package/src/op/activities/lexicon-upgrade.ts +154 -51
- package/src/op/activity-contract.test.ts +21 -1
- package/src/op/activity-contract.ts +19 -9
- package/src/op/builders.ts +23 -0
- package/src/op/composites/apply-op.ts +12 -5
- package/src/op/composites/composites.test.ts +30 -3
- package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
- package/src/op/composites/lexicon-upgrade-op.ts +29 -8
- package/src/op/decide-backend.ts +5 -1
- package/src/op/decide-read-inputs.ts +33 -5
- package/src/op/emulator-lifecycle.test.ts +23 -0
- package/src/op/emulator-lifecycle.ts +52 -14
- package/src/op/factory.e2e.test.ts +232 -0
- package/src/op/factory.ts +118 -0
- package/src/op/gate-approval.test.ts +74 -0
- package/src/op/gate-approval.ts +5 -1
- package/src/op/gate.ts +31 -5
- package/src/op/index.ts +11 -1
- package/src/op/local-executor.test.ts +15 -0
- package/src/op/local-executor.ts +40 -12
- package/src/op/local-output.ts +1 -1
- package/src/op/op-ir.test.ts +9 -0
- package/src/op/op-ir.ts +4 -0
- package/src/op/op-verb-class.ts +3 -0
- package/src/op/operator.ts +4 -0
- package/src/op/run-context.test.ts +141 -0
- package/src/op/run-context.ts +51 -0
- package/src/op/runtimes/local.test.ts +14 -0
- package/src/op/runtimes/local.ts +2 -0
- package/src/op/steward-beside.ts +2 -0
- package/src/op/types.ts +16 -3
- package/src/op/work-lease-run.test.ts +47 -0
- package/src/op/work-lease-run.ts +76 -11
- package/src/plan-summary.test.ts +263 -0
- package/src/plan-summary.ts +845 -0
- package/src/pr-forge.test.ts +237 -0
- package/src/pr-forge.ts +332 -0
- package/src/pr-loop-bundle.test.ts +46 -0
- package/src/pr-loop.test.ts +171 -0
- package/src/pr-loop.ts +324 -0
- package/src/provenance.ts +35 -0
- package/src/telemetry-attribution.test.ts +23 -1
- package/src/telemetry-attribution.ts +51 -0
- package/src/terraform/hcl2json.test.ts +21 -0
- package/src/terraform/hcl2json.ts +81 -0
- package/src/terraform/parse.ts +11 -74
- package/src/workspace/agent-cli.ts +7 -3
- package/src/workspace/agent.schema.json +22 -0
- package/src/workspace/app-kind.test.ts +196 -0
- package/src/workspace/box-cli.ts +113 -0
- package/src/workspace/box-factory.test.ts +323 -0
- package/src/workspace/box-factory.ts +136 -0
- package/src/workspace/box-listing-write.schema.json +204 -0
- package/src/workspace/box-listing.test.ts +234 -0
- package/src/workspace/box-listing.ts +324 -0
- package/src/workspace/box-publish.schema.json +498 -0
- package/src/workspace/box-publish.test.ts +204 -0
- package/src/workspace/box-publish.ts +420 -0
- package/src/workspace/box-ship.test.ts +96 -0
- package/src/workspace/broker-protocol.schema.json +186 -0
- package/src/workspace/broker-protocol.test.ts +122 -0
- package/src/workspace/broker-protocol.ts +317 -0
- package/src/workspace/builder-tiers.test.ts +146 -0
- package/src/workspace/change-set.schema.json +460 -0
- package/src/workspace/changes.schema.json +12 -20
- package/src/workspace/changes.ts +4 -1
- package/src/workspace/chant-migrations.e2e.test.ts +17 -5
- package/src/workspace/checks/boxes.test.ts +5 -0
- package/src/workspace/checks.ts +39 -8
- package/src/workspace/component-environments.test.ts +105 -0
- package/src/workspace/compose-graph.ts +7 -0
- package/src/workspace/composites.schema.json +23 -4
- package/src/workspace/composites.test.ts +8 -8
- package/src/workspace/composites.ts +13 -2
- package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
- package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/src/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/src/workspace/conformance/broker.test.ts +122 -0
- package/src/workspace/conformance/broker.ts +792 -0
- package/src/workspace/conformance/conformance.e2e.test.ts +36 -3
- package/src/workspace/conformance/index.mjs +51 -3
- package/src/workspace/conformance/index.ts +107 -15
- package/src/workspace/conformance/vitest.ts +76 -2
- package/src/workspace/conformance/writer-conformance.e2e.test.ts +177 -0
- package/src/workspace/conformance/writer.test.ts +186 -0
- package/src/workspace/conformance/writer.ts +1191 -0
- package/src/workspace/decide.test.ts +208 -4
- package/src/workspace/decide.ts +433 -73
- package/src/workspace/decision-points.schema.json +11 -4
- package/src/workspace/declaration.schema.json +383 -5
- package/src/workspace/declaration.ts +315 -10
- package/src/workspace/environments.ts +66 -14
- package/src/workspace/factory-rules.test.ts +62 -0
- package/src/workspace/factory-rules.ts +218 -0
- package/src/workspace/graph-cli.ts +6 -3
- package/src/workspace/graph.schema.json +314 -0
- package/src/workspace/identity.test.ts +219 -0
- package/src/workspace/identity.ts +186 -0
- package/src/workspace/init.ts +82 -2
- package/src/workspace/intent-cli.ts +84 -13
- package/src/workspace/intent-patch-id.test.ts +162 -0
- package/src/workspace/intent-record.schema.json +336 -1
- package/src/workspace/intent-record.ts +96 -16
- package/src/workspace/intent-reviews.test.ts +76 -0
- package/src/workspace/intent-squash.test.ts +213 -0
- package/src/workspace/intent-why.test.ts +274 -0
- package/src/workspace/intent.schema.json +950 -9
- package/src/workspace/intent.test.ts +11 -2
- package/src/workspace/intent.ts +722 -65
- package/src/workspace/json-edit.test.ts +121 -0
- package/src/workspace/json-edit.ts +142 -0
- package/src/workspace/jsonc.ts +20 -0
- package/src/workspace/kinds.ts +201 -39
- package/src/workspace/lexicon-symbols.test.ts +148 -0
- package/src/workspace/lexicon-symbols.ts +125 -0
- package/src/workspace/lineage-upgrade.test.ts +63 -0
- package/src/workspace/lineage-upgrade.ts +146 -5
- package/src/workspace/plan-summary.schema.json +155 -0
- package/src/workspace/point-answer.schema.json +42 -2
- package/src/workspace/points-cli.ts +42 -16
- package/src/workspace/points-write.schema.json +163 -4
- package/src/workspace/points.schema.json +157 -2
- package/src/workspace/points.test.ts +13 -1
- package/src/workspace/points.ts +118 -12
- package/src/workspace/pr-report.schema.json +95 -0
- package/src/workspace/principal-classes.test.ts +175 -0
- package/src/workspace/principal-classes.ts +307 -0
- package/src/workspace/profiles.test.ts +159 -0
- package/src/workspace/read-contract.test.ts +2 -2
- package/src/workspace/reason-codes.test.ts +23 -3
- package/src/workspace/reason-codes.ts +61 -4
- package/src/workspace/record-sessions.ts +9 -8
- package/src/workspace/records-amend.schema.json +80 -0
- package/src/workspace/records-checkout.ts +106 -0
- package/src/workspace/records-cli.ts +123 -17
- package/src/workspace/records-close.schema.json +79 -0
- package/src/workspace/records-close.ts +31 -7
- package/src/workspace/records-concurrent.e2e.test.ts +135 -0
- package/src/workspace/records-concurrent.test.ts +145 -0
- package/src/workspace/records-formats.test.ts +46 -10
- package/src/workspace/records-new.schema.json +9 -0
- package/src/workspace/records-review.schema.json +80 -0
- package/src/workspace/records-sessions-write.test.ts +69 -0
- package/src/workspace/records-sessions.test.ts +22 -0
- package/src/workspace/records-uncommitted.test.ts +171 -0
- package/src/workspace/records-write.ts +219 -30
- package/src/workspace/records.schema.json +88 -1
- package/src/workspace/records.ts +76 -8
- package/src/workspace/reference-kinds/app/package.json +10 -0
- package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/src/workspace/run-statement.schema.json +622 -0
- package/src/workspace/runs-cli.ts +710 -0
- package/src/workspace/runs-statement.test.ts +239 -0
- package/src/workspace/runs-write.schema.json +994 -0
- package/src/workspace/runs.schema.json +1257 -0
- package/src/workspace/runs.test.ts +281 -0
- package/src/workspace/runs.ts +970 -0
- package/src/workspace/session-kinds.ts +3 -3
- package/src/workspace/squash.ts +198 -0
- package/src/workspace/status-contract.test.ts +10 -2
- package/src/workspace/status-gates.ts +25 -9
- package/src/workspace/status.schema.json +252 -4
- package/src/workspace/status.ts +110 -1
- package/src/workspace/symbols.ts +191 -0
- package/src/workspace/trailer-joins.test.ts +171 -0
- package/src/workspace/trailer-joins.ts +82 -0
- package/src/workspace/trailers.ts +148 -0
- package/src/workspace/trust/run-commits.ts +115 -0
- package/src/workspace/trust/run-statement.ts +226 -0
- package/src/workspace/trust/seal.ts +58 -1
- package/src/workspace/trust/verify-cli.ts +6 -5
- package/src/workspace/trust/verify.ts +39 -6
- package/src/workspace/wip-cli.ts +97 -0
- package/src/workspace/wip-write.schema.json +504 -0
- package/src/workspace/wip.schema.json +334 -0
- package/src/workspace/wip.test.ts +294 -0
- package/src/workspace/wip.ts +753 -0
- package/src/workspace/work-cli.e2e.test.ts +28 -1
- package/src/workspace/work-cli.ts +136 -8
- package/src/workspace/work-evidence.schema.json +5 -0
- package/src/workspace/work-history.schema.json +73 -1
- package/src/workspace/work-history.test.ts +48 -5
- package/src/workspace/work-kind-fields.test.ts +154 -0
- package/src/workspace/work-lease.schema.json +14 -1
- package/src/workspace/work-size.test.ts +77 -0
- package/src/workspace/work-size.ts +93 -0
- package/src/workspace/work.ts +82 -0
- package/src/workspace/workspace-kinds.schema.json +122 -0
- package/src/workspace/workspace-principals.schema.json +60 -0
- package/src/workspace/write-lock-cli.ts +131 -0
- package/src/workspace/write-lock.schema.json +172 -0
- package/src/workspace/write-lock.test.ts +189 -0
- package/src/workspace/write-lock.ts +474 -0
- package/src/workspace/write-scope.test.ts +144 -3
- package/src/workspace/write-scope.ts +192 -45
- package/src/yaml.test.ts +111 -1
- package/src/yaml.ts +141 -549
|
@@ -27,19 +27,75 @@
|
|
|
27
27
|
* behind one fan-out is one approval, and re-deriving the same fan-out does not
|
|
28
28
|
* expire it. A component's *own* authored gates still decide per component —
|
|
29
29
|
* this adds a gate over the set, it does not remove the ones inside it.
|
|
30
|
+
*
|
|
31
|
+
* ## Or one approval per wave
|
|
32
|
+
*
|
|
33
|
+
* `waveGate` (#3049) is the other mode. Each wave is planned once the waves
|
|
34
|
+
* before it applied, and its gate binds that wave's set digest
|
|
35
|
+
* (`../gated-waves.ts`). See {@link runGatedWaves}.
|
|
30
36
|
*/
|
|
31
37
|
|
|
32
38
|
import {
|
|
39
|
+
deployContext,
|
|
33
40
|
runComponentDeploy,
|
|
34
41
|
type DriverComponent,
|
|
35
42
|
type DriverComponentResult,
|
|
36
43
|
type GateContext,
|
|
37
44
|
} from "./driver";
|
|
45
|
+
import type { ReleaseIdentity } from "../telemetry-attribution";
|
|
38
46
|
import { downstreamWithin, remainingFanOut, type FanOutPlan, type FanOutProgress, type FanOutSkip } from "./fan-out";
|
|
39
47
|
import { evaluateGate, gitGateLedgerPort, type GateLedgerPort } from "../op/gate";
|
|
40
48
|
import type { RunProgressEvent } from "./run-progress";
|
|
41
49
|
import type { CapabilityRegistry } from "./capability";
|
|
42
50
|
import type { PendingGateRecord } from "../lifecycle/gate-ledger";
|
|
51
|
+
import type { DeployContext } from "./capability";
|
|
52
|
+
import { planWaveComponent, type WaveComponentPlan } from "./wave-plan";
|
|
53
|
+
import { waveGateName, waveSetDigest, type WaveMember, type WaveRecord } from "../gated-waves";
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* One gate per wave (#3049), each bound to its wave's set digest. The other
|
|
57
|
+
* mode beside {@link FanOutGate}: that one approves the whole set once, this
|
|
58
|
+
* one approves each wave after the waves before it applied.
|
|
59
|
+
*/
|
|
60
|
+
export interface FanOutWaveGate {
|
|
61
|
+
/** The op the gates are recorded under, `fan-out` from the CLI. */
|
|
62
|
+
op: string;
|
|
63
|
+
/** The base gate name. Wave `n` waits on `waveGateName(gate, n)`. */
|
|
64
|
+
gate: string;
|
|
65
|
+
description?: string;
|
|
66
|
+
timeout?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Plan one wave's components. Called once per wave, after every earlier
|
|
69
|
+
* wave settled, with the outputs they left. Defaults to
|
|
70
|
+
* `planWaveComponent` over the run's registry.
|
|
71
|
+
*/
|
|
72
|
+
planComponent?: (
|
|
73
|
+
component: DriverComponent,
|
|
74
|
+
ctx: DeployContext,
|
|
75
|
+
componentOutputs: Record<string, Record<string, unknown>>,
|
|
76
|
+
) => Promise<WaveComponentPlan>;
|
|
77
|
+
/**
|
|
78
|
+
* Run this wave and no other: CI's one job per wave. An earlier wave with
|
|
79
|
+
* work left refuses the run, since this wave's plan would read outputs that
|
|
80
|
+
* do not exist yet. A later wave is left for its own job.
|
|
81
|
+
*/
|
|
82
|
+
only?: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Thrown when `FanOutWaveGate.only` names a wave whose predecessors have not all applied. */
|
|
86
|
+
export class EarlierWaveNotAppliedError extends Error {
|
|
87
|
+
constructor(
|
|
88
|
+
readonly wave: number,
|
|
89
|
+
readonly earlier: number,
|
|
90
|
+
readonly components: string[],
|
|
91
|
+
) {
|
|
92
|
+
super(
|
|
93
|
+
`wave ${wave} cannot run yet: wave ${earlier} has not applied (${components.join(", ")}). ` +
|
|
94
|
+
`Run wave ${earlier} first, with the same --resume record.`,
|
|
95
|
+
);
|
|
96
|
+
this.name = "EarlierWaveNotAppliedError";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
43
99
|
|
|
44
100
|
/** The single gate over a whole fan-out. Omit it to run without one. */
|
|
45
101
|
export interface FanOutGate {
|
|
@@ -60,8 +116,29 @@ export interface FanOutRunOptions {
|
|
|
60
116
|
now?: string;
|
|
61
117
|
/** One approval over the ordered set, bound to `plan.digest`. */
|
|
62
118
|
gate?: FanOutGate;
|
|
119
|
+
/** One approval per wave, each bound to its wave's set digest (#3049). Not with `gate`. */
|
|
120
|
+
waveGate?: FanOutWaveGate;
|
|
121
|
+
/**
|
|
122
|
+
* Plans made before the run, per component and then per member, handed to
|
|
123
|
+
* each component's steps as `DeployContext.plans` (#3183). A pull request's
|
|
124
|
+
* apply plans every member, decides its gate against the set, and passes
|
|
125
|
+
* the plans here so each step applies the plan that was approved. Not
|
|
126
|
+
* with `waveGate`, which plans each wave itself.
|
|
127
|
+
*/
|
|
128
|
+
plans?: Record<string, Record<string, unknown>>;
|
|
129
|
+
/** Called as each wave settles or stops at its gate, so a record survives a kill. */
|
|
130
|
+
onWaveSettled?: (record: WaveRecord) => void;
|
|
63
131
|
/** What an earlier attempt at this same plan already did. */
|
|
64
132
|
progress?: FanOutProgress;
|
|
133
|
+
/** The release each component deploys (#3061), as `InterpretRunOptions.releaseIdentity`. */
|
|
134
|
+
releaseIdentity?: (component: string) => ReleaseIdentity | undefined;
|
|
135
|
+
/**
|
|
136
|
+
* Called as each component settles, with the outputs it exposed, before the
|
|
137
|
+
* rest of its wave finishes. A caller that records progress here keeps what
|
|
138
|
+
* already applied when the process is killed mid-fan-out, which waiting for
|
|
139
|
+
* the returned result cannot do.
|
|
140
|
+
*/
|
|
141
|
+
onComponentSettled?: (result: DriverComponentResult, outputs: Record<string, unknown> | undefined) => void;
|
|
65
142
|
}
|
|
66
143
|
|
|
67
144
|
export interface FanOutRunResult {
|
|
@@ -78,6 +155,8 @@ export interface FanOutRunResult {
|
|
|
78
155
|
componentOutputs: Record<string, Record<string, unknown>>;
|
|
79
156
|
/** Present when `status === "gated"`: the pending fact to approve. */
|
|
80
157
|
gate?: PendingGateRecord;
|
|
158
|
+
/** With `waveGate`: each wave this attempt planned, in order, the one it stopped at included. */
|
|
159
|
+
waves?: WaveRecord[];
|
|
81
160
|
}
|
|
82
161
|
|
|
83
162
|
/**
|
|
@@ -103,6 +182,16 @@ export async function runFanOut(
|
|
|
103
182
|
// and a re-run does not re-approve. The digest is carried, not recomputed.
|
|
104
183
|
const active = options.progress ? remainingFanOut(plan, components, options.progress) : plan;
|
|
105
184
|
|
|
185
|
+
if (options.gate && options.waveGate) {
|
|
186
|
+
throw new Error("a fan-out takes one gate over the set or one gate per wave, not both");
|
|
187
|
+
}
|
|
188
|
+
if (options.waveGate && options.plans) {
|
|
189
|
+
throw new Error("a gated-wave fan-out plans each wave itself, so it takes no plans made beforehand");
|
|
190
|
+
}
|
|
191
|
+
if (options.waveGate) {
|
|
192
|
+
return runGatedWaves(plan, active, components, registry, options, options.waveGate, gates, componentOutputs);
|
|
193
|
+
}
|
|
194
|
+
|
|
106
195
|
if (options.gate) {
|
|
107
196
|
const check = await evaluateGate(gates.port, {
|
|
108
197
|
op: options.gate.op,
|
|
@@ -155,9 +244,10 @@ export async function runFanOut(
|
|
|
155
244
|
const waveResults = await Promise.all(
|
|
156
245
|
runnable.map(async (name) => {
|
|
157
246
|
options.onProgress?.({ type: "component-start", wave: waveNum, component: name });
|
|
247
|
+
const planned = options.plans?.[name];
|
|
158
248
|
const result = await runComponentDeploy(
|
|
159
249
|
byName.get(name)!,
|
|
160
|
-
{
|
|
250
|
+
{ ...deployContext(options, name), ...(planned && Object.keys(planned).length > 0 ? { plans: planned } : {}) },
|
|
161
251
|
registry,
|
|
162
252
|
componentOutputs,
|
|
163
253
|
options.onProgress,
|
|
@@ -169,6 +259,7 @@ export async function runFanOut(
|
|
|
169
259
|
component: name,
|
|
170
260
|
status: result.status === "fail" ? "failed" : result.status,
|
|
171
261
|
});
|
|
262
|
+
options.onComponentSettled?.(result, componentOutputs[name]);
|
|
172
263
|
return result;
|
|
173
264
|
}),
|
|
174
265
|
);
|
|
@@ -219,3 +310,215 @@ export async function runFanOut(
|
|
|
219
310
|
...(gatedFact ? { gate: gatedFact } : {}),
|
|
220
311
|
};
|
|
221
312
|
}
|
|
313
|
+
|
|
314
|
+
/** A plan failure as a component result, so it reads like any other failed component. */
|
|
315
|
+
function planFailure(component: string, error: string): DriverComponentResult {
|
|
316
|
+
return {
|
|
317
|
+
component,
|
|
318
|
+
ok: false,
|
|
319
|
+
status: "fail",
|
|
320
|
+
records: [{ component, phase: "Plan", kind: "plan", status: "fail", durationMs: 0, error }],
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* The per-wave mode (#3049). Waves keep the numbers the derivation gave them,
|
|
326
|
+
* so on a resumed attempt wave 3 is still wave 3 and its gate, and the
|
|
327
|
+
* approval recorded for it, are the same ones.
|
|
328
|
+
*
|
|
329
|
+
* For each wave with work left: plan its components against the outputs
|
|
330
|
+
* earlier waves wrote, take the set digest of what was planned, and decide
|
|
331
|
+
* `waveGateName(gate, n)` against it. Approved, the wave runs, each
|
|
332
|
+
* component applying the plans its steps just made. Not approved, the run
|
|
333
|
+
* stops there with nothing in that wave or after it applied. An approval
|
|
334
|
+
* that stands for another digest (the set changed since someone approved
|
|
335
|
+
* it) is the same stop, and the record names both digests.
|
|
336
|
+
*
|
|
337
|
+
* A component that fails to plan or to apply blocks its own dependents and
|
|
338
|
+
* nothing else, as in the whole-set mode.
|
|
339
|
+
*/
|
|
340
|
+
async function runGatedWaves(
|
|
341
|
+
plan: FanOutPlan,
|
|
342
|
+
active: FanOutPlan,
|
|
343
|
+
components: DriverComponent[],
|
|
344
|
+
registry: CapabilityRegistry,
|
|
345
|
+
options: FanOutRunOptions,
|
|
346
|
+
waveGate: FanOutWaveGate,
|
|
347
|
+
gates: GateContext,
|
|
348
|
+
componentOutputs: Record<string, Record<string, unknown>>,
|
|
349
|
+
): Promise<FanOutRunResult> {
|
|
350
|
+
const byName = new Map(components.map((c) => [c.name, c]));
|
|
351
|
+
const left = new Set(active.order);
|
|
352
|
+
const planComponent =
|
|
353
|
+
waveGate.planComponent ??
|
|
354
|
+
((component: DriverComponent, ctx: DeployContext, outputs: Record<string, Record<string, unknown>>) =>
|
|
355
|
+
planWaveComponent(component, registry, ctx, outputs));
|
|
356
|
+
|
|
357
|
+
const results: DriverComponentResult[] = [];
|
|
358
|
+
const completed: string[] = [];
|
|
359
|
+
const failed: string[] = [];
|
|
360
|
+
const blockedBy = new Map<string, string>();
|
|
361
|
+
const waves: WaveRecord[] = [];
|
|
362
|
+
let gatedFact: PendingGateRecord | undefined;
|
|
363
|
+
|
|
364
|
+
const markBlocked = (root: string): void => {
|
|
365
|
+
for (const [component, by] of downstreamWithin(components, left, [root])) {
|
|
366
|
+
if (blockedBy.has(component) || failed.includes(component)) continue;
|
|
367
|
+
blockedBy.set(component, by);
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
options.onProgress?.({ type: "run-start", waves: plan.waves });
|
|
372
|
+
|
|
373
|
+
for (const [waveIndex, wave] of plan.waves.entries()) {
|
|
374
|
+
const waveNum = waveIndex + 1;
|
|
375
|
+
const runnable = wave.filter((name) => left.has(name) && !blockedBy.has(name));
|
|
376
|
+
if (waveGate.only !== undefined && waveNum < waveGate.only) {
|
|
377
|
+
if (runnable.length > 0) throw new EarlierWaveNotAppliedError(waveGate.only, waveNum, runnable);
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
if (waveGate.only !== undefined && waveNum > waveGate.only) break;
|
|
381
|
+
if (runnable.length === 0) continue;
|
|
382
|
+
|
|
383
|
+
const gateName = waveGateName(waveGate.gate, waveNum);
|
|
384
|
+
const contexts = new Map(runnable.map((name) => [name, deployContext(options, name)]));
|
|
385
|
+
const planned = await Promise.all(
|
|
386
|
+
runnable.map((name) => planComponent(byName.get(name)!, contexts.get(name)!, componentOutputs)),
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
const members: WaveMember[] = [];
|
|
390
|
+
const plansFor = new Map<string, Record<string, unknown>>();
|
|
391
|
+
const waveFailures: Array<{ component: string; error?: string }> = [];
|
|
392
|
+
for (const p of planned) {
|
|
393
|
+
if ("error" in p) {
|
|
394
|
+
waveFailures.push({ component: p.component, error: p.error });
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
members.push(...p.members);
|
|
398
|
+
plansFor.set(p.component, p.plans);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
let digest: string;
|
|
402
|
+
try {
|
|
403
|
+
// A wave where nothing planned has no set, and so no digest.
|
|
404
|
+
digest = members.length > 0 ? waveSetDigest(members) : "";
|
|
405
|
+
} catch (err) {
|
|
406
|
+
// Two components planning the same root: there is no one plan for it.
|
|
407
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
408
|
+
for (const name of plansFor.keys()) waveFailures.push({ component: name, error });
|
|
409
|
+
plansFor.clear();
|
|
410
|
+
digest = "";
|
|
411
|
+
}
|
|
412
|
+
for (const f of waveFailures) {
|
|
413
|
+
failed.push(f.component);
|
|
414
|
+
results.push(planFailure(f.component, f.error ?? "plan failed"));
|
|
415
|
+
markBlocked(f.component);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
const toRun = runnable.filter((name) => plansFor.has(name));
|
|
419
|
+
const record: WaveRecord = {
|
|
420
|
+
wave: waveNum,
|
|
421
|
+
op: waveGate.op,
|
|
422
|
+
gate: gateName,
|
|
423
|
+
components: [...runnable].sort(),
|
|
424
|
+
digest,
|
|
425
|
+
members: [...members].sort((a, b) => a.member.localeCompare(b.member)),
|
|
426
|
+
status: "failed",
|
|
427
|
+
...(waveFailures.length > 0 ? { failed: waveFailures } : {}),
|
|
428
|
+
};
|
|
429
|
+
if (toRun.length === 0) {
|
|
430
|
+
waves.push(record);
|
|
431
|
+
options.onWaveSettled?.(record);
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const check = await evaluateGate(gates.port, {
|
|
436
|
+
op: waveGate.op,
|
|
437
|
+
gate: gateName,
|
|
438
|
+
planDigest: digest,
|
|
439
|
+
description: waveGate.description ?? `wave ${waveNum} of ${plan.waves.length}: ${toRun.join(", ")}`,
|
|
440
|
+
...(waveGate.timeout ? { timeout: waveGate.timeout } : {}),
|
|
441
|
+
...(options.now ? { now: options.now } : {}),
|
|
442
|
+
});
|
|
443
|
+
if (!check.satisfied) {
|
|
444
|
+
// Nothing in this wave ran, and no later wave is planned: its plan
|
|
445
|
+
// would read outputs this wave has not written.
|
|
446
|
+
const stopped: WaveRecord = {
|
|
447
|
+
...record,
|
|
448
|
+
status: "gated",
|
|
449
|
+
...(check.mismatch?.approved ? { approved: check.mismatch.approved } : {}),
|
|
450
|
+
};
|
|
451
|
+
waves.push(stopped);
|
|
452
|
+
options.onWaveSettled?.(stopped);
|
|
453
|
+
gatedFact = check.pending;
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
options.onProgress?.({ type: "wave-start", wave: waveNum, components: toRun });
|
|
458
|
+
const waveResults = await Promise.all(
|
|
459
|
+
toRun.map(async (name) => {
|
|
460
|
+
options.onProgress?.({ type: "component-start", wave: waveNum, component: name });
|
|
461
|
+
const plans = plansFor.get(name)!;
|
|
462
|
+
const ctx = { ...contexts.get(name)!, ...(Object.keys(plans).length > 0 ? { plans } : {}) };
|
|
463
|
+
const result = await runComponentDeploy(byName.get(name)!, ctx, registry, componentOutputs, options.onProgress, gates);
|
|
464
|
+
options.onProgress?.({
|
|
465
|
+
type: "component-done",
|
|
466
|
+
wave: waveNum,
|
|
467
|
+
component: name,
|
|
468
|
+
status: result.status === "fail" ? "failed" : result.status,
|
|
469
|
+
});
|
|
470
|
+
options.onComponentSettled?.(result, componentOutputs[name]);
|
|
471
|
+
return result;
|
|
472
|
+
}),
|
|
473
|
+
);
|
|
474
|
+
results.push(...waveResults);
|
|
475
|
+
|
|
476
|
+
for (const result of waveResults) {
|
|
477
|
+
if (result.status === "ok") {
|
|
478
|
+
completed.push(result.component);
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
if (result.status === "fail") {
|
|
482
|
+
failed.push(result.component);
|
|
483
|
+
waveFailures.push({ component: result.component });
|
|
484
|
+
} else {
|
|
485
|
+
gatedFact ??= result.gate;
|
|
486
|
+
}
|
|
487
|
+
markBlocked(result.component);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const settled: WaveRecord = {
|
|
491
|
+
...record,
|
|
492
|
+
status: waveFailures.length > 0 ? "failed" : "applied",
|
|
493
|
+
approvedBy: check.resolution.resolvedBy,
|
|
494
|
+
...(waveFailures.length > 0 ? { failed: waveFailures } : {}),
|
|
495
|
+
};
|
|
496
|
+
waves.push(settled);
|
|
497
|
+
options.onWaveSettled?.(settled);
|
|
498
|
+
options.onProgress?.({
|
|
499
|
+
type: "wave-done",
|
|
500
|
+
wave: waveNum,
|
|
501
|
+
status: waveFailures.length > 0 ? "failed" : waveResults.some((r) => r.status === "gated") ? "gated" : "ok",
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const blocked: FanOutSkip[] = [...blockedBy.entries()]
|
|
506
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
507
|
+
.map(([component, by]) => ({ component, reason: "blocked" as const, blockedBy: by }));
|
|
508
|
+
|
|
509
|
+
const status: FanOutRunResult["status"] = failed.length > 0 ? "fail" : gatedFact ? "gated" : "ok";
|
|
510
|
+
options.onProgress?.({ type: "run-done", status: status === "fail" ? "failed" : status });
|
|
511
|
+
|
|
512
|
+
return {
|
|
513
|
+
// The derivation's waves, not the narrowed re-layering: their numbers name the gates.
|
|
514
|
+
plan: { ...active, waves: plan.waves },
|
|
515
|
+
status,
|
|
516
|
+
results,
|
|
517
|
+
completed: [...completed].sort(),
|
|
518
|
+
failed: [...failed].sort(),
|
|
519
|
+
blocked,
|
|
520
|
+
componentOutputs,
|
|
521
|
+
...(gatedFact ? { gate: gatedFact } : {}),
|
|
522
|
+
waves,
|
|
523
|
+
};
|
|
524
|
+
}
|
|
@@ -33,6 +33,8 @@ export interface DeriveFanOutOptions {
|
|
|
33
33
|
buildParams?: BuildParamProvenance[];
|
|
34
34
|
/** Already-loaded project config, when the caller read it for its own reasons. */
|
|
35
35
|
config?: ChantConfig;
|
|
36
|
+
/** Components that form wave 1 (#3049). See `FanOutRequest.canary`. */
|
|
37
|
+
canary?: string[];
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
export interface DerivedFanOut {
|
|
@@ -80,6 +82,7 @@ export async function deriveFanOut(options: DeriveFanOutOptions): Promise<Derive
|
|
|
80
82
|
components,
|
|
81
83
|
changed: signal.changed,
|
|
82
84
|
...(signal.indeterminate.length > 0 ? { indeterminate: signal.indeterminate } : {}),
|
|
85
|
+
...(options.canary?.length ? { canary: options.canary } : {}),
|
|
83
86
|
});
|
|
84
87
|
|
|
85
88
|
return { success: true, components, signal, plan };
|