@shipfox/api-runners 12.0.0 → 12.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/CHANGELOG.md +30 -0
  3. package/dist/config.d.ts +3 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +24 -2
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/errors.d.ts +4 -0
  8. package/dist/core/errors.d.ts.map +1 -1
  9. package/dist/core/errors.js +6 -0
  10. package/dist/core/errors.js.map +1 -1
  11. package/dist/core/index.d.ts +1 -1
  12. package/dist/core/index.d.ts.map +1 -1
  13. package/dist/core/index.js +1 -1
  14. package/dist/core/index.js.map +1 -1
  15. package/dist/core/rate-limit.d.ts.map +1 -1
  16. package/dist/core/runner-control-sessions.d.ts.map +1 -1
  17. package/dist/core/runner-control-sessions.js +23 -9
  18. package/dist/core/runner-control-sessions.js.map +1 -1
  19. package/dist/core/runner-instances.d.ts +1 -0
  20. package/dist/core/runner-instances.d.ts.map +1 -1
  21. package/dist/core/runner-instances.js.map +1 -1
  22. package/dist/core/runner-labels.d.ts +11 -0
  23. package/dist/core/runner-labels.d.ts.map +1 -0
  24. package/dist/core/runner-labels.js +41 -0
  25. package/dist/core/runner-labels.js.map +1 -0
  26. package/dist/core/runner-sessions.d.ts.map +1 -1
  27. package/dist/core/runner-sessions.js +5 -1
  28. package/dist/core/runner-sessions.js.map +1 -1
  29. package/dist/db/db.d.ts +64 -64
  30. package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
  31. package/dist/db/ephemeral-registration-tokens.js +12 -2
  32. package/dist/db/ephemeral-registration-tokens.js.map +1 -1
  33. package/dist/db/reservations.d.ts.map +1 -1
  34. package/dist/db/reservations.js +15 -5
  35. package/dist/db/reservations.js.map +1 -1
  36. package/dist/db/runner-instances.d.ts +1 -0
  37. package/dist/db/runner-instances.d.ts.map +1 -1
  38. package/dist/db/runner-instances.js +6 -4
  39. package/dist/db/runner-instances.js.map +1 -1
  40. package/dist/db/runner-sessions.d.ts.map +1 -1
  41. package/dist/db/runner-sessions.js +12 -1
  42. package/dist/db/runner-sessions.js.map +1 -1
  43. package/dist/db/schema/admin-command-results.d.ts +1 -1
  44. package/dist/db/schema/ephemeral-registration-tokens.d.ts +1 -1
  45. package/dist/db/schema/manual-registration-tokens.d.ts +1 -1
  46. package/dist/db/schema/outbox.d.ts +1 -1
  47. package/dist/db/schema/pending-job-executions.d.ts +3 -3
  48. package/dist/db/schema/provisioner-capability-snapshots.d.ts +3 -3
  49. package/dist/db/schema/provisioner-tokens.d.ts +2 -2
  50. package/dist/db/schema/rate-limits.d.ts +1 -1
  51. package/dist/db/schema/reservations.d.ts +3 -3
  52. package/dist/db/schema/runner-activation-tokens.d.ts +1 -1
  53. package/dist/db/schema/runner-control-sessions.d.ts +2 -2
  54. package/dist/db/schema/runner-instances.d.ts +4 -4
  55. package/dist/db/schema/runner-instances.d.ts.map +1 -1
  56. package/dist/db/schema/runner-instances.js +1 -0
  57. package/dist/db/schema/runner-instances.js.map +1 -1
  58. package/dist/db/schema/runner-sessions.d.ts +4 -4
  59. package/dist/db/schema/running-job-executions.d.ts +5 -5
  60. package/dist/metrics/index.d.ts +2 -1
  61. package/dist/metrics/index.d.ts.map +1 -1
  62. package/dist/metrics/index.js +1 -1
  63. package/dist/metrics/index.js.map +1 -1
  64. package/dist/metrics/instance.d.ts +13 -8
  65. package/dist/metrics/instance.d.ts.map +1 -1
  66. package/dist/metrics/instance.js +8 -0
  67. package/dist/metrics/instance.js.map +1 -1
  68. package/dist/presentation/dto/admin-provisioner-token.d.ts +1 -1
  69. package/dist/presentation/dto/admin-provisioner-token.d.ts.map +1 -1
  70. package/dist/presentation/dto/admin-runner-instances.d.ts +2 -2
  71. package/dist/presentation/dto/admin-runner-instances.d.ts.map +1 -1
  72. package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
  73. package/dist/presentation/routes/poll-demand.js +12 -6
  74. package/dist/presentation/routes/poll-demand.js.map +1 -1
  75. package/dist/presentation/routes/rate-limit.d.ts.map +1 -1
  76. package/dist/presentation/routes/register.d.ts.map +1 -1
  77. package/dist/presentation/routes/register.js +9 -1
  78. package/dist/presentation/routes/register.js.map +1 -1
  79. package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -1
  80. package/dist/presentation/routes/report-runner-instances.js +1 -0
  81. package/dist/presentation/routes/report-runner-instances.js.map +1 -1
  82. package/dist/tsconfig.test.tsbuildinfo +1 -1
  83. package/drizzle/0004_huge_skreet.sql +1 -0
  84. package/drizzle/meta/0004_snapshot.json +2194 -0
  85. package/drizzle/meta/_journal.json +7 -0
  86. package/package.json +9 -9
  87. package/src/config.test.ts +81 -0
  88. package/src/config.ts +39 -2
  89. package/src/core/errors.ts +9 -0
  90. package/src/core/index.ts +1 -0
  91. package/src/core/runner-control-sessions.test.ts +239 -0
  92. package/src/core/runner-control-sessions.ts +29 -10
  93. package/src/core/runner-instances.ts +1 -0
  94. package/src/core/runner-labels.test.ts +53 -0
  95. package/src/core/runner-labels.ts +51 -0
  96. package/src/core/runner-sessions.test.ts +34 -1
  97. package/src/core/runner-sessions.ts +8 -1
  98. package/src/db/ephemeral-registration-tokens.ts +15 -1
  99. package/src/db/reservations.test.ts +169 -0
  100. package/src/db/reservations.ts +42 -8
  101. package/src/db/runner-instances.test.ts +45 -1
  102. package/src/db/runner-instances.ts +7 -2
  103. package/src/db/runner-sessions.ts +14 -1
  104. package/src/db/schema/runner-instances.ts +3 -0
  105. package/src/metrics/index.ts +2 -0
  106. package/src/metrics/instance.ts +18 -0
  107. package/src/presentation/routes/poll-demand.test.ts +99 -3
  108. package/src/presentation/routes/poll-demand.ts +18 -6
  109. package/src/presentation/routes/register.test.ts +116 -2
  110. package/src/presentation/routes/register.ts +7 -0
  111. package/src/presentation/routes/report-runner-instances.test.ts +33 -0
  112. package/src/presentation/routes/report-runner-instances.ts +1 -0
  113. package/src/presentation/routes/runner-enrollment.test.ts +65 -5
  114. package/src/temporal/activities/maintenance-activities.test.ts +24 -31
  115. package/test/env.ts +1 -0
  116. package/tsconfig.build.tsbuildinfo +1 -1
package/dist/db/db.d.ts CHANGED
@@ -126,7 +126,7 @@ export declare const schema: {
126
126
  generated: undefined;
127
127
  }, {}, {}>;
128
128
  };
129
- dialect: "pg";
129
+ dialect: 'pg';
130
130
  }>;
131
131
  ephemeralRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
132
132
  name: "ephemeral_registration_tokens";
@@ -320,7 +320,7 @@ export declare const schema: {
320
320
  generated: undefined;
321
321
  }, {}, {}>;
322
322
  };
323
- dialect: "pg";
323
+ dialect: 'pg';
324
324
  }>;
325
325
  pendingJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
326
326
  name: "pending_jobs";
@@ -480,8 +480,8 @@ export declare const schema: {
480
480
  }, {}, {
481
481
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
482
482
  name: "required_labels";
483
- dataType: "string";
484
- columnType: "PgText";
483
+ dataType: 'string';
484
+ columnType: 'PgText';
485
485
  data: string;
486
486
  enumValues: [string, ...string[]];
487
487
  driverParam: string;
@@ -506,7 +506,7 @@ export declare const schema: {
506
506
  generated: undefined;
507
507
  }, {}, {}>;
508
508
  };
509
- dialect: "pg";
509
+ dialect: 'pg';
510
510
  }>;
511
511
  providerRunners: import("drizzle-orm/pg-core").PgTableWithColumns<{
512
512
  name: "runner_instances";
@@ -683,8 +683,8 @@ export declare const schema: {
683
683
  }, {}, {
684
684
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
685
685
  name: "labels";
686
- dataType: "string";
687
- columnType: "PgText";
686
+ dataType: 'string';
687
+ columnType: 'PgText';
688
688
  data: string;
689
689
  enumValues: [string, ...string[]];
690
690
  driverParam: string;
@@ -696,7 +696,7 @@ export declare const schema: {
696
696
  tableName: "runner_instances";
697
697
  dataType: "string";
698
698
  columnType: "PgEnumColumn";
699
- data: "starting" | "running" | "stopping" | "stopped" | "failed" | "terminated";
699
+ data: "failed" | "running" | "starting" | "stopped" | "stopping" | "terminated";
700
700
  driverParam: string;
701
701
  notNull: true;
702
702
  hasDefault: false;
@@ -984,7 +984,7 @@ export declare const schema: {
984
984
  generated: undefined;
985
985
  }, {}, {}>;
986
986
  };
987
- dialect: "pg";
987
+ dialect: 'pg';
988
988
  }>;
989
989
  provisionerCapabilitySnapshots: import("drizzle-orm/pg-core").PgTableWithColumns<{
990
990
  name: "provisioner_capability_snapshots";
@@ -1093,8 +1093,8 @@ export declare const schema: {
1093
1093
  }, {}, {
1094
1094
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
1095
1095
  name: "labels";
1096
- dataType: "string";
1097
- columnType: "PgText";
1096
+ dataType: 'string';
1097
+ columnType: 'PgText';
1098
1098
  data: string;
1099
1099
  enumValues: [string, ...string[]];
1100
1100
  driverParam: string;
@@ -1187,7 +1187,7 @@ export declare const schema: {
1187
1187
  generated: undefined;
1188
1188
  }, {}, {}>;
1189
1189
  };
1190
- dialect: "pg";
1190
+ dialect: 'pg';
1191
1191
  }>;
1192
1192
  provisionerTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
1193
1193
  name: "provisioner_tokens";
@@ -1215,7 +1215,7 @@ export declare const schema: {
1215
1215
  tableName: "provisioner_tokens";
1216
1216
  dataType: "string";
1217
1217
  columnType: "PgEnumColumn";
1218
- data: "workspace" | "installation";
1218
+ data: "installation" | "workspace";
1219
1219
  driverParam: string;
1220
1220
  notNull: true;
1221
1221
  hasDefault: false;
@@ -1415,7 +1415,7 @@ export declare const schema: {
1415
1415
  generated: undefined;
1416
1416
  }, {}, {}>;
1417
1417
  };
1418
- dialect: "pg";
1418
+ dialect: 'pg';
1419
1419
  }>;
1420
1420
  runnersRateLimits: import("drizzle-orm/pg-core").PgTableWithColumns<{
1421
1421
  name: "rate_limits";
@@ -1558,7 +1558,7 @@ export declare const schema: {
1558
1558
  generated: undefined;
1559
1559
  }, {}, {}>;
1560
1560
  };
1561
- dialect: "pg";
1561
+ dialect: 'pg';
1562
1562
  }>;
1563
1563
  reservations: import("drizzle-orm/pg-core").PgTableWithColumns<{
1564
1564
  name: "reservations";
@@ -1650,8 +1650,8 @@ export declare const schema: {
1650
1650
  }, {}, {
1651
1651
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
1652
1652
  name: "required_labels";
1653
- dataType: "string";
1654
- columnType: "PgText";
1653
+ dataType: 'string';
1654
+ columnType: 'PgText';
1655
1655
  data: string;
1656
1656
  enumValues: [string, ...string[]];
1657
1657
  driverParam: string;
@@ -1710,7 +1710,7 @@ export declare const schema: {
1710
1710
  generated: undefined;
1711
1711
  }, {}, {}>;
1712
1712
  };
1713
- dialect: "pg";
1713
+ dialect: 'pg';
1714
1714
  }>;
1715
1715
  runnerSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
1716
1716
  name: "runner_sessions";
@@ -1789,7 +1789,7 @@ export declare const schema: {
1789
1789
  tableName: "runner_sessions";
1790
1790
  dataType: "string";
1791
1791
  columnType: "PgEnumColumn";
1792
- data: "manual" | "ephemeral" | "activation";
1792
+ data: "activation" | "ephemeral" | "manual";
1793
1793
  driverParam: string;
1794
1794
  notNull: true;
1795
1795
  hasDefault: false;
@@ -1887,8 +1887,8 @@ export declare const schema: {
1887
1887
  }, {}, {
1888
1888
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
1889
1889
  name: "labels";
1890
- dataType: "string";
1891
- columnType: "PgText";
1890
+ dataType: 'string';
1891
+ columnType: 'PgText';
1892
1892
  data: string;
1893
1893
  enumValues: [string, ...string[]];
1894
1894
  driverParam: string;
@@ -2035,7 +2035,7 @@ export declare const schema: {
2035
2035
  generated: undefined;
2036
2036
  }, {}, {}>;
2037
2037
  };
2038
- dialect: "pg";
2038
+ dialect: 'pg';
2039
2039
  }>;
2040
2040
  runnerBootstrapTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
2041
2041
  name: "runner_bootstrap_tokens";
@@ -2195,7 +2195,7 @@ export declare const schema: {
2195
2195
  generated: undefined;
2196
2196
  }, {}, {}>;
2197
2197
  };
2198
- dialect: "pg";
2198
+ dialect: 'pg';
2199
2199
  }>;
2200
2200
  runnerControlSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
2201
2201
  name: "runner_control_sessions";
@@ -2372,7 +2372,7 @@ export declare const schema: {
2372
2372
  generated: undefined;
2373
2373
  }, {}, {}>;
2374
2374
  };
2375
- dialect: "pg";
2375
+ dialect: 'pg';
2376
2376
  }>;
2377
2377
  runnerActivationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
2378
2378
  name: "runner_activation_tokens";
@@ -2532,7 +2532,7 @@ export declare const schema: {
2532
2532
  generated: undefined;
2533
2533
  }, {}, {}>;
2534
2534
  };
2535
- dialect: "pg";
2535
+ dialect: 'pg';
2536
2536
  }>;
2537
2537
  manualRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
2538
2538
  name: "manual_registration_tokens";
@@ -2692,7 +2692,7 @@ export declare const schema: {
2692
2692
  generated: undefined;
2693
2693
  }, {}, {}>;
2694
2694
  };
2695
- dialect: "pg";
2695
+ dialect: 'pg';
2696
2696
  }>;
2697
2697
  runningJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
2698
2698
  name: "running_jobs";
@@ -2903,8 +2903,8 @@ export declare const schema: {
2903
2903
  }, {}, {
2904
2904
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
2905
2905
  name: "required_labels";
2906
- dataType: "string";
2907
- columnType: "PgText";
2906
+ dataType: 'string';
2907
+ columnType: 'PgText';
2908
2908
  data: string;
2909
2909
  enumValues: [string, ...string[]];
2910
2910
  driverParam: string;
@@ -2946,8 +2946,8 @@ export declare const schema: {
2946
2946
  }, {}, {
2947
2947
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
2948
2948
  name: "runner_labels";
2949
- dataType: "string";
2950
- columnType: "PgText";
2949
+ dataType: 'string';
2950
+ columnType: 'PgText';
2951
2951
  data: string;
2952
2952
  enumValues: [string, ...string[]];
2953
2953
  driverParam: string;
@@ -3023,7 +3023,7 @@ export declare const schema: {
3023
3023
  generated: undefined;
3024
3024
  }, {}, {}>;
3025
3025
  };
3026
- dialect: "pg";
3026
+ dialect: 'pg';
3027
3027
  }>;
3028
3028
  runnersOutbox: import("drizzle-orm/pg-core").PgTableWithColumns<{
3029
3029
  name: "outbox";
@@ -3217,7 +3217,7 @@ export declare const schema: {
3217
3217
  generated: undefined;
3218
3218
  }, {}, {}>;
3219
3219
  };
3220
- dialect: "pg";
3220
+ dialect: 'pg';
3221
3221
  }>;
3222
3222
  };
3223
3223
  export declare function db(): NodePgDatabase<{
@@ -3347,7 +3347,7 @@ export declare function db(): NodePgDatabase<{
3347
3347
  generated: undefined;
3348
3348
  }, {}, {}>;
3349
3349
  };
3350
- dialect: "pg";
3350
+ dialect: 'pg';
3351
3351
  }>;
3352
3352
  ephemeralRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
3353
3353
  name: "ephemeral_registration_tokens";
@@ -3541,7 +3541,7 @@ export declare function db(): NodePgDatabase<{
3541
3541
  generated: undefined;
3542
3542
  }, {}, {}>;
3543
3543
  };
3544
- dialect: "pg";
3544
+ dialect: 'pg';
3545
3545
  }>;
3546
3546
  pendingJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
3547
3547
  name: "pending_jobs";
@@ -3701,8 +3701,8 @@ export declare function db(): NodePgDatabase<{
3701
3701
  }, {}, {
3702
3702
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
3703
3703
  name: "required_labels";
3704
- dataType: "string";
3705
- columnType: "PgText";
3704
+ dataType: 'string';
3705
+ columnType: 'PgText';
3706
3706
  data: string;
3707
3707
  enumValues: [string, ...string[]];
3708
3708
  driverParam: string;
@@ -3727,7 +3727,7 @@ export declare function db(): NodePgDatabase<{
3727
3727
  generated: undefined;
3728
3728
  }, {}, {}>;
3729
3729
  };
3730
- dialect: "pg";
3730
+ dialect: 'pg';
3731
3731
  }>;
3732
3732
  providerRunners: import("drizzle-orm/pg-core").PgTableWithColumns<{
3733
3733
  name: "runner_instances";
@@ -3904,8 +3904,8 @@ export declare function db(): NodePgDatabase<{
3904
3904
  }, {}, {
3905
3905
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
3906
3906
  name: "labels";
3907
- dataType: "string";
3908
- columnType: "PgText";
3907
+ dataType: 'string';
3908
+ columnType: 'PgText';
3909
3909
  data: string;
3910
3910
  enumValues: [string, ...string[]];
3911
3911
  driverParam: string;
@@ -3917,7 +3917,7 @@ export declare function db(): NodePgDatabase<{
3917
3917
  tableName: "runner_instances";
3918
3918
  dataType: "string";
3919
3919
  columnType: "PgEnumColumn";
3920
- data: "starting" | "running" | "stopping" | "stopped" | "failed" | "terminated";
3920
+ data: "failed" | "running" | "starting" | "stopped" | "stopping" | "terminated";
3921
3921
  driverParam: string;
3922
3922
  notNull: true;
3923
3923
  hasDefault: false;
@@ -4205,7 +4205,7 @@ export declare function db(): NodePgDatabase<{
4205
4205
  generated: undefined;
4206
4206
  }, {}, {}>;
4207
4207
  };
4208
- dialect: "pg";
4208
+ dialect: 'pg';
4209
4209
  }>;
4210
4210
  provisionerCapabilitySnapshots: import("drizzle-orm/pg-core").PgTableWithColumns<{
4211
4211
  name: "provisioner_capability_snapshots";
@@ -4314,8 +4314,8 @@ export declare function db(): NodePgDatabase<{
4314
4314
  }, {}, {
4315
4315
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
4316
4316
  name: "labels";
4317
- dataType: "string";
4318
- columnType: "PgText";
4317
+ dataType: 'string';
4318
+ columnType: 'PgText';
4319
4319
  data: string;
4320
4320
  enumValues: [string, ...string[]];
4321
4321
  driverParam: string;
@@ -4408,7 +4408,7 @@ export declare function db(): NodePgDatabase<{
4408
4408
  generated: undefined;
4409
4409
  }, {}, {}>;
4410
4410
  };
4411
- dialect: "pg";
4411
+ dialect: 'pg';
4412
4412
  }>;
4413
4413
  provisionerTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
4414
4414
  name: "provisioner_tokens";
@@ -4436,7 +4436,7 @@ export declare function db(): NodePgDatabase<{
4436
4436
  tableName: "provisioner_tokens";
4437
4437
  dataType: "string";
4438
4438
  columnType: "PgEnumColumn";
4439
- data: "workspace" | "installation";
4439
+ data: "installation" | "workspace";
4440
4440
  driverParam: string;
4441
4441
  notNull: true;
4442
4442
  hasDefault: false;
@@ -4636,7 +4636,7 @@ export declare function db(): NodePgDatabase<{
4636
4636
  generated: undefined;
4637
4637
  }, {}, {}>;
4638
4638
  };
4639
- dialect: "pg";
4639
+ dialect: 'pg';
4640
4640
  }>;
4641
4641
  runnersRateLimits: import("drizzle-orm/pg-core").PgTableWithColumns<{
4642
4642
  name: "rate_limits";
@@ -4779,7 +4779,7 @@ export declare function db(): NodePgDatabase<{
4779
4779
  generated: undefined;
4780
4780
  }, {}, {}>;
4781
4781
  };
4782
- dialect: "pg";
4782
+ dialect: 'pg';
4783
4783
  }>;
4784
4784
  reservations: import("drizzle-orm/pg-core").PgTableWithColumns<{
4785
4785
  name: "reservations";
@@ -4871,8 +4871,8 @@ export declare function db(): NodePgDatabase<{
4871
4871
  }, {}, {
4872
4872
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
4873
4873
  name: "required_labels";
4874
- dataType: "string";
4875
- columnType: "PgText";
4874
+ dataType: 'string';
4875
+ columnType: 'PgText';
4876
4876
  data: string;
4877
4877
  enumValues: [string, ...string[]];
4878
4878
  driverParam: string;
@@ -4931,7 +4931,7 @@ export declare function db(): NodePgDatabase<{
4931
4931
  generated: undefined;
4932
4932
  }, {}, {}>;
4933
4933
  };
4934
- dialect: "pg";
4934
+ dialect: 'pg';
4935
4935
  }>;
4936
4936
  runnerSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
4937
4937
  name: "runner_sessions";
@@ -5010,7 +5010,7 @@ export declare function db(): NodePgDatabase<{
5010
5010
  tableName: "runner_sessions";
5011
5011
  dataType: "string";
5012
5012
  columnType: "PgEnumColumn";
5013
- data: "manual" | "ephemeral" | "activation";
5013
+ data: "activation" | "ephemeral" | "manual";
5014
5014
  driverParam: string;
5015
5015
  notNull: true;
5016
5016
  hasDefault: false;
@@ -5108,8 +5108,8 @@ export declare function db(): NodePgDatabase<{
5108
5108
  }, {}, {
5109
5109
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
5110
5110
  name: "labels";
5111
- dataType: "string";
5112
- columnType: "PgText";
5111
+ dataType: 'string';
5112
+ columnType: 'PgText';
5113
5113
  data: string;
5114
5114
  enumValues: [string, ...string[]];
5115
5115
  driverParam: string;
@@ -5256,7 +5256,7 @@ export declare function db(): NodePgDatabase<{
5256
5256
  generated: undefined;
5257
5257
  }, {}, {}>;
5258
5258
  };
5259
- dialect: "pg";
5259
+ dialect: 'pg';
5260
5260
  }>;
5261
5261
  runnerBootstrapTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
5262
5262
  name: "runner_bootstrap_tokens";
@@ -5416,7 +5416,7 @@ export declare function db(): NodePgDatabase<{
5416
5416
  generated: undefined;
5417
5417
  }, {}, {}>;
5418
5418
  };
5419
- dialect: "pg";
5419
+ dialect: 'pg';
5420
5420
  }>;
5421
5421
  runnerControlSessions: import("drizzle-orm/pg-core").PgTableWithColumns<{
5422
5422
  name: "runner_control_sessions";
@@ -5593,7 +5593,7 @@ export declare function db(): NodePgDatabase<{
5593
5593
  generated: undefined;
5594
5594
  }, {}, {}>;
5595
5595
  };
5596
- dialect: "pg";
5596
+ dialect: 'pg';
5597
5597
  }>;
5598
5598
  runnerActivationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
5599
5599
  name: "runner_activation_tokens";
@@ -5753,7 +5753,7 @@ export declare function db(): NodePgDatabase<{
5753
5753
  generated: undefined;
5754
5754
  }, {}, {}>;
5755
5755
  };
5756
- dialect: "pg";
5756
+ dialect: 'pg';
5757
5757
  }>;
5758
5758
  manualRegistrationTokens: import("drizzle-orm/pg-core").PgTableWithColumns<{
5759
5759
  name: "manual_registration_tokens";
@@ -5913,7 +5913,7 @@ export declare function db(): NodePgDatabase<{
5913
5913
  generated: undefined;
5914
5914
  }, {}, {}>;
5915
5915
  };
5916
- dialect: "pg";
5916
+ dialect: 'pg';
5917
5917
  }>;
5918
5918
  runningJobExecutions: import("drizzle-orm/pg-core").PgTableWithColumns<{
5919
5919
  name: "running_jobs";
@@ -6124,8 +6124,8 @@ export declare function db(): NodePgDatabase<{
6124
6124
  }, {}, {
6125
6125
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
6126
6126
  name: "required_labels";
6127
- dataType: "string";
6128
- columnType: "PgText";
6127
+ dataType: 'string';
6128
+ columnType: 'PgText';
6129
6129
  data: string;
6130
6130
  enumValues: [string, ...string[]];
6131
6131
  driverParam: string;
@@ -6167,8 +6167,8 @@ export declare function db(): NodePgDatabase<{
6167
6167
  }, {}, {
6168
6168
  baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
6169
6169
  name: "runner_labels";
6170
- dataType: "string";
6171
- columnType: "PgText";
6170
+ dataType: 'string';
6171
+ columnType: 'PgText';
6172
6172
  data: string;
6173
6173
  enumValues: [string, ...string[]];
6174
6174
  driverParam: string;
@@ -6244,7 +6244,7 @@ export declare function db(): NodePgDatabase<{
6244
6244
  generated: undefined;
6245
6245
  }, {}, {}>;
6246
6246
  };
6247
- dialect: "pg";
6247
+ dialect: 'pg';
6248
6248
  }>;
6249
6249
  runnersOutbox: import("drizzle-orm/pg-core").PgTableWithColumns<{
6250
6250
  name: "outbox";
@@ -6438,7 +6438,7 @@ export declare function db(): NodePgDatabase<{
6438
6438
  generated: undefined;
6439
6439
  }, {}, {}>;
6440
6440
  };
6441
- dialect: "pg";
6441
+ dialect: 'pg';
6442
6442
  }>;
6443
6443
  }>;
6444
6444
  export declare function closeDb(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ephemeral-registration-tokens.d.ts","sourceRoot":"","sources":["../../src/db/ephemeral-registration-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,gDAAgD,CAAC;AAoB/F,MAAM,WAAW,sCAAsC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,yCAAyC;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4CAA4C;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,yCAAyC,EAAE,CAAC;CACnD;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,0BAA0B,CAAC,CAiDrC;AAED,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,4CAA4C,GACnD,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAoGvC;AAED,wBAAsB,uCAAuC,CAC3D,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAUjD;AAED,MAAM,WAAW,8CAA8C;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,wCAAwC,CAC5D,MAAM,EAAE,8CAA8C,GACrD,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,0CAA0C,CAAC,MAAM,EAAE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB,qDAsFA"}
1
+ {"version":3,"file":"ephemeral-registration-tokens.d.ts","sourceRoot":"","sources":["../../src/db/ephemeral-registration-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,gDAAgD,CAAC;AAuB/F,MAAM,WAAW,sCAAsC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,yCAAyC;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4CAA4C;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,yCAAyC,EAAE,CAAC;CACnD;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,0BAA0B,CAAC,CAiDrC;AAED,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,4CAA4C,GACnD,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAoGvC;AAED,wBAAsB,uCAAuC,CAC3D,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAUjD;AAED,MAAM,WAAW,8CAA8C;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,wCAAwC,CAC5D,MAAM,EAAE,8CAA8C,GACrD,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,0CAA0C,CAAC,MAAM,EAAE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB,qDAiGA"}
@@ -1,7 +1,9 @@
1
1
  import { and, asc, eq, gt, inArray, isNull, lt, sql } from 'drizzle-orm';
2
- import { ActiveEphemeralRegistrationTokenExistsError, ActiveEphemeralRegistrationTokensExistError, RegistrationTokenBatchExceedsReservationError, RegistrationTokenConsumedError, RegistrationTokenExpiredError, RegistrationTokenWorkspaceMismatchError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
2
+ import { ActiveEphemeralRegistrationTokenExistsError, ActiveEphemeralRegistrationTokensExistError, EmptyRunnerLabelsError, RegistrationTokenBatchExceedsReservationError, RegistrationTokenConsumedError, RegistrationTokenExpiredError, RegistrationTokenWorkspaceMismatchError, ReservationExpiredError, ReservationNotFoundError } from '#core/errors.js';
3
+ import { sanitizeRunnerLabelsOrThrow } from '#core/runner-labels.js';
3
4
  import { db } from './db.js';
4
5
  import { ephemeralRegistrationTokens, toEphemeralRegistrationToken } from './schema/ephemeral-registration-tokens.js';
6
+ import { provisionerTokens } from './schema/provisioner-tokens.js';
5
7
  import { reservations } from './schema/reservations.js';
6
8
  import { providerRunners } from './schema/runner-instances.js';
7
9
  import { runnerSessions, toRunnerSession } from './schema/runner-sessions.js';
@@ -142,6 +144,14 @@ export async function createRunnerSessionConsumingEphemeralToken(params) {
142
144
  if (token.isExpired) throw new RegistrationTokenExpiredError(params.ephemeralTokenId);
143
145
  throw new Error(`Ephemeral registration token could not be consumed: ${params.ephemeralTokenId}`);
144
146
  }
147
+ const [provisioner] = await tx.select({
148
+ scope: provisionerTokens.scope
149
+ }).from(provisionerTokens).where(eq(provisionerTokens.id, consumed[0].provisionerId)).limit(1);
150
+ const labels = sanitizeRunnerLabelsOrThrow(params.labels, {
151
+ scope: provisioner?.scope ?? 'workspace',
152
+ source: 'ephemeral runner registration'
153
+ });
154
+ if (labels.length === 0) throw new EmptyRunnerLabelsError();
145
155
  const [session] = await tx.insert(runnerSessions).values({
146
156
  workspaceId: params.workspaceId,
147
157
  scope: 'workspace',
@@ -149,7 +159,7 @@ export async function createRunnerSessionConsumingEphemeralToken(params) {
149
159
  registrationTokenKind: 'ephemeral',
150
160
  provisionerId: consumed[0].provisionerId,
151
161
  providerRunnerId: consumed[0].providerRunnerId,
152
- labels: params.labels,
162
+ labels,
153
163
  toolCapabilities: params.toolCapabilities ?? null,
154
164
  toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,
155
165
  maxClaims: params.maxClaims,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/db/ephemeral-registration-tokens.ts"],"sourcesContent":["import type {RunnerToolCapabilitiesDto} from '@shipfox/api-runners-dto';\nimport {and, asc, eq, gt, inArray, isNull, lt, sql} from 'drizzle-orm';\nimport type {EphemeralRegistrationToken} from '#core/entities/ephemeral-registration-token.js';\nimport {\n ActiveEphemeralRegistrationTokenExistsError,\n ActiveEphemeralRegistrationTokensExistError,\n RegistrationTokenBatchExceedsReservationError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n RegistrationTokenWorkspaceMismatchError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\nimport {db} from './db.js';\nimport {\n ephemeralRegistrationTokens,\n toEphemeralRegistrationToken,\n} from './schema/ephemeral-registration-tokens.js';\nimport {reservations} from './schema/reservations.js';\nimport {providerRunners} from './schema/runner-instances.js';\nimport {runnerSessions, toRunnerSession} from './schema/runner-sessions.js';\n\nexport interface CreateEphemeralRegistrationTokenParams {\n workspaceId: string;\n provisionerId: string;\n reservationId?: string | null | undefined;\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n expiresAt: Date;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchRow {\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchParams {\n workspaceId: string;\n provisionerId: string;\n reservationId: string;\n expiresAt: Date;\n rows: CreateEphemeralRegistrationTokensBatchRow[];\n}\n\nexport async function createEphemeralRegistrationToken(\n params: CreateEphemeralRegistrationTokenParams,\n): Promise<EphemeralRegistrationToken> {\n const rows = await db().transaction(async (tx) => {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n\n const [active] = await tx\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.providerRunnerId, params.providerRunnerId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .limit(1);\n\n if (active) {\n throw new ActiveEphemeralRegistrationTokenExistsError(\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId ?? null,\n providerRunnerId: params.providerRunnerId,\n hashedToken: params.hashedToken,\n prefix: params.prefix,\n expiresAt: params.expiresAt,\n })\n .returning();\n });\n\n const row = rows[0];\n if (!row) throw new Error('Insert returned no rows');\n return toEphemeralRegistrationToken(row);\n}\n\nexport async function createEphemeralRegistrationTokensBatch(\n params: CreateEphemeralRegistrationTokensBatchParams,\n): Promise<EphemeralRegistrationToken[]> {\n const rows = await db().transaction(async (tx) => {\n const provisionerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionerLockKey}))`);\n for (const providerRunnerId of [\n ...new Set(params.rows.map((row) => row.providerRunnerId)),\n ].sort()) {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n }\n\n const [reservation] = await tx\n .select({\n count: reservations.count,\n isExpired: sql<boolean>`${reservations.expiresAt} <= now()`,\n })\n .from(reservations)\n .where(\n and(\n eq(reservations.id, params.reservationId),\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n ),\n )\n .limit(1);\n\n if (!reservation) throw new ReservationNotFoundError(params.reservationId);\n if (reservation.isExpired) throw new ReservationExpiredError(params.reservationId);\n if (params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n );\n }\n\n const [existingForReservation] = await tx\n .select({count: sql<number>`count(*)::int`})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.reservationId, params.reservationId),\n ),\n );\n const alreadyMinted = existingForReservation?.count ?? 0;\n if (alreadyMinted + params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n alreadyMinted,\n );\n }\n\n const providerRunnerIds = params.rows.map((row) => row.providerRunnerId);\n const activeRows = await tx\n .select({providerRunnerId: ephemeralRegistrationTokens.providerRunnerId})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n );\n\n if (activeRows.length > 0) {\n throw new ActiveEphemeralRegistrationTokensExistError(\n activeRows.map((row) => row.providerRunnerId),\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values(\n params.rows.map((row) => ({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId,\n providerRunnerId: row.providerRunnerId,\n hashedToken: row.hashedToken,\n prefix: row.prefix,\n expiresAt: params.expiresAt,\n })),\n )\n .returning();\n });\n\n return rows.map(toEphemeralRegistrationToken);\n}\n\nexport async function resolveEphemeralRegistrationTokenByHash(\n hashedToken: string,\n): Promise<EphemeralRegistrationToken | undefined> {\n const rows = await db()\n .select()\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.hashedToken, hashedToken))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toEphemeralRegistrationToken(row);\n}\n\nexport interface DeleteExpiredEphemeralRegistrationTokensParams {\n retentionDays: number;\n limit?: number;\n}\n\n/**\n * Deletes ephemeral registration tokens that have reached a terminal state and\n * outlived the retention window. A token is terminal once it is consumed\n * (single use spent) or expired without consumption; the retention window is\n * measured from that terminal event so the audit record survives a bounded\n * debugging window. Active tokens that are neither consumed nor expired are\n * never deleted, so a live single-use credential is never removed early.\n */\nexport async function deleteExpiredEphemeralRegistrationTokens(\n params: DeleteExpiredEphemeralRegistrationTokensParams,\n): Promise<number> {\n // coalesce(consumed_at, expires_at) is the terminal timestamp: consumed_at\n // when the token was spent, otherwise its expiry. Comparing it to the cutoff\n // both selects deletable rows and orders the batch, and it matches the\n // terminal index so idle GC ticks never scan live rows.\n const terminalAt = sql`coalesce(${ephemeralRegistrationTokens.consumedAt}, ${ephemeralRegistrationTokens.expiresAt})`;\n const retentionCutoff = sql`now() - (${params.retentionDays} || ' days')::interval`;\n\n const deletableIds = db()\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(lt(terminalAt, retentionCutoff))\n .orderBy(asc(terminalAt), asc(ephemeralRegistrationTokens.id))\n .limit(params.limit ?? 1000);\n\n const deleted = await db()\n .delete(ephemeralRegistrationTokens)\n .where(inArray(ephemeralRegistrationTokens.id, deletableIds))\n .returning({id: ephemeralRegistrationTokens.id});\n\n return deleted.length;\n}\n\nexport async function createRunnerSessionConsumingEphemeralToken(params: {\n ephemeralTokenId: string;\n workspaceId: string;\n labels: string[];\n toolCapabilities?: RunnerToolCapabilitiesDto | null;\n maxClaims: number;\n}) {\n return await db().transaction(async (tx) => {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);\n\n const consumed = await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedAt: sql`now()`})\n .where(\n and(\n eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId),\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .returning({\n id: ephemeralRegistrationTokens.id,\n provisionerId: ephemeralRegistrationTokens.provisionerId,\n providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,\n });\n\n if (!consumed[0]) {\n const [token] = await tx\n .select({\n workspaceId: ephemeralRegistrationTokens.workspaceId,\n consumedAt: ephemeralRegistrationTokens.consumedAt,\n isExpired: sql<boolean>`${ephemeralRegistrationTokens.expiresAt} <= now()`,\n })\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId))\n .limit(1);\n\n if (!token) {\n throw new Error(`Ephemeral registration token not found: ${params.ephemeralTokenId}`);\n }\n if (token.workspaceId !== params.workspaceId) {\n throw new RegistrationTokenWorkspaceMismatchError(\n params.ephemeralTokenId,\n params.workspaceId,\n );\n }\n if (token.consumedAt) throw new RegistrationTokenConsumedError(params.ephemeralTokenId);\n if (token.isExpired) throw new RegistrationTokenExpiredError(params.ephemeralTokenId);\n throw new Error(\n `Ephemeral registration token could not be consumed: ${params.ephemeralTokenId}`,\n );\n }\n\n const [session] = await tx\n .insert(runnerSessions)\n .values({\n workspaceId: params.workspaceId,\n scope: 'workspace',\n registrationTokenId: params.ephemeralTokenId,\n registrationTokenKind: 'ephemeral',\n provisionerId: consumed[0].provisionerId,\n providerRunnerId: consumed[0].providerRunnerId,\n labels: params.labels,\n toolCapabilities: params.toolCapabilities ?? null,\n toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,\n maxClaims: params.maxClaims,\n claimsUsed: 0,\n })\n .returning();\n\n if (!session) throw new Error('Insert returned no rows');\n\n await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedSessionId: session.id})\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId));\n\n await tx\n .update(providerRunners)\n .set({runnerSessionId: session.id, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, consumed[0].provisionerId),\n eq(providerRunners.providerRunnerId, consumed[0].providerRunnerId),\n isNull(providerRunners.reservationReleasedAt),\n ),\n );\n\n return toRunnerSession(session);\n });\n}\n"],"names":["and","asc","eq","gt","inArray","isNull","lt","sql","ActiveEphemeralRegistrationTokenExistsError","ActiveEphemeralRegistrationTokensExistError","RegistrationTokenBatchExceedsReservationError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","RegistrationTokenWorkspaceMismatchError","ReservationExpiredError","ReservationNotFoundError","db","ephemeralRegistrationTokens","toEphemeralRegistrationToken","reservations","providerRunners","runnerSessions","toRunnerSession","createEphemeralRegistrationToken","params","rows","transaction","tx","providerRunnerLockKey","workspaceId","provisionerId","providerRunnerId","join","execute","active","select","id","from","where","consumedAt","expiresAt","limit","insert","values","reservationId","hashedToken","prefix","returning","row","Error","createEphemeralRegistrationTokensBatch","provisionerLockKey","Set","map","sort","reservation","count","isExpired","length","existingForReservation","alreadyMinted","providerRunnerIds","activeRows","resolveEphemeralRegistrationTokenByHash","undefined","deleteExpiredEphemeralRegistrationTokens","terminalAt","retentionCutoff","retentionDays","deletableIds","orderBy","deleted","delete","createRunnerSessionConsumingEphemeralToken","consumed","update","set","ephemeralTokenId","token","session","scope","registrationTokenId","registrationTokenKind","labels","toolCapabilities","toolCapabilitiesReportedAt","maxClaims","claimsUsed","consumedSessionId","runnerSessionId","updatedAt","reservationReleasedAt"],"mappings":"AACA,SAAQA,GAAG,EAAEC,GAAG,EAAEC,EAAE,EAAEC,EAAE,EAAEC,OAAO,EAAEC,MAAM,EAAEC,EAAE,EAAEC,GAAG,QAAO,cAAc;AAEvE,SACEC,2CAA2C,EAC3CC,2CAA2C,EAC3CC,6CAA6C,EAC7CC,8BAA8B,EAC9BC,6BAA6B,EAC7BC,uCAAuC,EACvCC,uBAAuB,EACvBC,wBAAwB,QACnB,kBAAkB;AACzB,SAAQC,EAAE,QAAO,UAAU;AAC3B,SACEC,2BAA2B,EAC3BC,4BAA4B,QACvB,4CAA4C;AACnD,SAAQC,YAAY,QAAO,2BAA2B;AACtD,SAAQC,eAAe,QAAO,+BAA+B;AAC7D,SAAQC,cAAc,EAAEC,eAAe,QAAO,8BAA8B;AA0B5E,OAAO,eAAeC,iCACpBC,MAA8C;IAE9C,MAAMC,OAAO,MAAMT,KAAKU,WAAW,CAAC,OAAOC;QACzC,MAAMC,wBAAwB;YAC5B;YACAJ,OAAOK,WAAW;YAClBL,OAAOM,aAAa;YACpBN,OAAOO,gBAAgB;SACxB,CAACC,IAAI,CAAC;QACP,MAAML,GAAGM,OAAO,CAAC1B,GAAG,CAAC,sCAAsC,EAAEqB,sBAAsB,EAAE,CAAC;QAEtF,MAAM,CAACM,OAAO,GAAG,MAAMP,GACpBQ,MAAM,CAAC;YAACC,IAAInB,4BAA4BmB,EAAE;QAAA,GAC1CC,IAAI,CAACpB,6BACLqB,KAAK,CACJtC,IACEE,GAAGe,4BAA4BY,WAAW,EAAEL,OAAOK,WAAW,GAC9D3B,GAAGe,4BAA4Ba,aAAa,EAAEN,OAAOM,aAAa,GAClE5B,GAAGe,4BAA4Bc,gBAAgB,EAAEP,OAAOO,gBAAgB,GACxE1B,OAAOY,4BAA4BsB,UAAU,GAC7CpC,GAAGc,4BAA4BuB,SAAS,EAAEjC,GAAG,CAAC,KAAK,CAAC,IAGvDkC,KAAK,CAAC;QAET,IAAIP,QAAQ;YACV,MAAM,IAAI1B,4CACRgB,OAAOK,WAAW,EAClBL,OAAOM,aAAa,EACpBN,OAAOO,gBAAgB;QAE3B;QAEA,OAAO,MAAMJ,GACVe,MAAM,CAACzB,6BACP0B,MAAM,CAAC;YACNd,aAAaL,OAAOK,WAAW;YAC/BC,eAAeN,OAAOM,aAAa;YACnCc,eAAepB,OAAOoB,aAAa,IAAI;YACvCb,kBAAkBP,OAAOO,gBAAgB;YACzCc,aAAarB,OAAOqB,WAAW;YAC/BC,QAAQtB,OAAOsB,MAAM;YACrBN,WAAWhB,OAAOgB,SAAS;QAC7B,GACCO,SAAS;IACd;IAEA,MAAMC,MAAMvB,IAAI,CAAC,EAAE;IACnB,IAAI,CAACuB,KAAK,MAAM,IAAIC,MAAM;IAC1B,OAAO/B,6BAA6B8B;AACtC;AAEA,OAAO,eAAeE,uCACpB1B,MAAoD;IAEpD,MAAMC,OAAO,MAAMT,KAAKU,WAAW,CAAC,OAAOC;QACzC,MAAMwB,qBAAqB;YACzB;YACA3B,OAAOK,WAAW;YAClBL,OAAOM,aAAa;SACrB,CAACE,IAAI,CAAC;QACP,MAAML,GAAGM,OAAO,CAAC1B,GAAG,CAAC,sCAAsC,EAAE4C,mBAAmB,EAAE,CAAC;QACnF,KAAK,MAAMpB,oBAAoB;eAC1B,IAAIqB,IAAI5B,OAAOC,IAAI,CAAC4B,GAAG,CAAC,CAACL,MAAQA,IAAIjB,gBAAgB;SACzD,CAACuB,IAAI,GAAI;YACR,MAAM1B,wBAAwB;gBAC5B;gBACAJ,OAAOK,WAAW;gBAClBL,OAAOM,aAAa;gBACpBC;aACD,CAACC,IAAI,CAAC;YACP,MAAML,GAAGM,OAAO,CAAC1B,GAAG,CAAC,sCAAsC,EAAEqB,sBAAsB,EAAE,CAAC;QACxF;QAEA,MAAM,CAAC2B,YAAY,GAAG,MAAM5B,GACzBQ,MAAM,CAAC;YACNqB,OAAOrC,aAAaqC,KAAK;YACzBC,WAAWlD,GAAY,CAAC,EAAEY,aAAaqB,SAAS,CAAC,SAAS,CAAC;QAC7D,GACCH,IAAI,CAAClB,cACLmB,KAAK,CACJtC,IACEE,GAAGiB,aAAaiB,EAAE,EAAEZ,OAAOoB,aAAa,GACxC1C,GAAGiB,aAAaU,WAAW,EAAEL,OAAOK,WAAW,GAC/C3B,GAAGiB,aAAaW,aAAa,EAAEN,OAAOM,aAAa,IAGtDW,KAAK,CAAC;QAET,IAAI,CAACc,aAAa,MAAM,IAAIxC,yBAAyBS,OAAOoB,aAAa;QACzE,IAAIW,YAAYE,SAAS,EAAE,MAAM,IAAI3C,wBAAwBU,OAAOoB,aAAa;QACjF,IAAIpB,OAAOC,IAAI,CAACiC,MAAM,GAAGH,YAAYC,KAAK,EAAE;YAC1C,MAAM,IAAI9C,8CACRc,OAAOC,IAAI,CAACiC,MAAM,EAClBH,YAAYC,KAAK;QAErB;QAEA,MAAM,CAACG,uBAAuB,GAAG,MAAMhC,GACpCQ,MAAM,CAAC;YAACqB,OAAOjD,GAAW,CAAC,aAAa,CAAC;QAAA,GACzC8B,IAAI,CAACpB,6BACLqB,KAAK,CACJtC,IACEE,GAAGe,4BAA4BY,WAAW,EAAEL,OAAOK,WAAW,GAC9D3B,GAAGe,4BAA4Ba,aAAa,EAAEN,OAAOM,aAAa,GAClE5B,GAAGe,4BAA4B2B,aAAa,EAAEpB,OAAOoB,aAAa;QAGxE,MAAMgB,gBAAgBD,wBAAwBH,SAAS;QACvD,IAAII,gBAAgBpC,OAAOC,IAAI,CAACiC,MAAM,GAAGH,YAAYC,KAAK,EAAE;YAC1D,MAAM,IAAI9C,8CACRc,OAAOC,IAAI,CAACiC,MAAM,EAClBH,YAAYC,KAAK,EACjBI;QAEJ;QAEA,MAAMC,oBAAoBrC,OAAOC,IAAI,CAAC4B,GAAG,CAAC,CAACL,MAAQA,IAAIjB,gBAAgB;QACvE,MAAM+B,aAAa,MAAMnC,GACtBQ,MAAM,CAAC;YAACJ,kBAAkBd,4BAA4Bc,gBAAgB;QAAA,GACtEM,IAAI,CAACpB,6BACLqB,KAAK,CACJtC,IACEE,GAAGe,4BAA4BY,WAAW,EAAEL,OAAOK,WAAW,GAC9D3B,GAAGe,4BAA4Ba,aAAa,EAAEN,OAAOM,aAAa,GAClE1B,QAAQa,4BAA4Bc,gBAAgB,EAAE8B,oBACtDxD,OAAOY,4BAA4BsB,UAAU,GAC7CpC,GAAGc,4BAA4BuB,SAAS,EAAEjC,GAAG,CAAC,KAAK,CAAC;QAI1D,IAAIuD,WAAWJ,MAAM,GAAG,GAAG;YACzB,MAAM,IAAIjD,4CACRqD,WAAWT,GAAG,CAAC,CAACL,MAAQA,IAAIjB,gBAAgB;QAEhD;QAEA,OAAO,MAAMJ,GACVe,MAAM,CAACzB,6BACP0B,MAAM,CACLnB,OAAOC,IAAI,CAAC4B,GAAG,CAAC,CAACL,MAAS,CAAA;gBACxBnB,aAAaL,OAAOK,WAAW;gBAC/BC,eAAeN,OAAOM,aAAa;gBACnCc,eAAepB,OAAOoB,aAAa;gBACnCb,kBAAkBiB,IAAIjB,gBAAgB;gBACtCc,aAAaG,IAAIH,WAAW;gBAC5BC,QAAQE,IAAIF,MAAM;gBAClBN,WAAWhB,OAAOgB,SAAS;YAC7B,CAAA,IAEDO,SAAS;IACd;IAEA,OAAOtB,KAAK4B,GAAG,CAACnC;AAClB;AAEA,OAAO,eAAe6C,wCACpBlB,WAAmB;IAEnB,MAAMpB,OAAO,MAAMT,KAChBmB,MAAM,GACNE,IAAI,CAACpB,6BACLqB,KAAK,CAACpC,GAAGe,4BAA4B4B,WAAW,EAAEA,cAClDJ,KAAK,CAAC;IAET,MAAMO,MAAMvB,IAAI,CAAC,EAAE;IACnB,IAAI,CAACuB,KAAK,OAAOgB;IACjB,OAAO9C,6BAA6B8B;AACtC;AAOA;;;;;;;CAOC,GACD,OAAO,eAAeiB,yCACpBzC,MAAsD;IAEtD,2EAA2E;IAC3E,6EAA6E;IAC7E,uEAAuE;IACvE,wDAAwD;IACxD,MAAM0C,aAAa3D,GAAG,CAAC,SAAS,EAAEU,4BAA4BsB,UAAU,CAAC,EAAE,EAAEtB,4BAA4BuB,SAAS,CAAC,CAAC,CAAC;IACrH,MAAM2B,kBAAkB5D,GAAG,CAAC,SAAS,EAAEiB,OAAO4C,aAAa,CAAC,sBAAsB,CAAC;IAEnF,MAAMC,eAAerD,KAClBmB,MAAM,CAAC;QAACC,IAAInB,4BAA4BmB,EAAE;IAAA,GAC1CC,IAAI,CAACpB,6BACLqB,KAAK,CAAChC,GAAG4D,YAAYC,kBACrBG,OAAO,CAACrE,IAAIiE,aAAajE,IAAIgB,4BAA4BmB,EAAE,GAC3DK,KAAK,CAACjB,OAAOiB,KAAK,IAAI;IAEzB,MAAM8B,UAAU,MAAMvD,KACnBwD,MAAM,CAACvD,6BACPqB,KAAK,CAAClC,QAAQa,4BAA4BmB,EAAE,EAAEiC,eAC9CtB,SAAS,CAAC;QAACX,IAAInB,4BAA4BmB,EAAE;IAAA;IAEhD,OAAOmC,QAAQb,MAAM;AACvB;AAEA,OAAO,eAAee,2CAA2CjD,MAMhE;IACC,OAAO,MAAMR,KAAKU,WAAW,CAAC,OAAOC;QACnC,MAAMA,GAAGM,OAAO,CAAC1B,GAAG,CAAC,sCAAsC,EAAEiB,OAAOK,WAAW,CAAC,EAAE,CAAC;QAEnF,MAAM6C,WAAW,MAAM/C,GACpBgD,MAAM,CAAC1D,6BACP2D,GAAG,CAAC;YAACrC,YAAYhC,GAAG,CAAC,KAAK,CAAC;QAAA,GAC3B+B,KAAK,CACJtC,IACEE,GAAGe,4BAA4BmB,EAAE,EAAEZ,OAAOqD,gBAAgB,GAC1D3E,GAAGe,4BAA4BY,WAAW,EAAEL,OAAOK,WAAW,GAC9DxB,OAAOY,4BAA4BsB,UAAU,GAC7CpC,GAAGc,4BAA4BuB,SAAS,EAAEjC,GAAG,CAAC,KAAK,CAAC,IAGvDwC,SAAS,CAAC;YACTX,IAAInB,4BAA4BmB,EAAE;YAClCN,eAAeb,4BAA4Ba,aAAa;YACxDC,kBAAkBd,4BAA4Bc,gBAAgB;QAChE;QAEF,IAAI,CAAC2C,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,CAACI,MAAM,GAAG,MAAMnD,GACnBQ,MAAM,CAAC;gBACNN,aAAaZ,4BAA4BY,WAAW;gBACpDU,YAAYtB,4BAA4BsB,UAAU;gBAClDkB,WAAWlD,GAAY,CAAC,EAAEU,4BAA4BuB,SAAS,CAAC,SAAS,CAAC;YAC5E,GACCH,IAAI,CAACpB,6BACLqB,KAAK,CAACpC,GAAGe,4BAA4BmB,EAAE,EAAEZ,OAAOqD,gBAAgB,GAChEpC,KAAK,CAAC;YAET,IAAI,CAACqC,OAAO;gBACV,MAAM,IAAI7B,MAAM,CAAC,wCAAwC,EAAEzB,OAAOqD,gBAAgB,EAAE;YACtF;YACA,IAAIC,MAAMjD,WAAW,KAAKL,OAAOK,WAAW,EAAE;gBAC5C,MAAM,IAAIhB,wCACRW,OAAOqD,gBAAgB,EACvBrD,OAAOK,WAAW;YAEtB;YACA,IAAIiD,MAAMvC,UAAU,EAAE,MAAM,IAAI5B,+BAA+Ba,OAAOqD,gBAAgB;YACtF,IAAIC,MAAMrB,SAAS,EAAE,MAAM,IAAI7C,8BAA8BY,OAAOqD,gBAAgB;YACpF,MAAM,IAAI5B,MACR,CAAC,oDAAoD,EAAEzB,OAAOqD,gBAAgB,EAAE;QAEpF;QAEA,MAAM,CAACE,QAAQ,GAAG,MAAMpD,GACrBe,MAAM,CAACrB,gBACPsB,MAAM,CAAC;YACNd,aAAaL,OAAOK,WAAW;YAC/BmD,OAAO;YACPC,qBAAqBzD,OAAOqD,gBAAgB;YAC5CK,uBAAuB;YACvBpD,eAAe4C,QAAQ,CAAC,EAAE,CAAC5C,aAAa;YACxCC,kBAAkB2C,QAAQ,CAAC,EAAE,CAAC3C,gBAAgB;YAC9CoD,QAAQ3D,OAAO2D,MAAM;YACrBC,kBAAkB5D,OAAO4D,gBAAgB,IAAI;YAC7CC,4BAA4B7D,OAAO4D,gBAAgB,GAAG7E,GAAG,CAAC,KAAK,CAAC,GAAG;YACnE+E,WAAW9D,OAAO8D,SAAS;YAC3BC,YAAY;QACd,GACCxC,SAAS;QAEZ,IAAI,CAACgC,SAAS,MAAM,IAAI9B,MAAM;QAE9B,MAAMtB,GACHgD,MAAM,CAAC1D,6BACP2D,GAAG,CAAC;YAACY,mBAAmBT,QAAQ3C,EAAE;QAAA,GAClCE,KAAK,CAACpC,GAAGe,4BAA4BmB,EAAE,EAAEZ,OAAOqD,gBAAgB;QAEnE,MAAMlD,GACHgD,MAAM,CAACvD,iBACPwD,GAAG,CAAC;YAACa,iBAAiBV,QAAQ3C,EAAE;YAAEsD,WAAWnF,GAAG,CAAC,KAAK,CAAC;QAAA,GACvD+B,KAAK,CACJtC,IACEE,GAAGkB,gBAAgBS,WAAW,EAAEL,OAAOK,WAAW,GAClD3B,GAAGkB,gBAAgBU,aAAa,EAAE4C,QAAQ,CAAC,EAAE,CAAC5C,aAAa,GAC3D5B,GAAGkB,gBAAgBW,gBAAgB,EAAE2C,QAAQ,CAAC,EAAE,CAAC3C,gBAAgB,GACjE1B,OAAOe,gBAAgBuE,qBAAqB;QAIlD,OAAOrE,gBAAgByD;IACzB;AACF"}
1
+ {"version":3,"sources":["../../src/db/ephemeral-registration-tokens.ts"],"sourcesContent":["import type {RunnerToolCapabilitiesDto} from '@shipfox/api-runners-dto';\nimport {and, asc, eq, gt, inArray, isNull, lt, sql} from 'drizzle-orm';\nimport type {EphemeralRegistrationToken} from '#core/entities/ephemeral-registration-token.js';\nimport {\n ActiveEphemeralRegistrationTokenExistsError,\n ActiveEphemeralRegistrationTokensExistError,\n EmptyRunnerLabelsError,\n RegistrationTokenBatchExceedsReservationError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n RegistrationTokenWorkspaceMismatchError,\n ReservationExpiredError,\n ReservationNotFoundError,\n} from '#core/errors.js';\nimport {sanitizeRunnerLabelsOrThrow} from '#core/runner-labels.js';\nimport {db} from './db.js';\nimport {\n ephemeralRegistrationTokens,\n toEphemeralRegistrationToken,\n} from './schema/ephemeral-registration-tokens.js';\nimport {provisionerTokens} from './schema/provisioner-tokens.js';\nimport {reservations} from './schema/reservations.js';\nimport {providerRunners} from './schema/runner-instances.js';\nimport {runnerSessions, toRunnerSession} from './schema/runner-sessions.js';\n\nexport interface CreateEphemeralRegistrationTokenParams {\n workspaceId: string;\n provisionerId: string;\n reservationId?: string | null | undefined;\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n expiresAt: Date;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchRow {\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n}\n\nexport interface CreateEphemeralRegistrationTokensBatchParams {\n workspaceId: string;\n provisionerId: string;\n reservationId: string;\n expiresAt: Date;\n rows: CreateEphemeralRegistrationTokensBatchRow[];\n}\n\nexport async function createEphemeralRegistrationToken(\n params: CreateEphemeralRegistrationTokenParams,\n): Promise<EphemeralRegistrationToken> {\n const rows = await db().transaction(async (tx) => {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n\n const [active] = await tx\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.providerRunnerId, params.providerRunnerId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .limit(1);\n\n if (active) {\n throw new ActiveEphemeralRegistrationTokenExistsError(\n params.workspaceId,\n params.provisionerId,\n params.providerRunnerId,\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId ?? null,\n providerRunnerId: params.providerRunnerId,\n hashedToken: params.hashedToken,\n prefix: params.prefix,\n expiresAt: params.expiresAt,\n })\n .returning();\n });\n\n const row = rows[0];\n if (!row) throw new Error('Insert returned no rows');\n return toEphemeralRegistrationToken(row);\n}\n\nexport async function createEphemeralRegistrationTokensBatch(\n params: CreateEphemeralRegistrationTokensBatchParams,\n): Promise<EphemeralRegistrationToken[]> {\n const rows = await db().transaction(async (tx) => {\n const provisionerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionerLockKey}))`);\n for (const providerRunnerId of [\n ...new Set(params.rows.map((row) => row.providerRunnerId)),\n ].sort()) {\n const providerRunnerLockKey = [\n 'runners_ephemeral_registration_tokens',\n params.workspaceId,\n params.provisionerId,\n providerRunnerId,\n ].join(':');\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);\n }\n\n const [reservation] = await tx\n .select({\n count: reservations.count,\n isExpired: sql<boolean>`${reservations.expiresAt} <= now()`,\n })\n .from(reservations)\n .where(\n and(\n eq(reservations.id, params.reservationId),\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n ),\n )\n .limit(1);\n\n if (!reservation) throw new ReservationNotFoundError(params.reservationId);\n if (reservation.isExpired) throw new ReservationExpiredError(params.reservationId);\n if (params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n );\n }\n\n const [existingForReservation] = await tx\n .select({count: sql<number>`count(*)::int`})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n eq(ephemeralRegistrationTokens.reservationId, params.reservationId),\n ),\n );\n const alreadyMinted = existingForReservation?.count ?? 0;\n if (alreadyMinted + params.rows.length > reservation.count) {\n throw new RegistrationTokenBatchExceedsReservationError(\n params.rows.length,\n reservation.count,\n alreadyMinted,\n );\n }\n\n const providerRunnerIds = params.rows.map((row) => row.providerRunnerId);\n const activeRows = await tx\n .select({providerRunnerId: ephemeralRegistrationTokens.providerRunnerId})\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n );\n\n if (activeRows.length > 0) {\n throw new ActiveEphemeralRegistrationTokensExistError(\n activeRows.map((row) => row.providerRunnerId),\n );\n }\n\n return await tx\n .insert(ephemeralRegistrationTokens)\n .values(\n params.rows.map((row) => ({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n reservationId: params.reservationId,\n providerRunnerId: row.providerRunnerId,\n hashedToken: row.hashedToken,\n prefix: row.prefix,\n expiresAt: params.expiresAt,\n })),\n )\n .returning();\n });\n\n return rows.map(toEphemeralRegistrationToken);\n}\n\nexport async function resolveEphemeralRegistrationTokenByHash(\n hashedToken: string,\n): Promise<EphemeralRegistrationToken | undefined> {\n const rows = await db()\n .select()\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.hashedToken, hashedToken))\n .limit(1);\n\n const row = rows[0];\n if (!row) return undefined;\n return toEphemeralRegistrationToken(row);\n}\n\nexport interface DeleteExpiredEphemeralRegistrationTokensParams {\n retentionDays: number;\n limit?: number;\n}\n\n/**\n * Deletes ephemeral registration tokens that have reached a terminal state and\n * outlived the retention window. A token is terminal once it is consumed\n * (single use spent) or expired without consumption; the retention window is\n * measured from that terminal event so the audit record survives a bounded\n * debugging window. Active tokens that are neither consumed nor expired are\n * never deleted, so a live single-use credential is never removed early.\n */\nexport async function deleteExpiredEphemeralRegistrationTokens(\n params: DeleteExpiredEphemeralRegistrationTokensParams,\n): Promise<number> {\n // coalesce(consumed_at, expires_at) is the terminal timestamp: consumed_at\n // when the token was spent, otherwise its expiry. Comparing it to the cutoff\n // both selects deletable rows and orders the batch, and it matches the\n // terminal index so idle GC ticks never scan live rows.\n const terminalAt = sql`coalesce(${ephemeralRegistrationTokens.consumedAt}, ${ephemeralRegistrationTokens.expiresAt})`;\n const retentionCutoff = sql`now() - (${params.retentionDays} || ' days')::interval`;\n\n const deletableIds = db()\n .select({id: ephemeralRegistrationTokens.id})\n .from(ephemeralRegistrationTokens)\n .where(lt(terminalAt, retentionCutoff))\n .orderBy(asc(terminalAt), asc(ephemeralRegistrationTokens.id))\n .limit(params.limit ?? 1000);\n\n const deleted = await db()\n .delete(ephemeralRegistrationTokens)\n .where(inArray(ephemeralRegistrationTokens.id, deletableIds))\n .returning({id: ephemeralRegistrationTokens.id});\n\n return deleted.length;\n}\n\nexport async function createRunnerSessionConsumingEphemeralToken(params: {\n ephemeralTokenId: string;\n workspaceId: string;\n labels: string[];\n toolCapabilities?: RunnerToolCapabilitiesDto | null;\n maxClaims: number;\n}) {\n return await db().transaction(async (tx) => {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);\n\n const consumed = await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedAt: sql`now()`})\n .where(\n and(\n eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId),\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n isNull(ephemeralRegistrationTokens.consumedAt),\n gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),\n ),\n )\n .returning({\n id: ephemeralRegistrationTokens.id,\n provisionerId: ephemeralRegistrationTokens.provisionerId,\n providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,\n });\n\n if (!consumed[0]) {\n const [token] = await tx\n .select({\n workspaceId: ephemeralRegistrationTokens.workspaceId,\n consumedAt: ephemeralRegistrationTokens.consumedAt,\n isExpired: sql<boolean>`${ephemeralRegistrationTokens.expiresAt} <= now()`,\n })\n .from(ephemeralRegistrationTokens)\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId))\n .limit(1);\n\n if (!token) {\n throw new Error(`Ephemeral registration token not found: ${params.ephemeralTokenId}`);\n }\n if (token.workspaceId !== params.workspaceId) {\n throw new RegistrationTokenWorkspaceMismatchError(\n params.ephemeralTokenId,\n params.workspaceId,\n );\n }\n if (token.consumedAt) throw new RegistrationTokenConsumedError(params.ephemeralTokenId);\n if (token.isExpired) throw new RegistrationTokenExpiredError(params.ephemeralTokenId);\n throw new Error(\n `Ephemeral registration token could not be consumed: ${params.ephemeralTokenId}`,\n );\n }\n\n const [provisioner] = await tx\n .select({scope: provisionerTokens.scope})\n .from(provisionerTokens)\n .where(eq(provisionerTokens.id, consumed[0].provisionerId))\n .limit(1);\n const labels = sanitizeRunnerLabelsOrThrow(params.labels, {\n scope: provisioner?.scope ?? 'workspace',\n source: 'ephemeral runner registration',\n });\n if (labels.length === 0) throw new EmptyRunnerLabelsError();\n\n const [session] = await tx\n .insert(runnerSessions)\n .values({\n workspaceId: params.workspaceId,\n scope: 'workspace',\n registrationTokenId: params.ephemeralTokenId,\n registrationTokenKind: 'ephemeral',\n provisionerId: consumed[0].provisionerId,\n providerRunnerId: consumed[0].providerRunnerId,\n labels,\n toolCapabilities: params.toolCapabilities ?? null,\n toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,\n maxClaims: params.maxClaims,\n claimsUsed: 0,\n })\n .returning();\n\n if (!session) throw new Error('Insert returned no rows');\n\n await tx\n .update(ephemeralRegistrationTokens)\n .set({consumedSessionId: session.id})\n .where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId));\n\n await tx\n .update(providerRunners)\n .set({runnerSessionId: session.id, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, consumed[0].provisionerId),\n eq(providerRunners.providerRunnerId, consumed[0].providerRunnerId),\n isNull(providerRunners.reservationReleasedAt),\n ),\n );\n\n return toRunnerSession(session);\n });\n}\n"],"names":["and","asc","eq","gt","inArray","isNull","lt","sql","ActiveEphemeralRegistrationTokenExistsError","ActiveEphemeralRegistrationTokensExistError","EmptyRunnerLabelsError","RegistrationTokenBatchExceedsReservationError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","RegistrationTokenWorkspaceMismatchError","ReservationExpiredError","ReservationNotFoundError","sanitizeRunnerLabelsOrThrow","db","ephemeralRegistrationTokens","toEphemeralRegistrationToken","provisionerTokens","reservations","providerRunners","runnerSessions","toRunnerSession","createEphemeralRegistrationToken","params","rows","transaction","tx","providerRunnerLockKey","workspaceId","provisionerId","providerRunnerId","join","execute","active","select","id","from","where","consumedAt","expiresAt","limit","insert","values","reservationId","hashedToken","prefix","returning","row","Error","createEphemeralRegistrationTokensBatch","provisionerLockKey","Set","map","sort","reservation","count","isExpired","length","existingForReservation","alreadyMinted","providerRunnerIds","activeRows","resolveEphemeralRegistrationTokenByHash","undefined","deleteExpiredEphemeralRegistrationTokens","terminalAt","retentionCutoff","retentionDays","deletableIds","orderBy","deleted","delete","createRunnerSessionConsumingEphemeralToken","consumed","update","set","ephemeralTokenId","token","provisioner","scope","labels","source","session","registrationTokenId","registrationTokenKind","toolCapabilities","toolCapabilitiesReportedAt","maxClaims","claimsUsed","consumedSessionId","runnerSessionId","updatedAt","reservationReleasedAt"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reservations.d.ts","sourceRoot":"","sources":["../../src/db/reservations.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,SAAS,CAAC;AAUhC,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sCAAsC;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;CAC7D;AAcD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CAAC,CAAC,CAIlE;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CAAC,CAAC,CAGlE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CAAC,CAAC,CA2ClE;AAsOD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAMtE;AA0BD,wBAAsB,yBAAyB,CAAC,MAAM,CAAC,EAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAc1F;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5E;AAyED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE;IACN,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;CACzD,GACA,OAAO,CAAC,MAAM,CAAC,CA0CjB"}
1
+ {"version":3,"file":"reservations.d.ts","sourceRoot":"","sources":["../../src/db/reservations.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,SAAS,CAAC;AAUhC,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sCAAsC;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;CAC7D;AAcD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CAAC,CAAC,CAIlE;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CAAC,CAAC,CAGlE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CAAC,CAAC,CA2ClE;AAsOD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAMtE;AA0BD,wBAAsB,yBAAyB,CAAC,MAAM,CAAC,EAAE;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAc1F;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5E;AA0GD,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,MAAM,EAAE;IACN,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;CACzD,GACA,OAAO,CAAC,MAAM,CAAC,CA0CjB"}