@shipfox/api-runners 4.0.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +83 -0
- package/dist/config.d.ts +5 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +53 -6
- package/dist/config.js.map +1 -1
- package/dist/core/capacity-assignments.d.ts +7 -0
- package/dist/core/capacity-assignments.d.ts.map +1 -0
- package/dist/core/capacity-assignments.js +6 -0
- package/dist/core/capacity-assignments.js.map +1 -0
- package/dist/core/demand.d.ts +6 -6
- package/dist/core/demand.d.ts.map +1 -1
- package/dist/core/demand.js +10 -10
- package/dist/core/demand.js.map +1 -1
- package/dist/core/entities/capacity-assignment.d.ts +9 -0
- package/dist/core/entities/capacity-assignment.d.ts.map +1 -0
- package/dist/core/entities/capacity-assignment.js +3 -0
- package/dist/core/entities/capacity-assignment.js.map +1 -0
- package/dist/core/entities/ephemeral-registration-token.d.ts +1 -1
- package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -1
- package/dist/core/entities/ephemeral-registration-token.js.map +1 -1
- package/dist/core/entities/provisioner-capability-snapshot.d.ts +13 -0
- package/dist/core/entities/provisioner-capability-snapshot.d.ts.map +1 -0
- package/dist/core/entities/provisioner-capability-snapshot.js +3 -0
- package/dist/core/entities/provisioner-capability-snapshot.js.map +1 -0
- package/dist/core/entities/provisioner-token.d.ts +10 -2
- package/dist/core/entities/provisioner-token.d.ts.map +1 -1
- package/dist/core/entities/provisioner-token.js.map +1 -1
- package/dist/core/entities/{provisioned-runner.d.ts → runner-instance.d.ts} +6 -6
- package/dist/core/entities/runner-instance.d.ts.map +1 -0
- package/dist/core/entities/runner-instance.js +3 -0
- package/dist/core/entities/runner-instance.js.map +1 -0
- package/dist/core/entities/runner-session.d.ts +4 -2
- package/dist/core/entities/runner-session.d.ts.map +1 -1
- package/dist/core/entities/runner-session.js.map +1 -1
- package/dist/core/ephemeral-registration-tokens.d.ts +5 -5
- package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/core/ephemeral-registration-tokens.js +12 -12
- package/dist/core/ephemeral-registration-tokens.js.map +1 -1
- package/dist/core/errors.d.ts +16 -4
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +22 -4
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +10 -4
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/job-executions.d.ts +2 -0
- package/dist/core/job-executions.d.ts.map +1 -1
- package/dist/core/job-executions.js +1 -2
- package/dist/core/job-executions.js.map +1 -1
- package/dist/core/maintenance.d.ts +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +5 -5
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/provisioner-capability-snapshots.d.ts +5 -0
- package/dist/core/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/core/provisioner-capability-snapshots.js +10 -0
- package/dist/core/provisioner-capability-snapshots.js.map +1 -0
- package/dist/core/provisioner-tokens.d.ts +10 -0
- package/dist/core/provisioner-tokens.d.ts.map +1 -1
- package/dist/core/provisioner-tokens.js +23 -1
- package/dist/core/provisioner-tokens.js.map +1 -1
- package/dist/core/rate-limit.d.ts.map +1 -1
- package/dist/core/rate-limit.js +2 -7
- package/dist/core/rate-limit.js.map +1 -1
- package/dist/core/runner-activation.d.ts +13 -0
- package/dist/core/runner-activation.d.ts.map +1 -0
- package/dist/core/runner-activation.js +36 -0
- package/dist/core/runner-activation.js.map +1 -0
- package/dist/core/runner-control-sessions.d.ts +46 -0
- package/dist/core/runner-control-sessions.d.ts.map +1 -0
- package/dist/core/runner-control-sessions.js +121 -0
- package/dist/core/runner-control-sessions.js.map +1 -0
- package/dist/core/runner-instances.d.ts +79 -0
- package/dist/core/runner-instances.d.ts.map +1 -0
- package/dist/core/runner-instances.js +168 -0
- package/dist/core/runner-instances.js.map +1 -0
- package/dist/core/runner-sessions.d.ts +8 -2
- package/dist/core/runner-sessions.d.ts.map +1 -1
- package/dist/core/runner-sessions.js +8 -5
- package/dist/core/runner-sessions.js.map +1 -1
- package/dist/db/capacity-assignments.d.ts +7 -0
- package/dist/db/capacity-assignments.d.ts.map +1 -0
- package/dist/db/capacity-assignments.js +72 -0
- package/dist/db/capacity-assignments.js.map +1 -0
- package/dist/db/db.d.ts +2837 -1009
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +11 -2
- package/dist/db/db.js.map +1 -1
- package/dist/db/ephemeral-registration-tokens.d.ts +2 -2
- package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/db/ephemeral-registration-tokens.js +21 -21
- package/dist/db/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/index.d.ts +7 -4
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +5 -2
- package/dist/db/index.js.map +1 -1
- package/dist/db/job-executions.d.ts +6 -6
- package/dist/db/job-executions.d.ts.map +1 -1
- package/dist/db/job-executions.js +20 -19
- package/dist/db/job-executions.js.map +1 -1
- package/dist/db/provisioner-capability-snapshots.d.ts +21 -0
- package/dist/db/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/db/provisioner-capability-snapshots.js +57 -0
- package/dist/db/provisioner-capability-snapshots.js.map +1 -0
- package/dist/db/provisioner-tokens.d.ts +7 -2
- package/dist/db/provisioner-tokens.d.ts.map +1 -1
- package/dist/db/provisioner-tokens.js +59 -10
- package/dist/db/provisioner-tokens.js.map +1 -1
- package/dist/db/reservations.d.ts +18 -0
- package/dist/db/reservations.d.ts.map +1 -1
- package/dist/db/reservations.js +88 -1
- package/dist/db/reservations.js.map +1 -1
- package/dist/db/runner-instances.d.ts +91 -0
- package/dist/db/runner-instances.d.ts.map +1 -0
- package/dist/db/runner-instances.js +511 -0
- package/dist/db/runner-instances.js.map +1 -0
- package/dist/db/runner-sessions.d.ts +5 -0
- package/dist/db/runner-sessions.d.ts.map +1 -1
- package/dist/db/runner-sessions.js +48 -2
- package/dist/db/runner-sessions.js.map +1 -1
- package/dist/db/schema/capacity-assignments.d.ts +113 -0
- package/dist/db/schema/capacity-assignments.d.ts.map +1 -0
- package/dist/db/schema/capacity-assignments.js +29 -0
- package/dist/db/schema/capacity-assignments.js.map +1 -0
- package/dist/db/schema/ephemeral-registration-tokens.d.ts +2 -2
- package/dist/db/schema/ephemeral-registration-tokens.js +3 -3
- package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/schema/provisioner-capability-snapshots.d.ts +207 -0
- package/dist/db/schema/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/db/schema/provisioner-capability-snapshots.js +38 -0
- package/dist/db/schema/provisioner-capability-snapshots.js.map +1 -0
- package/dist/db/schema/provisioner-tokens.d.ts +19 -1
- package/dist/db/schema/provisioner-tokens.d.ts.map +1 -1
- package/dist/db/schema/provisioner-tokens.js +29 -3
- package/dist/db/schema/provisioner-tokens.js.map +1 -1
- package/dist/db/schema/runner-activation-tokens.d.ts +161 -0
- package/dist/db/schema/runner-activation-tokens.d.ts.map +1 -0
- package/dist/db/schema/runner-activation-tokens.js +27 -0
- package/dist/db/schema/runner-activation-tokens.js.map +1 -0
- package/dist/db/schema/runner-control-sessions.d.ts +338 -0
- package/dist/db/schema/runner-control-sessions.d.ts.map +1 -0
- package/dist/db/schema/runner-control-sessions.js +52 -0
- package/dist/db/schema/runner-control-sessions.js.map +1 -0
- package/dist/db/schema/{provisioned-runners.d.ts → runner-instances.d.ts} +88 -34
- package/dist/db/schema/runner-instances.d.ts.map +1 -0
- package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +19 -14
- package/dist/db/schema/runner-instances.js.map +1 -0
- package/dist/db/schema/runner-sessions.d.ts +39 -5
- package/dist/db/schema/runner-sessions.d.ts.map +1 -1
- package/dist/db/schema/runner-sessions.js +13 -6
- package/dist/db/schema/runner-sessions.js.map +1 -1
- package/dist/db/schema/running-job-executions.d.ts +2 -2
- package/dist/db/schema/running-job-executions.js +4 -4
- package/dist/db/schema/running-job-executions.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -38
- package/dist/index.js.map +1 -1
- package/dist/installation-provisioning.d.ts +14 -0
- package/dist/installation-provisioning.d.ts.map +1 -0
- package/dist/installation-provisioning.js +7 -0
- package/dist/installation-provisioning.js.map +1 -0
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/instance.d.ts +11 -7
- package/dist/metrics/instance.d.ts.map +1 -1
- package/dist/metrics/instance.js +13 -7
- package/dist/metrics/instance.js.map +1 -1
- package/dist/presentation/auth/index.d.ts +1 -0
- package/dist/presentation/auth/index.d.ts.map +1 -1
- package/dist/presentation/auth/index.js +1 -0
- package/dist/presentation/auth/index.js.map +1 -1
- package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -1
- package/dist/presentation/auth/provisioner-token-auth.js +5 -1
- package/dist/presentation/auth/provisioner-token-auth.js.map +1 -1
- package/dist/presentation/auth/runner-control-session-auth.d.ts +4 -0
- package/dist/presentation/auth/runner-control-session-auth.d.ts.map +1 -0
- package/dist/presentation/auth/runner-control-session-auth.js +29 -0
- package/dist/presentation/auth/runner-control-session-auth.js.map +1 -0
- package/dist/presentation/auth/runner-registration-token-auth.d.ts +5 -1
- package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -1
- package/dist/presentation/auth/runner-registration-token-auth.js +21 -1
- package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -1
- package/dist/presentation/dto/index.d.ts +2 -2
- package/dist/presentation/dto/index.d.ts.map +1 -1
- package/dist/presentation/dto/index.js +2 -2
- package/dist/presentation/dto/index.js.map +1 -1
- package/dist/presentation/dto/mint-registration-tokens.d.ts +5 -3
- package/dist/presentation/dto/mint-registration-tokens.d.ts.map +1 -1
- package/dist/presentation/dto/mint-registration-tokens.js +4 -4
- package/dist/presentation/dto/mint-registration-tokens.js.map +1 -1
- package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
- package/dist/presentation/dto/poll-demand.js +7 -1
- package/dist/presentation/dto/poll-demand.js.map +1 -1
- package/dist/presentation/dto/provisioner-token.d.ts +1 -0
- package/dist/presentation/dto/provisioner-token.d.ts.map +1 -1
- package/dist/presentation/dto/provisioner-token.js +5 -1
- package/dist/presentation/dto/provisioner-token.js.map +1 -1
- package/dist/presentation/dto/{provisioned-runners.d.ts → runner-instances.d.ts} +9 -9
- package/dist/presentation/dto/runner-instances.d.ts.map +1 -0
- package/dist/presentation/dto/{provisioned-runners.js → runner-instances.js} +6 -6
- package/dist/presentation/dto/runner-instances.js.map +1 -0
- package/dist/presentation/index.d.ts +2 -2
- package/dist/presentation/index.d.ts.map +1 -1
- package/dist/presentation/index.js +2 -2
- package/dist/presentation/index.js.map +1 -1
- package/dist/presentation/inter-module.d.ts +5 -0
- package/dist/presentation/inter-module.d.ts.map +1 -0
- package/dist/presentation/inter-module.js +43 -0
- package/dist/presentation/inter-module.js.map +1 -0
- package/dist/presentation/routes/assign-capacity.d.ts +2 -0
- package/dist/presentation/routes/assign-capacity.d.ts.map +1 -0
- package/dist/presentation/routes/assign-capacity.js +44 -0
- package/dist/presentation/routes/assign-capacity.js.map +1 -0
- package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -1
- package/dist/presentation/routes/get-provisioner-me.js +5 -1
- package/dist/presentation/routes/get-provisioner-me.js.map +1 -1
- package/dist/presentation/routes/heartbeat.d.ts +2 -1
- package/dist/presentation/routes/heartbeat.d.ts.map +1 -1
- package/dist/presentation/routes/heartbeat.js +60 -50
- package/dist/presentation/routes/heartbeat.js.map +1 -1
- package/dist/presentation/routes/index.d.ts +3 -1
- package/dist/presentation/routes/index.d.ts.map +1 -1
- package/dist/presentation/routes/index.js +83 -50
- package/dist/presentation/routes/index.js.map +1 -1
- package/dist/presentation/routes/mint-registration-tokens.d.ts.map +1 -1
- package/dist/presentation/routes/mint-registration-tokens.js +5 -5
- package/dist/presentation/routes/mint-registration-tokens.js.map +1 -1
- package/dist/presentation/routes/planned-capacity.d.ts +3 -0
- package/dist/presentation/routes/planned-capacity.d.ts.map +1 -0
- package/dist/presentation/routes/planned-capacity.js +54 -0
- package/dist/presentation/routes/planned-capacity.js.map +1 -0
- package/dist/presentation/routes/poll-demand.d.ts +2 -0
- package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
- package/dist/presentation/routes/poll-demand.js +86 -45
- package/dist/presentation/routes/poll-demand.js.map +1 -1
- package/dist/presentation/routes/reconcile-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/reconcile-runner-instances.js +27 -0
- package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -0
- package/dist/presentation/routes/register.d.ts +2 -1
- package/dist/presentation/routes/register.d.ts.map +1 -1
- package/dist/presentation/routes/register.js +55 -52
- package/dist/presentation/routes/register.js.map +1 -1
- package/dist/presentation/routes/report-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/report-runner-instances.js +37 -0
- package/dist/presentation/routes/report-runner-instances.js.map +1 -0
- package/dist/presentation/routes/request-job.d.ts +2 -1
- package/dist/presentation/routes/request-job.d.ts.map +1 -1
- package/dist/presentation/routes/request-job.js +39 -36
- package/dist/presentation/routes/request-job.js.map +1 -1
- package/dist/presentation/routes/runner-enrollment.d.ts +7 -0
- package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
- package/dist/presentation/routes/runner-enrollment.js +185 -0
- package/dist/presentation/routes/runner-enrollment.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +2 -2
- package/dist/temporal/activities/index.d.ts.map +1 -1
- package/dist/temporal/activities/index.js +2 -2
- package/dist/temporal/activities/index.js.map +1 -1
- package/dist/temporal/activities/maintenance-activities.d.ts +1 -1
- package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -1
- package/dist/temporal/activities/maintenance-activities.js +3 -3
- package/dist/temporal/activities/maintenance-activities.js.map +1 -1
- package/dist/temporal/workflows/index.bundle.js +3 -3
- package/dist/temporal/workflows/stuck-job-detector.js +2 -2
- package/dist/temporal/workflows/stuck-job-detector.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0000_initial.sql +102 -24
- package/drizzle/meta/0000_snapshot.json +483 -63
- package/package.json +31 -36
- package/src/config.test.ts +0 -26
- package/src/config.ts +47 -6
- package/src/core/capacity-assignments.ts +10 -0
- package/src/core/demand.test.ts +29 -29
- package/src/core/demand.ts +22 -22
- package/src/core/entities/capacity-assignment.ts +8 -0
- package/src/core/entities/ephemeral-registration-token.ts +1 -1
- package/src/core/entities/provisioner-capability-snapshot.ts +12 -0
- package/src/core/entities/provisioner-token.ts +8 -2
- package/src/core/entities/{provisioned-runner.ts → runner-instance.ts} +5 -5
- package/src/core/entities/runner-session.ts +4 -2
- package/src/core/ephemeral-registration-tokens.test.ts +11 -11
- package/src/core/ephemeral-registration-tokens.ts +18 -20
- package/src/core/errors.ts +23 -4
- package/src/core/index.ts +39 -17
- package/src/core/job-executions.ts +3 -2
- package/src/core/maintenance.test.ts +13 -17
- package/src/core/maintenance.ts +5 -5
- package/src/core/provisioner-capability-snapshots.test.ts +35 -0
- package/src/core/provisioner-capability-snapshots.ts +12 -0
- package/src/core/provisioner-tokens.test.ts +20 -0
- package/src/core/provisioner-tokens.ts +33 -0
- package/src/core/rate-limit.test.ts +11 -27
- package/src/core/rate-limit.ts +3 -11
- package/src/core/runner-activation.ts +72 -0
- package/src/core/runner-control-sessions.ts +190 -0
- package/src/core/{provisioned-runners.test.ts → runner-instances.test.ts} +24 -24
- package/src/core/runner-instances.ts +310 -0
- package/src/core/runner-sessions.test.ts +112 -22
- package/src/core/runner-sessions.ts +25 -14
- package/src/db/capacity-assignments.test.ts +159 -0
- package/src/db/capacity-assignments.ts +116 -0
- package/src/db/db.ts +11 -2
- package/src/db/ephemeral-registration-tokens.test.ts +9 -9
- package/src/db/ephemeral-registration-tokens.ts +26 -26
- package/src/db/index.ts +31 -21
- package/src/db/job-executions.test.ts +13 -11
- package/src/db/job-executions.ts +33 -27
- package/src/db/provisioner-capability-snapshots.test.ts +175 -0
- package/src/db/provisioner-capability-snapshots.ts +130 -0
- package/src/db/provisioner-tokens.test.ts +139 -2
- package/src/db/provisioner-tokens.ts +123 -15
- package/src/db/reservations.test.ts +49 -0
- package/src/db/reservations.ts +146 -1
- package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +429 -353
- package/src/db/runner-instances.ts +942 -0
- package/src/db/runner-sessions.test.ts +19 -6
- package/src/db/runner-sessions.ts +78 -2
- package/src/db/schema/capacity-assignments.ts +34 -0
- package/src/db/schema/ephemeral-registration-tokens.ts +4 -4
- package/src/db/schema/provisioner-capability-snapshots.ts +46 -0
- package/src/db/schema/provisioner-tokens.ts +33 -2
- package/src/db/schema/runner-activation-tokens.ts +22 -0
- package/src/db/schema/runner-control-sessions.ts +46 -0
- package/src/db/schema/{provisioned-runners.ts → runner-instances.ts} +26 -27
- package/src/db/schema/runner-sessions.ts +11 -7
- package/src/db/schema/running-job-executions.ts +5 -5
- package/src/index.test.ts +26 -0
- package/src/index.ts +39 -19
- package/src/installation-provisioning.ts +14 -0
- package/src/metrics/index.ts +5 -5
- package/src/metrics/instance.ts +25 -14
- package/src/presentation/auth/index.ts +4 -0
- package/src/presentation/auth/provisioner-token-auth.ts +8 -4
- package/src/presentation/auth/runner-control-session-auth.ts +31 -0
- package/src/presentation/auth/runner-registration-token-auth.ts +39 -3
- package/src/presentation/dto/index.ts +5 -5
- package/src/presentation/dto/mint-registration-tokens.ts +8 -15
- package/src/presentation/dto/poll-demand.ts +3 -1
- package/src/presentation/dto/provisioner-token.ts +5 -0
- package/src/presentation/dto/{provisioned-runners.ts → runner-instances.ts} +13 -15
- package/src/presentation/index.ts +2 -1
- package/src/presentation/inter-module.test.ts +15 -0
- package/src/presentation/inter-module.ts +53 -0
- package/src/presentation/routes/assign-capacity.ts +48 -0
- package/src/presentation/routes/get-provisioner-me.ts +3 -4
- package/src/presentation/routes/heartbeat.test.ts +4 -3
- package/src/presentation/routes/heartbeat.ts +67 -64
- package/src/presentation/routes/index.ts +93 -43
- package/src/presentation/routes/list-active-runners.test.ts +23 -23
- package/src/presentation/routes/manual-registration-tokens.test.ts +4 -3
- package/src/presentation/routes/mint-registration-tokens.test.ts +12 -12
- package/src/presentation/routes/mint-registration-tokens.ts +5 -7
- package/src/presentation/routes/planned-capacity.ts +49 -0
- package/src/presentation/routes/poll-demand-release.test.ts +4 -4
- package/src/presentation/routes/poll-demand.test.ts +161 -22
- package/src/presentation/routes/poll-demand.ts +105 -45
- package/src/presentation/routes/provisioner-me.test.ts +37 -3
- package/src/presentation/routes/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +66 -61
- package/src/presentation/routes/reconcile-runner-instances.ts +30 -0
- package/src/presentation/routes/register.test.ts +9 -5
- package/src/presentation/routes/register.ts +61 -57
- package/src/presentation/routes/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +28 -28
- package/src/presentation/routes/{report-provisioned-runners.ts → report-runner-instances.ts} +14 -14
- package/src/presentation/routes/request-job.test.ts +5 -3
- package/src/presentation/routes/request-job.ts +41 -37
- package/src/presentation/routes/runner-enrollment.test.ts +259 -0
- package/src/presentation/routes/runner-enrollment.ts +174 -0
- package/src/temporal/activities/index.ts +2 -2
- package/src/temporal/activities/maintenance-activities.test.ts +7 -7
- package/src/temporal/activities/maintenance-activities.ts +3 -3
- package/src/temporal/workflows/stuck-job-detector.test.ts +3 -3
- package/src/temporal/workflows/stuck-job-detector.ts +2 -2
- package/test/env.ts +1 -3
- package/test/factories/ephemeral-registration-token.ts +2 -2
- package/test/factories/provisioner-token.ts +3 -1
- package/test/factories/runner-instance.ts +57 -0
- package/test/factories/runner-session.ts +3 -1
- package/test/fixtures/auth-inter-module.ts +30 -0
- package/test/globalSetup.ts +5 -1
- package/test/index.ts +2 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/core/entities/provisioned-runner.d.ts.map +0 -1
- package/dist/core/entities/provisioned-runner.js +0 -3
- package/dist/core/entities/provisioned-runner.js.map +0 -1
- package/dist/core/provisioned-runners.d.ts +0 -67
- package/dist/core/provisioned-runners.d.ts.map +0 -1
- package/dist/core/provisioned-runners.js +0 -162
- package/dist/core/provisioned-runners.js.map +0 -1
- package/dist/db/provisioned-runners.d.ts +0 -79
- package/dist/db/provisioned-runners.d.ts.map +0 -1
- package/dist/db/provisioned-runners.js +0 -466
- package/dist/db/provisioned-runners.js.map +0 -1
- package/dist/db/schema/provisioned-runners.d.ts.map +0 -1
- package/dist/db/schema/provisioned-runners.js.map +0 -1
- package/dist/presentation/dto/provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/dto/provisioned-runners.js.map +0 -1
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +0 -2
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/routes/reconcile-provisioned-runners.js +0 -27
- package/dist/presentation/routes/reconcile-provisioned-runners.js.map +0 -1
- package/dist/presentation/routes/report-provisioned-runners.d.ts +0 -2
- package/dist/presentation/routes/report-provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/routes/report-provisioned-runners.js +0 -37
- package/dist/presentation/routes/report-provisioned-runners.js.map +0 -1
- package/src/core/provisioned-runners.ts +0 -301
- package/src/db/provisioned-runners.ts +0 -886
- package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
- package/test/factories/provisioned-runner.ts +0 -78
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
$ shipfox-swc && shipfox-temporal-bundle dist/temporal/workflows/index.js
|
|
2
|
-
Successfully compiled:
|
|
3
|
-
2026-07-
|
|
2
|
+
Successfully compiled: 99 files with swc (585.61ms)
|
|
3
|
+
2026-07-21T08:11:07.195Z [INFO] asset workflow-bundle-f2e085cb6b2d30f8e259.js 1.45 MiB [emitted] [immutable] (name: main)
|
|
4
4
|
runtime modules 670 bytes 3 modules
|
|
5
5
|
modules by path ../../../node_modules/.pnpm/ 424 KiB
|
|
6
6
|
modules by path ../../../node_modules/.pnpm/@temporalio+common@1.18.1/node_modules/@temporal...(truncated) 155 KiB 34 modules
|
|
7
7
|
modules by path ../../../node_modules/.pnpm/@temporalio+workflow@1.18.1/node_modules/@tempor...(truncated) 201 KiB 26 modules
|
|
8
8
|
modules by path ../../../node_modules/.pnpm/nexus-rpc@0.0.2/node_modules/nexus-rpc/lib/ 22.3 KiB 13 modules
|
|
9
9
|
+ 2 modules
|
|
10
|
-
modules by path ./dist/ 2.
|
|
10
|
+
modules by path ./dist/ 2.91 KiB
|
|
11
11
|
modules by path ./dist/temporal/workflows/*.js 2.35 KiB
|
|
12
12
|
./dist/temporal/workflows/index.js 61 bytes [built] [code generated]
|
|
13
13
|
./dist/temporal/workflows/stuck-job-detector.js 2.29 KiB [built] [code generated]
|
|
@@ -16,6 +16,6 @@ modules by path ./dist/ 2.92 KiB
|
|
|
16
16
|
optional modules 30 bytes [optional]
|
|
17
17
|
__temporal_custom_payload_converter (ignored) 15 bytes [optional] [built] [code generated]
|
|
18
18
|
__temporal_custom_failure_converter (ignored) 15 bytes [optional] [built] [code generated]
|
|
19
|
-
webpack 5.107.2 compiled successfully in
|
|
20
|
-
2026-07-
|
|
21
|
-
/home/runner/work/shipfox/shipfox/libs/api/runners/dist/temporal/workflows/index.js:
|
|
19
|
+
webpack 5.107.2 compiled successfully in 3716 ms
|
|
20
|
+
2026-07-21T08:11:07.204Z [INFO] Workflow bundle created { size: '1.45MB' }
|
|
21
|
+
/home/runner/work/shipfox/shipfox/libs/api/runners/dist/temporal/workflows/index.js: 1521943 bytes
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,88 @@
|
|
|
1
1
|
# @shipfox/api-runners
|
|
2
2
|
|
|
3
|
+
## 6.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 8bdc149: Adds scoped workspace and installation provisioner identities with explicit authorization boundaries.
|
|
8
|
+
- 6741be8: Renames the provisioned-runner lifecycle contract to runner instances and provider runner IDs.
|
|
9
|
+
|
|
10
|
+
### Minor Changes
|
|
11
|
+
|
|
12
|
+
- e52513c: Adds provisioner-owned planned capacity with immutable provider runner attachment.
|
|
13
|
+
- b70f920: Adds assigned runner activation and descendant provisioner revocation.
|
|
14
|
+
- add4c77: Adds host-configurable runners composition with batched installation workspace eligibility policy.
|
|
15
|
+
- 3cda0c6: Adds fresh workspace provisioner capability snapshots for managed fallback policy.
|
|
16
|
+
- 795e293: Adds installation-scoped fallback demand reservations across eligible workspaces.
|
|
17
|
+
- e10c829: Adds immutable capacity assignments while retaining the registration-token protocol for existing provisioners.
|
|
18
|
+
- b00ed29: Adds runner bootstrap enrollment and isolated pre-workspace control sessions.
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- 6a52909: Replaces separate API auth secrets with domain-separated keys derived from one required AUTH_ROOT_KEY.
|
|
23
|
+
- 9006b75: Adds the Runners inter-module contract and requires the injected Runners client when composing Workflows.
|
|
24
|
+
- 112c0fa: Adds the Auth inter-module token-minting contract and removes Auth implementation and configuration coupling from its consumers.
|
|
25
|
+
- f73da5d: Enforces bounded API context imports and routes inter-module consumers through producer contracts.
|
|
26
|
+
- Updated dependencies [e52513c]
|
|
27
|
+
- Updated dependencies [b70f920]
|
|
28
|
+
- Updated dependencies [23563de]
|
|
29
|
+
- Updated dependencies [6a52909]
|
|
30
|
+
- Updated dependencies [e6eba5b]
|
|
31
|
+
- Updated dependencies [54ce48b]
|
|
32
|
+
- Updated dependencies [9006b75]
|
|
33
|
+
- Updated dependencies [3cda0c6]
|
|
34
|
+
- Updated dependencies [ba2e3dc]
|
|
35
|
+
- Updated dependencies [f4bc2eb]
|
|
36
|
+
- Updated dependencies [c0162b0]
|
|
37
|
+
- Updated dependencies [7ac43a4]
|
|
38
|
+
- Updated dependencies [a01e917]
|
|
39
|
+
- Updated dependencies [112c0fa]
|
|
40
|
+
- Updated dependencies [8bdc149]
|
|
41
|
+
- Updated dependencies [795e293]
|
|
42
|
+
- Updated dependencies [e10c829]
|
|
43
|
+
- Updated dependencies [3810996]
|
|
44
|
+
- Updated dependencies [23a4dc2]
|
|
45
|
+
- Updated dependencies [b00ed29]
|
|
46
|
+
- Updated dependencies [8aa7cd3]
|
|
47
|
+
- Updated dependencies [4a91956]
|
|
48
|
+
- Updated dependencies [81f9544]
|
|
49
|
+
- Updated dependencies [6741be8]
|
|
50
|
+
- @shipfox/api-runners-dto@6.0.0
|
|
51
|
+
- @shipfox/node-tokens@0.3.0
|
|
52
|
+
- @shipfox/api-workflows-dto@6.0.0
|
|
53
|
+
- @shipfox/node-auth-root-key@0.2.0
|
|
54
|
+
- @shipfox/node-rate-limit@0.3.0
|
|
55
|
+
- @shipfox/api-auth-dto@6.0.0
|
|
56
|
+
- @shipfox/node-module@0.4.0
|
|
57
|
+
- @shipfox/node-temporal@0.3.2
|
|
58
|
+
- @shipfox/node-drizzle@0.3.2
|
|
59
|
+
- @shipfox/node-outbox@0.2.4
|
|
60
|
+
- @shipfox/api-auth-context@6.0.0
|
|
61
|
+
- @shipfox/node-fastify@0.2.4
|
|
62
|
+
- @shipfox/inter-module@0.2.0
|
|
63
|
+
|
|
64
|
+
## 5.0.0
|
|
65
|
+
|
|
66
|
+
### Patch Changes
|
|
67
|
+
|
|
68
|
+
- bb037af: Resolves workspace packages from source during development while published consumers continue to use compiled output.
|
|
69
|
+
- Updated dependencies [bb037af]
|
|
70
|
+
- @shipfox/api-auth@5.0.0
|
|
71
|
+
- @shipfox/api-auth-context@5.0.0
|
|
72
|
+
- @shipfox/api-runners-dto@5.0.0
|
|
73
|
+
- @shipfox/api-workflows-dto@5.0.0
|
|
74
|
+
- @shipfox/config@1.2.2
|
|
75
|
+
- @shipfox/node-drizzle@0.3.1
|
|
76
|
+
- @shipfox/node-fastify@0.2.3
|
|
77
|
+
- @shipfox/node-module@0.3.2
|
|
78
|
+
- @shipfox/node-opentelemetry@0.5.2
|
|
79
|
+
- @shipfox/node-outbox@0.2.3
|
|
80
|
+
- @shipfox/node-postgres@0.4.2
|
|
81
|
+
- @shipfox/node-rate-limit@0.2.1
|
|
82
|
+
- @shipfox/node-temporal@0.3.1
|
|
83
|
+
- @shipfox/node-tokens@0.2.1
|
|
84
|
+
- @shipfox/runner-labels@0.1.1
|
|
85
|
+
|
|
3
86
|
## 4.0.0
|
|
4
87
|
|
|
5
88
|
### Patch Changes
|
package/dist/config.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export declare const config: Readonly<{
|
|
2
|
+
RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS: number;
|
|
3
|
+
RUNNER_CONTROL_SESSION_TTL_SECONDS: number;
|
|
4
|
+
RUNNER_ACTIVATION_TOKEN_TTL_SECONDS: number;
|
|
5
|
+
RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS: number;
|
|
6
|
+
RUNNER_ASSIGNMENT_POLL_INTERVAL_MS: number;
|
|
2
7
|
EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS: number;
|
|
3
8
|
REGISTRATION_TOKEN_BATCH_MAX: number;
|
|
4
9
|
PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS: number;
|
|
@@ -6,7 +11,6 @@ export declare const config: Readonly<{
|
|
|
6
11
|
EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS: number;
|
|
7
12
|
EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS: number;
|
|
8
13
|
RUNNERS_RATE_LIMIT_TIMEOUT_MS: number;
|
|
9
|
-
RATE_LIMIT_IDENTIFIER_SECRET: string | undefined;
|
|
10
14
|
RESERVATION_TTL_SECONDS: number;
|
|
11
15
|
RESERVATION_LONG_POLL_MAX_WAIT_SECONDS: number;
|
|
12
16
|
RESERVATION_POLL_INTERVAL_MS: number;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDA6HjB,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
import { REGISTRATION_TOKEN_BATCH_HARD_MAX } from '@shipfox/api-runners-dto';
|
|
2
|
-
import { bool, createConfig, num
|
|
2
|
+
import { bool, createConfig, num } from '@shipfox/config';
|
|
3
3
|
import { STUCK_JOB_THRESHOLD_SECONDS } from '#core/maintenance-policy.js';
|
|
4
4
|
const EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS = 3600;
|
|
5
|
+
const RUNNER_CONTROL_PLANE_TOKEN_TTL_HARD_MAX_SECONDS = 3600;
|
|
5
6
|
export const config = createConfig({
|
|
7
|
+
RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS: num({
|
|
8
|
+
desc: 'Lifetime of a one-use runner bootstrap token in seconds. The token can only create one runner-control session before it expires.',
|
|
9
|
+
default: 300
|
|
10
|
+
}),
|
|
11
|
+
RUNNER_CONTROL_SESSION_TTL_SECONDS: num({
|
|
12
|
+
desc: 'Lifetime of a pre-workspace runner-control session in seconds. This session can only enroll, attach its provider identity, and report its own liveness.',
|
|
13
|
+
default: 3600
|
|
14
|
+
}),
|
|
15
|
+
RUNNER_ACTIVATION_TOKEN_TTL_SECONDS: num({
|
|
16
|
+
desc: 'Lifetime of a one-use activation token in seconds. The token is issued only to an assigned runner-control session and creates one workspace runner session.',
|
|
17
|
+
default: 300
|
|
18
|
+
}),
|
|
19
|
+
RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS: num({
|
|
20
|
+
desc: 'Maximum time the runner assignment poll waits before returning no assignment, in seconds.',
|
|
21
|
+
default: 30
|
|
22
|
+
}),
|
|
23
|
+
RUNNER_ASSIGNMENT_POLL_INTERVAL_MS: num({
|
|
24
|
+
desc: 'Delay between durable assignment reads while a runner-control session waits for an assignment, in milliseconds.',
|
|
25
|
+
default: 1000
|
|
26
|
+
}),
|
|
6
27
|
EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS: num({
|
|
7
28
|
desc: `Lifetime of a provisioner-minted runner registration token, in seconds. The token can be exchanged once by a runner before this time passes. Set this between 1 and ${EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS}.`,
|
|
8
29
|
default: 300
|
|
@@ -31,10 +52,6 @@ export const config = createConfig({
|
|
|
31
52
|
desc: 'Maximum time, in milliseconds, a runners rate-limit storage check may wait before the request fails closed.',
|
|
32
53
|
default: 250
|
|
33
54
|
}),
|
|
34
|
-
RATE_LIMIT_IDENTIFIER_SECRET: str({
|
|
35
|
-
desc: 'Optional secret used to HMAC identifiers before storing rate-limit counters. Leave it unset to derive a stable key from AUTH_JWT_SECRET.',
|
|
36
|
-
default: undefined
|
|
37
|
-
}),
|
|
38
55
|
RESERVATION_TTL_SECONDS: num({
|
|
39
56
|
desc: 'Lifetime of a count-based runner reservation, in seconds. Expired reservations stop counting against queued demand.',
|
|
40
57
|
default: 60
|
|
@@ -108,13 +125,43 @@ export const config = createConfig({
|
|
|
108
125
|
default: 10
|
|
109
126
|
}),
|
|
110
127
|
PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED: bool({
|
|
111
|
-
desc: 'Whether
|
|
128
|
+
desc: 'Whether runners_provider_runner_count_divergence includes template_key as a metric label. Use true or false. Defaults to false because template keys can create high-cardinality metric series. Set true only when template keys are bounded and stable.',
|
|
112
129
|
default: false
|
|
113
130
|
})
|
|
114
131
|
});
|
|
115
132
|
if (!Number.isInteger(config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS) || config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS < 1 || config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS > EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS) {
|
|
116
133
|
throw new Error(`EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS (${config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS}) must be a whole number of seconds between 1 and ${EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS}.`);
|
|
117
134
|
}
|
|
135
|
+
for (const [name, value] of [
|
|
136
|
+
[
|
|
137
|
+
'RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS',
|
|
138
|
+
config.RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS
|
|
139
|
+
],
|
|
140
|
+
[
|
|
141
|
+
'RUNNER_CONTROL_SESSION_TTL_SECONDS',
|
|
142
|
+
config.RUNNER_CONTROL_SESSION_TTL_SECONDS
|
|
143
|
+
],
|
|
144
|
+
[
|
|
145
|
+
'RUNNER_ACTIVATION_TOKEN_TTL_SECONDS',
|
|
146
|
+
config.RUNNER_ACTIVATION_TOKEN_TTL_SECONDS
|
|
147
|
+
]
|
|
148
|
+
]){
|
|
149
|
+
if (!Number.isInteger(value) || value < 1 || value > RUNNER_CONTROL_PLANE_TOKEN_TTL_HARD_MAX_SECONDS) {
|
|
150
|
+
throw new Error(`${name} (${value}) must be a whole number of seconds between 1 and ${RUNNER_CONTROL_PLANE_TOKEN_TTL_HARD_MAX_SECONDS}.`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
for (const [name, value] of [
|
|
154
|
+
[
|
|
155
|
+
'RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS',
|
|
156
|
+
config.RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS
|
|
157
|
+
],
|
|
158
|
+
[
|
|
159
|
+
'RUNNER_ASSIGNMENT_POLL_INTERVAL_MS',
|
|
160
|
+
config.RUNNER_ASSIGNMENT_POLL_INTERVAL_MS
|
|
161
|
+
]
|
|
162
|
+
]){
|
|
163
|
+
if (!Number.isInteger(value) || value < 0) throw new Error(`${name} (${value}) must be a whole number >= 0.`);
|
|
164
|
+
}
|
|
118
165
|
if (!Number.isInteger(config.REGISTRATION_TOKEN_BATCH_MAX) || config.REGISTRATION_TOKEN_BATCH_MAX < 1 || config.REGISTRATION_TOKEN_BATCH_MAX > REGISTRATION_TOKEN_BATCH_HARD_MAX) {
|
|
119
166
|
throw new Error(`REGISTRATION_TOKEN_BATCH_MAX (${config.REGISTRATION_TOKEN_BATCH_MAX}) must be a whole number between 1 and ${REGISTRATION_TOKEN_BATCH_HARD_MAX}.`);
|
|
120
167
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["import {REGISTRATION_TOKEN_BATCH_HARD_MAX} from '@shipfox/api-runners-dto';\nimport {bool, createConfig, num, str} from '@shipfox/config';\nimport {STUCK_JOB_THRESHOLD_SECONDS} from '#core/maintenance-policy.js';\n\nconst EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS = 3600;\n\nexport const config = createConfig({\n EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS: num({\n desc: `Lifetime of a provisioner-minted runner registration token, in seconds. The token can be exchanged once by a runner before this time passes. Set this between 1 and ${EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS}.`,\n default: 300,\n }),\n REGISTRATION_TOKEN_BATCH_MAX: num({\n desc: `Maximum number of runner registration tokens a provisioner can mint in one batch request. Set this between 1 and ${REGISTRATION_TOKEN_BATCH_HARD_MAX}.`,\n default: 500,\n }),\n PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS: num({\n desc: 'Maximum number of batch runner registration token mint requests one provisioner can make per rate-limit window.',\n default: 120,\n }),\n PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS: num({\n desc: 'Rate-limit window for provisioner batch runner registration token mint requests, in seconds.',\n default: 60,\n }),\n EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS: num({\n desc: 'Maximum number of runner registration attempts one ephemeral registration token can make per rate-limit window.',\n default: 5,\n }),\n EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS: num({\n desc: 'Rate-limit window for runner registration attempts with one ephemeral registration token, in seconds.',\n default: 60,\n }),\n RUNNERS_RATE_LIMIT_TIMEOUT_MS: num({\n desc: 'Maximum time, in milliseconds, a runners rate-limit storage check may wait before the request fails closed.',\n default: 250,\n }),\n RATE_LIMIT_IDENTIFIER_SECRET: str({\n desc: 'Optional secret used to HMAC identifiers before storing rate-limit counters. Leave it unset to derive a stable key from AUTH_JWT_SECRET.',\n default: undefined,\n }),\n RESERVATION_TTL_SECONDS: num({\n desc: 'Lifetime of a count-based runner reservation, in seconds. Expired reservations stop counting against queued demand.',\n default: 60,\n }),\n RESERVATION_LONG_POLL_MAX_WAIT_SECONDS: num({\n desc: 'Maximum time the provisioner demand poll endpoint waits for reservable demand before returning, in seconds.',\n default: 30,\n }),\n RESERVATION_POLL_INTERVAL_MS: num({\n desc: 'Initial interval between demand re-checks while a provisioner request is waiting, in milliseconds.',\n default: 1000,\n }),\n RESERVATION_POLL_MAX_INTERVAL_MS: num({\n desc: 'Maximum backoff interval between demand re-checks while a provisioner request is waiting, in milliseconds.',\n default: 5000,\n }),\n RUNNER_ACTIVE_WINDOW_SECONDS: num({\n desc: 'Time window, in seconds, used to list active runners from recent heartbeats and provisioned runner reports.',\n default: 60,\n }),\n RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS: num({\n desc: 'Time window, in seconds, after which a runner tool capability report is treated as stale. Set this higher than the runner heartbeat interval so active runners keep their advertised tools fresh.',\n default: 60,\n }),\n RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS: num({\n desc: 'Grace window, in seconds, before maintenance expires a claimed job that has not sent its first heartbeat. Set this lower than the normal stuck-job threshold so startup crashes release work quickly.',\n default: 60,\n }),\n RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS: num({\n desc: 'Grace window, in seconds, before reconcile marks an absent provisioned runner as terminated. Set this higher than the provisioner report interval so a transient empty or partial observed set does not kill a live runner.',\n default: 120,\n }),\n RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS: num({\n desc: 'Time, in seconds, after which a provisioned runner with no recent report, no live provisioner, no live runner session, and no running job is marked failed by backend maintenance.',\n default: 300,\n }),\n RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT: num({\n desc: 'Maximum number of stale provisioned runners the maintenance worker marks failed in one run. Higher values clear backlogs faster but hold database locks longer.',\n default: 100,\n }),\n RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS: num({\n desc: 'Minimum time, in seconds, between runner session liveness writes from job request polls. Set this lower than RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS so active idle runners stay fresh.',\n default: 10,\n }),\n RUNNER_SESSION_MANUAL_RETENTION_DAYS: num({\n desc: 'How long manual runner sessions are retained before maintenance deletes them, in days. Set this longer than AUTH_RUNNER_SESSION_TOKEN_EXPIRES_IN so a valid session token never outlives its row.',\n default: 30,\n }),\n RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS: num({\n desc: 'How long ephemeral runner sessions are retained before maintenance deletes them, in days. Set this longer than AUTH_RUNNER_SESSION_TOKEN_EXPIRES_IN so a valid session token never outlives its row.',\n default: 7,\n }),\n RUNNER_SESSION_GC_BATCH_SIZE: num({\n desc: 'Maximum number of expired runner sessions maintenance deletes in one pass.',\n default: 1000,\n }),\n RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS: num({\n desc: 'How long consumed or expired ephemeral registration tokens are retained for audit and debugging before maintenance deletes them, in days. Active tokens that are neither consumed nor expired are never deleted. This window is independent of the runner-session retention windows.',\n default: 7,\n }),\n RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE: num({\n desc: 'Maximum number of consumed or expired ephemeral registration tokens maintenance deletes in one pass.',\n default: 1000,\n }),\n PROVISIONER_ACTIVE_WINDOW_SECONDS: num({\n desc: 'Time window, in seconds, used to list active provisioners from recent authenticated requests.',\n default: 120,\n }),\n PROVISIONER_LAST_SEEN_THROTTLE_SECONDS: num({\n desc: 'Minimum time, in seconds, between last-seen writes for one provisioner token.',\n default: 10,\n }),\n PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED: bool({\n desc: 'Whether runners_provisioned_runner_count_divergence includes template_key as a metric label. Use true or false. Defaults to false because template keys can create high-cardinality metric series. Set true only when template keys are bounded and stable.',\n default: false,\n }),\n});\n\nif (\n !Number.isInteger(config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS) ||\n config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS < 1 ||\n config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS >\n EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS\n) {\n throw new Error(\n `EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS (${config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS}) must be a whole number of seconds between 1 and ${EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS}.`,\n );\n}\n\nif (\n !Number.isInteger(config.REGISTRATION_TOKEN_BATCH_MAX) ||\n config.REGISTRATION_TOKEN_BATCH_MAX < 1 ||\n config.REGISTRATION_TOKEN_BATCH_MAX > REGISTRATION_TOKEN_BATCH_HARD_MAX\n) {\n throw new Error(\n `REGISTRATION_TOKEN_BATCH_MAX (${config.REGISTRATION_TOKEN_BATCH_MAX}) must be a whole number between 1 and ${REGISTRATION_TOKEN_BATCH_HARD_MAX}.`,\n );\n}\n\nfor (const [name, value] of [\n ['PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS', config.PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS],\n ['PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS', config.PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS],\n ['EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS', config.EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS],\n [\n 'EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS',\n config.EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS,\n ],\n ['RUNNERS_RATE_LIMIT_TIMEOUT_MS', config.RUNNERS_RATE_LIMIT_TIMEOUT_MS],\n] as const) {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`${name} (${value}) must be a whole number >= 1.`);\n }\n}\n\nif (!Number.isInteger(config.RESERVATION_TTL_SECONDS) || config.RESERVATION_TTL_SECONDS < 1) {\n throw new Error(\n `RESERVATION_TTL_SECONDS (${config.RESERVATION_TTL_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS) ||\n config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS < 0\n) {\n throw new Error(\n `RESERVATION_LONG_POLL_MAX_WAIT_SECONDS (${config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS}) must be a whole number of seconds >= 0.`,\n );\n}\n\nif (\n !Number.isInteger(config.RESERVATION_POLL_INTERVAL_MS) ||\n config.RESERVATION_POLL_INTERVAL_MS < 1\n) {\n throw new Error(\n `RESERVATION_POLL_INTERVAL_MS (${config.RESERVATION_POLL_INTERVAL_MS}) must be a whole number of milliseconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RESERVATION_POLL_MAX_INTERVAL_MS) ||\n config.RESERVATION_POLL_MAX_INTERVAL_MS < config.RESERVATION_POLL_INTERVAL_MS\n) {\n throw new Error(\n `RESERVATION_POLL_MAX_INTERVAL_MS (${config.RESERVATION_POLL_MAX_INTERVAL_MS}) must be a whole number of milliseconds >= RESERVATION_POLL_INTERVAL_MS (${config.RESERVATION_POLL_INTERVAL_MS}).`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_ACTIVE_WINDOW_SECONDS) ||\n config.RUNNER_ACTIVE_WINDOW_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_ACTIVE_WINDOW_SECONDS (${config.RUNNER_ACTIVE_WINDOW_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS) ||\n config.RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS (${config.RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS) ||\n config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS < 1 ||\n config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS >= STUCK_JOB_THRESHOLD_SECONDS\n) {\n throw new Error(\n `RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS (${config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS}) must be a whole number of seconds >= 1 and < ${STUCK_JOB_THRESHOLD_SECONDS}.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS) ||\n config.RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS (${config.RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS) ||\n config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS (${config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT) ||\n config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT < 1\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT (${config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT}) must be a whole number >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS) ||\n config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS (${config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_MANUAL_RETENTION_DAYS) ||\n config.RUNNER_SESSION_MANUAL_RETENTION_DAYS < 1\n) {\n throw new Error(\n `RUNNER_SESSION_MANUAL_RETENTION_DAYS (${config.RUNNER_SESSION_MANUAL_RETENTION_DAYS}) must be a whole number of days >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS) ||\n config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS < 1\n) {\n throw new Error(\n `RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS (${config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS}) must be a whole number of days >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_GC_BATCH_SIZE) ||\n config.RUNNER_SESSION_GC_BATCH_SIZE < 1\n) {\n throw new Error(\n `RUNNER_SESSION_GC_BATCH_SIZE (${config.RUNNER_SESSION_GC_BATCH_SIZE}) must be a whole number >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS) ||\n config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS < 1\n) {\n throw new Error(\n `RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS (${config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS}) must be a whole number of days >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE) ||\n config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE < 1\n) {\n throw new Error(\n `RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE (${config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE}) must be a whole number >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.PROVISIONER_ACTIVE_WINDOW_SECONDS) ||\n config.PROVISIONER_ACTIVE_WINDOW_SECONDS < 1\n) {\n throw new Error(\n `PROVISIONER_ACTIVE_WINDOW_SECONDS (${config.PROVISIONER_ACTIVE_WINDOW_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS) ||\n config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS < 1\n) {\n throw new Error(\n `PROVISIONER_LAST_SEEN_THROTTLE_SECONDS (${config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS <=\n config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS (${config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS}) must be greater than PROVISIONER_LAST_SEEN_THROTTLE_SECONDS (${config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS}).`,\n );\n}\n\nif (\n config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS <=\n config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS (${config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS}) must be greater than RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS (${config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS}).`,\n );\n}\n"],"names":["REGISTRATION_TOKEN_BATCH_HARD_MAX","bool","createConfig","num","str","STUCK_JOB_THRESHOLD_SECONDS","EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS","config","EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS","desc","default","REGISTRATION_TOKEN_BATCH_MAX","PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS","PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS","EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS","EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS","RUNNERS_RATE_LIMIT_TIMEOUT_MS","RATE_LIMIT_IDENTIFIER_SECRET","undefined","RESERVATION_TTL_SECONDS","RESERVATION_LONG_POLL_MAX_WAIT_SECONDS","RESERVATION_POLL_INTERVAL_MS","RESERVATION_POLL_MAX_INTERVAL_MS","RUNNER_ACTIVE_WINDOW_SECONDS","RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS","RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS","RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS","RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS","RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT","RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS","RUNNER_SESSION_MANUAL_RETENTION_DAYS","RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS","RUNNER_SESSION_GC_BATCH_SIZE","RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS","RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE","PROVISIONER_ACTIVE_WINDOW_SECONDS","PROVISIONER_LAST_SEEN_THROTTLE_SECONDS","PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED","Number","isInteger","Error","name","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["import {REGISTRATION_TOKEN_BATCH_HARD_MAX} from '@shipfox/api-runners-dto';\nimport {bool, createConfig, num} from '@shipfox/config';\nimport {STUCK_JOB_THRESHOLD_SECONDS} from '#core/maintenance-policy.js';\n\nconst EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS = 3600;\nconst RUNNER_CONTROL_PLANE_TOKEN_TTL_HARD_MAX_SECONDS = 3600;\n\nexport const config = createConfig({\n RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS: num({\n desc: 'Lifetime of a one-use runner bootstrap token in seconds. The token can only create one runner-control session before it expires.',\n default: 300,\n }),\n RUNNER_CONTROL_SESSION_TTL_SECONDS: num({\n desc: 'Lifetime of a pre-workspace runner-control session in seconds. This session can only enroll, attach its provider identity, and report its own liveness.',\n default: 3600,\n }),\n RUNNER_ACTIVATION_TOKEN_TTL_SECONDS: num({\n desc: 'Lifetime of a one-use activation token in seconds. The token is issued only to an assigned runner-control session and creates one workspace runner session.',\n default: 300,\n }),\n RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS: num({\n desc: 'Maximum time the runner assignment poll waits before returning no assignment, in seconds.',\n default: 30,\n }),\n RUNNER_ASSIGNMENT_POLL_INTERVAL_MS: num({\n desc: 'Delay between durable assignment reads while a runner-control session waits for an assignment, in milliseconds.',\n default: 1000,\n }),\n EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS: num({\n desc: `Lifetime of a provisioner-minted runner registration token, in seconds. The token can be exchanged once by a runner before this time passes. Set this between 1 and ${EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS}.`,\n default: 300,\n }),\n REGISTRATION_TOKEN_BATCH_MAX: num({\n desc: `Maximum number of runner registration tokens a provisioner can mint in one batch request. Set this between 1 and ${REGISTRATION_TOKEN_BATCH_HARD_MAX}.`,\n default: 500,\n }),\n PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS: num({\n desc: 'Maximum number of batch runner registration token mint requests one provisioner can make per rate-limit window.',\n default: 120,\n }),\n PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS: num({\n desc: 'Rate-limit window for provisioner batch runner registration token mint requests, in seconds.',\n default: 60,\n }),\n EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS: num({\n desc: 'Maximum number of runner registration attempts one ephemeral registration token can make per rate-limit window.',\n default: 5,\n }),\n EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS: num({\n desc: 'Rate-limit window for runner registration attempts with one ephemeral registration token, in seconds.',\n default: 60,\n }),\n RUNNERS_RATE_LIMIT_TIMEOUT_MS: num({\n desc: 'Maximum time, in milliseconds, a runners rate-limit storage check may wait before the request fails closed.',\n default: 250,\n }),\n RESERVATION_TTL_SECONDS: num({\n desc: 'Lifetime of a count-based runner reservation, in seconds. Expired reservations stop counting against queued demand.',\n default: 60,\n }),\n RESERVATION_LONG_POLL_MAX_WAIT_SECONDS: num({\n desc: 'Maximum time the provisioner demand poll endpoint waits for reservable demand before returning, in seconds.',\n default: 30,\n }),\n RESERVATION_POLL_INTERVAL_MS: num({\n desc: 'Initial interval between demand re-checks while a provisioner request is waiting, in milliseconds.',\n default: 1000,\n }),\n RESERVATION_POLL_MAX_INTERVAL_MS: num({\n desc: 'Maximum backoff interval between demand re-checks while a provisioner request is waiting, in milliseconds.',\n default: 5000,\n }),\n RUNNER_ACTIVE_WINDOW_SECONDS: num({\n desc: 'Time window, in seconds, used to list active runners from recent heartbeats and provisioned runner reports.',\n default: 60,\n }),\n RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS: num({\n desc: 'Time window, in seconds, after which a runner tool capability report is treated as stale. Set this higher than the runner heartbeat interval so active runners keep their advertised tools fresh.',\n default: 60,\n }),\n RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS: num({\n desc: 'Grace window, in seconds, before maintenance expires a claimed job that has not sent its first heartbeat. Set this lower than the normal stuck-job threshold so startup crashes release work quickly.',\n default: 60,\n }),\n RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS: num({\n desc: 'Grace window, in seconds, before reconcile marks an absent provisioned runner as terminated. Set this higher than the provisioner report interval so a transient empty or partial observed set does not kill a live runner.',\n default: 120,\n }),\n RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS: num({\n desc: 'Time, in seconds, after which a provisioned runner with no recent report, no live provisioner, no live runner session, and no running job is marked failed by backend maintenance.',\n default: 300,\n }),\n RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT: num({\n desc: 'Maximum number of stale provisioned runners the maintenance worker marks failed in one run. Higher values clear backlogs faster but hold database locks longer.',\n default: 100,\n }),\n RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS: num({\n desc: 'Minimum time, in seconds, between runner session liveness writes from job request polls. Set this lower than RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS so active idle runners stay fresh.',\n default: 10,\n }),\n RUNNER_SESSION_MANUAL_RETENTION_DAYS: num({\n desc: 'How long manual runner sessions are retained before maintenance deletes them, in days. Set this longer than AUTH_RUNNER_SESSION_TOKEN_EXPIRES_IN so a valid session token never outlives its row.',\n default: 30,\n }),\n RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS: num({\n desc: 'How long ephemeral runner sessions are retained before maintenance deletes them, in days. Set this longer than AUTH_RUNNER_SESSION_TOKEN_EXPIRES_IN so a valid session token never outlives its row.',\n default: 7,\n }),\n RUNNER_SESSION_GC_BATCH_SIZE: num({\n desc: 'Maximum number of expired runner sessions maintenance deletes in one pass.',\n default: 1000,\n }),\n RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS: num({\n desc: 'How long consumed or expired ephemeral registration tokens are retained for audit and debugging before maintenance deletes them, in days. Active tokens that are neither consumed nor expired are never deleted. This window is independent of the runner-session retention windows.',\n default: 7,\n }),\n RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE: num({\n desc: 'Maximum number of consumed or expired ephemeral registration tokens maintenance deletes in one pass.',\n default: 1000,\n }),\n PROVISIONER_ACTIVE_WINDOW_SECONDS: num({\n desc: 'Time window, in seconds, used to list active provisioners from recent authenticated requests.',\n default: 120,\n }),\n PROVISIONER_LAST_SEEN_THROTTLE_SECONDS: num({\n desc: 'Minimum time, in seconds, between last-seen writes for one provisioner token.',\n default: 10,\n }),\n PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED: bool({\n desc: 'Whether runners_provider_runner_count_divergence includes template_key as a metric label. Use true or false. Defaults to false because template keys can create high-cardinality metric series. Set true only when template keys are bounded and stable.',\n default: false,\n }),\n});\n\nif (\n !Number.isInteger(config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS) ||\n config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS < 1 ||\n config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS >\n EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS\n) {\n throw new Error(\n `EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS (${config.EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS}) must be a whole number of seconds between 1 and ${EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS}.`,\n );\n}\n\nfor (const [name, value] of [\n ['RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS', config.RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS],\n ['RUNNER_CONTROL_SESSION_TTL_SECONDS', config.RUNNER_CONTROL_SESSION_TTL_SECONDS],\n ['RUNNER_ACTIVATION_TOKEN_TTL_SECONDS', config.RUNNER_ACTIVATION_TOKEN_TTL_SECONDS],\n] as const) {\n if (\n !Number.isInteger(value) ||\n value < 1 ||\n value > RUNNER_CONTROL_PLANE_TOKEN_TTL_HARD_MAX_SECONDS\n ) {\n throw new Error(\n `${name} (${value}) must be a whole number of seconds between 1 and ${RUNNER_CONTROL_PLANE_TOKEN_TTL_HARD_MAX_SECONDS}.`,\n );\n }\n}\n\nfor (const [name, value] of [\n ['RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS', config.RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS],\n ['RUNNER_ASSIGNMENT_POLL_INTERVAL_MS', config.RUNNER_ASSIGNMENT_POLL_INTERVAL_MS],\n] as const) {\n if (!Number.isInteger(value) || value < 0)\n throw new Error(`${name} (${value}) must be a whole number >= 0.`);\n}\n\nif (\n !Number.isInteger(config.REGISTRATION_TOKEN_BATCH_MAX) ||\n config.REGISTRATION_TOKEN_BATCH_MAX < 1 ||\n config.REGISTRATION_TOKEN_BATCH_MAX > REGISTRATION_TOKEN_BATCH_HARD_MAX\n) {\n throw new Error(\n `REGISTRATION_TOKEN_BATCH_MAX (${config.REGISTRATION_TOKEN_BATCH_MAX}) must be a whole number between 1 and ${REGISTRATION_TOKEN_BATCH_HARD_MAX}.`,\n );\n}\n\nfor (const [name, value] of [\n ['PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS', config.PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS],\n ['PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS', config.PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS],\n ['EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS', config.EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS],\n [\n 'EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS',\n config.EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS,\n ],\n ['RUNNERS_RATE_LIMIT_TIMEOUT_MS', config.RUNNERS_RATE_LIMIT_TIMEOUT_MS],\n] as const) {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`${name} (${value}) must be a whole number >= 1.`);\n }\n}\n\nif (!Number.isInteger(config.RESERVATION_TTL_SECONDS) || config.RESERVATION_TTL_SECONDS < 1) {\n throw new Error(\n `RESERVATION_TTL_SECONDS (${config.RESERVATION_TTL_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS) ||\n config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS < 0\n) {\n throw new Error(\n `RESERVATION_LONG_POLL_MAX_WAIT_SECONDS (${config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS}) must be a whole number of seconds >= 0.`,\n );\n}\n\nif (\n !Number.isInteger(config.RESERVATION_POLL_INTERVAL_MS) ||\n config.RESERVATION_POLL_INTERVAL_MS < 1\n) {\n throw new Error(\n `RESERVATION_POLL_INTERVAL_MS (${config.RESERVATION_POLL_INTERVAL_MS}) must be a whole number of milliseconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RESERVATION_POLL_MAX_INTERVAL_MS) ||\n config.RESERVATION_POLL_MAX_INTERVAL_MS < config.RESERVATION_POLL_INTERVAL_MS\n) {\n throw new Error(\n `RESERVATION_POLL_MAX_INTERVAL_MS (${config.RESERVATION_POLL_MAX_INTERVAL_MS}) must be a whole number of milliseconds >= RESERVATION_POLL_INTERVAL_MS (${config.RESERVATION_POLL_INTERVAL_MS}).`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_ACTIVE_WINDOW_SECONDS) ||\n config.RUNNER_ACTIVE_WINDOW_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_ACTIVE_WINDOW_SECONDS (${config.RUNNER_ACTIVE_WINDOW_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS) ||\n config.RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS (${config.RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS) ||\n config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS < 1 ||\n config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS >= STUCK_JOB_THRESHOLD_SECONDS\n) {\n throw new Error(\n `RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS (${config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS}) must be a whole number of seconds >= 1 and < ${STUCK_JOB_THRESHOLD_SECONDS}.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS) ||\n config.RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS (${config.RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS) ||\n config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS (${config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT) ||\n config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT < 1\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT (${config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT}) must be a whole number >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS) ||\n config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS < 1\n) {\n throw new Error(\n `RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS (${config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_MANUAL_RETENTION_DAYS) ||\n config.RUNNER_SESSION_MANUAL_RETENTION_DAYS < 1\n) {\n throw new Error(\n `RUNNER_SESSION_MANUAL_RETENTION_DAYS (${config.RUNNER_SESSION_MANUAL_RETENTION_DAYS}) must be a whole number of days >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS) ||\n config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS < 1\n) {\n throw new Error(\n `RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS (${config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS}) must be a whole number of days >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_SESSION_GC_BATCH_SIZE) ||\n config.RUNNER_SESSION_GC_BATCH_SIZE < 1\n) {\n throw new Error(\n `RUNNER_SESSION_GC_BATCH_SIZE (${config.RUNNER_SESSION_GC_BATCH_SIZE}) must be a whole number >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS) ||\n config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS < 1\n) {\n throw new Error(\n `RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS (${config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS}) must be a whole number of days >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE) ||\n config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE < 1\n) {\n throw new Error(\n `RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE (${config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE}) must be a whole number >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.PROVISIONER_ACTIVE_WINDOW_SECONDS) ||\n config.PROVISIONER_ACTIVE_WINDOW_SECONDS < 1\n) {\n throw new Error(\n `PROVISIONER_ACTIVE_WINDOW_SECONDS (${config.PROVISIONER_ACTIVE_WINDOW_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n !Number.isInteger(config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS) ||\n config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS < 1\n) {\n throw new Error(\n `PROVISIONER_LAST_SEEN_THROTTLE_SECONDS (${config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS}) must be a whole number of seconds >= 1.`,\n );\n}\n\nif (\n config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS <=\n config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS (${config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS}) must be greater than PROVISIONER_LAST_SEEN_THROTTLE_SECONDS (${config.PROVISIONER_LAST_SEEN_THROTTLE_SECONDS}).`,\n );\n}\n\nif (\n config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS <=\n config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS\n) {\n throw new Error(\n `RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS (${config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS}) must be greater than RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS (${config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS}).`,\n );\n}\n"],"names":["REGISTRATION_TOKEN_BATCH_HARD_MAX","bool","createConfig","num","STUCK_JOB_THRESHOLD_SECONDS","EPHEMERAL_REGISTRATION_TOKEN_TTL_HARD_MAX_SECONDS","RUNNER_CONTROL_PLANE_TOKEN_TTL_HARD_MAX_SECONDS","config","RUNNER_BOOTSTRAP_TOKEN_TTL_SECONDS","desc","default","RUNNER_CONTROL_SESSION_TTL_SECONDS","RUNNER_ACTIVATION_TOKEN_TTL_SECONDS","RUNNER_ASSIGNMENT_POLL_MAX_WAIT_SECONDS","RUNNER_ASSIGNMENT_POLL_INTERVAL_MS","EPHEMERAL_REGISTRATION_TOKEN_TTL_SECONDS","REGISTRATION_TOKEN_BATCH_MAX","PROVISIONER_MINT_RATE_LIMIT_MAX_REQUESTS","PROVISIONER_MINT_RATE_LIMIT_WINDOW_SECONDS","EPHEMERAL_REGISTER_RATE_LIMIT_MAX_REQUESTS","EPHEMERAL_REGISTER_RATE_LIMIT_WINDOW_SECONDS","RUNNERS_RATE_LIMIT_TIMEOUT_MS","RESERVATION_TTL_SECONDS","RESERVATION_LONG_POLL_MAX_WAIT_SECONDS","RESERVATION_POLL_INTERVAL_MS","RESERVATION_POLL_MAX_INTERVAL_MS","RUNNER_ACTIVE_WINDOW_SECONDS","RUNNER_TOOL_CAPABILITIES_STALE_AFTER_SECONDS","RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS","RUNNER_RECONCILE_TERMINATE_GRACE_SECONDS","RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS","RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT","RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS","RUNNER_SESSION_MANUAL_RETENTION_DAYS","RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS","RUNNER_SESSION_GC_BATCH_SIZE","RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS","RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE","PROVISIONER_ACTIVE_WINDOW_SECONDS","PROVISIONER_LAST_SEEN_THROTTLE_SECONDS","PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED","Number","isInteger","Error","name","value"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CapacityAssignment } from './entities/capacity-assignment.js';
|
|
2
|
+
export declare function assignCapacityBatch(params: {
|
|
3
|
+
provisionerId: string;
|
|
4
|
+
reservationId: string;
|
|
5
|
+
capacityIds: string[];
|
|
6
|
+
}): Promise<CapacityAssignment[]>;
|
|
7
|
+
//# sourceMappingURL=capacity-assignments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacity-assignments.d.ts","sourceRoot":"","sources":["../../src/core/capacity-assignments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AAE1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAEhC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/capacity-assignments.ts"],"sourcesContent":["import {assignCapacityBatch as assignCapacityBatchDb} from '#db/capacity-assignments.js';\nimport type {CapacityAssignment} from './entities/capacity-assignment.js';\n\nexport function assignCapacityBatch(params: {\n provisionerId: string;\n reservationId: string;\n capacityIds: string[];\n}): Promise<CapacityAssignment[]> {\n return assignCapacityBatchDb(params);\n}\n"],"names":["assignCapacityBatch","assignCapacityBatchDb","params"],"mappings":"AAAA,SAAQA,uBAAuBC,qBAAqB,QAAO,8BAA8B;AAGzF,OAAO,SAASD,oBAAoBE,MAInC;IACC,OAAOD,sBAAsBC;AAC/B"}
|
package/dist/core/demand.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type ActiveProvisionedRunnerTemplateCount } from '#db/provisioned-runners.js';
|
|
2
1
|
import { type DemandStat, type ReservationGrant, type ReservationTemplate } from '#db/reservations.js';
|
|
2
|
+
import { type ActiveRunnerInstanceTemplateCount } from '#db/runner-instances.js';
|
|
3
3
|
export interface PollDemandParams {
|
|
4
4
|
workspaceId: string;
|
|
5
5
|
provisionerId: string;
|
|
@@ -13,9 +13,9 @@ export interface PollDemandParams {
|
|
|
13
13
|
export interface PollDemandResult {
|
|
14
14
|
stats: DemandStat[];
|
|
15
15
|
reservations: ReservationGrant[];
|
|
16
|
-
|
|
16
|
+
terminateRunnerInstanceIds: string[];
|
|
17
17
|
}
|
|
18
|
-
export interface
|
|
18
|
+
export interface RunnerInstanceCountDivergence {
|
|
19
19
|
templateKey: string;
|
|
20
20
|
state: 'starting' | 'running';
|
|
21
21
|
direction: 'backend-higher' | 'advertised-higher';
|
|
@@ -26,8 +26,8 @@ export declare function releaseReservationGrants(reservations: ReservationGrant[
|
|
|
26
26
|
export declare function shouldReturn(result: PollDemandResult, maxReservations: number, totalCapacity: number, deadlinePassed: boolean): boolean;
|
|
27
27
|
export declare function nextBackoffInterval(ms: number): number;
|
|
28
28
|
export declare function withJitter(ms: number): number;
|
|
29
|
-
export declare function
|
|
29
|
+
export declare function calculateRunnerInstanceCountDivergences(params: {
|
|
30
30
|
advertisedTemplates: ReservationTemplate[];
|
|
31
|
-
backendCounts:
|
|
32
|
-
}):
|
|
31
|
+
backendCounts: ActiveRunnerInstanceTemplateCount[];
|
|
32
|
+
}): RunnerInstanceCountDivergence[];
|
|
33
33
|
//# sourceMappingURL=demand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demand.d.ts","sourceRoot":"","sources":["../../src/core/demand.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,
|
|
1
|
+
{"version":3,"file":"demand.d.ts","sourceRoot":"","sources":["../../src/core/demand.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,UAAU,EAGf,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,iCAAiC,EAIvC,MAAM,yBAAyB,CAAC;AAMjC,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,0BAA0B,EAAE,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,gBAAgB,GAAG,mBAAmB,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+EpF;AAED,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9F;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,OAAO,GACtB,OAAO,CAQT;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,uCAAuC,CAAC,MAAM,EAAE;IAC9D,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;IAC3C,aAAa,EAAE,iCAAiC,EAAE,CAAC;CACpD,GAAG,6BAA6B,EAAE,CA4BlC"}
|
package/dist/core/demand.js
CHANGED
|
@@ -2,9 +2,9 @@ import { setTimeout as sleep } from 'node:timers/promises';
|
|
|
2
2
|
import { logger } from '@shipfox/node-opentelemetry';
|
|
3
3
|
import { config } from '#config.js';
|
|
4
4
|
import { db } from '#db/db.js';
|
|
5
|
-
import { listActiveProvisionedRunnerCountsByTemplateTx, listProvisionerTerminateIntentRowsTx } from '#db/provisioned-runners.js';
|
|
6
5
|
import { deleteReservationsByIds, pollDemandAndReserveTx } from '#db/reservations.js';
|
|
7
|
-
import {
|
|
6
|
+
import { listActiveRunnerInstanceCountsByTemplateTx, listProvisionerTerminateIntentRowsTx } from '#db/runner-instances.js';
|
|
7
|
+
import { providerRunnerCountDivergenceCount, providerRunnerTerminateIntentIssuedCount } from '#metrics/instance.js';
|
|
8
8
|
export async function pollDemand(params) {
|
|
9
9
|
const waitSeconds = Math.min(params.waitSeconds ?? config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS, config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS);
|
|
10
10
|
const deadlineMs = Date.now() + Math.max(0, waitSeconds) * 1000;
|
|
@@ -14,7 +14,7 @@ export async function pollDemand(params) {
|
|
|
14
14
|
result: {
|
|
15
15
|
stats: [],
|
|
16
16
|
reservations: [],
|
|
17
|
-
|
|
17
|
+
terminateRunnerInstanceIds: []
|
|
18
18
|
},
|
|
19
19
|
divergences: [],
|
|
20
20
|
terminateIntents: []
|
|
@@ -38,7 +38,7 @@ export async function pollDemand(params) {
|
|
|
38
38
|
});
|
|
39
39
|
const result = {
|
|
40
40
|
...demand,
|
|
41
|
-
|
|
41
|
+
terminateRunnerInstanceIds: terminateIntents.map((intent)=>intent.providerRunnerId)
|
|
42
42
|
};
|
|
43
43
|
if (!shouldReturn(result, params.maxReservations, totalCapacity, deadlinePassed)) {
|
|
44
44
|
return {
|
|
@@ -50,9 +50,9 @@ export async function pollDemand(params) {
|
|
|
50
50
|
return {
|
|
51
51
|
result,
|
|
52
52
|
terminateIntents,
|
|
53
|
-
divergences:
|
|
53
|
+
divergences: calculateRunnerInstanceCountDivergences({
|
|
54
54
|
advertisedTemplates: params.templates,
|
|
55
|
-
backendCounts: await
|
|
55
|
+
backendCounts: await listActiveRunnerInstanceCountsByTemplateTx(tx, {
|
|
56
56
|
workspaceId: params.workspaceId,
|
|
57
57
|
provisionerId: params.provisionerId
|
|
58
58
|
})
|
|
@@ -84,7 +84,7 @@ export async function releaseReservationGrants(reservations) {
|
|
|
84
84
|
await deleteReservationsByIds(reservations.map((reservation)=>reservation.reservationId));
|
|
85
85
|
}
|
|
86
86
|
export function shouldReturn(result, maxReservations, totalCapacity, deadlinePassed) {
|
|
87
|
-
return maxReservations === 0 || totalCapacity === 0 || result.reservations.length > 0 || result.
|
|
87
|
+
return maxReservations === 0 || totalCapacity === 0 || result.reservations.length > 0 || result.terminateRunnerInstanceIds.length > 0 || deadlinePassed;
|
|
88
88
|
}
|
|
89
89
|
export function nextBackoffInterval(ms) {
|
|
90
90
|
return Math.min(ms * 1.5, config.RESERVATION_POLL_MAX_INTERVAL_MS);
|
|
@@ -92,7 +92,7 @@ export function nextBackoffInterval(ms) {
|
|
|
92
92
|
export function withJitter(ms) {
|
|
93
93
|
return Math.random() * ms;
|
|
94
94
|
}
|
|
95
|
-
export function
|
|
95
|
+
export function calculateRunnerInstanceCountDivergences(params) {
|
|
96
96
|
const advertisedCounts = new Map();
|
|
97
97
|
const backendCounts = new Map();
|
|
98
98
|
for (const template of params.advertisedTemplates){
|
|
@@ -140,10 +140,10 @@ function recordPollDemandMetrics(params, snapshot) {
|
|
|
140
140
|
template_key: divergence.templateKey
|
|
141
141
|
} : {}
|
|
142
142
|
};
|
|
143
|
-
|
|
143
|
+
providerRunnerCountDivergenceCount.add(divergence.delta, attributes);
|
|
144
144
|
}
|
|
145
145
|
for (const intent of snapshot.terminateIntents){
|
|
146
|
-
|
|
146
|
+
providerRunnerTerminateIntentIssuedCount.add(1, {
|
|
147
147
|
surface: 'poll-demand',
|
|
148
148
|
reason: intent.reason
|
|
149
149
|
});
|
package/dist/core/demand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/demand.ts"],"sourcesContent":["import {setTimeout as sleep} from 'node:timers/promises';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {config} from '#config.js';\nimport {db} from '#db/db.js';\nimport {\n type ActiveProvisionedRunnerTemplateCount,\n listActiveProvisionedRunnerCountsByTemplateTx,\n listProvisionerTerminateIntentRowsTx,\n type ProvisionedRunnerTerminateIntent,\n} from '#db/provisioned-runners.js';\nimport {\n type DemandStat,\n deleteReservationsByIds,\n pollDemandAndReserveTx,\n type ReservationGrant,\n type ReservationTemplate,\n} from '#db/reservations.js';\nimport {\n provisionedRunnerCountDivergenceCount,\n provisionedRunnerTerminateIntentIssuedCount,\n} from '#metrics/instance.js';\n\nexport interface PollDemandParams {\n workspaceId: string;\n provisionerId: string;\n maxReservations: number;\n waitSeconds?: number | undefined;\n ttlSeconds: number;\n terminateIntentLimit: number;\n templates: ReservationTemplate[];\n signal: AbortSignal;\n}\n\nexport interface PollDemandResult {\n stats: DemandStat[];\n reservations: ReservationGrant[];\n terminateProvisionedRunnerIds: string[];\n}\n\nexport interface ProvisionedRunnerCountDivergence {\n templateKey: string;\n state: 'starting' | 'running';\n direction: 'backend-higher' | 'advertised-higher';\n delta: number;\n}\n\ninterface PollDemandSnapshot {\n result: PollDemandResult;\n divergences: ProvisionedRunnerCountDivergence[];\n terminateIntents: ProvisionedRunnerTerminateIntent[];\n}\n\nexport async function pollDemand(params: PollDemandParams): Promise<PollDemandResult> {\n const waitSeconds = Math.min(\n params.waitSeconds ?? config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS,\n config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS,\n );\n const deadlineMs = Date.now() + Math.max(0, waitSeconds) * 1000;\n const totalCapacity = params.templates.reduce(\n (total, template) => total + template.availableSlots,\n 0,\n );\n let interval = config.RESERVATION_POLL_INTERVAL_MS;\n let lastSnapshot: PollDemandSnapshot = {\n result: {stats: [], reservations: [], terminateProvisionedRunnerIds: []},\n divergences: [],\n terminateIntents: [],\n };\n\n while (true) {\n if (params.signal.aborted) return lastSnapshot.result;\n\n const previousSnapshot = lastSnapshot;\n const deadlinePassed = Date.now() >= deadlineMs;\n const snapshot = await db().transaction(async (tx) => {\n const demand = await pollDemandAndReserveTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n maxReservations: params.maxReservations,\n ttlSeconds: params.ttlSeconds,\n templates: params.templates,\n });\n const terminateIntents = await listProvisionerTerminateIntentRowsTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n limit: params.terminateIntentLimit,\n });\n const result: PollDemandResult = {\n ...demand,\n terminateProvisionedRunnerIds: terminateIntents.map((intent) => intent.provisionedRunnerId),\n };\n\n if (!shouldReturn(result, params.maxReservations, totalCapacity, deadlinePassed)) {\n return {result, terminateIntents, divergences: []};\n }\n\n return {\n result,\n terminateIntents,\n divergences: calculateProvisionedRunnerCountDivergences({\n advertisedTemplates: params.templates,\n backendCounts: await listActiveProvisionedRunnerCountsByTemplateTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n }),\n }),\n };\n });\n if (params.signal.aborted) {\n await releaseReservationGrants(snapshot.result.reservations);\n return previousSnapshot.result;\n }\n\n lastSnapshot = snapshot;\n\n if (shouldReturn(lastSnapshot.result, params.maxReservations, totalCapacity, deadlinePassed)) {\n recordPollDemandMetrics(params, lastSnapshot);\n return lastSnapshot.result;\n }\n\n const remainingWaitMs = Math.max(0, deadlineMs - Date.now());\n try {\n await sleep(Math.min(withJitter(interval), remainingWaitMs), undefined, {\n signal: params.signal,\n });\n } catch (error) {\n if (params.signal.aborted) return lastSnapshot.result;\n throw error;\n }\n interval = nextBackoffInterval(interval);\n }\n}\n\nexport async function releaseReservationGrants(reservations: ReservationGrant[]): Promise<void> {\n await deleteReservationsByIds(reservations.map((reservation) => reservation.reservationId));\n}\n\nexport function shouldReturn(\n result: PollDemandResult,\n maxReservations: number,\n totalCapacity: number,\n deadlinePassed: boolean,\n): boolean {\n return (\n maxReservations === 0 ||\n totalCapacity === 0 ||\n result.reservations.length > 0 ||\n result.terminateProvisionedRunnerIds.length > 0 ||\n deadlinePassed\n );\n}\n\nexport function nextBackoffInterval(ms: number): number {\n return Math.min(ms * 1.5, config.RESERVATION_POLL_MAX_INTERVAL_MS);\n}\n\nexport function withJitter(ms: number): number {\n return Math.random() * ms;\n}\n\nexport function calculateProvisionedRunnerCountDivergences(params: {\n advertisedTemplates: ReservationTemplate[];\n backendCounts: ActiveProvisionedRunnerTemplateCount[];\n}): ProvisionedRunnerCountDivergence[] {\n const advertisedCounts = new Map<string, number>();\n const backendCounts = new Map<string, number>();\n\n for (const template of params.advertisedTemplates) {\n addCount(advertisedCounts, countKey(template.templateKey, 'starting'), template.starting);\n addCount(advertisedCounts, countKey(template.templateKey, 'running'), template.running);\n }\n for (const count of params.backendCounts) {\n addCount(backendCounts, countKey(count.templateKey, count.state), count.count);\n }\n\n const keys = [...new Set([...advertisedCounts.keys(), ...backendCounts.keys()])].sort();\n return keys.flatMap((key) => {\n const advertised = advertisedCounts.get(key) ?? 0;\n const backend = backendCounts.get(key) ?? 0;\n if (advertised === backend) return [];\n\n const [templateKey, state] = splitCountKey(key);\n return [\n {\n templateKey,\n state,\n direction: backend > advertised ? 'backend-higher' : 'advertised-higher',\n delta: Math.abs(backend - advertised),\n },\n ];\n });\n}\n\nfunction recordPollDemandMetrics(params: PollDemandParams, snapshot: PollDemandSnapshot): void {\n for (const divergence of snapshot.divergences) {\n logger().debug(\n {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n templateKey: divergence.templateKey,\n state: divergence.state,\n direction: divergence.direction,\n delta: divergence.delta,\n },\n 'provisioned runner count divergence observed',\n );\n\n const attributes = {\n state: divergence.state,\n direction: divergence.direction,\n ...(config.PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED\n ? {template_key: divergence.templateKey}\n : {}),\n };\n provisionedRunnerCountDivergenceCount.add(divergence.delta, attributes);\n }\n for (const intent of snapshot.terminateIntents) {\n provisionedRunnerTerminateIntentIssuedCount.add(1, {\n surface: 'poll-demand',\n reason: intent.reason,\n });\n }\n}\n\nfunction addCount(counts: Map<string, number>, key: string, count: number): void {\n counts.set(key, (counts.get(key) ?? 0) + count);\n}\n\nfunction countKey(templateKey: string, state: 'starting' | 'running'): string {\n return `${templateKey}\\0${state}`;\n}\n\nfunction splitCountKey(key: string): [string, 'starting' | 'running'] {\n const [templateKey, state] = key.split('\\0');\n if (!templateKey || (state !== 'starting' && state !== 'running')) {\n throw new Error(`Invalid provisioned runner count key: ${key}`);\n }\n return [templateKey, state];\n}\n"],"names":["setTimeout","sleep","logger","config","db","listActiveProvisionedRunnerCountsByTemplateTx","listProvisionerTerminateIntentRowsTx","deleteReservationsByIds","pollDemandAndReserveTx","provisionedRunnerCountDivergenceCount","provisionedRunnerTerminateIntentIssuedCount","pollDemand","params","waitSeconds","Math","min","RESERVATION_LONG_POLL_MAX_WAIT_SECONDS","deadlineMs","Date","now","max","totalCapacity","templates","reduce","total","template","availableSlots","interval","RESERVATION_POLL_INTERVAL_MS","lastSnapshot","result","stats","reservations","terminateProvisionedRunnerIds","divergences","terminateIntents","signal","aborted","previousSnapshot","deadlinePassed","snapshot","transaction","tx","demand","workspaceId","provisionerId","maxReservations","ttlSeconds","limit","terminateIntentLimit","map","intent","provisionedRunnerId","shouldReturn","calculateProvisionedRunnerCountDivergences","advertisedTemplates","backendCounts","releaseReservationGrants","recordPollDemandMetrics","remainingWaitMs","withJitter","undefined","error","nextBackoffInterval","reservation","reservationId","length","ms","RESERVATION_POLL_MAX_INTERVAL_MS","random","advertisedCounts","Map","addCount","countKey","templateKey","starting","running","count","state","keys","Set","sort","flatMap","key","advertised","get","backend","splitCountKey","direction","delta","abs","divergence","debug","attributes","PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED","template_key","add","surface","reason","counts","set","split","Error"],"mappings":"AAAA,SAAQA,cAAcC,KAAK,QAAO,uBAAuB;AACzD,SAAQC,MAAM,QAAO,8BAA8B;AACnD,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,EAAE,QAAO,YAAY;AAC7B,SAEEC,6CAA6C,EAC7CC,oCAAoC,QAE/B,6BAA6B;AACpC,SAEEC,uBAAuB,EACvBC,sBAAsB,QAGjB,sBAAsB;AAC7B,SACEC,qCAAqC,EACrCC,2CAA2C,QACtC,uBAAuB;AAgC9B,OAAO,eAAeC,WAAWC,MAAwB;IACvD,MAAMC,cAAcC,KAAKC,GAAG,CAC1BH,OAAOC,WAAW,IAAIV,OAAOa,sCAAsC,EACnEb,OAAOa,sCAAsC;IAE/C,MAAMC,aAAaC,KAAKC,GAAG,KAAKL,KAAKM,GAAG,CAAC,GAAGP,eAAe;IAC3D,MAAMQ,gBAAgBT,OAAOU,SAAS,CAACC,MAAM,CAC3C,CAACC,OAAOC,WAAaD,QAAQC,SAASC,cAAc,EACpD;IAEF,IAAIC,WAAWxB,OAAOyB,4BAA4B;IAClD,IAAIC,eAAmC;QACrCC,QAAQ;YAACC,OAAO,EAAE;YAAEC,cAAc,EAAE;YAAEC,+BAA+B,EAAE;QAAA;QACvEC,aAAa,EAAE;QACfC,kBAAkB,EAAE;IACtB;IAEA,MAAO,KAAM;QACX,IAAIvB,OAAOwB,MAAM,CAACC,OAAO,EAAE,OAAOR,aAAaC,MAAM;QAErD,MAAMQ,mBAAmBT;QACzB,MAAMU,iBAAiBrB,KAAKC,GAAG,MAAMF;QACrC,MAAMuB,WAAW,MAAMpC,KAAKqC,WAAW,CAAC,OAAOC;YAC7C,MAAMC,SAAS,MAAMnC,uBAAuBkC,IAAI;gBAC9CE,aAAahC,OAAOgC,WAAW;gBAC/BC,eAAejC,OAAOiC,aAAa;gBACnCC,iBAAiBlC,OAAOkC,eAAe;gBACvCC,YAAYnC,OAAOmC,UAAU;gBAC7BzB,WAAWV,OAAOU,SAAS;YAC7B;YACA,MAAMa,mBAAmB,MAAM7B,qCAAqCoC,IAAI;gBACtEE,aAAahC,OAAOgC,WAAW;gBAC/BC,eAAejC,OAAOiC,aAAa;gBACnCG,OAAOpC,OAAOqC,oBAAoB;YACpC;YACA,MAAMnB,SAA2B;gBAC/B,GAAGa,MAAM;gBACTV,+BAA+BE,iBAAiBe,GAAG,CAAC,CAACC,SAAWA,OAAOC,mBAAmB;YAC5F;YAEA,IAAI,CAACC,aAAavB,QAAQlB,OAAOkC,eAAe,EAAEzB,eAAekB,iBAAiB;gBAChF,OAAO;oBAACT;oBAAQK;oBAAkBD,aAAa,EAAE;gBAAA;YACnD;YAEA,OAAO;gBACLJ;gBACAK;gBACAD,aAAaoB,2CAA2C;oBACtDC,qBAAqB3C,OAAOU,SAAS;oBACrCkC,eAAe,MAAMnD,8CAA8CqC,IAAI;wBACrEE,aAAahC,OAAOgC,WAAW;wBAC/BC,eAAejC,OAAOiC,aAAa;oBACrC;gBACF;YACF;QACF;QACA,IAAIjC,OAAOwB,MAAM,CAACC,OAAO,EAAE;YACzB,MAAMoB,yBAAyBjB,SAASV,MAAM,CAACE,YAAY;YAC3D,OAAOM,iBAAiBR,MAAM;QAChC;QAEAD,eAAeW;QAEf,IAAIa,aAAaxB,aAAaC,MAAM,EAAElB,OAAOkC,eAAe,EAAEzB,eAAekB,iBAAiB;YAC5FmB,wBAAwB9C,QAAQiB;YAChC,OAAOA,aAAaC,MAAM;QAC5B;QAEA,MAAM6B,kBAAkB7C,KAAKM,GAAG,CAAC,GAAGH,aAAaC,KAAKC,GAAG;QACzD,IAAI;YACF,MAAMlB,MAAMa,KAAKC,GAAG,CAAC6C,WAAWjC,WAAWgC,kBAAkBE,WAAW;gBACtEzB,QAAQxB,OAAOwB,MAAM;YACvB;QACF,EAAE,OAAO0B,OAAO;YACd,IAAIlD,OAAOwB,MAAM,CAACC,OAAO,EAAE,OAAOR,aAAaC,MAAM;YACrD,MAAMgC;QACR;QACAnC,WAAWoC,oBAAoBpC;IACjC;AACF;AAEA,OAAO,eAAe8B,yBAAyBzB,YAAgC;IAC7E,MAAMzB,wBAAwByB,aAAakB,GAAG,CAAC,CAACc,cAAgBA,YAAYC,aAAa;AAC3F;AAEA,OAAO,SAASZ,aACdvB,MAAwB,EACxBgB,eAAuB,EACvBzB,aAAqB,EACrBkB,cAAuB;IAEvB,OACEO,oBAAoB,KACpBzB,kBAAkB,KAClBS,OAAOE,YAAY,CAACkC,MAAM,GAAG,KAC7BpC,OAAOG,6BAA6B,CAACiC,MAAM,GAAG,KAC9C3B;AAEJ;AAEA,OAAO,SAASwB,oBAAoBI,EAAU;IAC5C,OAAOrD,KAAKC,GAAG,CAACoD,KAAK,KAAKhE,OAAOiE,gCAAgC;AACnE;AAEA,OAAO,SAASR,WAAWO,EAAU;IACnC,OAAOrD,KAAKuD,MAAM,KAAKF;AACzB;AAEA,OAAO,SAASb,2CAA2C1C,MAG1D;IACC,MAAM0D,mBAAmB,IAAIC;IAC7B,MAAMf,gBAAgB,IAAIe;IAE1B,KAAK,MAAM9C,YAAYb,OAAO2C,mBAAmB,CAAE;QACjDiB,SAASF,kBAAkBG,SAAShD,SAASiD,WAAW,EAAE,aAAajD,SAASkD,QAAQ;QACxFH,SAASF,kBAAkBG,SAAShD,SAASiD,WAAW,EAAE,YAAYjD,SAASmD,OAAO;IACxF;IACA,KAAK,MAAMC,SAASjE,OAAO4C,aAAa,CAAE;QACxCgB,SAAShB,eAAeiB,SAASI,MAAMH,WAAW,EAAEG,MAAMC,KAAK,GAAGD,MAAMA,KAAK;IAC/E;IAEA,MAAME,OAAO;WAAI,IAAIC,IAAI;eAAIV,iBAAiBS,IAAI;eAAOvB,cAAcuB,IAAI;SAAG;KAAE,CAACE,IAAI;IACrF,OAAOF,KAAKG,OAAO,CAAC,CAACC;QACnB,MAAMC,aAAad,iBAAiBe,GAAG,CAACF,QAAQ;QAChD,MAAMG,UAAU9B,cAAc6B,GAAG,CAACF,QAAQ;QAC1C,IAAIC,eAAeE,SAAS,OAAO,EAAE;QAErC,MAAM,CAACZ,aAAaI,MAAM,GAAGS,cAAcJ;QAC3C,OAAO;YACL;gBACET;gBACAI;gBACAU,WAAWF,UAAUF,aAAa,mBAAmB;gBACrDK,OAAO3E,KAAK4E,GAAG,CAACJ,UAAUF;YAC5B;SACD;IACH;AACF;AAEA,SAAS1B,wBAAwB9C,MAAwB,EAAE4B,QAA4B;IACrF,KAAK,MAAMmD,cAAcnD,SAASN,WAAW,CAAE;QAC7ChC,SAAS0F,KAAK,CACZ;YACEhD,aAAahC,OAAOgC,WAAW;YAC/BC,eAAejC,OAAOiC,aAAa;YACnC6B,aAAaiB,WAAWjB,WAAW;YACnCI,OAAOa,WAAWb,KAAK;YACvBU,WAAWG,WAAWH,SAAS;YAC/BC,OAAOE,WAAWF,KAAK;QACzB,GACA;QAGF,MAAMI,aAAa;YACjBf,OAAOa,WAAWb,KAAK;YACvBU,WAAWG,WAAWH,SAAS;YAC/B,GAAIrF,OAAO2F,8DAA8D,GACrE;gBAACC,cAAcJ,WAAWjB,WAAW;YAAA,IACrC,CAAC,CAAC;QACR;QACAjE,sCAAsCuF,GAAG,CAACL,WAAWF,KAAK,EAAEI;IAC9D;IACA,KAAK,MAAM1C,UAAUX,SAASL,gBAAgB,CAAE;QAC9CzB,4CAA4CsF,GAAG,CAAC,GAAG;YACjDC,SAAS;YACTC,QAAQ/C,OAAO+C,MAAM;QACvB;IACF;AACF;AAEA,SAAS1B,SAAS2B,MAA2B,EAAEhB,GAAW,EAAEN,KAAa;IACvEsB,OAAOC,GAAG,CAACjB,KAAK,AAACgB,CAAAA,OAAOd,GAAG,CAACF,QAAQ,CAAA,IAAKN;AAC3C;AAEA,SAASJ,SAASC,WAAmB,EAAEI,KAA6B;IAClE,OAAO,GAAGJ,YAAY,EAAE,EAAEI,OAAO;AACnC;AAEA,SAASS,cAAcJ,GAAW;IAChC,MAAM,CAACT,aAAaI,MAAM,GAAGK,IAAIkB,KAAK,CAAC;IACvC,IAAI,CAAC3B,eAAgBI,UAAU,cAAcA,UAAU,WAAY;QACjE,MAAM,IAAIwB,MAAM,CAAC,sCAAsC,EAAEnB,KAAK;IAChE;IACA,OAAO;QAACT;QAAaI;KAAM;AAC7B"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/demand.ts"],"sourcesContent":["import {setTimeout as sleep} from 'node:timers/promises';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {config} from '#config.js';\nimport {db} from '#db/db.js';\nimport {\n type DemandStat,\n deleteReservationsByIds,\n pollDemandAndReserveTx,\n type ReservationGrant,\n type ReservationTemplate,\n} from '#db/reservations.js';\nimport {\n type ActiveRunnerInstanceTemplateCount,\n listActiveRunnerInstanceCountsByTemplateTx,\n listProvisionerTerminateIntentRowsTx,\n type RunnerInstanceTerminateIntent,\n} from '#db/runner-instances.js';\nimport {\n providerRunnerCountDivergenceCount,\n providerRunnerTerminateIntentIssuedCount,\n} from '#metrics/instance.js';\n\nexport interface PollDemandParams {\n workspaceId: string;\n provisionerId: string;\n maxReservations: number;\n waitSeconds?: number | undefined;\n ttlSeconds: number;\n terminateIntentLimit: number;\n templates: ReservationTemplate[];\n signal: AbortSignal;\n}\n\nexport interface PollDemandResult {\n stats: DemandStat[];\n reservations: ReservationGrant[];\n terminateRunnerInstanceIds: string[];\n}\n\nexport interface RunnerInstanceCountDivergence {\n templateKey: string;\n state: 'starting' | 'running';\n direction: 'backend-higher' | 'advertised-higher';\n delta: number;\n}\n\ninterface PollDemandSnapshot {\n result: PollDemandResult;\n divergences: RunnerInstanceCountDivergence[];\n terminateIntents: RunnerInstanceTerminateIntent[];\n}\n\nexport async function pollDemand(params: PollDemandParams): Promise<PollDemandResult> {\n const waitSeconds = Math.min(\n params.waitSeconds ?? config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS,\n config.RESERVATION_LONG_POLL_MAX_WAIT_SECONDS,\n );\n const deadlineMs = Date.now() + Math.max(0, waitSeconds) * 1000;\n const totalCapacity = params.templates.reduce(\n (total, template) => total + template.availableSlots,\n 0,\n );\n let interval = config.RESERVATION_POLL_INTERVAL_MS;\n let lastSnapshot: PollDemandSnapshot = {\n result: {stats: [], reservations: [], terminateRunnerInstanceIds: []},\n divergences: [],\n terminateIntents: [],\n };\n\n while (true) {\n if (params.signal.aborted) return lastSnapshot.result;\n\n const previousSnapshot = lastSnapshot;\n const deadlinePassed = Date.now() >= deadlineMs;\n const snapshot = await db().transaction(async (tx) => {\n const demand = await pollDemandAndReserveTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n maxReservations: params.maxReservations,\n ttlSeconds: params.ttlSeconds,\n templates: params.templates,\n });\n const terminateIntents = await listProvisionerTerminateIntentRowsTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n limit: params.terminateIntentLimit,\n });\n const result: PollDemandResult = {\n ...demand,\n terminateRunnerInstanceIds: terminateIntents.map((intent) => intent.providerRunnerId),\n };\n\n if (!shouldReturn(result, params.maxReservations, totalCapacity, deadlinePassed)) {\n return {result, terminateIntents, divergences: []};\n }\n\n return {\n result,\n terminateIntents,\n divergences: calculateRunnerInstanceCountDivergences({\n advertisedTemplates: params.templates,\n backendCounts: await listActiveRunnerInstanceCountsByTemplateTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n }),\n }),\n };\n });\n if (params.signal.aborted) {\n await releaseReservationGrants(snapshot.result.reservations);\n return previousSnapshot.result;\n }\n\n lastSnapshot = snapshot;\n\n if (shouldReturn(lastSnapshot.result, params.maxReservations, totalCapacity, deadlinePassed)) {\n recordPollDemandMetrics(params, lastSnapshot);\n return lastSnapshot.result;\n }\n\n const remainingWaitMs = Math.max(0, deadlineMs - Date.now());\n try {\n await sleep(Math.min(withJitter(interval), remainingWaitMs), undefined, {\n signal: params.signal,\n });\n } catch (error) {\n if (params.signal.aborted) return lastSnapshot.result;\n throw error;\n }\n interval = nextBackoffInterval(interval);\n }\n}\n\nexport async function releaseReservationGrants(reservations: ReservationGrant[]): Promise<void> {\n await deleteReservationsByIds(reservations.map((reservation) => reservation.reservationId));\n}\n\nexport function shouldReturn(\n result: PollDemandResult,\n maxReservations: number,\n totalCapacity: number,\n deadlinePassed: boolean,\n): boolean {\n return (\n maxReservations === 0 ||\n totalCapacity === 0 ||\n result.reservations.length > 0 ||\n result.terminateRunnerInstanceIds.length > 0 ||\n deadlinePassed\n );\n}\n\nexport function nextBackoffInterval(ms: number): number {\n return Math.min(ms * 1.5, config.RESERVATION_POLL_MAX_INTERVAL_MS);\n}\n\nexport function withJitter(ms: number): number {\n return Math.random() * ms;\n}\n\nexport function calculateRunnerInstanceCountDivergences(params: {\n advertisedTemplates: ReservationTemplate[];\n backendCounts: ActiveRunnerInstanceTemplateCount[];\n}): RunnerInstanceCountDivergence[] {\n const advertisedCounts = new Map<string, number>();\n const backendCounts = new Map<string, number>();\n\n for (const template of params.advertisedTemplates) {\n addCount(advertisedCounts, countKey(template.templateKey, 'starting'), template.starting);\n addCount(advertisedCounts, countKey(template.templateKey, 'running'), template.running);\n }\n for (const count of params.backendCounts) {\n addCount(backendCounts, countKey(count.templateKey, count.state), count.count);\n }\n\n const keys = [...new Set([...advertisedCounts.keys(), ...backendCounts.keys()])].sort();\n return keys.flatMap((key) => {\n const advertised = advertisedCounts.get(key) ?? 0;\n const backend = backendCounts.get(key) ?? 0;\n if (advertised === backend) return [];\n\n const [templateKey, state] = splitCountKey(key);\n return [\n {\n templateKey,\n state,\n direction: backend > advertised ? 'backend-higher' : 'advertised-higher',\n delta: Math.abs(backend - advertised),\n },\n ];\n });\n}\n\nfunction recordPollDemandMetrics(params: PollDemandParams, snapshot: PollDemandSnapshot): void {\n for (const divergence of snapshot.divergences) {\n logger().debug(\n {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n templateKey: divergence.templateKey,\n state: divergence.state,\n direction: divergence.direction,\n delta: divergence.delta,\n },\n 'provisioned runner count divergence observed',\n );\n\n const attributes = {\n state: divergence.state,\n direction: divergence.direction,\n ...(config.PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED\n ? {template_key: divergence.templateKey}\n : {}),\n };\n providerRunnerCountDivergenceCount.add(divergence.delta, attributes);\n }\n for (const intent of snapshot.terminateIntents) {\n providerRunnerTerminateIntentIssuedCount.add(1, {\n surface: 'poll-demand',\n reason: intent.reason,\n });\n }\n}\n\nfunction addCount(counts: Map<string, number>, key: string, count: number): void {\n counts.set(key, (counts.get(key) ?? 0) + count);\n}\n\nfunction countKey(templateKey: string, state: 'starting' | 'running'): string {\n return `${templateKey}\\0${state}`;\n}\n\nfunction splitCountKey(key: string): [string, 'starting' | 'running'] {\n const [templateKey, state] = key.split('\\0');\n if (!templateKey || (state !== 'starting' && state !== 'running')) {\n throw new Error(`Invalid provisioned runner count key: ${key}`);\n }\n return [templateKey, state];\n}\n"],"names":["setTimeout","sleep","logger","config","db","deleteReservationsByIds","pollDemandAndReserveTx","listActiveRunnerInstanceCountsByTemplateTx","listProvisionerTerminateIntentRowsTx","providerRunnerCountDivergenceCount","providerRunnerTerminateIntentIssuedCount","pollDemand","params","waitSeconds","Math","min","RESERVATION_LONG_POLL_MAX_WAIT_SECONDS","deadlineMs","Date","now","max","totalCapacity","templates","reduce","total","template","availableSlots","interval","RESERVATION_POLL_INTERVAL_MS","lastSnapshot","result","stats","reservations","terminateRunnerInstanceIds","divergences","terminateIntents","signal","aborted","previousSnapshot","deadlinePassed","snapshot","transaction","tx","demand","workspaceId","provisionerId","maxReservations","ttlSeconds","limit","terminateIntentLimit","map","intent","providerRunnerId","shouldReturn","calculateRunnerInstanceCountDivergences","advertisedTemplates","backendCounts","releaseReservationGrants","recordPollDemandMetrics","remainingWaitMs","withJitter","undefined","error","nextBackoffInterval","reservation","reservationId","length","ms","RESERVATION_POLL_MAX_INTERVAL_MS","random","advertisedCounts","Map","addCount","countKey","templateKey","starting","running","count","state","keys","Set","sort","flatMap","key","advertised","get","backend","splitCountKey","direction","delta","abs","divergence","debug","attributes","PROVISIONED_RUNNER_COUNT_DIVERGENCE_TEMPLATE_KEY_LABEL_ENABLED","template_key","add","surface","reason","counts","set","split","Error"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacity-assignment.d.ts","sourceRoot":"","sources":["../../../src/core/entities/capacity-assignment.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/entities/capacity-assignment.ts"],"sourcesContent":["export interface CapacityAssignment {\n id: string;\n capacityId: string;\n reservationId: string;\n workspaceId: string;\n provisionerId: string;\n createdAt: Date;\n}\n"],"names":[],"mappings":"AAAA,WAOC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ephemeral-registration-token.d.ts","sourceRoot":"","sources":["../../../src/core/entities/ephemeral-registration-token.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,
|
|
1
|
+
{"version":3,"file":"ephemeral-registration-token.d.ts","sourceRoot":"","sources":["../../../src/core/entities/ephemeral-registration-token.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,IAAI,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/entities/ephemeral-registration-token.ts"],"sourcesContent":["export interface EphemeralRegistrationToken {\n id: string;\n workspaceId: string;\n provisionerId: string;\n reservationId: string | null;\n
|
|
1
|
+
{"version":3,"sources":["../../../src/core/entities/ephemeral-registration-token.ts"],"sourcesContent":["export interface EphemeralRegistrationToken {\n id: string;\n workspaceId: string;\n provisionerId: string;\n reservationId: string | null;\n providerRunnerId: string;\n hashedToken: string;\n prefix: string;\n expiresAt: Date;\n consumedAt: Date | null;\n consumedSessionId: string | null;\n createdAt: Date;\n}\n"],"names":[],"mappings":"AAAA,WAYC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ProvisionerCapabilitySnapshot {
|
|
2
|
+
id: string;
|
|
3
|
+
workspaceId: string;
|
|
4
|
+
provisionerId: string;
|
|
5
|
+
templateKey: string;
|
|
6
|
+
labels: string[];
|
|
7
|
+
availableSlots: number;
|
|
8
|
+
starting: number;
|
|
9
|
+
running: number;
|
|
10
|
+
advertisedAt: Date;
|
|
11
|
+
createdAt: Date;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=provisioner-capability-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner-capability-snapshot.d.ts","sourceRoot":"","sources":["../../../src/core/entities/provisioner-capability-snapshot.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,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;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB"}
|