@intentius/chant 0.57.0 → 0.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/dist/audit/catalog.d.ts +51 -1
  2. package/dist/audit/catalog.d.ts.map +1 -1
  3. package/dist/audit/core.d.ts +36 -1
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts +26 -9
  6. package/dist/audit/discover.d.ts.map +1 -1
  7. package/dist/audit/lineage.d.ts +10 -0
  8. package/dist/audit/lineage.d.ts.map +1 -0
  9. package/dist/audit/prior-art.d.ts +385 -0
  10. package/dist/audit/prior-art.d.ts.map +1 -0
  11. package/dist/audit/proof.d.ts +16 -0
  12. package/dist/audit/proof.d.ts.map +1 -1
  13. package/dist/audit/report-html.d.ts.map +1 -1
  14. package/dist/audit/report-model.d.ts +8 -1
  15. package/dist/audit/report-model.d.ts.map +1 -1
  16. package/dist/audit/report.d.ts.map +1 -1
  17. package/dist/audit/rules-doc.d.ts +3 -0
  18. package/dist/audit/rules-doc.d.ts.map +1 -1
  19. package/dist/audit/secrets.d.ts +15 -0
  20. package/dist/audit/secrets.d.ts.map +1 -1
  21. package/dist/audit/terraform-state.d.ts +46 -0
  22. package/dist/audit/terraform-state.d.ts.map +1 -0
  23. package/dist/build.d.ts +17 -1
  24. package/dist/build.d.ts.map +1 -1
  25. package/dist/claimed-fields.d.ts +161 -0
  26. package/dist/claimed-fields.d.ts.map +1 -0
  27. package/dist/cli/build-params-cli.d.ts +2 -2
  28. package/dist/cli/command-group.d.ts +14 -0
  29. package/dist/cli/command-group.d.ts.map +1 -1
  30. package/dist/cli/commands/audit.d.ts +17 -1
  31. package/dist/cli/commands/audit.d.ts.map +1 -1
  32. package/dist/cli/commands/build.d.ts.map +1 -1
  33. package/dist/cli/commands/carve-bridge.d.ts.map +1 -1
  34. package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
  35. package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
  36. package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
  37. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
  38. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
  39. package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
  40. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  41. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  42. package/dist/cli/commands/init.d.ts.map +1 -1
  43. package/dist/cli/commands/lint.d.ts +13 -0
  44. package/dist/cli/commands/lint.d.ts.map +1 -1
  45. package/dist/cli/commands/onboard.d.ts +2 -0
  46. package/dist/cli/commands/onboard.d.ts.map +1 -1
  47. package/dist/cli/handlers/build.d.ts.map +1 -1
  48. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  49. package/dist/cli/handlers/operator.d.ts +82 -16
  50. package/dist/cli/handlers/operator.d.ts.map +1 -1
  51. package/dist/cli/handlers/run.d.ts +49 -42
  52. package/dist/cli/handlers/run.d.ts.map +1 -1
  53. package/dist/cli/main.d.ts +12 -1
  54. package/dist/cli/main.d.ts.map +1 -1
  55. package/dist/cli/mcp/op-tools.d.ts +16 -1
  56. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  57. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  58. package/dist/cli/mcp/resources/context.d.ts.map +1 -1
  59. package/dist/cli/plugins.d.ts +22 -0
  60. package/dist/cli/plugins.d.ts.map +1 -1
  61. package/dist/cli/registry.d.ts +40 -9
  62. package/dist/cli/registry.d.ts.map +1 -1
  63. package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
  64. package/dist/components/auto-release.d.ts +10 -20
  65. package/dist/components/auto-release.d.ts.map +1 -1
  66. package/dist/components/capability.d.ts +4 -4
  67. package/dist/components/cli-support.d.ts +24 -22
  68. package/dist/components/cli-support.d.ts.map +1 -1
  69. package/dist/components/component.d.ts +21 -6
  70. package/dist/components/component.d.ts.map +1 -1
  71. package/dist/components/driver-output.d.ts.map +1 -1
  72. package/dist/components/driver.d.ts +73 -37
  73. package/dist/components/driver.d.ts.map +1 -1
  74. package/dist/components/index.d.ts +1 -2
  75. package/dist/components/index.d.ts.map +1 -1
  76. package/dist/components/manifest-persistence.d.ts +1 -9
  77. package/dist/components/manifest-persistence.d.ts.map +1 -1
  78. package/dist/components/run-progress.d.ts +6 -6
  79. package/dist/components/run-progress.d.ts.map +1 -1
  80. package/dist/components/verbs/run-agent.d.ts +10 -22
  81. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  82. package/dist/components/verbs/verify.d.ts +2 -2
  83. package/dist/deep-observation.d.ts +17 -0
  84. package/dist/deep-observation.d.ts.map +1 -1
  85. package/dist/detectLexicon.d.ts +13 -0
  86. package/dist/detectLexicon.d.ts.map +1 -1
  87. package/dist/discovery/files.d.ts +4 -4
  88. package/dist/discovery/fold-import.d.ts.map +1 -1
  89. package/dist/discovery/param-deps.d.ts +33 -0
  90. package/dist/discovery/param-deps.d.ts.map +1 -1
  91. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  92. package/dist/discovery/sandbox/config-wire.d.ts +2 -2
  93. package/dist/fold/foldable-helpers.d.ts +5 -1
  94. package/dist/fold/foldable-helpers.d.ts.map +1 -1
  95. package/dist/fold-provenance.d.ts +236 -0
  96. package/dist/fold-provenance.d.ts.map +1 -0
  97. package/dist/graph-ops.d.ts +1 -1
  98. package/dist/held-elsewhere.d.ts +85 -0
  99. package/dist/held-elsewhere.d.ts.map +1 -0
  100. package/dist/index.d.ts +3 -0
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/kubectl-context.d.ts +3 -3
  103. package/dist/lexicon-config.d.ts +4 -4
  104. package/dist/lexicon-plugin-helpers.d.ts +1 -1
  105. package/dist/lexicon.d.ts +273 -16
  106. package/dist/lexicon.d.ts.map +1 -1
  107. package/dist/lifecycle/change-set.d.ts +13 -0
  108. package/dist/lifecycle/change-set.d.ts.map +1 -1
  109. package/dist/lifecycle/deep-diff.d.ts +133 -6
  110. package/dist/lifecycle/deep-diff.d.ts.map +1 -1
  111. package/dist/lifecycle/deep-observe.d.ts.map +1 -1
  112. package/dist/lifecycle/gate-ledger.d.ts +79 -3
  113. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  114. package/dist/lifecycle/index.d.ts +1 -0
  115. package/dist/lifecycle/index.d.ts.map +1 -1
  116. package/dist/lifecycle/release-ledger.d.ts +2 -2
  117. package/dist/lifecycle/run-ledger.d.ts +53 -0
  118. package/dist/lifecycle/run-ledger.d.ts.map +1 -0
  119. package/dist/lifecycle/symptoms.d.ts +3 -3
  120. package/dist/lifecycle/symptoms.d.ts.map +1 -1
  121. package/dist/lint/config.d.ts +81 -2
  122. package/dist/lint/config.d.ts.map +1 -1
  123. package/dist/lint/post-synth.d.ts +55 -2
  124. package/dist/lint/post-synth.d.ts.map +1 -1
  125. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
  126. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
  127. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
  128. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
  129. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
  130. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
  131. package/dist/lint/rules/comp/index.d.ts +1 -1
  132. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  133. package/dist/lint/rules/op/index.d.ts +16 -0
  134. package/dist/lint/rules/op/index.d.ts.map +1 -0
  135. package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
  136. package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
  137. package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
  138. package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
  139. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
  140. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
  141. package/dist/lint/rules/op/support.d.ts +12 -0
  142. package/dist/lint/rules/op/support.d.ts.map +1 -0
  143. package/dist/lint/suppressions.d.ts +108 -0
  144. package/dist/lint/suppressions.d.ts.map +1 -0
  145. package/dist/live-endpoint.d.ts +1 -1
  146. package/dist/op/activities/activity-contracts.d.ts +54 -0
  147. package/dist/op/activities/activity-contracts.d.ts.map +1 -0
  148. package/dist/op/activities/apply.d.ts +262 -0
  149. package/dist/op/activities/apply.d.ts.map +1 -0
  150. package/dist/op/activities/build.d.ts +13 -0
  151. package/dist/op/activities/build.d.ts.map +1 -0
  152. package/dist/op/activities/converge.d.ts +110 -0
  153. package/dist/op/activities/converge.d.ts.map +1 -0
  154. package/dist/op/activities/env-teardown.d.ts +76 -0
  155. package/dist/op/activities/env-teardown.d.ts.map +1 -0
  156. package/dist/op/activities/guard-validate.d.ts +64 -0
  157. package/dist/op/activities/guard-validate.d.ts.map +1 -0
  158. package/dist/op/activities/http-check.d.ts +34 -0
  159. package/dist/op/activities/http-check.d.ts.map +1 -0
  160. package/dist/op/activities/index.d.ts +31 -0
  161. package/dist/op/activities/index.d.ts.map +1 -0
  162. package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
  163. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
  164. package/dist/op/activities/lifecycle.d.ts +42 -0
  165. package/dist/op/activities/lifecycle.d.ts.map +1 -0
  166. package/dist/op/activities/pipeline-audit.d.ts +84 -0
  167. package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
  168. package/dist/op/activities/policy.d.ts +17 -0
  169. package/dist/op/activities/policy.d.ts.map +1 -0
  170. package/dist/op/activities/reconcile.d.ts +149 -0
  171. package/dist/op/activities/reconcile.d.ts.map +1 -0
  172. package/dist/op/activities/shell.d.ts +13 -0
  173. package/dist/op/activities/shell.d.ts.map +1 -0
  174. package/dist/op/activities/teardown.d.ts +10 -0
  175. package/dist/op/activities/teardown.d.ts.map +1 -0
  176. package/dist/op/activities/util.d.ts +7 -0
  177. package/dist/op/activities/util.d.ts.map +1 -0
  178. package/dist/op/activities/wait.d.ts +28 -0
  179. package/dist/op/activities/wait.d.ts.map +1 -0
  180. package/dist/op/activities/workflow-audit.d.ts +92 -0
  181. package/dist/op/activities/workflow-audit.d.ts.map +1 -0
  182. package/dist/op/activity-contract-registry.d.ts +76 -0
  183. package/dist/op/activity-contract-registry.d.ts.map +1 -0
  184. package/dist/op/activity-contract.d.ts +25 -18
  185. package/dist/op/activity-contract.d.ts.map +1 -1
  186. package/dist/op/activity-failure.d.ts +28 -0
  187. package/dist/op/activity-failure.d.ts.map +1 -0
  188. package/dist/op/activity-profiles.d.ts +118 -0
  189. package/dist/op/activity-profiles.d.ts.map +1 -0
  190. package/dist/op/activity-registry.d.ts +22 -38
  191. package/dist/op/activity-registry.d.ts.map +1 -1
  192. package/dist/op/activity-runtime.d.ts +3 -14
  193. package/dist/op/activity-runtime.d.ts.map +1 -1
  194. package/dist/op/builders.d.ts +85 -30
  195. package/dist/op/builders.d.ts.map +1 -1
  196. package/dist/op/change-signal.d.ts +91 -0
  197. package/dist/op/change-signal.d.ts.map +1 -0
  198. package/dist/op/composites/apply-op.d.ts +118 -0
  199. package/dist/op/composites/apply-op.d.ts.map +1 -0
  200. package/dist/op/composites/converge-op.d.ts +120 -0
  201. package/dist/op/composites/converge-op.d.ts.map +1 -0
  202. package/dist/op/composites/index.d.ts +26 -0
  203. package/dist/op/composites/index.d.ts.map +1 -0
  204. package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
  205. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
  206. package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
  207. package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
  208. package/dist/op/composites/reconcile-op.d.ts +57 -0
  209. package/dist/op/composites/reconcile-op.d.ts.map +1 -0
  210. package/dist/op/composites/watch-op.d.ts +60 -0
  211. package/dist/op/composites/watch-op.d.ts.map +1 -0
  212. package/dist/op/composites/workflow-audit-op.d.ts +57 -0
  213. package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
  214. package/dist/op/converge-rule.d.ts +12 -10
  215. package/dist/op/converge-rule.d.ts.map +1 -1
  216. package/dist/op/cron.d.ts +51 -0
  217. package/dist/op/cron.d.ts.map +1 -0
  218. package/dist/op/discover.d.ts +9 -0
  219. package/dist/op/discover.d.ts.map +1 -1
  220. package/dist/op/duration.d.ts +11 -0
  221. package/dist/op/duration.d.ts.map +1 -0
  222. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  223. package/dist/op/gate-name.d.ts +40 -0
  224. package/dist/op/gate-name.d.ts.map +1 -0
  225. package/dist/op/gate-summary.d.ts +43 -0
  226. package/dist/op/gate-summary.d.ts.map +1 -0
  227. package/dist/op/gate.d.ts +90 -0
  228. package/dist/op/gate.d.ts.map +1 -0
  229. package/dist/op/generate-pipeline.d.ts +9 -0
  230. package/dist/op/generate-pipeline.d.ts.map +1 -1
  231. package/dist/op/index.d.ts +29 -9
  232. package/dist/op/index.d.ts.map +1 -1
  233. package/dist/op/local-executor.d.ts +114 -28
  234. package/dist/op/local-executor.d.ts.map +1 -1
  235. package/dist/op/local-output.d.ts +11 -1
  236. package/dist/op/local-output.d.ts.map +1 -1
  237. package/dist/op/op-ir.d.ts +185 -0
  238. package/dist/op/op-ir.d.ts.map +1 -0
  239. package/dist/op/op-verb-class.d.ts +10 -2
  240. package/dist/op/op-verb-class.d.ts.map +1 -1
  241. package/dist/op/operator.d.ts +93 -5
  242. package/dist/op/operator.d.ts.map +1 -1
  243. package/dist/op/receipt-store.d.ts +1 -1
  244. package/dist/op/receipt-store.d.ts.map +1 -1
  245. package/dist/op/resource.d.ts +15 -1
  246. package/dist/op/resource.d.ts.map +1 -1
  247. package/dist/op/runtime.d.ts +200 -0
  248. package/dist/op/runtime.d.ts.map +1 -0
  249. package/dist/op/runtimes/local.d.ts +29 -0
  250. package/dist/op/runtimes/local.d.ts.map +1 -0
  251. package/dist/op/step-output-ref.d.ts +15 -13
  252. package/dist/op/step-output-ref.d.ts.map +1 -1
  253. package/dist/op/types.d.ts +96 -29
  254. package/dist/op/types.d.ts.map +1 -1
  255. package/dist/ownership.d.ts +1 -1
  256. package/dist/provenance.d.ts +21 -0
  257. package/dist/provenance.d.ts.map +1 -1
  258. package/dist/serializer-walker.d.ts.map +1 -1
  259. package/dist/terraform/bridge.d.ts +26 -7
  260. package/dist/terraform/bridge.d.ts.map +1 -1
  261. package/dist/terraform/carve-provider.d.ts +28 -2
  262. package/dist/terraform/carve-provider.d.ts.map +1 -1
  263. package/dist/terraform/data-source-shape.d.ts +77 -0
  264. package/dist/terraform/data-source-shape.d.ts.map +1 -0
  265. package/dist/terraform/graph.d.ts.map +1 -1
  266. package/dist/terraform/providers/kubernetes.d.ts +5 -0
  267. package/dist/terraform/providers/kubernetes.d.ts.map +1 -1
  268. package/dist/terraform/tier-map.d.ts +16 -4
  269. package/dist/terraform/tier-map.d.ts.map +1 -1
  270. package/dist/terraform/types.d.ts +8 -0
  271. package/dist/terraform/types.d.ts.map +1 -1
  272. package/package.json +6 -1
  273. package/src/audit/catalog.test.ts +79 -3
  274. package/src/audit/catalog.ts +111 -13
  275. package/src/audit/core.test.ts +26 -0
  276. package/src/audit/core.ts +84 -18
  277. package/src/audit/discover.test.ts +39 -0
  278. package/src/audit/discover.ts +202 -18
  279. package/src/audit/lineage.ts +100 -0
  280. package/src/audit/prior-art.ts +153 -0
  281. package/src/audit/proof.test.ts +67 -0
  282. package/src/audit/proof.ts +70 -0
  283. package/src/audit/report-html.ts +9 -4
  284. package/src/audit/report-model.ts +16 -2
  285. package/src/audit/report.test.ts +33 -0
  286. package/src/audit/report.ts +5 -3
  287. package/src/audit/rules-doc.test.ts +34 -2
  288. package/src/audit/rules-doc.ts +82 -9
  289. package/src/audit/secrets.ts +15 -3
  290. package/src/audit/terraform-state.test.ts +144 -0
  291. package/src/audit/terraform-state.ts +131 -0
  292. package/src/build.ts +31 -1
  293. package/src/claimed-fields.test.ts +145 -0
  294. package/src/claimed-fields.ts +208 -0
  295. package/src/cli/build-params-cli.ts +2 -2
  296. package/src/cli/command-group.ts +14 -0
  297. package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
  298. package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
  299. package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
  300. package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
  301. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
  302. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
  303. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
  304. package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
  305. package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
  306. package/src/cli/commands/audit.test.ts +191 -11
  307. package/src/cli/commands/audit.ts +78 -28
  308. package/src/cli/commands/build.test.ts +330 -9
  309. package/src/cli/commands/build.ts +170 -24
  310. package/src/cli/commands/carve-bridge.test.ts +237 -14
  311. package/src/cli/commands/carve-bridge.ts +21 -17
  312. package/src/cli/commands/carve-emit-k8s.test.ts +17 -10
  313. package/src/cli/commands/check-lexicon-docs.ts +1 -1
  314. package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
  315. package/src/cli/commands/check-lexicon-examples.ts +42 -10
  316. package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
  317. package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
  318. package/src/cli/commands/init-lexicon.test.ts +97 -2
  319. package/src/cli/commands/init-lexicon.ts +4 -2
  320. package/src/cli/commands/init.test.ts +35 -1
  321. package/src/cli/commands/init.ts +14 -3
  322. package/src/cli/commands/lint.test.ts +194 -1
  323. package/src/cli/commands/lint.ts +205 -7
  324. package/src/cli/commands/onboard.test.ts +75 -0
  325. package/src/cli/commands/onboard.ts +54 -23
  326. package/src/cli/handlers/build.test.ts +81 -1
  327. package/src/cli/handlers/build.ts +15 -1
  328. package/src/cli/handlers/graph.test.ts +3 -3
  329. package/src/cli/handlers/lifecycle.test.ts +195 -12
  330. package/src/cli/handlers/lifecycle.ts +123 -6
  331. package/src/cli/handlers/misc.ts +1 -1
  332. package/src/cli/handlers/operator.test.ts +183 -11
  333. package/src/cli/handlers/operator.ts +341 -55
  334. package/src/cli/handlers/run.test.ts +568 -1295
  335. package/src/cli/handlers/run.ts +446 -912
  336. package/src/cli/main.test.ts +22 -16
  337. package/src/cli/main.ts +66 -33
  338. package/src/cli/mcp/op-tools.ts +147 -88
  339. package/src/cli/mcp/resource-handlers.ts +10 -37
  340. package/src/cli/mcp/resources/context.ts +11 -12
  341. package/src/cli/mcp/server.test.ts +25 -27
  342. package/src/cli/mcp/server.ts +2 -2
  343. package/src/cli/plugins.test.ts +68 -2
  344. package/src/cli/plugins.ts +39 -0
  345. package/src/cli/registry.ts +40 -9
  346. package/src/codegen/docs.ts +1 -1
  347. package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
  348. package/src/codegen/generate-post-synth-barrel.ts +1 -1
  349. package/src/components/README.md +4 -3
  350. package/src/components/__fixtures__/neo4j-fanout.json +1 -1
  351. package/src/components/auto-release.test.ts +4 -20
  352. package/src/components/auto-release.ts +17 -42
  353. package/src/components/capability.ts +4 -4
  354. package/src/components/cli-support.test.ts +28 -12
  355. package/src/components/cli-support.ts +60 -47
  356. package/src/components/component-schema.test.ts +18 -2
  357. package/src/components/component.schema.json +18 -5
  358. package/src/components/component.test.ts +2 -2
  359. package/src/components/component.ts +27 -7
  360. package/src/components/config-defaults.test.ts +2 -2
  361. package/src/components/driver-output.ts +14 -2
  362. package/src/components/driver.test.ts +109 -20
  363. package/src/components/driver.ts +201 -84
  364. package/src/components/index.ts +1 -6
  365. package/src/components/manifest-persistence.test.ts +2 -20
  366. package/src/components/manifest-persistence.ts +4 -24
  367. package/src/components/pilots/neo4j-fanout.pilot.ts +3 -3
  368. package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
  369. package/src/components/run-progress.ts +6 -6
  370. package/src/components/verbs/run-agent.test.ts +19 -0
  371. package/src/components/verbs/run-agent.ts +12 -24
  372. package/src/components/verbs/verify.ts +2 -2
  373. package/src/deep-observation.test.ts +75 -0
  374. package/src/deep-observation.ts +48 -0
  375. package/src/detectLexicon.ts +18 -1
  376. package/src/discovery/collect.test.ts +3 -3
  377. package/src/discovery/files.ts +4 -4
  378. package/src/discovery/fold-import.test.ts +1 -1
  379. package/src/discovery/fold-import.ts +105 -2
  380. package/src/discovery/param-deps.test.ts +112 -1
  381. package/src/discovery/param-deps.ts +193 -0
  382. package/src/discovery/sandbox/bundle.ts +15 -1
  383. package/src/discovery/sandbox/config-wire.test.ts +2 -2
  384. package/src/discovery/sandbox/config-wire.ts +2 -2
  385. package/src/fold/fold.test.ts +56 -0
  386. package/src/fold/foldable-helpers.ts +82 -2
  387. package/src/fold-provenance-exclusion.test.ts +186 -0
  388. package/src/fold-provenance.test.ts +495 -0
  389. package/src/fold-provenance.ts +441 -0
  390. package/src/graph-ops.test.ts +3 -3
  391. package/src/graph-ops.ts +1 -1
  392. package/src/held-elsewhere.test.ts +102 -0
  393. package/src/held-elsewhere.ts +114 -0
  394. package/src/index.ts +3 -0
  395. package/src/kubectl-context.ts +3 -3
  396. package/src/lexicon-config.test.ts +5 -5
  397. package/src/lexicon-config.ts +4 -4
  398. package/src/lexicon-plugin-helpers.ts +1 -1
  399. package/src/lexicon.ts +296 -16
  400. package/src/lifecycle/change-set.test.ts +49 -0
  401. package/src/lifecycle/change-set.ts +67 -0
  402. package/src/lifecycle/converge-ledger.ts +1 -1
  403. package/src/lifecycle/deep-diff.test.ts +267 -14
  404. package/src/lifecycle/deep-diff.ts +217 -14
  405. package/src/lifecycle/deep-observe.test.ts +3 -1
  406. package/src/lifecycle/deep-observe.ts +16 -6
  407. package/src/lifecycle/gate-ledger.test.ts +74 -2
  408. package/src/lifecycle/gate-ledger.ts +154 -36
  409. package/src/lifecycle/index.ts +1 -0
  410. package/src/lifecycle/release-ledger.ts +2 -2
  411. package/src/lifecycle/run-ledger.test.ts +268 -0
  412. package/src/lifecycle/run-ledger.ts +201 -0
  413. package/src/lifecycle/symptoms.ts +3 -3
  414. package/src/lint/config.test.ts +82 -1
  415. package/src/lint/config.ts +112 -3
  416. package/src/lint/pipeline-change-gate.test.ts +2 -2
  417. package/src/lint/policy.test.ts +1 -1
  418. package/src/lint/post-synth.test.ts +31 -0
  419. package/src/lint/post-synth.ts +54 -1
  420. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
  421. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
  422. package/src/lint/rules/comp/comp.test.ts +27 -1
  423. package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +76 -0
  424. package/src/lint/rules/comp/index.ts +3 -3
  425. package/src/lint/rules/op/index.ts +23 -0
  426. package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
  427. package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
  428. package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
  429. package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
  430. package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
  431. package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
  432. package/src/lint/rules/op/support.ts +11 -0
  433. package/src/lint/suppressions.test.ts +163 -0
  434. package/src/lint/suppressions.ts +204 -0
  435. package/src/live-endpoint.ts +1 -1
  436. package/src/op/activities/activity-contracts.ts +66 -0
  437. package/src/op/activities/apply.test.ts +567 -0
  438. package/src/op/activities/apply.ts +662 -0
  439. package/src/op/activities/build.ts +26 -0
  440. package/src/op/activities/converge.test.ts +330 -0
  441. package/src/op/activities/converge.ts +449 -0
  442. package/src/op/activities/env-teardown.test.ts +187 -0
  443. package/src/op/activities/env-teardown.ts +171 -0
  444. package/src/op/activities/guard-validate.test.ts +139 -0
  445. package/src/op/activities/guard-validate.ts +223 -0
  446. package/src/op/activities/http-check.test.ts +48 -0
  447. package/src/op/activities/http-check.ts +55 -0
  448. package/src/op/activities/index.ts +119 -0
  449. package/src/op/activities/lexicon-upgrade.test.ts +492 -0
  450. package/src/op/activities/lexicon-upgrade.ts +673 -0
  451. package/src/op/activities/lifecycle.ts +85 -0
  452. package/src/op/activities/pipeline-audit.test.ts +67 -0
  453. package/src/op/activities/pipeline-audit.ts +201 -0
  454. package/src/op/activities/policy.test.ts +19 -0
  455. package/src/op/activities/policy.ts +37 -0
  456. package/src/op/activities/reconcile.test.ts +161 -0
  457. package/src/op/activities/reconcile.ts +354 -0
  458. package/src/op/activities/shell.ts +26 -0
  459. package/src/op/activities/teardown.ts +22 -0
  460. package/src/op/activities/util.ts +6 -0
  461. package/src/op/activities/wait.ts +69 -0
  462. package/src/op/activities/workflow-audit.test.ts +90 -0
  463. package/src/op/activities/workflow-audit.ts +203 -0
  464. package/src/op/activity-contract-registry.test.ts +98 -0
  465. package/src/op/activity-contract-registry.ts +114 -0
  466. package/src/op/activity-contract.test.ts +1 -1
  467. package/src/op/activity-contract.ts +37 -33
  468. package/src/op/activity-failure.ts +34 -0
  469. package/src/op/activity-profiles.test.ts +56 -0
  470. package/src/op/activity-profiles.ts +116 -0
  471. package/src/op/activity-registry.test.ts +37 -28
  472. package/src/op/activity-registry.ts +27 -56
  473. package/src/op/activity-runtime.ts +3 -47
  474. package/src/op/builders-exports.test.ts +0 -49
  475. package/src/op/builders-typed.test.ts +164 -0
  476. package/src/op/builders.ts +125 -41
  477. package/src/op/change-signal.test.ts +117 -0
  478. package/src/op/change-signal.ts +169 -0
  479. package/src/op/composites/apply-op.ts +218 -0
  480. package/src/op/composites/composites.test.ts +379 -0
  481. package/src/op/composites/converge-op.test.ts +168 -0
  482. package/src/op/composites/converge-op.ts +214 -0
  483. package/src/op/composites/index.ts +26 -0
  484. package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
  485. package/src/op/composites/lexicon-upgrade-op.ts +134 -0
  486. package/src/op/composites/pipeline-audit-op.test.ts +25 -0
  487. package/src/op/composites/pipeline-audit-op.ts +78 -0
  488. package/src/op/composites/reconcile-op.test.ts +51 -0
  489. package/src/op/composites/reconcile-op.ts +110 -0
  490. package/src/op/composites/watch-op.ts +108 -0
  491. package/src/op/composites/workflow-audit-op.test.ts +25 -0
  492. package/src/op/composites/workflow-audit-op.ts +88 -0
  493. package/src/op/converge-rule.ts +12 -10
  494. package/src/op/cron.test.ts +128 -0
  495. package/src/op/cron.ts +149 -0
  496. package/src/op/discover-root.test.ts +105 -1
  497. package/src/op/discover.test.ts +6 -2
  498. package/src/op/discover.ts +84 -16
  499. package/src/op/duration.ts +21 -0
  500. package/src/op/effect-step.test.ts +29 -14
  501. package/src/op/emulator-lifecycle.ts +1 -2
  502. package/src/op/gate-name.test.ts +65 -0
  503. package/src/op/gate-name.ts +60 -0
  504. package/src/op/gate-summary.ts +84 -0
  505. package/src/op/gate.ts +155 -0
  506. package/src/op/generate-pipeline.test.ts +65 -3
  507. package/src/op/generate-pipeline.ts +19 -2
  508. package/src/op/index.ts +48 -8
  509. package/src/op/local-executor.test.ts +178 -34
  510. package/src/op/local-executor.ts +371 -102
  511. package/src/op/local-output.test.ts +95 -11
  512. package/src/op/local-output.ts +33 -4
  513. package/src/op/op-ir.test.ts +292 -0
  514. package/src/op/op-ir.ts +419 -0
  515. package/src/op/op-verb-class.test.ts +2 -2
  516. package/src/op/op-verb-class.ts +19 -5
  517. package/src/op/op.test.ts +28 -7
  518. package/src/op/operator.test.ts +543 -6
  519. package/src/op/operator.ts +203 -20
  520. package/src/op/receipt-store.ts +1 -1
  521. package/src/op/resource.ts +20 -2
  522. package/src/op/runtime.ts +203 -0
  523. package/src/op/runtimes/local.test.ts +181 -0
  524. package/src/op/runtimes/local.ts +212 -0
  525. package/src/op/step-output-ref.ts +15 -13
  526. package/src/op/types.ts +106 -26
  527. package/src/ownership.ts +1 -1
  528. package/src/provenance.test.ts +6 -0
  529. package/src/provenance.ts +21 -1
  530. package/src/serializer-walker.test.ts +42 -0
  531. package/src/serializer-walker.ts +21 -2
  532. package/src/terraform/aws-resources.test.ts +13 -4
  533. package/src/terraform/bridge.test.ts +22 -9
  534. package/src/terraform/bridge.ts +89 -28
  535. package/src/terraform/carve-provider.ts +38 -2
  536. package/src/terraform/data-source-shape.ts +95 -0
  537. package/src/terraform/graph.ts +35 -7
  538. package/src/terraform/providers/kubernetes.ts +48 -2
  539. package/src/terraform/tier-map.ts +21 -6
  540. package/src/terraform/types.ts +8 -0
  541. package/dist/cli/handlers/op-progress.d.ts +0 -90
  542. package/dist/cli/handlers/op-progress.d.ts.map +0 -1
  543. package/dist/cli/handlers/run-client.d.ts +0 -127
  544. package/dist/cli/handlers/run-client.d.ts.map +0 -1
  545. package/dist/cli/handlers/run-report.d.ts +0 -5
  546. package/dist/cli/handlers/run-report.d.ts.map +0 -1
  547. package/dist/components/temporal-codegen-loader.d.ts +0 -27
  548. package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
  549. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
  550. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
  551. package/src/cli/handlers/op-progress.test.ts +0 -268
  552. package/src/cli/handlers/op-progress.ts +0 -248
  553. package/src/cli/handlers/run-client.test.ts +0 -82
  554. package/src/cli/handlers/run-client.ts +0 -219
  555. package/src/cli/handlers/run-report.test.ts +0 -62
  556. package/src/cli/handlers/run-report.ts +0 -122
  557. package/src/components/temporal-codegen-loader.ts +0 -41
  558. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
@@ -1,268 +0,0 @@
1
- import { describe, test, expect } from "vitest";
2
- import { extractStepRecords, extractIndexedStepRecords, stepRecordEmitter, countActivities, queryGateState } from "./op-progress";
3
- import type { StepRecord } from "../../op/local-executor";
4
- import type { OpConfig } from "../../op/types";
5
- import type { EffectReceiptRef } from "../../op/receipt-store";
6
- import type { WorkflowHistoryRaw, HistoryEvent } from "./run-client";
7
-
8
- // Minimal history-event builders. Field shapes match what `fetchNormalizedHistory`
9
- // produces: short PascalCase `eventType`, decimal-string `eventId`/`scheduledEventId`.
10
- function scheduled(eventId: string, fn: string, at: Date): HistoryEvent {
11
- return {
12
- eventId,
13
- eventType: "ActivityTaskScheduled",
14
- eventTime: at,
15
- activityTaskScheduledEventAttributes: { activityId: eventId, activityType: { name: fn } },
16
- };
17
- }
18
- function completed(scheduledEventId: string, at: Date): HistoryEvent {
19
- return {
20
- eventType: "ActivityTaskCompleted",
21
- eventTime: at,
22
- activityTaskCompletedEventAttributes: { scheduledEventId },
23
- };
24
- }
25
- function failed(scheduledEventId: string, at: Date, message = "boom"): HistoryEvent {
26
- return {
27
- eventType: "ActivityTaskFailed",
28
- eventTime: at,
29
- activityTaskFailedEventAttributes: { scheduledEventId, failure: { message } },
30
- };
31
- }
32
-
33
- const T0 = new Date("2026-05-01T00:00:00Z");
34
- const sec = (n: number) => new Date(T0.getTime() + n * 1000);
35
-
36
- describe("extractStepRecords", () => {
37
- test("joins two phases' activities to their declared phase, in order", () => {
38
- const config: OpConfig = {
39
- name: "op", overview: "o",
40
- phases: [
41
- { name: "Build", steps: [{ kind: "activity", fn: "build" }] },
42
- { name: "Deploy", steps: [{ kind: "activity", fn: "deploy" }] },
43
- ],
44
- };
45
- const history: WorkflowHistoryRaw = {
46
- events: [
47
- scheduled("1", "build", sec(0)),
48
- completed("1", sec(1)),
49
- scheduled("2", "deploy", sec(2)),
50
- completed("2", sec(4)),
51
- ],
52
- };
53
- const records = extractStepRecords(config, history);
54
- expect(records).toEqual([
55
- { phase: "Build", fn: "build", status: "ok", durationMs: 1000 },
56
- { phase: "Deploy", fn: "deploy", status: "ok", durationMs: 2000 },
57
- ]);
58
- });
59
-
60
- test("two steps calling the same activity each get their own scheduled event (no last-wins collision)", () => {
61
- const config: OpConfig = {
62
- name: "op", overview: "o",
63
- phases: [{ name: "P1", steps: [{ kind: "activity", fn: "dup" }, { kind: "activity", fn: "dup" }] }],
64
- };
65
- const history: WorkflowHistoryRaw = {
66
- events: [
67
- scheduled("1", "dup", sec(0)),
68
- completed("1", sec(1)), // first "dup": 1000ms, ok
69
- scheduled("2", "dup", sec(1)),
70
- failed("2", sec(1.5), "second dup failed"), // second "dup": fails
71
- ],
72
- };
73
- const records = extractStepRecords(config, history);
74
- expect(records).toEqual([
75
- { phase: "P1", fn: "dup", status: "ok", durationMs: 1000 },
76
- { phase: "P1", fn: "dup", status: "fail", durationMs: 500, error: "second dup failed" },
77
- ]);
78
- });
79
-
80
- test("a step not yet scheduled produces no record unless final", () => {
81
- const config: OpConfig = {
82
- name: "op", overview: "o",
83
- phases: [
84
- { name: "P1", steps: [{ kind: "activity", fn: "a" }] },
85
- { name: "P2", steps: [{ kind: "activity", fn: "b" }] },
86
- ],
87
- };
88
- const history: WorkflowHistoryRaw = { events: [scheduled("1", "a", sec(0)), completed("1", sec(1))] };
89
-
90
- expect(extractStepRecords(config, history)).toEqual([
91
- { phase: "P1", fn: "a", status: "ok", durationMs: 1000 },
92
- ]);
93
- expect(extractStepRecords(config, history, { final: true })).toEqual([
94
- { phase: "P1", fn: "a", status: "ok", durationMs: 1000 },
95
- { phase: "P2", fn: "b", status: "skipped", durationMs: 0 },
96
- ]);
97
- });
98
-
99
- test("a scheduled-but-not-yet-settled step produces no record", () => {
100
- const config: OpConfig = {
101
- name: "op", overview: "o",
102
- phases: [{ name: "P1", steps: [{ kind: "activity", fn: "a" }] }],
103
- };
104
- const history: WorkflowHistoryRaw = { events: [scheduled("1", "a", sec(0))] };
105
- expect(extractStepRecords(config, history)).toEqual([]);
106
- });
107
-
108
- test("a retried activity resolves to its last outcome (Failed attempt then eventual Completed)", () => {
109
- const config: OpConfig = {
110
- name: "op", overview: "o",
111
- phases: [{ name: "P1", steps: [{ kind: "activity", fn: "flaky" }] }],
112
- };
113
- const history: WorkflowHistoryRaw = {
114
- events: [
115
- scheduled("1", "flaky", sec(0)),
116
- failed("1", sec(1), "attempt 1 failed"),
117
- completed("1", sec(3)), // eventual success
118
- ],
119
- };
120
- expect(extractStepRecords(config, history)).toEqual([
121
- { phase: "P1", fn: "flaky", status: "ok", durationMs: 3000 },
122
- ]);
123
- });
124
-
125
- test("effect step: matched receipt — only receiptRead settles; nested + receiptWrite are skipped only when final", () => {
126
- const receipt: EffectReceiptRef = { name: "r", effect: "e", flavor: "existence", inputs: {} };
127
- const config: OpConfig = {
128
- name: "op", overview: "o",
129
- phases: [{
130
- name: "Effect",
131
- steps: [{ kind: "effect", receipt, steps: [{ kind: "activity", fn: "applyIt" }] }],
132
- }],
133
- };
134
- const history: WorkflowHistoryRaw = {
135
- events: [scheduled("1", "receiptRead", sec(0)), completed("1", sec(1))],
136
- };
137
- expect(extractStepRecords(config, history)).toEqual([
138
- { phase: "Effect", fn: "receiptRead", status: "ok", durationMs: 1000 },
139
- ]);
140
- expect(extractStepRecords(config, history, { final: true })).toEqual([
141
- { phase: "Effect", fn: "receiptRead", status: "ok", durationMs: 1000 },
142
- { phase: "Effect", fn: "applyIt", status: "skipped", durationMs: 0 },
143
- { phase: "Effect", fn: "receiptWrite", status: "skipped", durationMs: 0 },
144
- ]);
145
- });
146
-
147
- test("onFailure phases are matched in reverse declared order, matching how the workflow actually runs them", () => {
148
- const config: OpConfig = {
149
- name: "op", overview: "o",
150
- phases: [{ name: "Main", steps: [{ kind: "activity", fn: "boom" }] }],
151
- onFailure: [
152
- { name: "C1", steps: [{ kind: "activity", fn: "comp1" }] },
153
- { name: "C2", steps: [{ kind: "activity", fn: "comp2" }] },
154
- ],
155
- };
156
- const history: WorkflowHistoryRaw = {
157
- events: [
158
- scheduled("1", "boom", sec(0)),
159
- failed("1", sec(1), "boom"),
160
- // Compensation runs C2 then C1 (reverse of declared order).
161
- scheduled("2", "comp2", sec(2)),
162
- completed("2", sec(3)),
163
- scheduled("3", "comp1", sec(3)),
164
- completed("3", sec(4)),
165
- ],
166
- };
167
- expect(extractStepRecords(config, history)).toEqual([
168
- { phase: "Main", fn: "boom", status: "fail", durationMs: 1000, error: "boom" },
169
- { phase: "C2", fn: "comp2", status: "ok", durationMs: 1000 },
170
- { phase: "C1", fn: "comp1", status: "ok", durationMs: 1000 },
171
- ]);
172
- });
173
- });
174
-
175
- describe("stepRecordEmitter", () => {
176
- // chant #2032. Declared order is main phases then `onFailure` reversed, so an
177
- // unreached main phase sits *before* an `onFailure` phase that ran. The live
178
- // poll therefore returns [Main(fail), Comp(ok)] and the terminal `final: true`
179
- // pass returns [Main(fail), Never(skipped), Comp(ok)] — an insertion, not an
180
- // append. The old emitted-count watermark sliced at 2 and re-shipped Comp
181
- // while dropping Never entirely. The #1676 coverage above misses this because
182
- // in those configs the skipped record lands last, where insert and append are
183
- // the same operation.
184
- const config: OpConfig = {
185
- name: "op", overview: "o",
186
- phases: [
187
- { name: "Main", steps: [{ kind: "activity", fn: "boom" }] },
188
- { name: "Never", steps: [{ kind: "activity", fn: "never" }] },
189
- ],
190
- onFailure: [{ name: "Comp", steps: [{ kind: "activity", fn: "comp" }] }],
191
- };
192
- // Main fails, Never is never reached, compensation runs and succeeds.
193
- const history: WorkflowHistoryRaw = {
194
- events: [
195
- scheduled("1", "boom", sec(0)),
196
- failed("1", sec(1), "boom"),
197
- scheduled("2", "comp", sec(2)),
198
- completed("2", sec(3)),
199
- ],
200
- };
201
-
202
- const MAIN: StepRecord = { phase: "Main", fn: "boom", status: "fail", durationMs: 1000, error: "boom" };
203
- const NEVER: StepRecord = { phase: "Never", fn: "never", status: "skipped", durationMs: 0 };
204
- const COMP: StepRecord = { phase: "Comp", fn: "comp", status: "ok", durationMs: 1000 };
205
-
206
- test("the final pass inserts rather than appends, so list position is not an identity", () => {
207
- expect(extractIndexedStepRecords(config, history)).toEqual([
208
- { index: 0, record: MAIN },
209
- { index: 2, record: COMP },
210
- ]);
211
- expect(extractIndexedStepRecords(config, history, { final: true })).toEqual([
212
- { index: 0, record: MAIN },
213
- { index: 1, record: NEVER },
214
- { index: 2, record: COMP },
215
- ]);
216
- });
217
-
218
- test("each record ships exactly once across the poll passes and the final pass", () => {
219
- const emitted: StepRecord[] = [];
220
- const emit = stepRecordEmitter((r) => emitted.push(r));
221
-
222
- emit(extractIndexedStepRecords(config, history)); // a poll while the workflow closes
223
- emit(extractIndexedStepRecords(config, history)); // an identical re-poll adds nothing
224
- emit(extractIndexedStepRecords(config, history, { final: true }));
225
-
226
- expect(emitted).toEqual([MAIN, COMP, NEVER]);
227
- });
228
-
229
- test("an empty first poll does not shift what a later pass ships", () => {
230
- const emitted: StepRecord[] = [];
231
- const emit = stepRecordEmitter((r) => emitted.push(r));
232
-
233
- emit(extractIndexedStepRecords(config, { events: [] }));
234
- expect(emitted).toEqual([]);
235
- emit(extractIndexedStepRecords(config, history, { final: true }));
236
- expect(emitted).toEqual([MAIN, NEVER, COMP]);
237
- });
238
- });
239
-
240
- describe("countActivities", () => {
241
- test("counts scheduled and completed events", () => {
242
- const history: WorkflowHistoryRaw = {
243
- events: [scheduled("1", "a", sec(0)), scheduled("2", "b", sec(0)), completed("1", sec(1))],
244
- };
245
- expect(countActivities(history)).toEqual({ completed: 1, scheduled: 2 });
246
- });
247
-
248
- test("empty history", () => {
249
- expect(countActivities({})).toEqual({ completed: 0, scheduled: 0 });
250
- });
251
- });
252
-
253
- describe("queryGateState", () => {
254
- test("returns the query result when the handle supports it", async () => {
255
- const handle = { query: async () => ({ signalName: "g", since: "t" }) } as unknown as Parameters<typeof queryGateState>[0];
256
- expect(await queryGateState(handle)).toEqual({ signalName: "g", since: "t" });
257
- });
258
-
259
- test("returns null when the workflow reports no pending gate", async () => {
260
- const handle = { query: async () => null } as unknown as Parameters<typeof queryGateState>[0];
261
- expect(await queryGateState(handle)).toBeNull();
262
- });
263
-
264
- test("returns undefined (not an error) when the query isn't registered — e.g. an Op with no gates", async () => {
265
- const handle = { query: async () => { throw new Error("unregistered query"); } } as unknown as Parameters<typeof queryGateState>[0];
266
- expect(await queryGateState(handle)).toBeUndefined();
267
- });
268
- });
@@ -1,248 +0,0 @@
1
- /**
2
- * Per-phase progress reconstructed from a Temporal Op workflow's history
3
- * (chant #1676) — the durable-path counterpart to the local executor's
4
- * `StepRecord[]` (op/local-executor.ts), so `chant run <name> --temporal
5
- * --progress-json` and `op-status` can report the same shape `chant run
6
- * <name> --json` already does for the local path, instead of the two raw
7
- * `ActivityTaskScheduled`/`ActivityTaskCompleted` counts.
8
- *
9
- * A step is joined to its declared (phase, fn) by position, not by name: the
10
- * declared step list (`declaredStepOrder`, mirroring the serializer's own
11
- * `collectActivitySteps` traversal — main phases, then `onFailure` phases
12
- * *reversed*, matching how the generated workflow actually runs them) is
13
- * walked in order, and each step consumes the next not-yet-consumed
14
- * `ActivityTaskScheduled` event whose activity type matches its `fn` — a
15
- * per-fn FIFO queue, not a global "does this name appear anywhere" scan.
16
- * Two steps calling the same activity therefore each get their own
17
- * scheduled event instead of the later one overwriting the earlier
18
- * (the collision the prior `run-report.ts` join had). A step whose queue is
19
- * empty never ran this execution — an untaken effect branch, or an
20
- * `onFailure` phase on a run that succeeded.
21
- */
22
-
23
- import type { OpConfig, PhaseDefinition } from "../../op/types";
24
- import type { StepRecord } from "../../op/local-executor";
25
- import type { WorkflowHistoryRaw, HistoryEvent, WorkflowHandleRaw } from "./run-client";
26
-
27
- // Synthesized step names an effect step's read-compare-run-write compiles
28
- // to (lexicons/temporal/src/op/serializer.ts's RECEIPT_READ_STEP/
29
- // RECEIPT_WRITE_STEP) — duplicated here rather than imported so this module
30
- // stays lexicon-free, same constraint as op/local-executor.ts.
31
- const RECEIPT_READ_FN = "receiptRead";
32
- const RECEIPT_WRITE_FN = "receiptWrite";
33
-
34
- interface DeclaredStep {
35
- phase: string;
36
- fn: string;
37
- }
38
-
39
- function flattenPhases(phases: PhaseDefinition[]): DeclaredStep[] {
40
- const out: DeclaredStep[] = [];
41
- for (const phase of phases) {
42
- for (const step of phase.steps) {
43
- if (step.kind === "activity") {
44
- out.push({ phase: phase.name, fn: step.fn });
45
- } else if (step.kind === "effect") {
46
- out.push({ phase: phase.name, fn: RECEIPT_READ_FN });
47
- for (const nested of step.steps) {
48
- if (nested.kind === "activity") out.push({ phase: phase.name, fn: nested.fn });
49
- }
50
- out.push({ phase: phase.name, fn: RECEIPT_WRITE_FN });
51
- }
52
- // Gate steps schedule no activity — nothing to join them to.
53
- }
54
- }
55
- return out;
56
- }
57
-
58
- /** Declared order matching actual scheduling order: main phases, then `onFailure` reversed (compensation runs last-declared-first — serializer.ts's `renderPhases([...config.onFailure].reverse())`). */
59
- function declaredStepOrder(config: OpConfig): DeclaredStep[] {
60
- return [...flattenPhases(config.phases), ...flattenPhases([...(config.onFailure ?? [])].reverse())];
61
- }
62
-
63
- interface ScheduledEntry {
64
- scheduledEventId: string;
65
- scheduledAt?: Date;
66
- }
67
-
68
- /** Every `ActivityTaskScheduled` event, grouped by activity type name, in chronological order. */
69
- function scheduledQueues(events: HistoryEvent[]): Map<string, ScheduledEntry[]> {
70
- const byFn = new Map<string, ScheduledEntry[]>();
71
- for (const e of events) {
72
- if (e.eventType !== "ActivityTaskScheduled") continue;
73
- const attrs = e.activityTaskScheduledEventAttributes;
74
- if (!attrs) continue;
75
- const fn = attrs.activityType?.name ?? "unknown";
76
- if (!byFn.has(fn)) byFn.set(fn, []);
77
- byFn.get(fn)!.push({ scheduledEventId: e.eventId ?? "", scheduledAt: e.eventTime });
78
- }
79
- return byFn;
80
- }
81
-
82
- interface TerminalOutcome {
83
- status: "ok" | "fail";
84
- at?: Date;
85
- error?: string;
86
- }
87
-
88
- /**
89
- * The terminal outcome of each scheduled activity, keyed by the scheduling
90
- * event's own id. A retried activity emits one `ActivityTaskFailed` per
91
- * attempt under the same `scheduledEventId`; walking events in order and
92
- * always overwriting on a later event leaves whichever came last —
93
- * `ActivityTaskCompleted` on an eventual success, otherwise the final
94
- * attempt's failure.
95
- */
96
- function terminalOutcomes(events: HistoryEvent[]): Map<string, TerminalOutcome> {
97
- const out = new Map<string, TerminalOutcome>();
98
- for (const e of events) {
99
- if (e.eventType === "ActivityTaskCompleted" && e.activityTaskCompletedEventAttributes) {
100
- const id = e.activityTaskCompletedEventAttributes.scheduledEventId;
101
- if (id) out.set(id, { status: "ok", at: e.eventTime });
102
- } else if (e.eventType === "ActivityTaskFailed" && e.activityTaskFailedEventAttributes) {
103
- const id = e.activityTaskFailedEventAttributes.scheduledEventId;
104
- if (id) {
105
- out.set(id, {
106
- status: "fail",
107
- at: e.eventTime,
108
- error: e.activityTaskFailedEventAttributes.failure?.message ?? "unknown error",
109
- });
110
- }
111
- }
112
- }
113
- return out;
114
- }
115
-
116
- /**
117
- * A step record paired with the position of the declared step it came from.
118
- *
119
- * `index` is an offset into `declaredStepOrder(config)`, which depends only
120
- * on the Op config — not on the history — so it is the record's identity
121
- * and is stable across polls. The record *list* is not: a mid-run poll omits
122
- * every step that hasn't settled yet, and the terminal `final: true` pass
123
- * inserts a `"skipped"` record at each such step's declared position, which
124
- * shifts every later record's list offset (chant #2032). Anything tracking
125
- * what it has already seen must key on `index`, never on how many records
126
- * the previous call returned.
127
- */
128
- export interface IndexedStepRecord {
129
- index: number;
130
- record: StepRecord;
131
- }
132
-
133
- /**
134
- * Reconstruct per-step progress records from a workflow's history, in
135
- * declared order, each tagged with its declared-step `index`. Only settled
136
- * steps (matched to a scheduled event that has since completed or failed)
137
- * produce a record — a step that hasn't been scheduled yet simply isn't in
138
- * the result. Pass `final: true` once the workflow has reached a terminal
139
- * status to also emit a `"skipped"` record for every declared step that
140
- * never got a matching scheduled event (an untaken effect branch, or an
141
- * `onFailure` phase on a run that succeeded) — never before, or a
142
- * still-running Op would show its not-yet-reached steps as skipped.
143
- */
144
- export function extractIndexedStepRecords(
145
- config: OpConfig,
146
- history: WorkflowHistoryRaw,
147
- opts: { final?: boolean } = {},
148
- ): IndexedStepRecord[] {
149
- const events = history.events ?? [];
150
- const queues = scheduledQueues(events);
151
- const terminals = terminalOutcomes(events);
152
- const nextIndex = new Map<string, number>();
153
-
154
- const records: IndexedStepRecord[] = [];
155
- const declared = declaredStepOrder(config);
156
- for (let index = 0; index < declared.length; index++) {
157
- const step = declared[index];
158
- const queue = queues.get(step.fn);
159
- const idx = nextIndex.get(step.fn) ?? 0;
160
- const entry = queue?.[idx];
161
- if (!entry) {
162
- if (opts.final) {
163
- records.push({ index, record: { phase: step.phase, fn: step.fn, status: "skipped", durationMs: 0 } });
164
- }
165
- continue;
166
- }
167
- nextIndex.set(step.fn, idx + 1);
168
-
169
- const terminal = terminals.get(entry.scheduledEventId);
170
- if (!terminal) continue; // scheduled but not yet settled
171
-
172
- const durationMs =
173
- entry.scheduledAt && terminal.at ? terminal.at.getTime() - entry.scheduledAt.getTime() : 0;
174
- records.push({
175
- index,
176
- record: {
177
- phase: step.phase,
178
- fn: step.fn,
179
- status: terminal.status,
180
- durationMs,
181
- ...(terminal.error ? { error: terminal.error } : {}),
182
- },
183
- });
184
- }
185
- return records;
186
- }
187
-
188
- /** `extractIndexedStepRecords` without the indices — the plain declared-order record list. */
189
- export function extractStepRecords(
190
- config: OpConfig,
191
- history: WorkflowHistoryRaw,
192
- opts: { final?: boolean } = {},
193
- ): StepRecord[] {
194
- return extractIndexedStepRecords(config, history, opts).map((r) => r.record);
195
- }
196
-
197
- /**
198
- * A sink that forwards each declared step's record exactly once, however many
199
- * times the poll loop re-derives the list.
200
- *
201
- * `--progress-json` calls this per poll with the whole list so far, plus once
202
- * more with the terminal `final: true` list. Deduplicating by declared-step
203
- * `index` is what makes that safe: an emitted-count watermark assumed the list
204
- * was append-only, and the `final` pass's inserted `"skipped"` records break
205
- * that assumption — with an unreached phase declared before an `onFailure`
206
- * phase that ran, the insertion shifted the tail, so the last record shipped
207
- * twice and the skipped one never shipped at all (chant #2032).
208
- */
209
- export function stepRecordEmitter(emit: (record: StepRecord) => void): (records: IndexedStepRecord[]) => void {
210
- const seen = new Set<number>();
211
- return (records) => {
212
- for (const { index, record } of records) {
213
- if (seen.has(index)) continue;
214
- seen.add(index);
215
- emit(record);
216
- }
217
- };
218
- }
219
-
220
- /** `{completed, scheduled}` activity counts for the summary line `chant run status`/`op-status` show alongside the full record list. */
221
- export function countActivities(history: WorkflowHistoryRaw): { completed: number; scheduled: number } {
222
- const events = history.events ?? [];
223
- return {
224
- completed: events.filter((e) => e.eventType === "ActivityTaskCompleted").length,
225
- scheduled: events.filter((e) => e.eventType === "ActivityTaskScheduled").length,
226
- };
227
- }
228
-
229
- /** The `gateState` workflow query's result (op/serializer.ts's `emitGate`) — the gate currently blocking the workflow, or `null` when none is pending. */
230
- export interface GateQueryResult {
231
- signalName: string;
232
- description?: string;
233
- since: string;
234
- }
235
-
236
- /**
237
- * Best-effort `gateState` query. `undefined` (as opposed to `null`) means
238
- * the query itself failed — an Op with no gate steps never registers a
239
- * `gateState` handler, so querying it is expected to fail, not an error
240
- * worth surfacing.
241
- */
242
- export async function queryGateState(handle: WorkflowHandleRaw): Promise<GateQueryResult | null | undefined> {
243
- try {
244
- return await handle.query<GateQueryResult | null>("gateState");
245
- } catch {
246
- return undefined;
247
- }
248
- }
@@ -1,82 +0,0 @@
1
- import { describe, test, expect } from "vitest";
2
- import { fetchNormalizedHistory, type WorkflowHandleRaw } from "./run-client";
3
-
4
- /**
5
- * `@temporalio/client`'s `WorkflowHandle.fetchHistory()` returns the raw
6
- * Temporal wire proto: `eventType` a numeric enum, `eventId`/
7
- * `scheduledEventId` protobuf `Long` instances, `eventTime` a
8
- * `{seconds, nanos}` Timestamp. What turns those into the friendly
9
- * `"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED"` string / decimal strings is the
10
- * proto message's own `toJSON()` — confirmed against a real
11
- * `TestWorkflowEnvironment` run (Temporal SDK 1.17.2) during development.
12
- * These fixtures simulate exactly that: plain values by default, but with a
13
- * `toJSON()` on the fields that have one on the wire, so a JSON round-trip
14
- * behaves the same way it does against a real server.
15
- */
16
- function fakeLong(n: number) {
17
- return { low: n, high: 0, unsigned: false, toJSON: () => String(n) };
18
- }
19
-
20
- function fakeTimestamp(seconds: number, nanos = 0) {
21
- return { seconds: fakeLong(seconds), nanos };
22
- }
23
-
24
- function makeHandle(events: unknown[]): WorkflowHandleRaw {
25
- return {
26
- workflowId: "wf",
27
- async fetchHistory() {
28
- return { events } as never;
29
- },
30
- } as unknown as WorkflowHandleRaw;
31
- }
32
-
33
- describe("fetchNormalizedHistory", () => {
34
- test("converts the raw wire shape to short eventType, decimal eventId, and a real Date", async () => {
35
- const raw = {
36
- eventId: fakeLong(7),
37
- eventTime: fakeTimestamp(1_788_000_000, 500_000_000),
38
- eventType: "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED",
39
- activityTaskScheduledEventAttributes: {
40
- activityId: "1",
41
- activityType: { name: "dup" },
42
- },
43
- };
44
- const history = await fetchNormalizedHistory(makeHandle([raw]));
45
- const event = history.events?.[0];
46
- expect(event?.eventType).toBe("ActivityTaskScheduled");
47
- expect(event?.eventId).toBe("7");
48
- expect(event?.eventTime).toBeInstanceOf(Date);
49
- expect(event?.eventTime?.getTime()).toBe(1_788_000_000_500);
50
- expect(event?.activityTaskScheduledEventAttributes).toEqual({ activityId: "1", activityType: { name: "dup" } });
51
- });
52
-
53
- test("ActivityTaskCompleted's scheduledEventId round-trips to a decimal string, joinable against eventId", async () => {
54
- const scheduled = {
55
- eventId: fakeLong(7),
56
- eventType: "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED",
57
- activityTaskScheduledEventAttributes: { activityId: "1", activityType: { name: "dup" } },
58
- };
59
- const completedEvent = {
60
- eventId: fakeLong(9),
61
- eventType: "EVENT_TYPE_ACTIVITY_TASK_COMPLETED",
62
- activityTaskCompletedEventAttributes: { scheduledEventId: fakeLong(7) },
63
- };
64
- const history = await fetchNormalizedHistory(makeHandle([scheduled, completedEvent]));
65
- expect(history.events?.[0].eventId).toBe(history.events?.[1].activityTaskCompletedEventAttributes?.scheduledEventId);
66
- });
67
-
68
- test("a short PascalCase eventType (already-normalized test fixture data) passes through unchanged", async () => {
69
- const history = await fetchNormalizedHistory(makeHandle([{ eventType: "ActivityTaskScheduled" }]));
70
- expect(history.events?.[0].eventType).toBe("ActivityTaskScheduled");
71
- });
72
-
73
- test("an ISO eventTime string (already-normalized data) round-trips to the same instant", async () => {
74
- const history = await fetchNormalizedHistory(makeHandle([{ eventTime: "2026-05-01T00:00:00.000Z" }]));
75
- expect(history.events?.[0].eventTime?.toISOString()).toBe("2026-05-01T00:00:00.000Z");
76
- });
77
-
78
- test("no events → empty array, not an error", async () => {
79
- const history = await fetchNormalizedHistory(makeHandle([]));
80
- expect(history.events).toEqual([]);
81
- });
82
- });