@intentius/chant 0.124.51 → 0.124.54

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 (593) hide show
  1. package/dist/audit/discover.d.ts.map +1 -1
  2. package/dist/audit/discover.js +3 -1
  3. package/dist/behaviour.d.ts +1 -1
  4. package/dist/behaviour.d.ts.map +1 -1
  5. package/dist/capabilities/templates.d.ts +65 -0
  6. package/dist/capabilities/templates.d.ts.map +1 -0
  7. package/dist/capabilities/templates.js +193 -0
  8. package/dist/capabilities/templates.json +145 -0
  9. package/dist/change-set-graph.d.ts +35 -3
  10. package/dist/change-set-graph.d.ts.map +1 -1
  11. package/dist/change-set-graph.js +60 -9
  12. package/dist/change-set.d.ts +65 -7
  13. package/dist/change-set.d.ts.map +1 -1
  14. package/dist/change-set.js +23 -12
  15. package/dist/ci-identity.d.ts +7 -2
  16. package/dist/ci-identity.d.ts.map +1 -1
  17. package/dist/ci-identity.js +4 -1
  18. package/dist/cli/commands/import-index.d.ts +52 -0
  19. package/dist/cli/commands/import-index.d.ts.map +1 -0
  20. package/dist/cli/commands/import-index.js +226 -0
  21. package/dist/cli/commands/lint.d.ts.map +1 -1
  22. package/dist/cli/commands/lint.js +4 -2
  23. package/dist/cli/handlers/components.d.ts.map +1 -1
  24. package/dist/cli/handlers/components.js +11 -2
  25. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  26. package/dist/cli/handlers/fan-out.js +16 -3
  27. package/dist/cli/handlers/graph.d.ts.map +1 -1
  28. package/dist/cli/handlers/graph.js +22 -4
  29. package/dist/cli/handlers/index-cloud.d.ts +14 -0
  30. package/dist/cli/handlers/index-cloud.d.ts.map +1 -0
  31. package/dist/cli/handlers/index-cloud.js +22 -0
  32. package/dist/cli/handlers/index-diff.d.ts +18 -0
  33. package/dist/cli/handlers/index-diff.d.ts.map +1 -0
  34. package/dist/cli/handlers/index-diff.js +142 -0
  35. package/dist/cli/handlers/lifecycle-drift.d.ts +25 -0
  36. package/dist/cli/handlers/lifecycle-drift.d.ts.map +1 -0
  37. package/dist/cli/handlers/lifecycle-drift.js +64 -0
  38. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  39. package/dist/cli/handlers/lifecycle.js +188 -28
  40. package/dist/cli/handlers/misc.d.ts +9 -0
  41. package/dist/cli/handlers/misc.d.ts.map +1 -1
  42. package/dist/cli/handlers/misc.js +77 -0
  43. package/dist/cli/handlers/pr.d.ts.map +1 -1
  44. package/dist/cli/handlers/pr.js +17 -3
  45. package/dist/cli/handlers/promote.d.ts.map +1 -1
  46. package/dist/cli/handlers/promote.js +89 -15
  47. package/dist/cli/handlers/query.d.ts.map +1 -1
  48. package/dist/cli/handlers/query.js +28 -4
  49. package/dist/cli/handlers/scenario.d.ts.map +1 -1
  50. package/dist/cli/handlers/scenario.js +8 -7
  51. package/dist/cli/handlers/search.d.ts +34 -4
  52. package/dist/cli/handlers/search.d.ts.map +1 -1
  53. package/dist/cli/handlers/search.js +216 -36
  54. package/dist/cli/main.d.ts.map +1 -1
  55. package/dist/cli/main.js +55 -1
  56. package/dist/cli/mcp/lifecycle-tools.d.ts.map +1 -1
  57. package/dist/cli/mcp/lifecycle-tools.js +3 -2
  58. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  59. package/dist/cli/mcp/resource-handlers.js +4 -3
  60. package/dist/cli/mcp/workspace-tools.js +1 -1
  61. package/dist/cli/parse-args.d.ts.map +1 -1
  62. package/dist/cli/parse-args.js +55 -2
  63. package/dist/cli/registry.d.ts +19 -1
  64. package/dist/cli/registry.d.ts.map +1 -1
  65. package/dist/cloud-lister/aws.d.ts +35 -0
  66. package/dist/cloud-lister/aws.d.ts.map +1 -0
  67. package/dist/cloud-lister/aws.js +203 -0
  68. package/dist/cloud-lister/azure.d.ts +34 -0
  69. package/dist/cloud-lister/azure.d.ts.map +1 -0
  70. package/dist/cloud-lister/azure.js +129 -0
  71. package/dist/cloud-lister/common.d.ts +40 -0
  72. package/dist/cloud-lister/common.d.ts.map +1 -0
  73. package/dist/cloud-lister/common.js +83 -0
  74. package/dist/cloud-lister/credentials.d.ts +50 -0
  75. package/dist/cloud-lister/credentials.d.ts.map +1 -0
  76. package/dist/cloud-lister/credentials.js +86 -0
  77. package/dist/cloud-lister/fakes.d.ts +27 -0
  78. package/dist/cloud-lister/fakes.d.ts.map +1 -0
  79. package/dist/cloud-lister/fakes.js +50 -0
  80. package/dist/cloud-lister/gcp.d.ts +42 -0
  81. package/dist/cloud-lister/gcp.d.ts.map +1 -0
  82. package/dist/cloud-lister/gcp.js +143 -0
  83. package/dist/cloud-lister/guard.d.ts +49 -0
  84. package/dist/cloud-lister/guard.d.ts.map +1 -0
  85. package/dist/cloud-lister/guard.js +103 -0
  86. package/dist/cloud-lister/ids.d.ts +23 -0
  87. package/dist/cloud-lister/ids.d.ts.map +1 -0
  88. package/dist/cloud-lister/ids.js +42 -0
  89. package/dist/cloud-lister/index.d.ts +67 -0
  90. package/dist/cloud-lister/index.d.ts.map +1 -0
  91. package/dist/cloud-lister/index.js +102 -0
  92. package/dist/cloud-lister/kubernetes.d.ts +64 -0
  93. package/dist/cloud-lister/kubernetes.d.ts.map +1 -0
  94. package/dist/cloud-lister/kubernetes.js +276 -0
  95. package/dist/cloud-lister/markers.d.ts +31 -0
  96. package/dist/cloud-lister/markers.d.ts.map +1 -0
  97. package/dist/cloud-lister/markers.js +73 -0
  98. package/dist/cloud-lister/mask.d.ts +31 -0
  99. package/dist/cloud-lister/mask.d.ts.map +1 -0
  100. package/dist/cloud-lister/mask.js +74 -0
  101. package/dist/cloud-lister/sigv4.d.ts +29 -0
  102. package/dist/cloud-lister/sigv4.d.ts.map +1 -0
  103. package/dist/cloud-lister/sigv4.js +54 -0
  104. package/dist/cloud-lister/transport.d.ts +55 -0
  105. package/dist/cloud-lister/transport.d.ts.map +1 -0
  106. package/dist/cloud-lister/transport.js +86 -0
  107. package/dist/cloud-lister/types.d.ts +121 -0
  108. package/dist/cloud-lister/types.d.ts.map +1 -0
  109. package/dist/cloud-lister/types.js +24 -0
  110. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  111. package/dist/components/capability-plugin-loader.js +6 -0
  112. package/dist/components/capability-plugin.d.ts +9 -0
  113. package/dist/components/capability-plugin.d.ts.map +1 -1
  114. package/dist/components/capability.d.ts +224 -0
  115. package/dist/components/capability.d.ts.map +1 -1
  116. package/dist/components/cli-support.d.ts +21 -0
  117. package/dist/components/cli-support.d.ts.map +1 -1
  118. package/dist/components/cli-support.js +58 -14
  119. package/dist/components/covered-round.d.ts +173 -0
  120. package/dist/components/covered-round.d.ts.map +1 -0
  121. package/dist/components/covered-round.js +200 -0
  122. package/dist/components/declared-reads.d.ts +38 -0
  123. package/dist/components/declared-reads.d.ts.map +1 -0
  124. package/dist/components/declared-reads.js +131 -0
  125. package/dist/components/deploy-units.d.ts.map +1 -1
  126. package/dist/components/deploy-units.js +4 -0
  127. package/dist/components/driver.d.ts +42 -1
  128. package/dist/components/driver.d.ts.map +1 -1
  129. package/dist/components/driver.js +74 -3
  130. package/dist/components/fan-out-run.d.ts +23 -1
  131. package/dist/components/fan-out-run.d.ts.map +1 -1
  132. package/dist/components/fan-out-run.js +82 -14
  133. package/dist/components/fan-out-support.d.ts +6 -0
  134. package/dist/components/fan-out-support.d.ts.map +1 -1
  135. package/dist/components/fan-out-support.js +4 -1
  136. package/dist/components/fan-out.d.ts +28 -0
  137. package/dist/components/fan-out.d.ts.map +1 -1
  138. package/dist/components/groups.d.ts +229 -0
  139. package/dist/components/groups.d.ts.map +1 -0
  140. package/dist/components/groups.js +760 -0
  141. package/dist/components/index.d.ts +7 -2
  142. package/dist/components/index.d.ts.map +1 -1
  143. package/dist/components/index.js +5 -0
  144. package/dist/components/plan-shape-conformance.d.ts +48 -0
  145. package/dist/components/plan-shape-conformance.d.ts.map +1 -0
  146. package/dist/components/plan-shape-conformance.js +122 -0
  147. package/dist/components/pr-run.d.ts +62 -7
  148. package/dist/components/pr-run.d.ts.map +1 -1
  149. package/dist/components/pr-run.js +354 -53
  150. package/dist/components/promote-rounds.d.ts +9 -0
  151. package/dist/components/promote-rounds.d.ts.map +1 -1
  152. package/dist/components/promote-rounds.js +23 -2
  153. package/dist/components/promote.d.ts +17 -0
  154. package/dist/components/promote.d.ts.map +1 -1
  155. package/dist/components/promote.js +36 -6
  156. package/dist/components/release-gate.d.ts +23 -1
  157. package/dist/components/release-gate.d.ts.map +1 -1
  158. package/dist/components/release-gate.js +97 -33
  159. package/dist/components/run-groups.d.ts +58 -0
  160. package/dist/components/run-groups.d.ts.map +1 -0
  161. package/dist/components/run-groups.js +78 -0
  162. package/dist/components/starter-plugin.d.ts +1 -0
  163. package/dist/components/starter-plugin.d.ts.map +1 -1
  164. package/dist/components/starter-plugin.js +6 -1
  165. package/dist/components/verbs/index.d.ts +1 -0
  166. package/dist/components/verbs/index.d.ts.map +1 -1
  167. package/dist/components/verbs/index.js +1 -0
  168. package/dist/components/verbs/member-outputs.d.ts +187 -0
  169. package/dist/components/verbs/member-outputs.d.ts.map +1 -0
  170. package/dist/components/verbs/member-outputs.js +218 -0
  171. package/dist/components/wave-plan.d.ts +2 -0
  172. package/dist/components/wave-plan.d.ts.map +1 -1
  173. package/dist/components/wave-plan.js +4 -1
  174. package/dist/config.d.ts +60 -0
  175. package/dist/config.d.ts.map +1 -1
  176. package/dist/config.js +27 -0
  177. package/dist/deep-observation.d.ts +1 -13
  178. package/dist/deep-observation.d.ts.map +1 -1
  179. package/dist/deep-observation.js +5 -22
  180. package/dist/drift-record.d.ts +542 -0
  181. package/dist/drift-record.d.ts.map +1 -0
  182. package/dist/drift-record.js +886 -0
  183. package/dist/engine-facts.d.ts +144 -0
  184. package/dist/engine-facts.d.ts.map +1 -0
  185. package/dist/engine-facts.js +14 -0
  186. package/dist/graph-ir.d.ts +153 -2
  187. package/dist/graph-ir.d.ts.map +1 -1
  188. package/dist/graph-ir.js +224 -6
  189. package/dist/graph-refs.d.ts +145 -0
  190. package/dist/graph-refs.d.ts.map +1 -1
  191. package/dist/graph-refs.js +305 -0
  192. package/dist/graph-schema/fixtures/adopt.json +15 -0
  193. package/dist/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  194. package/dist/graph-schema/fixtures/index.json +68 -0
  195. package/dist/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  196. package/dist/graph-schema/fixtures.d.ts +23 -0
  197. package/dist/graph-schema/fixtures.d.ts.map +1 -0
  198. package/dist/graph-schema/fixtures.js +246 -0
  199. package/dist/graph-schema/generate.d.ts +15 -0
  200. package/dist/graph-schema/generate.d.ts.map +1 -0
  201. package/dist/graph-schema/generate.js +267 -0
  202. package/dist/graph-schema/graph.schema.json +1387 -0
  203. package/dist/health.schema.json +2 -1
  204. package/dist/identity.d.ts.map +1 -1
  205. package/dist/identity.js +2 -0
  206. package/dist/index.d.ts +1 -0
  207. package/dist/index.d.ts.map +1 -1
  208. package/dist/index.js +2 -0
  209. package/dist/instance-nodes.d.ts +159 -0
  210. package/dist/instance-nodes.d.ts.map +1 -0
  211. package/dist/instance-nodes.js +231 -0
  212. package/dist/lexicon.d.ts +72 -0
  213. package/dist/lexicon.d.ts.map +1 -1
  214. package/dist/lifecycle/adoption-file.d.ts +56 -0
  215. package/dist/lifecycle/adoption-file.d.ts.map +1 -0
  216. package/dist/lifecycle/adoption-file.js +123 -0
  217. package/dist/lifecycle/cloud-index.d.ts +186 -0
  218. package/dist/lifecycle/cloud-index.d.ts.map +1 -0
  219. package/dist/lifecycle/cloud-index.js +618 -0
  220. package/dist/lifecycle/derive-edges.d.ts +59 -0
  221. package/dist/lifecycle/derive-edges.d.ts.map +1 -0
  222. package/dist/lifecycle/derive-edges.js +126 -0
  223. package/dist/lifecycle/git.d.ts +10 -9
  224. package/dist/lifecycle/git.d.ts.map +1 -1
  225. package/dist/lifecycle/git.js +7 -1
  226. package/dist/lifecycle/identity-match.d.ts +133 -0
  227. package/dist/lifecycle/identity-match.d.ts.map +1 -0
  228. package/dist/lifecycle/identity-match.js +147 -0
  229. package/dist/lifecycle/index-diff.d.ts +224 -0
  230. package/dist/lifecycle/index-diff.d.ts.map +1 -0
  231. package/dist/lifecycle/index-diff.js +327 -0
  232. package/dist/lifecycle/index-document.d.ts +130 -0
  233. package/dist/lifecycle/index-document.d.ts.map +1 -0
  234. package/dist/lifecycle/index-document.js +189 -0
  235. package/dist/lifecycle/index-drift.d.ts +121 -0
  236. package/dist/lifecycle/index-drift.d.ts.map +1 -0
  237. package/dist/lifecycle/index-drift.js +178 -0
  238. package/dist/lifecycle/index-import.d.ts +168 -0
  239. package/dist/lifecycle/index-import.d.ts.map +1 -0
  240. package/dist/lifecycle/index-import.js +515 -0
  241. package/dist/lifecycle/index-join.d.ts +129 -0
  242. package/dist/lifecycle/index-join.d.ts.map +1 -0
  243. package/dist/lifecycle/index-join.js +248 -0
  244. package/dist/lifecycle/index.d.ts +4 -0
  245. package/dist/lifecycle/index.d.ts.map +1 -1
  246. package/dist/lifecycle/index.js +4 -0
  247. package/dist/lifecycle/observation-baseline.d.ts +61 -21
  248. package/dist/lifecycle/observation-baseline.d.ts.map +1 -1
  249. package/dist/lifecycle/observation-baseline.js +144 -19
  250. package/dist/lifecycle/observe.d.ts.map +1 -1
  251. package/dist/lifecycle/observe.js +6 -1
  252. package/dist/lifecycle/query.d.ts +45 -4
  253. package/dist/lifecycle/query.d.ts.map +1 -1
  254. package/dist/lifecycle/query.js +89 -7
  255. package/dist/lifecycle/replay.d.ts +10 -3
  256. package/dist/lifecycle/replay.d.ts.map +1 -1
  257. package/dist/lifecycle/replay.js +10 -6
  258. package/dist/lifecycle/scenario.d.ts +4 -3
  259. package/dist/lifecycle/scenario.d.ts.map +1 -1
  260. package/dist/lifecycle/snapshot-store-fake.d.ts +9 -0
  261. package/dist/lifecycle/snapshot-store-fake.d.ts.map +1 -0
  262. package/dist/lifecycle/snapshot-store-fake.js +21 -0
  263. package/dist/lifecycle/snapshot-store-s3.d.ts +102 -0
  264. package/dist/lifecycle/snapshot-store-s3.d.ts.map +1 -0
  265. package/dist/lifecycle/snapshot-store-s3.js +254 -0
  266. package/dist/lifecycle/snapshot-store.d.ts +170 -0
  267. package/dist/lifecycle/snapshot-store.d.ts.map +1 -0
  268. package/dist/lifecycle/snapshot-store.js +832 -0
  269. package/dist/lifecycle/snapshot.d.ts +11 -0
  270. package/dist/lifecycle/snapshot.d.ts.map +1 -1
  271. package/dist/lifecycle/snapshot.js +18 -5
  272. package/dist/lifecycle/type-listing.d.ts +148 -0
  273. package/dist/lifecycle/type-listing.d.ts.map +1 -0
  274. package/dist/lifecycle/type-listing.js +166 -0
  275. package/dist/lint/component-checks.d.ts +15 -1
  276. package/dist/lint/component-checks.d.ts.map +1 -1
  277. package/dist/lint/component-checks.js +1 -0
  278. package/dist/lint/presets/relaxed.json +2 -1
  279. package/dist/lint/presets/strict.json +2 -1
  280. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts +4 -0
  281. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts.map +1 -0
  282. package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.js +13 -0
  283. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts +4 -0
  284. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts.map +1 -0
  285. package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.js +8 -0
  286. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts +33 -0
  287. package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts.map +1 -0
  288. package/dist/lint/rules/comp/comp008-applies-signal-only-root.js +123 -0
  289. package/dist/lint/rules/comp/index.d.ts +2 -1
  290. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  291. package/dist/lint/rules/comp/index.js +4 -1
  292. package/dist/observation.d.ts +19 -2
  293. package/dist/observation.d.ts.map +1 -1
  294. package/dist/observation.js +18 -1
  295. package/dist/op/activities/activity-contracts.d.ts +1 -1
  296. package/dist/op/activities/activity-contracts.js +1 -1
  297. package/dist/op/activities/change-set.d.ts +6 -4
  298. package/dist/op/activities/change-set.d.ts.map +1 -1
  299. package/dist/op/activities/change-set.js +4 -2
  300. package/dist/op/activity-failure.d.ts +27 -0
  301. package/dist/op/activity-failure.d.ts.map +1 -1
  302. package/dist/op/activity-failure.js +31 -0
  303. package/dist/op/index.d.ts +2 -1
  304. package/dist/op/index.d.ts.map +1 -1
  305. package/dist/op/index.js +1 -1
  306. package/dist/op/local-executor.d.ts +5 -1
  307. package/dist/op/local-executor.d.ts.map +1 -1
  308. package/dist/op/local-executor.js +22 -8
  309. package/dist/pr-loop.d.ts +92 -3
  310. package/dist/pr-loop.d.ts.map +1 -1
  311. package/dist/pr-loop.js +62 -3
  312. package/dist/pulumi-urn.d.ts +101 -0
  313. package/dist/pulumi-urn.d.ts.map +1 -0
  314. package/dist/pulumi-urn.js +131 -0
  315. package/dist/release-floors.d.ts +23 -0
  316. package/dist/release-floors.d.ts.map +1 -0
  317. package/dist/release-floors.js +22 -0
  318. package/dist/sensitive-key.d.ts +23 -0
  319. package/dist/sensitive-key.d.ts.map +1 -0
  320. package/dist/sensitive-key.js +31 -0
  321. package/dist/wave-runtime.mjs +234 -234
  322. package/dist/workspace/adoption-report.d.ts +53 -0
  323. package/dist/workspace/adoption-report.d.ts.map +1 -0
  324. package/dist/workspace/adoption-report.js +76 -0
  325. package/dist/workspace/capabilities-contract.d.ts +7 -0
  326. package/dist/workspace/capabilities-contract.d.ts.map +1 -1
  327. package/dist/workspace/capabilities-contract.js +2 -1
  328. package/dist/workspace/capabilities.schema.json +98 -0
  329. package/dist/workspace/change-set.schema.json +42 -3
  330. package/dist/workspace/ci-cloud-identity.d.ts +13 -1
  331. package/dist/workspace/ci-cloud-identity.d.ts.map +1 -1
  332. package/dist/workspace/ci-cloud-identity.js +30 -1
  333. package/dist/workspace/compose-graph.d.ts +10 -1
  334. package/dist/workspace/compose-graph.d.ts.map +1 -1
  335. package/dist/workspace/compose-graph.js +6 -1
  336. package/dist/workspace/conformance/index.d.ts +1 -1
  337. package/dist/workspace/conformance/index.d.ts.map +1 -1
  338. package/dist/workspace/conformance/index.js +6 -1
  339. package/dist/workspace/drift-cli.d.ts +81 -0
  340. package/dist/workspace/drift-cli.d.ts.map +1 -0
  341. package/dist/workspace/drift-cli.js +317 -0
  342. package/dist/workspace/drift.schema.json +672 -0
  343. package/dist/workspace/graph-cli.d.ts +2 -0
  344. package/dist/workspace/graph-cli.d.ts.map +1 -1
  345. package/dist/workspace/graph-cli.js +3 -0
  346. package/dist/workspace/graph.schema.json +72 -0
  347. package/dist/workspace/init.d.ts +5 -1
  348. package/dist/workspace/init.d.ts.map +1 -1
  349. package/dist/workspace/init.js +55 -9
  350. package/dist/workspace/ledger.schema.json +1 -1
  351. package/dist/workspace/nested-graph.d.ts.map +1 -1
  352. package/dist/workspace/nested-graph.js +2 -0
  353. package/dist/workspace/pr-report.schema.json +76 -3
  354. package/dist/workspace/promote-waves.d.ts +112 -0
  355. package/dist/workspace/promote-waves.d.ts.map +1 -0
  356. package/dist/workspace/promote-waves.js +290 -0
  357. package/dist/workspace/promote.d.ts +84 -2
  358. package/dist/workspace/promote.d.ts.map +1 -1
  359. package/dist/workspace/promote.js +347 -61
  360. package/dist/workspace/reason-codes.d.ts +12 -0
  361. package/dist/workspace/reason-codes.d.ts.map +1 -1
  362. package/dist/workspace/reason-codes.js +14 -0
  363. package/dist/workspace/search-contract.d.ts +3 -3
  364. package/dist/workspace/search-contract.d.ts.map +1 -1
  365. package/dist/workspace/search-contract.js +2 -0
  366. package/dist/workspace/search.schema.json +103 -5
  367. package/package.json +14 -1
  368. package/src/__fixtures__/drift-record/README.md +58 -0
  369. package/src/__fixtures__/drift-record/choudoufu-cone.ndjson +4 -0
  370. package/src/__fixtures__/drift-record/choudoufu-resource.ndjson +3 -0
  371. package/src/__fixtures__/drift-record/component-status-ledger.json +65 -0
  372. package/src/__fixtures__/drift-record/component-status.json +91 -0
  373. package/src/__fixtures__/drift-record/deep-diff.json +259 -0
  374. package/src/__fixtures__/drift-record/lifecycle-diff-live.json +825 -0
  375. package/src/__fixtures__/drift-record/live-diff.json +125 -0
  376. package/src/audit/discover.e2e.test.ts +14 -0
  377. package/src/audit/discover.ts +3 -1
  378. package/src/behaviour.ts +1 -1
  379. package/src/capabilities/templates.json +145 -0
  380. package/src/capabilities/templates.test.ts +212 -0
  381. package/src/capabilities/templates.ts +204 -0
  382. package/src/change-set-bundle.test.ts +83 -0
  383. package/src/change-set-graph.ts +80 -9
  384. package/src/change-set.test.ts +24 -0
  385. package/src/change-set.ts +77 -14
  386. package/src/ci-identity-targets.test.ts +23 -0
  387. package/src/ci-identity.ts +10 -4
  388. package/src/cli/commands/import-index.test.ts +117 -0
  389. package/src/cli/commands/import-index.ts +265 -0
  390. package/src/cli/commands/lint.ts +4 -2
  391. package/src/cli/handlers/components.test.ts +9 -0
  392. package/src/cli/handlers/components.ts +12 -2
  393. package/src/cli/handlers/fan-out.ts +17 -3
  394. package/src/cli/handlers/graph.test.ts +42 -0
  395. package/src/cli/handlers/graph.ts +26 -4
  396. package/src/cli/handlers/index-cloud.ts +32 -0
  397. package/src/cli/handlers/index-diff.test.ts +68 -0
  398. package/src/cli/handlers/index-diff.ts +146 -0
  399. package/src/cli/handlers/ledger-root-member.test.ts +161 -0
  400. package/src/cli/handlers/lifecycle-drift.ts +68 -0
  401. package/src/cli/handlers/lifecycle.test.ts +33 -11
  402. package/src/cli/handlers/lifecycle.ts +205 -30
  403. package/src/cli/handlers/misc.ts +73 -0
  404. package/src/cli/handlers/pr-waves-blocked.test.ts +37 -2
  405. package/src/cli/handlers/pr.ts +16 -3
  406. package/src/cli/handlers/promote.test.ts +64 -0
  407. package/src/cli/handlers/promote.ts +81 -6
  408. package/src/cli/handlers/query.ts +27 -4
  409. package/src/cli/handlers/run-declared-reads-cli.test.ts +187 -0
  410. package/src/cli/handlers/run-groups-cli.test.ts +229 -0
  411. package/src/cli/handlers/scenario.test.ts +13 -0
  412. package/src/cli/handlers/scenario.ts +8 -7
  413. package/src/cli/handlers/search-index.test.ts +255 -0
  414. package/src/cli/handlers/search-json.test.ts +1 -1
  415. package/src/cli/handlers/search-ownership.test.ts +194 -0
  416. package/src/cli/handlers/search.ts +271 -38
  417. package/src/cli/main.test.ts +7 -0
  418. package/src/cli/main.ts +56 -1
  419. package/src/cli/mcp/lifecycle-tools.ts +3 -2
  420. package/src/cli/mcp/resource-handlers.ts +4 -3
  421. package/src/cli/mcp/workspace-tools.ts +1 -1
  422. package/src/cli/parse-args.ts +40 -2
  423. package/src/cli/registry.ts +19 -1
  424. package/src/cloud-lister/aws.test.ts +202 -0
  425. package/src/cloud-lister/aws.ts +226 -0
  426. package/src/cloud-lister/azure.test.ts +132 -0
  427. package/src/cloud-lister/azure.ts +142 -0
  428. package/src/cloud-lister/common.ts +115 -0
  429. package/src/cloud-lister/credentials.ts +110 -0
  430. package/src/cloud-lister/fakes.ts +66 -0
  431. package/src/cloud-lister/gcp.test.ts +121 -0
  432. package/src/cloud-lister/gcp.ts +159 -0
  433. package/src/cloud-lister/guard.test.ts +198 -0
  434. package/src/cloud-lister/guard.ts +111 -0
  435. package/src/cloud-lister/ids.ts +54 -0
  436. package/src/cloud-lister/index.ts +134 -0
  437. package/src/cloud-lister/kubernetes.test.ts +160 -0
  438. package/src/cloud-lister/kubernetes.ts +284 -0
  439. package/src/cloud-lister/markers.ts +74 -0
  440. package/src/cloud-lister/mask.ts +77 -0
  441. package/src/cloud-lister/shape.test.ts +81 -0
  442. package/src/cloud-lister/sigv4.ts +70 -0
  443. package/src/cloud-lister/transport.ts +118 -0
  444. package/src/cloud-lister/types.ts +135 -0
  445. package/src/components/capability-plugin-loader.ts +4 -0
  446. package/src/components/capability-plugin.ts +10 -0
  447. package/src/components/capability.ts +238 -0
  448. package/src/components/cli-support.ts +70 -14
  449. package/src/components/covered-round.test.ts +166 -0
  450. package/src/components/covered-round.ts +293 -0
  451. package/src/components/declared-reads.test.ts +103 -0
  452. package/src/components/declared-reads.ts +134 -0
  453. package/src/components/deploy-units.ts +4 -0
  454. package/src/components/driver.ts +101 -4
  455. package/src/components/fan-out-run.ts +95 -15
  456. package/src/components/fan-out-support.ts +10 -1
  457. package/src/components/fan-out.ts +30 -0
  458. package/src/components/groups.test.ts +320 -0
  459. package/src/components/groups.ts +880 -0
  460. package/src/components/index.ts +59 -0
  461. package/src/components/plan-shape-conformance.ts +130 -0
  462. package/src/components/pr-env-run-bundle.test.ts +2 -0
  463. package/src/components/pr-run.test.ts +728 -4
  464. package/src/components/pr-run.ts +395 -55
  465. package/src/components/promote-rounds.ts +25 -2
  466. package/src/components/promote.ts +55 -5
  467. package/src/components/registry.test.ts +1 -1
  468. package/src/components/release-gate.ts +115 -30
  469. package/src/components/release-groups.test.ts +362 -0
  470. package/src/components/run-groups.ts +113 -0
  471. package/src/components/starter-plugin.ts +6 -0
  472. package/src/components/verbs/index.ts +1 -0
  473. package/src/components/verbs/member-outputs.test.ts +205 -0
  474. package/src/components/verbs/member-outputs.ts +308 -0
  475. package/src/components/wave-plan.ts +5 -2
  476. package/src/config.ts +44 -0
  477. package/src/deep-observation.ts +5 -23
  478. package/src/drift-record.test.ts +596 -0
  479. package/src/drift-record.ts +1206 -0
  480. package/src/engine-facts.guard.test.ts +111 -0
  481. package/src/engine-facts.test.ts +178 -0
  482. package/src/engine-facts.ts +154 -0
  483. package/src/gated-waves-bundle.test.ts +2 -0
  484. package/src/graph-ir-live.test.ts +92 -0
  485. package/src/graph-ir.ts +317 -7
  486. package/src/graph-refs.ts +416 -0
  487. package/src/graph-schema/fixtures/adopt.json +15 -0
  488. package/src/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
  489. package/src/graph-schema/fixtures/index.json +68 -0
  490. package/src/graph-schema/fixtures/plunge.engine-graph.json +158 -0
  491. package/src/graph-schema/fixtures.ts +267 -0
  492. package/src/graph-schema/generate.ts +263 -0
  493. package/src/graph-schema/graph-schema.test.ts +153 -0
  494. package/src/graph-schema/graph.schema.json +1387 -0
  495. package/src/health.schema.json +2 -1
  496. package/src/identity.ts +2 -0
  497. package/src/index.ts +2 -0
  498. package/src/instance-nodes.ts +288 -0
  499. package/src/lexicon.ts +76 -0
  500. package/src/lifecycle/__fixtures__/index-diff/20261026T120000Z-aaaaaaaaaaaa.json +149 -0
  501. package/src/lifecycle/__fixtures__/index-diff/20261026T130000Z-bbbbbbbbbbbb.json +127 -0
  502. package/src/lifecycle/adoption-file.test.ts +100 -0
  503. package/src/lifecycle/adoption-file.ts +154 -0
  504. package/src/lifecycle/cloud-index.test.ts +517 -0
  505. package/src/lifecycle/cloud-index.ts +736 -0
  506. package/src/lifecycle/derive-edges.test.ts +193 -0
  507. package/src/lifecycle/derive-edges.ts +182 -0
  508. package/src/lifecycle/git.ts +10 -4
  509. package/src/lifecycle/identity-match.test.ts +308 -0
  510. package/src/lifecycle/identity-match.ts +257 -0
  511. package/src/lifecycle/index-diff.test.ts +198 -0
  512. package/src/lifecycle/index-diff.ts +476 -0
  513. package/src/lifecycle/index-document.test.ts +64 -0
  514. package/src/lifecycle/index-document.ts +299 -0
  515. package/src/lifecycle/index-drift.test.ts +191 -0
  516. package/src/lifecycle/index-drift.ts +304 -0
  517. package/src/lifecycle/index-import.test.ts +255 -0
  518. package/src/lifecycle/index-import.ts +634 -0
  519. package/src/lifecycle/index-join.test.ts +250 -0
  520. package/src/lifecycle/index-join.ts +304 -0
  521. package/src/lifecycle/index-store-load-bearing.test.ts +187 -0
  522. package/src/lifecycle/index.ts +4 -0
  523. package/src/lifecycle/member-ledger.test.ts +25 -7
  524. package/src/lifecycle/observation-baseline.test.ts +72 -1
  525. package/src/lifecycle/observation-baseline.ts +190 -27
  526. package/src/lifecycle/observe.ts +6 -1
  527. package/src/lifecycle/query.test.ts +69 -1
  528. package/src/lifecycle/query.ts +103 -10
  529. package/src/lifecycle/replay.test.ts +9 -5
  530. package/src/lifecycle/replay.ts +9 -5
  531. package/src/lifecycle/scenario.ts +4 -3
  532. package/src/lifecycle/snapshot-store-fake.ts +29 -0
  533. package/src/lifecycle/snapshot-store-s3.ts +316 -0
  534. package/src/lifecycle/snapshot-store.test.ts +385 -0
  535. package/src/lifecycle/snapshot-store.ts +981 -0
  536. package/src/lifecycle/snapshot.test.ts +13 -0
  537. package/src/lifecycle/snapshot.ts +23 -6
  538. package/src/lifecycle/type-listing.test.ts +166 -0
  539. package/src/lifecycle/type-listing.ts +309 -0
  540. package/src/lint/component-checks.ts +17 -1
  541. package/src/lint/config.test.ts +3 -0
  542. package/src/lint/presets/relaxed.json +2 -1
  543. package/src/lint/presets/strict.json +2 -1
  544. package/src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts +15 -0
  545. package/src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts +10 -0
  546. package/src/lint/rules/comp/comp.test.ts +2 -1
  547. package/src/lint/rules/comp/comp008-applies-signal-only-root.ts +121 -0
  548. package/src/lint/rules/comp/comp008.test.ts +77 -0
  549. package/src/lint/rules/comp/index.ts +4 -1
  550. package/src/observation-edges.test.ts +33 -0
  551. package/src/observation.ts +36 -1
  552. package/src/op/activities/activity-contracts.ts +1 -1
  553. package/src/op/activities/change-set.ts +8 -5
  554. package/src/op/activity-failure.ts +36 -0
  555. package/src/op/index.ts +2 -1
  556. package/src/op/local-executor.test.ts +80 -0
  557. package/src/op/local-executor.ts +27 -9
  558. package/src/pr-loop-bundle.test.ts +5 -2
  559. package/src/pr-loop.test.ts +57 -1
  560. package/src/pr-loop.ts +154 -6
  561. package/src/pulumi-urn.ts +151 -0
  562. package/src/release-floors.ts +22 -0
  563. package/src/sensitive-key.ts +34 -0
  564. package/src/workspace/adoption-report.test.ts +61 -0
  565. package/src/workspace/adoption-report.ts +103 -0
  566. package/src/workspace/capabilities-contract.test.ts +4 -0
  567. package/src/workspace/capabilities-contract.ts +9 -1
  568. package/src/workspace/capabilities.schema.json +98 -0
  569. package/src/workspace/change-set.schema.json +42 -3
  570. package/src/workspace/ci-cloud-identity.ts +31 -1
  571. package/src/workspace/compose-graph.test.ts +12 -0
  572. package/src/workspace/compose-graph.ts +12 -1
  573. package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
  574. package/src/workspace/conformance/index.ts +6 -1
  575. package/src/workspace/drift-cli.test.ts +65 -0
  576. package/src/workspace/drift-cli.ts +365 -0
  577. package/src/workspace/drift.schema.json +672 -0
  578. package/src/workspace/graph-cli.ts +5 -0
  579. package/src/workspace/graph.schema.json +72 -0
  580. package/src/workspace/init.test.ts +38 -1
  581. package/src/workspace/init.ts +50 -8
  582. package/src/workspace/intent-gaps.test.ts +18 -2
  583. package/src/workspace/ledger.schema.json +1 -1
  584. package/src/workspace/nested-graph.ts +1 -0
  585. package/src/workspace/pr-report.schema.json +76 -3
  586. package/src/workspace/promote-waves.test.ts +296 -0
  587. package/src/workspace/promote-waves.ts +340 -0
  588. package/src/workspace/promote.test.ts +158 -4
  589. package/src/workspace/promote.ts +398 -57
  590. package/src/workspace/reason-codes.test.ts +4 -1
  591. package/src/workspace/reason-codes.ts +14 -0
  592. package/src/workspace/search-contract.ts +2 -0
  593. package/src/workspace/search.schema.json +103 -5
package/dist/graph-ir.js CHANGED
@@ -5,6 +5,7 @@ import { isLexiconOutput } from "./lexicon-output.js";
5
5
  import { getProvenance } from "./provenance.js";
6
6
  import { INTRINSIC_MARKER } from "./intrinsic.js";
7
7
  import { subTemplateRefs } from "./graph-sub-template.js";
8
+ import { entityInstanceRollup, observedInstanceNodeId } from "./instance-nodes.js";
8
9
  export { subTemplateRefs };
9
10
  /** True when `value` has the {@link EntityReference} shape. */
10
11
  function isEntityReference(value) {
@@ -43,6 +44,52 @@ export function entityStack(entity) {
43
44
  const stack = entity.stack;
44
45
  return typeof stack === "string" && stack.length > 0 ? stack : undefined;
45
46
  }
47
+ /**
48
+ * What an ownership engine observed about an entity (#4529), or undefined.
49
+ * Duck-typed like {@link entityStack}: the pulumi lexicon sets `facts` on a
50
+ * plunge member's entity from the member's checked-in engine graph. It is
51
+ * defined non-enumerable there, so a chant older than this reader does not
52
+ * project it into `attrs`. {@link buildGraphIr} copies it onto the node, and
53
+ * nothing in chant decides from it (see `IRNode.facts`).
54
+ */
55
+ export function entityFacts(entity) {
56
+ const facts = entity.facts;
57
+ return typeof facts === "object" && facts !== null && !Array.isArray(facts) ? facts : undefined;
58
+ }
59
+ /**
60
+ * The instance keys an entity says its source expands to (#4454), as the
61
+ * engine prints them (`[0]`, `["a"]`), or an empty list. Duck-typed like
62
+ * {@link entityStack}: the terraform lexicon sets `instanceKeys` on a block
63
+ * whose `count` or `for_each` is a literal.
64
+ */
65
+ export function entityInstanceKeys(entity) {
66
+ const keys = entity.instanceKeys;
67
+ if (!Array.isArray(keys))
68
+ return [];
69
+ return keys.filter((k) => typeof k === "string" && k.startsWith("[") && k.endsWith("]"));
70
+ }
71
+ /**
72
+ * The instance nodes an entity names, given its own key `name`: the
73
+ * duck-typed `instances` list when it carries one (full ids, which an
74
+ * instance under an expanded module call needs, #4486), else one per
75
+ * {@link entityInstanceKeys} key, id `<name><key>`.
76
+ */
77
+ export function entityInstances(name, entity) {
78
+ const listed = entity.instances;
79
+ if (Array.isArray(listed)) {
80
+ const out = [];
81
+ for (const item of listed) {
82
+ if (typeof item !== "object" || item === null)
83
+ continue;
84
+ const { id, key, scope } = item;
85
+ if (typeof id !== "string" || id.length === 0 || id === name)
86
+ continue;
87
+ out.push({ id, ...(typeof key === "string" ? { key } : {}), ...(typeof scope === "string" ? { scope } : {}) });
88
+ }
89
+ return out;
90
+ }
91
+ return entityInstanceKeys(entity).map((key) => ({ id: `${name}${key}`, key }));
92
+ }
46
93
  /**
47
94
  * The version `chant graph --format ir` writes on its output (#2529, #2524 D8).
48
95
  * The format changes only additively: a new field or edge kind never bumps
@@ -259,7 +306,8 @@ function subEnvelope(sub, seen, reverse, nodeIds) {
259
306
  // entity's place in the graph, not declared configuration, and both are read
260
307
  // directly, so projecting them into `attrs` would only restate an edge and a
261
308
  // group key the IR already carries.
262
- const SKIP_KEYS = new Set(["lexicon", "entityType", "kind", "attributes", "Ref", "references", "stack"]);
309
+ // `facts` (#4529) is an engine's observation, carried onto `IRNode.facts`, not configuration.
310
+ const SKIP_KEYS = new Set(["lexicon", "entityType", "kind", "attributes", "Ref", "references", "stack", "facts"]);
263
311
  /** The config bag of a node, paired with each key. Lexicon entities keep their
264
312
  * declared props in a (usually non-enumerable) `props` object; simpler entities
265
313
  * carry config as enumerable own properties. We surface both, flattening `props`
@@ -310,6 +358,7 @@ function collectEdges(entity, from, nodeIds, reverse) {
310
358
  kind: "ref",
311
359
  ...(ref.viaAttr ? { viaAttr: ref.viaAttr } : {}),
312
360
  ...(ref.toAttr ? { toAttr: ref.toAttr } : {}),
361
+ ...(ref.grain === "block" || ref.grain === "instance" || ref.grain === "property" ? { grain: ref.grain } : {}),
313
362
  });
314
363
  }
315
364
  const seen = new Set();
@@ -399,7 +448,8 @@ function collectEdges(entity, from, nodeIds, reverse) {
399
448
  }
400
449
  /** Stable key for deduping and sorting an edge. */
401
450
  function edgeKey(e) {
402
- return `${e.from}\0${e.to}\0${e.viaAttr ?? ""}`;
451
+ // `grain` joins the key only when set, so an edge without one keys as before.
452
+ return `${e.from}\0${e.to}\0${e.viaAttr ?? ""}${e.grain ? `\0${e.grain}` : ""}`;
403
453
  }
404
454
  /**
405
455
  * Build the graph IR from resolved entities (the output of `discover`). Pure and
@@ -438,6 +488,9 @@ export function buildGraphIr(entities, projectPath) {
438
488
  const file = relFile(prov?.sourceFile, projectPath);
439
489
  if (file)
440
490
  node.sourceLoc = { file };
491
+ const facts = entityFacts(entity);
492
+ if (facts)
493
+ node.facts = facts;
441
494
  nodes.push(node);
442
495
  (byLexicon[_a = entity.lexicon] ?? (byLexicon[_a] = [])).push(name);
443
496
  // An entity that names its own deployable unit is taken at its word
@@ -517,6 +570,81 @@ export function buildGraphIr(entities, projectPath) {
517
570
  ir.imports = imports;
518
571
  return ir;
519
572
  }
573
+ /**
574
+ * Add an instance node (#4454) under each node whose entity names its
575
+ * instances ({@link entityInstances}): id `<block id><key>`, or the full id
576
+ * the entity lists under an expanded module call (#4486), the
577
+ * block's kind, lexicon and source location, `instanceOf` and `instanceKey`,
578
+ * no attrs and no edges. Each instance joins every group its block is in, so
579
+ * a renderer draws it in the block's box. A block node whose entity carries
580
+ * an `instanceRollup` (#4489) gets it. Pure. Returns `ir` itself when no
581
+ * entity has instance keys or a rollup, so a graph with none prints what it
582
+ * did before.
583
+ *
584
+ * Called by `chant graph` and the declared half of `--live`, not by
585
+ * {@link buildGraphIr}, so `chant search`, which reads the base IR, still
586
+ * counts blocks.
587
+ */
588
+ export function withInstanceNodes(ir, entities) {
589
+ const byId = new Map(ir.nodes.map((n) => [n.id, n]));
590
+ const added = [];
591
+ const childrenOf = new Map();
592
+ const rolledUp = new Map();
593
+ for (const [name, entity] of entities) {
594
+ const block = byId.get(name);
595
+ if (!block || block.instanceOf)
596
+ continue;
597
+ const rollup = entityInstanceRollup(entity);
598
+ if (rollup)
599
+ rolledUp.set(name, rollup);
600
+ for (const { id, key, scope } of entityInstances(name, entity)) {
601
+ if (byId.has(id))
602
+ continue;
603
+ const node = {
604
+ id,
605
+ kind: block.kind,
606
+ lexicon: block.lexicon,
607
+ attrs: {},
608
+ instanceOf: name,
609
+ ...(key !== undefined ? { instanceKey: key } : {}),
610
+ ...(scope !== undefined ? { instanceScope: scope } : {}),
611
+ };
612
+ if (block.sourceLoc)
613
+ node.sourceLoc = { ...block.sourceLoc };
614
+ if (block.compositeParent)
615
+ node.compositeParent = block.compositeParent;
616
+ if (block.compositeInstance)
617
+ node.compositeInstance = block.compositeInstance;
618
+ added.push(node);
619
+ byId.set(id, node);
620
+ (childrenOf.get(name) ?? childrenOf.set(name, []).get(name)).push(id);
621
+ }
622
+ }
623
+ if (added.length === 0 && rolledUp.size === 0)
624
+ return ir;
625
+ const own = ir.nodes.map((n) => {
626
+ const rollup = rolledUp.get(n.id);
627
+ return rollup ? { ...n, instanceRollup: rollup } : n;
628
+ });
629
+ if (added.length === 0)
630
+ return { ...ir, nodes: own };
631
+ const nodes = [...own, ...added].sort((a, b) => a.id.localeCompare(b.id));
632
+ const withChildren = (rec) => {
633
+ if (!rec)
634
+ return rec;
635
+ const out = {};
636
+ for (const [k, ids] of Object.entries(rec))
637
+ out[k] = [...ids, ...ids.flatMap((id) => childrenOf.get(id) ?? [])].sort();
638
+ return out;
639
+ };
640
+ const groups = { ...ir.groups };
641
+ for (const key of ["byLexicon", "byComposite", "byStack"]) {
642
+ const grown = withChildren(ir.groups[key]);
643
+ if (grown)
644
+ groups[key] = grown;
645
+ }
646
+ return { ...ir, nodes, groups };
647
+ }
520
648
  /**
521
649
  * Add what the lexicons' `graphEdges` hooks reported (#3910) to a built IR.
522
650
  *
@@ -657,10 +785,45 @@ export function buildLiveGraphIr(observations) {
657
785
  // declared owner", which is simply the absence of this field.
658
786
  if (meta.ownerChain?.root === "declared")
659
787
  node.runtimeOwner = meta.ownerChain.entity;
788
+ // An engine's facts (#4527) ride beside `physicalId`, as the engine gave them.
789
+ if (meta.facts)
790
+ node.facts = meta.facts;
660
791
  nodes.push(node);
661
792
  (byLexicon[lexicon] ?? (byLexicon[lexicon] = [])).push(name);
662
793
  // A live lexicon maps to one deployable stack, same as the source IR.
663
794
  (byStack[lexicon] ?? (byStack[lexicon] = [])).push(name);
795
+ // Each present instance of a `count` or `for_each` block is a node of
796
+ // its own under the block's (#4454), so the overlay paints it alone.
797
+ // The block node above is the rollup. An absent or not-observed
798
+ // instance is no live node: the overlay reads that off `instances`.
799
+ // Under an expanded module call the id follows the declared graph's
800
+ // rule (#4486, #4488), `estate/module.app[0]/aws_eip.pool[1]`, with
801
+ // `instanceScope` and no `instanceKey` when only the call is expanded.
802
+ for (const inst of meta.instances ?? []) {
803
+ if (inst.verdict !== "present")
804
+ continue;
805
+ const id = observedInstanceNodeId(name, inst);
806
+ if (id === undefined)
807
+ continue;
808
+ const child = {
809
+ id,
810
+ kind: meta.type,
811
+ lexicon,
812
+ attrs: { address: inst.address, ...(inst.status ? { status: inst.status } : {}) },
813
+ instanceOf: name,
814
+ ...(inst.key !== undefined ? { instanceKey: inst.key } : {}),
815
+ ...(inst.scope !== undefined ? { instanceScope: inst.scope } : {}),
816
+ };
817
+ if (inst.physicalId)
818
+ child.physicalId = inst.physicalId;
819
+ if (inst.ownership === "owned" || inst.ownership === "foreign")
820
+ child.ownership = inst.ownership;
821
+ if (inst.facts)
822
+ child.facts = inst.facts;
823
+ nodes.push(child);
824
+ (byLexicon[lexicon] ?? (byLexicon[lexicon] = [])).push(id);
825
+ (byStack[lexicon] ?? (byStack[lexicon] = [])).push(id);
826
+ }
664
827
  }
665
828
  }
666
829
  nodes.sort((a, b) => a.id.localeCompare(b.id));
@@ -685,7 +848,9 @@ export function buildLiveGraphIr(observations) {
685
848
  for (const edge of observation.edges ?? []) {
686
849
  if (!observedIds.has(edge.from) || !observedIds.has(edge.to))
687
850
  continue;
688
- const key = `${edge.from}\u0000${edge.to}\u0000${edge.viaAttr ?? ""}\u0000${edge.toAttr ?? ""}`;
851
+ // `grain` is in the key (#4527): a block edge and an instance edge
852
+ // between the same pair stay two edges.
853
+ const key = `${edge.from}\u0000${edge.to}\u0000${edge.viaAttr ?? ""}\u0000${edge.toAttr ?? ""}\u0000${edge.grain ?? ""}`;
689
854
  if (seen.has(key))
690
855
  continue;
691
856
  seen.add(key);
@@ -694,7 +859,8 @@ export function buildLiveGraphIr(observations) {
694
859
  }
695
860
  edges.sort((a, b) => a.from.localeCompare(b.from) ||
696
861
  a.to.localeCompare(b.to) ||
697
- (a.viaAttr ?? "").localeCompare(b.viaAttr ?? ""));
862
+ (a.viaAttr ?? "").localeCompare(b.viaAttr ?? "") ||
863
+ (a.grain ?? "").localeCompare(b.grain ?? ""));
698
864
  // Stack exports (#1279) land on the IR's `exports`, the same place the
699
865
  // declared graph keeps what a stack publishes — not on the member nodes.
700
866
  const exports = [];
@@ -714,16 +880,47 @@ export function collectUnobserved(observations) {
714
880
  Object.assign(out, o.unobserved ?? {});
715
881
  return out;
716
882
  }
883
+ /**
884
+ * The overlay paint on one node. `_ownership` (#4534, behold#906 Q2) is
885
+ * chant's own marker verdict, {@link IRNode.ownership}, beside `_status`, so
886
+ * `chant search` answers ownership with no grammar of its own:
887
+ * `attr:_ownership=foreign`, `--show _ownership`, `--count-by attr:_ownership`.
888
+ * It is `owned` or `foreign`; absent means unknown (no marker channel on the
889
+ * read, or a node nobody observed). It never reads `facts.ownership`, the
890
+ * engine's verdict, which stays for display (#4520 Q1).
891
+ */
717
892
  function tagStatus(n, status, unobserved) {
718
893
  return {
719
894
  ...n,
720
895
  attrs: {
721
896
  ...n.attrs,
722
897
  _status: status,
898
+ ...(n.ownership ? { _ownership: n.ownership } : {}),
723
899
  ...(unobserved ? { _unobserved: unobserved.reason } : {}),
724
900
  },
725
901
  };
726
902
  }
903
+ /**
904
+ * The paint for a declared instance node (#4454) the live graph has no node
905
+ * for. Its block not observed: `neutral` with the block's reason, since the
906
+ * rollup put the whole block there. Its block live with instances read: the
907
+ * instance is not among them, so `accent`, pending. Its block live with no
908
+ * instance read at all: `neutral`, since nothing said either way. Its block
909
+ * absent: `accent`, like the block.
910
+ */
911
+ function missingInstance(n, live, read, unobserved) {
912
+ const block = n.instanceOf;
913
+ const u = unobserved[n.id] ?? unobserved[block];
914
+ if (u)
915
+ return tagStatus(n, "neutral", u);
916
+ if (live.has(block) && !read.has(block))
917
+ return tagStatus(n, "neutral");
918
+ return tagStatus(n, "accent");
919
+ }
920
+ /** The block ids some live instance node names (#4454): the blocks whose read reported instances. */
921
+ function blocksWithInstances(live) {
922
+ return new Set(live.nodes.map((n) => n.instanceOf).filter((b) => b !== undefined));
923
+ }
727
924
  /**
728
925
  * Overlay the declared graph on the provisioned one (#780, `chant graph --live
729
926
  * --overlay`) and classify each resource, tagging a `_status` a renderer colours:
@@ -742,8 +939,13 @@ export function overlayGraphs(live, declared, opts) {
742
939
  const declaredById = new Map(declared.nodes.map((n) => [n.id, n]));
743
940
  const liveIds = new Set(live.nodes.map((n) => n.id));
744
941
  const unobserved = opts?.unobserved ?? {};
942
+ const read = blocksWithInstances(live);
745
943
  const nodes = live.nodes.map((n) => {
746
944
  const d = declaredById.get(n.id);
945
+ // A live instance of a declared block whose expansion the source could
946
+ // not count (`count = var.n`) is managed, never foreign (#4454).
947
+ if (!d && n.instanceOf && declaredById.has(n.instanceOf))
948
+ return tagStatus(n, "good");
747
949
  if (!d)
748
950
  return tagStatus(n, n.runtimeOwner ? "runtime" : "warn");
749
951
  // A managed node keeps the composite it was declared in, so `--detail 1`
@@ -757,6 +959,10 @@ export function overlayGraphs(live, declared, opts) {
757
959
  for (const n of declared.nodes) {
758
960
  if (liveIds.has(n.id))
759
961
  continue;
962
+ if (n.instanceOf) {
963
+ nodes.push(missingInstance(n, liveIds, read, unobserved));
964
+ continue;
965
+ }
760
966
  const u = unobserved[n.id];
761
967
  nodes.push(u ? tagStatus(n, "neutral", u) : tagStatus(n, "accent"));
762
968
  }
@@ -773,7 +979,7 @@ export function overlayGraphs(live, declared, opts) {
773
979
  *
774
980
  * Each declared node is classified against live observation and tagged `_status`:
775
981
  * - **managed** (declared + provisioned) → `good`, carrying the observed
776
- * `physicalId` / `ownership` onto the declared node
982
+ * `physicalId` / `ownership` / engine `facts` onto the declared node
777
983
  * - **pending** (declared, provider confirmed absent) → `accent`
778
984
  * - **unobserved** (declared, chant could not look — #1089) → `neutral`, with
779
985
  * the reason on `_unobserved`. A wrong-cluster or unsupported-kind read used
@@ -788,11 +994,19 @@ export function overlayGraphs(live, declared, opts) {
788
994
  */
789
995
  export function sourceOverlayGraphs(declared, live, opts) {
790
996
  const liveById = new Map(live.nodes.map((n) => [n.id, n]));
997
+ const liveIds = new Set(liveById.keys());
791
998
  const declaredIds = new Set(declared.nodes.map((n) => n.id));
792
- const foreignIds = new Set(live.nodes.filter((n) => !declaredIds.has(n.id)).map((n) => n.id));
999
+ // A live instance of a declared block (#4454) the source could not count
1000
+ // is managed: appended `good`, and never foreign.
1001
+ const managedInstances = live.nodes.filter((n) => !declaredIds.has(n.id) && n.instanceOf !== undefined && declaredIds.has(n.instanceOf));
1002
+ const managedInstanceIds = new Set(managedInstances.map((n) => n.id));
1003
+ const foreignIds = new Set(live.nodes.filter((n) => !declaredIds.has(n.id) && !managedInstanceIds.has(n.id)).map((n) => n.id));
793
1004
  const unobserved = opts?.unobserved ?? {};
1005
+ const read = blocksWithInstances(live);
794
1006
  const nodes = declared.nodes.map((n) => {
795
1007
  const obs = liveById.get(n.id);
1008
+ if (!obs && n.instanceOf)
1009
+ return missingInstance(n, liveIds, read, unobserved);
796
1010
  if (!obs) {
797
1011
  const u = unobserved[n.id];
798
1012
  // unobserved — declared, and nobody looked; not "pending"
@@ -803,6 +1017,8 @@ export function sourceOverlayGraphs(declared, live, opts) {
803
1017
  merged.physicalId = obs.physicalId;
804
1018
  if (obs.ownership)
805
1019
  merged.ownership = obs.ownership;
1020
+ if (obs.facts)
1021
+ merged.facts = obs.facts;
806
1022
  // ...and what was observed ABOUT it (#1279). The declared canvas holds what
807
1023
  // the source says; the observation holds what the account says, and a fact
808
1024
  // like `VpcId` exists only on the second. Dropping it here made every
@@ -823,6 +1039,8 @@ export function sourceOverlayGraphs(declared, live, opts) {
823
1039
  continue;
824
1040
  nodes.push(tagStatus(n, n.runtimeOwner ? "runtime" : "warn")); // runtime child or foreign
825
1041
  }
1042
+ for (const n of managedInstances)
1043
+ nodes.push(tagStatus(n, "good"));
826
1044
  nodes.sort((a, b) => a.id.localeCompare(b.id));
827
1045
  // Declared edges are the canvas (the cross-substrate topology). Add only the
828
1046
  // live edges that touch a foreign node — declared edges already cover every
@@ -34,8 +34,26 @@ export interface RefRule {
34
34
  match?: "id" | "arn" | "name" | "any";
35
35
  /** Constrain the target kind (disambiguates identifier collisions). */
36
36
  targetKind?: string;
37
+ /**
38
+ * The target kind when the rule runs over indexed nodes (#4522, ruled on
39
+ * INTENTIUS/behold#1023 Q4), for a rule that has no {@link targetKind}
40
+ * because its values are logical ids (`enrichLiveAttrs`), which are unique.
41
+ * Over an index the same path holds a physical value, often a name, so the
42
+ * target kind is what keeps it from joining whatever else has that name.
43
+ */
44
+ indexedTargetKind?: string;
37
45
  /** `reference` → an edge; `containment` → a boundary hint (#779), not an edge. */
38
46
  relation: "reference" | "containment";
47
+ /**
48
+ * The path holds a reference only sometimes (#4535): an env var's value, a
49
+ * selector's label, a binding subject that may be a user. A value that
50
+ * names no node of the rule's kind is then not reported as dangling, since
51
+ * most such values are not references at all, and a path read by several
52
+ * rules (one per target kind) would otherwise report every value matched by
53
+ * one rule as dangling under the others. A match is still a typed, scoped
54
+ * match, and two candidates still draw no edge.
55
+ */
56
+ optional?: boolean;
39
57
  /** Edge / containment label (e.g. "in VPC", "sg", "targets"). */
40
58
  label?: string;
41
59
  /**
@@ -58,10 +76,28 @@ export interface RefRule {
58
76
  */
59
77
  viaAttr?: string;
60
78
  }
79
+ /**
80
+ * A typed tag rule (#4522, ruled on INTENTIUS/behold#1023 Q5): a tag whose
81
+ * key names a cloud id, read off an indexed node's `tags`. Tags make edges
82
+ * only through these, never by matching equal tag values, because two
83
+ * objects can carry the same value for any reason.
84
+ */
85
+ export interface TagRefRule {
86
+ /** Holder kind; absent for every kind of this lexicon. */
87
+ from?: string;
88
+ /** The exact tag key, or a key prefix ending in `/` whose remainder is the value. */
89
+ key: string;
90
+ /** `value`: the tag's value is the id. `key-suffix`: the key after {@link key} is (`kubernetes.io/cluster/<name>`). */
91
+ read: "value" | "key-suffix";
92
+ targetKind: string;
93
+ label?: string;
94
+ }
61
95
  /** A lexicon's reference knowledge — its identity map and reference rules. */
62
96
  export interface ReferenceCatalog {
63
97
  identities: IdentityRule[];
64
98
  refs: RefRule[];
99
+ /** Typed tag rules, used over indexed nodes only (#4522). */
100
+ tagRefs?: TagRefRule[];
65
101
  }
66
102
  /** `child` is contained by `parent` (subnet ∈ VPC). For #779's boundary boxes. */
67
103
  export interface ContainmentPair {
@@ -129,4 +165,113 @@ export declare function reconstructEdges(nodes: IRNode[], catalog: ReferenceCata
129
165
  * determinism.
130
166
  */
131
167
  export declare function containmentGroups(pairs: ContainmentPair[]): Record<string, string[]>;
168
+ /** One lexicon's catalog, named, so a derived edge can say which rule made it. */
169
+ export interface NamedCatalog {
170
+ lexicon: string;
171
+ catalog: ReferenceCatalog;
172
+ }
173
+ /**
174
+ * Where an indexed node's identifiers are unique (INTENTIUS/behold#1023 Q2):
175
+ * its substrate and account, subscription, project or cluster, plus its
176
+ * region for a regional type. A global type (IAM, Route 53, CloudFront) has
177
+ * no region, and is matched by account only.
178
+ */
179
+ export interface IndexedNodeScope {
180
+ /** `<substrate>/<scopeId>`. */
181
+ account: string;
182
+ /** The region or location; undefined for a global type. */
183
+ region?: string;
184
+ }
185
+ /** A reference whose value matched several nodes: no edge is drawn (behold#1023 Q3). */
186
+ export interface AmbiguousRef {
187
+ from: string;
188
+ rule: string;
189
+ path: string;
190
+ value: string;
191
+ /** Every node the value matched, sorted. */
192
+ candidates: string[];
193
+ }
194
+ /** A reference whose target is not in the index, with the rule that read it. */
195
+ export interface IndexedDanglingRef extends DanglingRef {
196
+ rule: string;
197
+ }
198
+ export interface IndexedEdges {
199
+ /** Reference and containment edges, each `origin: "derived"` with its `rule`. */
200
+ edges: IREdge[];
201
+ containment: ContainmentPair[];
202
+ dangling: IndexedDanglingRef[];
203
+ ambiguous: AmbiguousRef[];
204
+ }
205
+ /** `<lexicon>:<from kind>:<path>`, the id a derived edge carries. */
206
+ export declare function refRuleId(lexicon: string, from: string, path: string): string;
207
+ /**
208
+ * Derive edges over indexed nodes (#4522) with each lexicon's catalog, under
209
+ * the rules ruled on INTENTIUS/behold#1023:
210
+ *
211
+ * - the join key is the scoped value: a reference on a node in region R
212
+ * matches nodes of the same account in R, and global nodes of the same
213
+ * account; a reference on a global node matches global nodes only;
214
+ * - a rule's target kind is `targetKind`, else `indexedTargetKind`;
215
+ * - a value that matches more than one node draws no edge and is returned in
216
+ * `ambiguous` with every candidate, in place of {@link reconstructEdges}'
217
+ * first-candidate pick, so two reads of one account in another node order
218
+ * give the same edges;
219
+ * - tags make edges only through a catalog's typed `tagRefs`.
220
+ *
221
+ * A node is matched by its id, physical id, native id, cloud ids, and the
222
+ * catalog's identity paths. Rules apply to nodes of their own lexicon. Pure.
223
+ */
224
+ export declare function reconstructIndexedEdges(nodes: readonly IRNode[], catalogs: readonly NamedCatalog[], scopeOf: (node: IRNode) => IndexedNodeScope): IndexedEdges;
225
+ /** One value that names an indexed node: its native id, or one of its cloud ids. */
226
+ export interface NodeIdentityValue {
227
+ /** `native-id`, or the cloud id's kind (`arn`, `provider-id`, ...). */
228
+ kind: string;
229
+ value: string;
230
+ }
231
+ /** The lexicon whose nodes can be identity-matched, and the values that name each one. */
232
+ export interface IdentityOwners {
233
+ lexicon: string;
234
+ /** The values that name a node of this lexicon. Absent: its native id and its ARN cloud ids. */
235
+ identities?(node: IRNode): NodeIdentityValue[];
236
+ }
237
+ /** A value that named several nodes: no identity-match edge is drawn (behold#1023 Q3). */
238
+ export interface AmbiguousIdentityRef {
239
+ from: string;
240
+ path: string;
241
+ value: string;
242
+ /** Every node the value named, sorted. */
243
+ candidates: string[];
244
+ }
245
+ export interface IdentityEdges {
246
+ /** Each `origin: "derived"`, `rule: "identity-match:..."`. */
247
+ edges: IREdge[];
248
+ ambiguous: AmbiguousIdentityRef[];
249
+ }
250
+ /** The label every edge of the identity pass carries, as the prefix of its `rule`. */
251
+ export declare const IDENTITY_MATCH_RULE = "identity-match";
252
+ /** `identity-match:<owner lexicon>:<owner kind>:<identity kind>`. */
253
+ export declare function identityMatchRuleId(lexicon: string, kind: string, identityKind: string): string;
254
+ /** The default identities of an indexed node: the native id, and any ARN among its cloud ids. */
255
+ export declare function defaultNodeIdentities(node: IRNode): NodeIdentityValue[];
256
+ /**
257
+ * The identity-match pass (#4523, ruled on INTENTIUS/behold#1023 Q1-Q3): the
258
+ * second pass over indexed nodes, after {@link reconstructIndexedEdges}. A
259
+ * string attribute on one node equal to a value that names another node (its
260
+ * native id, which for aws is the CloudFormation `primaryIdentifier`, or its
261
+ * ARN) draws an edge labelled `identity-match`:
262
+ *
263
+ * - only nodes of a lexicon in `owners` are named; holders are any node;
264
+ * - the join key is the scoped value, as in the catalog pass: a holder in
265
+ * region R reaches nodes of its account in R and global nodes of its
266
+ * account; a global holder reaches global nodes only;
267
+ * - a value naming more than one node draws no edge and is returned in
268
+ * `ambiguous` with every candidate;
269
+ * - tag subtrees are never read, values under {@link MIN_IDENTITY_VALUE}
270
+ * characters or with whitespace are skipped, and a value naming the holder
271
+ * itself is not a reference;
272
+ * - a pair the catalog pass already joined (`existing`) gets no second edge.
273
+ *
274
+ * Pure, and independent of node order.
275
+ */
276
+ export declare function reconstructIdentityEdges(nodes: readonly IRNode[], owners: readonly IdentityOwners[], scopeOf: (node: IRNode) => IndexedNodeScope, existing?: readonly IREdge[]): IdentityEdges;
132
277
  //# sourceMappingURL=graph-refs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph-refs.d.ts","sourceRoot":"","sources":["../src/graph-refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEjD,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAED,kFAAkF;AAClF,MAAM,WAAW,OAAO;IACtB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACtC,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,QAAQ,EAAE,WAAW,GAAG,aAAa,CAAC;IACtC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;0DAC0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAQD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB7D;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,CAK5E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,kBAAkB,CAgF/F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAQpF"}
1
+ {"version":3,"file":"graph-refs.d.ts","sourceRoot":"","sources":["../src/graph-refs.ts"],"names":[],"mappings":"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"}