@shipfox/api-workflows 4.0.0 → 6.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 (277) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/CHANGELOG.md +104 -0
  3. package/dist/core/agent-defaults.d.ts +17 -0
  4. package/dist/core/agent-defaults.d.ts.map +1 -0
  5. package/dist/core/agent-defaults.js +21 -0
  6. package/dist/core/agent-defaults.js.map +1 -0
  7. package/dist/core/agent-tool-capability-warning.d.ts +4 -0
  8. package/dist/core/agent-tool-capability-warning.d.ts.map +1 -1
  9. package/dist/core/agent-tool-capability-warning.js +15 -17
  10. package/dist/core/agent-tool-capability-warning.js.map +1 -1
  11. package/dist/core/agent-tools.d.ts +11 -9
  12. package/dist/core/agent-tools.d.ts.map +1 -1
  13. package/dist/core/agent-tools.js +23 -18
  14. package/dist/core/agent-tools.js.map +1 -1
  15. package/dist/core/checkout.d.ts +21 -7
  16. package/dist/core/checkout.d.ts.map +1 -1
  17. package/dist/core/checkout.js +23 -11
  18. package/dist/core/checkout.js.map +1 -1
  19. package/dist/core/entities/workflow-run-attempt.d.ts +1 -1
  20. package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
  21. package/dist/core/entities/workflow-run-attempt.js.map +1 -1
  22. package/dist/core/job-execution.d.ts +3 -1
  23. package/dist/core/job-execution.d.ts.map +1 -1
  24. package/dist/core/job-execution.js +14 -12
  25. package/dist/core/job-execution.js.map +1 -1
  26. package/dist/core/job-transition/derive-job-execution-outputs.d.ts +1 -1
  27. package/dist/core/job-transition/derive-job-execution-outputs.d.ts.map +1 -1
  28. package/dist/core/job-transition/derive-job-execution-outputs.js.map +1 -1
  29. package/dist/core/job-transition/derive-job-success.js +1 -1
  30. package/dist/core/job-transition/derive-job-success.js.map +1 -1
  31. package/dist/core/listener-execution-materialization.d.ts +3 -3
  32. package/dist/core/listener-execution-materialization.d.ts.map +1 -1
  33. package/dist/core/listener-execution-materialization.js +3 -4
  34. package/dist/core/listener-execution-materialization.js.map +1 -1
  35. package/dist/core/run-workflow.d.ts +12 -1
  36. package/dist/core/run-workflow.d.ts.map +1 -1
  37. package/dist/core/run-workflow.js +13 -8
  38. package/dist/core/run-workflow.js.map +1 -1
  39. package/dist/core/step-config/agent.d.ts +8 -8
  40. package/dist/core/step-config/agent.d.ts.map +1 -1
  41. package/dist/core/step-config/agent.js +12 -10
  42. package/dist/core/step-config/agent.js.map +1 -1
  43. package/dist/core/step-config/complete-step-dispatch-config.d.ts +4 -4
  44. package/dist/core/step-config/complete-step-dispatch-config.d.ts.map +1 -1
  45. package/dist/core/step-config/complete-step-dispatch-config.js +2 -2
  46. package/dist/core/step-config/complete-step-dispatch-config.js.map +1 -1
  47. package/dist/core/step-config/materialize-job-execution-steps.d.ts +3 -3
  48. package/dist/core/step-config/materialize-job-execution-steps.d.ts.map +1 -1
  49. package/dist/core/step-config/materialize-job-execution-steps.js +5 -6
  50. package/dist/core/step-config/materialize-job-execution-steps.js.map +1 -1
  51. package/dist/core/step-config/materialize-workflow-model.d.ts +3 -3
  52. package/dist/core/step-config/materialize-workflow-model.d.ts.map +1 -1
  53. package/dist/core/step-config/materialize-workflow-model.js +4 -4
  54. package/dist/core/step-config/materialize-workflow-model.js.map +1 -1
  55. package/dist/core/step-config/resolve-job-execution-name.d.ts +1 -1
  56. package/dist/core/step-config/resolve-job-execution-name.d.ts.map +1 -1
  57. package/dist/core/step-config/resolve-job-execution-name.js.map +1 -1
  58. package/dist/core/step-config/resolve-step-config.d.ts +4 -4
  59. package/dist/core/step-config/resolve-step-config.d.ts.map +1 -1
  60. package/dist/core/step-config/resolve-step-config.js +6 -6
  61. package/dist/core/step-config/resolve-step-config.js.map +1 -1
  62. package/dist/core/step-config/run.d.ts +1 -1
  63. package/dist/core/step-config/run.d.ts.map +1 -1
  64. package/dist/core/step-config/run.js.map +1 -1
  65. package/dist/core/workflow-run-creation.d.ts +3 -3
  66. package/dist/core/workflow-run-creation.d.ts.map +1 -1
  67. package/dist/core/workflow-run-creation.js +3 -4
  68. package/dist/core/workflow-run-creation.js.map +1 -1
  69. package/dist/db/db.d.ts +16 -4
  70. package/dist/db/db.d.ts.map +1 -1
  71. package/dist/db/job-listeners.d.ts +7 -1
  72. package/dist/db/job-listeners.d.ts.map +1 -1
  73. package/dist/db/job-listeners.js +10 -5
  74. package/dist/db/job-listeners.js.map +1 -1
  75. package/dist/db/runner-lease-table.d.ts +5 -5
  76. package/dist/db/runner-lease-table.d.ts.map +1 -1
  77. package/dist/db/runner-lease-table.js +3 -2
  78. package/dist/db/runner-lease-table.js.map +1 -1
  79. package/dist/db/schema/workflow-run-attempts.d.ts +9 -3
  80. package/dist/db/schema/workflow-run-attempts.d.ts.map +1 -1
  81. package/dist/db/schema/workflow-run-attempts.js +2 -1
  82. package/dist/db/schema/workflow-run-attempts.js.map +1 -1
  83. package/dist/db/schema/workflow-runs.js +1 -1
  84. package/dist/db/schema/workflow-runs.js.map +1 -1
  85. package/dist/db/workflow-runs/job-executions.d.ts +5 -0
  86. package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
  87. package/dist/db/workflow-runs/job-executions.js +14 -7
  88. package/dist/db/workflow-runs/job-executions.js.map +1 -1
  89. package/dist/db/workflow-runs/jobs.d.ts.map +1 -1
  90. package/dist/db/workflow-runs/jobs.js +3 -1
  91. package/dist/db/workflow-runs/jobs.js.map +1 -1
  92. package/dist/db/workflow-runs/run-create.d.ts +9 -2
  93. package/dist/db/workflow-runs/run-create.d.ts.map +1 -1
  94. package/dist/db/workflow-runs/run-create.js +12 -9
  95. package/dist/db/workflow-runs/run-create.js.map +1 -1
  96. package/dist/db/workflow-runs/run-rerun.d.ts.map +1 -1
  97. package/dist/db/workflow-runs/run-rerun.js +3 -1
  98. package/dist/db/workflow-runs/run-rerun.js.map +1 -1
  99. package/dist/index.d.ts +18 -4
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +61 -37
  102. package/dist/index.js.map +1 -1
  103. package/dist/presentation/dto/checkout-token.d.ts +14 -1
  104. package/dist/presentation/dto/checkout-token.d.ts.map +1 -1
  105. package/dist/presentation/dto/checkout-token.js.map +1 -1
  106. package/dist/presentation/index.d.ts +1 -1
  107. package/dist/presentation/index.d.ts.map +1 -1
  108. package/dist/presentation/index.js +1 -1
  109. package/dist/presentation/index.js.map +1 -1
  110. package/dist/presentation/inter-module.d.ts +18 -0
  111. package/dist/presentation/inter-module.d.ts.map +1 -0
  112. package/dist/presentation/inter-module.js +113 -0
  113. package/dist/presentation/inter-module.js.map +1 -0
  114. package/dist/presentation/routes/agent-runtime-config.d.ts +6 -1
  115. package/dist/presentation/routes/agent-runtime-config.d.ts.map +1 -1
  116. package/dist/presentation/routes/agent-runtime-config.js +59 -57
  117. package/dist/presentation/routes/agent-runtime-config.js.map +1 -1
  118. package/dist/presentation/routes/cancel-run.d.ts +2 -1
  119. package/dist/presentation/routes/cancel-run.d.ts.map +1 -1
  120. package/dist/presentation/routes/cancel-run.js +37 -34
  121. package/dist/presentation/routes/cancel-run.js.map +1 -1
  122. package/dist/presentation/routes/checkout-token.d.ts +8 -1
  123. package/dist/presentation/routes/checkout-token.d.ts.map +1 -1
  124. package/dist/presentation/routes/checkout-token.js +65 -47
  125. package/dist/presentation/routes/checkout-token.js.map +1 -1
  126. package/dist/presentation/routes/get-run-aggregates.d.ts +2 -1
  127. package/dist/presentation/routes/get-run-aggregates.d.ts.map +1 -1
  128. package/dist/presentation/routes/get-run-aggregates.js +44 -53
  129. package/dist/presentation/routes/get-run-aggregates.js.map +1 -1
  130. package/dist/presentation/routes/get-run.d.ts +2 -1
  131. package/dist/presentation/routes/get-run.d.ts.map +1 -1
  132. package/dist/presentation/routes/get-run.js +53 -50
  133. package/dist/presentation/routes/get-run.js.map +1 -1
  134. package/dist/presentation/routes/get-step-secrets.d.ts +3 -1
  135. package/dist/presentation/routes/get-step-secrets.d.ts.map +1 -1
  136. package/dist/presentation/routes/get-step-secrets.js +72 -68
  137. package/dist/presentation/routes/get-step-secrets.js.map +1 -1
  138. package/dist/presentation/routes/index.d.ts +19 -2
  139. package/dist/presentation/routes/index.d.ts.map +1 -1
  140. package/dist/presentation/routes/index.js +38 -30
  141. package/dist/presentation/routes/index.js.map +1 -1
  142. package/dist/presentation/routes/leased-step.d.ts +2 -0
  143. package/dist/presentation/routes/leased-step.d.ts.map +1 -1
  144. package/dist/presentation/routes/leased-step.js +1 -2
  145. package/dist/presentation/routes/leased-step.js.map +1 -1
  146. package/dist/presentation/routes/list-run-attempts.d.ts +2 -1
  147. package/dist/presentation/routes/list-run-attempts.d.ts.map +1 -1
  148. package/dist/presentation/routes/list-run-attempts.js +29 -26
  149. package/dist/presentation/routes/list-run-attempts.js.map +1 -1
  150. package/dist/presentation/routes/list-runs.d.ts +2 -1
  151. package/dist/presentation/routes/list-runs.d.ts.map +1 -1
  152. package/dist/presentation/routes/list-runs.js +51 -60
  153. package/dist/presentation/routes/list-runs.js.map +1 -1
  154. package/dist/presentation/routes/next-step.d.ts +10 -1
  155. package/dist/presentation/routes/next-step.d.ts.map +1 -1
  156. package/dist/presentation/routes/next-step.js +64 -50
  157. package/dist/presentation/routes/next-step.js.map +1 -1
  158. package/dist/presentation/routes/project-access.d.ts +10 -0
  159. package/dist/presentation/routes/project-access.d.ts.map +1 -0
  160. package/dist/presentation/routes/project-access.js +17 -0
  161. package/dist/presentation/routes/project-access.js.map +1 -0
  162. package/dist/presentation/routes/report-step.d.ts +2 -1
  163. package/dist/presentation/routes/report-step.d.ts.map +1 -1
  164. package/dist/presentation/routes/report-step.js +62 -61
  165. package/dist/presentation/routes/report-step.js.map +1 -1
  166. package/dist/presentation/routes/require-accessible-run.d.ts +3 -1
  167. package/dist/presentation/routes/require-accessible-run.d.ts.map +1 -1
  168. package/dist/presentation/routes/require-accessible-run.js +3 -6
  169. package/dist/presentation/routes/require-accessible-run.js.map +1 -1
  170. package/dist/presentation/routes/rerun-run.d.ts +2 -1
  171. package/dist/presentation/routes/rerun-run.d.ts.map +1 -1
  172. package/dist/presentation/routes/rerun-run.js +46 -43
  173. package/dist/presentation/routes/rerun-run.js.map +1 -1
  174. package/dist/temporal/activities/index.d.ts +44 -9
  175. package/dist/temporal/activities/index.d.ts.map +1 -1
  176. package/dist/temporal/activities/index.js +13 -9
  177. package/dist/temporal/activities/index.js.map +1 -1
  178. package/dist/temporal/activities/orchestration-activities.d.ts +20 -11
  179. package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
  180. package/dist/temporal/activities/orchestration-activities.js +48 -33
  181. package/dist/temporal/activities/orchestration-activities.js.map +1 -1
  182. package/dist/tsconfig.test.tsbuildinfo +1 -1
  183. package/package.json +41 -44
  184. package/src/core/agent-defaults.test.ts +28 -0
  185. package/src/core/agent-defaults.ts +36 -0
  186. package/src/core/agent-tool-capability-warning.test.ts +36 -11
  187. package/src/core/agent-tool-capability-warning.ts +27 -25
  188. package/src/core/agent-tools.ts +33 -36
  189. package/src/core/checkout.test.ts +38 -25
  190. package/src/core/checkout.ts +41 -14
  191. package/src/core/entities/workflow-run-attempt.ts +1 -1
  192. package/src/core/job-execution.ts +19 -9
  193. package/src/core/job-transition/derive-job-execution-outputs.ts +1 -1
  194. package/src/core/job-transition/derive-job-success.ts +1 -1
  195. package/src/core/listener-execution-materialization.test.ts +4 -2
  196. package/src/core/listener-execution-materialization.ts +6 -9
  197. package/src/core/run-workflow.test.ts +43 -38
  198. package/src/core/run-workflow.ts +26 -9
  199. package/src/core/step-config/agent.ts +24 -26
  200. package/src/core/step-config/complete-step-dispatch-config.test.ts +22 -23
  201. package/src/core/step-config/complete-step-dispatch-config.ts +6 -6
  202. package/src/core/step-config/materialize-job-execution-steps.test.ts +34 -23
  203. package/src/core/step-config/materialize-job-execution-steps.ts +38 -39
  204. package/src/core/step-config/materialize-workflow-model.test.ts +94 -82
  205. package/src/core/step-config/materialize-workflow-model.ts +31 -29
  206. package/src/core/step-config/resolve-job-execution-name.ts +1 -1
  207. package/src/core/step-config/resolve-step-config.ts +11 -9
  208. package/src/core/step-config/run.ts +1 -1
  209. package/src/core/workflow-run-creation.test.ts +14 -10
  210. package/src/core/workflow-run-creation.ts +6 -9
  211. package/src/db/job-listeners.ts +20 -5
  212. package/src/db/runner-lease-table.ts +2 -2
  213. package/src/db/schema/workflow-run-attempts.ts +7 -3
  214. package/src/db/schema/workflow-runs.ts +1 -1
  215. package/src/db/workflow-runs/job-executions.ts +15 -1
  216. package/src/db/workflow-runs/jobs.ts +4 -1
  217. package/src/db/workflow-runs/run-create.test.ts +7 -1
  218. package/src/db/workflow-runs/run-create.ts +25 -15
  219. package/src/db/workflow-runs/run-rerun.test.ts +1 -1
  220. package/src/db/workflow-runs/run-rerun.ts +6 -3
  221. package/src/index.ts +75 -33
  222. package/src/presentation/dto/checkout-token.ts +7 -1
  223. package/src/presentation/index.ts +1 -1
  224. package/src/presentation/inter-module.test.ts +149 -0
  225. package/src/presentation/inter-module.ts +132 -0
  226. package/src/presentation/routes/agent-runtime-config.test.ts +53 -10
  227. package/src/presentation/routes/agent-runtime-config.ts +89 -64
  228. package/src/presentation/routes/cancel-run.test.ts +10 -20
  229. package/src/presentation/routes/cancel-run.ts +30 -27
  230. package/src/presentation/routes/checkout-token.test.ts +52 -33
  231. package/src/presentation/routes/checkout-token.ts +109 -49
  232. package/src/presentation/routes/get-run-aggregates.test.ts +13 -7
  233. package/src/presentation/routes/get-run-aggregates.ts +54 -57
  234. package/src/presentation/routes/get-run.test.ts +10 -18
  235. package/src/presentation/routes/get-run.ts +51 -48
  236. package/src/presentation/routes/get-step-secrets.test.ts +29 -7
  237. package/src/presentation/routes/get-step-secrets.ts +72 -61
  238. package/src/presentation/routes/index.test.ts +16 -1
  239. package/src/presentation/routes/index.ts +54 -29
  240. package/src/presentation/routes/leased-step.ts +3 -2
  241. package/src/presentation/routes/list-run-attempts.test.ts +9 -19
  242. package/src/presentation/routes/list-run-attempts.ts +21 -18
  243. package/src/presentation/routes/list-runs.test.ts +13 -7
  244. package/src/presentation/routes/list-runs.ts +64 -67
  245. package/src/presentation/routes/next-step.test.ts +30 -11
  246. package/src/presentation/routes/next-step.ts +68 -48
  247. package/src/presentation/routes/project-access.ts +16 -0
  248. package/src/presentation/routes/report-step.test.ts +18 -2
  249. package/src/presentation/routes/report-step.ts +51 -49
  250. package/src/presentation/routes/require-accessible-run.ts +5 -2
  251. package/src/presentation/routes/rerun-run.test.ts +9 -19
  252. package/src/presentation/routes/rerun-run.ts +39 -36
  253. package/src/temporal/activities/index.ts +32 -12
  254. package/src/temporal/activities/orchestration-activities.test.ts +10 -8
  255. package/src/temporal/activities/orchestration-activities.ts +74 -50
  256. package/src/temporal/workflows/job-execution-orchestration.test.ts +47 -2
  257. package/test/env.ts +1 -3
  258. package/test/factories/project.ts +10 -5
  259. package/test/factories/workflow-model.test.ts +5 -1
  260. package/test/factories/workflow-model.ts +1 -1
  261. package/test/factories/workflow-run.ts +1 -1
  262. package/test/fixtures/agent-inter-module.ts +27 -0
  263. package/test/fixtures/annotations-inter-module.ts +5 -0
  264. package/test/fixtures/auth-inter-module.ts +22 -0
  265. package/test/fixtures/lease-token.ts +2 -1
  266. package/test/fixtures/projects-inter-module.ts +8 -0
  267. package/test/fixtures/runners-inter-module.ts +52 -0
  268. package/test/fixtures/secrets-inter-module.ts +61 -0
  269. package/test/globalSetup.ts +11 -11
  270. package/tsconfig.build.tsbuildinfo +1 -1
  271. package/dist/core/source-control.d.ts +0 -5
  272. package/dist/core/source-control.d.ts.map +0 -1
  273. package/dist/core/source-control.js +0 -19
  274. package/dist/core/source-control.js.map +0 -1
  275. package/src/core/source-control.test.ts +0 -17
  276. package/src/core/source-control.ts +0 -22
  277. package/src/temporal/workflows/job-execution-orchestration-timeout.test.ts +0 -165
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/job-executions.ts"],"sourcesContent":["import {WORKFLOWS_JOB_EXECUTION_TIMED_OUT} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, isNull, notInArray, sql} from 'drizzle-orm';\nimport type {JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution, JobExecutionStatus} from '#core/entities/job-execution.js';\nimport {InterpolationUnresolvableError, JobNotFoundError} from '#core/errors.js';\nimport {deriveJobExecutionOutputs} from '#core/job-transition/index.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {\n recordWorkflowJobExecutionLeaseExpiryResolved,\n recordWorkflowJobExecutionQueued,\n recordWorkflowJobExecutionStarted,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowJobExecutionTimedOut,\n} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {runningJobExecutions} from '../runner-lease-table.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getDirectDependencyJobContexts} from './jobs.js';\nimport {loadReferencedVariables} from './runs.js';\nimport {\n getWorkflowContextForJob,\n optimisticLockRetry,\n TERMINAL_EXECUTION_STATUSES,\n} from './shared.js';\nimport {bulkUpdateStepStatuses, getStepsByJobExecutionIdForUpdate} from './steps.js';\n\nexport async function lockActiveJobExecutionLeaseForUpdate(\n params: {jobId: string; jobExecutionId: string; runnerSessionId: string},\n tx: Tx,\n): Promise<boolean> {\n const rows = await tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.jobId, params.jobId),\n eq(runningJobExecutions.jobExecutionId, params.jobExecutionId),\n eq(runningJobExecutions.runnerSessionId, params.runnerSessionId),\n ),\n )\n .limit(1)\n .for('update');\n\n return rows.length > 0;\n}\n\nexport async function getJobExecutionById(id: string, tx?: Tx): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport async function getJobExecutionsByWorkflowRunAttemptId(\n workflowRunAttemptId: string,\n): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution));\n}\n\nexport async function getJobExecutionsByJobId(jobId: string): Promise<JobExecution[]> {\n const rows = await db()\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map(toJobExecution);\n}\n\nexport async function getFirstJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport async function getLatestJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport interface UpdateJobExecutionStatusAtVersionParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n markTimedOut?: boolean;\n}\n\nasync function resolveJobExecutionOutputs(\n tx: Tx,\n params: {\n jobExecutionId: string;\n status: JobExecutionStatus;\n statusReason: JobStatusReason | null;\n },\n): Promise<Record<string, unknown> | null> {\n const [target] = await tx\n .select({execution: jobExecutions, job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1);\n if (!target) throw new JobNotFoundError(params.jobExecutionId);\n const model = target.attempt.model;\n if (!model) return null;\n const modelJob = model.jobs.find((job) => job.key === target.job.key);\n if (!modelJob || modelJob.outputs === undefined) return null;\n\n const executionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, target.job.id))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n const executions = executionRows.map((row) =>\n row.id === target.execution.id\n ? toJobExecution({...row, status: params.status, statusReason: params.statusReason})\n : toJobExecution(row),\n );\n const jobExecution = executions.find((execution) => execution.id === target.execution.id);\n if (!jobExecution) throw new JobNotFoundError(params.jobExecutionId);\n\n const stepRows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(steps.position), asc(steps.id));\n const attemptRows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n const dependencyJobs = await getDirectDependencyJobContexts(target.job.id, tx);\n\n return deriveJobExecutionOutputs({\n run: toWorkflowRun(target.run),\n modelJob,\n job: toJob(target.job),\n jobExecution,\n executions,\n steps: stepRows.map(toStep),\n attempts: attemptRows.map(toStepAttempt),\n jobs: dependencyJobs,\n vars: await loadReferencedVariables({\n model,\n jobs: [modelJob],\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n definitionId: target.run.definitionId,\n }),\n });\n}\n\nasync function updateJobExecutionStatusAtVersion(\n tx: Tx,\n params: UpdateJobExecutionStatusAtVersionParams,\n): Promise<{execution: JobExecution; changed: boolean} | null> {\n let status = params.status;\n let statusReason = params.statusReason ?? null;\n let outputs: Record<string, unknown> | null | undefined;\n if (TERMINAL_EXECUTION_STATUSES.includes(status)) {\n outputs = null;\n }\n if (status === 'succeeded') {\n try {\n outputs = await resolveJobExecutionOutputs(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n statusReason,\n });\n } catch (error) {\n if (!(error instanceof InterpolationUnresolvableError)) throw error;\n status = 'failed';\n statusReason = 'unknown';\n outputs = null;\n }\n }\n\n const rows = await tx\n .update(jobExecutions)\n .set({\n status,\n statusReason,\n ...(outputs === undefined ? {} : {outputs}),\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n ...(params.markTimedOut ? {timedOutAt: new Date()} : {}),\n ...(TERMINAL_EXECUTION_STATUSES.includes(status) ? {finishedAt: sql`now()`} : {}),\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n eq(jobExecutions.version, params.expectedVersion),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n return {execution: toJobExecution(row), changed: true};\n}\n\nexport interface UpdateJobExecutionStatusParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n}\n\nexport async function updateJobExecutionStatus(\n params: UpdateJobExecutionStatusParams,\n): Promise<JobExecution> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row) : undefined;\n },\n matchFn: (execution) =>\n (execution.status === params.status && execution.statusReason === statusReason) ||\n TERMINAL_EXECUTION_STATUSES.includes(execution.status)\n ? {execution, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobExecutionStatusChanged(result.execution.status);\n\n return result.execution;\n}\n\nexport async function recordJobExecutionQueuedAt(params: {\n jobExecutionId: string;\n queuedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({queuedAt: params.queuedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.queuedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionQueued();\n}\n\nexport async function recordJobExecutionStartedAt(params: {\n jobExecutionId: string;\n startedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({startedAt: params.startedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.startedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionStarted();\n}\n\nexport async function failJobExecutionAsTimedOut(params: {\n jobExecutionId: string;\n workflowRunAttemptId: string;\n expectedVersion: number;\n}): Promise<JobExecution> {\n const result = await db().transaction(async (tx) => {\n const updated = await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'timed_out',\n markTimedOut: true,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row) : undefined;\n },\n matchFn: (execution) => (execution.timedOutAt !== null ? {execution, changed: false} : null),\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n\n if (updated.changed) {\n const identity = await getWorkflowContextForJob(updated.execution.jobId, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n payload: {\n jobId: identity.jobId,\n jobExecutionId: params.jobExecutionId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n },\n });\n }\n\n return updated;\n });\n\n if (result.changed) {\n recordWorkflowJobExecutionStatusChanged(result.execution.status);\n recordWorkflowJobExecutionTimedOut();\n }\n\n return result.execution;\n}\n\nexport async function resolveJobExecutionAfterLeaseExpiry(params: {\n jobExecutionId: string;\n expectedVersion: number;\n}): Promise<{status: RuntimeCompletionStatus; executionVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobExecutionSteps = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n let changedJobExecution: JobExecution | null = null;\n\n if (jobExecutionSteps.length === 0) {\n throw new JobNotFoundError(params.jobExecutionId);\n }\n\n if (jobExecutionSteps.every((step) => isTerminal(step.status))) {\n const status = deriveCompletion(jobExecutionSteps);\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n expectedVersion: params.expectedVersion,\n statusReason: statusReasonForStepCompletion(status),\n });\n changedJobExecution = updated?.changed ? updated.execution : null;\n } else {\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'runner_lost',\n });\n if (updated?.changed) {\n changedJobExecution = updated.execution;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: 'cancelled'},\n tx,\n );\n }\n }\n\n const jobExecutionRow = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n if (!jobExecutionRow) {\n throw new Error(`Job execution not found resolving lease expiry: ${params.jobExecutionId}`);\n }\n const status: RuntimeCompletionStatus =\n jobExecutionRow.status === 'succeeded' ? 'succeeded' : 'failed';\n return {status, executionVersion: jobExecutionRow.version, changedJobExecution};\n });\n\n recordWorkflowJobExecutionLeaseExpiryResolved(result.status);\n if (result.changedJobExecution) {\n recordWorkflowJobExecutionStatusChanged(result.changedJobExecution.status);\n }\n\n return {status: result.status, executionVersion: result.executionVersion};\n}\n\nfunction statusReasonForStepCompletion(status: RuntimeCompletionStatus): JobStatusReason | null {\n return status === 'failed' ? 'step_failed' : null;\n}\n"],"names":["WORKFLOWS_JOB_EXECUTION_TIMED_OUT","and","asc","desc","eq","isNull","notInArray","sql","InterpolationUnresolvableError","JobNotFoundError","deriveJobExecutionOutputs","deriveCompletion","isTerminal","recordWorkflowJobExecutionLeaseExpiryResolved","recordWorkflowJobExecutionQueued","recordWorkflowJobExecutionStarted","recordWorkflowJobExecutionStatusChanged","recordWorkflowJobExecutionTimedOut","db","writeWorkflowsOutboxEvent","runningJobExecutions","jobExecutions","toJobExecution","jobs","toJob","stepAttempts","toStepAttempt","steps","toStep","workflowRunAttempts","toWorkflowRun","workflowRuns","getDirectDependencyJobContexts","loadReferencedVariables","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_EXECUTION_STATUSES","bulkUpdateStepStatuses","getStepsByJobExecutionIdForUpdate","lockActiveJobExecutionLeaseForUpdate","params","tx","rows","select","id","from","where","jobId","jobExecutionId","runnerSessionId","limit","for","length","getJobExecutionById","row","undefined","getJobExecutionsByWorkflowRunAttemptId","workflowRunAttemptId","jobExecution","innerJoin","orderBy","sequence","map","getJobExecutionsByJobId","getFirstJobExecutionByJobId","getLatestJobExecutionByJobId","resolveJobExecutionOutputs","target","execution","job","attempt","run","workflowRunId","model","modelJob","find","key","outputs","executionRows","executions","status","statusReason","stepRows","position","attemptRows","executionOrder","dependencyJobs","attempts","vars","workspaceId","projectId","definitionId","updateJobExecutionStatusAtVersion","includes","error","update","set","version","updatedAt","Date","markTimedOut","timedOutAt","finishedAt","expectedVersion","returning","changed","updateJobExecutionStatus","result","transaction","updateFn","fetchFn","matchFn","failureMessage","recordJobExecutionQueuedAt","updated","queuedAt","recordJobExecutionStartedAt","startedAt","failJobExecutionAsTimedOut","identity","type","payload","resolveJobExecutionAfterLeaseExpiry","jobExecutionSteps","changedJobExecution","every","step","statusReasonForStepCompletion","jobExecutionRow","Error","executionVersion"],"mappings":"AAAA,SAAQA,iCAAiC,QAAO,6BAA6B;AAC7E,SAAQC,GAAG,EAAEC,GAAG,EAAEC,IAAI,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,GAAG,QAAO,cAAc;AAGxE,SAAQC,8BAA8B,EAAEC,gBAAgB,QAAO,kBAAkB;AACjF,SAAQC,yBAAyB,QAAO,gCAAgC;AACxE,SAAQC,gBAAgB,EAAEC,UAAU,QAAO,kDAAkD;AAE7F,SACEC,6CAA6C,EAC7CC,gCAAgC,EAChCC,iCAAiC,EACjCC,uCAAuC,EACvCC,kCAAkC,QAC7B,uBAAuB;AAC9B,SAAQC,EAAE,QAAgB,WAAW;AACrC,SAAQC,yBAAyB,QAAO,sBAAsB;AAC9D,SAAQC,oBAAoB,QAAO,2BAA2B;AAC9D,SAAQC,aAAa,EAAEC,cAAc,QAAO,8BAA8B;AAC1E,SAAQC,IAAI,EAAEC,KAAK,QAAO,oBAAoB;AAC9C,SAAQC,YAAY,EAAEC,aAAa,QAAO,6BAA6B;AACvE,SAAQC,KAAK,EAAEC,MAAM,QAAO,qBAAqB;AACjD,SAAQC,mBAAmB,QAAO,qCAAqC;AACvE,SAAQC,aAAa,EAAEC,YAAY,QAAO,6BAA6B;AACvE,SAAQC,8BAA8B,QAAO,YAAY;AACzD,SAAQC,uBAAuB,QAAO,YAAY;AAClD,SACEC,wBAAwB,EACxBC,mBAAmB,EACnBC,2BAA2B,QACtB,cAAc;AACrB,SAAQC,sBAAsB,EAAEC,iCAAiC,QAAO,aAAa;AAErF,OAAO,eAAeC,qCACpBC,MAAwE,EACxEC,EAAM;IAEN,MAAMC,OAAO,MAAMD,GAChBE,MAAM,CAAC;QAACC,IAAIxB,qBAAqBwB,EAAE;IAAA,GACnCC,IAAI,CAACzB,sBACL0B,KAAK,CACJ7C,IACEG,GAAGgB,qBAAqB2B,KAAK,EAAEP,OAAOO,KAAK,GAC3C3C,GAAGgB,qBAAqB4B,cAAc,EAAER,OAAOQ,cAAc,GAC7D5C,GAAGgB,qBAAqB6B,eAAe,EAAET,OAAOS,eAAe,IAGlEC,KAAK,CAAC,GACNC,GAAG,CAAC;IAEP,OAAOT,KAAKU,MAAM,GAAG;AACvB;AAEA,OAAO,eAAeC,oBAAoBT,EAAU,EAAEH,EAAO;IAC3D,MAAMC,OAAO,MAAM,AAACD,CAAAA,MAAMvB,IAAG,EAC1ByB,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAcuB,EAAE,EAAEA,KAC3BM,KAAK,CAAC;IACT,MAAMI,MAAMZ,IAAI,CAAC,EAAE;IACnB,OAAOY,MAAMhC,eAAegC,OAAOC;AACrC;AAEA,OAAO,eAAeC,uCACpBC,oBAA4B;IAE5B,MAAMf,OAAO,MAAMxB,KAChByB,MAAM,CAAC;QAACe,cAAcrC;IAAa,GACnCwB,IAAI,CAACxB,eACLsC,SAAS,CAACpC,MAAMnB,GAAGiB,cAAc0B,KAAK,EAAExB,KAAKqB,EAAE,GAC/CE,KAAK,CAAC1C,GAAGmB,KAAKkC,oBAAoB,EAAEA,uBACpCG,OAAO,CAAC1D,IAAImB,cAAcwC,QAAQ,GAAG3D,IAAImB,cAAcuB,EAAE;IAC5D,OAAOF,KAAKoB,GAAG,CAAC,CAACR,MAAQhC,eAAegC,IAAII,YAAY;AAC1D;AAEA,OAAO,eAAeK,wBAAwBhB,KAAa;IACzD,MAAML,OAAO,MAAMxB,KAChByB,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAc0B,KAAK,EAAEA,QAC9Ba,OAAO,CAAC1D,IAAImB,cAAcwC,QAAQ,GAAG3D,IAAImB,cAAcuB,EAAE;IAC5D,OAAOF,KAAKoB,GAAG,CAACxC;AAClB;AAEA,OAAO,eAAe0C,4BACpBjB,KAAa,EACbN,EAAO;IAEP,MAAMC,OAAO,MAAM,AAACD,CAAAA,MAAMvB,IAAG,EAC1ByB,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAc0B,KAAK,EAAEA,QAC9Ba,OAAO,CAAC1D,IAAImB,cAAcwC,QAAQ,GAAG3D,IAAImB,cAAcuB,EAAE,GACzDM,KAAK,CAAC;IACT,MAAMI,MAAMZ,IAAI,CAAC,EAAE;IACnB,OAAOY,MAAMhC,eAAegC,OAAOC;AACrC;AAEA,OAAO,eAAeU,6BACpBlB,KAAa,EACbN,EAAO;IAEP,MAAMC,OAAO,MAAM,AAACD,CAAAA,MAAMvB,IAAG,EAC1ByB,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAc0B,KAAK,EAAEA,QAC9Ba,OAAO,CAACzD,KAAKkB,cAAcwC,QAAQ,GAAG1D,KAAKkB,cAAcuB,EAAE,GAC3DM,KAAK,CAAC;IACT,MAAMI,MAAMZ,IAAI,CAAC,EAAE;IACnB,OAAOY,MAAMhC,eAAegC,OAAOC;AACrC;AAUA,eAAeW,2BACbzB,EAAM,EACND,MAIC;IAED,MAAM,CAAC2B,OAAO,GAAG,MAAM1B,GACpBE,MAAM,CAAC;QAACyB,WAAW/C;QAAegD,KAAK9C;QAAM+C,SAASzC;QAAqB0C,KAAKxC;IAAY,GAC5Fc,IAAI,CAACxB,eACLsC,SAAS,CAACpC,MAAMnB,GAAGiB,cAAc0B,KAAK,EAAExB,KAAKqB,EAAE,GAC/Ce,SAAS,CAAC9B,qBAAqBzB,GAAGmB,KAAKkC,oBAAoB,EAAE5B,oBAAoBe,EAAE,GACnFe,SAAS,CAAC5B,cAAc3B,GAAGyB,oBAAoB2C,aAAa,EAAEzC,aAAaa,EAAE,GAC7EE,KAAK,CAAC1C,GAAGiB,cAAcuB,EAAE,EAAEJ,OAAOQ,cAAc,GAChDE,KAAK,CAAC;IACT,IAAI,CAACiB,QAAQ,MAAM,IAAI1D,iBAAiB+B,OAAOQ,cAAc;IAC7D,MAAMyB,QAAQN,OAAOG,OAAO,CAACG,KAAK;IAClC,IAAI,CAACA,OAAO,OAAO;IACnB,MAAMC,WAAWD,MAAMlD,IAAI,CAACoD,IAAI,CAAC,CAACN,MAAQA,IAAIO,GAAG,KAAKT,OAAOE,GAAG,CAACO,GAAG;IACpE,IAAI,CAACF,YAAYA,SAASG,OAAO,KAAKtB,WAAW,OAAO;IAExD,MAAMuB,gBAAgB,MAAMrC,GACzBE,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAc0B,KAAK,EAAEoB,OAAOE,GAAG,CAACzB,EAAE,GAC3CgB,OAAO,CAAC1D,IAAImB,cAAcwC,QAAQ,GAAG3D,IAAImB,cAAcuB,EAAE;IAC5D,MAAMmC,aAAaD,cAAchB,GAAG,CAAC,CAACR,MACpCA,IAAIV,EAAE,KAAKuB,OAAOC,SAAS,CAACxB,EAAE,GAC1BtB,eAAe;YAAC,GAAGgC,GAAG;YAAE0B,QAAQxC,OAAOwC,MAAM;YAAEC,cAAczC,OAAOyC,YAAY;QAAA,KAChF3D,eAAegC;IAErB,MAAMI,eAAeqB,WAAWJ,IAAI,CAAC,CAACP,YAAcA,UAAUxB,EAAE,KAAKuB,OAAOC,SAAS,CAACxB,EAAE;IACxF,IAAI,CAACc,cAAc,MAAM,IAAIjD,iBAAiB+B,OAAOQ,cAAc;IAEnE,MAAMkC,WAAW,MAAMzC,GACpBE,MAAM,GACNE,IAAI,CAAClB,OACLmB,KAAK,CAAC1C,GAAGuB,MAAMqB,cAAc,EAAER,OAAOQ,cAAc,GACpDY,OAAO,CAAC1D,IAAIyB,MAAMwD,QAAQ,GAAGjF,IAAIyB,MAAMiB,EAAE;IAC5C,MAAMwC,cAAc,MAAM3C,GACvBE,MAAM,GACNE,IAAI,CAACpB,cACLqB,KAAK,CAAC1C,GAAGqB,aAAauB,cAAc,EAAER,OAAOQ,cAAc,GAC3DY,OAAO,CAAC1D,IAAIuB,aAAa4D,cAAc,GAAGnF,IAAIuB,aAAamB,EAAE;IAChE,MAAM0C,iBAAiB,MAAMtD,+BAA+BmC,OAAOE,GAAG,CAACzB,EAAE,EAAEH;IAE3E,OAAO/B,0BAA0B;QAC/B6D,KAAKzC,cAAcqC,OAAOI,GAAG;QAC7BG;QACAL,KAAK7C,MAAM2C,OAAOE,GAAG;QACrBX;QACAqB;QACApD,OAAOuD,SAASpB,GAAG,CAAClC;QACpB2D,UAAUH,YAAYtB,GAAG,CAACpC;QAC1BH,MAAM+D;QACNE,MAAM,MAAMvD,wBAAwB;YAClCwC;YACAlD,MAAM;gBAACmD;aAAS;YAChBe,aAAatB,OAAOI,GAAG,CAACkB,WAAW;YACnCC,WAAWvB,OAAOI,GAAG,CAACmB,SAAS;YAC/BC,cAAcxB,OAAOI,GAAG,CAACoB,YAAY;QACvC;IACF;AACF;AAEA,eAAeC,kCACbnD,EAAM,EACND,MAA+C;IAE/C,IAAIwC,SAASxC,OAAOwC,MAAM;IAC1B,IAAIC,eAAezC,OAAOyC,YAAY,IAAI;IAC1C,IAAIJ;IACJ,IAAIzC,4BAA4ByD,QAAQ,CAACb,SAAS;QAChDH,UAAU;IACZ;IACA,IAAIG,WAAW,aAAa;QAC1B,IAAI;YACFH,UAAU,MAAMX,2BAA2BzB,IAAI;gBAC7CO,gBAAgBR,OAAOQ,cAAc;gBACrCgC;gBACAC;YACF;QACF,EAAE,OAAOa,OAAO;YACd,IAAI,CAAEA,CAAAA,iBAAiBtF,8BAA6B,GAAI,MAAMsF;YAC9Dd,SAAS;YACTC,eAAe;YACfJ,UAAU;QACZ;IACF;IAEA,MAAMnC,OAAO,MAAMD,GAChBsD,MAAM,CAAC1E,eACP2E,GAAG,CAAC;QACHhB;QACAC;QACA,GAAIJ,YAAYtB,YAAY,CAAC,IAAI;YAACsB;QAAO,CAAC;QAC1CoB,SAAS1F,GAAG,CAAC,EAAEc,cAAc4E,OAAO,CAAC,IAAI,CAAC;QAC1CC,WAAW,IAAIC;QACf,GAAI3D,OAAO4D,YAAY,GAAG;YAACC,YAAY,IAAIF;QAAM,IAAI,CAAC,CAAC;QACvD,GAAI/D,4BAA4ByD,QAAQ,CAACb,UAAU;YAACsB,YAAY/F,GAAG,CAAC,KAAK,CAAC;QAAA,IAAI,CAAC,CAAC;IAClF,GACCuC,KAAK,CACJ7C,IACEG,GAAGiB,cAAcuB,EAAE,EAAEJ,OAAOQ,cAAc,GAC1C5C,GAAGiB,cAAc4E,OAAO,EAAEzD,OAAO+D,eAAe,GAChDjG,WAAWe,cAAc2D,MAAM,EAAE5C,+BAGpCoE,SAAS;IAEZ,MAAMlD,MAAMZ,IAAI,CAAC,EAAE;IACnB,IAAI,CAACY,KAAK,OAAO;IACjB,OAAO;QAACc,WAAW9C,eAAegC;QAAMmD,SAAS;IAAI;AACvD;AASA,OAAO,eAAeC,yBACpBlE,MAAsC;IAEtC,MAAMyC,eAAezC,OAAOyC,YAAY,IAAI;IAC5C,MAAM0B,SAAS,MAAMzF,KAAK0F,WAAW,CAAC,OAAOnE;QAC3C,OAAO,MAAMN,oBAAoB;YAC/B0E,UAAU,IACRjB,kCAAkCnD,IAAI;oBACpCO,gBAAgBR,OAAOQ,cAAc;oBACrCgC,QAAQxC,OAAOwC,MAAM;oBACrBuB,iBAAiB/D,OAAO+D,eAAe;oBACvCtB;gBACF;YACF6B,SAAS;gBACP,MAAMxD,MAAM,AACV,CAAA,MAAMb,GACHE,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAcuB,EAAE,EAAEJ,OAAOQ,cAAc,GAChDE,KAAK,CAAC,EAAC,CACX,CAAC,EAAE;gBACJ,OAAOI,MAAMhC,eAAegC,OAAOC;YACrC;YACAwD,SAAS,CAAC3C,YACR,AAACA,UAAUY,MAAM,KAAKxC,OAAOwC,MAAM,IAAIZ,UAAUa,YAAY,KAAKA,gBAClE7C,4BAA4ByD,QAAQ,CAACzB,UAAUY,MAAM,IACjD;oBAACZ;oBAAWqC,SAAS;gBAAK,IAC1B;YACNO,gBAAgB,CAAC,uCAAuC,EAAExE,OAAOQ,cAAc,CAAC,SAAS,EAAER,OAAO+D,eAAe,EAAE;QACrH;IACF;IAEA,IAAII,OAAOF,OAAO,EAAEzF,wCAAwC2F,OAAOvC,SAAS,CAACY,MAAM;IAEnF,OAAO2B,OAAOvC,SAAS;AACzB;AAEA,OAAO,eAAe6C,2BAA2BzE,MAGhD;IACC,MAAM0E,UAAU,MAAMhG,KACnB6E,MAAM,CAAC1E,eACP2E,GAAG,CAAC;QAACmB,UAAU3E,OAAO2E,QAAQ;IAAA,GAC9BrE,KAAK,CAAC7C,IAAIG,GAAGiB,cAAcuB,EAAE,EAAEJ,OAAOQ,cAAc,GAAG3C,OAAOgB,cAAc8F,QAAQ,IACpFX,SAAS,CAAC;QAAC5D,IAAIvB,cAAcuB,EAAE;IAAA;IAElC,IAAIsE,QAAQ9D,MAAM,GAAG,GAAGtC;AAC1B;AAEA,OAAO,eAAesG,4BAA4B5E,MAGjD;IACC,MAAM0E,UAAU,MAAMhG,KACnB6E,MAAM,CAAC1E,eACP2E,GAAG,CAAC;QAACqB,WAAW7E,OAAO6E,SAAS;IAAA,GAChCvE,KAAK,CAAC7C,IAAIG,GAAGiB,cAAcuB,EAAE,EAAEJ,OAAOQ,cAAc,GAAG3C,OAAOgB,cAAcgG,SAAS,IACrFb,SAAS,CAAC;QAAC5D,IAAIvB,cAAcuB,EAAE;IAAA;IAElC,IAAIsE,QAAQ9D,MAAM,GAAG,GAAGrC;AAC1B;AAEA,OAAO,eAAeuG,2BAA2B9E,MAIhD;IACC,MAAMmE,SAAS,MAAMzF,KAAK0F,WAAW,CAAC,OAAOnE;QAC3C,MAAMyE,UAAU,MAAM/E,oBAAoB;YACxC0E,UAAU,IACRjB,kCAAkCnD,IAAI;oBACpCO,gBAAgBR,OAAOQ,cAAc;oBACrCgC,QAAQ;oBACRuB,iBAAiB/D,OAAO+D,eAAe;oBACvCtB,cAAc;oBACdmB,cAAc;gBAChB;YACFU,SAAS;gBACP,MAAMxD,MAAM,AACV,CAAA,MAAMb,GACHE,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAcuB,EAAE,EAAEJ,OAAOQ,cAAc,GAChDE,KAAK,CAAC,EAAC,CACX,CAAC,EAAE;gBACJ,OAAOI,MAAMhC,eAAegC,OAAOC;YACrC;YACAwD,SAAS,CAAC3C,YAAeA,UAAUiC,UAAU,KAAK,OAAO;oBAACjC;oBAAWqC,SAAS;gBAAK,IAAI;YACvFO,gBAAgB,CAAC,uCAAuC,EAAExE,OAAOQ,cAAc,CAAC,SAAS,EAAER,OAAO+D,eAAe,EAAE;QACrH;QAEA,IAAIW,QAAQT,OAAO,EAAE;YACnB,MAAMc,WAAW,MAAMrF,yBAAyBgF,QAAQ9C,SAAS,CAACrB,KAAK,EAAEN;YACzE,MAAMtB,0BAA0BsB,IAAI;gBAClC+E,MAAMxH;gBACNyH,SAAS;oBACP1E,OAAOwE,SAASxE,KAAK;oBACrBC,gBAAgBR,OAAOQ,cAAc;oBACrCS,sBAAsB8D,SAAS9D,oBAAoB;gBACrD;YACF;QACF;QAEA,OAAOyD;IACT;IAEA,IAAIP,OAAOF,OAAO,EAAE;QAClBzF,wCAAwC2F,OAAOvC,SAAS,CAACY,MAAM;QAC/D/D;IACF;IAEA,OAAO0F,OAAOvC,SAAS;AACzB;AAEA,OAAO,eAAesD,oCAAoClF,MAGzD;IACC,MAAMmE,SAAS,MAAMzF,KAAK0F,WAAW,CAAC,OAAOnE;QAC3C,MAAMkF,oBAAoB,MAAMrF,kCAAkCE,OAAOQ,cAAc,EAAEP;QACzF,IAAImF,sBAA2C;QAE/C,IAAID,kBAAkBvE,MAAM,KAAK,GAAG;YAClC,MAAM,IAAI3C,iBAAiB+B,OAAOQ,cAAc;QAClD;QAEA,IAAI2E,kBAAkBE,KAAK,CAAC,CAACC,OAASlH,WAAWkH,KAAK9C,MAAM,IAAI;YAC9D,MAAMA,SAASrE,iBAAiBgH;YAChC,MAAMT,UAAU,MAAMtB,kCAAkCnD,IAAI;gBAC1DO,gBAAgBR,OAAOQ,cAAc;gBACrCgC;gBACAuB,iBAAiB/D,OAAO+D,eAAe;gBACvCtB,cAAc8C,8BAA8B/C;YAC9C;YACA4C,sBAAsBV,SAAST,UAAUS,QAAQ9C,SAAS,GAAG;QAC/D,OAAO;YACL,MAAM8C,UAAU,MAAMtB,kCAAkCnD,IAAI;gBAC1DO,gBAAgBR,OAAOQ,cAAc;gBACrCgC,QAAQ;gBACRuB,iBAAiB/D,OAAO+D,eAAe;gBACvCtB,cAAc;YAChB;YACA,IAAIiC,SAAST,SAAS;gBACpBmB,sBAAsBV,QAAQ9C,SAAS;gBACvC,MAAM/B,uBACJ;oBAACW,gBAAgBR,OAAOQ,cAAc;oBAAEgC,QAAQ;gBAAW,GAC3DvC;YAEJ;QACF;QAEA,MAAMuF,kBAAkB,AACtB,CAAA,MAAMvF,GACHE,MAAM,GACNE,IAAI,CAACxB,eACLyB,KAAK,CAAC1C,GAAGiB,cAAcuB,EAAE,EAAEJ,OAAOQ,cAAc,GAChDE,KAAK,CAAC,EAAC,CACX,CAAC,EAAE;QACJ,IAAI,CAAC8E,iBAAiB;YACpB,MAAM,IAAIC,MAAM,CAAC,gDAAgD,EAAEzF,OAAOQ,cAAc,EAAE;QAC5F;QACA,MAAMgC,SACJgD,gBAAgBhD,MAAM,KAAK,cAAc,cAAc;QACzD,OAAO;YAACA;YAAQkD,kBAAkBF,gBAAgB/B,OAAO;YAAE2B;QAAmB;IAChF;IAEA/G,8CAA8C8F,OAAO3B,MAAM;IAC3D,IAAI2B,OAAOiB,mBAAmB,EAAE;QAC9B5G,wCAAwC2F,OAAOiB,mBAAmB,CAAC5C,MAAM;IAC3E;IAEA,OAAO;QAACA,QAAQ2B,OAAO3B,MAAM;QAAEkD,kBAAkBvB,OAAOuB,gBAAgB;IAAA;AAC1E;AAEA,SAASH,8BAA8B/C,MAA+B;IACpE,OAAOA,WAAW,WAAW,gBAAgB;AAC/C"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/job-executions.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {WORKFLOWS_JOB_EXECUTION_TIMED_OUT} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, isNull, notInArray, sql} from 'drizzle-orm';\nimport type {JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution, JobExecutionStatus} from '#core/entities/job-execution.js';\nimport {InterpolationUnresolvableError, JobNotFoundError} from '#core/errors.js';\nimport {deriveJobExecutionOutputs} from '#core/job-transition/index.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {\n recordWorkflowJobExecutionLeaseExpiryResolved,\n recordWorkflowJobExecutionQueued,\n recordWorkflowJobExecutionStarted,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowJobExecutionTimedOut,\n} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {runningJobExecutions} from '../runner-lease-table.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getDirectDependencyJobContexts} from './jobs.js';\nimport {loadReferencedVariables} from './runs.js';\nimport {\n getWorkflowContextForJob,\n optimisticLockRetry,\n TERMINAL_EXECUTION_STATUSES,\n} from './shared.js';\nimport {bulkUpdateStepStatuses, getStepsByJobExecutionIdForUpdate} from './steps.js';\n\nexport async function lockActiveJobExecutionLeaseForUpdate(\n params: {jobId: string; jobExecutionId: string; runnerSessionId: string},\n tx: Tx,\n): Promise<boolean> {\n const rows = await tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.jobId, params.jobId),\n eq(runningJobExecutions.jobExecutionId, params.jobExecutionId),\n eq(runningJobExecutions.runnerSessionId, params.runnerSessionId),\n ),\n )\n .limit(1)\n .for('update');\n\n return rows.length > 0;\n}\n\nexport async function getJobExecutionById(id: string, tx?: Tx): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport async function getJobExecutionsByWorkflowRunAttemptId(\n workflowRunAttemptId: string,\n): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution));\n}\n\nexport async function getJobExecutionsByJobId(jobId: string): Promise<JobExecution[]> {\n const rows = await db()\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map(toJobExecution);\n}\n\nexport async function getFirstJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport async function getLatestJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row) : undefined;\n}\n\nexport interface UpdateJobExecutionStatusAtVersionParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n markTimedOut?: boolean;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nasync function resolveJobExecutionOutputs(\n tx: Tx,\n params: {\n jobExecutionId: string;\n status: JobExecutionStatus;\n statusReason: JobStatusReason | null;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n },\n): Promise<Record<string, unknown> | null> {\n const [target] = await tx\n .select({execution: jobExecutions, job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1);\n if (!target) throw new JobNotFoundError(params.jobExecutionId);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n if (!model) return null;\n const modelJob = model.jobs.find((job) => job.key === target.job.key);\n if (!modelJob || modelJob.outputs === undefined) return null;\n\n const executionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, target.job.id))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n const executions = executionRows.map((row) =>\n row.id === target.execution.id\n ? toJobExecution({...row, status: params.status, statusReason: params.statusReason})\n : toJobExecution(row),\n );\n const jobExecution = executions.find((execution) => execution.id === target.execution.id);\n if (!jobExecution) throw new JobNotFoundError(params.jobExecutionId);\n\n const stepRows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(steps.position), asc(steps.id));\n const attemptRows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n const dependencyJobs = await getDirectDependencyJobContexts(target.job.id, tx);\n\n return deriveJobExecutionOutputs({\n run: toWorkflowRun(target.run),\n modelJob,\n job: toJob(target.job),\n jobExecution,\n executions,\n steps: stepRows.map(toStep),\n attempts: attemptRows.map(toStepAttempt),\n jobs: dependencyJobs,\n vars: await loadReferencedVariables({\n model,\n jobs: [modelJob],\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n definitionId: target.run.definitionId,\n secrets: params.secrets,\n }),\n });\n}\n\nasync function updateJobExecutionStatusAtVersion(\n tx: Tx,\n params: UpdateJobExecutionStatusAtVersionParams,\n): Promise<{execution: JobExecution; changed: boolean} | null> {\n let status = params.status;\n let statusReason = params.statusReason ?? null;\n let outputs: Record<string, unknown> | null | undefined;\n if (TERMINAL_EXECUTION_STATUSES.includes(status)) {\n outputs = null;\n }\n if (status === 'succeeded') {\n try {\n outputs = await resolveJobExecutionOutputs(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n statusReason,\n secrets: params.secrets,\n });\n } catch (error) {\n if (!(error instanceof InterpolationUnresolvableError)) throw error;\n status = 'failed';\n statusReason = 'unknown';\n outputs = null;\n }\n }\n\n const rows = await tx\n .update(jobExecutions)\n .set({\n status,\n statusReason,\n ...(outputs === undefined ? {} : {outputs}),\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n ...(params.markTimedOut ? {timedOutAt: new Date()} : {}),\n ...(TERMINAL_EXECUTION_STATUSES.includes(status) ? {finishedAt: sql`now()`} : {}),\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n eq(jobExecutions.version, params.expectedVersion),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n return {execution: toJobExecution(row), changed: true};\n}\n\nexport interface UpdateJobExecutionStatusParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nexport async function updateJobExecutionStatus(\n params: UpdateJobExecutionStatusParams,\n): Promise<JobExecution> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row) : undefined;\n },\n matchFn: (execution) =>\n (execution.status === params.status && execution.statusReason === statusReason) ||\n TERMINAL_EXECUTION_STATUSES.includes(execution.status)\n ? {execution, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobExecutionStatusChanged(result.execution.status);\n\n return result.execution;\n}\n\nexport async function recordJobExecutionQueuedAt(params: {\n jobExecutionId: string;\n queuedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({queuedAt: params.queuedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.queuedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionQueued();\n}\n\nexport async function recordJobExecutionStartedAt(params: {\n jobExecutionId: string;\n startedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({startedAt: params.startedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.startedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionStarted();\n}\n\nexport async function failJobExecutionAsTimedOut(params: {\n jobExecutionId: string;\n workflowRunAttemptId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<JobExecution> {\n const result = await db().transaction(async (tx) => {\n const updated = await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'timed_out',\n markTimedOut: true,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row) : undefined;\n },\n matchFn: (execution) => (execution.timedOutAt !== null ? {execution, changed: false} : null),\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n\n if (updated.changed) {\n const identity = await getWorkflowContextForJob(updated.execution.jobId, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n payload: {\n jobId: identity.jobId,\n jobExecutionId: params.jobExecutionId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n },\n });\n }\n\n return updated;\n });\n\n if (result.changed) {\n recordWorkflowJobExecutionStatusChanged(result.execution.status);\n recordWorkflowJobExecutionTimedOut();\n }\n\n return result.execution;\n}\n\nexport async function resolveJobExecutionAfterLeaseExpiry(params: {\n jobExecutionId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<{status: RuntimeCompletionStatus; executionVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobExecutionSteps = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n let changedJobExecution: JobExecution | null = null;\n\n if (jobExecutionSteps.length === 0) {\n throw new JobNotFoundError(params.jobExecutionId);\n }\n\n if (jobExecutionSteps.every((step) => isTerminal(step.status))) {\n const status = deriveCompletion(jobExecutionSteps);\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n expectedVersion: params.expectedVersion,\n statusReason: statusReasonForStepCompletion(status),\n secrets: params.secrets,\n });\n changedJobExecution = updated?.changed ? updated.execution : null;\n } else {\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'runner_lost',\n secrets: params.secrets,\n });\n if (updated?.changed) {\n changedJobExecution = updated.execution;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: 'cancelled'},\n tx,\n );\n }\n }\n\n const jobExecutionRow = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n if (!jobExecutionRow) {\n throw new Error(`Job execution not found resolving lease expiry: ${params.jobExecutionId}`);\n }\n const status: RuntimeCompletionStatus =\n jobExecutionRow.status === 'succeeded' ? 'succeeded' : 'failed';\n return {status, executionVersion: jobExecutionRow.version, changedJobExecution};\n });\n\n recordWorkflowJobExecutionLeaseExpiryResolved(result.status);\n if (result.changedJobExecution) {\n recordWorkflowJobExecutionStatusChanged(result.changedJobExecution.status);\n }\n\n return {status: result.status, executionVersion: result.executionVersion};\n}\n\nfunction statusReasonForStepCompletion(status: RuntimeCompletionStatus): JobStatusReason | null {\n return status === 'failed' ? 'step_failed' : null;\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_EXECUTION_TIMED_OUT","and","asc","desc","eq","isNull","notInArray","sql","InterpolationUnresolvableError","JobNotFoundError","deriveJobExecutionOutputs","deriveCompletion","isTerminal","recordWorkflowJobExecutionLeaseExpiryResolved","recordWorkflowJobExecutionQueued","recordWorkflowJobExecutionStarted","recordWorkflowJobExecutionStatusChanged","recordWorkflowJobExecutionTimedOut","db","writeWorkflowsOutboxEvent","runningJobExecutions","jobExecutions","toJobExecution","jobs","toJob","stepAttempts","toStepAttempt","steps","toStep","workflowRunAttempts","toWorkflowRun","workflowRuns","getDirectDependencyJobContexts","loadReferencedVariables","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_EXECUTION_STATUSES","bulkUpdateStepStatuses","getStepsByJobExecutionIdForUpdate","lockActiveJobExecutionLeaseForUpdate","params","tx","rows","select","id","from","where","jobId","jobExecutionId","runnerSessionId","limit","for","length","getJobExecutionById","row","undefined","getJobExecutionsByWorkflowRunAttemptId","workflowRunAttemptId","jobExecution","innerJoin","orderBy","sequence","map","getJobExecutionsByJobId","getFirstJobExecutionByJobId","getLatestJobExecutionByJobId","resolveJobExecutionOutputs","target","execution","job","attempt","run","workflowRunId","model","modelJob","find","key","outputs","executionRows","executions","status","statusReason","stepRows","position","attemptRows","executionOrder","dependencyJobs","attempts","vars","workspaceId","projectId","definitionId","secrets","updateJobExecutionStatusAtVersion","includes","error","update","set","version","updatedAt","Date","markTimedOut","timedOutAt","finishedAt","expectedVersion","returning","changed","updateJobExecutionStatus","result","transaction","updateFn","fetchFn","matchFn","failureMessage","recordJobExecutionQueuedAt","updated","queuedAt","recordJobExecutionStartedAt","startedAt","failJobExecutionAsTimedOut","identity","type","payload","resolveJobExecutionAfterLeaseExpiry","jobExecutionSteps","changedJobExecution","every","step","statusReasonForStepCompletion","jobExecutionRow","Error","executionVersion"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/jobs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAEpG,OAAO,KAAK,EAAC,6BAA6B,EAAC,MAAM,wBAAwB,CAAC;AAE1E,OAAO,EACL,KAAK,sBAAsB,EAE3B,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,2CAA2C,CAAC;AAC/E,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,0CAA0C,CAAC;AAEtF,OAAO,EAAK,KAAK,EAAE,EAAC,MAAM,UAAU,CAAC;AASrC,wBAAsB,6BAA6B,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAOhG;AAED,wBAAsB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAclF;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAKrE;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAS9E;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,EAAE,GACN,OAAO,CAAC,eAAe,EAAE,CAAC,CA4B5B;AAED,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS;QACb,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,EAAE,MAAM,CAAC;KACzB,EAAE,CAAC;CACL;AAED,MAAM,MAAM,qBAAqB,GAC7B;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAIN,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA+FlC;AA8BD,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAClD,eAAe,CAAC,EAAE,SAAS,6BAA6B,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CAC/E;AAGD,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAC,GAAG,IAAI,CAAC,CA6C9C;AAkBD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAClD,eAAe,CAAC,EAAE,SAAS,6BAA6B,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CAC/E;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,CA4BjF;AAED,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC9D,eAAO,MAAM,kBAAkB,yBAAmB,CAAC;AAEnD,wBAAsB,iCAAiC,CAAC,MAAM,EAAE;IAC9D,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CA6CjE"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/jobs.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { readPersistedWorkflowModel } from '@shipfox/api-definitions-dto';
1
2
  import { WORKFLOWS_JOB_TERMINATED } from '@shipfox/api-workflows-dto';
2
3
  import { and, asc, desc, eq, inArray, notInArray, sql } from 'drizzle-orm';
3
4
  import { isJobTerminal } from '#core/entities/job.js';
@@ -87,7 +88,8 @@ export async function evaluateJobActivations(params) {
87
88
  const target = targetsByJobId.get(input.jobId);
88
89
  if (!target) throw new Error(`Cannot evaluate missing activation job: ${input.jobId}`);
89
90
  const job = toJob(target.job);
90
- const modelJob = target.attempt.model?.jobs.find((item)=>item.key === target.job.key);
91
+ const model = target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);
92
+ const modelJob = model?.jobs.find((item)=>item.key === target.job.key);
91
93
  const decision = decideJobActivation({
92
94
  run: toWorkflowRun(target.run),
93
95
  job,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/jobs.ts"],"sourcesContent":["import {WORKFLOWS_JOB_TERMINATED} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, inArray, notInArray, sql} from 'drizzle-orm';\nimport {isJobTerminal, type Job, type JobStatus, type JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution} from '#core/entities/job-execution.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport {JobNotFoundError} from '#core/errors.js';\nimport {\n type DeriveJobSuccessResult,\n decideJobActivation,\n deriveJobSuccess,\n runtimeCompletionStatusForJob,\n} from '#core/job-transition/index.js';\nimport type {JobContextInput} from '#core/step-config/assemble-run-context.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {recordWorkflowJobStatusChanged} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getWorkflowRunById} from './queries.js';\nimport {getWorkflowContextForJob, optimisticLockRetry, TERMINAL_JOB_STATUSES} from './shared.js';\n\nexport async function getJobsByWorkflowRunAttemptId(workflowRunAttemptId: string): Promise<Job[]> {\n const rows = await db()\n .select()\n .from(jobs)\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobs.position));\n return rows.map(toJob);\n}\n\nexport async function getJobsByWorkflowRunId(workflowRunId: string): Promise<Job[]> {\n const run = await getWorkflowRunById(workflowRunId);\n if (!run) return [];\n const [attempt] = await db()\n .select()\n .from(workflowRunAttempts)\n .where(\n and(\n eq(workflowRunAttempts.workflowRunId, run.id),\n eq(workflowRunAttempts.attempt, run.currentAttempt),\n ),\n )\n .limit(1);\n return attempt ? getJobsByWorkflowRunAttemptId(attempt.id) : [];\n}\n\nexport async function getJobById(id: string): Promise<Job | undefined> {\n const rows = await db().select().from(jobs).where(eq(jobs.id, id)).limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toJob(row);\n}\n\nexport interface JobScope {\n workspaceId: string;\n projectId: string;\n}\n\nexport async function getJobScope(jobId: string): Promise<JobScope | undefined> {\n const rows = await db()\n .select({workspaceId: workflowRuns.workspaceId, projectId: workflowRuns.projectId})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, jobId))\n .limit(1);\n return rows[0];\n}\n\nexport async function getDirectDependencyJobContexts(\n jobId: string,\n tx?: Tx,\n): Promise<JobContextInput[]> {\n const targetRows = await (tx ?? db()).select().from(jobs).where(eq(jobs.id, jobId)).limit(1);\n const target = targetRows[0];\n if (!target || target.dependencies.length === 0) return [];\n\n const rows = await (tx ?? db())\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(\n and(\n eq(jobs.workflowRunAttemptId, target.workflowRunAttemptId),\n inArray(jobs.key, target.dependencies),\n ),\n )\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobId = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobId.get(row.job.id);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobId.set(row.job.id, context);\n }\n if (row.execution) context.executions.push(toJobExecution(row.execution));\n }\n\n return [...contextsByJobId.values()];\n}\n\nexport interface EvaluateJobActivationsParams {\n runAttemptId: string;\n jobs: readonly {\n jobId: string;\n expectedVersion: number;\n }[];\n}\n\nexport type JobActivationDecision =\n | {\n kind: 'start-job';\n jobId: string;\n }\n | {\n kind: 'terminal-job';\n jobId: string;\n status: RuntimeCompletionStatus;\n jobVersion: number;\n };\n\ntype InternalJobActivationDecision = JobActivationDecision & {changed?: boolean};\n\nexport async function evaluateJobActivations(\n params: EvaluateJobActivationsParams,\n): Promise<JobActivationDecision[]> {\n if (params.jobs.length === 0) return [];\n\n const result = await db().transaction(async (tx) => {\n const expectedVersions = new Map(\n params.jobs.map((job) => [job.jobId, job.expectedVersion] as const),\n );\n const jobIds = params.jobs.map((job) => job.jobId);\n const targets = await tx\n .select({job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(and(eq(jobs.workflowRunAttemptId, params.runAttemptId), inArray(jobs.id, jobIds)))\n .for('update');\n\n if (targets.length !== jobIds.length) {\n const found = new Set(targets.map((target) => target.job.id));\n const missing = jobIds.filter((jobId) => !found.has(jobId));\n throw new Error(`Cannot evaluate missing activation jobs: ${missing.join(', ')}`);\n }\n\n const contextsByJobKey = await directDependencyContextsByJobKey(\n tx,\n params.runAttemptId,\n targets.map((target) => toJob(target.job)),\n );\n const targetsByJobId = new Map(targets.map((target) => [target.job.id, target]));\n const decisions: InternalJobActivationDecision[] = [];\n\n for (const input of params.jobs) {\n const target = targetsByJobId.get(input.jobId);\n if (!target) throw new Error(`Cannot evaluate missing activation job: ${input.jobId}`);\n const job = toJob(target.job);\n const modelJob = target.attempt.model?.jobs.find((item) => item.key === target.job.key);\n const decision = decideJobActivation({\n run: toWorkflowRun(target.run),\n job,\n condition: modelJob?.if,\n dependencies: job.dependencies.flatMap((key) => {\n const dependency = contextsByJobKey.get(key);\n return dependency === undefined ? [] : [dependency];\n }),\n });\n\n if (decision.kind === 'terminal-job' || decision.kind === 'start-job') {\n decisions.push(decision);\n continue;\n }\n\n const expectedVersion = expectedVersions.get(job.id);\n if (expectedVersion === undefined) {\n throw new Error(`Missing expected version for activation job ${job.id}`);\n }\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: job.id,\n status: decision.status,\n expectedVersion,\n statusReason: decision.statusReason,\n evaluationTrace: decision.evaluationTrace,\n });\n if (updated) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: 'skipped',\n jobVersion: updated.job.version,\n changed: updated.changed,\n });\n continue;\n }\n\n const [existing] = await tx.select().from(jobs).where(eq(jobs.id, job.id)).limit(1);\n if (existing && isJobTerminal(existing.status)) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: runtimeCompletionStatusForJob(existing.status),\n jobVersion: existing.version,\n });\n continue;\n }\n throw new Error(`Optimistic lock failure evaluating activation for job ${job.id}`);\n }\n\n return decisions;\n });\n\n for (const decision of result) {\n if (decision.kind === 'terminal-job' && decision.changed) {\n recordWorkflowJobStatusChanged(decision.status);\n }\n }\n\n return result.map(({changed: _changed, ...decision}) => decision);\n}\n\nasync function directDependencyContextsByJobKey(\n tx: Tx,\n runAttemptId: string,\n targetJobs: readonly Job[],\n): Promise<ReadonlyMap<string, JobContextInput>> {\n const dependencyKeys = new Set(targetJobs.flatMap((job) => job.dependencies));\n if (dependencyKeys.size === 0) return new Map();\n\n const rows = await tx\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(and(eq(jobs.workflowRunAttemptId, runAttemptId), inArray(jobs.key, [...dependencyKeys])))\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobKey = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobKey.get(row.job.key);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobKey.set(row.job.key, context);\n }\n if (row.execution) context.executions.push(toJobExecution(row.execution));\n }\n\n return contextsByJobKey;\n}\n\nexport interface UpdateJobStatusAtVersionParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\n// Returns null on version mismatch so callers can choose throw vs treat-as-success.\nexport async function updateJobStatusAtVersion(\n tx: Tx,\n params: UpdateJobStatusAtVersionParams,\n): Promise<{job: Job; changed: boolean} | null> {\n const outputs = isJobTerminal(params.status)\n ? await reduceJobOutputs(tx, {jobId: params.jobId, status: params.status})\n : undefined;\n const rows = await tx\n .update(jobs)\n .set({\n status: params.status,\n statusReason: params.statusReason ?? null,\n ...(outputs === undefined ? {} : {outputs}),\n ...(params.evaluationTrace === undefined ? {} : {evaluationTrace: params.evaluationTrace}),\n version: sql`${jobs.version} + 1`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(jobs.id, params.jobId),\n eq(jobs.version, params.expectedVersion),\n notInArray(jobs.status, TERMINAL_JOB_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n const job = toJob(row);\n\n // Every terminal job-status write funnels through this one guarded UPDATE, where the\n // version match lets a single caller win. Emitting here, in the same transaction,\n // makes the terminal fact fire exactly once across all paths.\n if (isJobTerminal(job.status)) {\n const identity = await getWorkflowContextForJob(job.id, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_TERMINATED,\n payload: {\n jobId: job.id,\n workflowRunId: identity.workflowRunId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n status: job.status,\n statusReason: job.statusReason,\n },\n });\n }\n\n return {job, changed: true};\n}\n\nasync function reduceJobOutputs(\n tx: Tx,\n params: {jobId: string; status: JobStatus},\n): Promise<Record<string, unknown> | null> {\n if (params.status !== 'succeeded') return null;\n\n const [row] = await tx\n .select({outputs: jobExecutions.outputs})\n .from(jobExecutions)\n .where(and(eq(jobExecutions.jobId, params.jobId), eq(jobExecutions.status, 'succeeded')))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n\n return row?.outputs ? {...row.outputs} : null;\n}\n\nexport interface UpdateJobStatusParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\nexport async function updateJobStatus(params: UpdateJobStatusParams): Promise<Job> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n evaluationTrace: params.evaluationTrace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n return row ? toJob(row) : undefined;\n },\n matchFn: (job) =>\n (job.status === params.status && job.statusReason === statusReason) ||\n isJobTerminal(job.status)\n ? {job, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n\n return result.job;\n}\n\nexport type EvaluateJobSuccessResult = DeriveJobSuccessResult;\nexport const evaluateJobSuccess = deriveJobSuccess;\n\nexport async function resolveJobStatusFromJobExecutions(params: {\n jobId: string;\n}): Promise<{status: RuntimeCompletionStatus; jobVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobRow = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!jobRow) throw new JobNotFoundError(params.jobId);\n\n const jobExecutionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, params.jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n if (jobExecutionRows.length === 0) {\n throw new Error(`Cannot resolve job ${params.jobId}: no job executions found`);\n }\n\n const {status, statusReason, trace} = evaluateJobSuccess({\n success: jobRow.success,\n executions: jobExecutionRows.map(toJobExecution),\n jobs: await getDirectDependencyJobContexts(params.jobId, tx),\n });\n\n return optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status,\n expectedVersion: jobRow.version,\n statusReason,\n evaluationTrace: trace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!row) throw new JobNotFoundError(params.jobId);\n return toJob(row);\n },\n matchFn: (job) => ({job, changed: false}),\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${jobRow.version}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n return {\n status: result.job.status === 'succeeded' ? 'succeeded' : 'failed',\n jobVersion: result.job.version,\n };\n}\n"],"names":["WORKFLOWS_JOB_TERMINATED","and","asc","desc","eq","inArray","notInArray","sql","isJobTerminal","JobNotFoundError","decideJobActivation","deriveJobSuccess","runtimeCompletionStatusForJob","recordWorkflowJobStatusChanged","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","workflowRunAttempts","toWorkflowRun","workflowRuns","getWorkflowRunById","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_JOB_STATUSES","getJobsByWorkflowRunAttemptId","workflowRunAttemptId","rows","select","from","where","orderBy","position","map","getJobsByWorkflowRunId","workflowRunId","run","attempt","id","currentAttempt","limit","getJobById","row","undefined","getJobScope","jobId","workspaceId","projectId","innerJoin","getDirectDependencyJobContexts","tx","targetRows","target","dependencies","length","job","execution","leftJoin","key","sequence","contextsByJobId","Map","context","get","executions","set","push","values","evaluateJobActivations","params","result","transaction","expectedVersions","expectedVersion","jobIds","targets","runAttemptId","for","found","Set","missing","filter","has","Error","join","contextsByJobKey","directDependencyContextsByJobKey","targetsByJobId","decisions","input","modelJob","model","find","item","decision","condition","if","flatMap","dependency","kind","updated","updateJobStatusAtVersion","status","statusReason","evaluationTrace","jobVersion","version","changed","existing","_changed","targetJobs","dependencyKeys","size","outputs","reduceJobOutputs","update","updatedAt","Date","returning","identity","type","payload","updateJobStatus","updateFn","fetchFn","matchFn","failureMessage","evaluateJobSuccess","resolveJobStatusFromJobExecutions","jobRow","jobExecutionRows","trace","success"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/jobs.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport {WORKFLOWS_JOB_TERMINATED} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, inArray, notInArray, sql} from 'drizzle-orm';\nimport {isJobTerminal, type Job, type JobStatus, type JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution} from '#core/entities/job-execution.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport {JobNotFoundError} from '#core/errors.js';\nimport {\n type DeriveJobSuccessResult,\n decideJobActivation,\n deriveJobSuccess,\n runtimeCompletionStatusForJob,\n} from '#core/job-transition/index.js';\nimport type {JobContextInput} from '#core/step-config/assemble-run-context.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {recordWorkflowJobStatusChanged} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getWorkflowRunById} from './queries.js';\nimport {getWorkflowContextForJob, optimisticLockRetry, TERMINAL_JOB_STATUSES} from './shared.js';\n\nexport async function getJobsByWorkflowRunAttemptId(workflowRunAttemptId: string): Promise<Job[]> {\n const rows = await db()\n .select()\n .from(jobs)\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobs.position));\n return rows.map(toJob);\n}\n\nexport async function getJobsByWorkflowRunId(workflowRunId: string): Promise<Job[]> {\n const run = await getWorkflowRunById(workflowRunId);\n if (!run) return [];\n const [attempt] = await db()\n .select()\n .from(workflowRunAttempts)\n .where(\n and(\n eq(workflowRunAttempts.workflowRunId, run.id),\n eq(workflowRunAttempts.attempt, run.currentAttempt),\n ),\n )\n .limit(1);\n return attempt ? getJobsByWorkflowRunAttemptId(attempt.id) : [];\n}\n\nexport async function getJobById(id: string): Promise<Job | undefined> {\n const rows = await db().select().from(jobs).where(eq(jobs.id, id)).limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toJob(row);\n}\n\nexport interface JobScope {\n workspaceId: string;\n projectId: string;\n}\n\nexport async function getJobScope(jobId: string): Promise<JobScope | undefined> {\n const rows = await db()\n .select({workspaceId: workflowRuns.workspaceId, projectId: workflowRuns.projectId})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, jobId))\n .limit(1);\n return rows[0];\n}\n\nexport async function getDirectDependencyJobContexts(\n jobId: string,\n tx?: Tx,\n): Promise<JobContextInput[]> {\n const targetRows = await (tx ?? db()).select().from(jobs).where(eq(jobs.id, jobId)).limit(1);\n const target = targetRows[0];\n if (!target || target.dependencies.length === 0) return [];\n\n const rows = await (tx ?? db())\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(\n and(\n eq(jobs.workflowRunAttemptId, target.workflowRunAttemptId),\n inArray(jobs.key, target.dependencies),\n ),\n )\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobId = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobId.get(row.job.id);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobId.set(row.job.id, context);\n }\n if (row.execution) context.executions.push(toJobExecution(row.execution));\n }\n\n return [...contextsByJobId.values()];\n}\n\nexport interface EvaluateJobActivationsParams {\n runAttemptId: string;\n jobs: readonly {\n jobId: string;\n expectedVersion: number;\n }[];\n}\n\nexport type JobActivationDecision =\n | {\n kind: 'start-job';\n jobId: string;\n }\n | {\n kind: 'terminal-job';\n jobId: string;\n status: RuntimeCompletionStatus;\n jobVersion: number;\n };\n\ntype InternalJobActivationDecision = JobActivationDecision & {changed?: boolean};\n\nexport async function evaluateJobActivations(\n params: EvaluateJobActivationsParams,\n): Promise<JobActivationDecision[]> {\n if (params.jobs.length === 0) return [];\n\n const result = await db().transaction(async (tx) => {\n const expectedVersions = new Map(\n params.jobs.map((job) => [job.jobId, job.expectedVersion] as const),\n );\n const jobIds = params.jobs.map((job) => job.jobId);\n const targets = await tx\n .select({job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(and(eq(jobs.workflowRunAttemptId, params.runAttemptId), inArray(jobs.id, jobIds)))\n .for('update');\n\n if (targets.length !== jobIds.length) {\n const found = new Set(targets.map((target) => target.job.id));\n const missing = jobIds.filter((jobId) => !found.has(jobId));\n throw new Error(`Cannot evaluate missing activation jobs: ${missing.join(', ')}`);\n }\n\n const contextsByJobKey = await directDependencyContextsByJobKey(\n tx,\n params.runAttemptId,\n targets.map((target) => toJob(target.job)),\n );\n const targetsByJobId = new Map(targets.map((target) => [target.job.id, target]));\n const decisions: InternalJobActivationDecision[] = [];\n\n for (const input of params.jobs) {\n const target = targetsByJobId.get(input.jobId);\n if (!target) throw new Error(`Cannot evaluate missing activation job: ${input.jobId}`);\n const job = toJob(target.job);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n const modelJob = model?.jobs.find((item) => item.key === target.job.key);\n const decision = decideJobActivation({\n run: toWorkflowRun(target.run),\n job,\n condition: modelJob?.if,\n dependencies: job.dependencies.flatMap((key) => {\n const dependency = contextsByJobKey.get(key);\n return dependency === undefined ? [] : [dependency];\n }),\n });\n\n if (decision.kind === 'terminal-job' || decision.kind === 'start-job') {\n decisions.push(decision);\n continue;\n }\n\n const expectedVersion = expectedVersions.get(job.id);\n if (expectedVersion === undefined) {\n throw new Error(`Missing expected version for activation job ${job.id}`);\n }\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: job.id,\n status: decision.status,\n expectedVersion,\n statusReason: decision.statusReason,\n evaluationTrace: decision.evaluationTrace,\n });\n if (updated) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: 'skipped',\n jobVersion: updated.job.version,\n changed: updated.changed,\n });\n continue;\n }\n\n const [existing] = await tx.select().from(jobs).where(eq(jobs.id, job.id)).limit(1);\n if (existing && isJobTerminal(existing.status)) {\n decisions.push({\n kind: 'terminal-job',\n jobId: job.id,\n status: runtimeCompletionStatusForJob(existing.status),\n jobVersion: existing.version,\n });\n continue;\n }\n throw new Error(`Optimistic lock failure evaluating activation for job ${job.id}`);\n }\n\n return decisions;\n });\n\n for (const decision of result) {\n if (decision.kind === 'terminal-job' && decision.changed) {\n recordWorkflowJobStatusChanged(decision.status);\n }\n }\n\n return result.map(({changed: _changed, ...decision}) => decision);\n}\n\nasync function directDependencyContextsByJobKey(\n tx: Tx,\n runAttemptId: string,\n targetJobs: readonly Job[],\n): Promise<ReadonlyMap<string, JobContextInput>> {\n const dependencyKeys = new Set(targetJobs.flatMap((job) => job.dependencies));\n if (dependencyKeys.size === 0) return new Map();\n\n const rows = await tx\n .select({job: jobs, execution: jobExecutions})\n .from(jobs)\n .leftJoin(jobExecutions, eq(jobExecutions.jobId, jobs.id))\n .where(and(eq(jobs.workflowRunAttemptId, runAttemptId), inArray(jobs.key, [...dependencyKeys])))\n .orderBy(asc(jobs.position), asc(jobs.id), asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n const contextsByJobKey = new Map<string, JobContextInput & {executions: JobExecution[]}>();\n for (const row of rows) {\n let context = contextsByJobKey.get(row.job.key);\n if (!context) {\n context = {job: toJob(row.job), executions: []};\n contextsByJobKey.set(row.job.key, context);\n }\n if (row.execution) context.executions.push(toJobExecution(row.execution));\n }\n\n return contextsByJobKey;\n}\n\nexport interface UpdateJobStatusAtVersionParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\n// Returns null on version mismatch so callers can choose throw vs treat-as-success.\nexport async function updateJobStatusAtVersion(\n tx: Tx,\n params: UpdateJobStatusAtVersionParams,\n): Promise<{job: Job; changed: boolean} | null> {\n const outputs = isJobTerminal(params.status)\n ? await reduceJobOutputs(tx, {jobId: params.jobId, status: params.status})\n : undefined;\n const rows = await tx\n .update(jobs)\n .set({\n status: params.status,\n statusReason: params.statusReason ?? null,\n ...(outputs === undefined ? {} : {outputs}),\n ...(params.evaluationTrace === undefined ? {} : {evaluationTrace: params.evaluationTrace}),\n version: sql`${jobs.version} + 1`,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(jobs.id, params.jobId),\n eq(jobs.version, params.expectedVersion),\n notInArray(jobs.status, TERMINAL_JOB_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n const job = toJob(row);\n\n // Every terminal job-status write funnels through this one guarded UPDATE, where the\n // version match lets a single caller win. Emitting here, in the same transaction,\n // makes the terminal fact fire exactly once across all paths.\n if (isJobTerminal(job.status)) {\n const identity = await getWorkflowContextForJob(job.id, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_TERMINATED,\n payload: {\n jobId: job.id,\n workflowRunId: identity.workflowRunId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n status: job.status,\n statusReason: job.statusReason,\n },\n });\n }\n\n return {job, changed: true};\n}\n\nasync function reduceJobOutputs(\n tx: Tx,\n params: {jobId: string; status: JobStatus},\n): Promise<Record<string, unknown> | null> {\n if (params.status !== 'succeeded') return null;\n\n const [row] = await tx\n .select({outputs: jobExecutions.outputs})\n .from(jobExecutions)\n .where(and(eq(jobExecutions.jobId, params.jobId), eq(jobExecutions.status, 'succeeded')))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n\n return row?.outputs ? {...row.outputs} : null;\n}\n\nexport interface UpdateJobStatusParams {\n jobId: string;\n status: JobStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n evaluationTrace?: readonly PersistedEvaluationTraceEntry[] | null | undefined;\n}\n\nexport async function updateJobStatus(params: UpdateJobStatusParams): Promise<Job> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n evaluationTrace: params.evaluationTrace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n return row ? toJob(row) : undefined;\n },\n matchFn: (job) =>\n (job.status === params.status && job.statusReason === statusReason) ||\n isJobTerminal(job.status)\n ? {job, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n\n return result.job;\n}\n\nexport type EvaluateJobSuccessResult = DeriveJobSuccessResult;\nexport const evaluateJobSuccess = deriveJobSuccess;\n\nexport async function resolveJobStatusFromJobExecutions(params: {\n jobId: string;\n}): Promise<{status: RuntimeCompletionStatus; jobVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobRow = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!jobRow) throw new JobNotFoundError(params.jobId);\n\n const jobExecutionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, params.jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n\n if (jobExecutionRows.length === 0) {\n throw new Error(`Cannot resolve job ${params.jobId}: no job executions found`);\n }\n\n const {status, statusReason, trace} = evaluateJobSuccess({\n success: jobRow.success,\n executions: jobExecutionRows.map(toJobExecution),\n jobs: await getDirectDependencyJobContexts(params.jobId, tx),\n });\n\n return optimisticLockRetry({\n updateFn: () =>\n updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status,\n expectedVersion: jobRow.version,\n statusReason,\n evaluationTrace: trace,\n }),\n fetchFn: async () => {\n const row = (await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1))[0];\n if (!row) throw new JobNotFoundError(params.jobId);\n return toJob(row);\n },\n matchFn: (job) => ({job, changed: false}),\n failureMessage: `Optimistic lock failure: job ${params.jobId} version ${jobRow.version}`,\n });\n });\n\n if (result.changed) recordWorkflowJobStatusChanged(result.job.status);\n return {\n status: result.job.status === 'succeeded' ? 'succeeded' : 'failed',\n jobVersion: result.job.version,\n };\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_TERMINATED","and","asc","desc","eq","inArray","notInArray","sql","isJobTerminal","JobNotFoundError","decideJobActivation","deriveJobSuccess","runtimeCompletionStatusForJob","recordWorkflowJobStatusChanged","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","workflowRunAttempts","toWorkflowRun","workflowRuns","getWorkflowRunById","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_JOB_STATUSES","getJobsByWorkflowRunAttemptId","workflowRunAttemptId","rows","select","from","where","orderBy","position","map","getJobsByWorkflowRunId","workflowRunId","run","attempt","id","currentAttempt","limit","getJobById","row","undefined","getJobScope","jobId","workspaceId","projectId","innerJoin","getDirectDependencyJobContexts","tx","targetRows","target","dependencies","length","job","execution","leftJoin","key","sequence","contextsByJobId","Map","context","get","executions","set","push","values","evaluateJobActivations","params","result","transaction","expectedVersions","expectedVersion","jobIds","targets","runAttemptId","for","found","Set","missing","filter","has","Error","join","contextsByJobKey","directDependencyContextsByJobKey","targetsByJobId","decisions","input","model","modelJob","find","item","decision","condition","if","flatMap","dependency","kind","updated","updateJobStatusAtVersion","status","statusReason","evaluationTrace","jobVersion","version","changed","existing","_changed","targetJobs","dependencyKeys","size","outputs","reduceJobOutputs","update","updatedAt","Date","returning","identity","type","payload","updateJobStatus","updateFn","fetchFn","matchFn","failureMessage","evaluateJobSuccess","resolveJobStatusFromJobExecutions","jobRow","jobExecutionRows","trace","success"],"mappings":"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"}
@@ -1,5 +1,8 @@
1
- import { type AgentDefaultsResolver } from '@shipfox/api-agent/core/resolve-agent-config';
2
- import type { WorkflowModel } from '@shipfox/api-definitions';
1
+ import { type WorkflowModel } from '@shipfox/api-definitions-dto';
2
+ import type { IntegrationsModuleClient } from '@shipfox/api-integration-core-dto';
3
+ import type { ProjectsModuleClient } from '@shipfox/api-projects-dto';
4
+ import type { SecretsInterModuleClient } from '@shipfox/api-secrets-dto/inter-module';
5
+ import type { AgentDefaultsResolver } from '#core/agent-defaults.js';
3
6
  import type { TriggerPayload, WorkflowRun, WorkflowSourceSnapshot } from '#core/entities/workflow-run.js';
4
7
  import { InterpolationUnresolvableError } from '#core/errors.js';
5
8
  export type WorkflowModelJob = WorkflowModel['jobs'][number];
@@ -20,6 +23,9 @@ export interface CreateWorkflowRunParams {
20
23
  sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;
21
24
  triggerIdempotencyKey?: string | undefined;
22
25
  resolveAgentDefaults?: AgentDefaultsResolver | undefined;
26
+ secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;
27
+ integrations?: IntegrationsModuleClient | undefined;
28
+ projects?: ProjectsModuleClient | undefined;
23
29
  }
24
30
  export declare function createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun>;
25
31
  export declare function loadReferencedVariables(params: {
@@ -28,5 +34,6 @@ export declare function loadReferencedVariables(params: {
28
34
  readonly workspaceId: string;
29
35
  readonly projectId: string;
30
36
  readonly definitionId: string;
37
+ readonly secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;
31
38
  }): Promise<Record<string, string> | undefined>;
32
39
  //# sourceMappingURL=run-create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-create.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/run-create.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,8CAA8C,CAAC;AACtD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAS5D,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,sBAAsB,EACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAC,8BAA8B,EAAC,MAAM,iBAAiB,CAAC;AAa/D,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,cAAc,CAAC,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3D,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,oBAAoB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CAC1D;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuH7F;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAqB9C"}
1
+ {"version":3,"file":"run-create.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/run-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAC7F,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAIpF,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAKnE,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,sBAAsB,EACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAC,8BAA8B,EAAC,MAAM,iBAAiB,CAAC;AAa/D,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,cAAc,CAAC,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3D,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,oBAAoB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACzD,OAAO,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,GAAG,SAAS,CAAC;IAChF,YAAY,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC7C;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CA6H7F;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,GAAG,SAAS,CAAC;CAC1F,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAsB9C"}
@@ -1,5 +1,4 @@
1
- import { catalogDefaultAgentResolver } from '@shipfox/api-agent/core/resolve-agent-config';
2
- import { getVariablesByNamespace } from '@shipfox/api-secrets';
1
+ import { createWorkflowModelSnapshot } from '@shipfox/api-definitions-dto';
3
2
  import { analyzeContextKeyAccess } from '@shipfox/expression';
4
3
  import { logger } from '@shipfox/node-opentelemetry';
5
4
  import { eq } from 'drizzle-orm';
@@ -12,10 +11,12 @@ import { workflowRunAttempts } from '../schema/workflow-run-attempts.js';
12
11
  import { toWorkflowRun, workflowRuns } from '../schema/workflow-runs.js';
13
12
  import { persistMaterializedRunGraph } from './run-graph.js';
14
13
  export async function createWorkflowRun(params) {
15
- const agentToolContext = await loadAgentToolMaterializationContext({
14
+ const agentToolContext = params.integrations === undefined ? undefined : await loadAgentToolMaterializationContext({
16
15
  model: params.model,
17
16
  workspaceId: params.workspaceId,
18
- projectId: params.projectId
17
+ projectId: params.projectId,
18
+ integrations: params.integrations,
19
+ projects: params.projects
19
20
  });
20
21
  const agentToolMaterialization = createAgentToolMaterializationSnapshot({
21
22
  model: params.model,
@@ -60,7 +61,7 @@ export async function createWorkflowRun(params) {
60
61
  workflowRunId: runRow.id,
61
62
  attempt: 1,
62
63
  status: 'pending',
63
- model: params.model,
64
+ model: createWorkflowModelSnapshot(params.model),
64
65
  agentToolMaterialization
65
66
  }).returning();
66
67
  if (!attemptRow) throw new Error('Insert returned no rows');
@@ -73,15 +74,16 @@ export async function createWorkflowRun(params) {
73
74
  jobs: oneShotJobs,
74
75
  workspaceId: params.workspaceId,
75
76
  projectId: params.projectId,
76
- definitionId: params.definitionId
77
+ definitionId: params.definitionId,
78
+ secrets: params.secrets
77
79
  });
78
- const materializedJobs = materializeWorkflowRunJobs({
80
+ const materializedJobs = await materializeWorkflowRunJobs({
79
81
  run,
80
82
  model: params.model,
81
83
  triggerPayload: params.triggerPayload,
82
84
  inputs: params.inputs ?? null,
83
85
  vars,
84
- resolveAgentDefaults: params.resolveAgentDefaults ?? catalogDefaultAgentResolver,
86
+ resolveAgentDefaults: params.resolveAgentDefaults,
85
87
  definitionId: params.definitionId,
86
88
  agentToolContext,
87
89
  agentToolSnapshot: agentToolMaterialization
@@ -119,7 +121,8 @@ export async function loadReferencedVariables(params) {
119
121
  ...new Set(references.map((reference)=>reference.key))
120
122
  ].sort();
121
123
  if (keys.length === 0) return undefined;
122
- const vars = await getVariablesByNamespace({
124
+ if (!params.secrets) throw new Error('Secrets client is not configured.');
125
+ const { values: vars } = await params.secrets.getVariablesByNamespace({
123
126
  workspaceId: params.workspaceId,
124
127
  projectId: params.projectId,
125
128
  namespace: ''
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/run-create.ts"],"sourcesContent":["import {\n type AgentDefaultsResolver,\n catalogDefaultAgentResolver,\n} from '@shipfox/api-agent/core/resolve-agent-config';\nimport type {WorkflowModel} from '@shipfox/api-definitions';\nimport {getVariablesByNamespace} from '@shipfox/api-secrets';\nimport {analyzeContextKeyAccess, type ResolvedFieldSegment} from '@shipfox/expression';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {eq} from 'drizzle-orm';\nimport {\n createAgentToolMaterializationSnapshot,\n loadAgentToolMaterializationContext,\n} from '#core/agent-tools.js';\nimport type {\n TriggerPayload,\n WorkflowRun,\n WorkflowSourceSnapshot,\n} from '#core/entities/workflow-run.js';\nimport {InterpolationUnresolvableError} from '#core/errors.js';\nimport type {MaterializedWorkflowJob} from '#core/step-config/materialize-workflow-model.js';\nimport type {WorkflowStepTemplateDiagnostic} from '#core/step-config/resolve-step-config.js';\nimport {\n deriveInitialJobExecutionPlan,\n materializeWorkflowRunJobs,\n} from '#core/workflow-run-creation.js';\nimport {recordWorkflowRunCreated} from '#metrics/instance.js';\nimport {db} from '../db.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {type MaterializedRunGraphJob, persistMaterializedRunGraph} from './run-graph.js';\n\nexport type WorkflowModelJob = WorkflowModel['jobs'][number];\n\nexport interface ReferencedVariable {\n readonly key: string;\n readonly field: InterpolationUnresolvableError['field'];\n readonly source: string;\n readonly envKey?: string | undefined;\n}\n\nexport interface CreateWorkflowRunParams {\n workspaceId: string;\n projectId: string;\n definitionId: string;\n name?: string | undefined;\n model: WorkflowModel;\n triggerPayload: TriggerPayload;\n inputs?: Record<string, unknown> | undefined;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n triggerIdempotencyKey?: string | undefined;\n resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n}\n\nexport async function createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun> {\n const agentToolContext = await loadAgentToolMaterializationContext({\n model: params.model,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n });\n const agentToolMaterialization = createAgentToolMaterializationSnapshot({\n model: params.model,\n context: agentToolContext,\n });\n const result = await db().transaction(async (tx) => {\n const insertResult = await tx\n .insert(workflowRuns)\n .values({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n name: params.name ?? params.model.name,\n status: 'pending',\n currentAttempt: 1,\n triggerProvider: params.triggerPayload.provider ?? null,\n triggerSource: params.triggerPayload.source,\n triggerEvent: params.triggerPayload.event,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n sourceSnapshot: params.sourceSnapshot ?? null,\n triggerIdempotencyKey: params.triggerIdempotencyKey ?? null,\n })\n .onConflictDoNothing({target: workflowRuns.triggerIdempotencyKey})\n .returning();\n\n const runRow = insertResult[0];\n if (!runRow) {\n // Conflict path: skip jobs/steps/outbox so the first insert keeps ownership of side effects.\n if (!params.triggerIdempotencyKey) {\n throw new Error('Insert returned no rows');\n }\n const existing = await tx\n .select()\n .from(workflowRuns)\n .where(eq(workflowRuns.triggerIdempotencyKey, params.triggerIdempotencyKey))\n .limit(1);\n const existingRow = existing[0];\n if (!existingRow) {\n throw new Error(\n `Idempotency conflict but existing run missing for key ${params.triggerIdempotencyKey}`,\n );\n }\n return {run: toWorkflowRun(existingRow), created: false};\n }\n\n const run = toWorkflowRun(runRow);\n const [attemptRow] = await tx\n .insert(workflowRunAttempts)\n .values({\n workflowRunId: runRow.id,\n attempt: 1,\n status: 'pending',\n model: params.model,\n agentToolMaterialization,\n })\n .returning();\n if (!attemptRow) throw new Error('Insert returned no rows');\n\n // Resolving one-shot templates here gives interpolation access to the inserted run id.\n // If resolution fails, the transaction rolls back the run, jobs, steps, and outbox event together.\n // Listening steps are resolved later when a job execution is created.\n const oneShotJobs = params.model.jobs.filter((job) => job.mode !== 'listening');\n const vars = await loadReferencedVariables({\n model: params.model,\n jobs: oneShotJobs,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n });\n const materializedJobs = materializeWorkflowRunJobs({\n run,\n model: params.model,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n vars,\n resolveAgentDefaults: params.resolveAgentDefaults ?? catalogDefaultAgentResolver,\n definitionId: params.definitionId,\n agentToolContext,\n agentToolSnapshot: agentToolMaterialization,\n });\n\n const graphJobs = materializeRunGraphJobs({\n params,\n run,\n vars,\n materializedJobs,\n });\n await persistMaterializedRunGraph(tx, {\n run,\n workflowRunAttempt: attemptRow,\n materializedJobs: graphJobs,\n });\n\n logTemplateDiagnostics({\n workflowRunId: runRow.id,\n diagnostics: materializedJobs.flatMap((job) =>\n job.steps.flatMap((step) =>\n (step.diagnostics ?? []).map((diagnostic) => ({\n jobKey: job.key,\n stepName: step.name,\n ...diagnostic,\n })),\n ),\n ),\n });\n\n return {run, created: true};\n });\n\n if (result.created)\n recordWorkflowRunCreated(result.run.triggerPayload.provider ?? result.run.triggerSource);\n\n return result.run;\n}\n\nexport async function loadReferencedVariables(params: {\n readonly model: WorkflowModel;\n readonly jobs?: readonly WorkflowModelJob[] | undefined;\n readonly workspaceId: string;\n readonly projectId: string;\n readonly definitionId: string;\n}): Promise<Record<string, string> | undefined> {\n const references = referencedVariables(params.model, params.jobs ?? params.model.jobs);\n const keys = [...new Set(references.map((reference) => reference.key))].sort();\n if (keys.length === 0) return undefined;\n\n const vars = await getVariablesByNamespace({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n namespace: '',\n });\n const missingKey = keys.find((key) => !(key in vars));\n if (missingKey !== undefined) {\n const reference = references.find((candidate) => candidate.key === missingKey);\n throw new InterpolationUnresolvableError(params.definitionId, {\n field: reference?.field ?? 'env',\n source: reference?.source ?? `vars.${missingKey}`,\n ...(reference?.envKey === undefined ? {} : {envKey: reference.envKey}),\n });\n }\n\n return vars;\n}\n\nfunction materializeRunGraphJobs(params: {\n readonly params: CreateWorkflowRunParams;\n readonly run: WorkflowRun;\n readonly vars: Record<string, string> | undefined;\n readonly materializedJobs: readonly MaterializedWorkflowJob[];\n}): readonly MaterializedRunGraphJob[] {\n return params.materializedJobs.map((job, jobIndex) => ({\n job: {\n key: job.key,\n mode: job.mode,\n name: workflowTemplateSource(job.name),\n status: 'pending' as const,\n checkoutPersistCredentials: job.checkout.persistCredentials,\n checkoutPermissionsContents: job.checkout.permissions.contents,\n success: job.success ?? null,\n executionTimeoutMs: job.executionTimeoutMs ?? null,\n listeningTimeoutMs: job.listening?.timeoutMs ?? null,\n maxExecutions: job.listening?.maxExecutions ?? null,\n onResolve: job.listening?.onResolve ?? null,\n batchDebounceMs: job.listening?.batch?.debounceMs ?? null,\n batchMaxSize: job.listening?.batch?.maxSize ?? null,\n batchMaxWaitMs: job.listening?.batch?.maxWaitMs ?? null,\n listeningOn: job.listening?.on ? [...job.listening.on] : null,\n listeningUntil: job.listening?.until ? [...job.listening.until] : null,\n dependencies: [...job.dependencies],\n runner: job.runner.length === 0 ? null : [...job.runner],\n position: job.position,\n },\n createExecution: (jobRow) => {\n if (jobRow.mode === 'listening') return undefined;\n\n const fallbackName = `${jobRow.key} #1`;\n const modelJob = params.params.model.jobs[jobIndex];\n if (!modelJob) return undefined;\n const executionPlan = deriveInitialJobExecutionPlan({\n run: params.run,\n modelJob,\n job,\n jobId: jobRow.id,\n sequence: 1,\n fallbackName,\n triggerPayload: params.params.triggerPayload,\n inputs: params.params.inputs ?? null,\n vars: params.vars,\n });\n\n return {\n sequence: 1,\n name: executionPlan.name,\n runner: [...executionPlan.runner],\n status: 'pending' as const,\n evaluationTrace:\n executionPlan.evaluationTrace?.length === 0 ? null : executionPlan.evaluationTrace,\n };\n },\n createSteps: () =>\n job.steps.map((step) => ({\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: step.status,\n type: step.type,\n config: step.config,\n condition: step.condition ?? null,\n configPlan: step.configPlan ?? null,\n authoredConfig: step.authoredConfig,\n position: step.position,\n })),\n }));\n}\n\nfunction referencedVariables(\n model: WorkflowModel,\n jobs: readonly WorkflowModelJob[],\n): readonly ReferencedVariable[] {\n const references: ReferencedVariable[] = [];\n\n if (jobs.length > 0) {\n collectTemplateVariableReferences(model.templates?.env, references);\n }\n\n for (const job of jobs) {\n collectFieldVariableReferences(job.name, references, {field: 'job.name'});\n for (const template of job.runnerTemplates ?? []) {\n collectFieldVariableReferences(template, references, {field: 'job.runner'});\n }\n collectTemplateVariableReferences(job.outputs, references, {field: 'job.outputs'});\n collectTemplateVariableReferences(job.templates?.env, references);\n\n for (const step of job.steps) {\n collectFieldVariableReferences(step.templates?.name, references, {field: 'step.name'});\n if (step.kind === 'run') {\n collectFieldVariableReferences(step.templates?.command, references, {field: 'run'});\n collectTemplateVariableReferences(step.templates?.env, references);\n } else {\n collectFieldVariableReferences(step.templates?.prompt, references, {field: 'agent.prompt'});\n collectFieldVariableReferences(step.templates?.model, references, {field: 'agent.model'});\n collectFieldVariableReferences(step.templates?.provider, references, {\n field: 'agent.provider',\n });\n }\n }\n }\n\n return references;\n}\n\nfunction collectTemplateVariableReferences(\n templates: Readonly<Record<string, readonly ResolvedFieldSegment[]>> | undefined,\n references: ReferencedVariable[],\n source?: {\n readonly field: InterpolationUnresolvableError['field'];\n },\n): void {\n for (const [envKey, template] of Object.entries(templates ?? {})) {\n collectFieldVariableReferences(\n template,\n references,\n source === undefined ? {field: 'env', envKey} : source,\n );\n }\n}\n\nfunction collectFieldVariableReferences(\n template: readonly ResolvedFieldSegment[] | undefined,\n references: ReferencedVariable[],\n source: {\n readonly field: InterpolationUnresolvableError['field'];\n readonly envKey?: string | undefined;\n },\n): void {\n for (const segment of template ?? []) {\n if (segment.kind === 'literal') continue;\n const keyAccess = analyzeContextKeyAccess(segment.expression);\n for (const reference of keyAccess.references) {\n if (reference.root !== 'vars') continue;\n references.push({\n key: reference.key,\n field: source.field,\n source: segment.expression.source,\n envKey: source.envKey,\n });\n }\n }\n}\n\nfunction workflowTemplateSource(template: MaterializedWorkflowJob['name']): string | null {\n if (template === undefined) return null;\n\n return template\n .map((segment) =>\n segment.kind === 'literal' ? segment.value : `$${'{{'} ${segment.expression.source} ${'}}'}`,\n )\n .join('');\n}\n\nfunction logTemplateDiagnostics(params: {\n readonly workflowRunId: string;\n readonly diagnostics: readonly (WorkflowStepTemplateDiagnostic & {\n readonly jobKey: string;\n readonly stepName: string;\n })[];\n}): void {\n if (params.diagnostics.length === 0) return;\n\n logger().warn(\n {workflowRunId: params.workflowRunId, diagnostics: params.diagnostics},\n 'Workflow interpolation resolved with diagnostics',\n );\n}\n"],"names":["catalogDefaultAgentResolver","getVariablesByNamespace","analyzeContextKeyAccess","logger","eq","createAgentToolMaterializationSnapshot","loadAgentToolMaterializationContext","InterpolationUnresolvableError","deriveInitialJobExecutionPlan","materializeWorkflowRunJobs","recordWorkflowRunCreated","db","workflowRunAttempts","toWorkflowRun","workflowRuns","persistMaterializedRunGraph","createWorkflowRun","params","agentToolContext","model","workspaceId","projectId","agentToolMaterialization","context","result","transaction","tx","insertResult","insert","values","definitionId","name","status","currentAttempt","triggerProvider","triggerPayload","provider","triggerSource","source","triggerEvent","event","inputs","sourceSnapshot","triggerIdempotencyKey","onConflictDoNothing","target","returning","runRow","Error","existing","select","from","where","limit","existingRow","run","created","attemptRow","workflowRunId","id","attempt","oneShotJobs","jobs","filter","job","mode","vars","loadReferencedVariables","materializedJobs","resolveAgentDefaults","agentToolSnapshot","graphJobs","materializeRunGraphJobs","workflowRunAttempt","logTemplateDiagnostics","diagnostics","flatMap","steps","step","map","diagnostic","jobKey","key","stepName","references","referencedVariables","keys","Set","reference","sort","length","undefined","namespace","missingKey","find","candidate","field","envKey","jobIndex","workflowTemplateSource","checkoutPersistCredentials","checkout","persistCredentials","checkoutPermissionsContents","permissions","contents","success","executionTimeoutMs","listeningTimeoutMs","listening","timeoutMs","maxExecutions","onResolve","batchDebounceMs","batch","debounceMs","batchMaxSize","maxSize","batchMaxWaitMs","maxWaitMs","listeningOn","on","listeningUntil","until","dependencies","runner","position","createExecution","jobRow","fallbackName","modelJob","executionPlan","jobId","sequence","evaluationTrace","createSteps","sourceLocation","type","config","condition","configPlan","authoredConfig","collectTemplateVariableReferences","templates","env","collectFieldVariableReferences","template","runnerTemplates","outputs","kind","command","prompt","Object","entries","segment","keyAccess","expression","root","push","value","join","warn"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/run-create.ts"],"sourcesContent":["import {createWorkflowModelSnapshot, type WorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {analyzeContextKeyAccess, type ResolvedFieldSegment} from '@shipfox/expression';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {eq} from 'drizzle-orm';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport {\n createAgentToolMaterializationSnapshot,\n loadAgentToolMaterializationContext,\n} from '#core/agent-tools.js';\nimport type {\n TriggerPayload,\n WorkflowRun,\n WorkflowSourceSnapshot,\n} from '#core/entities/workflow-run.js';\nimport {InterpolationUnresolvableError} from '#core/errors.js';\nimport type {MaterializedWorkflowJob} from '#core/step-config/materialize-workflow-model.js';\nimport type {WorkflowStepTemplateDiagnostic} from '#core/step-config/resolve-step-config.js';\nimport {\n deriveInitialJobExecutionPlan,\n materializeWorkflowRunJobs,\n} from '#core/workflow-run-creation.js';\nimport {recordWorkflowRunCreated} from '#metrics/instance.js';\nimport {db} from '../db.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {type MaterializedRunGraphJob, persistMaterializedRunGraph} from './run-graph.js';\n\nexport type WorkflowModelJob = WorkflowModel['jobs'][number];\n\nexport interface ReferencedVariable {\n readonly key: string;\n readonly field: InterpolationUnresolvableError['field'];\n readonly source: string;\n readonly envKey?: string | undefined;\n}\n\nexport interface CreateWorkflowRunParams {\n workspaceId: string;\n projectId: string;\n definitionId: string;\n name?: string | undefined;\n model: WorkflowModel;\n triggerPayload: TriggerPayload;\n inputs?: Record<string, unknown> | undefined;\n sourceSnapshot?: WorkflowSourceSnapshot | null | undefined;\n triggerIdempotencyKey?: string | undefined;\n resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n integrations?: IntegrationsModuleClient | undefined;\n projects?: ProjectsModuleClient | undefined;\n}\n\nexport async function createWorkflowRun(params: CreateWorkflowRunParams): Promise<WorkflowRun> {\n const agentToolContext =\n params.integrations === undefined\n ? undefined\n : await loadAgentToolMaterializationContext({\n model: params.model,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n integrations: params.integrations,\n projects: params.projects,\n });\n const agentToolMaterialization = createAgentToolMaterializationSnapshot({\n model: params.model,\n context: agentToolContext,\n });\n const result = await db().transaction(async (tx) => {\n const insertResult = await tx\n .insert(workflowRuns)\n .values({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n name: params.name ?? params.model.name,\n status: 'pending',\n currentAttempt: 1,\n triggerProvider: params.triggerPayload.provider ?? null,\n triggerSource: params.triggerPayload.source,\n triggerEvent: params.triggerPayload.event,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n sourceSnapshot: params.sourceSnapshot ?? null,\n triggerIdempotencyKey: params.triggerIdempotencyKey ?? null,\n })\n .onConflictDoNothing({target: workflowRuns.triggerIdempotencyKey})\n .returning();\n\n const runRow = insertResult[0];\n if (!runRow) {\n // Conflict path: skip jobs/steps/outbox so the first insert keeps ownership of side effects.\n if (!params.triggerIdempotencyKey) {\n throw new Error('Insert returned no rows');\n }\n const existing = await tx\n .select()\n .from(workflowRuns)\n .where(eq(workflowRuns.triggerIdempotencyKey, params.triggerIdempotencyKey))\n .limit(1);\n const existingRow = existing[0];\n if (!existingRow) {\n throw new Error(\n `Idempotency conflict but existing run missing for key ${params.triggerIdempotencyKey}`,\n );\n }\n return {run: toWorkflowRun(existingRow), created: false};\n }\n\n const run = toWorkflowRun(runRow);\n const [attemptRow] = await tx\n .insert(workflowRunAttempts)\n .values({\n workflowRunId: runRow.id,\n attempt: 1,\n status: 'pending',\n model: createWorkflowModelSnapshot(params.model),\n agentToolMaterialization,\n })\n .returning();\n if (!attemptRow) throw new Error('Insert returned no rows');\n\n // Resolving one-shot templates here gives interpolation access to the inserted run id.\n // If resolution fails, the transaction rolls back the run, jobs, steps, and outbox event together.\n // Listening steps are resolved later when a job execution is created.\n const oneShotJobs = params.model.jobs.filter((job) => job.mode !== 'listening');\n const vars = await loadReferencedVariables({\n model: params.model,\n jobs: oneShotJobs,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: params.definitionId,\n secrets: params.secrets,\n });\n const materializedJobs = await materializeWorkflowRunJobs({\n run,\n model: params.model,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs ?? null,\n vars,\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n agentToolContext,\n agentToolSnapshot: agentToolMaterialization,\n });\n\n const graphJobs = materializeRunGraphJobs({\n params,\n run,\n vars,\n materializedJobs,\n });\n await persistMaterializedRunGraph(tx, {\n run,\n workflowRunAttempt: attemptRow,\n materializedJobs: graphJobs,\n });\n\n logTemplateDiagnostics({\n workflowRunId: runRow.id,\n diagnostics: materializedJobs.flatMap((job) =>\n job.steps.flatMap((step) =>\n (step.diagnostics ?? []).map((diagnostic) => ({\n jobKey: job.key,\n stepName: step.name,\n ...diagnostic,\n })),\n ),\n ),\n });\n\n return {run, created: true};\n });\n\n if (result.created)\n recordWorkflowRunCreated(result.run.triggerPayload.provider ?? result.run.triggerSource);\n\n return result.run;\n}\n\nexport async function loadReferencedVariables(params: {\n readonly model: WorkflowModel;\n readonly jobs?: readonly WorkflowModelJob[] | undefined;\n readonly workspaceId: string;\n readonly projectId: string;\n readonly definitionId: string;\n readonly secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<Record<string, string> | undefined> {\n const references = referencedVariables(params.model, params.jobs ?? params.model.jobs);\n const keys = [...new Set(references.map((reference) => reference.key))].sort();\n if (keys.length === 0) return undefined;\n\n if (!params.secrets) throw new Error('Secrets client is not configured.');\n const {values: vars} = await params.secrets.getVariablesByNamespace({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n namespace: '',\n });\n const missingKey = keys.find((key) => !(key in vars));\n if (missingKey !== undefined) {\n const reference = references.find((candidate) => candidate.key === missingKey);\n throw new InterpolationUnresolvableError(params.definitionId, {\n field: reference?.field ?? 'env',\n source: reference?.source ?? `vars.${missingKey}`,\n ...(reference?.envKey === undefined ? {} : {envKey: reference.envKey}),\n });\n }\n\n return vars;\n}\n\nfunction materializeRunGraphJobs(params: {\n readonly params: CreateWorkflowRunParams;\n readonly run: WorkflowRun;\n readonly vars: Record<string, string> | undefined;\n readonly materializedJobs: readonly MaterializedWorkflowJob[];\n}): readonly MaterializedRunGraphJob[] {\n return params.materializedJobs.map((job, jobIndex) => ({\n job: {\n key: job.key,\n mode: job.mode,\n name: workflowTemplateSource(job.name),\n status: 'pending' as const,\n checkoutPersistCredentials: job.checkout.persistCredentials,\n checkoutPermissionsContents: job.checkout.permissions.contents,\n success: job.success ?? null,\n executionTimeoutMs: job.executionTimeoutMs ?? null,\n listeningTimeoutMs: job.listening?.timeoutMs ?? null,\n maxExecutions: job.listening?.maxExecutions ?? null,\n onResolve: job.listening?.onResolve ?? null,\n batchDebounceMs: job.listening?.batch?.debounceMs ?? null,\n batchMaxSize: job.listening?.batch?.maxSize ?? null,\n batchMaxWaitMs: job.listening?.batch?.maxWaitMs ?? null,\n listeningOn: job.listening?.on ? [...job.listening.on] : null,\n listeningUntil: job.listening?.until ? [...job.listening.until] : null,\n dependencies: [...job.dependencies],\n runner: job.runner.length === 0 ? null : [...job.runner],\n position: job.position,\n },\n createExecution: (jobRow) => {\n if (jobRow.mode === 'listening') return undefined;\n\n const fallbackName = `${jobRow.key} #1`;\n const modelJob = params.params.model.jobs[jobIndex];\n if (!modelJob) return undefined;\n const executionPlan = deriveInitialJobExecutionPlan({\n run: params.run,\n modelJob,\n job,\n jobId: jobRow.id,\n sequence: 1,\n fallbackName,\n triggerPayload: params.params.triggerPayload,\n inputs: params.params.inputs ?? null,\n vars: params.vars,\n });\n\n return {\n sequence: 1,\n name: executionPlan.name,\n runner: [...executionPlan.runner],\n status: 'pending' as const,\n evaluationTrace:\n executionPlan.evaluationTrace?.length === 0 ? null : executionPlan.evaluationTrace,\n };\n },\n createSteps: () =>\n job.steps.map((step) => ({\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: step.status,\n type: step.type,\n config: step.config,\n condition: step.condition ?? null,\n configPlan: step.configPlan ?? null,\n authoredConfig: step.authoredConfig,\n position: step.position,\n })),\n }));\n}\n\nfunction referencedVariables(\n model: WorkflowModel,\n jobs: readonly WorkflowModelJob[],\n): readonly ReferencedVariable[] {\n const references: ReferencedVariable[] = [];\n\n if (jobs.length > 0) {\n collectTemplateVariableReferences(model.templates?.env, references);\n }\n\n for (const job of jobs) {\n collectFieldVariableReferences(job.name, references, {field: 'job.name'});\n for (const template of job.runnerTemplates ?? []) {\n collectFieldVariableReferences(template, references, {field: 'job.runner'});\n }\n collectTemplateVariableReferences(job.outputs, references, {field: 'job.outputs'});\n collectTemplateVariableReferences(job.templates?.env, references);\n\n for (const step of job.steps) {\n collectFieldVariableReferences(step.templates?.name, references, {field: 'step.name'});\n if (step.kind === 'run') {\n collectFieldVariableReferences(step.templates?.command, references, {field: 'run'});\n collectTemplateVariableReferences(step.templates?.env, references);\n } else {\n collectFieldVariableReferences(step.templates?.prompt, references, {field: 'agent.prompt'});\n collectFieldVariableReferences(step.templates?.model, references, {field: 'agent.model'});\n collectFieldVariableReferences(step.templates?.provider, references, {\n field: 'agent.provider',\n });\n }\n }\n }\n\n return references;\n}\n\nfunction collectTemplateVariableReferences(\n templates: Readonly<Record<string, readonly ResolvedFieldSegment[]>> | undefined,\n references: ReferencedVariable[],\n source?: {\n readonly field: InterpolationUnresolvableError['field'];\n },\n): void {\n for (const [envKey, template] of Object.entries(templates ?? {})) {\n collectFieldVariableReferences(\n template,\n references,\n source === undefined ? {field: 'env', envKey} : source,\n );\n }\n}\n\nfunction collectFieldVariableReferences(\n template: readonly ResolvedFieldSegment[] | undefined,\n references: ReferencedVariable[],\n source: {\n readonly field: InterpolationUnresolvableError['field'];\n readonly envKey?: string | undefined;\n },\n): void {\n for (const segment of template ?? []) {\n if (segment.kind === 'literal') continue;\n const keyAccess = analyzeContextKeyAccess(segment.expression);\n for (const reference of keyAccess.references) {\n if (reference.root !== 'vars') continue;\n references.push({\n key: reference.key,\n field: source.field,\n source: segment.expression.source,\n envKey: source.envKey,\n });\n }\n }\n}\n\nfunction workflowTemplateSource(template: MaterializedWorkflowJob['name']): string | null {\n if (template === undefined) return null;\n\n return template\n .map((segment) =>\n segment.kind === 'literal' ? segment.value : `$${'{{'} ${segment.expression.source} ${'}}'}`,\n )\n .join('');\n}\n\nfunction logTemplateDiagnostics(params: {\n readonly workflowRunId: string;\n readonly diagnostics: readonly (WorkflowStepTemplateDiagnostic & {\n readonly jobKey: string;\n readonly stepName: string;\n })[];\n}): void {\n if (params.diagnostics.length === 0) return;\n\n logger().warn(\n {workflowRunId: params.workflowRunId, diagnostics: params.diagnostics},\n 'Workflow interpolation resolved with diagnostics',\n );\n}\n"],"names":["createWorkflowModelSnapshot","analyzeContextKeyAccess","logger","eq","createAgentToolMaterializationSnapshot","loadAgentToolMaterializationContext","InterpolationUnresolvableError","deriveInitialJobExecutionPlan","materializeWorkflowRunJobs","recordWorkflowRunCreated","db","workflowRunAttempts","toWorkflowRun","workflowRuns","persistMaterializedRunGraph","createWorkflowRun","params","agentToolContext","integrations","undefined","model","workspaceId","projectId","projects","agentToolMaterialization","context","result","transaction","tx","insertResult","insert","values","definitionId","name","status","currentAttempt","triggerProvider","triggerPayload","provider","triggerSource","source","triggerEvent","event","inputs","sourceSnapshot","triggerIdempotencyKey","onConflictDoNothing","target","returning","runRow","Error","existing","select","from","where","limit","existingRow","run","created","attemptRow","workflowRunId","id","attempt","oneShotJobs","jobs","filter","job","mode","vars","loadReferencedVariables","secrets","materializedJobs","resolveAgentDefaults","agentToolSnapshot","graphJobs","materializeRunGraphJobs","workflowRunAttempt","logTemplateDiagnostics","diagnostics","flatMap","steps","step","map","diagnostic","jobKey","key","stepName","references","referencedVariables","keys","Set","reference","sort","length","getVariablesByNamespace","namespace","missingKey","find","candidate","field","envKey","jobIndex","workflowTemplateSource","checkoutPersistCredentials","checkout","persistCredentials","checkoutPermissionsContents","permissions","contents","success","executionTimeoutMs","listeningTimeoutMs","listening","timeoutMs","maxExecutions","onResolve","batchDebounceMs","batch","debounceMs","batchMaxSize","maxSize","batchMaxWaitMs","maxWaitMs","listeningOn","on","listeningUntil","until","dependencies","runner","position","createExecution","jobRow","fallbackName","modelJob","executionPlan","jobId","sequence","evaluationTrace","createSteps","sourceLocation","type","config","condition","configPlan","authoredConfig","collectTemplateVariableReferences","templates","env","collectFieldVariableReferences","template","runnerTemplates","outputs","kind","command","prompt","Object","entries","segment","keyAccess","expression","root","push","value","join","warn"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-rerun.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/run-rerun.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,WAAW,EAAC,MAAM,gCAAgC,CAAC;AAavF,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,WAAW,CAAC,CAiGtB"}
1
+ {"version":3,"file":"run-rerun.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/run-rerun.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,WAAW,EAAC,MAAM,gCAAgC,CAAC;AAavF,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,WAAW,CAAC,CAiGtB"}
@@ -1,3 +1,4 @@
1
+ import { readPersistedWorkflowModel } from '@shipfox/api-definitions-dto';
1
2
  import { and, asc, eq, inArray, sql } from 'drizzle-orm';
2
3
  import { isWorkflowRunTerminal } from '#core/entities/workflow-run.js';
3
4
  import { NoFailedJobsError, RunNotTerminalError, SourceRunNotFoundError } from '#core/errors.js';
@@ -105,7 +106,8 @@ async function loadRerunSourceGraph(tx, sourceJobs) {
105
106
  };
106
107
  }
107
108
  function materializeRerunGraphJobs(params) {
108
- const sourceModelJobByKey = new Map((params.sourceAttempt.model?.jobs ?? []).map((job)=>[
109
+ const sourceModel = params.sourceAttempt.model === null ? null : readPersistedWorkflowModel(params.sourceAttempt.model);
110
+ const sourceModelJobByKey = new Map((sourceModel?.jobs ?? []).map((job)=>[
109
111
  job.key,
110
112
  job
111
113
  ]));