@shipfox/api-workflows 11.0.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 (346) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/CHANGELOG.md +100 -0
  3. package/README.md +75 -0
  4. package/dist/core/agent-defaults.d.ts +2 -1
  5. package/dist/core/agent-defaults.d.ts.map +1 -1
  6. package/dist/core/agent-defaults.js.map +1 -1
  7. package/dist/core/checkout.d.ts +7 -21
  8. package/dist/core/checkout.d.ts.map +1 -1
  9. package/dist/core/checkout.js +122 -41
  10. package/dist/core/checkout.js.map +1 -1
  11. package/dist/core/entities/job-execution.d.ts +8 -0
  12. package/dist/core/entities/job-execution.d.ts.map +1 -1
  13. package/dist/core/entities/job-execution.js +13 -1
  14. package/dist/core/entities/job-execution.js.map +1 -1
  15. package/dist/core/entities/job-listener-event.d.ts +2 -0
  16. package/dist/core/entities/job-listener-event.d.ts.map +1 -1
  17. package/dist/core/entities/job-listener-event.js.map +1 -1
  18. package/dist/core/entities/step.d.ts +13 -3
  19. package/dist/core/entities/step.d.ts.map +1 -1
  20. package/dist/core/entities/step.js +6 -0
  21. package/dist/core/entities/step.js.map +1 -1
  22. package/dist/core/entities/workflow-run-attempt.d.ts +1 -0
  23. package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
  24. package/dist/core/entities/workflow-run-attempt.js.map +1 -1
  25. package/dist/core/entities/workflow-run.d.ts +17 -0
  26. package/dist/core/entities/workflow-run.d.ts.map +1 -1
  27. package/dist/core/entities/workflow-run.js.map +1 -1
  28. package/dist/core/errors.d.ts +9 -2
  29. package/dist/core/errors.d.ts.map +1 -1
  30. package/dist/core/errors.js +10 -5
  31. package/dist/core/errors.js.map +1 -1
  32. package/dist/core/job-execution.d.ts.map +1 -1
  33. package/dist/core/job-execution.js +14 -8
  34. package/dist/core/job-execution.js.map +1 -1
  35. package/dist/core/job-transition/decide-job-activation.d.ts +1 -0
  36. package/dist/core/job-transition/decide-job-activation.d.ts.map +1 -1
  37. package/dist/core/job-transition/decide-job-activation.js +1 -0
  38. package/dist/core/job-transition/decide-job-activation.js.map +1 -1
  39. package/dist/core/job-transition/derive-job-success.d.ts +1 -0
  40. package/dist/core/job-transition/derive-job-success.d.ts.map +1 -1
  41. package/dist/core/job-transition/derive-job-success.js +5 -8
  42. package/dist/core/job-transition/derive-job-success.js.map +1 -1
  43. package/dist/core/listener-execution-materialization.d.ts +6 -3
  44. package/dist/core/listener-execution-materialization.d.ts.map +1 -1
  45. package/dist/core/listener-execution-materialization.js +44 -6
  46. package/dist/core/listener-execution-materialization.js.map +1 -1
  47. package/dist/core/resolve-trigger-reference.d.ts +11 -0
  48. package/dist/core/resolve-trigger-reference.d.ts.map +1 -0
  49. package/dist/core/resolve-trigger-reference.js +39 -0
  50. package/dist/core/resolve-trigger-reference.js.map +1 -0
  51. package/dist/core/run-workflow.d.ts +1 -0
  52. package/dist/core/run-workflow.d.ts.map +1 -1
  53. package/dist/core/run-workflow.js +1 -0
  54. package/dist/core/run-workflow.js.map +1 -1
  55. package/dist/core/step-config/agent.d.ts +1 -2
  56. package/dist/core/step-config/agent.d.ts.map +1 -1
  57. package/dist/core/step-config/agent.js +22 -7
  58. package/dist/core/step-config/agent.js.map +1 -1
  59. package/dist/core/step-config/assemble-run-context.d.ts +19 -8
  60. package/dist/core/step-config/assemble-run-context.d.ts.map +1 -1
  61. package/dist/core/step-config/assemble-run-context.js +51 -19
  62. package/dist/core/step-config/assemble-run-context.js.map +1 -1
  63. package/dist/core/step-config/complete-step-dispatch-config.d.ts.map +1 -1
  64. package/dist/core/step-config/complete-step-dispatch-config.js +72 -4
  65. package/dist/core/step-config/complete-step-dispatch-config.js.map +1 -1
  66. package/dist/core/step-config/index.d.ts +1 -0
  67. package/dist/core/step-config/index.d.ts.map +1 -1
  68. package/dist/core/step-config/index.js +1 -0
  69. package/dist/core/step-config/index.js.map +1 -1
  70. package/dist/core/step-config/materialize-job-execution-steps.d.ts +1 -1
  71. package/dist/core/step-config/materialize-job-execution-steps.d.ts.map +1 -1
  72. package/dist/core/step-config/materialize-job-execution-steps.js +49 -8
  73. package/dist/core/step-config/materialize-job-execution-steps.js.map +1 -1
  74. package/dist/core/step-config/materialize-workflow-model.d.ts +3 -3
  75. package/dist/core/step-config/materialize-workflow-model.d.ts.map +1 -1
  76. package/dist/core/step-config/materialize-workflow-model.js +9 -5
  77. package/dist/core/step-config/materialize-workflow-model.js.map +1 -1
  78. package/dist/core/step-config/resolve-job-execution-name.d.ts +3 -3
  79. package/dist/core/step-config/resolve-job-execution-name.d.ts.map +1 -1
  80. package/dist/core/step-config/resolve-job-execution-name.js +24 -13
  81. package/dist/core/step-config/resolve-job-execution-name.js.map +1 -1
  82. package/dist/core/step-config/resolve-step-config.d.ts.map +1 -1
  83. package/dist/core/step-config/resolve-step-config.js +174 -9
  84. package/dist/core/step-config/resolve-step-config.js.map +1 -1
  85. package/dist/core/step-config/resolve-workflow-run-name.d.ts +19 -0
  86. package/dist/core/step-config/resolve-workflow-run-name.d.ts.map +1 -0
  87. package/dist/core/step-config/resolve-workflow-run-name.js +73 -0
  88. package/dist/core/step-config/resolve-workflow-run-name.js.map +1 -0
  89. package/dist/core/step-transition/decide-step-transition.js.map +1 -1
  90. package/dist/core/step-transition/evaluate-gate.d.ts +2 -1
  91. package/dist/core/step-transition/evaluate-gate.d.ts.map +1 -1
  92. package/dist/core/step-transition/evaluate-gate.js +5 -3
  93. package/dist/core/step-transition/evaluate-gate.js.map +1 -1
  94. package/dist/core/workflow-run-creation.d.ts +3 -0
  95. package/dist/core/workflow-run-creation.d.ts.map +1 -1
  96. package/dist/core/workflow-run-creation.js +22 -7
  97. package/dist/core/workflow-run-creation.js.map +1 -1
  98. package/dist/db/db.d.ts +278 -10
  99. package/dist/db/db.d.ts.map +1 -1
  100. package/dist/db/db.js +2 -0
  101. package/dist/db/db.js.map +1 -1
  102. package/dist/db/index.d.ts +3 -2
  103. package/dist/db/index.d.ts.map +1 -1
  104. package/dist/db/index.js +2 -1
  105. package/dist/db/index.js.map +1 -1
  106. package/dist/db/job-listener-events.d.ts +2 -0
  107. package/dist/db/job-listener-events.d.ts.map +1 -1
  108. package/dist/db/job-listener-events.js +1 -0
  109. package/dist/db/job-listener-events.js.map +1 -1
  110. package/dist/db/job-listeners.d.ts +2 -0
  111. package/dist/db/job-listeners.d.ts.map +1 -1
  112. package/dist/db/job-listeners.js +81 -21
  113. package/dist/db/job-listeners.js.map +1 -1
  114. package/dist/db/schema/job-executions.d.ts +3 -3
  115. package/dist/db/schema/job-executions.d.ts.map +1 -1
  116. package/dist/db/schema/job-executions.js +8 -4
  117. package/dist/db/schema/job-executions.js.map +1 -1
  118. package/dist/db/schema/job-listener-events.d.ts +20 -0
  119. package/dist/db/schema/job-listener-events.d.ts.map +1 -1
  120. package/dist/db/schema/job-listener-events.js +2 -0
  121. package/dist/db/schema/job-listener-events.js.map +1 -1
  122. package/dist/db/schema/step-attempts.js +2 -2
  123. package/dist/db/schema/step-attempts.js.map +1 -1
  124. package/dist/db/schema/steps.d.ts +4 -2
  125. package/dist/db/schema/steps.d.ts.map +1 -1
  126. package/dist/db/schema/steps.js +1 -1
  127. package/dist/db/schema/steps.js.map +1 -1
  128. package/dist/db/schema/workflow-run-attempts.d.ts +21 -2
  129. package/dist/db/schema/workflow-run-attempts.d.ts.map +1 -1
  130. package/dist/db/schema/workflow-run-attempts.js +2 -0
  131. package/dist/db/schema/workflow-run-attempts.js.map +1 -1
  132. package/dist/db/schema/workflow-run-counters.d.ts +43 -0
  133. package/dist/db/schema/workflow-run-counters.d.ts.map +1 -0
  134. package/dist/db/schema/workflow-run-counters.js +10 -0
  135. package/dist/db/schema/workflow-run-counters.js.map +1 -0
  136. package/dist/db/schema/workflow-runs.d.ts +54 -1
  137. package/dist/db/schema/workflow-runs.d.ts.map +1 -1
  138. package/dist/db/schema/workflow-runs.js +10 -2
  139. package/dist/db/schema/workflow-runs.js.map +1 -1
  140. package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
  141. package/dist/db/workflow-runs/job-executions.js +35 -14
  142. package/dist/db/workflow-runs/job-executions.js.map +1 -1
  143. package/dist/db/workflow-runs/jobs.d.ts +2 -0
  144. package/dist/db/workflow-runs/jobs.d.ts.map +1 -1
  145. package/dist/db/workflow-runs/jobs.js +9 -5
  146. package/dist/db/workflow-runs/jobs.js.map +1 -1
  147. package/dist/db/workflow-runs/queries.d.ts +51 -0
  148. package/dist/db/workflow-runs/queries.d.ts.map +1 -1
  149. package/dist/db/workflow-runs/queries.js +82 -2
  150. package/dist/db/workflow-runs/queries.js.map +1 -1
  151. package/dist/db/workflow-runs/run-create.d.ts +1 -0
  152. package/dist/db/workflow-runs/run-create.d.ts.map +1 -1
  153. package/dist/db/workflow-runs/run-create.js +159 -32
  154. package/dist/db/workflow-runs/run-create.js.map +1 -1
  155. package/dist/db/workflow-runs/run-rerun.d.ts.map +1 -1
  156. package/dist/db/workflow-runs/run-rerun.js +13 -5
  157. package/dist/db/workflow-runs/run-rerun.js.map +1 -1
  158. package/dist/db/workflow-runs/shared.d.ts +1 -0
  159. package/dist/db/workflow-runs/shared.d.ts.map +1 -1
  160. package/dist/db/workflow-runs/shared.js +2 -1
  161. package/dist/db/workflow-runs/shared.js.map +1 -1
  162. package/dist/db/workflow-runs/steps.js +3 -3
  163. package/dist/db/workflow-runs/steps.js.map +1 -1
  164. package/dist/db/workflow-runs.d.ts +4 -3
  165. package/dist/db/workflow-runs.d.ts.map +1 -1
  166. package/dist/db/workflow-runs.js +3 -2
  167. package/dist/db/workflow-runs.js.map +1 -1
  168. package/dist/metrics/instance.d.ts +1 -0
  169. package/dist/metrics/instance.d.ts.map +1 -1
  170. package/dist/metrics/instance.js +9 -0
  171. package/dist/metrics/instance.js.map +1 -1
  172. package/dist/presentation/dto/checkout-token.d.ts +1 -0
  173. package/dist/presentation/dto/checkout-token.d.ts.map +1 -1
  174. package/dist/presentation/dto/checkout-token.js +1 -0
  175. package/dist/presentation/dto/checkout-token.js.map +1 -1
  176. package/dist/presentation/dto/index.d.ts +1 -1
  177. package/dist/presentation/dto/index.d.ts.map +1 -1
  178. package/dist/presentation/dto/index.js +1 -1
  179. package/dist/presentation/dto/index.js.map +1 -1
  180. package/dist/presentation/dto/step.d.ts.map +1 -1
  181. package/dist/presentation/dto/step.js +2 -2
  182. package/dist/presentation/dto/step.js.map +1 -1
  183. package/dist/presentation/dto/workflow-run.d.ts +3 -1
  184. package/dist/presentation/dto/workflow-run.d.ts.map +1 -1
  185. package/dist/presentation/dto/workflow-run.js +34 -0
  186. package/dist/presentation/dto/workflow-run.js.map +1 -1
  187. package/dist/presentation/inter-module.d.ts.map +1 -1
  188. package/dist/presentation/inter-module.js +31 -3
  189. package/dist/presentation/inter-module.js.map +1 -1
  190. package/dist/presentation/routes/checkout-token.d.ts +1 -1
  191. package/dist/presentation/routes/checkout-token.d.ts.map +1 -1
  192. package/dist/presentation/routes/checkout-token.js +32 -20
  193. package/dist/presentation/routes/checkout-token.js.map +1 -1
  194. package/dist/presentation/routes/leased-step.d.ts +2 -0
  195. package/dist/presentation/routes/leased-step.d.ts.map +1 -1
  196. package/dist/presentation/routes/leased-step.js +2 -1
  197. package/dist/presentation/routes/leased-step.js.map +1 -1
  198. package/dist/presentation/routes/list-runs.d.ts.map +1 -1
  199. package/dist/presentation/routes/list-runs.js +9 -3
  200. package/dist/presentation/routes/list-runs.js.map +1 -1
  201. package/dist/presentation/routes/project-access.d.ts +1 -0
  202. package/dist/presentation/routes/project-access.d.ts.map +1 -1
  203. package/dist/presentation/routes/report-step.d.ts.map +1 -1
  204. package/dist/presentation/routes/report-step.js +9 -2
  205. package/dist/presentation/routes/report-step.js.map +1 -1
  206. package/dist/presentation/subscribers/on-job-steps-settled.js +1 -1
  207. package/dist/presentation/subscribers/on-job-steps-settled.js.map +1 -1
  208. package/dist/presentation/subscribers/on-runner-job-claimed.d.ts.map +1 -1
  209. package/dist/presentation/subscribers/on-runner-job-claimed.js +21 -0
  210. package/dist/presentation/subscribers/on-runner-job-claimed.js.map +1 -1
  211. package/dist/temporal/activities/index.d.ts.map +1 -1
  212. package/dist/temporal/activities/index.js +2 -1
  213. package/dist/temporal/activities/index.js.map +1 -1
  214. package/dist/temporal/activities/orchestration-activities.d.ts +1 -0
  215. package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
  216. package/dist/temporal/activities/orchestration-activities.js.map +1 -1
  217. package/dist/temporal/constants.d.ts +1 -0
  218. package/dist/temporal/constants.d.ts.map +1 -1
  219. package/dist/temporal/constants.js +1 -0
  220. package/dist/temporal/constants.js.map +1 -1
  221. package/dist/temporal/index.d.ts +1 -1
  222. package/dist/temporal/index.d.ts.map +1 -1
  223. package/dist/temporal/index.js +1 -1
  224. package/dist/temporal/index.js.map +1 -1
  225. package/dist/temporal/workflows/index.bundle.js +82 -43
  226. package/dist/temporal/workflows/index.d.ts +1 -1
  227. package/dist/temporal/workflows/index.d.ts.map +1 -1
  228. package/dist/temporal/workflows/index.js +1 -1
  229. package/dist/temporal/workflows/index.js.map +1 -1
  230. package/dist/temporal/workflows/job-execution-orchestration.d.ts +5 -0
  231. package/dist/temporal/workflows/job-execution-orchestration.d.ts.map +1 -1
  232. package/dist/temporal/workflows/job-execution-orchestration.js +77 -43
  233. package/dist/temporal/workflows/job-execution-orchestration.js.map +1 -1
  234. package/dist/temporal/workflows/test-env.d.ts +5 -1
  235. package/dist/temporal/workflows/test-env.d.ts.map +1 -1
  236. package/dist/temporal/workflows/test-env.js +32 -11
  237. package/dist/temporal/workflows/test-env.js.map +1 -1
  238. package/dist/tsconfig.test.tsbuildinfo +1 -1
  239. package/drizzle/0000_initial.sql +14 -2
  240. package/drizzle/0001_windy_sunfire.sql +1 -0
  241. package/drizzle/meta/0000_snapshot.json +93 -1
  242. package/drizzle/meta/0001_snapshot.json +1711 -0
  243. package/drizzle/meta/_journal.json +2 -2
  244. package/package.json +21 -21
  245. package/src/core/agent-defaults.ts +2 -1
  246. package/src/core/checkout.test.ts +378 -67
  247. package/src/core/checkout.ts +142 -59
  248. package/src/core/entities/job-execution.test.ts +21 -0
  249. package/src/core/entities/job-execution.ts +24 -0
  250. package/src/core/entities/job-listener-event.ts +3 -0
  251. package/src/core/entities/step.ts +15 -3
  252. package/src/core/entities/workflow-run-attempt.ts +1 -0
  253. package/src/core/entities/workflow-run.ts +16 -0
  254. package/src/core/errors.ts +21 -7
  255. package/src/core/job-execution.ts +27 -4
  256. package/src/core/job-transition/decide-job-activation.test.ts +4 -0
  257. package/src/core/job-transition/decide-job-activation.ts +2 -0
  258. package/src/core/job-transition/derive-job-success.test.ts +12 -0
  259. package/src/core/job-transition/derive-job-success.ts +6 -9
  260. package/src/core/listener-execution-materialization.test.ts +2 -0
  261. package/src/core/listener-execution-materialization.ts +57 -11
  262. package/src/core/resolve-trigger-reference.test.ts +160 -0
  263. package/src/core/resolve-trigger-reference.ts +53 -0
  264. package/src/core/run-workflow.ts +2 -0
  265. package/src/core/step-config/agent.ts +29 -12
  266. package/src/core/step-config/assemble-run-context.test.ts +149 -6
  267. package/src/core/step-config/assemble-run-context.ts +87 -25
  268. package/src/core/step-config/complete-step-dispatch-config.test.ts +125 -2
  269. package/src/core/step-config/complete-step-dispatch-config.ts +83 -1
  270. package/src/core/step-config/index.ts +7 -0
  271. package/src/core/step-config/materialize-job-execution-steps.test.ts +250 -1
  272. package/src/core/step-config/materialize-job-execution-steps.ts +57 -10
  273. package/src/core/step-config/materialize-workflow-model.test.ts +212 -4
  274. package/src/core/step-config/materialize-workflow-model.ts +33 -28
  275. package/src/core/step-config/resolve-job-execution-name.test.ts +37 -15
  276. package/src/core/step-config/resolve-job-execution-name.ts +30 -15
  277. package/src/core/step-config/resolve-step-config.ts +175 -10
  278. package/src/core/step-config/resolve-workflow-run-name.test.ts +115 -0
  279. package/src/core/step-config/resolve-workflow-run-name.ts +108 -0
  280. package/src/core/step-transition/decide-step-transition.ts +2 -2
  281. package/src/core/step-transition/evaluate-gate.test.ts +8 -0
  282. package/src/core/step-transition/evaluate-gate.ts +8 -1
  283. package/src/core/workflow-run-creation.test.ts +7 -4
  284. package/src/core/workflow-run-creation.ts +13 -7
  285. package/src/db/db.ts +2 -0
  286. package/src/db/index.ts +6 -0
  287. package/src/db/job-listener-events.test.ts +19 -0
  288. package/src/db/job-listener-events.ts +3 -0
  289. package/src/db/job-listeners.test.ts +187 -5
  290. package/src/db/job-listeners.ts +122 -30
  291. package/src/db/schema/job-executions.ts +12 -5
  292. package/src/db/schema/job-listener-events.ts +3 -0
  293. package/src/db/schema/step-attempts.ts +2 -2
  294. package/src/db/schema/steps.ts +2 -1
  295. package/src/db/schema/workflow-run-attempts.ts +2 -0
  296. package/src/db/schema/workflow-run-counters.ts +13 -0
  297. package/src/db/schema/workflow-runs.ts +11 -2
  298. package/src/db/workflow-runs/job-executions.ts +37 -15
  299. package/src/db/workflow-runs/jobs.ts +17 -4
  300. package/src/db/workflow-runs/queries.test.ts +206 -0
  301. package/src/db/workflow-runs/queries.ts +146 -2
  302. package/src/db/workflow-runs/run-create.test.ts +606 -8
  303. package/src/db/workflow-runs/run-create.ts +185 -40
  304. package/src/db/workflow-runs/run-rerun.test.ts +61 -2
  305. package/src/db/workflow-runs/run-rerun.ts +15 -5
  306. package/src/db/workflow-runs/shared.ts +2 -0
  307. package/src/db/workflow-runs/steps.ts +3 -3
  308. package/src/db/workflow-runs.ts +7 -0
  309. package/src/metrics/instance.ts +14 -0
  310. package/src/presentation/dto/checkout-token.test.ts +19 -9
  311. package/src/presentation/dto/checkout-token.ts +2 -1
  312. package/src/presentation/dto/index.ts +1 -1
  313. package/src/presentation/dto/job.test.ts +9 -0
  314. package/src/presentation/dto/step.test.ts +12 -0
  315. package/src/presentation/dto/step.ts +5 -2
  316. package/src/presentation/dto/workflow-run.ts +44 -2
  317. package/src/presentation/inter-module.test.ts +165 -0
  318. package/src/presentation/inter-module.ts +38 -4
  319. package/src/presentation/routes/checkout-token.test.ts +357 -142
  320. package/src/presentation/routes/checkout-token.ts +56 -26
  321. package/src/presentation/routes/get-run.test.ts +2 -0
  322. package/src/presentation/routes/get-step-secrets.test.ts +7 -2
  323. package/src/presentation/routes/leased-step.ts +9 -1
  324. package/src/presentation/routes/list-runs.test.ts +57 -0
  325. package/src/presentation/routes/list-runs.ts +8 -3
  326. package/src/presentation/routes/report-step.test.ts +25 -0
  327. package/src/presentation/routes/report-step.ts +10 -2
  328. package/src/presentation/subscribers/on-job-steps-settled.ts +1 -1
  329. package/src/presentation/subscribers/on-runner-job-claimed.test.ts +49 -0
  330. package/src/presentation/subscribers/on-runner-job-claimed.ts +22 -0
  331. package/src/temporal/activities/index.ts +1 -0
  332. package/src/temporal/activities/orchestration-activities.ts +1 -0
  333. package/src/temporal/constants.ts +1 -0
  334. package/src/temporal/index.ts +1 -0
  335. package/src/temporal/workflows/index.ts +1 -0
  336. package/src/temporal/workflows/job-execution-orchestration.test.ts +142 -6
  337. package/src/temporal/workflows/job-execution-orchestration.ts +99 -50
  338. package/src/temporal/workflows/run-orchestration.test.ts +1 -1
  339. package/src/temporal/workflows/test-env.ts +50 -13
  340. package/test/factories/project.ts +2 -0
  341. package/test/factories/workflow-model.ts +80 -26
  342. package/test/factories/workflow-run.ts +4 -1
  343. package/test/fixtures/agent-inter-module.ts +2 -1
  344. package/test/fixtures/job-with-steps.ts +1 -1
  345. package/tsconfig.build.tsbuildinfo +1 -1
  346. package/drizzle/0001_agent_tool_materialization.sql +0 -1
@@ -1,30 +1,34 @@
1
- import { requireLeasedJobContext } from '@shipfox/api-auth-context';
2
1
  import { integrationsInterModuleContract } from '@shipfox/api-integration-core-dto/inter-module';
3
- import { checkoutTokenResponseSchema } from '@shipfox/api-workflows-dto';
2
+ import { projectsInterModuleContract } from '@shipfox/api-projects-dto/inter-module';
3
+ import { checkoutTokenParamsSchema, checkoutTokenQuerySchema, checkoutTokenResponseSchema } from '@shipfox/api-workflows-dto';
4
4
  import { isInterModuleKnownError } from '@shipfox/inter-module';
5
5
  import { ClientError, defineRoute } from '@shipfox/node-fastify';
6
- import { createJobCheckoutSpec } from '#core/checkout.js';
7
- import { CheckoutIntentUnresolvedError, JobNotFoundError, WorkflowRunNotFoundError } from '#core/errors.js';
6
+ import { createStepCheckoutSpec } from '#core/checkout.js';
7
+ import { CheckoutConfigInvalidError, CheckoutIntentUnresolvedError } from '#core/errors.js';
8
8
  import { toCheckoutTokenDto } from '#presentation/dto/checkout-token.js';
9
+ import { loadRunningLeasedStep } from './leased-step.js';
9
10
  export function createCheckoutTokenRoute(clients) {
10
11
  return defineRoute({
11
12
  method: 'POST',
12
- path: '/checkout-token',
13
- description: "Exchanges the runner's job lease for short-lived, read-only checkout credentials for the job's repository. The job is identified by the access token, so no job ID is needed. The checkout target is resolved server-side from the job's run and project; no credential material is stored on the job or run. Returns the repository URL, ref, and (when the provider needs auth) a short-lived credential that expires soon.",
13
+ path: '/steps/:stepId/checkout-token',
14
+ description: "Exchanges the runner's lease for short-lived checkout credentials for the currently running checkout step. The step id and attempt are checked against the lease and the server-frozen step config supplies the target, ref, permissions, and fetch depth.",
14
15
  schema: {
16
+ params: checkoutTokenParamsSchema,
17
+ querystring: checkoutTokenQuerySchema,
15
18
  response: {
16
19
  200: checkoutTokenResponseSchema
17
20
  }
18
21
  },
19
22
  errorHandler: (error)=>{
20
23
  const known = isInterModuleKnownError(integrationsInterModuleContract.methods.createCheckoutSpec, error) ? error : undefined;
21
- if (error instanceof JobNotFoundError) throw new ClientError(error.message, 'job-not-found', {
24
+ const targetError = isInterModuleKnownError(projectsInterModuleContract.methods.resolveCheckoutTarget, error) ? error : undefined;
25
+ if (error instanceof CheckoutIntentUnresolvedError) throw new ClientError(error.message, 'checkout-unavailable', {
22
26
  status: 404
23
27
  });
24
- if (error instanceof WorkflowRunNotFoundError) throw new ClientError(error.message, 'run-not-found', {
25
- status: 404
28
+ if (error instanceof CheckoutConfigInvalidError) throw new ClientError('Checkout configuration is invalid', 'checkout-config-invalid', {
29
+ status: 409
26
30
  });
27
- if (error instanceof CheckoutIntentUnresolvedError) throw new ClientError(error.message, 'checkout-unavailable', {
31
+ if (targetError?.code === 'checkout-repository-not-authorized') throw new ClientError('Checkout repository is not authorized for this workspace', 'checkout-repository-not-authorized', {
28
32
  status: 404
29
33
  });
30
34
  if (known?.code === 'connection-not-found') throw new ClientError('Integration connection not found', 'integration-connection-not-found', {
@@ -57,22 +61,30 @@ export function createCheckoutTokenRoute(clients) {
57
61
  throw error;
58
62
  },
59
63
  handler: async (request, reply)=>{
60
- const leasedJob = requireLeasedJobContext(request);
61
- const { active: leaseIsActive } = await clients.runners.getLeaseState({
62
- jobId: leasedJob.jobId,
63
- jobExecutionId: leasedJob.jobExecutionId,
64
- runnerSessionId: leasedJob.runnerSessionId
64
+ const { stepId } = request.params;
65
+ const { attempt } = request.query;
66
+ const { step, workspaceId, projectId, triggerReference } = await loadRunningLeasedStep({
67
+ runners: clients.runners,
68
+ request,
69
+ stepId,
70
+ attempt
65
71
  });
66
- if (!leaseIsActive) throw new ClientError('Job lease is no longer active', 'lease-not-active', {
67
- status: 404
68
- });
69
- const checkout = await createJobCheckoutSpec({
70
- jobId: leasedJob.jobId,
72
+ if (step.type !== 'setup' && step.type !== 'checkout') {
73
+ throw new ClientError('Step is not a checkout step', 'step-not-checkout', {
74
+ status: 409
75
+ });
76
+ }
77
+ const checkout = await createStepCheckoutSpec({
78
+ step,
79
+ workspaceId,
80
+ projectId,
81
+ triggerReference,
71
82
  integrations: clients.integrations,
72
83
  projects: clients.projects
73
84
  });
74
85
  reply.header('cache-control', 'no-store');
75
86
  return toCheckoutTokenDto(checkout.spec, {
87
+ fetchDepth: checkout.fetchDepth,
76
88
  persist: checkout.persistCredentials
77
89
  });
78
90
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/checkout-token.ts"],"sourcesContent":["import {requireLeasedJobContext} from '@shipfox/api-auth-context';\nimport {\n type IntegrationsModuleClient,\n integrationsInterModuleContract,\n} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport {checkoutTokenResponseSchema} from '@shipfox/api-workflows-dto';\nimport {isInterModuleKnownError} from '@shipfox/inter-module';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {createJobCheckoutSpec} from '#core/checkout.js';\nimport {\n CheckoutIntentUnresolvedError,\n JobNotFoundError,\n WorkflowRunNotFoundError,\n} from '#core/errors.js';\nimport {toCheckoutTokenDto} from '#presentation/dto/checkout-token.js';\n\nexport function createCheckoutTokenRoute(clients: {\n runners: RunnersInterModuleClient;\n integrations: IntegrationsModuleClient;\n projects: ProjectsModuleClient;\n}) {\n return defineRoute({\n method: 'POST',\n path: '/checkout-token',\n description:\n \"Exchanges the runner's job lease for short-lived, read-only checkout credentials for the job's repository. The job is identified by the access token, so no job ID is needed. The checkout target is resolved server-side from the job's run and project; no credential material is stored on the job or run. Returns the repository URL, ref, and (when the provider needs auth) a short-lived credential that expires soon.\",\n schema: {response: {200: checkoutTokenResponseSchema}},\n errorHandler: (error) => {\n const known = isInterModuleKnownError(\n integrationsInterModuleContract.methods.createCheckoutSpec,\n error,\n )\n ? error\n : undefined;\n if (error instanceof JobNotFoundError)\n throw new ClientError(error.message, 'job-not-found', {status: 404});\n if (error instanceof WorkflowRunNotFoundError)\n throw new ClientError(error.message, 'run-not-found', {status: 404});\n if (error instanceof CheckoutIntentUnresolvedError)\n throw new ClientError(error.message, 'checkout-unavailable', {status: 404});\n if (known?.code === 'connection-not-found')\n throw new ClientError(\n 'Integration connection not found',\n 'integration-connection-not-found',\n {\n status: 404,\n },\n );\n if (known?.code === 'connection-inactive')\n throw new ClientError(\n 'Integration connection is not active',\n 'integration-connection-inactive',\n {\n status: 422,\n },\n );\n if (known?.code === 'connection-workspace-mismatch')\n throw new ClientError(\n 'Integration connection does not belong to this workspace',\n 'forbidden',\n {status: 403},\n );\n if (known?.code === 'provider-unavailable')\n throw new ClientError(\n 'Integration provider is unavailable',\n 'integration-provider-unavailable',\n {\n status: 422,\n },\n );\n if (known?.code === 'capability-unavailable')\n throw new ClientError(\n 'Integration capability is unavailable',\n 'integration-capability-unavailable',\n {\n status: 422,\n },\n );\n if (known?.code === 'checkout-unsupported')\n throw new ClientError(\n 'Integration checkout is unsupported',\n 'integration-checkout-unsupported',\n {\n status: 422,\n },\n );\n if (known?.code === 'provider-failure') {\n const status =\n known.details.reason === 'rate-limited'\n ? 429\n : known.details.reason === 'timeout' || known.details.reason === 'provider-unavailable'\n ? 503\n : 422;\n throw new ClientError('Integration provider request failed', known.details.reason, {\n details: {retry_after_seconds: known.details.retryAfterSeconds},\n status,\n });\n }\n throw error;\n },\n handler: async (request, reply) => {\n const leasedJob = requireLeasedJobContext(request);\n const {active: leaseIsActive} = await clients.runners.getLeaseState({\n jobId: leasedJob.jobId,\n jobExecutionId: leasedJob.jobExecutionId,\n runnerSessionId: leasedJob.runnerSessionId,\n });\n if (!leaseIsActive)\n throw new ClientError('Job lease is no longer active', 'lease-not-active', {status: 404});\n const checkout = await createJobCheckoutSpec({\n jobId: leasedJob.jobId,\n integrations: clients.integrations,\n projects: clients.projects,\n });\n reply.header('cache-control', 'no-store');\n return toCheckoutTokenDto(checkout.spec, {persist: checkout.persistCredentials});\n },\n });\n}\n"],"names":["requireLeasedJobContext","integrationsInterModuleContract","checkoutTokenResponseSchema","isInterModuleKnownError","ClientError","defineRoute","createJobCheckoutSpec","CheckoutIntentUnresolvedError","JobNotFoundError","WorkflowRunNotFoundError","toCheckoutTokenDto","createCheckoutTokenRoute","clients","method","path","description","schema","response","errorHandler","error","known","methods","createCheckoutSpec","undefined","message","status","code","details","reason","retry_after_seconds","retryAfterSeconds","handler","request","reply","leasedJob","active","leaseIsActive","runners","getLeaseState","jobId","jobExecutionId","runnerSessionId","checkout","integrations","projects","header","spec","persist","persistCredentials"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/checkout-token.ts"],"sourcesContent":["import {\n type IntegrationsModuleClient,\n integrationsInterModuleContract,\n} from '@shipfox/api-integration-core-dto/inter-module';\nimport {\n type ProjectsModuleClient,\n projectsInterModuleContract,\n} from '@shipfox/api-projects-dto/inter-module';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport {\n checkoutTokenParamsSchema,\n checkoutTokenQuerySchema,\n checkoutTokenResponseSchema,\n} from '@shipfox/api-workflows-dto';\nimport {isInterModuleKnownError} from '@shipfox/inter-module';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {createStepCheckoutSpec} from '#core/checkout.js';\nimport {CheckoutConfigInvalidError, CheckoutIntentUnresolvedError} from '#core/errors.js';\nimport {toCheckoutTokenDto} from '#presentation/dto/checkout-token.js';\nimport {loadRunningLeasedStep} from './leased-step.js';\n\nexport function createCheckoutTokenRoute(clients: {\n runners: RunnersInterModuleClient;\n integrations: IntegrationsModuleClient;\n projects: ProjectsModuleClient;\n}) {\n return defineRoute({\n method: 'POST',\n path: '/steps/:stepId/checkout-token',\n description:\n \"Exchanges the runner's lease for short-lived checkout credentials for the currently running checkout step. The step id and attempt are checked against the lease and the server-frozen step config supplies the target, ref, permissions, and fetch depth.\",\n schema: {\n params: checkoutTokenParamsSchema,\n querystring: checkoutTokenQuerySchema,\n response: {200: checkoutTokenResponseSchema},\n },\n errorHandler: (error) => {\n const known = isInterModuleKnownError(\n integrationsInterModuleContract.methods.createCheckoutSpec,\n error,\n )\n ? error\n : undefined;\n const targetError = isInterModuleKnownError(\n projectsInterModuleContract.methods.resolveCheckoutTarget,\n error,\n )\n ? error\n : undefined;\n if (error instanceof CheckoutIntentUnresolvedError)\n throw new ClientError(error.message, 'checkout-unavailable', {status: 404});\n if (error instanceof CheckoutConfigInvalidError)\n throw new ClientError('Checkout configuration is invalid', 'checkout-config-invalid', {\n status: 409,\n });\n if (targetError?.code === 'checkout-repository-not-authorized')\n throw new ClientError(\n 'Checkout repository is not authorized for this workspace',\n 'checkout-repository-not-authorized',\n {status: 404},\n );\n if (known?.code === 'connection-not-found')\n throw new ClientError(\n 'Integration connection not found',\n 'integration-connection-not-found',\n {\n status: 404,\n },\n );\n if (known?.code === 'connection-inactive')\n throw new ClientError(\n 'Integration connection is not active',\n 'integration-connection-inactive',\n {\n status: 422,\n },\n );\n if (known?.code === 'connection-workspace-mismatch')\n throw new ClientError(\n 'Integration connection does not belong to this workspace',\n 'forbidden',\n {status: 403},\n );\n if (known?.code === 'provider-unavailable')\n throw new ClientError(\n 'Integration provider is unavailable',\n 'integration-provider-unavailable',\n {\n status: 422,\n },\n );\n if (known?.code === 'capability-unavailable')\n throw new ClientError(\n 'Integration capability is unavailable',\n 'integration-capability-unavailable',\n {\n status: 422,\n },\n );\n if (known?.code === 'checkout-unsupported')\n throw new ClientError(\n 'Integration checkout is unsupported',\n 'integration-checkout-unsupported',\n {\n status: 422,\n },\n );\n if (known?.code === 'provider-failure') {\n const status =\n known.details.reason === 'rate-limited'\n ? 429\n : known.details.reason === 'timeout' || known.details.reason === 'provider-unavailable'\n ? 503\n : 422;\n throw new ClientError('Integration provider request failed', known.details.reason, {\n details: {retry_after_seconds: known.details.retryAfterSeconds},\n status,\n });\n }\n throw error;\n },\n handler: async (request, reply) => {\n const {stepId} = request.params;\n const {attempt} = request.query;\n const {step, workspaceId, projectId, triggerReference} = await loadRunningLeasedStep({\n runners: clients.runners,\n request,\n stepId,\n attempt,\n });\n\n if (step.type !== 'setup' && step.type !== 'checkout') {\n throw new ClientError('Step is not a checkout step', 'step-not-checkout', {status: 409});\n }\n\n const checkout = await createStepCheckoutSpec({\n step,\n workspaceId,\n projectId,\n triggerReference,\n integrations: clients.integrations,\n projects: clients.projects,\n });\n reply.header('cache-control', 'no-store');\n return toCheckoutTokenDto(checkout.spec, {\n fetchDepth: checkout.fetchDepth,\n persist: checkout.persistCredentials,\n });\n },\n });\n}\n"],"names":["integrationsInterModuleContract","projectsInterModuleContract","checkoutTokenParamsSchema","checkoutTokenQuerySchema","checkoutTokenResponseSchema","isInterModuleKnownError","ClientError","defineRoute","createStepCheckoutSpec","CheckoutConfigInvalidError","CheckoutIntentUnresolvedError","toCheckoutTokenDto","loadRunningLeasedStep","createCheckoutTokenRoute","clients","method","path","description","schema","params","querystring","response","errorHandler","error","known","methods","createCheckoutSpec","undefined","targetError","resolveCheckoutTarget","message","status","code","details","reason","retry_after_seconds","retryAfterSeconds","handler","request","reply","stepId","attempt","query","step","workspaceId","projectId","triggerReference","runners","type","checkout","integrations","projects","header","spec","fetchDepth","persist","persistCredentials"],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { type LeasedJobContext } from '@shipfox/api-auth-context';
2
2
  import type { RunnersInterModuleClient } from '@shipfox/api-runners-dto/inter-module';
3
3
  import type { Step } from '#core/entities/step.js';
4
+ import type { WorkflowRunTriggerReference } from '#core/entities/workflow-run.js';
4
5
  export interface LoadedRunningLeasedStep {
5
6
  leasedJob: LeasedJobContext;
6
7
  step: Step;
7
8
  workspaceId: string;
8
9
  projectId: string;
10
+ triggerReference: WorkflowRunTriggerReference | null;
9
11
  }
10
12
  export declare function loadRunningLeasedStep(params: {
11
13
  runners: RunnersInterModuleClient;
@@ -1 +1 @@
1
- {"version":3,"file":"leased-step.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/leased-step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,gBAAgB,EAA0B,MAAM,2BAA2B,CAAC;AACzF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAEpF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAGjD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAoCnC"}
1
+ {"version":3,"file":"leased-step.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/leased-step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,gBAAgB,EAA0B,MAAM,2BAA2B,CAAC;AACzF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAEpF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,gCAAgC,CAAC;AAGhF,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,2BAA2B,GAAG,IAAI,CAAC;CACtD;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA0CnC"}
@@ -42,7 +42,8 @@ export async function loadRunningLeasedStep(params) {
42
42
  leasedJob,
43
43
  step,
44
44
  workspaceId: scope.workspaceId,
45
- projectId: scope.projectId
45
+ projectId: scope.projectId,
46
+ triggerReference: scope.triggerReference
46
47
  };
47
48
  }
48
49
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/leased-step.ts"],"sourcesContent":["import {type LeasedJobContext, requireLeasedJobContext} from '@shipfox/api-auth-context';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport {ClientError} from '@shipfox/node-fastify';\nimport type {Step} from '#core/entities/step.js';\nimport {getJobScope, getStepByIdForJobExecution} from '#db/index.js';\n\nexport interface LoadedRunningLeasedStep {\n leasedJob: LeasedJobContext;\n step: Step;\n workspaceId: string;\n projectId: string;\n}\n\nexport async function loadRunningLeasedStep(params: {\n runners: RunnersInterModuleClient;\n request: object;\n stepId: string;\n attempt: number;\n}): Promise<LoadedRunningLeasedStep> {\n const leasedJob = requireLeasedJobContext(params.request);\n\n const {active: leaseIsActive} = await params.runners.getLeaseState({\n jobId: leasedJob.jobId,\n jobExecutionId: leasedJob.jobExecutionId,\n runnerSessionId: leasedJob.runnerSessionId,\n });\n if (!leaseIsActive) {\n throw new ClientError('Job lease is no longer active', 'lease-not-active', {status: 404});\n }\n\n const step = await getStepByIdForJobExecution({\n stepId: params.stepId,\n jobExecutionId: leasedJob.jobExecutionId,\n });\n if (!step) {\n throw new ClientError('Step not found for leased job', 'step-not-found', {status: 404});\n }\n\n const scope = await getJobScope(leasedJob.jobId);\n if (!scope) {\n throw new ClientError('Leased job not found', 'job-not-found', {status: 404});\n }\n\n if (step.currentAttempt !== params.attempt) {\n throw new ClientError('Step attempt does not match current attempt', 'step-attempt-mismatch', {\n status: 409,\n });\n }\n\n if (step.status !== 'running') {\n throw new ClientError('Step is not running', 'step-not-running', {status: 409});\n }\n\n return {leasedJob, step, workspaceId: scope.workspaceId, projectId: scope.projectId};\n}\n"],"names":["requireLeasedJobContext","ClientError","getJobScope","getStepByIdForJobExecution","loadRunningLeasedStep","params","leasedJob","request","active","leaseIsActive","runners","getLeaseState","jobId","jobExecutionId","runnerSessionId","status","step","stepId","scope","currentAttempt","attempt","workspaceId","projectId"],"mappings":"AAAA,SAA+BA,uBAAuB,QAAO,4BAA4B;AAEzF,SAAQC,WAAW,QAAO,wBAAwB;AAElD,SAAQC,WAAW,EAAEC,0BAA0B,QAAO,eAAe;AASrE,OAAO,eAAeC,sBAAsBC,MAK3C;IACC,MAAMC,YAAYN,wBAAwBK,OAAOE,OAAO;IAExD,MAAM,EAACC,QAAQC,aAAa,EAAC,GAAG,MAAMJ,OAAOK,OAAO,CAACC,aAAa,CAAC;QACjEC,OAAON,UAAUM,KAAK;QACtBC,gBAAgBP,UAAUO,cAAc;QACxCC,iBAAiBR,UAAUQ,eAAe;IAC5C;IACA,IAAI,CAACL,eAAe;QAClB,MAAM,IAAIR,YAAY,iCAAiC,oBAAoB;YAACc,QAAQ;QAAG;IACzF;IAEA,MAAMC,OAAO,MAAMb,2BAA2B;QAC5Cc,QAAQZ,OAAOY,MAAM;QACrBJ,gBAAgBP,UAAUO,cAAc;IAC1C;IACA,IAAI,CAACG,MAAM;QACT,MAAM,IAAIf,YAAY,iCAAiC,kBAAkB;YAACc,QAAQ;QAAG;IACvF;IAEA,MAAMG,QAAQ,MAAMhB,YAAYI,UAAUM,KAAK;IAC/C,IAAI,CAACM,OAAO;QACV,MAAM,IAAIjB,YAAY,wBAAwB,iBAAiB;YAACc,QAAQ;QAAG;IAC7E;IAEA,IAAIC,KAAKG,cAAc,KAAKd,OAAOe,OAAO,EAAE;QAC1C,MAAM,IAAInB,YAAY,+CAA+C,yBAAyB;YAC5Fc,QAAQ;QACV;IACF;IAEA,IAAIC,KAAKD,MAAM,KAAK,WAAW;QAC7B,MAAM,IAAId,YAAY,uBAAuB,oBAAoB;YAACc,QAAQ;QAAG;IAC/E;IAEA,OAAO;QAACT;QAAWU;QAAMK,aAAaH,MAAMG,WAAW;QAAEC,WAAWJ,MAAMI,SAAS;IAAA;AACrF"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/leased-step.ts"],"sourcesContent":["import {type LeasedJobContext, requireLeasedJobContext} from '@shipfox/api-auth-context';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport {ClientError} from '@shipfox/node-fastify';\nimport type {Step} from '#core/entities/step.js';\nimport type {WorkflowRunTriggerReference} from '#core/entities/workflow-run.js';\nimport {getJobScope, getStepByIdForJobExecution} from '#db/index.js';\n\nexport interface LoadedRunningLeasedStep {\n leasedJob: LeasedJobContext;\n step: Step;\n workspaceId: string;\n projectId: string;\n triggerReference: WorkflowRunTriggerReference | null;\n}\n\nexport async function loadRunningLeasedStep(params: {\n runners: RunnersInterModuleClient;\n request: object;\n stepId: string;\n attempt: number;\n}): Promise<LoadedRunningLeasedStep> {\n const leasedJob = requireLeasedJobContext(params.request);\n\n const {active: leaseIsActive} = await params.runners.getLeaseState({\n jobId: leasedJob.jobId,\n jobExecutionId: leasedJob.jobExecutionId,\n runnerSessionId: leasedJob.runnerSessionId,\n });\n if (!leaseIsActive) {\n throw new ClientError('Job lease is no longer active', 'lease-not-active', {status: 404});\n }\n\n const step = await getStepByIdForJobExecution({\n stepId: params.stepId,\n jobExecutionId: leasedJob.jobExecutionId,\n });\n if (!step) {\n throw new ClientError('Step not found for leased job', 'step-not-found', {status: 404});\n }\n\n const scope = await getJobScope(leasedJob.jobId);\n if (!scope) {\n throw new ClientError('Leased job not found', 'job-not-found', {status: 404});\n }\n\n if (step.currentAttempt !== params.attempt) {\n throw new ClientError('Step attempt does not match current attempt', 'step-attempt-mismatch', {\n status: 409,\n });\n }\n\n if (step.status !== 'running') {\n throw new ClientError('Step is not running', 'step-not-running', {status: 409});\n }\n\n return {\n leasedJob,\n step,\n workspaceId: scope.workspaceId,\n projectId: scope.projectId,\n triggerReference: scope.triggerReference,\n };\n}\n"],"names":["requireLeasedJobContext","ClientError","getJobScope","getStepByIdForJobExecution","loadRunningLeasedStep","params","leasedJob","request","active","leaseIsActive","runners","getLeaseState","jobId","jobExecutionId","runnerSessionId","status","step","stepId","scope","currentAttempt","attempt","workspaceId","projectId","triggerReference"],"mappings":"AAAA,SAA+BA,uBAAuB,QAAO,4BAA4B;AAEzF,SAAQC,WAAW,QAAO,wBAAwB;AAGlD,SAAQC,WAAW,EAAEC,0BAA0B,QAAO,eAAe;AAUrE,OAAO,eAAeC,sBAAsBC,MAK3C;IACC,MAAMC,YAAYN,wBAAwBK,OAAOE,OAAO;IAExD,MAAM,EAACC,QAAQC,aAAa,EAAC,GAAG,MAAMJ,OAAOK,OAAO,CAACC,aAAa,CAAC;QACjEC,OAAON,UAAUM,KAAK;QACtBC,gBAAgBP,UAAUO,cAAc;QACxCC,iBAAiBR,UAAUQ,eAAe;IAC5C;IACA,IAAI,CAACL,eAAe;QAClB,MAAM,IAAIR,YAAY,iCAAiC,oBAAoB;YAACc,QAAQ;QAAG;IACzF;IAEA,MAAMC,OAAO,MAAMb,2BAA2B;QAC5Cc,QAAQZ,OAAOY,MAAM;QACrBJ,gBAAgBP,UAAUO,cAAc;IAC1C;IACA,IAAI,CAACG,MAAM;QACT,MAAM,IAAIf,YAAY,iCAAiC,kBAAkB;YAACc,QAAQ;QAAG;IACvF;IAEA,MAAMG,QAAQ,MAAMhB,YAAYI,UAAUM,KAAK;IAC/C,IAAI,CAACM,OAAO;QACV,MAAM,IAAIjB,YAAY,wBAAwB,iBAAiB;YAACc,QAAQ;QAAG;IAC7E;IAEA,IAAIC,KAAKG,cAAc,KAAKd,OAAOe,OAAO,EAAE;QAC1C,MAAM,IAAInB,YAAY,+CAA+C,yBAAyB;YAC5Fc,QAAQ;QACV;IACF;IAEA,IAAIC,KAAKD,MAAM,KAAK,WAAW;QAC7B,MAAM,IAAId,YAAY,uBAAuB,oBAAoB;YAACc,QAAQ;QAAG;IAC/E;IAEA,OAAO;QACLT;QACAU;QACAK,aAAaH,MAAMG,WAAW;QAC9BC,WAAWJ,MAAMI,SAAS;QAC1BC,kBAAkBL,MAAMK,gBAAgB;IAC1C;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-runs.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/list-runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAYjF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,oBAAoB,mDAmE3D"}
1
+ {"version":3,"file":"list-runs.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/list-runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAYjF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,oBAAoB,mDAwE3D"}
@@ -2,8 +2,8 @@ import { workflowRunListQuerySchema, workflowRunListResponseSchema } from '@ship
2
2
  import { decodeTimestampIdCursor, encodeTimestampIdCursor } from '@shipfox/node-drizzle';
3
3
  import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
4
  import { logger } from '@shipfox/node-opentelemetry';
5
- import { listWorkflowRuns } from '#db/index.js';
6
- import { toRunDto } from '#presentation/dto/index.js';
5
+ import { listWorkflowRunJobSummaries, listWorkflowRuns } from '#db/index.js';
6
+ import { toRunListItemDto } from '#presentation/dto/index.js';
7
7
  import { requireProjectAccess } from './project-access.js';
8
8
  export function listRunsRoute(projects) {
9
9
  return defineRoute({
@@ -40,6 +40,12 @@ export function listRunsRoute(projects) {
40
40
  filters,
41
41
  includeTotal: !decodedCursor
42
42
  });
43
+ // Paired with the attempt this read returned, so a re-run landing mid-request cannot
44
+ // pair one attempt's metadata with another's jobs.
45
+ const jobsByRun = await listWorkflowRunJobSummaries(result.runs.map((run)=>({
46
+ id: run.id,
47
+ currentAttempt: run.currentAttempt
48
+ })));
43
49
  logger().info({
44
50
  projectId: project.id,
45
51
  filterKeys: Object.entries(filters).filter(([, value])=>value !== undefined).map(([key])=>key),
@@ -50,7 +56,7 @@ export function listRunsRoute(projects) {
50
56
  durationMs: Math.round(performance.now() - startedAt)
51
57
  }, 'Listed workflow runs');
52
58
  return {
53
- runs: result.runs.map((run)=>toRunDto(run)),
59
+ runs: result.runs.map((run)=>toRunListItemDto(run, jobsByRun.get(run.id))),
54
60
  next_cursor: result.nextCursor ? encodeTimestampIdCursor(result.nextCursor) : null,
55
61
  filtered_total_count: result.filteredTotalCount
56
62
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/list-runs.ts"],"sourcesContent":["import type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport {\n workflowRunListQuerySchema,\n workflowRunListResponseSchema,\n} from '@shipfox/api-workflows-dto';\nimport {decodeTimestampIdCursor, encodeTimestampIdCursor} from '@shipfox/node-drizzle';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {listWorkflowRuns} from '#db/index.js';\nimport {toRunDto} from '#presentation/dto/index.js';\nimport {requireProjectAccess} from './project-access.js';\n\nexport function listRunsRoute(projects: ProjectsModuleClient) {\n return defineRoute({\n method: 'GET',\n path: '/',\n description: 'List workflow runs for a project',\n schema: {\n querystring: workflowRunListQuerySchema,\n response: {\n 200: workflowRunListResponseSchema,\n },\n },\n handler: async (request) => {\n const startedAt = performance.now();\n const {\n project_id: projectId,\n limit,\n cursor,\n status,\n definition_id: definitionId,\n trigger_source: triggerSource,\n created_from: createdFrom,\n created_to: createdTo,\n } = request.query;\n const decodedCursor = decodeTimestampIdCursor(cursor);\n if (cursor && !decodedCursor) {\n throw new ClientError('Invalid cursor', 'invalid-cursor', {status: 400});\n }\n\n const project = await requireProjectAccess(request, projectId, projects);\n\n const filters = {\n status,\n definitionId,\n triggerSource,\n createdFrom: createdFrom ? new Date(createdFrom) : undefined,\n createdTo: createdTo ? new Date(createdTo) : undefined,\n };\n const result = await listWorkflowRuns({\n projectId: project.id,\n limit,\n cursor: decodedCursor,\n filters,\n includeTotal: !decodedCursor,\n });\n\n logger().info(\n {\n projectId: project.id,\n filterKeys: Object.entries(filters)\n .filter(([, value]) => value !== undefined)\n .map(([key]) => key),\n limit,\n cursorPresent: Boolean(cursor),\n resultCount: result.runs.length,\n nextCursorPresent: Boolean(result.nextCursor),\n durationMs: Math.round(performance.now() - startedAt),\n },\n 'Listed workflow runs',\n );\n\n return {\n runs: result.runs.map((run) => toRunDto(run)),\n next_cursor: result.nextCursor ? encodeTimestampIdCursor(result.nextCursor) : null,\n filtered_total_count: result.filteredTotalCount,\n };\n },\n });\n}\n"],"names":["workflowRunListQuerySchema","workflowRunListResponseSchema","decodeTimestampIdCursor","encodeTimestampIdCursor","ClientError","defineRoute","logger","listWorkflowRuns","toRunDto","requireProjectAccess","listRunsRoute","projects","method","path","description","schema","querystring","response","handler","request","startedAt","performance","now","project_id","projectId","limit","cursor","status","definition_id","definitionId","trigger_source","triggerSource","created_from","createdFrom","created_to","createdTo","query","decodedCursor","project","filters","Date","undefined","result","id","includeTotal","info","filterKeys","Object","entries","filter","value","map","key","cursorPresent","Boolean","resultCount","runs","length","nextCursorPresent","nextCursor","durationMs","Math","round","run","next_cursor","filtered_total_count","filteredTotalCount"],"mappings":"AACA,SACEA,0BAA0B,EAC1BC,6BAA6B,QACxB,6BAA6B;AACpC,SAAQC,uBAAuB,EAAEC,uBAAuB,QAAO,wBAAwB;AACvF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,MAAM,QAAO,8BAA8B;AACnD,SAAQC,gBAAgB,QAAO,eAAe;AAC9C,SAAQC,QAAQ,QAAO,6BAA6B;AACpD,SAAQC,oBAAoB,QAAO,sBAAsB;AAEzD,OAAO,SAASC,cAAcC,QAA8B;IAC1D,OAAON,YAAY;QACjBO,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,aAAahB;YACbiB,UAAU;gBACR,KAAKhB;YACP;QACF;QACAiB,SAAS,OAAOC;YACd,MAAMC,YAAYC,YAAYC,GAAG;YACjC,MAAM,EACJC,YAAYC,SAAS,EACrBC,KAAK,EACLC,MAAM,EACNC,MAAM,EACNC,eAAeC,YAAY,EAC3BC,gBAAgBC,aAAa,EAC7BC,cAAcC,WAAW,EACzBC,YAAYC,SAAS,EACtB,GAAGhB,QAAQiB,KAAK;YACjB,MAAMC,gBAAgBnC,wBAAwBwB;YAC9C,IAAIA,UAAU,CAACW,eAAe;gBAC5B,MAAM,IAAIjC,YAAY,kBAAkB,kBAAkB;oBAACuB,QAAQ;gBAAG;YACxE;YAEA,MAAMW,UAAU,MAAM7B,qBAAqBU,SAASK,WAAWb;YAE/D,MAAM4B,UAAU;gBACdZ;gBACAE;gBACAE;gBACAE,aAAaA,cAAc,IAAIO,KAAKP,eAAeQ;gBACnDN,WAAWA,YAAY,IAAIK,KAAKL,aAAaM;YAC/C;YACA,MAAMC,SAAS,MAAMnC,iBAAiB;gBACpCiB,WAAWc,QAAQK,EAAE;gBACrBlB;gBACAC,QAAQW;gBACRE;gBACAK,cAAc,CAACP;YACjB;YAEA/B,SAASuC,IAAI,CACX;gBACErB,WAAWc,QAAQK,EAAE;gBACrBG,YAAYC,OAAOC,OAAO,CAACT,SACxBU,MAAM,CAAC,CAAC,GAAGC,MAAM,GAAKA,UAAUT,WAChCU,GAAG,CAAC,CAAC,CAACC,IAAI,GAAKA;gBAClB3B;gBACA4B,eAAeC,QAAQ5B;gBACvB6B,aAAab,OAAOc,IAAI,CAACC,MAAM;gBAC/BC,mBAAmBJ,QAAQZ,OAAOiB,UAAU;gBAC5CC,YAAYC,KAAKC,KAAK,CAACzC,YAAYC,GAAG,KAAKF;YAC7C,GACA;YAGF,OAAO;gBACLoC,MAAMd,OAAOc,IAAI,CAACL,GAAG,CAAC,CAACY,MAAQvD,SAASuD;gBACxCC,aAAatB,OAAOiB,UAAU,GAAGxD,wBAAwBuC,OAAOiB,UAAU,IAAI;gBAC9EM,sBAAsBvB,OAAOwB,kBAAkB;YACjD;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/list-runs.ts"],"sourcesContent":["import type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport {\n workflowRunListQuerySchema,\n workflowRunListResponseSchema,\n} from '@shipfox/api-workflows-dto';\nimport {decodeTimestampIdCursor, encodeTimestampIdCursor} from '@shipfox/node-drizzle';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {listWorkflowRunJobSummaries, listWorkflowRuns} from '#db/index.js';\nimport {toRunListItemDto} from '#presentation/dto/index.js';\nimport {requireProjectAccess} from './project-access.js';\n\nexport function listRunsRoute(projects: ProjectsModuleClient) {\n return defineRoute({\n method: 'GET',\n path: '/',\n description: 'List workflow runs for a project',\n schema: {\n querystring: workflowRunListQuerySchema,\n response: {\n 200: workflowRunListResponseSchema,\n },\n },\n handler: async (request) => {\n const startedAt = performance.now();\n const {\n project_id: projectId,\n limit,\n cursor,\n status,\n definition_id: definitionId,\n trigger_source: triggerSource,\n created_from: createdFrom,\n created_to: createdTo,\n } = request.query;\n const decodedCursor = decodeTimestampIdCursor(cursor);\n if (cursor && !decodedCursor) {\n throw new ClientError('Invalid cursor', 'invalid-cursor', {status: 400});\n }\n\n const project = await requireProjectAccess(request, projectId, projects);\n\n const filters = {\n status,\n definitionId,\n triggerSource,\n createdFrom: createdFrom ? new Date(createdFrom) : undefined,\n createdTo: createdTo ? new Date(createdTo) : undefined,\n };\n const result = await listWorkflowRuns({\n projectId: project.id,\n limit,\n cursor: decodedCursor,\n filters,\n includeTotal: !decodedCursor,\n });\n // Paired with the attempt this read returned, so a re-run landing mid-request cannot\n // pair one attempt's metadata with another's jobs.\n const jobsByRun = await listWorkflowRunJobSummaries(\n result.runs.map((run) => ({id: run.id, currentAttempt: run.currentAttempt})),\n );\n\n logger().info(\n {\n projectId: project.id,\n filterKeys: Object.entries(filters)\n .filter(([, value]) => value !== undefined)\n .map(([key]) => key),\n limit,\n cursorPresent: Boolean(cursor),\n resultCount: result.runs.length,\n nextCursorPresent: Boolean(result.nextCursor),\n durationMs: Math.round(performance.now() - startedAt),\n },\n 'Listed workflow runs',\n );\n\n return {\n runs: result.runs.map((run) => toRunListItemDto(run, jobsByRun.get(run.id))),\n next_cursor: result.nextCursor ? encodeTimestampIdCursor(result.nextCursor) : null,\n filtered_total_count: result.filteredTotalCount,\n };\n },\n });\n}\n"],"names":["workflowRunListQuerySchema","workflowRunListResponseSchema","decodeTimestampIdCursor","encodeTimestampIdCursor","ClientError","defineRoute","logger","listWorkflowRunJobSummaries","listWorkflowRuns","toRunListItemDto","requireProjectAccess","listRunsRoute","projects","method","path","description","schema","querystring","response","handler","request","startedAt","performance","now","project_id","projectId","limit","cursor","status","definition_id","definitionId","trigger_source","triggerSource","created_from","createdFrom","created_to","createdTo","query","decodedCursor","project","filters","Date","undefined","result","id","includeTotal","jobsByRun","runs","map","run","currentAttempt","info","filterKeys","Object","entries","filter","value","key","cursorPresent","Boolean","resultCount","length","nextCursorPresent","nextCursor","durationMs","Math","round","get","next_cursor","filtered_total_count","filteredTotalCount"],"mappings":"AACA,SACEA,0BAA0B,EAC1BC,6BAA6B,QACxB,6BAA6B;AACpC,SAAQC,uBAAuB,EAAEC,uBAAuB,QAAO,wBAAwB;AACvF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,MAAM,QAAO,8BAA8B;AACnD,SAAQC,2BAA2B,EAAEC,gBAAgB,QAAO,eAAe;AAC3E,SAAQC,gBAAgB,QAAO,6BAA6B;AAC5D,SAAQC,oBAAoB,QAAO,sBAAsB;AAEzD,OAAO,SAASC,cAAcC,QAA8B;IAC1D,OAAOP,YAAY;QACjBQ,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,aAAajB;YACbkB,UAAU;gBACR,KAAKjB;YACP;QACF;QACAkB,SAAS,OAAOC;YACd,MAAMC,YAAYC,YAAYC,GAAG;YACjC,MAAM,EACJC,YAAYC,SAAS,EACrBC,KAAK,EACLC,MAAM,EACNC,MAAM,EACNC,eAAeC,YAAY,EAC3BC,gBAAgBC,aAAa,EAC7BC,cAAcC,WAAW,EACzBC,YAAYC,SAAS,EACtB,GAAGhB,QAAQiB,KAAK;YACjB,MAAMC,gBAAgBpC,wBAAwByB;YAC9C,IAAIA,UAAU,CAACW,eAAe;gBAC5B,MAAM,IAAIlC,YAAY,kBAAkB,kBAAkB;oBAACwB,QAAQ;gBAAG;YACxE;YAEA,MAAMW,UAAU,MAAM7B,qBAAqBU,SAASK,WAAWb;YAE/D,MAAM4B,UAAU;gBACdZ;gBACAE;gBACAE;gBACAE,aAAaA,cAAc,IAAIO,KAAKP,eAAeQ;gBACnDN,WAAWA,YAAY,IAAIK,KAAKL,aAAaM;YAC/C;YACA,MAAMC,SAAS,MAAMnC,iBAAiB;gBACpCiB,WAAWc,QAAQK,EAAE;gBACrBlB;gBACAC,QAAQW;gBACRE;gBACAK,cAAc,CAACP;YACjB;YACA,qFAAqF;YACrF,mDAAmD;YACnD,MAAMQ,YAAY,MAAMvC,4BACtBoC,OAAOI,IAAI,CAACC,GAAG,CAAC,CAACC,MAAS,CAAA;oBAACL,IAAIK,IAAIL,EAAE;oBAAEM,gBAAgBD,IAAIC,cAAc;gBAAA,CAAA;YAG3E5C,SAAS6C,IAAI,CACX;gBACE1B,WAAWc,QAAQK,EAAE;gBACrBQ,YAAYC,OAAOC,OAAO,CAACd,SACxBe,MAAM,CAAC,CAAC,GAAGC,MAAM,GAAKA,UAAUd,WAChCM,GAAG,CAAC,CAAC,CAACS,IAAI,GAAKA;gBAClB/B;gBACAgC,eAAeC,QAAQhC;gBACvBiC,aAAajB,OAAOI,IAAI,CAACc,MAAM;gBAC/BC,mBAAmBH,QAAQhB,OAAOoB,UAAU;gBAC5CC,YAAYC,KAAKC,KAAK,CAAC5C,YAAYC,GAAG,KAAKF;YAC7C,GACA;YAGF,OAAO;gBACL0B,MAAMJ,OAAOI,IAAI,CAACC,GAAG,CAAC,CAACC,MAAQxC,iBAAiBwC,KAAKH,UAAUqB,GAAG,CAAClB,IAAIL,EAAE;gBACzEwB,aAAazB,OAAOoB,UAAU,GAAG5D,wBAAwBwC,OAAOoB,UAAU,IAAI;gBAC9EM,sBAAsB1B,OAAO2B,kBAAkB;YACjD;QACF;IACF;AACF"}
@@ -6,5 +6,6 @@ export declare function requireProjectAccess(request: FastifyRequest, projectId:
6
6
  sourceConnectionId: string;
7
7
  sourceExternalRepositoryId: string;
8
8
  name: string;
9
+ sourceRepositoryOwner?: string | null | undefined;
9
10
  }>;
10
11
  //# sourceMappingURL=project-access.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-access.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/project-access.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAEjF,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAE5C,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,oBAAoB;;;;;;GAO/B"}
1
+ {"version":3,"file":"project-access.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/project-access.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAEjF,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAE5C,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,oBAAoB;;;;;;;GAO/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"report-step.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/report-step.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAQpF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,mDAqDtE"}
1
+ {"version":3,"file":"report-step.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/report-step.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAQpF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,mDA6DtE"}
@@ -9,7 +9,7 @@ export function createReportStepRoute(runners) {
9
9
  return defineRoute({
10
10
  method: 'POST',
11
11
  path: '/steps/:stepId/report',
12
- description: 'Reports whether a step succeeded or failed. The job is identified by the access token. Reporting the same step more than once is safe: once a step has finished, later reports for it are ignored. The runner does not call a separate job-completion endpoint finalization is driven server-side from the recorded step results, and the `cancel` flag tells the runner to stop once the job has finished without full success.',
12
+ description: 'Reports whether a step succeeded or failed. The job is identified by the access token. Reporting the same step more than once is safe: once a step has finished, later reports for it are ignored. The runner does not call a separate job-completion endpoint: finalization is driven server-side from the recorded step results, and the `cancel` flag tells the runner to stop once the job has finished without full success.',
13
13
  schema: {
14
14
  params: z.object({
15
15
  stepId: z.string().uuid()
@@ -50,12 +50,19 @@ export function createReportStepRoute(runners) {
50
50
  status: 404
51
51
  });
52
52
  }
53
+ // Checkout is a reserved system field on the report wire contract. Keep
54
+ // it out of the runner's user output merge until this persistence
55
+ // boundary, where the system value has explicit precedence.
56
+ const output = request.body.checkout === undefined ? request.body.output ?? null : {
57
+ ...request.body.output ?? {},
58
+ checkout: request.body.checkout
59
+ };
53
60
  const outcome = await recordStepResult({
54
61
  jobExecutionId: leasedJob.jobExecutionId,
55
62
  stepId,
56
63
  status: request.body.status,
57
64
  error: fromStepErrorDto(request.body.error),
58
- output: request.body.output ?? null,
65
+ output,
59
66
  response: request.body.response ?? null,
60
67
  exitCode: request.body.exit_code ?? request.body.error?.exit_code ?? null,
61
68
  logOutcome: request.body.log_outcome,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/report-step.ts"],"sourcesContent":["import {requireLeasedJobContext} from '@shipfox/api-auth-context';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport {reportStepBodySchema, reportStepResponseSchema} from '@shipfox/api-workflows-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {StepAttemptAheadError, StepNotFoundError, StepNotRunningError} from '#core/errors.js';\nimport {recordStepResult} from '#core/job-execution.js';\nimport {fromStepErrorDto} from '#presentation/dto/step.js';\n\nexport function createReportStepRoute(runners: RunnersInterModuleClient) {\n return defineRoute({\n method: 'POST',\n path: '/steps/:stepId/report',\n description:\n 'Reports whether a step succeeded or failed. The job is identified by the access token. Reporting the same step more than once is safe: once a step has finished, later reports for it are ignored. The runner does not call a separate job-completion endpoint finalization is driven server-side from the recorded step results, and the `cancel` flag tells the runner to stop once the job has finished without full success.',\n schema: {\n params: z.object({stepId: z.string().uuid()}),\n body: reportStepBodySchema,\n response: {\n 200: reportStepResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof StepNotFoundError) {\n throw new ClientError(error.message, 'step-not-found', {status: 404});\n }\n if (error instanceof StepNotRunningError) {\n throw new ClientError(error.message, 'step-not-running', {status: 409});\n }\n if (error instanceof StepAttemptAheadError) {\n throw new ClientError(error.message, 'step-attempt-ahead', {status: 409});\n }\n throw error;\n },\n handler: async (request) => {\n const {stepId} = request.params;\n const leasedJob = requireLeasedJobContext(request);\n\n const {active: leaseIsActive} = await runners.getLeaseState({\n jobId: leasedJob.jobId,\n jobExecutionId: leasedJob.jobExecutionId,\n runnerSessionId: leasedJob.runnerSessionId,\n });\n if (!leaseIsActive) {\n throw new ClientError('Job lease is no longer active', 'lease-not-active', {status: 404});\n }\n\n const outcome = await recordStepResult({\n jobExecutionId: leasedJob.jobExecutionId,\n stepId,\n status: request.body.status,\n error: fromStepErrorDto(request.body.error),\n output: request.body.output ?? null,\n response: request.body.response ?? null,\n exitCode: request.body.exit_code ?? request.body.error?.exit_code ?? null,\n logOutcome: request.body.log_outcome,\n ...(request.body.attempt !== undefined ? {attempt: request.body.attempt} : {}),\n });\n\n return {ok: true, cancel: outcome.jobFinished && outcome.status === 'failed'};\n },\n });\n}\n"],"names":["requireLeasedJobContext","reportStepBodySchema","reportStepResponseSchema","ClientError","defineRoute","z","StepAttemptAheadError","StepNotFoundError","StepNotRunningError","recordStepResult","fromStepErrorDto","createReportStepRoute","runners","method","path","description","schema","params","object","stepId","string","uuid","body","response","errorHandler","error","message","status","handler","request","leasedJob","active","leaseIsActive","getLeaseState","jobId","jobExecutionId","runnerSessionId","outcome","output","exitCode","exit_code","logOutcome","log_outcome","attempt","undefined","ok","cancel","jobFinished"],"mappings":"AAAA,SAAQA,uBAAuB,QAAO,4BAA4B;AAElE,SAAQC,oBAAoB,EAAEC,wBAAwB,QAAO,6BAA6B;AAC1F,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,qBAAqB,EAAEC,iBAAiB,EAAEC,mBAAmB,QAAO,kBAAkB;AAC9F,SAAQC,gBAAgB,QAAO,yBAAyB;AACxD,SAAQC,gBAAgB,QAAO,4BAA4B;AAE3D,OAAO,SAASC,sBAAsBC,OAAiC;IACrE,OAAOR,YAAY;QACjBS,QAAQ;QACRC,MAAM;QACNC,aACE;QACFC,QAAQ;YACNC,QAAQZ,EAAEa,MAAM,CAAC;gBAACC,QAAQd,EAAEe,MAAM,GAAGC,IAAI;YAAE;YAC3CC,MAAMrB;YACNsB,UAAU;gBACR,KAAKrB;YACP;QACF;QACAsB,cAAc,CAACC;YACb,IAAIA,iBAAiBlB,mBAAmB;gBACtC,MAAM,IAAIJ,YAAYsB,MAAMC,OAAO,EAAE,kBAAkB;oBAACC,QAAQ;gBAAG;YACrE;YACA,IAAIF,iBAAiBjB,qBAAqB;gBACxC,MAAM,IAAIL,YAAYsB,MAAMC,OAAO,EAAE,oBAAoB;oBAACC,QAAQ;gBAAG;YACvE;YACA,IAAIF,iBAAiBnB,uBAAuB;gBAC1C,MAAM,IAAIH,YAAYsB,MAAMC,OAAO,EAAE,sBAAsB;oBAACC,QAAQ;gBAAG;YACzE;YACA,MAAMF;QACR;QACAG,SAAS,OAAOC;YACd,MAAM,EAACV,MAAM,EAAC,GAAGU,QAAQZ,MAAM;YAC/B,MAAMa,YAAY9B,wBAAwB6B;YAE1C,MAAM,EAACE,QAAQC,aAAa,EAAC,GAAG,MAAMpB,QAAQqB,aAAa,CAAC;gBAC1DC,OAAOJ,UAAUI,KAAK;gBACtBC,gBAAgBL,UAAUK,cAAc;gBACxCC,iBAAiBN,UAAUM,eAAe;YAC5C;YACA,IAAI,CAACJ,eAAe;gBAClB,MAAM,IAAI7B,YAAY,iCAAiC,oBAAoB;oBAACwB,QAAQ;gBAAG;YACzF;YAEA,MAAMU,UAAU,MAAM5B,iBAAiB;gBACrC0B,gBAAgBL,UAAUK,cAAc;gBACxChB;gBACAQ,QAAQE,QAAQP,IAAI,CAACK,MAAM;gBAC3BF,OAAOf,iBAAiBmB,QAAQP,IAAI,CAACG,KAAK;gBAC1Ca,QAAQT,QAAQP,IAAI,CAACgB,MAAM,IAAI;gBAC/Bf,UAAUM,QAAQP,IAAI,CAACC,QAAQ,IAAI;gBACnCgB,UAAUV,QAAQP,IAAI,CAACkB,SAAS,IAAIX,QAAQP,IAAI,CAACG,KAAK,EAAEe,aAAa;gBACrEC,YAAYZ,QAAQP,IAAI,CAACoB,WAAW;gBACpC,GAAIb,QAAQP,IAAI,CAACqB,OAAO,KAAKC,YAAY;oBAACD,SAASd,QAAQP,IAAI,CAACqB,OAAO;gBAAA,IAAI,CAAC,CAAC;YAC/E;YAEA,OAAO;gBAACE,IAAI;gBAAMC,QAAQT,QAAQU,WAAW,IAAIV,QAAQV,MAAM,KAAK;YAAQ;QAC9E;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/report-step.ts"],"sourcesContent":["import {requireLeasedJobContext} from '@shipfox/api-auth-context';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport {reportStepBodySchema, reportStepResponseSchema} from '@shipfox/api-workflows-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {StepAttemptAheadError, StepNotFoundError, StepNotRunningError} from '#core/errors.js';\nimport {recordStepResult} from '#core/job-execution.js';\nimport {fromStepErrorDto} from '#presentation/dto/step.js';\n\nexport function createReportStepRoute(runners: RunnersInterModuleClient) {\n return defineRoute({\n method: 'POST',\n path: '/steps/:stepId/report',\n description:\n 'Reports whether a step succeeded or failed. The job is identified by the access token. Reporting the same step more than once is safe: once a step has finished, later reports for it are ignored. The runner does not call a separate job-completion endpoint: finalization is driven server-side from the recorded step results, and the `cancel` flag tells the runner to stop once the job has finished without full success.',\n schema: {\n params: z.object({stepId: z.string().uuid()}),\n body: reportStepBodySchema,\n response: {\n 200: reportStepResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof StepNotFoundError) {\n throw new ClientError(error.message, 'step-not-found', {status: 404});\n }\n if (error instanceof StepNotRunningError) {\n throw new ClientError(error.message, 'step-not-running', {status: 409});\n }\n if (error instanceof StepAttemptAheadError) {\n throw new ClientError(error.message, 'step-attempt-ahead', {status: 409});\n }\n throw error;\n },\n handler: async (request) => {\n const {stepId} = request.params;\n const leasedJob = requireLeasedJobContext(request);\n\n const {active: leaseIsActive} = await runners.getLeaseState({\n jobId: leasedJob.jobId,\n jobExecutionId: leasedJob.jobExecutionId,\n runnerSessionId: leasedJob.runnerSessionId,\n });\n if (!leaseIsActive) {\n throw new ClientError('Job lease is no longer active', 'lease-not-active', {status: 404});\n }\n\n // Checkout is a reserved system field on the report wire contract. Keep\n // it out of the runner's user output merge until this persistence\n // boundary, where the system value has explicit precedence.\n const output =\n request.body.checkout === undefined\n ? (request.body.output ?? null)\n : {...(request.body.output ?? {}), checkout: request.body.checkout};\n\n const outcome = await recordStepResult({\n jobExecutionId: leasedJob.jobExecutionId,\n stepId,\n status: request.body.status,\n error: fromStepErrorDto(request.body.error),\n output,\n response: request.body.response ?? null,\n exitCode: request.body.exit_code ?? request.body.error?.exit_code ?? null,\n logOutcome: request.body.log_outcome,\n ...(request.body.attempt !== undefined ? {attempt: request.body.attempt} : {}),\n });\n\n return {ok: true, cancel: outcome.jobFinished && outcome.status === 'failed'};\n },\n });\n}\n"],"names":["requireLeasedJobContext","reportStepBodySchema","reportStepResponseSchema","ClientError","defineRoute","z","StepAttemptAheadError","StepNotFoundError","StepNotRunningError","recordStepResult","fromStepErrorDto","createReportStepRoute","runners","method","path","description","schema","params","object","stepId","string","uuid","body","response","errorHandler","error","message","status","handler","request","leasedJob","active","leaseIsActive","getLeaseState","jobId","jobExecutionId","runnerSessionId","output","checkout","undefined","outcome","exitCode","exit_code","logOutcome","log_outcome","attempt","ok","cancel","jobFinished"],"mappings":"AAAA,SAAQA,uBAAuB,QAAO,4BAA4B;AAElE,SAAQC,oBAAoB,EAAEC,wBAAwB,QAAO,6BAA6B;AAC1F,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,qBAAqB,EAAEC,iBAAiB,EAAEC,mBAAmB,QAAO,kBAAkB;AAC9F,SAAQC,gBAAgB,QAAO,yBAAyB;AACxD,SAAQC,gBAAgB,QAAO,4BAA4B;AAE3D,OAAO,SAASC,sBAAsBC,OAAiC;IACrE,OAAOR,YAAY;QACjBS,QAAQ;QACRC,MAAM;QACNC,aACE;QACFC,QAAQ;YACNC,QAAQZ,EAAEa,MAAM,CAAC;gBAACC,QAAQd,EAAEe,MAAM,GAAGC,IAAI;YAAE;YAC3CC,MAAMrB;YACNsB,UAAU;gBACR,KAAKrB;YACP;QACF;QACAsB,cAAc,CAACC;YACb,IAAIA,iBAAiBlB,mBAAmB;gBACtC,MAAM,IAAIJ,YAAYsB,MAAMC,OAAO,EAAE,kBAAkB;oBAACC,QAAQ;gBAAG;YACrE;YACA,IAAIF,iBAAiBjB,qBAAqB;gBACxC,MAAM,IAAIL,YAAYsB,MAAMC,OAAO,EAAE,oBAAoB;oBAACC,QAAQ;gBAAG;YACvE;YACA,IAAIF,iBAAiBnB,uBAAuB;gBAC1C,MAAM,IAAIH,YAAYsB,MAAMC,OAAO,EAAE,sBAAsB;oBAACC,QAAQ;gBAAG;YACzE;YACA,MAAMF;QACR;QACAG,SAAS,OAAOC;YACd,MAAM,EAACV,MAAM,EAAC,GAAGU,QAAQZ,MAAM;YAC/B,MAAMa,YAAY9B,wBAAwB6B;YAE1C,MAAM,EAACE,QAAQC,aAAa,EAAC,GAAG,MAAMpB,QAAQqB,aAAa,CAAC;gBAC1DC,OAAOJ,UAAUI,KAAK;gBACtBC,gBAAgBL,UAAUK,cAAc;gBACxCC,iBAAiBN,UAAUM,eAAe;YAC5C;YACA,IAAI,CAACJ,eAAe;gBAClB,MAAM,IAAI7B,YAAY,iCAAiC,oBAAoB;oBAACwB,QAAQ;gBAAG;YACzF;YAEA,wEAAwE;YACxE,kEAAkE;YAClE,4DAA4D;YAC5D,MAAMU,SACJR,QAAQP,IAAI,CAACgB,QAAQ,KAAKC,YACrBV,QAAQP,IAAI,CAACe,MAAM,IAAI,OACxB;gBAAC,GAAIR,QAAQP,IAAI,CAACe,MAAM,IAAI,CAAC,CAAC;gBAAGC,UAAUT,QAAQP,IAAI,CAACgB,QAAQ;YAAA;YAEtE,MAAME,UAAU,MAAM/B,iBAAiB;gBACrC0B,gBAAgBL,UAAUK,cAAc;gBACxChB;gBACAQ,QAAQE,QAAQP,IAAI,CAACK,MAAM;gBAC3BF,OAAOf,iBAAiBmB,QAAQP,IAAI,CAACG,KAAK;gBAC1CY;gBACAd,UAAUM,QAAQP,IAAI,CAACC,QAAQ,IAAI;gBACnCkB,UAAUZ,QAAQP,IAAI,CAACoB,SAAS,IAAIb,QAAQP,IAAI,CAACG,KAAK,EAAEiB,aAAa;gBACrEC,YAAYd,QAAQP,IAAI,CAACsB,WAAW;gBACpC,GAAIf,QAAQP,IAAI,CAACuB,OAAO,KAAKN,YAAY;oBAACM,SAAShB,QAAQP,IAAI,CAACuB,OAAO;gBAAA,IAAI,CAAC,CAAC;YAC/E;YAEA,OAAO;gBAACC,IAAI;gBAAMC,QAAQP,QAAQQ,WAAW,IAAIR,QAAQb,MAAM,KAAK;YAAQ;QAC9E;IACF;AACF"}
@@ -5,7 +5,7 @@ import { isWorkflowNotFound } from '#temporal/workflow-not-found.js';
5
5
  // Per-step execution finishes a job inside recordStepResult (no runner /complete
6
6
  // call), which enqueues WORKFLOWS_JOB_STEPS_SETTLED in the same transaction. The
7
7
  // persisted per-step projection is already terminal, so the workflow only flips
8
- // the job status no steps are carried.
8
+ // the job status: no steps are carried.
9
9
  export async function onJobStepsSettled(payload) {
10
10
  logger().info({
11
11
  jobId: payload.jobId,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/subscribers/on-job-steps-settled.ts"],"sourcesContent":["import type {WorkflowsJobStepsSettledEventDto} from '@shipfox/api-workflows-dto';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {temporalClient} from '@shipfox/node-temporal';\nimport {JOB_FINISHED_SIGNAL} from '#temporal/constants.js';\nimport {isWorkflowNotFound} from '#temporal/workflow-not-found.js';\n\n// Per-step execution finishes a job inside recordStepResult (no runner /complete\n// call), which enqueues WORKFLOWS_JOB_STEPS_SETTLED in the same transaction. The\n// persisted per-step projection is already terminal, so the workflow only flips\n// the job status no steps are carried.\nexport async function onJobStepsSettled(payload: WorkflowsJobStepsSettledEventDto): Promise<void> {\n logger().info(\n {\n jobId: payload.jobId,\n jobExecutionId: payload.jobExecutionId,\n status: payload.status,\n },\n 'Signaling job finished',\n );\n const handle = temporalClient().workflow.getHandle(`job:${payload.jobId}`);\n try {\n await handle.signal(JOB_FINISHED_SIGNAL, {\n status: payload.status,\n jobExecutionId: payload.jobExecutionId,\n });\n } catch (err) {\n // Workflow already terminated (e.g. timeout path); its status is\n // authoritative, drop this late event.\n if (isWorkflowNotFound(err)) {\n logger().debug(\n {\n jobId: payload.jobId,\n jobExecutionId: payload.jobExecutionId,\n status: payload.status,\n },\n 'Job workflow already terminated; job-finished event discarded',\n );\n return;\n }\n throw err;\n }\n}\n"],"names":["logger","temporalClient","JOB_FINISHED_SIGNAL","isWorkflowNotFound","onJobStepsSettled","payload","info","jobId","jobExecutionId","status","handle","workflow","getHandle","signal","err","debug"],"mappings":"AACA,SAAQA,MAAM,QAAO,8BAA8B;AACnD,SAAQC,cAAc,QAAO,yBAAyB;AACtD,SAAQC,mBAAmB,QAAO,yBAAyB;AAC3D,SAAQC,kBAAkB,QAAO,kCAAkC;AAEnE,iFAAiF;AACjF,iFAAiF;AACjF,gFAAgF;AAChF,yCAAyC;AACzC,OAAO,eAAeC,kBAAkBC,OAAyC;IAC/EL,SAASM,IAAI,CACX;QACEC,OAAOF,QAAQE,KAAK;QACpBC,gBAAgBH,QAAQG,cAAc;QACtCC,QAAQJ,QAAQI,MAAM;IACxB,GACA;IAEF,MAAMC,SAAST,iBAAiBU,QAAQ,CAACC,SAAS,CAAC,CAAC,IAAI,EAAEP,QAAQE,KAAK,EAAE;IACzE,IAAI;QACF,MAAMG,OAAOG,MAAM,CAACX,qBAAqB;YACvCO,QAAQJ,QAAQI,MAAM;YACtBD,gBAAgBH,QAAQG,cAAc;QACxC;IACF,EAAE,OAAOM,KAAK;QACZ,iEAAiE;QACjE,uCAAuC;QACvC,IAAIX,mBAAmBW,MAAM;YAC3Bd,SAASe,KAAK,CACZ;gBACER,OAAOF,QAAQE,KAAK;gBACpBC,gBAAgBH,QAAQG,cAAc;gBACtCC,QAAQJ,QAAQI,MAAM;YACxB,GACA;YAEF;QACF;QACA,MAAMK;IACR;AACF"}
1
+ {"version":3,"sources":["../../../src/presentation/subscribers/on-job-steps-settled.ts"],"sourcesContent":["import type {WorkflowsJobStepsSettledEventDto} from '@shipfox/api-workflows-dto';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {temporalClient} from '@shipfox/node-temporal';\nimport {JOB_FINISHED_SIGNAL} from '#temporal/constants.js';\nimport {isWorkflowNotFound} from '#temporal/workflow-not-found.js';\n\n// Per-step execution finishes a job inside recordStepResult (no runner /complete\n// call), which enqueues WORKFLOWS_JOB_STEPS_SETTLED in the same transaction. The\n// persisted per-step projection is already terminal, so the workflow only flips\n// the job status: no steps are carried.\nexport async function onJobStepsSettled(payload: WorkflowsJobStepsSettledEventDto): Promise<void> {\n logger().info(\n {\n jobId: payload.jobId,\n jobExecutionId: payload.jobExecutionId,\n status: payload.status,\n },\n 'Signaling job finished',\n );\n const handle = temporalClient().workflow.getHandle(`job:${payload.jobId}`);\n try {\n await handle.signal(JOB_FINISHED_SIGNAL, {\n status: payload.status,\n jobExecutionId: payload.jobExecutionId,\n });\n } catch (err) {\n // Workflow already terminated (e.g. timeout path); its status is\n // authoritative, drop this late event.\n if (isWorkflowNotFound(err)) {\n logger().debug(\n {\n jobId: payload.jobId,\n jobExecutionId: payload.jobExecutionId,\n status: payload.status,\n },\n 'Job workflow already terminated; job-finished event discarded',\n );\n return;\n }\n throw err;\n }\n}\n"],"names":["logger","temporalClient","JOB_FINISHED_SIGNAL","isWorkflowNotFound","onJobStepsSettled","payload","info","jobId","jobExecutionId","status","handle","workflow","getHandle","signal","err","debug"],"mappings":"AACA,SAAQA,MAAM,QAAO,8BAA8B;AACnD,SAAQC,cAAc,QAAO,yBAAyB;AACtD,SAAQC,mBAAmB,QAAO,yBAAyB;AAC3D,SAAQC,kBAAkB,QAAO,kCAAkC;AAEnE,iFAAiF;AACjF,iFAAiF;AACjF,gFAAgF;AAChF,wCAAwC;AACxC,OAAO,eAAeC,kBAAkBC,OAAyC;IAC/EL,SAASM,IAAI,CACX;QACEC,OAAOF,QAAQE,KAAK;QACpBC,gBAAgBH,QAAQG,cAAc;QACtCC,QAAQJ,QAAQI,MAAM;IACxB,GACA;IAEF,MAAMC,SAAST,iBAAiBU,QAAQ,CAACC,SAAS,CAAC,CAAC,IAAI,EAAEP,QAAQE,KAAK,EAAE;IACzE,IAAI;QACF,MAAMG,OAAOG,MAAM,CAACX,qBAAqB;YACvCO,QAAQJ,QAAQI,MAAM;YACtBD,gBAAgBH,QAAQG,cAAc;QACxC;IACF,EAAE,OAAOM,KAAK;QACZ,iEAAiE;QACjE,uCAAuC;QACvC,IAAIX,mBAAmBW,MAAM;YAC3Bd,SAASe,KAAK,CACZ;gBACER,OAAOF,QAAQE,KAAK;gBACpBC,gBAAgBH,QAAQG,cAAc;gBACtCC,QAAQJ,QAAQI,MAAM;YACxB,GACA;YAEF;QACF;QACA,MAAMK;IACR;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"on-runner-job-claimed.d.ts","sourceRoot":"","sources":["../../../src/presentation/subscribers/on-runner-job-claimed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,0BAA0B,CAAC;AAQpE,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CActF"}
1
+ {"version":3,"file":"on-runner-job-claimed.d.ts","sourceRoot":"","sources":["../../../src/presentation/subscribers/on-runner-job-claimed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,0BAA0B,CAAC;AAWpE,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCtF"}
@@ -1,5 +1,8 @@
1
1
  import { logger } from '@shipfox/node-opentelemetry';
2
+ import { temporalClient } from '@shipfox/node-temporal';
2
3
  import { recordJobExecutionStartedAt } from '#db/index.js';
4
+ import { JOB_CLAIMED_SIGNAL } from '#temporal/constants.js';
5
+ import { isWorkflowNotFound } from '#temporal/workflow-not-found.js';
3
6
  // Anticorruption layer: the runner reports a `claimed` fact in its own lease-broker
4
7
  // language; the run lifecycle treats the claim as the job's start, so we project it onto
5
8
  // `started_at`. Use the runner-owned claim timestamp, not subscriber time; the DB
@@ -15,6 +18,24 @@ export async function onRunnerJobClaimed(payload) {
15
18
  jobExecutionId: payload.jobExecutionId,
16
19
  startedAt: new Date(payload.claimedAt)
17
20
  });
21
+ const handle = temporalClient().workflow.getHandle(`job:${payload.jobId}`);
22
+ try {
23
+ await handle.signal(JOB_CLAIMED_SIGNAL, {
24
+ jobExecutionId: payload.jobExecutionId,
25
+ claimedAt: payload.claimedAt
26
+ });
27
+ } catch (err) {
28
+ // A terminal execution can race the claim outbox delivery. Its persisted status is
29
+ // authoritative, so discard the signal if Temporal has already closed the workflow.
30
+ if (isWorkflowNotFound(err)) {
31
+ logger().debug({
32
+ jobId: payload.jobId,
33
+ jobExecutionId: payload.jobExecutionId
34
+ }, 'Job workflow already terminated; claim event discarded');
35
+ return;
36
+ }
37
+ throw err;
38
+ }
18
39
  }
19
40
 
20
41
  //# sourceMappingURL=on-runner-job-claimed.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/subscribers/on-runner-job-claimed.ts"],"sourcesContent":["import type {RunnerJobClaimedEvent} from '@shipfox/api-runners-dto';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {recordJobExecutionStartedAt} from '#db/index.js';\n\n// Anticorruption layer: the runner reports a `claimed` fact in its own lease-broker\n// language; the run lifecycle treats the claim as the job's start, so we project it onto\n// `started_at`. Use the runner-owned claim timestamp, not subscriber time; the DB\n// projection is first-write-wins so outbox replay cannot move the run boundary.\nexport async function onRunnerJobClaimed(payload: RunnerJobClaimedEvent): Promise<void> {\n logger().debug(\n {\n workflowRunId: payload.workflowRunId,\n workflowRunAttemptId: payload.workflowRunAttemptId,\n jobId: payload.jobId,\n jobExecutionId: payload.jobExecutionId,\n },\n 'Recording job execution started_at from claim',\n );\n await recordJobExecutionStartedAt({\n jobExecutionId: payload.jobExecutionId,\n startedAt: new Date(payload.claimedAt),\n });\n}\n"],"names":["logger","recordJobExecutionStartedAt","onRunnerJobClaimed","payload","debug","workflowRunId","workflowRunAttemptId","jobId","jobExecutionId","startedAt","Date","claimedAt"],"mappings":"AACA,SAAQA,MAAM,QAAO,8BAA8B;AACnD,SAAQC,2BAA2B,QAAO,eAAe;AAEzD,oFAAoF;AACpF,yFAAyF;AACzF,kFAAkF;AAClF,gFAAgF;AAChF,OAAO,eAAeC,mBAAmBC,OAA8B;IACrEH,SAASI,KAAK,CACZ;QACEC,eAAeF,QAAQE,aAAa;QACpCC,sBAAsBH,QAAQG,oBAAoB;QAClDC,OAAOJ,QAAQI,KAAK;QACpBC,gBAAgBL,QAAQK,cAAc;IACxC,GACA;IAEF,MAAMP,4BAA4B;QAChCO,gBAAgBL,QAAQK,cAAc;QACtCC,WAAW,IAAIC,KAAKP,QAAQQ,SAAS;IACvC;AACF"}
1
+ {"version":3,"sources":["../../../src/presentation/subscribers/on-runner-job-claimed.ts"],"sourcesContent":["import type {RunnerJobClaimedEvent} from '@shipfox/api-runners-dto';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {temporalClient} from '@shipfox/node-temporal';\nimport {recordJobExecutionStartedAt} from '#db/index.js';\nimport {JOB_CLAIMED_SIGNAL} from '#temporal/constants.js';\nimport {isWorkflowNotFound} from '#temporal/workflow-not-found.js';\n\n// Anticorruption layer: the runner reports a `claimed` fact in its own lease-broker\n// language; the run lifecycle treats the claim as the job's start, so we project it onto\n// `started_at`. Use the runner-owned claim timestamp, not subscriber time; the DB\n// projection is first-write-wins so outbox replay cannot move the run boundary.\nexport async function onRunnerJobClaimed(payload: RunnerJobClaimedEvent): Promise<void> {\n logger().debug(\n {\n workflowRunId: payload.workflowRunId,\n workflowRunAttemptId: payload.workflowRunAttemptId,\n jobId: payload.jobId,\n jobExecutionId: payload.jobExecutionId,\n },\n 'Recording job execution started_at from claim',\n );\n await recordJobExecutionStartedAt({\n jobExecutionId: payload.jobExecutionId,\n startedAt: new Date(payload.claimedAt),\n });\n\n const handle = temporalClient().workflow.getHandle(`job:${payload.jobId}`);\n try {\n await handle.signal(JOB_CLAIMED_SIGNAL, {\n jobExecutionId: payload.jobExecutionId,\n claimedAt: payload.claimedAt,\n });\n } catch (err) {\n // A terminal execution can race the claim outbox delivery. Its persisted status is\n // authoritative, so discard the signal if Temporal has already closed the workflow.\n if (isWorkflowNotFound(err)) {\n logger().debug(\n {jobId: payload.jobId, jobExecutionId: payload.jobExecutionId},\n 'Job workflow already terminated; claim event discarded',\n );\n return;\n }\n throw err;\n }\n}\n"],"names":["logger","temporalClient","recordJobExecutionStartedAt","JOB_CLAIMED_SIGNAL","isWorkflowNotFound","onRunnerJobClaimed","payload","debug","workflowRunId","workflowRunAttemptId","jobId","jobExecutionId","startedAt","Date","claimedAt","handle","workflow","getHandle","signal","err"],"mappings":"AACA,SAAQA,MAAM,QAAO,8BAA8B;AACnD,SAAQC,cAAc,QAAO,yBAAyB;AACtD,SAAQC,2BAA2B,QAAO,eAAe;AACzD,SAAQC,kBAAkB,QAAO,yBAAyB;AAC1D,SAAQC,kBAAkB,QAAO,kCAAkC;AAEnE,oFAAoF;AACpF,yFAAyF;AACzF,kFAAkF;AAClF,gFAAgF;AAChF,OAAO,eAAeC,mBAAmBC,OAA8B;IACrEN,SAASO,KAAK,CACZ;QACEC,eAAeF,QAAQE,aAAa;QACpCC,sBAAsBH,QAAQG,oBAAoB;QAClDC,OAAOJ,QAAQI,KAAK;QACpBC,gBAAgBL,QAAQK,cAAc;IACxC,GACA;IAEF,MAAMT,4BAA4B;QAChCS,gBAAgBL,QAAQK,cAAc;QACtCC,WAAW,IAAIC,KAAKP,QAAQQ,SAAS;IACvC;IAEA,MAAMC,SAASd,iBAAiBe,QAAQ,CAACC,SAAS,CAAC,CAAC,IAAI,EAAEX,QAAQI,KAAK,EAAE;IACzE,IAAI;QACF,MAAMK,OAAOG,MAAM,CAACf,oBAAoB;YACtCQ,gBAAgBL,QAAQK,cAAc;YACtCG,WAAWR,QAAQQ,SAAS;QAC9B;IACF,EAAE,OAAOK,KAAK;QACZ,mFAAmF;QACnF,oFAAoF;QACpF,IAAIf,mBAAmBe,MAAM;YAC3BnB,SAASO,KAAK,CACZ;gBAACG,OAAOJ,QAAQI,KAAK;gBAAEC,gBAAgBL,QAAQK,cAAc;YAAA,GAC7D;YAEF;QACF;QACA,MAAMQ;IACR;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/temporal/activities/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EAKnB,8BAA8B,EAC9B,kCAAkC,EAClC,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,mCAAmC,EACnC,0BAA0B,EAC1B,yCAAyC,EACzC,uCAAuC,EACvC,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EACnB,kCAAkC,EACnC,MAAM,+BAA+B,CAAC;AAEvC,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,KAAK,EAAE,sBAAsB,CAAC;IAC9B,YAAY,EAAE,wBAAwB,CAAC;IACvC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;CACpE;;;;4CAKiD,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;yDAOvE,UAAU,CAAC,OAAO,kCAAkC,CAAC,CAAC,CAAC,CAAC;;;;;;;;eAoBgkP,CAAC;;;;;;8DANznP,UAAU,CAAC,OAAO,uCAAuC,CAAC,CAAC,CAAC,CAAC;;;;;;;;EAKlF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/temporal/activities/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AACpF,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EAKnB,8BAA8B,EAC9B,kCAAkC,EAClC,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,mCAAmC,EACnC,0BAA0B,EAC1B,yCAAyC,EACzC,uCAAuC,EACvC,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EACnB,kCAAkC,EACnC,MAAM,+BAA+B,CAAC;AAEvC,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,KAAK,EAAE,sBAAsB,CAAC;IAC9B,YAAY,EAAE,wBAAwB,CAAC;IACvC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;CACpE;;;;4CAKiD,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;yDAOvE,UAAU,CAAC,OAAO,kCAAkC,CAAC,CAAC,CAAC,CAAC;;;;;;;;eAqBumP,CAAC;;;;;;8DANhqP,UAAU,CAAC,OAAO,uCAAuC,CAAC,CAAC,CAAC,CAAC;;;;;;;;EAKlF"}
@@ -15,7 +15,8 @@ export function createOrchestrationActivities(params) {
15
15
  drainListenerEventsActivity: createDrainListenerEventsActivity({
16
16
  agent: params.agent,
17
17
  integrations: params.integrations,
18
- projects: params.projects
18
+ projects: params.projects,
19
+ secrets: params.secrets
19
20
  }),
20
21
  peekListenerBufferActivity,
21
22
  resolveJobListenerActivity,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/temporal/activities/index.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {\n activateJobListenerActivity,\n bulkSetStepStatuses,\n createCancelRunnerJobsActivity,\n createDrainListenerEventsActivity,\n createEnqueueJobExecutionForRunner,\n createReleaseLeaseActivity,\n evaluateJobActivationsActivity,\n failJobExecutionAsTimedOutActivity,\n failRunAsTimedOutActivity,\n loadRunAttemptDag,\n peekListenerBufferActivity,\n recordListenerFiringOutcomeActivity,\n resolveJobListenerActivity,\n resolveJobStatusFromJobExecutionsActivity,\n resolveLeaseExpiredJobExecutionActivity,\n setJobExecutionStatus,\n setJobStatus,\n setRunAttemptStatus,\n settleListenerJobExecutionActivity,\n} from './orchestration-activities.js';\n\nexport function createOrchestrationActivities(params: {\n agent: AgentInterModuleClient;\n integrations: IntegrationsModuleClient;\n projects: ProjectsModuleClient;\n runners: RunnersInterModuleClient;\n secrets: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'>;\n}) {\n return {\n loadRunAttemptDag,\n setRunAttemptStatus,\n setJobStatus,\n setJobExecutionStatus: async (activityParams: Parameters<typeof setJobExecutionStatus>[0]) =>\n await setJobExecutionStatus(activityParams, params.secrets),\n bulkSetStepStatuses,\n cancelRunnerJobsActivity: createCancelRunnerJobsActivity(params.runners),\n enqueueJobExecutionForRunner: createEnqueueJobExecutionForRunner(params.runners),\n evaluateJobActivationsActivity,\n failJobExecutionAsTimedOutActivity: async (\n activityParams: Parameters<typeof failJobExecutionAsTimedOutActivity>[0],\n ) => await failJobExecutionAsTimedOutActivity(activityParams, params.secrets),\n failRunAsTimedOutActivity,\n activateJobListenerActivity,\n drainListenerEventsActivity: createDrainListenerEventsActivity({\n agent: params.agent,\n integrations: params.integrations,\n projects: params.projects,\n }),\n peekListenerBufferActivity,\n resolveJobListenerActivity,\n settleListenerJobExecutionActivity,\n recordListenerFiringOutcomeActivity,\n resolveLeaseExpiredJobExecutionActivity: async (\n activityParams: Parameters<typeof resolveLeaseExpiredJobExecutionActivity>[0],\n ) => await resolveLeaseExpiredJobExecutionActivity(activityParams, params.secrets),\n resolveJobStatusFromJobExecutionsActivity,\n releaseLeaseActivity: createReleaseLeaseActivity(params.runners),\n };\n}\n"],"names":["activateJobListenerActivity","bulkSetStepStatuses","createCancelRunnerJobsActivity","createDrainListenerEventsActivity","createEnqueueJobExecutionForRunner","createReleaseLeaseActivity","evaluateJobActivationsActivity","failJobExecutionAsTimedOutActivity","failRunAsTimedOutActivity","loadRunAttemptDag","peekListenerBufferActivity","recordListenerFiringOutcomeActivity","resolveJobListenerActivity","resolveJobStatusFromJobExecutionsActivity","resolveLeaseExpiredJobExecutionActivity","setJobExecutionStatus","setJobStatus","setRunAttemptStatus","settleListenerJobExecutionActivity","createOrchestrationActivities","params","activityParams","secrets","cancelRunnerJobsActivity","runners","enqueueJobExecutionForRunner","drainListenerEventsActivity","agent","integrations","projects","releaseLeaseActivity"],"mappings":"AAKA,SACEA,2BAA2B,EAC3BC,mBAAmB,EACnBC,8BAA8B,EAC9BC,iCAAiC,EACjCC,kCAAkC,EAClCC,0BAA0B,EAC1BC,8BAA8B,EAC9BC,kCAAkC,EAClCC,yBAAyB,EACzBC,iBAAiB,EACjBC,0BAA0B,EAC1BC,mCAAmC,EACnCC,0BAA0B,EAC1BC,yCAAyC,EACzCC,uCAAuC,EACvCC,qBAAqB,EACrBC,YAAY,EACZC,mBAAmB,EACnBC,kCAAkC,QAC7B,gCAAgC;AAEvC,OAAO,SAASC,8BAA8BC,MAM7C;IACC,OAAO;QACLX;QACAQ;QACAD;QACAD,uBAAuB,OAAOM,iBAC5B,MAAMN,sBAAsBM,gBAAgBD,OAAOE,OAAO;QAC5DrB;QACAsB,0BAA0BrB,+BAA+BkB,OAAOI,OAAO;QACvEC,8BAA8BrB,mCAAmCgB,OAAOI,OAAO;QAC/ElB;QACAC,oCAAoC,OAClCc,iBACG,MAAMd,mCAAmCc,gBAAgBD,OAAOE,OAAO;QAC5Ed;QACAR;QACA0B,6BAA6BvB,kCAAkC;YAC7DwB,OAAOP,OAAOO,KAAK;YACnBC,cAAcR,OAAOQ,YAAY;YACjCC,UAAUT,OAAOS,QAAQ;QAC3B;QACAnB;QACAE;QACAM;QACAP;QACAG,yCAAyC,OACvCO,iBACG,MAAMP,wCAAwCO,gBAAgBD,OAAOE,OAAO;QACjFT;QACAiB,sBAAsBzB,2BAA2Be,OAAOI,OAAO;IACjE;AACF"}
1
+ {"version":3,"sources":["../../../src/temporal/activities/index.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {RunnersInterModuleClient} from '@shipfox/api-runners-dto/inter-module';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {\n activateJobListenerActivity,\n bulkSetStepStatuses,\n createCancelRunnerJobsActivity,\n createDrainListenerEventsActivity,\n createEnqueueJobExecutionForRunner,\n createReleaseLeaseActivity,\n evaluateJobActivationsActivity,\n failJobExecutionAsTimedOutActivity,\n failRunAsTimedOutActivity,\n loadRunAttemptDag,\n peekListenerBufferActivity,\n recordListenerFiringOutcomeActivity,\n resolveJobListenerActivity,\n resolveJobStatusFromJobExecutionsActivity,\n resolveLeaseExpiredJobExecutionActivity,\n setJobExecutionStatus,\n setJobStatus,\n setRunAttemptStatus,\n settleListenerJobExecutionActivity,\n} from './orchestration-activities.js';\n\nexport function createOrchestrationActivities(params: {\n agent: AgentInterModuleClient;\n integrations: IntegrationsModuleClient;\n projects: ProjectsModuleClient;\n runners: RunnersInterModuleClient;\n secrets: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'>;\n}) {\n return {\n loadRunAttemptDag,\n setRunAttemptStatus,\n setJobStatus,\n setJobExecutionStatus: async (activityParams: Parameters<typeof setJobExecutionStatus>[0]) =>\n await setJobExecutionStatus(activityParams, params.secrets),\n bulkSetStepStatuses,\n cancelRunnerJobsActivity: createCancelRunnerJobsActivity(params.runners),\n enqueueJobExecutionForRunner: createEnqueueJobExecutionForRunner(params.runners),\n evaluateJobActivationsActivity,\n failJobExecutionAsTimedOutActivity: async (\n activityParams: Parameters<typeof failJobExecutionAsTimedOutActivity>[0],\n ) => await failJobExecutionAsTimedOutActivity(activityParams, params.secrets),\n failRunAsTimedOutActivity,\n activateJobListenerActivity,\n drainListenerEventsActivity: createDrainListenerEventsActivity({\n agent: params.agent,\n integrations: params.integrations,\n projects: params.projects,\n secrets: params.secrets,\n }),\n peekListenerBufferActivity,\n resolveJobListenerActivity,\n settleListenerJobExecutionActivity,\n recordListenerFiringOutcomeActivity,\n resolveLeaseExpiredJobExecutionActivity: async (\n activityParams: Parameters<typeof resolveLeaseExpiredJobExecutionActivity>[0],\n ) => await resolveLeaseExpiredJobExecutionActivity(activityParams, params.secrets),\n resolveJobStatusFromJobExecutionsActivity,\n releaseLeaseActivity: createReleaseLeaseActivity(params.runners),\n };\n}\n"],"names":["activateJobListenerActivity","bulkSetStepStatuses","createCancelRunnerJobsActivity","createDrainListenerEventsActivity","createEnqueueJobExecutionForRunner","createReleaseLeaseActivity","evaluateJobActivationsActivity","failJobExecutionAsTimedOutActivity","failRunAsTimedOutActivity","loadRunAttemptDag","peekListenerBufferActivity","recordListenerFiringOutcomeActivity","resolveJobListenerActivity","resolveJobStatusFromJobExecutionsActivity","resolveLeaseExpiredJobExecutionActivity","setJobExecutionStatus","setJobStatus","setRunAttemptStatus","settleListenerJobExecutionActivity","createOrchestrationActivities","params","activityParams","secrets","cancelRunnerJobsActivity","runners","enqueueJobExecutionForRunner","drainListenerEventsActivity","agent","integrations","projects","releaseLeaseActivity"],"mappings":"AAKA,SACEA,2BAA2B,EAC3BC,mBAAmB,EACnBC,8BAA8B,EAC9BC,iCAAiC,EACjCC,kCAAkC,EAClCC,0BAA0B,EAC1BC,8BAA8B,EAC9BC,kCAAkC,EAClCC,yBAAyB,EACzBC,iBAAiB,EACjBC,0BAA0B,EAC1BC,mCAAmC,EACnCC,0BAA0B,EAC1BC,yCAAyC,EACzCC,uCAAuC,EACvCC,qBAAqB,EACrBC,YAAY,EACZC,mBAAmB,EACnBC,kCAAkC,QAC7B,gCAAgC;AAEvC,OAAO,SAASC,8BAA8BC,MAM7C;IACC,OAAO;QACLX;QACAQ;QACAD;QACAD,uBAAuB,OAAOM,iBAC5B,MAAMN,sBAAsBM,gBAAgBD,OAAOE,OAAO;QAC5DrB;QACAsB,0BAA0BrB,+BAA+BkB,OAAOI,OAAO;QACvEC,8BAA8BrB,mCAAmCgB,OAAOI,OAAO;QAC/ElB;QACAC,oCAAoC,OAClCc,iBACG,MAAMd,mCAAmCc,gBAAgBD,OAAOE,OAAO;QAC5Ed;QACAR;QACA0B,6BAA6BvB,kCAAkC;YAC7DwB,OAAOP,OAAOO,KAAK;YACnBC,cAAcR,OAAOQ,YAAY;YACjCC,UAAUT,OAAOS,QAAQ;YACzBP,SAASF,OAAOE,OAAO;QACzB;QACAZ;QACAE;QACAM;QACAP;QACAG,yCAAyC,OACvCO,iBACG,MAAMP,wCAAwCO,gBAAgBD,OAAOE,OAAO;QACjFT;QACAiB,sBAAsBzB,2BAA2Be,OAAOI,OAAO;IACjE;AACF"}
@@ -114,6 +114,7 @@ export declare function createDrainListenerEventsActivity(clients: {
114
114
  agent: AgentInterModuleClient;
115
115
  integrations?: IntegrationsModuleClient | undefined;
116
116
  projects?: ProjectsModuleClient | undefined;
117
+ secrets: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'>;
117
118
  }): (params: {
118
119
  jobId: string;
119
120
  expectedSequence: number;
@@ -1 +1 @@
1
- {"version":3,"file":"orchestration-activities.d.ts","sourceRoot":"","sources":["../../../src/temporal/activities/orchestration-activities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAIpF,OAAO,KAAK,EAAC,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAC,6BAA6B,EAAE,UAAU,EAAC,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AAEtE,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACf,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAIL,KAAK,4BAA4B,EAQjC,KAAK,qBAAqB,EAS3B,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,MAAO,SAAQ,cAAc;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAC/B,MAAM,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;IACnD,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkD7E;AAED,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAElC;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAC,CAAC,CAO3D;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAClD,eAAe,CAAC,EAAE,SAAS,6BAA6B,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CAC/E,GAAG,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAC,CAAC,CASnD;AAaD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE;IACN,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;CACnD,EACD,OAAO,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,GAClE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;CAAC,CAAC,CAStE;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC;CACrD,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAED,wBAAsB,uCAAuC,CAC3D,MAAM,EAAE;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAC,EACzD,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,GACjE,OAAO,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAC,CAAC,CAStE;AAKD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,wBAAwB,IAC/B,QAAQ;IAAC,cAAc,EAAE,MAAM,CAAA;CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAG5F;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,wBAAwB,IAC/B,QAAQ;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,KAAG,OAAO,CAAC,IAAI,CAAC,CAkBlB;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,wBAAwB,IAC/B,QAAQ;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAG1F;AAED,wBAAsB,kCAAkC,CACtD,MAAM,EAAE;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAC,EAC/E,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,GACjE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CAQ/B;AAED,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IAAC,YAAY,EAAE,MAAM,CAAA;CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;AAED,wBAAsB,yCAAyC,CAAC,MAAM,EAAE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CAEjE;AAED,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB,6DAEA;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE;IACzD,KAAK,EAAE,sBAAsB,CAAC;IAC9B,YAAY,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC7C,IACmD,QAAQ;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,+DAGF;AAED,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,sDAEvE;AAED,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CAC1B;;;GAEA;AAED,wBAAsB,kCAAkC,CAAC,MAAM,EAAE;IAC/D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;CAChC,iBAEA;AAQD,wBAAgB,mCAAmC,CAAC,MAAM,EAAE;IAC1D,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;CAC/C,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhB"}
1
+ {"version":3,"file":"orchestration-activities.d.ts","sourceRoot":"","sources":["../../../src/temporal/activities/orchestration-activities.ts"],"names":[],"mappings":"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"}