@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,521 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision points (ws-058, #2738): the recurring questions a workspace asks of
|
|
3
|
+
* its own graph, declared as data, and the answers they leave (#2739).
|
|
4
|
+
*
|
|
5
|
+
* A points file is JSON, validated against `decision-points.schema.json`, and
|
|
6
|
+
* named by a record kind's `answers.points`: the kind whose records are the
|
|
7
|
+
* answers. Each point is a typed question (`noul`, `choice` or `score`, the
|
|
8
|
+
* question types of the POST /v1/systemone wire format, #2491), the inputs it
|
|
9
|
+
* reads, each named as a read-contract output, and an ordered chain of
|
|
10
|
+
* deciders:
|
|
11
|
+
*
|
|
12
|
+
* table rows of { when, answer }; the first row whose conditions all hold answers.
|
|
13
|
+
* model a backend asked the question with the inputs as its state, at a
|
|
14
|
+
* pinned model id. An answer at or above the threshold is a
|
|
15
|
+
* proposal a person confirms; below it, the next decider is asked.
|
|
16
|
+
* quorum people. Always last: the question escalates to them.
|
|
17
|
+
*
|
|
18
|
+
* A point declared `adhoc` (#3403) has no candidates of its own: its
|
|
19
|
+
* question's text and candidates come with each ask, as an agent's question
|
|
20
|
+
* to the room does, and the answer record keeps them as `asked`, so people's
|
|
21
|
+
* answer is checked against the candidates the question was asked with. Only
|
|
22
|
+
* people decide it: its chain is one quorum.
|
|
23
|
+
*
|
|
24
|
+
* chant never calls a model (ws-052). {@link runChain} takes the model call
|
|
25
|
+
* as a function, {@link ModelAsk}, which the decide Op activity (#2740), a
|
|
26
|
+
* runtime's decider or a test's stub supplies. Without one, a model decider is
|
|
27
|
+
* not asked and the chain moves on.
|
|
28
|
+
*
|
|
29
|
+
* Ported from chud's `packages/runtime/src/decide.mjs` at 43afcf1: the chain,
|
|
30
|
+
* the observation rule, the point version and the inputs hash. The records
|
|
31
|
+
* are chant records: `decide.ts` writes them, and {@link applyAnswers} warns
|
|
32
|
+
* about them on read.
|
|
33
|
+
*/
|
|
34
|
+
import { createHash } from "node:crypto";
|
|
35
|
+
import { createRequire } from "node:module";
|
|
36
|
+
import { dirname, posix, relative, resolve, sep } from "node:path";
|
|
37
|
+
import schema from "./decision-points.schema.json" with { type: "json" };
|
|
38
|
+
export const DECISION_POINTS_SCHEMA_ID = schema.$id;
|
|
39
|
+
// ── The read-contract outputs an input may name ─────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* The read-contract outputs a point's input may name (#2738), each with the
|
|
42
|
+
* output schema and `$defs` entry that describes it. Closed: an input naming
|
|
43
|
+
* anything else is refused. `record`, `decision` and `work-item` are records
|
|
44
|
+
* as `records --json` lists them, of any kind, a decision kind and a work kind.
|
|
45
|
+
*/
|
|
46
|
+
export const POINT_INPUT_OUTPUTS = {
|
|
47
|
+
record: { schema: "records", def: "record", description: "a record of any kind, as records --json lists it" },
|
|
48
|
+
decision: { schema: "records", def: "record", description: "a decision record, as records --json lists it" },
|
|
49
|
+
"work-item": { schema: "records", def: "record", description: "a work item record, as records --json lists it (#2683)" },
|
|
50
|
+
finding: { schema: "intent", def: "finding", description: "a finding of graph --intent, or of check --changes (#2794)" },
|
|
51
|
+
region: { schema: "intent", def: "region", description: "the region an intent graph covers" },
|
|
52
|
+
commit: { schema: "intent", def: "commit", description: "a commit in an intent graph's window" },
|
|
53
|
+
node: { schema: "intent", def: "node", description: "any node of an intent graph, by its id and kind: a commit, decision, unit, artifact or the region itself, as an intent walk asks of it (#3351)" },
|
|
54
|
+
ask: { schema: "points", def: "question", description: "an ad-hoc question as its asker knows it (#3403): the asker's own id for the ask, such as hud's request id for an agent's question, and who asked" },
|
|
55
|
+
member: { schema: "ls", def: "member", description: "a member, as ls lists it" },
|
|
56
|
+
gate: { schema: "status", def: "gate", description: "a gate, as status lists it" },
|
|
57
|
+
release: { schema: "status", def: "release", description: "a release, as status lists it; a release plan's fields until the lifecycle ledger lists plans (#2717)" },
|
|
58
|
+
environment: { schema: "status", def: "environment", description: "an environment, as status lists it" },
|
|
59
|
+
component: { schema: "composites", def: "component", description: "a component, as graph --composites lists it" },
|
|
60
|
+
};
|
|
61
|
+
export const POINT_INPUT_OUTPUT_NAMES = Object.keys(POINT_INPUT_OUTPUTS);
|
|
62
|
+
/** The output an input name reads: the part before its first dot. */
|
|
63
|
+
export function inputOutput(name) {
|
|
64
|
+
const dot = name.indexOf(".");
|
|
65
|
+
return dot < 0 ? name : name.slice(0, dot);
|
|
66
|
+
}
|
|
67
|
+
export class PointsError extends Error {
|
|
68
|
+
constructor(file, problems) {
|
|
69
|
+
super(`${file}: ${problems.map((p) => (p.field ? `${p.field} ${p.message}` : p.message)).join("; ")}`);
|
|
70
|
+
this.file = file;
|
|
71
|
+
this.problems = problems;
|
|
72
|
+
this.name = "PointsError";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** A question's candidate answers: true and false, a choice's options, or a score's levels. */
|
|
76
|
+
export function candidates(question) {
|
|
77
|
+
if (question.type === "noul")
|
|
78
|
+
return [true, false];
|
|
79
|
+
if (question.type === "choice")
|
|
80
|
+
return Object.keys(question.criteria ?? {});
|
|
81
|
+
return [...(question.criteria ?? [])];
|
|
82
|
+
}
|
|
83
|
+
const ONLY = { table: ["rows"], model: ["backend", "model", "threshold", "unreachable"], quorum: ["count", "roles"] };
|
|
84
|
+
/** A model id that names an alias rather than a release, such as jev-latest or jev-preview (#2491). */
|
|
85
|
+
const ALIAS = /(^|[-_./])(latest|preview|stable|current)$/i;
|
|
86
|
+
/** What the schema cannot say about the points (chud's pointProblems, and the input and chain rules of #2738). */
|
|
87
|
+
function pointProblems(points) {
|
|
88
|
+
const problems = [];
|
|
89
|
+
for (const [name, point] of Object.entries(points)) {
|
|
90
|
+
const at = (...path) => ["points", name, ...path].join(".");
|
|
91
|
+
const inputs = Object.keys(point.inputs);
|
|
92
|
+
for (const input of inputs) {
|
|
93
|
+
const output = inputOutput(input);
|
|
94
|
+
if (!POINT_INPUT_OUTPUT_NAMES.includes(output)) {
|
|
95
|
+
problems.push({
|
|
96
|
+
field: at("inputs", input),
|
|
97
|
+
message: `names ${JSON.stringify(output)}, which is not a read-contract output; an input is one of ${POINT_INPUT_OUTPUT_NAMES.join(", ")}, optionally with dotted field names`,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (point.adhoc && (point.deciders.length !== 1 || point.deciders[0].kind !== "quorum")) {
|
|
102
|
+
problems.push({
|
|
103
|
+
field: at("deciders"),
|
|
104
|
+
message: "is an ad-hoc point's chain, and an ad-hoc point is decided by people alone: its chain is one quorum, since no table row or model can know candidates that come with the ask",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const allowed = candidates(point.question);
|
|
108
|
+
const last = point.deciders.length - 1;
|
|
109
|
+
point.deciders.forEach((d, i) => {
|
|
110
|
+
const raw = d;
|
|
111
|
+
for (const [kind, fields] of Object.entries(ONLY)) {
|
|
112
|
+
if (kind === d.kind)
|
|
113
|
+
continue;
|
|
114
|
+
for (const field of fields) {
|
|
115
|
+
if (raw[field] !== undefined && !ONLY[d.kind].includes(field))
|
|
116
|
+
problems.push({ field: at("deciders", i, field), message: `is only for a ${kind} decider, and this one is a ${d.kind}` });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (d.kind === "quorum" && i !== last)
|
|
120
|
+
problems.push({ field: at("deciders", i), message: "is a quorum, and a quorum is the last decider: nobody is asked after people" });
|
|
121
|
+
if (d.kind === "model" && ALIAS.test(d.model)) {
|
|
122
|
+
problems.push({ field: at("deciders", i, "model"), message: `${JSON.stringify(d.model)} is an alias, and an alias moves when a new release ships: pin a versioned model id` });
|
|
123
|
+
}
|
|
124
|
+
if (d.kind === "table") {
|
|
125
|
+
d.rows.forEach((row, r) => {
|
|
126
|
+
if (!allowed.includes(row.answer)) {
|
|
127
|
+
problems.push({ field: at("deciders", i, "rows", r, "answer"), message: `must be one of ${allowed.map((a) => JSON.stringify(a)).join(", ")}, not ${JSON.stringify(row.answer)}` });
|
|
128
|
+
}
|
|
129
|
+
for (const key of Object.keys(row.when)) {
|
|
130
|
+
if (!inputs.includes(key))
|
|
131
|
+
problems.push({ field: at("deciders", i, "rows", r, "when", key), message: `is not one of this point's inputs (${inputs.join(", ")})` });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
if (point.deciders[last]?.kind !== "quorum") {
|
|
137
|
+
problems.push({ field: at("deciders"), message: "must end in a quorum: when no table row or model answers, people do" });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return problems;
|
|
141
|
+
}
|
|
142
|
+
let compiled;
|
|
143
|
+
function validator() {
|
|
144
|
+
if (compiled)
|
|
145
|
+
return compiled;
|
|
146
|
+
const require = createRequire(import.meta.url);
|
|
147
|
+
// ajv is CommonJS; its class is the default export, or that export's own default.
|
|
148
|
+
const mod = require("ajv/dist/2020");
|
|
149
|
+
const Ajv = (mod.default ?? mod);
|
|
150
|
+
compiled = new Ajv({ allErrors: true, strict: false }).compile(schema);
|
|
151
|
+
return compiled;
|
|
152
|
+
}
|
|
153
|
+
const SUMMARY = new Set(["if", "then", "else", "oneOf", "anyOf", "allOf"]);
|
|
154
|
+
/** The schema's problems with `data`, as JSON paths. */
|
|
155
|
+
export function schemaProblems(data) {
|
|
156
|
+
const validate = validator();
|
|
157
|
+
if (validate(data))
|
|
158
|
+
return [];
|
|
159
|
+
const seen = new Set();
|
|
160
|
+
const out = [];
|
|
161
|
+
for (const e of validate.errors ?? []) {
|
|
162
|
+
if (SUMMARY.has(e.keyword))
|
|
163
|
+
continue;
|
|
164
|
+
const path = e.instancePath.split("/").slice(1).map((s) => s.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
165
|
+
const field = path.length ? path.join(".") : null;
|
|
166
|
+
const message = e.keyword === "additionalProperties"
|
|
167
|
+
? `has an unknown field ${JSON.stringify(e.params.additionalProperty)}; only fields named x-... may be added`
|
|
168
|
+
: e.keyword === "required"
|
|
169
|
+
? `is missing ${JSON.stringify(e.params.missingProperty)}`
|
|
170
|
+
: e.keyword === "propertyNames"
|
|
171
|
+
? `has a name that is not allowed: ${JSON.stringify(e.params.propertyName)}`
|
|
172
|
+
: e.keyword === "not"
|
|
173
|
+
? "has criteria, and an ad-hoc point's candidates come with each ask (#3403): leave criteria out"
|
|
174
|
+
: (e.message ?? "is invalid");
|
|
175
|
+
const key = `${field}\0${message}`;
|
|
176
|
+
if (seen.has(key))
|
|
177
|
+
continue;
|
|
178
|
+
seen.add(key);
|
|
179
|
+
out.push({ field, message });
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Parse and validate a points file's text. Returns its points. Throws a
|
|
185
|
+
* {@link PointsError} naming the file and each field.
|
|
186
|
+
*/
|
|
187
|
+
export function parsePoints(text, file) {
|
|
188
|
+
let data;
|
|
189
|
+
try {
|
|
190
|
+
data = JSON.parse(text);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
throw new PointsError(file, [{ field: null, message: `is not JSON: ${err instanceof Error ? err.message : String(err)}` }]);
|
|
194
|
+
}
|
|
195
|
+
const problems = schemaProblems(data);
|
|
196
|
+
if (problems.length > 0)
|
|
197
|
+
throw new PointsError(file, problems);
|
|
198
|
+
const points = data.points;
|
|
199
|
+
const more = pointProblems(points);
|
|
200
|
+
if (more.length > 0)
|
|
201
|
+
throw new PointsError(file, more);
|
|
202
|
+
return points;
|
|
203
|
+
}
|
|
204
|
+
/** One point by name, or undefined. */
|
|
205
|
+
export function pointOf(points, name) {
|
|
206
|
+
return Object.prototype.hasOwnProperty.call(points, name) ? points[name] : undefined;
|
|
207
|
+
}
|
|
208
|
+
/** JSON with keys sorted and undefined members left out, the text every hash here is taken over. */
|
|
209
|
+
export function canonical(value) {
|
|
210
|
+
if (Array.isArray(value))
|
|
211
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
212
|
+
if (value !== null && typeof value === "object") {
|
|
213
|
+
const o = value;
|
|
214
|
+
return `{${Object.keys(o)
|
|
215
|
+
.sort()
|
|
216
|
+
.filter((k) => o[k] !== undefined)
|
|
217
|
+
.map((k) => `${JSON.stringify(k)}:${canonical(o[k])}`)
|
|
218
|
+
.join(",")}}`;
|
|
219
|
+
}
|
|
220
|
+
return JSON.stringify(value);
|
|
221
|
+
}
|
|
222
|
+
const sha256 = (text) => createHash("sha256").update(text, "utf8").digest("hex");
|
|
223
|
+
/** The version of a point: the sha256 of its declaration. Editing the question or any decider changes it. */
|
|
224
|
+
export const pointVersion = (point) => sha256(canonical(point));
|
|
225
|
+
/**
|
|
226
|
+
* What is answered once: the point, its version and the inputs, and for an
|
|
227
|
+
* ad-hoc point the question and candidates it was asked with (#3403).
|
|
228
|
+
*/
|
|
229
|
+
export const inputsHash = (name, version, inputs, asked) => sha256(canonical({ point: name, version, inputs, asked }));
|
|
230
|
+
/** The question an answer asks: the point's own, or for an ad-hoc point the one the ask gave. */
|
|
231
|
+
export function askedQuestion(point, asked) {
|
|
232
|
+
return asked ? { type: point.question.type, instructions: asked.question, criteria: asked.criteria } : point.question;
|
|
233
|
+
}
|
|
234
|
+
const nonEmpty = (v) => typeof v === "string" && v.trim() !== "";
|
|
235
|
+
/**
|
|
236
|
+
* An ad-hoc ask's question and candidates (`points ask --candidates`), checked
|
|
237
|
+
* against the point's question type as a declaration's criteria are: noul
|
|
238
|
+
* describes true and false, choice gives 2 to 255 options, each with what it
|
|
239
|
+
* means, and score 2 to 10 distinct ordered levels. Returns the problems, or
|
|
240
|
+
* the question.
|
|
241
|
+
*/
|
|
242
|
+
export function parseAsked(point, value) {
|
|
243
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
244
|
+
return { problems: ["the candidates must be a JSON object with question and criteria"] };
|
|
245
|
+
const v = value;
|
|
246
|
+
const problems = [];
|
|
247
|
+
const extra = Object.keys(v).filter((k) => k !== "question" && k !== "criteria");
|
|
248
|
+
if (extra.length > 0)
|
|
249
|
+
problems.push(`the candidates take question and criteria, not ${extra.join(", ")}`);
|
|
250
|
+
if (!nonEmpty(v.question))
|
|
251
|
+
problems.push("question must be the question's text");
|
|
252
|
+
const c = v.criteria;
|
|
253
|
+
const type = point.question.type;
|
|
254
|
+
if (type === "score") {
|
|
255
|
+
if (!Array.isArray(c) || c.length < 2 || c.length > 10 || !c.every(nonEmpty) || new Set(c).size !== c.length)
|
|
256
|
+
problems.push("criteria must be 2 to 10 distinct levels, in order, for a score question");
|
|
257
|
+
}
|
|
258
|
+
else if (c === null || typeof c !== "object" || Array.isArray(c)) {
|
|
259
|
+
problems.push(`criteria must be an object of ${type === "noul" ? "true and false" : "options"}, each with what it means`);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
const entries = Object.entries(c);
|
|
263
|
+
if (!entries.every(([k, d]) => k !== "" && typeof d === "string"))
|
|
264
|
+
problems.push("each criterion must be a non-empty name with what it means as a string");
|
|
265
|
+
if (type === "noul") {
|
|
266
|
+
const keys = entries.map(([k]) => k).sort();
|
|
267
|
+
if (keys.length !== 2 || keys[0] !== "false" || keys[1] !== "true")
|
|
268
|
+
problems.push("criteria must describe true and false, and nothing else, for a noul question");
|
|
269
|
+
}
|
|
270
|
+
else if (entries.length < 2 || entries.length > 255) {
|
|
271
|
+
problems.push("criteria must give 2 to 255 options for a choice question");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (problems.length > 0)
|
|
275
|
+
return { problems };
|
|
276
|
+
const criteria = Array.isArray(c) ? [...c] : { ...c };
|
|
277
|
+
return { asked: { question: v.question.trim(), criteria } };
|
|
278
|
+
}
|
|
279
|
+
/** An answer record's `asked`, when it has one. */
|
|
280
|
+
export function askedOf(data) {
|
|
281
|
+
const a = data.asked;
|
|
282
|
+
if (a === null || typeof a !== "object" || Array.isArray(a) || typeof a.question !== "string")
|
|
283
|
+
return undefined;
|
|
284
|
+
const c = a.criteria;
|
|
285
|
+
if (Array.isArray(c))
|
|
286
|
+
return { question: a.question, criteria: c.filter((x) => typeof x === "string") };
|
|
287
|
+
if (c !== null && typeof c === "object")
|
|
288
|
+
return { question: a.question, criteria: Object.fromEntries(Object.entries(c).filter(([, d]) => typeof d === "string")) };
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
/** The id of the answer to `name` for inputs hashing to `hash`: the name and the hash's first 12 hex digits. */
|
|
292
|
+
export const answerId = (name, hash) => `${name}-${hash.slice(0, 12)}`;
|
|
293
|
+
/** The quorum a point ends in. */
|
|
294
|
+
export function quorumOf(point) {
|
|
295
|
+
const last = point.deciders[point.deciders.length - 1];
|
|
296
|
+
return last?.kind === "quorum" ? { count: last.count, ...(last.roles ? { roles: last.roles } : {}) } : { count: 1 };
|
|
297
|
+
}
|
|
298
|
+
// ── The chain ────────────────────────────────────────────────────────────────
|
|
299
|
+
function holds(condition, value) {
|
|
300
|
+
if (condition === null || typeof condition !== "object")
|
|
301
|
+
return value === condition;
|
|
302
|
+
const [[op, x]] = Object.entries(condition);
|
|
303
|
+
const number = typeof value === "number";
|
|
304
|
+
switch (op) {
|
|
305
|
+
case "eq":
|
|
306
|
+
return value === x;
|
|
307
|
+
case "ne":
|
|
308
|
+
return value !== x;
|
|
309
|
+
case "lt":
|
|
310
|
+
return number && value < x;
|
|
311
|
+
case "lte":
|
|
312
|
+
return number && value <= x;
|
|
313
|
+
case "gt":
|
|
314
|
+
return number && value > x;
|
|
315
|
+
case "gte":
|
|
316
|
+
return number && value >= x;
|
|
317
|
+
case "in":
|
|
318
|
+
return x.includes(value);
|
|
319
|
+
default:
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/** Whether every condition in a row's `when` holds for these inputs. An input the state lacks never matches. */
|
|
324
|
+
export const matches = (when, inputs) => Object.entries(when).every(([key, condition]) => Object.prototype.hasOwnProperty.call(inputs, key) && holds(condition, inputs[key]));
|
|
325
|
+
/** A wire answer's reason, trimmed, or undefined when it gives none (or not a string). */
|
|
326
|
+
export function answerReason(answer) {
|
|
327
|
+
const raw = answer?.reason;
|
|
328
|
+
if (typeof raw !== "string")
|
|
329
|
+
return undefined;
|
|
330
|
+
const reason = raw.trim();
|
|
331
|
+
return reason === "" ? undefined : reason;
|
|
332
|
+
}
|
|
333
|
+
export function wireQuestion(question) {
|
|
334
|
+
return { type: question.type, instructions: question.instructions, criteria: question.criteria ?? {} };
|
|
335
|
+
}
|
|
336
|
+
const round = (x) => Math.round(x * 1e6) / 1e6;
|
|
337
|
+
/**
|
|
338
|
+
* A model's wire answer against the question and the decider's threshold
|
|
339
|
+
* (chud's rule):
|
|
340
|
+
*
|
|
341
|
+
* - noul p: true when p is at least the threshold, false when 1 - p is,
|
|
342
|
+
* otherwise not observed. Its confidence is max(p, 1 - p).
|
|
343
|
+
* - choice and score: the choice (a score's most probable level) when the
|
|
344
|
+
* reported confidence is at least the threshold. A backend that reports no
|
|
345
|
+
* confidence is read by its largest probability.
|
|
346
|
+
*
|
|
347
|
+
* An answer outside the candidates, or an unsupported question, is not observed.
|
|
348
|
+
*/
|
|
349
|
+
export function observe(question, answer, threshold) {
|
|
350
|
+
const allowed = candidates(question);
|
|
351
|
+
if (!answer || answer.type === "unsupported")
|
|
352
|
+
return { observed: false, reason: "the backend does not support this question type" };
|
|
353
|
+
if (question.type === "noul") {
|
|
354
|
+
const p = Number(answer.noul);
|
|
355
|
+
if (!(p >= 0 && p <= 1))
|
|
356
|
+
return { observed: false, reason: "the answer carries no probability" };
|
|
357
|
+
const probabilities = { true: round(p), false: round(1 - p) };
|
|
358
|
+
const confidence = round(Math.max(p, 1 - p));
|
|
359
|
+
if (p >= threshold)
|
|
360
|
+
return { observed: true, answer: true, probabilities, confidence };
|
|
361
|
+
if (1 - p >= threshold)
|
|
362
|
+
return { observed: true, answer: false, probabilities, confidence };
|
|
363
|
+
return { observed: false, answer: p >= 0.5, probabilities, confidence, reason: `confidence ${confidence} is below the threshold ${threshold}` };
|
|
364
|
+
}
|
|
365
|
+
const a = answer;
|
|
366
|
+
const probabilities = Object.fromEntries(Object.entries(a.probabilities ?? {})
|
|
367
|
+
.map(([k, v]) => [k, Number(v)])
|
|
368
|
+
.filter(([, v]) => Number.isFinite(v) && v >= 0 && v <= 1)
|
|
369
|
+
.map(([k, v]) => [k, round(v)]));
|
|
370
|
+
const choice = question.type === "choice" ? a.choice : Object.entries(probabilities).sort((x, y) => y[1] - x[1])[0]?.[0];
|
|
371
|
+
const reported = Number(a.confidence);
|
|
372
|
+
const confidence = round(a.confidence !== undefined && Number.isFinite(reported) ? reported : Math.max(0, ...Object.values(probabilities)));
|
|
373
|
+
if (typeof choice !== "string" || !allowed.includes(choice)) {
|
|
374
|
+
return { observed: false, answer: typeof choice === "string" ? choice : null, probabilities, confidence, reason: `the answer ${JSON.stringify(choice ?? null)} is not a candidate` };
|
|
375
|
+
}
|
|
376
|
+
if (confidence >= threshold)
|
|
377
|
+
return { observed: true, answer: choice, probabilities, confidence };
|
|
378
|
+
return { observed: false, answer: choice, probabilities, confidence, reason: `confidence ${confidence} is below the threshold ${threshold}` };
|
|
379
|
+
}
|
|
380
|
+
/** A model decider declared `unreachable: "fail"` could not answer, so the ask fails and nothing is written. */
|
|
381
|
+
export class DeciderFailed extends Error {
|
|
382
|
+
constructor(message) {
|
|
383
|
+
super(message);
|
|
384
|
+
this.name = "DeciderFailed";
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Ask a point's deciders in order. A table row answers; a model at or above
|
|
389
|
+
* its threshold proposes; otherwise the question escalates to the quorum.
|
|
390
|
+
* Each decider that did not answer is in `escalations`, with why. A model
|
|
391
|
+
* decider is asked through `ask`; without it, it is not asked.
|
|
392
|
+
*/
|
|
393
|
+
export async function runChain(name, point, inputs, ask) {
|
|
394
|
+
const escalations = [];
|
|
395
|
+
for (const d of point.deciders) {
|
|
396
|
+
if (d.kind === "table") {
|
|
397
|
+
const row = d.rows.findIndex((r) => matches(r.when, inputs));
|
|
398
|
+
if (row >= 0) {
|
|
399
|
+
return { status: "answered", answer: d.rows[row].answer, decider: { kind: "table", row }, ...(d.rows[row].note ? { note: d.rows[row].note } : {}), escalations };
|
|
400
|
+
}
|
|
401
|
+
escalations.push({ kind: "table", reason: "no row matches these inputs" });
|
|
402
|
+
}
|
|
403
|
+
else if (d.kind === "model") {
|
|
404
|
+
if (!ask) {
|
|
405
|
+
escalations.push({ kind: "model", backend: d.backend, model: d.model, threshold: d.threshold, reason: "not asked: no model backend was given to this ask" });
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
let reply;
|
|
409
|
+
try {
|
|
410
|
+
reply = await ask({ point: name, backend: d.backend, model: d.model, question: wireQuestion(point.question), state: inputs });
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
const why = `${d.backend} could not answer: ${err instanceof Error ? err.message : String(err)}`;
|
|
414
|
+
if (d.unreachable === "fail")
|
|
415
|
+
throw new DeciderFailed(`${name}: ${why}, and the point fails closed (unreachable: "fail")`);
|
|
416
|
+
escalations.push({ kind: "model", backend: d.backend, model: d.model, threshold: d.threshold, reason: `not observed: ${why}` });
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
if (reply.model !== d.model) {
|
|
420
|
+
escalations.push({ kind: "model", backend: d.backend, model: reply.model, threshold: d.threshold, reason: `not observed: ${reply.model} answered, and the point pins ${d.model}` });
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
const seen = observe(point.question, reply.answer, d.threshold);
|
|
424
|
+
const why = answerReason(reply.answer);
|
|
425
|
+
if (seen.observed) {
|
|
426
|
+
return {
|
|
427
|
+
status: "proposed",
|
|
428
|
+
answer: seen.answer,
|
|
429
|
+
decider: { kind: "model", backend: d.backend, model: reply.model },
|
|
430
|
+
probabilities: seen.probabilities,
|
|
431
|
+
confidence: seen.confidence,
|
|
432
|
+
threshold: d.threshold,
|
|
433
|
+
...(why !== undefined ? { reason: why } : {}),
|
|
434
|
+
escalations,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
escalations.push({
|
|
438
|
+
kind: "model",
|
|
439
|
+
backend: d.backend,
|
|
440
|
+
model: reply.model,
|
|
441
|
+
answer: seen.answer ?? null,
|
|
442
|
+
...(seen.probabilities ? { probabilities: seen.probabilities } : {}),
|
|
443
|
+
...(seen.confidence !== undefined ? { confidence: seen.confidence } : {}),
|
|
444
|
+
threshold: d.threshold,
|
|
445
|
+
reason: `not observed: ${seen.reason}`,
|
|
446
|
+
...(why !== undefined ? { model_reason: why } : {}),
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
return { status: "escalated", decider: { kind: "quorum", count: d.count, ...(d.roles ? { roles: d.roles } : {}) }, escalations };
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Unreachable for a valid point, which ends in a quorum.
|
|
454
|
+
return { status: "escalated", decider: { kind: "quorum", count: 1 }, escalations };
|
|
455
|
+
}
|
|
456
|
+
// ── Answers on read ──────────────────────────────────────────────────────────
|
|
457
|
+
/** Why an answer record carries a warning. Closed, like the record warning codes. */
|
|
458
|
+
export const ANSWER_WARNING_CODES = [
|
|
459
|
+
/** The points file the answer kind names can't be read, or is not valid (#2738). */
|
|
460
|
+
"answer-points-unreadable",
|
|
461
|
+
/** The answer's point is not in the points file. */
|
|
462
|
+
"answer-point-unknown",
|
|
463
|
+
/** The point's declaration changed since the answer: it answers an older version of the question. */
|
|
464
|
+
"answer-point-changed",
|
|
465
|
+
];
|
|
466
|
+
/** The points file an answer kind names, from `root` with / separators. */
|
|
467
|
+
export function pointsFileOf(loaded, root) {
|
|
468
|
+
const abs = resolve(dirname(loaded.file), loaded.kind.answers.points);
|
|
469
|
+
return relative(root, abs).split(sep).join(posix.sep);
|
|
470
|
+
}
|
|
471
|
+
/** The points an answer kind names, read from `source` (the tree read), or the problems reading them. */
|
|
472
|
+
export function readPointsThrough(source, file) {
|
|
473
|
+
// A revision's source reads only files in a directory it has listed.
|
|
474
|
+
const names = source.list(posix.dirname(file));
|
|
475
|
+
if (!names?.includes(posix.basename(file))) {
|
|
476
|
+
return { error: `the points file ${file} does not exist${source.label}`, problems: [{ field: null, message: `does not exist${source.label}` }] };
|
|
477
|
+
}
|
|
478
|
+
let text;
|
|
479
|
+
try {
|
|
480
|
+
text = source.read(file);
|
|
481
|
+
}
|
|
482
|
+
catch (err) {
|
|
483
|
+
return { error: `the points file ${file} can't be read: ${err instanceof Error ? err.message : String(err)}`, problems: [{ field: null, message: "can't be read" }] };
|
|
484
|
+
}
|
|
485
|
+
try {
|
|
486
|
+
return { points: parsePoints(text, file) };
|
|
487
|
+
}
|
|
488
|
+
catch (err) {
|
|
489
|
+
if (err instanceof PointsError)
|
|
490
|
+
return { error: `the points file is not valid: ${err.message}`, problems: err.problems };
|
|
491
|
+
throw err;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Give an answer kind's records their warnings, in place: the points file
|
|
496
|
+
* can't be read, the answer's point is gone, or the point changed since. They
|
|
497
|
+
* never make a record invalid.
|
|
498
|
+
*/
|
|
499
|
+
export function applyAnswers(loaded, entries, options) {
|
|
500
|
+
const file = pointsFileOf(loaded, options.root);
|
|
501
|
+
const read = readPointsThrough(options.source, file);
|
|
502
|
+
for (const e of entries) {
|
|
503
|
+
if (e.data === null)
|
|
504
|
+
continue;
|
|
505
|
+
if ("error" in read) {
|
|
506
|
+
e.warnings.push({ code: "answer-points-unreadable", message: read.error });
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
const name = e.data.point;
|
|
510
|
+
if (typeof name !== "string")
|
|
511
|
+
continue;
|
|
512
|
+
const point = pointOf(read.points, name);
|
|
513
|
+
if (!point) {
|
|
514
|
+
e.warnings.push({ code: "answer-point-unknown", message: `answers ${name}, which ${file} does not declare` });
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
if (typeof e.data.point_version === "string" && e.data.point_version !== pointVersion(point)) {
|
|
518
|
+
e.warnings.push({ code: "answer-point-changed", message: `answers ${name} as it was declared at ${e.data.point_version.slice(0, 12)}, and ${file} declares it at ${pointVersion(point).slice(0, 12)} now: ask again for the question as it stands` });
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|