@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
@@ -1,53 +1,94 @@
1
- import { requireProvisionerContext } from '@shipfox/api-auth-context';
1
+ import { requireProvisionerContext, requireWorkspaceProvisionerContext } from '@shipfox/api-auth-context';
2
2
  import { pollDemandBodySchema, pollDemandResponseSchema } from '@shipfox/api-runners-dto';
3
- import { defineRoute } from '@shipfox/node-fastify';
3
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
4
  import { config } from '#config.js';
5
5
  import { pollDemand, releaseReservationGrants } from '#core/demand.js';
6
+ import { publishWorkspaceProvisionerCapabilitySnapshot } from '#db/provisioner-capability-snapshots.js';
7
+ import { listQueuedDemandWorkspaceIds, pollInstallationDemandAndReserve } from '#db/reservations.js';
6
8
  import { toPollDemandResponseDto } from '#presentation/dto/index.js';
7
9
  const TERMINATE_INTENT_LIMIT = 1000;
8
- export const pollDemandRoute = defineRoute({
9
- method: 'POST',
10
- path: '/demand/poll',
11
- description: 'Poll aggregate runner demand and reserve capacity for a provisioner',
12
- schema: {
13
- body: pollDemandBodySchema,
14
- response: {
15
- 200: pollDemandResponseSchema
16
- }
17
- },
18
- handler: async (request, reply)=>{
19
- const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
20
- const abortController = new AbortController();
21
- let responseFinished = false;
22
- let responseReservations = [];
23
- reply.raw.on('finish', ()=>{
24
- responseFinished = true;
25
- });
26
- reply.raw.on('close', ()=>{
27
- if (!responseFinished) {
28
- abortController.abort();
29
- void releaseReservationGrants(responseReservations).catch(()=>undefined);
10
+ function toReservationTemplates(templates) {
11
+ return templates.map((template)=>({
12
+ templateKey: template.template_key,
13
+ labels: template.labels,
14
+ availableSlots: template.available_slots,
15
+ starting: template.starting,
16
+ running: template.running
17
+ }));
18
+ }
19
+ export function createPollDemandRoute(options = {}) {
20
+ return defineRoute({
21
+ method: 'POST',
22
+ path: '/demand/poll',
23
+ description: 'Poll aggregate runner demand and reserve capacity for a provisioner',
24
+ schema: {
25
+ body: pollDemandBodySchema,
26
+ response: {
27
+ 200: pollDemandResponseSchema
28
+ }
29
+ },
30
+ handler: async (request, reply)=>{
31
+ const abortController = new AbortController();
32
+ let responseFinished = false;
33
+ let responseReservations = [];
34
+ reply.raw.on('finish', ()=>{
35
+ responseFinished = true;
36
+ });
37
+ reply.raw.on('close', ()=>{
38
+ if (!responseFinished) {
39
+ abortController.abort();
40
+ void releaseReservationGrants(responseReservations).catch(()=>undefined);
41
+ }
42
+ });
43
+ const provisionerContext = requireProvisionerContext(request);
44
+ if (provisionerContext.scope === 'installation') {
45
+ if (!options.installationProvisioning) {
46
+ throw new ClientError('Installation provisioner credentials are not accepted on this host', 'forbidden', {
47
+ status: 403
48
+ });
49
+ }
50
+ const candidateWorkspaceIds = await listQueuedDemandWorkspaceIds();
51
+ const eligibleWorkspaceIds = await options.installationProvisioning.policy.filterEligibleWorkspaceIds(candidateWorkspaceIds);
52
+ const templates = toReservationTemplates(request.body.templates);
53
+ const result = await pollInstallationDemandAndReserve({
54
+ provisionerId: provisionerContext.provisionerTokenId,
55
+ maxReservations: request.body.max_reservations,
56
+ ttlSeconds: config.RESERVATION_TTL_SECONDS,
57
+ templates,
58
+ capabilityWindowSeconds: config.PROVISIONER_ACTIVE_WINDOW_SECONDS,
59
+ eligibleWorkspaceIds,
60
+ signal: abortController.signal,
61
+ onReservations: (reservations)=>{
62
+ responseReservations.push(...reservations);
63
+ }
64
+ });
65
+ return toPollDemandResponseDto({
66
+ ...result,
67
+ terminateRunnerInstanceIds: []
68
+ });
30
69
  }
31
- });
32
- const result = await pollDemand({
33
- workspaceId,
34
- provisionerId: provisionerTokenId,
35
- maxReservations: request.body.max_reservations,
36
- waitSeconds: request.body.wait_seconds,
37
- ttlSeconds: config.RESERVATION_TTL_SECONDS,
38
- terminateIntentLimit: TERMINATE_INTENT_LIMIT,
39
- templates: request.body.templates.map((template)=>({
40
- templateKey: template.template_key,
41
- labels: template.labels,
42
- availableSlots: template.available_slots,
43
- starting: template.starting,
44
- running: template.running
45
- })),
46
- signal: abortController.signal
47
- });
48
- responseReservations = result.reservations;
49
- return toPollDemandResponseDto(result);
50
- }
51
- });
70
+ const { provisionerTokenId, workspaceId } = requireWorkspaceProvisionerContext(request);
71
+ const templates = toReservationTemplates(request.body.templates);
72
+ await publishWorkspaceProvisionerCapabilitySnapshot({
73
+ workspaceId,
74
+ provisionerId: provisionerTokenId,
75
+ templates
76
+ });
77
+ const result = await pollDemand({
78
+ workspaceId,
79
+ provisionerId: provisionerTokenId,
80
+ maxReservations: request.body.max_reservations,
81
+ waitSeconds: request.body.wait_seconds,
82
+ ttlSeconds: config.RESERVATION_TTL_SECONDS,
83
+ terminateIntentLimit: TERMINATE_INTENT_LIMIT,
84
+ templates,
85
+ signal: abortController.signal
86
+ });
87
+ responseReservations = result.reservations;
88
+ return toPollDemandResponseDto(result);
89
+ }
90
+ });
91
+ }
92
+ export const pollDemandRoute = createPollDemandRoute();
52
93
 
53
94
  //# sourceMappingURL=poll-demand.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/poll-demand.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {pollDemandBodySchema, pollDemandResponseSchema} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {config} from '#config.js';\nimport {pollDemand, releaseReservationGrants} from '#core/demand.js';\nimport type {ReservationGrant} from '#db/reservations.js';\nimport {toPollDemandResponseDto} from '#presentation/dto/index.js';\n\nconst TERMINATE_INTENT_LIMIT = 1000;\n\nexport const pollDemandRoute = defineRoute({\n method: 'POST',\n path: '/demand/poll',\n description: 'Poll aggregate runner demand and reserve capacity for a provisioner',\n schema: {\n body: pollDemandBodySchema,\n response: {\n 200: pollDemandResponseSchema,\n },\n },\n handler: async (request, reply) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const abortController = new AbortController();\n let responseFinished = false;\n let responseReservations: ReservationGrant[] = [];\n reply.raw.on('finish', () => {\n responseFinished = true;\n });\n reply.raw.on('close', () => {\n if (!responseFinished) {\n abortController.abort();\n void releaseReservationGrants(responseReservations).catch(() => undefined);\n }\n });\n\n const result = await pollDemand({\n workspaceId,\n provisionerId: provisionerTokenId,\n maxReservations: request.body.max_reservations,\n waitSeconds: request.body.wait_seconds,\n ttlSeconds: config.RESERVATION_TTL_SECONDS,\n terminateIntentLimit: TERMINATE_INTENT_LIMIT,\n templates: request.body.templates.map((template) => ({\n templateKey: template.template_key,\n labels: template.labels,\n availableSlots: template.available_slots,\n starting: template.starting,\n running: template.running,\n })),\n signal: abortController.signal,\n });\n responseReservations = result.reservations;\n\n return toPollDemandResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","pollDemandBodySchema","pollDemandResponseSchema","defineRoute","config","pollDemand","releaseReservationGrants","toPollDemandResponseDto","TERMINATE_INTENT_LIMIT","pollDemandRoute","method","path","description","schema","body","response","handler","request","reply","provisionerTokenId","workspaceId","abortController","AbortController","responseFinished","responseReservations","raw","on","abort","catch","undefined","result","provisionerId","maxReservations","max_reservations","waitSeconds","wait_seconds","ttlSeconds","RESERVATION_TTL_SECONDS","terminateIntentLimit","templates","map","template","templateKey","template_key","labels","availableSlots","available_slots","starting","running","signal","reservations"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SAAQC,oBAAoB,EAAEC,wBAAwB,QAAO,2BAA2B;AACxF,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,UAAU,EAAEC,wBAAwB,QAAO,kBAAkB;AAErE,SAAQC,uBAAuB,QAAO,6BAA6B;AAEnE,MAAMC,yBAAyB;AAE/B,OAAO,MAAMC,kBAAkBN,YAAY;IACzCO,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMb;QACNc,UAAU;YACR,KAAKb;QACP;IACF;IACAc,SAAS,OAAOC,SAASC;QACvB,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGpB,0BAA0BiB;QACpE,MAAMI,kBAAkB,IAAIC;QAC5B,IAAIC,mBAAmB;QACvB,IAAIC,uBAA2C,EAAE;QACjDN,MAAMO,GAAG,CAACC,EAAE,CAAC,UAAU;YACrBH,mBAAmB;QACrB;QACAL,MAAMO,GAAG,CAACC,EAAE,CAAC,SAAS;YACpB,IAAI,CAACH,kBAAkB;gBACrBF,gBAAgBM,KAAK;gBACrB,KAAKrB,yBAAyBkB,sBAAsBI,KAAK,CAAC,IAAMC;YAClE;QACF;QAEA,MAAMC,SAAS,MAAMzB,WAAW;YAC9Be;YACAW,eAAeZ;YACfa,iBAAiBf,QAAQH,IAAI,CAACmB,gBAAgB;YAC9CC,aAAajB,QAAQH,IAAI,CAACqB,YAAY;YACtCC,YAAYhC,OAAOiC,uBAAuB;YAC1CC,sBAAsB9B;YACtB+B,WAAWtB,QAAQH,IAAI,CAACyB,SAAS,CAACC,GAAG,CAAC,CAACC,WAAc,CAAA;oBACnDC,aAAaD,SAASE,YAAY;oBAClCC,QAAQH,SAASG,MAAM;oBACvBC,gBAAgBJ,SAASK,eAAe;oBACxCC,UAAUN,SAASM,QAAQ;oBAC3BC,SAASP,SAASO,OAAO;gBAC3B,CAAA;YACAC,QAAQ5B,gBAAgB4B,MAAM;QAChC;QACAzB,uBAAuBM,OAAOoB,YAAY;QAE1C,OAAO3C,wBAAwBuB;IACjC;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/poll-demand.ts"],"sourcesContent":["import {\n requireProvisionerContext,\n requireWorkspaceProvisionerContext,\n} from '@shipfox/api-auth-context';\nimport type {PollDemandTemplateDto} from '@shipfox/api-runners-dto';\nimport {pollDemandBodySchema, pollDemandResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {config} from '#config.js';\nimport {pollDemand, releaseReservationGrants} from '#core/demand.js';\nimport {publishWorkspaceProvisionerCapabilitySnapshot} from '#db/provisioner-capability-snapshots.js';\nimport {\n listQueuedDemandWorkspaceIds,\n pollInstallationDemandAndReserve,\n type ReservationGrant,\n type ReservationTemplate,\n} from '#db/reservations.js';\nimport type {CreateRunnersModuleOptions} from '#installation-provisioning.js';\nimport {toPollDemandResponseDto} from '#presentation/dto/index.js';\n\nconst TERMINATE_INTENT_LIMIT = 1000;\n\nfunction toReservationTemplates(templates: PollDemandTemplateDto[]): ReservationTemplate[] {\n return templates.map((template) => ({\n templateKey: template.template_key,\n labels: template.labels,\n availableSlots: template.available_slots,\n starting: template.starting,\n running: template.running,\n }));\n}\n\nexport function createPollDemandRoute(options: CreateRunnersModuleOptions = {}) {\n return defineRoute({\n method: 'POST',\n path: '/demand/poll',\n description: 'Poll aggregate runner demand and reserve capacity for a provisioner',\n schema: {\n body: pollDemandBodySchema,\n response: {\n 200: pollDemandResponseSchema,\n },\n },\n handler: async (request, reply) => {\n const abortController = new AbortController();\n let responseFinished = false;\n let responseReservations: ReservationGrant[] = [];\n reply.raw.on('finish', () => {\n responseFinished = true;\n });\n reply.raw.on('close', () => {\n if (!responseFinished) {\n abortController.abort();\n void releaseReservationGrants(responseReservations).catch(() => undefined);\n }\n });\n const provisionerContext = requireProvisionerContext(request);\n if (provisionerContext.scope === 'installation') {\n if (!options.installationProvisioning) {\n throw new ClientError(\n 'Installation provisioner credentials are not accepted on this host',\n 'forbidden',\n {\n status: 403,\n },\n );\n }\n const candidateWorkspaceIds = await listQueuedDemandWorkspaceIds();\n const eligibleWorkspaceIds =\n await options.installationProvisioning.policy.filterEligibleWorkspaceIds(\n candidateWorkspaceIds,\n );\n const templates = toReservationTemplates(request.body.templates);\n const result = await pollInstallationDemandAndReserve({\n provisionerId: provisionerContext.provisionerTokenId,\n maxReservations: request.body.max_reservations,\n ttlSeconds: config.RESERVATION_TTL_SECONDS,\n templates,\n capabilityWindowSeconds: config.PROVISIONER_ACTIVE_WINDOW_SECONDS,\n eligibleWorkspaceIds,\n signal: abortController.signal,\n onReservations: (reservations) => {\n responseReservations.push(...reservations);\n },\n });\n return toPollDemandResponseDto({\n ...result,\n terminateRunnerInstanceIds: [],\n });\n }\n const {provisionerTokenId, workspaceId} = requireWorkspaceProvisionerContext(request);\n\n const templates = toReservationTemplates(request.body.templates);\n await publishWorkspaceProvisionerCapabilitySnapshot({\n workspaceId,\n provisionerId: provisionerTokenId,\n templates,\n });\n\n const result = await pollDemand({\n workspaceId,\n provisionerId: provisionerTokenId,\n maxReservations: request.body.max_reservations,\n waitSeconds: request.body.wait_seconds,\n ttlSeconds: config.RESERVATION_TTL_SECONDS,\n terminateIntentLimit: TERMINATE_INTENT_LIMIT,\n templates,\n signal: abortController.signal,\n });\n responseReservations = result.reservations;\n\n return toPollDemandResponseDto(result);\n },\n });\n}\n\nexport const pollDemandRoute = createPollDemandRoute();\n"],"names":["requireProvisionerContext","requireWorkspaceProvisionerContext","pollDemandBodySchema","pollDemandResponseSchema","ClientError","defineRoute","config","pollDemand","releaseReservationGrants","publishWorkspaceProvisionerCapabilitySnapshot","listQueuedDemandWorkspaceIds","pollInstallationDemandAndReserve","toPollDemandResponseDto","TERMINATE_INTENT_LIMIT","toReservationTemplates","templates","map","template","templateKey","template_key","labels","availableSlots","available_slots","starting","running","createPollDemandRoute","options","method","path","description","schema","body","response","handler","request","reply","abortController","AbortController","responseFinished","responseReservations","raw","on","abort","catch","undefined","provisionerContext","scope","installationProvisioning","status","candidateWorkspaceIds","eligibleWorkspaceIds","policy","filterEligibleWorkspaceIds","result","provisionerId","provisionerTokenId","maxReservations","max_reservations","ttlSeconds","RESERVATION_TTL_SECONDS","capabilityWindowSeconds","PROVISIONER_ACTIVE_WINDOW_SECONDS","signal","onReservations","reservations","push","terminateRunnerInstanceIds","workspaceId","waitSeconds","wait_seconds","terminateIntentLimit","pollDemandRoute"],"mappings":"AAAA,SACEA,yBAAyB,EACzBC,kCAAkC,QAC7B,4BAA4B;AAEnC,SAAQC,oBAAoB,EAAEC,wBAAwB,QAAO,2BAA2B;AACxF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,UAAU,EAAEC,wBAAwB,QAAO,kBAAkB;AACrE,SAAQC,6CAA6C,QAAO,0CAA0C;AACtG,SACEC,4BAA4B,EAC5BC,gCAAgC,QAG3B,sBAAsB;AAE7B,SAAQC,uBAAuB,QAAO,6BAA6B;AAEnE,MAAMC,yBAAyB;AAE/B,SAASC,uBAAuBC,SAAkC;IAChE,OAAOA,UAAUC,GAAG,CAAC,CAACC,WAAc,CAAA;YAClCC,aAAaD,SAASE,YAAY;YAClCC,QAAQH,SAASG,MAAM;YACvBC,gBAAgBJ,SAASK,eAAe;YACxCC,UAAUN,SAASM,QAAQ;YAC3BC,SAASP,SAASO,OAAO;QAC3B,CAAA;AACF;AAEA,OAAO,SAASC,sBAAsBC,UAAsC,CAAC,CAAC;IAC5E,OAAOrB,YAAY;QACjBsB,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,MAAM7B;YACN8B,UAAU;gBACR,KAAK7B;YACP;QACF;QACA8B,SAAS,OAAOC,SAASC;YACvB,MAAMC,kBAAkB,IAAIC;YAC5B,IAAIC,mBAAmB;YACvB,IAAIC,uBAA2C,EAAE;YACjDJ,MAAMK,GAAG,CAACC,EAAE,CAAC,UAAU;gBACrBH,mBAAmB;YACrB;YACAH,MAAMK,GAAG,CAACC,EAAE,CAAC,SAAS;gBACpB,IAAI,CAACH,kBAAkB;oBACrBF,gBAAgBM,KAAK;oBACrB,KAAKlC,yBAAyB+B,sBAAsBI,KAAK,CAAC,IAAMC;gBAClE;YACF;YACA,MAAMC,qBAAqB7C,0BAA0BkC;YACrD,IAAIW,mBAAmBC,KAAK,KAAK,gBAAgB;gBAC/C,IAAI,CAACpB,QAAQqB,wBAAwB,EAAE;oBACrC,MAAM,IAAI3C,YACR,sEACA,aACA;wBACE4C,QAAQ;oBACV;gBAEJ;gBACA,MAAMC,wBAAwB,MAAMvC;gBACpC,MAAMwC,uBACJ,MAAMxB,QAAQqB,wBAAwB,CAACI,MAAM,CAACC,0BAA0B,CACtEH;gBAEJ,MAAMlC,YAAYD,uBAAuBoB,QAAQH,IAAI,CAAChB,SAAS;gBAC/D,MAAMsC,SAAS,MAAM1C,iCAAiC;oBACpD2C,eAAeT,mBAAmBU,kBAAkB;oBACpDC,iBAAiBtB,QAAQH,IAAI,CAAC0B,gBAAgB;oBAC9CC,YAAYpD,OAAOqD,uBAAuB;oBAC1C5C;oBACA6C,yBAAyBtD,OAAOuD,iCAAiC;oBACjEX;oBACAY,QAAQ1B,gBAAgB0B,MAAM;oBAC9BC,gBAAgB,CAACC;wBACfzB,qBAAqB0B,IAAI,IAAID;oBAC/B;gBACF;gBACA,OAAOpD,wBAAwB;oBAC7B,GAAGyC,MAAM;oBACTa,4BAA4B,EAAE;gBAChC;YACF;YACA,MAAM,EAACX,kBAAkB,EAAEY,WAAW,EAAC,GAAGlE,mCAAmCiC;YAE7E,MAAMnB,YAAYD,uBAAuBoB,QAAQH,IAAI,CAAChB,SAAS;YAC/D,MAAMN,8CAA8C;gBAClD0D;gBACAb,eAAeC;gBACfxC;YACF;YAEA,MAAMsC,SAAS,MAAM9C,WAAW;gBAC9B4D;gBACAb,eAAeC;gBACfC,iBAAiBtB,QAAQH,IAAI,CAAC0B,gBAAgB;gBAC9CW,aAAalC,QAAQH,IAAI,CAACsC,YAAY;gBACtCX,YAAYpD,OAAOqD,uBAAuB;gBAC1CW,sBAAsBzD;gBACtBE;gBACA+C,QAAQ1B,gBAAgB0B,MAAM;YAChC;YACAvB,uBAAuBc,OAAOW,YAAY;YAE1C,OAAOpD,wBAAwByC;QACjC;IACF;AACF;AAEA,OAAO,MAAMkB,kBAAkB9C,wBAAwB"}
@@ -0,0 +1,2 @@
1
+ export declare const reconcileRunnerInstancesRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=reconcile-runner-instances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-runner-instances.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/reconcile-runner-instances.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,6BAA6B,iDAoBxC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
+ import { reconcileRunnerInstancesBodySchema, reconcileRunnerInstancesResponseSchema } from '@shipfox/api-runners-dto';
3
+ import { defineRoute } from '@shipfox/node-fastify';
4
+ import { reconcileRunnerInstances } from '#core/index.js';
5
+ import { toReconcileRunnerInstancesResponseDto } from '#presentation/dto/index.js';
6
+ export const reconcileRunnerInstancesRoute = defineRoute({
7
+ method: 'POST',
8
+ path: '/runner-instances/reconcile',
9
+ description: 'Reconcile provisioned runner state for a provisioner',
10
+ schema: {
11
+ body: reconcileRunnerInstancesBodySchema,
12
+ response: {
13
+ 200: reconcileRunnerInstancesResponseSchema
14
+ }
15
+ },
16
+ handler: async (request)=>{
17
+ const context = requireProvisionerContext(request);
18
+ const result = await reconcileRunnerInstances({
19
+ workspaceId: context.scope === 'workspace' ? context.workspaceId : null,
20
+ provisionerId: context.provisionerTokenId,
21
+ observedRunnerInstanceIds: request.body.observed_provider_runner_ids
22
+ });
23
+ return toReconcileRunnerInstancesResponseDto(result);
24
+ }
25
+ });
26
+
27
+ //# sourceMappingURL=reconcile-runner-instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/reconcile-runner-instances.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n reconcileRunnerInstancesBodySchema,\n reconcileRunnerInstancesResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {reconcileRunnerInstances} from '#core/index.js';\nimport {toReconcileRunnerInstancesResponseDto} from '#presentation/dto/index.js';\n\nexport const reconcileRunnerInstancesRoute = defineRoute({\n method: 'POST',\n path: '/runner-instances/reconcile',\n description: 'Reconcile provisioned runner state for a provisioner',\n schema: {\n body: reconcileRunnerInstancesBodySchema,\n response: {\n 200: reconcileRunnerInstancesResponseSchema,\n },\n },\n handler: async (request) => {\n const context = requireProvisionerContext(request);\n const result = await reconcileRunnerInstances({\n workspaceId: context.scope === 'workspace' ? context.workspaceId : null,\n provisionerId: context.provisionerTokenId,\n observedRunnerInstanceIds: request.body.observed_provider_runner_ids,\n });\n\n return toReconcileRunnerInstancesResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","reconcileRunnerInstancesBodySchema","reconcileRunnerInstancesResponseSchema","defineRoute","reconcileRunnerInstances","toReconcileRunnerInstancesResponseDto","reconcileRunnerInstancesRoute","method","path","description","schema","body","response","handler","request","context","result","workspaceId","scope","provisionerId","provisionerTokenId","observedRunnerInstanceIds","observed_provider_runner_ids"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,kCAAkC,EAClCC,sCAAsC,QACjC,2BAA2B;AAClC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,wBAAwB,QAAO,iBAAiB;AACxD,SAAQC,qCAAqC,QAAO,6BAA6B;AAEjF,OAAO,MAAMC,gCAAgCH,YAAY;IACvDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,SAAS,OAAOC;QACd,MAAMC,UAAUf,0BAA0Bc;QAC1C,MAAME,SAAS,MAAMZ,yBAAyB;YAC5Ca,aAAaF,QAAQG,KAAK,KAAK,cAAcH,QAAQE,WAAW,GAAG;YACnEE,eAAeJ,QAAQK,kBAAkB;YACzCC,2BAA2BP,QAAQH,IAAI,CAACW,4BAA4B;QACtE;QAEA,OAAOjB,sCAAsCW;IAC/C;AACF,GAAG"}
@@ -1,2 +1,3 @@
1
- export declare const registerRoute: import("@shipfox/node-fastify").RouteDefinition;
1
+ import type { AuthInterModuleClient } from '@shipfox/api-auth-dto/inter-module';
2
+ export declare function createRegisterRoute(auth: AuthInterModuleClient): import("@shipfox/node-fastify").RouteDefinition;
2
3
  //# sourceMappingURL=register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/register.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa,iDA+DxB,CAAC"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,oCAAoC,CAAC;AAY9E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,mDAkE9D"}
@@ -4,60 +4,63 @@ import { EmptyRunnerLabelsError, RegistrationTokenConsumedError, RegistrationTok
4
4
  import { registerRunnerSession } from '#core/runner-sessions.js';
5
5
  import { getRunnerContext } from '#presentation/auth/index.js';
6
6
  import { createEphemeralRegisterRateLimitPreHandler } from './rate-limit.js';
7
- export const registerRoute = defineRoute({
8
- method: 'POST',
9
- path: '/register',
10
- description: 'Exchange a runner registration token for a runner session token',
11
- schema: {
12
- body: registerRunnerBodySchema,
13
- response: {
14
- 200: registerRunnerResponseSchema
15
- }
16
- },
17
- preHandler: createEphemeralRegisterRateLimitPreHandler(),
18
- errorHandler: (error, request)=>{
19
- if (error instanceof EmptyRunnerLabelsError) {
20
- throw new ClientError(error.message, 'empty-runner-labels', {
21
- status: 400
22
- });
23
- }
24
- if (error instanceof RegistrationTokenConsumedError) {
25
- const runner = getRunnerContext(request);
26
- if (runner.kind === 'ephemeral') {
27
- request.log.warn({
28
- ephemeralTokenId: error.ephemeralTokenId,
29
- provisionerId: runner.provisionerId
30
- }, 'Ephemeral registration token reuse rejected');
7
+ export function createRegisterRoute(auth) {
8
+ return defineRoute({
9
+ method: 'POST',
10
+ path: '/register',
11
+ description: 'Exchange a runner registration token for a runner session token',
12
+ schema: {
13
+ body: registerRunnerBodySchema,
14
+ response: {
15
+ 200: registerRunnerResponseSchema
31
16
  }
32
- throw new ClientError('Registration token has already been consumed', 'registration-token-consumed', {
33
- status: 409
34
- });
35
- }
36
- if (error instanceof RegistrationTokenExpiredError) {
37
- throw new ClientError('Registration token has expired', 'registration-token-expired', {
38
- status: 401
17
+ },
18
+ preHandler: createEphemeralRegisterRateLimitPreHandler(),
19
+ errorHandler: (error, request)=>{
20
+ if (error instanceof EmptyRunnerLabelsError) {
21
+ throw new ClientError(error.message, 'empty-runner-labels', {
22
+ status: 400
23
+ });
24
+ }
25
+ if (error instanceof RegistrationTokenConsumedError) {
26
+ const runner = getRunnerContext(request);
27
+ if (runner.kind === 'ephemeral') {
28
+ request.log.warn({
29
+ ephemeralTokenId: error.ephemeralTokenId,
30
+ provisionerId: runner.provisionerId
31
+ }, 'Ephemeral registration token reuse rejected');
32
+ }
33
+ throw new ClientError('Registration token has already been consumed', 'registration-token-consumed', {
34
+ status: 409
35
+ });
36
+ }
37
+ if (error instanceof RegistrationTokenExpiredError) {
38
+ throw new ClientError('Registration token has expired', 'registration-token-expired', {
39
+ status: 401
40
+ });
41
+ }
42
+ throw error;
43
+ },
44
+ handler: async (request)=>{
45
+ const runner = getRunnerContext(request);
46
+ const result = await registerRunnerSession({
47
+ auth,
48
+ credential: runner.kind === 'manual' ? {
49
+ kind: 'manual',
50
+ registrationTokenId: runner.registrationTokenId,
51
+ workspaceId: runner.workspaceId
52
+ } : runner,
53
+ labels: request.body.labels,
54
+ toolCapabilities: request.body.capabilities ?? null
39
55
  });
56
+ return {
57
+ session_token: result.sessionToken,
58
+ session_id: result.session.id,
59
+ mode: result.mode,
60
+ max_claims: result.maxClaims
61
+ };
40
62
  }
41
- throw error;
42
- },
43
- handler: async (request)=>{
44
- const runner = getRunnerContext(request);
45
- const result = await registerRunnerSession({
46
- credential: runner.kind === 'manual' ? {
47
- kind: 'manual',
48
- registrationTokenId: runner.registrationTokenId,
49
- workspaceId: runner.workspaceId
50
- } : runner,
51
- labels: request.body.labels,
52
- toolCapabilities: request.body.capabilities ?? null
53
- });
54
- return {
55
- session_token: result.sessionToken,
56
- session_id: result.session.id,
57
- mode: result.mode,
58
- max_claims: result.maxClaims
59
- };
60
- }
61
- });
63
+ });
64
+ }
62
65
 
63
66
  //# sourceMappingURL=register.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/register.ts"],"sourcesContent":["import {registerRunnerBodySchema, registerRunnerResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {\n EmptyRunnerLabelsError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n} from '#core/errors.js';\nimport {registerRunnerSession} from '#core/runner-sessions.js';\nimport {getRunnerContext} from '#presentation/auth/index.js';\nimport {createEphemeralRegisterRateLimitPreHandler} from './rate-limit.js';\n\nexport const registerRoute = defineRoute({\n method: 'POST',\n path: '/register',\n description: 'Exchange a runner registration token for a runner session token',\n schema: {\n body: registerRunnerBodySchema,\n response: {\n 200: registerRunnerResponseSchema,\n },\n },\n preHandler: createEphemeralRegisterRateLimitPreHandler(),\n errorHandler: (error, request) => {\n if (error instanceof EmptyRunnerLabelsError) {\n throw new ClientError(error.message, 'empty-runner-labels', {status: 400});\n }\n if (error instanceof RegistrationTokenConsumedError) {\n const runner = getRunnerContext(request);\n if (runner.kind === 'ephemeral') {\n request.log.warn(\n {\n ephemeralTokenId: error.ephemeralTokenId,\n provisionerId: runner.provisionerId,\n },\n 'Ephemeral registration token reuse rejected',\n );\n }\n throw new ClientError(\n 'Registration token has already been consumed',\n 'registration-token-consumed',\n {\n status: 409,\n },\n );\n }\n if (error instanceof RegistrationTokenExpiredError) {\n throw new ClientError('Registration token has expired', 'registration-token-expired', {\n status: 401,\n });\n }\n throw error;\n },\n handler: async (request) => {\n const runner = getRunnerContext(request);\n const result = await registerRunnerSession({\n credential:\n runner.kind === 'manual'\n ? {\n kind: 'manual',\n registrationTokenId: runner.registrationTokenId,\n workspaceId: runner.workspaceId,\n }\n : runner,\n labels: request.body.labels,\n toolCapabilities: request.body.capabilities ?? null,\n });\n\n return {\n session_token: result.sessionToken,\n session_id: result.session.id,\n mode: result.mode,\n max_claims: result.maxClaims,\n };\n },\n});\n"],"names":["registerRunnerBodySchema","registerRunnerResponseSchema","ClientError","defineRoute","EmptyRunnerLabelsError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","registerRunnerSession","getRunnerContext","createEphemeralRegisterRateLimitPreHandler","registerRoute","method","path","description","schema","body","response","preHandler","errorHandler","error","request","message","status","runner","kind","log","warn","ephemeralTokenId","provisionerId","handler","result","credential","registrationTokenId","workspaceId","labels","toolCapabilities","capabilities","session_token","sessionToken","session_id","session","id","mode","max_claims","maxClaims"],"mappings":"AAAA,SAAQA,wBAAwB,EAAEC,4BAA4B,QAAO,2BAA2B;AAChG,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SACEC,sBAAsB,EACtBC,8BAA8B,EAC9BC,6BAA6B,QACxB,kBAAkB;AACzB,SAAQC,qBAAqB,QAAO,2BAA2B;AAC/D,SAAQC,gBAAgB,QAAO,8BAA8B;AAC7D,SAAQC,0CAA0C,QAAO,kBAAkB;AAE3E,OAAO,MAAMC,gBAAgBP,YAAY;IACvCQ,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMf;QACNgB,UAAU;YACR,KAAKf;QACP;IACF;IACAgB,YAAYR;IACZS,cAAc,CAACC,OAAOC;QACpB,IAAID,iBAAiBf,wBAAwB;YAC3C,MAAM,IAAIF,YAAYiB,MAAME,OAAO,EAAE,uBAAuB;gBAACC,QAAQ;YAAG;QAC1E;QACA,IAAIH,iBAAiBd,gCAAgC;YACnD,MAAMkB,SAASf,iBAAiBY;YAChC,IAAIG,OAAOC,IAAI,KAAK,aAAa;gBAC/BJ,QAAQK,GAAG,CAACC,IAAI,CACd;oBACEC,kBAAkBR,MAAMQ,gBAAgB;oBACxCC,eAAeL,OAAOK,aAAa;gBACrC,GACA;YAEJ;YACA,MAAM,IAAI1B,YACR,gDACA,+BACA;gBACEoB,QAAQ;YACV;QAEJ;QACA,IAAIH,iBAAiBb,+BAA+B;YAClD,MAAM,IAAIJ,YAAY,kCAAkC,8BAA8B;gBACpFoB,QAAQ;YACV;QACF;QACA,MAAMH;IACR;IACAU,SAAS,OAAOT;QACd,MAAMG,SAASf,iBAAiBY;QAChC,MAAMU,SAAS,MAAMvB,sBAAsB;YACzCwB,YACER,OAAOC,IAAI,KAAK,WACZ;gBACEA,MAAM;gBACNQ,qBAAqBT,OAAOS,mBAAmB;gBAC/CC,aAAaV,OAAOU,WAAW;YACjC,IACAV;YACNW,QAAQd,QAAQL,IAAI,CAACmB,MAAM;YAC3BC,kBAAkBf,QAAQL,IAAI,CAACqB,YAAY,IAAI;QACjD;QAEA,OAAO;YACLC,eAAeP,OAAOQ,YAAY;YAClCC,YAAYT,OAAOU,OAAO,CAACC,EAAE;YAC7BC,MAAMZ,OAAOY,IAAI;YACjBC,YAAYb,OAAOc,SAAS;QAC9B;IACF;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/register.ts"],"sourcesContent":["import type {AuthInterModuleClient} from '@shipfox/api-auth-dto/inter-module';\nimport {registerRunnerBodySchema, registerRunnerResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {\n EmptyRunnerLabelsError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n} from '#core/errors.js';\nimport {registerRunnerSession} from '#core/runner-sessions.js';\nimport {getRunnerContext} from '#presentation/auth/index.js';\nimport {createEphemeralRegisterRateLimitPreHandler} from './rate-limit.js';\n\nexport function createRegisterRoute(auth: AuthInterModuleClient) {\n return defineRoute({\n method: 'POST',\n path: '/register',\n description: 'Exchange a runner registration token for a runner session token',\n schema: {\n body: registerRunnerBodySchema,\n response: {\n 200: registerRunnerResponseSchema,\n },\n },\n preHandler: createEphemeralRegisterRateLimitPreHandler(),\n errorHandler: (error, request) => {\n if (error instanceof EmptyRunnerLabelsError) {\n throw new ClientError(error.message, 'empty-runner-labels', {status: 400});\n }\n if (error instanceof RegistrationTokenConsumedError) {\n const runner = getRunnerContext(request);\n if (runner.kind === 'ephemeral') {\n request.log.warn(\n {\n ephemeralTokenId: error.ephemeralTokenId,\n provisionerId: runner.provisionerId,\n },\n 'Ephemeral registration token reuse rejected',\n );\n }\n throw new ClientError(\n 'Registration token has already been consumed',\n 'registration-token-consumed',\n {\n status: 409,\n },\n );\n }\n if (error instanceof RegistrationTokenExpiredError) {\n throw new ClientError('Registration token has expired', 'registration-token-expired', {\n status: 401,\n });\n }\n throw error;\n },\n handler: async (request) => {\n const runner = getRunnerContext(request);\n const result = await registerRunnerSession({\n auth,\n credential:\n runner.kind === 'manual'\n ? {\n kind: 'manual',\n registrationTokenId: runner.registrationTokenId,\n workspaceId: runner.workspaceId,\n }\n : runner,\n labels: request.body.labels,\n toolCapabilities: request.body.capabilities ?? null,\n });\n\n return {\n session_token: result.sessionToken,\n session_id: result.session.id,\n mode: result.mode,\n max_claims: result.maxClaims,\n };\n },\n });\n}\n"],"names":["registerRunnerBodySchema","registerRunnerResponseSchema","ClientError","defineRoute","EmptyRunnerLabelsError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","registerRunnerSession","getRunnerContext","createEphemeralRegisterRateLimitPreHandler","createRegisterRoute","auth","method","path","description","schema","body","response","preHandler","errorHandler","error","request","message","status","runner","kind","log","warn","ephemeralTokenId","provisionerId","handler","result","credential","registrationTokenId","workspaceId","labels","toolCapabilities","capabilities","session_token","sessionToken","session_id","session","id","mode","max_claims","maxClaims"],"mappings":"AACA,SAAQA,wBAAwB,EAAEC,4BAA4B,QAAO,2BAA2B;AAChG,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SACEC,sBAAsB,EACtBC,8BAA8B,EAC9BC,6BAA6B,QACxB,kBAAkB;AACzB,SAAQC,qBAAqB,QAAO,2BAA2B;AAC/D,SAAQC,gBAAgB,QAAO,8BAA8B;AAC7D,SAAQC,0CAA0C,QAAO,kBAAkB;AAE3E,OAAO,SAASC,oBAAoBC,IAA2B;IAC7D,OAAOR,YAAY;QACjBS,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,MAAMhB;YACNiB,UAAU;gBACR,KAAKhB;YACP;QACF;QACAiB,YAAYT;QACZU,cAAc,CAACC,OAAOC;YACpB,IAAID,iBAAiBhB,wBAAwB;gBAC3C,MAAM,IAAIF,YAAYkB,MAAME,OAAO,EAAE,uBAAuB;oBAACC,QAAQ;gBAAG;YAC1E;YACA,IAAIH,iBAAiBf,gCAAgC;gBACnD,MAAMmB,SAAShB,iBAAiBa;gBAChC,IAAIG,OAAOC,IAAI,KAAK,aAAa;oBAC/BJ,QAAQK,GAAG,CAACC,IAAI,CACd;wBACEC,kBAAkBR,MAAMQ,gBAAgB;wBACxCC,eAAeL,OAAOK,aAAa;oBACrC,GACA;gBAEJ;gBACA,MAAM,IAAI3B,YACR,gDACA,+BACA;oBACEqB,QAAQ;gBACV;YAEJ;YACA,IAAIH,iBAAiBd,+BAA+B;gBAClD,MAAM,IAAIJ,YAAY,kCAAkC,8BAA8B;oBACpFqB,QAAQ;gBACV;YACF;YACA,MAAMH;QACR;QACAU,SAAS,OAAOT;YACd,MAAMG,SAAShB,iBAAiBa;YAChC,MAAMU,SAAS,MAAMxB,sBAAsB;gBACzCI;gBACAqB,YACER,OAAOC,IAAI,KAAK,WACZ;oBACEA,MAAM;oBACNQ,qBAAqBT,OAAOS,mBAAmB;oBAC/CC,aAAaV,OAAOU,WAAW;gBACjC,IACAV;gBACNW,QAAQd,QAAQL,IAAI,CAACmB,MAAM;gBAC3BC,kBAAkBf,QAAQL,IAAI,CAACqB,YAAY,IAAI;YACjD;YAEA,OAAO;gBACLC,eAAeP,OAAOQ,YAAY;gBAClCC,YAAYT,OAAOU,OAAO,CAACC,EAAE;gBAC7BC,MAAMZ,OAAOY,IAAI;gBACjBC,YAAYb,OAAOc,SAAS;YAC9B;QACF;IACF;AACF"}
@@ -0,0 +1,2 @@
1
+ export declare const reportRunnerInstancesRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=report-runner-instances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-runner-instances.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/report-runner-instances.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,0BAA0B,iDA8BrC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
+ import { reportRunnerInstancesBodySchema, reportRunnerInstancesResponseSchema } from '@shipfox/api-runners-dto';
3
+ import { defineRoute } from '@shipfox/node-fastify';
4
+ import { reportRunnerInstances } from '#core/index.js';
5
+ import { toReportRunnerInstancesResponseDto } from '#presentation/dto/index.js';
6
+ export const reportRunnerInstancesRoute = defineRoute({
7
+ method: 'POST',
8
+ path: '/runner-instances/report',
9
+ description: 'Report provisioned runner lifecycle state',
10
+ schema: {
11
+ body: reportRunnerInstancesBodySchema,
12
+ response: {
13
+ 200: reportRunnerInstancesResponseSchema
14
+ }
15
+ },
16
+ handler: async (request)=>{
17
+ const context = requireProvisionerContext(request);
18
+ const result = await reportRunnerInstances({
19
+ workspaceId: context.scope === 'workspace' ? context.workspaceId : null,
20
+ provisionerId: context.provisionerTokenId,
21
+ events: request.body.events.map((event)=>({
22
+ providerRunnerId: event.provider_runner_id,
23
+ reservationId: event.reservation_id ?? null,
24
+ templateKey: event.template_key ?? null,
25
+ labels: event.labels,
26
+ state: event.state,
27
+ reason: event.reason ?? null,
28
+ runnerSessionId: event.runner_session_id ?? null,
29
+ providerKind: event.provider_kind ?? null,
30
+ reportedAt: new Date(event.reported_at)
31
+ }))
32
+ });
33
+ return toReportRunnerInstancesResponseDto(result);
34
+ }
35
+ });
36
+
37
+ //# sourceMappingURL=report-runner-instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/report-runner-instances.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n reportRunnerInstancesBodySchema,\n reportRunnerInstancesResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {reportRunnerInstances} from '#core/index.js';\nimport {toReportRunnerInstancesResponseDto} from '#presentation/dto/index.js';\n\nexport const reportRunnerInstancesRoute = defineRoute({\n method: 'POST',\n path: '/runner-instances/report',\n description: 'Report provisioned runner lifecycle state',\n schema: {\n body: reportRunnerInstancesBodySchema,\n response: {\n 200: reportRunnerInstancesResponseSchema,\n },\n },\n handler: async (request) => {\n const context = requireProvisionerContext(request);\n const result = await reportRunnerInstances({\n workspaceId: context.scope === 'workspace' ? context.workspaceId : null,\n provisionerId: context.provisionerTokenId,\n events: request.body.events.map((event) => ({\n providerRunnerId: event.provider_runner_id,\n reservationId: event.reservation_id ?? null,\n templateKey: event.template_key ?? null,\n labels: event.labels,\n state: event.state,\n reason: event.reason ?? null,\n runnerSessionId: event.runner_session_id ?? null,\n providerKind: event.provider_kind ?? null,\n reportedAt: new Date(event.reported_at),\n })),\n });\n\n return toReportRunnerInstancesResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","reportRunnerInstancesBodySchema","reportRunnerInstancesResponseSchema","defineRoute","reportRunnerInstances","toReportRunnerInstancesResponseDto","reportRunnerInstancesRoute","method","path","description","schema","body","response","handler","request","context","result","workspaceId","scope","provisionerId","provisionerTokenId","events","map","event","providerRunnerId","provider_runner_id","reservationId","reservation_id","templateKey","template_key","labels","state","reason","runnerSessionId","runner_session_id","providerKind","provider_kind","reportedAt","Date","reported_at"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,+BAA+B,EAC/BC,mCAAmC,QAC9B,2BAA2B;AAClC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,qBAAqB,QAAO,iBAAiB;AACrD,SAAQC,kCAAkC,QAAO,6BAA6B;AAE9E,OAAO,MAAMC,6BAA6BH,YAAY;IACpDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,SAAS,OAAOC;QACd,MAAMC,UAAUf,0BAA0Bc;QAC1C,MAAME,SAAS,MAAMZ,sBAAsB;YACzCa,aAAaF,QAAQG,KAAK,KAAK,cAAcH,QAAQE,WAAW,GAAG;YACnEE,eAAeJ,QAAQK,kBAAkB;YACzCC,QAAQP,QAAQH,IAAI,CAACU,MAAM,CAACC,GAAG,CAAC,CAACC,QAAW,CAAA;oBAC1CC,kBAAkBD,MAAME,kBAAkB;oBAC1CC,eAAeH,MAAMI,cAAc,IAAI;oBACvCC,aAAaL,MAAMM,YAAY,IAAI;oBACnCC,QAAQP,MAAMO,MAAM;oBACpBC,OAAOR,MAAMQ,KAAK;oBAClBC,QAAQT,MAAMS,MAAM,IAAI;oBACxBC,iBAAiBV,MAAMW,iBAAiB,IAAI;oBAC5CC,cAAcZ,MAAMa,aAAa,IAAI;oBACrCC,YAAY,IAAIC,KAAKf,MAAMgB,WAAW;gBACxC,CAAA;QACF;QAEA,OAAOlC,mCAAmCW;IAC5C;AACF,GAAG"}
@@ -1,2 +1,3 @@
1
- export declare const requestJobRoute: import("@shipfox/node-fastify").RouteDefinition;
1
+ import type { AuthInterModuleClient } from '@shipfox/api-auth-dto/inter-module';
2
+ export declare function createRequestJobRoute(auth: AuthInterModuleClient): import("@shipfox/node-fastify").RouteDefinition;
2
3
  //# sourceMappingURL=request-job.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-job.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/request-job.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,iDAwC1B,CAAC"}
1
+ {"version":3,"file":"request-job.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/request-job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,oCAAoC,CAAC;AAM9E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,mDA2ChE"}
@@ -3,43 +3,46 @@ import { claimedJobResponseSchema } from '@shipfox/api-runners-dto';
3
3
  import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
4
  import { RunnerSessionExhaustedError } from '#core/errors.js';
5
5
  import { claimJobExecution } from '#core/job-executions.js';
6
- export const requestJobRoute = defineRoute({
7
- method: 'POST',
8
- path: '/request',
9
- description: 'Claim the next available job execution and receive its lease token',
10
- schema: {
11
- response: {
12
- 200: claimedJobResponseSchema
13
- }
14
- },
15
- errorHandler: (error)=>{
16
- if (error instanceof RunnerSessionExhaustedError) {
17
- throw new ClientError('Runner session claim limit exhausted', 'runner-session-exhausted', {
18
- status: 409
6
+ export function createRequestJobRoute(auth) {
7
+ return defineRoute({
8
+ method: 'POST',
9
+ path: '/request',
10
+ description: 'Claim the next available job execution and receive its lease token',
11
+ schema: {
12
+ response: {
13
+ 200: claimedJobResponseSchema
14
+ }
15
+ },
16
+ errorHandler: (error)=>{
17
+ if (error instanceof RunnerSessionExhaustedError) {
18
+ throw new ClientError('Runner session claim limit exhausted', 'runner-session-exhausted', {
19
+ status: 409
20
+ });
21
+ }
22
+ throw error;
23
+ },
24
+ handler: async (_request, reply)=>{
25
+ const runner = requireRunnerSessionContext(_request);
26
+ const jobExecution = await claimJobExecution({
27
+ auth,
28
+ workspaceId: runner.workspaceId,
29
+ runnerSessionId: runner.runnerSessionId,
30
+ sessionLabels: runner.labels,
31
+ maxClaims: runner.maxClaims
19
32
  });
33
+ if (!jobExecution) {
34
+ reply.status(204);
35
+ return;
36
+ }
37
+ return {
38
+ workflow_run_id: jobExecution.workflowRunId,
39
+ workflow_run_attempt_id: jobExecution.workflowRunAttemptId,
40
+ job_id: jobExecution.jobId,
41
+ job_execution_id: jobExecution.jobExecutionId,
42
+ lease_token: jobExecution.leaseToken
43
+ };
20
44
  }
21
- throw error;
22
- },
23
- handler: async (_request, reply)=>{
24
- const runner = requireRunnerSessionContext(_request);
25
- const jobExecution = await claimJobExecution({
26
- workspaceId: runner.workspaceId,
27
- runnerSessionId: runner.runnerSessionId,
28
- sessionLabels: runner.labels,
29
- maxClaims: runner.maxClaims
30
- });
31
- if (!jobExecution) {
32
- reply.status(204);
33
- return;
34
- }
35
- return {
36
- workflow_run_id: jobExecution.workflowRunId,
37
- workflow_run_attempt_id: jobExecution.workflowRunAttemptId,
38
- job_id: jobExecution.jobId,
39
- job_execution_id: jobExecution.jobExecutionId,
40
- lease_token: jobExecution.leaseToken
41
- };
42
- }
43
- });
45
+ });
46
+ }
44
47
 
45
48
  //# sourceMappingURL=request-job.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/request-job.ts"],"sourcesContent":["import {requireRunnerSessionContext} from '@shipfox/api-auth-context';\nimport {claimedJobResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {RunnerSessionExhaustedError} from '#core/errors.js';\nimport {claimJobExecution} from '#core/job-executions.js';\n\nexport const requestJobRoute = defineRoute({\n method: 'POST',\n path: '/request',\n description: 'Claim the next available job execution and receive its lease token',\n schema: {\n response: {\n 200: claimedJobResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof RunnerSessionExhaustedError) {\n throw new ClientError('Runner session claim limit exhausted', 'runner-session-exhausted', {\n status: 409,\n });\n }\n throw error;\n },\n handler: async (_request, reply) => {\n const runner = requireRunnerSessionContext(_request);\n\n const jobExecution = await claimJobExecution({\n workspaceId: runner.workspaceId,\n runnerSessionId: runner.runnerSessionId,\n sessionLabels: runner.labels,\n maxClaims: runner.maxClaims,\n });\n\n if (!jobExecution) {\n reply.status(204);\n return;\n }\n\n return {\n workflow_run_id: jobExecution.workflowRunId,\n workflow_run_attempt_id: jobExecution.workflowRunAttemptId,\n job_id: jobExecution.jobId,\n job_execution_id: jobExecution.jobExecutionId,\n lease_token: jobExecution.leaseToken,\n };\n },\n});\n"],"names":["requireRunnerSessionContext","claimedJobResponseSchema","ClientError","defineRoute","RunnerSessionExhaustedError","claimJobExecution","requestJobRoute","method","path","description","schema","response","errorHandler","error","status","handler","_request","reply","runner","jobExecution","workspaceId","runnerSessionId","sessionLabels","labels","maxClaims","workflow_run_id","workflowRunId","workflow_run_attempt_id","workflowRunAttemptId","job_id","jobId","job_execution_id","jobExecutionId","lease_token","leaseToken"],"mappings":"AAAA,SAAQA,2BAA2B,QAAO,4BAA4B;AACtE,SAAQC,wBAAwB,QAAO,2BAA2B;AAClE,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,2BAA2B,QAAO,kBAAkB;AAC5D,SAAQC,iBAAiB,QAAO,0BAA0B;AAE1D,OAAO,MAAMC,kBAAkBH,YAAY;IACzCI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,UAAU;YACR,KAAKV;QACP;IACF;IACAW,cAAc,CAACC;QACb,IAAIA,iBAAiBT,6BAA6B;YAChD,MAAM,IAAIF,YAAY,wCAAwC,4BAA4B;gBACxFY,QAAQ;YACV;QACF;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC,UAAUC;QACxB,MAAMC,SAASlB,4BAA4BgB;QAE3C,MAAMG,eAAe,MAAMd,kBAAkB;YAC3Ce,aAAaF,OAAOE,WAAW;YAC/BC,iBAAiBH,OAAOG,eAAe;YACvCC,eAAeJ,OAAOK,MAAM;YAC5BC,WAAWN,OAAOM,SAAS;QAC7B;QAEA,IAAI,CAACL,cAAc;YACjBF,MAAMH,MAAM,CAAC;YACb;QACF;QAEA,OAAO;YACLW,iBAAiBN,aAAaO,aAAa;YAC3CC,yBAAyBR,aAAaS,oBAAoB;YAC1DC,QAAQV,aAAaW,KAAK;YAC1BC,kBAAkBZ,aAAaa,cAAc;YAC7CC,aAAad,aAAae,UAAU;QACtC;IACF;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/request-job.ts"],"sourcesContent":["import {requireRunnerSessionContext} from '@shipfox/api-auth-context';\nimport type {AuthInterModuleClient} from '@shipfox/api-auth-dto/inter-module';\nimport {claimedJobResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {RunnerSessionExhaustedError} from '#core/errors.js';\nimport {claimJobExecution} from '#core/job-executions.js';\n\nexport function createRequestJobRoute(auth: AuthInterModuleClient) {\n return defineRoute({\n method: 'POST',\n path: '/request',\n description: 'Claim the next available job execution and receive its lease token',\n schema: {\n response: {\n 200: claimedJobResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof RunnerSessionExhaustedError) {\n throw new ClientError('Runner session claim limit exhausted', 'runner-session-exhausted', {\n status: 409,\n });\n }\n throw error;\n },\n handler: async (_request, reply) => {\n const runner = requireRunnerSessionContext(_request);\n\n const jobExecution = await claimJobExecution({\n auth,\n workspaceId: runner.workspaceId,\n runnerSessionId: runner.runnerSessionId,\n sessionLabels: runner.labels,\n maxClaims: runner.maxClaims,\n });\n\n if (!jobExecution) {\n reply.status(204);\n return;\n }\n\n return {\n workflow_run_id: jobExecution.workflowRunId,\n workflow_run_attempt_id: jobExecution.workflowRunAttemptId,\n job_id: jobExecution.jobId,\n job_execution_id: jobExecution.jobExecutionId,\n lease_token: jobExecution.leaseToken,\n };\n },\n });\n}\n"],"names":["requireRunnerSessionContext","claimedJobResponseSchema","ClientError","defineRoute","RunnerSessionExhaustedError","claimJobExecution","createRequestJobRoute","auth","method","path","description","schema","response","errorHandler","error","status","handler","_request","reply","runner","jobExecution","workspaceId","runnerSessionId","sessionLabels","labels","maxClaims","workflow_run_id","workflowRunId","workflow_run_attempt_id","workflowRunAttemptId","job_id","jobId","job_execution_id","jobExecutionId","lease_token","leaseToken"],"mappings":"AAAA,SAAQA,2BAA2B,QAAO,4BAA4B;AAEtE,SAAQC,wBAAwB,QAAO,2BAA2B;AAClE,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,2BAA2B,QAAO,kBAAkB;AAC5D,SAAQC,iBAAiB,QAAO,0BAA0B;AAE1D,OAAO,SAASC,sBAAsBC,IAA2B;IAC/D,OAAOJ,YAAY;QACjBK,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,UAAU;gBACR,KAAKX;YACP;QACF;QACAY,cAAc,CAACC;YACb,IAAIA,iBAAiBV,6BAA6B;gBAChD,MAAM,IAAIF,YAAY,wCAAwC,4BAA4B;oBACxFa,QAAQ;gBACV;YACF;YACA,MAAMD;QACR;QACAE,SAAS,OAAOC,UAAUC;YACxB,MAAMC,SAASnB,4BAA4BiB;YAE3C,MAAMG,eAAe,MAAMf,kBAAkB;gBAC3CE;gBACAc,aAAaF,OAAOE,WAAW;gBAC/BC,iBAAiBH,OAAOG,eAAe;gBACvCC,eAAeJ,OAAOK,MAAM;gBAC5BC,WAAWN,OAAOM,SAAS;YAC7B;YAEA,IAAI,CAACL,cAAc;gBACjBF,MAAMH,MAAM,CAAC;gBACb;YACF;YAEA,OAAO;gBACLW,iBAAiBN,aAAaO,aAAa;gBAC3CC,yBAAyBR,aAAaS,oBAAoB;gBAC1DC,QAAQV,aAAaW,KAAK;gBAC1BC,kBAAkBZ,aAAaa,cAAc;gBAC7CC,aAAad,aAAae,UAAU;YACtC;QACF;IACF;AACF"}
@@ -0,0 +1,7 @@
1
+ export declare const createRunnerInstancesRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ export declare const exchangeRunnerBootstrapRoute: import("@shipfox/node-fastify").RouteDefinition;
3
+ export declare const enrollRunnerRoute: import("@shipfox/node-fastify").RouteDefinition;
4
+ export declare const attachRunnerControlProviderIdRoute: import("@shipfox/node-fastify").RouteDefinition;
5
+ export declare const runnerControlHeartbeatRoute: import("@shipfox/node-fastify").RouteDefinition;
6
+ export declare const runnerAssignmentPollRoute: import("@shipfox/node-fastify").RouteDefinition;
7
+ //# sourceMappingURL=runner-enrollment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-enrollment.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/runner-enrollment.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,0BAA0B,iDA0BrC,CAAC;AAEH,eAAO,MAAM,4BAA4B,iDA2BvC,CAAC;AAEH,eAAO,MAAM,iBAAiB,iDAuB5B,CAAC;AAEH,eAAO,MAAM,kCAAkC,iDAkB7C,CAAC;AAEH,eAAO,MAAM,2BAA2B,iDAYtC,CAAC;AAEH,eAAO,MAAM,yBAAyB,iDA2BpC,CAAC"}