@shipfox/api-workflows 11.0.0 → 12.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 (346) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/CHANGELOG.md +107 -0
  3. package/README.md +75 -0
  4. package/dist/core/agent-defaults.d.ts +2 -1
  5. package/dist/core/agent-defaults.d.ts.map +1 -1
  6. package/dist/core/agent-defaults.js.map +1 -1
  7. package/dist/core/checkout.d.ts +7 -21
  8. package/dist/core/checkout.d.ts.map +1 -1
  9. package/dist/core/checkout.js +122 -41
  10. package/dist/core/checkout.js.map +1 -1
  11. package/dist/core/entities/job-execution.d.ts +8 -0
  12. package/dist/core/entities/job-execution.d.ts.map +1 -1
  13. package/dist/core/entities/job-execution.js +13 -1
  14. package/dist/core/entities/job-execution.js.map +1 -1
  15. package/dist/core/entities/job-listener-event.d.ts +2 -0
  16. package/dist/core/entities/job-listener-event.d.ts.map +1 -1
  17. package/dist/core/entities/job-listener-event.js.map +1 -1
  18. package/dist/core/entities/step.d.ts +13 -3
  19. package/dist/core/entities/step.d.ts.map +1 -1
  20. package/dist/core/entities/step.js +6 -0
  21. package/dist/core/entities/step.js.map +1 -1
  22. package/dist/core/entities/workflow-run-attempt.d.ts +1 -0
  23. package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
  24. package/dist/core/entities/workflow-run-attempt.js.map +1 -1
  25. package/dist/core/entities/workflow-run.d.ts +17 -0
  26. package/dist/core/entities/workflow-run.d.ts.map +1 -1
  27. package/dist/core/entities/workflow-run.js.map +1 -1
  28. package/dist/core/errors.d.ts +9 -2
  29. package/dist/core/errors.d.ts.map +1 -1
  30. package/dist/core/errors.js +10 -5
  31. package/dist/core/errors.js.map +1 -1
  32. package/dist/core/job-execution.d.ts.map +1 -1
  33. package/dist/core/job-execution.js +14 -8
  34. package/dist/core/job-execution.js.map +1 -1
  35. package/dist/core/job-transition/decide-job-activation.d.ts +1 -0
  36. package/dist/core/job-transition/decide-job-activation.d.ts.map +1 -1
  37. package/dist/core/job-transition/decide-job-activation.js +1 -0
  38. package/dist/core/job-transition/decide-job-activation.js.map +1 -1
  39. package/dist/core/job-transition/derive-job-success.d.ts +1 -0
  40. package/dist/core/job-transition/derive-job-success.d.ts.map +1 -1
  41. package/dist/core/job-transition/derive-job-success.js +5 -8
  42. package/dist/core/job-transition/derive-job-success.js.map +1 -1
  43. package/dist/core/listener-execution-materialization.d.ts +6 -3
  44. package/dist/core/listener-execution-materialization.d.ts.map +1 -1
  45. package/dist/core/listener-execution-materialization.js +44 -6
  46. package/dist/core/listener-execution-materialization.js.map +1 -1
  47. package/dist/core/resolve-trigger-reference.d.ts +11 -0
  48. package/dist/core/resolve-trigger-reference.d.ts.map +1 -0
  49. package/dist/core/resolve-trigger-reference.js +39 -0
  50. package/dist/core/resolve-trigger-reference.js.map +1 -0
  51. package/dist/core/run-workflow.d.ts +1 -0
  52. package/dist/core/run-workflow.d.ts.map +1 -1
  53. package/dist/core/run-workflow.js +1 -0
  54. package/dist/core/run-workflow.js.map +1 -1
  55. package/dist/core/step-config/agent.d.ts +1 -2
  56. package/dist/core/step-config/agent.d.ts.map +1 -1
  57. package/dist/core/step-config/agent.js +22 -7
  58. package/dist/core/step-config/agent.js.map +1 -1
  59. package/dist/core/step-config/assemble-run-context.d.ts +19 -8
  60. package/dist/core/step-config/assemble-run-context.d.ts.map +1 -1
  61. package/dist/core/step-config/assemble-run-context.js +51 -19
  62. package/dist/core/step-config/assemble-run-context.js.map +1 -1
  63. package/dist/core/step-config/complete-step-dispatch-config.d.ts.map +1 -1
  64. package/dist/core/step-config/complete-step-dispatch-config.js +72 -4
  65. package/dist/core/step-config/complete-step-dispatch-config.js.map +1 -1
  66. package/dist/core/step-config/index.d.ts +1 -0
  67. package/dist/core/step-config/index.d.ts.map +1 -1
  68. package/dist/core/step-config/index.js +1 -0
  69. package/dist/core/step-config/index.js.map +1 -1
  70. package/dist/core/step-config/materialize-job-execution-steps.d.ts +1 -1
  71. package/dist/core/step-config/materialize-job-execution-steps.d.ts.map +1 -1
  72. package/dist/core/step-config/materialize-job-execution-steps.js +49 -8
  73. package/dist/core/step-config/materialize-job-execution-steps.js.map +1 -1
  74. package/dist/core/step-config/materialize-workflow-model.d.ts +3 -3
  75. package/dist/core/step-config/materialize-workflow-model.d.ts.map +1 -1
  76. package/dist/core/step-config/materialize-workflow-model.js +9 -5
  77. package/dist/core/step-config/materialize-workflow-model.js.map +1 -1
  78. package/dist/core/step-config/resolve-job-execution-name.d.ts +3 -3
  79. package/dist/core/step-config/resolve-job-execution-name.d.ts.map +1 -1
  80. package/dist/core/step-config/resolve-job-execution-name.js +24 -13
  81. package/dist/core/step-config/resolve-job-execution-name.js.map +1 -1
  82. package/dist/core/step-config/resolve-step-config.d.ts.map +1 -1
  83. package/dist/core/step-config/resolve-step-config.js +174 -9
  84. package/dist/core/step-config/resolve-step-config.js.map +1 -1
  85. package/dist/core/step-config/resolve-workflow-run-name.d.ts +19 -0
  86. package/dist/core/step-config/resolve-workflow-run-name.d.ts.map +1 -0
  87. package/dist/core/step-config/resolve-workflow-run-name.js +73 -0
  88. package/dist/core/step-config/resolve-workflow-run-name.js.map +1 -0
  89. package/dist/core/step-transition/decide-step-transition.js.map +1 -1
  90. package/dist/core/step-transition/evaluate-gate.d.ts +2 -1
  91. package/dist/core/step-transition/evaluate-gate.d.ts.map +1 -1
  92. package/dist/core/step-transition/evaluate-gate.js +5 -3
  93. package/dist/core/step-transition/evaluate-gate.js.map +1 -1
  94. package/dist/core/workflow-run-creation.d.ts +3 -0
  95. package/dist/core/workflow-run-creation.d.ts.map +1 -1
  96. package/dist/core/workflow-run-creation.js +22 -7
  97. package/dist/core/workflow-run-creation.js.map +1 -1
  98. package/dist/db/db.d.ts +278 -10
  99. package/dist/db/db.d.ts.map +1 -1
  100. package/dist/db/db.js +2 -0
  101. package/dist/db/db.js.map +1 -1
  102. package/dist/db/index.d.ts +3 -2
  103. package/dist/db/index.d.ts.map +1 -1
  104. package/dist/db/index.js +2 -1
  105. package/dist/db/index.js.map +1 -1
  106. package/dist/db/job-listener-events.d.ts +2 -0
  107. package/dist/db/job-listener-events.d.ts.map +1 -1
  108. package/dist/db/job-listener-events.js +1 -0
  109. package/dist/db/job-listener-events.js.map +1 -1
  110. package/dist/db/job-listeners.d.ts +2 -0
  111. package/dist/db/job-listeners.d.ts.map +1 -1
  112. package/dist/db/job-listeners.js +81 -21
  113. package/dist/db/job-listeners.js.map +1 -1
  114. package/dist/db/schema/job-executions.d.ts +3 -3
  115. package/dist/db/schema/job-executions.d.ts.map +1 -1
  116. package/dist/db/schema/job-executions.js +8 -4
  117. package/dist/db/schema/job-executions.js.map +1 -1
  118. package/dist/db/schema/job-listener-events.d.ts +20 -0
  119. package/dist/db/schema/job-listener-events.d.ts.map +1 -1
  120. package/dist/db/schema/job-listener-events.js +2 -0
  121. package/dist/db/schema/job-listener-events.js.map +1 -1
  122. package/dist/db/schema/step-attempts.js +2 -2
  123. package/dist/db/schema/step-attempts.js.map +1 -1
  124. package/dist/db/schema/steps.d.ts +4 -2
  125. package/dist/db/schema/steps.d.ts.map +1 -1
  126. package/dist/db/schema/steps.js +1 -1
  127. package/dist/db/schema/steps.js.map +1 -1
  128. package/dist/db/schema/workflow-run-attempts.d.ts +21 -2
  129. package/dist/db/schema/workflow-run-attempts.d.ts.map +1 -1
  130. package/dist/db/schema/workflow-run-attempts.js +2 -0
  131. package/dist/db/schema/workflow-run-attempts.js.map +1 -1
  132. package/dist/db/schema/workflow-run-counters.d.ts +43 -0
  133. package/dist/db/schema/workflow-run-counters.d.ts.map +1 -0
  134. package/dist/db/schema/workflow-run-counters.js +10 -0
  135. package/dist/db/schema/workflow-run-counters.js.map +1 -0
  136. package/dist/db/schema/workflow-runs.d.ts +54 -1
  137. package/dist/db/schema/workflow-runs.d.ts.map +1 -1
  138. package/dist/db/schema/workflow-runs.js +10 -2
  139. package/dist/db/schema/workflow-runs.js.map +1 -1
  140. package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
  141. package/dist/db/workflow-runs/job-executions.js +35 -14
  142. package/dist/db/workflow-runs/job-executions.js.map +1 -1
  143. package/dist/db/workflow-runs/jobs.d.ts +2 -0
  144. package/dist/db/workflow-runs/jobs.d.ts.map +1 -1
  145. package/dist/db/workflow-runs/jobs.js +9 -5
  146. package/dist/db/workflow-runs/jobs.js.map +1 -1
  147. package/dist/db/workflow-runs/queries.d.ts +51 -0
  148. package/dist/db/workflow-runs/queries.d.ts.map +1 -1
  149. package/dist/db/workflow-runs/queries.js +82 -2
  150. package/dist/db/workflow-runs/queries.js.map +1 -1
  151. package/dist/db/workflow-runs/run-create.d.ts +1 -0
  152. package/dist/db/workflow-runs/run-create.d.ts.map +1 -1
  153. package/dist/db/workflow-runs/run-create.js +159 -32
  154. package/dist/db/workflow-runs/run-create.js.map +1 -1
  155. package/dist/db/workflow-runs/run-rerun.d.ts.map +1 -1
  156. package/dist/db/workflow-runs/run-rerun.js +13 -5
  157. package/dist/db/workflow-runs/run-rerun.js.map +1 -1
  158. package/dist/db/workflow-runs/shared.d.ts +1 -0
  159. package/dist/db/workflow-runs/shared.d.ts.map +1 -1
  160. package/dist/db/workflow-runs/shared.js +2 -1
  161. package/dist/db/workflow-runs/shared.js.map +1 -1
  162. package/dist/db/workflow-runs/steps.js +3 -3
  163. package/dist/db/workflow-runs/steps.js.map +1 -1
  164. package/dist/db/workflow-runs.d.ts +4 -3
  165. package/dist/db/workflow-runs.d.ts.map +1 -1
  166. package/dist/db/workflow-runs.js +3 -2
  167. package/dist/db/workflow-runs.js.map +1 -1
  168. package/dist/metrics/instance.d.ts +1 -0
  169. package/dist/metrics/instance.d.ts.map +1 -1
  170. package/dist/metrics/instance.js +9 -0
  171. package/dist/metrics/instance.js.map +1 -1
  172. package/dist/presentation/dto/checkout-token.d.ts +1 -0
  173. package/dist/presentation/dto/checkout-token.d.ts.map +1 -1
  174. package/dist/presentation/dto/checkout-token.js +1 -0
  175. package/dist/presentation/dto/checkout-token.js.map +1 -1
  176. package/dist/presentation/dto/index.d.ts +1 -1
  177. package/dist/presentation/dto/index.d.ts.map +1 -1
  178. package/dist/presentation/dto/index.js +1 -1
  179. package/dist/presentation/dto/index.js.map +1 -1
  180. package/dist/presentation/dto/step.d.ts.map +1 -1
  181. package/dist/presentation/dto/step.js +2 -2
  182. package/dist/presentation/dto/step.js.map +1 -1
  183. package/dist/presentation/dto/workflow-run.d.ts +3 -1
  184. package/dist/presentation/dto/workflow-run.d.ts.map +1 -1
  185. package/dist/presentation/dto/workflow-run.js +34 -0
  186. package/dist/presentation/dto/workflow-run.js.map +1 -1
  187. package/dist/presentation/inter-module.d.ts.map +1 -1
  188. package/dist/presentation/inter-module.js +31 -3
  189. package/dist/presentation/inter-module.js.map +1 -1
  190. package/dist/presentation/routes/checkout-token.d.ts +1 -1
  191. package/dist/presentation/routes/checkout-token.d.ts.map +1 -1
  192. package/dist/presentation/routes/checkout-token.js +32 -20
  193. package/dist/presentation/routes/checkout-token.js.map +1 -1
  194. package/dist/presentation/routes/leased-step.d.ts +2 -0
  195. package/dist/presentation/routes/leased-step.d.ts.map +1 -1
  196. package/dist/presentation/routes/leased-step.js +2 -1
  197. package/dist/presentation/routes/leased-step.js.map +1 -1
  198. package/dist/presentation/routes/list-runs.d.ts.map +1 -1
  199. package/dist/presentation/routes/list-runs.js +9 -3
  200. package/dist/presentation/routes/list-runs.js.map +1 -1
  201. package/dist/presentation/routes/project-access.d.ts +1 -0
  202. package/dist/presentation/routes/project-access.d.ts.map +1 -1
  203. package/dist/presentation/routes/report-step.d.ts.map +1 -1
  204. package/dist/presentation/routes/report-step.js +9 -2
  205. package/dist/presentation/routes/report-step.js.map +1 -1
  206. package/dist/presentation/subscribers/on-job-steps-settled.js +1 -1
  207. package/dist/presentation/subscribers/on-job-steps-settled.js.map +1 -1
  208. package/dist/presentation/subscribers/on-runner-job-claimed.d.ts.map +1 -1
  209. package/dist/presentation/subscribers/on-runner-job-claimed.js +21 -0
  210. package/dist/presentation/subscribers/on-runner-job-claimed.js.map +1 -1
  211. package/dist/temporal/activities/index.d.ts.map +1 -1
  212. package/dist/temporal/activities/index.js +2 -1
  213. package/dist/temporal/activities/index.js.map +1 -1
  214. package/dist/temporal/activities/orchestration-activities.d.ts +1 -0
  215. package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
  216. package/dist/temporal/activities/orchestration-activities.js.map +1 -1
  217. package/dist/temporal/constants.d.ts +1 -0
  218. package/dist/temporal/constants.d.ts.map +1 -1
  219. package/dist/temporal/constants.js +1 -0
  220. package/dist/temporal/constants.js.map +1 -1
  221. package/dist/temporal/index.d.ts +1 -1
  222. package/dist/temporal/index.d.ts.map +1 -1
  223. package/dist/temporal/index.js +1 -1
  224. package/dist/temporal/index.js.map +1 -1
  225. package/dist/temporal/workflows/index.bundle.js +82 -43
  226. package/dist/temporal/workflows/index.d.ts +1 -1
  227. package/dist/temporal/workflows/index.d.ts.map +1 -1
  228. package/dist/temporal/workflows/index.js +1 -1
  229. package/dist/temporal/workflows/index.js.map +1 -1
  230. package/dist/temporal/workflows/job-execution-orchestration.d.ts +5 -0
  231. package/dist/temporal/workflows/job-execution-orchestration.d.ts.map +1 -1
  232. package/dist/temporal/workflows/job-execution-orchestration.js +77 -43
  233. package/dist/temporal/workflows/job-execution-orchestration.js.map +1 -1
  234. package/dist/temporal/workflows/test-env.d.ts +5 -1
  235. package/dist/temporal/workflows/test-env.d.ts.map +1 -1
  236. package/dist/temporal/workflows/test-env.js +32 -11
  237. package/dist/temporal/workflows/test-env.js.map +1 -1
  238. package/dist/tsconfig.test.tsbuildinfo +1 -1
  239. package/drizzle/0000_initial.sql +14 -2
  240. package/drizzle/0001_windy_sunfire.sql +1 -0
  241. package/drizzle/meta/0000_snapshot.json +93 -1
  242. package/drizzle/meta/0001_snapshot.json +1711 -0
  243. package/drizzle/meta/_journal.json +2 -2
  244. package/package.json +19 -19
  245. package/src/core/agent-defaults.ts +2 -1
  246. package/src/core/checkout.test.ts +378 -67
  247. package/src/core/checkout.ts +142 -59
  248. package/src/core/entities/job-execution.test.ts +21 -0
  249. package/src/core/entities/job-execution.ts +24 -0
  250. package/src/core/entities/job-listener-event.ts +3 -0
  251. package/src/core/entities/step.ts +15 -3
  252. package/src/core/entities/workflow-run-attempt.ts +1 -0
  253. package/src/core/entities/workflow-run.ts +16 -0
  254. package/src/core/errors.ts +21 -7
  255. package/src/core/job-execution.ts +27 -4
  256. package/src/core/job-transition/decide-job-activation.test.ts +4 -0
  257. package/src/core/job-transition/decide-job-activation.ts +2 -0
  258. package/src/core/job-transition/derive-job-success.test.ts +12 -0
  259. package/src/core/job-transition/derive-job-success.ts +6 -9
  260. package/src/core/listener-execution-materialization.test.ts +2 -0
  261. package/src/core/listener-execution-materialization.ts +57 -11
  262. package/src/core/resolve-trigger-reference.test.ts +160 -0
  263. package/src/core/resolve-trigger-reference.ts +53 -0
  264. package/src/core/run-workflow.ts +2 -0
  265. package/src/core/step-config/agent.ts +29 -12
  266. package/src/core/step-config/assemble-run-context.test.ts +149 -6
  267. package/src/core/step-config/assemble-run-context.ts +87 -25
  268. package/src/core/step-config/complete-step-dispatch-config.test.ts +125 -2
  269. package/src/core/step-config/complete-step-dispatch-config.ts +83 -1
  270. package/src/core/step-config/index.ts +7 -0
  271. package/src/core/step-config/materialize-job-execution-steps.test.ts +250 -1
  272. package/src/core/step-config/materialize-job-execution-steps.ts +57 -10
  273. package/src/core/step-config/materialize-workflow-model.test.ts +212 -4
  274. package/src/core/step-config/materialize-workflow-model.ts +33 -28
  275. package/src/core/step-config/resolve-job-execution-name.test.ts +37 -15
  276. package/src/core/step-config/resolve-job-execution-name.ts +30 -15
  277. package/src/core/step-config/resolve-step-config.ts +175 -10
  278. package/src/core/step-config/resolve-workflow-run-name.test.ts +115 -0
  279. package/src/core/step-config/resolve-workflow-run-name.ts +108 -0
  280. package/src/core/step-transition/decide-step-transition.ts +2 -2
  281. package/src/core/step-transition/evaluate-gate.test.ts +8 -0
  282. package/src/core/step-transition/evaluate-gate.ts +8 -1
  283. package/src/core/workflow-run-creation.test.ts +7 -4
  284. package/src/core/workflow-run-creation.ts +13 -7
  285. package/src/db/db.ts +2 -0
  286. package/src/db/index.ts +6 -0
  287. package/src/db/job-listener-events.test.ts +19 -0
  288. package/src/db/job-listener-events.ts +3 -0
  289. package/src/db/job-listeners.test.ts +187 -5
  290. package/src/db/job-listeners.ts +122 -30
  291. package/src/db/schema/job-executions.ts +12 -5
  292. package/src/db/schema/job-listener-events.ts +3 -0
  293. package/src/db/schema/step-attempts.ts +2 -2
  294. package/src/db/schema/steps.ts +2 -1
  295. package/src/db/schema/workflow-run-attempts.ts +2 -0
  296. package/src/db/schema/workflow-run-counters.ts +13 -0
  297. package/src/db/schema/workflow-runs.ts +11 -2
  298. package/src/db/workflow-runs/job-executions.ts +37 -15
  299. package/src/db/workflow-runs/jobs.ts +17 -4
  300. package/src/db/workflow-runs/queries.test.ts +206 -0
  301. package/src/db/workflow-runs/queries.ts +146 -2
  302. package/src/db/workflow-runs/run-create.test.ts +606 -8
  303. package/src/db/workflow-runs/run-create.ts +185 -40
  304. package/src/db/workflow-runs/run-rerun.test.ts +61 -2
  305. package/src/db/workflow-runs/run-rerun.ts +15 -5
  306. package/src/db/workflow-runs/shared.ts +2 -0
  307. package/src/db/workflow-runs/steps.ts +3 -3
  308. package/src/db/workflow-runs.ts +7 -0
  309. package/src/metrics/instance.ts +14 -0
  310. package/src/presentation/dto/checkout-token.test.ts +19 -9
  311. package/src/presentation/dto/checkout-token.ts +2 -1
  312. package/src/presentation/dto/index.ts +1 -1
  313. package/src/presentation/dto/job.test.ts +9 -0
  314. package/src/presentation/dto/step.test.ts +12 -0
  315. package/src/presentation/dto/step.ts +5 -2
  316. package/src/presentation/dto/workflow-run.ts +44 -2
  317. package/src/presentation/inter-module.test.ts +165 -0
  318. package/src/presentation/inter-module.ts +38 -4
  319. package/src/presentation/routes/checkout-token.test.ts +357 -142
  320. package/src/presentation/routes/checkout-token.ts +56 -26
  321. package/src/presentation/routes/get-run.test.ts +2 -0
  322. package/src/presentation/routes/get-step-secrets.test.ts +7 -2
  323. package/src/presentation/routes/leased-step.ts +9 -1
  324. package/src/presentation/routes/list-runs.test.ts +57 -0
  325. package/src/presentation/routes/list-runs.ts +8 -3
  326. package/src/presentation/routes/report-step.test.ts +25 -0
  327. package/src/presentation/routes/report-step.ts +10 -2
  328. package/src/presentation/subscribers/on-job-steps-settled.ts +1 -1
  329. package/src/presentation/subscribers/on-runner-job-claimed.test.ts +49 -0
  330. package/src/presentation/subscribers/on-runner-job-claimed.ts +22 -0
  331. package/src/temporal/activities/index.ts +1 -0
  332. package/src/temporal/activities/orchestration-activities.ts +1 -0
  333. package/src/temporal/constants.ts +1 -0
  334. package/src/temporal/index.ts +1 -0
  335. package/src/temporal/workflows/index.ts +1 -0
  336. package/src/temporal/workflows/job-execution-orchestration.test.ts +142 -6
  337. package/src/temporal/workflows/job-execution-orchestration.ts +99 -50
  338. package/src/temporal/workflows/run-orchestration.test.ts +1 -1
  339. package/src/temporal/workflows/test-env.ts +50 -13
  340. package/test/factories/project.ts +2 -0
  341. package/test/factories/workflow-model.ts +80 -26
  342. package/test/factories/workflow-run.ts +4 -1
  343. package/test/fixtures/agent-inter-module.ts +2 -1
  344. package/test/fixtures/job-with-steps.ts +1 -1
  345. package/tsconfig.build.tsbuildinfo +1 -1
  346. package/drizzle/0001_agent_tool_materialization.sql +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/run-create.ts"],"sourcesContent":["import {createWorkflowModelSnapshot, type WorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {analyzeContextKeyAccess, type ResolvedFieldSegment} from '@shipfox/expression';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {eq} from 'drizzle-orm';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport {\n createAgentToolMaterializationSnapshot,\n loadAgentToolMaterializationContext,\n} from '#core/agent-tools.js';\nimport type {\n TriggerPayload,\n WorkflowRun,\n WorkflowSourceSnapshot,\n} from '#core/entities/workflow-run.js';\nimport {InterpolationUnresolvableError} from '#core/errors.js';\nimport type {MaterializedWorkflowJob} from '#core/step-config/materialize-workflow-model.js';\nimport type {WorkflowStepTemplateDiagnostic} from '#core/step-config/resolve-step-config.js';\nimport {\n deriveInitialJobExecutionPlan,\n materializeWorkflowRunJobs,\n} from '#core/workflow-run-creation.js';\nimport {recordWorkflowRunCreated} from '#metrics/instance.js';\nimport {db} from '../db.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {type MaterializedRunGraphJob, persistMaterializedRunGraph} from './run-graph.js';\n\nexport type WorkflowModelJob = WorkflowModel['jobs'][number];\n\nexport interface ReferencedVariable {\n readonly key: string;\n readonly field: InterpolationUnresolvableError['field'];\n readonly source: string;\n readonly envKey?: string | undefined;\n}\n\nexport interface CreateWorkflowRunParams {\n workspaceId: string;\n projectId: string;\n definitionId: string;\n name?: string | undefined;\n model: WorkflowModel;\n triggerPayload: TriggerPayload;\n inputs?: Record<string, unknown> | undefined;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n triggerIdempotencyKey?: string | undefined;\n resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n integrations?: IntegrationsModuleClient | undefined;\n projects?: ProjectsModuleClient | undefined;\n}\n\nexport async function createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun> {\n const agentToolContext =\n params.integrations === undefined\n ? undefined\n : await loadAgentToolMaterializationContext({\n model: params.model,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n integrations: params.integrations,\n projects: params.projects,\n });\n const agentToolMaterialization = createAgentToolMaterializationSnapshot({\n model: params.model,\n context: agentToolContext,\n });\n const result = await db().transaction(async (tx) => {\n const insertResult = await tx\n .insert(workflowRuns)\n .values({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n name: params.name ?? params.model.name,\n status: 'pending',\n currentAttempt: 1,\n triggerProvider: params.triggerPayload.provider ?? null,\n triggerSource: params.triggerPayload.source,\n triggerEvent: params.triggerPayload.event,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n sourceSnapshot: params.sourceSnapshot ?? null,\n triggerIdempotencyKey: params.triggerIdempotencyKey ?? null,\n })\n .onConflictDoNothing({target: workflowRuns.triggerIdempotencyKey})\n .returning();\n\n const runRow = insertResult[0];\n if (!runRow) {\n // Conflict path: skip jobs/steps/outbox so the first insert keeps ownership of side effects.\n if (!params.triggerIdempotencyKey) {\n throw new Error('Insert returned no rows');\n }\n const existing = await tx\n .select()\n .from(workflowRuns)\n .where(eq(workflowRuns.triggerIdempotencyKey, params.triggerIdempotencyKey))\n .limit(1);\n const existingRow = existing[0];\n if (!existingRow) {\n throw new Error(\n `Idempotency conflict but existing run missing for key ${params.triggerIdempotencyKey}`,\n );\n }\n return {run: toWorkflowRun(existingRow), created: false};\n }\n\n const run = toWorkflowRun(runRow);\n const [attemptRow] = await tx\n .insert(workflowRunAttempts)\n .values({\n workflowRunId: runRow.id,\n attempt: 1,\n status: 'pending',\n model: createWorkflowModelSnapshot(params.model),\n agentToolMaterialization,\n })\n .returning();\n if (!attemptRow) throw new Error('Insert returned no rows');\n\n // Resolving one-shot templates here gives interpolation access to the inserted run id.\n // If resolution fails, the transaction rolls back the run, jobs, steps, and outbox event together.\n // Listening steps are resolved later when a job execution is created.\n const oneShotJobs = params.model.jobs.filter((job) => job.mode !== 'listening');\n const vars = await loadReferencedVariables({\n model: params.model,\n jobs: oneShotJobs,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n secrets: params.secrets,\n });\n const materializedJobs = await materializeWorkflowRunJobs({\n run,\n model: params.model,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n vars,\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n agentToolContext,\n agentToolSnapshot: agentToolMaterialization,\n });\n\n const graphJobs = materializeRunGraphJobs({\n params,\n run,\n vars,\n materializedJobs,\n });\n await persistMaterializedRunGraph(tx, {\n run,\n workflowRunAttempt: attemptRow,\n materializedJobs: graphJobs,\n });\n\n logTemplateDiagnostics({\n workflowRunId: runRow.id,\n diagnostics: materializedJobs.flatMap((job) =>\n job.steps.flatMap((step) =>\n (step.diagnostics ?? []).map((diagnostic) => ({\n jobKey: job.key,\n stepName: step.name,\n ...diagnostic,\n })),\n ),\n ),\n });\n\n return {run, created: true};\n });\n\n if (result.created)\n recordWorkflowRunCreated(result.run.triggerPayload.provider ?? result.run.triggerSource);\n\n return result.run;\n}\n\nexport async function loadReferencedVariables(params: {\n readonly model: WorkflowModel;\n readonly jobs?: readonly WorkflowModelJob[] | undefined;\n readonly workspaceId: string;\n readonly projectId: string;\n readonly definitionId: string;\n readonly secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<Record<string, string> | undefined> {\n const references = referencedVariables(params.model, params.jobs ?? params.model.jobs);\n const keys = [...new Set(references.map((reference) => reference.key))].sort();\n if (keys.length === 0) return undefined;\n\n if (!params.secrets) throw new Error('Secrets client is not configured.');\n const {values: vars} = await params.secrets.getVariablesByNamespace({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n namespace: '',\n });\n const missingKey = keys.find((key) => !(key in vars));\n if (missingKey !== undefined) {\n const reference = references.find((candidate) => candidate.key === missingKey);\n throw new InterpolationUnresolvableError(params.definitionId, {\n field: reference?.field ?? 'env',\n source: reference?.source ?? `vars.${missingKey}`,\n ...(reference?.envKey === undefined ? {} : {envKey: reference.envKey}),\n });\n }\n\n return vars;\n}\n\nfunction materializeRunGraphJobs(params: {\n readonly params: CreateWorkflowRunParams;\n readonly run: WorkflowRun;\n readonly vars: Record<string, string> | undefined;\n readonly materializedJobs: readonly MaterializedWorkflowJob[];\n}): readonly MaterializedRunGraphJob[] {\n return params.materializedJobs.map((job, jobIndex) => ({\n job: {\n key: job.key,\n mode: job.mode,\n name: workflowTemplateSource(job.name),\n status: 'pending' as const,\n checkoutPersistCredentials: job.checkout.persistCredentials,\n checkoutPermissionsContents: job.checkout.permissions.contents,\n success: job.success ?? null,\n executionTimeoutMs: job.executionTimeoutMs ?? null,\n listeningTimeoutMs: job.listening?.timeoutMs ?? null,\n maxExecutions: job.listening?.maxExecutions ?? null,\n onResolve: job.listening?.onResolve ?? null,\n batchDebounceMs: job.listening?.batch?.debounceMs ?? null,\n batchMaxSize: job.listening?.batch?.maxSize ?? null,\n batchMaxWaitMs: job.listening?.batch?.maxWaitMs ?? null,\n listeningOn: job.listening?.on ? [...job.listening.on] : null,\n listeningUntil: job.listening?.until ? [...job.listening.until] : null,\n dependencies: [...job.dependencies],\n runner: job.runner.length === 0 ? null : [...job.runner],\n position: job.position,\n },\n createExecution: (jobRow) => {\n if (jobRow.mode === 'listening') return undefined;\n\n const fallbackName = `${jobRow.key} #1`;\n const modelJob = params.params.model.jobs[jobIndex];\n if (!modelJob) return undefined;\n const executionPlan = deriveInitialJobExecutionPlan({\n run: params.run,\n modelJob,\n job,\n jobId: jobRow.id,\n sequence: 1,\n fallbackName,\n triggerPayload: params.params.triggerPayload,\n inputs: params.params.inputs ?? null,\n vars: params.vars,\n });\n\n return {\n sequence: 1,\n name: executionPlan.name,\n runner: [...executionPlan.runner],\n status: 'pending' as const,\n evaluationTrace:\n executionPlan.evaluationTrace?.length === 0 ? null : executionPlan.evaluationTrace,\n };\n },\n createSteps: () =>\n job.steps.map((step) => ({\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: step.status,\n type: step.type,\n config: step.config,\n condition: step.condition ?? null,\n configPlan: step.configPlan ?? null,\n authoredConfig: step.authoredConfig,\n position: step.position,\n })),\n }));\n}\n\nfunction referencedVariables(\n model: WorkflowModel,\n jobs: readonly WorkflowModelJob[],\n): readonly ReferencedVariable[] {\n const references: ReferencedVariable[] = [];\n\n if (jobs.length > 0) {\n collectTemplateVariableReferences(model.templates?.env, references);\n }\n\n for (const job of jobs) {\n collectFieldVariableReferences(job.name, references, {field: 'job.name'});\n for (const template of job.runnerTemplates ?? []) {\n collectFieldVariableReferences(template, references, {field: 'job.runner'});\n }\n collectTemplateVariableReferences(job.outputs, references, {field: 'job.outputs'});\n collectTemplateVariableReferences(job.templates?.env, references);\n\n for (const step of job.steps) {\n collectFieldVariableReferences(step.templates?.name, references, {field: 'step.name'});\n if (step.kind === 'run') {\n collectFieldVariableReferences(step.templates?.command, references, {field: 'run'});\n collectTemplateVariableReferences(step.templates?.env, references);\n } else {\n collectFieldVariableReferences(step.templates?.prompt, references, {field: 'agent.prompt'});\n collectFieldVariableReferences(step.templates?.model, references, {field: 'agent.model'});\n collectFieldVariableReferences(step.templates?.provider, references, {\n field: 'agent.provider',\n });\n }\n }\n }\n\n return references;\n}\n\nfunction collectTemplateVariableReferences(\n templates: Readonly<Record<string, readonly ResolvedFieldSegment[]>> | undefined,\n references: ReferencedVariable[],\n source?: {\n readonly field: InterpolationUnresolvableError['field'];\n },\n): void {\n for (const [envKey, template] of Object.entries(templates ?? {})) {\n collectFieldVariableReferences(\n template,\n references,\n source === undefined ? {field: 'env', envKey} : source,\n );\n }\n}\n\nfunction collectFieldVariableReferences(\n template: readonly ResolvedFieldSegment[] | undefined,\n references: ReferencedVariable[],\n source: {\n readonly field: InterpolationUnresolvableError['field'];\n readonly envKey?: string | undefined;\n },\n): void {\n for (const segment of template ?? []) {\n if (segment.kind === 'literal') continue;\n const keyAccess = analyzeContextKeyAccess(segment.expression);\n for (const reference of keyAccess.references) {\n if (reference.root !== 'vars') continue;\n references.push({\n key: reference.key,\n field: source.field,\n source: segment.expression.source,\n envKey: source.envKey,\n });\n }\n }\n}\n\nfunction workflowTemplateSource(template: MaterializedWorkflowJob['name']): string | null {\n if (template === undefined) return null;\n\n return template\n .map((segment) =>\n segment.kind === 'literal' ? segment.value : `$${'{{'} ${segment.expression.source} ${'}}'}`,\n )\n .join('');\n}\n\nfunction logTemplateDiagnostics(params: {\n readonly workflowRunId: string;\n readonly diagnostics: readonly (WorkflowStepTemplateDiagnostic & {\n readonly jobKey: string;\n readonly stepName: string;\n })[];\n}): void {\n if (params.diagnostics.length === 0) return;\n\n logger().warn(\n {workflowRunId: params.workflowRunId, diagnostics: params.diagnostics},\n 'Workflow interpolation resolved with diagnostics',\n );\n}\n"],"names":["createWorkflowModelSnapshot","analyzeContextKeyAccess","logger","eq","createAgentToolMaterializationSnapshot","loadAgentToolMaterializationContext","InterpolationUnresolvableError","deriveInitialJobExecutionPlan","materializeWorkflowRunJobs","recordWorkflowRunCreated","db","workflowRunAttempts","toWorkflowRun","workflowRuns","persistMaterializedRunGraph","createWorkflowRun","params","agentToolContext","integrations","undefined","model","workspaceId","projectId","projects","agentToolMaterialization","context","result","transaction","tx","insertResult","insert","values","definitionId","name","status","currentAttempt","triggerProvider","triggerPayload","provider","triggerSource","source","triggerEvent","event","inputs","sourceSnapshot","triggerIdempotencyKey","onConflictDoNothing","target","returning","runRow","Error","existing","select","from","where","limit","existingRow","run","created","attemptRow","workflowRunId","id","attempt","oneShotJobs","jobs","filter","job","mode","vars","loadReferencedVariables","secrets","materializedJobs","resolveAgentDefaults","agentToolSnapshot","graphJobs","materializeRunGraphJobs","workflowRunAttempt","logTemplateDiagnostics","diagnostics","flatMap","steps","step","map","diagnostic","jobKey","key","stepName","references","referencedVariables","keys","Set","reference","sort","length","getVariablesByNamespace","namespace","missingKey","find","candidate","field","envKey","jobIndex","workflowTemplateSource","checkoutPersistCredentials","checkout","persistCredentials","checkoutPermissionsContents","permissions","contents","success","executionTimeoutMs","listeningTimeoutMs","listening","timeoutMs","maxExecutions","onResolve","batchDebounceMs","batch","debounceMs","batchMaxSize","maxSize","batchMaxWaitMs","maxWaitMs","listeningOn","on","listeningUntil","until","dependencies","runner","position","createExecution","jobRow","fallbackName","modelJob","executionPlan","jobId","sequence","evaluationTrace","createSteps","sourceLocation","type","config","condition","configPlan","authoredConfig","collectTemplateVariableReferences","templates","env","collectFieldVariableReferences","template","runnerTemplates","outputs","kind","command","prompt","Object","entries","segment","keyAccess","expression","root","push","value","join","warn"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/run-create.ts"],"sourcesContent":["import {\n createWorkflowModelSnapshot,\n WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS,\n type WorkflowModel,\n} from '@shipfox/api-definitions-dto';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {\n analyzeContextKeyAccess,\n type ResolvedFieldSegment,\n type WorkflowExpression,\n} from '@shipfox/expression';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {eq, sql} from 'drizzle-orm';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport {\n createAgentToolMaterializationSnapshot,\n loadAgentToolMaterializationContext,\n} from '#core/agent-tools.js';\nimport type {\n TriggerPayload,\n WorkflowRun,\n WorkflowSourceSnapshot,\n} from '#core/entities/workflow-run.js';\nimport {InterpolationUnresolvableError} from '#core/errors.js';\nimport {resolveWorkflowRunTriggerReference} from '#core/resolve-trigger-reference.js';\nimport {assembleCreationContext} from '#core/step-config/assemble-run-context.js';\nimport type {MaterializedWorkflowJob} from '#core/step-config/materialize-workflow-model.js';\nimport type {WorkflowStepTemplateDiagnostic} from '#core/step-config/resolve-step-config.js';\nimport {resolveWorkflowRunName} from '#core/step-config/resolve-workflow-run-name.js';\nimport {\n deriveInitialJobExecutionPlan,\n materializeWorkflowRunJobs,\n} from '#core/workflow-run-creation.js';\nimport {\n recordWorkflowDisplayNameResolutionDegraded,\n recordWorkflowRunCreated,\n} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {workflowRunCounters} from '../schema/workflow-run-counters.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {type MaterializedRunGraphJob, persistMaterializedRunGraph} from './run-graph.js';\n\nexport type WorkflowModelJob = WorkflowModel['jobs'][number];\n\nexport interface ReferencedVariable {\n readonly key: string;\n readonly field: InterpolationUnresolvableError['field'];\n readonly source: string;\n readonly envKey?: string | undefined;\n}\n\nexport interface CreateWorkflowRunParams {\n workspaceId: string;\n projectId: string;\n definitionId: string;\n name?: string | undefined;\n model: WorkflowModel;\n triggerPayload: TriggerPayload;\n triggerConnectionId?: string | undefined;\n inputs?: Record<string, unknown> | undefined;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n triggerIdempotencyKey?: string | undefined;\n resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n integrations?: IntegrationsModuleClient | undefined;\n projects?: ProjectsModuleClient | undefined;\n}\n\nexport async function createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun> {\n const triggerReference = await resolveWorkflowRunTriggerReference({\n workspaceId: params.workspaceId,\n triggerConnectionId: params.triggerConnectionId,\n triggerPayload: params.triggerPayload,\n integrations: params.integrations,\n projects: params.projects,\n });\n const staticName = params.name ?? params.model.name;\n const agentToolContext =\n params.integrations === undefined\n ? undefined\n : await loadAgentToolMaterializationContext({\n model: params.model,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n integrations: params.integrations,\n projects: params.projects,\n });\n const agentToolMaterialization = createAgentToolMaterializationSnapshot({\n model: params.model,\n context: agentToolContext,\n });\n const result = await db().transaction(async (tx) => {\n // Serialize idempotent trigger resolution separately from per-definition number\n // allocation so a replay never consumes a number, including when two deliveries\n // race before either run is visible.\n if (params.triggerIdempotencyKey) {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtext(${params.triggerIdempotencyKey}))`,\n );\n const existing = await tx\n .select()\n .from(workflowRuns)\n .where(eq(workflowRuns.triggerIdempotencyKey, params.triggerIdempotencyKey))\n .limit(1);\n const existingRow = existing[0];\n if (existingRow) return {run: toWorkflowRun(existingRow), created: false};\n }\n\n // Keep allocation on the existing transaction so a trigger burst cannot pin\n // every pool connection and then wait for a second connection per run.\n const number = await allocateWorkflowRunNumber(tx, params.definitionId);\n\n const insertResult = await tx\n .insert(workflowRuns)\n .values({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n number,\n name: null,\n workflowName: staticName,\n status: 'pending',\n currentAttempt: 1,\n triggerProvider: params.triggerPayload.provider ?? null,\n triggerSource: params.triggerPayload.source,\n triggerEvent: params.triggerPayload.event,\n triggerPayload: params.triggerPayload,\n triggerReference,\n inputs: params.inputs ?? null,\n sourceSnapshot: params.sourceSnapshot ?? null,\n triggerIdempotencyKey: params.triggerIdempotencyKey ?? null,\n })\n .onConflictDoNothing({target: workflowRuns.triggerIdempotencyKey})\n .returning();\n\n const runRow = insertResult[0];\n if (!runRow) {\n // Conflict path: skip jobs/steps/outbox so the first insert keeps ownership of side effects.\n if (!params.triggerIdempotencyKey) {\n throw new Error('Insert returned no rows');\n }\n const existing = await tx\n .select()\n .from(workflowRuns)\n .where(eq(workflowRuns.triggerIdempotencyKey, params.triggerIdempotencyKey))\n .limit(1);\n const existingRow = existing[0];\n if (!existingRow) {\n throw new Error(\n `Idempotency conflict but existing run missing for key ${params.triggerIdempotencyKey}`,\n );\n }\n return {run: toWorkflowRun(existingRow), created: false};\n }\n\n // Resolving run-creation templates and predicates here gives them a stable variable snapshot\n // and interpolation access to the inserted run id. Run-name resolution is display-only and\n // persists only a resolved override. If resolution fails, the transaction rolls back the run,\n // jobs, steps, and outbox event together. Listening steps are resolved later when a job\n // execution is created.\n const provisionalRun = toWorkflowRun(runRow);\n const oneShotJobs = params.model.jobs.filter((job) => job.mode !== 'listening');\n const vars = await loadReferencedVariables({\n model: params.model,\n jobs: oneShotJobs,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n secrets: params.secrets,\n });\n const runNameResolution = resolveWorkflowRunName({\n runName: params.model.runName,\n context: assembleCreationContext({\n run: provisionalRun,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n vars,\n }).values,\n });\n const [resolvedRunRow] = await tx\n .update(workflowRuns)\n .set({name: runNameResolution.value, updatedAt: new Date()})\n .where(eq(workflowRuns.id, provisionalRun.id))\n .returning();\n if (!resolvedRunRow)\n throw new Error(`Workflow run missing after name resolution: ${runRow.id}`);\n const run = toWorkflowRun(resolvedRunRow);\n const [attemptRow] = await tx\n .insert(workflowRunAttempts)\n .values({\n workflowRunId: runRow.id,\n attempt: 1,\n status: 'pending',\n model: createWorkflowModelSnapshot(params.model),\n vars,\n agentToolMaterialization,\n })\n .returning();\n if (!attemptRow) throw new Error('Insert returned no rows');\n\n const materializedJobs = await materializeWorkflowRunJobs({\n run,\n model: params.model,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n vars,\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n agentToolContext,\n agentToolSnapshot: agentToolMaterialization,\n });\n\n const graphJobs = materializeRunGraphJobs({\n params,\n run,\n vars,\n materializedJobs,\n });\n await persistMaterializedRunGraph(tx, {\n run,\n workflowRunAttempt: attemptRow,\n materializedJobs: graphJobs,\n });\n\n logTemplateDiagnostics({\n workflowRunId: runRow.id,\n diagnostics: materializedJobs.flatMap((job) =>\n job.steps.flatMap((step) =>\n (step.diagnostics ?? []).map((diagnostic) => ({\n jobKey: job.key,\n stepName: step.name,\n ...diagnostic,\n })),\n ),\n ),\n });\n\n return {\n run,\n created: true,\n nameDegradation: runNameResolution.degradation,\n };\n });\n\n if (result.created && result.nameDegradation !== undefined) {\n recordWorkflowDisplayNameResolutionDegraded('workflow.run_name', result.nameDegradation.cause);\n logger().warn(\n {\n workflowRunId: result.run.id,\n definitionId: result.run.definitionId,\n field: 'workflow.run_name',\n cause: result.nameDegradation.cause,\n ...(result.nameDegradation.expression === undefined\n ? {}\n : {expression: result.nameDegradation.expression.slice(0, 256)}),\n },\n 'Workflow run name resolution degraded to the static workflow name',\n );\n }\n\n if (result.created) {\n recordWorkflowRunCreated(result.run.triggerPayload.provider ?? result.run.triggerSource);\n }\n\n return result.run;\n}\n\nasync function allocateWorkflowRunNumber(tx: Tx, definitionId: string): Promise<number> {\n const [counterRow] = await tx\n .insert(workflowRunCounters)\n .values({definitionId, nextNumber: 2})\n .onConflictDoUpdate({\n target: workflowRunCounters.definitionId,\n set: {nextNumber: sql`${workflowRunCounters.nextNumber} + 1`},\n })\n .returning({number: sql<number>`${workflowRunCounters.nextNumber} - 1`});\n if (!counterRow) throw new Error('Run counter allocation returned no rows');\n return counterRow.number;\n}\n\nexport async function loadReferencedVariables(params: {\n readonly model: WorkflowModel;\n readonly jobs?: readonly WorkflowModelJob[] | undefined;\n readonly workspaceId: string;\n readonly projectId: string;\n readonly definitionId: string;\n readonly secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<Record<string, string> | undefined> {\n const references = referencedVariables(params.model, params.jobs ?? params.model.jobs);\n const keys = [...new Set(references.map((reference) => reference.key))].sort();\n if (keys.length === 0) return undefined;\n\n const requiresSecrets = (reference: ReferencedVariable) =>\n reference.field !== 'job.execution_name' && reference.field !== 'workflow.run_name';\n const requiredReferences = references.filter(requiresSecrets);\n const requiredKeys = new Set(requiredReferences.map((reference) => reference.key));\n if (!params.secrets) {\n if (requiredKeys.size === 0) return undefined;\n throw new Error('Secrets client is not configured.');\n }\n const {values: vars} = await params.secrets.getVariablesByNamespace({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n namespace: '',\n });\n const missingKey = [...requiredKeys].find((key) => !(key in vars));\n if (missingKey !== undefined) {\n const reference = requiredReferences.find((candidate) => candidate.key === missingKey);\n throw new InterpolationUnresolvableError(params.definitionId, {\n field: reference?.field ?? 'env',\n source: reference?.source ?? `vars.${missingKey}`,\n ...(reference?.envKey === undefined ? {} : {envKey: reference.envKey}),\n });\n }\n\n const referencedVars: Record<string, string> = {};\n for (const key of keys) {\n const value = vars[key];\n if (value !== undefined) referencedVars[key] = value;\n }\n return referencedVars;\n}\n\nfunction materializeRunGraphJobs(params: {\n readonly params: CreateWorkflowRunParams;\n readonly run: WorkflowRun;\n readonly vars: Record<string, string> | undefined;\n readonly materializedJobs: readonly MaterializedWorkflowJob[];\n}): readonly MaterializedRunGraphJob[] {\n return params.materializedJobs.map((job, jobIndex) => ({\n job: {\n key: job.key,\n mode: job.mode,\n name: job.name ?? null,\n status: 'pending' as const,\n checkoutPersistCredentials: job.checkout.persistCredentials,\n checkoutPermissionsContents: job.checkout.permissions.contents,\n success: job.success ?? null,\n executionTimeoutMs: job.executionTimeoutMs ?? null,\n listeningTimeoutMs: job.listening?.timeoutMs ?? null,\n maxExecutions: job.listening?.maxExecutions ?? null,\n onResolve: job.listening?.onResolve ?? null,\n batchDebounceMs: job.listening?.batch?.debounceMs ?? null,\n batchMaxSize: job.listening?.batch?.maxSize ?? null,\n batchMaxWaitMs: job.listening?.batch?.maxWaitMs ?? null,\n listeningOn: job.listening?.on ? [...job.listening.on] : null,\n listeningUntil: job.listening?.until ? [...job.listening.until] : null,\n dependencies: [...job.dependencies],\n runner: job.runner.length === 0 ? null : [...job.runner],\n position: job.position,\n },\n createExecution: (jobRow) => {\n if (jobRow.mode === 'listening') return undefined;\n\n const fallbackName = jobRow.name ?? jobRow.key;\n const modelJob = params.params.model.jobs[jobIndex];\n if (!modelJob) return undefined;\n const executionPlan = deriveInitialJobExecutionPlan({\n run: params.run,\n modelJob,\n job,\n jobId: jobRow.id,\n sequence: 1,\n fallbackName,\n triggerPayload: params.params.triggerPayload,\n inputs: params.params.inputs ?? null,\n vars: params.vars,\n });\n\n return {\n sequence: 1,\n // Persist only the resolved override. The core entity supplies the\n // static job name/key when this is null.\n name: executionPlan.nameOverride,\n runner: [...executionPlan.runner],\n status: 'pending' as const,\n evaluationTrace:\n executionPlan.evaluationTrace?.length === 0 ? null : executionPlan.evaluationTrace,\n };\n },\n createSteps: () =>\n job.steps.map((step) => ({\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: step.status,\n type: step.type,\n config: step.config,\n condition: step.condition ?? null,\n configPlan: step.configPlan ?? null,\n authoredConfig: step.authoredConfig,\n position: step.position,\n })),\n }));\n}\n\nfunction referencedVariables(\n model: WorkflowModel,\n jobs: readonly WorkflowModelJob[],\n): readonly ReferencedVariable[] {\n const references: ReferencedVariable[] = [];\n\n for (const job of model.jobs) {\n collectPredicateVariableReferences(job.if, references);\n collectPredicateVariableReferences(job.success, references);\n\n for (const trigger of [...(job.listening?.on ?? []), ...(job.listening?.until ?? [])]) {\n collectPredicateVariableReferences(trigger.filter, references);\n }\n\n for (const step of job.steps) {\n collectPredicateVariableReferences(step.if, references);\n collectPredicateVariableReferences(step.gate?.success, references);\n }\n }\n\n collectFieldVariableReferences(model.runName, references, {field: 'workflow.run_name'});\n\n if (jobs.length > 0) {\n collectTemplateVariableReferences(model.templates?.env, references);\n }\n\n for (const job of jobs) {\n collectFieldVariableReferences(job.executionName, references, {field: 'job.execution_name'});\n for (const template of job.runnerTemplates ?? []) {\n collectFieldVariableReferences(template, references, {field: 'job.runner'});\n }\n collectTemplateVariableReferences(job.outputs, references, {field: 'job.outputs'});\n collectTemplateVariableReferences(job.templates?.env, references);\n\n for (const step of job.steps) {\n collectFieldVariableReferences(step.templates?.name, references, {field: 'step.name'});\n collectFieldVariableReferences(step.templates?.workingDirectory, references, {\n field: 'step.working_directory',\n });\n if (step.kind === 'run') {\n collectFieldVariableReferences(step.templates?.command, references, {field: 'run'});\n collectTemplateVariableReferences(step.templates?.env, references);\n } else if (step.kind === 'agent') {\n collectFieldVariableReferences(step.templates?.prompt, references, {field: 'agent.prompt'});\n collectFieldVariableReferences(step.templates?.model, references, {field: 'agent.model'});\n collectFieldVariableReferences(step.templates?.provider, references, {\n field: 'agent.provider',\n });\n } else if (step.kind === 'checkout') {\n for (const [key, field] of WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS) {\n collectFieldVariableReferences(step.checkout.templates?.[key], references, {field});\n }\n }\n }\n }\n\n return references;\n}\n\nfunction collectPredicateVariableReferences(\n expression: WorkflowExpression | string | undefined,\n references: ReferencedVariable[],\n): void {\n if (expression === undefined) return;\n\n const keyAccess = analyzeContextKeyAccess(expression);\n for (const reference of keyAccess.references) {\n if (reference.root !== 'vars') continue;\n references.push({\n key: reference.key,\n field: 'env',\n source: typeof expression === 'string' ? expression : expression.source,\n });\n }\n}\n\nfunction collectTemplateVariableReferences(\n templates: Readonly<Record<string, readonly ResolvedFieldSegment[]>> | undefined,\n references: ReferencedVariable[],\n source?: {\n readonly field: InterpolationUnresolvableError['field'];\n },\n): void {\n for (const [envKey, template] of Object.entries(templates ?? {})) {\n collectFieldVariableReferences(\n template,\n references,\n source === undefined ? {field: 'env', envKey} : source,\n );\n }\n}\n\nfunction collectFieldVariableReferences(\n template: readonly ResolvedFieldSegment[] | undefined,\n references: ReferencedVariable[],\n source: {\n readonly field: InterpolationUnresolvableError['field'];\n readonly envKey?: string | undefined;\n },\n): void {\n for (const segment of template ?? []) {\n if (segment.kind === 'literal') continue;\n const keyAccess = analyzeContextKeyAccess(segment.expression);\n for (const reference of keyAccess.references) {\n if (reference.root !== 'vars') continue;\n references.push({\n key: reference.key,\n field: source.field,\n source: segment.expression.source,\n envKey: source.envKey,\n });\n }\n }\n}\n\nfunction logTemplateDiagnostics(params: {\n readonly workflowRunId: string;\n readonly diagnostics: readonly (WorkflowStepTemplateDiagnostic & {\n readonly jobKey: string;\n readonly stepName: string;\n })[];\n}): void {\n if (params.diagnostics.length === 0) return;\n\n logger().warn(\n {workflowRunId: params.workflowRunId, diagnostics: params.diagnostics},\n 'Workflow interpolation resolved with diagnostics',\n );\n}\n"],"names":["createWorkflowModelSnapshot","WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS","analyzeContextKeyAccess","logger","eq","sql","createAgentToolMaterializationSnapshot","loadAgentToolMaterializationContext","InterpolationUnresolvableError","resolveWorkflowRunTriggerReference","assembleCreationContext","resolveWorkflowRunName","deriveInitialJobExecutionPlan","materializeWorkflowRunJobs","recordWorkflowDisplayNameResolutionDegraded","recordWorkflowRunCreated","db","workflowRunAttempts","workflowRunCounters","toWorkflowRun","workflowRuns","persistMaterializedRunGraph","createWorkflowRun","params","triggerReference","workspaceId","triggerConnectionId","triggerPayload","integrations","projects","staticName","name","model","agentToolContext","undefined","projectId","agentToolMaterialization","context","result","transaction","tx","triggerIdempotencyKey","execute","existing","select","from","where","limit","existingRow","run","created","number","allocateWorkflowRunNumber","definitionId","insertResult","insert","values","workflowName","status","currentAttempt","triggerProvider","provider","triggerSource","source","triggerEvent","event","inputs","sourceSnapshot","onConflictDoNothing","target","returning","runRow","Error","provisionalRun","oneShotJobs","jobs","filter","job","mode","vars","loadReferencedVariables","secrets","runNameResolution","runName","resolvedRunRow","update","set","value","updatedAt","Date","id","attemptRow","workflowRunId","attempt","materializedJobs","resolveAgentDefaults","agentToolSnapshot","graphJobs","materializeRunGraphJobs","workflowRunAttempt","logTemplateDiagnostics","diagnostics","flatMap","steps","step","map","diagnostic","jobKey","key","stepName","nameDegradation","degradation","cause","warn","field","expression","slice","counterRow","nextNumber","onConflictDoUpdate","references","referencedVariables","keys","Set","reference","sort","length","requiresSecrets","requiredReferences","requiredKeys","size","getVariablesByNamespace","namespace","missingKey","find","candidate","envKey","referencedVars","jobIndex","checkoutPersistCredentials","checkout","persistCredentials","checkoutPermissionsContents","permissions","contents","success","executionTimeoutMs","listeningTimeoutMs","listening","timeoutMs","maxExecutions","onResolve","batchDebounceMs","batch","debounceMs","batchMaxSize","maxSize","batchMaxWaitMs","maxWaitMs","listeningOn","on","listeningUntil","until","dependencies","runner","position","createExecution","jobRow","fallbackName","modelJob","executionPlan","jobId","sequence","nameOverride","evaluationTrace","createSteps","sourceLocation","type","config","condition","configPlan","authoredConfig","collectPredicateVariableReferences","if","trigger","gate","collectFieldVariableReferences","collectTemplateVariableReferences","templates","env","executionName","template","runnerTemplates","outputs","workingDirectory","kind","command","prompt","keyAccess","root","push","Object","entries","segment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-rerun.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/run-rerun.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,WAAW,EAAC,MAAM,gCAAgC,CAAC;AAavF,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,WAAW,CAAC,CAiGtB"}
1
+ {"version":3,"file":"run-rerun.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/run-rerun.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,WAAW,EAAC,MAAM,gCAAgC,CAAC;AAavF,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,WAAW,CAAC,CAkGtB"}
@@ -40,6 +40,7 @@ export async function createRerunWorkflowRun(params) {
40
40
  rerunMode: params.mode,
41
41
  rerunByUserId: params.actorUserId,
42
42
  model: sourceAttemptRow.model,
43
+ vars: sourceAttemptRow.vars,
43
44
  agentToolMaterialization: sourceAttemptRow.agentToolMaterialization
44
45
  }).returning();
45
46
  if (!newAttemptRow) throw new Error('Insert returned no rows');
@@ -121,6 +122,9 @@ function materializeRerunGraphJobs(params) {
121
122
  }
122
123
  return params.sourceJobs.map((sourceJob)=>{
123
124
  const carriedOver = params.mode === 'failed' && sourceJob.status === 'succeeded';
125
+ const modelJob = sourceModelJobByKey.get(sourceJob.key);
126
+ const modelCheckout = modelJob?.checkout;
127
+ const resolvedModelCheckout = modelCheckout === false ? undefined : modelCheckout;
124
128
  return {
125
129
  job: {
126
130
  key: sourceJob.key,
@@ -129,8 +133,8 @@ function materializeRerunGraphJobs(params) {
129
133
  status: carriedOver ? 'succeeded' : 'pending',
130
134
  statusReason: null,
131
135
  carriedOver,
132
- checkoutPersistCredentials: sourceJob.checkoutPersistCredentials,
133
- checkoutPermissionsContents: sourceJob.checkoutPermissionsContents,
136
+ checkoutPersistCredentials: resolvedModelCheckout?.persistCredentials ?? sourceJob.checkoutPersistCredentials,
137
+ checkoutPermissionsContents: resolvedModelCheckout?.permissions?.contents ?? sourceJob.checkoutPermissionsContents,
134
138
  success: sourceJob.success,
135
139
  executionTimeoutMs: sourceJob.executionTimeoutMs,
136
140
  listeningTimeoutMs: sourceJob.listeningTimeoutMs,
@@ -161,19 +165,23 @@ function materializeRerunGraphJobs(params) {
161
165
  createExecution: (job)=>{
162
166
  if (job.mode === 'listening') return undefined;
163
167
  const sourceExecution = params.sourceJobExecutionByJobId.get(sourceJob.id);
164
- const modelJob = sourceModelJobByKey.get(job.key);
165
- const executionName = sourceExecution?.name ?? `${job.key} #1`;
168
+ const nameOverride = sourceExecution?.name ?? null;
169
+ const executionName = nameOverride ?? job.name ?? job.key;
166
170
  const runner = carriedOver || modelJob === undefined ? sourceExecution?.runner ?? job.runner ?? null : deriveJobExecutionRunner({
167
171
  run: params.sourceRun,
168
172
  modelJob,
169
173
  jobId: job.id,
170
174
  sequence: 1,
175
+ nameOverride,
171
176
  executionName,
177
+ jobName: job.name,
172
178
  status: 'pending'
173
179
  });
174
180
  return {
175
181
  sequence: 1,
176
- name: executionName,
182
+ // Reruns preserve the authored/resolved override, never the
183
+ // effective fallback exposed by the core entity.
184
+ name: nameOverride,
177
185
  runner: runner ? [
178
186
  ...runner
179
187
  ] : null,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/run-rerun.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport {and, asc, eq, inArray, sql} from 'drizzle-orm';\nimport {isWorkflowRunTerminal, type WorkflowRun} from '#core/entities/workflow-run.js';\nimport {NoFailedJobsError, RunNotTerminalError, SourceRunNotFoundError} from '#core/errors.js';\nimport {deriveJobExecutionRunner} from '#core/workflow-run-creation.js';\nimport {recordWorkflowRunCreated} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {type JobExecutionDb, jobExecutions} from '../schema/job-executions.js';\nimport {type JobDb, jobs} from '../schema/jobs.js';\nimport {type StepDb, steps} from '../schema/steps.js';\nimport {type WorkflowRunAttemptDb, workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {type MaterializedRunGraphJob, persistMaterializedRunGraph} from './run-graph.js';\nimport {lockWorkflowRun} from './shared.js';\n\nexport interface CreateRerunWorkflowRunParams {\n workflowRunId: string;\n mode: 'all' | 'failed';\n actorUserId: string;\n}\n\nexport async function createRerunWorkflowRun(\n params: CreateRerunWorkflowRunParams,\n): Promise<WorkflowRun> {\n const result = await db().transaction(async (tx) => {\n const workflowRunId = params.workflowRunId;\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${workflowRunId}))`);\n\n const sourceRow = await lockWorkflowRun(workflowRunId, tx);\n if (!sourceRow) throw new SourceRunNotFoundError(workflowRunId);\n\n const [sourceAttemptRow] = await tx\n .select()\n .from(workflowRunAttempts)\n .where(\n and(\n eq(workflowRunAttempts.workflowRunId, sourceRow.id),\n eq(workflowRunAttempts.attempt, sourceRow.currentAttempt),\n ),\n )\n .limit(1)\n .for('update');\n if (!sourceAttemptRow) {\n throw new Error(\n `Current attempt ${sourceRow.currentAttempt} missing for run ${sourceRow.id}`,\n );\n }\n if (!isWorkflowRunTerminal(sourceAttemptRow.status)) {\n throw new RunNotTerminalError(sourceRow.id);\n }\n\n const sourceJobs = await tx\n .select()\n .from(jobs)\n .where(eq(jobs.workflowRunAttemptId, sourceAttemptRow.id))\n .orderBy(asc(jobs.position), asc(jobs.id));\n\n if (\n params.mode === 'failed' &&\n !sourceJobs.some((job) => job.status === 'failed' || job.status === 'cancelled')\n ) {\n throw new NoFailedJobsError(sourceRow.id);\n }\n\n const [attemptRow] = await tx\n .select({value: sql<number>`coalesce(max(${workflowRunAttempts.attempt}), 1)`})\n .from(workflowRunAttempts)\n .where(eq(workflowRunAttempts.workflowRunId, sourceRow.id));\n const attempt = Number(attemptRow?.value ?? 1) + 1;\n\n const [newAttemptRow] = await tx\n .insert(workflowRunAttempts)\n .values({\n workflowRunId: sourceRow.id,\n attempt,\n status: 'pending',\n rerunMode: params.mode,\n rerunByUserId: params.actorUserId,\n model: sourceAttemptRow.model,\n agentToolMaterialization: sourceAttemptRow.agentToolMaterialization,\n })\n .returning();\n if (!newAttemptRow) throw new Error('Insert returned no rows');\n\n const sourceGraph = await loadRerunSourceGraph(tx, sourceJobs);\n\n const sourceRun = toWorkflowRun(sourceRow);\n const graphJobs = materializeRerunGraphJobs({\n mode: params.mode,\n sourceRun,\n sourceAttempt: sourceAttemptRow,\n sourceJobs,\n ...sourceGraph,\n });\n await persistMaterializedRunGraph(tx, {\n run: sourceRun,\n workflowRunAttempt: newAttemptRow,\n materializedJobs: graphJobs,\n });\n\n const [newRunRow] = await tx\n .update(workflowRuns)\n .set({\n currentAttempt: attempt,\n status: 'pending',\n version: sql`${workflowRuns.version} + 1`,\n updatedAt: new Date(),\n startedAt: null,\n finishedAt: null,\n })\n .where(eq(workflowRuns.id, sourceRow.id))\n .returning();\n if (!newRunRow) throw new Error(`Workflow run missing after rerun: ${sourceRow.id}`);\n\n return toWorkflowRun(newRunRow);\n });\n\n recordWorkflowRunCreated(result.triggerPayload.provider ?? result.triggerSource);\n\n return result;\n}\n\nasync function loadRerunSourceGraph(\n tx: Tx,\n sourceJobs: readonly JobDb[],\n): Promise<{\n readonly sourceJobExecutionByJobId: ReadonlyMap<string, JobExecutionDb>;\n readonly sourceJobByJobExecutionId: ReadonlyMap<string, JobDb>;\n readonly sourceSteps: readonly StepDb[];\n}> {\n const sourceJobIds = sourceJobs.map((job) => job.id);\n const sourceJobExecutionRows =\n sourceJobIds.length === 0\n ? []\n : await tx\n .select()\n .from(jobExecutions)\n .where(inArray(jobExecutions.jobId, sourceJobIds))\n .orderBy(asc(jobExecutions.jobId), asc(jobExecutions.sequence), asc(jobExecutions.id));\n const sourceJobExecutionByJobId = new Map<string, JobExecutionDb>();\n for (const jobExecution of sourceJobExecutionRows) {\n if (!sourceJobExecutionByJobId.has(jobExecution.jobId)) {\n sourceJobExecutionByJobId.set(jobExecution.jobId, jobExecution);\n }\n }\n\n const sourceJobExecutionIds = [...sourceJobExecutionByJobId.values()].map(\n (jobExecution) => jobExecution.id,\n );\n const sourceSteps =\n sourceJobExecutionIds.length === 0\n ? []\n : await tx\n .select()\n .from(steps)\n .where(inArray(steps.jobExecutionId, sourceJobExecutionIds))\n .orderBy(asc(steps.jobExecutionId), asc(steps.position), asc(steps.id));\n\n const sourceJobById = new Map(sourceJobs.map((job) => [job.id, job]));\n const sourceJobByJobExecutionId = new Map(\n [...sourceJobExecutionByJobId.entries()].flatMap(([jobId, jobExecution]) => {\n const job = sourceJobById.get(jobId);\n return job ? [[jobExecution.id, job] as const] : [];\n }),\n );\n\n return {sourceJobExecutionByJobId, sourceJobByJobExecutionId, sourceSteps};\n}\n\nfunction materializeRerunGraphJobs(params: {\n readonly mode: CreateRerunWorkflowRunParams['mode'];\n readonly sourceRun: WorkflowRun;\n readonly sourceAttempt: WorkflowRunAttemptDb;\n readonly sourceJobs: readonly JobDb[];\n readonly sourceJobExecutionByJobId: ReadonlyMap<string, JobExecutionDb>;\n readonly sourceJobByJobExecutionId: ReadonlyMap<string, JobDb>;\n readonly sourceSteps: readonly StepDb[];\n}): readonly MaterializedRunGraphJob[] {\n const sourceModel =\n params.sourceAttempt.model === null\n ? null\n : readPersistedWorkflowModel(params.sourceAttempt.model);\n const sourceModelJobByKey = new Map((sourceModel?.jobs ?? []).map((job) => [job.key, job]));\n const sourceStepsByJobId = new Map<string, StepDb[]>();\n for (const step of params.sourceSteps) {\n const sourceJob = params.sourceJobByJobExecutionId.get(step.jobExecutionId);\n if (!sourceJob) continue;\n const sourceJobSteps = sourceStepsByJobId.get(sourceJob.id) ?? [];\n sourceJobSteps.push(step);\n sourceStepsByJobId.set(sourceJob.id, sourceJobSteps);\n }\n\n return params.sourceJobs.map((sourceJob) => {\n const carriedOver = params.mode === 'failed' && sourceJob.status === 'succeeded';\n\n return {\n job: {\n key: sourceJob.key,\n name: sourceJob.name,\n mode: sourceJob.mode,\n status: carriedOver ? ('succeeded' as const) : ('pending' as const),\n statusReason: null,\n carriedOver,\n checkoutPersistCredentials: sourceJob.checkoutPersistCredentials,\n checkoutPermissionsContents: sourceJob.checkoutPermissionsContents,\n success: sourceJob.success,\n executionTimeoutMs: sourceJob.executionTimeoutMs,\n listeningTimeoutMs: sourceJob.listeningTimeoutMs,\n maxExecutions: sourceJob.maxExecutions,\n onResolve: sourceJob.onResolve,\n batchDebounceMs: sourceJob.batchDebounceMs,\n batchMaxSize: sourceJob.batchMaxSize,\n batchMaxWaitMs: sourceJob.batchMaxWaitMs,\n listenerStatus: 'inactive' as const,\n resolutionReason: null,\n listeningOn: sourceJob.listeningOn ? [...sourceJob.listeningOn] : null,\n listeningUntil: sourceJob.listeningUntil ? [...sourceJob.listeningUntil] : null,\n outputs: carriedOver && sourceJob.outputs ? {...sourceJob.outputs} : null,\n dependencies: [...sourceJob.dependencies],\n runner: sourceJob.runner ? [...sourceJob.runner] : null,\n position: sourceJob.position,\n },\n createExecution: (job) => {\n if (job.mode === 'listening') return undefined;\n\n const sourceExecution = params.sourceJobExecutionByJobId.get(sourceJob.id);\n const modelJob = sourceModelJobByKey.get(job.key);\n const executionName = sourceExecution?.name ?? `${job.key} #1`;\n const runner =\n carriedOver || modelJob === undefined\n ? (sourceExecution?.runner ?? job.runner ?? null)\n : deriveJobExecutionRunner({\n run: params.sourceRun,\n modelJob,\n jobId: job.id,\n sequence: 1,\n executionName,\n status: 'pending',\n });\n\n return {\n sequence: 1,\n name: executionName,\n runner: runner ? [...runner] : null,\n status: carriedOver ? ('succeeded' as const) : ('pending' as const),\n statusReason: null,\n outputs: carriedOver && sourceExecution?.outputs ? {...sourceExecution.outputs} : null,\n ...(carriedOver ? {finishedAt: sql`now()`} : {}),\n };\n },\n createSteps: () =>\n (sourceStepsByJobId.get(sourceJob.id) ?? []).map((step) => ({\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: carriedOver ? step.status : ('pending' as const),\n statusReason: carriedOver ? step.statusReason : null,\n type: step.type,\n config: step.config,\n condition: step.condition ?? null,\n configPlan: step.configPlan,\n authoredConfig: step.authoredConfig,\n error: null,\n position: step.position,\n currentAttempt: 1,\n })),\n };\n });\n}\n"],"names":["readPersistedWorkflowModel","and","asc","eq","inArray","sql","isWorkflowRunTerminal","NoFailedJobsError","RunNotTerminalError","SourceRunNotFoundError","deriveJobExecutionRunner","recordWorkflowRunCreated","db","jobExecutions","jobs","steps","workflowRunAttempts","toWorkflowRun","workflowRuns","persistMaterializedRunGraph","lockWorkflowRun","createRerunWorkflowRun","params","result","transaction","tx","workflowRunId","execute","sourceRow","sourceAttemptRow","select","from","where","id","attempt","currentAttempt","limit","for","Error","status","sourceJobs","workflowRunAttemptId","orderBy","position","mode","some","job","attemptRow","value","Number","newAttemptRow","insert","values","rerunMode","rerunByUserId","actorUserId","model","agentToolMaterialization","returning","sourceGraph","loadRerunSourceGraph","sourceRun","graphJobs","materializeRerunGraphJobs","sourceAttempt","run","workflowRunAttempt","materializedJobs","newRunRow","update","set","version","updatedAt","Date","startedAt","finishedAt","triggerPayload","provider","triggerSource","sourceJobIds","map","sourceJobExecutionRows","length","jobId","sequence","sourceJobExecutionByJobId","Map","jobExecution","has","sourceJobExecutionIds","sourceSteps","jobExecutionId","sourceJobById","sourceJobByJobExecutionId","entries","flatMap","get","sourceModel","sourceModelJobByKey","key","sourceStepsByJobId","step","sourceJob","sourceJobSteps","push","carriedOver","name","statusReason","checkoutPersistCredentials","checkoutPermissionsContents","success","executionTimeoutMs","listeningTimeoutMs","maxExecutions","onResolve","batchDebounceMs","batchMaxSize","batchMaxWaitMs","listenerStatus","resolutionReason","listeningOn","listeningUntil","outputs","dependencies","runner","createExecution","undefined","sourceExecution","modelJob","executionName","createSteps","sourceLocation","type","config","condition","configPlan","authoredConfig","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/run-rerun.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport {and, asc, eq, inArray, sql} from 'drizzle-orm';\nimport {isWorkflowRunTerminal, type WorkflowRun} from '#core/entities/workflow-run.js';\nimport {NoFailedJobsError, RunNotTerminalError, SourceRunNotFoundError} from '#core/errors.js';\nimport {deriveJobExecutionRunner} from '#core/workflow-run-creation.js';\nimport {recordWorkflowRunCreated} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {type JobExecutionDb, jobExecutions} from '../schema/job-executions.js';\nimport {type JobDb, jobs} from '../schema/jobs.js';\nimport {type StepDb, steps} from '../schema/steps.js';\nimport {type WorkflowRunAttemptDb, workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {type MaterializedRunGraphJob, persistMaterializedRunGraph} from './run-graph.js';\nimport {lockWorkflowRun} from './shared.js';\n\nexport interface CreateRerunWorkflowRunParams {\n workflowRunId: string;\n mode: 'all' | 'failed';\n actorUserId: string;\n}\n\nexport async function createRerunWorkflowRun(\n params: CreateRerunWorkflowRunParams,\n): Promise<WorkflowRun> {\n const result = await db().transaction(async (tx) => {\n const workflowRunId = params.workflowRunId;\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${workflowRunId}))`);\n\n const sourceRow = await lockWorkflowRun(workflowRunId, tx);\n if (!sourceRow) throw new SourceRunNotFoundError(workflowRunId);\n\n const [sourceAttemptRow] = await tx\n .select()\n .from(workflowRunAttempts)\n .where(\n and(\n eq(workflowRunAttempts.workflowRunId, sourceRow.id),\n eq(workflowRunAttempts.attempt, sourceRow.currentAttempt),\n ),\n )\n .limit(1)\n .for('update');\n if (!sourceAttemptRow) {\n throw new Error(\n `Current attempt ${sourceRow.currentAttempt} missing for run ${sourceRow.id}`,\n );\n }\n if (!isWorkflowRunTerminal(sourceAttemptRow.status)) {\n throw new RunNotTerminalError(sourceRow.id);\n }\n\n const sourceJobs = await tx\n .select()\n .from(jobs)\n .where(eq(jobs.workflowRunAttemptId, sourceAttemptRow.id))\n .orderBy(asc(jobs.position), asc(jobs.id));\n\n if (\n params.mode === 'failed' &&\n !sourceJobs.some((job) => job.status === 'failed' || job.status === 'cancelled')\n ) {\n throw new NoFailedJobsError(sourceRow.id);\n }\n\n const [attemptRow] = await tx\n .select({value: sql<number>`coalesce(max(${workflowRunAttempts.attempt}), 1)`})\n .from(workflowRunAttempts)\n .where(eq(workflowRunAttempts.workflowRunId, sourceRow.id));\n const attempt = Number(attemptRow?.value ?? 1) + 1;\n\n const [newAttemptRow] = await tx\n .insert(workflowRunAttempts)\n .values({\n workflowRunId: sourceRow.id,\n attempt,\n status: 'pending',\n rerunMode: params.mode,\n rerunByUserId: params.actorUserId,\n model: sourceAttemptRow.model,\n vars: sourceAttemptRow.vars,\n agentToolMaterialization: sourceAttemptRow.agentToolMaterialization,\n })\n .returning();\n if (!newAttemptRow) throw new Error('Insert returned no rows');\n\n const sourceGraph = await loadRerunSourceGraph(tx, sourceJobs);\n\n const sourceRun = toWorkflowRun(sourceRow);\n const graphJobs = materializeRerunGraphJobs({\n mode: params.mode,\n sourceRun,\n sourceAttempt: sourceAttemptRow,\n sourceJobs,\n ...sourceGraph,\n });\n await persistMaterializedRunGraph(tx, {\n run: sourceRun,\n workflowRunAttempt: newAttemptRow,\n materializedJobs: graphJobs,\n });\n\n const [newRunRow] = await tx\n .update(workflowRuns)\n .set({\n currentAttempt: attempt,\n status: 'pending',\n version: sql`${workflowRuns.version} + 1`,\n updatedAt: new Date(),\n startedAt: null,\n finishedAt: null,\n })\n .where(eq(workflowRuns.id, sourceRow.id))\n .returning();\n if (!newRunRow) throw new Error(`Workflow run missing after rerun: ${sourceRow.id}`);\n\n return toWorkflowRun(newRunRow);\n });\n\n recordWorkflowRunCreated(result.triggerPayload.provider ?? result.triggerSource);\n\n return result;\n}\n\nasync function loadRerunSourceGraph(\n tx: Tx,\n sourceJobs: readonly JobDb[],\n): Promise<{\n readonly sourceJobExecutionByJobId: ReadonlyMap<string, JobExecutionDb>;\n readonly sourceJobByJobExecutionId: ReadonlyMap<string, JobDb>;\n readonly sourceSteps: readonly StepDb[];\n}> {\n const sourceJobIds = sourceJobs.map((job) => job.id);\n const sourceJobExecutionRows =\n sourceJobIds.length === 0\n ? []\n : await tx\n .select()\n .from(jobExecutions)\n .where(inArray(jobExecutions.jobId, sourceJobIds))\n .orderBy(asc(jobExecutions.jobId), asc(jobExecutions.sequence), asc(jobExecutions.id));\n const sourceJobExecutionByJobId = new Map<string, JobExecutionDb>();\n for (const jobExecution of sourceJobExecutionRows) {\n if (!sourceJobExecutionByJobId.has(jobExecution.jobId)) {\n sourceJobExecutionByJobId.set(jobExecution.jobId, jobExecution);\n }\n }\n\n const sourceJobExecutionIds = [...sourceJobExecutionByJobId.values()].map(\n (jobExecution) => jobExecution.id,\n );\n const sourceSteps =\n sourceJobExecutionIds.length === 0\n ? []\n : await tx\n .select()\n .from(steps)\n .where(inArray(steps.jobExecutionId, sourceJobExecutionIds))\n .orderBy(asc(steps.jobExecutionId), asc(steps.position), asc(steps.id));\n\n const sourceJobById = new Map(sourceJobs.map((job) => [job.id, job]));\n const sourceJobByJobExecutionId = new Map(\n [...sourceJobExecutionByJobId.entries()].flatMap(([jobId, jobExecution]) => {\n const job = sourceJobById.get(jobId);\n return job ? [[jobExecution.id, job] as const] : [];\n }),\n );\n\n return {sourceJobExecutionByJobId, sourceJobByJobExecutionId, sourceSteps};\n}\n\nfunction materializeRerunGraphJobs(params: {\n readonly mode: CreateRerunWorkflowRunParams['mode'];\n readonly sourceRun: WorkflowRun;\n readonly sourceAttempt: WorkflowRunAttemptDb;\n readonly sourceJobs: readonly JobDb[];\n readonly sourceJobExecutionByJobId: ReadonlyMap<string, JobExecutionDb>;\n readonly sourceJobByJobExecutionId: ReadonlyMap<string, JobDb>;\n readonly sourceSteps: readonly StepDb[];\n}): readonly MaterializedRunGraphJob[] {\n const sourceModel =\n params.sourceAttempt.model === null\n ? null\n : readPersistedWorkflowModel(params.sourceAttempt.model);\n const sourceModelJobByKey = new Map((sourceModel?.jobs ?? []).map((job) => [job.key, job]));\n const sourceStepsByJobId = new Map<string, StepDb[]>();\n for (const step of params.sourceSteps) {\n const sourceJob = params.sourceJobByJobExecutionId.get(step.jobExecutionId);\n if (!sourceJob) continue;\n const sourceJobSteps = sourceStepsByJobId.get(sourceJob.id) ?? [];\n sourceJobSteps.push(step);\n sourceStepsByJobId.set(sourceJob.id, sourceJobSteps);\n }\n\n return params.sourceJobs.map((sourceJob) => {\n const carriedOver = params.mode === 'failed' && sourceJob.status === 'succeeded';\n const modelJob = sourceModelJobByKey.get(sourceJob.key);\n const modelCheckout = modelJob?.checkout;\n const resolvedModelCheckout = modelCheckout === false ? undefined : modelCheckout;\n\n return {\n job: {\n key: sourceJob.key,\n name: sourceJob.name,\n mode: sourceJob.mode,\n status: carriedOver ? ('succeeded' as const) : ('pending' as const),\n statusReason: null,\n carriedOver,\n checkoutPersistCredentials:\n resolvedModelCheckout?.persistCredentials ?? sourceJob.checkoutPersistCredentials,\n checkoutPermissionsContents:\n resolvedModelCheckout?.permissions?.contents ?? sourceJob.checkoutPermissionsContents,\n success: sourceJob.success,\n executionTimeoutMs: sourceJob.executionTimeoutMs,\n listeningTimeoutMs: sourceJob.listeningTimeoutMs,\n maxExecutions: sourceJob.maxExecutions,\n onResolve: sourceJob.onResolve,\n batchDebounceMs: sourceJob.batchDebounceMs,\n batchMaxSize: sourceJob.batchMaxSize,\n batchMaxWaitMs: sourceJob.batchMaxWaitMs,\n listenerStatus: 'inactive' as const,\n resolutionReason: null,\n listeningOn: sourceJob.listeningOn ? [...sourceJob.listeningOn] : null,\n listeningUntil: sourceJob.listeningUntil ? [...sourceJob.listeningUntil] : null,\n outputs: carriedOver && sourceJob.outputs ? {...sourceJob.outputs} : null,\n dependencies: [...sourceJob.dependencies],\n runner: sourceJob.runner ? [...sourceJob.runner] : null,\n position: sourceJob.position,\n },\n createExecution: (job) => {\n if (job.mode === 'listening') return undefined;\n\n const sourceExecution = params.sourceJobExecutionByJobId.get(sourceJob.id);\n const nameOverride = sourceExecution?.name ?? null;\n const executionName = nameOverride ?? job.name ?? job.key;\n const runner =\n carriedOver || modelJob === undefined\n ? (sourceExecution?.runner ?? job.runner ?? null)\n : deriveJobExecutionRunner({\n run: params.sourceRun,\n modelJob,\n jobId: job.id,\n sequence: 1,\n nameOverride,\n executionName,\n jobName: job.name,\n status: 'pending',\n });\n\n return {\n sequence: 1,\n // Reruns preserve the authored/resolved override, never the\n // effective fallback exposed by the core entity.\n name: nameOverride,\n runner: runner ? [...runner] : null,\n status: carriedOver ? ('succeeded' as const) : ('pending' as const),\n statusReason: null,\n outputs: carriedOver && sourceExecution?.outputs ? {...sourceExecution.outputs} : null,\n ...(carriedOver ? {finishedAt: sql`now()`} : {}),\n };\n },\n createSteps: () =>\n (sourceStepsByJobId.get(sourceJob.id) ?? []).map((step) => ({\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: carriedOver ? step.status : ('pending' as const),\n statusReason: carriedOver ? step.statusReason : null,\n type: step.type,\n config: step.config,\n condition: step.condition ?? null,\n configPlan: step.configPlan,\n authoredConfig: step.authoredConfig,\n error: null,\n position: step.position,\n currentAttempt: 1,\n })),\n };\n });\n}\n"],"names":["readPersistedWorkflowModel","and","asc","eq","inArray","sql","isWorkflowRunTerminal","NoFailedJobsError","RunNotTerminalError","SourceRunNotFoundError","deriveJobExecutionRunner","recordWorkflowRunCreated","db","jobExecutions","jobs","steps","workflowRunAttempts","toWorkflowRun","workflowRuns","persistMaterializedRunGraph","lockWorkflowRun","createRerunWorkflowRun","params","result","transaction","tx","workflowRunId","execute","sourceRow","sourceAttemptRow","select","from","where","id","attempt","currentAttempt","limit","for","Error","status","sourceJobs","workflowRunAttemptId","orderBy","position","mode","some","job","attemptRow","value","Number","newAttemptRow","insert","values","rerunMode","rerunByUserId","actorUserId","model","vars","agentToolMaterialization","returning","sourceGraph","loadRerunSourceGraph","sourceRun","graphJobs","materializeRerunGraphJobs","sourceAttempt","run","workflowRunAttempt","materializedJobs","newRunRow","update","set","version","updatedAt","Date","startedAt","finishedAt","triggerPayload","provider","triggerSource","sourceJobIds","map","sourceJobExecutionRows","length","jobId","sequence","sourceJobExecutionByJobId","Map","jobExecution","has","sourceJobExecutionIds","sourceSteps","jobExecutionId","sourceJobById","sourceJobByJobExecutionId","entries","flatMap","get","sourceModel","sourceModelJobByKey","key","sourceStepsByJobId","step","sourceJob","sourceJobSteps","push","carriedOver","modelJob","modelCheckout","checkout","resolvedModelCheckout","undefined","name","statusReason","checkoutPersistCredentials","persistCredentials","checkoutPermissionsContents","permissions","contents","success","executionTimeoutMs","listeningTimeoutMs","maxExecutions","onResolve","batchDebounceMs","batchMaxSize","batchMaxWaitMs","listenerStatus","resolutionReason","listeningOn","listeningUntil","outputs","dependencies","runner","createExecution","sourceExecution","nameOverride","executionName","jobName","createSteps","sourceLocation","type","config","condition","configPlan","authoredConfig","error"],"mappings":"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"}
@@ -20,5 +20,6 @@ export declare function getWorkflowContextForJob(jobId: string, tx: Tx): Promise
20
20
  workflowRunAttemptId: string;
21
21
  workspaceId: string;
22
22
  projectId: string;
23
+ vars: Record<string, string> | null;
23
24
  }>;
24
25
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,UAAU,CAAC;AAIjC,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,eAAO,MAAM,8BAA8B,EAAE,iBAAiB,EAI7D,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAAoD,CAAC;AAElG,eAAO,MAAM,2BAA2B,EAAE,kBAAkB,EAI3D,CAAC;AAEF,eAAO,MAAM,+BAA+B,oCAA2E,CAAC;AAExH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,EAAE,GACL,OAAO,CAAC,OAAO,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC,CAQvD;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnE,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG,IAAI,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,CAAC,CAWnB;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,EAAE,GACL,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAiBD"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,UAAU,CAAC;AAIjC,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,eAAO,MAAM,8BAA8B,EAAE,iBAAiB,EAI7D,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAAoD,CAAC;AAElG,eAAO,MAAM,2BAA2B,EAAE,kBAAkB,EAI3D,CAAC;AAEF,eAAO,MAAM,+BAA+B,oCAA2E,CAAC;AAExH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,EAAE,GACL,OAAO,CAAC,OAAO,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC,CAQvD;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnE,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG,IAAI,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,CAAC,CAWnB;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,EAAE,GACL,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACrC,CAAC,CAkBD"}
@@ -40,7 +40,8 @@ export async function getWorkflowContextForJob(jobId, tx) {
40
40
  workflowRunId: workflowRuns.id,
41
41
  workflowRunAttemptId: workflowRunAttempts.id,
42
42
  workspaceId: workflowRuns.workspaceId,
43
- projectId: workflowRuns.projectId
43
+ projectId: workflowRuns.projectId,
44
+ vars: workflowRunAttempts.vars
44
45
  }).from(jobs).innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id)).innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id)).where(eq(jobs.id, jobId)).limit(1);
45
46
  const context = rows[0];
46
47
  if (!context) throw new Error(`Cannot load workflow context: job ${jobId} not found`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/shared.ts"],"sourcesContent":["import {eq, sql} from 'drizzle-orm';\nimport type {JobStatus} from '#core/entities/job.js';\nimport type {JobExecutionStatus} from '#core/entities/job-execution.js';\nimport type {WorkflowRunStatus} from '#core/entities/workflow-run.js';\nimport type {Tx} from '../db.js';\nimport {jobs} from '../schema/jobs.js';\nimport {steps} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {workflowRuns} from '../schema/workflow-runs.js';\n\nexport const TERMINAL_WORKFLOW_RUN_STATUSES: WorkflowRunStatus[] = [\n 'succeeded',\n 'failed',\n 'cancelled',\n];\n\nexport const TERMINAL_JOB_STATUSES: JobStatus[] = ['succeeded', 'failed', 'cancelled', 'skipped'];\n\nexport const TERMINAL_EXECUTION_STATUSES: JobExecutionStatus[] = [\n 'succeeded',\n 'failed',\n 'cancelled',\n];\n\nexport const NON_TERMINAL_STEP_STATUS_FILTER = sql`${steps.status} NOT IN ('succeeded','failed','cancelled','skipped')`;\n\nexport async function lockWorkflowRun(\n id: string,\n tx: Tx,\n): Promise<typeof workflowRuns.$inferSelect | undefined> {\n const rows = await tx\n .select()\n .from(workflowRuns)\n .where(eq(workflowRuns.id, id))\n .limit(1)\n .for('update');\n return rows[0];\n}\n\nexport async function optimisticLockRetry<TResult, TFetched>(params: {\n updateFn: () => Promise<TResult | null>;\n fetchFn: () => Promise<TFetched | undefined>;\n matchFn: (value: TFetched) => TResult | null;\n failureMessage: string;\n}): Promise<TResult> {\n const updated = await params.updateFn();\n if (updated) return updated;\n\n const existing = await params.fetchFn();\n if (existing) {\n const matched = params.matchFn(existing);\n if (matched) return matched;\n }\n\n throw new Error(params.failureMessage);\n}\n\nexport async function getWorkflowContextForJob(\n jobId: string,\n tx: Tx,\n): Promise<{\n jobId: string;\n workflowRunId: string;\n workflowRunAttemptId: string;\n workspaceId: string;\n projectId: string;\n}> {\n const rows = await tx\n .select({\n jobId: jobs.id,\n workflowRunId: workflowRuns.id,\n workflowRunAttemptId: workflowRunAttempts.id,\n workspaceId: workflowRuns.workspaceId,\n projectId: workflowRuns.projectId,\n })\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, jobId))\n .limit(1);\n const context = rows[0];\n if (!context) throw new Error(`Cannot load workflow context: job ${jobId} not found`);\n return context;\n}\n"],"names":["eq","sql","jobs","steps","workflowRunAttempts","workflowRuns","TERMINAL_WORKFLOW_RUN_STATUSES","TERMINAL_JOB_STATUSES","TERMINAL_EXECUTION_STATUSES","NON_TERMINAL_STEP_STATUS_FILTER","status","lockWorkflowRun","id","tx","rows","select","from","where","limit","for","optimisticLockRetry","params","updated","updateFn","existing","fetchFn","matched","matchFn","Error","failureMessage","getWorkflowContextForJob","jobId","workflowRunId","workflowRunAttemptId","workspaceId","projectId","innerJoin","context"],"mappings":"AAAA,SAAQA,EAAE,EAAEC,GAAG,QAAO,cAAc;AAKpC,SAAQC,IAAI,QAAO,oBAAoB;AACvC,SAAQC,KAAK,QAAO,qBAAqB;AACzC,SAAQC,mBAAmB,QAAO,qCAAqC;AACvE,SAAQC,YAAY,QAAO,6BAA6B;AAExD,OAAO,MAAMC,iCAAsD;IACjE;IACA;IACA;CACD,CAAC;AAEF,OAAO,MAAMC,wBAAqC;IAAC;IAAa;IAAU;IAAa;CAAU,CAAC;AAElG,OAAO,MAAMC,8BAAoD;IAC/D;IACA;IACA;CACD,CAAC;AAEF,OAAO,MAAMC,kCAAkCR,GAAG,CAAC,EAAEE,MAAMO,MAAM,CAAC,oDAAoD,CAAC,CAAC;AAExH,OAAO,eAAeC,gBACpBC,EAAU,EACVC,EAAM;IAEN,MAAMC,OAAO,MAAMD,GAChBE,MAAM,GACNC,IAAI,CAACX,cACLY,KAAK,CAACjB,GAAGK,aAAaO,EAAE,EAAEA,KAC1BM,KAAK,CAAC,GACNC,GAAG,CAAC;IACP,OAAOL,IAAI,CAAC,EAAE;AAChB;AAEA,OAAO,eAAeM,oBAAuCC,MAK5D;IACC,MAAMC,UAAU,MAAMD,OAAOE,QAAQ;IACrC,IAAID,SAAS,OAAOA;IAEpB,MAAME,WAAW,MAAMH,OAAOI,OAAO;IACrC,IAAID,UAAU;QACZ,MAAME,UAAUL,OAAOM,OAAO,CAACH;QAC/B,IAAIE,SAAS,OAAOA;IACtB;IAEA,MAAM,IAAIE,MAAMP,OAAOQ,cAAc;AACvC;AAEA,OAAO,eAAeC,yBACpBC,KAAa,EACblB,EAAM;IAQN,MAAMC,OAAO,MAAMD,GAChBE,MAAM,CAAC;QACNgB,OAAO7B,KAAKU,EAAE;QACdoB,eAAe3B,aAAaO,EAAE;QAC9BqB,sBAAsB7B,oBAAoBQ,EAAE;QAC5CsB,aAAa7B,aAAa6B,WAAW;QACrCC,WAAW9B,aAAa8B,SAAS;IACnC,GACCnB,IAAI,CAACd,MACLkC,SAAS,CAAChC,qBAAqBJ,GAAGE,KAAK+B,oBAAoB,EAAE7B,oBAAoBQ,EAAE,GACnFwB,SAAS,CAAC/B,cAAcL,GAAGI,oBAAoB4B,aAAa,EAAE3B,aAAaO,EAAE,GAC7EK,KAAK,CAACjB,GAAGE,KAAKU,EAAE,EAAEmB,QAClBb,KAAK,CAAC;IACT,MAAMmB,UAAUvB,IAAI,CAAC,EAAE;IACvB,IAAI,CAACuB,SAAS,MAAM,IAAIT,MAAM,CAAC,kCAAkC,EAAEG,MAAM,UAAU,CAAC;IACpF,OAAOM;AACT"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/shared.ts"],"sourcesContent":["import {eq, sql} from 'drizzle-orm';\nimport type {JobStatus} from '#core/entities/job.js';\nimport type {JobExecutionStatus} from '#core/entities/job-execution.js';\nimport type {WorkflowRunStatus} from '#core/entities/workflow-run.js';\nimport type {Tx} from '../db.js';\nimport {jobs} from '../schema/jobs.js';\nimport {steps} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {workflowRuns} from '../schema/workflow-runs.js';\n\nexport const TERMINAL_WORKFLOW_RUN_STATUSES: WorkflowRunStatus[] = [\n 'succeeded',\n 'failed',\n 'cancelled',\n];\n\nexport const TERMINAL_JOB_STATUSES: JobStatus[] = ['succeeded', 'failed', 'cancelled', 'skipped'];\n\nexport const TERMINAL_EXECUTION_STATUSES: JobExecutionStatus[] = [\n 'succeeded',\n 'failed',\n 'cancelled',\n];\n\nexport const NON_TERMINAL_STEP_STATUS_FILTER = sql`${steps.status} NOT IN ('succeeded','failed','cancelled','skipped')`;\n\nexport async function lockWorkflowRun(\n id: string,\n tx: Tx,\n): Promise<typeof workflowRuns.$inferSelect | undefined> {\n const rows = await tx\n .select()\n .from(workflowRuns)\n .where(eq(workflowRuns.id, id))\n .limit(1)\n .for('update');\n return rows[0];\n}\n\nexport async function optimisticLockRetry<TResult, TFetched>(params: {\n updateFn: () => Promise<TResult | null>;\n fetchFn: () => Promise<TFetched | undefined>;\n matchFn: (value: TFetched) => TResult | null;\n failureMessage: string;\n}): Promise<TResult> {\n const updated = await params.updateFn();\n if (updated) return updated;\n\n const existing = await params.fetchFn();\n if (existing) {\n const matched = params.matchFn(existing);\n if (matched) return matched;\n }\n\n throw new Error(params.failureMessage);\n}\n\nexport async function getWorkflowContextForJob(\n jobId: string,\n tx: Tx,\n): Promise<{\n jobId: string;\n workflowRunId: string;\n workflowRunAttemptId: string;\n workspaceId: string;\n projectId: string;\n vars: Record<string, string> | null;\n}> {\n const rows = await tx\n .select({\n jobId: jobs.id,\n workflowRunId: workflowRuns.id,\n workflowRunAttemptId: workflowRunAttempts.id,\n workspaceId: workflowRuns.workspaceId,\n projectId: workflowRuns.projectId,\n vars: workflowRunAttempts.vars,\n })\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, jobId))\n .limit(1);\n const context = rows[0];\n if (!context) throw new Error(`Cannot load workflow context: job ${jobId} not found`);\n return context;\n}\n"],"names":["eq","sql","jobs","steps","workflowRunAttempts","workflowRuns","TERMINAL_WORKFLOW_RUN_STATUSES","TERMINAL_JOB_STATUSES","TERMINAL_EXECUTION_STATUSES","NON_TERMINAL_STEP_STATUS_FILTER","status","lockWorkflowRun","id","tx","rows","select","from","where","limit","for","optimisticLockRetry","params","updated","updateFn","existing","fetchFn","matched","matchFn","Error","failureMessage","getWorkflowContextForJob","jobId","workflowRunId","workflowRunAttemptId","workspaceId","projectId","vars","innerJoin","context"],"mappings":"AAAA,SAAQA,EAAE,EAAEC,GAAG,QAAO,cAAc;AAKpC,SAAQC,IAAI,QAAO,oBAAoB;AACvC,SAAQC,KAAK,QAAO,qBAAqB;AACzC,SAAQC,mBAAmB,QAAO,qCAAqC;AACvE,SAAQC,YAAY,QAAO,6BAA6B;AAExD,OAAO,MAAMC,iCAAsD;IACjE;IACA;IACA;CACD,CAAC;AAEF,OAAO,MAAMC,wBAAqC;IAAC;IAAa;IAAU;IAAa;CAAU,CAAC;AAElG,OAAO,MAAMC,8BAAoD;IAC/D;IACA;IACA;CACD,CAAC;AAEF,OAAO,MAAMC,kCAAkCR,GAAG,CAAC,EAAEE,MAAMO,MAAM,CAAC,oDAAoD,CAAC,CAAC;AAExH,OAAO,eAAeC,gBACpBC,EAAU,EACVC,EAAM;IAEN,MAAMC,OAAO,MAAMD,GAChBE,MAAM,GACNC,IAAI,CAACX,cACLY,KAAK,CAACjB,GAAGK,aAAaO,EAAE,EAAEA,KAC1BM,KAAK,CAAC,GACNC,GAAG,CAAC;IACP,OAAOL,IAAI,CAAC,EAAE;AAChB;AAEA,OAAO,eAAeM,oBAAuCC,MAK5D;IACC,MAAMC,UAAU,MAAMD,OAAOE,QAAQ;IACrC,IAAID,SAAS,OAAOA;IAEpB,MAAME,WAAW,MAAMH,OAAOI,OAAO;IACrC,IAAID,UAAU;QACZ,MAAME,UAAUL,OAAOM,OAAO,CAACH;QAC/B,IAAIE,SAAS,OAAOA;IACtB;IAEA,MAAM,IAAIE,MAAMP,OAAOQ,cAAc;AACvC;AAEA,OAAO,eAAeC,yBACpBC,KAAa,EACblB,EAAM;IASN,MAAMC,OAAO,MAAMD,GAChBE,MAAM,CAAC;QACNgB,OAAO7B,KAAKU,EAAE;QACdoB,eAAe3B,aAAaO,EAAE;QAC9BqB,sBAAsB7B,oBAAoBQ,EAAE;QAC5CsB,aAAa7B,aAAa6B,WAAW;QACrCC,WAAW9B,aAAa8B,SAAS;QACjCC,MAAMhC,oBAAoBgC,IAAI;IAChC,GACCpB,IAAI,CAACd,MACLmC,SAAS,CAACjC,qBAAqBJ,GAAGE,KAAK+B,oBAAoB,EAAE7B,oBAAoBQ,EAAE,GACnFyB,SAAS,CAAChC,cAAcL,GAAGI,oBAAoB4B,aAAa,EAAE3B,aAAaO,EAAE,GAC7EK,KAAK,CAACjB,GAAGE,KAAKU,EAAE,EAAEmB,QAClBb,KAAK,CAAC;IACT,MAAMoB,UAAUxB,IAAI,CAAC,EAAE;IACvB,IAAI,CAACwB,SAAS,MAAM,IAAIV,MAAM,CAAC,kCAAkC,EAAEG,MAAM,UAAU,CAAC;IACpF,OAAOO;AACT"}
@@ -191,8 +191,8 @@ export async function finishStepAttempt(params, tx) {
191
191
  // Restart-only: rewind every step at or after `fromPosition` back to pending,
192
192
  // clearing its result and bumping both `version` and `current_attempt` so the next
193
193
  // dispatch opens a fresh attempt. This DELIBERATELY bypasses the never-downgrade
194
- // guard used everywhere else it is the one place that resurrects terminal steps
195
- // so it must only be called from the durable-restart path, never the ordinary
194
+ // guard used everywhere else. It is the one place that resurrects terminal steps,
195
+ // so it must only be called from the durable-restart path, never the ordinary
196
196
  // report path. It must run in the same transaction as the failed-attempt write.
197
197
  export async function rewindStepsToPending(params, tx) {
198
198
  await tx.update(steps).set({
@@ -205,7 +205,7 @@ export async function rewindStepsToPending(params, tx) {
205
205
  }).where(and(eq(steps.jobExecutionId, params.jobExecutionId), gte(steps.position, params.fromPosition)));
206
206
  }
207
207
  // Count a single step's own attempts. Used to bound the restart cap on the
208
- // gating step's actual executions `steps.current_attempt` can't be used for
208
+ // gating step's actual executions: `steps.current_attempt` can't be used for
209
209
  // the cap because a rewind also bumps it for downstream steps swept into the
210
210
  // rewind range (which would inflate a later gate's cap in a multi-gate job).
211
211
  export async function countStepAttempts(stepId, tx) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/steps.ts"],"sourcesContent":["import type {LogOutcomeDto} from '@shipfox/api-workflows-dto';\nimport {and, asc, count, eq, gte, inArray, sql} from 'drizzle-orm';\nimport type {\n PersistedEvaluationTraceEntry,\n Step,\n StepAttempt,\n StepAttemptStatus,\n StepStatus,\n StepStatusReason,\n} from '#core/entities/step.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport {db, type Tx} from '../db.js';\nimport {jobExecutions} from '../schema/job-executions.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {writeJobStepsSettledOutbox, writeStepAttemptTerminatedOutbox} from './outbox.js';\nimport {NON_TERMINAL_STEP_STATUS_FILTER} from './shared.js';\n\nexport async function getStepByIdForJobExecution(params: {\n stepId: string;\n jobExecutionId: string;\n}): Promise<Step | undefined> {\n const rows = await db()\n .select()\n .from(steps)\n .where(and(eq(steps.id, params.stepId), eq(steps.jobExecutionId, params.jobExecutionId)))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toStep(row);\n}\n\nexport async function getStepById(stepId: string): Promise<Step | undefined> {\n const rows = await db().select().from(steps).where(eq(steps.id, stepId)).limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toStep(row);\n}\n\nexport async function getStepsByJobId(jobId: string): Promise<Step[]> {\n const rows = await db()\n .select({step: steps})\n .from(steps)\n .innerJoin(jobExecutions, eq(steps.jobExecutionId, jobExecutions.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(steps.position));\n return rows.map((row) => toStep(row.step));\n}\n\nexport async function getStepsByJobExecutionId(jobExecutionId: string): Promise<Step[]> {\n const rows = await db()\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, jobExecutionId))\n .orderBy(asc(steps.position));\n return rows.map(toStep);\n}\n\nexport interface BulkUpdateStepStatusesParams {\n jobExecutionId: string;\n status: Extract<StepStatus, 'failed' | 'cancelled'>;\n}\n\nexport async function bulkUpdateStepStatuses(\n params: BulkUpdateStepStatusesParams,\n tx?: Tx,\n): Promise<void> {\n if (!tx) {\n await db().transaction((transaction) => bulkUpdateStepStatuses(params, transaction));\n return;\n }\n\n await tx\n .update(steps)\n .set({\n status: params.status,\n statusReason: null,\n updatedAt: new Date(),\n })\n .where(and(eq(steps.jobExecutionId, params.jobExecutionId), NON_TERMINAL_STEP_STATUS_FILTER));\n\n // Finalize open attempt rows so a timed-out/cancelled sweep does not leave\n // phantom in-flight work for gate and restart logic.\n const finalizedAttempts = await tx\n .update(stepAttempts)\n .set({status: params.status, logOutcome: 'abandoned', finishedAt: new Date()})\n .from(steps)\n .where(\n and(\n eq(stepAttempts.stepId, steps.id),\n eq(steps.jobExecutionId, params.jobExecutionId),\n eq(stepAttempts.status, 'running'),\n ),\n )\n .returning({\n stepId: stepAttempts.stepId,\n attempt: stepAttempts.attempt,\n logOutcome: stepAttempts.logOutcome,\n });\n\n if (finalizedAttempts.length > 0) {\n for (const attempt of finalizedAttempts) {\n await writeStepAttemptTerminatedOutbox(tx, {\n stepId: attempt.stepId,\n attempt: attempt.attempt,\n logOutcome: attempt.logOutcome ?? 'abandoned',\n });\n }\n }\n}\n\n// Per-step progression primitives. They take a mandatory `tx` because they only\n// run inside the job-execution service's transaction, and every write guards on\n// the never-downgrade predicate so a late or duplicate write cannot overwrite an\n// already-terminal row.\n\nexport async function getStepsByJobExecutionIdForUpdate(\n jobExecutionId: string,\n tx: Tx,\n): Promise<Step[]> {\n const rows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, jobExecutionId))\n .orderBy(asc(steps.position))\n .for('update');\n return rows.map(toStep);\n}\n\nexport async function getStepAttemptsByJobExecutionId(\n jobExecutionId: string,\n tx: Tx,\n): Promise<StepAttempt[]> {\n const rows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n return rows.map(toStepAttempt);\n}\n\nexport interface MarkStepRunningParams {\n jobExecutionId: string;\n stepId: string;\n}\n\nexport async function markStepRunning(params: MarkStepRunningParams, tx: Tx): Promise<Step | null> {\n const rows = await tx\n .update(steps)\n .set({\n status: 'running',\n statusReason: null,\n evaluationTrace: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n NON_TERMINAL_STEP_STATUS_FILTER,\n ),\n )\n .returning();\n const row = rows[0];\n if (!row) return null;\n const step = toStep(row);\n // Open the attempt this dispatch runs. onConflictDoNothing makes a racing\n // re-dispatch a no-op against the unique (step_id, attempt) anchor; normal\n // re-delivery returns the already-running step without calling this.\n await insertRunningStepAttempt(\n {\n jobExecutionId: step.jobExecutionId,\n stepId: step.id,\n attempt: step.currentAttempt,\n config: step.config,\n },\n tx,\n );\n return step;\n}\n\nexport interface DispatchStepWithCompletedConfigParams {\n jobExecutionId: string;\n stepId: string;\n config: Record<string, unknown>;\n evaluationTrace: readonly PersistedEvaluationTraceEntry[] | null;\n}\n\nexport async function dispatchStepWithCompletedConfig(\n params: DispatchStepWithCompletedConfigParams,\n tx: Tx,\n): Promise<Step | null> {\n const rows = await tx\n .update(steps)\n .set({\n status: 'running',\n statusReason: null,\n evaluationTrace: null,\n config: params.config,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n NON_TERMINAL_STEP_STATUS_FILTER,\n ),\n )\n .returning();\n const row = rows[0];\n if (!row) return null;\n const step = toStep(row);\n await insertRunningStepAttempt(\n {\n jobExecutionId: step.jobExecutionId,\n stepId: step.id,\n attempt: step.currentAttempt,\n config: params.config,\n evaluationTrace: params.evaluationTrace,\n },\n tx,\n );\n return step;\n}\n\nexport interface MarkStepSkippedParams {\n jobExecutionId: string;\n stepId: string;\n statusReason: StepStatusReason;\n evaluationTrace: readonly PersistedEvaluationTraceEntry[];\n}\n\nexport async function markStepSkipped(params: MarkStepSkippedParams, tx: Tx): Promise<Step | null> {\n const rows = await tx\n .update(steps)\n .set({\n status: 'skipped',\n statusReason: params.statusReason,\n evaluationTrace: params.evaluationTrace,\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n eq(steps.status, 'pending'),\n ),\n )\n .returning();\n const row = rows[0];\n return row ? toStep(row) : null;\n}\n\nexport async function settleJobFailed(\n tx: Tx,\n params: {\n jobId: string;\n jobExecutionId: string;\n failedStepId: string;\n error: Record<string, unknown>;\n },\n): Promise<'succeeded' | 'failed' | null> {\n await applyStepResult(\n {\n jobExecutionId: params.jobExecutionId,\n stepId: params.failedStepId,\n status: 'failed',\n error: params.error,\n },\n tx,\n );\n\n const after = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n if (!after.every((step) => isTerminal(step.status))) return null;\n\n const status = deriveCompletion(after);\n await writeJobStepsSettledOutbox(tx, {\n jobId: params.jobId,\n jobExecutionId: params.jobExecutionId,\n status,\n });\n return status;\n}\n\nexport interface InsertRunningStepAttemptParams {\n jobExecutionId: string;\n stepId: string;\n attempt: number;\n config?: Record<string, unknown> | null;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null;\n}\n\nexport async function insertRunningStepAttempt(\n params: InsertRunningStepAttemptParams,\n tx: Tx,\n): Promise<void> {\n const [{nextExecutionOrder} = {nextExecutionOrder: 1}] = await tx\n .select({\n nextExecutionOrder: sql<number>`coalesce(max(${stepAttempts.executionOrder}), 0) + 1`,\n })\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId));\n\n await tx\n .insert(stepAttempts)\n .values({\n jobExecutionId: params.jobExecutionId,\n stepId: params.stepId,\n attempt: params.attempt,\n executionOrder: nextExecutionOrder,\n status: 'running',\n config: params.config ?? null,\n evaluationTrace: params.evaluationTrace ?? null,\n })\n .onConflictDoNothing({target: [stepAttempts.stepId, stepAttempts.attempt]});\n}\n\nexport interface FinishStepAttemptParams {\n stepId: string;\n attempt: number;\n status: Exclude<StepAttemptStatus, 'running'>;\n error?: Record<string, unknown> | null;\n output?: Record<string, unknown> | null;\n response?: string | null;\n exitCode?: number | null;\n logOutcome: LogOutcomeDto;\n gateResult?: Record<string, unknown> | null;\n restartFeedback?: string | null;\n}\n\n// Finalize the running attempt to a terminal state. The `status='running'` guard\n// makes this idempotent: a duplicate report finds the attempt already terminal\n// and updates nothing (never-downgrade for the audit row).\nexport async function finishStepAttempt(params: FinishStepAttemptParams, tx: Tx): Promise<void> {\n const rows = await tx\n .update(stepAttempts)\n .set({\n status: params.status,\n output: params.output ?? null,\n response: params.response ?? null,\n error: params.error ?? null,\n exitCode: params.exitCode ?? null,\n logOutcome: params.logOutcome,\n gateResult: params.gateResult ?? null,\n restartFeedback: params.restartFeedback ?? null,\n finishedAt: new Date(),\n })\n .where(\n and(\n eq(stepAttempts.stepId, params.stepId),\n eq(stepAttempts.attempt, params.attempt),\n eq(stepAttempts.status, 'running'),\n ),\n )\n .returning({\n stepId: stepAttempts.stepId,\n attempt: stepAttempts.attempt,\n logOutcome: stepAttempts.logOutcome,\n });\n\n const row = rows[0];\n if (!row) return;\n\n await writeStepAttemptTerminatedOutbox(tx, {\n stepId: row.stepId,\n attempt: row.attempt,\n logOutcome: row.logOutcome ?? params.logOutcome,\n });\n}\n\nexport interface RewindStepsToPendingParams {\n jobExecutionId: string;\n fromPosition: number;\n}\n\n// Restart-only: rewind every step at or after `fromPosition` back to pending,\n// clearing its result and bumping both `version` and `current_attempt` so the next\n// dispatch opens a fresh attempt. This DELIBERATELY bypasses the never-downgrade\n// guard used everywhere else — it is the one place that resurrects terminal steps\n// — so it must only be called from the durable-restart path, never the ordinary\n// report path. It must run in the same transaction as the failed-attempt write.\nexport async function rewindStepsToPending(\n params: RewindStepsToPendingParams,\n tx: Tx,\n): Promise<void> {\n await tx\n .update(steps)\n .set({\n status: 'pending',\n statusReason: null,\n error: null,\n version: sql`${steps.version} + 1`,\n currentAttempt: sql`${steps.currentAttempt} + 1`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.jobExecutionId, params.jobExecutionId),\n gte(steps.position, params.fromPosition),\n ),\n );\n}\n\n// Count a single step's own attempts. Used to bound the restart cap on the\n// gating step's actual executions — `steps.current_attempt` can't be used for\n// the cap because a rewind also bumps it for downstream steps swept into the\n// rewind range (which would inflate a later gate's cap in a multi-gate job).\nexport async function countStepAttempts(stepId: string, tx: Tx): Promise<number> {\n const rows = await tx\n .select({total: count()})\n .from(stepAttempts)\n .where(eq(stepAttempts.stepId, stepId));\n return Number(rows[0]?.total ?? 0);\n}\n\nexport async function getStepAttempts(jobId: string): Promise<StepAttempt[]> {\n const rows = await db()\n .select({stepAttempt: stepAttempts})\n .from(stepAttempts)\n .innerJoin(steps, eq(stepAttempts.stepId, steps.id))\n .innerJoin(jobExecutions, eq(steps.jobExecutionId, jobExecutions.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(stepAttempts.executionOrder));\n return rows.map((row) => toStepAttempt(row.stepAttempt));\n}\n\nexport async function getStepAttemptsByJobIds(jobIds: string[]): Promise<StepAttempt[]> {\n if (jobIds.length === 0) return [];\n const rows = await db()\n .select({stepAttempt: stepAttempts, jobId: jobExecutions.jobId})\n .from(stepAttempts)\n .innerJoin(steps, eq(stepAttempts.stepId, steps.id))\n .innerJoin(jobExecutions, eq(steps.jobExecutionId, jobExecutions.id))\n .where(inArray(jobExecutions.jobId, jobIds))\n .orderBy(asc(jobExecutions.jobId), asc(stepAttempts.executionOrder));\n return rows.map((row) => toStepAttempt(row.stepAttempt));\n}\n\nexport interface ApplyStepResultParams {\n jobExecutionId: string;\n stepId: string;\n status: 'succeeded' | 'failed';\n error: Record<string, unknown> | null;\n}\n\nexport async function applyStepResult(params: ApplyStepResultParams, tx: Tx): Promise<void> {\n await tx\n .update(steps)\n .set({\n status: params.status,\n statusReason: null,\n error: params.error ?? null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n NON_TERMINAL_STEP_STATUS_FILTER,\n ),\n );\n}\n\nexport interface CancelRemainingStepsParams {\n jobExecutionId: string;\n}\n\nexport async function cancelRemainingSteps(\n params: CancelRemainingStepsParams,\n tx: Tx,\n): Promise<void> {\n await bulkUpdateStepStatuses({jobExecutionId: params.jobExecutionId, status: 'cancelled'}, tx);\n}\n"],"names":["and","asc","count","eq","gte","inArray","sql","deriveCompletion","isTerminal","db","jobExecutions","stepAttempts","toStepAttempt","steps","toStep","writeJobStepsSettledOutbox","writeStepAttemptTerminatedOutbox","NON_TERMINAL_STEP_STATUS_FILTER","getStepByIdForJobExecution","params","rows","select","from","where","id","stepId","jobExecutionId","limit","row","undefined","getStepById","getStepsByJobId","jobId","step","innerJoin","orderBy","position","map","getStepsByJobExecutionId","bulkUpdateStepStatuses","tx","transaction","update","set","status","statusReason","updatedAt","Date","finalizedAttempts","logOutcome","finishedAt","returning","attempt","length","getStepsByJobExecutionIdForUpdate","for","getStepAttemptsByJobExecutionId","executionOrder","markStepRunning","evaluationTrace","insertRunningStepAttempt","currentAttempt","config","dispatchStepWithCompletedConfig","markStepSkipped","error","settleJobFailed","applyStepResult","failedStepId","after","every","nextExecutionOrder","insert","values","onConflictDoNothing","target","finishStepAttempt","output","response","exitCode","gateResult","restartFeedback","rewindStepsToPending","version","fromPosition","countStepAttempts","total","Number","getStepAttempts","stepAttempt","getStepAttemptsByJobIds","jobIds","cancelRemainingSteps"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/steps.ts"],"sourcesContent":["import type {LogOutcomeDto} from '@shipfox/api-workflows-dto';\nimport {and, asc, count, eq, gte, inArray, sql} from 'drizzle-orm';\nimport type {\n PersistedEvaluationTraceEntry,\n Step,\n StepAttempt,\n StepAttemptStatus,\n StepStatus,\n StepStatusReason,\n} from '#core/entities/step.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport {db, type Tx} from '../db.js';\nimport {jobExecutions} from '../schema/job-executions.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {writeJobStepsSettledOutbox, writeStepAttemptTerminatedOutbox} from './outbox.js';\nimport {NON_TERMINAL_STEP_STATUS_FILTER} from './shared.js';\n\nexport async function getStepByIdForJobExecution(params: {\n stepId: string;\n jobExecutionId: string;\n}): Promise<Step | undefined> {\n const rows = await db()\n .select()\n .from(steps)\n .where(and(eq(steps.id, params.stepId), eq(steps.jobExecutionId, params.jobExecutionId)))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toStep(row);\n}\n\nexport async function getStepById(stepId: string): Promise<Step | undefined> {\n const rows = await db().select().from(steps).where(eq(steps.id, stepId)).limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toStep(row);\n}\n\nexport async function getStepsByJobId(jobId: string): Promise<Step[]> {\n const rows = await db()\n .select({step: steps})\n .from(steps)\n .innerJoin(jobExecutions, eq(steps.jobExecutionId, jobExecutions.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(steps.position));\n return rows.map((row) => toStep(row.step));\n}\n\nexport async function getStepsByJobExecutionId(jobExecutionId: string): Promise<Step[]> {\n const rows = await db()\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, jobExecutionId))\n .orderBy(asc(steps.position));\n return rows.map(toStep);\n}\n\nexport interface BulkUpdateStepStatusesParams {\n jobExecutionId: string;\n status: Extract<StepStatus, 'failed' | 'cancelled'>;\n}\n\nexport async function bulkUpdateStepStatuses(\n params: BulkUpdateStepStatusesParams,\n tx?: Tx,\n): Promise<void> {\n if (!tx) {\n await db().transaction((transaction) => bulkUpdateStepStatuses(params, transaction));\n return;\n }\n\n await tx\n .update(steps)\n .set({\n status: params.status,\n statusReason: null,\n updatedAt: new Date(),\n })\n .where(and(eq(steps.jobExecutionId, params.jobExecutionId), NON_TERMINAL_STEP_STATUS_FILTER));\n\n // Finalize open attempt rows so a timed-out/cancelled sweep does not leave\n // phantom in-flight work for gate and restart logic.\n const finalizedAttempts = await tx\n .update(stepAttempts)\n .set({status: params.status, logOutcome: 'abandoned', finishedAt: new Date()})\n .from(steps)\n .where(\n and(\n eq(stepAttempts.stepId, steps.id),\n eq(steps.jobExecutionId, params.jobExecutionId),\n eq(stepAttempts.status, 'running'),\n ),\n )\n .returning({\n stepId: stepAttempts.stepId,\n attempt: stepAttempts.attempt,\n logOutcome: stepAttempts.logOutcome,\n });\n\n if (finalizedAttempts.length > 0) {\n for (const attempt of finalizedAttempts) {\n await writeStepAttemptTerminatedOutbox(tx, {\n stepId: attempt.stepId,\n attempt: attempt.attempt,\n logOutcome: attempt.logOutcome ?? 'abandoned',\n });\n }\n }\n}\n\n// Per-step progression primitives. They take a mandatory `tx` because they only\n// run inside the job-execution service's transaction, and every write guards on\n// the never-downgrade predicate so a late or duplicate write cannot overwrite an\n// already-terminal row.\n\nexport async function getStepsByJobExecutionIdForUpdate(\n jobExecutionId: string,\n tx: Tx,\n): Promise<Step[]> {\n const rows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, jobExecutionId))\n .orderBy(asc(steps.position))\n .for('update');\n return rows.map(toStep);\n}\n\nexport async function getStepAttemptsByJobExecutionId(\n jobExecutionId: string,\n tx: Tx,\n): Promise<StepAttempt[]> {\n const rows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n return rows.map(toStepAttempt);\n}\n\nexport interface MarkStepRunningParams {\n jobExecutionId: string;\n stepId: string;\n}\n\nexport async function markStepRunning(params: MarkStepRunningParams, tx: Tx): Promise<Step | null> {\n const rows = await tx\n .update(steps)\n .set({\n status: 'running',\n statusReason: null,\n evaluationTrace: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n NON_TERMINAL_STEP_STATUS_FILTER,\n ),\n )\n .returning();\n const row = rows[0];\n if (!row) return null;\n const step = toStep(row);\n // Open the attempt this dispatch runs. onConflictDoNothing makes a racing\n // re-dispatch a no-op against the unique (step_id, attempt) anchor; normal\n // re-delivery returns the already-running step without calling this.\n await insertRunningStepAttempt(\n {\n jobExecutionId: step.jobExecutionId,\n stepId: step.id,\n attempt: step.currentAttempt,\n config: step.config,\n },\n tx,\n );\n return step;\n}\n\nexport interface DispatchStepWithCompletedConfigParams {\n jobExecutionId: string;\n stepId: string;\n config: Record<string, unknown>;\n evaluationTrace: readonly PersistedEvaluationTraceEntry[] | null;\n}\n\nexport async function dispatchStepWithCompletedConfig(\n params: DispatchStepWithCompletedConfigParams,\n tx: Tx,\n): Promise<Step | null> {\n const rows = await tx\n .update(steps)\n .set({\n status: 'running',\n statusReason: null,\n evaluationTrace: null,\n config: params.config,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n NON_TERMINAL_STEP_STATUS_FILTER,\n ),\n )\n .returning();\n const row = rows[0];\n if (!row) return null;\n const step = toStep(row);\n await insertRunningStepAttempt(\n {\n jobExecutionId: step.jobExecutionId,\n stepId: step.id,\n attempt: step.currentAttempt,\n config: params.config,\n evaluationTrace: params.evaluationTrace,\n },\n tx,\n );\n return step;\n}\n\nexport interface MarkStepSkippedParams {\n jobExecutionId: string;\n stepId: string;\n statusReason: StepStatusReason;\n evaluationTrace: readonly PersistedEvaluationTraceEntry[];\n}\n\nexport async function markStepSkipped(params: MarkStepSkippedParams, tx: Tx): Promise<Step | null> {\n const rows = await tx\n .update(steps)\n .set({\n status: 'skipped',\n statusReason: params.statusReason,\n evaluationTrace: params.evaluationTrace,\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n eq(steps.status, 'pending'),\n ),\n )\n .returning();\n const row = rows[0];\n return row ? toStep(row) : null;\n}\n\nexport async function settleJobFailed(\n tx: Tx,\n params: {\n jobId: string;\n jobExecutionId: string;\n failedStepId: string;\n error: Record<string, unknown>;\n },\n): Promise<'succeeded' | 'failed' | null> {\n await applyStepResult(\n {\n jobExecutionId: params.jobExecutionId,\n stepId: params.failedStepId,\n status: 'failed',\n error: params.error,\n },\n tx,\n );\n\n const after = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n if (!after.every((step) => isTerminal(step.status))) return null;\n\n const status = deriveCompletion(after);\n await writeJobStepsSettledOutbox(tx, {\n jobId: params.jobId,\n jobExecutionId: params.jobExecutionId,\n status,\n });\n return status;\n}\n\nexport interface InsertRunningStepAttemptParams {\n jobExecutionId: string;\n stepId: string;\n attempt: number;\n config?: Record<string, unknown> | null;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null;\n}\n\nexport async function insertRunningStepAttempt(\n params: InsertRunningStepAttemptParams,\n tx: Tx,\n): Promise<void> {\n const [{nextExecutionOrder} = {nextExecutionOrder: 1}] = await tx\n .select({\n nextExecutionOrder: sql<number>`coalesce(max(${stepAttempts.executionOrder}), 0) + 1`,\n })\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId));\n\n await tx\n .insert(stepAttempts)\n .values({\n jobExecutionId: params.jobExecutionId,\n stepId: params.stepId,\n attempt: params.attempt,\n executionOrder: nextExecutionOrder,\n status: 'running',\n config: params.config ?? null,\n evaluationTrace: params.evaluationTrace ?? null,\n })\n .onConflictDoNothing({target: [stepAttempts.stepId, stepAttempts.attempt]});\n}\n\nexport interface FinishStepAttemptParams {\n stepId: string;\n attempt: number;\n status: Exclude<StepAttemptStatus, 'running'>;\n error?: Record<string, unknown> | null;\n output?: Record<string, unknown> | null;\n response?: string | null;\n exitCode?: number | null;\n logOutcome: LogOutcomeDto;\n gateResult?: Record<string, unknown> | null;\n restartFeedback?: string | null;\n}\n\n// Finalize the running attempt to a terminal state. The `status='running'` guard\n// makes this idempotent: a duplicate report finds the attempt already terminal\n// and updates nothing (never-downgrade for the audit row).\nexport async function finishStepAttempt(params: FinishStepAttemptParams, tx: Tx): Promise<void> {\n const rows = await tx\n .update(stepAttempts)\n .set({\n status: params.status,\n output: params.output ?? null,\n response: params.response ?? null,\n error: params.error ?? null,\n exitCode: params.exitCode ?? null,\n logOutcome: params.logOutcome,\n gateResult: params.gateResult ?? null,\n restartFeedback: params.restartFeedback ?? null,\n finishedAt: new Date(),\n })\n .where(\n and(\n eq(stepAttempts.stepId, params.stepId),\n eq(stepAttempts.attempt, params.attempt),\n eq(stepAttempts.status, 'running'),\n ),\n )\n .returning({\n stepId: stepAttempts.stepId,\n attempt: stepAttempts.attempt,\n logOutcome: stepAttempts.logOutcome,\n });\n\n const row = rows[0];\n if (!row) return;\n\n await writeStepAttemptTerminatedOutbox(tx, {\n stepId: row.stepId,\n attempt: row.attempt,\n logOutcome: row.logOutcome ?? params.logOutcome,\n });\n}\n\nexport interface RewindStepsToPendingParams {\n jobExecutionId: string;\n fromPosition: number;\n}\n\n// Restart-only: rewind every step at or after `fromPosition` back to pending,\n// clearing its result and bumping both `version` and `current_attempt` so the next\n// dispatch opens a fresh attempt. This DELIBERATELY bypasses the never-downgrade\n// guard used everywhere else. It is the one place that resurrects terminal steps,\n// so it must only be called from the durable-restart path, never the ordinary\n// report path. It must run in the same transaction as the failed-attempt write.\nexport async function rewindStepsToPending(\n params: RewindStepsToPendingParams,\n tx: Tx,\n): Promise<void> {\n await tx\n .update(steps)\n .set({\n status: 'pending',\n statusReason: null,\n error: null,\n version: sql`${steps.version} + 1`,\n currentAttempt: sql`${steps.currentAttempt} + 1`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.jobExecutionId, params.jobExecutionId),\n gte(steps.position, params.fromPosition),\n ),\n );\n}\n\n// Count a single step's own attempts. Used to bound the restart cap on the\n// gating step's actual executions: `steps.current_attempt` can't be used for\n// the cap because a rewind also bumps it for downstream steps swept into the\n// rewind range (which would inflate a later gate's cap in a multi-gate job).\nexport async function countStepAttempts(stepId: string, tx: Tx): Promise<number> {\n const rows = await tx\n .select({total: count()})\n .from(stepAttempts)\n .where(eq(stepAttempts.stepId, stepId));\n return Number(rows[0]?.total ?? 0);\n}\n\nexport async function getStepAttempts(jobId: string): Promise<StepAttempt[]> {\n const rows = await db()\n .select({stepAttempt: stepAttempts})\n .from(stepAttempts)\n .innerJoin(steps, eq(stepAttempts.stepId, steps.id))\n .innerJoin(jobExecutions, eq(steps.jobExecutionId, jobExecutions.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(stepAttempts.executionOrder));\n return rows.map((row) => toStepAttempt(row.stepAttempt));\n}\n\nexport async function getStepAttemptsByJobIds(jobIds: string[]): Promise<StepAttempt[]> {\n if (jobIds.length === 0) return [];\n const rows = await db()\n .select({stepAttempt: stepAttempts, jobId: jobExecutions.jobId})\n .from(stepAttempts)\n .innerJoin(steps, eq(stepAttempts.stepId, steps.id))\n .innerJoin(jobExecutions, eq(steps.jobExecutionId, jobExecutions.id))\n .where(inArray(jobExecutions.jobId, jobIds))\n .orderBy(asc(jobExecutions.jobId), asc(stepAttempts.executionOrder));\n return rows.map((row) => toStepAttempt(row.stepAttempt));\n}\n\nexport interface ApplyStepResultParams {\n jobExecutionId: string;\n stepId: string;\n status: 'succeeded' | 'failed';\n error: Record<string, unknown> | null;\n}\n\nexport async function applyStepResult(params: ApplyStepResultParams, tx: Tx): Promise<void> {\n await tx\n .update(steps)\n .set({\n status: params.status,\n statusReason: null,\n error: params.error ?? null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(steps.id, params.stepId),\n eq(steps.jobExecutionId, params.jobExecutionId),\n NON_TERMINAL_STEP_STATUS_FILTER,\n ),\n );\n}\n\nexport interface CancelRemainingStepsParams {\n jobExecutionId: string;\n}\n\nexport async function cancelRemainingSteps(\n params: CancelRemainingStepsParams,\n tx: Tx,\n): Promise<void> {\n await bulkUpdateStepStatuses({jobExecutionId: params.jobExecutionId, status: 'cancelled'}, tx);\n}\n"],"names":["and","asc","count","eq","gte","inArray","sql","deriveCompletion","isTerminal","db","jobExecutions","stepAttempts","toStepAttempt","steps","toStep","writeJobStepsSettledOutbox","writeStepAttemptTerminatedOutbox","NON_TERMINAL_STEP_STATUS_FILTER","getStepByIdForJobExecution","params","rows","select","from","where","id","stepId","jobExecutionId","limit","row","undefined","getStepById","getStepsByJobId","jobId","step","innerJoin","orderBy","position","map","getStepsByJobExecutionId","bulkUpdateStepStatuses","tx","transaction","update","set","status","statusReason","updatedAt","Date","finalizedAttempts","logOutcome","finishedAt","returning","attempt","length","getStepsByJobExecutionIdForUpdate","for","getStepAttemptsByJobExecutionId","executionOrder","markStepRunning","evaluationTrace","insertRunningStepAttempt","currentAttempt","config","dispatchStepWithCompletedConfig","markStepSkipped","error","settleJobFailed","applyStepResult","failedStepId","after","every","nextExecutionOrder","insert","values","onConflictDoNothing","target","finishStepAttempt","output","response","exitCode","gateResult","restartFeedback","rewindStepsToPending","version","fromPosition","countStepAttempts","total","Number","getStepAttempts","stepAttempt","getStepAttemptsByJobIds","jobIds","cancelRemainingSteps"],"mappings":"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"}
@@ -3,10 +3,11 @@ export { failJobExecutionAsTimedOut, getFirstJobExecutionByJobId, getJobExecutio
3
3
  export type { EvaluateJobActivationsParams, EvaluateJobSuccessResult, JobActivationDecision, JobScope, UpdateJobStatusAtVersionParams, UpdateJobStatusParams, } from './workflow-runs/jobs.js';
4
4
  export { evaluateJobActivations, evaluateJobSuccess, getDirectDependencyJobContexts, getJobById, getJobScope, getJobsByWorkflowRunAttemptId, getJobsByWorkflowRunId, resolveJobStatusFromJobExecutions, updateJobStatus, updateJobStatusAtVersion, } from './workflow-runs/jobs.js';
5
5
  export { writeJobStepsSettledOutbox, writeStepAttemptTerminatedOutbox, writeStepRestartEnqueuedOutbox, } from './workflow-runs/outbox.js';
6
- export type { ListWorkflowRunsParams, ListWorkflowRunsResult, WorkflowJobExecutionDepth, WorkflowJobExecutionDepthParams, WorkflowRunAggregates, WorkflowRunCursor, WorkflowRunFilters, } from './workflow-runs/queries.js';
7
- export { buildWorkflowRunListConditions, getJobExecutionDetail, getLatestAttempt, getWorkflowJobExecutionDepth, getWorkflowRunAggregates, getWorkflowRunAttemptById, getWorkflowRunByAttemptId, getWorkflowRunById, getWorkflowRunDetail, listRunAttempts, listWorkflowRuns, listWorkflowRunsByProject, } from './workflow-runs/queries.js';
6
+ export type { ListWorkflowRunsParams, ListWorkflowRunsResult, WorkflowJobExecutionDepth, WorkflowJobExecutionDepthParams, WorkflowRunAggregates, WorkflowRunCursor, WorkflowRunFilters, WorkflowRunJobStatusCount, WorkflowRunJobSummary, WorkflowRunJobSummaryTarget, WorkflowRunJobsSummary, } from './workflow-runs/queries.js';
7
+ export { buildWorkflowRunListConditions, getJobExecutionDetail, getLatestAttempt, getWorkflowJobExecutionDepth, getWorkflowRunAggregates, getWorkflowRunAttemptById, getWorkflowRunByAttemptId, getWorkflowRunById, getWorkflowRunDetail, listRunAttempts, listWorkflowRunJobSummaries, listWorkflowRuns, listWorkflowRunsByProject, } from './workflow-runs/queries.js';
8
8
  export type { CancelWorkflowRunParams, CreateRerunWorkflowRunParams, CreateWorkflowRunParams, FailWorkflowRunAsTimedOutParams, UpdateWorkflowRunStatusParams, } from './workflow-runs/runs.js';
9
- export { cancelWorkflowRun, createRerunWorkflowRun, createWorkflowRun, failWorkflowRunAsTimedOut, updateWorkflowRunStatus, } from './workflow-runs/runs.js';
9
+ export { cancelWorkflowRun, createRerunWorkflowRun, createWorkflowRun, failWorkflowRunAsTimedOut, loadReferencedVariables, updateWorkflowRunStatus, } from './workflow-runs/runs.js';
10
+ export { getWorkflowContextForJob } from './workflow-runs/shared.js';
10
11
  export type { ApplyStepResultParams, BulkUpdateStepStatusesParams, CancelRemainingStepsParams, DispatchStepWithCompletedConfigParams, FinishStepAttemptParams, InsertRunningStepAttemptParams, MarkStepRunningParams, MarkStepSkippedParams, RewindStepsToPendingParams, } from './workflow-runs/steps.js';
11
12
  export { applyStepResult, bulkUpdateStepStatuses, cancelRemainingSteps, countStepAttempts, dispatchStepWithCompletedConfig, finishStepAttempt, getStepAttempts, getStepAttemptsByJobExecutionId, getStepAttemptsByJobIds, getStepById, getStepByIdForJobExecution, getStepsByJobExecutionId, getStepsByJobExecutionIdForUpdate, getStepsByJobId, insertRunningStepAttempt, markStepRunning, markStepSkipped, rewindStepsToPending, settleJobFailed, } from './workflow-runs/steps.js';
12
13
  //# sourceMappingURL=workflow-runs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-runs.d.ts","sourceRoot":"","sources":["../../src/db/workflow-runs.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,uCAAuC,EACvC,8BAA8B,GAC/B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,EACvB,sCAAsC,EACtC,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,mCAAmC,EACnC,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,QAAQ,EACR,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,8BAA8B,EAC9B,UAAU,EACV,WAAW,EACX,6BAA6B,EAC7B,sBAAsB,EACtB,iCAAiC,EACjC,eAAe,EACf,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,EAChC,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,+BAA+B,EAC/B,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,gBAAgB,EAChB,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,qCAAqC,EACrC,uBAAuB,EACvB,8BAA8B,EAC9B,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,+BAA+B,EAC/B,iBAAiB,EACjB,eAAe,EACf,+BAA+B,EAC/B,uBAAuB,EACvB,WAAW,EACX,0BAA0B,EAC1B,wBAAwB,EACxB,iCAAiC,EACjC,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"workflow-runs.d.ts","sourceRoot":"","sources":["../../src/db/workflow-runs.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,uCAAuC,EACvC,8BAA8B,GAC/B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,EACvB,sCAAsC,EACtC,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,mCAAmC,EACnC,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,EACrB,QAAQ,EACR,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,8BAA8B,EAC9B,UAAU,EACV,WAAW,EACX,6BAA6B,EAC7B,sBAAsB,EACtB,iCAAiC,EACjC,eAAe,EACf,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,gCAAgC,EAChC,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,+BAA+B,EAC/B,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,gBAAgB,EAChB,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAC,wBAAwB,EAAC,MAAM,2BAA2B,CAAC;AACnE,YAAY,EACV,qBAAqB,EACrB,4BAA4B,EAC5B,0BAA0B,EAC1B,qCAAqC,EACrC,uBAAuB,EACvB,8BAA8B,EAC9B,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,+BAA+B,EAC/B,iBAAiB,EACjB,eAAe,EACf,+BAA+B,EAC/B,uBAAuB,EACvB,WAAW,EACX,0BAA0B,EAC1B,wBAAwB,EACxB,iCAAiC,EACjC,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,0BAA0B,CAAC"}
@@ -1,8 +1,9 @@
1
1
  export { failJobExecutionAsTimedOut, getFirstJobExecutionByJobId, getJobExecutionById, getJobExecutionsByJobId, getJobExecutionsByWorkflowRunAttemptId, getLatestJobExecutionByJobId, recordJobExecutionQueuedAt, recordJobExecutionStartedAt, resolveJobExecutionAfterLeaseExpiry, updateJobExecutionStatus } from './workflow-runs/job-executions.js';
2
2
  export { evaluateJobActivations, evaluateJobSuccess, getDirectDependencyJobContexts, getJobById, getJobScope, getJobsByWorkflowRunAttemptId, getJobsByWorkflowRunId, resolveJobStatusFromJobExecutions, updateJobStatus, updateJobStatusAtVersion } from './workflow-runs/jobs.js';
3
3
  export { writeJobStepsSettledOutbox, writeStepAttemptTerminatedOutbox, writeStepRestartEnqueuedOutbox } from './workflow-runs/outbox.js';
4
- export { buildWorkflowRunListConditions, getJobExecutionDetail, getLatestAttempt, getWorkflowJobExecutionDepth, getWorkflowRunAggregates, getWorkflowRunAttemptById, getWorkflowRunByAttemptId, getWorkflowRunById, getWorkflowRunDetail, listRunAttempts, listWorkflowRuns, listWorkflowRunsByProject } from './workflow-runs/queries.js';
5
- export { cancelWorkflowRun, createRerunWorkflowRun, createWorkflowRun, failWorkflowRunAsTimedOut, updateWorkflowRunStatus } from './workflow-runs/runs.js';
4
+ export { buildWorkflowRunListConditions, getJobExecutionDetail, getLatestAttempt, getWorkflowJobExecutionDepth, getWorkflowRunAggregates, getWorkflowRunAttemptById, getWorkflowRunByAttemptId, getWorkflowRunById, getWorkflowRunDetail, listRunAttempts, listWorkflowRunJobSummaries, listWorkflowRuns, listWorkflowRunsByProject } from './workflow-runs/queries.js';
5
+ export { cancelWorkflowRun, createRerunWorkflowRun, createWorkflowRun, failWorkflowRunAsTimedOut, loadReferencedVariables, updateWorkflowRunStatus } from './workflow-runs/runs.js';
6
+ export { getWorkflowContextForJob } from './workflow-runs/shared.js';
6
7
  export { applyStepResult, bulkUpdateStepStatuses, cancelRemainingSteps, countStepAttempts, dispatchStepWithCompletedConfig, finishStepAttempt, getStepAttempts, getStepAttemptsByJobExecutionId, getStepAttemptsByJobIds, getStepById, getStepByIdForJobExecution, getStepsByJobExecutionId, getStepsByJobExecutionIdForUpdate, getStepsByJobId, insertRunningStepAttempt, markStepRunning, markStepSkipped, rewindStepsToPending, settleJobFailed } from './workflow-runs/steps.js';
7
8
 
8
9
  //# sourceMappingURL=workflow-runs.js.map