@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,623 @@
1
+ import { relative, isAbsolute } from "node:path";
2
+ import { isAttrRefLike } from "./utils.js";
3
+ import { isDeclarable } from "./declarable.js";
4
+ import { isLexiconOutput } from "./lexicon-output.js";
5
+ import { getProvenance } from "./provenance.js";
6
+ import { INTRINSIC_MARKER } from "./intrinsic.js";
7
+ /** True when `value` has the {@link EntityReference} shape. */
8
+ function isEntityReference(value) {
9
+ return (typeof value === "object" &&
10
+ value !== null &&
11
+ typeof value.to === "string");
12
+ }
13
+ /**
14
+ * The references an entity declared for itself (#2265), or an empty list.
15
+ * Duck-typed on purpose, see {@link EntityReference}.
16
+ */
17
+ export function entityReferences(entity) {
18
+ const declared = entity.references;
19
+ if (!Array.isArray(declared))
20
+ return [];
21
+ return declared.filter(isEntityReference);
22
+ }
23
+ /**
24
+ * The deployable unit an entity says it belongs to (#2266), or undefined.
25
+ *
26
+ * Same duck-typed channel as {@link entityReferences}, for the other half of
27
+ * the same problem. `groups.byStack` keys by lexicon partition when nothing
28
+ * says otherwise, on the reasoning that one lexicon serialises to one
29
+ * deployable stack. That reasoning is exactly wrong for a lexicon reading an
30
+ * estate that already has several: a terraform project declaring five
31
+ * `terraform.roots` has five things `terraform apply` runs against, and each
32
+ * one is a stack in every sense `byStack` means, so five roots landed in one
33
+ * bucket named `terraform`.
34
+ *
35
+ * The root is not inferable here and should not be: it is the producer's own
36
+ * name for its own unit. A consumer could recover it from the node id prefix
37
+ * the terraform lexicon mints, but an id convention is not a promise, and
38
+ * `byStack` is the field whose whole job is saying which box a node goes in.
39
+ */
40
+ export function entityStack(entity) {
41
+ const stack = entity.stack;
42
+ return typeof stack === "string" && stack.length > 0 ? stack : undefined;
43
+ }
44
+ /**
45
+ * The version `chant graph --format ir` writes on its output (#2529, #2524 D8).
46
+ * The format changes only additively: a new field or edge kind never bumps
47
+ * it, and a consumer ignores the fields and edge kinds it does not know. The
48
+ * number moves only for a change a consumer could not ignore.
49
+ */
50
+ export const GRAPH_IR_VERSION = 1;
51
+ /** A node is anything that serializes to a resource — not a property or output. */
52
+ function isNodeEntity(entity) {
53
+ if (isLexiconOutput(entity))
54
+ return false;
55
+ if (entity.kind === "property")
56
+ return false;
57
+ return true;
58
+ }
59
+ function relFile(file, projectPath) {
60
+ if (!file)
61
+ return undefined;
62
+ if (projectPath && isAbsolute(file)) {
63
+ const rel = relative(projectPath, file);
64
+ return rel.startsWith("..") ? file : rel;
65
+ }
66
+ return file;
67
+ }
68
+ /** The logical name a `Ref`-style intrinsic points at, or undefined. Lexicon-
69
+ * agnostic: reads the intrinsic's `toJSON()` for the CloudFormation `{ Ref: name }`
70
+ * shape (aws `RefIntrinsic` etc.). A `Ref` to a node is a real dependency edge,
71
+ * not an opaque intrinsic (#513) — so we resolve it rather than flatten it. */
72
+ function refIntrinsicTarget(value) {
73
+ try {
74
+ const json = value.toJSON?.();
75
+ if (json && typeof json === "object" && typeof json.Ref === "string") {
76
+ return json.Ref;
77
+ }
78
+ }
79
+ catch {
80
+ // Unresolvable at graph-build time — leave it as an opaque intrinsic.
81
+ }
82
+ return undefined;
83
+ }
84
+ /** Resolve the producer (logical name) an AttrRef points at. */
85
+ function refTarget(ref, reverse) {
86
+ // Nested refs (under `props`) aren't assigned a logical name by resolveAttrRefs,
87
+ // which only resolves top-level own props — so fall back to the parent's name.
88
+ const parent = ref.parent.deref();
89
+ return ref.getLogicalName() ?? (parent ? reverse.get(parent) : undefined);
90
+ }
91
+ /**
92
+ * The node id a whole declarable held in a config bag stands for, or undefined
93
+ * when it is not a node of this graph (an inlined property-kind resource, say,
94
+ * which is config of the holder and gets walked instead). An entity can name
95
+ * another entity directly rather than through an AttrRef, as the sql lexicon's
96
+ * enumerable `dependsOn` does with the tables, views and databases a statement
97
+ * mentions (#3257); that is a reference to the node, not a nested bag.
98
+ */
99
+ function nodeReference(value, reverse, nodeIds) {
100
+ const id = reverse.get(value);
101
+ return id !== undefined && nodeIds.has(id) ? id : undefined;
102
+ }
103
+ /** Project a value into a JSON-safe, scrubbed form. References become `{ $ref }`. */
104
+ function project(value, seen, reverse, nodeIds) {
105
+ if (value === null)
106
+ return null;
107
+ const t = typeof value;
108
+ if (t === "string" || t === "number" || t === "boolean")
109
+ return value;
110
+ if (t !== "object")
111
+ return undefined; // functions, symbols, undefined
112
+ // Duck-type, not `instanceof`: a lexicon built against a different copy of
113
+ // `@intentius/chant` produces AttrRefs that fail `instanceof AttrRef` but carry
114
+ // the same shape. Without this, a real cross-resource reference falls through to
115
+ // the intrinsic branch below and is silently flattened to `{$intrinsic}` (#511).
116
+ if (isAttrRefLike(value)) {
117
+ const to = refTarget(value, reverse);
118
+ return { $ref: to ? `${to}.${value.attribute}` : value.attribute };
119
+ }
120
+ if (value[INTRINSIC_MARKER] === true) {
121
+ // A `Ref` to a known node is a real reference — surface it as `$ref` so attrs
122
+ // match the edge (#513). Other intrinsics (interpolations, pseudo-parameters,
123
+ // Ref to a non-node) stay opaque.
124
+ const to = refIntrinsicTarget(value);
125
+ if (to && nodeIds.has(to))
126
+ return { $ref: to };
127
+ return { $intrinsic: true };
128
+ }
129
+ if (seen.has(value))
130
+ return undefined; // break cycles
131
+ seen.add(value);
132
+ // Nested declarables (e.g. an inlined property-kind resource) keep their
133
+ // config in a non-enumerable `props` bag, like top-level nodes — project that.
134
+ if (isDeclarable(value)) {
135
+ // Another node held whole is a reference to it, not config to inline.
136
+ const to = nodeReference(value, reverse, nodeIds);
137
+ if (to)
138
+ return { $ref: to };
139
+ const out = projectConfig(value, seen, reverse, nodeIds);
140
+ seen.delete(value);
141
+ return out;
142
+ }
143
+ if (Array.isArray(value)) {
144
+ const out = value.map((v) => project(v, seen, reverse, nodeIds)).filter((v) => v !== undefined);
145
+ seen.delete(value);
146
+ return out;
147
+ }
148
+ const out = {};
149
+ for (const [k, v] of Object.entries(value)) {
150
+ const p = project(v, seen, reverse, nodeIds);
151
+ if (p !== undefined)
152
+ out[k] = p;
153
+ }
154
+ seen.delete(value);
155
+ return out;
156
+ }
157
+ // `references` and `stack` are the two duck-typed channels above
158
+ // ({@link entityReferences}, {@link entityStack}). They are metadata about the
159
+ // entity's place in the graph, not declared configuration, and both are read
160
+ // directly, so projecting them into `attrs` would only restate an edge and a
161
+ // group key the IR already carries.
162
+ const SKIP_KEYS = new Set(["lexicon", "entityType", "kind", "attributes", "Ref", "references", "stack"]);
163
+ /** The config bag of a node, paired with each key. Lexicon entities keep their
164
+ * declared props in a (usually non-enumerable) `props` object; simpler entities
165
+ * carry config as enumerable own properties. We surface both, flattening `props`
166
+ * so a field reads as e.g. `network`, not `props.network`. */
167
+ function configRoots(entity) {
168
+ const out = [];
169
+ for (const [k, v] of Object.entries(entity)) {
170
+ if (SKIP_KEYS.has(k) || k === "props")
171
+ continue;
172
+ out.push([k, v]);
173
+ }
174
+ const props = entity.props;
175
+ if (props && typeof props === "object" && !Array.isArray(props)) {
176
+ for (const [k, v] of Object.entries(props))
177
+ out.push([k, v]);
178
+ }
179
+ return out;
180
+ }
181
+ /** Project a declarable's config bag (flattened props + enumerable own props). */
182
+ function projectConfig(entity, seen, reverse, nodeIds) {
183
+ const out = {};
184
+ for (const [k, v] of configRoots(entity)) {
185
+ const p = project(v, seen, reverse, nodeIds);
186
+ if (p !== undefined)
187
+ out[k] = p;
188
+ }
189
+ return out;
190
+ }
191
+ /**
192
+ * Collect ref edges from one node, labelling each with its consumer property.
193
+ *
194
+ * Two sources, merged here. First the references the entity resolved for
195
+ * itself ({@link EntityReference}), which is how a lexicon that parses HCL,
196
+ * YAML or any other foreign source says what its strings point at. Then the
197
+ * walk over the config bag for {@link AttrRef} objects and `Ref` intrinsics,
198
+ * which is how a typed lexicon's props carry the same fact. A lexicon uses one
199
+ * or the other; nothing stops it using both, and the dedup in `buildGraphIr`
200
+ * collapses an edge two sources agree on.
201
+ */
202
+ function collectEdges(entity, from, nodeIds, reverse) {
203
+ const edges = [];
204
+ for (const ref of entityReferences(entity)) {
205
+ if (ref.to === from || !nodeIds.has(ref.to))
206
+ continue;
207
+ edges.push({
208
+ from,
209
+ to: ref.to,
210
+ kind: "ref",
211
+ ...(ref.viaAttr ? { viaAttr: ref.viaAttr } : {}),
212
+ ...(ref.toAttr ? { toAttr: ref.toAttr } : {}),
213
+ });
214
+ }
215
+ const seen = new Set();
216
+ const visit = (value, viaAttr) => {
217
+ if (value === null || typeof value !== "object")
218
+ return;
219
+ if (isAttrRefLike(value)) {
220
+ const to = refTarget(value, reverse);
221
+ if (to && to !== from && nodeIds.has(to)) {
222
+ edges.push({ from, to, kind: "ref", viaAttr });
223
+ }
224
+ return;
225
+ }
226
+ if (value[INTRINSIC_MARKER] === true) {
227
+ // A `Ref` to a known node (a Parameter, or a resource) is a real dependency
228
+ // — resolve it to an edge instead of dropping it as an opaque intrinsic (#513).
229
+ const to = refIntrinsicTarget(value);
230
+ if (to && to !== from && nodeIds.has(to))
231
+ edges.push({ from, to, kind: "ref", viaAttr });
232
+ return;
233
+ }
234
+ // A whole node held in props or an enumerable field (the sql lexicon's
235
+ // `dependsOn`) is a reference to it: draw the edge, and do not walk its
236
+ // config, whose refs belong to that node's own edges (#3257). Checked
237
+ // before `seen` so the same node under two attributes yields both edges.
238
+ const held = nodeReference(value, reverse, nodeIds);
239
+ if (held) {
240
+ if (held !== from)
241
+ edges.push({ from, to: held, kind: "ref", viaAttr });
242
+ return;
243
+ }
244
+ if (seen.has(value))
245
+ return;
246
+ seen.add(value);
247
+ // A nested declarable (an inlined property-kind resource, e.g. a listener's
248
+ // `DefaultActions: [Listener_Action{ TargetGroupArn: tg.TargetGroupArn }]`)
249
+ // keeps its config in a NON-enumerable `props` bag, so `Object.values`
250
+ // below would walk right past the ref inside it and drop the edge. Descend
251
+ // via `configRoots` (which reads `props`), mirroring `project`'s handling —
252
+ // the ref then resolves to a real from→to edge on the containing node.
253
+ if (isDeclarable(value)) {
254
+ for (const [, v] of configRoots(value))
255
+ visit(v, viaAttr);
256
+ return;
257
+ }
258
+ if (Array.isArray(value)) {
259
+ for (const item of value)
260
+ visit(item, viaAttr);
261
+ return;
262
+ }
263
+ for (const v of Object.values(value))
264
+ visit(v, viaAttr);
265
+ };
266
+ for (const [k, v] of configRoots(entity))
267
+ visit(v, k);
268
+ return edges;
269
+ }
270
+ /** Stable key for deduping and sorting an edge. */
271
+ function edgeKey(e) {
272
+ return `${e.from}\0${e.to}\0${e.viaAttr ?? ""}`;
273
+ }
274
+ /**
275
+ * Build the graph IR from resolved entities (the output of `discover`). Pure and
276
+ * deterministic: nodes and edges are sorted, so the same source yields identical
277
+ * IR. `projectPath` relativizes source-file paths for portable output.
278
+ */
279
+ export function buildGraphIr(entities, projectPath) {
280
+ var _a, _b, _c;
281
+ // Reverse lookup for producers whose AttrRef logical name wasn't resolved.
282
+ const reverse = new Map();
283
+ for (const [name, entity] of entities)
284
+ reverse.set(entity, name);
285
+ const nodeIds = new Set();
286
+ for (const [name, entity] of entities) {
287
+ if (isNodeEntity(entity))
288
+ nodeIds.add(name);
289
+ }
290
+ const nodes = [];
291
+ const byLexicon = {};
292
+ const byComposite = {};
293
+ const byStack = {};
294
+ for (const [name, entity] of entities) {
295
+ if (!nodeIds.has(name))
296
+ continue;
297
+ const prov = getProvenance(entity);
298
+ const node = {
299
+ id: name,
300
+ kind: entity.entityType,
301
+ lexicon: entity.lexicon,
302
+ attrs: projectConfig(entity, new Set(), reverse, nodeIds),
303
+ };
304
+ if (prov?.composite)
305
+ node.compositeParent = prov.composite;
306
+ if (prov?.compositeInstance)
307
+ node.compositeInstance = prov.compositeInstance;
308
+ const file = relFile(prov?.sourceFile, projectPath);
309
+ if (file)
310
+ node.sourceLoc = { file };
311
+ nodes.push(node);
312
+ (byLexicon[_a = entity.lexicon] ?? (byLexicon[_a] = [])).push(name);
313
+ // An entity that names its own deployable unit is taken at its word
314
+ // (#2266): a terraform root is one `terraform apply`, and a project
315
+ // declaring five of them has five stacks whatever the lexicon count says.
316
+ // See {@link entityStack}.
317
+ //
318
+ // Otherwise, within ONE source tree a stack is a lexicon partition — each
319
+ // lexicon serialises to one deployable stack (a CloudFormation template, a
320
+ // CI config) — so that is what `byStack` reports. It stays a distinct axis
321
+ // from `byLexicon` (which is for provenance/colouring), emitted separately
322
+ // even where the two coincide.
323
+ //
324
+ // A project with genuinely separate, side-by-side stacks declares them in
325
+ // config, and `buildDeclaredPerStack` (./graph-declared.ts) groups those by
326
+ // their declared names — no inference, since the project already said. That
327
+ // is the multi-stack shape chant steers toward (#1433).
328
+ //
329
+ // This previously promised that "#513 phase 2 will regroup it by nested
330
+ // child-project". #513 is closed, that phase was never filed, and directory
331
+ // partitioning is the exception rather than the rule — so the promise is
332
+ // withdrawn rather than left pointing at a closed issue.
333
+ (byStack[_b = entityStack(entity) ?? entity.lexicon] ?? (byStack[_b] = [])).push(name);
334
+ if (prov?.composite)
335
+ (byComposite[_c = prov.composite] ?? (byComposite[_c] = [])).push(name);
336
+ }
337
+ const edgeMap = new Map();
338
+ for (const [name, entity] of entities) {
339
+ if (!nodeIds.has(name))
340
+ continue;
341
+ for (const e of collectEdges(entity, name, nodeIds, reverse)) {
342
+ edgeMap.set(edgeKey(e), e);
343
+ }
344
+ }
345
+ nodes.sort((a, b) => a.id.localeCompare(b.id));
346
+ const edges = [...edgeMap.values()].sort((a, b) => edgeKey(a).localeCompare(edgeKey(b)));
347
+ for (const ids of Object.values(byLexicon))
348
+ ids.sort();
349
+ for (const ids of Object.values(byComposite))
350
+ ids.sort();
351
+ for (const ids of Object.values(byStack))
352
+ ids.sort();
353
+ const groups = {};
354
+ if (Object.keys(byLexicon).length)
355
+ groups.byLexicon = sortKeys(byLexicon);
356
+ if (Object.keys(byComposite).length)
357
+ groups.byComposite = sortKeys(byComposite);
358
+ if (Object.keys(byStack).length)
359
+ groups.byStack = sortKeys(byStack);
360
+ // Cross-stack exports: a stack's `output(ref, name)` LexiconOutputs are dropped
361
+ // from the node set (they're not resources), but their name + producing node is
362
+ // the handle another stack imports by. Surface them so a viewer can draw the
363
+ // cross-stack edge (#513). Resolve the producer via the output's source entity.
364
+ const exports = [];
365
+ for (const entity of entities.values()) {
366
+ if (!isLexiconOutput(entity))
367
+ continue;
368
+ const lo = entity;
369
+ if (!lo.outputName)
370
+ continue;
371
+ const parent = lo._sourceParent?.deref();
372
+ const node = (parent ? reverse.get(parent) : undefined) ?? (lo.sourceEntity || undefined);
373
+ exports.push({ name: lo.outputName, ...(node ? { node } : {}), ...(lo.sourceAttribute ? { attr: lo.sourceAttribute } : {}) });
374
+ }
375
+ exports.sort((a, b) => a.name.localeCompare(b.name));
376
+ // Cross-stack imports: parameter nodes are the handles this stack imports by,
377
+ // matched to another stack's export names (#513). Detected by kind — the aws
378
+ // `Parameter` is the cross-stack input mechanism.
379
+ const imports = nodes
380
+ .filter((n) => /(^|::)Parameter$/i.test(n.kind))
381
+ .map((n) => ({ name: n.id, node: n.id }))
382
+ .sort((a, b) => a.name.localeCompare(b.name));
383
+ const ir = { nodes, edges, groups };
384
+ if (exports.length)
385
+ ir.exports = exports;
386
+ if (imports.length)
387
+ ir.imports = imports;
388
+ return ir;
389
+ }
390
+ function sortKeys(rec) {
391
+ const out = {};
392
+ for (const k of Object.keys(rec).sort())
393
+ out[k] = rec[k];
394
+ return out;
395
+ }
396
+ /**
397
+ * Build the graph IR from **live-observed** resources (`chant graph --live`) —
398
+ * the provisioned graph, not the declared one. This is the C1 half of epic #776:
399
+ * nodes only. Edges are reconstructed separately by the per-lexicon reference
400
+ * resolver (#778); containment grouping by #779. Pure and deterministic given a
401
+ * fixed observation set (nodes and group ids sorted), so the same snapshot yields
402
+ * identical IR.
403
+ *
404
+ * Each node carries the observed `physicalId` (the reference resolver's index
405
+ * key) and `ownership` marker. `attrs` is the resource's observed attributes.
406
+ */
407
+ export function buildLiveGraphIr(observations) {
408
+ const nodes = [];
409
+ const byLexicon = {};
410
+ const byStack = {};
411
+ for (const { lexicon, resources } of observations) {
412
+ for (const [name, meta] of Object.entries(resources)) {
413
+ const node = {
414
+ id: name,
415
+ kind: meta.type,
416
+ lexicon,
417
+ attrs: meta.attributes ?? {},
418
+ };
419
+ if (meta.physicalId)
420
+ node.physicalId = meta.physicalId;
421
+ // `unknown` is a legitimate verdict on the metadata (#1089) but carries no
422
+ // information for a painter, and the IR's `ownership` field means "a
423
+ // verdict was reached" — so only owned/foreign land on the node.
424
+ if (meta.ownership === "owned" || meta.ownership === "foreign")
425
+ node.ownership = meta.ownership;
426
+ // Owner-reference chain (#1077): only a resolved `declared` root is
427
+ // carried onto the node — the same "a verdict was reached" rule as
428
+ // ownership above, since `unowned`/`foreign`/`unknown` all mean "no
429
+ // declared owner", which is simply the absence of this field.
430
+ if (meta.ownerChain?.root === "declared")
431
+ node.runtimeOwner = meta.ownerChain.entity;
432
+ nodes.push(node);
433
+ (byLexicon[lexicon] ?? (byLexicon[lexicon] = [])).push(name);
434
+ // A live lexicon maps to one deployable stack, same as the source IR.
435
+ (byStack[lexicon] ?? (byStack[lexicon] = [])).push(name);
436
+ }
437
+ }
438
+ nodes.sort((a, b) => a.id.localeCompare(b.id));
439
+ for (const ids of Object.values(byLexicon))
440
+ ids.sort();
441
+ for (const ids of Object.values(byStack))
442
+ ids.sort();
443
+ const groups = {};
444
+ if (Object.keys(byLexicon).length)
445
+ groups.byLexicon = sortKeys(byLexicon);
446
+ if (Object.keys(byStack).length)
447
+ groups.byStack = sortKeys(byStack);
448
+ // Observed relationships (#1271). An edge whose endpoints were not both
449
+ // observed is dropped rather than kept as a dangling reference: the fold
450
+ // resolves ids to nodes, and a half-edge would silently traverse to nothing.
451
+ // Deduped and sorted for the same reason nodes are — the IR is compared and
452
+ // committed, so it has to be stable across reads.
453
+ const observedIds = new Set(nodes.map((n) => n.id));
454
+ const seen = new Set();
455
+ const edges = [];
456
+ for (const observation of observations) {
457
+ for (const edge of observation.edges ?? []) {
458
+ if (!observedIds.has(edge.from) || !observedIds.has(edge.to))
459
+ continue;
460
+ const key = `${edge.from}\u0000${edge.to}\u0000${edge.viaAttr ?? ""}\u0000${edge.toAttr ?? ""}`;
461
+ if (seen.has(key))
462
+ continue;
463
+ seen.add(key);
464
+ edges.push(edge);
465
+ }
466
+ }
467
+ edges.sort((a, b) => a.from.localeCompare(b.from) ||
468
+ a.to.localeCompare(b.to) ||
469
+ (a.viaAttr ?? "").localeCompare(b.viaAttr ?? ""));
470
+ // Stack exports (#1279) land on the IR's `exports`, the same place the
471
+ // declared graph keeps what a stack publishes — not on the member nodes.
472
+ const exports = [];
473
+ for (const observation of observations) {
474
+ for (const [stack, values] of Object.entries(observation.stackExports ?? {})) {
475
+ for (const [name, value] of Object.entries(values))
476
+ exports.push({ name, value, stack });
477
+ }
478
+ }
479
+ exports.sort((a, b) => a.name.localeCompare(b.name) || (a.stack ?? "").localeCompare(b.stack ?? ""));
480
+ return { nodes, edges, groups, ...(exports.length > 0 ? { exports } : {}) };
481
+ }
482
+ /** The union of every observation's unobserved entities — the input to the overlays. */
483
+ export function collectUnobserved(observations) {
484
+ const out = {};
485
+ for (const o of observations)
486
+ Object.assign(out, o.unobserved ?? {});
487
+ return out;
488
+ }
489
+ function tagStatus(n, status, unobserved) {
490
+ return {
491
+ ...n,
492
+ attrs: {
493
+ ...n.attrs,
494
+ _status: status,
495
+ ...(unobserved ? { _unobserved: unobserved.reason } : {}),
496
+ },
497
+ };
498
+ }
499
+ /**
500
+ * Overlay the declared graph on the provisioned one (#780, `chant graph --live
501
+ * --overlay`) and classify each resource, tagging a `_status` a renderer colours:
502
+ * - **managed** (declared + provisioned) → `good`
503
+ * - **runtime** (provisioned, not declared, owner chain reaches a declared
504
+ * entity — #1077) → `runtime`, e.g. a Pod a declared Deployment's
505
+ * controller created — expected, not a foreign resource needing attention
506
+ * - **foreign** (provisioned, not declared, no declared owner) → `warn`
507
+ * - **pending** (declared, provider confirmed absent) → `accent`
508
+ * - **unobserved** (declared, chant could not look — #1089) → `neutral`,
509
+ * plus an `_unobserved` attr carrying the reason
510
+ * Live nodes keep their edges/containment; pending nodes are appended (they have
511
+ * no live edges). Sorted; the live groups pass through unchanged.
512
+ */
513
+ export function overlayGraphs(live, declared, opts) {
514
+ const declaredIds = new Set(declared.nodes.map((n) => n.id));
515
+ const liveIds = new Set(live.nodes.map((n) => n.id));
516
+ const unobserved = opts?.unobserved ?? {};
517
+ const nodes = live.nodes.map((n) => tagStatus(n, declaredIds.has(n.id) ? "good" : n.runtimeOwner ? "runtime" : "warn"));
518
+ for (const n of declared.nodes) {
519
+ if (liveIds.has(n.id))
520
+ continue;
521
+ const u = unobserved[n.id];
522
+ nodes.push(u ? tagStatus(n, "neutral", u) : tagStatus(n, "accent"));
523
+ }
524
+ nodes.sort((a, b) => a.id.localeCompare(b.id));
525
+ return { ...live, nodes };
526
+ }
527
+ /**
528
+ * Source-anchored overlay (#821) — the inverse of {@link overlayGraphs}. The
529
+ * **declared** graph is the canvas, so its edges are kept: cross-substrate edges
530
+ * (an ECS service wired to a k8s workload) are a source-graph property, since live
531
+ * reconstruction is per-substrate (identifier value-match) and never crosses
532
+ * providers. Use this when the overlay must keep the mixed topology; use
533
+ * `overlayGraphs` when the provisioned graph itself is the subject.
534
+ *
535
+ * Each declared node is classified against live observation and tagged `_status`:
536
+ * - **managed** (declared + provisioned) → `good`, carrying the observed
537
+ * `physicalId` / `ownership` onto the declared node
538
+ * - **pending** (declared, provider confirmed absent) → `accent`
539
+ * - **unobserved** (declared, chant could not look — #1089) → `neutral`, with
540
+ * the reason on `_unobserved`. A wrong-cluster or unsupported-kind read used
541
+ * to paint the whole estate "pending", which is the diagram equivalent of
542
+ * planning a create for something that already exists.
543
+ * **Foreign** resources (provisioned, not declared, no declared owner) are
544
+ * appended and tagged `warn`; a provisioned-but-undeclared resource whose
545
+ * owner chain reaches a declared entity (#1077) is tagged `runtime` instead —
546
+ * both carry any live-reconstructed edges that touch them, since a declared
547
+ * edge cannot describe an undeclared resource. Declared groups/exports pass
548
+ * through unchanged; nodes and edges are sorted for deterministic output.
549
+ */
550
+ export function sourceOverlayGraphs(declared, live, opts) {
551
+ const liveById = new Map(live.nodes.map((n) => [n.id, n]));
552
+ const declaredIds = new Set(declared.nodes.map((n) => n.id));
553
+ const foreignIds = new Set(live.nodes.filter((n) => !declaredIds.has(n.id)).map((n) => n.id));
554
+ const unobserved = opts?.unobserved ?? {};
555
+ const nodes = declared.nodes.map((n) => {
556
+ const obs = liveById.get(n.id);
557
+ if (!obs) {
558
+ const u = unobserved[n.id];
559
+ // unobserved — declared, and nobody looked; not "pending"
560
+ return u ? tagStatus(n, "neutral", u) : tagStatus(n, "accent");
561
+ }
562
+ const merged = { ...n }; // managed — carry the observed identity
563
+ if (obs.physicalId)
564
+ merged.physicalId = obs.physicalId;
565
+ if (obs.ownership)
566
+ merged.ownership = obs.ownership;
567
+ // ...and what was observed ABOUT it (#1279). The declared canvas holds what
568
+ // the source says; the observation holds what the account says, and a fact
569
+ // like `VpcId` exists only on the second. Dropping it here made every
570
+ // observed property invisible to anything reading the overlaid graph —
571
+ // `search --show VpcId` printed six blank columns, which reads as an estate
572
+ // with no VPCs rather than a read that never happened.
573
+ //
574
+ // Observed wins a collision. The declared value for something like `VpcId`
575
+ // is an unresolved reference to another entity, not an id — the account has
576
+ // the id. Same precedence `enrichLiveAttrs` already uses when it folds live
577
+ // facts onto this graph, so both paths agree on what a name means.
578
+ if (obs.attrs && Object.keys(obs.attrs).length > 0)
579
+ merged.attrs = { ...n.attrs, ...obs.attrs };
580
+ return tagStatus(merged, "good");
581
+ });
582
+ for (const n of live.nodes) {
583
+ if (!foreignIds.has(n.id))
584
+ continue;
585
+ nodes.push(tagStatus(n, n.runtimeOwner ? "runtime" : "warn")); // runtime child or foreign
586
+ }
587
+ nodes.sort((a, b) => a.id.localeCompare(b.id));
588
+ // Declared edges are the canvas (the cross-substrate topology). Add only the
589
+ // live edges that touch a foreign node — declared edges already cover every
590
+ // declared relationship, so keeping all live edges would double managed ones.
591
+ const seen = new Set(declared.edges.map(edgeKey));
592
+ const edges = [...declared.edges];
593
+ for (const e of live.edges) {
594
+ if (!(foreignIds.has(e.from) || foreignIds.has(e.to)))
595
+ continue;
596
+ const k = edgeKey(e);
597
+ if (seen.has(k))
598
+ continue;
599
+ seen.add(k);
600
+ edges.push(e);
601
+ }
602
+ edges.sort((a, b) => edgeKey(a).localeCompare(edgeKey(b)));
603
+ // Observed export values (#1279) join the declared exports by name: the
604
+ // declaration says which node publishes it, the observation says what it
605
+ // currently is. An export only the stack carries is appended.
606
+ const liveExports = live.exports ?? [];
607
+ let exports = declared.exports;
608
+ if (liveExports.length > 0) {
609
+ const byName = new Map(liveExports.map((e) => [e.name, e]));
610
+ const merged = (declared.exports ?? []).map((e) => {
611
+ const obs = byName.get(e.name);
612
+ if (!obs)
613
+ return e;
614
+ byName.delete(e.name);
615
+ return { ...e, value: obs.value, ...(obs.stack ? { stack: obs.stack } : {}) };
616
+ });
617
+ for (const e of byName.values())
618
+ merged.push(e);
619
+ merged.sort((a, b) => a.name.localeCompare(b.name));
620
+ exports = merged;
621
+ }
622
+ return { ...declared, nodes, edges, ...(exports ? { exports } : {}) };
623
+ }