@shipfox/api-workflows 11.0.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/CHANGELOG.md +100 -0
  3. package/README.md +75 -0
  4. package/dist/core/agent-defaults.d.ts +2 -1
  5. package/dist/core/agent-defaults.d.ts.map +1 -1
  6. package/dist/core/agent-defaults.js.map +1 -1
  7. package/dist/core/checkout.d.ts +7 -21
  8. package/dist/core/checkout.d.ts.map +1 -1
  9. package/dist/core/checkout.js +122 -41
  10. package/dist/core/checkout.js.map +1 -1
  11. package/dist/core/entities/job-execution.d.ts +8 -0
  12. package/dist/core/entities/job-execution.d.ts.map +1 -1
  13. package/dist/core/entities/job-execution.js +13 -1
  14. package/dist/core/entities/job-execution.js.map +1 -1
  15. package/dist/core/entities/job-listener-event.d.ts +2 -0
  16. package/dist/core/entities/job-listener-event.d.ts.map +1 -1
  17. package/dist/core/entities/job-listener-event.js.map +1 -1
  18. package/dist/core/entities/step.d.ts +13 -3
  19. package/dist/core/entities/step.d.ts.map +1 -1
  20. package/dist/core/entities/step.js +6 -0
  21. package/dist/core/entities/step.js.map +1 -1
  22. package/dist/core/entities/workflow-run-attempt.d.ts +1 -0
  23. package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
  24. package/dist/core/entities/workflow-run-attempt.js.map +1 -1
  25. package/dist/core/entities/workflow-run.d.ts +17 -0
  26. package/dist/core/entities/workflow-run.d.ts.map +1 -1
  27. package/dist/core/entities/workflow-run.js.map +1 -1
  28. package/dist/core/errors.d.ts +9 -2
  29. package/dist/core/errors.d.ts.map +1 -1
  30. package/dist/core/errors.js +10 -5
  31. package/dist/core/errors.js.map +1 -1
  32. package/dist/core/job-execution.d.ts.map +1 -1
  33. package/dist/core/job-execution.js +14 -8
  34. package/dist/core/job-execution.js.map +1 -1
  35. package/dist/core/job-transition/decide-job-activation.d.ts +1 -0
  36. package/dist/core/job-transition/decide-job-activation.d.ts.map +1 -1
  37. package/dist/core/job-transition/decide-job-activation.js +1 -0
  38. package/dist/core/job-transition/decide-job-activation.js.map +1 -1
  39. package/dist/core/job-transition/derive-job-success.d.ts +1 -0
  40. package/dist/core/job-transition/derive-job-success.d.ts.map +1 -1
  41. package/dist/core/job-transition/derive-job-success.js +5 -8
  42. package/dist/core/job-transition/derive-job-success.js.map +1 -1
  43. package/dist/core/listener-execution-materialization.d.ts +6 -3
  44. package/dist/core/listener-execution-materialization.d.ts.map +1 -1
  45. package/dist/core/listener-execution-materialization.js +44 -6
  46. package/dist/core/listener-execution-materialization.js.map +1 -1
  47. package/dist/core/resolve-trigger-reference.d.ts +11 -0
  48. package/dist/core/resolve-trigger-reference.d.ts.map +1 -0
  49. package/dist/core/resolve-trigger-reference.js +39 -0
  50. package/dist/core/resolve-trigger-reference.js.map +1 -0
  51. package/dist/core/run-workflow.d.ts +1 -0
  52. package/dist/core/run-workflow.d.ts.map +1 -1
  53. package/dist/core/run-workflow.js +1 -0
  54. package/dist/core/run-workflow.js.map +1 -1
  55. package/dist/core/step-config/agent.d.ts +1 -2
  56. package/dist/core/step-config/agent.d.ts.map +1 -1
  57. package/dist/core/step-config/agent.js +22 -7
  58. package/dist/core/step-config/agent.js.map +1 -1
  59. package/dist/core/step-config/assemble-run-context.d.ts +19 -8
  60. package/dist/core/step-config/assemble-run-context.d.ts.map +1 -1
  61. package/dist/core/step-config/assemble-run-context.js +51 -19
  62. package/dist/core/step-config/assemble-run-context.js.map +1 -1
  63. package/dist/core/step-config/complete-step-dispatch-config.d.ts.map +1 -1
  64. package/dist/core/step-config/complete-step-dispatch-config.js +72 -4
  65. package/dist/core/step-config/complete-step-dispatch-config.js.map +1 -1
  66. package/dist/core/step-config/index.d.ts +1 -0
  67. package/dist/core/step-config/index.d.ts.map +1 -1
  68. package/dist/core/step-config/index.js +1 -0
  69. package/dist/core/step-config/index.js.map +1 -1
  70. package/dist/core/step-config/materialize-job-execution-steps.d.ts +1 -1
  71. package/dist/core/step-config/materialize-job-execution-steps.d.ts.map +1 -1
  72. package/dist/core/step-config/materialize-job-execution-steps.js +49 -8
  73. package/dist/core/step-config/materialize-job-execution-steps.js.map +1 -1
  74. package/dist/core/step-config/materialize-workflow-model.d.ts +3 -3
  75. package/dist/core/step-config/materialize-workflow-model.d.ts.map +1 -1
  76. package/dist/core/step-config/materialize-workflow-model.js +9 -5
  77. package/dist/core/step-config/materialize-workflow-model.js.map +1 -1
  78. package/dist/core/step-config/resolve-job-execution-name.d.ts +3 -3
  79. package/dist/core/step-config/resolve-job-execution-name.d.ts.map +1 -1
  80. package/dist/core/step-config/resolve-job-execution-name.js +24 -13
  81. package/dist/core/step-config/resolve-job-execution-name.js.map +1 -1
  82. package/dist/core/step-config/resolve-step-config.d.ts.map +1 -1
  83. package/dist/core/step-config/resolve-step-config.js +174 -9
  84. package/dist/core/step-config/resolve-step-config.js.map +1 -1
  85. package/dist/core/step-config/resolve-workflow-run-name.d.ts +19 -0
  86. package/dist/core/step-config/resolve-workflow-run-name.d.ts.map +1 -0
  87. package/dist/core/step-config/resolve-workflow-run-name.js +73 -0
  88. package/dist/core/step-config/resolve-workflow-run-name.js.map +1 -0
  89. package/dist/core/step-transition/decide-step-transition.js.map +1 -1
  90. package/dist/core/step-transition/evaluate-gate.d.ts +2 -1
  91. package/dist/core/step-transition/evaluate-gate.d.ts.map +1 -1
  92. package/dist/core/step-transition/evaluate-gate.js +5 -3
  93. package/dist/core/step-transition/evaluate-gate.js.map +1 -1
  94. package/dist/core/workflow-run-creation.d.ts +3 -0
  95. package/dist/core/workflow-run-creation.d.ts.map +1 -1
  96. package/dist/core/workflow-run-creation.js +22 -7
  97. package/dist/core/workflow-run-creation.js.map +1 -1
  98. package/dist/db/db.d.ts +278 -10
  99. package/dist/db/db.d.ts.map +1 -1
  100. package/dist/db/db.js +2 -0
  101. package/dist/db/db.js.map +1 -1
  102. package/dist/db/index.d.ts +3 -2
  103. package/dist/db/index.d.ts.map +1 -1
  104. package/dist/db/index.js +2 -1
  105. package/dist/db/index.js.map +1 -1
  106. package/dist/db/job-listener-events.d.ts +2 -0
  107. package/dist/db/job-listener-events.d.ts.map +1 -1
  108. package/dist/db/job-listener-events.js +1 -0
  109. package/dist/db/job-listener-events.js.map +1 -1
  110. package/dist/db/job-listeners.d.ts +2 -0
  111. package/dist/db/job-listeners.d.ts.map +1 -1
  112. package/dist/db/job-listeners.js +81 -21
  113. package/dist/db/job-listeners.js.map +1 -1
  114. package/dist/db/schema/job-executions.d.ts +3 -3
  115. package/dist/db/schema/job-executions.d.ts.map +1 -1
  116. package/dist/db/schema/job-executions.js +8 -4
  117. package/dist/db/schema/job-executions.js.map +1 -1
  118. package/dist/db/schema/job-listener-events.d.ts +20 -0
  119. package/dist/db/schema/job-listener-events.d.ts.map +1 -1
  120. package/dist/db/schema/job-listener-events.js +2 -0
  121. package/dist/db/schema/job-listener-events.js.map +1 -1
  122. package/dist/db/schema/step-attempts.js +2 -2
  123. package/dist/db/schema/step-attempts.js.map +1 -1
  124. package/dist/db/schema/steps.d.ts +4 -2
  125. package/dist/db/schema/steps.d.ts.map +1 -1
  126. package/dist/db/schema/steps.js +1 -1
  127. package/dist/db/schema/steps.js.map +1 -1
  128. package/dist/db/schema/workflow-run-attempts.d.ts +21 -2
  129. package/dist/db/schema/workflow-run-attempts.d.ts.map +1 -1
  130. package/dist/db/schema/workflow-run-attempts.js +2 -0
  131. package/dist/db/schema/workflow-run-attempts.js.map +1 -1
  132. package/dist/db/schema/workflow-run-counters.d.ts +43 -0
  133. package/dist/db/schema/workflow-run-counters.d.ts.map +1 -0
  134. package/dist/db/schema/workflow-run-counters.js +10 -0
  135. package/dist/db/schema/workflow-run-counters.js.map +1 -0
  136. package/dist/db/schema/workflow-runs.d.ts +54 -1
  137. package/dist/db/schema/workflow-runs.d.ts.map +1 -1
  138. package/dist/db/schema/workflow-runs.js +10 -2
  139. package/dist/db/schema/workflow-runs.js.map +1 -1
  140. package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
  141. package/dist/db/workflow-runs/job-executions.js +35 -14
  142. package/dist/db/workflow-runs/job-executions.js.map +1 -1
  143. package/dist/db/workflow-runs/jobs.d.ts +2 -0
  144. package/dist/db/workflow-runs/jobs.d.ts.map +1 -1
  145. package/dist/db/workflow-runs/jobs.js +9 -5
  146. package/dist/db/workflow-runs/jobs.js.map +1 -1
  147. package/dist/db/workflow-runs/queries.d.ts +51 -0
  148. package/dist/db/workflow-runs/queries.d.ts.map +1 -1
  149. package/dist/db/workflow-runs/queries.js +82 -2
  150. package/dist/db/workflow-runs/queries.js.map +1 -1
  151. package/dist/db/workflow-runs/run-create.d.ts +1 -0
  152. package/dist/db/workflow-runs/run-create.d.ts.map +1 -1
  153. package/dist/db/workflow-runs/run-create.js +159 -32
  154. package/dist/db/workflow-runs/run-create.js.map +1 -1
  155. package/dist/db/workflow-runs/run-rerun.d.ts.map +1 -1
  156. package/dist/db/workflow-runs/run-rerun.js +13 -5
  157. package/dist/db/workflow-runs/run-rerun.js.map +1 -1
  158. package/dist/db/workflow-runs/shared.d.ts +1 -0
  159. package/dist/db/workflow-runs/shared.d.ts.map +1 -1
  160. package/dist/db/workflow-runs/shared.js +2 -1
  161. package/dist/db/workflow-runs/shared.js.map +1 -1
  162. package/dist/db/workflow-runs/steps.js +3 -3
  163. package/dist/db/workflow-runs/steps.js.map +1 -1
  164. package/dist/db/workflow-runs.d.ts +4 -3
  165. package/dist/db/workflow-runs.d.ts.map +1 -1
  166. package/dist/db/workflow-runs.js +3 -2
  167. package/dist/db/workflow-runs.js.map +1 -1
  168. package/dist/metrics/instance.d.ts +1 -0
  169. package/dist/metrics/instance.d.ts.map +1 -1
  170. package/dist/metrics/instance.js +9 -0
  171. package/dist/metrics/instance.js.map +1 -1
  172. package/dist/presentation/dto/checkout-token.d.ts +1 -0
  173. package/dist/presentation/dto/checkout-token.d.ts.map +1 -1
  174. package/dist/presentation/dto/checkout-token.js +1 -0
  175. package/dist/presentation/dto/checkout-token.js.map +1 -1
  176. package/dist/presentation/dto/index.d.ts +1 -1
  177. package/dist/presentation/dto/index.d.ts.map +1 -1
  178. package/dist/presentation/dto/index.js +1 -1
  179. package/dist/presentation/dto/index.js.map +1 -1
  180. package/dist/presentation/dto/step.d.ts.map +1 -1
  181. package/dist/presentation/dto/step.js +2 -2
  182. package/dist/presentation/dto/step.js.map +1 -1
  183. package/dist/presentation/dto/workflow-run.d.ts +3 -1
  184. package/dist/presentation/dto/workflow-run.d.ts.map +1 -1
  185. package/dist/presentation/dto/workflow-run.js +34 -0
  186. package/dist/presentation/dto/workflow-run.js.map +1 -1
  187. package/dist/presentation/inter-module.d.ts.map +1 -1
  188. package/dist/presentation/inter-module.js +31 -3
  189. package/dist/presentation/inter-module.js.map +1 -1
  190. package/dist/presentation/routes/checkout-token.d.ts +1 -1
  191. package/dist/presentation/routes/checkout-token.d.ts.map +1 -1
  192. package/dist/presentation/routes/checkout-token.js +32 -20
  193. package/dist/presentation/routes/checkout-token.js.map +1 -1
  194. package/dist/presentation/routes/leased-step.d.ts +2 -0
  195. package/dist/presentation/routes/leased-step.d.ts.map +1 -1
  196. package/dist/presentation/routes/leased-step.js +2 -1
  197. package/dist/presentation/routes/leased-step.js.map +1 -1
  198. package/dist/presentation/routes/list-runs.d.ts.map +1 -1
  199. package/dist/presentation/routes/list-runs.js +9 -3
  200. package/dist/presentation/routes/list-runs.js.map +1 -1
  201. package/dist/presentation/routes/project-access.d.ts +1 -0
  202. package/dist/presentation/routes/project-access.d.ts.map +1 -1
  203. package/dist/presentation/routes/report-step.d.ts.map +1 -1
  204. package/dist/presentation/routes/report-step.js +9 -2
  205. package/dist/presentation/routes/report-step.js.map +1 -1
  206. package/dist/presentation/subscribers/on-job-steps-settled.js +1 -1
  207. package/dist/presentation/subscribers/on-job-steps-settled.js.map +1 -1
  208. package/dist/presentation/subscribers/on-runner-job-claimed.d.ts.map +1 -1
  209. package/dist/presentation/subscribers/on-runner-job-claimed.js +21 -0
  210. package/dist/presentation/subscribers/on-runner-job-claimed.js.map +1 -1
  211. package/dist/temporal/activities/index.d.ts.map +1 -1
  212. package/dist/temporal/activities/index.js +2 -1
  213. package/dist/temporal/activities/index.js.map +1 -1
  214. package/dist/temporal/activities/orchestration-activities.d.ts +1 -0
  215. package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
  216. package/dist/temporal/activities/orchestration-activities.js.map +1 -1
  217. package/dist/temporal/constants.d.ts +1 -0
  218. package/dist/temporal/constants.d.ts.map +1 -1
  219. package/dist/temporal/constants.js +1 -0
  220. package/dist/temporal/constants.js.map +1 -1
  221. package/dist/temporal/index.d.ts +1 -1
  222. package/dist/temporal/index.d.ts.map +1 -1
  223. package/dist/temporal/index.js +1 -1
  224. package/dist/temporal/index.js.map +1 -1
  225. package/dist/temporal/workflows/index.bundle.js +82 -43
  226. package/dist/temporal/workflows/index.d.ts +1 -1
  227. package/dist/temporal/workflows/index.d.ts.map +1 -1
  228. package/dist/temporal/workflows/index.js +1 -1
  229. package/dist/temporal/workflows/index.js.map +1 -1
  230. package/dist/temporal/workflows/job-execution-orchestration.d.ts +5 -0
  231. package/dist/temporal/workflows/job-execution-orchestration.d.ts.map +1 -1
  232. package/dist/temporal/workflows/job-execution-orchestration.js +77 -43
  233. package/dist/temporal/workflows/job-execution-orchestration.js.map +1 -1
  234. package/dist/temporal/workflows/test-env.d.ts +5 -1
  235. package/dist/temporal/workflows/test-env.d.ts.map +1 -1
  236. package/dist/temporal/workflows/test-env.js +32 -11
  237. package/dist/temporal/workflows/test-env.js.map +1 -1
  238. package/dist/tsconfig.test.tsbuildinfo +1 -1
  239. package/drizzle/0000_initial.sql +14 -2
  240. package/drizzle/0001_windy_sunfire.sql +1 -0
  241. package/drizzle/meta/0000_snapshot.json +93 -1
  242. package/drizzle/meta/0001_snapshot.json +1711 -0
  243. package/drizzle/meta/_journal.json +2 -2
  244. package/package.json +21 -21
  245. package/src/core/agent-defaults.ts +2 -1
  246. package/src/core/checkout.test.ts +378 -67
  247. package/src/core/checkout.ts +142 -59
  248. package/src/core/entities/job-execution.test.ts +21 -0
  249. package/src/core/entities/job-execution.ts +24 -0
  250. package/src/core/entities/job-listener-event.ts +3 -0
  251. package/src/core/entities/step.ts +15 -3
  252. package/src/core/entities/workflow-run-attempt.ts +1 -0
  253. package/src/core/entities/workflow-run.ts +16 -0
  254. package/src/core/errors.ts +21 -7
  255. package/src/core/job-execution.ts +27 -4
  256. package/src/core/job-transition/decide-job-activation.test.ts +4 -0
  257. package/src/core/job-transition/decide-job-activation.ts +2 -0
  258. package/src/core/job-transition/derive-job-success.test.ts +12 -0
  259. package/src/core/job-transition/derive-job-success.ts +6 -9
  260. package/src/core/listener-execution-materialization.test.ts +2 -0
  261. package/src/core/listener-execution-materialization.ts +57 -11
  262. package/src/core/resolve-trigger-reference.test.ts +160 -0
  263. package/src/core/resolve-trigger-reference.ts +53 -0
  264. package/src/core/run-workflow.ts +2 -0
  265. package/src/core/step-config/agent.ts +29 -12
  266. package/src/core/step-config/assemble-run-context.test.ts +149 -6
  267. package/src/core/step-config/assemble-run-context.ts +87 -25
  268. package/src/core/step-config/complete-step-dispatch-config.test.ts +125 -2
  269. package/src/core/step-config/complete-step-dispatch-config.ts +83 -1
  270. package/src/core/step-config/index.ts +7 -0
  271. package/src/core/step-config/materialize-job-execution-steps.test.ts +250 -1
  272. package/src/core/step-config/materialize-job-execution-steps.ts +57 -10
  273. package/src/core/step-config/materialize-workflow-model.test.ts +212 -4
  274. package/src/core/step-config/materialize-workflow-model.ts +33 -28
  275. package/src/core/step-config/resolve-job-execution-name.test.ts +37 -15
  276. package/src/core/step-config/resolve-job-execution-name.ts +30 -15
  277. package/src/core/step-config/resolve-step-config.ts +175 -10
  278. package/src/core/step-config/resolve-workflow-run-name.test.ts +115 -0
  279. package/src/core/step-config/resolve-workflow-run-name.ts +108 -0
  280. package/src/core/step-transition/decide-step-transition.ts +2 -2
  281. package/src/core/step-transition/evaluate-gate.test.ts +8 -0
  282. package/src/core/step-transition/evaluate-gate.ts +8 -1
  283. package/src/core/workflow-run-creation.test.ts +7 -4
  284. package/src/core/workflow-run-creation.ts +13 -7
  285. package/src/db/db.ts +2 -0
  286. package/src/db/index.ts +6 -0
  287. package/src/db/job-listener-events.test.ts +19 -0
  288. package/src/db/job-listener-events.ts +3 -0
  289. package/src/db/job-listeners.test.ts +187 -5
  290. package/src/db/job-listeners.ts +122 -30
  291. package/src/db/schema/job-executions.ts +12 -5
  292. package/src/db/schema/job-listener-events.ts +3 -0
  293. package/src/db/schema/step-attempts.ts +2 -2
  294. package/src/db/schema/steps.ts +2 -1
  295. package/src/db/schema/workflow-run-attempts.ts +2 -0
  296. package/src/db/schema/workflow-run-counters.ts +13 -0
  297. package/src/db/schema/workflow-runs.ts +11 -2
  298. package/src/db/workflow-runs/job-executions.ts +37 -15
  299. package/src/db/workflow-runs/jobs.ts +17 -4
  300. package/src/db/workflow-runs/queries.test.ts +206 -0
  301. package/src/db/workflow-runs/queries.ts +146 -2
  302. package/src/db/workflow-runs/run-create.test.ts +606 -8
  303. package/src/db/workflow-runs/run-create.ts +185 -40
  304. package/src/db/workflow-runs/run-rerun.test.ts +61 -2
  305. package/src/db/workflow-runs/run-rerun.ts +15 -5
  306. package/src/db/workflow-runs/shared.ts +2 -0
  307. package/src/db/workflow-runs/steps.ts +3 -3
  308. package/src/db/workflow-runs.ts +7 -0
  309. package/src/metrics/instance.ts +14 -0
  310. package/src/presentation/dto/checkout-token.test.ts +19 -9
  311. package/src/presentation/dto/checkout-token.ts +2 -1
  312. package/src/presentation/dto/index.ts +1 -1
  313. package/src/presentation/dto/job.test.ts +9 -0
  314. package/src/presentation/dto/step.test.ts +12 -0
  315. package/src/presentation/dto/step.ts +5 -2
  316. package/src/presentation/dto/workflow-run.ts +44 -2
  317. package/src/presentation/inter-module.test.ts +165 -0
  318. package/src/presentation/inter-module.ts +38 -4
  319. package/src/presentation/routes/checkout-token.test.ts +357 -142
  320. package/src/presentation/routes/checkout-token.ts +56 -26
  321. package/src/presentation/routes/get-run.test.ts +2 -0
  322. package/src/presentation/routes/get-step-secrets.test.ts +7 -2
  323. package/src/presentation/routes/leased-step.ts +9 -1
  324. package/src/presentation/routes/list-runs.test.ts +57 -0
  325. package/src/presentation/routes/list-runs.ts +8 -3
  326. package/src/presentation/routes/report-step.test.ts +25 -0
  327. package/src/presentation/routes/report-step.ts +10 -2
  328. package/src/presentation/subscribers/on-job-steps-settled.ts +1 -1
  329. package/src/presentation/subscribers/on-runner-job-claimed.test.ts +49 -0
  330. package/src/presentation/subscribers/on-runner-job-claimed.ts +22 -0
  331. package/src/temporal/activities/index.ts +1 -0
  332. package/src/temporal/activities/orchestration-activities.ts +1 -0
  333. package/src/temporal/constants.ts +1 -0
  334. package/src/temporal/index.ts +1 -0
  335. package/src/temporal/workflows/index.ts +1 -0
  336. package/src/temporal/workflows/job-execution-orchestration.test.ts +142 -6
  337. package/src/temporal/workflows/job-execution-orchestration.ts +99 -50
  338. package/src/temporal/workflows/run-orchestration.test.ts +1 -1
  339. package/src/temporal/workflows/test-env.ts +50 -13
  340. package/test/factories/project.ts +2 -0
  341. package/test/factories/workflow-model.ts +80 -26
  342. package/test/factories/workflow-run.ts +4 -1
  343. package/test/fixtures/agent-inter-module.ts +2 -1
  344. package/test/fixtures/job-with-steps.ts +1 -1
  345. package/tsconfig.build.tsbuildinfo +1 -1
  346. package/drizzle/0001_agent_tool_materialization.sql +0 -1
@@ -1,4 +1,5 @@
1
1
  import type {WorkflowModel} from '@shipfox/api-definitions-dto';
2
+ import {evaluationTraceEntry} from '@shipfox/expression';
2
3
  import type {AgentDefaultsResolver} from './agent-defaults.js';
3
4
  import type {
4
5
  AgentToolMaterializationContext,
@@ -31,7 +32,9 @@ export interface MaterializeListenerExecutionParams {
31
32
  readonly run: Pick<
32
33
  WorkflowRun,
33
34
  | 'id'
35
+ | 'number'
34
36
  | 'name'
37
+ | 'workflowName'
35
38
  | 'definitionId'
36
39
  | 'projectId'
37
40
  | 'workspaceId'
@@ -39,7 +42,9 @@ export interface MaterializeListenerExecutionParams {
39
42
  | 'triggerPayload'
40
43
  | 'inputs'
41
44
  >;
42
- readonly job: Pick<Job, 'id' | 'key'>;
45
+ readonly job: Pick<Job, 'id' | 'key'> & Partial<Pick<Job, 'name'>>;
46
+ readonly vars?: Record<string, string> | undefined;
47
+ readonly variableResolutionError?: InterpolationUnresolvableError | undefined;
43
48
  readonly sequence: number;
44
49
  readonly triggerEvents: readonly WorkflowExecutionEvent[];
45
50
  readonly priorExecutions: readonly JobExecution[];
@@ -49,7 +54,7 @@ export interface MaterializeListenerExecutionParams {
49
54
  }
50
55
 
51
56
  export interface MaterializedListenerExecution {
52
- readonly name: string;
57
+ readonly nameOverride: string | null;
53
58
  readonly runner: readonly string[];
54
59
  readonly status: JobExecutionStatus;
55
60
  readonly statusReason: 'unknown' | null;
@@ -61,14 +66,18 @@ export interface MaterializedListenerExecution {
61
66
  export async function materializeListenerExecution(
62
67
  params: MaterializeListenerExecutionParams,
63
68
  ): Promise<MaterializedListenerExecution> {
64
- const fallbackName = `${params.job.key} #${params.sequence}`;
65
- let executionName = fallbackName;
69
+ let executionName = params.job.name ?? params.job.key;
70
+ let nameOverride: string | null = null;
66
71
  let evaluationTrace: readonly PersistedEvaluationTraceEntry[] = [];
67
72
  let runner: readonly string[] = [];
68
73
  let steps: readonly MaterializedWorkflowStep[] = [];
69
74
  let status: JobExecutionStatus = 'pending';
75
+ if (params.variableResolutionError) {
76
+ evaluationTrace = [variableResolutionTrace(params.variableResolutionError)];
77
+ }
70
78
 
71
79
  try {
80
+ if (params.variableResolutionError) throw params.variableResolutionError;
72
81
  if (!params.model) throw new PermanentListenerMaterializationError('Run attempt has no model');
73
82
  const modelJob = params.model.jobs.find((job) => job.key === params.job.key);
74
83
  if (!modelJob) {
@@ -77,16 +86,34 @@ export async function materializeListenerExecution(
77
86
  );
78
87
  }
79
88
 
89
+ const materializationJob = {
90
+ ...params.job,
91
+ name: params.job.name ?? modelJob.name ?? null,
92
+ };
93
+ executionName = materializationJob.name ?? params.job.key;
94
+
80
95
  const resolvedName = resolveJobExecutionName({
81
96
  definitionId: params.run.definitionId,
82
97
  job: modelJob,
83
- fallbackName,
84
- context: listenerExecutionContext({...params, executionName, status}).values,
98
+ context: listenerExecutionContext({
99
+ ...params,
100
+ job: materializationJob,
101
+ nameOverride: null,
102
+ executionName,
103
+ status,
104
+ }).values,
85
105
  });
86
- executionName = resolvedName.value;
106
+ nameOverride = resolvedName.nameOverride;
107
+ executionName = nameOverride ?? executionName;
87
108
  evaluationTrace = resolvedName.trace;
88
109
 
89
- const context = listenerExecutionContext({...params, executionName, status});
110
+ const context = listenerExecutionContext({
111
+ ...params,
112
+ job: materializationJob,
113
+ nameOverride,
114
+ executionName,
115
+ status,
116
+ });
90
117
  runner = materializeJobRunner({
91
118
  job: modelJob,
92
119
  context,
@@ -109,7 +136,7 @@ export async function materializeListenerExecution(
109
136
  }
110
137
 
111
138
  return {
112
- name: executionName,
139
+ nameOverride,
113
140
  runner,
114
141
  status,
115
142
  statusReason: status === 'failed' ? 'unknown' : null,
@@ -119,12 +146,29 @@ export async function materializeListenerExecution(
119
146
  };
120
147
  }
121
148
 
149
+ function variableResolutionTrace(
150
+ error: InterpolationUnresolvableError,
151
+ ): PersistedEvaluationTraceEntry {
152
+ return {
153
+ ...evaluationTraceEntry({
154
+ expression: error.source,
155
+ roots: ['vars'],
156
+ fillTarget: 'execution-creation',
157
+ evaluatedAt: 'execution-creation',
158
+ degraded: true,
159
+ }),
160
+ field: error.field,
161
+ ...(error.envKey === undefined ? {} : {envKey: error.envKey}),
162
+ };
163
+ }
164
+
122
165
  function listenerExecutionContext(
123
166
  params: Pick<
124
167
  MaterializeListenerExecutionParams,
125
- 'run' | 'job' | 'sequence' | 'triggerEvents' | 'priorExecutions'
168
+ 'run' | 'job' | 'vars' | 'sequence' | 'triggerEvents' | 'priorExecutions'
126
169
  > & {
127
170
  readonly executionName: string;
171
+ readonly nameOverride: string | null;
128
172
  readonly status: JobExecutionStatus;
129
173
  },
130
174
  ) {
@@ -132,8 +176,10 @@ function listenerExecutionContext(
132
176
  run: params.run,
133
177
  triggerPayload: params.run.triggerPayload,
134
178
  inputs: params.run.inputs,
135
- jobId: params.job.id,
179
+ vars: params.vars,
180
+ job: {...params.job, name: params.job.name ?? null},
136
181
  sequence: params.sequence,
182
+ nameOverride: params.nameOverride,
137
183
  executionName: params.executionName,
138
184
  status: params.status,
139
185
  triggerEvents: params.triggerEvents,
@@ -0,0 +1,160 @@
1
+ import type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';
2
+ import type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';
3
+ import type {TriggerPayload} from './entities/workflow-run.js';
4
+ import {resolveWorkflowRunTriggerReference} from './resolve-trigger-reference.js';
5
+
6
+ describe('resolveWorkflowRunTriggerReference', () => {
7
+ const workspaceId = crypto.randomUUID();
8
+ const connectionId = crypto.randomUUID();
9
+
10
+ it.each([
11
+ {
12
+ event: 'push',
13
+ externalRepositoryId: 'github:42',
14
+ ref: 'refs/heads/main',
15
+ },
16
+ {
17
+ event: 'pull_request',
18
+ externalRepositoryId: 'github:43',
19
+ ref: 'refs/pull/12/head',
20
+ },
21
+ ])('resolves the normalized %s trigger facts with its project', async (reference) => {
22
+ const integrations = {
23
+ resolveTriggerReference: vi.fn().mockResolvedValue({
24
+ externalRepositoryId: reference.externalRepositoryId,
25
+ ref: reference.ref,
26
+ commit: 'a'.repeat(40),
27
+ actor: 'octocat',
28
+ }),
29
+ resolveSourceRepository: vi.fn().mockResolvedValue({
30
+ connection: {id: connectionId, provider: 'github', slug: 'github-main'},
31
+ repository: {
32
+ externalRepositoryId: reference.externalRepositoryId,
33
+ owner: 'acme',
34
+ name: 'api',
35
+ fullName: 'acme/api',
36
+ defaultBranch: 'main',
37
+ visibility: 'private' as const,
38
+ cloneUrl: 'https://github.com/acme/api.git',
39
+ htmlUrl: 'https://github.com/acme/api',
40
+ },
41
+ }),
42
+ } as unknown as IntegrationsModuleClient;
43
+ const projects = {
44
+ getProjectBySource: vi.fn().mockResolvedValue({project: {id: 'project-1'}}),
45
+ } as unknown as ProjectsModuleClient;
46
+ const triggerPayload: TriggerPayload = {
47
+ provider: 'github',
48
+ source: 'github-main',
49
+ event: reference.event,
50
+ deliveryId: 'delivery-1',
51
+ data: {event: reference.event},
52
+ };
53
+
54
+ await expect(
55
+ resolveWorkflowRunTriggerReference({
56
+ workspaceId,
57
+ triggerConnectionId: connectionId,
58
+ triggerPayload,
59
+ integrations,
60
+ projects,
61
+ }),
62
+ ).resolves.toEqual({
63
+ project: {id: 'project-1'},
64
+ repository: 'acme/api',
65
+ ref: reference.ref,
66
+ commit: 'a'.repeat(40),
67
+ actor: 'octocat',
68
+ });
69
+ expect(projects.getProjectBySource).toHaveBeenCalledWith({
70
+ workspaceId,
71
+ sourceConnectionId: connectionId,
72
+ sourceExternalRepositoryId: reference.externalRepositoryId,
73
+ });
74
+ });
75
+
76
+ it('returns null for a provider event without a source-control reference', async () => {
77
+ const resolveTriggerReference = vi.fn().mockResolvedValue(null);
78
+ const resolveSourceRepository = vi.fn();
79
+ const integrations = {
80
+ resolveTriggerReference,
81
+ resolveSourceRepository,
82
+ } as unknown as IntegrationsModuleClient;
83
+ const projects = {
84
+ getProjectBySource: vi.fn(),
85
+ } as unknown as ProjectsModuleClient;
86
+
87
+ await expect(
88
+ resolveWorkflowRunTriggerReference({
89
+ workspaceId,
90
+ triggerConnectionId: connectionId,
91
+ triggerPayload: {
92
+ provider: 'linear',
93
+ source: 'linear-main',
94
+ event: 'Issue.create',
95
+ deliveryId: 'delivery-1',
96
+ data: {type: 'Issue'},
97
+ },
98
+ integrations,
99
+ projects,
100
+ }),
101
+ ).resolves.toBeNull();
102
+ expect(resolveSourceRepository).not.toHaveBeenCalled();
103
+ expect(projects.getProjectBySource).not.toHaveBeenCalled();
104
+ });
105
+
106
+ it.each([
107
+ 'trigger reference',
108
+ 'project lookup',
109
+ 'source repository lookup',
110
+ ] as const)('returns null when %s fails during enrichment', async (failure) => {
111
+ const integrations = {
112
+ resolveTriggerReference:
113
+ failure === 'trigger reference'
114
+ ? vi.fn().mockRejectedValue(new Error('trigger reference unavailable'))
115
+ : vi.fn().mockResolvedValue({
116
+ externalRepositoryId: 'github:42',
117
+ ref: 'refs/heads/main',
118
+ commit: 'a'.repeat(40),
119
+ }),
120
+ resolveSourceRepository:
121
+ failure === 'source repository lookup'
122
+ ? vi.fn().mockRejectedValue(new Error('source repository unavailable'))
123
+ : vi.fn().mockResolvedValue({
124
+ connection: {id: connectionId, provider: 'github', slug: 'github-main'},
125
+ repository: {
126
+ externalRepositoryId: 'github:42',
127
+ owner: 'acme',
128
+ name: 'api',
129
+ fullName: 'acme/api',
130
+ defaultBranch: 'main',
131
+ visibility: 'private' as const,
132
+ cloneUrl: 'https://github.com/acme/api.git',
133
+ htmlUrl: 'https://github.com/acme/api',
134
+ },
135
+ }),
136
+ } as unknown as IntegrationsModuleClient;
137
+ const projects = {
138
+ getProjectBySource:
139
+ failure === 'project lookup'
140
+ ? vi.fn().mockRejectedValue(new Error('project lookup unavailable'))
141
+ : vi.fn().mockResolvedValue({project: {id: 'project-1'}}),
142
+ } as unknown as ProjectsModuleClient;
143
+
144
+ await expect(
145
+ resolveWorkflowRunTriggerReference({
146
+ workspaceId,
147
+ triggerConnectionId: connectionId,
148
+ triggerPayload: {
149
+ provider: 'github',
150
+ source: 'github-main',
151
+ event: 'push',
152
+ deliveryId: 'delivery-1',
153
+ data: {event: 'push'},
154
+ },
155
+ integrations,
156
+ projects,
157
+ }),
158
+ ).resolves.toBeNull();
159
+ });
160
+ });
@@ -0,0 +1,53 @@
1
+ import type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';
2
+ import type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';
3
+ import type {TriggerPayload, WorkflowRunTriggerReference} from './entities/workflow-run.js';
4
+
5
+ export async function resolveWorkflowRunTriggerReference(params: {
6
+ workspaceId: string;
7
+ triggerConnectionId?: string | undefined;
8
+ triggerPayload: TriggerPayload;
9
+ integrations?: IntegrationsModuleClient | undefined;
10
+ projects?: ProjectsModuleClient | undefined;
11
+ }): Promise<WorkflowRunTriggerReference | null> {
12
+ if (
13
+ params.triggerConnectionId === undefined ||
14
+ !('data' in params.triggerPayload) ||
15
+ params.integrations === undefined ||
16
+ params.projects === undefined
17
+ ) {
18
+ return null;
19
+ }
20
+
21
+ try {
22
+ const reference = await params.integrations.resolveTriggerReference({
23
+ workspaceId: params.workspaceId,
24
+ connectionId: params.triggerConnectionId,
25
+ payload: params.triggerPayload.data,
26
+ });
27
+ if (reference === null) return null;
28
+
29
+ const [projectResult, sourceResult] = await Promise.all([
30
+ params.projects.getProjectBySource({
31
+ workspaceId: params.workspaceId,
32
+ sourceConnectionId: params.triggerConnectionId,
33
+ sourceExternalRepositoryId: reference.externalRepositoryId,
34
+ }),
35
+ params.integrations.resolveSourceRepository({
36
+ workspaceId: params.workspaceId,
37
+ connectionId: params.triggerConnectionId,
38
+ externalRepositoryId: reference.externalRepositoryId,
39
+ }),
40
+ ]);
41
+
42
+ return {
43
+ project: projectResult.project === null ? null : {id: projectResult.project.id},
44
+ repository: `${sourceResult.repository.owner}/${sourceResult.repository.name}`,
45
+ ref: reference.ref,
46
+ commit: reference.commit,
47
+ actor: reference.actor,
48
+ };
49
+ } catch {
50
+ // Trigger metadata is best-effort and must not block run creation.
51
+ return null;
52
+ }
53
+ }
@@ -15,6 +15,7 @@ export interface RunWorkflowParams {
15
15
  projectId: string;
16
16
  definitionId: string;
17
17
  triggerPayload: TriggerPayload;
18
+ triggerConnectionId?: string | undefined;
18
19
  inputs?: Record<string, unknown> | undefined;
19
20
  triggerIdempotencyKey?: string | undefined;
20
21
  integrations?: IntegrationsModuleClient | undefined;
@@ -47,6 +48,7 @@ export async function runWorkflow(
47
48
  name: definition.name,
48
49
  model,
49
50
  triggerPayload: params.triggerPayload,
51
+ triggerConnectionId: params.triggerConnectionId,
50
52
  inputs: params.inputs,
51
53
  sourceSnapshot: definition.sourceSnapshot,
52
54
  triggerIdempotencyKey: params.triggerIdempotencyKey,
@@ -42,6 +42,7 @@ interface AgentFieldResolutions {
42
42
  readonly prompt: FieldResolution;
43
43
  readonly model: FieldResolution | undefined;
44
44
  readonly provider: FieldResolution | undefined;
45
+ readonly thinking: FieldResolution | undefined;
45
46
  readonly hasTemplates: boolean;
46
47
  }
47
48
 
@@ -72,9 +73,11 @@ export async function resolveAgentStepConfig(
72
73
 
73
74
  if (usesAuthoredMode) return authoredAgentStepConfig(params.step, fields);
74
75
 
75
- const hasDeferredModelOrProvider =
76
- fields.model?.kind === 'residual' || fields.provider?.kind === 'residual';
77
- if (hasDeferredModelOrProvider) return deferredAgentStepConfig(params, fields);
76
+ const hasDeferredAgentField =
77
+ fields.model?.kind === 'residual' ||
78
+ fields.provider?.kind === 'residual' ||
79
+ fields.thinking?.kind === 'residual';
80
+ if (hasDeferredAgentField) return deferredAgentStepConfig(params, fields);
78
81
 
79
82
  return await agentStepConfigWithDefaults(params.step, params, fields);
80
83
  }
@@ -119,7 +122,10 @@ export async function completeAgentConfig(params: {
119
122
  harness: agent.harness ?? readConfigHarness(params.config),
120
123
  provider,
121
124
  model,
122
- thinking: agent.thinking ?? readConfigThinking(params.config),
125
+ thinking:
126
+ agent.thinking === undefined
127
+ ? readConfigThinking(params.config)
128
+ : completeAgentField({field: 'agent.thinking', template: agent.thinking, params}),
123
129
  resolveAgentDefaults: params.resolveAgentDefaults,
124
130
  definitionId: params.definitionId,
125
131
  });
@@ -138,7 +144,7 @@ export async function completeAgentConfig(params: {
138
144
  }
139
145
 
140
146
  function completeAgentField(args: {
141
- readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';
147
+ readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider' | 'agent.thinking';
142
148
  readonly template: ResolvedField;
143
149
  readonly params: {
144
150
  readonly context: WorkflowEvaluationContext;
@@ -161,7 +167,7 @@ export async function completeAgentDefaults(params: {
161
167
  readonly harness: WorkflowModelAgentStep['harness'] | undefined;
162
168
  readonly provider: string | undefined;
163
169
  readonly model: string | undefined;
164
- readonly thinking: AgentThinking | undefined;
170
+ readonly thinking: string | undefined;
165
171
  readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;
166
172
  readonly definitionId: string;
167
173
  }): Promise<ResolvedAgentDefaults> {
@@ -218,12 +224,23 @@ function resolveAgentFields(params: ResolveAgentStepConfigParams): AgentFieldRes
218
224
  trace,
219
225
  definitionId: params.definitionId,
220
226
  });
227
+ const thinking = resolveOptionalAgentField({
228
+ field: 'agent.thinking',
229
+ value: params.step.thinking,
230
+ template: params.step.templates?.thinking,
231
+ context: params.context,
232
+ mode: params.mode,
233
+ diagnostics,
234
+ trace,
235
+ definitionId: params.definitionId,
236
+ });
221
237
  const hasTemplates =
222
238
  params.step.templates?.prompt !== undefined ||
223
239
  params.step.templates?.model !== undefined ||
224
- params.step.templates?.provider !== undefined;
240
+ params.step.templates?.provider !== undefined ||
241
+ params.step.templates?.thinking !== undefined;
225
242
 
226
- return {diagnostics, trace, prompt, model, provider, hasTemplates};
243
+ return {diagnostics, trace, prompt, model, provider, thinking, hasTemplates};
227
244
  }
228
245
 
229
246
  function authoredAgentStepConfig(
@@ -260,7 +277,7 @@ function deferredAgentStepConfig(
260
277
  ...(fields.model === undefined ? {} : {model: dispatchPlanField(fields.model)}),
261
278
  ...(fields.provider === undefined ? {} : {provider: dispatchPlanField(fields.provider)}),
262
279
  ...(step.harness === undefined ? {} : {harness: step.harness}),
263
- ...(step.thinking === undefined ? {} : {thinking: step.thinking}),
280
+ ...(fields.thinking === undefined ? {} : {thinking: dispatchPlanField(fields.thinking)}),
264
281
  ...agentToolsConfig(step),
265
282
  ...materializedAgentIntegrationsConfig(params),
266
283
  },
@@ -284,7 +301,7 @@ async function agentStepConfigWithDefaults(
284
301
  harness: step.harness,
285
302
  provider: providerValue,
286
303
  model: modelValue,
287
- thinking: step.thinking,
304
+ thinking: frozenFieldValue(fields.thinking),
288
305
  resolveAgentDefaults: params.resolveAgentDefaults,
289
306
  definitionId: params.definitionId,
290
307
  });
@@ -384,7 +401,7 @@ function frozenFieldValue(field: FieldResolution | undefined): string | undefine
384
401
  }
385
402
 
386
403
  function resolveAgentField(params: {
387
- readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';
404
+ readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider' | 'agent.thinking';
388
405
  readonly value: string;
389
406
  readonly template: ResolvedField['segments'] | undefined;
390
407
  readonly context: WorkflowEvaluationContext;
@@ -414,7 +431,7 @@ function resolveAgentField(params: {
414
431
  }
415
432
 
416
433
  function resolveOptionalAgentField(params: {
417
- readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';
434
+ readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider' | 'agent.thinking';
418
435
  readonly value: string | undefined;
419
436
  readonly template: ResolvedField['segments'] | undefined;
420
437
  readonly context: WorkflowEvaluationContext;