@shipfox/api-runners 5.0.0 → 7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/CHANGELOG.md +80 -0
  3. package/dist/config.d.ts +5 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +54 -7
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/demand.d.ts +6 -6
  8. package/dist/core/demand.d.ts.map +1 -1
  9. package/dist/core/demand.js +10 -10
  10. package/dist/core/demand.js.map +1 -1
  11. package/dist/core/entities/ephemeral-registration-token.d.ts +1 -1
  12. package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -1
  13. package/dist/core/entities/ephemeral-registration-token.js.map +1 -1
  14. package/dist/core/entities/provisioner-capability-snapshot.d.ts +13 -0
  15. package/dist/core/entities/provisioner-capability-snapshot.d.ts.map +1 -0
  16. package/dist/core/entities/provisioner-capability-snapshot.js +3 -0
  17. package/dist/core/entities/provisioner-capability-snapshot.js.map +1 -0
  18. package/dist/core/entities/provisioner-token.d.ts +10 -2
  19. package/dist/core/entities/provisioner-token.d.ts.map +1 -1
  20. package/dist/core/entities/provisioner-token.js.map +1 -1
  21. package/dist/core/entities/{provisioned-runner.d.ts → runner-instance.d.ts} +7 -6
  22. package/dist/core/entities/runner-instance.d.ts.map +1 -0
  23. package/dist/core/entities/runner-instance.js +3 -0
  24. package/dist/core/entities/runner-instance.js.map +1 -0
  25. package/dist/core/entities/runner-session.d.ts +4 -2
  26. package/dist/core/entities/runner-session.d.ts.map +1 -1
  27. package/dist/core/entities/runner-session.js.map +1 -1
  28. package/dist/core/ephemeral-registration-tokens.d.ts +5 -5
  29. package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -1
  30. package/dist/core/ephemeral-registration-tokens.js +12 -12
  31. package/dist/core/ephemeral-registration-tokens.js.map +1 -1
  32. package/dist/core/errors.d.ts +16 -4
  33. package/dist/core/errors.d.ts.map +1 -1
  34. package/dist/core/errors.js +22 -4
  35. package/dist/core/errors.js.map +1 -1
  36. package/dist/core/index.d.ts +9 -5
  37. package/dist/core/index.d.ts.map +1 -1
  38. package/dist/core/index.js +6 -3
  39. package/dist/core/index.js.map +1 -1
  40. package/dist/core/job-executions.d.ts +2 -0
  41. package/dist/core/job-executions.d.ts.map +1 -1
  42. package/dist/core/job-executions.js +1 -2
  43. package/dist/core/job-executions.js.map +1 -1
  44. package/dist/core/maintenance.d.ts +1 -1
  45. package/dist/core/maintenance.d.ts.map +1 -1
  46. package/dist/core/maintenance.js +5 -5
  47. package/dist/core/maintenance.js.map +1 -1
  48. package/dist/core/provisioner-capability-snapshots.d.ts +5 -0
  49. package/dist/core/provisioner-capability-snapshots.d.ts.map +1 -0
  50. package/dist/core/provisioner-capability-snapshots.js +10 -0
  51. package/dist/core/provisioner-capability-snapshots.js.map +1 -0
  52. package/dist/core/provisioner-tokens.d.ts +10 -0
  53. package/dist/core/provisioner-tokens.d.ts.map +1 -1
  54. package/dist/core/provisioner-tokens.js +23 -1
  55. package/dist/core/provisioner-tokens.js.map +1 -1
  56. package/dist/core/rate-limit.d.ts.map +1 -1
  57. package/dist/core/rate-limit.js +2 -7
  58. package/dist/core/rate-limit.js.map +1 -1
  59. package/dist/core/runner-activation.d.ts +13 -0
  60. package/dist/core/runner-activation.d.ts.map +1 -0
  61. package/dist/core/runner-activation.js +36 -0
  62. package/dist/core/runner-activation.js.map +1 -0
  63. package/dist/core/runner-assignments.d.ts +6 -0
  64. package/dist/core/runner-assignments.d.ts.map +1 -0
  65. package/dist/core/runner-assignments.js +6 -0
  66. package/dist/core/runner-assignments.js.map +1 -0
  67. package/dist/core/runner-control-sessions.d.ts +46 -0
  68. package/dist/core/runner-control-sessions.d.ts.map +1 -0
  69. package/dist/core/runner-control-sessions.js +121 -0
  70. package/dist/core/runner-control-sessions.js.map +1 -0
  71. package/dist/core/runner-instances.d.ts +72 -0
  72. package/dist/core/runner-instances.d.ts.map +1 -0
  73. package/dist/core/runner-instances.js +165 -0
  74. package/dist/core/runner-instances.js.map +1 -0
  75. package/dist/core/runner-sessions.d.ts +8 -2
  76. package/dist/core/runner-sessions.d.ts.map +1 -1
  77. package/dist/core/runner-sessions.js +8 -5
  78. package/dist/core/runner-sessions.js.map +1 -1
  79. package/dist/db/db.d.ts +2698 -1054
  80. package/dist/db/db.d.ts.map +1 -1
  81. package/dist/db/db.js +9 -2
  82. package/dist/db/db.js.map +1 -1
  83. package/dist/db/ephemeral-registration-tokens.d.ts +2 -2
  84. package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
  85. package/dist/db/ephemeral-registration-tokens.js +21 -21
  86. package/dist/db/ephemeral-registration-tokens.js.map +1 -1
  87. package/dist/db/index.d.ts +7 -4
  88. package/dist/db/index.d.ts.map +1 -1
  89. package/dist/db/index.js +5 -2
  90. package/dist/db/index.js.map +1 -1
  91. package/dist/db/job-executions.d.ts +6 -6
  92. package/dist/db/job-executions.d.ts.map +1 -1
  93. package/dist/db/job-executions.js +20 -19
  94. package/dist/db/job-executions.js.map +1 -1
  95. package/dist/db/provisioner-capability-snapshots.d.ts +21 -0
  96. package/dist/db/provisioner-capability-snapshots.d.ts.map +1 -0
  97. package/dist/db/provisioner-capability-snapshots.js +57 -0
  98. package/dist/db/provisioner-capability-snapshots.js.map +1 -0
  99. package/dist/db/provisioner-tokens.d.ts +7 -2
  100. package/dist/db/provisioner-tokens.d.ts.map +1 -1
  101. package/dist/db/provisioner-tokens.js +59 -10
  102. package/dist/db/provisioner-tokens.js.map +1 -1
  103. package/dist/db/reservations.d.ts +18 -0
  104. package/dist/db/reservations.d.ts.map +1 -1
  105. package/dist/db/reservations.js +88 -1
  106. package/dist/db/reservations.js.map +1 -1
  107. package/dist/db/runner-assignments.d.ts +7 -0
  108. package/dist/db/runner-assignments.d.ts.map +1 -0
  109. package/dist/db/runner-assignments.js +55 -0
  110. package/dist/db/runner-assignments.js.map +1 -0
  111. package/dist/db/runner-instances.d.ts +84 -0
  112. package/dist/db/runner-instances.d.ts.map +1 -0
  113. package/dist/db/runner-instances.js +497 -0
  114. package/dist/db/runner-instances.js.map +1 -0
  115. package/dist/db/runner-sessions.d.ts +5 -0
  116. package/dist/db/runner-sessions.d.ts.map +1 -1
  117. package/dist/db/runner-sessions.js +48 -2
  118. package/dist/db/runner-sessions.js.map +1 -1
  119. package/dist/db/schema/ephemeral-registration-tokens.d.ts +2 -2
  120. package/dist/db/schema/ephemeral-registration-tokens.js +3 -3
  121. package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -1
  122. package/dist/db/schema/provisioner-capability-snapshots.d.ts +207 -0
  123. package/dist/db/schema/provisioner-capability-snapshots.d.ts.map +1 -0
  124. package/dist/db/schema/provisioner-capability-snapshots.js +38 -0
  125. package/dist/db/schema/provisioner-capability-snapshots.js.map +1 -0
  126. package/dist/db/schema/provisioner-tokens.d.ts +19 -1
  127. package/dist/db/schema/provisioner-tokens.d.ts.map +1 -1
  128. package/dist/db/schema/provisioner-tokens.js +29 -3
  129. package/dist/db/schema/provisioner-tokens.js.map +1 -1
  130. package/dist/db/schema/runner-activation-tokens.d.ts +161 -0
  131. package/dist/db/schema/runner-activation-tokens.d.ts.map +1 -0
  132. package/dist/db/schema/runner-activation-tokens.js +27 -0
  133. package/dist/db/schema/runner-activation-tokens.js.map +1 -0
  134. package/dist/db/schema/runner-control-sessions.d.ts +338 -0
  135. package/dist/db/schema/runner-control-sessions.d.ts.map +1 -0
  136. package/dist/db/schema/runner-control-sessions.js +52 -0
  137. package/dist/db/schema/runner-control-sessions.js.map +1 -0
  138. package/dist/db/schema/{provisioned-runners.d.ts → runner-instances.d.ts} +105 -34
  139. package/dist/db/schema/runner-instances.d.ts.map +1 -0
  140. package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +23 -14
  141. package/dist/db/schema/runner-instances.js.map +1 -0
  142. package/dist/db/schema/runner-sessions.d.ts +39 -5
  143. package/dist/db/schema/runner-sessions.d.ts.map +1 -1
  144. package/dist/db/schema/runner-sessions.js +13 -6
  145. package/dist/db/schema/runner-sessions.js.map +1 -1
  146. package/dist/db/schema/running-job-executions.d.ts +2 -2
  147. package/dist/db/schema/running-job-executions.js +4 -4
  148. package/dist/db/schema/running-job-executions.js.map +1 -1
  149. package/dist/index.d.ts +6 -2
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +45 -39
  152. package/dist/index.js.map +1 -1
  153. package/dist/installation-provisioning.d.ts +14 -0
  154. package/dist/installation-provisioning.d.ts.map +1 -0
  155. package/dist/installation-provisioning.js +7 -0
  156. package/dist/installation-provisioning.js.map +1 -0
  157. package/dist/metrics/index.d.ts +1 -1
  158. package/dist/metrics/index.d.ts.map +1 -1
  159. package/dist/metrics/index.js +1 -1
  160. package/dist/metrics/index.js.map +1 -1
  161. package/dist/metrics/instance.d.ts +11 -7
  162. package/dist/metrics/instance.d.ts.map +1 -1
  163. package/dist/metrics/instance.js +13 -7
  164. package/dist/metrics/instance.js.map +1 -1
  165. package/dist/presentation/auth/index.d.ts +1 -0
  166. package/dist/presentation/auth/index.d.ts.map +1 -1
  167. package/dist/presentation/auth/index.js +1 -0
  168. package/dist/presentation/auth/index.js.map +1 -1
  169. package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -1
  170. package/dist/presentation/auth/provisioner-token-auth.js +5 -1
  171. package/dist/presentation/auth/provisioner-token-auth.js.map +1 -1
  172. package/dist/presentation/auth/runner-control-session-auth.d.ts +4 -0
  173. package/dist/presentation/auth/runner-control-session-auth.d.ts.map +1 -0
  174. package/dist/presentation/auth/runner-control-session-auth.js +29 -0
  175. package/dist/presentation/auth/runner-control-session-auth.js.map +1 -0
  176. package/dist/presentation/auth/runner-registration-token-auth.d.ts +5 -1
  177. package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -1
  178. package/dist/presentation/auth/runner-registration-token-auth.js +21 -1
  179. package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -1
  180. package/dist/presentation/dto/index.d.ts +1 -2
  181. package/dist/presentation/dto/index.d.ts.map +1 -1
  182. package/dist/presentation/dto/index.js +1 -2
  183. package/dist/presentation/dto/index.js.map +1 -1
  184. package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
  185. package/dist/presentation/dto/poll-demand.js +7 -1
  186. package/dist/presentation/dto/poll-demand.js.map +1 -1
  187. package/dist/presentation/dto/provisioner-token.d.ts +1 -0
  188. package/dist/presentation/dto/provisioner-token.d.ts.map +1 -1
  189. package/dist/presentation/dto/provisioner-token.js +5 -1
  190. package/dist/presentation/dto/provisioner-token.js.map +1 -1
  191. package/dist/presentation/dto/{provisioned-runners.d.ts → runner-instances.d.ts} +9 -9
  192. package/dist/presentation/dto/runner-instances.d.ts.map +1 -0
  193. package/dist/presentation/dto/{provisioned-runners.js → runner-instances.js} +6 -6
  194. package/dist/presentation/dto/runner-instances.js.map +1 -0
  195. package/dist/presentation/index.d.ts +2 -2
  196. package/dist/presentation/index.d.ts.map +1 -1
  197. package/dist/presentation/index.js +2 -2
  198. package/dist/presentation/index.js.map +1 -1
  199. package/dist/presentation/inter-module.d.ts +5 -0
  200. package/dist/presentation/inter-module.d.ts.map +1 -0
  201. package/dist/presentation/inter-module.js +43 -0
  202. package/dist/presentation/inter-module.js.map +1 -0
  203. package/dist/presentation/routes/assign-runner-instances.d.ts +2 -0
  204. package/dist/presentation/routes/assign-runner-instances.d.ts.map +1 -0
  205. package/dist/presentation/routes/assign-runner-instances.js +40 -0
  206. package/dist/presentation/routes/assign-runner-instances.js.map +1 -0
  207. package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -1
  208. package/dist/presentation/routes/get-provisioner-me.js +5 -1
  209. package/dist/presentation/routes/get-provisioner-me.js.map +1 -1
  210. package/dist/presentation/routes/heartbeat.d.ts +2 -1
  211. package/dist/presentation/routes/heartbeat.d.ts.map +1 -1
  212. package/dist/presentation/routes/heartbeat.js +60 -50
  213. package/dist/presentation/routes/heartbeat.js.map +1 -1
  214. package/dist/presentation/routes/index.d.ts +3 -1
  215. package/dist/presentation/routes/index.d.ts.map +1 -1
  216. package/dist/presentation/routes/index.js +80 -51
  217. package/dist/presentation/routes/index.js.map +1 -1
  218. package/dist/presentation/routes/poll-demand.d.ts +2 -0
  219. package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
  220. package/dist/presentation/routes/poll-demand.js +86 -45
  221. package/dist/presentation/routes/poll-demand.js.map +1 -1
  222. package/dist/presentation/routes/reconcile-runner-instances.d.ts +2 -0
  223. package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -0
  224. package/dist/presentation/routes/reconcile-runner-instances.js +27 -0
  225. package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -0
  226. package/dist/presentation/routes/register.d.ts +2 -1
  227. package/dist/presentation/routes/register.d.ts.map +1 -1
  228. package/dist/presentation/routes/register.js +55 -52
  229. package/dist/presentation/routes/register.js.map +1 -1
  230. package/dist/presentation/routes/report-runner-instances.d.ts +2 -0
  231. package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -0
  232. package/dist/presentation/routes/report-runner-instances.js +37 -0
  233. package/dist/presentation/routes/report-runner-instances.js.map +1 -0
  234. package/dist/presentation/routes/request-job.d.ts +2 -1
  235. package/dist/presentation/routes/request-job.d.ts.map +1 -1
  236. package/dist/presentation/routes/request-job.js +39 -36
  237. package/dist/presentation/routes/request-job.js.map +1 -1
  238. package/dist/presentation/routes/runner-enrollment.d.ts +8 -0
  239. package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
  240. package/dist/presentation/routes/runner-enrollment.js +212 -0
  241. package/dist/presentation/routes/runner-enrollment.js.map +1 -0
  242. package/dist/temporal/activities/index.d.ts +2 -2
  243. package/dist/temporal/activities/index.d.ts.map +1 -1
  244. package/dist/temporal/activities/index.js +2 -2
  245. package/dist/temporal/activities/index.js.map +1 -1
  246. package/dist/temporal/activities/maintenance-activities.d.ts +1 -1
  247. package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -1
  248. package/dist/temporal/activities/maintenance-activities.js +3 -3
  249. package/dist/temporal/activities/maintenance-activities.js.map +1 -1
  250. package/dist/temporal/workflows/index.bundle.js +3 -3
  251. package/dist/temporal/workflows/stuck-job-detector.js +2 -2
  252. package/dist/temporal/workflows/stuck-job-detector.js.map +1 -1
  253. package/dist/tsconfig.test.tsbuildinfo +1 -1
  254. package/drizzle/0000_initial.sql +91 -24
  255. package/drizzle/meta/0000_snapshot.json +392 -63
  256. package/package.json +21 -16
  257. package/src/config.test.ts +0 -26
  258. package/src/config.ts +48 -7
  259. package/src/core/demand.test.ts +29 -29
  260. package/src/core/demand.ts +22 -22
  261. package/src/core/entities/ephemeral-registration-token.ts +1 -1
  262. package/src/core/entities/provisioner-capability-snapshot.ts +12 -0
  263. package/src/core/entities/provisioner-token.ts +8 -2
  264. package/src/core/entities/{provisioned-runner.ts → runner-instance.ts} +6 -5
  265. package/src/core/entities/runner-session.ts +4 -2
  266. package/src/core/ephemeral-registration-tokens.test.ts +11 -11
  267. package/src/core/ephemeral-registration-tokens.ts +18 -20
  268. package/src/core/errors.ts +23 -4
  269. package/src/core/index.ts +37 -22
  270. package/src/core/job-executions.ts +3 -2
  271. package/src/core/maintenance.test.ts +13 -17
  272. package/src/core/maintenance.ts +5 -5
  273. package/src/core/provisioner-capability-snapshots.test.ts +35 -0
  274. package/src/core/provisioner-capability-snapshots.ts +12 -0
  275. package/src/core/provisioner-tokens.test.ts +20 -0
  276. package/src/core/provisioner-tokens.ts +33 -0
  277. package/src/core/rate-limit.test.ts +11 -27
  278. package/src/core/rate-limit.ts +3 -11
  279. package/src/core/runner-activation.ts +72 -0
  280. package/src/core/runner-assignments.ts +9 -0
  281. package/src/core/runner-control-sessions.ts +190 -0
  282. package/src/core/{provisioned-runners.test.ts → runner-instances.test.ts} +24 -24
  283. package/src/core/runner-instances.ts +301 -0
  284. package/src/core/runner-sessions.test.ts +112 -22
  285. package/src/core/runner-sessions.ts +25 -14
  286. package/src/db/db.ts +9 -2
  287. package/src/db/ephemeral-registration-tokens.test.ts +9 -9
  288. package/src/db/ephemeral-registration-tokens.ts +26 -26
  289. package/src/db/index.ts +30 -21
  290. package/src/db/job-executions.test.ts +13 -11
  291. package/src/db/job-executions.ts +33 -27
  292. package/src/db/provisioner-capability-snapshots.test.ts +175 -0
  293. package/src/db/provisioner-capability-snapshots.ts +130 -0
  294. package/src/db/provisioner-tokens.test.ts +139 -2
  295. package/src/db/provisioner-tokens.ts +123 -15
  296. package/src/db/reservations.test.ts +49 -0
  297. package/src/db/reservations.ts +146 -1
  298. package/src/db/runner-assignments.test.ts +163 -0
  299. package/src/db/runner-assignments.ts +115 -0
  300. package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +442 -353
  301. package/src/db/runner-instances.ts +922 -0
  302. package/src/db/runner-sessions.test.ts +19 -6
  303. package/src/db/runner-sessions.ts +78 -2
  304. package/src/db/schema/ephemeral-registration-tokens.ts +4 -4
  305. package/src/db/schema/provisioner-capability-snapshots.ts +46 -0
  306. package/src/db/schema/provisioner-tokens.ts +33 -2
  307. package/src/db/schema/runner-activation-tokens.ts +22 -0
  308. package/src/db/schema/runner-control-sessions.ts +46 -0
  309. package/src/db/schema/{provisioned-runners.ts → runner-instances.ts} +28 -27
  310. package/src/db/schema/runner-sessions.ts +11 -7
  311. package/src/db/schema/running-job-executions.ts +5 -5
  312. package/src/index.test.ts +26 -0
  313. package/src/index.ts +38 -27
  314. package/src/installation-provisioning.ts +14 -0
  315. package/src/metrics/index.ts +5 -5
  316. package/src/metrics/instance.ts +25 -14
  317. package/src/presentation/auth/index.ts +4 -0
  318. package/src/presentation/auth/provisioner-token-auth.ts +8 -4
  319. package/src/presentation/auth/runner-control-session-auth.ts +31 -0
  320. package/src/presentation/auth/runner-registration-token-auth.ts +39 -3
  321. package/src/presentation/dto/index.ts +4 -8
  322. package/src/presentation/dto/poll-demand.ts +3 -1
  323. package/src/presentation/dto/provisioner-token.ts +5 -0
  324. package/src/presentation/dto/{provisioned-runners.ts → runner-instances.ts} +13 -15
  325. package/src/presentation/index.ts +2 -1
  326. package/src/presentation/inter-module.test.ts +15 -0
  327. package/src/presentation/inter-module.ts +53 -0
  328. package/src/presentation/routes/assign-runner-instances.ts +49 -0
  329. package/src/presentation/routes/get-provisioner-me.ts +3 -4
  330. package/src/presentation/routes/heartbeat.test.ts +4 -3
  331. package/src/presentation/routes/heartbeat.ts +67 -64
  332. package/src/presentation/routes/index.ts +91 -44
  333. package/src/presentation/routes/list-active-runners.test.ts +23 -23
  334. package/src/presentation/routes/manual-registration-tokens.test.ts +4 -3
  335. package/src/presentation/routes/poll-demand-release.test.ts +4 -4
  336. package/src/presentation/routes/poll-demand.test.ts +161 -22
  337. package/src/presentation/routes/poll-demand.ts +105 -45
  338. package/src/presentation/routes/provisioner-me.test.ts +37 -3
  339. package/src/presentation/routes/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +66 -61
  340. package/src/presentation/routes/reconcile-runner-instances.ts +30 -0
  341. package/src/presentation/routes/register.test.ts +9 -5
  342. package/src/presentation/routes/register.ts +61 -57
  343. package/src/presentation/routes/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +28 -28
  344. package/src/presentation/routes/{report-provisioned-runners.ts → report-runner-instances.ts} +14 -14
  345. package/src/presentation/routes/request-job.test.ts +5 -3
  346. package/src/presentation/routes/request-job.ts +41 -37
  347. package/src/presentation/routes/runner-enrollment.test.ts +319 -0
  348. package/src/presentation/routes/runner-enrollment.ts +196 -0
  349. package/src/temporal/activities/index.ts +2 -2
  350. package/src/temporal/activities/maintenance-activities.test.ts +7 -7
  351. package/src/temporal/activities/maintenance-activities.ts +3 -3
  352. package/src/temporal/workflows/stuck-job-detector.test.ts +3 -3
  353. package/src/temporal/workflows/stuck-job-detector.ts +2 -2
  354. package/test/env.ts +1 -3
  355. package/test/factories/ephemeral-registration-token.ts +2 -2
  356. package/test/factories/provisioner-token.ts +3 -1
  357. package/test/factories/runner-instance.ts +57 -0
  358. package/test/factories/runner-session.ts +3 -1
  359. package/test/fixtures/auth-inter-module.ts +30 -0
  360. package/test/globalSetup.ts +4 -1
  361. package/test/index.ts +2 -1
  362. package/tsconfig.build.tsbuildinfo +1 -1
  363. package/dist/core/entities/provisioned-runner.d.ts.map +0 -1
  364. package/dist/core/entities/provisioned-runner.js +0 -3
  365. package/dist/core/entities/provisioned-runner.js.map +0 -1
  366. package/dist/core/provisioned-runners.d.ts +0 -67
  367. package/dist/core/provisioned-runners.d.ts.map +0 -1
  368. package/dist/core/provisioned-runners.js +0 -162
  369. package/dist/core/provisioned-runners.js.map +0 -1
  370. package/dist/db/provisioned-runners.d.ts +0 -79
  371. package/dist/db/provisioned-runners.d.ts.map +0 -1
  372. package/dist/db/provisioned-runners.js +0 -466
  373. package/dist/db/provisioned-runners.js.map +0 -1
  374. package/dist/db/schema/provisioned-runners.d.ts.map +0 -1
  375. package/dist/db/schema/provisioned-runners.js.map +0 -1
  376. package/dist/presentation/dto/mint-registration-tokens.d.ts +0 -5
  377. package/dist/presentation/dto/mint-registration-tokens.d.ts.map +0 -1
  378. package/dist/presentation/dto/mint-registration-tokens.js +0 -19
  379. package/dist/presentation/dto/mint-registration-tokens.js.map +0 -1
  380. package/dist/presentation/dto/provisioned-runners.d.ts.map +0 -1
  381. package/dist/presentation/dto/provisioned-runners.js.map +0 -1
  382. package/dist/presentation/routes/mint-registration-tokens.d.ts +0 -2
  383. package/dist/presentation/routes/mint-registration-tokens.d.ts.map +0 -1
  384. package/dist/presentation/routes/mint-registration-tokens.js +0 -74
  385. package/dist/presentation/routes/mint-registration-tokens.js.map +0 -1
  386. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +0 -2
  387. package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +0 -1
  388. package/dist/presentation/routes/reconcile-provisioned-runners.js +0 -27
  389. package/dist/presentation/routes/reconcile-provisioned-runners.js.map +0 -1
  390. package/dist/presentation/routes/report-provisioned-runners.d.ts +0 -2
  391. package/dist/presentation/routes/report-provisioned-runners.d.ts.map +0 -1
  392. package/dist/presentation/routes/report-provisioned-runners.js +0 -37
  393. package/dist/presentation/routes/report-provisioned-runners.js.map +0 -1
  394. package/src/core/provisioned-runners.ts +0 -301
  395. package/src/db/provisioned-runners.ts +0 -886
  396. package/src/presentation/dto/mint-registration-tokens.ts +0 -35
  397. package/src/presentation/routes/mint-registration-tokens.test.ts +0 -453
  398. package/src/presentation/routes/mint-registration-tokens.ts +0 -82
  399. package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
  400. package/test/factories/provisioned-runner.ts +0 -78
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/schema/running-job-executions.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {check, index, text, timestamp, uuid} from 'drizzle-orm/pg-core';\nimport {pgTable} from './common.js';\nimport {runnerSessions} from './runner-sessions.js';\n\nexport const runningJobExecutions = pgTable(\n 'running_jobs',\n {\n id: uuidv7PrimaryKey(),\n workspaceId: uuid('workspace_id').notNull(),\n workflowRunId: uuid('workflow_run_id').notNull(),\n workflowRunAttemptId: uuid('workflow_run_attempt_id').notNull(),\n jobId: uuid('job_id').notNull(),\n jobExecutionId: uuid('job_execution_id').notNull().unique(),\n projectId: uuid('project_id').notNull(),\n runnerSessionId: uuid('runner_session_id')\n .notNull()\n .references(() => runnerSessions.id),\n provisionerId: uuid('provisioner_id'),\n provisionedRunnerId: text('provisioned_runner_id'),\n requiredLabels: text('required_labels').array().notNull(),\n runnerLabels: text('runner_labels').array().notNull(),\n startedAt: timestamp('started_at', {withTimezone: true}).notNull().defaultNow(),\n firstHeartbeatAt: timestamp('first_heartbeat_at', {withTimezone: true}),\n lastHeartbeatAt: timestamp('last_heartbeat_at', {withTimezone: true}).notNull().defaultNow(),\n cancellationRequestedAt: timestamp('cancellation_requested_at', {withTimezone: true}),\n },\n (table) => [\n index('runners_running_jobs_no_first_heartbeat_started_idx')\n .on(table.startedAt)\n .where(sql`\"first_heartbeat_at\" IS NULL`),\n index('runners_running_jobs_last_heartbeat_at_idx').on(table.lastHeartbeatAt),\n index('runners_running_jobs_provisioned_runner_started_idx')\n .on(table.workspaceId, table.provisionerId, table.provisionedRunnerId, table.startedAt.desc())\n .where(sql`\"provisioner_id\" IS NOT NULL`),\n index('runners_running_jobs_cancellation_requested_idx')\n .on(table.workspaceId, table.provisionerId, table.provisionedRunnerId)\n .where(sql`\"cancellation_requested_at\" IS NOT NULL`),\n index('runners_running_jobs_job_id_idx').on(table.jobId),\n index('runners_running_jobs_runner_session_id_idx').on(table.runnerSessionId),\n check(\n 'runners_running_jobs_link_ck',\n sql`(${table.provisionerId} IS NULL) = (${table.provisionedRunnerId} IS NULL)`,\n ),\n ],\n);\n\nexport type RunningJobExecutionDb = typeof runningJobExecutions.$inferSelect;\nexport type RunningJobExecutionInsertDb = typeof runningJobExecutions.$inferInsert;\n"],"names":["uuidv7PrimaryKey","sql","check","index","text","timestamp","uuid","pgTable","runnerSessions","runningJobExecutions","id","workspaceId","notNull","workflowRunId","workflowRunAttemptId","jobId","jobExecutionId","unique","projectId","runnerSessionId","references","provisionerId","provisionedRunnerId","requiredLabels","array","runnerLabels","startedAt","withTimezone","defaultNow","firstHeartbeatAt","lastHeartbeatAt","cancellationRequestedAt","table","on","where","desc"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,KAAK,EAAEC,IAAI,EAAEC,SAAS,EAAEC,IAAI,QAAO,sBAAsB;AACxE,SAAQC,OAAO,QAAO,cAAc;AACpC,SAAQC,cAAc,QAAO,uBAAuB;AAEpD,OAAO,MAAMC,uBAAuBF,QAClC,gBACA;IACEG,IAAIV;IACJW,aAAaL,KAAK,gBAAgBM,OAAO;IACzCC,eAAeP,KAAK,mBAAmBM,OAAO;IAC9CE,sBAAsBR,KAAK,2BAA2BM,OAAO;IAC7DG,OAAOT,KAAK,UAAUM,OAAO;IAC7BI,gBAAgBV,KAAK,oBAAoBM,OAAO,GAAGK,MAAM;IACzDC,WAAWZ,KAAK,cAAcM,OAAO;IACrCO,iBAAiBb,KAAK,qBACnBM,OAAO,GACPQ,UAAU,CAAC,IAAMZ,eAAeE,EAAE;IACrCW,eAAef,KAAK;IACpBgB,qBAAqBlB,KAAK;IAC1BmB,gBAAgBnB,KAAK,mBAAmBoB,KAAK,GAAGZ,OAAO;IACvDa,cAAcrB,KAAK,iBAAiBoB,KAAK,GAAGZ,OAAO;IACnDc,WAAWrB,UAAU,cAAc;QAACsB,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;IAC7EC,kBAAkBxB,UAAU,sBAAsB;QAACsB,cAAc;IAAI;IACrEG,iBAAiBzB,UAAU,qBAAqB;QAACsB,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;IAC1FG,yBAAyB1B,UAAU,6BAA6B;QAACsB,cAAc;IAAI;AACrF,GACA,CAACK,QAAU;QACT7B,MAAM,uDACH8B,EAAE,CAACD,MAAMN,SAAS,EAClBQ,KAAK,CAACjC,GAAG,CAAC,4BAA4B,CAAC;QAC1CE,MAAM,8CAA8C8B,EAAE,CAACD,MAAMF,eAAe;QAC5E3B,MAAM,uDACH8B,EAAE,CAACD,MAAMrB,WAAW,EAAEqB,MAAMX,aAAa,EAAEW,MAAMV,mBAAmB,EAAEU,MAAMN,SAAS,CAACS,IAAI,IAC1FD,KAAK,CAACjC,GAAG,CAAC,4BAA4B,CAAC;QAC1CE,MAAM,mDACH8B,EAAE,CAACD,MAAMrB,WAAW,EAAEqB,MAAMX,aAAa,EAAEW,MAAMV,mBAAmB,EACpEY,KAAK,CAACjC,GAAG,CAAC,uCAAuC,CAAC;QACrDE,MAAM,mCAAmC8B,EAAE,CAACD,MAAMjB,KAAK;QACvDZ,MAAM,8CAA8C8B,EAAE,CAACD,MAAMb,eAAe;QAC5EjB,MACE,gCACAD,GAAG,CAAC,CAAC,EAAE+B,MAAMX,aAAa,CAAC,aAAa,EAAEW,MAAMV,mBAAmB,CAAC,SAAS,CAAC;KAEjF,EACD"}
1
+ {"version":3,"sources":["../../../src/db/schema/running-job-executions.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {check, index, text, timestamp, uuid} from 'drizzle-orm/pg-core';\nimport {pgTable} from './common.js';\nimport {runnerSessions} from './runner-sessions.js';\n\nexport const runningJobExecutions = pgTable(\n 'running_jobs',\n {\n id: uuidv7PrimaryKey(),\n workspaceId: uuid('workspace_id').notNull(),\n workflowRunId: uuid('workflow_run_id').notNull(),\n workflowRunAttemptId: uuid('workflow_run_attempt_id').notNull(),\n jobId: uuid('job_id').notNull(),\n jobExecutionId: uuid('job_execution_id').notNull().unique(),\n projectId: uuid('project_id').notNull(),\n runnerSessionId: uuid('runner_session_id')\n .notNull()\n .references(() => runnerSessions.id),\n provisionerId: uuid('provisioner_id'),\n providerRunnerId: text('provider_runner_id'),\n requiredLabels: text('required_labels').array().notNull(),\n runnerLabels: text('runner_labels').array().notNull(),\n startedAt: timestamp('started_at', {withTimezone: true}).notNull().defaultNow(),\n firstHeartbeatAt: timestamp('first_heartbeat_at', {withTimezone: true}),\n lastHeartbeatAt: timestamp('last_heartbeat_at', {withTimezone: true}).notNull().defaultNow(),\n cancellationRequestedAt: timestamp('cancellation_requested_at', {withTimezone: true}),\n },\n (table) => [\n index('runners_running_jobs_no_first_heartbeat_started_idx')\n .on(table.startedAt)\n .where(sql`\"first_heartbeat_at\" IS NULL`),\n index('runners_running_jobs_last_heartbeat_at_idx').on(table.lastHeartbeatAt),\n index('runners_running_jobs_provider_runner_started_idx')\n .on(table.workspaceId, table.provisionerId, table.providerRunnerId, table.startedAt.desc())\n .where(sql`\"provisioner_id\" IS NOT NULL`),\n index('runners_running_jobs_cancellation_requested_idx')\n .on(table.workspaceId, table.provisionerId, table.providerRunnerId)\n .where(sql`\"cancellation_requested_at\" IS NOT NULL`),\n index('runners_running_jobs_job_id_idx').on(table.jobId),\n index('runners_running_jobs_runner_session_id_idx').on(table.runnerSessionId),\n check(\n 'runners_running_jobs_link_ck',\n sql`(${table.provisionerId} IS NULL) = (${table.providerRunnerId} IS NULL)`,\n ),\n ],\n);\n\nexport type RunningJobExecutionDb = typeof runningJobExecutions.$inferSelect;\nexport type RunningJobExecutionInsertDb = typeof runningJobExecutions.$inferInsert;\n"],"names":["uuidv7PrimaryKey","sql","check","index","text","timestamp","uuid","pgTable","runnerSessions","runningJobExecutions","id","workspaceId","notNull","workflowRunId","workflowRunAttemptId","jobId","jobExecutionId","unique","projectId","runnerSessionId","references","provisionerId","providerRunnerId","requiredLabels","array","runnerLabels","startedAt","withTimezone","defaultNow","firstHeartbeatAt","lastHeartbeatAt","cancellationRequestedAt","table","on","where","desc"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,KAAK,EAAEC,IAAI,EAAEC,SAAS,EAAEC,IAAI,QAAO,sBAAsB;AACxE,SAAQC,OAAO,QAAO,cAAc;AACpC,SAAQC,cAAc,QAAO,uBAAuB;AAEpD,OAAO,MAAMC,uBAAuBF,QAClC,gBACA;IACEG,IAAIV;IACJW,aAAaL,KAAK,gBAAgBM,OAAO;IACzCC,eAAeP,KAAK,mBAAmBM,OAAO;IAC9CE,sBAAsBR,KAAK,2BAA2BM,OAAO;IAC7DG,OAAOT,KAAK,UAAUM,OAAO;IAC7BI,gBAAgBV,KAAK,oBAAoBM,OAAO,GAAGK,MAAM;IACzDC,WAAWZ,KAAK,cAAcM,OAAO;IACrCO,iBAAiBb,KAAK,qBACnBM,OAAO,GACPQ,UAAU,CAAC,IAAMZ,eAAeE,EAAE;IACrCW,eAAef,KAAK;IACpBgB,kBAAkBlB,KAAK;IACvBmB,gBAAgBnB,KAAK,mBAAmBoB,KAAK,GAAGZ,OAAO;IACvDa,cAAcrB,KAAK,iBAAiBoB,KAAK,GAAGZ,OAAO;IACnDc,WAAWrB,UAAU,cAAc;QAACsB,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;IAC7EC,kBAAkBxB,UAAU,sBAAsB;QAACsB,cAAc;IAAI;IACrEG,iBAAiBzB,UAAU,qBAAqB;QAACsB,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;IAC1FG,yBAAyB1B,UAAU,6BAA6B;QAACsB,cAAc;IAAI;AACrF,GACA,CAACK,QAAU;QACT7B,MAAM,uDACH8B,EAAE,CAACD,MAAMN,SAAS,EAClBQ,KAAK,CAACjC,GAAG,CAAC,4BAA4B,CAAC;QAC1CE,MAAM,8CAA8C8B,EAAE,CAACD,MAAMF,eAAe;QAC5E3B,MAAM,oDACH8B,EAAE,CAACD,MAAMrB,WAAW,EAAEqB,MAAMX,aAAa,EAAEW,MAAMV,gBAAgB,EAAEU,MAAMN,SAAS,CAACS,IAAI,IACvFD,KAAK,CAACjC,GAAG,CAAC,4BAA4B,CAAC;QAC1CE,MAAM,mDACH8B,EAAE,CAACD,MAAMrB,WAAW,EAAEqB,MAAMX,aAAa,EAAEW,MAAMV,gBAAgB,EACjEY,KAAK,CAACjC,GAAG,CAAC,uCAAuC,CAAC;QACrDE,MAAM,mCAAmC8B,EAAE,CAACD,MAAMjB,KAAK;QACvDZ,MAAM,8CAA8C8B,EAAE,CAACD,MAAMb,eAAe;QAC5EjB,MACE,gCACAD,GAAG,CAAC,CAAC,EAAE+B,MAAMX,aAAa,CAAC,aAAa,EAAEW,MAAMV,gBAAgB,CAAC,SAAS,CAAC;KAE9E,EACD"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,10 @@
1
+ import type { AuthInterModuleClient } from '@shipfox/api-auth-dto/inter-module';
1
2
  import { type ShipfoxModule } from '@shipfox/node-module';
2
- export { type MintEphemeralRegistrationTokenParams, type MintEphemeralRegistrationTokenResult, type MintEphemeralRegistrationTokensBatchParams, type MintEphemeralRegistrationTokensBatchProvisionedRunner, type MintEphemeralRegistrationTokensBatchResult, mintEphemeralRegistrationToken, mintEphemeralRegistrationTokensBatch, } from '#core/ephemeral-registration-tokens.js';
3
+ import type { CreateRunnersModuleOptions } from '#installation-provisioning.js';
3
4
  export { type EffectiveRunnerToolCapabilitiesResult, getEffectiveRunnerToolCapabilities, unadvertisedRunnerTools, } from '#core/runner-tool-capabilities.js';
4
5
  export { cancelRunnerJobs, type EnqueueJobExecutionParams, enqueueJobExecution, isJobLeaseActive, releaseJobExecution, } from '#db/index.js';
5
- export declare const runnersModule: ShipfoxModule;
6
+ export type { CreateRunnersModuleOptions, InstallationProvisioningPolicy, } from '#installation-provisioning.js';
7
+ export declare function createRunnersModule({ auth, ...options }: CreateRunnersModuleOptions & {
8
+ auth: AuthInterModuleClient;
9
+ }): ShipfoxModule;
6
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAY3E,OAAO,EACL,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,KAAK,0CAA0C,EAC/C,KAAK,qDAAqD,EAC1D,KAAK,0CAA0C,EAC/C,8BAA8B,EAC9B,oCAAoC,GACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,qCAAqC,EAC1C,kCAAkC,EAClC,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,KAAK,yBAAyB,EAC9B,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAOtB,eAAO,MAAM,aAAa,EAAE,aAgB3B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,oCAAoC,CAAC;AAM9E,OAAO,EAAC,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAE3E,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,+BAA+B,CAAC;AAa9E,OAAO,EACL,KAAK,qCAAqC,EAC1C,kCAAkC,EAClC,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,KAAK,yBAAyB,EAC9B,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AAOvC,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,GAAG,OAAO,EACX,EAAE,0BAA0B,GAAG;IAAC,IAAI,EAAE,qBAAqB,CAAA;CAAC,GAAG,aAAa,CAyB5E"}
package/dist/index.js CHANGED
@@ -5,52 +5,58 @@ import { WORKFLOWS_JOB_EXECUTION_TIMED_OUT } from '@shipfox/api-workflows-dto';
5
5
  import { subscriberFactory } from '@shipfox/node-module';
6
6
  import { db, migrationsPath, runnersOutbox } from '#db/index.js';
7
7
  import { registerRunnersServiceMetrics } from '#metrics/index.js';
8
- import { createProvisionerTokenAuthMethod, createRunnerRegistrationTokenAuthMethod, onWorkflowsJobExecutionTimedOut, routes } from '#presentation/index.js';
8
+ import { createProvisionerTokenAuthMethod, createRunnerControlSessionAuthMethod, createRunnerRegistrationTokenAuthMethod, createRunnerRoutes, onWorkflowsJobExecutionTimedOut } from '#presentation/index.js';
9
+ import { createRunnersInterModulePresentation } from '#presentation/inter-module.js';
9
10
  import { createRunnersMaintenanceActivities } from '#temporal/activities/index.js';
10
11
  import { RUNNERS_MAINTENANCE_TASK_QUEUE } from '#temporal/constants.js';
11
- export { mintEphemeralRegistrationToken, mintEphemeralRegistrationTokensBatch } from '#core/ephemeral-registration-tokens.js';
12
12
  export { getEffectiveRunnerToolCapabilities, unadvertisedRunnerTools } from '#core/runner-tool-capabilities.js';
13
13
  export { cancelRunnerJobs, enqueueJobExecution, isJobLeaseActive, releaseJobExecution } from '#db/index.js';
14
14
  const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
15
15
  const workflowsPath = resolve(packageRoot, 'dist/temporal/workflows/index.js');
16
16
  const subscriber = subscriberFactory();
17
- export const runnersModule = {
18
- name: 'runners',
19
- database: {
20
- db,
21
- migrationsPath
22
- },
23
- auth: [
24
- createRunnerRegistrationTokenAuthMethod(),
25
- createProvisionerTokenAuthMethod()
26
- ],
27
- routes,
28
- metrics: registerRunnersServiceMetrics,
29
- publishers: [
30
- {
31
- name: 'runners',
32
- table: runnersOutbox,
17
+ export function createRunnersModule({ auth, ...options }) {
18
+ return {
19
+ name: 'runners',
20
+ database: {
33
21
  db,
34
- eventSchemas: runnersEventSchemas
35
- }
36
- ],
37
- subscribers: [
38
- subscriber(WORKFLOWS_JOB_EXECUTION_TIMED_OUT, onWorkflowsJobExecutionTimedOut)
39
- ],
40
- workers: [
41
- {
42
- taskQueue: RUNNERS_MAINTENANCE_TASK_QUEUE,
43
- workflowsPath,
44
- activities: createRunnersMaintenanceActivities,
45
- workflows: [
46
- {
47
- name: 'stuckJobDetector',
48
- id: 'stuck-job-detector',
49
- cronSchedule: '* * * * *'
50
- }
51
- ]
52
- }
53
- ]
54
- };
22
+ migrationsPath
23
+ },
24
+ auth: [
25
+ createRunnerRegistrationTokenAuthMethod(),
26
+ createRunnerControlSessionAuthMethod(),
27
+ createProvisionerTokenAuthMethod()
28
+ ],
29
+ routes: createRunnerRoutes(auth, options),
30
+ metrics: registerRunnersServiceMetrics,
31
+ publishers: [
32
+ {
33
+ name: 'runners',
34
+ table: runnersOutbox,
35
+ db,
36
+ eventSchemas: runnersEventSchemas
37
+ }
38
+ ],
39
+ subscribers: [
40
+ subscriber(WORKFLOWS_JOB_EXECUTION_TIMED_OUT, onWorkflowsJobExecutionTimedOut)
41
+ ],
42
+ workers: [
43
+ {
44
+ taskQueue: RUNNERS_MAINTENANCE_TASK_QUEUE,
45
+ workflowsPath,
46
+ activities: createRunnersMaintenanceActivities,
47
+ workflows: [
48
+ {
49
+ name: 'stuckJobDetector',
50
+ id: 'stuck-job-detector',
51
+ cronSchedule: '* * * * *'
52
+ }
53
+ ]
54
+ }
55
+ ],
56
+ interModulePresentations: [
57
+ createRunnersInterModulePresentation()
58
+ ]
59
+ };
60
+ }
55
61
 
56
62
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {runnersEventSchemas} from '@shipfox/api-runners-dto';\nimport {\n WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n type WorkflowsEventMapDto,\n} from '@shipfox/api-workflows-dto';\nimport {type ShipfoxModule, subscriberFactory} from '@shipfox/node-module';\nimport {db, migrationsPath, runnersOutbox} from '#db/index.js';\nimport {registerRunnersServiceMetrics} from '#metrics/index.js';\nimport {\n createProvisionerTokenAuthMethod,\n createRunnerRegistrationTokenAuthMethod,\n onWorkflowsJobExecutionTimedOut,\n routes,\n} from '#presentation/index.js';\nimport {createRunnersMaintenanceActivities} from '#temporal/activities/index.js';\nimport {RUNNERS_MAINTENANCE_TASK_QUEUE} from '#temporal/constants.js';\n\nexport {\n type MintEphemeralRegistrationTokenParams,\n type MintEphemeralRegistrationTokenResult,\n type MintEphemeralRegistrationTokensBatchParams,\n type MintEphemeralRegistrationTokensBatchProvisionedRunner,\n type MintEphemeralRegistrationTokensBatchResult,\n mintEphemeralRegistrationToken,\n mintEphemeralRegistrationTokensBatch,\n} from '#core/ephemeral-registration-tokens.js';\nexport {\n type EffectiveRunnerToolCapabilitiesResult,\n getEffectiveRunnerToolCapabilities,\n unadvertisedRunnerTools,\n} from '#core/runner-tool-capabilities.js';\nexport {\n cancelRunnerJobs,\n type EnqueueJobExecutionParams,\n enqueueJobExecution,\n isJobLeaseActive,\n releaseJobExecution,\n} from '#db/index.js';\n\nconst packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');\nconst workflowsPath = resolve(packageRoot, 'dist/temporal/workflows/index.js');\n\nconst subscriber = subscriberFactory<WorkflowsEventMapDto>();\n\nexport const runnersModule: ShipfoxModule = {\n name: 'runners',\n database: {db, migrationsPath},\n auth: [createRunnerRegistrationTokenAuthMethod(), createProvisionerTokenAuthMethod()],\n routes,\n metrics: registerRunnersServiceMetrics,\n publishers: [{name: 'runners', table: runnersOutbox, db, eventSchemas: runnersEventSchemas}],\n subscribers: [subscriber(WORKFLOWS_JOB_EXECUTION_TIMED_OUT, onWorkflowsJobExecutionTimedOut)],\n workers: [\n {\n taskQueue: RUNNERS_MAINTENANCE_TASK_QUEUE,\n workflowsPath,\n activities: createRunnersMaintenanceActivities,\n workflows: [{name: 'stuckJobDetector', id: 'stuck-job-detector', cronSchedule: '* * * * *'}],\n },\n ],\n};\n"],"names":["dirname","resolve","fileURLToPath","runnersEventSchemas","WORKFLOWS_JOB_EXECUTION_TIMED_OUT","subscriberFactory","db","migrationsPath","runnersOutbox","registerRunnersServiceMetrics","createProvisionerTokenAuthMethod","createRunnerRegistrationTokenAuthMethod","onWorkflowsJobExecutionTimedOut","routes","createRunnersMaintenanceActivities","RUNNERS_MAINTENANCE_TASK_QUEUE","mintEphemeralRegistrationToken","mintEphemeralRegistrationTokensBatch","getEffectiveRunnerToolCapabilities","unadvertisedRunnerTools","cancelRunnerJobs","enqueueJobExecution","isJobLeaseActive","releaseJobExecution","packageRoot","url","workflowsPath","subscriber","runnersModule","name","database","auth","metrics","publishers","table","eventSchemas","subscribers","workers","taskQueue","activities","workflows","id","cronSchedule"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AACvC,SAAQC,mBAAmB,QAAO,2BAA2B;AAC7D,SACEC,iCAAiC,QAE5B,6BAA6B;AACpC,SAA4BC,iBAAiB,QAAO,uBAAuB;AAC3E,SAAQC,EAAE,EAAEC,cAAc,EAAEC,aAAa,QAAO,eAAe;AAC/D,SAAQC,6BAA6B,QAAO,oBAAoB;AAChE,SACEC,gCAAgC,EAChCC,uCAAuC,EACvCC,+BAA+B,EAC/BC,MAAM,QACD,yBAAyB;AAChC,SAAQC,kCAAkC,QAAO,gCAAgC;AACjF,SAAQC,8BAA8B,QAAO,yBAAyB;AAEtE,SAMEC,8BAA8B,EAC9BC,oCAAoC,QAC/B,yCAAyC;AAChD,SAEEC,kCAAkC,EAClCC,uBAAuB,QAClB,oCAAoC;AAC3C,SACEC,gBAAgB,EAEhBC,mBAAmB,EACnBC,gBAAgB,EAChBC,mBAAmB,QACd,eAAe;AAEtB,MAAMC,cAAcvB,QAAQD,QAAQE,cAAc,YAAYuB,GAAG,IAAI;AACrE,MAAMC,gBAAgBzB,QAAQuB,aAAa;AAE3C,MAAMG,aAAatB;AAEnB,OAAO,MAAMuB,gBAA+B;IAC1CC,MAAM;IACNC,UAAU;QAACxB;QAAIC;IAAc;IAC7BwB,MAAM;QAACpB;QAA2CD;KAAmC;IACrFG;IACAmB,SAASvB;IACTwB,YAAY;QAAC;YAACJ,MAAM;YAAWK,OAAO1B;YAAeF;YAAI6B,cAAchC;QAAmB;KAAE;IAC5FiC,aAAa;QAACT,WAAWvB,mCAAmCQ;KAAiC;IAC7FyB,SAAS;QACP;YACEC,WAAWvB;YACXW;YACAa,YAAYzB;YACZ0B,WAAW;gBAAC;oBAACX,MAAM;oBAAoBY,IAAI;oBAAsBC,cAAc;gBAAW;aAAE;QAC9F;KACD;AACH,EAAE"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport type {AuthInterModuleClient} from '@shipfox/api-auth-dto/inter-module';\nimport {runnersEventSchemas} from '@shipfox/api-runners-dto';\nimport {\n WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n type WorkflowsEventMapDto,\n} from '@shipfox/api-workflows-dto';\nimport {type ShipfoxModule, subscriberFactory} from '@shipfox/node-module';\nimport {db, migrationsPath, runnersOutbox} from '#db/index.js';\nimport type {CreateRunnersModuleOptions} from '#installation-provisioning.js';\nimport {registerRunnersServiceMetrics} from '#metrics/index.js';\nimport {\n createProvisionerTokenAuthMethod,\n createRunnerControlSessionAuthMethod,\n createRunnerRegistrationTokenAuthMethod,\n createRunnerRoutes,\n onWorkflowsJobExecutionTimedOut,\n} from '#presentation/index.js';\nimport {createRunnersInterModulePresentation} from '#presentation/inter-module.js';\nimport {createRunnersMaintenanceActivities} from '#temporal/activities/index.js';\nimport {RUNNERS_MAINTENANCE_TASK_QUEUE} from '#temporal/constants.js';\n\nexport {\n type EffectiveRunnerToolCapabilitiesResult,\n getEffectiveRunnerToolCapabilities,\n unadvertisedRunnerTools,\n} from '#core/runner-tool-capabilities.js';\nexport {\n cancelRunnerJobs,\n type EnqueueJobExecutionParams,\n enqueueJobExecution,\n isJobLeaseActive,\n releaseJobExecution,\n} from '#db/index.js';\nexport type {\n CreateRunnersModuleOptions,\n InstallationProvisioningPolicy,\n} from '#installation-provisioning.js';\n\nconst packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');\nconst workflowsPath = resolve(packageRoot, 'dist/temporal/workflows/index.js');\n\nconst subscriber = subscriberFactory<WorkflowsEventMapDto>();\n\nexport function createRunnersModule({\n auth,\n ...options\n}: CreateRunnersModuleOptions & {auth: AuthInterModuleClient}): ShipfoxModule {\n return {\n name: 'runners',\n database: {db, migrationsPath},\n auth: [\n createRunnerRegistrationTokenAuthMethod(),\n createRunnerControlSessionAuthMethod(),\n createProvisionerTokenAuthMethod(),\n ],\n routes: createRunnerRoutes(auth, options),\n metrics: registerRunnersServiceMetrics,\n publishers: [{name: 'runners', table: runnersOutbox, db, eventSchemas: runnersEventSchemas}],\n subscribers: [subscriber(WORKFLOWS_JOB_EXECUTION_TIMED_OUT, onWorkflowsJobExecutionTimedOut)],\n workers: [\n {\n taskQueue: RUNNERS_MAINTENANCE_TASK_QUEUE,\n workflowsPath,\n activities: createRunnersMaintenanceActivities,\n workflows: [\n {name: 'stuckJobDetector', id: 'stuck-job-detector', cronSchedule: '* * * * *'},\n ],\n },\n ],\n interModulePresentations: [createRunnersInterModulePresentation()],\n };\n}\n"],"names":["dirname","resolve","fileURLToPath","runnersEventSchemas","WORKFLOWS_JOB_EXECUTION_TIMED_OUT","subscriberFactory","db","migrationsPath","runnersOutbox","registerRunnersServiceMetrics","createProvisionerTokenAuthMethod","createRunnerControlSessionAuthMethod","createRunnerRegistrationTokenAuthMethod","createRunnerRoutes","onWorkflowsJobExecutionTimedOut","createRunnersInterModulePresentation","createRunnersMaintenanceActivities","RUNNERS_MAINTENANCE_TASK_QUEUE","getEffectiveRunnerToolCapabilities","unadvertisedRunnerTools","cancelRunnerJobs","enqueueJobExecution","isJobLeaseActive","releaseJobExecution","packageRoot","url","workflowsPath","subscriber","createRunnersModule","auth","options","name","database","routes","metrics","publishers","table","eventSchemas","subscribers","workers","taskQueue","activities","workflows","id","cronSchedule","interModulePresentations"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,mBAAmB,QAAO,2BAA2B;AAC7D,SACEC,iCAAiC,QAE5B,6BAA6B;AACpC,SAA4BC,iBAAiB,QAAO,uBAAuB;AAC3E,SAAQC,EAAE,EAAEC,cAAc,EAAEC,aAAa,QAAO,eAAe;AAE/D,SAAQC,6BAA6B,QAAO,oBAAoB;AAChE,SACEC,gCAAgC,EAChCC,oCAAoC,EACpCC,uCAAuC,EACvCC,kBAAkB,EAClBC,+BAA+B,QAC1B,yBAAyB;AAChC,SAAQC,oCAAoC,QAAO,gCAAgC;AACnF,SAAQC,kCAAkC,QAAO,gCAAgC;AACjF,SAAQC,8BAA8B,QAAO,yBAAyB;AAEtE,SAEEC,kCAAkC,EAClCC,uBAAuB,QAClB,oCAAoC;AAC3C,SACEC,gBAAgB,EAEhBC,mBAAmB,EACnBC,gBAAgB,EAChBC,mBAAmB,QACd,eAAe;AAMtB,MAAMC,cAAcvB,QAAQD,QAAQE,cAAc,YAAYuB,GAAG,IAAI;AACrE,MAAMC,gBAAgBzB,QAAQuB,aAAa;AAE3C,MAAMG,aAAatB;AAEnB,OAAO,SAASuB,oBAAoB,EAClCC,IAAI,EACJ,GAAGC,SACwD;IAC3D,OAAO;QACLC,MAAM;QACNC,UAAU;YAAC1B;YAAIC;QAAc;QAC7BsB,MAAM;YACJjB;YACAD;YACAD;SACD;QACDuB,QAAQpB,mBAAmBgB,MAAMC;QACjCI,SAASzB;QACT0B,YAAY;YAAC;gBAACJ,MAAM;gBAAWK,OAAO5B;gBAAeF;gBAAI+B,cAAclC;YAAmB;SAAE;QAC5FmC,aAAa;YAACX,WAAWvB,mCAAmCU;SAAiC;QAC7FyB,SAAS;YACP;gBACEC,WAAWvB;gBACXS;gBACAe,YAAYzB;gBACZ0B,WAAW;oBACT;wBAACX,MAAM;wBAAoBY,IAAI;wBAAsBC,cAAc;oBAAW;iBAC/E;YACH;SACD;QACDC,0BAA0B;YAAC9B;SAAuC;IACpE;AACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Lets an application host choose which workspaces may receive installation-provisioned capacity.
3
+ * The runners module passes candidate IDs in batches so host policy can apply its own entitlement
4
+ * or tenancy rules without exposing those rules from this package.
5
+ */
6
+ export interface InstallationProvisioningPolicy {
7
+ filterEligibleWorkspaceIds(workspaceIds: readonly string[]): Promise<ReadonlySet<string>>;
8
+ }
9
+ export interface CreateRunnersModuleOptions {
10
+ installationProvisioning?: {
11
+ policy: InstallationProvisioningPolicy;
12
+ };
13
+ }
14
+ //# sourceMappingURL=installation-provisioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation-provisioning.d.ts","sourceRoot":"","sources":["../src/installation-provisioning.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,8BAA8B;IAC7C,0BAA0B,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,0BAA0B;IACzC,wBAAwB,CAAC,EAAE;QACzB,MAAM,EAAE,8BAA8B,CAAC;KACxC,CAAC;CACH"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Lets an application host choose which workspaces may receive installation-provisioned capacity.
3
+ * The runners module passes candidate IDs in batches so host policy can apply its own entitlement
4
+ * or tenancy rules without exposing those rules from this package.
5
+ */ export { };
6
+
7
+ //# sourceMappingURL=installation-provisioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/installation-provisioning.ts"],"sourcesContent":["/**\n * Lets an application host choose which workspaces may receive installation-provisioned capacity.\n * The runners module passes candidate IDs in batches so host policy can apply its own entitlement\n * or tenancy rules without exposing those rules from this package.\n */\nexport interface InstallationProvisioningPolicy {\n filterEligibleWorkspaceIds(workspaceIds: readonly string[]): Promise<ReadonlySet<string>>;\n}\n\nexport interface CreateRunnersModuleOptions {\n installationProvisioning?: {\n policy: InstallationProvisioningPolicy;\n };\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC,GAKD,WAIC"}
@@ -1,3 +1,3 @@
1
- export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, provisionedRunnerAbsentTerminatedCount, provisionedRunnerCountDivergenceCount, provisionedRunnerReconcileCallCount, provisionedRunnerTerminateIntentHonoredCount, provisionedRunnerTerminateIntentIssuedCount, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure, } from './instance.js';
1
+ export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, providerRunnerAbsentTerminatedCount, providerRunnerCountDivergenceCount, providerRunnerReconcileCallCount, providerRunnerTerminateIntentHonoredCount, providerRunnerTerminateIntentIssuedCount, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure, } from './instance.js';
2
2
  export { registerRunnersServiceMetrics } from './service.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,sCAAsC,EACtC,qCAAqC,EACrC,mCAAmC,EACnC,4CAA4C,EAC5C,2CAA2C,EAC3C,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,6BAA6B,EAAC,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,EACnC,kCAAkC,EAClC,gCAAgC,EAChC,yCAAyC,EACzC,wCAAwC,EACxC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,6BAA6B,EAAC,MAAM,cAAc,CAAC"}
@@ -1,4 +1,4 @@
1
- export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, provisionedRunnerAbsentTerminatedCount, provisionedRunnerCountDivergenceCount, provisionedRunnerReconcileCallCount, provisionedRunnerTerminateIntentHonoredCount, provisionedRunnerTerminateIntentIssuedCount, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure } from './instance.js';
1
+ export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, providerRunnerAbsentTerminatedCount, providerRunnerCountDivergenceCount, providerRunnerReconcileCallCount, providerRunnerTerminateIntentHonoredCount, providerRunnerTerminateIntentIssuedCount, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure } from './instance.js';
2
2
  export { registerRunnersServiceMetrics } from './service.js';
3
3
 
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export {\n jobExecutionClaimedCount,\n jobExecutionEnqueuedCount,\n jobExecutionLeaseExpiredCount,\n provisionedRunnerAbsentTerminatedCount,\n provisionedRunnerCountDivergenceCount,\n provisionedRunnerReconcileCallCount,\n provisionedRunnerTerminateIntentHonoredCount,\n provisionedRunnerTerminateIntentIssuedCount,\n recordRunnersRateLimitCheck,\n recordRunnersRateLimitPruneFailure,\n} from './instance.js';\nexport {registerRunnersServiceMetrics} from './service.js';\n"],"names":["jobExecutionClaimedCount","jobExecutionEnqueuedCount","jobExecutionLeaseExpiredCount","provisionedRunnerAbsentTerminatedCount","provisionedRunnerCountDivergenceCount","provisionedRunnerReconcileCallCount","provisionedRunnerTerminateIntentHonoredCount","provisionedRunnerTerminateIntentIssuedCount","recordRunnersRateLimitCheck","recordRunnersRateLimitPruneFailure","registerRunnersServiceMetrics"],"mappings":"AAAA,SACEA,wBAAwB,EACxBC,yBAAyB,EACzBC,6BAA6B,EAC7BC,sCAAsC,EACtCC,qCAAqC,EACrCC,mCAAmC,EACnCC,4CAA4C,EAC5CC,2CAA2C,EAC3CC,2BAA2B,EAC3BC,kCAAkC,QAC7B,gBAAgB;AACvB,SAAQC,6BAA6B,QAAO,eAAe"}
1
+ {"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export {\n jobExecutionClaimedCount,\n jobExecutionEnqueuedCount,\n jobExecutionLeaseExpiredCount,\n providerRunnerAbsentTerminatedCount,\n providerRunnerCountDivergenceCount,\n providerRunnerReconcileCallCount,\n providerRunnerTerminateIntentHonoredCount,\n providerRunnerTerminateIntentIssuedCount,\n recordRunnersRateLimitCheck,\n recordRunnersRateLimitPruneFailure,\n} from './instance.js';\nexport {registerRunnersServiceMetrics} from './service.js';\n"],"names":["jobExecutionClaimedCount","jobExecutionEnqueuedCount","jobExecutionLeaseExpiredCount","providerRunnerAbsentTerminatedCount","providerRunnerCountDivergenceCount","providerRunnerReconcileCallCount","providerRunnerTerminateIntentHonoredCount","providerRunnerTerminateIntentIssuedCount","recordRunnersRateLimitCheck","recordRunnersRateLimitPruneFailure","registerRunnersServiceMetrics"],"mappings":"AAAA,SACEA,wBAAwB,EACxBC,yBAAyB,EACzBC,6BAA6B,EAC7BC,mCAAmC,EACnCC,kCAAkC,EAClCC,gCAAgC,EAChCC,yCAAyC,EACzCC,wCAAwC,EACxCC,2BAA2B,EAC3BC,kCAAkC,QAC7B,gBAAgB;AACvB,SAAQC,6BAA6B,QAAO,eAAe"}
@@ -3,22 +3,26 @@ export declare const jobExecutionClaimedCount: import("@shipfox/node-opentelemet
3
3
  outcome: "claimed" | "empty";
4
4
  }>;
5
5
  export declare const jobExecutionLeaseExpiredCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
6
- export declare const provisionedRunnerReportCount: import("@shipfox/node-opentelemetry").Counter<{
6
+ export declare const providerRunnerReportCount: import("@shipfox/node-opentelemetry").Counter<{
7
7
  state: "starting" | "running" | "stopping" | "stopped" | "failed" | "terminated";
8
8
  }>;
9
- export declare const provisionedRunnerReapedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
10
- export declare const provisionedRunnerCountDivergenceCount: import("@shipfox/node-opentelemetry").Counter<{
9
+ export declare const runnerBootstrapExchangeCount: import("@shipfox/node-opentelemetry").Counter<{
10
+ outcome: "accepted" | "rejected";
11
+ }>;
12
+ export declare const runnerControlHeartbeatCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
13
+ export declare const providerRunnerReapedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
14
+ export declare const providerRunnerCountDivergenceCount: import("@shipfox/node-opentelemetry").Counter<{
11
15
  template_key?: string;
12
16
  state: "starting" | "running";
13
17
  direction: "backend-higher" | "advertised-higher";
14
18
  }>;
15
- export declare const provisionedRunnerReconcileCallCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
16
- export declare const provisionedRunnerAbsentTerminatedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
17
- export declare const provisionedRunnerTerminateIntentIssuedCount: import("@shipfox/node-opentelemetry").Counter<{
19
+ export declare const providerRunnerReconcileCallCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
20
+ export declare const providerRunnerAbsentTerminatedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
21
+ export declare const providerRunnerTerminateIntentIssuedCount: import("@shipfox/node-opentelemetry").Counter<{
18
22
  surface: "poll-demand" | "reconcile";
19
23
  reason: "job-cancelled" | "terminal-state";
20
24
  }>;
21
- export declare const provisionedRunnerTerminateIntentHonoredCount: import("@shipfox/node-opentelemetry").Counter<{
25
+ export declare const providerRunnerTerminateIntentHonoredCount: import("@shipfox/node-opentelemetry").Counter<{
22
26
  reason: "job-cancelled";
23
27
  }>;
24
28
  export declare const reservationReleasedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
@@ -1 +1 @@
1
- {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,sEAKrC,CAAC;AAEF,eAAO,MAAM,wBAAwB;aAAiC,SAAS,GAAG,OAAO;EAGxF,CAAC;AAEF,eAAO,MAAM,6BAA6B,sEAGzC,CAAC;AAEF,eAAO,MAAM,4BAA4B;WAChC,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY;EAGhF,CAAC;AAEH,eAAO,MAAM,4BAA4B,sEAKxC,CAAC;AAEF,eAAO,MAAM,qCAAqC;mBACjC,MAAM;WACd,UAAU,GAAG,SAAS;eAClB,gBAAgB,GAAG,mBAAmB;EAIjD,CAAC;AAEH,eAAO,MAAM,mCAAmC,sEAG/C,CAAC;AAEF,eAAO,MAAM,sCAAsC,sEAMlD,CAAC;AAEF,eAAO,MAAM,2CAA2C;aAC7C,aAAa,GAAG,WAAW;YAC5B,eAAe,GAAG,gBAAgB;EAG1C,CAAC;AAEH,eAAO,MAAM,4CAA4C;YAC/C,eAAe;EAGvB,CAAC;AAEH,eAAO,MAAM,wBAAwB,sEAGpC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;AAC/E,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,iBAAiB,CAAC;AACtE,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAsB5E,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,uBAAuB,CAAC;CAClC,GAAG,IAAI,CAQP;AAED,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD"}
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,sEAKrC,CAAC;AAEF,eAAO,MAAM,wBAAwB;aAAiC,SAAS,GAAG,OAAO;EAGxF,CAAC;AAEF,eAAO,MAAM,6BAA6B,sEAGzC,CAAC;AAEF,eAAO,MAAM,yBAAyB;WAC7B,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY;EAGhF,CAAC;AAEH,eAAO,MAAM,4BAA4B;aAC9B,UAAU,GAAG,UAAU;EAGhC,CAAC;AAEH,eAAO,MAAM,2BAA2B,sEAGvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,sEAKrC,CAAC;AAEF,eAAO,MAAM,kCAAkC;mBAC9B,MAAM;WACd,UAAU,GAAG,SAAS;eAClB,gBAAgB,GAAG,mBAAmB;EAIjD,CAAC;AAEH,eAAO,MAAM,gCAAgC,sEAG5C,CAAC;AAEF,eAAO,MAAM,mCAAmC,sEAM/C,CAAC;AAEF,eAAO,MAAM,wCAAwC;aAC1C,aAAa,GAAG,WAAW;YAC5B,eAAe,GAAG,gBAAgB;EAG1C,CAAC;AAEH,eAAO,MAAM,yCAAyC;YAC5C,eAAe;EAGvB,CAAC;AAEH,eAAO,MAAM,wBAAwB,sEAGpC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;AAC/E,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,iBAAiB,CAAC;AACtE,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAsB5E,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,uBAAuB,CAAC;CAClC,GAAG,IAAI,CAQP;AAED,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD"}
@@ -9,25 +9,31 @@ export const jobExecutionClaimedCount = meter.createCounter('runners_job_executi
9
9
  export const jobExecutionLeaseExpiredCount = meter.createCounter('runners_job_execution_lease_expired', {
10
10
  description: 'Job execution leases reaped after passing the heartbeat threshold'
11
11
  });
12
- export const provisionedRunnerReportCount = meter.createCounter('runners_provisioned_runner_reported', {
12
+ export const providerRunnerReportCount = meter.createCounter('runners_provider_runner_reported', {
13
13
  description: 'Provisioned runner lifecycle reports accepted by state'
14
14
  });
15
- export const provisionedRunnerReapedCount = meter.createCounter('runners_provisioned_runner_reaped', {
15
+ export const runnerBootstrapExchangeCount = meter.createCounter('runners_runner_bootstrap_exchange', {
16
+ description: 'Runner bootstrap-token exchanges by outcome'
17
+ });
18
+ export const runnerControlHeartbeatCount = meter.createCounter('runners_runner_control_heartbeat', {
19
+ description: 'Pre-workspace runner-control heartbeats accepted'
20
+ });
21
+ export const providerRunnerReapedCount = meter.createCounter('runners_provider_runner_reaped', {
16
22
  description: 'Stale provisioned runners marked failed by backend maintenance'
17
23
  });
18
- export const provisionedRunnerCountDivergenceCount = meter.createCounter('runners_provisioned_runner_count_divergence', {
24
+ export const providerRunnerCountDivergenceCount = meter.createCounter('runners_provider_runner_count_divergence', {
19
25
  description: 'Absolute difference between provisioner-advertised and backend-observed provisioned runner counts'
20
26
  });
21
- export const provisionedRunnerReconcileCallCount = meter.createCounter('runners_provisioned_runner_reconcile_called', {
27
+ export const providerRunnerReconcileCallCount = meter.createCounter('runners_provider_runner_reconcile_called', {
22
28
  description: 'Provisioned runner reconcile calls completed successfully'
23
29
  });
24
- export const provisionedRunnerAbsentTerminatedCount = meter.createCounter('runners_provisioned_runner_absent_terminated', {
30
+ export const providerRunnerAbsentTerminatedCount = meter.createCounter('runners_provider_runner_absent_terminated', {
25
31
  description: 'Owned provisioned runners marked terminated because they were absent from reconcile'
26
32
  });
27
- export const provisionedRunnerTerminateIntentIssuedCount = meter.createCounter('runners_provisioned_runner_terminate_intent_issued', {
33
+ export const providerRunnerTerminateIntentIssuedCount = meter.createCounter('runners_provider_runner_terminate_intent_issued', {
28
34
  description: 'Provisioned runner terminate intents returned to provisioners'
29
35
  });
30
- export const provisionedRunnerTerminateIntentHonoredCount = meter.createCounter('runners_provisioned_runner_terminate_intent_honored', {
36
+ export const providerRunnerTerminateIntentHonoredCount = meter.createCounter('runners_provider_runner_terminate_intent_honored', {
31
37
  description: 'Provisioned runner terminate intents honored by first transition to terminated'
32
38
  });
33
39
  export const reservationReleasedCount = meter.createCounter('runners_reservation_released', {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nconst meter = instanceMetrics.getMeter('runners');\n\nexport const jobExecutionEnqueuedCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_enqueued',\n {\n description: 'Job executions added to the pending queue',\n },\n);\n\nexport const jobExecutionClaimedCount = meter.createCounter<{outcome: 'claimed' | 'empty'}>(\n 'runners_job_execution_claimed',\n {description: 'Job execution claim attempts by outcome'},\n);\n\nexport const jobExecutionLeaseExpiredCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_lease_expired',\n {description: 'Job execution leases reaped after passing the heartbeat threshold'},\n);\n\nexport const provisionedRunnerReportCount = meter.createCounter<{\n state: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'terminated';\n}>('runners_provisioned_runner_reported', {\n description: 'Provisioned runner lifecycle reports accepted by state',\n});\n\nexport const provisionedRunnerReapedCount = meter.createCounter<Record<string, never>>(\n 'runners_provisioned_runner_reaped',\n {\n description: 'Stale provisioned runners marked failed by backend maintenance',\n },\n);\n\nexport const provisionedRunnerCountDivergenceCount = meter.createCounter<{\n template_key?: string;\n state: 'starting' | 'running';\n direction: 'backend-higher' | 'advertised-higher';\n}>('runners_provisioned_runner_count_divergence', {\n description:\n 'Absolute difference between provisioner-advertised and backend-observed provisioned runner counts',\n});\n\nexport const provisionedRunnerReconcileCallCount = meter.createCounter<Record<string, never>>(\n 'runners_provisioned_runner_reconcile_called',\n {description: 'Provisioned runner reconcile calls completed successfully'},\n);\n\nexport const provisionedRunnerAbsentTerminatedCount = meter.createCounter<Record<string, never>>(\n 'runners_provisioned_runner_absent_terminated',\n {\n description:\n 'Owned provisioned runners marked terminated because they were absent from reconcile',\n },\n);\n\nexport const provisionedRunnerTerminateIntentIssuedCount = meter.createCounter<{\n surface: 'poll-demand' | 'reconcile';\n reason: 'job-cancelled' | 'terminal-state';\n}>('runners_provisioned_runner_terminate_intent_issued', {\n description: 'Provisioned runner terminate intents returned to provisioners',\n});\n\nexport const provisionedRunnerTerminateIntentHonoredCount = meter.createCounter<{\n reason: 'job-cancelled';\n}>('runners_provisioned_runner_terminate_intent_honored', {\n description: 'Provisioned runner terminate intents honored by first transition to terminated',\n});\n\nexport const reservationReleasedCount = meter.createCounter<Record<string, never>>(\n 'runners_reservation_released',\n {description: 'Reservation units released from terminal provisioned runner reports'},\n);\n\nexport type RunnersRateLimitAction = 'provisioner-mint' | 'ephemeral-register';\nexport type RunnersRateLimitScope = 'provisioner' | 'ephemeral-token';\nexport type RunnersRateLimitOutcome = 'allowed' | 'blocked' | 'unavailable';\n\nconst rateLimitCheckCount = meter.createCounter<{\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}>('runners_rate_limit_checks', {\n description: 'Runners rate limit checks by action, scope, and outcome',\n});\n\nconst rateLimitPruneFailureCount = meter.createCounter('runners_rate_limit_prune_failures', {\n description: 'Runners rate limit prune failures',\n});\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect runner or provisioner request outcomes.\n }\n}\n\nexport function recordRunnersRateLimitCheck(params: {\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}): void {\n recordMetric(() =>\n rateLimitCheckCount.add(1, {\n action: params.action,\n scope: params.scope,\n outcome: params.outcome,\n }),\n );\n}\n\nexport function recordRunnersRateLimitPruneFailure(): void {\n recordMetric(() => rateLimitPruneFailureCount.add(1));\n}\n"],"names":["instanceMetrics","meter","getMeter","jobExecutionEnqueuedCount","createCounter","description","jobExecutionClaimedCount","jobExecutionLeaseExpiredCount","provisionedRunnerReportCount","provisionedRunnerReapedCount","provisionedRunnerCountDivergenceCount","provisionedRunnerReconcileCallCount","provisionedRunnerAbsentTerminatedCount","provisionedRunnerTerminateIntentIssuedCount","provisionedRunnerTerminateIntentHonoredCount","reservationReleasedCount","rateLimitCheckCount","rateLimitPruneFailureCount","recordMetric","record","recordRunnersRateLimitCheck","params","add","action","scope","outcome","recordRunnersRateLimitPruneFailure"],"mappings":"AAAA,SAAQA,eAAe,QAAO,8BAA8B;AAE5D,MAAMC,QAAQD,gBAAgBE,QAAQ,CAAC;AAEvC,OAAO,MAAMC,4BAA4BF,MAAMG,aAAa,CAC1D,kCACA;IACEC,aAAa;AACf,GACA;AAEF,OAAO,MAAMC,2BAA2BL,MAAMG,aAAa,CACzD,iCACA;IAACC,aAAa;AAAyC,GACvD;AAEF,OAAO,MAAME,gCAAgCN,MAAMG,aAAa,CAC9D,uCACA;IAACC,aAAa;AAAmE,GACjF;AAEF,OAAO,MAAMG,+BAA+BP,MAAMG,aAAa,CAE5D,uCAAuC;IACxCC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMI,+BAA+BR,MAAMG,aAAa,CAC7D,qCACA;IACEC,aAAa;AACf,GACA;AAEF,OAAO,MAAMK,wCAAwCT,MAAMG,aAAa,CAIrE,+CAA+C;IAChDC,aACE;AACJ,GAAG;AAEH,OAAO,MAAMM,sCAAsCV,MAAMG,aAAa,CACpE,+CACA;IAACC,aAAa;AAA2D,GACzE;AAEF,OAAO,MAAMO,yCAAyCX,MAAMG,aAAa,CACvE,gDACA;IACEC,aACE;AACJ,GACA;AAEF,OAAO,MAAMQ,8CAA8CZ,MAAMG,aAAa,CAG3E,sDAAsD;IACvDC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMS,+CAA+Cb,MAAMG,aAAa,CAE5E,uDAAuD;IACxDC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMU,2BAA2Bd,MAAMG,aAAa,CACzD,gCACA;IAACC,aAAa;AAAqE,GACnF;AAMF,MAAMW,sBAAsBf,MAAMG,aAAa,CAI5C,6BAA6B;IAC9BC,aAAa;AACf;AAEA,MAAMY,6BAA6BhB,MAAMG,aAAa,CAAC,qCAAqC;IAC1FC,aAAa;AACf;AAEA,SAASa,aAAaC,MAAkB;IACtC,IAAI;QACFA;IACF,EAAE,OAAM;IACN,kEAAkE;IACpE;AACF;AAEA,OAAO,SAASC,4BAA4BC,MAI3C;IACCH,aAAa,IACXF,oBAAoBM,GAAG,CAAC,GAAG;YACzBC,QAAQF,OAAOE,MAAM;YACrBC,OAAOH,OAAOG,KAAK;YACnBC,SAASJ,OAAOI,OAAO;QACzB;AAEJ;AAEA,OAAO,SAASC;IACdR,aAAa,IAAMD,2BAA2BK,GAAG,CAAC;AACpD"}
1
+ {"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nconst meter = instanceMetrics.getMeter('runners');\n\nexport const jobExecutionEnqueuedCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_enqueued',\n {\n description: 'Job executions added to the pending queue',\n },\n);\n\nexport const jobExecutionClaimedCount = meter.createCounter<{outcome: 'claimed' | 'empty'}>(\n 'runners_job_execution_claimed',\n {description: 'Job execution claim attempts by outcome'},\n);\n\nexport const jobExecutionLeaseExpiredCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_lease_expired',\n {description: 'Job execution leases reaped after passing the heartbeat threshold'},\n);\n\nexport const providerRunnerReportCount = meter.createCounter<{\n state: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'terminated';\n}>('runners_provider_runner_reported', {\n description: 'Provisioned runner lifecycle reports accepted by state',\n});\n\nexport const runnerBootstrapExchangeCount = meter.createCounter<{\n outcome: 'accepted' | 'rejected';\n}>('runners_runner_bootstrap_exchange', {\n description: 'Runner bootstrap-token exchanges by outcome',\n});\n\nexport const runnerControlHeartbeatCount = meter.createCounter<Record<string, never>>(\n 'runners_runner_control_heartbeat',\n {description: 'Pre-workspace runner-control heartbeats accepted'},\n);\n\nexport const providerRunnerReapedCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_reaped',\n {\n description: 'Stale provisioned runners marked failed by backend maintenance',\n },\n);\n\nexport const providerRunnerCountDivergenceCount = meter.createCounter<{\n template_key?: string;\n state: 'starting' | 'running';\n direction: 'backend-higher' | 'advertised-higher';\n}>('runners_provider_runner_count_divergence', {\n description:\n 'Absolute difference between provisioner-advertised and backend-observed provisioned runner counts',\n});\n\nexport const providerRunnerReconcileCallCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_reconcile_called',\n {description: 'Provisioned runner reconcile calls completed successfully'},\n);\n\nexport const providerRunnerAbsentTerminatedCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_absent_terminated',\n {\n description:\n 'Owned provisioned runners marked terminated because they were absent from reconcile',\n },\n);\n\nexport const providerRunnerTerminateIntentIssuedCount = meter.createCounter<{\n surface: 'poll-demand' | 'reconcile';\n reason: 'job-cancelled' | 'terminal-state';\n}>('runners_provider_runner_terminate_intent_issued', {\n description: 'Provisioned runner terminate intents returned to provisioners',\n});\n\nexport const providerRunnerTerminateIntentHonoredCount = meter.createCounter<{\n reason: 'job-cancelled';\n}>('runners_provider_runner_terminate_intent_honored', {\n description: 'Provisioned runner terminate intents honored by first transition to terminated',\n});\n\nexport const reservationReleasedCount = meter.createCounter<Record<string, never>>(\n 'runners_reservation_released',\n {description: 'Reservation units released from terminal provisioned runner reports'},\n);\n\nexport type RunnersRateLimitAction = 'provisioner-mint' | 'ephemeral-register';\nexport type RunnersRateLimitScope = 'provisioner' | 'ephemeral-token';\nexport type RunnersRateLimitOutcome = 'allowed' | 'blocked' | 'unavailable';\n\nconst rateLimitCheckCount = meter.createCounter<{\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}>('runners_rate_limit_checks', {\n description: 'Runners rate limit checks by action, scope, and outcome',\n});\n\nconst rateLimitPruneFailureCount = meter.createCounter('runners_rate_limit_prune_failures', {\n description: 'Runners rate limit prune failures',\n});\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect runner or provisioner request outcomes.\n }\n}\n\nexport function recordRunnersRateLimitCheck(params: {\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}): void {\n recordMetric(() =>\n rateLimitCheckCount.add(1, {\n action: params.action,\n scope: params.scope,\n outcome: params.outcome,\n }),\n );\n}\n\nexport function recordRunnersRateLimitPruneFailure(): void {\n recordMetric(() => rateLimitPruneFailureCount.add(1));\n}\n"],"names":["instanceMetrics","meter","getMeter","jobExecutionEnqueuedCount","createCounter","description","jobExecutionClaimedCount","jobExecutionLeaseExpiredCount","providerRunnerReportCount","runnerBootstrapExchangeCount","runnerControlHeartbeatCount","providerRunnerReapedCount","providerRunnerCountDivergenceCount","providerRunnerReconcileCallCount","providerRunnerAbsentTerminatedCount","providerRunnerTerminateIntentIssuedCount","providerRunnerTerminateIntentHonoredCount","reservationReleasedCount","rateLimitCheckCount","rateLimitPruneFailureCount","recordMetric","record","recordRunnersRateLimitCheck","params","add","action","scope","outcome","recordRunnersRateLimitPruneFailure"],"mappings":"AAAA,SAAQA,eAAe,QAAO,8BAA8B;AAE5D,MAAMC,QAAQD,gBAAgBE,QAAQ,CAAC;AAEvC,OAAO,MAAMC,4BAA4BF,MAAMG,aAAa,CAC1D,kCACA;IACEC,aAAa;AACf,GACA;AAEF,OAAO,MAAMC,2BAA2BL,MAAMG,aAAa,CACzD,iCACA;IAACC,aAAa;AAAyC,GACvD;AAEF,OAAO,MAAME,gCAAgCN,MAAMG,aAAa,CAC9D,uCACA;IAACC,aAAa;AAAmE,GACjF;AAEF,OAAO,MAAMG,4BAA4BP,MAAMG,aAAa,CAEzD,oCAAoC;IACrCC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMI,+BAA+BR,MAAMG,aAAa,CAE5D,qCAAqC;IACtCC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMK,8BAA8BT,MAAMG,aAAa,CAC5D,oCACA;IAACC,aAAa;AAAkD,GAChE;AAEF,OAAO,MAAMM,4BAA4BV,MAAMG,aAAa,CAC1D,kCACA;IACEC,aAAa;AACf,GACA;AAEF,OAAO,MAAMO,qCAAqCX,MAAMG,aAAa,CAIlE,4CAA4C;IAC7CC,aACE;AACJ,GAAG;AAEH,OAAO,MAAMQ,mCAAmCZ,MAAMG,aAAa,CACjE,4CACA;IAACC,aAAa;AAA2D,GACzE;AAEF,OAAO,MAAMS,sCAAsCb,MAAMG,aAAa,CACpE,6CACA;IACEC,aACE;AACJ,GACA;AAEF,OAAO,MAAMU,2CAA2Cd,MAAMG,aAAa,CAGxE,mDAAmD;IACpDC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMW,4CAA4Cf,MAAMG,aAAa,CAEzE,oDAAoD;IACrDC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMY,2BAA2BhB,MAAMG,aAAa,CACzD,gCACA;IAACC,aAAa;AAAqE,GACnF;AAMF,MAAMa,sBAAsBjB,MAAMG,aAAa,CAI5C,6BAA6B;IAC9BC,aAAa;AACf;AAEA,MAAMc,6BAA6BlB,MAAMG,aAAa,CAAC,qCAAqC;IAC1FC,aAAa;AACf;AAEA,SAASe,aAAaC,MAAkB;IACtC,IAAI;QACFA;IACF,EAAE,OAAM;IACN,kEAAkE;IACpE;AACF;AAEA,OAAO,SAASC,4BAA4BC,MAI3C;IACCH,aAAa,IACXF,oBAAoBM,GAAG,CAAC,GAAG;YACzBC,QAAQF,OAAOE,MAAM;YACrBC,OAAOH,OAAOG,KAAK;YACnBC,SAASJ,OAAOI,OAAO;QACzB;AAEJ;AAEA,OAAO,SAASC;IACdR,aAAa,IAAMD,2BAA2BK,GAAG,CAAC;AACpD"}
@@ -1,3 +1,4 @@
1
1
  export { createProvisionerTokenAuthMethod } from './provisioner-token-auth.js';
2
+ export { authenticateRunnerControlSession, createRunnerControlSessionAuthMethod, } from './runner-control-session-auth.js';
2
3
  export { createRunnerRegistrationTokenAuthMethod, getRunnerContext, type RunnerRegistrationContext, } from './runner-registration-token-auth.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gCAAgC,EAAC,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EACL,uCAAuC,EACvC,gBAAgB,EAChB,KAAK,yBAAyB,GAC/B,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gCAAgC,EAAC,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EACL,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,uCAAuC,EACvC,gBAAgB,EAChB,KAAK,yBAAyB,GAC/B,MAAM,qCAAqC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { createProvisionerTokenAuthMethod } from './provisioner-token-auth.js';
2
+ export { authenticateRunnerControlSession, createRunnerControlSessionAuthMethod } from './runner-control-session-auth.js';
2
3
  export { createRunnerRegistrationTokenAuthMethod, getRunnerContext } from './runner-registration-token-auth.js';
3
4
 
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/auth/index.ts"],"sourcesContent":["export {createProvisionerTokenAuthMethod} from './provisioner-token-auth.js';\nexport {\n createRunnerRegistrationTokenAuthMethod,\n getRunnerContext,\n type RunnerRegistrationContext,\n} from './runner-registration-token-auth.js';\n"],"names":["createProvisionerTokenAuthMethod","createRunnerRegistrationTokenAuthMethod","getRunnerContext"],"mappings":"AAAA,SAAQA,gCAAgC,QAAO,8BAA8B;AAC7E,SACEC,uCAAuC,EACvCC,gBAAgB,QAEX,sCAAsC"}
1
+ {"version":3,"sources":["../../../src/presentation/auth/index.ts"],"sourcesContent":["export {createProvisionerTokenAuthMethod} from './provisioner-token-auth.js';\nexport {\n authenticateRunnerControlSession,\n createRunnerControlSessionAuthMethod,\n} from './runner-control-session-auth.js';\nexport {\n createRunnerRegistrationTokenAuthMethod,\n getRunnerContext,\n type RunnerRegistrationContext,\n} from './runner-registration-token-auth.js';\n"],"names":["createProvisionerTokenAuthMethod","authenticateRunnerControlSession","createRunnerControlSessionAuthMethod","createRunnerRegistrationTokenAuthMethod","getRunnerContext"],"mappings":"AAAA,SAAQA,gCAAgC,QAAO,8BAA8B;AAC7E,SACEC,gCAAgC,EAChCC,oCAAoC,QAC/B,mCAAmC;AAC1C,SACEC,uCAAuC,EACvCC,gBAAgB,QAEX,sCAAsC"}
@@ -1 +1 @@
1
- {"version":3,"file":"provisioner-token-auth.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/provisioner-token-auth.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,KAAK,UAAU,EAAkC,MAAM,uBAAuB,CAAC;AAQvF,wBAAgB,gCAAgC,IAAI,UAAU,CAoD7D"}
1
+ {"version":3,"file":"provisioner-token-auth.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/provisioner-token-auth.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,KAAK,UAAU,EAAkC,MAAM,uBAAuB,CAAC;AAQvF,wBAAgB,gCAAgC,IAAI,UAAU,CAwD7D"}
@@ -54,8 +54,12 @@ export function createProvisionerTokenAuthMethod() {
54
54
  status: 401
55
55
  });
56
56
  }
57
- const context = {
57
+ const context = provisionerToken.scope === 'installation' ? {
58
58
  provisionerTokenId: provisionerToken.id,
59
+ scope: 'installation'
60
+ } : {
61
+ provisionerTokenId: provisionerToken.id,
62
+ scope: 'workspace',
59
63
  workspaceId: provisionerToken.workspaceId
60
64
  };
61
65
  await touchProvisionerLastSeen({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/auth/provisioner-token-auth.ts"],"sourcesContent":["import {\n AUTH_PROVISIONER_TOKEN,\n type ProvisionerContext,\n setProvisionerContext,\n} from '@shipfox/api-auth-context';\nimport {type AuthMethod, ClientError, extractBearerToken} from '@shipfox/node-fastify';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {extractDisplayPrefix, getTokenType, hashOpaqueToken} from '@shipfox/node-tokens';\nimport {config} from '#config.js';\nimport {resolveProvisionerTokenByHash, touchProvisionerLastSeen} from '#db/provisioner-tokens.js';\n\ntype AuthFailureReason = 'missing' | 'type' | 'not-found' | 'revoked' | 'expired';\n\nexport function createProvisionerTokenAuthMethod(): AuthMethod {\n return {\n name: AUTH_PROVISIONER_TOKEN,\n authenticate: async (request) => {\n const rawToken = extractBearerToken(request.headers.authorization);\n if (!rawToken) {\n logAuthFailure({reason: 'missing'});\n throw new ClientError('Missing or invalid Authorization header', 'unauthorized', {\n status: 401,\n });\n }\n\n if (getTokenType(rawToken) !== 'provisionerToken') {\n logAuthFailure({rawToken, reason: 'type'});\n throw new ClientError('Invalid provisioner token', 'unauthorized', {status: 401});\n }\n\n const provisionerToken = await resolveProvisionerTokenByHash(hashOpaqueToken(rawToken));\n if (!provisionerToken) {\n logAuthFailure({rawToken, reason: 'not-found'});\n throw new ClientError('Invalid provisioner token', 'unauthorized', {status: 401});\n }\n\n if (provisionerToken.revokedAt) {\n logAuthFailure({rawToken, reason: 'revoked'});\n throw new ClientError('Provisioner token has been revoked', 'provisioner-token-revoked', {\n status: 401,\n });\n }\n\n if (provisionerToken.expiresAt && provisionerToken.expiresAt <= new Date()) {\n logAuthFailure({rawToken, reason: 'expired'});\n throw new ClientError('Provisioner token has expired', 'provisioner-token-expired', {\n status: 401,\n });\n }\n\n const context: ProvisionerContext = {\n provisionerTokenId: provisionerToken.id,\n workspaceId: provisionerToken.workspaceId,\n };\n\n await touchProvisionerLastSeen({\n tokenId: provisionerToken.id,\n throttleSeconds: config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS,\n }).catch((error: unknown) => {\n logger().warn({error, provisionerTokenId: provisionerToken.id}, 'last-seen touch failed');\n });\n\n setProvisionerContext(request, context);\n },\n };\n}\n\nfunction logAuthFailure(params: {rawToken?: string | undefined; reason: AuthFailureReason}): void {\n logger().warn(\n {\n prefix: params.rawToken ? extractDisplayPrefix(params.rawToken) : undefined,\n reason: params.reason,\n },\n 'provisioner token auth failed',\n );\n}\n"],"names":["AUTH_PROVISIONER_TOKEN","setProvisionerContext","ClientError","extractBearerToken","logger","extractDisplayPrefix","getTokenType","hashOpaqueToken","config","resolveProvisionerTokenByHash","touchProvisionerLastSeen","createProvisionerTokenAuthMethod","name","authenticate","request","rawToken","headers","authorization","logAuthFailure","reason","status","provisionerToken","revokedAt","expiresAt","Date","context","provisionerTokenId","id","workspaceId","tokenId","throttleSeconds","PROVISIONER_LAST_SEEN_THROTTLE_SECONDS","catch","error","warn","params","prefix","undefined"],"mappings":"AAAA,SACEA,sBAAsB,EAEtBC,qBAAqB,QAChB,4BAA4B;AACnC,SAAyBC,WAAW,EAAEC,kBAAkB,QAAO,wBAAwB;AACvF,SAAQC,MAAM,QAAO,8BAA8B;AACnD,SAAQC,oBAAoB,EAAEC,YAAY,EAAEC,eAAe,QAAO,uBAAuB;AACzF,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,6BAA6B,EAAEC,wBAAwB,QAAO,4BAA4B;AAIlG,OAAO,SAASC;IACd,OAAO;QACLC,MAAMZ;QACNa,cAAc,OAAOC;YACnB,MAAMC,WAAWZ,mBAAmBW,QAAQE,OAAO,CAACC,aAAa;YACjE,IAAI,CAACF,UAAU;gBACbG,eAAe;oBAACC,QAAQ;gBAAS;gBACjC,MAAM,IAAIjB,YAAY,2CAA2C,gBAAgB;oBAC/EkB,QAAQ;gBACV;YACF;YAEA,IAAId,aAAaS,cAAc,oBAAoB;gBACjDG,eAAe;oBAACH;oBAAUI,QAAQ;gBAAM;gBACxC,MAAM,IAAIjB,YAAY,6BAA6B,gBAAgB;oBAACkB,QAAQ;gBAAG;YACjF;YAEA,MAAMC,mBAAmB,MAAMZ,8BAA8BF,gBAAgBQ;YAC7E,IAAI,CAACM,kBAAkB;gBACrBH,eAAe;oBAACH;oBAAUI,QAAQ;gBAAW;gBAC7C,MAAM,IAAIjB,YAAY,6BAA6B,gBAAgB;oBAACkB,QAAQ;gBAAG;YACjF;YAEA,IAAIC,iBAAiBC,SAAS,EAAE;gBAC9BJ,eAAe;oBAACH;oBAAUI,QAAQ;gBAAS;gBAC3C,MAAM,IAAIjB,YAAY,sCAAsC,6BAA6B;oBACvFkB,QAAQ;gBACV;YACF;YAEA,IAAIC,iBAAiBE,SAAS,IAAIF,iBAAiBE,SAAS,IAAI,IAAIC,QAAQ;gBAC1EN,eAAe;oBAACH;oBAAUI,QAAQ;gBAAS;gBAC3C,MAAM,IAAIjB,YAAY,iCAAiC,6BAA6B;oBAClFkB,QAAQ;gBACV;YACF;YAEA,MAAMK,UAA8B;gBAClCC,oBAAoBL,iBAAiBM,EAAE;gBACvCC,aAAaP,iBAAiBO,WAAW;YAC3C;YAEA,MAAMlB,yBAAyB;gBAC7BmB,SAASR,iBAAiBM,EAAE;gBAC5BG,iBAAiBtB,OAAOuB,sCAAsC;YAChE,GAAGC,KAAK,CAAC,CAACC;gBACR7B,SAAS8B,IAAI,CAAC;oBAACD;oBAAOP,oBAAoBL,iBAAiBM,EAAE;gBAAA,GAAG;YAClE;YAEA1B,sBAAsBa,SAASW;QACjC;IACF;AACF;AAEA,SAASP,eAAeiB,MAAkE;IACxF/B,SAAS8B,IAAI,CACX;QACEE,QAAQD,OAAOpB,QAAQ,GAAGV,qBAAqB8B,OAAOpB,QAAQ,IAAIsB;QAClElB,QAAQgB,OAAOhB,MAAM;IACvB,GACA;AAEJ"}
1
+ {"version":3,"sources":["../../../src/presentation/auth/provisioner-token-auth.ts"],"sourcesContent":["import {\n AUTH_PROVISIONER_TOKEN,\n type ProvisionerContext,\n setProvisionerContext,\n} from '@shipfox/api-auth-context';\nimport {type AuthMethod, ClientError, extractBearerToken} from '@shipfox/node-fastify';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {extractDisplayPrefix, getTokenType, hashOpaqueToken} from '@shipfox/node-tokens';\nimport {config} from '#config.js';\nimport {resolveProvisionerTokenByHash, touchProvisionerLastSeen} from '#db/provisioner-tokens.js';\n\ntype AuthFailureReason = 'missing' | 'type' | 'not-found' | 'revoked' | 'expired';\n\nexport function createProvisionerTokenAuthMethod(): AuthMethod {\n return {\n name: AUTH_PROVISIONER_TOKEN,\n authenticate: async (request) => {\n const rawToken = extractBearerToken(request.headers.authorization);\n if (!rawToken) {\n logAuthFailure({reason: 'missing'});\n throw new ClientError('Missing or invalid Authorization header', 'unauthorized', {\n status: 401,\n });\n }\n\n if (getTokenType(rawToken) !== 'provisionerToken') {\n logAuthFailure({rawToken, reason: 'type'});\n throw new ClientError('Invalid provisioner token', 'unauthorized', {status: 401});\n }\n\n const provisionerToken = await resolveProvisionerTokenByHash(hashOpaqueToken(rawToken));\n if (!provisionerToken) {\n logAuthFailure({rawToken, reason: 'not-found'});\n throw new ClientError('Invalid provisioner token', 'unauthorized', {status: 401});\n }\n\n if (provisionerToken.revokedAt) {\n logAuthFailure({rawToken, reason: 'revoked'});\n throw new ClientError('Provisioner token has been revoked', 'provisioner-token-revoked', {\n status: 401,\n });\n }\n\n if (provisionerToken.expiresAt && provisionerToken.expiresAt <= new Date()) {\n logAuthFailure({rawToken, reason: 'expired'});\n throw new ClientError('Provisioner token has expired', 'provisioner-token-expired', {\n status: 401,\n });\n }\n\n const context: ProvisionerContext =\n provisionerToken.scope === 'installation'\n ? {provisionerTokenId: provisionerToken.id, scope: 'installation'}\n : {\n provisionerTokenId: provisionerToken.id,\n scope: 'workspace',\n workspaceId: provisionerToken.workspaceId,\n };\n\n await touchProvisionerLastSeen({\n tokenId: provisionerToken.id,\n throttleSeconds: config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS,\n }).catch((error: unknown) => {\n logger().warn({error, provisionerTokenId: provisionerToken.id}, 'last-seen touch failed');\n });\n\n setProvisionerContext(request, context);\n },\n };\n}\n\nfunction logAuthFailure(params: {rawToken?: string | undefined; reason: AuthFailureReason}): void {\n logger().warn(\n {\n prefix: params.rawToken ? extractDisplayPrefix(params.rawToken) : undefined,\n reason: params.reason,\n },\n 'provisioner token auth failed',\n );\n}\n"],"names":["AUTH_PROVISIONER_TOKEN","setProvisionerContext","ClientError","extractBearerToken","logger","extractDisplayPrefix","getTokenType","hashOpaqueToken","config","resolveProvisionerTokenByHash","touchProvisionerLastSeen","createProvisionerTokenAuthMethod","name","authenticate","request","rawToken","headers","authorization","logAuthFailure","reason","status","provisionerToken","revokedAt","expiresAt","Date","context","scope","provisionerTokenId","id","workspaceId","tokenId","throttleSeconds","PROVISIONER_LAST_SEEN_THROTTLE_SECONDS","catch","error","warn","params","prefix","undefined"],"mappings":"AAAA,SACEA,sBAAsB,EAEtBC,qBAAqB,QAChB,4BAA4B;AACnC,SAAyBC,WAAW,EAAEC,kBAAkB,QAAO,wBAAwB;AACvF,SAAQC,MAAM,QAAO,8BAA8B;AACnD,SAAQC,oBAAoB,EAAEC,YAAY,EAAEC,eAAe,QAAO,uBAAuB;AACzF,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,6BAA6B,EAAEC,wBAAwB,QAAO,4BAA4B;AAIlG,OAAO,SAASC;IACd,OAAO;QACLC,MAAMZ;QACNa,cAAc,OAAOC;YACnB,MAAMC,WAAWZ,mBAAmBW,QAAQE,OAAO,CAACC,aAAa;YACjE,IAAI,CAACF,UAAU;gBACbG,eAAe;oBAACC,QAAQ;gBAAS;gBACjC,MAAM,IAAIjB,YAAY,2CAA2C,gBAAgB;oBAC/EkB,QAAQ;gBACV;YACF;YAEA,IAAId,aAAaS,cAAc,oBAAoB;gBACjDG,eAAe;oBAACH;oBAAUI,QAAQ;gBAAM;gBACxC,MAAM,IAAIjB,YAAY,6BAA6B,gBAAgB;oBAACkB,QAAQ;gBAAG;YACjF;YAEA,MAAMC,mBAAmB,MAAMZ,8BAA8BF,gBAAgBQ;YAC7E,IAAI,CAACM,kBAAkB;gBACrBH,eAAe;oBAACH;oBAAUI,QAAQ;gBAAW;gBAC7C,MAAM,IAAIjB,YAAY,6BAA6B,gBAAgB;oBAACkB,QAAQ;gBAAG;YACjF;YAEA,IAAIC,iBAAiBC,SAAS,EAAE;gBAC9BJ,eAAe;oBAACH;oBAAUI,QAAQ;gBAAS;gBAC3C,MAAM,IAAIjB,YAAY,sCAAsC,6BAA6B;oBACvFkB,QAAQ;gBACV;YACF;YAEA,IAAIC,iBAAiBE,SAAS,IAAIF,iBAAiBE,SAAS,IAAI,IAAIC,QAAQ;gBAC1EN,eAAe;oBAACH;oBAAUI,QAAQ;gBAAS;gBAC3C,MAAM,IAAIjB,YAAY,iCAAiC,6BAA6B;oBAClFkB,QAAQ;gBACV;YACF;YAEA,MAAMK,UACJJ,iBAAiBK,KAAK,KAAK,iBACvB;gBAACC,oBAAoBN,iBAAiBO,EAAE;gBAAEF,OAAO;YAAc,IAC/D;gBACEC,oBAAoBN,iBAAiBO,EAAE;gBACvCF,OAAO;gBACPG,aAAaR,iBAAiBQ,WAAW;YAC3C;YAEN,MAAMnB,yBAAyB;gBAC7BoB,SAAST,iBAAiBO,EAAE;gBAC5BG,iBAAiBvB,OAAOwB,sCAAsC;YAChE,GAAGC,KAAK,CAAC,CAACC;gBACR9B,SAAS+B,IAAI,CAAC;oBAACD;oBAAOP,oBAAoBN,iBAAiBO,EAAE;gBAAA,GAAG;YAClE;YAEA3B,sBAAsBa,SAASW;QACjC;IACF;AACF;AAEA,SAASP,eAAekB,MAAkE;IACxFhC,SAAS+B,IAAI,CACX;QACEE,QAAQD,OAAOrB,QAAQ,GAAGV,qBAAqB+B,OAAOrB,QAAQ,IAAIuB;QAClEnB,QAAQiB,OAAOjB,MAAM;IACvB,GACA;AAEJ"}
@@ -0,0 +1,4 @@
1
+ import { type AuthMethod } from '@shipfox/node-fastify';
2
+ export declare function createRunnerControlSessionAuthMethod(): AuthMethod;
3
+ export declare function authenticateRunnerControlSession(request: Parameters<AuthMethod['authenticate']>[0]): Promise<void>;
4
+ //# sourceMappingURL=runner-control-session-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-control-session-auth.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/runner-control-session-auth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,KAAK,UAAU,EAAkC,MAAM,uBAAuB,CAAC;AAIvF,wBAAgB,oCAAoC,IAAI,UAAU,CAKjE;AAED,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,iBAcnD"}
@@ -0,0 +1,29 @@
1
+ import { AUTH_RUNNER_CONTROL_SESSION, setRunnerControlSessionContext } from '@shipfox/api-auth-context';
2
+ import { ClientError, extractBearerToken } from '@shipfox/node-fastify';
3
+ import { getTokenType } from '@shipfox/node-tokens';
4
+ import { resolveRunnerControlSession } from '#core/runner-control-sessions.js';
5
+ export function createRunnerControlSessionAuthMethod() {
6
+ return {
7
+ name: AUTH_RUNNER_CONTROL_SESSION,
8
+ authenticate: authenticateRunnerControlSession
9
+ };
10
+ }
11
+ export async function authenticateRunnerControlSession(request) {
12
+ const rawToken = extractBearerToken(request.headers.authorization);
13
+ if (!rawToken || getTokenType(rawToken) !== 'runnerControlSession') {
14
+ throw new ClientError('Invalid runner control session', 'unauthorized', {
15
+ status: 401
16
+ });
17
+ }
18
+ const session = await resolveRunnerControlSession(rawToken);
19
+ if (!session) throw new ClientError('Invalid runner control session', 'unauthorized', {
20
+ status: 401
21
+ });
22
+ setRunnerControlSessionContext(request, {
23
+ runnerControlSessionId: session.id,
24
+ runnerInstanceId: session.runnerInstanceId,
25
+ provisionerId: session.provisionerId
26
+ });
27
+ }
28
+
29
+ //# sourceMappingURL=runner-control-session-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/auth/runner-control-session-auth.ts"],"sourcesContent":["import {\n AUTH_RUNNER_CONTROL_SESSION,\n setRunnerControlSessionContext,\n} from '@shipfox/api-auth-context';\nimport {type AuthMethod, ClientError, extractBearerToken} from '@shipfox/node-fastify';\nimport {getTokenType} from '@shipfox/node-tokens';\nimport {resolveRunnerControlSession} from '#core/runner-control-sessions.js';\n\nexport function createRunnerControlSessionAuthMethod(): AuthMethod {\n return {\n name: AUTH_RUNNER_CONTROL_SESSION,\n authenticate: authenticateRunnerControlSession,\n };\n}\n\nexport async function authenticateRunnerControlSession(\n request: Parameters<AuthMethod['authenticate']>[0],\n) {\n const rawToken = extractBearerToken(request.headers.authorization);\n if (!rawToken || getTokenType(rawToken) !== 'runnerControlSession') {\n throw new ClientError('Invalid runner control session', 'unauthorized', {status: 401});\n }\n const session = await resolveRunnerControlSession(rawToken);\n if (!session)\n throw new ClientError('Invalid runner control session', 'unauthorized', {status: 401});\n setRunnerControlSessionContext(request, {\n runnerControlSessionId: session.id,\n runnerInstanceId: session.runnerInstanceId,\n provisionerId: session.provisionerId,\n });\n}\n"],"names":["AUTH_RUNNER_CONTROL_SESSION","setRunnerControlSessionContext","ClientError","extractBearerToken","getTokenType","resolveRunnerControlSession","createRunnerControlSessionAuthMethod","name","authenticate","authenticateRunnerControlSession","request","rawToken","headers","authorization","status","session","runnerControlSessionId","id","runnerInstanceId","provisionerId"],"mappings":"AAAA,SACEA,2BAA2B,EAC3BC,8BAA8B,QACzB,4BAA4B;AACnC,SAAyBC,WAAW,EAAEC,kBAAkB,QAAO,wBAAwB;AACvF,SAAQC,YAAY,QAAO,uBAAuB;AAClD,SAAQC,2BAA2B,QAAO,mCAAmC;AAE7E,OAAO,SAASC;IACd,OAAO;QACLC,MAAMP;QACNQ,cAAcC;IAChB;AACF;AAEA,OAAO,eAAeA,iCACpBC,OAAkD;IAElD,MAAMC,WAAWR,mBAAmBO,QAAQE,OAAO,CAACC,aAAa;IACjE,IAAI,CAACF,YAAYP,aAAaO,cAAc,wBAAwB;QAClE,MAAM,IAAIT,YAAY,kCAAkC,gBAAgB;YAACY,QAAQ;QAAG;IACtF;IACA,MAAMC,UAAU,MAAMV,4BAA4BM;IAClD,IAAI,CAACI,SACH,MAAM,IAAIb,YAAY,kCAAkC,gBAAgB;QAACY,QAAQ;IAAG;IACtFb,+BAA+BS,SAAS;QACtCM,wBAAwBD,QAAQE,EAAE;QAClCC,kBAAkBH,QAAQG,gBAAgB;QAC1CC,eAAeJ,QAAQI,aAAa;IACtC;AACF"}
@@ -10,7 +10,11 @@ export type RunnerRegistrationContext = {
10
10
  workspaceId: string;
11
11
  provisionerId: string;
12
12
  reservationId: string | null;
13
- provisionedRunnerId: string;
13
+ providerRunnerId: string;
14
+ } | {
15
+ kind: 'activation';
16
+ activationTokenId: string;
17
+ workspaceId: string;
14
18
  };
15
19
  export declare function getRunnerContext(request: FastifyRequest): RunnerRegistrationContext;
16
20
  export declare function createRunnerRegistrationTokenAuthMethod(): AuthMethod;
@@ -1 +1 @@
1
- {"version":3,"file":"runner-registration-token-auth.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/runner-registration-token-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,UAAU,EAAkC,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAM5C,MAAM,MAAM,yBAAyB,GACjC;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEN,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,yBAAyB,CAQnF;AAED,wBAAgB,uCAAuC,IAAI,UAAU,CAsEpE"}
1
+ {"version":3,"file":"runner-registration-token-auth.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/runner-registration-token-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,UAAU,EAAkC,MAAM,uBAAuB,CAAC;AAGvF,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAU5C,MAAM,MAAM,yBAAyB,GACjC;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GACD;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,CAAC;AAEzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,yBAAyB,CAQnF;AAED,wBAAgB,uCAAuC,IAAI,UAAU,CAoGpE"}
@@ -1,8 +1,13 @@
1
1
  import { AUTH_RUNNER_REGISTRATION_TOKEN } from '@shipfox/api-auth-context';
2
2
  import { ClientError, extractBearerToken } from '@shipfox/node-fastify';
3
3
  import { getTokenType, hashOpaqueToken } from '@shipfox/node-tokens';
4
+ import { and, eq, gt, isNull, or, sql } from 'drizzle-orm';
5
+ import { db } from '#db/db.js';
4
6
  import { resolveEphemeralRegistrationTokenByHash } from '#db/ephemeral-registration-tokens.js';
5
7
  import { resolveManualRegistrationTokenByHash } from '#db/manual-registration-tokens.js';
8
+ import { provisionerTokens } from '#db/schema/provisioner-tokens.js';
9
+ import { runnerActivationTokens } from '#db/schema/runner-activation-tokens.js';
10
+ import { providerRunners } from '#db/schema/runner-instances.js';
6
11
  const RUNNER_CONTEXT_KEY = 'runner';
7
12
  export function getRunnerContext(request) {
8
13
  const context = request[RUNNER_CONTEXT_KEY];
@@ -22,6 +27,21 @@ export function createRunnerRegistrationTokenAuthMethod() {
22
27
  });
23
28
  }
24
29
  const tokenType = getTokenType(rawToken);
30
+ if (tokenType === 'runnerActivationToken') {
31
+ const [activation] = await db().select({
32
+ id: runnerActivationTokens.id,
33
+ workspaceId: providerRunners.workspaceId
34
+ }).from(runnerActivationTokens).innerJoin(providerRunners, eq(providerRunners.id, runnerActivationTokens.runnerInstanceId)).leftJoin(provisionerTokens, eq(provisionerTokens.id, providerRunners.provisionerId)).where(and(eq(runnerActivationTokens.hashedToken, hashOpaqueToken(rawToken)), isNull(runnerActivationTokens.consumedAt), isNull(runnerActivationTokens.revokedAt), gt(runnerActivationTokens.expiresAt, sql`now()`), or(isNull(provisionerTokens.id), isNull(provisionerTokens.revokedAt)), isNull(providerRunners.runnerSessionId))).limit(1);
35
+ if (!activation?.workspaceId) throw new ClientError('Invalid runner registration token', 'unauthorized', {
36
+ status: 401
37
+ });
38
+ request[RUNNER_CONTEXT_KEY] = {
39
+ kind: 'activation',
40
+ activationTokenId: activation.id,
41
+ workspaceId: activation.workspaceId
42
+ };
43
+ return;
44
+ }
25
45
  if (tokenType === 'ephemeralRegistrationToken') {
26
46
  const ephemeralToken = await resolveEphemeralRegistrationTokenByHash(hashOpaqueToken(rawToken));
27
47
  if (!ephemeralToken) {
@@ -40,7 +60,7 @@ export function createRunnerRegistrationTokenAuthMethod() {
40
60
  workspaceId: ephemeralToken.workspaceId,
41
61
  provisionerId: ephemeralToken.provisionerId,
42
62
  reservationId: ephemeralToken.reservationId,
43
- provisionedRunnerId: ephemeralToken.provisionedRunnerId
63
+ providerRunnerId: ephemeralToken.providerRunnerId
44
64
  };
45
65
  return;
46
66
  }