@intentius/chant 0.124.12 → 0.124.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (928) hide show
  1. package/bin/chant +11 -0
  2. package/dist/agents/checks.js +326 -0
  3. package/dist/agents/discover.js +885 -0
  4. package/dist/agents/importer.js +17 -0
  5. package/dist/agents/index.js +12 -0
  6. package/dist/agents/types.js +19 -0
  7. package/dist/apply.js +151 -0
  8. package/dist/attrref.js +70 -0
  9. package/dist/audit/catalog.js +350 -0
  10. package/dist/audit/core.js +252 -0
  11. package/dist/audit/discover.js +633 -0
  12. package/dist/audit/fetch.js +666 -0
  13. package/dist/audit/lineage.js +91 -0
  14. package/dist/audit/nginx.js +366 -0
  15. package/dist/audit/prior-art.js +132 -0
  16. package/dist/audit/proof.js +321 -0
  17. package/dist/audit/report-html.js +194 -0
  18. package/dist/audit/report-model.js +198 -0
  19. package/dist/audit/report.js +102 -0
  20. package/dist/audit/rules-doc.js +144 -0
  21. package/dist/audit/secrets.js +405 -0
  22. package/dist/audit/terraform-state.js +140 -0
  23. package/dist/audit/wrangler.js +262 -0
  24. package/dist/behaviour-delta.js +401 -0
  25. package/dist/behaviour-engine.js +357 -0
  26. package/dist/behaviour-graph.js +83 -0
  27. package/dist/behaviour-http.js +188 -0
  28. package/dist/behaviour-kinds.js +172 -0
  29. package/dist/behaviour-overlay.js +50 -0
  30. package/dist/behaviour-predict.js +188 -0
  31. package/dist/behaviour-request.js +194 -0
  32. package/dist/behaviour.js +1325 -0
  33. package/dist/build-params.js +108 -0
  34. package/dist/build.js +668 -0
  35. package/dist/builder.js +44 -0
  36. package/dist/cdk/advise.js +30 -0
  37. package/dist/cdk/assembly.js +122 -0
  38. package/dist/cdk/graph.js +444 -0
  39. package/dist/cdk/tier-map.js +64 -0
  40. package/dist/cdk/types.js +24 -0
  41. package/dist/change-set.js +312 -0
  42. package/dist/child-project.js +21 -0
  43. package/dist/claimed-fields.js +135 -0
  44. package/dist/cli/build-options.js +70 -0
  45. package/dist/cli/build-params-cli.js +139 -0
  46. package/dist/cli/command-group.js +123 -0
  47. package/dist/cli/commands/audit-agents.js +326 -0
  48. package/dist/cli/commands/audit.js +571 -0
  49. package/dist/cli/commands/build.js +920 -0
  50. package/dist/cli/commands/carve-apply.js +153 -0
  51. package/dist/cli/commands/carve-bridge.js +201 -0
  52. package/dist/cli/commands/carve-emit.js +332 -0
  53. package/dist/cli/commands/carve-status.js +119 -0
  54. package/dist/cli/commands/carve.js +204 -0
  55. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  56. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  57. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  58. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  59. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  60. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  61. package/dist/cli/commands/check-lexicon.js +766 -0
  62. package/dist/cli/commands/describe.js +85 -0
  63. package/dist/cli/commands/diff.js +175 -0
  64. package/dist/cli/commands/doctor.js +350 -0
  65. package/dist/cli/commands/import-agents.js +155 -0
  66. package/dist/cli/commands/import.js +670 -0
  67. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  68. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  69. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  70. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  71. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  72. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  73. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  74. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  75. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  76. package/dist/cli/commands/init-lexicon.js +172 -0
  77. package/dist/cli/commands/init.js +381 -0
  78. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  79. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  80. package/dist/cli/commands/licenses.js +125 -0
  81. package/dist/cli/commands/lint.d.ts.map +1 -1
  82. package/dist/cli/commands/lint.js +948 -0
  83. package/dist/cli/commands/list.js +63 -0
  84. package/dist/cli/commands/migrate.d.ts.map +1 -1
  85. package/dist/cli/commands/migrate.js +423 -0
  86. package/dist/cli/commands/onboard.js +403 -0
  87. package/dist/cli/commands/pinned-upgrade.js +191 -0
  88. package/dist/cli/commands/update.js +194 -0
  89. package/dist/cli/commands/vendor.js +217 -0
  90. package/dist/cli/conflict-check.js +104 -0
  91. package/dist/cli/debug.js +8 -0
  92. package/dist/cli/format.js +104 -0
  93. package/dist/cli/handlers/build.js +267 -0
  94. package/dist/cli/handlers/carve-apply.js +30 -0
  95. package/dist/cli/handlers/carve-bridge.js +28 -0
  96. package/dist/cli/handlers/carve-emit.js +50 -0
  97. package/dist/cli/handlers/carve-status.js +26 -0
  98. package/dist/cli/handlers/carve.js +40 -0
  99. package/dist/cli/handlers/change-set.js +46 -0
  100. package/dist/cli/handlers/components.js +730 -0
  101. package/dist/cli/handlers/dev.js +113 -0
  102. package/dist/cli/handlers/emulator.js +233 -0
  103. package/dist/cli/handlers/explain.js +54 -0
  104. package/dist/cli/handlers/fan-out.js +422 -0
  105. package/dist/cli/handlers/gate-resume.js +275 -0
  106. package/dist/cli/handlers/generate.js +84 -0
  107. package/dist/cli/handlers/graph.js +969 -0
  108. package/dist/cli/handlers/init.js +102 -0
  109. package/dist/cli/handlers/lifecycle.js +1727 -0
  110. package/dist/cli/handlers/lint.js +62 -0
  111. package/dist/cli/handlers/migrate.js +48 -0
  112. package/dist/cli/handlers/misc.js +391 -0
  113. package/dist/cli/handlers/operator.js +1162 -0
  114. package/dist/cli/handlers/override-approve.js +102 -0
  115. package/dist/cli/handlers/pr.js +503 -0
  116. package/dist/cli/handlers/promote.js +342 -0
  117. package/dist/cli/handlers/run-generate.js +206 -0
  118. package/dist/cli/handlers/run-wave.js +66 -0
  119. package/dist/cli/handlers/run.js +1191 -0
  120. package/dist/cli/handlers/scenario.js +325 -0
  121. package/dist/cli/handlers/search.js +924 -0
  122. package/dist/cli/handlers/serve.js +32 -0
  123. package/dist/cli/handlers/vendor.js +154 -0
  124. package/dist/cli/index.js +3 -0
  125. package/dist/cli/is-entry-point.js +23 -0
  126. package/dist/cli/lsp/capabilities.js +28 -0
  127. package/dist/cli/lsp/diagnostics.js +34 -0
  128. package/dist/cli/lsp/server.js +329 -0
  129. package/dist/cli/main.d.ts.map +1 -1
  130. package/dist/cli/main.js +2540 -0
  131. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  132. package/dist/cli/mcp/op-tools.js +306 -0
  133. package/dist/cli/mcp/resource-handlers.js +258 -0
  134. package/dist/cli/mcp/resources/context.js +85 -0
  135. package/dist/cli/mcp/server.js +353 -0
  136. package/dist/cli/mcp/tools/build.js +111 -0
  137. package/dist/cli/mcp/tools/composites.js +95 -0
  138. package/dist/cli/mcp/tools/explain.js +166 -0
  139. package/dist/cli/mcp/tools/import.js +49 -0
  140. package/dist/cli/mcp/tools/lint.js +41 -0
  141. package/dist/cli/mcp/tools/scaffold.js +111 -0
  142. package/dist/cli/mcp/tools/search.js +112 -0
  143. package/dist/cli/mcp/types.js +1 -0
  144. package/dist/cli/mcp/workspace-plugins.js +91 -0
  145. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  146. package/dist/cli/mcp/workspace-tools.js +564 -0
  147. package/dist/cli/mcp-config.js +70 -0
  148. package/dist/cli/plugins.js +313 -0
  149. package/dist/cli/registry.js +23 -0
  150. package/dist/cli/reporters/stylish.js +329 -0
  151. package/dist/cli/version.js +15 -0
  152. package/dist/cli/watch.js +79 -0
  153. package/dist/codegen/bound-property-types.js +82 -0
  154. package/dist/codegen/coverage.js +119 -0
  155. package/dist/codegen/docs-file-markers.js +60 -0
  156. package/dist/codegen/docs-pages.js +115 -0
  157. package/dist/codegen/docs-rule-scanning.js +164 -0
  158. package/dist/codegen/docs-rules.js +76 -0
  159. package/dist/codegen/docs-sections.js +117 -0
  160. package/dist/codegen/docs-sidebar.js +65 -0
  161. package/dist/codegen/docs-types.js +4 -0
  162. package/dist/codegen/docs.js +356 -0
  163. package/dist/codegen/fetch.js +340 -0
  164. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  165. package/dist/codegen/generate-registry.js +71 -0
  166. package/dist/codegen/generate-runtime-index.js +56 -0
  167. package/dist/codegen/generate-typescript.js +119 -0
  168. package/dist/codegen/generate.js +115 -0
  169. package/dist/codegen/json-patch.js +141 -0
  170. package/dist/codegen/json-schema-to-ts.js +344 -0
  171. package/dist/codegen/json-schema.js +246 -0
  172. package/dist/codegen/lexicon-regen.js +412 -0
  173. package/dist/codegen/naming.js +217 -0
  174. package/dist/codegen/okf-lexicon.js +245 -0
  175. package/dist/codegen/package.js +150 -0
  176. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  177. package/dist/codegen/pinned-upgrade.js +494 -0
  178. package/dist/codegen/registry.js +60 -0
  179. package/dist/codegen/rehype-base-url.mjs +68 -0
  180. package/dist/codegen/rolling-upgrade.js +217 -0
  181. package/dist/codegen/surface-snapshot.js +537 -0
  182. package/dist/codegen/testdata/postgres-tags.json +242 -0
  183. package/dist/codegen/topo-sort.js +36 -0
  184. package/dist/codegen/typecheck.js +115 -0
  185. package/dist/codegen/validate.js +200 -0
  186. package/dist/codegen/version-bump.js +35 -0
  187. package/dist/components/auto-release.js +143 -0
  188. package/dist/components/builders.js +47 -0
  189. package/dist/components/capability-plugin-loader.js +175 -0
  190. package/dist/components/capability-plugin-schema.js +46 -0
  191. package/dist/components/capability-plugin.js +99 -0
  192. package/dist/components/capability.js +60 -0
  193. package/dist/components/changed-files.js +72 -0
  194. package/dist/components/cli-support.js +427 -0
  195. package/dist/components/component.js +120 -0
  196. package/dist/components/component.schema.json +271 -0
  197. package/dist/components/config-defaults.js +130 -0
  198. package/dist/components/deploy-units.js +60 -0
  199. package/dist/components/discover.d.ts.map +1 -1
  200. package/dist/components/discover.js +189 -0
  201. package/dist/components/driver-output.js +86 -0
  202. package/dist/components/driver.js +728 -0
  203. package/dist/components/fan-out-output.js +165 -0
  204. package/dist/components/fan-out-record.js +94 -0
  205. package/dist/components/fan-out-run.js +373 -0
  206. package/dist/components/fan-out-support.js +60 -0
  207. package/dist/components/fan-out.js +273 -0
  208. package/dist/components/gate-plan.js +41 -0
  209. package/dist/components/gated-wave-pipeline.js +46 -0
  210. package/dist/components/index.js +24 -0
  211. package/dist/components/layers.js +28 -0
  212. package/dist/components/manifest-persistence.js +108 -0
  213. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  214. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  215. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  216. package/dist/components/pilots/lambda.pilot.js +52 -0
  217. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  218. package/dist/components/pilots/project.js +12 -0
  219. package/dist/components/pr-pipeline.js +134 -0
  220. package/dist/components/pr-run.js +363 -0
  221. package/dist/components/presets/ecs-fargate.js +72 -0
  222. package/dist/components/presets/index.js +28 -0
  223. package/dist/components/presets/lambda.js +34 -0
  224. package/dist/components/presets/single-host-compose.js +41 -0
  225. package/dist/components/promote.js +549 -0
  226. package/dist/components/registry.js +34 -0
  227. package/dist/components/run-progress.js +33 -0
  228. package/dist/components/sandbox/driver.d.ts.map +1 -1
  229. package/dist/components/sandbox/driver.js +93 -0
  230. package/dist/components/sandbox/run.js +115 -0
  231. package/dist/components/starter-plugin.js +104 -0
  232. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  233. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  234. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  235. package/dist/components/verbs/bom-writer.js +287 -0
  236. package/dist/components/verbs/build-archive.js +188 -0
  237. package/dist/components/verbs/build.js +142 -0
  238. package/dist/components/verbs/cloud-executor.js +110 -0
  239. package/dist/components/verbs/component-bom.js +125 -0
  240. package/dist/components/verbs/ensure-secret.js +50 -0
  241. package/dist/components/verbs/index.js +61 -0
  242. package/dist/components/verbs/license-policy.js +75 -0
  243. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  244. package/dist/components/verbs/process-runner.js +78 -0
  245. package/dist/components/verbs/r2-sync.js +93 -0
  246. package/dist/components/verbs/reproducibility.js +62 -0
  247. package/dist/components/verbs/run-agent.js +577 -0
  248. package/dist/components/verbs/sbom-generator.js +119 -0
  249. package/dist/components/verbs/sbom.js +97 -0
  250. package/dist/components/verbs/shell.js +32 -0
  251. package/dist/components/verbs/sign.js +221 -0
  252. package/dist/components/verbs/stub.js +28 -0
  253. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  254. package/dist/components/verbs/verify.js +112 -0
  255. package/dist/components/verbs/vex.js +131 -0
  256. package/dist/components/verbs/vuln-gate.js +152 -0
  257. package/dist/components/verbs/vuln-scan.js +288 -0
  258. package/dist/components/verbs/wait-verify.js +106 -0
  259. package/dist/components/verbs/wrangler.js +179 -0
  260. package/dist/components/wave-plan.js +102 -0
  261. package/dist/composite.js +305 -0
  262. package/dist/config-import.d.ts.map +1 -1
  263. package/dist/config-import.js +22 -0
  264. package/dist/config-sandbox.js +122 -0
  265. package/dist/config-static.js +206 -0
  266. package/dist/config.js +605 -0
  267. package/dist/content-digest.js +23 -0
  268. package/dist/declarable.js +114 -0
  269. package/dist/deep-observation.js +437 -0
  270. package/dist/detectLexicon.js +54 -0
  271. package/dist/discovery/cache.js +70 -0
  272. package/dist/discovery/collect.js +208 -0
  273. package/dist/discovery/cycles.js +95 -0
  274. package/dist/discovery/entity-wire-codec.js +391 -0
  275. package/dist/discovery/entity-wire.js +42 -0
  276. package/dist/discovery/files.js +121 -0
  277. package/dist/discovery/fold-import.d.ts.map +1 -1
  278. package/dist/discovery/fold-import.js +4178 -0
  279. package/dist/discovery/fold-rank.js +292 -0
  280. package/dist/discovery/graph.js +115 -0
  281. package/dist/discovery/import.d.ts.map +1 -1
  282. package/dist/discovery/import.js +65 -0
  283. package/dist/discovery/index.js +333 -0
  284. package/dist/discovery/param-deps.js +487 -0
  285. package/dist/discovery/resolve.js +39 -0
  286. package/dist/discovery/sandbox/bundle.js +214 -0
  287. package/dist/discovery/sandbox/child-errors.js +26 -0
  288. package/dist/discovery/sandbox/config-run.js +100 -0
  289. package/dist/discovery/sandbox/config-wire.js +183 -0
  290. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  291. package/dist/discovery/sandbox/driver.js +333 -0
  292. package/dist/discovery/sandbox/fork.js +229 -0
  293. package/dist/discovery/sandbox/policy-run.js +142 -0
  294. package/dist/discovery/sandbox/policy-wire.js +152 -0
  295. package/dist/discovery/sandbox/run.js +77 -0
  296. package/dist/discovery/specifier-resolve.js +320 -0
  297. package/dist/discovery/walk.js +284 -0
  298. package/dist/effect-receipt.js +340 -0
  299. package/dist/env.js +55 -0
  300. package/dist/errors.js +62 -0
  301. package/dist/fold/fold.js +1434 -0
  302. package/dist/fold/foldable-helpers.js +229 -0
  303. package/dist/fold/subset.js +696 -0
  304. package/dist/fold-provenance.js +414 -0
  305. package/dist/gate-decision.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. package/src/workspace/principal-classes.ts +5 -30
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Converge ledger (#1484) — the append-only record of what a `ConvergeOp`
3
+ * tick did, one line per tick, at `<env>/converge.jsonl` on the
4
+ * `chant/lifecycle` orphan branch. Same storage shape as the release ledger
5
+ * (./release-ledger.ts): immutable, append-only JSONL, reusing
6
+ * `writeBlobToPath`/`readBlobFromPath` (./git.ts) directly rather than a new
7
+ * git-plumbing path — the exact reuse `appendReleaseRecordLine` already
8
+ * demonstrates for a second filename under the same env directory.
9
+ *
10
+ * This is also where flap-damping state lives (issue: "consecutive-fire
11
+ * counts go in the ledger ... not process memory, so damping survives worker
12
+ * restarts"): each record's `firedRuleIds` names every rule whose predicate
13
+ * matched this tick, independent of what action was actually taken (run,
14
+ * report, or skipped for budget/flap reasons) — {@link consecutiveRuleFires}
15
+ * walks the ledger backward from the newest record and counts how many in a
16
+ * row include a given rule id, stopping at the first tick where it didn't
17
+ * fire (the symptom cleared).
18
+ */
19
+ import { randomUUID } from "node:crypto";
20
+ import { sortedJsonReplacer } from "../utils.js";
21
+ import { readBlobFromPath, readPathSha, readBlobBySha, writeBlobToPath, RefCASConflictError } from "./git.js";
22
+ const FILENAME = "converge.jsonl";
23
+ /**
24
+ * Cap a piece of free text to one sanitized line before it goes into a
25
+ * record. A record here is one line of JSON, so a multi-line or unbounded
26
+ * string folded into any field would break the line the ledger is built out
27
+ * of. Every free-text field a tick writes goes through this: a dispatch
28
+ * failure's `stderr` (a hosting lexicon's own one-line sanitizer delegates
29
+ * here) and a component verdict's lexicon-authored `detail`.
30
+ */
31
+ const MAX_LEDGER_TEXT_LEN = 300;
32
+ export function sanitizeLedgerText(raw, maxLen = MAX_LEDGER_TEXT_LEN) {
33
+ const firstLine = raw.split(/\r?\n/, 1)[0] ?? "";
34
+ // Strips literal control bytes; it is not matching on a range boundary.
35
+ const stripped = firstLine.replace(/[\x00-\x1f\x7f]/g, " ").trim();
36
+ return stripped.length > maxLen ? `${stripped.slice(0, maxLen)}…` : stripped;
37
+ }
38
+ /**
39
+ * Read-modify-append retry budget for {@link appendConvergeRecord} (#1485).
40
+ * `writeBlobToPath`'s ref write is now CAS-guarded (./git.ts) — a conflict
41
+ * (another writer, e.g. a second operator ticking a different env on the
42
+ * same orphan branch, updated the branch tip between our read and our
43
+ * write) throws `RefCASConflictError` instead of silently clobbering. This
44
+ * many attempts, re-reading the ledger fresh each time, absorbs that race
45
+ * rather than surfacing it as a tick failure — the whole point of the CAS
46
+ * guard is correctness, not a new way for a tick to fail.
47
+ */
48
+ const APPEND_RETRY_ATTEMPTS = 5;
49
+ /**
50
+ * Project the tick's `ComponentStatusRow[]` down to what the ledger keeps.
51
+ * Pure; row order is preserved, so a consumer sees components in the same
52
+ * order the status join produced them.
53
+ */
54
+ export function componentVerdicts(rows) {
55
+ return rows.map((row) => ({
56
+ component: row.component,
57
+ reconciliation: row.reconciliation,
58
+ detail: sanitizeLedgerText(row.detail ?? ""),
59
+ ...(row.live !== undefined ? { live: row.live } : {}),
60
+ ...(row.unobserved
61
+ ? {
62
+ unobserved: {
63
+ reason: row.unobserved.reason,
64
+ ...(row.unobserved.detail !== undefined ? { detail: sanitizeLedgerText(row.unobserved.detail) } : {}),
65
+ },
66
+ }
67
+ : {}),
68
+ }));
69
+ }
70
+ /**
71
+ * Append one immutable tick record. Does not push to the remote — call
72
+ * `pushLifecycle` (./git.ts) afterward, same two-step shape every other
73
+ * ledger write here uses.
74
+ *
75
+ * Mints `record.id` (#2027) when the input doesn't carry one, so every tick
76
+ * written from here on is referenceable. Unlike `timestamp`, which stays
77
+ * caller-supplied because library code never calls `Date.now()` internally,
78
+ * an id has nothing for a caller to decide — the mint lives here so no
79
+ * writer can forget it. An explicit `input.id` still wins, which is what a
80
+ * test asserting an exact record uses.
81
+ *
82
+ * Retries the whole read-modify-write cycle (#1485) on `RefCASConflictError`
83
+ * — `writeBlobToPath`'s ref write is CAS-guarded, so a concurrent writer to
84
+ * a *different* env's file on the same orphan branch (two operators ticking
85
+ * two environments at once is the ordinary case, not an edge case) can lose
86
+ * the race and needs to re-read the branch tip and retry, not fail the
87
+ * tick. Each retry re-reads `existing` fresh, so it always appends onto
88
+ * whatever the other writer just committed rather than reintroducing a stale
89
+ * read. Exhausting the budget re-throws the conflict — a real, sustained
90
+ * pile-up of writers is a signal worth surfacing, not silently swallowing.
91
+ *
92
+ * The baseline read must be `readPathSha` + `readBlobBySha` rather than
93
+ * `readBlobFromPath`, so the exact sha `existing` came from can be passed as
94
+ * `expectPriorPathSha`. See `writeBlobToPath` (./git.ts) for the race that
95
+ * closes.
96
+ */
97
+ export async function appendConvergeRecord(input, opts) {
98
+ const record = { version: 1, ...input, id: input.id ?? randomUUID() };
99
+ const json = JSON.stringify(record, sortedJsonReplacer);
100
+ let lastErr;
101
+ for (let attempt = 1; attempt <= APPEND_RETRY_ATTEMPTS; attempt++) {
102
+ try {
103
+ const priorSha = await readPathSha(record.env, FILENAME, opts);
104
+ const existing = priorSha ? await readBlobBySha(priorSha, opts) : null;
105
+ const content = `${existing ? `${existing.replace(/\n$/, "")}\n` : ""}${json}\n`;
106
+ const commit = await writeBlobToPath(record.env, FILENAME, content, "Converge tick record", {
107
+ ...opts,
108
+ expectPriorPathSha: priorSha,
109
+ });
110
+ return { commit, record };
111
+ }
112
+ catch (err) {
113
+ if (!(err instanceof RefCASConflictError))
114
+ throw err;
115
+ lastErr = err;
116
+ }
117
+ }
118
+ throw lastErr;
119
+ }
120
+ /** Read every tick record for `environment`, oldest first. Malformed lines are skipped, not thrown on — a corrupted or hand-edited ledger degrades gracefully, the same stance `readReleaseLedger` takes. */
121
+ export async function readConvergeLedger(environment, opts) {
122
+ const content = await readBlobFromPath(environment, FILENAME, opts);
123
+ if (!content)
124
+ return { records: [], malformed: 0 };
125
+ const lines = content.split("\n").map((l) => l.trim()).filter(Boolean);
126
+ const records = [];
127
+ let malformed = 0;
128
+ for (const line of lines) {
129
+ try {
130
+ const parsed = JSON.parse(line);
131
+ if (parsed.version !== 1 ||
132
+ typeof parsed.op !== "string" ||
133
+ typeof parsed.env !== "string" ||
134
+ typeof parsed.timestamp !== "string" ||
135
+ !Array.isArray(parsed.firedRuleIds)) {
136
+ malformed++;
137
+ continue;
138
+ }
139
+ records.push(parsed);
140
+ }
141
+ catch {
142
+ malformed++;
143
+ }
144
+ }
145
+ return { records, malformed };
146
+ }
147
+ /**
148
+ * How many consecutive most-recent ticks (newest first) fired `ruleId`,
149
+ * stopping at the first tick where it did not — the count a rule's
150
+ * `flapThreshold` is compared against. `0` when the newest tick didn't fire
151
+ * it (including an empty ledger).
152
+ */
153
+ export function consecutiveRuleFires(records, ruleId) {
154
+ let count = 0;
155
+ for (let i = records.length - 1; i >= 0; i--) {
156
+ if (!records[i].firedRuleIds.includes(ruleId))
157
+ break;
158
+ count++;
159
+ }
160
+ return count;
161
+ }
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Property-level live drift (#1014) — declared vs live vs accepted baseline.
3
+ *
4
+ * The thin diff (./live-diff.ts) compares whole entities on status, physical id
5
+ * and a few outputs. This compares their property trees, path by path, which is
6
+ * where a console edit actually shows up. Pure function; the reading happens in
7
+ * ./deep-observe.ts and the CLI.
8
+ *
9
+ * Three axes, and all three matter:
10
+ *
11
+ * - **declared** — the property tree chant synthesized, normalized with the
12
+ * lexicon's own hooks so it is in the same shape as the live tree.
13
+ * - **live** — what the provider returned, normalized with the same hooks.
14
+ * - **baseline** — the value somebody accepted (./observation-baseline.ts). A
15
+ * deviation whose live value matches the accepted value is not drift; one
16
+ * that has moved away from the accepted value is drift again, and the
17
+ * report shows all three so the reader can see what changed and from what.
18
+ *
19
+ * A path is skipped entirely when the declared value is
20
+ * {@link UNRESOLVED} — an unevaluated intrinsic (`Fn::Sub`, `Ref`) has no
21
+ * source-side value to compare, and reporting one as drift would light up every
22
+ * interpolated property forever.
23
+ *
24
+ * ## The claim decides what counts as drift (#2160)
25
+ *
26
+ * The declared tree is not only one side of a comparison, it is a statement of
27
+ * which fields chant ever set — the claimed-field set (../claimed-fields.ts).
28
+ * A live value on a path outside it is somebody else's field: an autoscaler's
29
+ * replica count, a controller's annotation, a value a person typed into a
30
+ * console. It is reported in {@link DeepDiffResult.unclaimed}, with the
31
+ * manager's name where the substrate records one, and it is not drift. Only a
32
+ * claimed path that moved is, and drift is the only thing that may become an
33
+ * update.
34
+ */
35
+ import { UNRESOLVED, deepValueEqual, flattenDeepProperties, } from "../deep-observation.js";
36
+ import { claimedFieldsFromPaths, heldBy, isClaimed } from "../claimed-fields.js";
37
+ import { isNormalizedHeldElsewhere } from "../held-elsewhere.js";
38
+ import { originOfPath } from "../provenance.js";
39
+ import { acceptedDeviation } from "./observation-baseline.js";
40
+ /**
41
+ * Compare declared and live property trees path by path, subtracting accepted
42
+ * deviations. Deterministic: every list is sorted.
43
+ */
44
+ export function diffDeep(input) {
45
+ const baseline = input.baseline ?? {};
46
+ const drifted = [];
47
+ const accepted = [];
48
+ const unclaimed = [];
49
+ const held = [];
50
+ const unchanged = [];
51
+ const unobserved = [];
52
+ const undeclaredEntities = [];
53
+ const liveNames = new Set(Object.keys(input.live.resources));
54
+ for (const [name, entry] of Object.entries(input.live.unobserved)) {
55
+ // Present beats not-observed, exactly as the thin contract resolves it.
56
+ if (liveNames.has(name))
57
+ continue;
58
+ unobserved.push({
59
+ name,
60
+ ...(entry.type ? { type: entry.type } : {}),
61
+ reason: entry.reason,
62
+ ...(entry.detail ? { detail: entry.detail } : {}),
63
+ });
64
+ }
65
+ for (const name of liveNames) {
66
+ if (!(name in input.declared))
67
+ undeclaredEntities.push(name);
68
+ }
69
+ for (const name of Object.keys(input.declared).sort()) {
70
+ const liveEntity = input.live.resources[name];
71
+ // Not observed deeply → already recorded above; no properties to compare.
72
+ // Observed absent by the deep reader is the thin diff's `missing` case and
73
+ // is not restated here: a resource that does not exist has no property
74
+ // drift, and reporting every one of its declared properties as `absent`
75
+ // would bury the one line that matters.
76
+ if (!liveEntity)
77
+ continue;
78
+ const declaredEntity = input.declared[name];
79
+ const type = liveEntity.type || declaredEntity.type;
80
+ const declaredFlat = flattenDeepProperties(declaredEntity.properties, {
81
+ entityType: type,
82
+ side: "declared",
83
+ hooks: input.hooks,
84
+ });
85
+ const liveFlat = flattenDeepProperties(liveEntity.properties, {
86
+ entityType: type,
87
+ side: "live",
88
+ hooks: input.hooks,
89
+ });
90
+ // The claim (#2160): every path this declaration's props flatten to, in the
91
+ // grammar this loop addresses paths by. Derived here rather than read off
92
+ // `liveEntity.claimedFields` so `diffDeep` stays a pure function of its two
93
+ // trees; `lifecycle/deep-observe.ts` computes the identical set from the
94
+ // identical normalized tree and carries it on the observation for consumers.
95
+ const claimed = claimedFieldsFromPaths(declaredFlat.keys());
96
+ const paths = [...new Set([...declaredFlat.keys(), ...liveFlat.keys()])].sort();
97
+ const reported = [];
98
+ const suppressed = [];
99
+ const unclaimedFields = [];
100
+ const heldHere = [];
101
+ for (const path of paths) {
102
+ const hasDeclared = isClaimed(claimed, path);
103
+ const hasLive = liveFlat.has(path);
104
+ const declaredValue = declaredFlat.get(path);
105
+ const liveValue = liveFlat.get(path);
106
+ // A `heldElsewhere()` marker (#2162): never drift, whatever the live
107
+ // value is (or isn't) — reported in its own section instead, with its
108
+ // holder and reason, and never proposed for update. Checked ahead of
109
+ // the UNRESOLVED/equality shortcuts below: a held path is not "no
110
+ // source-side value" (UNRESOLVED) and its declared side will never
111
+ // structurally equal a live value, so without this check every held
112
+ // property would fall through and report as ordinary `changed` drift.
113
+ if (hasDeclared && isNormalizedHeldElsewhere(declaredValue)) {
114
+ heldHere.push({
115
+ path,
116
+ by: declaredValue.by,
117
+ reason: declaredValue.reason,
118
+ ...(hasLive ? { live: liveValue } : {}),
119
+ // No live value at all is the one thing chant can check in a
120
+ // single observation: a claimed hand-over that produced no
121
+ // evidence — not even a provider default — is worth a look.
122
+ suspicious: !hasLive,
123
+ ...(hasLive && liveEntity.fieldOwners?.[path] ? { owner: liveEntity.fieldOwners[path] } : {}),
124
+ });
125
+ continue;
126
+ }
127
+ // An unevaluated intrinsic has no source-side value to compare against.
128
+ if (hasDeclared && declaredValue === UNRESOLVED)
129
+ continue;
130
+ if (hasDeclared && hasLive && deepValueEqual(declaredValue, liveValue))
131
+ continue;
132
+ const acceptedEntry = acceptedDeviation(baseline, name, path);
133
+ // A live value on a path nobody claimed is somebody else's field, not a
134
+ // difference chant proposes to close (#2160). Reported, never drift,
135
+ // never a candidate for an update — and the manager name, where the
136
+ // substrate records one, is the whole answer an operator wants.
137
+ if (!hasDeclared) {
138
+ const { holder, source } = heldBy(liveEntity.fieldOwners, path);
139
+ unclaimedFields.push({
140
+ path,
141
+ live: liveValue,
142
+ ...(holder ? { heldBy: holder } : {}),
143
+ source,
144
+ ...(acceptedEntry ? { baseline: acceptedEntry.value } : {}),
145
+ });
146
+ continue;
147
+ }
148
+ const kind = !hasLive ? "absent" : "changed";
149
+ // Who owns the path live, where the substrate records it (#1189). Only
150
+ // meaningful for a path that exists live — an `absent` drift has no live
151
+ // field for anyone to own.
152
+ const owner = hasLive ? liveEntity.fieldOwners?.[path] : undefined;
153
+ // The declared-side counterpart (#1443).
154
+ const origin = originOfPath(declaredEntity.pathOrigins, path);
155
+ const drift = {
156
+ path,
157
+ kind,
158
+ declared: declaredValue,
159
+ ...(hasLive ? { live: liveValue } : {}),
160
+ ...(owner ? { owner } : {}),
161
+ ...(origin ? { origin } : {}),
162
+ ...(hasLive && liveEntity.observedOn ? { seenOn: liveEntity.observedOn } : {}),
163
+ };
164
+ if (acceptedEntry) {
165
+ drift.baseline = acceptedEntry.value;
166
+ // Value-bound acceptance: the accepted value is not drift, a different
167
+ // one is drift again.
168
+ if (hasLive && deepValueEqual(liveValue, acceptedEntry.value)) {
169
+ suppressed.push(drift);
170
+ continue;
171
+ }
172
+ }
173
+ reported.push(drift);
174
+ }
175
+ if (suppressed.length > 0)
176
+ accepted.push({ name, type, changes: suppressed });
177
+ if (unclaimedFields.length > 0)
178
+ unclaimed.push({ name, type, fields: unclaimedFields });
179
+ if (reported.length > 0)
180
+ drifted.push({ name, type, changes: reported });
181
+ // Held fields do not disqualify an entity from `unchanged`: every property
182
+ // chant declared matches, and the epic's whole point is that a controller's
183
+ // field stops being a finding chant restates on every tick.
184
+ else if (suppressed.length === 0)
185
+ unchanged.push(name);
186
+ if (heldHere.length > 0)
187
+ held.push({ name, type, held: heldHere });
188
+ }
189
+ return {
190
+ drifted: drifted.sort((a, b) => a.name.localeCompare(b.name)),
191
+ accepted: accepted.sort((a, b) => a.name.localeCompare(b.name)),
192
+ unclaimed: unclaimed.sort((a, b) => a.name.localeCompare(b.name)),
193
+ held: held.sort((a, b) => a.name.localeCompare(b.name)),
194
+ unchanged: unchanged.sort(),
195
+ unobserved: unobserved.sort((a, b) => a.name.localeCompare(b.name)),
196
+ undeclaredEntities: undeclaredEntities.sort(),
197
+ ...(input.live.pending && input.live.pending.length > 0
198
+ ? { pending: [...input.live.pending].sort((a, b) => a.subject.localeCompare(b.subject) || a.change.localeCompare(b.change)) }
199
+ : {}),
200
+ };
201
+ }
202
+ /** Total reported property differences across every entity. */
203
+ export function countPropertyDrift(result) {
204
+ return result.drifted.reduce((n, e) => n + e.changes.length, 0);
205
+ }
206
+ /** The pending changes (#3706): drift, though on no one entity's properties. */
207
+ export function countPending(result) {
208
+ return result.pending?.length ?? 0;
209
+ }
210
+ /** Total live values on paths no declaration claimed, across every entity (#2160). Never added to the drift count. */
211
+ export function countUnclaimed(result) {
212
+ return result.unclaimed.reduce((n, e) => n + e.fields.length, 0);
213
+ }
214
+ /** Total held properties (#2162) across every entity. */
215
+ export function countHeld(result) {
216
+ return result.held.reduce((n, e) => n + e.held.length, 0);
217
+ }
218
+ /**
219
+ * Every held property whose declaration looks like a hand-over that never
220
+ * happened — no live value ever showed up for it. Worth a look: either the
221
+ * named holder never ran, or this is not the field it actually writes.
222
+ * Sorted by entity name, then path.
223
+ */
224
+ export function suspiciousHeld(result) {
225
+ const out = [];
226
+ for (const entity of result.held) {
227
+ for (const h of entity.held) {
228
+ if (h.suspicious)
229
+ out.push({ name: entity.name, type: entity.type, ...h });
230
+ }
231
+ }
232
+ return out.sort((a, b) => a.name.localeCompare(b.name) || a.path.localeCompare(b.path));
233
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Deep observation orchestration (#1014) — call one lexicon's
3
+ * `observeResourcesDeep()`, put the declared trees in the same shape, and diff.
4
+ *
5
+ * The sibling of ./observe.ts on the thin path, and it inherits that path's
6
+ * rules: a reader that throws does not vanish, it reports every declared entity
7
+ * NOT-OBSERVED with `read-failed` (#1089); a multi-stack read merges with
8
+ * present > not-observed > absent. A deep read that fails is a hole with a
9
+ * reason, never a thin-but-clean answer.
10
+ *
11
+ * The normalization is applied here, on both sides, with the lexicon's own
12
+ * hooks. The reader already normalized what it returned — that is the contract
13
+ * — but only core can normalize the *declared* tree, and only core knows which
14
+ * paths exist on the other side, which is what
15
+ * {@link import("../deep-observation.js").DeepNode.counterpart} needs for default
16
+ * subtraction. Re-running the pass over an already-normalized live tree is
17
+ * idempotent for every hook that does not consult `counterpart`.
18
+ */
19
+ import { deepPathSet, normalizeDeepObservation, normalizeDeepProperties, } from "../deep-observation.js";
20
+ import { claimedFieldPaths, claimedFieldsOfTree } from "../claimed-fields.js";
21
+ import { unobservedAll } from "../observation.js";
22
+ import { diffDeep } from "./deep-diff.js";
23
+ /**
24
+ * Merge several deep observations of the same lexicon (the multi-stack read).
25
+ * Precedence matches the thin contract: present > not-observed > absent.
26
+ */
27
+ export function mergeDeepObservations(parts) {
28
+ const resources = {};
29
+ const unobserved = {};
30
+ const pending = [];
31
+ for (const part of parts) {
32
+ Object.assign(resources, part.resources);
33
+ Object.assign(unobserved, part.unobserved);
34
+ pending.push(...(part.pending ?? []));
35
+ }
36
+ for (const name of Object.keys(resources))
37
+ delete unobserved[name];
38
+ return { resources, unobserved, ...(pending.length > 0 ? { pending } : {}) };
39
+ }
40
+ /**
41
+ * Read one lexicon's live property trees. Never throws: a thrown reader becomes
42
+ * a NOT-OBSERVED verdict for every declared entity, with the error as the
43
+ * detail, so the caller sees a hole rather than an empty tree that reads as
44
+ * "no properties drifted".
45
+ */
46
+ export async function observeDeep(plugin, opts) {
47
+ const entityNames = Array.from(opts.entities.keys());
48
+ if (!plugin.observeResourcesDeep) {
49
+ return { resources: {}, unobserved: {} };
50
+ }
51
+ const base = {
52
+ environment: opts.environment,
53
+ buildOutput: opts.buildOutput,
54
+ entityNames,
55
+ entities: opts.entities,
56
+ ...(opts.region ? { region: opts.region } : {}),
57
+ ...(opts.owned !== undefined ? { owned: opts.owned } : {}),
58
+ };
59
+ try {
60
+ if (opts.componentStacks && opts.componentStacks.length > 0) {
61
+ const parts = [];
62
+ for (const stack of opts.componentStacks) {
63
+ parts.push(normalizeDeepObservation(await plugin.observeResourcesDeep({ ...base, stack })));
64
+ }
65
+ return mergeDeepObservations(parts);
66
+ }
67
+ return normalizeDeepObservation(await plugin.observeResourcesDeep({ ...base, ...(opts.stack ? { stack: opts.stack } : {}) }));
68
+ }
69
+ catch (err) {
70
+ const message = err instanceof Error ? err.message : String(err);
71
+ return {
72
+ resources: {},
73
+ unobserved: unobservedAll(entityNames, "read-failed", message, opts.entities),
74
+ };
75
+ }
76
+ }
77
+ /**
78
+ * Normalize both sides into the same shape, then diff.
79
+ *
80
+ * Split out from {@link deepDiffForLexicon} so the pure half is testable
81
+ * without a plugin: given declared entities, a live observation and a baseline,
82
+ * this is a deterministic function.
83
+ */
84
+ export function diffDeepObservation(entities, live, hooks, baseline) {
85
+ const declared = {};
86
+ const normalizedLive = {};
87
+ for (const [name, entity] of entities) {
88
+ const liveEntity = live.resources[name];
89
+ const declaredRaw = entity.props ?? {};
90
+ const liveRaw = liveEntity?.properties ?? {};
91
+ const declaredPaths = deepPathSet(declaredRaw);
92
+ const livePaths = deepPathSet(liveRaw);
93
+ const declaredProperties = normalizeDeepProperties(declaredRaw, {
94
+ entityType: entity.entityType,
95
+ side: "declared",
96
+ hooks,
97
+ counterpartPaths: livePaths,
98
+ });
99
+ declared[name] = {
100
+ type: entity.entityType,
101
+ properties: declaredProperties,
102
+ ...(entity.pathOrigins ? { pathOrigins: entity.pathOrigins } : {}),
103
+ };
104
+ if (liveEntity) {
105
+ normalizedLive[name] = {
106
+ type: liveEntity.type || entity.entityType,
107
+ ...(liveEntity.physicalId ? { physicalId: liveEntity.physicalId } : {}),
108
+ // Per-path owners (#1189) ride through unchanged; the diff looks them
109
+ // up by the flattened path, so a keyed list element (`[#name]`) has
110
+ // no owner today — its raw index path is what the reader recorded.
111
+ ...(liveEntity.fieldOwners ? { fieldOwners: liveEntity.fieldOwners } : {}),
112
+ // Which server's copy was read, when the reader read several (#3664).
113
+ ...(liveEntity.observedOn ? { observedOn: liveEntity.observedOn } : {}),
114
+ // The claimed-field set (#2160), computed from the declaration and
115
+ // carried on the observation so a consumer holding only this envelope
116
+ // can classify a live value three ways rather than two. Same normalized
117
+ // tree and same hooks `diffDeep` flattens, so the two never disagree
118
+ // about a path.
119
+ claimedFields: claimedFieldPaths(claimedFieldsOfTree(declaredProperties, { entityType: entity.entityType, ...(hooks ? { hooks } : {}) })),
120
+ properties: normalizeDeepProperties(liveRaw, {
121
+ entityType: liveEntity.type || entity.entityType,
122
+ side: "live",
123
+ hooks,
124
+ counterpartPaths: declaredPaths,
125
+ }),
126
+ };
127
+ }
128
+ }
129
+ // Live entities nobody declared keep their reader-normalized trees — there is
130
+ // no declared side to normalize them against, and `diffDeep` reports them as
131
+ // undeclared entities rather than diffing their properties.
132
+ for (const [name, liveEntity] of Object.entries(live.resources)) {
133
+ if (!normalizedLive[name])
134
+ normalizedLive[name] = liveEntity;
135
+ }
136
+ return diffDeep({
137
+ declared,
138
+ live: { resources: normalizedLive, unobserved: live.unobserved, ...(live.pending ? { pending: live.pending } : {}) },
139
+ baseline,
140
+ hooks,
141
+ });
142
+ }
143
+ /** Read one lexicon deeply and diff it against source and the accepted baseline. */
144
+ export async function deepDiffForLexicon(plugin, opts) {
145
+ const live = await observeDeep(plugin, opts);
146
+ return diffDeepObservation(opts.entities, live, plugin.deepNormalizationHooks, opts.baseline);
147
+ }
@@ -0,0 +1,143 @@
1
+ import { canonicalJson } from "../effect-receipt.js";
2
+ import { contentDigest } from "../content-digest.js";
3
+ import { isAttrRefLike, LOGICAL_NAME_SYMBOL } from "../utils.js";
4
+ /**
5
+ * Hash an entity's props deterministically: bare hex SHA-256 over their
6
+ * `canonicalJson` (chant #2514). Props are first passed through
7
+ * `JSON.stringify`, which applies `toJSON` and drops what JSON cannot hold
8
+ * (a function-valued prop, say), so a prop that serialises today still
9
+ * hashes rather than throwing.
10
+ */
11
+ export function hashProps(props) {
12
+ const plain = JSON.parse(JSON.stringify(namedRefs(props)) ?? "null");
13
+ return contentDigest(canonicalJson(plain)).slice("sha256:".length);
14
+ }
15
+ /**
16
+ * `props` with each AttrRef that has no logical name of its own written as
17
+ * the envelope its `toJSON` gives, named by its parent's logical name. The
18
+ * build names only an entity's top-level AttrRefs; one held in a record,
19
+ * such as a sql table's `columns`, is never named, and `toJSON` throws on
20
+ * it (chant#3642). Plain objects and arrays are walked; anything else is
21
+ * left for `JSON.stringify`, so a named AttrRef hashes as it always has.
22
+ */
23
+ function namedRefs(value) {
24
+ if (isAttrRefLike(value)) {
25
+ if (value.getLogicalName())
26
+ return value;
27
+ const parent = value.parent.deref();
28
+ const entity = parent?.[LOGICAL_NAME_SYMBOL];
29
+ return { __attrRef: { entity: typeof entity === "string" ? entity : null, attribute: value.attribute } };
30
+ }
31
+ if (Array.isArray(value))
32
+ return value.map(namedRefs);
33
+ if (value !== null && typeof value === "object") {
34
+ const proto = Object.getPrototypeOf(value);
35
+ if (proto !== Object.prototype && proto !== null)
36
+ return value;
37
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, namedRefs(v)]));
38
+ }
39
+ return value;
40
+ }
41
+ /**
42
+ * The fingerprint of one entity's declared definition (#3652): its type and
43
+ * its build props, hashed by {@link hashProps}. A live diff and a lifecycle
44
+ * plan print it beside each create, so the plan digest a gate binds moves
45
+ * when what would be created changes, not only when its name does.
46
+ */
47
+ export function definitionDigest(entityType, props) {
48
+ return hashProps({ type: entityType, props: props ?? {} });
49
+ }
50
+ /** {@link definitionDigest} for every entity in `entities`, keyed by name. */
51
+ export function declaredDefinitions(entities) {
52
+ const out = {};
53
+ for (const [name, entity] of entities)
54
+ out[name] = definitionDigest(entity.entityType, entity.props);
55
+ return out;
56
+ }
57
+ /**
58
+ * Compute a full build digest from a BuildResult.
59
+ */
60
+ export function computeBuildDigest(buildResult) {
61
+ const resources = {};
62
+ for (const [name, entity] of buildResult.entities) {
63
+ const props = "props" in entity && entity.props != null ? entity.props : {};
64
+ resources[name] = {
65
+ type: entity.entityType,
66
+ lexicon: entity.lexicon,
67
+ propsHash: hashProps(props),
68
+ };
69
+ }
70
+ // Convert dependency Map<string, Set<string>> to Record<string, string[]>
71
+ const dependencies = {};
72
+ for (const [name, deps] of buildResult.dependencies) {
73
+ dependencies[name] = Array.from(deps);
74
+ }
75
+ return {
76
+ resources,
77
+ // chant #1442 — what interpreted the declarations, alongside what was
78
+ // declared. Always present on a freshly computed digest, so "absent"
79
+ // unambiguously means "recorded before #1442".
80
+ lexiconVersions: { ...buildResult.lexiconVersions },
81
+ dependencies,
82
+ outputs: buildResult.manifest.outputs,
83
+ deployOrder: buildResult.manifest.deployOrder,
84
+ };
85
+ }
86
+ /**
87
+ * Compare two digests and categorize resources.
88
+ */
89
+ export function diffDigests(current, previous) {
90
+ const added = [];
91
+ const removed = [];
92
+ const changed = [];
93
+ const unchanged = [];
94
+ if (!previous) {
95
+ // No previous digest — everything is added, and there is no version to
96
+ // have moved away from.
97
+ added.push(...Object.keys(current.resources));
98
+ return { added, removed, changed, unchanged, lexiconVersionChanges: [] };
99
+ }
100
+ // Check current resources against previous
101
+ for (const name of Object.keys(current.resources)) {
102
+ const prev = previous.resources[name];
103
+ if (!prev) {
104
+ added.push(name);
105
+ }
106
+ else if (current.resources[name].propsHash !== prev.propsHash) {
107
+ changed.push(name);
108
+ }
109
+ else {
110
+ unchanged.push(name);
111
+ }
112
+ }
113
+ // Check for removed resources
114
+ for (const name of Object.keys(previous.resources)) {
115
+ if (!(name in current.resources)) {
116
+ removed.push(name);
117
+ }
118
+ }
119
+ return { added, removed, changed, unchanged, lexiconVersionChanges: diffLexiconVersions(current, previous) };
120
+ }
121
+ /**
122
+ * Lexicons whose version moved between two digests (chant #1442).
123
+ *
124
+ * A digest recorded before this existed has no `lexiconVersions` at all. That
125
+ * is reported as no change rather than as every lexicon appearing — comparing
126
+ * against an older snapshot must not manufacture a difference that the older
127
+ * build simply never recorded.
128
+ */
129
+ function diffLexiconVersions(current, previous) {
130
+ if (!current.lexiconVersions || !previous.lexiconVersions)
131
+ return [];
132
+ const changes = [];
133
+ for (const lexicon of new Set([
134
+ ...Object.keys(current.lexiconVersions),
135
+ ...Object.keys(previous.lexiconVersions),
136
+ ])) {
137
+ const now = current.lexiconVersions[lexicon];
138
+ const before = previous.lexiconVersions[lexicon];
139
+ if (now !== before)
140
+ changes.push({ lexicon, previous: before, current: now });
141
+ }
142
+ return changes.sort((a, b) => a.lexicon.localeCompare(b.lexicon));
143
+ }