@shipfox/api-runners 5.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/CHANGELOG.md +61 -0
  3. package/dist/config.d.ts +5 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +53 -6
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/capacity-assignments.d.ts +7 -0
  8. package/dist/core/capacity-assignments.d.ts.map +1 -0
  9. package/dist/core/capacity-assignments.js +6 -0
  10. package/dist/core/capacity-assignments.js.map +1 -0
  11. package/dist/core/demand.d.ts +6 -6
  12. package/dist/core/demand.d.ts.map +1 -1
  13. package/dist/core/demand.js +10 -10
  14. package/dist/core/demand.js.map +1 -1
  15. package/dist/core/entities/capacity-assignment.d.ts +9 -0
  16. package/dist/core/entities/capacity-assignment.d.ts.map +1 -0
  17. package/dist/core/entities/capacity-assignment.js +3 -0
  18. package/dist/core/entities/capacity-assignment.js.map +1 -0
  19. package/dist/core/entities/ephemeral-registration-token.d.ts +1 -1
  20. package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -1
  21. package/dist/core/entities/ephemeral-registration-token.js.map +1 -1
  22. package/dist/core/entities/provisioner-capability-snapshot.d.ts +13 -0
  23. package/dist/core/entities/provisioner-capability-snapshot.d.ts.map +1 -0
  24. package/dist/core/entities/provisioner-capability-snapshot.js +3 -0
  25. package/dist/core/entities/provisioner-capability-snapshot.js.map +1 -0
  26. package/dist/core/entities/provisioner-token.d.ts +10 -2
  27. package/dist/core/entities/provisioner-token.d.ts.map +1 -1
  28. package/dist/core/entities/provisioner-token.js.map +1 -1
  29. package/dist/core/entities/{provisioned-runner.d.ts → runner-instance.d.ts} +6 -6
  30. package/dist/core/entities/runner-instance.d.ts.map +1 -0
  31. package/dist/core/entities/runner-instance.js +3 -0
  32. package/dist/core/entities/runner-instance.js.map +1 -0
  33. package/dist/core/entities/runner-session.d.ts +4 -2
  34. package/dist/core/entities/runner-session.d.ts.map +1 -1
  35. package/dist/core/entities/runner-session.js.map +1 -1
  36. package/dist/core/ephemeral-registration-tokens.d.ts +5 -5
  37. package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -1
  38. package/dist/core/ephemeral-registration-tokens.js +12 -12
  39. package/dist/core/ephemeral-registration-tokens.js.map +1 -1
  40. package/dist/core/errors.d.ts +16 -4
  41. package/dist/core/errors.d.ts.map +1 -1
  42. package/dist/core/errors.js +22 -4
  43. package/dist/core/errors.js.map +1 -1
  44. package/dist/core/index.d.ts +10 -4
  45. package/dist/core/index.d.ts.map +1 -1
  46. package/dist/core/index.js +6 -2
  47. package/dist/core/index.js.map +1 -1
  48. package/dist/core/job-executions.d.ts +2 -0
  49. package/dist/core/job-executions.d.ts.map +1 -1
  50. package/dist/core/job-executions.js +1 -2
  51. package/dist/core/job-executions.js.map +1 -1
  52. package/dist/core/maintenance.d.ts +1 -1
  53. package/dist/core/maintenance.d.ts.map +1 -1
  54. package/dist/core/maintenance.js +5 -5
  55. package/dist/core/maintenance.js.map +1 -1
  56. package/dist/core/provisioner-capability-snapshots.d.ts +5 -0
  57. package/dist/core/provisioner-capability-snapshots.d.ts.map +1 -0
  58. package/dist/core/provisioner-capability-snapshots.js +10 -0
  59. package/dist/core/provisioner-capability-snapshots.js.map +1 -0
  60. package/dist/core/provisioner-tokens.d.ts +10 -0
  61. package/dist/core/provisioner-tokens.d.ts.map +1 -1
  62. package/dist/core/provisioner-tokens.js +23 -1
  63. package/dist/core/provisioner-tokens.js.map +1 -1
  64. package/dist/core/rate-limit.d.ts.map +1 -1
  65. package/dist/core/rate-limit.js +2 -7
  66. package/dist/core/rate-limit.js.map +1 -1
  67. package/dist/core/runner-activation.d.ts +13 -0
  68. package/dist/core/runner-activation.d.ts.map +1 -0
  69. package/dist/core/runner-activation.js +36 -0
  70. package/dist/core/runner-activation.js.map +1 -0
  71. package/dist/core/runner-control-sessions.d.ts +46 -0
  72. package/dist/core/runner-control-sessions.d.ts.map +1 -0
  73. package/dist/core/runner-control-sessions.js +121 -0
  74. package/dist/core/runner-control-sessions.js.map +1 -0
  75. package/dist/core/runner-instances.d.ts +79 -0
  76. package/dist/core/runner-instances.d.ts.map +1 -0
  77. package/dist/core/runner-instances.js +168 -0
  78. package/dist/core/runner-instances.js.map +1 -0
  79. package/dist/core/runner-sessions.d.ts +8 -2
  80. package/dist/core/runner-sessions.d.ts.map +1 -1
  81. package/dist/core/runner-sessions.js +8 -5
  82. package/dist/core/runner-sessions.js.map +1 -1
  83. package/dist/db/capacity-assignments.d.ts +7 -0
  84. package/dist/db/capacity-assignments.d.ts.map +1 -0
  85. package/dist/db/capacity-assignments.js +72 -0
  86. package/dist/db/capacity-assignments.js.map +1 -0
  87. package/dist/db/db.d.ts +2837 -1009
  88. package/dist/db/db.d.ts.map +1 -1
  89. package/dist/db/db.js +11 -2
  90. package/dist/db/db.js.map +1 -1
  91. package/dist/db/ephemeral-registration-tokens.d.ts +2 -2
  92. package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
  93. package/dist/db/ephemeral-registration-tokens.js +21 -21
  94. package/dist/db/ephemeral-registration-tokens.js.map +1 -1
  95. package/dist/db/index.d.ts +7 -4
  96. package/dist/db/index.d.ts.map +1 -1
  97. package/dist/db/index.js +5 -2
  98. package/dist/db/index.js.map +1 -1
  99. package/dist/db/job-executions.d.ts +6 -6
  100. package/dist/db/job-executions.d.ts.map +1 -1
  101. package/dist/db/job-executions.js +20 -19
  102. package/dist/db/job-executions.js.map +1 -1
  103. package/dist/db/provisioner-capability-snapshots.d.ts +21 -0
  104. package/dist/db/provisioner-capability-snapshots.d.ts.map +1 -0
  105. package/dist/db/provisioner-capability-snapshots.js +57 -0
  106. package/dist/db/provisioner-capability-snapshots.js.map +1 -0
  107. package/dist/db/provisioner-tokens.d.ts +7 -2
  108. package/dist/db/provisioner-tokens.d.ts.map +1 -1
  109. package/dist/db/provisioner-tokens.js +59 -10
  110. package/dist/db/provisioner-tokens.js.map +1 -1
  111. package/dist/db/reservations.d.ts +18 -0
  112. package/dist/db/reservations.d.ts.map +1 -1
  113. package/dist/db/reservations.js +88 -1
  114. package/dist/db/reservations.js.map +1 -1
  115. package/dist/db/runner-instances.d.ts +91 -0
  116. package/dist/db/runner-instances.d.ts.map +1 -0
  117. package/dist/db/runner-instances.js +511 -0
  118. package/dist/db/runner-instances.js.map +1 -0
  119. package/dist/db/runner-sessions.d.ts +5 -0
  120. package/dist/db/runner-sessions.d.ts.map +1 -1
  121. package/dist/db/runner-sessions.js +48 -2
  122. package/dist/db/runner-sessions.js.map +1 -1
  123. package/dist/db/schema/capacity-assignments.d.ts +113 -0
  124. package/dist/db/schema/capacity-assignments.d.ts.map +1 -0
  125. package/dist/db/schema/capacity-assignments.js +29 -0
  126. package/dist/db/schema/capacity-assignments.js.map +1 -0
  127. package/dist/db/schema/ephemeral-registration-tokens.d.ts +2 -2
  128. package/dist/db/schema/ephemeral-registration-tokens.js +3 -3
  129. package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -1
  130. package/dist/db/schema/provisioner-capability-snapshots.d.ts +207 -0
  131. package/dist/db/schema/provisioner-capability-snapshots.d.ts.map +1 -0
  132. package/dist/db/schema/provisioner-capability-snapshots.js +38 -0
  133. package/dist/db/schema/provisioner-capability-snapshots.js.map +1 -0
  134. package/dist/db/schema/provisioner-tokens.d.ts +19 -1
  135. package/dist/db/schema/provisioner-tokens.d.ts.map +1 -1
  136. package/dist/db/schema/provisioner-tokens.js +29 -3
  137. package/dist/db/schema/provisioner-tokens.js.map +1 -1
  138. package/dist/db/schema/runner-activation-tokens.d.ts +161 -0
  139. package/dist/db/schema/runner-activation-tokens.d.ts.map +1 -0
  140. package/dist/db/schema/runner-activation-tokens.js +27 -0
  141. package/dist/db/schema/runner-activation-tokens.js.map +1 -0
  142. package/dist/db/schema/runner-control-sessions.d.ts +338 -0
  143. package/dist/db/schema/runner-control-sessions.d.ts.map +1 -0
  144. package/dist/db/schema/runner-control-sessions.js +52 -0
  145. package/dist/db/schema/runner-control-sessions.js.map +1 -0
  146. package/dist/db/schema/{provisioned-runners.d.ts → runner-instances.d.ts} +88 -34
  147. package/dist/db/schema/runner-instances.d.ts.map +1 -0
  148. package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +19 -14
  149. package/dist/db/schema/runner-instances.js.map +1 -0
  150. package/dist/db/schema/runner-sessions.d.ts +39 -5
  151. package/dist/db/schema/runner-sessions.d.ts.map +1 -1
  152. package/dist/db/schema/runner-sessions.js +13 -6
  153. package/dist/db/schema/runner-sessions.js.map +1 -1
  154. package/dist/db/schema/running-job-executions.d.ts +2 -2
  155. package/dist/db/schema/running-job-executions.js +4 -4
  156. package/dist/db/schema/running-job-executions.js.map +1 -1
  157. package/dist/index.d.ts +7 -2
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +45 -38
  160. package/dist/index.js.map +1 -1
  161. package/dist/installation-provisioning.d.ts +14 -0
  162. package/dist/installation-provisioning.d.ts.map +1 -0
  163. package/dist/installation-provisioning.js +7 -0
  164. package/dist/installation-provisioning.js.map +1 -0
  165. package/dist/metrics/index.d.ts +1 -1
  166. package/dist/metrics/index.d.ts.map +1 -1
  167. package/dist/metrics/index.js +1 -1
  168. package/dist/metrics/index.js.map +1 -1
  169. package/dist/metrics/instance.d.ts +11 -7
  170. package/dist/metrics/instance.d.ts.map +1 -1
  171. package/dist/metrics/instance.js +13 -7
  172. package/dist/metrics/instance.js.map +1 -1
  173. package/dist/presentation/auth/index.d.ts +1 -0
  174. package/dist/presentation/auth/index.d.ts.map +1 -1
  175. package/dist/presentation/auth/index.js +1 -0
  176. package/dist/presentation/auth/index.js.map +1 -1
  177. package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -1
  178. package/dist/presentation/auth/provisioner-token-auth.js +5 -1
  179. package/dist/presentation/auth/provisioner-token-auth.js.map +1 -1
  180. package/dist/presentation/auth/runner-control-session-auth.d.ts +4 -0
  181. package/dist/presentation/auth/runner-control-session-auth.d.ts.map +1 -0
  182. package/dist/presentation/auth/runner-control-session-auth.js +29 -0
  183. package/dist/presentation/auth/runner-control-session-auth.js.map +1 -0
  184. package/dist/presentation/auth/runner-registration-token-auth.d.ts +5 -1
  185. package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -1
  186. package/dist/presentation/auth/runner-registration-token-auth.js +21 -1
  187. package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -1
  188. package/dist/presentation/dto/index.d.ts +2 -2
  189. package/dist/presentation/dto/index.d.ts.map +1 -1
  190. package/dist/presentation/dto/index.js +2 -2
  191. package/dist/presentation/dto/index.js.map +1 -1
  192. package/dist/presentation/dto/mint-registration-tokens.d.ts +5 -3
  193. package/dist/presentation/dto/mint-registration-tokens.d.ts.map +1 -1
  194. package/dist/presentation/dto/mint-registration-tokens.js +4 -4
  195. package/dist/presentation/dto/mint-registration-tokens.js.map +1 -1
  196. package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
  197. package/dist/presentation/dto/poll-demand.js +7 -1
  198. package/dist/presentation/dto/poll-demand.js.map +1 -1
  199. package/dist/presentation/dto/provisioner-token.d.ts +1 -0
  200. package/dist/presentation/dto/provisioner-token.d.ts.map +1 -1
  201. package/dist/presentation/dto/provisioner-token.js +5 -1
  202. package/dist/presentation/dto/provisioner-token.js.map +1 -1
  203. package/dist/presentation/dto/{provisioned-runners.d.ts → runner-instances.d.ts} +9 -9
  204. package/dist/presentation/dto/runner-instances.d.ts.map +1 -0
  205. package/dist/presentation/dto/{provisioned-runners.js → runner-instances.js} +6 -6
  206. package/dist/presentation/dto/runner-instances.js.map +1 -0
  207. package/dist/presentation/index.d.ts +2 -2
  208. package/dist/presentation/index.d.ts.map +1 -1
  209. package/dist/presentation/index.js +2 -2
  210. package/dist/presentation/index.js.map +1 -1
  211. package/dist/presentation/inter-module.d.ts +5 -0
  212. package/dist/presentation/inter-module.d.ts.map +1 -0
  213. package/dist/presentation/inter-module.js +43 -0
  214. package/dist/presentation/inter-module.js.map +1 -0
  215. package/dist/presentation/routes/assign-capacity.d.ts +2 -0
  216. package/dist/presentation/routes/assign-capacity.d.ts.map +1 -0
  217. package/dist/presentation/routes/assign-capacity.js +44 -0
  218. package/dist/presentation/routes/assign-capacity.js.map +1 -0
  219. package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -1
  220. package/dist/presentation/routes/get-provisioner-me.js +5 -1
  221. package/dist/presentation/routes/get-provisioner-me.js.map +1 -1
  222. package/dist/presentation/routes/heartbeat.d.ts +2 -1
  223. package/dist/presentation/routes/heartbeat.d.ts.map +1 -1
  224. package/dist/presentation/routes/heartbeat.js +60 -50
  225. package/dist/presentation/routes/heartbeat.js.map +1 -1
  226. package/dist/presentation/routes/index.d.ts +3 -1
  227. package/dist/presentation/routes/index.d.ts.map +1 -1
  228. package/dist/presentation/routes/index.js +83 -50
  229. package/dist/presentation/routes/index.js.map +1 -1
  230. package/dist/presentation/routes/mint-registration-tokens.d.ts.map +1 -1
  231. package/dist/presentation/routes/mint-registration-tokens.js +5 -5
  232. package/dist/presentation/routes/mint-registration-tokens.js.map +1 -1
  233. package/dist/presentation/routes/planned-capacity.d.ts +3 -0
  234. package/dist/presentation/routes/planned-capacity.d.ts.map +1 -0
  235. package/dist/presentation/routes/planned-capacity.js +54 -0
  236. package/dist/presentation/routes/planned-capacity.js.map +1 -0
  237. package/dist/presentation/routes/poll-demand.d.ts +2 -0
  238. package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
  239. package/dist/presentation/routes/poll-demand.js +86 -45
  240. package/dist/presentation/routes/poll-demand.js.map +1 -1
  241. package/dist/presentation/routes/reconcile-runner-instances.d.ts +2 -0
  242. package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -0
  243. package/dist/presentation/routes/reconcile-runner-instances.js +27 -0
  244. package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -0
  245. package/dist/presentation/routes/register.d.ts +2 -1
  246. package/dist/presentation/routes/register.d.ts.map +1 -1
  247. package/dist/presentation/routes/register.js +55 -52
  248. package/dist/presentation/routes/register.js.map +1 -1
  249. package/dist/presentation/routes/report-runner-instances.d.ts +2 -0
  250. package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -0
  251. package/dist/presentation/routes/report-runner-instances.js +37 -0
  252. package/dist/presentation/routes/report-runner-instances.js.map +1 -0
  253. package/dist/presentation/routes/request-job.d.ts +2 -1
  254. package/dist/presentation/routes/request-job.d.ts.map +1 -1
  255. package/dist/presentation/routes/request-job.js +39 -36
  256. package/dist/presentation/routes/request-job.js.map +1 -1
  257. package/dist/presentation/routes/runner-enrollment.d.ts +7 -0
  258. package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
  259. package/dist/presentation/routes/runner-enrollment.js +185 -0
  260. package/dist/presentation/routes/runner-enrollment.js.map +1 -0
  261. package/dist/temporal/activities/index.d.ts +2 -2
  262. package/dist/temporal/activities/index.d.ts.map +1 -1
  263. package/dist/temporal/activities/index.js +2 -2
  264. package/dist/temporal/activities/index.js.map +1 -1
  265. package/dist/temporal/activities/maintenance-activities.d.ts +1 -1
  266. package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -1
  267. package/dist/temporal/activities/maintenance-activities.js +3 -3
  268. package/dist/temporal/activities/maintenance-activities.js.map +1 -1
  269. package/dist/temporal/workflows/index.bundle.js +3 -3
  270. package/dist/temporal/workflows/stuck-job-detector.js +2 -2
  271. package/dist/temporal/workflows/stuck-job-detector.js.map +1 -1
  272. package/dist/tsconfig.test.tsbuildinfo +1 -1
  273. package/drizzle/0000_initial.sql +102 -24
  274. package/drizzle/meta/0000_snapshot.json +483 -63
  275. package/package.json +21 -16
  276. package/src/config.test.ts +0 -26
  277. package/src/config.ts +47 -6
  278. package/src/core/capacity-assignments.ts +10 -0
  279. package/src/core/demand.test.ts +29 -29
  280. package/src/core/demand.ts +22 -22
  281. package/src/core/entities/capacity-assignment.ts +8 -0
  282. package/src/core/entities/ephemeral-registration-token.ts +1 -1
  283. package/src/core/entities/provisioner-capability-snapshot.ts +12 -0
  284. package/src/core/entities/provisioner-token.ts +8 -2
  285. package/src/core/entities/{provisioned-runner.ts → runner-instance.ts} +5 -5
  286. package/src/core/entities/runner-session.ts +4 -2
  287. package/src/core/ephemeral-registration-tokens.test.ts +11 -11
  288. package/src/core/ephemeral-registration-tokens.ts +18 -20
  289. package/src/core/errors.ts +23 -4
  290. package/src/core/index.ts +39 -17
  291. package/src/core/job-executions.ts +3 -2
  292. package/src/core/maintenance.test.ts +13 -17
  293. package/src/core/maintenance.ts +5 -5
  294. package/src/core/provisioner-capability-snapshots.test.ts +35 -0
  295. package/src/core/provisioner-capability-snapshots.ts +12 -0
  296. package/src/core/provisioner-tokens.test.ts +20 -0
  297. package/src/core/provisioner-tokens.ts +33 -0
  298. package/src/core/rate-limit.test.ts +11 -27
  299. package/src/core/rate-limit.ts +3 -11
  300. package/src/core/runner-activation.ts +72 -0
  301. package/src/core/runner-control-sessions.ts +190 -0
  302. package/src/core/{provisioned-runners.test.ts → runner-instances.test.ts} +24 -24
  303. package/src/core/runner-instances.ts +310 -0
  304. package/src/core/runner-sessions.test.ts +112 -22
  305. package/src/core/runner-sessions.ts +25 -14
  306. package/src/db/capacity-assignments.test.ts +159 -0
  307. package/src/db/capacity-assignments.ts +116 -0
  308. package/src/db/db.ts +11 -2
  309. package/src/db/ephemeral-registration-tokens.test.ts +9 -9
  310. package/src/db/ephemeral-registration-tokens.ts +26 -26
  311. package/src/db/index.ts +31 -21
  312. package/src/db/job-executions.test.ts +13 -11
  313. package/src/db/job-executions.ts +33 -27
  314. package/src/db/provisioner-capability-snapshots.test.ts +175 -0
  315. package/src/db/provisioner-capability-snapshots.ts +130 -0
  316. package/src/db/provisioner-tokens.test.ts +139 -2
  317. package/src/db/provisioner-tokens.ts +123 -15
  318. package/src/db/reservations.test.ts +49 -0
  319. package/src/db/reservations.ts +146 -1
  320. package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +429 -353
  321. package/src/db/runner-instances.ts +942 -0
  322. package/src/db/runner-sessions.test.ts +19 -6
  323. package/src/db/runner-sessions.ts +78 -2
  324. package/src/db/schema/capacity-assignments.ts +34 -0
  325. package/src/db/schema/ephemeral-registration-tokens.ts +4 -4
  326. package/src/db/schema/provisioner-capability-snapshots.ts +46 -0
  327. package/src/db/schema/provisioner-tokens.ts +33 -2
  328. package/src/db/schema/runner-activation-tokens.ts +22 -0
  329. package/src/db/schema/runner-control-sessions.ts +46 -0
  330. package/src/db/schema/{provisioned-runners.ts → runner-instances.ts} +26 -27
  331. package/src/db/schema/runner-sessions.ts +11 -7
  332. package/src/db/schema/running-job-executions.ts +5 -5
  333. package/src/index.test.ts +26 -0
  334. package/src/index.ts +39 -19
  335. package/src/installation-provisioning.ts +14 -0
  336. package/src/metrics/index.ts +5 -5
  337. package/src/metrics/instance.ts +25 -14
  338. package/src/presentation/auth/index.ts +4 -0
  339. package/src/presentation/auth/provisioner-token-auth.ts +8 -4
  340. package/src/presentation/auth/runner-control-session-auth.ts +31 -0
  341. package/src/presentation/auth/runner-registration-token-auth.ts +39 -3
  342. package/src/presentation/dto/index.ts +5 -5
  343. package/src/presentation/dto/mint-registration-tokens.ts +8 -15
  344. package/src/presentation/dto/poll-demand.ts +3 -1
  345. package/src/presentation/dto/provisioner-token.ts +5 -0
  346. package/src/presentation/dto/{provisioned-runners.ts → runner-instances.ts} +13 -15
  347. package/src/presentation/index.ts +2 -1
  348. package/src/presentation/inter-module.test.ts +15 -0
  349. package/src/presentation/inter-module.ts +53 -0
  350. package/src/presentation/routes/assign-capacity.ts +48 -0
  351. package/src/presentation/routes/get-provisioner-me.ts +3 -4
  352. package/src/presentation/routes/heartbeat.test.ts +4 -3
  353. package/src/presentation/routes/heartbeat.ts +67 -64
  354. package/src/presentation/routes/index.ts +93 -43
  355. package/src/presentation/routes/list-active-runners.test.ts +23 -23
  356. package/src/presentation/routes/manual-registration-tokens.test.ts +4 -3
  357. package/src/presentation/routes/mint-registration-tokens.test.ts +12 -12
  358. package/src/presentation/routes/mint-registration-tokens.ts +5 -7
  359. package/src/presentation/routes/planned-capacity.ts +49 -0
  360. package/src/presentation/routes/poll-demand-release.test.ts +4 -4
  361. package/src/presentation/routes/poll-demand.test.ts +161 -22
  362. package/src/presentation/routes/poll-demand.ts +105 -45
  363. package/src/presentation/routes/provisioner-me.test.ts +37 -3
  364. package/src/presentation/routes/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +66 -61
  365. package/src/presentation/routes/reconcile-runner-instances.ts +30 -0
  366. package/src/presentation/routes/register.test.ts +9 -5
  367. package/src/presentation/routes/register.ts +61 -57
  368. package/src/presentation/routes/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +28 -28
  369. package/src/presentation/routes/{report-provisioned-runners.ts → report-runner-instances.ts} +14 -14
  370. package/src/presentation/routes/request-job.test.ts +5 -3
  371. package/src/presentation/routes/request-job.ts +41 -37
  372. package/src/presentation/routes/runner-enrollment.test.ts +259 -0
  373. package/src/presentation/routes/runner-enrollment.ts +174 -0
  374. package/src/temporal/activities/index.ts +2 -2
  375. package/src/temporal/activities/maintenance-activities.test.ts +7 -7
  376. package/src/temporal/activities/maintenance-activities.ts +3 -3
  377. package/src/temporal/workflows/stuck-job-detector.test.ts +3 -3
  378. package/src/temporal/workflows/stuck-job-detector.ts +2 -2
  379. package/test/env.ts +1 -3
  380. package/test/factories/ephemeral-registration-token.ts +2 -2
  381. package/test/factories/provisioner-token.ts +3 -1
  382. package/test/factories/runner-instance.ts +57 -0
  383. package/test/factories/runner-session.ts +3 -1
  384. package/test/fixtures/auth-inter-module.ts +30 -0
  385. package/test/globalSetup.ts +5 -1
  386. package/test/index.ts +2 -1
  387. package/tsconfig.build.tsbuildinfo +1 -1
  388. package/dist/core/entities/provisioned-runner.d.ts.map +0 -1
  389. package/dist/core/entities/provisioned-runner.js +0 -3
  390. package/dist/core/entities/provisioned-runner.js.map +0 -1
  391. package/dist/core/provisioned-runners.d.ts +0 -67
  392. package/dist/core/provisioned-runners.d.ts.map +0 -1
  393. package/dist/core/provisioned-runners.js +0 -162
  394. package/dist/core/provisioned-runners.js.map +0 -1
  395. package/dist/db/provisioned-runners.d.ts +0 -79
  396. package/dist/db/provisioned-runners.d.ts.map +0 -1
  397. package/dist/db/provisioned-runners.js +0 -466
  398. package/dist/db/provisioned-runners.js.map +0 -1
  399. package/dist/db/schema/provisioned-runners.d.ts.map +0 -1
  400. package/dist/db/schema/provisioned-runners.js.map +0 -1
  401. package/dist/presentation/dto/provisioned-runners.d.ts.map +0 -1
  402. package/dist/presentation/dto/provisioned-runners.js.map +0 -1
  403. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +0 -2
  404. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +0 -1
  405. package/dist/presentation/routes/reconcile-provisioned-runners.js +0 -27
  406. package/dist/presentation/routes/reconcile-provisioned-runners.js.map +0 -1
  407. package/dist/presentation/routes/report-provisioned-runners.d.ts +0 -2
  408. package/dist/presentation/routes/report-provisioned-runners.d.ts.map +0 -1
  409. package/dist/presentation/routes/report-provisioned-runners.js +0 -37
  410. package/dist/presentation/routes/report-provisioned-runners.js.map +0 -1
  411. package/src/core/provisioned-runners.ts +0 -301
  412. package/src/db/provisioned-runners.ts +0 -886
  413. package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
  414. package/test/factories/provisioned-runner.ts +0 -78
@@ -17,17 +17,22 @@ import {vi} from '@shipfox/vitest/vi';
17
17
  import {and, desc, eq} from 'drizzle-orm';
18
18
  import type {FastifyInstance, FastifyRequest} from 'fastify';
19
19
  import {db} from '#db/db.js';
20
- import {provisionedRunners} from '#db/schema/provisioned-runners.js';
21
20
  import {reservations} from '#db/schema/reservations.js';
21
+ import {providerRunners} from '#db/schema/runner-instances.js';
22
22
  import {runningJobExecutions} from '#db/schema/running-job-executions.js';
23
23
  import {
24
- provisionedRunnerAbsentTerminatedCount,
25
- provisionedRunnerReconcileCallCount,
26
- provisionedRunnerTerminateIntentIssuedCount,
24
+ providerRunnerAbsentTerminatedCount,
25
+ providerRunnerReconcileCallCount,
26
+ providerRunnerTerminateIntentIssuedCount,
27
27
  reservationReleasedCount,
28
28
  } from '#metrics/instance.js';
29
- import {provisionedRunnerFactory, reservationFactory, runnerSessionFactory} from '#test/index.js';
30
- import {runnerRoutes} from './index.js';
29
+ import {
30
+ providerRunnerFactory,
31
+ reservationFactory,
32
+ runnerSessionFactory,
33
+ runnersTestAuthClient,
34
+ } from '#test/index.js';
35
+ import {createRunnerRoutes} from './index.js';
31
36
 
32
37
  const VALID_PROVISIONER_TOKEN = 'valid-provisioner-token';
33
38
 
@@ -36,7 +41,7 @@ const passthroughAuth = (name: string): AuthMethod => ({
36
41
  authenticate: () => Promise.resolve(),
37
42
  });
38
43
 
39
- describe('POST /provisioners/provisioned-runners/reconcile', () => {
44
+ describe('POST /provisioners/runner-instances/reconcile', () => {
40
45
  let app: FastifyInstance;
41
46
  let workspaceId: string;
42
47
  let provisionerTokenId: string;
@@ -48,7 +53,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
48
53
  if (rawToken !== VALID_PROVISIONER_TOKEN) {
49
54
  throw new ClientError('Invalid provisioner token', 'unauthorized', {status: 401});
50
55
  }
51
- setProvisionerContext(request, {workspaceId, provisionerTokenId});
56
+ setProvisionerContext(request, {scope: 'workspace', workspaceId, provisionerTokenId});
52
57
  return Promise.resolve();
53
58
  },
54
59
  };
@@ -62,7 +67,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
62
67
  passthroughAuth(AUTH_LEASED_JOB),
63
68
  fakeProvisionerAuth,
64
69
  ],
65
- routes: runnerRoutes,
70
+ routes: createRunnerRoutes(runnersTestAuthClient),
66
71
  swagger: false,
67
72
  });
68
73
  await app.ready();
@@ -81,27 +86,27 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
81
86
  const jobId = crypto.randomUUID();
82
87
  const workflowRunId = crypto.randomUUID();
83
88
  const workflowRunAttemptId = crypto.randomUUID();
84
- await createProvisionedRunner({provisionedRunnerId: 'provisioned-runner-1'});
89
+ await createRunnerInstance({providerRunnerId: 'provisioned-runner-1'});
85
90
  await insertRunningJob({
86
91
  jobId,
87
92
  workflowRunId,
88
93
  workflowRunAttemptId,
89
- provisionedRunnerId: 'provisioned-runner-1',
94
+ providerRunnerId: 'provisioned-runner-1',
90
95
  lastHeartbeatAt: new Date('2025-01-01T00:00:00.000Z'),
91
96
  });
92
97
 
93
98
  const res = await app.inject({
94
99
  method: 'POST',
95
- url: '/provisioners/provisioned-runners/reconcile',
100
+ url: '/provisioners/runner-instances/reconcile',
96
101
  headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
97
- payload: {observed_provisioned_runner_ids: ['provisioned-runner-1']},
102
+ payload: {observed_provider_runner_ids: ['provisioned-runner-1']},
98
103
  });
99
104
 
100
105
  expect(res.statusCode).toBe(200);
101
106
  expect(res.json()).toEqual({
102
107
  runners: [
103
108
  {
104
- provisioned_runner_id: 'provisioned-runner-1',
109
+ provider_runner_id: 'provisioned-runner-1',
105
110
  state: 'running',
106
111
  reservation_id: null,
107
112
  runner_session_id: null,
@@ -114,26 +119,26 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
114
119
  desired_intent: 'keep',
115
120
  },
116
121
  ],
117
- terminated_absent_provisioned_runner_ids: [],
122
+ terminated_absent_provider_runner_ids: [],
118
123
  });
119
124
  });
120
125
 
121
126
  it('returns terminate for an observed terminal runner', async () => {
122
- await createProvisionedRunner({
123
- provisionedRunnerId: 'provisioned-runner-1',
127
+ await createRunnerInstance({
128
+ providerRunnerId: 'provisioned-runner-1',
124
129
  state: 'stopped',
125
130
  });
126
131
 
127
132
  const res = await app.inject({
128
133
  method: 'POST',
129
- url: '/provisioners/provisioned-runners/reconcile',
134
+ url: '/provisioners/runner-instances/reconcile',
130
135
  headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
131
- payload: {observed_provisioned_runner_ids: ['provisioned-runner-1']},
136
+ payload: {observed_provider_runner_ids: ['provisioned-runner-1']},
132
137
  });
133
138
 
134
139
  expect(res.statusCode).toBe(200);
135
140
  expect(res.json().runners[0]).toMatchObject({
136
- provisioned_runner_id: 'provisioned-runner-1',
141
+ provider_runner_id: 'provisioned-runner-1',
137
142
  state: 'stopped',
138
143
  desired_intent: 'terminate',
139
144
  });
@@ -142,27 +147,27 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
142
147
  it('returns keep for orphan observed ids without leaking ownership details', async () => {
143
148
  const res = await app.inject({
144
149
  method: 'POST',
145
- url: '/provisioners/provisioned-runners/reconcile',
150
+ url: '/provisioners/runner-instances/reconcile',
146
151
  headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
147
- payload: {observed_provisioned_runner_ids: ['orphan-runner']},
152
+ payload: {observed_provider_runner_ids: ['orphan-runner']},
148
153
  });
149
154
 
150
155
  expect(res.statusCode).toBe(200);
151
156
  expect(res.json().runners[0]).toMatchObject({
152
- provisioned_runner_id: 'orphan-runner',
157
+ provider_runner_id: 'orphan-runner',
153
158
  state: null,
154
159
  desired_intent: 'keep',
155
160
  });
156
161
  });
157
162
 
158
163
  it('returns terminate for an active runner with a cancelled bound job', async () => {
159
- const intentSpy = vi.spyOn(provisionedRunnerTerminateIntentIssuedCount, 'add');
160
- await createProvisionedRunner({provisionedRunnerId: 'provisioned-runner-1'});
164
+ const intentSpy = vi.spyOn(providerRunnerTerminateIntentIssuedCount, 'add');
165
+ await createRunnerInstance({providerRunnerId: 'provisioned-runner-1'});
161
166
  await insertRunningJob({
162
167
  jobId: crypto.randomUUID(),
163
168
  workflowRunId: crypto.randomUUID(),
164
169
  workflowRunAttemptId: crypto.randomUUID(),
165
- provisionedRunnerId: 'provisioned-runner-1',
170
+ providerRunnerId: 'provisioned-runner-1',
166
171
  lastHeartbeatAt: new Date('2025-01-01T00:00:00.000Z'),
167
172
  cancellationRequestedAt: new Date('2025-01-01T00:01:00.000Z'),
168
173
  });
@@ -170,9 +175,9 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
170
175
 
171
176
  const res = await app.inject({
172
177
  method: 'POST',
173
- url: '/provisioners/provisioned-runners/reconcile',
178
+ url: '/provisioners/runner-instances/reconcile',
174
179
  headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
175
- payload: {observed_provisioned_runner_ids: ['provisioned-runner-1']},
180
+ payload: {observed_provider_runner_ids: ['provisioned-runner-1']},
176
181
  });
177
182
 
178
183
  expect(res.statusCode).toBe(200);
@@ -194,10 +199,10 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
194
199
  });
195
200
 
196
201
  it('returns an empty result for an empty observed set without reaping absent runners', async () => {
197
- const reconcileSpy = vi.spyOn(provisionedRunnerReconcileCallCount, 'add');
202
+ const reconcileSpy = vi.spyOn(providerRunnerReconcileCallCount, 'add');
198
203
  const reservationId = await createReservation(2);
199
- await createProvisionedRunner({
200
- provisionedRunnerId: 'provisioned-runner-1',
204
+ await createRunnerInstance({
205
+ providerRunnerId: 'provisioned-runner-1',
201
206
  reservationId,
202
207
  reportedAt: new Date(Date.now() - 300_000),
203
208
  });
@@ -205,19 +210,19 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
205
210
 
206
211
  const res = await app.inject({
207
212
  method: 'POST',
208
- url: '/provisioners/provisioned-runners/reconcile',
213
+ url: '/provisioners/runner-instances/reconcile',
209
214
  headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
210
- payload: {observed_provisioned_runner_ids: []},
215
+ payload: {observed_provider_runner_ids: []},
211
216
  });
212
217
 
213
- const [provisionedRunner] = await db()
218
+ const [providerRunner] = await db()
214
219
  .select()
215
- .from(provisionedRunners)
220
+ .from(providerRunners)
216
221
  .where(
217
222
  and(
218
- eq(provisionedRunners.workspaceId, workspaceId),
219
- eq(provisionedRunners.provisionerId, provisionerTokenId),
220
- eq(provisionedRunners.provisionedRunnerId, 'provisioned-runner-1'),
223
+ eq(providerRunners.workspaceId, workspaceId),
224
+ eq(providerRunners.provisionerId, provisionerTokenId),
225
+ eq(providerRunners.providerRunnerId, 'provisioned-runner-1'),
221
226
  ),
222
227
  );
223
228
  const [reservation] = await db()
@@ -228,9 +233,9 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
228
233
  expect(res.statusCode).toBe(200);
229
234
  expect(res.json()).toEqual({
230
235
  runners: [],
231
- terminated_absent_provisioned_runner_ids: [],
236
+ terminated_absent_provider_runner_ids: [],
232
237
  });
233
- expect(provisionedRunner?.state).toBe('running');
238
+ expect(providerRunner?.state).toBe('running');
234
239
  expect(reservation?.count).toBe(2);
235
240
  expect(
236
241
  reconcileSpy.mock.calls
@@ -240,22 +245,22 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
240
245
  });
241
246
 
242
247
  it('increments the reservation release metric when reconcile reaps an absent runner', async () => {
243
- const reconcileSpy = vi.spyOn(provisionedRunnerReconcileCallCount, 'add');
244
- const absentSpy = vi.spyOn(provisionedRunnerAbsentTerminatedCount, 'add');
248
+ const reconcileSpy = vi.spyOn(providerRunnerReconcileCallCount, 'add');
249
+ const absentSpy = vi.spyOn(providerRunnerAbsentTerminatedCount, 'add');
245
250
  const addSpy = vi.spyOn(reservationReleasedCount, 'add');
246
251
  const reservationId = await createReservation(3);
247
- await createProvisionedRunner({
248
- provisionedRunnerId: 'provisioned-runner-1',
252
+ await createRunnerInstance({
253
+ providerRunnerId: 'provisioned-runner-1',
249
254
  reservationId,
250
255
  reportedAt: new Date(Date.now() - 300_000),
251
256
  });
252
- await createProvisionedRunner({
253
- provisionedRunnerId: 'provisioned-runner-2',
257
+ await createRunnerInstance({
258
+ providerRunnerId: 'provisioned-runner-2',
254
259
  reservationId,
255
260
  reportedAt: new Date(Date.now() - 300_000),
256
261
  });
257
- await createProvisionedRunner({
258
- provisionedRunnerId: 'provisioned-runner-3',
262
+ await createRunnerInstance({
263
+ providerRunnerId: 'provisioned-runner-3',
259
264
  reportedAt: new Date(Date.now() - 300_000),
260
265
  });
261
266
  const reconcileCallsBefore = reconcileSpy.mock.calls.length;
@@ -264,13 +269,13 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
264
269
 
265
270
  const res = await app.inject({
266
271
  method: 'POST',
267
- url: '/provisioners/provisioned-runners/reconcile',
272
+ url: '/provisioners/runner-instances/reconcile',
268
273
  headers: {authorization: `Bearer ${VALID_PROVISIONER_TOKEN}`},
269
- payload: {observed_provisioned_runner_ids: ['observed-runner']},
274
+ payload: {observed_provider_runner_ids: ['observed-runner']},
270
275
  });
271
276
 
272
277
  expect(res.statusCode).toBe(200);
273
- expect(res.json().terminated_absent_provisioned_runner_ids).toEqual([
278
+ expect(res.json().terminated_absent_provider_runner_ids).toEqual([
274
279
  'provisioned-runner-1',
275
280
  'provisioned-runner-2',
276
281
  'provisioned-runner-3',
@@ -295,14 +300,14 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
295
300
  it('returns 401 without valid provisioner auth', async () => {
296
301
  const missing = await app.inject({
297
302
  method: 'POST',
298
- url: '/provisioners/provisioned-runners/reconcile',
299
- payload: {observed_provisioned_runner_ids: []},
303
+ url: '/provisioners/runner-instances/reconcile',
304
+ payload: {observed_provider_runner_ids: []},
300
305
  });
301
306
  const invalid = await app.inject({
302
307
  method: 'POST',
303
- url: '/provisioners/provisioned-runners/reconcile',
308
+ url: '/provisioners/runner-instances/reconcile',
304
309
  headers: {authorization: 'Bearer invalid'},
305
- payload: {observed_provisioned_runner_ids: []},
310
+ payload: {observed_provider_runner_ids: []},
306
311
  });
307
312
 
308
313
  expect(missing.statusCode).toBe(401);
@@ -332,16 +337,16 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
332
337
  return reservation.id;
333
338
  }
334
339
 
335
- async function createProvisionedRunner(params: {
336
- provisionedRunnerId: string;
340
+ async function createRunnerInstance(params: {
341
+ providerRunnerId: string;
337
342
  state?: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'terminated';
338
343
  reservationId?: string | null;
339
344
  reportedAt?: Date;
340
345
  }) {
341
- return await provisionedRunnerFactory.create({
346
+ return await providerRunnerFactory.create({
342
347
  workspaceId,
343
348
  provisionerId: provisionerTokenId,
344
- provisionedRunnerId: params.provisionedRunnerId,
349
+ providerRunnerId: params.providerRunnerId,
345
350
  reservationId: params.reservationId ?? null,
346
351
  state: params.state ?? 'running',
347
352
  reportedAt: params.reportedAt ?? new Date(),
@@ -352,7 +357,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
352
357
  jobId: string;
353
358
  workflowRunId: string;
354
359
  workflowRunAttemptId: string;
355
- provisionedRunnerId: string;
360
+ providerRunnerId: string;
356
361
  lastHeartbeatAt: Date;
357
362
  cancellationRequestedAt?: Date | null;
358
363
  }) {
@@ -369,7 +374,7 @@ describe('POST /provisioners/provisioned-runners/reconcile', () => {
369
374
  projectId: crypto.randomUUID(),
370
375
  runnerSessionId: runnerSession.id,
371
376
  provisionerId: provisionerTokenId,
372
- provisionedRunnerId: params.provisionedRunnerId,
377
+ providerRunnerId: params.providerRunnerId,
373
378
  requiredLabels: ['linux'],
374
379
  runnerLabels: ['linux'],
375
380
  startedAt: params.lastHeartbeatAt,
@@ -0,0 +1,30 @@
1
+ import {requireProvisionerContext} from '@shipfox/api-auth-context';
2
+ import {
3
+ reconcileRunnerInstancesBodySchema,
4
+ reconcileRunnerInstancesResponseSchema,
5
+ } from '@shipfox/api-runners-dto';
6
+ import {defineRoute} from '@shipfox/node-fastify';
7
+ import {reconcileRunnerInstances} from '#core/index.js';
8
+ import {toReconcileRunnerInstancesResponseDto} from '#presentation/dto/index.js';
9
+
10
+ export const reconcileRunnerInstancesRoute = defineRoute({
11
+ method: 'POST',
12
+ path: '/runner-instances/reconcile',
13
+ description: 'Reconcile provisioned runner state for a provisioner',
14
+ schema: {
15
+ body: reconcileRunnerInstancesBodySchema,
16
+ response: {
17
+ 200: reconcileRunnerInstancesResponseSchema,
18
+ },
19
+ },
20
+ handler: async (request) => {
21
+ const context = requireProvisionerContext(request);
22
+ const result = await reconcileRunnerInstances({
23
+ workspaceId: context.scope === 'workspace' ? context.workspaceId : null,
24
+ provisionerId: context.provisionerTokenId,
25
+ observedRunnerInstanceIds: request.body.observed_provider_runner_ids,
26
+ });
27
+
28
+ return toReconcileRunnerInstancesResponseDto(result);
29
+ },
30
+ });
@@ -18,8 +18,12 @@ import {ephemeralRegistrationTokens} from '#db/schema/ephemeral-registration-tok
18
18
  import {runnersRateLimits} from '#db/schema/rate-limits.js';
19
19
  import {runnerSessions} from '#db/schema/runner-sessions.js';
20
20
  import {createRunnerRegistrationTokenAuthMethod} from '#presentation/auth/index.js';
21
- import {ephemeralRegistrationTokenFactory, manualRegistrationTokenFactory} from '#test/index.js';
22
- import {runnerRoutes} from './index.js';
21
+ import {
22
+ ephemeralRegistrationTokenFactory,
23
+ manualRegistrationTokenFactory,
24
+ runnersTestAuthClient,
25
+ } from '#test/index.js';
26
+ import {createRunnerRoutes} from './index.js';
23
27
 
24
28
  const fakeUserAuth: AuthMethod = {
25
29
  name: AUTH_USER,
@@ -52,7 +56,7 @@ describe('POST /runners/register', () => {
52
56
  createLeaseTokenAuthMethod(),
53
57
  fakeProvisionerAuth,
54
58
  ],
55
- routes: runnerRoutes,
59
+ routes: createRunnerRoutes(runnersTestAuthClient),
56
60
  swagger: false,
57
61
  });
58
62
  await app.ready();
@@ -99,7 +103,7 @@ describe('POST /runners/register', () => {
99
103
  expect(rows[0]?.labels).toEqual(['linux', 'x64']);
100
104
  expect(rows[0]?.registrationTokenKind).toBe('manual');
101
105
  expect(rows[0]?.provisionerId).toBeNull();
102
- expect(rows[0]?.provisionedRunnerId).toBeNull();
106
+ expect(rows[0]?.providerRunnerId).toBeNull();
103
107
  expect(rows[0]?.toolCapabilities).toBeNull();
104
108
  expect(rows[0]?.toolCapabilitiesReportedAt).toBeNull();
105
109
  });
@@ -149,7 +153,7 @@ describe('POST /runners/register', () => {
149
153
  .where(eq(runnerSessions.id, body.session_id));
150
154
  expect(session?.registrationTokenKind).toBe('ephemeral');
151
155
  expect(session?.provisionerId).toBe(token.provisionerId);
152
- expect(session?.provisionedRunnerId).toBe(token.provisionedRunnerId);
156
+ expect(session?.providerRunnerId).toBe(token.providerRunnerId);
153
157
  expect(session?.maxClaims).toBe(1);
154
158
  expect(session?.claimsUsed).toBe(0);
155
159
  expect(session?.toolCapabilities).toEqual({harnesses: {pi: {tools: ['read']}}});
@@ -1,3 +1,4 @@
1
+ import type {AuthInterModuleClient} from '@shipfox/api-auth-dto/inter-module';
1
2
  import {registerRunnerBodySchema, registerRunnerResponseSchema} from '@shipfox/api-runners-dto';
2
3
  import {ClientError, defineRoute} from '@shipfox/node-fastify';
3
4
  import {
@@ -9,67 +10,70 @@ import {registerRunnerSession} from '#core/runner-sessions.js';
9
10
  import {getRunnerContext} from '#presentation/auth/index.js';
10
11
  import {createEphemeralRegisterRateLimitPreHandler} from './rate-limit.js';
11
12
 
12
- export const registerRoute = defineRoute({
13
- method: 'POST',
14
- path: '/register',
15
- description: 'Exchange a runner registration token for a runner session token',
16
- schema: {
17
- body: registerRunnerBodySchema,
18
- response: {
19
- 200: registerRunnerResponseSchema,
13
+ export function createRegisterRoute(auth: AuthInterModuleClient) {
14
+ return defineRoute({
15
+ method: 'POST',
16
+ path: '/register',
17
+ description: 'Exchange a runner registration token for a runner session token',
18
+ schema: {
19
+ body: registerRunnerBodySchema,
20
+ response: {
21
+ 200: registerRunnerResponseSchema,
22
+ },
20
23
  },
21
- },
22
- preHandler: createEphemeralRegisterRateLimitPreHandler(),
23
- errorHandler: (error, request) => {
24
- if (error instanceof EmptyRunnerLabelsError) {
25
- throw new ClientError(error.message, 'empty-runner-labels', {status: 400});
26
- }
27
- if (error instanceof RegistrationTokenConsumedError) {
28
- const runner = getRunnerContext(request);
29
- if (runner.kind === 'ephemeral') {
30
- request.log.warn(
24
+ preHandler: createEphemeralRegisterRateLimitPreHandler(),
25
+ errorHandler: (error, request) => {
26
+ if (error instanceof EmptyRunnerLabelsError) {
27
+ throw new ClientError(error.message, 'empty-runner-labels', {status: 400});
28
+ }
29
+ if (error instanceof RegistrationTokenConsumedError) {
30
+ const runner = getRunnerContext(request);
31
+ if (runner.kind === 'ephemeral') {
32
+ request.log.warn(
33
+ {
34
+ ephemeralTokenId: error.ephemeralTokenId,
35
+ provisionerId: runner.provisionerId,
36
+ },
37
+ 'Ephemeral registration token reuse rejected',
38
+ );
39
+ }
40
+ throw new ClientError(
41
+ 'Registration token has already been consumed',
42
+ 'registration-token-consumed',
31
43
  {
32
- ephemeralTokenId: error.ephemeralTokenId,
33
- provisionerId: runner.provisionerId,
44
+ status: 409,
34
45
  },
35
- 'Ephemeral registration token reuse rejected',
36
46
  );
37
47
  }
38
- throw new ClientError(
39
- 'Registration token has already been consumed',
40
- 'registration-token-consumed',
41
- {
42
- status: 409,
43
- },
44
- );
45
- }
46
- if (error instanceof RegistrationTokenExpiredError) {
47
- throw new ClientError('Registration token has expired', 'registration-token-expired', {
48
- status: 401,
48
+ if (error instanceof RegistrationTokenExpiredError) {
49
+ throw new ClientError('Registration token has expired', 'registration-token-expired', {
50
+ status: 401,
51
+ });
52
+ }
53
+ throw error;
54
+ },
55
+ handler: async (request) => {
56
+ const runner = getRunnerContext(request);
57
+ const result = await registerRunnerSession({
58
+ auth,
59
+ credential:
60
+ runner.kind === 'manual'
61
+ ? {
62
+ kind: 'manual',
63
+ registrationTokenId: runner.registrationTokenId,
64
+ workspaceId: runner.workspaceId,
65
+ }
66
+ : runner,
67
+ labels: request.body.labels,
68
+ toolCapabilities: request.body.capabilities ?? null,
49
69
  });
50
- }
51
- throw error;
52
- },
53
- handler: async (request) => {
54
- const runner = getRunnerContext(request);
55
- const result = await registerRunnerSession({
56
- credential:
57
- runner.kind === 'manual'
58
- ? {
59
- kind: 'manual',
60
- registrationTokenId: runner.registrationTokenId,
61
- workspaceId: runner.workspaceId,
62
- }
63
- : runner,
64
- labels: request.body.labels,
65
- toolCapabilities: request.body.capabilities ?? null,
66
- });
67
70
 
68
- return {
69
- session_token: result.sessionToken,
70
- session_id: result.session.id,
71
- mode: result.mode,
72
- max_claims: result.maxClaims,
73
- };
74
- },
75
- });
71
+ return {
72
+ session_token: result.sessionToken,
73
+ session_id: result.session.id,
74
+ mode: result.mode,
75
+ max_claims: result.maxClaims,
76
+ };
77
+ },
78
+ });
79
+ }