@shipfox/api-runners 2.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 (465) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-type$colon$emit.log +1 -0
  3. package/.turbo/turbo-type.log +1 -0
  4. package/CHANGELOG.md +187 -0
  5. package/LICENSE +21 -0
  6. package/dist/config.d.ts +30 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +208 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/core/demand.d.ts +33 -0
  11. package/dist/core/demand.d.ts.map +1 -0
  12. package/dist/core/demand.js +169 -0
  13. package/dist/core/demand.js.map +1 -0
  14. package/dist/core/entities/ephemeral-registration-token.d.ts +14 -0
  15. package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -0
  16. package/dist/core/entities/ephemeral-registration-token.js +3 -0
  17. package/dist/core/entities/ephemeral-registration-token.js.map +1 -0
  18. package/dist/core/entities/manual-registration-token.d.ts +12 -0
  19. package/dist/core/entities/manual-registration-token.d.ts.map +1 -0
  20. package/dist/core/entities/manual-registration-token.js +3 -0
  21. package/dist/core/entities/manual-registration-token.js.map +1 -0
  22. package/dist/core/entities/provisioned-runner.d.ts +24 -0
  23. package/dist/core/entities/provisioned-runner.d.ts.map +1 -0
  24. package/dist/core/entities/provisioned-runner.js +3 -0
  25. package/dist/core/entities/provisioned-runner.js.map +1 -0
  26. package/dist/core/entities/provisioner-token.d.ts +18 -0
  27. package/dist/core/entities/provisioner-token.d.ts.map +1 -0
  28. package/dist/core/entities/provisioner-token.js +3 -0
  29. package/dist/core/entities/provisioner-token.js.map +1 -0
  30. package/dist/core/entities/reservation.d.ts +10 -0
  31. package/dist/core/entities/reservation.d.ts.map +1 -0
  32. package/dist/core/entities/reservation.js +3 -0
  33. package/dist/core/entities/reservation.js.map +1 -0
  34. package/dist/core/entities/runner-session.d.ts +18 -0
  35. package/dist/core/entities/runner-session.d.ts.map +1 -0
  36. package/dist/core/entities/runner-session.js +3 -0
  37. package/dist/core/entities/runner-session.js.map +1 -0
  38. package/dist/core/ephemeral-registration-tokens.d.ts +31 -0
  39. package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -0
  40. package/dist/core/ephemeral-registration-tokens.js +61 -0
  41. package/dist/core/ephemeral-registration-tokens.js.map +1 -0
  42. package/dist/core/errors.d.ts +62 -0
  43. package/dist/core/errors.d.ts.map +1 -0
  44. package/dist/core/errors.js +92 -0
  45. package/dist/core/errors.js.map +1 -0
  46. package/dist/core/index.d.ts +14 -0
  47. package/dist/core/index.d.ts.map +1 -0
  48. package/dist/core/index.js +10 -0
  49. package/dist/core/index.js.map +1 -0
  50. package/dist/core/job-executions.d.ts +14 -0
  51. package/dist/core/job-executions.d.ts.map +1 -0
  52. package/dist/core/job-executions.js +37 -0
  53. package/dist/core/job-executions.js.map +1 -0
  54. package/dist/core/maintenance-policy.d.ts +2 -0
  55. package/dist/core/maintenance-policy.d.ts.map +1 -0
  56. package/dist/core/maintenance-policy.js +3 -0
  57. package/dist/core/maintenance-policy.js.map +1 -0
  58. package/dist/core/maintenance.d.ts +33 -0
  59. package/dist/core/maintenance.d.ts.map +1 -0
  60. package/dist/core/maintenance.js +55 -0
  61. package/dist/core/maintenance.js.map +1 -0
  62. package/dist/core/manual-registration-tokens.d.ts +17 -0
  63. package/dist/core/manual-registration-tokens.d.ts.map +1 -0
  64. package/dist/core/manual-registration-tokens.js +28 -0
  65. package/dist/core/manual-registration-tokens.js.map +1 -0
  66. package/dist/core/provisioned-runners.d.ts +67 -0
  67. package/dist/core/provisioned-runners.d.ts.map +1 -0
  68. package/dist/core/provisioned-runners.js +162 -0
  69. package/dist/core/provisioned-runners.js.map +1 -0
  70. package/dist/core/provisioner-tokens.d.ts +20 -0
  71. package/dist/core/provisioner-tokens.d.ts.map +1 -0
  72. package/dist/core/provisioner-tokens.js +36 -0
  73. package/dist/core/provisioner-tokens.js.map +1 -0
  74. package/dist/core/rate-limit.d.ts +35 -0
  75. package/dist/core/rate-limit.d.ts.map +1 -0
  76. package/dist/core/rate-limit.js +74 -0
  77. package/dist/core/rate-limit.js.map +1 -0
  78. package/dist/core/runner-sessions.d.ts +26 -0
  79. package/dist/core/runner-sessions.d.ts.map +1 -0
  80. package/dist/core/runner-sessions.js +41 -0
  81. package/dist/core/runner-sessions.js.map +1 -0
  82. package/dist/core/runner-tool-capabilities.d.ts +24 -0
  83. package/dist/core/runner-tool-capabilities.d.ts.map +1 -0
  84. package/dist/core/runner-tool-capabilities.js +43 -0
  85. package/dist/core/runner-tool-capabilities.js.map +1 -0
  86. package/dist/db/db.d.ts +4478 -0
  87. package/dist/db/db.d.ts.map +1 -0
  88. package/dist/db/db.js +36 -0
  89. package/dist/db/db.js.map +1 -0
  90. package/dist/db/ephemeral-registration-tokens.d.ts +47 -0
  91. package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -0
  92. package/dist/db/ephemeral-registration-tokens.js +170 -0
  93. package/dist/db/ephemeral-registration-tokens.js.map +1 -0
  94. package/dist/db/index.d.ts +19 -0
  95. package/dist/db/index.d.ts.map +1 -0
  96. package/dist/db/index.js +15 -0
  97. package/dist/db/index.js.map +1 -0
  98. package/dist/db/job-executions.d.ts +128 -0
  99. package/dist/db/job-executions.d.ts.map +1 -0
  100. package/dist/db/job-executions.js +354 -0
  101. package/dist/db/job-executions.js.map +1 -0
  102. package/dist/db/manual-registration-tokens.d.ts +16 -0
  103. package/dist/db/manual-registration-tokens.d.ts.map +1 -0
  104. package/dist/db/manual-registration-tokens.js +37 -0
  105. package/dist/db/manual-registration-tokens.js.map +1 -0
  106. package/dist/db/provisioned-runners.d.ts +79 -0
  107. package/dist/db/provisioned-runners.d.ts.map +1 -0
  108. package/dist/db/provisioned-runners.js +466 -0
  109. package/dist/db/provisioned-runners.js.map +1 -0
  110. package/dist/db/provisioner-tokens.d.ts +26 -0
  111. package/dist/db/provisioner-tokens.d.ts.map +1 -0
  112. package/dist/db/provisioner-tokens.js +54 -0
  113. package/dist/db/provisioner-tokens.js.map +1 -0
  114. package/dist/db/rate-limits.d.ts +18 -0
  115. package/dist/db/rate-limits.d.ts.map +1 -0
  116. package/dist/db/rate-limits.js +44 -0
  117. package/dist/db/rate-limits.js.map +1 -0
  118. package/dist/db/reservations.d.ts +48 -0
  119. package/dist/db/reservations.d.ts.map +1 -0
  120. package/dist/db/reservations.js +162 -0
  121. package/dist/db/reservations.js.map +1 -0
  122. package/dist/db/runner-sessions.d.ts +18 -0
  123. package/dist/db/runner-sessions.d.ts.map +1 -0
  124. package/dist/db/runner-sessions.js +38 -0
  125. package/dist/db/runner-sessions.js.map +1 -0
  126. package/dist/db/schema/common.d.ts +2 -0
  127. package/dist/db/schema/common.d.ts.map +1 -0
  128. package/dist/db/schema/common.js +4 -0
  129. package/dist/db/schema/common.js.map +1 -0
  130. package/dist/db/schema/ephemeral-registration-tokens.d.ts +199 -0
  131. package/dist/db/schema/ephemeral-registration-tokens.d.ts.map +1 -0
  132. package/dist/db/schema/ephemeral-registration-tokens.js +45 -0
  133. package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -0
  134. package/dist/db/schema/manual-registration-tokens.d.ts +165 -0
  135. package/dist/db/schema/manual-registration-tokens.d.ts.map +1 -0
  136. package/dist/db/schema/manual-registration-tokens.js +40 -0
  137. package/dist/db/schema/manual-registration-tokens.js.map +1 -0
  138. package/dist/db/schema/outbox.d.ts +195 -0
  139. package/dist/db/schema/outbox.d.ts.map +1 -0
  140. package/dist/db/schema/outbox.js +5 -0
  141. package/dist/db/schema/outbox.js.map +1 -0
  142. package/dist/db/schema/pending-job-executions.d.ts +189 -0
  143. package/dist/db/schema/pending-job-executions.d.ts.map +1 -0
  144. package/dist/db/schema/pending-job-executions.js +21 -0
  145. package/dist/db/schema/pending-job-executions.js.map +1 -0
  146. package/dist/db/schema/provisioned-runners.d.ts +379 -0
  147. package/dist/db/schema/provisioned-runners.d.ts.map +1 -0
  148. package/dist/db/schema/provisioned-runners.js +83 -0
  149. package/dist/db/schema/provisioned-runners.js.map +1 -0
  150. package/dist/db/schema/provisioner-tokens.d.ts +216 -0
  151. package/dist/db/schema/provisioner-tokens.d.ts.map +1 -0
  152. package/dist/db/schema/provisioner-tokens.js +48 -0
  153. package/dist/db/schema/provisioner-tokens.js.map +1 -0
  154. package/dist/db/schema/rate-limits.d.ts +145 -0
  155. package/dist/db/schema/rate-limits.d.ts.map +1 -0
  156. package/dist/db/schema/rate-limits.js +25 -0
  157. package/dist/db/schema/rate-limits.js.map +1 -0
  158. package/dist/db/schema/reservations.d.ts +157 -0
  159. package/dist/db/schema/reservations.d.ts.map +1 -0
  160. package/dist/db/schema/reservations.js +34 -0
  161. package/dist/db/schema/reservations.js.map +1 -0
  162. package/dist/db/schema/runner-sessions.d.ts +298 -0
  163. package/dist/db/schema/runner-sessions.d.ts.map +1 -0
  164. package/dist/db/schema/runner-sessions.js +61 -0
  165. package/dist/db/schema/runner-sessions.js.map +1 -0
  166. package/dist/db/schema/running-job-executions.d.ts +334 -0
  167. package/dist/db/schema/running-job-executions.d.ts.map +1 -0
  168. package/dist/db/schema/running-job-executions.js +41 -0
  169. package/dist/db/schema/running-job-executions.js.map +1 -0
  170. package/dist/index.d.ts +6 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +56 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/metrics/index.d.ts +3 -0
  175. package/dist/metrics/index.d.ts.map +1 -0
  176. package/dist/metrics/index.js +4 -0
  177. package/dist/metrics/index.js.map +1 -0
  178. package/dist/metrics/instance.d.ts +34 -0
  179. package/dist/metrics/instance.d.ts.map +1 -0
  180. package/dist/metrics/instance.js +60 -0
  181. package/dist/metrics/instance.js.map +1 -0
  182. package/dist/metrics/service.d.ts +2 -0
  183. package/dist/metrics/service.d.ts.map +1 -0
  184. package/dist/metrics/service.js +21 -0
  185. package/dist/metrics/service.js.map +1 -0
  186. package/dist/presentation/auth/index.d.ts +3 -0
  187. package/dist/presentation/auth/index.d.ts.map +1 -0
  188. package/dist/presentation/auth/index.js +4 -0
  189. package/dist/presentation/auth/index.js.map +1 -0
  190. package/dist/presentation/auth/provisioner-token-auth.d.ts +3 -0
  191. package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -0
  192. package/dist/presentation/auth/provisioner-token-auth.js +81 -0
  193. package/dist/presentation/auth/provisioner-token-auth.js.map +1 -0
  194. package/dist/presentation/auth/runner-registration-token-auth.d.ts +17 -0
  195. package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -0
  196. package/dist/presentation/auth/runner-registration-token-auth.js +77 -0
  197. package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -0
  198. package/dist/presentation/dto/active-provisioner.d.ts +8 -0
  199. package/dist/presentation/dto/active-provisioner.d.ts.map +1 -0
  200. package/dist/presentation/dto/active-provisioner.js +10 -0
  201. package/dist/presentation/dto/active-provisioner.js.map +1 -0
  202. package/dist/presentation/dto/index.d.ts +7 -0
  203. package/dist/presentation/dto/index.d.ts.map +1 -0
  204. package/dist/presentation/dto/index.js +8 -0
  205. package/dist/presentation/dto/index.js.map +1 -0
  206. package/dist/presentation/dto/manual-registration-token.d.ts +12 -0
  207. package/dist/presentation/dto/manual-registration-token.d.ts.map +1 -0
  208. package/dist/presentation/dto/manual-registration-token.js +14 -0
  209. package/dist/presentation/dto/manual-registration-token.js.map +1 -0
  210. package/dist/presentation/dto/mint-registration-tokens.d.ts +5 -0
  211. package/dist/presentation/dto/mint-registration-tokens.d.ts.map +1 -0
  212. package/dist/presentation/dto/mint-registration-tokens.js +19 -0
  213. package/dist/presentation/dto/mint-registration-tokens.js.map +1 -0
  214. package/dist/presentation/dto/poll-demand.d.ts +4 -0
  215. package/dist/presentation/dto/poll-demand.d.ts.map +1 -0
  216. package/dist/presentation/dto/poll-demand.js +19 -0
  217. package/dist/presentation/dto/poll-demand.js.map +1 -0
  218. package/dist/presentation/dto/provisioned-runners.d.ts +38 -0
  219. package/dist/presentation/dto/provisioned-runners.d.ts.map +1 -0
  220. package/dist/presentation/dto/provisioned-runners.js +44 -0
  221. package/dist/presentation/dto/provisioned-runners.js.map +1 -0
  222. package/dist/presentation/dto/provisioner-token.d.ts +15 -0
  223. package/dist/presentation/dto/provisioner-token.d.ts.map +1 -0
  224. package/dist/presentation/dto/provisioner-token.js +17 -0
  225. package/dist/presentation/dto/provisioner-token.js.map +1 -0
  226. package/dist/presentation/index.d.ts +4 -0
  227. package/dist/presentation/index.d.ts.map +1 -0
  228. package/dist/presentation/index.js +5 -0
  229. package/dist/presentation/index.js.map +1 -0
  230. package/dist/presentation/routes/create-manual-registration-token.d.ts +2 -0
  231. package/dist/presentation/routes/create-manual-registration-token.d.ts.map +1 -0
  232. package/dist/presentation/routes/create-manual-registration-token.js +44 -0
  233. package/dist/presentation/routes/create-manual-registration-token.js.map +1 -0
  234. package/dist/presentation/routes/create-provisioner-token.d.ts +2 -0
  235. package/dist/presentation/routes/create-provisioner-token.d.ts.map +1 -0
  236. package/dist/presentation/routes/create-provisioner-token.js +42 -0
  237. package/dist/presentation/routes/create-provisioner-token.js.map +1 -0
  238. package/dist/presentation/routes/get-provisioner-me.d.ts +2 -0
  239. package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -0
  240. package/dist/presentation/routes/get-provisioner-me.js +22 -0
  241. package/dist/presentation/routes/get-provisioner-me.js.map +1 -0
  242. package/dist/presentation/routes/heartbeat.d.ts +2 -0
  243. package/dist/presentation/routes/heartbeat.d.ts.map +1 -0
  244. package/dist/presentation/routes/heartbeat.js +64 -0
  245. package/dist/presentation/routes/heartbeat.js.map +1 -0
  246. package/dist/presentation/routes/index.d.ts +4 -0
  247. package/dist/presentation/routes/index.d.ts.map +1 -0
  248. package/dist/presentation/routes/index.js +97 -0
  249. package/dist/presentation/routes/index.js.map +1 -0
  250. package/dist/presentation/routes/list-active-provisioners.d.ts +2 -0
  251. package/dist/presentation/routes/list-active-provisioners.d.ts.map +1 -0
  252. package/dist/presentation/routes/list-active-provisioners.js +32 -0
  253. package/dist/presentation/routes/list-active-provisioners.js.map +1 -0
  254. package/dist/presentation/routes/list-active-runners.d.ts +2 -0
  255. package/dist/presentation/routes/list-active-runners.d.ts.map +1 -0
  256. package/dist/presentation/routes/list-active-runners.js +32 -0
  257. package/dist/presentation/routes/list-active-runners.js.map +1 -0
  258. package/dist/presentation/routes/list-manual-registration-tokens.d.ts +2 -0
  259. package/dist/presentation/routes/list-manual-registration-tokens.d.ts.map +1 -0
  260. package/dist/presentation/routes/list-manual-registration-tokens.js +32 -0
  261. package/dist/presentation/routes/list-manual-registration-tokens.js.map +1 -0
  262. package/dist/presentation/routes/list-provisioner-tokens.d.ts +2 -0
  263. package/dist/presentation/routes/list-provisioner-tokens.d.ts.map +1 -0
  264. package/dist/presentation/routes/list-provisioner-tokens.js +32 -0
  265. package/dist/presentation/routes/list-provisioner-tokens.js.map +1 -0
  266. package/dist/presentation/routes/mint-registration-tokens.d.ts +2 -0
  267. package/dist/presentation/routes/mint-registration-tokens.d.ts.map +1 -0
  268. package/dist/presentation/routes/mint-registration-tokens.js +74 -0
  269. package/dist/presentation/routes/mint-registration-tokens.js.map +1 -0
  270. package/dist/presentation/routes/poll-demand.d.ts +2 -0
  271. package/dist/presentation/routes/poll-demand.d.ts.map +1 -0
  272. package/dist/presentation/routes/poll-demand.js +53 -0
  273. package/dist/presentation/routes/poll-demand.js.map +1 -0
  274. package/dist/presentation/routes/rate-limit.d.ts +4 -0
  275. package/dist/presentation/routes/rate-limit.d.ts.map +1 -0
  276. package/dist/presentation/routes/rate-limit.js +94 -0
  277. package/dist/presentation/routes/rate-limit.js.map +1 -0
  278. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +2 -0
  279. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +1 -0
  280. package/dist/presentation/routes/reconcile-provisioned-runners.js +27 -0
  281. package/dist/presentation/routes/reconcile-provisioned-runners.js.map +1 -0
  282. package/dist/presentation/routes/register.d.ts +2 -0
  283. package/dist/presentation/routes/register.d.ts.map +1 -0
  284. package/dist/presentation/routes/register.js +63 -0
  285. package/dist/presentation/routes/register.js.map +1 -0
  286. package/dist/presentation/routes/report-provisioned-runners.d.ts +2 -0
  287. package/dist/presentation/routes/report-provisioned-runners.d.ts.map +1 -0
  288. package/dist/presentation/routes/report-provisioned-runners.js +37 -0
  289. package/dist/presentation/routes/report-provisioned-runners.js.map +1 -0
  290. package/dist/presentation/routes/request-job.d.ts +2 -0
  291. package/dist/presentation/routes/request-job.d.ts.map +1 -0
  292. package/dist/presentation/routes/request-job.js +45 -0
  293. package/dist/presentation/routes/request-job.js.map +1 -0
  294. package/dist/presentation/routes/revoke-manual-registration-token.d.ts +2 -0
  295. package/dist/presentation/routes/revoke-manual-registration-token.d.ts.map +1 -0
  296. package/dist/presentation/routes/revoke-manual-registration-token.js +42 -0
  297. package/dist/presentation/routes/revoke-manual-registration-token.js.map +1 -0
  298. package/dist/presentation/routes/revoke-provisioner-token.d.ts +2 -0
  299. package/dist/presentation/routes/revoke-provisioner-token.d.ts.map +1 -0
  300. package/dist/presentation/routes/revoke-provisioner-token.js +44 -0
  301. package/dist/presentation/routes/revoke-provisioner-token.js.map +1 -0
  302. package/dist/presentation/routes/workspace-membership.d.ts +6 -0
  303. package/dist/presentation/routes/workspace-membership.d.ts.map +1 -0
  304. package/dist/presentation/routes/workspace-membership.js +6 -0
  305. package/dist/presentation/routes/workspace-membership.js.map +1 -0
  306. package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.d.ts +3 -0
  307. package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.d.ts.map +1 -0
  308. package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.js +14 -0
  309. package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.js.map +1 -0
  310. package/dist/temporal/activities/index.d.ts +9 -0
  311. package/dist/temporal/activities/index.d.ts.map +1 -0
  312. package/dist/temporal/activities/index.js +12 -0
  313. package/dist/temporal/activities/index.js.map +1 -0
  314. package/dist/temporal/activities/maintenance-activities.d.ts +31 -0
  315. package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -0
  316. package/dist/temporal/activities/maintenance-activities.js +18 -0
  317. package/dist/temporal/activities/maintenance-activities.js.map +1 -0
  318. package/dist/temporal/constants.d.ts +2 -0
  319. package/dist/temporal/constants.d.ts.map +1 -0
  320. package/dist/temporal/constants.js +3 -0
  321. package/dist/temporal/constants.js.map +1 -0
  322. package/dist/temporal/workflows/index.d.ts +2 -0
  323. package/dist/temporal/workflows/index.d.ts.map +1 -0
  324. package/dist/temporal/workflows/index.js +3 -0
  325. package/dist/temporal/workflows/index.js.map +1 -0
  326. package/dist/temporal/workflows/stuck-job-detector.d.ts +2 -0
  327. package/dist/temporal/workflows/stuck-job-detector.d.ts.map +1 -0
  328. package/dist/temporal/workflows/stuck-job-detector.js +61 -0
  329. package/dist/temporal/workflows/stuck-job-detector.js.map +1 -0
  330. package/dist/tsconfig.test.tsbuildinfo +1 -0
  331. package/drizzle/0000_initial.sql +185 -0
  332. package/drizzle/meta/0000_snapshot.json +1582 -0
  333. package/drizzle/meta/_journal.json +13 -0
  334. package/drizzle.config.ts +7 -0
  335. package/package.json +82 -0
  336. package/src/config.test.ts +374 -0
  337. package/src/config.ts +330 -0
  338. package/src/core/demand.test.ts +301 -0
  339. package/src/core/demand.ts +239 -0
  340. package/src/core/entities/ephemeral-registration-token.ts +13 -0
  341. package/src/core/entities/manual-registration-token.ts +11 -0
  342. package/src/core/entities/provisioned-runner.ts +30 -0
  343. package/src/core/entities/provisioner-token.ts +16 -0
  344. package/src/core/entities/reservation.ts +9 -0
  345. package/src/core/entities/runner-session.ts +18 -0
  346. package/src/core/ephemeral-registration-tokens.test.ts +108 -0
  347. package/src/core/ephemeral-registration-tokens.ts +112 -0
  348. package/src/core/errors.ts +128 -0
  349. package/src/core/index.ts +56 -0
  350. package/src/core/job-executions.ts +47 -0
  351. package/src/core/maintenance-policy.ts +1 -0
  352. package/src/core/maintenance.test.ts +251 -0
  353. package/src/core/maintenance.ts +74 -0
  354. package/src/core/manual-registration-tokens.test.ts +44 -0
  355. package/src/core/manual-registration-tokens.ts +51 -0
  356. package/src/core/provisioned-runners.test.ts +101 -0
  357. package/src/core/provisioned-runners.ts +301 -0
  358. package/src/core/provisioner-tokens.test.ts +61 -0
  359. package/src/core/provisioner-tokens.ts +61 -0
  360. package/src/core/rate-limit.test.ts +158 -0
  361. package/src/core/rate-limit.ts +121 -0
  362. package/src/core/runner-sessions.test.ts +209 -0
  363. package/src/core/runner-sessions.ts +66 -0
  364. package/src/core/runner-tool-capabilities.test.ts +141 -0
  365. package/src/core/runner-tool-capabilities.ts +75 -0
  366. package/src/db/db.ts +38 -0
  367. package/src/db/ephemeral-registration-tokens.test.ts +332 -0
  368. package/src/db/ephemeral-registration-tokens.ts +348 -0
  369. package/src/db/index.ts +90 -0
  370. package/src/db/job-executions.test.ts +1500 -0
  371. package/src/db/job-executions.ts +647 -0
  372. package/src/db/manual-registration-tokens.test.ts +99 -0
  373. package/src/db/manual-registration-tokens.ts +87 -0
  374. package/src/db/provisioned-runners.test.ts +1812 -0
  375. package/src/db/provisioned-runners.ts +886 -0
  376. package/src/db/provisioner-tokens.test.ts +133 -0
  377. package/src/db/provisioner-tokens.ts +142 -0
  378. package/src/db/rate-limits.test.ts +74 -0
  379. package/src/db/rate-limits.ts +69 -0
  380. package/src/db/reservations.test.ts +399 -0
  381. package/src/db/reservations.ts +296 -0
  382. package/src/db/runner-sessions.test.ts +153 -0
  383. package/src/db/runner-sessions.ts +97 -0
  384. package/src/db/schema/common.ts +3 -0
  385. package/src/db/schema/ephemeral-registration-tokens.ts +58 -0
  386. package/src/db/schema/manual-registration-tokens.ts +40 -0
  387. package/src/db/schema/outbox.ts +4 -0
  388. package/src/db/schema/pending-job-executions.ts +25 -0
  389. package/src/db/schema/provisioned-runners.ts +89 -0
  390. package/src/db/schema/provisioner-tokens.ts +50 -0
  391. package/src/db/schema/rate-limits.ts +27 -0
  392. package/src/db/schema/reservations.ts +38 -0
  393. package/src/db/schema/runner-sessions.ts +77 -0
  394. package/src/db/schema/running-job-executions.ts +50 -0
  395. package/src/index.ts +63 -0
  396. package/src/metrics/index.ts +13 -0
  397. package/src/metrics/instance.ts +115 -0
  398. package/src/metrics/service.ts +22 -0
  399. package/src/presentation/auth/index.ts +6 -0
  400. package/src/presentation/auth/provisioner-token-auth.ts +76 -0
  401. package/src/presentation/auth/runner-registration-token-auth.ts +105 -0
  402. package/src/presentation/dto/active-provisioner.ts +15 -0
  403. package/src/presentation/dto/index.ts +13 -0
  404. package/src/presentation/dto/manual-registration-token.ts +23 -0
  405. package/src/presentation/dto/mint-registration-tokens.ts +35 -0
  406. package/src/presentation/dto/poll-demand.ts +20 -0
  407. package/src/presentation/dto/provisioned-runners.ts +88 -0
  408. package/src/presentation/dto/provisioner-token.ts +29 -0
  409. package/src/presentation/index.ts +6 -0
  410. package/src/presentation/routes/create-manual-registration-token.ts +43 -0
  411. package/src/presentation/routes/create-provisioner-token.ts +41 -0
  412. package/src/presentation/routes/get-provisioner-me.ts +22 -0
  413. package/src/presentation/routes/heartbeat.test.ts +325 -0
  414. package/src/presentation/routes/heartbeat.ts +80 -0
  415. package/src/presentation/routes/index.ts +86 -0
  416. package/src/presentation/routes/list-active-provisioners.ts +25 -0
  417. package/src/presentation/routes/list-active-runners.test.ts +366 -0
  418. package/src/presentation/routes/list-active-runners.ts +25 -0
  419. package/src/presentation/routes/list-manual-registration-tokens.ts +25 -0
  420. package/src/presentation/routes/list-provisioner-tokens.ts +25 -0
  421. package/src/presentation/routes/manual-registration-tokens.test.ts +213 -0
  422. package/src/presentation/routes/mint-registration-tokens.test.ts +453 -0
  423. package/src/presentation/routes/mint-registration-tokens.ts +82 -0
  424. package/src/presentation/routes/poll-demand-release.test.ts +80 -0
  425. package/src/presentation/routes/poll-demand.test.ts +323 -0
  426. package/src/presentation/routes/poll-demand.ts +56 -0
  427. package/src/presentation/routes/provisioner-me.test.ts +172 -0
  428. package/src/presentation/routes/provisioner-tokens.test.ts +219 -0
  429. package/src/presentation/routes/rate-limit.ts +115 -0
  430. package/src/presentation/routes/reconcile-provisioned-runners.test.ts +380 -0
  431. package/src/presentation/routes/reconcile-provisioned-runners.ts +30 -0
  432. package/src/presentation/routes/register.test.ts +453 -0
  433. package/src/presentation/routes/register.ts +75 -0
  434. package/src/presentation/routes/report-provisioned-runners.test.ts +249 -0
  435. package/src/presentation/routes/report-provisioned-runners.ts +40 -0
  436. package/src/presentation/routes/request-job.test.ts +222 -0
  437. package/src/presentation/routes/request-job.ts +47 -0
  438. package/src/presentation/routes/revoke-manual-registration-token.ts +35 -0
  439. package/src/presentation/routes/revoke-provisioner-token.ts +37 -0
  440. package/src/presentation/routes/workspace-membership.ts +9 -0
  441. package/src/presentation/subscribers/on-workflows-job-execution-timed-out.test.ts +147 -0
  442. package/src/presentation/subscribers/on-workflows-job-execution-timed-out.ts +17 -0
  443. package/src/temporal/activities/index.ts +17 -0
  444. package/src/temporal/activities/maintenance-activities.test.ts +104 -0
  445. package/src/temporal/activities/maintenance-activities.ts +41 -0
  446. package/src/temporal/constants.ts +1 -0
  447. package/src/temporal/workflows/index.ts +1 -0
  448. package/src/temporal/workflows/stuck-job-detector.test.ts +93 -0
  449. package/src/temporal/workflows/stuck-job-detector.ts +67 -0
  450. package/test/env.ts +11 -0
  451. package/test/factories/ephemeral-registration-token.ts +41 -0
  452. package/test/factories/manual-registration-token.ts +37 -0
  453. package/test/factories/pending-job.ts +44 -0
  454. package/test/factories/provisioned-runner.ts +78 -0
  455. package/test/factories/provisioner-token.ts +41 -0
  456. package/test/factories/reservation.ts +33 -0
  457. package/test/factories/runner-session.ts +32 -0
  458. package/test/globalSetup.ts +23 -0
  459. package/test/index.ts +16 -0
  460. package/test/setup.ts +17 -0
  461. package/tsconfig.build.json +9 -0
  462. package/tsconfig.build.tsbuildinfo +1 -0
  463. package/tsconfig.json +3 -0
  464. package/tsconfig.test.json +8 -0
  465. package/vitest.config.ts +14 -0
@@ -0,0 +1,74 @@
1
+ import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
+ import { mintRegistrationTokensBatchBodySchema, mintRegistrationTokensBatchResponseSchema } from '@shipfox/api-runners-dto';
3
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
+ import { config } from '#config.js';
5
+ import { mintEphemeralRegistrationTokensBatch } from '#core/ephemeral-registration-tokens.js';
6
+ import { ActiveEphemeralRegistrationTokensExistError, RegistrationTokenBatchExceedsReservationError, RegistrationTokenBatchTooLargeError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
7
+ import { toMintRegistrationTokensProvisionedRunners, toMintRegistrationTokensResponseDto } from '#presentation/dto/index.js';
8
+ import { createProvisionerMintRateLimitPreHandler } from './rate-limit.js';
9
+ export const mintRegistrationTokensRoute = defineRoute({
10
+ method: 'POST',
11
+ path: '/runner-registration-tokens/batch',
12
+ description: 'Mint ephemeral runner registration tokens for reserved provisioned runners',
13
+ schema: {
14
+ body: mintRegistrationTokensBatchBodySchema,
15
+ response: {
16
+ 200: mintRegistrationTokensBatchResponseSchema
17
+ }
18
+ },
19
+ preHandler: createProvisionerMintRateLimitPreHandler(),
20
+ errorHandler: (error)=>{
21
+ if (error instanceof ReservationNotFoundError) {
22
+ throw new ClientError('Reservation not found', 'reservation-not-found', {
23
+ status: 404
24
+ });
25
+ }
26
+ if (error instanceof ReservationExpiredError) {
27
+ throw new ClientError('Reservation has expired', 'reservation-expired', {
28
+ status: 409
29
+ });
30
+ }
31
+ if (error instanceof RegistrationTokenBatchExceedsReservationError) {
32
+ throw new ClientError('Batch exceeds reservation count', 'batch-exceeds-reservation', {
33
+ status: 409,
34
+ details: {
35
+ requested: error.requested,
36
+ reservation_count: error.reservationCount,
37
+ already_minted: error.alreadyMinted
38
+ }
39
+ });
40
+ }
41
+ if (error instanceof ActiveEphemeralRegistrationTokensExistError) {
42
+ throw new ClientError('Registration token already active', 'registration-token-active', {
43
+ status: 409,
44
+ details: {
45
+ provisioned_runner_ids: error.provisionedRunnerIds
46
+ }
47
+ });
48
+ }
49
+ if (error instanceof RegistrationTokenBatchTooLargeError) {
50
+ throw new ClientError('Registration token batch is too large', 'batch-too-large', {
51
+ status: 400,
52
+ details: {
53
+ requested: error.requested,
54
+ max: error.max
55
+ }
56
+ });
57
+ }
58
+ throw error;
59
+ },
60
+ handler: async (request)=>{
61
+ const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
62
+ const result = await mintEphemeralRegistrationTokensBatch({
63
+ workspaceId,
64
+ provisionerId: provisionerTokenId,
65
+ reservationId: request.body.reservation_id,
66
+ provisionedRunners: toMintRegistrationTokensProvisionedRunners(request.body.provisioned_runners),
67
+ ttlSeconds: config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS,
68
+ maxBatchSize: config.REGISTRATION_TOKEN_BATCH_MAX
69
+ });
70
+ return toMintRegistrationTokensResponseDto(result);
71
+ }
72
+ });
73
+
74
+ //# sourceMappingURL=mint-registration-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/mint-registration-tokens.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n mintRegistrationTokensBatchBodySchema,\n mintRegistrationTokensBatchResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {config} from '#config.js';\nimport {mintEphemeralRegistrationTokensBatch} from '#core/ephemeral-registration-tokens.js';\nimport {\n ActiveEphemeralRegistrationTokensExistError,\n RegistrationTokenBatchExceedsReservationError,\n RegistrationTokenBatchTooLargeError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\nimport {\n toMintRegistrationTokensProvisionedRunners,\n toMintRegistrationTokensResponseDto,\n} from '#presentation/dto/index.js';\nimport {createProvisionerMintRateLimitPreHandler} from './rate-limit.js';\n\nexport const mintRegistrationTokensRoute = defineRoute({\n method: 'POST',\n path: '/runner-registration-tokens/batch',\n description: 'Mint ephemeral runner registration tokens for reserved provisioned runners',\n schema: {\n body: mintRegistrationTokensBatchBodySchema,\n response: {\n 200: mintRegistrationTokensBatchResponseSchema,\n },\n },\n preHandler: createProvisionerMintRateLimitPreHandler(),\n errorHandler: (error) => {\n if (error instanceof ReservationNotFoundError) {\n throw new ClientError('Reservation not found', 'reservation-not-found', {status: 404});\n }\n if (error instanceof ReservationExpiredError) {\n throw new ClientError('Reservation has expired', 'reservation-expired', {status: 409});\n }\n if (error instanceof RegistrationTokenBatchExceedsReservationError) {\n throw new ClientError('Batch exceeds reservation count', 'batch-exceeds-reservation', {\n status: 409,\n details: {\n requested: error.requested,\n reservation_count: error.reservationCount,\n already_minted: error.alreadyMinted,\n },\n });\n }\n if (error instanceof ActiveEphemeralRegistrationTokensExistError) {\n throw new ClientError('Registration token already active', 'registration-token-active', {\n status: 409,\n details: {provisioned_runner_ids: error.provisionedRunnerIds},\n });\n }\n if (error instanceof RegistrationTokenBatchTooLargeError) {\n throw new ClientError('Registration token batch is too large', 'batch-too-large', {\n status: 400,\n details: {\n requested: error.requested,\n max: error.max,\n },\n });\n }\n throw error;\n },\n handler: async (request) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const result = await mintEphemeralRegistrationTokensBatch({\n workspaceId,\n provisionerId: provisionerTokenId,\n reservationId: request.body.reservation_id,\n provisionedRunners: toMintRegistrationTokensProvisionedRunners(\n request.body.provisioned_runners,\n ),\n ttlSeconds: config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS,\n maxBatchSize: config.REGISTRATION_TOKEN_BATCH_MAX,\n });\n\n return toMintRegistrationTokensResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","mintRegistrationTokensBatchBodySchema","mintRegistrationTokensBatchResponseSchema","ClientError","defineRoute","config","mintEphemeralRegistrationTokensBatch","ActiveEphemeralRegistrationTokensExistError","RegistrationTokenBatchExceedsReservationError","RegistrationTokenBatchTooLargeError","ReservationExpiredError","ReservationNotFoundError","toMintRegistrationTokensProvisionedRunners","toMintRegistrationTokensResponseDto","createProvisionerMintRateLimitPreHandler","mintRegistrationTokensRoute","method","path","description","schema","body","response","preHandler","errorHandler","error","status","details","requested","reservation_count","reservationCount","already_minted","alreadyMinted","provisioned_runner_ids","provisionedRunnerIds","max","handler","request","provisionerTokenId","workspaceId","result","provisionerId","reservationId","reservation_id","provisionedRunners","provisioned_runners","ttlSeconds","EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS","maxBatchSize","REGISTRATION_TOKEN_BATCH_MAX"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,qCAAqC,EACrCC,yCAAyC,QACpC,2BAA2B;AAClC,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,oCAAoC,QAAO,yCAAyC;AAC5F,SACEC,2CAA2C,EAC3CC,6CAA6C,EAC7CC,mCAAmC,EACnCC,uBAAuB,EACvBC,wBAAwB,QACnB,kBAAkB;AACzB,SACEC,0CAA0C,EAC1CC,mCAAmC,QAC9B,6BAA6B;AACpC,SAAQC,wCAAwC,QAAO,kBAAkB;AAEzE,OAAO,MAAMC,8BAA8BX,YAAY;IACrDY,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMnB;QACNoB,UAAU;YACR,KAAKnB;QACP;IACF;IACAoB,YAAYR;IACZS,cAAc,CAACC;QACb,IAAIA,iBAAiBb,0BAA0B;YAC7C,MAAM,IAAIR,YAAY,yBAAyB,yBAAyB;gBAACsB,QAAQ;YAAG;QACtF;QACA,IAAID,iBAAiBd,yBAAyB;YAC5C,MAAM,IAAIP,YAAY,2BAA2B,uBAAuB;gBAACsB,QAAQ;YAAG;QACtF;QACA,IAAID,iBAAiBhB,+CAA+C;YAClE,MAAM,IAAIL,YAAY,mCAAmC,6BAA6B;gBACpFsB,QAAQ;gBACRC,SAAS;oBACPC,WAAWH,MAAMG,SAAS;oBAC1BC,mBAAmBJ,MAAMK,gBAAgB;oBACzCC,gBAAgBN,MAAMO,aAAa;gBACrC;YACF;QACF;QACA,IAAIP,iBAAiBjB,6CAA6C;YAChE,MAAM,IAAIJ,YAAY,qCAAqC,6BAA6B;gBACtFsB,QAAQ;gBACRC,SAAS;oBAACM,wBAAwBR,MAAMS,oBAAoB;gBAAA;YAC9D;QACF;QACA,IAAIT,iBAAiBf,qCAAqC;YACxD,MAAM,IAAIN,YAAY,yCAAyC,mBAAmB;gBAChFsB,QAAQ;gBACRC,SAAS;oBACPC,WAAWH,MAAMG,SAAS;oBAC1BO,KAAKV,MAAMU,GAAG;gBAChB;YACF;QACF;QACA,MAAMV;IACR;IACAW,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGtC,0BAA0BoC;QACpE,MAAMG,SAAS,MAAMjC,qCAAqC;YACxDgC;YACAE,eAAeH;YACfI,eAAeL,QAAQhB,IAAI,CAACsB,cAAc;YAC1CC,oBAAoB/B,2CAClBwB,QAAQhB,IAAI,CAACwB,mBAAmB;YAElCC,YAAYxC,OAAOyC,wCAAwC;YAC3DC,cAAc1C,OAAO2C,4BAA4B;QACnD;QAEA,OAAOnC,oCAAoC0B;IAC7C;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const pollDemandRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=poll-demand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll-demand.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/poll-demand.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe,iDA6C1B,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
+ import { pollDemandBodySchema, pollDemandResponseSchema } from '@shipfox/api-runners-dto';
3
+ import { defineRoute } from '@shipfox/node-fastify';
4
+ import { config } from '#config.js';
5
+ import { pollDemand, releaseReservationGrants } from '#core/demand.js';
6
+ import { toPollDemandResponseDto } from '#presentation/dto/index.js';
7
+ 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);
30
+ }
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
+ });
52
+
53
+ //# sourceMappingURL=poll-demand.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import { type FastifyReply, type FastifyRequest } from '@shipfox/node-fastify';
2
+ export declare function createProvisionerMintRateLimitPreHandler(): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
3
+ export declare function createEphemeralRegisterRateLimitPreHandler(): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
4
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/rate-limit.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAmF1F,wBAAgB,wCAAwC,KACxC,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAY3E;AAED,wBAAgB,0CAA0C,KAC1C,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAc3E"}
@@ -0,0 +1,94 @@
1
+ import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
+ import { ClientError } from '@shipfox/node-fastify';
3
+ import { config } from '#config.js';
4
+ import { checkRunnersRateLimit, RunnersRateLimitExceededError, RunnersRateLimitUnavailableError } from '#core/rate-limit.js';
5
+ import { getRunnerContext } from '#presentation/auth/index.js';
6
+ function routeName(request) {
7
+ return request.routeOptions.url ?? request.url.split('?')[0] ?? 'unknown';
8
+ }
9
+ async function enforceRateLimit(params) {
10
+ try {
11
+ await checkRunnersRateLimit({
12
+ action: params.action,
13
+ scope: params.scope,
14
+ identifier: params.identifier,
15
+ limit: params.limit,
16
+ windowSeconds: params.windowSeconds
17
+ });
18
+ } catch (error) {
19
+ if (error instanceof RunnersRateLimitExceededError) {
20
+ params.request.log.warn({
21
+ action: error.action,
22
+ scope: error.scope,
23
+ route: routeName(params.request),
24
+ retryAfterSeconds: error.retryAfterSeconds,
25
+ identifierHmacPrefix: error.identifierHmacPrefix
26
+ }, 'Runners rate limit blocked request');
27
+ params.reply.header('Retry-After', String(error.retryAfterSeconds));
28
+ throw new ClientError('Rate limit exceeded', 'rate-limited', {
29
+ status: 429,
30
+ details: {
31
+ retry_after_seconds: error.retryAfterSeconds
32
+ },
33
+ data: {
34
+ action: error.action,
35
+ scope: error.scope,
36
+ route: routeName(params.request),
37
+ identifierHmacPrefix: error.identifierHmacPrefix
38
+ },
39
+ cause: error
40
+ });
41
+ }
42
+ if (error instanceof RunnersRateLimitUnavailableError) {
43
+ params.request.log.error({
44
+ action: error.action,
45
+ scope: error.scope,
46
+ route: routeName(params.request),
47
+ identifierHmacPrefix: error.identifierHmacPrefix,
48
+ err: error
49
+ }, 'Runners rate limiter unavailable');
50
+ throw new ClientError('Runners rate limiter unavailable', 'runners-rate-limit-unavailable', {
51
+ status: 503,
52
+ data: {
53
+ action: error.action,
54
+ scope: error.scope,
55
+ route: routeName(params.request),
56
+ identifierHmacPrefix: error.identifierHmacPrefix
57
+ },
58
+ cause: error
59
+ });
60
+ }
61
+ throw error;
62
+ }
63
+ }
64
+ export function createProvisionerMintRateLimitPreHandler() {
65
+ return async (request, reply)=>{
66
+ const { provisionerTokenId } = requireProvisionerContext(request);
67
+ await enforceRateLimit({
68
+ request,
69
+ reply,
70
+ action: 'provisioner-mint',
71
+ scope: 'provisioner',
72
+ identifier: provisionerTokenId,
73
+ limit: config.PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS,
74
+ windowSeconds: config.PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS
75
+ });
76
+ };
77
+ }
78
+ export function createEphemeralRegisterRateLimitPreHandler() {
79
+ return async (request, reply)=>{
80
+ const runner = getRunnerContext(request);
81
+ if (runner.kind !== 'ephemeral') return;
82
+ await enforceRateLimit({
83
+ request,
84
+ reply,
85
+ action: 'ephemeral-register',
86
+ scope: 'ephemeral-token',
87
+ identifier: runner.ephemeralTokenId,
88
+ limit: config.EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS,
89
+ windowSeconds: config.EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS
90
+ });
91
+ };
92
+ }
93
+
94
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/rate-limit.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {ClientError, type FastifyReply, type FastifyRequest} from '@shipfox/node-fastify';\nimport {config} from '#config.js';\nimport {\n checkRunnersRateLimit,\n RunnersRateLimitExceededError,\n RunnersRateLimitUnavailableError,\n} from '#core/rate-limit.js';\nimport {getRunnerContext} from '#presentation/auth/index.js';\n\nfunction routeName(request: FastifyRequest): string {\n return request.routeOptions.url ?? request.url.split('?')[0] ?? 'unknown';\n}\n\nasync function enforceRateLimit(params: {\n request: FastifyRequest;\n reply: FastifyReply;\n action: 'provisioner-mint' | 'ephemeral-register';\n scope: 'provisioner' | 'ephemeral-token';\n identifier: string;\n limit: number;\n windowSeconds: number;\n}): Promise<void> {\n try {\n await checkRunnersRateLimit({\n action: params.action,\n scope: params.scope,\n identifier: params.identifier,\n limit: params.limit,\n windowSeconds: params.windowSeconds,\n });\n } catch (error) {\n if (error instanceof RunnersRateLimitExceededError) {\n params.request.log.warn(\n {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n retryAfterSeconds: error.retryAfterSeconds,\n identifierHmacPrefix: error.identifierHmacPrefix,\n },\n 'Runners rate limit blocked request',\n );\n params.reply.header('Retry-After', String(error.retryAfterSeconds));\n throw new ClientError('Rate limit exceeded', 'rate-limited', {\n status: 429,\n details: {retry_after_seconds: error.retryAfterSeconds},\n data: {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n identifierHmacPrefix: error.identifierHmacPrefix,\n },\n cause: error,\n });\n }\n\n if (error instanceof RunnersRateLimitUnavailableError) {\n params.request.log.error(\n {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n identifierHmacPrefix: error.identifierHmacPrefix,\n err: error,\n },\n 'Runners rate limiter unavailable',\n );\n throw new ClientError('Runners rate limiter unavailable', 'runners-rate-limit-unavailable', {\n status: 503,\n data: {\n action: error.action,\n scope: error.scope,\n route: routeName(params.request),\n identifierHmacPrefix: error.identifierHmacPrefix,\n },\n cause: error,\n });\n }\n\n throw error;\n }\n}\n\nexport function createProvisionerMintRateLimitPreHandler() {\n return async (request: FastifyRequest, reply: FastifyReply): Promise<void> => {\n const {provisionerTokenId} = requireProvisionerContext(request);\n await enforceRateLimit({\n request,\n reply,\n action: 'provisioner-mint',\n scope: 'provisioner',\n identifier: provisionerTokenId,\n limit: config.PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS,\n windowSeconds: config.PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS,\n });\n };\n}\n\nexport function createEphemeralRegisterRateLimitPreHandler() {\n return async (request: FastifyRequest, reply: FastifyReply): Promise<void> => {\n const runner = getRunnerContext(request);\n if (runner.kind !== 'ephemeral') return;\n\n await enforceRateLimit({\n request,\n reply,\n action: 'ephemeral-register',\n scope: 'ephemeral-token',\n identifier: runner.ephemeralTokenId,\n limit: config.EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS,\n windowSeconds: config.EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS,\n });\n };\n}\n"],"names":["requireProvisionerContext","ClientError","config","checkRunnersRateLimit","RunnersRateLimitExceededError","RunnersRateLimitUnavailableError","getRunnerContext","routeName","request","routeOptions","url","split","enforceRateLimit","params","action","scope","identifier","limit","windowSeconds","error","log","warn","route","retryAfterSeconds","identifierHmacPrefix","reply","header","String","status","details","retry_after_seconds","data","cause","err","createProvisionerMintRateLimitPreHandler","provisionerTokenId","PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS","PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS","createEphemeralRegisterRateLimitPreHandler","runner","kind","ephemeralTokenId","EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS","EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SAAQC,WAAW,QAA+C,wBAAwB;AAC1F,SAAQC,MAAM,QAAO,aAAa;AAClC,SACEC,qBAAqB,EACrBC,6BAA6B,EAC7BC,gCAAgC,QAC3B,sBAAsB;AAC7B,SAAQC,gBAAgB,QAAO,8BAA8B;AAE7D,SAASC,UAAUC,OAAuB;IACxC,OAAOA,QAAQC,YAAY,CAACC,GAAG,IAAIF,QAAQE,GAAG,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI;AAClE;AAEA,eAAeC,iBAAiBC,MAQ/B;IACC,IAAI;QACF,MAAMV,sBAAsB;YAC1BW,QAAQD,OAAOC,MAAM;YACrBC,OAAOF,OAAOE,KAAK;YACnBC,YAAYH,OAAOG,UAAU;YAC7BC,OAAOJ,OAAOI,KAAK;YACnBC,eAAeL,OAAOK,aAAa;QACrC;IACF,EAAE,OAAOC,OAAO;QACd,IAAIA,iBAAiBf,+BAA+B;YAClDS,OAAOL,OAAO,CAACY,GAAG,CAACC,IAAI,CACrB;gBACEP,QAAQK,MAAML,MAAM;gBACpBC,OAAOI,MAAMJ,KAAK;gBAClBO,OAAOf,UAAUM,OAAOL,OAAO;gBAC/Be,mBAAmBJ,MAAMI,iBAAiB;gBAC1CC,sBAAsBL,MAAMK,oBAAoB;YAClD,GACA;YAEFX,OAAOY,KAAK,CAACC,MAAM,CAAC,eAAeC,OAAOR,MAAMI,iBAAiB;YACjE,MAAM,IAAItB,YAAY,uBAAuB,gBAAgB;gBAC3D2B,QAAQ;gBACRC,SAAS;oBAACC,qBAAqBX,MAAMI,iBAAiB;gBAAA;gBACtDQ,MAAM;oBACJjB,QAAQK,MAAML,MAAM;oBACpBC,OAAOI,MAAMJ,KAAK;oBAClBO,OAAOf,UAAUM,OAAOL,OAAO;oBAC/BgB,sBAAsBL,MAAMK,oBAAoB;gBAClD;gBACAQ,OAAOb;YACT;QACF;QAEA,IAAIA,iBAAiBd,kCAAkC;YACrDQ,OAAOL,OAAO,CAACY,GAAG,CAACD,KAAK,CACtB;gBACEL,QAAQK,MAAML,MAAM;gBACpBC,OAAOI,MAAMJ,KAAK;gBAClBO,OAAOf,UAAUM,OAAOL,OAAO;gBAC/BgB,sBAAsBL,MAAMK,oBAAoB;gBAChDS,KAAKd;YACP,GACA;YAEF,MAAM,IAAIlB,YAAY,oCAAoC,kCAAkC;gBAC1F2B,QAAQ;gBACRG,MAAM;oBACJjB,QAAQK,MAAML,MAAM;oBACpBC,OAAOI,MAAMJ,KAAK;oBAClBO,OAAOf,UAAUM,OAAOL,OAAO;oBAC/BgB,sBAAsBL,MAAMK,oBAAoB;gBAClD;gBACAQ,OAAOb;YACT;QACF;QAEA,MAAMA;IACR;AACF;AAEA,OAAO,SAASe;IACd,OAAO,OAAO1B,SAAyBiB;QACrC,MAAM,EAACU,kBAAkB,EAAC,GAAGnC,0BAA0BQ;QACvD,MAAMI,iBAAiB;YACrBJ;YACAiB;YACAX,QAAQ;YACRC,OAAO;YACPC,YAAYmB;YACZlB,OAAOf,OAAOkC,wCAAwC;YACtDlB,eAAehB,OAAOmC,0CAA0C;QAClE;IACF;AACF;AAEA,OAAO,SAASC;IACd,OAAO,OAAO9B,SAAyBiB;QACrC,MAAMc,SAASjC,iBAAiBE;QAChC,IAAI+B,OAAOC,IAAI,KAAK,aAAa;QAEjC,MAAM5B,iBAAiB;YACrBJ;YACAiB;YACAX,QAAQ;YACRC,OAAO;YACPC,YAAYuB,OAAOE,gBAAgB;YACnCxB,OAAOf,OAAOwC,0CAA0C;YACxDxB,eAAehB,OAAOyC,4CAA4C;QACpE;IACF;AACF"}
@@ -0,0 +1,2 @@
1
+ export declare const reconcileProvisionedRunnersRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=reconcile-provisioned-runners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-provisioned-runners.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/reconcile-provisioned-runners.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gCAAgC,iDAoB3C,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
+ import { reconcileProvisionedRunnersBodySchema, reconcileProvisionedRunnersResponseSchema } from '@shipfox/api-runners-dto';
3
+ import { defineRoute } from '@shipfox/node-fastify';
4
+ import { reconcileProvisionedRunners } from '#core/index.js';
5
+ import { toReconcileProvisionedRunnersResponseDto } from '#presentation/dto/index.js';
6
+ export const reconcileProvisionedRunnersRoute = defineRoute({
7
+ method: 'POST',
8
+ path: '/provisioned-runners/reconcile',
9
+ description: 'Reconcile provisioned runner state for a provisioner',
10
+ schema: {
11
+ body: reconcileProvisionedRunnersBodySchema,
12
+ response: {
13
+ 200: reconcileProvisionedRunnersResponseSchema
14
+ }
15
+ },
16
+ handler: async (request)=>{
17
+ const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
18
+ const result = await reconcileProvisionedRunners({
19
+ workspaceId,
20
+ provisionerId: provisionerTokenId,
21
+ observedProvisionedRunnerIds: request.body.observed_provisioned_runner_ids
22
+ });
23
+ return toReconcileProvisionedRunnersResponseDto(result);
24
+ }
25
+ });
26
+
27
+ //# sourceMappingURL=reconcile-provisioned-runners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/reconcile-provisioned-runners.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n reconcileProvisionedRunnersBodySchema,\n reconcileProvisionedRunnersResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {reconcileProvisionedRunners} from '#core/index.js';\nimport {toReconcileProvisionedRunnersResponseDto} from '#presentation/dto/index.js';\n\nexport const reconcileProvisionedRunnersRoute = defineRoute({\n method: 'POST',\n path: '/provisioned-runners/reconcile',\n description: 'Reconcile provisioned runner state for a provisioner',\n schema: {\n body: reconcileProvisionedRunnersBodySchema,\n response: {\n 200: reconcileProvisionedRunnersResponseSchema,\n },\n },\n handler: async (request) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const result = await reconcileProvisionedRunners({\n workspaceId,\n provisionerId: provisionerTokenId,\n observedProvisionedRunnerIds: request.body.observed_provisioned_runner_ids,\n });\n\n return toReconcileProvisionedRunnersResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","reconcileProvisionedRunnersBodySchema","reconcileProvisionedRunnersResponseSchema","defineRoute","reconcileProvisionedRunners","toReconcileProvisionedRunnersResponseDto","reconcileProvisionedRunnersRoute","method","path","description","schema","body","response","handler","request","provisionerTokenId","workspaceId","result","provisionerId","observedProvisionedRunnerIds","observed_provisioned_runner_ids"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,qCAAqC,EACrCC,yCAAyC,QACpC,2BAA2B;AAClC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,2BAA2B,QAAO,iBAAiB;AAC3D,SAAQC,wCAAwC,QAAO,6BAA6B;AAEpF,OAAO,MAAMC,mCAAmCH,YAAY;IAC1DI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGhB,0BAA0Bc;QACpE,MAAMG,SAAS,MAAMb,4BAA4B;YAC/CY;YACAE,eAAeH;YACfI,8BAA8BL,QAAQH,IAAI,CAACS,+BAA+B;QAC5E;QAEA,OAAOf,yCAAyCY;IAClD;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const registerRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/register.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa,iDA+DxB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { registerRunnerBodySchema, registerRunnerResponseSchema } from '@shipfox/api-runners-dto';
2
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
3
+ import { EmptyRunnerLabelsError, RegistrationTokenConsumedError, RegistrationTokenExpiredError } from '#core/errors.js';
4
+ import { registerRunnerSession } from '#core/runner-sessions.js';
5
+ import { getRunnerContext } from '#presentation/auth/index.js';
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');
31
+ }
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
39
+ });
40
+ }
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
+ });
62
+
63
+ //# sourceMappingURL=register.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ export declare const reportProvisionedRunnersRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=report-provisioned-runners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-provisioned-runners.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/report-provisioned-runners.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,6BAA6B,iDA8BxC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { requireProvisionerContext } from '@shipfox/api-auth-context';
2
+ import { reportProvisionedRunnersBodySchema, reportProvisionedRunnersResponseSchema } from '@shipfox/api-runners-dto';
3
+ import { defineRoute } from '@shipfox/node-fastify';
4
+ import { reportProvisionedRunners } from '#core/index.js';
5
+ import { toReportProvisionedRunnersResponseDto } from '#presentation/dto/index.js';
6
+ export const reportProvisionedRunnersRoute = defineRoute({
7
+ method: 'POST',
8
+ path: '/provisioned-runners/report',
9
+ description: 'Report provisioned runner lifecycle state',
10
+ schema: {
11
+ body: reportProvisionedRunnersBodySchema,
12
+ response: {
13
+ 200: reportProvisionedRunnersResponseSchema
14
+ }
15
+ },
16
+ handler: async (request)=>{
17
+ const { provisionerTokenId, workspaceId } = requireProvisionerContext(request);
18
+ const result = await reportProvisionedRunners({
19
+ workspaceId,
20
+ provisionerId: provisionerTokenId,
21
+ events: request.body.events.map((event)=>({
22
+ provisionedRunnerId: event.provisioned_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 toReportProvisionedRunnersResponseDto(result);
34
+ }
35
+ });
36
+
37
+ //# sourceMappingURL=report-provisioned-runners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/report-provisioned-runners.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n reportProvisionedRunnersBodySchema,\n reportProvisionedRunnersResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {reportProvisionedRunners} from '#core/index.js';\nimport {toReportProvisionedRunnersResponseDto} from '#presentation/dto/index.js';\n\nexport const reportProvisionedRunnersRoute = defineRoute({\n method: 'POST',\n path: '/provisioned-runners/report',\n description: 'Report provisioned runner lifecycle state',\n schema: {\n body: reportProvisionedRunnersBodySchema,\n response: {\n 200: reportProvisionedRunnersResponseSchema,\n },\n },\n handler: async (request) => {\n const {provisionerTokenId, workspaceId} = requireProvisionerContext(request);\n const result = await reportProvisionedRunners({\n workspaceId,\n provisionerId: provisionerTokenId,\n events: request.body.events.map((event) => ({\n provisionedRunnerId: event.provisioned_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 toReportProvisionedRunnersResponseDto(result);\n },\n});\n"],"names":["requireProvisionerContext","reportProvisionedRunnersBodySchema","reportProvisionedRunnersResponseSchema","defineRoute","reportProvisionedRunners","toReportProvisionedRunnersResponseDto","reportProvisionedRunnersRoute","method","path","description","schema","body","response","handler","request","provisionerTokenId","workspaceId","result","provisionerId","events","map","event","provisionedRunnerId","provisioned_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,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,MAAM,EAACC,kBAAkB,EAAEC,WAAW,EAAC,GAAGhB,0BAA0Bc;QACpE,MAAMG,SAAS,MAAMb,yBAAyB;YAC5CY;YACAE,eAAeH;YACfI,QAAQL,QAAQH,IAAI,CAACQ,MAAM,CAACC,GAAG,CAAC,CAACC,QAAW,CAAA;oBAC1CC,qBAAqBD,MAAME,qBAAqB;oBAChDC,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,OAAOhC,sCAAsCY;IAC/C;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const requestJobRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=request-job.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,45 @@
1
+ import { requireRunnerSessionContext } from '@shipfox/api-auth-context';
2
+ import { claimedJobResponseSchema } from '@shipfox/api-runners-dto';
3
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
+ import { RunnerSessionExhaustedError } from '#core/errors.js';
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
19
+ });
20
+ }
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
+ });
44
+
45
+ //# sourceMappingURL=request-job.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ export declare const revokeManualRegistrationTokenRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=revoke-manual-registration-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke-manual-registration-token.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/revoke-manual-registration-token.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kCAAkC,iDAwB7C,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { revokeManualRegistrationTokenResponseSchema } from '@shipfox/api-runners-dto';
2
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
3
+ import { z } from 'zod';
4
+ import { ManualRegistrationTokenNotFoundError, revokeWorkspaceManualRegistrationToken } from '#core/index.js';
5
+ import { toManualRegistrationTokenDto } from '#presentation/dto/index.js';
6
+ import { requireManualRegistrationTokenWorkspaceMembership } from './workspace-membership.js';
7
+ export const revokeManualRegistrationTokenRoute = defineRoute({
8
+ method: 'POST',
9
+ path: '/:tokenId/revoke',
10
+ description: 'Stop a manual registration token from being used to connect to your account',
11
+ schema: {
12
+ params: z.object({
13
+ workspaceId: z.string().uuid(),
14
+ tokenId: z.string().uuid()
15
+ }),
16
+ response: {
17
+ 200: revokeManualRegistrationTokenResponseSchema
18
+ }
19
+ },
20
+ errorHandler: (error)=>{
21
+ if (error instanceof ManualRegistrationTokenNotFoundError) {
22
+ throw new ClientError('Manual registration token not found', 'not-found', {
23
+ status: 404
24
+ });
25
+ }
26
+ throw error;
27
+ },
28
+ handler: async (request)=>{
29
+ const { workspaceId, tokenId } = request.params;
30
+ requireManualRegistrationTokenWorkspaceMembership({
31
+ request,
32
+ workspaceId
33
+ });
34
+ const revoked = await revokeWorkspaceManualRegistrationToken({
35
+ tokenId,
36
+ workspaceId
37
+ });
38
+ return toManualRegistrationTokenDto(revoked);
39
+ }
40
+ });
41
+
42
+ //# sourceMappingURL=revoke-manual-registration-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/routes/revoke-manual-registration-token.ts"],"sourcesContent":["import {revokeManualRegistrationTokenResponseSchema} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {\n ManualRegistrationTokenNotFoundError,\n revokeWorkspaceManualRegistrationToken,\n} from '#core/index.js';\nimport {toManualRegistrationTokenDto} from '#presentation/dto/index.js';\nimport {requireManualRegistrationTokenWorkspaceMembership} from './workspace-membership.js';\n\nexport const revokeManualRegistrationTokenRoute = defineRoute({\n method: 'POST',\n path: '/:tokenId/revoke',\n description: 'Stop a manual registration token from being used to connect to your account',\n schema: {\n params: z.object({workspaceId: z.string().uuid(), tokenId: z.string().uuid()}),\n response: {\n 200: revokeManualRegistrationTokenResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof ManualRegistrationTokenNotFoundError) {\n throw new ClientError('Manual registration token not found', 'not-found', {status: 404});\n }\n throw error;\n },\n handler: async (request) => {\n const {workspaceId, tokenId} = request.params;\n requireManualRegistrationTokenWorkspaceMembership({request, workspaceId});\n\n const revoked = await revokeWorkspaceManualRegistrationToken({tokenId, workspaceId});\n\n return toManualRegistrationTokenDto(revoked);\n },\n});\n"],"names":["revokeManualRegistrationTokenResponseSchema","ClientError","defineRoute","z","ManualRegistrationTokenNotFoundError","revokeWorkspaceManualRegistrationToken","toManualRegistrationTokenDto","requireManualRegistrationTokenWorkspaceMembership","revokeManualRegistrationTokenRoute","method","path","description","schema","params","object","workspaceId","string","uuid","tokenId","response","errorHandler","error","status","handler","request","revoked"],"mappings":"AAAA,SAAQA,2CAA2C,QAAO,2BAA2B;AACrF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SACEC,oCAAoC,EACpCC,sCAAsC,QACjC,iBAAiB;AACxB,SAAQC,4BAA4B,QAAO,6BAA6B;AACxE,SAAQC,iDAAiD,QAAO,4BAA4B;AAE5F,OAAO,MAAMC,qCAAqCN,YAAY;IAC5DO,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,QAAQV,EAAEW,MAAM,CAAC;YAACC,aAAaZ,EAAEa,MAAM,GAAGC,IAAI;YAAIC,SAASf,EAAEa,MAAM,GAAGC,IAAI;QAAE;QAC5EE,UAAU;YACR,KAAKnB;QACP;IACF;IACAoB,cAAc,CAACC;QACb,IAAIA,iBAAiBjB,sCAAsC;YACzD,MAAM,IAAIH,YAAY,uCAAuC,aAAa;gBAACqB,QAAQ;YAAG;QACxF;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC;QACd,MAAM,EAACT,WAAW,EAAEG,OAAO,EAAC,GAAGM,QAAQX,MAAM;QAC7CN,kDAAkD;YAACiB;YAAST;QAAW;QAEvE,MAAMU,UAAU,MAAMpB,uCAAuC;YAACa;YAASH;QAAW;QAElF,OAAOT,6BAA6BmB;IACtC;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const revokeProvisionerTokenRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=revoke-provisioner-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke-provisioner-token.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/revoke-provisioner-token.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,2BAA2B,iDA6BtC,CAAC"}