@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
@@ -1,5 +1,4 @@
1
- import {createHmac} from 'node:crypto';
2
- import {config as authConfig} from '@shipfox/api-auth/config';
1
+ import {rateLimitIdentifierKey} from '@shipfox/node-auth-root-key';
3
2
  import {
4
3
  checkRateLimit,
5
4
  hashRateLimitIdentifier,
@@ -56,7 +55,6 @@ export class RunnersRateLimitUnavailableError extends RateLimitUnavailableError<
56
55
  }
57
56
 
58
57
  const IDENTIFIER_HASH_DOMAIN = 'shipfox.runners.rate-limit.identifier.v1';
59
- const IDENTIFIER_SECRET_DERIVATION_DOMAIN = 'shipfox.runners.rate-limit.identifier-secret.v1';
60
58
 
61
59
  export function hashRunnersRateLimitIdentifier(params: {
62
60
  action: RunnersRateLimitAction;
@@ -110,12 +108,6 @@ export async function checkRunnersRateLimit(params: CheckRunnersRateLimitParams)
110
108
  }
111
109
  }
112
110
 
113
- function effectiveIdentifierSecret(): Buffer | string {
114
- if (config.RATE_LIMIT_IDENTIFIER_SECRET) {
115
- return config.RATE_LIMIT_IDENTIFIER_SECRET;
116
- }
117
-
118
- return createHmac('sha256', authConfig.AUTH_JWT_SECRET)
119
- .update(IDENTIFIER_SECRET_DERIVATION_DOMAIN)
120
- .digest();
111
+ function effectiveIdentifierSecret(): Uint8Array {
112
+ return rateLimitIdentifierKey();
121
113
  }
@@ -0,0 +1,72 @@
1
+ import {extractDisplayPrefix, generateOpaqueToken, hashOpaqueToken} from '@shipfox/node-tokens';
2
+ import {and, eq, isNull, sql} from 'drizzle-orm';
3
+ import {db} from '#db/db.js';
4
+ import {runnerActivationTokens} from '#db/schema/runner-activation-tokens.js';
5
+ import {providerRunners} from '#db/schema/runner-instances.js';
6
+
7
+ export async function issueRunnerActivationToken(params: {
8
+ runnerInstanceId: string;
9
+ provisionerId: string;
10
+ ttlSeconds: number;
11
+ }): Promise<string | null> {
12
+ return await db().transaction(async (tx) => {
13
+ await tx.execute(
14
+ sql`select pg_advisory_xact_lock(hashtext(${`runners_activation:${params.runnerInstanceId}`}))`,
15
+ );
16
+ const [runner] = await tx
17
+ .select({
18
+ workspaceId: providerRunners.workspaceId,
19
+ runnerSessionId: providerRunners.runnerSessionId,
20
+ state: providerRunners.state,
21
+ })
22
+ .from(providerRunners)
23
+ .where(
24
+ and(
25
+ eq(providerRunners.id, params.runnerInstanceId),
26
+ eq(providerRunners.provisionerId, params.provisionerId),
27
+ ),
28
+ )
29
+ .limit(1)
30
+ .for('update');
31
+ if (!runner?.workspaceId || runner.runnerSessionId || runner.state !== 'running') return null;
32
+
33
+ await tx
34
+ .update(runnerActivationTokens)
35
+ .set({revokedAt: sql`now()`})
36
+ .where(
37
+ and(
38
+ eq(runnerActivationTokens.runnerInstanceId, params.runnerInstanceId),
39
+ isNull(runnerActivationTokens.consumedAt),
40
+ isNull(runnerActivationTokens.revokedAt),
41
+ ),
42
+ );
43
+ const rawToken = generateOpaqueToken('runnerActivationToken');
44
+ await tx.insert(runnerActivationTokens).values({
45
+ runnerInstanceId: params.runnerInstanceId,
46
+ hashedToken: hashOpaqueToken(rawToken),
47
+ prefix: extractDisplayPrefix(rawToken),
48
+ expiresAt: new Date(Date.now() + params.ttlSeconds * 1000),
49
+ });
50
+ return rawToken;
51
+ });
52
+ }
53
+
54
+ export async function getRunnerAssignment(params: {
55
+ runnerInstanceId: string;
56
+ provisionerId: string;
57
+ }) {
58
+ const [runner] = await db()
59
+ .select({
60
+ workspaceId: providerRunners.workspaceId,
61
+ runnerSessionId: providerRunners.runnerSessionId,
62
+ })
63
+ .from(providerRunners)
64
+ .where(
65
+ and(
66
+ eq(providerRunners.id, params.runnerInstanceId),
67
+ eq(providerRunners.provisionerId, params.provisionerId),
68
+ ),
69
+ )
70
+ .limit(1);
71
+ return runner?.workspaceId && !runner.runnerSessionId ? runner : null;
72
+ }
@@ -0,0 +1,9 @@
1
+ import {assignRunnerInstances as assignRunnerInstancesDb} from '#db/runner-assignments.js';
2
+
3
+ export function assignRunnerInstances(params: {
4
+ provisionerId: string;
5
+ reservationId: string;
6
+ runnerInstanceIds: string[];
7
+ }): Promise<string[]> {
8
+ return assignRunnerInstancesDb(params);
9
+ }
@@ -0,0 +1,190 @@
1
+ import type {RunnerToolCapabilitiesDto} from '@shipfox/api-runners-dto';
2
+ import {extractDisplayPrefix, generateOpaqueToken, hashOpaqueToken} from '@shipfox/node-tokens';
3
+ import {canonicalizeLabels} from '@shipfox/runner-labels';
4
+ import {and, eq, gt, isNull, notInArray, or, sql} from 'drizzle-orm';
5
+ import {db} from '#db/db.js';
6
+ import {terminalStates} from '#db/runner-instances.js';
7
+ import {provisionerTokens} from '#db/schema/provisioner-tokens.js';
8
+ import {runnerBootstrapTokens, runnerControlSessions} from '#db/schema/runner-control-sessions.js';
9
+ import {providerRunners} from '#db/schema/runner-instances.js';
10
+
11
+ export class RunnerBootstrapTokenInvalidError extends Error {
12
+ constructor() {
13
+ super('Runner bootstrap token is invalid, expired, or has already been used');
14
+ this.name = 'RunnerBootstrapTokenInvalidError';
15
+ }
16
+ }
17
+
18
+ export class RunnerControlSessionInvalidError extends Error {
19
+ constructor() {
20
+ super('Runner control session is invalid, expired, or closed');
21
+ this.name = 'RunnerControlSessionInvalidError';
22
+ }
23
+ }
24
+
25
+ export async function createRunnerInstancesWithBootstrapTokens(params: {
26
+ provisionerId: string;
27
+ providerKind?: string | null;
28
+ runnerInstances: Array<{templateKey?: string | null}>;
29
+ ttlSeconds: number;
30
+ }): Promise<Array<{runnerInstanceId: string; bootstrapToken: string}>> {
31
+ const expiresAt = new Date(Date.now() + params.ttlSeconds * 1000);
32
+ return await db().transaction(async (tx) => {
33
+ const instances = await tx
34
+ .insert(providerRunners)
35
+ .values(
36
+ params.runnerInstances.map((runner) => ({
37
+ provisionerId: params.provisionerId,
38
+ providerKind: params.providerKind ?? null,
39
+ templateKey: runner.templateKey ?? null,
40
+ state: 'starting' as const,
41
+ labels: [],
42
+ reportedAt: new Date(),
43
+ })),
44
+ )
45
+ .returning({id: providerRunners.id});
46
+ const results = instances.map((instance) => ({
47
+ runnerInstanceId: instance.id,
48
+ bootstrapToken: generateOpaqueToken('runnerBootstrapToken'),
49
+ }));
50
+ await tx.insert(runnerBootstrapTokens).values(
51
+ results.map((result) => ({
52
+ runnerInstanceId: result.runnerInstanceId,
53
+ provisionerId: params.provisionerId,
54
+ hashedToken: hashOpaqueToken(result.bootstrapToken),
55
+ prefix: extractDisplayPrefix(result.bootstrapToken),
56
+ expiresAt,
57
+ })),
58
+ );
59
+ return results;
60
+ });
61
+ }
62
+
63
+ export async function exchangeRunnerBootstrapToken(params: {
64
+ rawToken: string;
65
+ ttlSeconds: number;
66
+ }): Promise<{runnerInstanceId: string; controlSessionToken: string; expiresAt: Date}> {
67
+ const controlSessionToken = generateOpaqueToken('runnerControlSession');
68
+ const expiresAt = new Date(Date.now() + params.ttlSeconds * 1000);
69
+ return await db().transaction(async (tx) => {
70
+ const [bootstrap] = await tx
71
+ .update(runnerBootstrapTokens)
72
+ .set({consumedAt: sql`now()`})
73
+ .where(
74
+ and(
75
+ eq(runnerBootstrapTokens.hashedToken, hashOpaqueToken(params.rawToken)),
76
+ isNull(runnerBootstrapTokens.consumedAt),
77
+ isNull(runnerBootstrapTokens.revokedAt),
78
+ gt(runnerBootstrapTokens.expiresAt, sql`now()`),
79
+ ),
80
+ )
81
+ .returning();
82
+ if (!bootstrap) throw new RunnerBootstrapTokenInvalidError();
83
+ const [session] = await tx
84
+ .insert(runnerControlSessions)
85
+ .values({
86
+ runnerInstanceId: bootstrap.runnerInstanceId,
87
+ provisionerId: bootstrap.provisionerId,
88
+ hashedToken: hashOpaqueToken(controlSessionToken),
89
+ prefix: extractDisplayPrefix(controlSessionToken),
90
+ expiresAt,
91
+ })
92
+ .returning({id: runnerControlSessions.id});
93
+ if (!session) throw new Error('Runner control session insert returned no row');
94
+ return {runnerInstanceId: bootstrap.runnerInstanceId, controlSessionToken, expiresAt};
95
+ });
96
+ }
97
+
98
+ export async function resolveRunnerControlSession(rawToken: string) {
99
+ const [session] = await db()
100
+ .select({
101
+ id: runnerControlSessions.id,
102
+ runnerInstanceId: runnerControlSessions.runnerInstanceId,
103
+ provisionerId: runnerControlSessions.provisionerId,
104
+ })
105
+ .from(runnerControlSessions)
106
+ .leftJoin(provisionerTokens, eq(provisionerTokens.id, runnerControlSessions.provisionerId))
107
+ .where(
108
+ and(
109
+ eq(runnerControlSessions.hashedToken, hashOpaqueToken(rawToken)),
110
+ isNull(runnerControlSessions.closedAt),
111
+ or(isNull(provisionerTokens.id), isNull(provisionerTokens.revokedAt)),
112
+ gt(runnerControlSessions.expiresAt, sql`now()`),
113
+ ),
114
+ )
115
+ .limit(1);
116
+ return session;
117
+ }
118
+
119
+ export async function enrollRunnerControlSession(params: {
120
+ runnerInstanceId: string;
121
+ provisionerId: string;
122
+ labels: string[];
123
+ capabilities?: RunnerToolCapabilitiesDto | null;
124
+ providerKind: string;
125
+ protocolVersion: string;
126
+ }): Promise<void> {
127
+ const updated = await db()
128
+ .update(providerRunners)
129
+ .set({
130
+ labels: [...canonicalizeLabels(params.labels)],
131
+ providerKind: params.providerKind,
132
+ protocolVersion: params.protocolVersion,
133
+ capabilities: params.capabilities ?? null,
134
+ state: 'running',
135
+ reportedAt: sql`now()`,
136
+ updatedAt: sql`now()`,
137
+ })
138
+ .where(
139
+ and(
140
+ eq(providerRunners.id, params.runnerInstanceId),
141
+ eq(providerRunners.provisionerId, params.provisionerId),
142
+ notInArray(providerRunners.state, [...terminalStates]),
143
+ ),
144
+ )
145
+ .returning({id: providerRunners.id});
146
+ if (!updated[0]) throw new RunnerControlSessionInvalidError();
147
+ await touchRunnerControlSession(params.runnerInstanceId, params.provisionerId);
148
+ }
149
+
150
+ export async function attachRunnerControlProviderId(params: {
151
+ runnerInstanceId: string;
152
+ provisionerId: string;
153
+ providerRunnerId: string;
154
+ }): Promise<boolean> {
155
+ const rows = await db()
156
+ .update(providerRunners)
157
+ .set({providerRunnerId: params.providerRunnerId, updatedAt: sql`now()`})
158
+ .where(
159
+ and(
160
+ eq(providerRunners.id, params.runnerInstanceId),
161
+ eq(providerRunners.provisionerId, params.provisionerId),
162
+ isNull(providerRunners.providerRunnerId),
163
+ notInArray(providerRunners.state, [...terminalStates]),
164
+ ),
165
+ )
166
+ .returning({id: providerRunners.id});
167
+ return rows.length === 1;
168
+ }
169
+
170
+ export async function touchRunnerControlSession(runnerInstanceId: string, provisionerId: string) {
171
+ await db()
172
+ .update(runnerControlSessions)
173
+ .set({lastSeenAt: sql`now()`})
174
+ .where(
175
+ and(
176
+ eq(runnerControlSessions.runnerInstanceId, runnerInstanceId),
177
+ eq(runnerControlSessions.provisionerId, provisionerId),
178
+ isNull(runnerControlSessions.closedAt),
179
+ ),
180
+ );
181
+ await db()
182
+ .update(providerRunners)
183
+ .set({reportedAt: sql`now()`, updatedAt: sql`now()`})
184
+ .where(
185
+ and(
186
+ eq(providerRunners.id, runnerInstanceId),
187
+ eq(providerRunners.provisionerId, provisionerId),
188
+ ),
189
+ );
190
+ }
@@ -1,51 +1,51 @@
1
- import {reconcileProvisionedRunnersFromDbResult} from './provisioned-runners.js';
1
+ import {reconcileRunnerInstancesFromDbResult} from './runner-instances.js';
2
2
 
3
- describe('reconcileProvisionedRunnersFromDbResult', () => {
3
+ describe('reconcileRunnerInstancesFromDbResult', () => {
4
4
  it('keeps active provisioned runners', () => {
5
- const result = reconcileProvisionedRunnersFromDbResult({
6
- observedProvisionedRunnerIds: ['provisioned-runner-1'],
7
- observedRows: [provisionedRunner({provisionedRunnerId: 'provisioned-runner-1'})],
8
- boundJobExecutionsByProvisionedRunnerId: new Map(),
5
+ const result = reconcileRunnerInstancesFromDbResult({
6
+ observedRunnerInstanceIds: ['provisioned-runner-1'],
7
+ observedRows: [providerRunner({providerRunnerId: 'provisioned-runner-1'})],
8
+ boundJobExecutionsByRunnerInstanceId: new Map(),
9
9
  });
10
10
 
11
11
  expect(result[0]?.desiredIntent).toBe('keep');
12
12
  });
13
13
 
14
14
  it('terminates terminal provisioned runners', () => {
15
- const result = reconcileProvisionedRunnersFromDbResult({
16
- observedProvisionedRunnerIds: ['provisioned-runner-1'],
15
+ const result = reconcileRunnerInstancesFromDbResult({
16
+ observedRunnerInstanceIds: ['provisioned-runner-1'],
17
17
  observedRows: [
18
- provisionedRunner({provisionedRunnerId: 'provisioned-runner-1', state: 'terminated'}),
18
+ providerRunner({providerRunnerId: 'provisioned-runner-1', state: 'terminated'}),
19
19
  ],
20
- boundJobExecutionsByProvisionedRunnerId: new Map(),
20
+ boundJobExecutionsByRunnerInstanceId: new Map(),
21
21
  });
22
22
 
23
23
  expect(result[0]?.desiredIntent).toBe('terminate');
24
24
  });
25
25
 
26
26
  it('keeps orphan observed provisioned runners', () => {
27
- const result = reconcileProvisionedRunnersFromDbResult({
28
- observedProvisionedRunnerIds: ['provisioned-runner-1'],
27
+ const result = reconcileRunnerInstancesFromDbResult({
28
+ observedRunnerInstanceIds: ['provisioned-runner-1'],
29
29
  observedRows: [],
30
- boundJobExecutionsByProvisionedRunnerId: new Map(),
30
+ boundJobExecutionsByRunnerInstanceId: new Map(),
31
31
  });
32
32
 
33
33
  expect(result[0]).toMatchObject({
34
- provisionedRunnerId: 'provisioned-runner-1',
34
+ providerRunnerId: 'provisioned-runner-1',
35
35
  state: null,
36
36
  desiredIntent: 'keep',
37
37
  });
38
38
  });
39
39
 
40
40
  it('terminates active provisioned runners with a cancelled latest bound job', () => {
41
- const result = reconcileProvisionedRunnersFromDbResult({
42
- observedProvisionedRunnerIds: ['provisioned-runner-1'],
43
- observedRows: [provisionedRunner({provisionedRunnerId: 'provisioned-runner-1'})],
44
- boundJobExecutionsByProvisionedRunnerId: new Map([
41
+ const result = reconcileRunnerInstancesFromDbResult({
42
+ observedRunnerInstanceIds: ['provisioned-runner-1'],
43
+ observedRows: [providerRunner({providerRunnerId: 'provisioned-runner-1'})],
44
+ boundJobExecutionsByRunnerInstanceId: new Map([
45
45
  [
46
46
  'provisioned-runner-1',
47
47
  boundJobExecution({
48
- provisionedRunnerId: 'provisioned-runner-1',
48
+ providerRunnerId: 'provisioned-runner-1',
49
49
  cancellationRequestedAt: new Date('2025-01-01T00:01:00.000Z'),
50
50
  }),
51
51
  ],
@@ -56,15 +56,15 @@ describe('reconcileProvisionedRunnersFromDbResult', () => {
56
56
  });
57
57
  });
58
58
 
59
- function provisionedRunner(params: {
60
- provisionedRunnerId: string;
59
+ function providerRunner(params: {
60
+ providerRunnerId: string;
61
61
  state?: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'terminated';
62
62
  }) {
63
63
  return {
64
64
  id: crypto.randomUUID(),
65
65
  workspaceId: crypto.randomUUID(),
66
66
  provisionerId: crypto.randomUUID(),
67
- provisionedRunnerId: params.provisionedRunnerId,
67
+ providerRunnerId: params.providerRunnerId,
68
68
  reservationId: null,
69
69
  templateKey: 'linux',
70
70
  labels: ['linux'],
@@ -85,7 +85,7 @@ function provisionedRunner(params: {
85
85
  }
86
86
 
87
87
  function boundJobExecution(params: {
88
- provisionedRunnerId: string;
88
+ providerRunnerId: string;
89
89
  cancellationRequestedAt?: Date | null;
90
90
  }) {
91
91
  return {
@@ -93,7 +93,7 @@ function boundJobExecution(params: {
93
93
  workflowRunAttemptId: crypto.randomUUID(),
94
94
  jobId: crypto.randomUUID(),
95
95
  jobExecutionId: crypto.randomUUID(),
96
- provisionedRunnerId: params.provisionedRunnerId,
96
+ providerRunnerId: params.providerRunnerId,
97
97
  startedAt: new Date('2025-01-01T00:00:00.000Z'),
98
98
  lastHeartbeatAt: new Date('2025-01-01T00:00:00.000Z'),
99
99
  cancellationRequestedAt: params.cancellationRequestedAt ?? null,