@shipfox/api-runners 5.0.0 → 7.0.1

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 (400) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/CHANGELOG.md +80 -0
  3. package/dist/config.d.ts +5 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +54 -7
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/demand.d.ts +6 -6
  8. package/dist/core/demand.d.ts.map +1 -1
  9. package/dist/core/demand.js +10 -10
  10. package/dist/core/demand.js.map +1 -1
  11. package/dist/core/entities/ephemeral-registration-token.d.ts +1 -1
  12. package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -1
  13. package/dist/core/entities/ephemeral-registration-token.js.map +1 -1
  14. package/dist/core/entities/provisioner-capability-snapshot.d.ts +13 -0
  15. package/dist/core/entities/provisioner-capability-snapshot.d.ts.map +1 -0
  16. package/dist/core/entities/provisioner-capability-snapshot.js +3 -0
  17. package/dist/core/entities/provisioner-capability-snapshot.js.map +1 -0
  18. package/dist/core/entities/provisioner-token.d.ts +10 -2
  19. package/dist/core/entities/provisioner-token.d.ts.map +1 -1
  20. package/dist/core/entities/provisioner-token.js.map +1 -1
  21. package/dist/core/entities/{provisioned-runner.d.ts → runner-instance.d.ts} +7 -6
  22. package/dist/core/entities/runner-instance.d.ts.map +1 -0
  23. package/dist/core/entities/runner-instance.js +3 -0
  24. package/dist/core/entities/runner-instance.js.map +1 -0
  25. package/dist/core/entities/runner-session.d.ts +4 -2
  26. package/dist/core/entities/runner-session.d.ts.map +1 -1
  27. package/dist/core/entities/runner-session.js.map +1 -1
  28. package/dist/core/ephemeral-registration-tokens.d.ts +5 -5
  29. package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -1
  30. package/dist/core/ephemeral-registration-tokens.js +12 -12
  31. package/dist/core/ephemeral-registration-tokens.js.map +1 -1
  32. package/dist/core/errors.d.ts +16 -4
  33. package/dist/core/errors.d.ts.map +1 -1
  34. package/dist/core/errors.js +22 -4
  35. package/dist/core/errors.js.map +1 -1
  36. package/dist/core/index.d.ts +9 -5
  37. package/dist/core/index.d.ts.map +1 -1
  38. package/dist/core/index.js +6 -3
  39. package/dist/core/index.js.map +1 -1
  40. package/dist/core/job-executions.d.ts +2 -0
  41. package/dist/core/job-executions.d.ts.map +1 -1
  42. package/dist/core/job-executions.js +1 -2
  43. package/dist/core/job-executions.js.map +1 -1
  44. package/dist/core/maintenance.d.ts +1 -1
  45. package/dist/core/maintenance.d.ts.map +1 -1
  46. package/dist/core/maintenance.js +5 -5
  47. package/dist/core/maintenance.js.map +1 -1
  48. package/dist/core/provisioner-capability-snapshots.d.ts +5 -0
  49. package/dist/core/provisioner-capability-snapshots.d.ts.map +1 -0
  50. package/dist/core/provisioner-capability-snapshots.js +10 -0
  51. package/dist/core/provisioner-capability-snapshots.js.map +1 -0
  52. package/dist/core/provisioner-tokens.d.ts +10 -0
  53. package/dist/core/provisioner-tokens.d.ts.map +1 -1
  54. package/dist/core/provisioner-tokens.js +23 -1
  55. package/dist/core/provisioner-tokens.js.map +1 -1
  56. package/dist/core/rate-limit.d.ts.map +1 -1
  57. package/dist/core/rate-limit.js +2 -7
  58. package/dist/core/rate-limit.js.map +1 -1
  59. package/dist/core/runner-activation.d.ts +13 -0
  60. package/dist/core/runner-activation.d.ts.map +1 -0
  61. package/dist/core/runner-activation.js +36 -0
  62. package/dist/core/runner-activation.js.map +1 -0
  63. package/dist/core/runner-assignments.d.ts +6 -0
  64. package/dist/core/runner-assignments.d.ts.map +1 -0
  65. package/dist/core/runner-assignments.js +6 -0
  66. package/dist/core/runner-assignments.js.map +1 -0
  67. package/dist/core/runner-control-sessions.d.ts +46 -0
  68. package/dist/core/runner-control-sessions.d.ts.map +1 -0
  69. package/dist/core/runner-control-sessions.js +121 -0
  70. package/dist/core/runner-control-sessions.js.map +1 -0
  71. package/dist/core/runner-instances.d.ts +72 -0
  72. package/dist/core/runner-instances.d.ts.map +1 -0
  73. package/dist/core/runner-instances.js +165 -0
  74. package/dist/core/runner-instances.js.map +1 -0
  75. package/dist/core/runner-sessions.d.ts +8 -2
  76. package/dist/core/runner-sessions.d.ts.map +1 -1
  77. package/dist/core/runner-sessions.js +8 -5
  78. package/dist/core/runner-sessions.js.map +1 -1
  79. package/dist/db/db.d.ts +2698 -1054
  80. package/dist/db/db.d.ts.map +1 -1
  81. package/dist/db/db.js +9 -2
  82. package/dist/db/db.js.map +1 -1
  83. package/dist/db/ephemeral-registration-tokens.d.ts +2 -2
  84. package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
  85. package/dist/db/ephemeral-registration-tokens.js +21 -21
  86. package/dist/db/ephemeral-registration-tokens.js.map +1 -1
  87. package/dist/db/index.d.ts +7 -4
  88. package/dist/db/index.d.ts.map +1 -1
  89. package/dist/db/index.js +5 -2
  90. package/dist/db/index.js.map +1 -1
  91. package/dist/db/job-executions.d.ts +6 -6
  92. package/dist/db/job-executions.d.ts.map +1 -1
  93. package/dist/db/job-executions.js +20 -19
  94. package/dist/db/job-executions.js.map +1 -1
  95. package/dist/db/provisioner-capability-snapshots.d.ts +21 -0
  96. package/dist/db/provisioner-capability-snapshots.d.ts.map +1 -0
  97. package/dist/db/provisioner-capability-snapshots.js +57 -0
  98. package/dist/db/provisioner-capability-snapshots.js.map +1 -0
  99. package/dist/db/provisioner-tokens.d.ts +7 -2
  100. package/dist/db/provisioner-tokens.d.ts.map +1 -1
  101. package/dist/db/provisioner-tokens.js +59 -10
  102. package/dist/db/provisioner-tokens.js.map +1 -1
  103. package/dist/db/reservations.d.ts +18 -0
  104. package/dist/db/reservations.d.ts.map +1 -1
  105. package/dist/db/reservations.js +88 -1
  106. package/dist/db/reservations.js.map +1 -1
  107. package/dist/db/runner-assignments.d.ts +7 -0
  108. package/dist/db/runner-assignments.d.ts.map +1 -0
  109. package/dist/db/runner-assignments.js +55 -0
  110. package/dist/db/runner-assignments.js.map +1 -0
  111. package/dist/db/runner-instances.d.ts +84 -0
  112. package/dist/db/runner-instances.d.ts.map +1 -0
  113. package/dist/db/runner-instances.js +497 -0
  114. package/dist/db/runner-instances.js.map +1 -0
  115. package/dist/db/runner-sessions.d.ts +5 -0
  116. package/dist/db/runner-sessions.d.ts.map +1 -1
  117. package/dist/db/runner-sessions.js +48 -2
  118. package/dist/db/runner-sessions.js.map +1 -1
  119. package/dist/db/schema/ephemeral-registration-tokens.d.ts +2 -2
  120. package/dist/db/schema/ephemeral-registration-tokens.js +3 -3
  121. package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -1
  122. package/dist/db/schema/provisioner-capability-snapshots.d.ts +207 -0
  123. package/dist/db/schema/provisioner-capability-snapshots.d.ts.map +1 -0
  124. package/dist/db/schema/provisioner-capability-snapshots.js +38 -0
  125. package/dist/db/schema/provisioner-capability-snapshots.js.map +1 -0
  126. package/dist/db/schema/provisioner-tokens.d.ts +19 -1
  127. package/dist/db/schema/provisioner-tokens.d.ts.map +1 -1
  128. package/dist/db/schema/provisioner-tokens.js +29 -3
  129. package/dist/db/schema/provisioner-tokens.js.map +1 -1
  130. package/dist/db/schema/runner-activation-tokens.d.ts +161 -0
  131. package/dist/db/schema/runner-activation-tokens.d.ts.map +1 -0
  132. package/dist/db/schema/runner-activation-tokens.js +27 -0
  133. package/dist/db/schema/runner-activation-tokens.js.map +1 -0
  134. package/dist/db/schema/runner-control-sessions.d.ts +338 -0
  135. package/dist/db/schema/runner-control-sessions.d.ts.map +1 -0
  136. package/dist/db/schema/runner-control-sessions.js +52 -0
  137. package/dist/db/schema/runner-control-sessions.js.map +1 -0
  138. package/dist/db/schema/{provisioned-runners.d.ts → runner-instances.d.ts} +105 -34
  139. package/dist/db/schema/runner-instances.d.ts.map +1 -0
  140. package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +23 -14
  141. package/dist/db/schema/runner-instances.js.map +1 -0
  142. package/dist/db/schema/runner-sessions.d.ts +39 -5
  143. package/dist/db/schema/runner-sessions.d.ts.map +1 -1
  144. package/dist/db/schema/runner-sessions.js +13 -6
  145. package/dist/db/schema/runner-sessions.js.map +1 -1
  146. package/dist/db/schema/running-job-executions.d.ts +2 -2
  147. package/dist/db/schema/running-job-executions.js +4 -4
  148. package/dist/db/schema/running-job-executions.js.map +1 -1
  149. package/dist/index.d.ts +6 -2
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +45 -39
  152. package/dist/index.js.map +1 -1
  153. package/dist/installation-provisioning.d.ts +14 -0
  154. package/dist/installation-provisioning.d.ts.map +1 -0
  155. package/dist/installation-provisioning.js +7 -0
  156. package/dist/installation-provisioning.js.map +1 -0
  157. package/dist/metrics/index.d.ts +1 -1
  158. package/dist/metrics/index.d.ts.map +1 -1
  159. package/dist/metrics/index.js +1 -1
  160. package/dist/metrics/index.js.map +1 -1
  161. package/dist/metrics/instance.d.ts +11 -7
  162. package/dist/metrics/instance.d.ts.map +1 -1
  163. package/dist/metrics/instance.js +13 -7
  164. package/dist/metrics/instance.js.map +1 -1
  165. package/dist/presentation/auth/index.d.ts +1 -0
  166. package/dist/presentation/auth/index.d.ts.map +1 -1
  167. package/dist/presentation/auth/index.js +1 -0
  168. package/dist/presentation/auth/index.js.map +1 -1
  169. package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -1
  170. package/dist/presentation/auth/provisioner-token-auth.js +5 -1
  171. package/dist/presentation/auth/provisioner-token-auth.js.map +1 -1
  172. package/dist/presentation/auth/runner-control-session-auth.d.ts +4 -0
  173. package/dist/presentation/auth/runner-control-session-auth.d.ts.map +1 -0
  174. package/dist/presentation/auth/runner-control-session-auth.js +29 -0
  175. package/dist/presentation/auth/runner-control-session-auth.js.map +1 -0
  176. package/dist/presentation/auth/runner-registration-token-auth.d.ts +5 -1
  177. package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -1
  178. package/dist/presentation/auth/runner-registration-token-auth.js +21 -1
  179. package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -1
  180. package/dist/presentation/dto/index.d.ts +1 -2
  181. package/dist/presentation/dto/index.d.ts.map +1 -1
  182. package/dist/presentation/dto/index.js +1 -2
  183. package/dist/presentation/dto/index.js.map +1 -1
  184. package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
  185. package/dist/presentation/dto/poll-demand.js +7 -1
  186. package/dist/presentation/dto/poll-demand.js.map +1 -1
  187. package/dist/presentation/dto/provisioner-token.d.ts +1 -0
  188. package/dist/presentation/dto/provisioner-token.d.ts.map +1 -1
  189. package/dist/presentation/dto/provisioner-token.js +5 -1
  190. package/dist/presentation/dto/provisioner-token.js.map +1 -1
  191. package/dist/presentation/dto/{provisioned-runners.d.ts → runner-instances.d.ts} +9 -9
  192. package/dist/presentation/dto/runner-instances.d.ts.map +1 -0
  193. package/dist/presentation/dto/{provisioned-runners.js → runner-instances.js} +6 -6
  194. package/dist/presentation/dto/runner-instances.js.map +1 -0
  195. package/dist/presentation/index.d.ts +2 -2
  196. package/dist/presentation/index.d.ts.map +1 -1
  197. package/dist/presentation/index.js +2 -2
  198. package/dist/presentation/index.js.map +1 -1
  199. package/dist/presentation/inter-module.d.ts +5 -0
  200. package/dist/presentation/inter-module.d.ts.map +1 -0
  201. package/dist/presentation/inter-module.js +43 -0
  202. package/dist/presentation/inter-module.js.map +1 -0
  203. package/dist/presentation/routes/assign-runner-instances.d.ts +2 -0
  204. package/dist/presentation/routes/assign-runner-instances.d.ts.map +1 -0
  205. package/dist/presentation/routes/assign-runner-instances.js +40 -0
  206. package/dist/presentation/routes/assign-runner-instances.js.map +1 -0
  207. package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -1
  208. package/dist/presentation/routes/get-provisioner-me.js +5 -1
  209. package/dist/presentation/routes/get-provisioner-me.js.map +1 -1
  210. package/dist/presentation/routes/heartbeat.d.ts +2 -1
  211. package/dist/presentation/routes/heartbeat.d.ts.map +1 -1
  212. package/dist/presentation/routes/heartbeat.js +60 -50
  213. package/dist/presentation/routes/heartbeat.js.map +1 -1
  214. package/dist/presentation/routes/index.d.ts +3 -1
  215. package/dist/presentation/routes/index.d.ts.map +1 -1
  216. package/dist/presentation/routes/index.js +80 -51
  217. package/dist/presentation/routes/index.js.map +1 -1
  218. package/dist/presentation/routes/poll-demand.d.ts +2 -0
  219. package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
  220. package/dist/presentation/routes/poll-demand.js +86 -45
  221. package/dist/presentation/routes/poll-demand.js.map +1 -1
  222. package/dist/presentation/routes/reconcile-runner-instances.d.ts +2 -0
  223. package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -0
  224. package/dist/presentation/routes/reconcile-runner-instances.js +27 -0
  225. package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -0
  226. package/dist/presentation/routes/register.d.ts +2 -1
  227. package/dist/presentation/routes/register.d.ts.map +1 -1
  228. package/dist/presentation/routes/register.js +55 -52
  229. package/dist/presentation/routes/register.js.map +1 -1
  230. package/dist/presentation/routes/report-runner-instances.d.ts +2 -0
  231. package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -0
  232. package/dist/presentation/routes/report-runner-instances.js +37 -0
  233. package/dist/presentation/routes/report-runner-instances.js.map +1 -0
  234. package/dist/presentation/routes/request-job.d.ts +2 -1
  235. package/dist/presentation/routes/request-job.d.ts.map +1 -1
  236. package/dist/presentation/routes/request-job.js +39 -36
  237. package/dist/presentation/routes/request-job.js.map +1 -1
  238. package/dist/presentation/routes/runner-enrollment.d.ts +8 -0
  239. package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
  240. package/dist/presentation/routes/runner-enrollment.js +212 -0
  241. package/dist/presentation/routes/runner-enrollment.js.map +1 -0
  242. package/dist/temporal/activities/index.d.ts +2 -2
  243. package/dist/temporal/activities/index.d.ts.map +1 -1
  244. package/dist/temporal/activities/index.js +2 -2
  245. package/dist/temporal/activities/index.js.map +1 -1
  246. package/dist/temporal/activities/maintenance-activities.d.ts +1 -1
  247. package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -1
  248. package/dist/temporal/activities/maintenance-activities.js +3 -3
  249. package/dist/temporal/activities/maintenance-activities.js.map +1 -1
  250. package/dist/temporal/workflows/index.bundle.js +3 -3
  251. package/dist/temporal/workflows/stuck-job-detector.js +2 -2
  252. package/dist/temporal/workflows/stuck-job-detector.js.map +1 -1
  253. package/dist/tsconfig.test.tsbuildinfo +1 -1
  254. package/drizzle/0000_initial.sql +91 -24
  255. package/drizzle/meta/0000_snapshot.json +392 -63
  256. package/package.json +21 -16
  257. package/src/config.test.ts +0 -26
  258. package/src/config.ts +48 -7
  259. package/src/core/demand.test.ts +29 -29
  260. package/src/core/demand.ts +22 -22
  261. package/src/core/entities/ephemeral-registration-token.ts +1 -1
  262. package/src/core/entities/provisioner-capability-snapshot.ts +12 -0
  263. package/src/core/entities/provisioner-token.ts +8 -2
  264. package/src/core/entities/{provisioned-runner.ts → runner-instance.ts} +6 -5
  265. package/src/core/entities/runner-session.ts +4 -2
  266. package/src/core/ephemeral-registration-tokens.test.ts +11 -11
  267. package/src/core/ephemeral-registration-tokens.ts +18 -20
  268. package/src/core/errors.ts +23 -4
  269. package/src/core/index.ts +37 -22
  270. package/src/core/job-executions.ts +3 -2
  271. package/src/core/maintenance.test.ts +13 -17
  272. package/src/core/maintenance.ts +5 -5
  273. package/src/core/provisioner-capability-snapshots.test.ts +35 -0
  274. package/src/core/provisioner-capability-snapshots.ts +12 -0
  275. package/src/core/provisioner-tokens.test.ts +20 -0
  276. package/src/core/provisioner-tokens.ts +33 -0
  277. package/src/core/rate-limit.test.ts +11 -27
  278. package/src/core/rate-limit.ts +3 -11
  279. package/src/core/runner-activation.ts +72 -0
  280. package/src/core/runner-assignments.ts +9 -0
  281. package/src/core/runner-control-sessions.ts +190 -0
  282. package/src/core/{provisioned-runners.test.ts → runner-instances.test.ts} +24 -24
  283. package/src/core/runner-instances.ts +301 -0
  284. package/src/core/runner-sessions.test.ts +112 -22
  285. package/src/core/runner-sessions.ts +25 -14
  286. package/src/db/db.ts +9 -2
  287. package/src/db/ephemeral-registration-tokens.test.ts +9 -9
  288. package/src/db/ephemeral-registration-tokens.ts +26 -26
  289. package/src/db/index.ts +30 -21
  290. package/src/db/job-executions.test.ts +13 -11
  291. package/src/db/job-executions.ts +33 -27
  292. package/src/db/provisioner-capability-snapshots.test.ts +175 -0
  293. package/src/db/provisioner-capability-snapshots.ts +130 -0
  294. package/src/db/provisioner-tokens.test.ts +139 -2
  295. package/src/db/provisioner-tokens.ts +123 -15
  296. package/src/db/reservations.test.ts +49 -0
  297. package/src/db/reservations.ts +146 -1
  298. package/src/db/runner-assignments.test.ts +163 -0
  299. package/src/db/runner-assignments.ts +115 -0
  300. package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +442 -353
  301. package/src/db/runner-instances.ts +922 -0
  302. package/src/db/runner-sessions.test.ts +19 -6
  303. package/src/db/runner-sessions.ts +78 -2
  304. package/src/db/schema/ephemeral-registration-tokens.ts +4 -4
  305. package/src/db/schema/provisioner-capability-snapshots.ts +46 -0
  306. package/src/db/schema/provisioner-tokens.ts +33 -2
  307. package/src/db/schema/runner-activation-tokens.ts +22 -0
  308. package/src/db/schema/runner-control-sessions.ts +46 -0
  309. package/src/db/schema/{provisioned-runners.ts → runner-instances.ts} +28 -27
  310. package/src/db/schema/runner-sessions.ts +11 -7
  311. package/src/db/schema/running-job-executions.ts +5 -5
  312. package/src/index.test.ts +26 -0
  313. package/src/index.ts +38 -27
  314. package/src/installation-provisioning.ts +14 -0
  315. package/src/metrics/index.ts +5 -5
  316. package/src/metrics/instance.ts +25 -14
  317. package/src/presentation/auth/index.ts +4 -0
  318. package/src/presentation/auth/provisioner-token-auth.ts +8 -4
  319. package/src/presentation/auth/runner-control-session-auth.ts +31 -0
  320. package/src/presentation/auth/runner-registration-token-auth.ts +39 -3
  321. package/src/presentation/dto/index.ts +4 -8
  322. package/src/presentation/dto/poll-demand.ts +3 -1
  323. package/src/presentation/dto/provisioner-token.ts +5 -0
  324. package/src/presentation/dto/{provisioned-runners.ts → runner-instances.ts} +13 -15
  325. package/src/presentation/index.ts +2 -1
  326. package/src/presentation/inter-module.test.ts +15 -0
  327. package/src/presentation/inter-module.ts +53 -0
  328. package/src/presentation/routes/assign-runner-instances.ts +49 -0
  329. package/src/presentation/routes/get-provisioner-me.ts +3 -4
  330. package/src/presentation/routes/heartbeat.test.ts +4 -3
  331. package/src/presentation/routes/heartbeat.ts +67 -64
  332. package/src/presentation/routes/index.ts +91 -44
  333. package/src/presentation/routes/list-active-runners.test.ts +23 -23
  334. package/src/presentation/routes/manual-registration-tokens.test.ts +4 -3
  335. package/src/presentation/routes/poll-demand-release.test.ts +4 -4
  336. package/src/presentation/routes/poll-demand.test.ts +161 -22
  337. package/src/presentation/routes/poll-demand.ts +105 -45
  338. package/src/presentation/routes/provisioner-me.test.ts +37 -3
  339. package/src/presentation/routes/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +66 -61
  340. package/src/presentation/routes/reconcile-runner-instances.ts +30 -0
  341. package/src/presentation/routes/register.test.ts +9 -5
  342. package/src/presentation/routes/register.ts +61 -57
  343. package/src/presentation/routes/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +28 -28
  344. package/src/presentation/routes/{report-provisioned-runners.ts → report-runner-instances.ts} +14 -14
  345. package/src/presentation/routes/request-job.test.ts +5 -3
  346. package/src/presentation/routes/request-job.ts +41 -37
  347. package/src/presentation/routes/runner-enrollment.test.ts +319 -0
  348. package/src/presentation/routes/runner-enrollment.ts +196 -0
  349. package/src/temporal/activities/index.ts +2 -2
  350. package/src/temporal/activities/maintenance-activities.test.ts +7 -7
  351. package/src/temporal/activities/maintenance-activities.ts +3 -3
  352. package/src/temporal/workflows/stuck-job-detector.test.ts +3 -3
  353. package/src/temporal/workflows/stuck-job-detector.ts +2 -2
  354. package/test/env.ts +1 -3
  355. package/test/factories/ephemeral-registration-token.ts +2 -2
  356. package/test/factories/provisioner-token.ts +3 -1
  357. package/test/factories/runner-instance.ts +57 -0
  358. package/test/factories/runner-session.ts +3 -1
  359. package/test/fixtures/auth-inter-module.ts +30 -0
  360. package/test/globalSetup.ts +4 -1
  361. package/test/index.ts +2 -1
  362. package/tsconfig.build.tsbuildinfo +1 -1
  363. package/dist/core/entities/provisioned-runner.d.ts.map +0 -1
  364. package/dist/core/entities/provisioned-runner.js +0 -3
  365. package/dist/core/entities/provisioned-runner.js.map +0 -1
  366. package/dist/core/provisioned-runners.d.ts +0 -67
  367. package/dist/core/provisioned-runners.d.ts.map +0 -1
  368. package/dist/core/provisioned-runners.js +0 -162
  369. package/dist/core/provisioned-runners.js.map +0 -1
  370. package/dist/db/provisioned-runners.d.ts +0 -79
  371. package/dist/db/provisioned-runners.d.ts.map +0 -1
  372. package/dist/db/provisioned-runners.js +0 -466
  373. package/dist/db/provisioned-runners.js.map +0 -1
  374. package/dist/db/schema/provisioned-runners.d.ts.map +0 -1
  375. package/dist/db/schema/provisioned-runners.js.map +0 -1
  376. package/dist/presentation/dto/mint-registration-tokens.d.ts +0 -5
  377. package/dist/presentation/dto/mint-registration-tokens.d.ts.map +0 -1
  378. package/dist/presentation/dto/mint-registration-tokens.js +0 -19
  379. package/dist/presentation/dto/mint-registration-tokens.js.map +0 -1
  380. package/dist/presentation/dto/provisioned-runners.d.ts.map +0 -1
  381. package/dist/presentation/dto/provisioned-runners.js.map +0 -1
  382. package/dist/presentation/routes/mint-registration-tokens.d.ts +0 -2
  383. package/dist/presentation/routes/mint-registration-tokens.d.ts.map +0 -1
  384. package/dist/presentation/routes/mint-registration-tokens.js +0 -74
  385. package/dist/presentation/routes/mint-registration-tokens.js.map +0 -1
  386. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +0 -2
  387. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +0 -1
  388. package/dist/presentation/routes/reconcile-provisioned-runners.js +0 -27
  389. package/dist/presentation/routes/reconcile-provisioned-runners.js.map +0 -1
  390. package/dist/presentation/routes/report-provisioned-runners.d.ts +0 -2
  391. package/dist/presentation/routes/report-provisioned-runners.d.ts.map +0 -1
  392. package/dist/presentation/routes/report-provisioned-runners.js +0 -37
  393. package/dist/presentation/routes/report-provisioned-runners.js.map +0 -1
  394. package/src/core/provisioned-runners.ts +0 -301
  395. package/src/db/provisioned-runners.ts +0 -886
  396. package/src/presentation/dto/mint-registration-tokens.ts +0 -35
  397. package/src/presentation/routes/mint-registration-tokens.test.ts +0 -453
  398. package/src/presentation/routes/mint-registration-tokens.ts +0 -82
  399. package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
  400. package/test/factories/provisioned-runner.ts +0 -78
@@ -44,7 +44,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
44
44
  });
45
45
 
46
46
  expect(result).toHaveLength(2);
47
- expect(result.map((token) => token.provisionedRunnerId).sort()).toEqual([
47
+ expect(result.map((token) => token.providerRunnerId).sort()).toEqual([
48
48
  'provisioned-runner-a',
49
49
  'provisioned-runner-b',
50
50
  ]);
@@ -53,14 +53,14 @@ describe('createEphemeralRegistrationTokensBatch', () => {
53
53
  expect(result.every((token) => token.provisionerId === provisionerId)).toBe(true);
54
54
  expect(
55
55
  await resolveEphemeralRegistrationTokenByHash(hashOpaqueToken(rawTokens[0] ?? '')),
56
- ).toEqual(expect.objectContaining({provisionedRunnerId: 'provisioned-runner-a'}));
56
+ ).toEqual(expect.objectContaining({providerRunnerId: 'provisioned-runner-a'}));
57
57
  });
58
58
 
59
59
  it('rejects the batch and inserts no rows when any provisioned runner already has an active token', async () => {
60
60
  await ephemeralRegistrationTokenFactory.create({
61
61
  workspaceId,
62
62
  provisionerId,
63
- provisionedRunnerId: 'provisioned-runner-a',
63
+ providerRunnerId: 'provisioned-runner-a',
64
64
  expiresAt: new Date(Date.now() + 60_000),
65
65
  });
66
66
  const rawToken = generateOpaqueToken('ephemeralRegistrationToken');
@@ -85,7 +85,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
85
85
  ),
86
86
  );
87
87
  expect(rows).toHaveLength(1);
88
- expect(rows[0]?.provisionedRunnerId).toBe('provisioned-runner-a');
88
+ expect(rows[0]?.providerRunnerId).toBe('provisioned-runner-a');
89
89
  });
90
90
 
91
91
  it('allows sequential batches that exactly reach the reservation count', async () => {
@@ -152,7 +152,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
152
152
  workspaceId,
153
153
  provisionerId,
154
154
  reservationId,
155
- provisionedRunnerId: 'provisioned-runner-consumed',
155
+ providerRunnerId: 'provisioned-runner-consumed',
156
156
  expiresAt: new Date(Date.now() + 60_000),
157
157
  });
158
158
  await db()
@@ -163,7 +163,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
163
163
  workspaceId,
164
164
  provisionerId,
165
165
  reservationId,
166
- provisionedRunnerId: 'provisioned-runner-expired',
166
+ providerRunnerId: 'provisioned-runner-expired',
167
167
  expiresAt: new Date(Date.now() - 60_000),
168
168
  });
169
169
 
@@ -209,9 +209,9 @@ describe('createEphemeralRegistrationTokensBatch', () => {
209
209
  return rows.length;
210
210
  }
211
211
 
212
- function row(provisionedRunnerId: string, rawToken: string) {
212
+ function row(providerRunnerId: string, rawToken: string) {
213
213
  return {
214
- provisionedRunnerId,
214
+ providerRunnerId,
215
215
  hashedToken: hashOpaqueToken(rawToken),
216
216
  prefix: extractDisplayPrefix(rawToken),
217
217
  };
@@ -303,7 +303,7 @@ describe('deleteExpiredEphemeralRegistrationTokens', () => {
303
303
  id,
304
304
  workspaceId,
305
305
  provisionerId,
306
- provisionedRunnerId: `provisioned-${id}`,
306
+ providerRunnerId: `provisioned-${id}`,
307
307
  hashedToken: crypto.randomUUID(),
308
308
  prefix: 'sfxr_test',
309
309
  expiresAt: params.expiresAt,
@@ -16,22 +16,22 @@ import {
16
16
  ephemeralRegistrationTokens,
17
17
  toEphemeralRegistrationToken,
18
18
  } from './schema/ephemeral-registration-tokens.js';
19
- import {provisionedRunners} from './schema/provisioned-runners.js';
20
19
  import {reservations} from './schema/reservations.js';
20
+ import {providerRunners} from './schema/runner-instances.js';
21
21
  import {runnerSessions, toRunnerSession} from './schema/runner-sessions.js';
22
22
 
23
23
  export interface CreateEphemeralRegistrationTokenParams {
24
24
  workspaceId: string;
25
25
  provisionerId: string;
26
26
  reservationId?: string | null | undefined;
27
- provisionedRunnerId: string;
27
+ providerRunnerId: string;
28
28
  hashedToken: string;
29
29
  prefix: string;
30
30
  expiresAt: Date;
31
31
  }
32
32
 
33
33
  export interface CreateEphemeralRegistrationTokensBatchRow {
34
- provisionedRunnerId: string;
34
+ providerRunnerId: string;
35
35
  hashedToken: string;
36
36
  prefix: string;
37
37
  }
@@ -48,13 +48,13 @@ export async function createEphemeralRegistrationToken(
48
48
  params: CreateEphemeralRegistrationTokenParams,
49
49
  ): Promise<EphemeralRegistrationToken> {
50
50
  const rows = await db().transaction(async (tx) => {
51
- const provisionedRunnerLockKey = [
51
+ const providerRunnerLockKey = [
52
52
  'runners_ephemeral_registration_tokens',
53
53
  params.workspaceId,
54
54
  params.provisionerId,
55
- params.provisionedRunnerId,
55
+ params.providerRunnerId,
56
56
  ].join(':');
57
- await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionedRunnerLockKey}))`);
57
+ await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);
58
58
 
59
59
  const [active] = await tx
60
60
  .select({id: ephemeralRegistrationTokens.id})
@@ -63,7 +63,7 @@ export async function createEphemeralRegistrationToken(
63
63
  and(
64
64
  eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),
65
65
  eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),
66
- eq(ephemeralRegistrationTokens.provisionedRunnerId, params.provisionedRunnerId),
66
+ eq(ephemeralRegistrationTokens.providerRunnerId, params.providerRunnerId),
67
67
  isNull(ephemeralRegistrationTokens.consumedAt),
68
68
  gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),
69
69
  ),
@@ -74,7 +74,7 @@ export async function createEphemeralRegistrationToken(
74
74
  throw new ActiveEphemeralRegistrationTokenExistsError(
75
75
  params.workspaceId,
76
76
  params.provisionerId,
77
- params.provisionedRunnerId,
77
+ params.providerRunnerId,
78
78
  );
79
79
  }
80
80
 
@@ -84,7 +84,7 @@ export async function createEphemeralRegistrationToken(
84
84
  workspaceId: params.workspaceId,
85
85
  provisionerId: params.provisionerId,
86
86
  reservationId: params.reservationId ?? null,
87
- provisionedRunnerId: params.provisionedRunnerId,
87
+ providerRunnerId: params.providerRunnerId,
88
88
  hashedToken: params.hashedToken,
89
89
  prefix: params.prefix,
90
90
  expiresAt: params.expiresAt,
@@ -107,16 +107,16 @@ export async function createEphemeralRegistrationTokensBatch(
107
107
  params.provisionerId,
108
108
  ].join(':');
109
109
  await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionerLockKey}))`);
110
- for (const provisionedRunnerId of [
111
- ...new Set(params.rows.map((row) => row.provisionedRunnerId)),
110
+ for (const providerRunnerId of [
111
+ ...new Set(params.rows.map((row) => row.providerRunnerId)),
112
112
  ].sort()) {
113
- const provisionedRunnerLockKey = [
113
+ const providerRunnerLockKey = [
114
114
  'runners_ephemeral_registration_tokens',
115
115
  params.workspaceId,
116
116
  params.provisionerId,
117
- provisionedRunnerId,
117
+ providerRunnerId,
118
118
  ].join(':');
119
- await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionedRunnerLockKey}))`);
119
+ await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);
120
120
  }
121
121
 
122
122
  const [reservation] = await tx
@@ -162,15 +162,15 @@ export async function createEphemeralRegistrationTokensBatch(
162
162
  );
163
163
  }
164
164
 
165
- const provisionedRunnerIds = params.rows.map((row) => row.provisionedRunnerId);
165
+ const providerRunnerIds = params.rows.map((row) => row.providerRunnerId);
166
166
  const activeRows = await tx
167
- .select({provisionedRunnerId: ephemeralRegistrationTokens.provisionedRunnerId})
167
+ .select({providerRunnerId: ephemeralRegistrationTokens.providerRunnerId})
168
168
  .from(ephemeralRegistrationTokens)
169
169
  .where(
170
170
  and(
171
171
  eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),
172
172
  eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),
173
- inArray(ephemeralRegistrationTokens.provisionedRunnerId, provisionedRunnerIds),
173
+ inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),
174
174
  isNull(ephemeralRegistrationTokens.consumedAt),
175
175
  gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),
176
176
  ),
@@ -178,7 +178,7 @@ export async function createEphemeralRegistrationTokensBatch(
178
178
 
179
179
  if (activeRows.length > 0) {
180
180
  throw new ActiveEphemeralRegistrationTokensExistError(
181
- activeRows.map((row) => row.provisionedRunnerId),
181
+ activeRows.map((row) => row.providerRunnerId),
182
182
  );
183
183
  }
184
184
 
@@ -189,7 +189,7 @@ export async function createEphemeralRegistrationTokensBatch(
189
189
  workspaceId: params.workspaceId,
190
190
  provisionerId: params.provisionerId,
191
191
  reservationId: params.reservationId,
192
- provisionedRunnerId: row.provisionedRunnerId,
192
+ providerRunnerId: row.providerRunnerId,
193
193
  hashedToken: row.hashedToken,
194
194
  prefix: row.prefix,
195
195
  expiresAt: params.expiresAt,
@@ -277,7 +277,7 @@ export async function createRunnerSessionConsumingEphemeralToken(params: {
277
277
  .returning({
278
278
  id: ephemeralRegistrationTokens.id,
279
279
  provisionerId: ephemeralRegistrationTokens.provisionerId,
280
- provisionedRunnerId: ephemeralRegistrationTokens.provisionedRunnerId,
280
+ providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,
281
281
  });
282
282
 
283
283
  if (!consumed[0]) {
@@ -315,7 +315,7 @@ export async function createRunnerSessionConsumingEphemeralToken(params: {
315
315
  registrationTokenId: params.ephemeralTokenId,
316
316
  registrationTokenKind: 'ephemeral',
317
317
  provisionerId: consumed[0].provisionerId,
318
- provisionedRunnerId: consumed[0].provisionedRunnerId,
318
+ providerRunnerId: consumed[0].providerRunnerId,
319
319
  labels: params.labels,
320
320
  toolCapabilities: params.toolCapabilities ?? null,
321
321
  toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,
@@ -332,14 +332,14 @@ export async function createRunnerSessionConsumingEphemeralToken(params: {
332
332
  .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId));
333
333
 
334
334
  await tx
335
- .update(provisionedRunners)
335
+ .update(providerRunners)
336
336
  .set({runnerSessionId: session.id, updatedAt: sql`now()`})
337
337
  .where(
338
338
  and(
339
- eq(provisionedRunners.workspaceId, params.workspaceId),
340
- eq(provisionedRunners.provisionerId, consumed[0].provisionerId),
341
- eq(provisionedRunners.provisionedRunnerId, consumed[0].provisionedRunnerId),
342
- isNull(provisionedRunners.reservationReleasedAt),
339
+ eq(providerRunners.workspaceId, params.workspaceId),
340
+ eq(providerRunners.provisionerId, consumed[0].provisionerId),
341
+ eq(providerRunners.providerRunnerId, consumed[0].providerRunnerId),
342
+ isNull(providerRunners.reservationReleasedAt),
343
343
  ),
344
344
  );
345
345
 
package/src/db/index.ts CHANGED
@@ -15,7 +15,7 @@ export {
15
15
  export type {
16
16
  ClaimedJobExecution,
17
17
  EnqueueJobExecutionParams,
18
- ProvisionedRunnerBoundJobExecution,
18
+ RunnerInstanceBoundJobExecution,
19
19
  } from './job-executions.js';
20
20
  export {
21
21
  cancelRunnerJobs,
@@ -24,7 +24,7 @@ export {
24
24
  expireStuckJobExecutions,
25
25
  isJobLeaseActive,
26
26
  listActiveRunningJobExecutions,
27
- listRunningJobExecutionsByProvisionedRunnerTx,
27
+ listRunningJobExecutionsByRunnerInstanceTx,
28
28
  recordHeartbeat,
29
29
  releaseJobExecution,
30
30
  } from './job-executions.js';
@@ -35,26 +35,12 @@ export {
35
35
  resolveManualRegistrationTokenByHash,
36
36
  revokeManualRegistrationToken,
37
37
  } from './manual-registration-tokens.js';
38
- export type {
39
- ActiveProvisionedRunnerTemplateCount,
40
- ProvisionedRunnerReportEvent,
41
- ProvisionedRunnerTerminateIntent,
42
- ProvisionedRunnerTerminateIntentReason,
43
- ReapStaleProvisionedRunnersResult,
44
- ReconcileProvisionedRunnersDbResult,
45
- ReconcileProvisionedRunnersParams,
46
- ReportProvisionedRunnersParams,
47
- } from './provisioned-runners.js';
48
38
  export {
49
- isTerminalState,
50
- listActiveProvisionedRunnerCountsByTemplateTx,
51
- listActiveProvisionedRunners,
52
- listProvisionerTerminateIntentRowsTx,
53
- listProvisionerTerminateIntents,
54
- reapStaleProvisionedRunners,
55
- reconcileProvisionedRunners,
56
- reportProvisionedRunners,
57
- } from './provisioned-runners.js';
39
+ hasActiveWorkspaceProvisionerCapability,
40
+ listActiveWorkspaceProvisionerCapabilitySnapshots,
41
+ listStaleWorkspaceProvisionerCapabilitySnapshots,
42
+ publishWorkspaceProvisionerCapabilitySnapshot,
43
+ } from './provisioner-capability-snapshots.js';
58
44
  export type {CreateProvisionerTokenParams} from './provisioner-tokens.js';
59
45
  export {
60
46
  createProvisionerToken,
@@ -80,11 +66,34 @@ export {
80
66
  pollDemandAndReserve,
81
67
  releaseReservationUnits,
82
68
  } from './reservations.js';
69
+ export {assignRunnerInstances} from './runner-assignments.js';
70
+ export type {
71
+ ActiveRunnerInstanceTemplateCount,
72
+ ReapStaleRunnerInstancesResult,
73
+ ReconcileRunnerInstancesDbResult,
74
+ ReconcileRunnerInstancesParams,
75
+ ReportRunnerInstancesParams,
76
+ RunnerInstanceReportEvent,
77
+ RunnerInstanceTerminateIntent,
78
+ RunnerInstanceTerminateIntentReason,
79
+ } from './runner-instances.js';
80
+ export {
81
+ attachRunnerInstanceProviderId,
82
+ isTerminalState,
83
+ listActiveRunnerInstanceCountsByTemplateTx,
84
+ listActiveRunnerInstances,
85
+ listProvisionerTerminateIntentRowsTx,
86
+ listProvisionerTerminateIntents,
87
+ reapStaleRunnerInstances,
88
+ reconcileRunnerInstances,
89
+ reportRunnerInstances,
90
+ } from './runner-instances.js';
83
91
  export type {
84
92
  CreateRunnerSessionParams,
85
93
  DeleteExpiredRunnerSessionsParams,
86
94
  } from './runner-sessions.js';
87
95
  export {createRunnerSession, deleteExpiredRunnerSessions} from './runner-sessions.js';
88
96
  export {runnersOutbox} from './schema/outbox.js';
97
+ export {runnerBootstrapTokens, runnerControlSessions} from './schema/runner-control-sessions.js';
89
98
 
90
99
  export const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');
@@ -8,7 +8,7 @@ import {eq, sql} from 'drizzle-orm';
8
8
  import {EmptyRequiredLabelsError, RunnerSessionExhaustedError} from '#core/errors.js';
9
9
  import {claimJobExecution} from '#core/job-executions.js';
10
10
  import {detectAndExpireStuckJobs} from '#core/maintenance.js';
11
- import {pendingJobFactory, runnerSessionFactory} from '#test/index.js';
11
+ import {pendingJobFactory, runnerSessionFactory, runnersTestAuthClient} from '#test/index.js';
12
12
  import {db} from './db.js';
13
13
  import {
14
14
  cancelRunnerJobs,
@@ -385,10 +385,10 @@ describe('claimPendingJobExecution', () => {
385
385
 
386
386
  it('enforces a non-null session claim cap from the database', async () => {
387
387
  const provisionerId = crypto.randomUUID();
388
- const provisionedRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
388
+ const providerRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
389
389
  await db()
390
390
  .update(runnerSessions)
391
- .set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, provisionedRunnerId})
391
+ .set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, providerRunnerId})
392
392
  .where(eq(runnerSessions.id, runnerSessionId));
393
393
  await pendingJobFactory.create({workspaceId});
394
394
  await pendingJobFactory.create({workspaceId});
@@ -403,10 +403,10 @@ describe('claimPendingJobExecution', () => {
403
403
 
404
404
  it('does not spend a claim when a capped session polls an empty queue', async () => {
405
405
  const provisionerId = crypto.randomUUID();
406
- const provisionedRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
406
+ const providerRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
407
407
  await db()
408
408
  .update(runnerSessions)
409
- .set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, provisionedRunnerId})
409
+ .set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, providerRunnerId})
410
410
  .where(eq(runnerSessions.id, runnerSessionId));
411
411
 
412
412
  const empty = await claimPendingJobExecution({workspaceId, runnerSessionId, maxClaims: 1});
@@ -494,15 +494,15 @@ describe('claimPendingJobExecution', () => {
494
494
  expect(running[0]?.requiredLabels).toEqual(created.requiredLabels);
495
495
  expect(running[0]?.runnerLabels).toEqual(sessionLabels);
496
496
  expect(running[0]?.provisionerId).toBeNull();
497
- expect(running[0]?.provisionedRunnerId).toBeNull();
497
+ expect(running[0]?.providerRunnerId).toBeNull();
498
498
  });
499
499
 
500
500
  it('copies an ephemeral session provisioned-runner link onto the running job', async () => {
501
501
  const provisionerId = crypto.randomUUID();
502
- const provisionedRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
502
+ const providerRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
503
503
  await db()
504
504
  .update(runnerSessions)
505
- .set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, provisionedRunnerId})
505
+ .set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, providerRunnerId})
506
506
  .where(eq(runnerSessions.id, runnerSessionId));
507
507
  const created = await pendingJobFactory.create({workspaceId});
508
508
 
@@ -513,7 +513,7 @@ describe('claimPendingJobExecution', () => {
513
513
  .from(runningJobExecutions)
514
514
  .where(eq(runningJobExecutions.jobId, created.jobId));
515
515
  expect(running?.provisionerId).toBe(provisionerId);
516
- expect(running?.provisionedRunnerId).toBe(provisionedRunnerId);
516
+ expect(running?.providerRunnerId).toBe(providerRunnerId);
517
517
  });
518
518
 
519
519
  it('rejects a running job row with a partial provisioned-runner link', async () => {
@@ -563,7 +563,7 @@ describe('claimPendingJobExecution', () => {
563
563
  labels: sessionLabels,
564
564
  toolCapabilities: {harnesses: {pi: {tools: ['read']}}},
565
565
  });
566
- const underProvisionedRunner = await runnerSessionFactory.create({
566
+ const underRunnerInstance = await runnerSessionFactory.create({
567
567
  workspaceId,
568
568
  labels: sessionLabels,
569
569
  toolCapabilities: {harnesses: {pi: {tools: []}}},
@@ -579,7 +579,7 @@ describe('claimPendingJobExecution', () => {
579
579
 
580
580
  const firstClaim = await claimPendingJobExecution({
581
581
  workspaceId,
582
- runnerSessionId: underProvisionedRunner.id,
582
+ runnerSessionId: underRunnerInstance.id,
583
583
  });
584
584
  const secondClaim = await claimPendingJobExecution({
585
585
  workspaceId,
@@ -758,6 +758,7 @@ describe('claimJobExecution', () => {
758
758
  const created = await pendingJobFactory.create({workspaceId});
759
759
 
760
760
  const claimed = await claimJobExecution({
761
+ auth: runnersTestAuthClient,
761
762
  workspaceId,
762
763
  runnerSessionId,
763
764
  sessionLabels,
@@ -781,6 +782,7 @@ describe('claimJobExecution', () => {
781
782
 
782
783
  it('returns null and mints no token when the queue is empty', async () => {
783
784
  const claimed = await claimJobExecution({
785
+ auth: runnersTestAuthClient,
784
786
  workspaceId,
785
787
  runnerSessionId,
786
788
  sessionLabels,
@@ -110,19 +110,19 @@ export interface ActiveRunningJobExecution {
110
110
  projectId: string;
111
111
  runnerSessionId: string;
112
112
  provisionerId: string | null;
113
- provisionedRunnerId: string | null;
113
+ providerRunnerId: string | null;
114
114
  requiredLabels: string[];
115
115
  runnerLabels: string[];
116
116
  startedAt: Date;
117
117
  lastHeartbeatAt: Date;
118
118
  }
119
119
 
120
- export interface ProvisionedRunnerBoundJobExecution {
120
+ export interface RunnerInstanceBoundJobExecution {
121
121
  workflowRunId: string;
122
122
  workflowRunAttemptId: string;
123
123
  jobId: string;
124
124
  jobExecutionId: string;
125
- provisionedRunnerId: string;
125
+ providerRunnerId: string;
126
126
  startedAt: Date;
127
127
  lastHeartbeatAt: Date;
128
128
  cancellationRequestedAt: Date | null;
@@ -145,29 +145,35 @@ export async function claimPendingJobExecution(params: {
145
145
 
146
146
  return await db().transaction(async (tx) => {
147
147
  let provisionerId: string | null = null;
148
- let provisionedRunnerId: string | null = null;
148
+ let providerRunnerId: string | null = null;
149
149
 
150
150
  if (params.maxClaims !== null) {
151
151
  const [session] = await tx
152
152
  .select({
153
153
  maxClaims: runnerSessions.maxClaims,
154
154
  claimsUsed: runnerSessions.claimsUsed,
155
+ revokedAt: runnerSessions.revokedAt,
155
156
  provisionerId: runnerSessions.provisionerId,
156
- provisionedRunnerId: runnerSessions.provisionedRunnerId,
157
+ providerRunnerId: runnerSessions.providerRunnerId,
157
158
  })
158
159
  .from(runnerSessions)
159
160
  .where(eq(runnerSessions.id, params.runnerSessionId))
160
161
  .limit(1)
161
162
  .for('update');
162
163
 
163
- if (!session || session.maxClaims === null || session.claimsUsed >= session.maxClaims) {
164
+ if (
165
+ !session ||
166
+ session.revokedAt ||
167
+ session.maxClaims === null ||
168
+ session.claimsUsed >= session.maxClaims
169
+ ) {
164
170
  throw new RunnerSessionExhaustedError(params.runnerSessionId);
165
171
  }
166
172
 
167
173
  // Ephemeral sessions are the only capped sessions, and the DB check keeps
168
174
  // their provisioned-runner link present as a pair.
169
175
  provisionerId = session.provisionerId;
170
- provisionedRunnerId = session.provisionedRunnerId;
176
+ providerRunnerId = session.providerRunnerId;
171
177
  }
172
178
 
173
179
  // `id` is a uuidv7 (time-ordered), so it is a deterministic FIFO tiebreaker
@@ -206,7 +212,7 @@ export async function claimPendingJobExecution(params: {
206
212
  projectId: row.projectId,
207
213
  runnerSessionId: params.runnerSessionId,
208
214
  provisionerId,
209
- provisionedRunnerId,
215
+ providerRunnerId,
210
216
  requiredLabels: row.requiredLabels,
211
217
  runnerLabels: params.sessionLabels,
212
218
  })
@@ -409,7 +415,7 @@ export async function listActiveRunningJobExecutions(params: {
409
415
  projectId: runningJobExecutions.projectId,
410
416
  runnerSessionId: runningJobExecutions.runnerSessionId,
411
417
  provisionerId: runningJobExecutions.provisionerId,
412
- provisionedRunnerId: runningJobExecutions.provisionedRunnerId,
418
+ providerRunnerId: runningJobExecutions.providerRunnerId,
413
419
  requiredLabels: runningJobExecutions.requiredLabels,
414
420
  runnerLabels: runningJobExecutions.runnerLabels,
415
421
  startedAt: runningJobExecutions.startedAt,
@@ -426,19 +432,19 @@ export async function listActiveRunningJobExecutions(params: {
426
432
  .limit(params.limit ?? 1000);
427
433
  }
428
434
 
429
- export async function listRunningJobExecutionsByProvisionedRunnerTx(
435
+ export async function listRunningJobExecutionsByRunnerInstanceTx(
430
436
  tx: Tx,
431
437
  params: {
432
438
  workspaceId: string;
433
439
  provisionerId: string;
434
- provisionedRunnerIds: string[];
440
+ providerRunnerIds: string[];
435
441
  },
436
- ): Promise<ProvisionedRunnerBoundJobExecution[]> {
437
- if (params.provisionedRunnerIds.length === 0) return [];
442
+ ): Promise<RunnerInstanceBoundJobExecution[]> {
443
+ if (params.providerRunnerIds.length === 0) return [];
438
444
 
439
445
  const duplicateRows = await tx
440
446
  .select({
441
- provisionedRunnerId: runningJobExecutions.provisionedRunnerId,
447
+ providerRunnerId: runningJobExecutions.providerRunnerId,
442
448
  count: count(),
443
449
  })
444
450
  .from(runningJobExecutions)
@@ -446,21 +452,21 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
446
452
  and(
447
453
  eq(runningJobExecutions.workspaceId, params.workspaceId),
448
454
  eq(runningJobExecutions.provisionerId, params.provisionerId),
449
- inArray(runningJobExecutions.provisionedRunnerId, params.provisionedRunnerIds),
455
+ inArray(runningJobExecutions.providerRunnerId, params.providerRunnerIds),
450
456
  ),
451
457
  )
452
- .groupBy(runningJobExecutions.provisionedRunnerId)
458
+ .groupBy(runningJobExecutions.providerRunnerId)
453
459
  .having(sql`count(*) > 1`);
454
460
 
455
- const duplicateProvisionedRunnerIds = duplicateRows.flatMap((row) =>
456
- row.provisionedRunnerId ? [row.provisionedRunnerId] : [],
461
+ const duplicateRunnerInstanceIds = duplicateRows.flatMap((row) =>
462
+ row.providerRunnerId ? [row.providerRunnerId] : [],
457
463
  );
458
- if (duplicateProvisionedRunnerIds.length > 0) {
464
+ if (duplicateRunnerInstanceIds.length > 0) {
459
465
  logger().warn(
460
466
  {
461
467
  workspaceId: params.workspaceId,
462
468
  provisionerId: params.provisionerId,
463
- provisionedRunnerIds: duplicateProvisionedRunnerIds,
469
+ providerRunnerIds: duplicateRunnerInstanceIds,
464
470
  },
465
471
  'multiple running job executions are bound to the same provisioned runner',
466
472
  );
@@ -471,17 +477,17 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
471
477
  workflowRunAttemptId: string;
472
478
  jobId: string;
473
479
  jobExecutionId: string;
474
- provisionedRunnerId: string;
480
+ providerRunnerId: string;
475
481
  startedAt: Date | string;
476
482
  lastHeartbeatAt: Date | string;
477
483
  cancellationRequestedAt: Date | string | null;
478
484
  }>(sql`
479
- SELECT DISTINCT ON (${runningJobExecutions.provisionedRunnerId})
485
+ SELECT DISTINCT ON (${runningJobExecutions.providerRunnerId})
480
486
  ${runningJobExecutions.workflowRunId} AS "workflowRunId",
481
487
  ${runningJobExecutions.workflowRunAttemptId} AS "workflowRunAttemptId",
482
488
  ${runningJobExecutions.jobId} AS "jobId",
483
489
  ${runningJobExecutions.jobExecutionId} AS "jobExecutionId",
484
- ${runningJobExecutions.provisionedRunnerId} AS "provisionedRunnerId",
490
+ ${runningJobExecutions.providerRunnerId} AS "providerRunnerId",
485
491
  ${runningJobExecutions.startedAt} AS "startedAt",
486
492
  ${runningJobExecutions.lastHeartbeatAt} AS "lastHeartbeatAt",
487
493
  ${runningJobExecutions.cancellationRequestedAt} AS "cancellationRequestedAt"
@@ -489,11 +495,11 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
489
495
  WHERE
490
496
  ${runningJobExecutions.workspaceId} = ${params.workspaceId}
491
497
  AND ${runningJobExecutions.provisionerId} = ${params.provisionerId}
492
- AND ${runningJobExecutions.provisionedRunnerId} IN (${sql.join(
493
- params.provisionedRunnerIds.map((provisionedRunnerId) => sql`${provisionedRunnerId}`),
498
+ AND ${runningJobExecutions.providerRunnerId} IN (${sql.join(
499
+ params.providerRunnerIds.map((providerRunnerId) => sql`${providerRunnerId}`),
494
500
  sql`, `,
495
501
  )})
496
- ORDER BY ${runningJobExecutions.provisionedRunnerId}, ${runningJobExecutions.startedAt} DESC, ${runningJobExecutions.jobExecutionId} DESC
502
+ ORDER BY ${runningJobExecutions.providerRunnerId}, ${runningJobExecutions.startedAt} DESC, ${runningJobExecutions.jobExecutionId} DESC
497
503
  `);
498
504
 
499
505
  return result.rows.map((row) => ({
@@ -501,7 +507,7 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
501
507
  workflowRunAttemptId: row.workflowRunAttemptId,
502
508
  jobId: row.jobId,
503
509
  jobExecutionId: row.jobExecutionId,
504
- provisionedRunnerId: row.provisionedRunnerId,
510
+ providerRunnerId: row.providerRunnerId,
505
511
  startedAt: toDate(row.startedAt),
506
512
  lastHeartbeatAt: toDate(row.lastHeartbeatAt),
507
513
  cancellationRequestedAt: row.cancellationRequestedAt