@shipfox/api-workflows 10.2.0 → 12.0.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 (354) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/CHANGELOG.md +117 -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/routes/require-accessible-run.d.ts.map +1 -1
  207. package/dist/presentation/routes/require-accessible-run.js +1 -1
  208. package/dist/presentation/routes/require-accessible-run.js.map +1 -1
  209. package/dist/presentation/subscribers/on-job-steps-settled.js +1 -1
  210. package/dist/presentation/subscribers/on-job-steps-settled.js.map +1 -1
  211. package/dist/presentation/subscribers/on-runner-job-claimed.d.ts.map +1 -1
  212. package/dist/presentation/subscribers/on-runner-job-claimed.js +21 -0
  213. package/dist/presentation/subscribers/on-runner-job-claimed.js.map +1 -1
  214. package/dist/temporal/activities/index.d.ts.map +1 -1
  215. package/dist/temporal/activities/index.js +2 -1
  216. package/dist/temporal/activities/index.js.map +1 -1
  217. package/dist/temporal/activities/orchestration-activities.d.ts +1 -0
  218. package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
  219. package/dist/temporal/activities/orchestration-activities.js.map +1 -1
  220. package/dist/temporal/constants.d.ts +1 -0
  221. package/dist/temporal/constants.d.ts.map +1 -1
  222. package/dist/temporal/constants.js +1 -0
  223. package/dist/temporal/constants.js.map +1 -1
  224. package/dist/temporal/index.d.ts +1 -1
  225. package/dist/temporal/index.d.ts.map +1 -1
  226. package/dist/temporal/index.js +1 -1
  227. package/dist/temporal/index.js.map +1 -1
  228. package/dist/temporal/workflows/index.bundle.js +82 -43
  229. package/dist/temporal/workflows/index.d.ts +1 -1
  230. package/dist/temporal/workflows/index.d.ts.map +1 -1
  231. package/dist/temporal/workflows/index.js +1 -1
  232. package/dist/temporal/workflows/index.js.map +1 -1
  233. package/dist/temporal/workflows/job-execution-orchestration.d.ts +5 -0
  234. package/dist/temporal/workflows/job-execution-orchestration.d.ts.map +1 -1
  235. package/dist/temporal/workflows/job-execution-orchestration.js +77 -43
  236. package/dist/temporal/workflows/job-execution-orchestration.js.map +1 -1
  237. package/dist/temporal/workflows/test-env.d.ts +5 -1
  238. package/dist/temporal/workflows/test-env.d.ts.map +1 -1
  239. package/dist/temporal/workflows/test-env.js +32 -11
  240. package/dist/temporal/workflows/test-env.js.map +1 -1
  241. package/dist/tsconfig.test.tsbuildinfo +1 -1
  242. package/drizzle/0000_initial.sql +14 -2
  243. package/drizzle/0001_windy_sunfire.sql +1 -0
  244. package/drizzle/meta/0000_snapshot.json +93 -1
  245. package/drizzle/meta/0001_snapshot.json +1711 -0
  246. package/drizzle/meta/_journal.json +2 -2
  247. package/package.json +21 -21
  248. package/src/core/agent-defaults.ts +2 -1
  249. package/src/core/checkout.test.ts +378 -67
  250. package/src/core/checkout.ts +142 -59
  251. package/src/core/entities/job-execution.test.ts +21 -0
  252. package/src/core/entities/job-execution.ts +24 -0
  253. package/src/core/entities/job-listener-event.ts +3 -0
  254. package/src/core/entities/step.ts +15 -3
  255. package/src/core/entities/workflow-run-attempt.ts +1 -0
  256. package/src/core/entities/workflow-run.ts +16 -0
  257. package/src/core/errors.ts +21 -7
  258. package/src/core/job-execution.ts +27 -4
  259. package/src/core/job-transition/decide-job-activation.test.ts +4 -0
  260. package/src/core/job-transition/decide-job-activation.ts +2 -0
  261. package/src/core/job-transition/derive-job-success.test.ts +12 -0
  262. package/src/core/job-transition/derive-job-success.ts +6 -9
  263. package/src/core/listener-execution-materialization.test.ts +2 -0
  264. package/src/core/listener-execution-materialization.ts +57 -11
  265. package/src/core/resolve-trigger-reference.test.ts +160 -0
  266. package/src/core/resolve-trigger-reference.ts +53 -0
  267. package/src/core/run-workflow.ts +2 -0
  268. package/src/core/step-config/agent.ts +29 -12
  269. package/src/core/step-config/assemble-run-context.test.ts +149 -6
  270. package/src/core/step-config/assemble-run-context.ts +87 -25
  271. package/src/core/step-config/complete-step-dispatch-config.test.ts +125 -2
  272. package/src/core/step-config/complete-step-dispatch-config.ts +83 -1
  273. package/src/core/step-config/index.ts +7 -0
  274. package/src/core/step-config/materialize-job-execution-steps.test.ts +250 -1
  275. package/src/core/step-config/materialize-job-execution-steps.ts +57 -10
  276. package/src/core/step-config/materialize-workflow-model.test.ts +212 -4
  277. package/src/core/step-config/materialize-workflow-model.ts +33 -28
  278. package/src/core/step-config/resolve-job-execution-name.test.ts +37 -15
  279. package/src/core/step-config/resolve-job-execution-name.ts +30 -15
  280. package/src/core/step-config/resolve-step-config.ts +175 -10
  281. package/src/core/step-config/resolve-workflow-run-name.test.ts +115 -0
  282. package/src/core/step-config/resolve-workflow-run-name.ts +108 -0
  283. package/src/core/step-transition/decide-step-transition.ts +2 -2
  284. package/src/core/step-transition/evaluate-gate.test.ts +8 -0
  285. package/src/core/step-transition/evaluate-gate.ts +8 -1
  286. package/src/core/workflow-run-creation.test.ts +7 -4
  287. package/src/core/workflow-run-creation.ts +13 -7
  288. package/src/db/db.ts +2 -0
  289. package/src/db/index.ts +6 -0
  290. package/src/db/job-listener-events.test.ts +19 -0
  291. package/src/db/job-listener-events.ts +3 -0
  292. package/src/db/job-listeners.test.ts +187 -5
  293. package/src/db/job-listeners.ts +122 -30
  294. package/src/db/schema/job-executions.ts +12 -5
  295. package/src/db/schema/job-listener-events.ts +3 -0
  296. package/src/db/schema/step-attempts.ts +2 -2
  297. package/src/db/schema/steps.ts +2 -1
  298. package/src/db/schema/workflow-run-attempts.ts +2 -0
  299. package/src/db/schema/workflow-run-counters.ts +13 -0
  300. package/src/db/schema/workflow-runs.ts +11 -2
  301. package/src/db/workflow-runs/job-executions.ts +37 -15
  302. package/src/db/workflow-runs/jobs.ts +17 -4
  303. package/src/db/workflow-runs/queries.test.ts +206 -0
  304. package/src/db/workflow-runs/queries.ts +146 -2
  305. package/src/db/workflow-runs/run-create.test.ts +606 -8
  306. package/src/db/workflow-runs/run-create.ts +185 -40
  307. package/src/db/workflow-runs/run-rerun.test.ts +61 -2
  308. package/src/db/workflow-runs/run-rerun.ts +15 -5
  309. package/src/db/workflow-runs/shared.ts +2 -0
  310. package/src/db/workflow-runs/steps.ts +3 -3
  311. package/src/db/workflow-runs.ts +7 -0
  312. package/src/metrics/instance.ts +14 -0
  313. package/src/presentation/dto/checkout-token.test.ts +19 -9
  314. package/src/presentation/dto/checkout-token.ts +2 -1
  315. package/src/presentation/dto/index.ts +1 -1
  316. package/src/presentation/dto/job.test.ts +9 -0
  317. package/src/presentation/dto/step.test.ts +12 -0
  318. package/src/presentation/dto/step.ts +5 -2
  319. package/src/presentation/dto/workflow-run.ts +44 -2
  320. package/src/presentation/inter-module.test.ts +165 -0
  321. package/src/presentation/inter-module.ts +38 -4
  322. package/src/presentation/routes/cancel-run.test.ts +1 -1
  323. package/src/presentation/routes/checkout-token.test.ts +357 -142
  324. package/src/presentation/routes/checkout-token.ts +56 -26
  325. package/src/presentation/routes/get-run-aggregates.test.ts +1 -1
  326. package/src/presentation/routes/get-run.test.ts +29 -1
  327. package/src/presentation/routes/get-step-secrets.test.ts +7 -2
  328. package/src/presentation/routes/leased-step.ts +9 -1
  329. package/src/presentation/routes/list-run-attempts.test.ts +1 -1
  330. package/src/presentation/routes/list-runs.test.ts +58 -1
  331. package/src/presentation/routes/list-runs.ts +8 -3
  332. package/src/presentation/routes/report-step.test.ts +25 -0
  333. package/src/presentation/routes/report-step.ts +10 -2
  334. package/src/presentation/routes/require-accessible-run.ts +4 -1
  335. package/src/presentation/routes/rerun-run.test.ts +1 -1
  336. package/src/presentation/subscribers/on-job-steps-settled.ts +1 -1
  337. package/src/presentation/subscribers/on-runner-job-claimed.test.ts +49 -0
  338. package/src/presentation/subscribers/on-runner-job-claimed.ts +22 -0
  339. package/src/temporal/activities/index.ts +1 -0
  340. package/src/temporal/activities/orchestration-activities.ts +1 -0
  341. package/src/temporal/constants.ts +1 -0
  342. package/src/temporal/index.ts +1 -0
  343. package/src/temporal/workflows/index.ts +1 -0
  344. package/src/temporal/workflows/job-execution-orchestration.test.ts +142 -6
  345. package/src/temporal/workflows/job-execution-orchestration.ts +99 -50
  346. package/src/temporal/workflows/run-orchestration.test.ts +1 -1
  347. package/src/temporal/workflows/test-env.ts +50 -13
  348. package/test/factories/project.ts +2 -0
  349. package/test/factories/workflow-model.ts +80 -26
  350. package/test/factories/workflow-run.ts +4 -1
  351. package/test/fixtures/agent-inter-module.ts +2 -1
  352. package/test/fixtures/job-with-steps.ts +1 -1
  353. package/tsconfig.build.tsbuildinfo +1 -1
  354. package/drizzle/0001_agent_tool_materialization.sql +0 -1
@@ -17,30 +17,50 @@ import { getDirectDependencyJobContexts } from './jobs.js';
17
17
  import { loadReferencedVariables } from './runs.js';
18
18
  import { getWorkflowContextForJob, optimisticLockRetry, TERMINAL_EXECUTION_STATUSES } from './shared.js';
19
19
  import { bulkUpdateStepStatuses, getStepsByJobExecutionIdForUpdate } from './steps.js';
20
+ async function getJobExecutionFallbackName(tx, jobExecutionId) {
21
+ const [row] = await tx.select({
22
+ job: jobs
23
+ }).from(jobExecutions).innerJoin(jobs, eq(jobExecutions.jobId, jobs.id)).where(eq(jobExecutions.id, jobExecutionId)).limit(1);
24
+ if (!row) throw new JobNotFoundError(jobExecutionId);
25
+ return row.job.name ?? row.job.key;
26
+ }
20
27
  export async function getJobExecutionById(id, tx) {
21
- const rows = await (tx ?? db()).select().from(jobExecutions).where(eq(jobExecutions.id, id)).limit(1);
28
+ const rows = await (tx ?? db()).select({
29
+ jobExecution: jobExecutions,
30
+ job: jobs
31
+ }).from(jobExecutions).innerJoin(jobs, eq(jobExecutions.jobId, jobs.id)).where(eq(jobExecutions.id, id)).limit(1);
22
32
  const row = rows[0];
23
- return row ? toJobExecution(row) : undefined;
33
+ return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;
24
34
  }
25
35
  export async function getJobExecutionsByWorkflowRunAttemptId(workflowRunAttemptId) {
26
36
  const rows = await db().select({
27
- jobExecution: jobExecutions
37
+ jobExecution: jobExecutions,
38
+ job: jobs
28
39
  }).from(jobExecutions).innerJoin(jobs, eq(jobExecutions.jobId, jobs.id)).where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId)).orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));
29
- return rows.map((row)=>toJobExecution(row.jobExecution));
40
+ return rows.map((row)=>toJobExecution(row.jobExecution, row.job.name ?? row.job.key));
30
41
  }
31
42
  export async function getJobExecutionsByJobId(jobId) {
32
- const rows = await db().select().from(jobExecutions).where(eq(jobExecutions.jobId, jobId)).orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));
33
- return rows.map(toJobExecution);
43
+ const rows = await db().select({
44
+ jobExecution: jobExecutions,
45
+ job: jobs
46
+ }).from(jobExecutions).innerJoin(jobs, eq(jobExecutions.jobId, jobs.id)).where(eq(jobExecutions.jobId, jobId)).orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));
47
+ return rows.map((row)=>toJobExecution(row.jobExecution, row.job.name ?? row.job.key));
34
48
  }
35
49
  export async function getFirstJobExecutionByJobId(jobId, tx) {
36
- const rows = await (tx ?? db()).select().from(jobExecutions).where(eq(jobExecutions.jobId, jobId)).orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id)).limit(1);
50
+ const rows = await (tx ?? db()).select({
51
+ jobExecution: jobExecutions,
52
+ job: jobs
53
+ }).from(jobExecutions).innerJoin(jobs, eq(jobExecutions.jobId, jobs.id)).where(eq(jobExecutions.jobId, jobId)).orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id)).limit(1);
37
54
  const row = rows[0];
38
- return row ? toJobExecution(row) : undefined;
55
+ return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;
39
56
  }
40
57
  export async function getLatestJobExecutionByJobId(jobId, tx) {
41
- const rows = await (tx ?? db()).select().from(jobExecutions).where(eq(jobExecutions.jobId, jobId)).orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id)).limit(1);
58
+ const rows = await (tx ?? db()).select({
59
+ jobExecution: jobExecutions,
60
+ job: jobs
61
+ }).from(jobExecutions).innerJoin(jobs, eq(jobExecutions.jobId, jobs.id)).where(eq(jobExecutions.jobId, jobId)).orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id)).limit(1);
42
62
  const row = rows[0];
43
- return row ? toJobExecution(row) : undefined;
63
+ return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;
44
64
  }
45
65
  async function resolveJobExecutionOutputs(tx, params) {
46
66
  const [target] = await tx.select({
@@ -55,11 +75,12 @@ async function resolveJobExecutionOutputs(tx, params) {
55
75
  const modelJob = model.jobs.find((job)=>job.key === target.job.key);
56
76
  if (!modelJob || modelJob.outputs === undefined) return null;
57
77
  const executionRows = await tx.select().from(jobExecutions).where(eq(jobExecutions.jobId, target.job.id)).orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));
78
+ const fallbackName = target.job.name ?? target.job.key;
58
79
  const executions = executionRows.map((row)=>row.id === target.execution.id ? toJobExecution({
59
80
  ...row,
60
81
  status: params.status,
61
82
  statusReason: params.statusReason
62
- }) : toJobExecution(row));
83
+ }, fallbackName) : toJobExecution(row, fallbackName));
63
84
  const jobExecution = executions.find((execution)=>execution.id === target.execution.id);
64
85
  if (!jobExecution) throw new JobNotFoundError(params.jobExecutionId);
65
86
  const stepRows = await tx.select().from(steps).where(eq(steps.jobExecutionId, params.jobExecutionId)).orderBy(asc(steps.position), asc(steps.id));
@@ -126,7 +147,7 @@ async function updateJobExecutionStatusAtVersion(tx, params) {
126
147
  const row = rows[0];
127
148
  if (!row) return null;
128
149
  return {
129
- execution: toJobExecution(row),
150
+ execution: toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)),
130
151
  changed: true
131
152
  };
132
153
  }
@@ -143,7 +164,7 @@ export async function updateJobExecutionStatus(params) {
143
164
  }),
144
165
  fetchFn: async ()=>{
145
166
  const row = (await tx.select().from(jobExecutions).where(eq(jobExecutions.id, params.jobExecutionId)).limit(1))[0];
146
- return row ? toJobExecution(row) : undefined;
167
+ return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;
147
168
  },
148
169
  matchFn: (execution)=>execution.status === params.status && execution.statusReason === statusReason || TERMINAL_EXECUTION_STATUSES.includes(execution.status) ? {
149
170
  execution,
@@ -184,7 +205,7 @@ export async function failJobExecutionAsTimedOut(params) {
184
205
  }),
185
206
  fetchFn: async ()=>{
186
207
  const row = (await tx.select().from(jobExecutions).where(eq(jobExecutions.id, params.jobExecutionId)).limit(1))[0];
187
- return row ? toJobExecution(row) : undefined;
208
+ return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;
188
209
  },
189
210
  matchFn: (execution)=>execution.timedOutAt !== null ? {
190
211
  execution,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/job-executions.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {WORKFLOWS_JOB_EXECUTION_TIMED_OUT} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, isNull, notInArray, sql} from 'drizzle-orm';\nimport type {JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution, JobExecutionStatus} from '#core/entities/job-execution.js';\nimport {InterpolationUnresolvableError, JobNotFoundError} from '#core/errors.js';\nimport {deriveJobExecutionOutputs} from '#core/job-transition/index.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {\n recordWorkflowJobExecutionLeaseExpiryResolved,\n recordWorkflowJobExecutionQueued,\n recordWorkflowJobExecutionStarted,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowJobExecutionTimedOut,\n} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getDirectDependencyJobContexts} from './jobs.js';\nimport {loadReferencedVariables} from './runs.js';\nimport {\n getWorkflowContextForJob,\n optimisticLockRetry,\n TERMINAL_EXECUTION_STATUSES,\n} from './shared.js';\nimport {bulkUpdateStepStatuses, getStepsByJobExecutionIdForUpdate} from './steps.js';\n\nexport async function getJobExecutionById(id: string, tx?: Tx): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport async function getJobExecutionsByWorkflowRunAttemptId(\n workflowRunAttemptId: string,\n): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution));\n}\n\nexport async function getJobExecutionsByJobId(jobId: string): Promise<JobExecution[]> {\n const rows = await db()\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map(toJobExecution);\n}\n\nexport async function getFirstJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport async function getLatestJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport interface UpdateJobExecutionStatusAtVersionParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n markTimedOut?: boolean;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nasync function resolveJobExecutionOutputs(\n tx: Tx,\n params: {\n jobExecutionId: string;\n status: JobExecutionStatus;\n statusReason: JobStatusReason | null;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n },\n): Promise<Record<string, unknown> | null> {\n const [target] = await tx\n .select({execution: jobExecutions, job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1);\n if (!target) throw new JobNotFoundError(params.jobExecutionId);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n if (!model) return null;\n const modelJob = model.jobs.find((job) => job.key === target.job.key);\n if (!modelJob || modelJob.outputs === undefined) return null;\n\n const executionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, target.job.id))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n const executions = executionRows.map((row) =>\n row.id === target.execution.id\n ? toJobExecution({...row, status: params.status, statusReason: params.statusReason})\n : toJobExecution(row),\n );\n const jobExecution = executions.find((execution) => execution.id === target.execution.id);\n if (!jobExecution) throw new JobNotFoundError(params.jobExecutionId);\n\n const stepRows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(steps.position), asc(steps.id));\n const attemptRows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n const dependencyJobs = await getDirectDependencyJobContexts(target.job.id, tx);\n\n return deriveJobExecutionOutputs({\n run: toWorkflowRun(target.run),\n modelJob,\n job: toJob(target.job),\n jobExecution,\n executions,\n steps: stepRows.map(toStep),\n attempts: attemptRows.map(toStepAttempt),\n jobs: dependencyJobs,\n vars: await loadReferencedVariables({\n model,\n jobs: [modelJob],\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n definitionId: target.run.definitionId,\n secrets: params.secrets,\n }),\n });\n}\n\nasync function updateJobExecutionStatusAtVersion(\n tx: Tx,\n params: UpdateJobExecutionStatusAtVersionParams,\n): Promise<{execution: JobExecution; changed: boolean} | null> {\n let status = params.status;\n let statusReason = params.statusReason ?? null;\n let outputs: Record<string, unknown> | null | undefined;\n if (TERMINAL_EXECUTION_STATUSES.includes(status)) {\n outputs = null;\n }\n if (status === 'succeeded') {\n try {\n outputs = await resolveJobExecutionOutputs(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n statusReason,\n secrets: params.secrets,\n });\n } catch (error) {\n if (!(error instanceof InterpolationUnresolvableError)) throw error;\n status = 'failed';\n statusReason = 'unknown';\n outputs = null;\n }\n }\n\n const rows = await tx\n .update(jobExecutions)\n .set({\n status,\n statusReason,\n ...(outputs === undefined ? {} : {outputs}),\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n ...(params.markTimedOut ? {timedOutAt: new Date()} : {}),\n ...(TERMINAL_EXECUTION_STATUSES.includes(status) ? {finishedAt: sql`now()`} : {}),\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n eq(jobExecutions.version, params.expectedVersion),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n return {execution: toJobExecution(row), changed: true};\n}\n\nexport interface UpdateJobExecutionStatusParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nexport async function updateJobExecutionStatus(\n params: UpdateJobExecutionStatusParams,\n): Promise<JobExecution> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row) : undefined;\n },\n matchFn: (execution) =>\n (execution.status === params.status && execution.statusReason === statusReason) ||\n TERMINAL_EXECUTION_STATUSES.includes(execution.status)\n ? {execution, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobExecutionStatusChanged(result.execution.status);\n\n return result.execution;\n}\n\nexport async function recordJobExecutionQueuedAt(params: {\n jobExecutionId: string;\n queuedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({queuedAt: params.queuedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.queuedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionQueued();\n}\n\nexport async function recordJobExecutionStartedAt(params: {\n jobExecutionId: string;\n startedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({startedAt: params.startedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.startedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionStarted();\n}\n\nexport async function failJobExecutionAsTimedOut(params: {\n jobExecutionId: string;\n workflowRunAttemptId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<JobExecution> {\n const result = await db().transaction(async (tx) => {\n const updated = await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'timed_out',\n markTimedOut: true,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row) : undefined;\n },\n matchFn: (execution) => (execution.timedOutAt !== null ? {execution, changed: false} : null),\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n\n if (updated.changed) {\n const identity = await getWorkflowContextForJob(updated.execution.jobId, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n payload: {\n jobId: identity.jobId,\n jobExecutionId: params.jobExecutionId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n },\n });\n }\n\n return updated;\n });\n\n if (result.changed) {\n recordWorkflowJobExecutionStatusChanged(result.execution.status);\n recordWorkflowJobExecutionTimedOut();\n }\n\n return result.execution;\n}\n\nexport async function resolveJobExecutionAfterLeaseExpiry(params: {\n jobExecutionId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<{status: RuntimeCompletionStatus; executionVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobExecutionSteps = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n let changedJobExecution: JobExecution | null = null;\n\n if (jobExecutionSteps.length === 0) {\n throw new JobNotFoundError(params.jobExecutionId);\n }\n\n if (jobExecutionSteps.every((step) => isTerminal(step.status))) {\n const status = deriveCompletion(jobExecutionSteps);\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n expectedVersion: params.expectedVersion,\n statusReason: statusReasonForStepCompletion(status),\n secrets: params.secrets,\n });\n changedJobExecution = updated?.changed ? updated.execution : null;\n } else {\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'runner_lost',\n secrets: params.secrets,\n });\n if (updated?.changed) {\n changedJobExecution = updated.execution;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: 'cancelled'},\n tx,\n );\n }\n }\n\n const jobExecutionRow = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n if (!jobExecutionRow) {\n throw new Error(`Job execution not found resolving lease expiry: ${params.jobExecutionId}`);\n }\n const status: RuntimeCompletionStatus =\n jobExecutionRow.status === 'succeeded' ? 'succeeded' : 'failed';\n return {status, executionVersion: jobExecutionRow.version, changedJobExecution};\n });\n\n recordWorkflowJobExecutionLeaseExpiryResolved(result.status);\n if (result.changedJobExecution) {\n recordWorkflowJobExecutionStatusChanged(result.changedJobExecution.status);\n }\n\n return {status: result.status, executionVersion: result.executionVersion};\n}\n\nfunction statusReasonForStepCompletion(status: RuntimeCompletionStatus): JobStatusReason | null {\n return status === 'failed' ? 'step_failed' : null;\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_EXECUTION_TIMED_OUT","and","asc","desc","eq","isNull","notInArray","sql","InterpolationUnresolvableError","JobNotFoundError","deriveJobExecutionOutputs","deriveCompletion","isTerminal","recordWorkflowJobExecutionLeaseExpiryResolved","recordWorkflowJobExecutionQueued","recordWorkflowJobExecutionStarted","recordWorkflowJobExecutionStatusChanged","recordWorkflowJobExecutionTimedOut","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","stepAttempts","toStepAttempt","steps","toStep","workflowRunAttempts","toWorkflowRun","workflowRuns","getDirectDependencyJobContexts","loadReferencedVariables","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_EXECUTION_STATUSES","bulkUpdateStepStatuses","getStepsByJobExecutionIdForUpdate","getJobExecutionById","id","tx","rows","select","from","where","limit","row","undefined","getJobExecutionsByWorkflowRunAttemptId","workflowRunAttemptId","jobExecution","innerJoin","jobId","orderBy","sequence","map","getJobExecutionsByJobId","getFirstJobExecutionByJobId","getLatestJobExecutionByJobId","resolveJobExecutionOutputs","params","target","execution","job","attempt","run","workflowRunId","jobExecutionId","model","modelJob","find","key","outputs","executionRows","executions","status","statusReason","stepRows","position","attemptRows","executionOrder","dependencyJobs","attempts","vars","workspaceId","projectId","definitionId","secrets","updateJobExecutionStatusAtVersion","includes","error","update","set","version","updatedAt","Date","markTimedOut","timedOutAt","finishedAt","expectedVersion","returning","changed","updateJobExecutionStatus","result","transaction","updateFn","fetchFn","matchFn","failureMessage","recordJobExecutionQueuedAt","updated","queuedAt","length","recordJobExecutionStartedAt","startedAt","failJobExecutionAsTimedOut","identity","type","payload","resolveJobExecutionAfterLeaseExpiry","jobExecutionSteps","changedJobExecution","every","step","statusReasonForStepCompletion","jobExecutionRow","Error","executionVersion"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/job-executions.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {WORKFLOWS_JOB_EXECUTION_TIMED_OUT} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, isNull, notInArray, sql} from 'drizzle-orm';\nimport type {JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution, JobExecutionStatus} from '#core/entities/job-execution.js';\nimport {InterpolationUnresolvableError, JobNotFoundError} from '#core/errors.js';\nimport {deriveJobExecutionOutputs} from '#core/job-transition/index.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {\n recordWorkflowJobExecutionLeaseExpiryResolved,\n recordWorkflowJobExecutionQueued,\n recordWorkflowJobExecutionStarted,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowJobExecutionTimedOut,\n} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getDirectDependencyJobContexts} from './jobs.js';\nimport {loadReferencedVariables} from './runs.js';\nimport {\n getWorkflowContextForJob,\n optimisticLockRetry,\n TERMINAL_EXECUTION_STATUSES,\n} from './shared.js';\nimport {bulkUpdateStepStatuses, getStepsByJobExecutionIdForUpdate} from './steps.js';\n\nasync function getJobExecutionFallbackName(tx: Tx, jobExecutionId: string): Promise<string> {\n const [row] = await tx\n .select({job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.id, jobExecutionId))\n .limit(1);\n if (!row) throw new JobNotFoundError(jobExecutionId);\n return row.job.name ?? row.job.key;\n}\n\nexport async function getJobExecutionById(id: string, tx?: Tx): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.id, id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport async function getJobExecutionsByWorkflowRunAttemptId(\n workflowRunAttemptId: string,\n): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution, row.job.name ?? row.job.key));\n}\n\nexport async function getJobExecutionsByJobId(jobId: string): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution, row.job.name ?? row.job.key));\n}\n\nexport async function getFirstJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport async function getLatestJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport interface UpdateJobExecutionStatusAtVersionParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n markTimedOut?: boolean;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nasync function resolveJobExecutionOutputs(\n tx: Tx,\n params: {\n jobExecutionId: string;\n status: JobExecutionStatus;\n statusReason: JobStatusReason | null;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n },\n): Promise<Record<string, unknown> | null> {\n const [target] = await tx\n .select({execution: jobExecutions, job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1);\n if (!target) throw new JobNotFoundError(params.jobExecutionId);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n if (!model) return null;\n const modelJob = model.jobs.find((job) => job.key === target.job.key);\n if (!modelJob || modelJob.outputs === undefined) return null;\n\n const executionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, target.job.id))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n const fallbackName = target.job.name ?? target.job.key;\n const executions = executionRows.map((row) =>\n row.id === target.execution.id\n ? toJobExecution(\n {...row, status: params.status, statusReason: params.statusReason},\n fallbackName,\n )\n : toJobExecution(row, fallbackName),\n );\n const jobExecution = executions.find((execution) => execution.id === target.execution.id);\n if (!jobExecution) throw new JobNotFoundError(params.jobExecutionId);\n\n const stepRows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(steps.position), asc(steps.id));\n const attemptRows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n const dependencyJobs = await getDirectDependencyJobContexts(target.job.id, tx);\n\n return deriveJobExecutionOutputs({\n run: toWorkflowRun(target.run),\n modelJob,\n job: toJob(target.job),\n jobExecution,\n executions,\n steps: stepRows.map(toStep),\n attempts: attemptRows.map(toStepAttempt),\n jobs: dependencyJobs,\n vars: await loadReferencedVariables({\n model,\n jobs: [modelJob],\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n definitionId: target.run.definitionId,\n secrets: params.secrets,\n }),\n });\n}\n\nasync function updateJobExecutionStatusAtVersion(\n tx: Tx,\n params: UpdateJobExecutionStatusAtVersionParams,\n): Promise<{execution: JobExecution; changed: boolean} | null> {\n let status = params.status;\n let statusReason = params.statusReason ?? null;\n let outputs: Record<string, unknown> | null | undefined;\n if (TERMINAL_EXECUTION_STATUSES.includes(status)) {\n outputs = null;\n }\n if (status === 'succeeded') {\n try {\n outputs = await resolveJobExecutionOutputs(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n statusReason,\n secrets: params.secrets,\n });\n } catch (error) {\n if (!(error instanceof InterpolationUnresolvableError)) throw error;\n status = 'failed';\n statusReason = 'unknown';\n outputs = null;\n }\n }\n\n const rows = await tx\n .update(jobExecutions)\n .set({\n status,\n statusReason,\n ...(outputs === undefined ? {} : {outputs}),\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n ...(params.markTimedOut ? {timedOutAt: new Date()} : {}),\n ...(TERMINAL_EXECUTION_STATUSES.includes(status) ? {finishedAt: sql`now()`} : {}),\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n eq(jobExecutions.version, params.expectedVersion),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n return {\n execution: toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)),\n changed: true,\n };\n}\n\nexport interface UpdateJobExecutionStatusParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nexport async function updateJobExecutionStatus(\n params: UpdateJobExecutionStatusParams,\n): Promise<JobExecution> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;\n },\n matchFn: (execution) =>\n (execution.status === params.status && execution.statusReason === statusReason) ||\n TERMINAL_EXECUTION_STATUSES.includes(execution.status)\n ? {execution, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobExecutionStatusChanged(result.execution.status);\n\n return result.execution;\n}\n\nexport async function recordJobExecutionQueuedAt(params: {\n jobExecutionId: string;\n queuedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({queuedAt: params.queuedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.queuedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionQueued();\n}\n\nexport async function recordJobExecutionStartedAt(params: {\n jobExecutionId: string;\n startedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({startedAt: params.startedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.startedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionStarted();\n}\n\nexport async function failJobExecutionAsTimedOut(params: {\n jobExecutionId: string;\n workflowRunAttemptId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<JobExecution> {\n const result = await db().transaction(async (tx) => {\n const updated = await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'timed_out',\n markTimedOut: true,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;\n },\n matchFn: (execution) => (execution.timedOutAt !== null ? {execution, changed: false} : null),\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n\n if (updated.changed) {\n const identity = await getWorkflowContextForJob(updated.execution.jobId, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n payload: {\n jobId: identity.jobId,\n jobExecutionId: params.jobExecutionId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n },\n });\n }\n\n return updated;\n });\n\n if (result.changed) {\n recordWorkflowJobExecutionStatusChanged(result.execution.status);\n recordWorkflowJobExecutionTimedOut();\n }\n\n return result.execution;\n}\n\nexport async function resolveJobExecutionAfterLeaseExpiry(params: {\n jobExecutionId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<{status: RuntimeCompletionStatus; executionVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobExecutionSteps = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n let changedJobExecution: JobExecution | null = null;\n\n if (jobExecutionSteps.length === 0) {\n throw new JobNotFoundError(params.jobExecutionId);\n }\n\n if (jobExecutionSteps.every((step) => isTerminal(step.status))) {\n const status = deriveCompletion(jobExecutionSteps);\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n expectedVersion: params.expectedVersion,\n statusReason: statusReasonForStepCompletion(status),\n secrets: params.secrets,\n });\n changedJobExecution = updated?.changed ? updated.execution : null;\n } else {\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'runner_lost',\n secrets: params.secrets,\n });\n if (updated?.changed) {\n changedJobExecution = updated.execution;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: 'cancelled'},\n tx,\n );\n }\n }\n\n const jobExecutionRow = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n if (!jobExecutionRow) {\n throw new Error(`Job execution not found resolving lease expiry: ${params.jobExecutionId}`);\n }\n const status: RuntimeCompletionStatus =\n jobExecutionRow.status === 'succeeded' ? 'succeeded' : 'failed';\n return {status, executionVersion: jobExecutionRow.version, changedJobExecution};\n });\n\n recordWorkflowJobExecutionLeaseExpiryResolved(result.status);\n if (result.changedJobExecution) {\n recordWorkflowJobExecutionStatusChanged(result.changedJobExecution.status);\n }\n\n return {status: result.status, executionVersion: result.executionVersion};\n}\n\nfunction statusReasonForStepCompletion(status: RuntimeCompletionStatus): JobStatusReason | null {\n return status === 'failed' ? 'step_failed' : null;\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_EXECUTION_TIMED_OUT","and","asc","desc","eq","isNull","notInArray","sql","InterpolationUnresolvableError","JobNotFoundError","deriveJobExecutionOutputs","deriveCompletion","isTerminal","recordWorkflowJobExecutionLeaseExpiryResolved","recordWorkflowJobExecutionQueued","recordWorkflowJobExecutionStarted","recordWorkflowJobExecutionStatusChanged","recordWorkflowJobExecutionTimedOut","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","stepAttempts","toStepAttempt","steps","toStep","workflowRunAttempts","toWorkflowRun","workflowRuns","getDirectDependencyJobContexts","loadReferencedVariables","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_EXECUTION_STATUSES","bulkUpdateStepStatuses","getStepsByJobExecutionIdForUpdate","getJobExecutionFallbackName","tx","jobExecutionId","row","select","job","from","innerJoin","jobId","id","where","limit","name","key","getJobExecutionById","rows","jobExecution","undefined","getJobExecutionsByWorkflowRunAttemptId","workflowRunAttemptId","orderBy","sequence","map","getJobExecutionsByJobId","getFirstJobExecutionByJobId","getLatestJobExecutionByJobId","resolveJobExecutionOutputs","params","target","execution","attempt","run","workflowRunId","model","modelJob","find","outputs","executionRows","fallbackName","executions","status","statusReason","stepRows","position","attemptRows","executionOrder","dependencyJobs","attempts","vars","workspaceId","projectId","definitionId","secrets","updateJobExecutionStatusAtVersion","includes","error","update","set","version","updatedAt","Date","markTimedOut","timedOutAt","finishedAt","expectedVersion","returning","changed","updateJobExecutionStatus","result","transaction","updateFn","fetchFn","matchFn","failureMessage","recordJobExecutionQueuedAt","updated","queuedAt","length","recordJobExecutionStartedAt","startedAt","failJobExecutionAsTimedOut","identity","type","payload","resolveJobExecutionAfterLeaseExpiry","jobExecutionSteps","changedJobExecution","every","step","statusReasonForStepCompletion","jobExecutionRow","Error","executionVersion"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type Job, type JobStatus, type JobStatusReason } from '#core/entities/job.js';
2
2
  import type { PersistedEvaluationTraceEntry } from '#core/entities/step.js';
3
+ import type { WorkflowRunTriggerReference } from '#core/entities/workflow-run.js';
3
4
  import { type DeriveJobSuccessResult, deriveJobSuccess } from '#core/job-transition/index.js';
4
5
  import type { JobContextInput } from '#core/step-config/assemble-run-context.js';
5
6
  import type { RuntimeCompletionStatus } from '#core/workflow-scheduling/runtime-dag.js';
@@ -10,6 +11,7 @@ export declare function getJobById(id: string): Promise<Job | undefined>;
10
11
  export interface JobScope {
11
12
  workspaceId: string;
12
13
  projectId: string;
14
+ triggerReference: WorkflowRunTriggerReference | null;
13
15
  }
14
16
  export declare function getJobScope(jobId: string): Promise<JobScope | undefined>;
15
17
  export declare function getDirectDependencyJobContexts(jobId: string, tx?: Tx): Promise<JobContextInput[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/jobs.ts"],"names":[],"mappings":"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"}
@@ -32,7 +32,8 @@ export async function getJobById(id) {
32
32
  export async function getJobScope(jobId) {
33
33
  const rows = await db().select({
34
34
  workspaceId: workflowRuns.workspaceId,
35
- projectId: workflowRuns.projectId
35
+ projectId: workflowRuns.projectId,
36
+ triggerReference: workflowRuns.triggerReference
36
37
  }).from(jobs).innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id)).innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id)).where(eq(jobs.id, jobId)).limit(1);
37
38
  return rows[0];
38
39
  }
@@ -54,7 +55,7 @@ export async function getDirectDependencyJobContexts(jobId, tx) {
54
55
  };
55
56
  contextsByJobId.set(row.job.id, context);
56
57
  }
57
- if (row.execution) context.executions.push(toJobExecution(row.execution));
58
+ if (row.execution) context.executions.push(toJobExecution(row.execution, row.job.name ?? row.job.key));
58
59
  }
59
60
  return [
60
61
  ...contextsByJobId.values()
@@ -94,6 +95,7 @@ export async function evaluateJobActivations(params) {
94
95
  run: toWorkflowRun(target.run),
95
96
  job,
96
97
  condition: modelJob?.if,
98
+ vars: target.attempt.vars ?? undefined,
97
99
  dependencies: job.dependencies.flatMap((key)=>{
98
100
  const dependency = contextsByJobKey.get(key);
99
101
  return dependency === undefined ? [] : [
@@ -166,7 +168,7 @@ async function directDependencyContextsByJobKey(tx, runAttemptId, targetJobs) {
166
168
  };
167
169
  contextsByJobKey.set(row.job.key, context);
168
170
  }
169
- if (row.execution) context.executions.push(toJobExecution(row.execution));
171
+ if (row.execution) context.executions.push(toJobExecution(row.execution, row.job.name ?? row.job.key));
170
172
  }
171
173
  return contextsByJobKey;
172
174
  }
@@ -252,13 +254,15 @@ export async function resolveJobStatusFromJobExecutions(params) {
252
254
  const jobRow = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];
253
255
  if (!jobRow) throw new JobNotFoundError(params.jobId);
254
256
  const jobExecutionRows = await tx.select().from(jobExecutions).where(eq(jobExecutions.jobId, params.jobId)).orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));
257
+ const workflowContext = await getWorkflowContextForJob(params.jobId, tx);
255
258
  if (jobExecutionRows.length === 0) {
256
259
  throw new Error(`Cannot resolve job ${params.jobId}: no job executions found`);
257
260
  }
258
261
  const { status, statusReason, trace } = evaluateJobSuccess({
259
262
  success: jobRow.success,
260
- executions: jobExecutionRows.map(toJobExecution),
261
- jobs: await getDirectDependencyJobContexts(params.jobId, tx)
263
+ executions: jobExecutionRows.map((execution)=>toJobExecution(execution, jobRow.name ?? jobRow.key)),
264
+ jobs: await getDirectDependencyJobContexts(params.jobId, tx),
265
+ vars: workflowContext.vars ?? undefined
262
266
  });
263
267
  return optimisticLockRetry({
264
268
  updateFn: ()=>updateJobStatusAtVersion(tx, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/jobs.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport {WORKFLOWS_JOB_TERMINATED} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, inArray, notInArray, sql} from 'drizzle-orm';\nimport {isJobTerminal, type Job, type JobStatus, type JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution} from '#core/entities/job-execution.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport {JobNotFoundError} from '#core/errors.js';\nimport {\n type DeriveJobSuccessResult,\n decideJobActivation,\n deriveJobSuccess,\n runtimeCompletionStatusForJob,\n} from '#core/job-transition/index.js';\nimport type {JobContextInput} from '#core/step-config/assemble-run-context.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {recordWorkflowJobStatusChanged} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getWorkflowRunById} from './queries.js';\nimport {getWorkflowContextForJob, optimisticLockRetry, TERMINAL_JOB_STATUSES} from './shared.js';\n\nexport async function getJobsByWorkflowRunAttemptId(workflowRunAttemptId: string): Promise<Job[]> {\n const rows = await db()\n .select()\n .from(jobs)\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobs.position));\n return rows.map(toJob);\n}\n\nexport async function getJobsByWorkflowRunId(workflowRunId: string): Promise<Job[]> {\n const run = await getWorkflowRunById(workflowRunId);\n if (!run) return [];\n const [attempt] = await db()\n .select()\n .from(workflowRunAttempts)\n .where(\n and(\n eq(workflowRunAttempts.workflowRunId, run.id),\n eq(workflowRunAttempts.attempt, run.currentAttempt),\n ),\n )\n .limit(1);\n return attempt ? getJobsByWorkflowRunAttemptId(attempt.id) : [];\n}\n\nexport async function getJobById(id: string): Promise<Job | undefined> {\n const rows = await db().select().from(jobs).where(eq(jobs.id, id)).limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toJob(row);\n}\n\nexport interface JobScope {\n workspaceId: string;\n projectId: string;\n}\n\nexport async function getJobScope(jobId: string): Promise<JobScope | undefined> {\n const rows = await db()\n .select({workspaceId: workflowRuns.workspaceId, projectId: workflowRuns.projectId})\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 return rows[0];\n}\n\nexport async function getDirectDependencyJobContexts(\n jobId: string,\n tx?: Tx,\n): Promise<JobContextInput[]> {\n const targetRows = await (tx ?? db()).select().from(jobs).where(eq(jobs.id, jobId)).limit(1);\n const target = targetRows[0];\n if (!target || target.dependencies.length === 0) return [];\n\n const rows = await (tx ?? db())\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(\n and(\n eq(jobs.workflowRunAttemptId, target.workflowRunAttemptId),\n inArray(jobs.key, target.dependencies),\n ),\n )\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobId = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobId.get(row.job.id);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobId.set(row.job.id, context);\n }\n if (row.execution) context.executions.push(toJobExecution(row.execution));\n }\n\n return [...contextsByJobId.values()];\n}\n\nexport interface EvaluateJobActivationsParams {\n runAttemptId: string;\n jobs: readonly {\n jobId: string;\n expectedVersion: number;\n }[];\n}\n\nexport type JobActivationDecision =\n | {\n kind: 'start-job';\n jobId: string;\n }\n | {\n kind: 'terminal-job';\n jobId: string;\n status: RuntimeCompletionStatus;\n jobVersion: number;\n };\n\ntype InternalJobActivationDecision = JobActivationDecision & {changed?: boolean};\n\nexport async function evaluateJobActivations(\n params: EvaluateJobActivationsParams,\n): Promise<JobActivationDecision[]> {\n if (params.jobs.length === 0) return [];\n\n const result = await db().transaction(async (tx) => {\n const expectedVersions = new Map(\n params.jobs.map((job) => [job.jobId, job.expectedVersion] as const),\n );\n const jobIds = params.jobs.map((job) => job.jobId);\n const targets = await tx\n .select({job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(and(eq(jobs.workflowRunAttemptId, params.runAttemptId), inArray(jobs.id, jobIds)))\n .for('update');\n\n if (targets.length !== jobIds.length) {\n const found = new Set(targets.map((target) => target.job.id));\n const missing = jobIds.filter((jobId) => !found.has(jobId));\n throw new Error(`Cannot evaluate missing activation jobs: ${missing.join(', ')}`);\n }\n\n const contextsByJobKey = await directDependencyContextsByJobKey(\n tx,\n params.runAttemptId,\n targets.map((target) => toJob(target.job)),\n );\n const targetsByJobId = new Map(targets.map((target) => [target.job.id, target]));\n const decisions: InternalJobActivationDecision[] = [];\n\n for (const input of params.jobs) {\n const target = targetsByJobId.get(input.jobId);\n if (!target) throw new Error(`Cannot evaluate missing activation job: ${input.jobId}`);\n const job = toJob(target.job);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n const modelJob = model?.jobs.find((item) => item.key === target.job.key);\n const decision = decideJobActivation({\n run: toWorkflowRun(target.run),\n job,\n condition: modelJob?.if,\n dependencies: job.dependencies.flatMap((key) => {\n const dependency = contextsByJobKey.get(key);\n return dependency === undefined ? [] : [dependency];\n }),\n });\n\n if (decision.kind === 'terminal-job' || decision.kind === 'start-job') {\n decisions.push(decision);\n continue;\n }\n\n const expectedVersion = expectedVersions.get(job.id);\n if (expectedVersion === undefined) {\n throw new Error(`Missing expected version for activation job ${job.id}`);\n }\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: job.id,\n status: decision.status,\n expectedVersion,\n statusReason: decision.statusReason,\n evaluationTrace: decision.evaluationTrace,\n });\n if (updated) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: 'skipped',\n jobVersion: updated.job.version,\n changed: updated.changed,\n });\n continue;\n }\n\n const [existing] = await tx.select().from(jobs).where(eq(jobs.id, job.id)).limit(1);\n if (existing && isJobTerminal(existing.status)) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: runtimeCompletionStatusForJob(existing.status),\n jobVersion: existing.version,\n });\n continue;\n }\n throw new Error(`Optimistic lock failure evaluating activation for job ${job.id}`);\n }\n\n return decisions;\n });\n\n for (const decision of result) {\n if (decision.kind === 'terminal-job' && decision.changed) {\n recordWorkflowJobStatusChanged(decision.status);\n }\n }\n\n return result.map(({changed: _changed, ...decision}) => decision);\n}\n\nasync function directDependencyContextsByJobKey(\n tx: Tx,\n runAttemptId: string,\n targetJobs: readonly Job[],\n): Promise<ReadonlyMap<string, JobContextInput>> {\n const dependencyKeys = new Set(targetJobs.flatMap((job) => job.dependencies));\n if (dependencyKeys.size === 0) return new Map();\n\n const rows = await tx\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(and(eq(jobs.workflowRunAttemptId, runAttemptId), inArray(jobs.key, [...dependencyKeys])))\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobKey = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobKey.get(row.job.key);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobKey.set(row.job.key, context);\n }\n if (row.execution) context.executions.push(toJobExecution(row.execution));\n }\n\n return contextsByJobKey;\n}\n\nexport interface UpdateJobStatusAtVersionParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\n// Returns null on version mismatch so callers can choose throw vs treat-as-success.\nexport async function updateJobStatusAtVersion(\n tx: Tx,\n params: UpdateJobStatusAtVersionParams,\n): Promise<{job: Job; changed: boolean} | null> {\n const outputs = isJobTerminal(params.status)\n ? await reduceJobOutputs(tx, {jobId: params.jobId, status: params.status})\n : undefined;\n const rows = await tx\n .update(jobs)\n .set({\n status: params.status,\n statusReason: params.statusReason ?? null,\n ...(outputs === undefined ? {} : {outputs}),\n ...(params.evaluationTrace === undefined ? {} : {evaluationTrace: params.evaluationTrace}),\n version: sql`${jobs.version} + 1`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(jobs.id, params.jobId),\n eq(jobs.version, params.expectedVersion),\n notInArray(jobs.status, TERMINAL_JOB_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n const job = toJob(row);\n\n // Every terminal job-status write funnels through this one guarded UPDATE, where the\n // version match lets a single caller win. Emitting here, in the same transaction,\n // makes the terminal fact fire exactly once across all paths.\n if (isJobTerminal(job.status)) {\n const identity = await getWorkflowContextForJob(job.id, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_TERMINATED,\n payload: {\n jobId: job.id,\n workflowRunId: identity.workflowRunId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n status: job.status,\n statusReason: job.statusReason,\n },\n });\n }\n\n return {job, changed: true};\n}\n\nasync function reduceJobOutputs(\n tx: Tx,\n params: {jobId: string; status: JobStatus},\n): Promise<Record<string, unknown> | null> {\n if (params.status !== 'succeeded') return null;\n\n const [row] = await tx\n .select({outputs: jobExecutions.outputs})\n .from(jobExecutions)\n .where(and(eq(jobExecutions.jobId, params.jobId), eq(jobExecutions.status, 'succeeded')))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n\n return row?.outputs ? {...row.outputs} : null;\n}\n\nexport interface UpdateJobStatusParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\nexport async function updateJobStatus(params: UpdateJobStatusParams): Promise<Job> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n evaluationTrace: params.evaluationTrace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n return row ? toJob(row) : undefined;\n },\n matchFn: (job) =>\n (job.status === params.status && job.statusReason === statusReason) ||\n isJobTerminal(job.status)\n ? {job, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n\n return result.job;\n}\n\nexport type EvaluateJobSuccessResult = DeriveJobSuccessResult;\nexport const evaluateJobSuccess = deriveJobSuccess;\n\nexport async function resolveJobStatusFromJobExecutions(params: {\n jobId: string;\n}): Promise<{status: RuntimeCompletionStatus; jobVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobRow = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!jobRow) throw new JobNotFoundError(params.jobId);\n\n const jobExecutionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, params.jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n if (jobExecutionRows.length === 0) {\n throw new Error(`Cannot resolve job ${params.jobId}: no job executions found`);\n }\n\n const {status, statusReason, trace} = evaluateJobSuccess({\n success: jobRow.success,\n executions: jobExecutionRows.map(toJobExecution),\n jobs: await getDirectDependencyJobContexts(params.jobId, tx),\n });\n\n return optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status,\n expectedVersion: jobRow.version,\n statusReason,\n evaluationTrace: trace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!row) throw new JobNotFoundError(params.jobId);\n return toJob(row);\n },\n matchFn: (job) => ({job, changed: false}),\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${jobRow.version}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n return {\n status: result.job.status === 'succeeded' ? 'succeeded' : 'failed',\n jobVersion: result.job.version,\n };\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_TERMINATED","and","asc","desc","eq","inArray","notInArray","sql","isJobTerminal","JobNotFoundError","decideJobActivation","deriveJobSuccess","runtimeCompletionStatusForJob","recordWorkflowJobStatusChanged","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","workflowRunAttempts","toWorkflowRun","workflowRuns","getWorkflowRunById","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_JOB_STATUSES","getJobsByWorkflowRunAttemptId","workflowRunAttemptId","rows","select","from","where","orderBy","position","map","getJobsByWorkflowRunId","workflowRunId","run","attempt","id","currentAttempt","limit","getJobById","row","undefined","getJobScope","jobId","workspaceId","projectId","innerJoin","getDirectDependencyJobContexts","tx","targetRows","target","dependencies","length","job","execution","leftJoin","key","sequence","contextsByJobId","Map","context","get","executions","set","push","values","evaluateJobActivations","params","result","transaction","expectedVersions","expectedVersion","jobIds","targets","runAttemptId","for","found","Set","missing","filter","has","Error","join","contextsByJobKey","directDependencyContextsByJobKey","targetsByJobId","decisions","input","model","modelJob","find","item","decision","condition","if","flatMap","dependency","kind","updated","updateJobStatusAtVersion","status","statusReason","evaluationTrace","jobVersion","version","changed","existing","_changed","targetJobs","dependencyKeys","size","outputs","reduceJobOutputs","update","updatedAt","Date","returning","identity","type","payload","updateJobStatus","updateFn","fetchFn","matchFn","failureMessage","evaluateJobSuccess","resolveJobStatusFromJobExecutions","jobRow","jobExecutionRows","trace","success"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/jobs.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport {WORKFLOWS_JOB_TERMINATED} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, inArray, notInArray, sql} from 'drizzle-orm';\nimport {isJobTerminal, type Job, type JobStatus, type JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution} from '#core/entities/job-execution.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport type {WorkflowRunTriggerReference} from '#core/entities/workflow-run.js';\nimport {JobNotFoundError} from '#core/errors.js';\nimport {\n type DeriveJobSuccessResult,\n decideJobActivation,\n deriveJobSuccess,\n runtimeCompletionStatusForJob,\n} from '#core/job-transition/index.js';\nimport type {JobContextInput} from '#core/step-config/assemble-run-context.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {recordWorkflowJobStatusChanged} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getWorkflowRunById} from './queries.js';\nimport {getWorkflowContextForJob, optimisticLockRetry, TERMINAL_JOB_STATUSES} from './shared.js';\n\nexport async function getJobsByWorkflowRunAttemptId(workflowRunAttemptId: string): Promise<Job[]> {\n const rows = await db()\n .select()\n .from(jobs)\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobs.position));\n return rows.map(toJob);\n}\n\nexport async function getJobsByWorkflowRunId(workflowRunId: string): Promise<Job[]> {\n const run = await getWorkflowRunById(workflowRunId);\n if (!run) return [];\n const [attempt] = await db()\n .select()\n .from(workflowRunAttempts)\n .where(\n and(\n eq(workflowRunAttempts.workflowRunId, run.id),\n eq(workflowRunAttempts.attempt, run.currentAttempt),\n ),\n )\n .limit(1);\n return attempt ? getJobsByWorkflowRunAttemptId(attempt.id) : [];\n}\n\nexport async function getJobById(id: string): Promise<Job | undefined> {\n const rows = await db().select().from(jobs).where(eq(jobs.id, id)).limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toJob(row);\n}\n\nexport interface JobScope {\n workspaceId: string;\n projectId: string;\n triggerReference: WorkflowRunTriggerReference | null;\n}\n\nexport async function getJobScope(jobId: string): Promise<JobScope | undefined> {\n const rows = await db()\n .select({\n workspaceId: workflowRuns.workspaceId,\n projectId: workflowRuns.projectId,\n triggerReference: workflowRuns.triggerReference,\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 return rows[0];\n}\n\nexport async function getDirectDependencyJobContexts(\n jobId: string,\n tx?: Tx,\n): Promise<JobContextInput[]> {\n const targetRows = await (tx ?? db()).select().from(jobs).where(eq(jobs.id, jobId)).limit(1);\n const target = targetRows[0];\n if (!target || target.dependencies.length === 0) return [];\n\n const rows = await (tx ?? db())\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(\n and(\n eq(jobs.workflowRunAttemptId, target.workflowRunAttemptId),\n inArray(jobs.key, target.dependencies),\n ),\n )\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobId = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobId.get(row.job.id);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobId.set(row.job.id, context);\n }\n if (row.execution)\n context.executions.push(toJobExecution(row.execution, row.job.name ?? row.job.key));\n }\n\n return [...contextsByJobId.values()];\n}\n\nexport interface EvaluateJobActivationsParams {\n runAttemptId: string;\n jobs: readonly {\n jobId: string;\n expectedVersion: number;\n }[];\n}\n\nexport type JobActivationDecision =\n | {\n kind: 'start-job';\n jobId: string;\n }\n | {\n kind: 'terminal-job';\n jobId: string;\n status: RuntimeCompletionStatus;\n jobVersion: number;\n };\n\ntype InternalJobActivationDecision = JobActivationDecision & {changed?: boolean};\n\nexport async function evaluateJobActivations(\n params: EvaluateJobActivationsParams,\n): Promise<JobActivationDecision[]> {\n if (params.jobs.length === 0) return [];\n\n const result = await db().transaction(async (tx) => {\n const expectedVersions = new Map(\n params.jobs.map((job) => [job.jobId, job.expectedVersion] as const),\n );\n const jobIds = params.jobs.map((job) => job.jobId);\n const targets = await tx\n .select({job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(and(eq(jobs.workflowRunAttemptId, params.runAttemptId), inArray(jobs.id, jobIds)))\n .for('update');\n\n if (targets.length !== jobIds.length) {\n const found = new Set(targets.map((target) => target.job.id));\n const missing = jobIds.filter((jobId) => !found.has(jobId));\n throw new Error(`Cannot evaluate missing activation jobs: ${missing.join(', ')}`);\n }\n\n const contextsByJobKey = await directDependencyContextsByJobKey(\n tx,\n params.runAttemptId,\n targets.map((target) => toJob(target.job)),\n );\n const targetsByJobId = new Map(targets.map((target) => [target.job.id, target]));\n const decisions: InternalJobActivationDecision[] = [];\n\n for (const input of params.jobs) {\n const target = targetsByJobId.get(input.jobId);\n if (!target) throw new Error(`Cannot evaluate missing activation job: ${input.jobId}`);\n const job = toJob(target.job);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n const modelJob = model?.jobs.find((item) => item.key === target.job.key);\n const decision = decideJobActivation({\n run: toWorkflowRun(target.run),\n job,\n condition: modelJob?.if,\n vars: target.attempt.vars ?? undefined,\n dependencies: job.dependencies.flatMap((key) => {\n const dependency = contextsByJobKey.get(key);\n return dependency === undefined ? [] : [dependency];\n }),\n });\n\n if (decision.kind === 'terminal-job' || decision.kind === 'start-job') {\n decisions.push(decision);\n continue;\n }\n\n const expectedVersion = expectedVersions.get(job.id);\n if (expectedVersion === undefined) {\n throw new Error(`Missing expected version for activation job ${job.id}`);\n }\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: job.id,\n status: decision.status,\n expectedVersion,\n statusReason: decision.statusReason,\n evaluationTrace: decision.evaluationTrace,\n });\n if (updated) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: 'skipped',\n jobVersion: updated.job.version,\n changed: updated.changed,\n });\n continue;\n }\n\n const [existing] = await tx.select().from(jobs).where(eq(jobs.id, job.id)).limit(1);\n if (existing && isJobTerminal(existing.status)) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: runtimeCompletionStatusForJob(existing.status),\n jobVersion: existing.version,\n });\n continue;\n }\n throw new Error(`Optimistic lock failure evaluating activation for job ${job.id}`);\n }\n\n return decisions;\n });\n\n for (const decision of result) {\n if (decision.kind === 'terminal-job' && decision.changed) {\n recordWorkflowJobStatusChanged(decision.status);\n }\n }\n\n return result.map(({changed: _changed, ...decision}) => decision);\n}\n\nasync function directDependencyContextsByJobKey(\n tx: Tx,\n runAttemptId: string,\n targetJobs: readonly Job[],\n): Promise<ReadonlyMap<string, JobContextInput>> {\n const dependencyKeys = new Set(targetJobs.flatMap((job) => job.dependencies));\n if (dependencyKeys.size === 0) return new Map();\n\n const rows = await tx\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(and(eq(jobs.workflowRunAttemptId, runAttemptId), inArray(jobs.key, [...dependencyKeys])))\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobKey = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobKey.get(row.job.key);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobKey.set(row.job.key, context);\n }\n if (row.execution)\n context.executions.push(toJobExecution(row.execution, row.job.name ?? row.job.key));\n }\n\n return contextsByJobKey;\n}\n\nexport interface UpdateJobStatusAtVersionParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\n// Returns null on version mismatch so callers can choose throw vs treat-as-success.\nexport async function updateJobStatusAtVersion(\n tx: Tx,\n params: UpdateJobStatusAtVersionParams,\n): Promise<{job: Job; changed: boolean} | null> {\n const outputs = isJobTerminal(params.status)\n ? await reduceJobOutputs(tx, {jobId: params.jobId, status: params.status})\n : undefined;\n const rows = await tx\n .update(jobs)\n .set({\n status: params.status,\n statusReason: params.statusReason ?? null,\n ...(outputs === undefined ? {} : {outputs}),\n ...(params.evaluationTrace === undefined ? {} : {evaluationTrace: params.evaluationTrace}),\n version: sql`${jobs.version} + 1`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(jobs.id, params.jobId),\n eq(jobs.version, params.expectedVersion),\n notInArray(jobs.status, TERMINAL_JOB_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n const job = toJob(row);\n\n // Every terminal job-status write funnels through this one guarded UPDATE, where the\n // version match lets a single caller win. Emitting here, in the same transaction,\n // makes the terminal fact fire exactly once across all paths.\n if (isJobTerminal(job.status)) {\n const identity = await getWorkflowContextForJob(job.id, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_TERMINATED,\n payload: {\n jobId: job.id,\n workflowRunId: identity.workflowRunId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n status: job.status,\n statusReason: job.statusReason,\n },\n });\n }\n\n return {job, changed: true};\n}\n\nasync function reduceJobOutputs(\n tx: Tx,\n params: {jobId: string; status: JobStatus},\n): Promise<Record<string, unknown> | null> {\n if (params.status !== 'succeeded') return null;\n\n const [row] = await tx\n .select({outputs: jobExecutions.outputs})\n .from(jobExecutions)\n .where(and(eq(jobExecutions.jobId, params.jobId), eq(jobExecutions.status, 'succeeded')))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n\n return row?.outputs ? {...row.outputs} : null;\n}\n\nexport interface UpdateJobStatusParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\nexport async function updateJobStatus(params: UpdateJobStatusParams): Promise<Job> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n evaluationTrace: params.evaluationTrace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n return row ? toJob(row) : undefined;\n },\n matchFn: (job) =>\n (job.status === params.status && job.statusReason === statusReason) ||\n isJobTerminal(job.status)\n ? {job, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n\n return result.job;\n}\n\nexport type EvaluateJobSuccessResult = DeriveJobSuccessResult;\nexport const evaluateJobSuccess = deriveJobSuccess;\n\nexport async function resolveJobStatusFromJobExecutions(params: {\n jobId: string;\n}): Promise<{status: RuntimeCompletionStatus; jobVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobRow = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!jobRow) throw new JobNotFoundError(params.jobId);\n\n const jobExecutionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, params.jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n const workflowContext = await getWorkflowContextForJob(params.jobId, tx);\n\n if (jobExecutionRows.length === 0) {\n throw new Error(`Cannot resolve job ${params.jobId}: no job executions found`);\n }\n\n const {status, statusReason, trace} = evaluateJobSuccess({\n success: jobRow.success,\n executions: jobExecutionRows.map((execution) =>\n toJobExecution(execution, jobRow.name ?? jobRow.key),\n ),\n jobs: await getDirectDependencyJobContexts(params.jobId, tx),\n vars: workflowContext.vars ?? undefined,\n });\n\n return optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status,\n expectedVersion: jobRow.version,\n statusReason,\n evaluationTrace: trace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!row) throw new JobNotFoundError(params.jobId);\n return toJob(row);\n },\n matchFn: (job) => ({job, changed: false}),\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${jobRow.version}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n return {\n status: result.job.status === 'succeeded' ? 'succeeded' : 'failed',\n jobVersion: result.job.version,\n };\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_TERMINATED","and","asc","desc","eq","inArray","notInArray","sql","isJobTerminal","JobNotFoundError","decideJobActivation","deriveJobSuccess","runtimeCompletionStatusForJob","recordWorkflowJobStatusChanged","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","workflowRunAttempts","toWorkflowRun","workflowRuns","getWorkflowRunById","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_JOB_STATUSES","getJobsByWorkflowRunAttemptId","workflowRunAttemptId","rows","select","from","where","orderBy","position","map","getJobsByWorkflowRunId","workflowRunId","run","attempt","id","currentAttempt","limit","getJobById","row","undefined","getJobScope","jobId","workspaceId","projectId","triggerReference","innerJoin","getDirectDependencyJobContexts","tx","targetRows","target","dependencies","length","job","execution","leftJoin","key","sequence","contextsByJobId","Map","context","get","executions","set","push","name","values","evaluateJobActivations","params","result","transaction","expectedVersions","expectedVersion","jobIds","targets","runAttemptId","for","found","Set","missing","filter","has","Error","join","contextsByJobKey","directDependencyContextsByJobKey","targetsByJobId","decisions","input","model","modelJob","find","item","decision","condition","if","vars","flatMap","dependency","kind","updated","updateJobStatusAtVersion","status","statusReason","evaluationTrace","jobVersion","version","changed","existing","_changed","targetJobs","dependencyKeys","size","outputs","reduceJobOutputs","update","updatedAt","Date","returning","identity","type","payload","updateJobStatus","updateFn","fetchFn","matchFn","failureMessage","evaluateJobSuccess","resolveJobStatusFromJobExecutions","jobRow","jobExecutionRows","workflowContext","trace","success"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type TimestampIdCursor } from '@shipfox/node-drizzle';
2
2
  import { type SQL } from 'drizzle-orm';
3
+ import type { JobStatus } from '#core/entities/job.js';
3
4
  import type { JobExecutionDetail, WorkflowRun, WorkflowRunDetail, WorkflowRunStatus } from '#core/entities/workflow-run.js';
4
5
  export type WorkflowRunCursor = TimestampIdCursor;
5
6
  export interface WorkflowRunFilters {
@@ -21,6 +22,14 @@ export interface ListWorkflowRunsResult {
21
22
  nextCursor: WorkflowRunCursor | null;
22
23
  filteredTotalCount: number | null;
23
24
  }
25
+ /** A run-list job glyph: enough to draw and label it, none of its steps. */
26
+ export interface WorkflowRunJobSummary {
27
+ id: string;
28
+ key: string;
29
+ name: string | null;
30
+ status: JobStatus;
31
+ position: number;
32
+ }
24
33
  export interface WorkflowRunAggregates {
25
34
  status: Array<{
26
35
  value: WorkflowRunStatus;
@@ -60,6 +69,48 @@ export declare function buildWorkflowRunListConditions(params: {
60
69
  omit?: 'status' | 'definitionId' | 'triggerSource' | undefined;
61
70
  }): SQL[];
62
71
  export declare function listWorkflowRuns(params: ListWorkflowRunsParams): Promise<ListWorkflowRunsResult>;
72
+ /** The run whose jobs to fetch, pinned to the attempt the caller already read. */
73
+ export interface WorkflowRunJobSummaryTarget {
74
+ id: string;
75
+ currentAttempt: number;
76
+ }
77
+ /**
78
+ * A page row's jobs: a bounded slice to draw, and totals describing all of them.
79
+ *
80
+ * The preview is what a row can show; `statusCounts` is what it can say. Keeping the counts
81
+ * server-side is what lets a row report a failure that sits past the preview.
82
+ */
83
+ export interface WorkflowRunJobsSummary {
84
+ preview: WorkflowRunJobSummary[];
85
+ statusCounts: WorkflowRunJobStatusCount[];
86
+ }
87
+ export interface WorkflowRunJobStatusCount {
88
+ status: JobStatus;
89
+ count: number;
90
+ }
91
+ /**
92
+ * Jobs for a page of runs, keyed by run id.
93
+ *
94
+ * Issued once per page rather than once per run: the run list is the one surface that needs
95
+ * every run's jobs at once, and a per-row query would put 50 round trips behind it.
96
+ *
97
+ * Both reads are bounded by the page, not by workflow size. A workflow has no job limit and
98
+ * this list polls while runs are active, so returning every job of every row would let one
99
+ * large workflow decide how much the endpoint moves every four seconds. The preview is cut
100
+ * per run in the database, and everything past it is described by a grouped count instead.
101
+ *
102
+ * The attempt comes from the caller's own read rather than from a second look at
103
+ * `current_attempt`. Re-reading it here would let a re-run landing between the queries pair
104
+ * attempt 1's run metadata with attempt 2's jobs, and the row would report a status its strip
105
+ * contradicts.
106
+ *
107
+ * The two reads share one repeatable-read snapshot. They describe the same jobs at the same
108
+ * instant, and the strip combines them into a single glyph row, so under the default
109
+ * read-committed isolation a job settling between the statements would draw a pending glyph
110
+ * beside a summary counting it as failed. Sequential inside one transaction is the cost of
111
+ * that; at a four-second poll the extra round trip does not register.
112
+ */
113
+ export declare function listWorkflowRunJobSummaries(runs: readonly WorkflowRunJobSummaryTarget[]): Promise<Map<string, WorkflowRunJobsSummary>>;
63
114
  export declare function listWorkflowRunsByProject(projectId: string): Promise<WorkflowRun[]>;
64
115
  export declare function getWorkflowRunAggregates(params: {
65
116
  projectId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAsC,KAAK,GAAG,EAAM,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EACV,kBAAkB,EAGlB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,gCAAgC,CAAC;AASxC,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACzD,aAAa,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACrD,QAAQ,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAKrF;AAED,wBAAsB,yBAAyB,CAC7C,oBAAoB,EAAE,MAAM,GAC3B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CASlC;AAED,wBAAsB,yBAAyB,CAAC,oBAAoB,EAAE,MAAM,iGAQ3E;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,uFAgBvF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAclB;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACzC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvC,IAAI,CAAC,EAAE,QAAQ,GAAG,cAAc,GAAG,eAAe,GAAG,SAAS,CAAC;CAChE,GAAG,GAAG,EAAE,CAyBR;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CA6BjC;AAED,kFAAkF;AAClF,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,YAAY,EAAE,yBAAyB,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,SAAS,2BAA2B,EAAE,GAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAmE9C;AAaD,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGzF;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC1C,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgDjC;AAED,wBAAsB,4BAA4B,CAChD,MAAM,GAAE,+BAAoC,GAC3C,OAAO,CAAC,yBAAyB,CAAC,CA0BpC;AAED,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CA+CxC;AAED,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAwCzC"}