adispatchd 0.0.0-stage → 0.1.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 (396) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -2
  3. package/dist/api/errors.d.ts +27 -0
  4. package/dist/api/errors.js +80 -0
  5. package/dist/api/errors.js.map +1 -0
  6. package/dist/api/index.d.ts +10 -0
  7. package/dist/api/index.js +11 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/api/logs.d.ts +30 -0
  10. package/dist/api/logs.js +88 -0
  11. package/dist/api/logs.js.map +1 -0
  12. package/dist/api/serialize.d.ts +65 -0
  13. package/dist/api/serialize.js +135 -0
  14. package/dist/api/serialize.js.map +1 -0
  15. package/dist/api/server.d.ts +89 -0
  16. package/dist/api/server.js +751 -0
  17. package/dist/api/server.js.map +1 -0
  18. package/dist/api/sse.d.ts +90 -0
  19. package/dist/api/sse.js +225 -0
  20. package/dist/api/sse.js.map +1 -0
  21. package/dist/app.d.ts +173 -0
  22. package/dist/app.js +488 -0
  23. package/dist/app.js.map +1 -0
  24. package/dist/cli/config-validate.d.ts +6 -0
  25. package/dist/cli/config-validate.js +39 -0
  26. package/dist/cli/config-validate.js.map +1 -0
  27. package/dist/cli/control.d.ts +31 -0
  28. package/dist/cli/control.js +186 -0
  29. package/dist/cli/control.js.map +1 -0
  30. package/dist/cli/http-client.d.ts +57 -0
  31. package/dist/cli/http-client.js +174 -0
  32. package/dist/cli/http-client.js.map +1 -0
  33. package/dist/cli/index.d.ts +14 -0
  34. package/dist/cli/index.js +14 -0
  35. package/dist/cli/index.js.map +1 -0
  36. package/dist/cli/init-templates.d.ts +20 -0
  37. package/dist/cli/init-templates.js +275 -0
  38. package/dist/cli/init-templates.js.map +1 -0
  39. package/dist/cli/init.d.ts +16 -0
  40. package/dist/cli/init.js +107 -0
  41. package/dist/cli/init.js.map +1 -0
  42. package/dist/cli/main.d.ts +2 -0
  43. package/dist/cli/main.js +25 -0
  44. package/dist/cli/main.js.map +1 -0
  45. package/dist/cli/program.d.ts +102 -0
  46. package/dist/cli/program.js +133 -0
  47. package/dist/cli/program.js.map +1 -0
  48. package/dist/cli/service.d.ts +27 -0
  49. package/dist/cli/service.js +252 -0
  50. package/dist/cli/service.js.map +1 -0
  51. package/dist/cli/start.d.ts +22 -0
  52. package/dist/cli/start.js +133 -0
  53. package/dist/cli/start.js.map +1 -0
  54. package/dist/cli/workflow-dry-run.d.ts +13 -0
  55. package/dist/cli/workflow-dry-run.js +144 -0
  56. package/dist/cli/workflow-dry-run.js.map +1 -0
  57. package/dist/config/field-catalog.d.ts +33 -0
  58. package/dist/config/field-catalog.js +172 -0
  59. package/dist/config/field-catalog.js.map +1 -0
  60. package/dist/config/filter-schema.d.ts +15 -0
  61. package/dist/config/filter-schema.js +110 -0
  62. package/dist/config/filter-schema.js.map +1 -0
  63. package/dist/config/index.d.ts +15 -0
  64. package/dist/config/index.js +16 -0
  65. package/dist/config/index.js.map +1 -0
  66. package/dist/config/issues.d.ts +27 -0
  67. package/dist/config/issues.js +37 -0
  68. package/dist/config/issues.js.map +1 -0
  69. package/dist/config/loader.d.ts +32 -0
  70. package/dist/config/loader.js +250 -0
  71. package/dist/config/loader.js.map +1 -0
  72. package/dist/config/manager.d.ts +153 -0
  73. package/dist/config/manager.js +276 -0
  74. package/dist/config/manager.js.map +1 -0
  75. package/dist/config/model.d.ts +334 -0
  76. package/dist/config/model.js +2 -0
  77. package/dist/config/model.js.map +1 -0
  78. package/dist/config/normalize.d.ts +20 -0
  79. package/dist/config/normalize.js +200 -0
  80. package/dist/config/normalize.js.map +1 -0
  81. package/dist/config/parameters.d.ts +37 -0
  82. package/dist/config/parameters.js +71 -0
  83. package/dist/config/parameters.js.map +1 -0
  84. package/dist/config/public.d.ts +6 -0
  85. package/dist/config/public.js +18 -0
  86. package/dist/config/public.js.map +1 -0
  87. package/dist/config/schemas.d.ts +538 -0
  88. package/dist/config/schemas.js +321 -0
  89. package/dist/config/schemas.js.map +1 -0
  90. package/dist/config/snapshot.d.ts +38 -0
  91. package/dist/config/snapshot.js +57 -0
  92. package/dist/config/snapshot.js.map +1 -0
  93. package/dist/config/validate.d.ts +33 -0
  94. package/dist/config/validate.js +346 -0
  95. package/dist/config/validate.js.map +1 -0
  96. package/dist/core/clock.d.ts +59 -0
  97. package/dist/core/clock.js +133 -0
  98. package/dist/core/clock.js.map +1 -0
  99. package/dist/core/duration.d.ts +19 -0
  100. package/dist/core/duration.js +93 -0
  101. package/dist/core/duration.js.map +1 -0
  102. package/dist/core/errors.d.ts +62 -0
  103. package/dist/core/errors.js +72 -0
  104. package/dist/core/errors.js.map +1 -0
  105. package/dist/core/ids.d.ts +57 -0
  106. package/dist/core/ids.js +88 -0
  107. package/dist/core/ids.js.map +1 -0
  108. package/dist/core/index.d.ts +13 -0
  109. package/dist/core/index.js +14 -0
  110. package/dist/core/index.js.map +1 -0
  111. package/dist/core/logger.d.ts +100 -0
  112. package/dist/core/logger.js +207 -0
  113. package/dist/core/logger.js.map +1 -0
  114. package/dist/core/paths.d.ts +84 -0
  115. package/dist/core/paths.js +138 -0
  116. package/dist/core/paths.js.map +1 -0
  117. package/dist/core/template.d.ts +136 -0
  118. package/dist/core/template.js +261 -0
  119. package/dist/core/template.js.map +1 -0
  120. package/dist/core/types.d.ts +544 -0
  121. package/dist/core/types.js +172 -0
  122. package/dist/core/types.js.map +1 -0
  123. package/dist/core/worker-protocol.d.ts +102 -0
  124. package/dist/core/worker-protocol.js +75 -0
  125. package/dist/core/worker-protocol.js.map +1 -0
  126. package/dist/executors/classify.d.ts +25 -0
  127. package/dist/executors/classify.js +54 -0
  128. package/dist/executors/classify.js.map +1 -0
  129. package/dist/executors/dispatcher.d.ts +35 -0
  130. package/dist/executors/dispatcher.js +68 -0
  131. package/dist/executors/dispatcher.js.map +1 -0
  132. package/dist/executors/env.d.ts +43 -0
  133. package/dist/executors/env.js +66 -0
  134. package/dist/executors/env.js.map +1 -0
  135. package/dist/executors/event-parser.d.ts +41 -0
  136. package/dist/executors/event-parser.js +106 -0
  137. package/dist/executors/event-parser.js.map +1 -0
  138. package/dist/executors/index.d.ts +12 -0
  139. package/dist/executors/index.js +13 -0
  140. package/dist/executors/index.js.map +1 -0
  141. package/dist/executors/log-capture.d.ts +57 -0
  142. package/dist/executors/log-capture.js +155 -0
  143. package/dist/executors/log-capture.js.map +1 -0
  144. package/dist/executors/process-identity.d.ts +124 -0
  145. package/dist/executors/process-identity.js +283 -0
  146. package/dist/executors/process-identity.js.map +1 -0
  147. package/dist/executors/shell-executor.d.ts +35 -0
  148. package/dist/executors/shell-executor.js +478 -0
  149. package/dist/executors/shell-executor.js.map +1 -0
  150. package/dist/executors/stream-redactor.d.ts +40 -0
  151. package/dist/executors/stream-redactor.js +89 -0
  152. package/dist/executors/stream-redactor.js.map +1 -0
  153. package/dist/executors/workspace.d.ts +10 -0
  154. package/dist/executors/workspace.js +47 -0
  155. package/dist/executors/workspace.js.map +1 -0
  156. package/dist/filters/evaluate.d.ts +77 -0
  157. package/dist/filters/evaluate.js +187 -0
  158. package/dist/filters/evaluate.js.map +1 -0
  159. package/dist/filters/fields.d.ts +35 -0
  160. package/dist/filters/fields.js +75 -0
  161. package/dist/filters/fields.js.map +1 -0
  162. package/dist/filters/index.d.ts +11 -0
  163. package/dist/filters/index.js +12 -0
  164. package/dist/filters/index.js.map +1 -0
  165. package/dist/filters/iso-date.d.ts +10 -0
  166. package/dist/filters/iso-date.js +42 -0
  167. package/dist/filters/iso-date.js.map +1 -0
  168. package/dist/filters/predicate.d.ts +24 -0
  169. package/dist/filters/predicate.js +178 -0
  170. package/dist/filters/predicate.js.map +1 -0
  171. package/dist/filters/priority.d.ts +51 -0
  172. package/dist/filters/priority.js +91 -0
  173. package/dist/filters/priority.js.map +1 -0
  174. package/dist/filters/pushdown.d.ts +12 -0
  175. package/dist/filters/pushdown.js +52 -0
  176. package/dist/filters/pushdown.js.map +1 -0
  177. package/dist/filters/shell-check.d.ts +110 -0
  178. package/dist/filters/shell-check.js +304 -0
  179. package/dist/filters/shell-check.js.map +1 -0
  180. package/dist/identities/github-app.d.ts +55 -0
  181. package/dist/identities/github-app.js +160 -0
  182. package/dist/identities/github-app.js.map +1 -0
  183. package/dist/identities/index.d.ts +6 -0
  184. package/dist/identities/index.js +7 -0
  185. package/dist/identities/index.js.map +1 -0
  186. package/dist/identities/jwt.d.ts +24 -0
  187. package/dist/identities/jwt.js +56 -0
  188. package/dist/identities/jwt.js.map +1 -0
  189. package/dist/lifecycle/context.d.ts +106 -0
  190. package/dist/lifecycle/context.js +170 -0
  191. package/dist/lifecycle/context.js.map +1 -0
  192. package/dist/lifecycle/engine.d.ts +185 -0
  193. package/dist/lifecycle/engine.js +551 -0
  194. package/dist/lifecycle/engine.js.map +1 -0
  195. package/dist/lifecycle/errors.d.ts +48 -0
  196. package/dist/lifecycle/errors.js +71 -0
  197. package/dist/lifecycle/errors.js.map +1 -0
  198. package/dist/lifecycle/index.d.ts +9 -0
  199. package/dist/lifecycle/index.js +9 -0
  200. package/dist/lifecycle/index.js.map +1 -0
  201. package/dist/lifecycle/performers.d.ts +66 -0
  202. package/dist/lifecycle/performers.js +179 -0
  203. package/dist/lifecycle/performers.js.map +1 -0
  204. package/dist/notifications/index.d.ts +6 -0
  205. package/dist/notifications/index.js +7 -0
  206. package/dist/notifications/index.js.map +1 -0
  207. package/dist/notifications/service.d.ts +115 -0
  208. package/dist/notifications/service.js +364 -0
  209. package/dist/notifications/service.js.map +1 -0
  210. package/dist/persistence/actions.d.ts +101 -0
  211. package/dist/persistence/actions.js +196 -0
  212. package/dist/persistence/actions.js.map +1 -0
  213. package/dist/persistence/blocks.d.ts +85 -0
  214. package/dist/persistence/blocks.js +140 -0
  215. package/dist/persistence/blocks.js.map +1 -0
  216. package/dist/persistence/cron-firings.d.ts +55 -0
  217. package/dist/persistence/cron-firings.js +70 -0
  218. package/dist/persistence/cron-firings.js.map +1 -0
  219. package/dist/persistence/database.d.ts +60 -0
  220. package/dist/persistence/database.js +124 -0
  221. package/dist/persistence/database.js.map +1 -0
  222. package/dist/persistence/errors.d.ts +39 -0
  223. package/dist/persistence/errors.js +67 -0
  224. package/dist/persistence/errors.js.map +1 -0
  225. package/dist/persistence/events.d.ts +72 -0
  226. package/dist/persistence/events.js +83 -0
  227. package/dist/persistence/events.js.map +1 -0
  228. package/dist/persistence/index.d.ts +18 -0
  229. package/dist/persistence/index.js +19 -0
  230. package/dist/persistence/index.js.map +1 -0
  231. package/dist/persistence/instance-lock.d.ts +26 -0
  232. package/dist/persistence/instance-lock.js +117 -0
  233. package/dist/persistence/instance-lock.js.map +1 -0
  234. package/dist/persistence/lock-keys.d.ts +16 -0
  235. package/dist/persistence/lock-keys.js +41 -0
  236. package/dist/persistence/lock-keys.js.map +1 -0
  237. package/dist/persistence/notifications.d.ts +113 -0
  238. package/dist/persistence/notifications.js +213 -0
  239. package/dist/persistence/notifications.js.map +1 -0
  240. package/dist/persistence/persistence.d.ts +46 -0
  241. package/dist/persistence/persistence.js +42 -0
  242. package/dist/persistence/persistence.js.map +1 -0
  243. package/dist/persistence/retention.d.ts +46 -0
  244. package/dist/persistence/retention.js +68 -0
  245. package/dist/persistence/retention.js.map +1 -0
  246. package/dist/persistence/runs.d.ts +215 -0
  247. package/dist/persistence/runs.js +417 -0
  248. package/dist/persistence/runs.js.map +1 -0
  249. package/dist/persistence/schema.d.ts +16 -0
  250. package/dist/persistence/schema.js +183 -0
  251. package/dist/persistence/schema.js.map +1 -0
  252. package/dist/persistence/sqlite.d.ts +49 -0
  253. package/dist/persistence/sqlite.js +131 -0
  254. package/dist/persistence/sqlite.js.map +1 -0
  255. package/dist/runs/controller.d.ts +307 -0
  256. package/dist/runs/controller.js +1078 -0
  257. package/dist/runs/controller.js.map +1 -0
  258. package/dist/runs/errors.d.ts +20 -0
  259. package/dist/runs/errors.js +26 -0
  260. package/dist/runs/errors.js.map +1 -0
  261. package/dist/runs/event-bus.d.ts +106 -0
  262. package/dist/runs/event-bus.js +105 -0
  263. package/dist/runs/event-bus.js.map +1 -0
  264. package/dist/runs/execution.d.ts +39 -0
  265. package/dist/runs/execution.js +146 -0
  266. package/dist/runs/execution.js.map +1 -0
  267. package/dist/runs/index.d.ts +12 -0
  268. package/dist/runs/index.js +13 -0
  269. package/dist/runs/index.js.map +1 -0
  270. package/dist/runs/retention.d.ts +64 -0
  271. package/dist/runs/retention.js +232 -0
  272. package/dist/runs/retention.js.map +1 -0
  273. package/dist/runs/workspace.d.ts +20 -0
  274. package/dist/runs/workspace.js +51 -0
  275. package/dist/runs/workspace.js.map +1 -0
  276. package/dist/scheduler/checks.d.ts +41 -0
  277. package/dist/scheduler/checks.js +111 -0
  278. package/dist/scheduler/checks.js.map +1 -0
  279. package/dist/scheduler/cron.d.ts +32 -0
  280. package/dist/scheduler/cron.js +83 -0
  281. package/dist/scheduler/cron.js.map +1 -0
  282. package/dist/scheduler/dry-run.d.ts +42 -0
  283. package/dist/scheduler/dry-run.js +167 -0
  284. package/dist/scheduler/dry-run.js.map +1 -0
  285. package/dist/scheduler/errors.d.ts +22 -0
  286. package/dist/scheduler/errors.js +22 -0
  287. package/dist/scheduler/errors.js.map +1 -0
  288. package/dist/scheduler/format.d.ts +3 -0
  289. package/dist/scheduler/format.js +73 -0
  290. package/dist/scheduler/format.js.map +1 -0
  291. package/dist/scheduler/index.d.ts +13 -0
  292. package/dist/scheduler/index.js +14 -0
  293. package/dist/scheduler/index.js.map +1 -0
  294. package/dist/scheduler/planner.d.ts +88 -0
  295. package/dist/scheduler/planner.js +255 -0
  296. package/dist/scheduler/planner.js.map +1 -0
  297. package/dist/scheduler/scheduler.d.ts +160 -0
  298. package/dist/scheduler/scheduler.js +680 -0
  299. package/dist/scheduler/scheduler.js.map +1 -0
  300. package/dist/scheduler/state.d.ts +26 -0
  301. package/dist/scheduler/state.js +25 -0
  302. package/dist/scheduler/state.js.map +1 -0
  303. package/dist/scheduler/types.d.ts +197 -0
  304. package/dist/scheduler/types.js +3 -0
  305. package/dist/scheduler/types.js.map +1 -0
  306. package/dist/service/index.d.ts +6 -0
  307. package/dist/service/index.js +7 -0
  308. package/dist/service/index.js.map +1 -0
  309. package/dist/service/install.d.ts +93 -0
  310. package/dist/service/install.js +250 -0
  311. package/dist/service/install.js.map +1 -0
  312. package/dist/service/unit.d.ts +50 -0
  313. package/dist/service/unit.js +171 -0
  314. package/dist/service/unit.js.map +1 -0
  315. package/dist/sources/github/adapter.d.ts +99 -0
  316. package/dist/sources/github/adapter.js +336 -0
  317. package/dist/sources/github/adapter.js.map +1 -0
  318. package/dist/sources/github/fields.d.ts +8 -0
  319. package/dist/sources/github/fields.js +72 -0
  320. package/dist/sources/github/fields.js.map +1 -0
  321. package/dist/sources/github/http.d.ts +100 -0
  322. package/dist/sources/github/http.js +288 -0
  323. package/dist/sources/github/http.js.map +1 -0
  324. package/dist/sources/github/index.d.ts +6 -0
  325. package/dist/sources/github/index.js +7 -0
  326. package/dist/sources/github/index.js.map +1 -0
  327. package/dist/sources/github/pushdown.d.ts +14 -0
  328. package/dist/sources/github/pushdown.js +47 -0
  329. package/dist/sources/github/pushdown.js.map +1 -0
  330. package/dist/sources/github/refs.d.ts +17 -0
  331. package/dist/sources/github/refs.js +61 -0
  332. package/dist/sources/github/refs.js.map +1 -0
  333. package/dist/sources/index.d.ts +6 -0
  334. package/dist/sources/index.js +7 -0
  335. package/dist/sources/index.js.map +1 -0
  336. package/dist/ui/index.d.ts +12 -0
  337. package/dist/ui/index.js +28 -0
  338. package/dist/ui/index.js.map +1 -0
  339. package/dist/ui/public/app.css +239 -0
  340. package/dist/ui/public/favicon.svg +1 -0
  341. package/dist/ui/public/index.html +27 -0
  342. package/dist/ui/public/js/client/api.js +68 -0
  343. package/dist/ui/public/js/client/app.js +146 -0
  344. package/dist/ui/public/js/client/dom.js +34 -0
  345. package/dist/ui/public/js/client/page.js +9 -0
  346. package/dist/ui/public/js/client/pages/actions.js +35 -0
  347. package/dist/ui/public/js/client/pages/blocked.js +58 -0
  348. package/dist/ui/public/js/client/pages/config.js +126 -0
  349. package/dist/ui/public/js/client/pages/dashboard.js +175 -0
  350. package/dist/ui/public/js/client/pages/run.js +367 -0
  351. package/dist/ui/public/js/client/pages/runs.js +72 -0
  352. package/dist/ui/public/js/client/pages/views.js +80 -0
  353. package/dist/ui/public/js/client/pages/workflows.js +291 -0
  354. package/dist/ui/public/js/client/types.js +1 -0
  355. package/dist/ui/public/js/client/ui.js +152 -0
  356. package/dist/ui/public/js/shared/dom.js +77 -0
  357. package/dist/ui/public/js/shared/events.js +88 -0
  358. package/dist/ui/public/js/shared/format.js +213 -0
  359. package/dist/ui/public/js/shared/logs.js +136 -0
  360. package/dist/ui/public/js/shared/params.js +90 -0
  361. package/dist/ui/public/js/shared/route.js +36 -0
  362. package/dist/ui/public/js/shared/sort.js +70 -0
  363. package/dist/ui/public/js/shared/sse.js +193 -0
  364. package/dist/ui/public/js/shared/throttle.js +65 -0
  365. package/dist/views/index.d.ts +6 -0
  366. package/dist/views/index.js +7 -0
  367. package/dist/views/index.js.map +1 -0
  368. package/dist/views/service.d.ts +131 -0
  369. package/dist/views/service.js +264 -0
  370. package/dist/views/service.js.map +1 -0
  371. package/docs/api.md +239 -0
  372. package/docs/configuration-reference.md +1785 -0
  373. package/docs/cron-semantics.md +96 -0
  374. package/docs/manual-tests/github-fixture/config.yaml +30 -0
  375. package/docs/manual-tests/github-fixture/helpers.sh +93 -0
  376. package/docs/manual-tests/github-fixture/identities.yaml +18 -0
  377. package/docs/manual-tests/github-fixture/scripts/test-worker.sh +100 -0
  378. package/docs/manual-tests/github-fixture/sources.yaml +13 -0
  379. package/docs/manual-tests/github-fixture/views/dependencies.yaml +17 -0
  380. package/docs/manual-tests/github-fixture/views/needs-maintainer.yaml +17 -0
  381. package/docs/manual-tests/github-fixture/workflows/coder-test.yaml +76 -0
  382. package/docs/manual-tests/github-fixture/workflows/commenter-test.yaml +63 -0
  383. package/docs/manual-tests/github-fixture/workflows/reviewer-test.yaml +60 -0
  384. package/docs/manual-tests/github.md +1308 -0
  385. package/docs/manual-tests/process-supervision.md +64 -0
  386. package/docs/manual-tests/systemd.md +68 -0
  387. package/docs/operations.md +271 -0
  388. package/docs/worker-protocol.md +145 -0
  389. package/examples/config/config.yaml +35 -0
  390. package/examples/config/identities.yaml +18 -0
  391. package/examples/config/sources.yaml +13 -0
  392. package/examples/config/views/needs-maintainer.yaml +15 -0
  393. package/examples/config/workflows/coder-project-a.yaml +86 -0
  394. package/examples/config/workflows/deploy.yaml +15 -0
  395. package/examples/config/workflows/nightly-maintenance.yaml +13 -0
  396. package/package.json +75 -4
@@ -0,0 +1,551 @@
1
+ /**
2
+ * Lifecycle engine (Spec §10): journaled, sequential hook chains with
3
+ * per-action retries, manual retry/skip, chain continuation and recovery.
4
+ *
5
+ * Invariants:
6
+ * - Every action state change is persisted before work continues
7
+ * (journal = `run_actions`, every attempt = `action_attempts`).
8
+ * - `succeeded`/`skipped` actions are never executed again.
9
+ * - Hooks always use the run's configuration snapshot (journal
10
+ * `action_config_json` + `runs.config_snapshot`), never the live config.
11
+ * - Notifications and change callbacks are published only after commit.
12
+ */
13
+ import { commentMarker, noopLogger, sleep, systemClock, systemTimers, } from '../core/index.js';
14
+ import { ShellExecutor } from '../executors/index.js';
15
+ import { parseRunSnapshot, resolveActionIdentity } from './context.js';
16
+ import { LifecycleBusyError, LifecycleError, describeActionError } from './errors.js';
17
+ import { performShell, performSourceComment, performSourceUpdate, resolveSourceTarget, } from './performers.js';
18
+ /** Event type persisted in `run_events` for every action state change. */
19
+ export const LIFECYCLE_ACTION_EVENT = 'lifecycle.action';
20
+ /** Event type persisted in `run_events` when a hook chain starts/ends. */
21
+ export const LIFECYCLE_CHAIN_EVENT = 'lifecycle.chain';
22
+ /** Default retry policy if a journaled action carries none (Spec §5.1: 3 × 30 s). */
23
+ export const DEFAULT_ACTION_RETRY = { maxAttempts: 3, delayMs: 30_000 };
24
+ /** See module docs. One instance per process; chains of one run never execute concurrently. */
25
+ export class LifecycleEngine {
26
+ options;
27
+ repos;
28
+ clock;
29
+ timers;
30
+ logger;
31
+ redact;
32
+ performerDeps;
33
+ /** Tail of the per-run execution queue (present while a chain of the run runs or waits). */
34
+ tails = new Map();
35
+ constructor(options) {
36
+ this.options = options;
37
+ this.repos = options.repositories;
38
+ this.clock = options.clock ?? systemClock;
39
+ this.timers = options.timers ?? systemTimers;
40
+ this.logger = options.logger ?? noopLogger;
41
+ this.redact = options.redact ?? ((s) => s);
42
+ this.performerDeps = {
43
+ sources: options.sources,
44
+ executor: options.executor ?? new ShellExecutor({ clock: this.clock, logger: this.logger }),
45
+ dataDir: options.dataDir,
46
+ shellCancelGraceMs: options.shellCancelGraceMs ?? 5_000,
47
+ maxShellLogBytes: options.maxShellLogBytes ?? 10 * 1024 * 1024,
48
+ };
49
+ }
50
+ /** True while a chain of `runId` is executing in this process. */
51
+ isBusy(runId) {
52
+ return this.tails.has(runId);
53
+ }
54
+ /**
55
+ * Run hook `hook` of a run: creates the journal for all actions of the hook
56
+ * from the snapshot (stable IDs, ordinals, `action_config_json`) and
57
+ * executes them sequentially. Idempotent/resumable: an existing journal is
58
+ * reused and only `pending` actions run (a `failed` action without
59
+ * `continue_on_error` keeps the chain stopped — use {@link retryAction}).
60
+ *
61
+ * @param snapshot defaults to `run.configSnapshot` (must be the run's snapshot, never the live config)
62
+ * @throws LifecycleBusyError if a chain of this run is already executing
63
+ */
64
+ async runHook(run, hook, snapshot, context = {}) {
65
+ const runId = typeof run === 'string' ? run : run.id;
66
+ return this.exclusive(runId, async () => {
67
+ const current = this.repos.runs.require(runId);
68
+ const snap = snapshot ?? parseRunSnapshot(current.configSnapshot, runId);
69
+ const configs = snap.workflow.hooks[hook] ?? [];
70
+ this.repos.actions.createJournal(runId, hook, configs.map((config) => ({ type: config.type, name: config.id, config })));
71
+ return this.executeChain(runId, hook, { item: context.item, signal: context.signal, snapshot: snap });
72
+ }, context.wait);
73
+ }
74
+ /**
75
+ * Manual retry (GUI "Retry Action"): the `failed` action gets a fresh round
76
+ * of attempts (its retry policy), then the chain continues from there. The
77
+ * main worker is not involved; `succeeded` actions are never repeated.
78
+ *
79
+ * @throws LifecycleError `lifecycle_not_retryable` if the action is not `failed`
80
+ */
81
+ async retryAction(actionId, context = {}) {
82
+ const action = this.repos.actions.require(actionId);
83
+ return this.exclusive(action.runId, async () => {
84
+ const current = this.repos.actions.require(actionId);
85
+ if (current.status !== 'failed') {
86
+ throw new LifecycleError('not_retryable', `Action ${actionId} is '${current.status}', only failed actions can be retried`, {
87
+ details: { actionId, status: current.status },
88
+ });
89
+ }
90
+ const owner = this.repos.runs.require(current.runId);
91
+ if (current.hook === 'on_start' && owner.status !== 'starting') {
92
+ // The run moved on (e.g. start_error → on_start_error); replaying on_start now would
93
+ // re-apply start labels to a finished run. Only skip/abandon are allowed.
94
+ throw new LifecycleError('not_retryable', `on_start action ${actionId} cannot be retried: run ${owner.id} is '${owner.status}', not 'starting' (skip it instead)`, { details: { actionId, hook: current.hook, runStatus: owner.status } });
95
+ }
96
+ this.persistActionStatus(current, 'pending', { manual: 'retry' });
97
+ const run = this.repos.runs.require(current.runId);
98
+ const snapshot = parseRunSnapshot(run.configSnapshot, run.id);
99
+ return this.executeChain(current.runId, current.hook, { item: context.item, signal: context.signal, snapshot });
100
+ }, context.wait);
101
+ }
102
+ /**
103
+ * Operator skips a `failed` (or `pending`) action; the chain then continues
104
+ * after it (e.g. the operator fixed the item manually).
105
+ */
106
+ async skipAction(actionId, context = {}) {
107
+ const action = this.repos.actions.require(actionId);
108
+ return this.exclusive(action.runId, async () => {
109
+ const current = this.repos.actions.require(actionId);
110
+ if (current.status !== 'failed' && current.status !== 'pending') {
111
+ throw new LifecycleError('not_skippable', `Action ${actionId} is '${current.status}' and cannot be skipped`, {
112
+ details: { actionId, status: current.status },
113
+ });
114
+ }
115
+ this.persistActionStatus(current, 'skipped', { manual: 'skip' });
116
+ const run = this.repos.runs.require(current.runId);
117
+ const snapshot = parseRunSnapshot(run.configSnapshot, run.id);
118
+ return this.executeChain(current.runId, current.hook, { item: context.item, signal: context.signal, snapshot });
119
+ }, context.wait);
120
+ }
121
+ /**
122
+ * Recovery after a controller restart (WI-08, Spec §14): actions left
123
+ * `running` are brought into a safe state, then every incomplete chain of
124
+ * the run is continued (in journal order). Safe state:
125
+ * - `source.comment`: marker lookup; found → `succeeded` (no duplicate), else `pending`
126
+ * (the next attempt looks up the marker again before posting).
127
+ * - `source.update`: `pending` (re-applied idempotently after re-reading the item).
128
+ * - `shell`: with an unfinished attempt the outcome is unknown and the old process
129
+ * may still run → `failed` (chain stops, manual retry); otherwise `pending`.
130
+ *
131
+ * @param options.hooks only continue these hooks (others are only made safe)
132
+ */
133
+ async resumeIncomplete(run, options = {}) {
134
+ const runId = typeof run === 'string' ? run : run.id;
135
+ return this.exclusive(runId, async () => {
136
+ const current = this.repos.runs.require(runId);
137
+ const snapshot = parseRunSnapshot(current.configSnapshot, runId);
138
+ for (const action of this.repos.actions.listForRun(runId)) {
139
+ if (action.status === 'running')
140
+ await this.makeSafe(action, current, snapshot, options.item);
141
+ }
142
+ const results = [];
143
+ for (const hook of this.hooksInOrder(runId)) {
144
+ if (options.hooks && !options.hooks.includes(hook))
145
+ continue;
146
+ const journal = this.repos.actions.listForHook(runId, hook);
147
+ if (!journal.some((a) => a.status === 'pending'))
148
+ continue;
149
+ if (stoppedAt(journal))
150
+ continue; // stopped chains wait for a manual retry
151
+ results.push(await this.executeChain(runId, hook, { item: options.item, signal: options.signal, snapshot }));
152
+ }
153
+ if (results.length === 0)
154
+ this.refreshLifecycleStatus(runId);
155
+ return results;
156
+ }, options.wait);
157
+ }
158
+ /**
159
+ * Abandon the rest of a hook chain (WI-08 recovery, e.g. an interrupted
160
+ * `on_start` of a run that is now finalized as `crashed`): interrupted
161
+ * actions are made safe (comment marker lookup), all `pending` ones become `skipped`.
162
+ */
163
+ async abandonHook(run, hook, context = {}) {
164
+ const runId = typeof run === 'string' ? run : run.id;
165
+ return this.exclusive(runId, async () => {
166
+ const current = this.repos.runs.require(runId);
167
+ const snapshot = parseRunSnapshot(current.configSnapshot, runId);
168
+ for (const action of this.repos.actions.listForHook(runId, hook)) {
169
+ if (action.status === 'running')
170
+ await this.makeSafe(action, current, snapshot, context.item, { notify: false });
171
+ }
172
+ for (const action of this.repos.actions.listForHook(runId, hook)) {
173
+ if (action.status === 'pending')
174
+ this.persistActionStatus(action, 'skipped', { abandoned: true });
175
+ }
176
+ this.refreshLifecycleStatus(runId);
177
+ const journal = this.repos.actions.listForHook(runId, hook);
178
+ const stop = stoppedAt(journal);
179
+ return { runId, hook, status: stop ? 'failed' : 'succeeded', actions: journal, failedAction: stop };
180
+ }, context.wait);
181
+ }
182
+ // -------------------------------------------------------------------------
183
+ // Chain execution
184
+ /**
185
+ * Serialize chain executions per run. Without `wait` a busy run is rejected
186
+ * immediately ({@link LifecycleBusyError}, API callers); with `wait` the call
187
+ * is queued behind the running/queued ones (internal callers such as WI-08).
188
+ */
189
+ async exclusive(runId, fn, wait = false) {
190
+ const previous = this.tails.get(runId);
191
+ if (previous && !wait)
192
+ throw new LifecycleBusyError(runId);
193
+ const execution = (async () => {
194
+ if (previous)
195
+ await previous;
196
+ return fn();
197
+ })();
198
+ const tail = execution.then(() => undefined, () => undefined);
199
+ this.tails.set(runId, tail);
200
+ try {
201
+ return await execution;
202
+ }
203
+ finally {
204
+ if (this.tails.get(runId) === tail)
205
+ this.tails.delete(runId);
206
+ }
207
+ }
208
+ async executeChain(runId, hook, opts) {
209
+ this.repos.transaction(() => {
210
+ this.repos.runs.update(runId, { lifecycleStatus: 'running' });
211
+ this.repos.events.append(runId, LIFECYCLE_CHAIN_EVENT, { hook, status: 'running' });
212
+ });
213
+ let result;
214
+ try {
215
+ result = await this.executeActions(runId, hook, opts);
216
+ return result;
217
+ }
218
+ finally {
219
+ const status = result?.status ?? 'failed';
220
+ this.repos.transaction(() => {
221
+ this.refreshLifecycleStatus(runId);
222
+ this.repos.events.append(runId, LIFECYCLE_CHAIN_EVENT, {
223
+ hook,
224
+ status,
225
+ ...(result?.failedAction ? { failedActionId: result.failedAction.id } : {}),
226
+ });
227
+ });
228
+ }
229
+ }
230
+ async executeActions(runId, hook, opts) {
231
+ const journal = this.repos.actions.listForHook(runId, hook);
232
+ for (const entry of journal) {
233
+ const action = this.repos.actions.require(entry.id);
234
+ if (action.status === 'succeeded' || action.status === 'skipped')
235
+ continue;
236
+ const config = actionConfig(action);
237
+ if (action.status === 'failed') {
238
+ if (config.continueOnError)
239
+ continue;
240
+ return this.hookResult(runId, hook, 'failed', action.id);
241
+ }
242
+ if (opts.signal?.aborted)
243
+ return this.hookResult(runId, hook, 'interrupted');
244
+ if (action.status === 'running') {
245
+ // Left running without recovery (should not happen in-process): make it safe first.
246
+ await this.makeSafe(action, this.repos.runs.require(runId), opts.snapshot, opts.item);
247
+ const safe = this.repos.actions.require(action.id);
248
+ if (safe.status === 'succeeded')
249
+ continue;
250
+ if (safe.status === 'failed') {
251
+ if (config.continueOnError)
252
+ continue;
253
+ return this.hookResult(runId, hook, 'failed', action.id);
254
+ }
255
+ }
256
+ const outcome = await this.executeAction(this.repos.actions.require(action.id), config, opts);
257
+ if (outcome === 'interrupted')
258
+ return this.hookResult(runId, hook, 'interrupted');
259
+ if (outcome === 'failed' && !config.continueOnError)
260
+ return this.hookResult(runId, hook, 'failed', action.id);
261
+ }
262
+ return this.hookResult(runId, hook, 'succeeded');
263
+ }
264
+ hookResult(runId, hook, status, failedActionId) {
265
+ const actions = this.repos.actions.listForHook(runId, hook);
266
+ return {
267
+ runId,
268
+ hook,
269
+ status,
270
+ actions,
271
+ failedAction: failedActionId !== undefined ? (actions.find((a) => a.id === failedActionId) ?? null) : null,
272
+ };
273
+ }
274
+ /** Execute one action with its retry policy. The action is `pending` on entry. */
275
+ async executeAction(action, config, opts) {
276
+ const policy = retryPolicy(config);
277
+ let roundAttempts = 0;
278
+ let current = action;
279
+ for (;;) {
280
+ roundAttempts += 1;
281
+ const hadPriorAttempts = current.attempts > 0;
282
+ const attempt = this.repos.transaction(() => {
283
+ const a = this.repos.actions.startAttempt(current.id);
284
+ this.appendActionEvent(this.repos.actions.require(current.id), { attempt: a.attempt });
285
+ return a;
286
+ });
287
+ this.publishChange(current.id);
288
+ const run = this.repos.runs.require(current.runId);
289
+ const input = {
290
+ run,
291
+ snapshot: opts.snapshot,
292
+ hook: current.hook,
293
+ action: this.repos.actions.require(current.id),
294
+ attempt: attempt.attempt,
295
+ hadPriorAttempts,
296
+ item: opts.item,
297
+ signal: opts.signal,
298
+ now: this.clock.now(),
299
+ };
300
+ let result;
301
+ try {
302
+ result = await this.perform(input, config);
303
+ }
304
+ catch (err) {
305
+ const info = describeActionError(err, this.redact);
306
+ if (opts.signal?.aborted) {
307
+ // Shutdown/abort is not a failure of the action: close the attempt, keep the action resumable.
308
+ this.repos.transaction(() => {
309
+ this.repos.actions.finishAttempt(attempt.id, 'failed', { error: info });
310
+ const reset = this.repos.actions.setStatus(current.id, 'pending');
311
+ this.appendActionEvent(reset, { attempt: attempt.attempt, error: info, interrupted: true });
312
+ });
313
+ this.publishChange(current.id);
314
+ return 'interrupted';
315
+ }
316
+ const giveUp = !info.retryable || roundAttempts >= policy.maxAttempts;
317
+ current = this.repos.transaction(() => {
318
+ this.repos.actions.finishAttempt(attempt.id, 'failed', { error: info });
319
+ if (giveUp) {
320
+ const failed = this.repos.actions.setStatus(current.id, 'failed', { error: info });
321
+ this.appendActionEvent(failed, { attempt: attempt.attempt, error: info });
322
+ if (!config.continueOnError)
323
+ this.queueFailureNotification(failed, info);
324
+ return failed;
325
+ }
326
+ const a = this.repos.actions.require(current.id);
327
+ this.appendActionEvent(a, { attempt: attempt.attempt, error: info, retryInMs: retryDelay(policy, info) });
328
+ return a;
329
+ });
330
+ this.publishChange(current.id);
331
+ this.logger.warn('lifecycle action attempt failed', {
332
+ runId: current.runId,
333
+ hook: current.hook,
334
+ actionId: current.id,
335
+ attempt: attempt.attempt,
336
+ error: info,
337
+ giveUp,
338
+ });
339
+ if (giveUp)
340
+ return 'failed';
341
+ try {
342
+ await sleep(this.timers, retryDelay(policy, info), opts.signal);
343
+ }
344
+ catch {
345
+ this.persistActionStatus(this.repos.actions.require(current.id), 'pending', { interrupted: true });
346
+ return 'interrupted';
347
+ }
348
+ continue;
349
+ }
350
+ this.repos.transaction(() => {
351
+ this.repos.actions.finishAttempt(attempt.id, 'succeeded', { externalKey: result.externalKey });
352
+ const done = this.repos.actions.setStatus(current.id, 'succeeded', {
353
+ ...(result.externalKey !== null ? { externalKey: result.externalKey } : {}),
354
+ });
355
+ this.appendActionEvent(done, { attempt: attempt.attempt, details: result.details });
356
+ });
357
+ this.publishChange(current.id);
358
+ return 'succeeded';
359
+ }
360
+ }
361
+ perform(input, config) {
362
+ switch (config.type) {
363
+ case 'source.update':
364
+ return performSourceUpdate(this.performerDeps, input, config);
365
+ case 'source.comment':
366
+ return performSourceComment(this.performerDeps, input, config);
367
+ case 'shell':
368
+ return performShell(this.performerDeps, input, config);
369
+ }
370
+ }
371
+ /** Bring an action left `running` (crash/restart) into a safe state, see {@link resumeIncomplete}. */
372
+ async makeSafe(action, run, snapshot, item, options = {}) {
373
+ const config = actionConfig(action);
374
+ const open = this.repos.actions.listAttempts(action.id).find((a) => a.finishedAt === null);
375
+ const interrupted = {
376
+ code: 'lifecycle_interrupted',
377
+ message: 'Attempt interrupted by a controller restart; outcome unknown',
378
+ retryable: true,
379
+ outcomeUnknown: true,
380
+ };
381
+ if (config.type === 'source.comment' && open) {
382
+ try {
383
+ const identity = resolveActionIdentity(config, snapshot);
384
+ const { adapter, item: target } = await resolveSourceTarget(this.performerDeps, run, snapshot, item);
385
+ const found = identity ? await adapter.findCommentByMarker(target, commentMarker(run.id, action.id), identity) : null;
386
+ if (found) {
387
+ this.repos.transaction(() => {
388
+ this.repos.actions.finishAttempt(open.id, 'succeeded', { externalKey: found.id });
389
+ const done = this.repos.actions.setStatus(action.id, 'succeeded', { externalKey: found.id });
390
+ this.appendActionEvent(done, { attempt: open.attempt, details: { reconciled: true, recovery: true } });
391
+ });
392
+ this.publishChange(action.id);
393
+ return;
394
+ }
395
+ }
396
+ catch (err) {
397
+ // Lookup failed: stay safe — the next attempt looks up the marker again before posting.
398
+ this.logger.warn('lifecycle recovery: marker lookup failed', { runId: run.id, actionId: action.id, error: err });
399
+ }
400
+ }
401
+ if (config.type === 'shell' && open) {
402
+ const info = { ...interrupted, retryable: false, message: `${interrupted.message} (shell action is not repeated automatically)` };
403
+ this.repos.transaction(() => {
404
+ this.repos.actions.finishAttempt(open.id, 'failed', { error: info });
405
+ const failed = this.repos.actions.setStatus(action.id, 'failed', { error: info });
406
+ this.appendActionEvent(failed, { attempt: open.attempt, error: info, recovery: true });
407
+ if (options.notify !== false && !config.continueOnError)
408
+ this.queueFailureNotification(failed, info);
409
+ });
410
+ this.publishChange(action.id);
411
+ return;
412
+ }
413
+ this.repos.transaction(() => {
414
+ if (open)
415
+ this.repos.actions.finishAttempt(open.id, 'failed', { error: interrupted });
416
+ const reset = this.repos.actions.setStatus(action.id, 'pending');
417
+ this.appendActionEvent(reset, { recovery: true });
418
+ });
419
+ this.publishChange(action.id);
420
+ }
421
+ // -------------------------------------------------------------------------
422
+ // Persistence helpers
423
+ persistActionStatus(action, status, extra) {
424
+ this.repos.transaction(() => {
425
+ const updated = this.repos.actions.setStatus(action.id, status);
426
+ this.appendActionEvent(updated, extra);
427
+ this.refreshLifecycleStatus(action.runId);
428
+ });
429
+ this.publishChange(action.id);
430
+ }
431
+ appendActionEvent(action, extra) {
432
+ this.repos.events.append(action.runId, LIFECYCLE_ACTION_EVENT, {
433
+ actionId: action.id,
434
+ hook: action.hook,
435
+ ordinal: action.ordinal,
436
+ type: action.type,
437
+ name: action.name,
438
+ status: action.status,
439
+ ...(action.externalKey !== null ? { externalKey: action.externalKey } : {}),
440
+ ...extra,
441
+ });
442
+ }
443
+ publishChange(actionId) {
444
+ const listener = this.options.onActionChange;
445
+ if (!listener)
446
+ return;
447
+ this.repos.afterCommit(() => {
448
+ try {
449
+ listener(this.repos.actions.require(actionId));
450
+ }
451
+ catch (err) {
452
+ this.logger.warn('lifecycle onActionChange listener failed', { actionId, error: err });
453
+ }
454
+ });
455
+ }
456
+ queueFailureNotification(action, error) {
457
+ const notifier = this.options.notifier;
458
+ if (!notifier)
459
+ return;
460
+ const run = this.repos.runs.require(action.runId);
461
+ const payload = {
462
+ runId: run.id,
463
+ workflowId: run.workflowId,
464
+ hook: action.hook,
465
+ actionId: action.id,
466
+ actionName: action.name,
467
+ actionType: action.type,
468
+ ordinal: action.ordinal,
469
+ attempts: action.attempts,
470
+ error,
471
+ sourceItemKey: run.sourceItemKey,
472
+ sourceUrl: run.sourceUrl,
473
+ };
474
+ this.repos.afterCommit(() => {
475
+ try {
476
+ notifier.notify('lifecycle_action_failed', payload);
477
+ }
478
+ catch (err) {
479
+ this.logger.error('lifecycle notification failed', { runId: run.id, actionId: action.id, error: err });
480
+ }
481
+ });
482
+ }
483
+ /** Recompute `runs.lifecycle_status` from the whole journal of the run. */
484
+ refreshLifecycleStatus(runId) {
485
+ const status = aggregateLifecycleStatus(this.repos.actions.listForRun(runId));
486
+ if (status !== null)
487
+ this.repos.runs.update(runId, { lifecycleStatus: status });
488
+ }
489
+ /** Hooks of a run in journal order. */
490
+ hooksInOrder(runId) {
491
+ const hooks = [];
492
+ for (const a of this.repos.actions.listForRun(runId))
493
+ if (!hooks.includes(a.hook))
494
+ hooks.push(a.hook);
495
+ return hooks;
496
+ }
497
+ }
498
+ // ---------------------------------------------------------------------------
499
+ // Pure helpers
500
+ /** Action config persisted in the journal (`action_config_json`). */
501
+ export function actionConfig(action) {
502
+ const config = action.config;
503
+ if (!config || typeof config !== 'object' || config.type !== action.type) {
504
+ throw new LifecycleError('invalid_action_config', `Journal entry ${action.id} has no valid action configuration`, {
505
+ details: { actionId: action.id },
506
+ });
507
+ }
508
+ return config;
509
+ }
510
+ function retryPolicy(config) {
511
+ const r = config.retry;
512
+ return {
513
+ maxAttempts: Math.max(1, Math.floor(r?.maxAttempts ?? DEFAULT_ACTION_RETRY.maxAttempts)),
514
+ delayMs: Math.max(0, r?.delayMs ?? DEFAULT_ACTION_RETRY.delayMs),
515
+ };
516
+ }
517
+ function retryDelay(policy, error) {
518
+ return Math.max(policy.delayMs, error.retryAfterMs ?? 0);
519
+ }
520
+ /** First `failed` action without `continue_on_error` (the chain stops there), else `null`. */
521
+ export function stoppedAt(journal) {
522
+ for (const a of journal) {
523
+ if (a.status !== 'failed')
524
+ continue;
525
+ const cfg = a.config;
526
+ if (!cfg?.continueOnError)
527
+ return a;
528
+ }
529
+ return null;
530
+ }
531
+ /**
532
+ * Aggregate `runs.lifecycle_status` over all hook chains of a run:
533
+ * `running` if an action runs, else `failed` if any chain stopped at a failed
534
+ * action, else `pending` if actions wait, else `succeeded`; `null` without journal.
535
+ */
536
+ export function aggregateLifecycleStatus(actions) {
537
+ if (actions.length === 0)
538
+ return null;
539
+ if (actions.some((a) => a.status === 'running'))
540
+ return 'running';
541
+ const byHook = new Map();
542
+ for (const a of actions)
543
+ byHook.set(a.hook, [...(byHook.get(a.hook) ?? []), a]);
544
+ const chains = [...byHook.values()].map((j) => [...j].sort((x, y) => x.ordinal - y.ordinal));
545
+ if (chains.some((j) => stoppedAt(j)))
546
+ return 'failed';
547
+ if (actions.some((a) => a.status === 'pending'))
548
+ return 'pending';
549
+ return 'succeeded';
550
+ }
551
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/lifecycle/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Error model of lifecycle actions: every failed attempt is persisted as an
3
+ * {@link ActionErrorInfo} (`action_attempts.error_json`, `run_actions.last_error_json`).
4
+ * The `retryable` flag decides whether further automatic attempts are made.
5
+ */
6
+ import { OrchestratorError, type Redactor, type SourceErrorKind } from '../core/index.js';
7
+ /** Persisted, secret-free description of a failed attempt. */
8
+ export interface ActionErrorInfo {
9
+ /** Machine-readable code, e.g. `source_transient`, `template_unknown_placeholder`, `shell_exit`. */
10
+ code: string;
11
+ message: string;
12
+ /** Whether another automatic attempt may help. */
13
+ retryable: boolean;
14
+ /** A mutating call may have taken effect although it failed (reconcile before repeating). */
15
+ outcomeUnknown?: boolean;
16
+ /** `SourceError.kind` for source failures. */
17
+ kind?: SourceErrorKind;
18
+ /** HTTP status of the failed source call, if any. */
19
+ status?: number;
20
+ /** Suggested wait (rate limits); the retry delay is at least this long. */
21
+ retryAfterMs?: number;
22
+ /** Additional diagnostics (exit code, log paths, ...). */
23
+ details?: Record<string, unknown>;
24
+ }
25
+ /** Error raised by the lifecycle engine itself (action execution, invalid input). */
26
+ export declare class LifecycleError extends OrchestratorError {
27
+ readonly retryable: boolean;
28
+ readonly outcomeUnknown: boolean;
29
+ constructor(code: string, message: string, options?: {
30
+ retryable?: boolean;
31
+ outcomeUnknown?: boolean;
32
+ details?: Record<string, unknown>;
33
+ cause?: unknown;
34
+ });
35
+ }
36
+ /** Thrown when a chain of the same run is already being executed in this process. */
37
+ export declare class LifecycleBusyError extends LifecycleError {
38
+ constructor(runId: string);
39
+ }
40
+ /**
41
+ * Convert any thrown value into an {@link ActionErrorInfo}.
42
+ *
43
+ * - `SourceError`: keeps `kind`, `retryable`, `outcomeUnknown`, `status`, `retryAfterMs`.
44
+ * - `TemplateError` and other `OrchestratorError`s: not retryable (configuration problem).
45
+ * - {@link LifecycleError}: its own flags.
46
+ * - Anything else (unexpected exception): retryable, so the configured attempts apply.
47
+ */
48
+ export declare function describeActionError(err: unknown, redact?: Redactor): ActionErrorInfo;