@intentius/chant 0.56.0 → 0.58.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 (515) 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 +20 -1
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts +14 -8
  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/check-lexicon-docs.d.ts +1 -1
  34. package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
  35. package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
  36. package/dist/cli/commands/import.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.map +1 -1
  44. package/dist/cli/commands/onboard.d.ts +2 -0
  45. package/dist/cli/commands/onboard.d.ts.map +1 -1
  46. package/dist/cli/handlers/build.d.ts.map +1 -1
  47. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  48. package/dist/cli/handlers/operator.d.ts +82 -16
  49. package/dist/cli/handlers/operator.d.ts.map +1 -1
  50. package/dist/cli/handlers/run.d.ts +49 -42
  51. package/dist/cli/handlers/run.d.ts.map +1 -1
  52. package/dist/cli/main.d.ts +28 -1
  53. package/dist/cli/main.d.ts.map +1 -1
  54. package/dist/cli/mcp/op-tools.d.ts +16 -1
  55. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  56. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  57. package/dist/cli/mcp/resources/context.d.ts.map +1 -1
  58. package/dist/cli/registry.d.ts +26 -9
  59. package/dist/cli/registry.d.ts.map +1 -1
  60. package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
  61. package/dist/components/auto-release.d.ts +10 -20
  62. package/dist/components/auto-release.d.ts.map +1 -1
  63. package/dist/components/capability.d.ts +4 -4
  64. package/dist/components/cli-support.d.ts +20 -21
  65. package/dist/components/cli-support.d.ts.map +1 -1
  66. package/dist/components/component.d.ts +3 -3
  67. package/dist/components/component.d.ts.map +1 -1
  68. package/dist/components/driver-output.d.ts.map +1 -1
  69. package/dist/components/driver.d.ts +66 -36
  70. package/dist/components/driver.d.ts.map +1 -1
  71. package/dist/components/index.d.ts +1 -2
  72. package/dist/components/index.d.ts.map +1 -1
  73. package/dist/components/manifest-persistence.d.ts +1 -9
  74. package/dist/components/manifest-persistence.d.ts.map +1 -1
  75. package/dist/components/run-progress.d.ts +6 -6
  76. package/dist/components/run-progress.d.ts.map +1 -1
  77. package/dist/components/verbs/run-agent.d.ts +9 -15
  78. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  79. package/dist/components/verbs/verify.d.ts +2 -2
  80. package/dist/deep-observation.d.ts +17 -0
  81. package/dist/deep-observation.d.ts.map +1 -1
  82. package/dist/discovery/files.d.ts +4 -4
  83. package/dist/discovery/fold-import.d.ts.map +1 -1
  84. package/dist/discovery/param-deps.d.ts +33 -0
  85. package/dist/discovery/param-deps.d.ts.map +1 -1
  86. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  87. package/dist/discovery/sandbox/config-wire.d.ts +2 -2
  88. package/dist/fold/foldable-helpers.d.ts +5 -1
  89. package/dist/fold/foldable-helpers.d.ts.map +1 -1
  90. package/dist/fold-provenance.d.ts +236 -0
  91. package/dist/fold-provenance.d.ts.map +1 -0
  92. package/dist/graph-ops.d.ts +1 -1
  93. package/dist/held-elsewhere.d.ts +85 -0
  94. package/dist/held-elsewhere.d.ts.map +1 -0
  95. package/dist/import/ir-utils.d.ts +1 -1
  96. package/dist/import/ir-utils.d.ts.map +1 -1
  97. package/dist/import/parser.d.ts +33 -0
  98. package/dist/import/parser.d.ts.map +1 -1
  99. package/dist/index.d.ts +3 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/kubectl-context.d.ts +3 -3
  102. package/dist/lexicon-config.d.ts +4 -4
  103. package/dist/lexicon-plugin-helpers.d.ts +1 -1
  104. package/dist/lexicon.d.ts +104 -14
  105. package/dist/lexicon.d.ts.map +1 -1
  106. package/dist/lifecycle/change-set.d.ts +13 -0
  107. package/dist/lifecycle/change-set.d.ts.map +1 -1
  108. package/dist/lifecycle/deep-diff.d.ts +133 -6
  109. package/dist/lifecycle/deep-diff.d.ts.map +1 -1
  110. package/dist/lifecycle/deep-observe.d.ts.map +1 -1
  111. package/dist/lifecycle/gate-ledger.d.ts +71 -3
  112. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  113. package/dist/lifecycle/index.d.ts +1 -0
  114. package/dist/lifecycle/index.d.ts.map +1 -1
  115. package/dist/lifecycle/release-ledger.d.ts +2 -2
  116. package/dist/lifecycle/run-ledger.d.ts +53 -0
  117. package/dist/lifecycle/run-ledger.d.ts.map +1 -0
  118. package/dist/lifecycle/symptoms.d.ts +3 -3
  119. package/dist/lifecycle/symptoms.d.ts.map +1 -1
  120. package/dist/lint/config.d.ts +81 -2
  121. package/dist/lint/config.d.ts.map +1 -1
  122. package/dist/lint/post-synth.d.ts +55 -2
  123. package/dist/lint/post-synth.d.ts.map +1 -1
  124. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
  125. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
  126. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
  127. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
  128. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
  129. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
  130. package/dist/lint/rules/comp/index.d.ts +1 -1
  131. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  132. package/dist/lint/rules/op/index.d.ts +16 -0
  133. package/dist/lint/rules/op/index.d.ts.map +1 -0
  134. package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
  135. package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
  136. package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
  137. package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
  138. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
  139. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
  140. package/dist/lint/rules/op/support.d.ts +12 -0
  141. package/dist/lint/rules/op/support.d.ts.map +1 -0
  142. package/dist/lint/suppressions.d.ts +108 -0
  143. package/dist/lint/suppressions.d.ts.map +1 -0
  144. package/dist/live-endpoint.d.ts +1 -1
  145. package/dist/op/activities/activity-contracts.d.ts +54 -0
  146. package/dist/op/activities/activity-contracts.d.ts.map +1 -0
  147. package/dist/op/activities/apply.d.ts +262 -0
  148. package/dist/op/activities/apply.d.ts.map +1 -0
  149. package/dist/op/activities/build.d.ts +13 -0
  150. package/dist/op/activities/build.d.ts.map +1 -0
  151. package/dist/op/activities/converge.d.ts +110 -0
  152. package/dist/op/activities/converge.d.ts.map +1 -0
  153. package/dist/op/activities/env-teardown.d.ts +76 -0
  154. package/dist/op/activities/env-teardown.d.ts.map +1 -0
  155. package/dist/op/activities/guard-validate.d.ts +64 -0
  156. package/dist/op/activities/guard-validate.d.ts.map +1 -0
  157. package/dist/op/activities/http-check.d.ts +34 -0
  158. package/dist/op/activities/http-check.d.ts.map +1 -0
  159. package/dist/op/activities/index.d.ts +31 -0
  160. package/dist/op/activities/index.d.ts.map +1 -0
  161. package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
  162. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
  163. package/dist/op/activities/lifecycle.d.ts +42 -0
  164. package/dist/op/activities/lifecycle.d.ts.map +1 -0
  165. package/dist/op/activities/pipeline-audit.d.ts +84 -0
  166. package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
  167. package/dist/op/activities/policy.d.ts +17 -0
  168. package/dist/op/activities/policy.d.ts.map +1 -0
  169. package/dist/op/activities/reconcile.d.ts +89 -0
  170. package/dist/op/activities/reconcile.d.ts.map +1 -0
  171. package/dist/op/activities/shell.d.ts +13 -0
  172. package/dist/op/activities/shell.d.ts.map +1 -0
  173. package/dist/op/activities/teardown.d.ts +10 -0
  174. package/dist/op/activities/teardown.d.ts.map +1 -0
  175. package/dist/op/activities/util.d.ts +7 -0
  176. package/dist/op/activities/util.d.ts.map +1 -0
  177. package/dist/op/activities/wait.d.ts +28 -0
  178. package/dist/op/activities/wait.d.ts.map +1 -0
  179. package/dist/op/activities/workflow-audit.d.ts +92 -0
  180. package/dist/op/activities/workflow-audit.d.ts.map +1 -0
  181. package/dist/op/activity-contract-registry.d.ts +76 -0
  182. package/dist/op/activity-contract-registry.d.ts.map +1 -0
  183. package/dist/op/activity-contract.d.ts +25 -18
  184. package/dist/op/activity-contract.d.ts.map +1 -1
  185. package/dist/op/activity-failure.d.ts +28 -0
  186. package/dist/op/activity-failure.d.ts.map +1 -0
  187. package/dist/op/activity-profiles.d.ts +118 -0
  188. package/dist/op/activity-profiles.d.ts.map +1 -0
  189. package/dist/op/activity-registry.d.ts +22 -38
  190. package/dist/op/activity-registry.d.ts.map +1 -1
  191. package/dist/op/activity-runtime.d.ts +3 -14
  192. package/dist/op/activity-runtime.d.ts.map +1 -1
  193. package/dist/op/builders.d.ts +84 -29
  194. package/dist/op/builders.d.ts.map +1 -1
  195. package/dist/op/composites/apply-op.d.ts +113 -0
  196. package/dist/op/composites/apply-op.d.ts.map +1 -0
  197. package/dist/op/composites/converge-op.d.ts +120 -0
  198. package/dist/op/composites/converge-op.d.ts.map +1 -0
  199. package/dist/op/composites/index.d.ts +26 -0
  200. package/dist/op/composites/index.d.ts.map +1 -0
  201. package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
  202. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
  203. package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
  204. package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
  205. package/dist/op/composites/reconcile-op.d.ts +57 -0
  206. package/dist/op/composites/reconcile-op.d.ts.map +1 -0
  207. package/dist/op/composites/watch-op.d.ts +60 -0
  208. package/dist/op/composites/watch-op.d.ts.map +1 -0
  209. package/dist/op/composites/workflow-audit-op.d.ts +57 -0
  210. package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
  211. package/dist/op/converge-rule.d.ts +12 -10
  212. package/dist/op/converge-rule.d.ts.map +1 -1
  213. package/dist/op/cron.d.ts +51 -0
  214. package/dist/op/cron.d.ts.map +1 -0
  215. package/dist/op/discover.d.ts +9 -0
  216. package/dist/op/discover.d.ts.map +1 -1
  217. package/dist/op/duration.d.ts +11 -0
  218. package/dist/op/duration.d.ts.map +1 -0
  219. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  220. package/dist/op/gate.d.ts +90 -0
  221. package/dist/op/gate.d.ts.map +1 -0
  222. package/dist/op/generate-pipeline.d.ts +9 -0
  223. package/dist/op/generate-pipeline.d.ts.map +1 -1
  224. package/dist/op/index.d.ts +23 -7
  225. package/dist/op/index.d.ts.map +1 -1
  226. package/dist/op/local-executor.d.ts +114 -28
  227. package/dist/op/local-executor.d.ts.map +1 -1
  228. package/dist/op/local-output.d.ts +11 -1
  229. package/dist/op/local-output.d.ts.map +1 -1
  230. package/dist/op/op-ir.d.ts +184 -0
  231. package/dist/op/op-ir.d.ts.map +1 -0
  232. package/dist/op/op-verb-class.d.ts +10 -2
  233. package/dist/op/op-verb-class.d.ts.map +1 -1
  234. package/dist/op/operator.d.ts +30 -5
  235. package/dist/op/operator.d.ts.map +1 -1
  236. package/dist/op/receipt-store.d.ts +1 -1
  237. package/dist/op/receipt-store.d.ts.map +1 -1
  238. package/dist/op/resource.d.ts +15 -1
  239. package/dist/op/resource.d.ts.map +1 -1
  240. package/dist/op/runtime.d.ts +200 -0
  241. package/dist/op/runtime.d.ts.map +1 -0
  242. package/dist/op/runtimes/local.d.ts +29 -0
  243. package/dist/op/runtimes/local.d.ts.map +1 -0
  244. package/dist/op/step-output-ref.d.ts +15 -13
  245. package/dist/op/step-output-ref.d.ts.map +1 -1
  246. package/dist/op/types.d.ts +79 -27
  247. package/dist/op/types.d.ts.map +1 -1
  248. package/dist/ownership.d.ts +1 -1
  249. package/dist/provenance.d.ts +21 -0
  250. package/dist/provenance.d.ts.map +1 -1
  251. package/dist/serializer-walker.d.ts.map +1 -1
  252. package/dist/stack-output.d.ts +5 -0
  253. package/dist/stack-output.d.ts.map +1 -1
  254. package/package.json +6 -1
  255. package/src/audit/catalog.test.ts +79 -3
  256. package/src/audit/catalog.ts +111 -13
  257. package/src/audit/core.test.ts +26 -0
  258. package/src/audit/core.ts +61 -17
  259. package/src/audit/discover.test.ts +39 -0
  260. package/src/audit/discover.ts +91 -15
  261. package/src/audit/lineage.ts +100 -0
  262. package/src/audit/prior-art.ts +153 -0
  263. package/src/audit/proof.test.ts +67 -0
  264. package/src/audit/proof.ts +70 -0
  265. package/src/audit/report-html.ts +9 -4
  266. package/src/audit/report-model.ts +16 -2
  267. package/src/audit/report.test.ts +33 -0
  268. package/src/audit/report.ts +5 -3
  269. package/src/audit/rules-doc.test.ts +34 -2
  270. package/src/audit/rules-doc.ts +82 -9
  271. package/src/audit/secrets.ts +15 -3
  272. package/src/audit/terraform-state.test.ts +144 -0
  273. package/src/audit/terraform-state.ts +131 -0
  274. package/src/build.ts +31 -1
  275. package/src/claimed-fields.test.ts +145 -0
  276. package/src/claimed-fields.ts +208 -0
  277. package/src/cli/build-params-cli.ts +2 -2
  278. package/src/cli/command-group.ts +14 -0
  279. package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
  280. package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
  281. package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
  282. package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
  283. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
  284. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
  285. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
  286. package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
  287. package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
  288. package/src/cli/commands/audit.test.ts +189 -11
  289. package/src/cli/commands/audit.ts +73 -27
  290. package/src/cli/commands/build.test.ts +292 -9
  291. package/src/cli/commands/build.ts +156 -24
  292. package/src/cli/commands/check-lexicon-docs.ts +1 -1
  293. package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
  294. package/src/cli/commands/check-lexicon-examples.ts +42 -10
  295. package/src/cli/commands/import.ts +6 -0
  296. package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
  297. package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
  298. package/src/cli/commands/init-lexicon.test.ts +97 -2
  299. package/src/cli/commands/init-lexicon.ts +4 -2
  300. package/src/cli/commands/init.test.ts +35 -1
  301. package/src/cli/commands/init.ts +14 -3
  302. package/src/cli/commands/lint.test.ts +48 -0
  303. package/src/cli/commands/lint.ts +123 -0
  304. package/src/cli/commands/onboard.test.ts +75 -0
  305. package/src/cli/commands/onboard.ts +54 -23
  306. package/src/cli/handlers/build.test.ts +81 -1
  307. package/src/cli/handlers/build.ts +15 -1
  308. package/src/cli/handlers/graph.test.ts +3 -3
  309. package/src/cli/handlers/lifecycle.test.ts +195 -12
  310. package/src/cli/handlers/lifecycle.ts +123 -6
  311. package/src/cli/handlers/misc.ts +1 -1
  312. package/src/cli/handlers/operator.test.ts +183 -11
  313. package/src/cli/handlers/operator.ts +260 -55
  314. package/src/cli/handlers/run.test.ts +431 -1287
  315. package/src/cli/handlers/run.ts +365 -915
  316. package/src/cli/main.test.ts +23 -15
  317. package/src/cli/main.ts +88 -33
  318. package/src/cli/mcp/op-tools.ts +147 -88
  319. package/src/cli/mcp/resource-handlers.ts +10 -37
  320. package/src/cli/mcp/resources/context.ts +11 -12
  321. package/src/cli/mcp/server.test.ts +25 -27
  322. package/src/cli/mcp/server.ts +2 -2
  323. package/src/cli/registry.ts +26 -9
  324. package/src/codegen/docs.ts +1 -1
  325. package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
  326. package/src/codegen/generate-post-synth-barrel.ts +1 -1
  327. package/src/components/README.md +3 -2
  328. package/src/components/auto-release.test.ts +4 -20
  329. package/src/components/auto-release.ts +17 -42
  330. package/src/components/capability.ts +4 -4
  331. package/src/components/cli-support.test.ts +10 -5
  332. package/src/components/cli-support.ts +52 -44
  333. package/src/components/component.schema.json +2 -2
  334. package/src/components/component.ts +3 -3
  335. package/src/components/driver-output.ts +14 -2
  336. package/src/components/driver.test.ts +92 -22
  337. package/src/components/driver.ts +193 -83
  338. package/src/components/index.ts +1 -6
  339. package/src/components/manifest-persistence.test.ts +2 -20
  340. package/src/components/manifest-persistence.ts +4 -24
  341. package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
  342. package/src/components/run-progress.ts +6 -6
  343. package/src/components/verbs/run-agent.ts +11 -17
  344. package/src/components/verbs/verify.ts +2 -2
  345. package/src/deep-observation.test.ts +75 -0
  346. package/src/deep-observation.ts +48 -0
  347. package/src/discovery/collect.test.ts +3 -3
  348. package/src/discovery/files.ts +4 -4
  349. package/src/discovery/fold-import.ts +105 -2
  350. package/src/discovery/param-deps.test.ts +112 -1
  351. package/src/discovery/param-deps.ts +193 -0
  352. package/src/discovery/sandbox/bundle.ts +15 -1
  353. package/src/discovery/sandbox/config-wire.test.ts +2 -2
  354. package/src/discovery/sandbox/config-wire.ts +2 -2
  355. package/src/fold/fold.test.ts +56 -0
  356. package/src/fold/foldable-helpers.ts +81 -1
  357. package/src/fold-provenance-exclusion.test.ts +186 -0
  358. package/src/fold-provenance.test.ts +495 -0
  359. package/src/fold-provenance.ts +441 -0
  360. package/src/graph-ops.test.ts +2 -2
  361. package/src/graph-ops.ts +1 -1
  362. package/src/held-elsewhere.test.ts +102 -0
  363. package/src/held-elsewhere.ts +114 -0
  364. package/src/import/ir-utils.ts +11 -1
  365. package/src/import/parser.ts +35 -0
  366. package/src/index.ts +3 -0
  367. package/src/kubectl-context.ts +3 -3
  368. package/src/lexicon-config.test.ts +5 -5
  369. package/src/lexicon-config.ts +4 -4
  370. package/src/lexicon-plugin-helpers.ts +1 -1
  371. package/src/lexicon.ts +120 -14
  372. package/src/lifecycle/change-set.test.ts +49 -0
  373. package/src/lifecycle/change-set.ts +67 -0
  374. package/src/lifecycle/converge-ledger.ts +1 -1
  375. package/src/lifecycle/deep-diff.test.ts +267 -14
  376. package/src/lifecycle/deep-diff.ts +217 -14
  377. package/src/lifecycle/deep-observe.test.ts +3 -1
  378. package/src/lifecycle/deep-observe.ts +16 -6
  379. package/src/lifecycle/gate-ledger.test.ts +74 -2
  380. package/src/lifecycle/gate-ledger.ts +143 -36
  381. package/src/lifecycle/index.ts +1 -0
  382. package/src/lifecycle/release-ledger.ts +2 -2
  383. package/src/lifecycle/run-ledger.test.ts +268 -0
  384. package/src/lifecycle/run-ledger.ts +201 -0
  385. package/src/lifecycle/symptoms.ts +3 -3
  386. package/src/lint/config.test.ts +82 -1
  387. package/src/lint/config.ts +112 -3
  388. package/src/lint/policy.test.ts +1 -1
  389. package/src/lint/post-synth.test.ts +31 -0
  390. package/src/lint/post-synth.ts +54 -1
  391. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
  392. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
  393. package/src/lint/rules/comp/comp.test.ts +1 -1
  394. package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +74 -0
  395. package/src/lint/rules/comp/index.ts +3 -3
  396. package/src/lint/rules/op/index.ts +23 -0
  397. package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
  398. package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
  399. package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
  400. package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
  401. package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
  402. package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
  403. package/src/lint/rules/op/support.ts +11 -0
  404. package/src/lint/suppressions.test.ts +163 -0
  405. package/src/lint/suppressions.ts +204 -0
  406. package/src/live-endpoint.ts +1 -1
  407. package/src/op/activities/activity-contracts.ts +66 -0
  408. package/src/op/activities/apply.test.ts +567 -0
  409. package/src/op/activities/apply.ts +662 -0
  410. package/src/op/activities/build.ts +26 -0
  411. package/src/op/activities/converge.test.ts +330 -0
  412. package/src/op/activities/converge.ts +449 -0
  413. package/src/op/activities/env-teardown.test.ts +187 -0
  414. package/src/op/activities/env-teardown.ts +171 -0
  415. package/src/op/activities/guard-validate.test.ts +139 -0
  416. package/src/op/activities/guard-validate.ts +223 -0
  417. package/src/op/activities/http-check.test.ts +48 -0
  418. package/src/op/activities/http-check.ts +55 -0
  419. package/src/op/activities/index.ts +119 -0
  420. package/src/op/activities/lexicon-upgrade.test.ts +492 -0
  421. package/src/op/activities/lexicon-upgrade.ts +673 -0
  422. package/src/op/activities/lifecycle.ts +85 -0
  423. package/src/op/activities/pipeline-audit.test.ts +67 -0
  424. package/src/op/activities/pipeline-audit.ts +201 -0
  425. package/src/op/activities/policy.test.ts +19 -0
  426. package/src/op/activities/policy.ts +37 -0
  427. package/src/op/activities/reconcile.test.ts +81 -0
  428. package/src/op/activities/reconcile.ts +187 -0
  429. package/src/op/activities/shell.ts +26 -0
  430. package/src/op/activities/teardown.ts +22 -0
  431. package/src/op/activities/util.ts +6 -0
  432. package/src/op/activities/wait.ts +69 -0
  433. package/src/op/activities/workflow-audit.test.ts +90 -0
  434. package/src/op/activities/workflow-audit.ts +203 -0
  435. package/src/op/activity-contract-registry.test.ts +98 -0
  436. package/src/op/activity-contract-registry.ts +114 -0
  437. package/src/op/activity-contract.test.ts +1 -1
  438. package/src/op/activity-contract.ts +37 -33
  439. package/src/op/activity-failure.ts +34 -0
  440. package/src/op/activity-profiles.test.ts +56 -0
  441. package/src/op/activity-profiles.ts +116 -0
  442. package/src/op/activity-registry.test.ts +37 -28
  443. package/src/op/activity-registry.ts +27 -56
  444. package/src/op/activity-runtime.ts +3 -47
  445. package/src/op/builders-exports.test.ts +0 -49
  446. package/src/op/builders-typed.test.ts +164 -0
  447. package/src/op/builders.ts +123 -39
  448. package/src/op/composites/apply-op.ts +208 -0
  449. package/src/op/composites/composites.test.ts +366 -0
  450. package/src/op/composites/converge-op.test.ts +168 -0
  451. package/src/op/composites/converge-op.ts +214 -0
  452. package/src/op/composites/index.ts +26 -0
  453. package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
  454. package/src/op/composites/lexicon-upgrade-op.ts +134 -0
  455. package/src/op/composites/pipeline-audit-op.test.ts +25 -0
  456. package/src/op/composites/pipeline-audit-op.ts +78 -0
  457. package/src/op/composites/reconcile-op.test.ts +51 -0
  458. package/src/op/composites/reconcile-op.ts +107 -0
  459. package/src/op/composites/watch-op.ts +108 -0
  460. package/src/op/composites/workflow-audit-op.test.ts +25 -0
  461. package/src/op/composites/workflow-audit-op.ts +88 -0
  462. package/src/op/converge-rule.ts +12 -10
  463. package/src/op/cron.test.ts +128 -0
  464. package/src/op/cron.ts +149 -0
  465. package/src/op/discover-root.test.ts +105 -1
  466. package/src/op/discover.test.ts +6 -2
  467. package/src/op/discover.ts +84 -16
  468. package/src/op/duration.ts +21 -0
  469. package/src/op/effect-step.test.ts +26 -11
  470. package/src/op/emulator-lifecycle.ts +1 -2
  471. package/src/op/gate.ts +155 -0
  472. package/src/op/generate-pipeline.test.ts +65 -3
  473. package/src/op/generate-pipeline.ts +19 -2
  474. package/src/op/index.ts +39 -6
  475. package/src/op/local-executor.test.ts +163 -34
  476. package/src/op/local-executor.ts +370 -102
  477. package/src/op/local-output.test.ts +95 -11
  478. package/src/op/local-output.ts +33 -4
  479. package/src/op/op-ir.test.ts +281 -0
  480. package/src/op/op-ir.ts +417 -0
  481. package/src/op/op-verb-class.ts +19 -5
  482. package/src/op/op.test.ts +26 -5
  483. package/src/op/operator.test.ts +175 -6
  484. package/src/op/operator.ts +63 -16
  485. package/src/op/receipt-store.ts +1 -1
  486. package/src/op/resource.ts +20 -2
  487. package/src/op/runtime.ts +203 -0
  488. package/src/op/runtimes/local.test.ts +181 -0
  489. package/src/op/runtimes/local.ts +212 -0
  490. package/src/op/step-output-ref.ts +15 -13
  491. package/src/op/types.ts +84 -24
  492. package/src/ownership.ts +1 -1
  493. package/src/provenance.test.ts +6 -0
  494. package/src/provenance.ts +21 -1
  495. package/src/serializer-walker.test.ts +42 -0
  496. package/src/serializer-walker.ts +21 -2
  497. package/src/stack-output.ts +6 -1
  498. package/dist/cli/handlers/op-progress.d.ts +0 -90
  499. package/dist/cli/handlers/op-progress.d.ts.map +0 -1
  500. package/dist/cli/handlers/run-client.d.ts +0 -127
  501. package/dist/cli/handlers/run-client.d.ts.map +0 -1
  502. package/dist/cli/handlers/run-report.d.ts +0 -5
  503. package/dist/cli/handlers/run-report.d.ts.map +0 -1
  504. package/dist/components/temporal-codegen-loader.d.ts +0 -27
  505. package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
  506. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
  507. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
  508. package/src/cli/handlers/op-progress.test.ts +0 -268
  509. package/src/cli/handlers/op-progress.ts +0 -248
  510. package/src/cli/handlers/run-client.test.ts +0 -82
  511. package/src/cli/handlers/run-client.ts +0 -219
  512. package/src/cli/handlers/run-report.test.ts +0 -62
  513. package/src/cli/handlers/run-report.ts +0 -122
  514. package/src/components/temporal-codegen-loader.ts +0 -41
  515. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
@@ -16,37 +16,39 @@
16
16
  * An activity declares a contract alongside its implementation — the same
17
17
  * "registration surface" the issue asked for (`activity-registry.ts`'s
18
18
  * `collectActivities` already does this for implementations; this is the
19
- * schema-shaped sibling). `chant build` — via a lexicon's own post-synth
20
- * check, e.g. the temporal lexicon's TMP012 — resolves each step's `fn`
21
- * against a contract map built the same way and validates `args` and
22
- * `outcomeAttribute.from`. A step whose `fn` has no registered contract is
23
- * skipped (not an error): this is deliberately incremental — a lexicon opts
24
- * an activity in by declaring a contract for it, and the k8s/aws/azure/gcp/
25
- * fly activity sets are expected to pick this up lexicon by lexicon rather
26
- * than all at once (see the issue's "worth checking this lands cleanly"
27
- * note).
19
+ * schema-shaped sibling). `chant build` resolves each step's `fn` against a
20
+ * contract map built from `Object.values()` of an activity-contracts module
21
+ * and validates `args` and `outcomeAttribute.from` — core's own OPS012
22
+ * (`../lint/rules/op/ops012-activity-contract.ts`, chant #2122) does this
23
+ * for every declared Op regardless of which lexicons are configured; a
24
+ * lexicon's own post-synth check can additionally validate against its own
25
+ * roster the same way (a lexicon-owned check did this before #2122 moved the
26
+ * op-model checks to core). A step whose `fn` has no registered
27
+ * contract is skipped (not an error): this is deliberately incremental — a
28
+ * contract map opts an activity in by declaring one for it, and the
29
+ * k8s/aws/azure/gcp/fly activity sets are expected to pick this up one at a
30
+ * time rather than all at once (see the issue's "worth checking this lands
31
+ * cleanly" note).
28
32
  *
29
- * Ownership is decentralized on purpose: each lexicon declares contracts for
30
- * the activities it implements and validates them with its own post-synth
31
- * check (the same `rulePrefix`-per-lexicon pattern every other check in
32
- * chant already uses), rather than a shared cross-lexicon registry. A
33
- * `Temporal::Op` step can call an activity contributed by any lexicon, and
34
- * `PostSynthContext.entities` already carries the whole resolved graph to
35
- * every lexicon's checks, so no new plumbing is needed for that to work.
33
+ * Ownership of a contract map is per-caller, not a shared cross-lexicon
34
+ * registry: whoever builds the map (core's OPS012/OPS013, or a lexicon's own
35
+ * check) decides which activities it covers. A `Chant::Op` step can call an
36
+ * activity contributed by any lexicon, and `PostSynthContext.entities`
37
+ * already carries the whole resolved graph to every check, so no new
38
+ * plumbing is needed for that to work.
36
39
  */
37
40
 
38
41
  import { z } from "zod";
42
+ import { outcomeAttributesOf } from "./types";
39
43
  import type { OpConfig, PhaseDefinition, ActivityStep, StepDefinition } from "./types";
44
+ import { ACTIVITY_PROFILE_NAMES } from "./activity-profiles";
40
45
 
41
- /** Every literal value {@link ActivityStep.profile} may hold. Kept in sync with `types.ts`'s `ActivityStep["profile"]`. */
42
- export const KNOWN_ACTIVITY_PROFILES = [
43
- "fastIdempotent",
44
- "longInfra",
45
- "k8sWait",
46
- "humanGate",
47
- "argoSync",
48
- "policyCheck",
49
- ] as const;
46
+ /**
47
+ * Every literal value {@link ActivityStep.profile} may hold, read off
48
+ * {@link ACTIVITY_PROFILES} itself so the runtime list cannot drift from the
49
+ * table the type is derived from.
50
+ */
51
+ export const KNOWN_ACTIVITY_PROFILES = ACTIVITY_PROFILE_NAMES;
50
52
 
51
53
  const CONTRACT_BRAND = Symbol.for("chant.op.activityContract");
52
54
 
@@ -266,7 +268,7 @@ export function validateActivitySteps(
266
268
  // A step-output reference (#1290) sitting at this path is a
267
269
  // placeholder object at build time, not the value it will
268
270
  // resolve to — so an args-schema type mismatch here is a false
269
- // positive; TMP013 (`validateStepOutputRefs`) is what validates
271
+ // positive; OPS013 (`validateStepOutputRefs`) is what validates
270
272
  // a reference, against the *producer's* declared return schema.
271
273
  // An unrecognized-key issue's path is the parent object (`[]`
272
274
  // for a top-level extra key), which is never itself a reference,
@@ -277,13 +279,15 @@ export function validateActivitySteps(
277
279
  }
278
280
  }
279
281
 
280
- if (step.outcomeAttribute?.from && contract.returns && !pathExistsInSchema(contract.returns, step.outcomeAttribute.from)) {
281
- issues.push({
282
- opName: config.name,
283
- phase: phase.name,
284
- fn: step.fn,
285
- message: `outcomeAttribute.from "${step.outcomeAttribute.from}" does not exist on "${step.fn}"'s declared return type`,
286
- });
282
+ for (const attr of outcomeAttributesOf(step)) {
283
+ if (attr.from && contract.returns && !pathExistsInSchema(contract.returns, attr.from)) {
284
+ issues.push({
285
+ opName: config.name,
286
+ phase: phase.name,
287
+ fn: step.fn,
288
+ message: `outcomeAttribute.from "${attr.from}" does not exist on "${step.fn}"'s declared return type`,
289
+ });
290
+ }
287
291
  }
288
292
  }
289
293
  }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * A terminal activity failure.
3
+ *
4
+ * Some activities fail deterministically: an organizational policy violation
5
+ * (`policyGate`) or a cfn-guard finding (`guardValidate`) reads the same on the
6
+ * second attempt as on the first, so a retry only delays the report. Those
7
+ * activities used to raise an orchestrator SDK's non-retryable failure type,
8
+ * which put that SDK on the import path of every base activity. Core owns the
9
+ * base activities now (chant #2114), and depends on no runtime SDK — this is
10
+ * the same signal in a plain `Error`.
11
+ *
12
+ * `name` is the failure type, not the class name, so the local executor's
13
+ * `retry.nonRetryableErrorTypes` (which matches on `Error.name`) can name it in
14
+ * a profile. `type` and `nonRetryable` are kept alongside it because that is
15
+ * the shape callers and tests already read.
16
+ */
17
+ export class NonRetryableActivityError extends Error {
18
+ /** Always true — present so a caller can branch without an `instanceof`. */
19
+ readonly nonRetryable = true;
20
+
21
+ constructor(
22
+ message: string,
23
+ /** Failure type, e.g. `"PolicyViolation"`. Also this error's `name`. */
24
+ readonly type: string,
25
+ ) {
26
+ super(message);
27
+ this.name = type;
28
+ }
29
+ }
30
+
31
+ /** Build a {@link NonRetryableActivityError} — a non-retryable failure with no SDK behind it. */
32
+ export function nonRetryableFailure(message: string, type: string): NonRetryableActivityError {
33
+ return new NonRetryableActivityError(message, type);
34
+ }
@@ -0,0 +1,56 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import { ACTIVITY_PROFILES, ACTIVITY_PROFILE_NAMES, type ActivityProfileName } from "./activity-profiles";
3
+ import { KNOWN_ACTIVITY_PROFILES } from "./activity-contract";
4
+ import { activity } from "./builders";
5
+
6
+ /**
7
+ * chant #2114 — the profile table moved out of a hosting lexicon into core and
8
+ * lost its prefix. What a profile carries is a timeout and a retry policy;
9
+ * `heartbeatTimeout` configured a worker's liveness protocol and has no subject
10
+ * in an in-process step, so it did not come along.
11
+ */
12
+ describe("ACTIVITY_PROFILES", () => {
13
+ test("carries the six named profiles", () => {
14
+ expect(Object.keys(ACTIVITY_PROFILES).sort()).toEqual(
15
+ ["argoSync", "fastIdempotent", "humanGate", "k8sWait", "longInfra", "policyCheck"],
16
+ );
17
+ });
18
+
19
+ test("every profile has a timeout, and none has a worker-era field", () => {
20
+ for (const [name, profile] of Object.entries(ACTIVITY_PROFILES)) {
21
+ expect(typeof profile.timeout, `${name}.timeout`).toBe("string");
22
+ expect(profile, `${name} should have no heartbeatTimeout`).not.toHaveProperty("heartbeatTimeout");
23
+ expect(profile, `${name} should have no startToCloseTimeout`).not.toHaveProperty("startToCloseTimeout");
24
+ }
25
+ });
26
+
27
+ test("the retry shapes that mattered survived the move", () => {
28
+ expect(ACTIVITY_PROFILES.humanGate.retry.maximumAttempts).toBe(1);
29
+ expect(ACTIVITY_PROFILES.policyCheck.retry.maximumAttempts).toBe(1);
30
+ expect(ACTIVITY_PROFILES.k8sWait.retry.nonRetryableErrorTypes).toContain("ReadinessFailedError");
31
+ expect(ACTIVITY_PROFILES.argoSync.retry.nonRetryableErrorTypes).toContain("ArgoSyncFailedError");
32
+ });
33
+
34
+ test("KNOWN_ACTIVITY_PROFILES is the table's own key list, not a second copy", () => {
35
+ expect(KNOWN_ACTIVITY_PROFILES).toBe(ACTIVITY_PROFILE_NAMES);
36
+ expect([...KNOWN_ACTIVITY_PROFILES].sort()).toEqual(Object.keys(ACTIVITY_PROFILES).sort());
37
+ });
38
+ });
39
+
40
+ // ── Compile-time-only: ActivityStep.profile is derived from the table ────────
41
+ function _typeChecksOnly(): void {
42
+ const names: ActivityProfileName[] = [
43
+ "fastIdempotent", "longInfra", "k8sWait", "humanGate", "argoSync", "policyCheck",
44
+ ];
45
+ void names;
46
+
47
+ activity("shellCmd", { cmd: "true" }, "policyCheck");
48
+
49
+ // @ts-expect-error — a seventh profile name is not in ACTIVITY_PROFILES.
50
+ activity("shellCmd", { cmd: "true" }, "leisurely");
51
+
52
+ // @ts-expect-error — same rejection through the step's own field.
53
+ const _step: { profile?: ActivityProfileName } = { profile: "leisurely" };
54
+ void _step;
55
+ }
56
+ void _typeChecksOnly;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Activity timeout and retry profiles.
3
+ *
4
+ * A profile is a named retry/timeout shape an Op step opts into
5
+ * (`activity("chantBuild", …, "fastIdempotent")`), so tuning lives in one table
6
+ * instead of inline at every call site. The six names cover the shapes infra
7
+ * steps actually take: fast idempotent work, long infra, K8s wait loops, a
8
+ * human gate, an Argo sync wait, and a deterministic policy check.
9
+ *
10
+ * These lived in a hosting lexicon, under its own prefixed name, until chant
11
+ * #2114 moved the base activities into core. Nothing about a timeout or a
12
+ * backoff coefficient belonged to that runtime, so the table came with them and
13
+ * lost the prefix. `heartbeatTimeout` did not come along: it configured a
14
+ * liveness protocol between a worker and a server, and no in-process step
15
+ * heartbeats to anything.
16
+ */
17
+
18
+ export interface ActivityProfile {
19
+ /** Maximum time allowed for a single activity execution attempt (e.g. `"20m"`). */
20
+ timeout: string;
21
+ /** Retry policy for failed activity attempts. */
22
+ retry?: {
23
+ /** Initial wait before the first retry (e.g. "5s"). */
24
+ initialInterval?: string;
25
+ /** Multiplier applied to the interval on each retry (e.g. 2). */
26
+ backoffCoefficient?: number;
27
+ /** Maximum number of attempts including the first (0 = unlimited). */
28
+ maximumAttempts?: number;
29
+ /** Cap on retry intervals (e.g. "5m"). */
30
+ maximumInterval?: string;
31
+ /**
32
+ * Error names (`Error.name`) that fail immediately without retry — the
33
+ * executor short-circuits its retry loop on a match.
34
+ */
35
+ nonRetryableErrorTypes?: string[];
36
+ };
37
+ }
38
+
39
+ /** Named activity profiles for common infrastructure step patterns. */
40
+ export const ACTIVITY_PROFILES = {
41
+ /**
42
+ * Fast, idempotent operations: `chant build`, `kubectl apply` without `--wait`,
43
+ * fetching nameservers, reading cluster status.
44
+ */
45
+ fastIdempotent: {
46
+ timeout: "5m",
47
+ retry: { maximumAttempts: 3, initialInterval: "5s", backoffCoefficient: 2 },
48
+ },
49
+
50
+ /**
51
+ * Long-running infra: GKE cluster creation via Config Connector (~10-20 min),
52
+ * `kubectl apply --wait` for large resource sets, Helm installs.
53
+ */
54
+ longInfra: {
55
+ timeout: "20m",
56
+ retry: { maximumAttempts: 3, initialInterval: "30s", backoffCoefficient: 2 },
57
+ },
58
+
59
+ /**
60
+ * K8s wait loops: polling for StatefulSet rollout, ExternalDNS A-records,
61
+ * DNS propagation.
62
+ */
63
+ k8sWait: {
64
+ timeout: "15m",
65
+ // A terminal-state resource (waitForReady's ReadinessFailedError) will never
66
+ // become ready — fail fast instead of exhausting retries.
67
+ retry: {
68
+ maximumAttempts: 3,
69
+ initialInterval: "10s",
70
+ backoffCoefficient: 2,
71
+ nonRetryableErrorTypes: ["ReadinessFailedError"],
72
+ },
73
+ },
74
+
75
+ /**
76
+ * Human-gate steps: waiting for an operator action (DNS delegation, approval).
77
+ * Very long timeout, single attempt — no retry on human-gate timeouts.
78
+ */
79
+ humanGate: {
80
+ timeout: "48h",
81
+ retry: { maximumAttempts: 1 },
82
+ },
83
+
84
+ /**
85
+ * Argo CD sync waits: poll an Application until `health=Healthy && sync=Synced`
86
+ * (`waitForArgoSync`). Long timeout for slow first syncs, cheap idempotent
87
+ * retries — re-polling is free. A terminal-unhealthy Application fails fast
88
+ * via `ArgoSyncFailedError` (non-retryable).
89
+ */
90
+ argoSync: {
91
+ timeout: "30m",
92
+ retry: {
93
+ maximumAttempts: 5,
94
+ initialInterval: "10s",
95
+ backoffCoefficient: 2,
96
+ maximumInterval: "1m",
97
+ nonRetryableErrorTypes: ["ArgoSyncFailedError"],
98
+ },
99
+ },
100
+
101
+ /**
102
+ * Organizational policy gate (`policyGate`): build the project and evaluate
103
+ * `lint.policies`. Deterministic — a violation is the same on every attempt —
104
+ * so a single attempt, short timeout, no retry.
105
+ */
106
+ policyCheck: {
107
+ timeout: "5m",
108
+ retry: { maximumAttempts: 1 },
109
+ },
110
+ } as const satisfies Record<string, ActivityProfile>;
111
+
112
+ /** The name of a built-in activity profile — the union `ActivityStep.profile` admits. */
113
+ export type ActivityProfileName = keyof typeof ACTIVITY_PROFILES;
114
+
115
+ /** Every profile name, as a runtime list (`KNOWN_ACTIVITY_PROFILES`'s source). */
116
+ export const ACTIVITY_PROFILE_NAMES = Object.keys(ACTIVITY_PROFILES) as ActivityProfileName[];
@@ -1,15 +1,11 @@
1
- import { describe, test, expect, vi, afterEach } from "vitest";
2
- import { loadActivities, resolveActivity, type ActivityFn } from "./activity-registry";
1
+ import { describe, test, expect } from "vitest";
2
+ import { loadActivities, loadProfiles, resolveActivity, type ActivityFn } from "./activity-registry";
3
+ import { ACTIVITY_PROFILES } from "./activity-profiles";
3
4
 
4
5
  describe("loadActivities", () => {
5
- afterEach(() => {
6
- vi.resetModules();
7
- vi.doUnmock("@intentius/chant-lexicon-temporal/op/activities");
8
- });
9
-
10
- test("loads the lexicon activity library keyed by export name", async () => {
6
+ test("loads core's own activity library keyed by export name", async () => {
11
7
  const activities = await loadActivities();
12
- // Real export names from lexicons/temporal/src/op/activities.
8
+ // Real export names from packages/core/src/op/activities.
13
9
  expect(activities.has("shellCmd")).toBe(true);
14
10
  expect(activities.has("chantBuild")).toBe(true);
15
11
  expect(activities.has("waitForStack")).toBe(true);
@@ -17,15 +13,27 @@ describe("loadActivities", () => {
17
13
  expect(typeof activities.get("shellCmd")).toBe("function");
18
14
  });
19
15
 
20
- test("throws a friendly error when the lexicon is not installed", async () => {
21
- vi.resetModules();
22
- vi.doMock("@intentius/chant-lexicon-temporal/op/activities", () => {
23
- throw new Error("Cannot find module");
24
- });
25
- const { loadActivities: fresh } = await import("./activity-registry");
26
- await expect(fresh()).rejects.toThrow(
27
- "no activities registered — install `@intentius/chant-lexicon-temporal`",
28
- );
16
+ /**
17
+ * chant #2114 — the base library used to live in a hosting lexicon,
18
+ * dynamically imported, and `loadActivities` threw "no activities
19
+ * registered" without it. The activities are core's own now and the
20
+ * import is static, so an empty lexicon list resolves the whole base surface in
21
+ * a project that has installed nothing but chant.
22
+ */
23
+ test("every base activity resolves with no lexicons configured", async () => {
24
+ const a = await loadActivities([]);
25
+ for (const fn of [
26
+ "shellCmd", "chantBuild", "waitForStack", "lifecycleSnapshot", "lifecycleDiff",
27
+ "httpCheck", "chantTeardown", "envTeardown", "convergeTick", "reconcilePr",
28
+ "guardValidate", "policyGate", "workflowSupplyChainAudit", "pipelineSupplyChainAudit",
29
+ "lexiconUpgrade", "nativeApply",
30
+ ]) {
31
+ expect(typeof a.get(fn), `${fn} should resolve from the base library`).toBe("function");
32
+ }
33
+ });
34
+
35
+ test("loadProfiles returns core's table", async () => {
36
+ expect(await loadProfiles()).toBe(ACTIVITY_PROFILES);
29
37
  });
30
38
  });
31
39
 
@@ -47,25 +55,26 @@ describe("resolveActivity", () => {
47
55
  });
48
56
  });
49
57
 
50
- describe("loadActivities — heartbeat-shim safety", () => {
51
- test("the activity library loads without @temporalio/activity installed", async () => {
52
- // waitForStack (and the relocated kubectlApply/helmInstall/gitlabPipeline)
53
- // heartbeat via the lazy shim; if the shim statically required the SDK, this
54
- // import would throw (the SDK is not installed in this environment).
58
+ describe("loadActivities — no runtime SDK on the path", () => {
59
+ test("the activity library loads with no orchestrator SDK installed", async () => {
60
+ // The base activities used to reach an orchestrator SDK for heartbeats and
61
+ // its non-retryable failure type. Neither is a core dependency, and this
62
+ // import would throw if one crept back in.
55
63
  const activities = await loadActivities();
56
64
  expect(activities.has("waitForStack")).toBe(true);
57
65
  expect(activities.has("chantBuild")).toBe(true);
66
+ expect(activities.has("policyGate")).toBe(true);
58
67
  });
59
68
  });
60
69
 
61
- // Cloud appliers were relocated out of the temporal lexicon into their own
70
+ // Cloud appliers were relocated out of a single lexicon into their own
62
71
  // lexicons (#706); the loader pulls them in per the project's configured
63
72
  // `lexicons`. Proves the relocation resolves end-to-end.
64
73
  describe("loadActivities — multi-lexicon (#706)", () => {
65
- test("base (no lexicons): temporal activities present, product activities absent", async () => {
74
+ test("base (no lexicons): core activities present, product activities absent", async () => {
66
75
  const a = await loadActivities();
67
- expect(a.has("waitForStack")).toBe(true); // temporal base
68
- expect(a.has("shellCmd")).toBe(true); // temporal base
76
+ expect(a.has("waitForStack")).toBe(true); // core base
77
+ expect(a.has("shellCmd")).toBe(true); // core base
69
78
  expect(a.has("kubectlApply")).toBe(false); // relocated to k8s (#809)
70
79
  expect(a.has("k3dUp")).toBe(false); // relocated to k8s (#809), then k3d (#1410)
71
80
  expect(a.has("gcpApply")).toBe(false); // relocated to gcp
@@ -117,6 +126,6 @@ describe("loadActivities — multi-lexicon (#706)", () => {
117
126
 
118
127
  test("unknown lexicon is skipped without throwing", async () => {
119
128
  const a = await loadActivities(["definitely-not-a-lexicon"]);
120
- expect(a.has("waitForStack")).toBe(true); // temporal base still loads
129
+ expect(a.has("waitForStack")).toBe(true); // core base still loads
121
130
  });
122
131
  });
@@ -2,17 +2,24 @@
2
2
  * Activity registry — resolves an Op step's `fn` name to a callable activity
3
3
  * implementation for local execution.
4
4
  *
5
- * Activities live in the Temporal lexicon (`@intentius/chant-lexicon-temporal`)
6
- * but are plain async functions taking a single args object — Temporal-free to
7
- * call. Local mode loads them by name instead of registering them with a worker.
5
+ * The base activities are core's own (`./activities`): plain async functions
6
+ * taking a single args object, with no workflow engine anywhere in the call
7
+ * path. They are imported statically, so `loadActivities([])` works in a
8
+ * project that has installed nothing but chant. Product-specific appliers stay
9
+ * in their owning lexicon (#809) and are pulled in dynamically per the
10
+ * project's configured lexicon list.
8
11
  */
9
12
 
13
+ import * as baseActivities from "./activities";
14
+ import { ACTIVITY_PROFILES, type ActivityProfile } from "./activity-profiles";
15
+
16
+ export type { ActivityProfile } from "./activity-profiles";
17
+
10
18
  /**
11
19
  * An activity is an async function taking a single args object and an optional
12
20
  * `AbortSignal`. Local execution passes a signal that fires on timeout or
13
- * Ctrl-C so the activity can kill in-flight child processes; the Temporal
14
- * worker invokes activities with args only (cancellation comes from its own
15
- * `Context`), so the signal is always optional.
21
+ * Ctrl-C so the activity can kill in-flight child processes; a hosted runtime
22
+ * may invoke activities with args only, so the signal is always optional.
16
23
  */
17
24
  export type ActivityFn = (args: Record<string, unknown>, signal?: AbortSignal) => Promise<unknown>;
18
25
 
@@ -26,33 +33,24 @@ function collectActivities(mod: Record<string, unknown>, into: Map<string, Activ
26
33
  }
27
34
 
28
35
  /**
29
- * Build the activity map for local execution by importing activity libraries and
30
- * keying every exported function by name (`shellCmd`, `kubectlApply`, `gcpApply`, …).
36
+ * Build the activity map for local execution: core's base activities plus every
37
+ * activity module the project's configured lexicons contribute, keyed by export
38
+ * name (`shellCmd`, `kubectlApply`, `gcpApply`, …).
31
39
  *
32
- * The base activities always live in the temporal lexicon. Cloud-specific
33
- * appliers live in their own lexicon (aws → `flociUp`/`flociDown`, gcp →
34
- * `gcpApply`, azure → `azGroupEnsure`/`azGroupDelete`), so `lexicons` — the
35
- * project's configured lexicon list — is consulted to pull those in. A lexicon
36
- * that ships no `op/activities` module is skipped.
40
+ * Cloud-specific appliers live in their own lexicon (aws → `flociUp`/`flociDown`,
41
+ * gcp → `gcpApply`, azure → `azGroupEnsure`/`azGroupDelete`), so `lexicons` —
42
+ * the project's configured lexicon list — is consulted to pull those in. A
43
+ * lexicon that ships no `op/activities` module is skipped.
37
44
  *
38
- * Throws only if the temporal base library is missing — local execution needs
39
- * the activity implementations even though it never starts a worker.
45
+ * Never throws: the base library is a static import, so there is no "no
46
+ * activities registered" state to report.
40
47
  */
41
48
  export async function loadActivities(lexicons: string[] = []): Promise<Map<string, ActivityFn>> {
42
49
  const activities = new Map<string, ActivityFn>();
43
50
 
44
- try {
45
- // Variable specifier so tsc does not statically resolve the optional dep.
46
- const spec = "@intentius/chant-lexicon-temporal/op/activities";
47
- collectActivities((await import(spec)) as Record<string, unknown>, activities);
48
- } catch {
49
- throw new Error(
50
- "no activities registered — install `@intentius/chant-lexicon-temporal`",
51
- );
52
- }
51
+ collectActivities(baseActivities as unknown as Record<string, unknown>, activities);
53
52
 
54
53
  for (const name of lexicons) {
55
- if (name === "temporal") continue;
56
54
  try {
57
55
  const spec = `@intentius/chant-lexicon-${name}/op/activities`;
58
56
  collectActivities((await import(spec)) as Record<string, unknown>, activities);
@@ -64,40 +62,13 @@ export async function loadActivities(lexicons: string[] = []): Promise<Map<strin
64
62
  return activities;
65
63
  }
66
64
 
67
- /** Structural shape of a TEMPORAL_ACTIVITY_PROFILES entry (timeout + retry). */
68
- export interface ActivityProfile {
69
- startToCloseTimeout?: string;
70
- heartbeatTimeout?: string;
71
- retry?: {
72
- initialInterval?: string;
73
- backoffCoefficient?: number;
74
- maximumAttempts?: number;
75
- maximumInterval?: string;
76
- /** Error names (`Error.name`) that should fail immediately without retry. */
77
- nonRetryableErrorTypes?: string[];
78
- };
79
- }
80
-
81
65
  /**
82
- * Dynamically import the lexicon's `TEMPORAL_ACTIVITY_PROFILES` (pure data, no
83
- * Temporal SDK). Returns an empty record if the lexicon is absent — the
84
- * executor then falls back to built-in defaults per step.
85
- *
86
- * Imports the lexicon's `/config` entry, not its root index. `/config` is a
87
- * side-effect-free data module; the root index pulls in the plugin, serializer,
88
- * composites, and re-exported Op machinery, any of which could throw on load
89
- * and make this silently return `{}` — which would drop every profiled step to
90
- * the 5-minute default while the Temporal path (reading the same table) kept the
91
- * declared timeout. Importing the narrow module keeps the two executors agreed.
66
+ * The built-in profile table. Kept async because it is awaited on the CLI's
67
+ * run path alongside {@link loadActivities}, and because a hosted runtime may
68
+ * one day resolve profiles from somewhere less immediate.
92
69
  */
93
70
  export async function loadProfiles(): Promise<Record<string, ActivityProfile>> {
94
- try {
95
- const spec = "@intentius/chant-lexicon-temporal/config";
96
- const mod = (await import(spec)) as { TEMPORAL_ACTIVITY_PROFILES?: Record<string, ActivityProfile> };
97
- return mod.TEMPORAL_ACTIVITY_PROFILES ?? {};
98
- } catch {
99
- return {};
100
- }
71
+ return ACTIVITY_PROFILES as unknown as Record<string, ActivityProfile>;
101
72
  }
102
73
 
103
74
  /**
@@ -1,54 +1,10 @@
1
1
  /**
2
2
  * Activity runtime helpers shared by every Op activity implementation, wherever
3
- * it lives — the base activities in the temporal lexicon and the cloud-specific
4
- * appliers relocated into the aws/gcp/azure lexicons. Hosting them in core keeps
5
- * a cloud lexicon from having to depend on the temporal lexicon just to
6
- * heartbeat or sleep.
3
+ * it lives — the base activities in `./activities` and the product-specific
4
+ * appliers in the aws/gcp/azure/k8s/fly lexicons. Hosting them in core keeps a
5
+ * lexicon from depending on another lexicon just to sleep between polls.
7
6
  */
8
7
 
9
- interface ActivityContext {
10
- current(): { heartbeat(details?: unknown): void };
11
- }
12
-
13
- // undefined = not yet attempted; null = unavailable; object = resolved Context.
14
- let cachedContext: ActivityContext | null | undefined;
15
- let loading: Promise<void> | undefined;
16
-
17
- function ensureContext(): void {
18
- if (cachedContext !== undefined || loading) return;
19
- // Variable specifier so bundlers/tsc do not statically require the optional dep.
20
- const spec = "@temporalio/activity";
21
- loading = import(spec)
22
- .then((mod: unknown) => {
23
- cachedContext = (mod as { Context?: ActivityContext }).Context ?? null;
24
- })
25
- .catch(() => {
26
- cachedContext = null;
27
- });
28
- }
29
-
30
- /**
31
- * Emit an activity heartbeat if running under a Temporal worker; otherwise no-op.
32
- *
33
- * The first call kicks off a one-time lazy load of `@temporalio/activity` and
34
- * returns immediately; once resolved, subsequent calls heartbeat. Heartbeats
35
- * are periodic (every ~15s, well inside the 60s heartbeat timeout), so the
36
- * single missed first tick is harmless. Under chant's local executor (no
37
- * Temporal SDK present) it no-ops, and the module imports cleanly without the SDK.
38
- */
39
- export function safeHeartbeat(details?: unknown): void {
40
- if (cachedContext === undefined) {
41
- ensureContext();
42
- return;
43
- }
44
- if (cachedContext === null) return;
45
- try {
46
- cachedContext.current().heartbeat(details);
47
- } catch {
48
- // Not inside an activity execution context — nothing to do.
49
- }
50
- }
51
-
52
8
  /**
53
9
  * Sleep for `ms`, rejecting early if `signal` aborts. Polling activities use
54
10
  * this between attempts so a local-executor timeout or Ctrl-C interrupts the
@@ -1,6 +1,4 @@
1
1
  import { describe, test, expect } from "vitest";
2
- import { readFileSync } from "node:fs";
3
- import { join } from "node:path";
4
2
  import * as opIndex from "./index";
5
3
  import * as builders from "./builders";
6
4
 
@@ -26,51 +24,4 @@ describe("op builders are all reachable (#1715)", () => {
26
24
  `export list at the top of op/index.ts, or a project cannot use them:\n ${missing.join("\n ")}`,
27
25
  ).toEqual([]);
28
26
  });
29
-
30
- test("the temporal lexicon re-exports the same set", () => {
31
- // The lexicon is what a project actually imports from
32
- // (`@intentius/chant-lexicon-temporal`), and it re-states the list a third
33
- // time rather than re-exporting wholesale — so it can drift independently.
34
- const src = readFileSync(
35
- join(import.meta.dirname, "../../../../lexicons/temporal/src/index.ts"),
36
- "utf-8",
37
- );
38
- const block = src.match(/export \{([^}]*)\} from "@intentius\/chant\/op";/)?.[1] ?? "";
39
- const reExported = new Set(
40
- block.split(",").map((s) => s.trim()).filter(Boolean),
41
- );
42
- // The sprites family reaches projects through the fly lexicon, not this
43
- // one. Named rather than prefix-matched, because `listCheckpoints` is one
44
- // of them and does not look like one — which this test caught on its
45
- // first run.
46
- const FLY_SURFACE = new Set([
47
- "spriteCreate", "spriteExec", "spriteCheckpoint", "spriteRestore",
48
- "listCheckpoints", "spriteDestroy", "spriteWriteFile", "spriteReadFile",
49
- "spriteListDir", "spriteRemove", "spriteApplyNetworkPolicy",
50
- "spriteApplyServices", "spriteTaskCreate", "spriteTaskRefresh",
51
- "spriteTaskRelease", "spritesUp", "spritesDown",
52
- ]);
53
- // chant #1288 Stage 2 — these are the temporal lexicon's OWN activities
54
- // (build.ts, shell.ts, wait.ts, ...), so its barrel re-exports a fully
55
- // typed twin from its own `./op/builders` instead of core's untyped
56
- // original — same name, same import path, deliberately not sourced from
57
- // `@intentius/chant/op` any more. See `lexicons/temporal/src/index.ts`
58
- // and `lexicons/temporal/src/op/builders.ts`.
59
- const TEMPORAL_TYPED_SURFACE = new Set([
60
- "build", "shell", "waitForStack", "lifecycleSnapshot", "teardown", "envTeardown", "httpCheck", "policyGate",
61
- ]);
62
- // chant #1288 Stage 2 — an internal helper (`takeProfile`'s sibling) for
63
- // the lexicon-owned typed step-builder wrappers to reuse, not an
64
- // Op-authoring primitive itself; nothing authors an Op with it directly,
65
- // so it has no place in the Op-authoring barrel.
66
- const INTERNAL_HELPERS = new Set(["takeProfileAndId"]);
67
- const expected = Object.keys(builders).filter(
68
- (n) => !FLY_SURFACE.has(n) && !TEMPORAL_TYPED_SURFACE.has(n) && !INTERNAL_HELPERS.has(n),
69
- );
70
- const missing = expected.filter((name) => !reExported.has(name));
71
- expect(
72
- missing,
73
- `lexicons/temporal/src/index.ts does not re-export these builders:\n ${missing.join("\n ")}`,
74
- ).toEqual([]);
75
- });
76
27
  });