@shipfox/api-runners 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +187 -0
- package/LICENSE +21 -0
- package/dist/config.d.ts +30 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +208 -0
- package/dist/config.js.map +1 -0
- package/dist/core/demand.d.ts +33 -0
- package/dist/core/demand.d.ts.map +1 -0
- package/dist/core/demand.js +169 -0
- package/dist/core/demand.js.map +1 -0
- package/dist/core/entities/ephemeral-registration-token.d.ts +14 -0
- package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -0
- package/dist/core/entities/ephemeral-registration-token.js +3 -0
- package/dist/core/entities/ephemeral-registration-token.js.map +1 -0
- package/dist/core/entities/manual-registration-token.d.ts +12 -0
- package/dist/core/entities/manual-registration-token.d.ts.map +1 -0
- package/dist/core/entities/manual-registration-token.js +3 -0
- package/dist/core/entities/manual-registration-token.js.map +1 -0
- package/dist/core/entities/provisioned-runner.d.ts +24 -0
- package/dist/core/entities/provisioned-runner.d.ts.map +1 -0
- package/dist/core/entities/provisioned-runner.js +3 -0
- package/dist/core/entities/provisioned-runner.js.map +1 -0
- package/dist/core/entities/provisioner-token.d.ts +18 -0
- package/dist/core/entities/provisioner-token.d.ts.map +1 -0
- package/dist/core/entities/provisioner-token.js +3 -0
- package/dist/core/entities/provisioner-token.js.map +1 -0
- package/dist/core/entities/reservation.d.ts +10 -0
- package/dist/core/entities/reservation.d.ts.map +1 -0
- package/dist/core/entities/reservation.js +3 -0
- package/dist/core/entities/reservation.js.map +1 -0
- package/dist/core/entities/runner-session.d.ts +18 -0
- package/dist/core/entities/runner-session.d.ts.map +1 -0
- package/dist/core/entities/runner-session.js +3 -0
- package/dist/core/entities/runner-session.js.map +1 -0
- package/dist/core/ephemeral-registration-tokens.d.ts +31 -0
- package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -0
- package/dist/core/ephemeral-registration-tokens.js +61 -0
- package/dist/core/ephemeral-registration-tokens.js.map +1 -0
- package/dist/core/errors.d.ts +62 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +92 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/job-executions.d.ts +14 -0
- package/dist/core/job-executions.d.ts.map +1 -0
- package/dist/core/job-executions.js +37 -0
- package/dist/core/job-executions.js.map +1 -0
- package/dist/core/maintenance-policy.d.ts +2 -0
- package/dist/core/maintenance-policy.d.ts.map +1 -0
- package/dist/core/maintenance-policy.js +3 -0
- package/dist/core/maintenance-policy.js.map +1 -0
- package/dist/core/maintenance.d.ts +33 -0
- package/dist/core/maintenance.d.ts.map +1 -0
- package/dist/core/maintenance.js +55 -0
- package/dist/core/maintenance.js.map +1 -0
- package/dist/core/manual-registration-tokens.d.ts +17 -0
- package/dist/core/manual-registration-tokens.d.ts.map +1 -0
- package/dist/core/manual-registration-tokens.js +28 -0
- package/dist/core/manual-registration-tokens.js.map +1 -0
- package/dist/core/provisioned-runners.d.ts +67 -0
- package/dist/core/provisioned-runners.d.ts.map +1 -0
- package/dist/core/provisioned-runners.js +162 -0
- package/dist/core/provisioned-runners.js.map +1 -0
- package/dist/core/provisioner-tokens.d.ts +20 -0
- package/dist/core/provisioner-tokens.d.ts.map +1 -0
- package/dist/core/provisioner-tokens.js +36 -0
- package/dist/core/provisioner-tokens.js.map +1 -0
- package/dist/core/rate-limit.d.ts +35 -0
- package/dist/core/rate-limit.d.ts.map +1 -0
- package/dist/core/rate-limit.js +74 -0
- package/dist/core/rate-limit.js.map +1 -0
- package/dist/core/runner-sessions.d.ts +26 -0
- package/dist/core/runner-sessions.d.ts.map +1 -0
- package/dist/core/runner-sessions.js +41 -0
- package/dist/core/runner-sessions.js.map +1 -0
- package/dist/core/runner-tool-capabilities.d.ts +24 -0
- package/dist/core/runner-tool-capabilities.d.ts.map +1 -0
- package/dist/core/runner-tool-capabilities.js +43 -0
- package/dist/core/runner-tool-capabilities.js.map +1 -0
- package/dist/db/db.d.ts +4478 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +36 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/ephemeral-registration-tokens.d.ts +47 -0
- package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -0
- package/dist/db/ephemeral-registration-tokens.js +170 -0
- package/dist/db/ephemeral-registration-tokens.js.map +1 -0
- package/dist/db/index.d.ts +19 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +15 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/job-executions.d.ts +128 -0
- package/dist/db/job-executions.d.ts.map +1 -0
- package/dist/db/job-executions.js +354 -0
- package/dist/db/job-executions.js.map +1 -0
- package/dist/db/manual-registration-tokens.d.ts +16 -0
- package/dist/db/manual-registration-tokens.d.ts.map +1 -0
- package/dist/db/manual-registration-tokens.js +37 -0
- package/dist/db/manual-registration-tokens.js.map +1 -0
- package/dist/db/provisioned-runners.d.ts +79 -0
- package/dist/db/provisioned-runners.d.ts.map +1 -0
- package/dist/db/provisioned-runners.js +466 -0
- package/dist/db/provisioned-runners.js.map +1 -0
- package/dist/db/provisioner-tokens.d.ts +26 -0
- package/dist/db/provisioner-tokens.d.ts.map +1 -0
- package/dist/db/provisioner-tokens.js +54 -0
- package/dist/db/provisioner-tokens.js.map +1 -0
- package/dist/db/rate-limits.d.ts +18 -0
- package/dist/db/rate-limits.d.ts.map +1 -0
- package/dist/db/rate-limits.js +44 -0
- package/dist/db/rate-limits.js.map +1 -0
- package/dist/db/reservations.d.ts +48 -0
- package/dist/db/reservations.d.ts.map +1 -0
- package/dist/db/reservations.js +162 -0
- package/dist/db/reservations.js.map +1 -0
- package/dist/db/runner-sessions.d.ts +18 -0
- package/dist/db/runner-sessions.d.ts.map +1 -0
- package/dist/db/runner-sessions.js +38 -0
- package/dist/db/runner-sessions.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/ephemeral-registration-tokens.d.ts +199 -0
- package/dist/db/schema/ephemeral-registration-tokens.d.ts.map +1 -0
- package/dist/db/schema/ephemeral-registration-tokens.js +45 -0
- package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -0
- package/dist/db/schema/manual-registration-tokens.d.ts +165 -0
- package/dist/db/schema/manual-registration-tokens.d.ts.map +1 -0
- package/dist/db/schema/manual-registration-tokens.js +40 -0
- package/dist/db/schema/manual-registration-tokens.js.map +1 -0
- package/dist/db/schema/outbox.d.ts +195 -0
- package/dist/db/schema/outbox.d.ts.map +1 -0
- package/dist/db/schema/outbox.js +5 -0
- package/dist/db/schema/outbox.js.map +1 -0
- package/dist/db/schema/pending-job-executions.d.ts +189 -0
- package/dist/db/schema/pending-job-executions.d.ts.map +1 -0
- package/dist/db/schema/pending-job-executions.js +21 -0
- package/dist/db/schema/pending-job-executions.js.map +1 -0
- package/dist/db/schema/provisioned-runners.d.ts +379 -0
- package/dist/db/schema/provisioned-runners.d.ts.map +1 -0
- package/dist/db/schema/provisioned-runners.js +83 -0
- package/dist/db/schema/provisioned-runners.js.map +1 -0
- package/dist/db/schema/provisioner-tokens.d.ts +216 -0
- package/dist/db/schema/provisioner-tokens.d.ts.map +1 -0
- package/dist/db/schema/provisioner-tokens.js +48 -0
- package/dist/db/schema/provisioner-tokens.js.map +1 -0
- package/dist/db/schema/rate-limits.d.ts +145 -0
- package/dist/db/schema/rate-limits.d.ts.map +1 -0
- package/dist/db/schema/rate-limits.js +25 -0
- package/dist/db/schema/rate-limits.js.map +1 -0
- package/dist/db/schema/reservations.d.ts +157 -0
- package/dist/db/schema/reservations.d.ts.map +1 -0
- package/dist/db/schema/reservations.js +34 -0
- package/dist/db/schema/reservations.js.map +1 -0
- package/dist/db/schema/runner-sessions.d.ts +298 -0
- package/dist/db/schema/runner-sessions.d.ts.map +1 -0
- package/dist/db/schema/runner-sessions.js +61 -0
- package/dist/db/schema/runner-sessions.js.map +1 -0
- package/dist/db/schema/running-job-executions.d.ts +334 -0
- package/dist/db/schema/running-job-executions.d.ts.map +1 -0
- package/dist/db/schema/running-job-executions.js +41 -0
- package/dist/db/schema/running-job-executions.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +4 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +34 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +60 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/metrics/service.d.ts +2 -0
- package/dist/metrics/service.d.ts.map +1 -0
- package/dist/metrics/service.js +21 -0
- package/dist/metrics/service.js.map +1 -0
- package/dist/presentation/auth/index.d.ts +3 -0
- package/dist/presentation/auth/index.d.ts.map +1 -0
- package/dist/presentation/auth/index.js +4 -0
- package/dist/presentation/auth/index.js.map +1 -0
- package/dist/presentation/auth/provisioner-token-auth.d.ts +3 -0
- package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -0
- package/dist/presentation/auth/provisioner-token-auth.js +81 -0
- package/dist/presentation/auth/provisioner-token-auth.js.map +1 -0
- package/dist/presentation/auth/runner-registration-token-auth.d.ts +17 -0
- package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -0
- package/dist/presentation/auth/runner-registration-token-auth.js +77 -0
- package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -0
- package/dist/presentation/dto/active-provisioner.d.ts +8 -0
- package/dist/presentation/dto/active-provisioner.d.ts.map +1 -0
- package/dist/presentation/dto/active-provisioner.js +10 -0
- package/dist/presentation/dto/active-provisioner.js.map +1 -0
- package/dist/presentation/dto/index.d.ts +7 -0
- package/dist/presentation/dto/index.d.ts.map +1 -0
- package/dist/presentation/dto/index.js +8 -0
- package/dist/presentation/dto/index.js.map +1 -0
- package/dist/presentation/dto/manual-registration-token.d.ts +12 -0
- package/dist/presentation/dto/manual-registration-token.d.ts.map +1 -0
- package/dist/presentation/dto/manual-registration-token.js +14 -0
- package/dist/presentation/dto/manual-registration-token.js.map +1 -0
- package/dist/presentation/dto/mint-registration-tokens.d.ts +5 -0
- package/dist/presentation/dto/mint-registration-tokens.d.ts.map +1 -0
- package/dist/presentation/dto/mint-registration-tokens.js +19 -0
- package/dist/presentation/dto/mint-registration-tokens.js.map +1 -0
- package/dist/presentation/dto/poll-demand.d.ts +4 -0
- package/dist/presentation/dto/poll-demand.d.ts.map +1 -0
- package/dist/presentation/dto/poll-demand.js +19 -0
- package/dist/presentation/dto/poll-demand.js.map +1 -0
- package/dist/presentation/dto/provisioned-runners.d.ts +38 -0
- package/dist/presentation/dto/provisioned-runners.d.ts.map +1 -0
- package/dist/presentation/dto/provisioned-runners.js +44 -0
- package/dist/presentation/dto/provisioned-runners.js.map +1 -0
- package/dist/presentation/dto/provisioner-token.d.ts +15 -0
- package/dist/presentation/dto/provisioner-token.d.ts.map +1 -0
- package/dist/presentation/dto/provisioner-token.js +17 -0
- package/dist/presentation/dto/provisioner-token.js.map +1 -0
- package/dist/presentation/index.d.ts +4 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +5 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/routes/create-manual-registration-token.d.ts +2 -0
- package/dist/presentation/routes/create-manual-registration-token.d.ts.map +1 -0
- package/dist/presentation/routes/create-manual-registration-token.js +44 -0
- package/dist/presentation/routes/create-manual-registration-token.js.map +1 -0
- package/dist/presentation/routes/create-provisioner-token.d.ts +2 -0
- package/dist/presentation/routes/create-provisioner-token.d.ts.map +1 -0
- package/dist/presentation/routes/create-provisioner-token.js +42 -0
- package/dist/presentation/routes/create-provisioner-token.js.map +1 -0
- package/dist/presentation/routes/get-provisioner-me.d.ts +2 -0
- package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -0
- package/dist/presentation/routes/get-provisioner-me.js +22 -0
- package/dist/presentation/routes/get-provisioner-me.js.map +1 -0
- package/dist/presentation/routes/heartbeat.d.ts +2 -0
- package/dist/presentation/routes/heartbeat.d.ts.map +1 -0
- package/dist/presentation/routes/heartbeat.js +64 -0
- package/dist/presentation/routes/heartbeat.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +4 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +97 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/list-active-provisioners.d.ts +2 -0
- package/dist/presentation/routes/list-active-provisioners.d.ts.map +1 -0
- package/dist/presentation/routes/list-active-provisioners.js +32 -0
- package/dist/presentation/routes/list-active-provisioners.js.map +1 -0
- package/dist/presentation/routes/list-active-runners.d.ts +2 -0
- package/dist/presentation/routes/list-active-runners.d.ts.map +1 -0
- package/dist/presentation/routes/list-active-runners.js +32 -0
- package/dist/presentation/routes/list-active-runners.js.map +1 -0
- package/dist/presentation/routes/list-manual-registration-tokens.d.ts +2 -0
- package/dist/presentation/routes/list-manual-registration-tokens.d.ts.map +1 -0
- package/dist/presentation/routes/list-manual-registration-tokens.js +32 -0
- package/dist/presentation/routes/list-manual-registration-tokens.js.map +1 -0
- package/dist/presentation/routes/list-provisioner-tokens.d.ts +2 -0
- package/dist/presentation/routes/list-provisioner-tokens.d.ts.map +1 -0
- package/dist/presentation/routes/list-provisioner-tokens.js +32 -0
- package/dist/presentation/routes/list-provisioner-tokens.js.map +1 -0
- package/dist/presentation/routes/mint-registration-tokens.d.ts +2 -0
- package/dist/presentation/routes/mint-registration-tokens.d.ts.map +1 -0
- package/dist/presentation/routes/mint-registration-tokens.js +74 -0
- package/dist/presentation/routes/mint-registration-tokens.js.map +1 -0
- package/dist/presentation/routes/poll-demand.d.ts +2 -0
- package/dist/presentation/routes/poll-demand.d.ts.map +1 -0
- package/dist/presentation/routes/poll-demand.js +53 -0
- package/dist/presentation/routes/poll-demand.js.map +1 -0
- package/dist/presentation/routes/rate-limit.d.ts +4 -0
- package/dist/presentation/routes/rate-limit.d.ts.map +1 -0
- package/dist/presentation/routes/rate-limit.js +94 -0
- package/dist/presentation/routes/rate-limit.js.map +1 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +2 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +1 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.js +27 -0
- package/dist/presentation/routes/reconcile-provisioned-runners.js.map +1 -0
- package/dist/presentation/routes/register.d.ts +2 -0
- package/dist/presentation/routes/register.d.ts.map +1 -0
- package/dist/presentation/routes/register.js +63 -0
- package/dist/presentation/routes/register.js.map +1 -0
- package/dist/presentation/routes/report-provisioned-runners.d.ts +2 -0
- package/dist/presentation/routes/report-provisioned-runners.d.ts.map +1 -0
- package/dist/presentation/routes/report-provisioned-runners.js +37 -0
- package/dist/presentation/routes/report-provisioned-runners.js.map +1 -0
- package/dist/presentation/routes/request-job.d.ts +2 -0
- package/dist/presentation/routes/request-job.d.ts.map +1 -0
- package/dist/presentation/routes/request-job.js +45 -0
- package/dist/presentation/routes/request-job.js.map +1 -0
- package/dist/presentation/routes/revoke-manual-registration-token.d.ts +2 -0
- package/dist/presentation/routes/revoke-manual-registration-token.d.ts.map +1 -0
- package/dist/presentation/routes/revoke-manual-registration-token.js +42 -0
- package/dist/presentation/routes/revoke-manual-registration-token.js.map +1 -0
- package/dist/presentation/routes/revoke-provisioner-token.d.ts +2 -0
- package/dist/presentation/routes/revoke-provisioner-token.d.ts.map +1 -0
- package/dist/presentation/routes/revoke-provisioner-token.js +44 -0
- package/dist/presentation/routes/revoke-provisioner-token.js.map +1 -0
- package/dist/presentation/routes/workspace-membership.d.ts +6 -0
- package/dist/presentation/routes/workspace-membership.d.ts.map +1 -0
- package/dist/presentation/routes/workspace-membership.js +6 -0
- package/dist/presentation/routes/workspace-membership.js.map +1 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.d.ts +3 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.js +14 -0
- package/dist/presentation/subscribers/on-workflows-job-execution-timed-out.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +9 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +12 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/maintenance-activities.d.ts +31 -0
- package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -0
- package/dist/temporal/activities/maintenance-activities.js +18 -0
- package/dist/temporal/activities/maintenance-activities.js.map +1 -0
- package/dist/temporal/constants.d.ts +2 -0
- package/dist/temporal/constants.d.ts.map +1 -0
- package/dist/temporal/constants.js +3 -0
- package/dist/temporal/constants.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +2 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +3 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/stuck-job-detector.d.ts +2 -0
- package/dist/temporal/workflows/stuck-job-detector.d.ts.map +1 -0
- package/dist/temporal/workflows/stuck-job-detector.js +61 -0
- package/dist/temporal/workflows/stuck-job-detector.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_initial.sql +185 -0
- package/drizzle/meta/0000_snapshot.json +1582 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +7 -0
- package/package.json +82 -0
- package/src/config.test.ts +374 -0
- package/src/config.ts +330 -0
- package/src/core/demand.test.ts +301 -0
- package/src/core/demand.ts +239 -0
- package/src/core/entities/ephemeral-registration-token.ts +13 -0
- package/src/core/entities/manual-registration-token.ts +11 -0
- package/src/core/entities/provisioned-runner.ts +30 -0
- package/src/core/entities/provisioner-token.ts +16 -0
- package/src/core/entities/reservation.ts +9 -0
- package/src/core/entities/runner-session.ts +18 -0
- package/src/core/ephemeral-registration-tokens.test.ts +108 -0
- package/src/core/ephemeral-registration-tokens.ts +112 -0
- package/src/core/errors.ts +128 -0
- package/src/core/index.ts +56 -0
- package/src/core/job-executions.ts +47 -0
- package/src/core/maintenance-policy.ts +1 -0
- package/src/core/maintenance.test.ts +251 -0
- package/src/core/maintenance.ts +74 -0
- package/src/core/manual-registration-tokens.test.ts +44 -0
- package/src/core/manual-registration-tokens.ts +51 -0
- package/src/core/provisioned-runners.test.ts +101 -0
- package/src/core/provisioned-runners.ts +301 -0
- package/src/core/provisioner-tokens.test.ts +61 -0
- package/src/core/provisioner-tokens.ts +61 -0
- package/src/core/rate-limit.test.ts +158 -0
- package/src/core/rate-limit.ts +121 -0
- package/src/core/runner-sessions.test.ts +209 -0
- package/src/core/runner-sessions.ts +66 -0
- package/src/core/runner-tool-capabilities.test.ts +141 -0
- package/src/core/runner-tool-capabilities.ts +75 -0
- package/src/db/db.ts +38 -0
- package/src/db/ephemeral-registration-tokens.test.ts +332 -0
- package/src/db/ephemeral-registration-tokens.ts +348 -0
- package/src/db/index.ts +90 -0
- package/src/db/job-executions.test.ts +1500 -0
- package/src/db/job-executions.ts +647 -0
- package/src/db/manual-registration-tokens.test.ts +99 -0
- package/src/db/manual-registration-tokens.ts +87 -0
- package/src/db/provisioned-runners.test.ts +1812 -0
- package/src/db/provisioned-runners.ts +886 -0
- package/src/db/provisioner-tokens.test.ts +133 -0
- package/src/db/provisioner-tokens.ts +142 -0
- package/src/db/rate-limits.test.ts +74 -0
- package/src/db/rate-limits.ts +69 -0
- package/src/db/reservations.test.ts +399 -0
- package/src/db/reservations.ts +296 -0
- package/src/db/runner-sessions.test.ts +153 -0
- package/src/db/runner-sessions.ts +97 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/ephemeral-registration-tokens.ts +58 -0
- package/src/db/schema/manual-registration-tokens.ts +40 -0
- package/src/db/schema/outbox.ts +4 -0
- package/src/db/schema/pending-job-executions.ts +25 -0
- package/src/db/schema/provisioned-runners.ts +89 -0
- package/src/db/schema/provisioner-tokens.ts +50 -0
- package/src/db/schema/rate-limits.ts +27 -0
- package/src/db/schema/reservations.ts +38 -0
- package/src/db/schema/runner-sessions.ts +77 -0
- package/src/db/schema/running-job-executions.ts +50 -0
- package/src/index.ts +63 -0
- package/src/metrics/index.ts +13 -0
- package/src/metrics/instance.ts +115 -0
- package/src/metrics/service.ts +22 -0
- package/src/presentation/auth/index.ts +6 -0
- package/src/presentation/auth/provisioner-token-auth.ts +76 -0
- package/src/presentation/auth/runner-registration-token-auth.ts +105 -0
- package/src/presentation/dto/active-provisioner.ts +15 -0
- package/src/presentation/dto/index.ts +13 -0
- package/src/presentation/dto/manual-registration-token.ts +23 -0
- package/src/presentation/dto/mint-registration-tokens.ts +35 -0
- package/src/presentation/dto/poll-demand.ts +20 -0
- package/src/presentation/dto/provisioned-runners.ts +88 -0
- package/src/presentation/dto/provisioner-token.ts +29 -0
- package/src/presentation/index.ts +6 -0
- package/src/presentation/routes/create-manual-registration-token.ts +43 -0
- package/src/presentation/routes/create-provisioner-token.ts +41 -0
- package/src/presentation/routes/get-provisioner-me.ts +22 -0
- package/src/presentation/routes/heartbeat.test.ts +325 -0
- package/src/presentation/routes/heartbeat.ts +80 -0
- package/src/presentation/routes/index.ts +86 -0
- package/src/presentation/routes/list-active-provisioners.ts +25 -0
- package/src/presentation/routes/list-active-runners.test.ts +366 -0
- package/src/presentation/routes/list-active-runners.ts +25 -0
- package/src/presentation/routes/list-manual-registration-tokens.ts +25 -0
- package/src/presentation/routes/list-provisioner-tokens.ts +25 -0
- package/src/presentation/routes/manual-registration-tokens.test.ts +213 -0
- package/src/presentation/routes/mint-registration-tokens.test.ts +453 -0
- package/src/presentation/routes/mint-registration-tokens.ts +82 -0
- package/src/presentation/routes/poll-demand-release.test.ts +80 -0
- package/src/presentation/routes/poll-demand.test.ts +323 -0
- package/src/presentation/routes/poll-demand.ts +56 -0
- package/src/presentation/routes/provisioner-me.test.ts +172 -0
- package/src/presentation/routes/provisioner-tokens.test.ts +219 -0
- package/src/presentation/routes/rate-limit.ts +115 -0
- package/src/presentation/routes/reconcile-provisioned-runners.test.ts +380 -0
- package/src/presentation/routes/reconcile-provisioned-runners.ts +30 -0
- package/src/presentation/routes/register.test.ts +453 -0
- package/src/presentation/routes/register.ts +75 -0
- package/src/presentation/routes/report-provisioned-runners.test.ts +249 -0
- package/src/presentation/routes/report-provisioned-runners.ts +40 -0
- package/src/presentation/routes/request-job.test.ts +222 -0
- package/src/presentation/routes/request-job.ts +47 -0
- package/src/presentation/routes/revoke-manual-registration-token.ts +35 -0
- package/src/presentation/routes/revoke-provisioner-token.ts +37 -0
- package/src/presentation/routes/workspace-membership.ts +9 -0
- package/src/presentation/subscribers/on-workflows-job-execution-timed-out.test.ts +147 -0
- package/src/presentation/subscribers/on-workflows-job-execution-timed-out.ts +17 -0
- package/src/temporal/activities/index.ts +17 -0
- package/src/temporal/activities/maintenance-activities.test.ts +104 -0
- package/src/temporal/activities/maintenance-activities.ts +41 -0
- package/src/temporal/constants.ts +1 -0
- package/src/temporal/workflows/index.ts +1 -0
- package/src/temporal/workflows/stuck-job-detector.test.ts +93 -0
- package/src/temporal/workflows/stuck-job-detector.ts +67 -0
- package/test/env.ts +11 -0
- package/test/factories/ephemeral-registration-token.ts +41 -0
- package/test/factories/manual-registration-token.ts +37 -0
- package/test/factories/pending-job.ts +44 -0
- package/test/factories/provisioned-runner.ts +78 -0
- package/test/factories/provisioner-token.ts +41 -0
- package/test/factories/reservation.ts +33 -0
- package/test/factories/runner-session.ts +32 -0
- package/test/globalSetup.ts +23 -0
- package/test/index.ts +16 -0
- package/test/setup.ts +17 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export class RunningJobExecutionNotFoundError extends Error {
|
|
2
|
+
constructor(jobExecutionId){
|
|
3
|
+
super(`Running job execution not found: ${jobExecutionId}`);
|
|
4
|
+
this.name = 'RunningJobExecutionNotFoundError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class ManualRegistrationTokenNotFoundError extends Error {
|
|
8
|
+
constructor(tokenId){
|
|
9
|
+
super(`Manual registration token not found: ${tokenId}`);
|
|
10
|
+
this.name = 'ManualRegistrationTokenNotFoundError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ProvisionerTokenNotFoundError extends Error {
|
|
14
|
+
constructor(tokenId){
|
|
15
|
+
super(`Provisioner token not found: ${tokenId}`);
|
|
16
|
+
this.name = 'ProvisionerTokenNotFoundError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class EmptyRunnerLabelsError extends Error {
|
|
20
|
+
constructor(){
|
|
21
|
+
super('Runner labels cannot be empty');
|
|
22
|
+
this.name = 'EmptyRunnerLabelsError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class EmptyRequiredLabelsError extends Error {
|
|
26
|
+
constructor(){
|
|
27
|
+
super('Required labels cannot be empty');
|
|
28
|
+
this.name = 'EmptyRequiredLabelsError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class RegistrationTokenConsumedError extends Error {
|
|
32
|
+
constructor(ephemeralTokenId){
|
|
33
|
+
super(`Ephemeral registration token has already been consumed: ${ephemeralTokenId}`), this.ephemeralTokenId = ephemeralTokenId;
|
|
34
|
+
this.name = 'RegistrationTokenConsumedError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class RegistrationTokenExpiredError extends Error {
|
|
38
|
+
constructor(ephemeralTokenId){
|
|
39
|
+
super(`Ephemeral registration token has expired: ${ephemeralTokenId}`), this.ephemeralTokenId = ephemeralTokenId;
|
|
40
|
+
this.name = 'RegistrationTokenExpiredError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class RegistrationTokenWorkspaceMismatchError extends Error {
|
|
44
|
+
constructor(ephemeralTokenId, workspaceId){
|
|
45
|
+
super(`Ephemeral registration token ${ephemeralTokenId} does not belong to workspace ${workspaceId}`), this.ephemeralTokenId = ephemeralTokenId, this.workspaceId = workspaceId;
|
|
46
|
+
this.name = 'RegistrationTokenWorkspaceMismatchError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class ActiveEphemeralRegistrationTokenExistsError extends Error {
|
|
50
|
+
constructor(workspaceId, provisionerId, provisionedRunnerId){
|
|
51
|
+
super(`Active ephemeral registration token already exists for provisioned runner ${provisionedRunnerId} in workspace ${workspaceId}`), this.workspaceId = workspaceId, this.provisionerId = provisionerId, this.provisionedRunnerId = provisionedRunnerId;
|
|
52
|
+
this.name = 'ActiveEphemeralRegistrationTokenExistsError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class ReservationNotFoundError extends Error {
|
|
56
|
+
constructor(reservationId){
|
|
57
|
+
super(`Reservation not found: ${reservationId}`), this.reservationId = reservationId;
|
|
58
|
+
this.name = 'ReservationNotFoundError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class ReservationExpiredError extends Error {
|
|
62
|
+
constructor(reservationId){
|
|
63
|
+
super(`Reservation has expired: ${reservationId}`), this.reservationId = reservationId;
|
|
64
|
+
this.name = 'ReservationExpiredError';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export class RegistrationTokenBatchTooLargeError extends Error {
|
|
68
|
+
constructor(requested, max){
|
|
69
|
+
super(`Registration token batch requested ${requested} provisioned runners, exceeding max ${max}`), this.requested = requested, this.max = max;
|
|
70
|
+
this.name = 'RegistrationTokenBatchTooLargeError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class RegistrationTokenBatchExceedsReservationError extends Error {
|
|
74
|
+
constructor(requested, reservationCount, alreadyMinted = 0){
|
|
75
|
+
super(`Registration token batch requested ${requested} provisioned runners with ${alreadyMinted} already minted, exceeding reservation count ${reservationCount}`), this.requested = requested, this.reservationCount = reservationCount, this.alreadyMinted = alreadyMinted;
|
|
76
|
+
this.name = 'RegistrationTokenBatchExceedsReservationError';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class ActiveEphemeralRegistrationTokensExistError extends Error {
|
|
80
|
+
constructor(provisionedRunnerIds){
|
|
81
|
+
super(`Active ephemeral registration tokens already exist for provisioned runners: ${provisionedRunnerIds.join(', ')}`), this.provisionedRunnerIds = provisionedRunnerIds;
|
|
82
|
+
this.name = 'ActiveEphemeralRegistrationTokensExistError';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export class RunnerSessionExhaustedError extends Error {
|
|
86
|
+
constructor(runnerSessionId){
|
|
87
|
+
super(`Runner session claim limit exhausted: ${runnerSessionId}`), this.runnerSessionId = runnerSessionId;
|
|
88
|
+
this.name = 'RunnerSessionExhaustedError';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/errors.ts"],"sourcesContent":["export class RunningJobExecutionNotFoundError extends Error {\n constructor(jobExecutionId: string) {\n super(`Running job execution not found: ${jobExecutionId}`);\n this.name = 'RunningJobExecutionNotFoundError';\n }\n}\n\nexport class ManualRegistrationTokenNotFoundError extends Error {\n constructor(tokenId: string) {\n super(`Manual registration token not found: ${tokenId}`);\n this.name = 'ManualRegistrationTokenNotFoundError';\n }\n}\n\nexport class ProvisionerTokenNotFoundError extends Error {\n constructor(tokenId: string) {\n super(`Provisioner token not found: ${tokenId}`);\n this.name = 'ProvisionerTokenNotFoundError';\n }\n}\n\nexport class EmptyRunnerLabelsError extends Error {\n constructor() {\n super('Runner labels cannot be empty');\n this.name = 'EmptyRunnerLabelsError';\n }\n}\n\nexport class EmptyRequiredLabelsError extends Error {\n constructor() {\n super('Required labels cannot be empty');\n this.name = 'EmptyRequiredLabelsError';\n }\n}\n\nexport class RegistrationTokenConsumedError extends Error {\n constructor(public readonly ephemeralTokenId: string) {\n super(`Ephemeral registration token has already been consumed: ${ephemeralTokenId}`);\n this.name = 'RegistrationTokenConsumedError';\n }\n}\n\nexport class RegistrationTokenExpiredError extends Error {\n constructor(public readonly ephemeralTokenId: string) {\n super(`Ephemeral registration token has expired: ${ephemeralTokenId}`);\n this.name = 'RegistrationTokenExpiredError';\n }\n}\n\nexport class RegistrationTokenWorkspaceMismatchError extends Error {\n constructor(\n public readonly ephemeralTokenId: string,\n public readonly workspaceId: string,\n ) {\n super(\n `Ephemeral registration token ${ephemeralTokenId} does not belong to workspace ${workspaceId}`,\n );\n this.name = 'RegistrationTokenWorkspaceMismatchError';\n }\n}\n\nexport class ActiveEphemeralRegistrationTokenExistsError extends Error {\n constructor(\n public readonly workspaceId: string,\n public readonly provisionerId: string,\n public readonly provisionedRunnerId: string,\n ) {\n super(\n `Active ephemeral registration token already exists for provisioned runner ${provisionedRunnerId} in workspace ${workspaceId}`,\n );\n this.name = 'ActiveEphemeralRegistrationTokenExistsError';\n }\n}\n\nexport class ReservationNotFoundError extends Error {\n constructor(public readonly reservationId: string) {\n super(`Reservation not found: ${reservationId}`);\n this.name = 'ReservationNotFoundError';\n }\n}\n\nexport class ReservationExpiredError extends Error {\n constructor(public readonly reservationId: string) {\n super(`Reservation has expired: ${reservationId}`);\n this.name = 'ReservationExpiredError';\n }\n}\n\nexport class RegistrationTokenBatchTooLargeError extends Error {\n constructor(\n public readonly requested: number,\n public readonly max: number,\n ) {\n super(\n `Registration token batch requested ${requested} provisioned runners, exceeding max ${max}`,\n );\n this.name = 'RegistrationTokenBatchTooLargeError';\n }\n}\n\nexport class RegistrationTokenBatchExceedsReservationError extends Error {\n constructor(\n public readonly requested: number,\n public readonly reservationCount: number,\n public readonly alreadyMinted: number = 0,\n ) {\n super(\n `Registration token batch requested ${requested} provisioned runners with ${alreadyMinted} already minted, exceeding reservation count ${reservationCount}`,\n );\n this.name = 'RegistrationTokenBatchExceedsReservationError';\n }\n}\n\nexport class ActiveEphemeralRegistrationTokensExistError extends Error {\n constructor(public readonly provisionedRunnerIds: string[]) {\n super(\n `Active ephemeral registration tokens already exist for provisioned runners: ${provisionedRunnerIds.join(', ')}`,\n );\n this.name = 'ActiveEphemeralRegistrationTokensExistError';\n }\n}\n\nexport class RunnerSessionExhaustedError extends Error {\n constructor(public readonly runnerSessionId: string) {\n super(`Runner session claim limit exhausted: ${runnerSessionId}`);\n this.name = 'RunnerSessionExhaustedError';\n }\n}\n"],"names":["RunningJobExecutionNotFoundError","Error","jobExecutionId","name","ManualRegistrationTokenNotFoundError","tokenId","ProvisionerTokenNotFoundError","EmptyRunnerLabelsError","EmptyRequiredLabelsError","RegistrationTokenConsumedError","ephemeralTokenId","RegistrationTokenExpiredError","RegistrationTokenWorkspaceMismatchError","workspaceId","ActiveEphemeralRegistrationTokenExistsError","provisionerId","provisionedRunnerId","ReservationNotFoundError","reservationId","ReservationExpiredError","RegistrationTokenBatchTooLargeError","requested","max","RegistrationTokenBatchExceedsReservationError","reservationCount","alreadyMinted","ActiveEphemeralRegistrationTokensExistError","provisionedRunnerIds","join","RunnerSessionExhaustedError","runnerSessionId"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type { EphemeralRegistrationToken } from './entities/ephemeral-registration-token.js';
|
|
2
|
+
export type { ManualRegistrationToken } from './entities/manual-registration-token.js';
|
|
3
|
+
export type { ProvisionedRunner, ProvisionedRunnerState, } from './entities/provisioned-runner.js';
|
|
4
|
+
export type { ActiveProvisionerToken, ProvisionerToken } from './entities/provisioner-token.js';
|
|
5
|
+
export type { RunnerSession } from './entities/runner-session.js';
|
|
6
|
+
export { type MintEphemeralRegistrationTokenParams, type MintEphemeralRegistrationTokenResult, mintEphemeralRegistrationToken, } from './ephemeral-registration-tokens.js';
|
|
7
|
+
export { EmptyRunnerLabelsError, ManualRegistrationTokenNotFoundError, ProvisionerTokenNotFoundError, RegistrationTokenConsumedError, RegistrationTokenExpiredError, RunnerSessionExhaustedError, RunningJobExecutionNotFoundError, } from './errors.js';
|
|
8
|
+
export { type ClaimJobExecutionResult, claimJobExecution } from './job-executions.js';
|
|
9
|
+
export { createWorkspaceManualRegistrationToken, listUsableManualRegistrationTokens, revokeWorkspaceManualRegistrationToken, } from './manual-registration-tokens.js';
|
|
10
|
+
export { type ActiveRunner, listActiveRunners, type ReconcileDesiredIntent, type ReconciledBoundJobExecution, type ReconciledProvisionedRunner, type ReconcileProvisionedRunnersParams, type ReconcileProvisionedRunnersResult, type ReportProvisionedRunnersParams, type ReportProvisionedRunnersResult, reconcileProvisionedRunners, reportProvisionedRunners, } from './provisioned-runners.js';
|
|
11
|
+
export { createWorkspaceProvisionerToken, listActiveProvisioners, listUsableProvisionerTokens, revokeWorkspaceProvisionerToken, } from './provisioner-tokens.js';
|
|
12
|
+
export { type RegisterRunnerSessionResult, type RunnerRegistrationCredential, registerRunnerSession, } from './runner-sessions.js';
|
|
13
|
+
export { EMPTY_RUNNER_TOOL_CAPABILITIES, effectiveRunnerToolCapabilities, } from './runner-tool-capabilities.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAC,0BAA0B,EAAC,MAAM,4CAA4C,CAAC;AAC3F,YAAY,EAAC,uBAAuB,EAAC,MAAM,yCAAyC,CAAC;AACrF,YAAY,EACV,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAC,sBAAsB,EAAE,gBAAgB,EAAC,MAAM,iCAAiC,CAAC;AAC9F,YAAY,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAChE,OAAO,EACL,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,8BAA8B,GAC/B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,oCAAoC,EACpC,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,gCAAgC,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,KAAK,uBAAuB,EAAE,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACpF,OAAO,EACL,sCAAsC,EACtC,kCAAkC,EAClC,sCAAsC,GACvC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,YAAY,EACjB,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { mintEphemeralRegistrationToken } from './ephemeral-registration-tokens.js';
|
|
2
|
+
export { EmptyRunnerLabelsError, ManualRegistrationTokenNotFoundError, ProvisionerTokenNotFoundError, RegistrationTokenConsumedError, RegistrationTokenExpiredError, RunnerSessionExhaustedError, RunningJobExecutionNotFoundError } from './errors.js';
|
|
3
|
+
export { claimJobExecution } from './job-executions.js';
|
|
4
|
+
export { createWorkspaceManualRegistrationToken, listUsableManualRegistrationTokens, revokeWorkspaceManualRegistrationToken } from './manual-registration-tokens.js';
|
|
5
|
+
export { listActiveRunners, reconcileProvisionedRunners, reportProvisionedRunners } from './provisioned-runners.js';
|
|
6
|
+
export { createWorkspaceProvisionerToken, listActiveProvisioners, listUsableProvisionerTokens, revokeWorkspaceProvisionerToken } from './provisioner-tokens.js';
|
|
7
|
+
export { registerRunnerSession } from './runner-sessions.js';
|
|
8
|
+
export { EMPTY_RUNNER_TOOL_CAPABILITIES, effectiveRunnerToolCapabilities } from './runner-tool-capabilities.js';
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["export type {EphemeralRegistrationToken} from './entities/ephemeral-registration-token.js';\nexport type {ManualRegistrationToken} from './entities/manual-registration-token.js';\nexport type {\n ProvisionedRunner,\n ProvisionedRunnerState,\n} from './entities/provisioned-runner.js';\nexport type {ActiveProvisionerToken, ProvisionerToken} from './entities/provisioner-token.js';\nexport type {RunnerSession} from './entities/runner-session.js';\nexport {\n type MintEphemeralRegistrationTokenParams,\n type MintEphemeralRegistrationTokenResult,\n mintEphemeralRegistrationToken,\n} from './ephemeral-registration-tokens.js';\nexport {\n EmptyRunnerLabelsError,\n ManualRegistrationTokenNotFoundError,\n ProvisionerTokenNotFoundError,\n RegistrationTokenConsumedError,\n RegistrationTokenExpiredError,\n RunnerSessionExhaustedError,\n RunningJobExecutionNotFoundError,\n} from './errors.js';\nexport {type ClaimJobExecutionResult, claimJobExecution} from './job-executions.js';\nexport {\n createWorkspaceManualRegistrationToken,\n listUsableManualRegistrationTokens,\n revokeWorkspaceManualRegistrationToken,\n} from './manual-registration-tokens.js';\nexport {\n type ActiveRunner,\n listActiveRunners,\n type ReconcileDesiredIntent,\n type ReconciledBoundJobExecution,\n type ReconciledProvisionedRunner,\n type ReconcileProvisionedRunnersParams,\n type ReconcileProvisionedRunnersResult,\n type ReportProvisionedRunnersParams,\n type ReportProvisionedRunnersResult,\n reconcileProvisionedRunners,\n reportProvisionedRunners,\n} from './provisioned-runners.js';\nexport {\n createWorkspaceProvisionerToken,\n listActiveProvisioners,\n listUsableProvisionerTokens,\n revokeWorkspaceProvisionerToken,\n} from './provisioner-tokens.js';\nexport {\n type RegisterRunnerSessionResult,\n type RunnerRegistrationCredential,\n registerRunnerSession,\n} from './runner-sessions.js';\nexport {\n EMPTY_RUNNER_TOOL_CAPABILITIES,\n effectiveRunnerToolCapabilities,\n} from './runner-tool-capabilities.js';\n"],"names":["mintEphemeralRegistrationToken","EmptyRunnerLabelsError","ManualRegistrationTokenNotFoundError","ProvisionerTokenNotFoundError","RegistrationTokenConsumedError","RegistrationTokenExpiredError","RunnerSessionExhaustedError","RunningJobExecutionNotFoundError","claimJobExecution","createWorkspaceManualRegistrationToken","listUsableManualRegistrationTokens","revokeWorkspaceManualRegistrationToken","listActiveRunners","reconcileProvisionedRunners","reportProvisionedRunners","createWorkspaceProvisionerToken","listActiveProvisioners","listUsableProvisionerTokens","revokeWorkspaceProvisionerToken","registerRunnerSession","EMPTY_RUNNER_TOOL_CAPABILITIES","effectiveRunnerToolCapabilities"],"mappings":"AAQA,SAGEA,8BAA8B,QACzB,qCAAqC;AAC5C,SACEC,sBAAsB,EACtBC,oCAAoC,EACpCC,6BAA6B,EAC7BC,8BAA8B,EAC9BC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,gCAAgC,QAC3B,cAAc;AACrB,SAAsCC,iBAAiB,QAAO,sBAAsB;AACpF,SACEC,sCAAsC,EACtCC,kCAAkC,EAClCC,sCAAsC,QACjC,kCAAkC;AACzC,SAEEC,iBAAiB,EAQjBC,2BAA2B,EAC3BC,wBAAwB,QACnB,2BAA2B;AAClC,SACEC,+BAA+B,EAC/BC,sBAAsB,EACtBC,2BAA2B,EAC3BC,+BAA+B,QAC1B,0BAA0B;AACjC,SAGEC,qBAAqB,QAChB,uBAAuB;AAC9B,SACEC,8BAA8B,EAC9BC,+BAA+B,QAC1B,gCAAgC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ClaimJobExecutionResult {
|
|
2
|
+
workflowRunId: string;
|
|
3
|
+
workflowRunAttemptId: string;
|
|
4
|
+
jobId: string;
|
|
5
|
+
jobExecutionId: string;
|
|
6
|
+
leaseToken: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function claimJobExecution(params: {
|
|
9
|
+
workspaceId: string;
|
|
10
|
+
runnerSessionId: string;
|
|
11
|
+
sessionLabels: string[];
|
|
12
|
+
maxClaims: number | null;
|
|
13
|
+
}): Promise<ClaimJobExecutionResult | null>;
|
|
14
|
+
//# sourceMappingURL=job-executions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-executions.d.ts","sourceRoot":"","sources":["../../src/core/job-executions.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA4B1C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { issueJobLeaseToken } from '@shipfox/api-auth';
|
|
2
|
+
import { claimPendingJobExecution } from '#db/job-executions.js';
|
|
3
|
+
import { jobExecutionClaimedCount } from '#metrics/instance.js';
|
|
4
|
+
import { config } from '../config.js';
|
|
5
|
+
export async function claimJobExecution(params) {
|
|
6
|
+
const claimed = await claimPendingJobExecution({
|
|
7
|
+
...params,
|
|
8
|
+
runnerSessionLivenessThrottleSeconds: config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS
|
|
9
|
+
});
|
|
10
|
+
if (!claimed) {
|
|
11
|
+
jobExecutionClaimedCount.add(1, {
|
|
12
|
+
outcome: 'empty'
|
|
13
|
+
});
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
jobExecutionClaimedCount.add(1, {
|
|
17
|
+
outcome: 'claimed'
|
|
18
|
+
});
|
|
19
|
+
const leaseToken = await issueJobLeaseToken({
|
|
20
|
+
workflowRunId: claimed.workflowRunId,
|
|
21
|
+
workflowRunAttemptId: claimed.workflowRunAttemptId,
|
|
22
|
+
jobId: claimed.jobId,
|
|
23
|
+
jobExecutionId: claimed.jobExecutionId,
|
|
24
|
+
projectId: claimed.projectId,
|
|
25
|
+
workspaceId: params.workspaceId,
|
|
26
|
+
runnerSessionId: params.runnerSessionId
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
workflowRunId: claimed.workflowRunId,
|
|
30
|
+
workflowRunAttemptId: claimed.workflowRunAttemptId,
|
|
31
|
+
jobId: claimed.jobId,
|
|
32
|
+
jobExecutionId: claimed.jobExecutionId,
|
|
33
|
+
leaseToken
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=job-executions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/job-executions.ts"],"sourcesContent":["import {issueJobLeaseToken} from '@shipfox/api-auth';\nimport {claimPendingJobExecution} from '#db/job-executions.js';\nimport {jobExecutionClaimedCount} from '#metrics/instance.js';\nimport {config} from '../config.js';\n\nexport interface ClaimJobExecutionResult {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n leaseToken: string;\n}\n\nexport async function claimJobExecution(params: {\n workspaceId: string;\n runnerSessionId: string;\n sessionLabels: string[];\n maxClaims: number | null;\n}): Promise<ClaimJobExecutionResult | null> {\n const claimed = await claimPendingJobExecution({\n ...params,\n runnerSessionLivenessThrottleSeconds: config.RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS,\n });\n if (!claimed) {\n jobExecutionClaimedCount.add(1, {outcome: 'empty'});\n return null;\n }\n jobExecutionClaimedCount.add(1, {outcome: 'claimed'});\n\n const leaseToken = await issueJobLeaseToken({\n workflowRunId: claimed.workflowRunId,\n workflowRunAttemptId: claimed.workflowRunAttemptId,\n jobId: claimed.jobId,\n jobExecutionId: claimed.jobExecutionId,\n projectId: claimed.projectId,\n workspaceId: params.workspaceId,\n runnerSessionId: params.runnerSessionId,\n });\n\n return {\n workflowRunId: claimed.workflowRunId,\n workflowRunAttemptId: claimed.workflowRunAttemptId,\n jobId: claimed.jobId,\n jobExecutionId: claimed.jobExecutionId,\n leaseToken,\n };\n}\n"],"names":["issueJobLeaseToken","claimPendingJobExecution","jobExecutionClaimedCount","config","claimJobExecution","params","claimed","runnerSessionLivenessThrottleSeconds","RUNNER_SESSION_LIVENESS_THROTTLE_SECONDS","add","outcome","leaseToken","workflowRunId","workflowRunAttemptId","jobId","jobExecutionId","projectId","workspaceId","runnerSessionId"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,oBAAoB;AACrD,SAAQC,wBAAwB,QAAO,wBAAwB;AAC/D,SAAQC,wBAAwB,QAAO,uBAAuB;AAC9D,SAAQC,MAAM,QAAO,eAAe;AAUpC,OAAO,eAAeC,kBAAkBC,MAKvC;IACC,MAAMC,UAAU,MAAML,yBAAyB;QAC7C,GAAGI,MAAM;QACTE,sCAAsCJ,OAAOK,wCAAwC;IACvF;IACA,IAAI,CAACF,SAAS;QACZJ,yBAAyBO,GAAG,CAAC,GAAG;YAACC,SAAS;QAAO;QACjD,OAAO;IACT;IACAR,yBAAyBO,GAAG,CAAC,GAAG;QAACC,SAAS;IAAS;IAEnD,MAAMC,aAAa,MAAMX,mBAAmB;QAC1CY,eAAeN,QAAQM,aAAa;QACpCC,sBAAsBP,QAAQO,oBAAoB;QAClDC,OAAOR,QAAQQ,KAAK;QACpBC,gBAAgBT,QAAQS,cAAc;QACtCC,WAAWV,QAAQU,SAAS;QAC5BC,aAAaZ,OAAOY,WAAW;QAC/BC,iBAAiBb,OAAOa,eAAe;IACzC;IAEA,OAAO;QACLN,eAAeN,QAAQM,aAAa;QACpCC,sBAAsBP,QAAQO,oBAAoB;QAClDC,OAAOR,QAAQQ,KAAK;QACpBC,gBAAgBT,QAAQS,cAAc;QACtCJ;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance-policy.d.ts","sourceRoot":"","sources":["../../src/core/maintenance-policy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/maintenance-policy.ts"],"sourcesContent":["export const STUCK_JOB_THRESHOLD_SECONDS = 180;\n"],"names":["STUCK_JOB_THRESHOLD_SECONDS"],"mappings":"AAAA,OAAO,MAAMA,8BAA8B,IAAI"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface DetectAndExpireStuckJobsParams {
|
|
2
|
+
noFirstHeartbeatGraceSeconds?: number;
|
|
3
|
+
thresholdSeconds?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function detectAndExpireStuckJobs(params?: DetectAndExpireStuckJobsParams): Promise<{
|
|
6
|
+
expired: number;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function deleteExpiredRunnerReservations(params?: {
|
|
9
|
+
limit?: number;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
deleted: number;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function reapStaleProvisionedRunners(params?: {
|
|
14
|
+
thresholdSeconds?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
reaped: number;
|
|
18
|
+
reservationsReleased: number;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function deleteExpiredRunnerSessions(params?: {
|
|
21
|
+
manualRetentionDays?: number;
|
|
22
|
+
ephemeralRetentionDays?: number;
|
|
23
|
+
limit?: number;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
deleted: number;
|
|
26
|
+
}>;
|
|
27
|
+
export declare function deleteExpiredEphemeralRegistrationTokens(params?: {
|
|
28
|
+
retentionDays?: number;
|
|
29
|
+
limit?: number;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
deleted: number;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=maintenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../src/core/maintenance.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,8BAA8B;IAC7C,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,GAAE,8BAAmC,GAC1C,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC,CAO5B;AAED,wBAAsB,+BAA+B,CAAC,MAAM,CAAC,EAAE;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC,CAG7B;AAED,wBAAsB,2BAA2B,CAAC,MAAM,CAAC,EAAE;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAC,CAAC,CAa1D;AAED,wBAAsB,2BAA2B,CAAC,MAAM,CAAC,EAAE;IACzD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC,CAQ7B;AAED,wBAAsB,wCAAwC,CAAC,MAAM,CAAC,EAAE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC,CAM7B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { config } from '#config.js';
|
|
2
|
+
import { deleteExpiredEphemeralRegistrationTokens as deleteExpiredEphemeralRegistrationTokensDb } from '#db/ephemeral-registration-tokens.js';
|
|
3
|
+
import { expireStuckJobExecutions } from '#db/job-executions.js';
|
|
4
|
+
import { reapStaleProvisionedRunners as reapStaleProvisionedRunnersDb } from '#db/provisioned-runners.js';
|
|
5
|
+
import { deleteExpiredReservations } from '#db/reservations.js';
|
|
6
|
+
import { deleteExpiredRunnerSessions as deleteExpiredRunnerSessionsDb } from '#db/runner-sessions.js';
|
|
7
|
+
import { provisionedRunnerReapedCount, reservationReleasedCount } from '#metrics/instance.js';
|
|
8
|
+
import { STUCK_JOB_THRESHOLD_SECONDS } from './maintenance-policy.js';
|
|
9
|
+
export async function detectAndExpireStuckJobs(params = {}) {
|
|
10
|
+
const reaped = await expireStuckJobExecutions({
|
|
11
|
+
noFirstHeartbeatGraceSeconds: params.noFirstHeartbeatGraceSeconds ?? config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS,
|
|
12
|
+
thresholdSeconds: params.thresholdSeconds ?? STUCK_JOB_THRESHOLD_SECONDS
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
expired: reaped.length
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export async function deleteExpiredRunnerReservations(params) {
|
|
19
|
+
const deleted = await deleteExpiredReservations(params);
|
|
20
|
+
return {
|
|
21
|
+
deleted
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export async function reapStaleProvisionedRunners(params) {
|
|
25
|
+
const result = await reapStaleProvisionedRunnersDb({
|
|
26
|
+
thresholdSeconds: params?.thresholdSeconds ?? config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS,
|
|
27
|
+
limit: params?.limit ?? config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT
|
|
28
|
+
});
|
|
29
|
+
if (result.reaped > 0) provisionedRunnerReapedCount.add(result.reaped);
|
|
30
|
+
if (result.reservationsReleased > 0) {
|
|
31
|
+
reservationReleasedCount.add(result.reservationsReleased);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
export async function deleteExpiredRunnerSessions(params) {
|
|
36
|
+
const deleted = await deleteExpiredRunnerSessionsDb({
|
|
37
|
+
manualRetentionDays: params?.manualRetentionDays ?? config.RUNNER_SESSION_MANUAL_RETENTION_DAYS,
|
|
38
|
+
ephemeralRetentionDays: params?.ephemeralRetentionDays ?? config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS,
|
|
39
|
+
limit: params?.limit ?? config.RUNNER_SESSION_GC_BATCH_SIZE
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
deleted
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export async function deleteExpiredEphemeralRegistrationTokens(params) {
|
|
46
|
+
const deleted = await deleteExpiredEphemeralRegistrationTokensDb({
|
|
47
|
+
retentionDays: params?.retentionDays ?? config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS,
|
|
48
|
+
limit: params?.limit ?? config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
deleted
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=maintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/maintenance.ts"],"sourcesContent":["import {config} from '#config.js';\nimport {deleteExpiredEphemeralRegistrationTokens as deleteExpiredEphemeralRegistrationTokensDb} from '#db/ephemeral-registration-tokens.js';\nimport {expireStuckJobExecutions} from '#db/job-executions.js';\nimport {reapStaleProvisionedRunners as reapStaleProvisionedRunnersDb} from '#db/provisioned-runners.js';\nimport {deleteExpiredReservations} from '#db/reservations.js';\nimport {deleteExpiredRunnerSessions as deleteExpiredRunnerSessionsDb} from '#db/runner-sessions.js';\nimport {provisionedRunnerReapedCount, reservationReleasedCount} from '#metrics/instance.js';\nimport {STUCK_JOB_THRESHOLD_SECONDS} from './maintenance-policy.js';\n\nexport interface DetectAndExpireStuckJobsParams {\n noFirstHeartbeatGraceSeconds?: number;\n thresholdSeconds?: number;\n}\n\nexport async function detectAndExpireStuckJobs(\n params: DetectAndExpireStuckJobsParams = {},\n): Promise<{expired: number}> {\n const reaped = await expireStuckJobExecutions({\n noFirstHeartbeatGraceSeconds:\n params.noFirstHeartbeatGraceSeconds ?? config.RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS,\n thresholdSeconds: params.thresholdSeconds ?? STUCK_JOB_THRESHOLD_SECONDS,\n });\n return {expired: reaped.length};\n}\n\nexport async function deleteExpiredRunnerReservations(params?: {\n limit?: number;\n}): Promise<{deleted: number}> {\n const deleted = await deleteExpiredReservations(params);\n return {deleted};\n}\n\nexport async function reapStaleProvisionedRunners(params?: {\n thresholdSeconds?: number;\n limit?: number;\n}): Promise<{reaped: number; reservationsReleased: number}> {\n const result = await reapStaleProvisionedRunnersDb({\n thresholdSeconds:\n params?.thresholdSeconds ?? config.RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS,\n limit: params?.limit ?? config.RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT,\n });\n\n if (result.reaped > 0) provisionedRunnerReapedCount.add(result.reaped);\n if (result.reservationsReleased > 0) {\n reservationReleasedCount.add(result.reservationsReleased);\n }\n\n return result;\n}\n\nexport async function deleteExpiredRunnerSessions(params?: {\n manualRetentionDays?: number;\n ephemeralRetentionDays?: number;\n limit?: number;\n}): Promise<{deleted: number}> {\n const deleted = await deleteExpiredRunnerSessionsDb({\n manualRetentionDays: params?.manualRetentionDays ?? config.RUNNER_SESSION_MANUAL_RETENTION_DAYS,\n ephemeralRetentionDays:\n params?.ephemeralRetentionDays ?? config.RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS,\n limit: params?.limit ?? config.RUNNER_SESSION_GC_BATCH_SIZE,\n });\n return {deleted};\n}\n\nexport async function deleteExpiredEphemeralRegistrationTokens(params?: {\n retentionDays?: number;\n limit?: number;\n}): Promise<{deleted: number}> {\n const deleted = await deleteExpiredEphemeralRegistrationTokensDb({\n retentionDays: params?.retentionDays ?? config.RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS,\n limit: params?.limit ?? config.RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE,\n });\n return {deleted};\n}\n"],"names":["config","deleteExpiredEphemeralRegistrationTokens","deleteExpiredEphemeralRegistrationTokensDb","expireStuckJobExecutions","reapStaleProvisionedRunners","reapStaleProvisionedRunnersDb","deleteExpiredReservations","deleteExpiredRunnerSessions","deleteExpiredRunnerSessionsDb","provisionedRunnerReapedCount","reservationReleasedCount","STUCK_JOB_THRESHOLD_SECONDS","detectAndExpireStuckJobs","params","reaped","noFirstHeartbeatGraceSeconds","RUNNER_NO_FIRST_HEARTBEAT_GRACE_SECONDS","thresholdSeconds","expired","length","deleteExpiredRunnerReservations","deleted","result","RUNNER_STALE_PROVISIONED_RUNNER_THRESHOLD_SECONDS","limit","RUNNER_STALE_PROVISIONED_RUNNER_REAPER_LIMIT","add","reservationsReleased","manualRetentionDays","RUNNER_SESSION_MANUAL_RETENTION_DAYS","ephemeralRetentionDays","RUNNER_SESSION_EPHEMERAL_RETENTION_DAYS","RUNNER_SESSION_GC_BATCH_SIZE","retentionDays","RUNNER_EPHEMERAL_TOKEN_RETENTION_DAYS","RUNNER_EPHEMERAL_TOKEN_GC_BATCH_SIZE"],"mappings":"AAAA,SAAQA,MAAM,QAAO,aAAa;AAClC,SAAQC,4CAA4CC,0CAA0C,QAAO,uCAAuC;AAC5I,SAAQC,wBAAwB,QAAO,wBAAwB;AAC/D,SAAQC,+BAA+BC,6BAA6B,QAAO,6BAA6B;AACxG,SAAQC,yBAAyB,QAAO,sBAAsB;AAC9D,SAAQC,+BAA+BC,6BAA6B,QAAO,yBAAyB;AACpG,SAAQC,4BAA4B,EAAEC,wBAAwB,QAAO,uBAAuB;AAC5F,SAAQC,2BAA2B,QAAO,0BAA0B;AAOpE,OAAO,eAAeC,yBACpBC,SAAyC,CAAC,CAAC;IAE3C,MAAMC,SAAS,MAAMX,yBAAyB;QAC5CY,8BACEF,OAAOE,4BAA4B,IAAIf,OAAOgB,uCAAuC;QACvFC,kBAAkBJ,OAAOI,gBAAgB,IAAIN;IAC/C;IACA,OAAO;QAACO,SAASJ,OAAOK,MAAM;IAAA;AAChC;AAEA,OAAO,eAAeC,gCAAgCP,MAErD;IACC,MAAMQ,UAAU,MAAMf,0BAA0BO;IAChD,OAAO;QAACQ;IAAO;AACjB;AAEA,OAAO,eAAejB,4BAA4BS,MAGjD;IACC,MAAMS,SAAS,MAAMjB,8BAA8B;QACjDY,kBACEJ,QAAQI,oBAAoBjB,OAAOuB,iDAAiD;QACtFC,OAAOX,QAAQW,SAASxB,OAAOyB,4CAA4C;IAC7E;IAEA,IAAIH,OAAOR,MAAM,GAAG,GAAGL,6BAA6BiB,GAAG,CAACJ,OAAOR,MAAM;IACrE,IAAIQ,OAAOK,oBAAoB,GAAG,GAAG;QACnCjB,yBAAyBgB,GAAG,CAACJ,OAAOK,oBAAoB;IAC1D;IAEA,OAAOL;AACT;AAEA,OAAO,eAAef,4BAA4BM,MAIjD;IACC,MAAMQ,UAAU,MAAMb,8BAA8B;QAClDoB,qBAAqBf,QAAQe,uBAAuB5B,OAAO6B,oCAAoC;QAC/FC,wBACEjB,QAAQiB,0BAA0B9B,OAAO+B,uCAAuC;QAClFP,OAAOX,QAAQW,SAASxB,OAAOgC,4BAA4B;IAC7D;IACA,OAAO;QAACX;IAAO;AACjB;AAEA,OAAO,eAAepB,yCAAyCY,MAG9D;IACC,MAAMQ,UAAU,MAAMnB,2CAA2C;QAC/D+B,eAAepB,QAAQoB,iBAAiBjC,OAAOkC,qCAAqC;QACpFV,OAAOX,QAAQW,SAASxB,OAAOmC,oCAAoC;IACrE;IACA,OAAO;QAACd;IAAO;AACjB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ManualRegistrationToken } from './entities/manual-registration-token.js';
|
|
2
|
+
export interface CreateWorkspaceManualRegistrationTokenParams {
|
|
3
|
+
workspaceId: string;
|
|
4
|
+
name?: string | undefined;
|
|
5
|
+
ttlSeconds?: number | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface CreateWorkspaceManualRegistrationTokenResult {
|
|
8
|
+
token: ManualRegistrationToken;
|
|
9
|
+
rawToken: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function createWorkspaceManualRegistrationToken(params: CreateWorkspaceManualRegistrationTokenParams): Promise<CreateWorkspaceManualRegistrationTokenResult>;
|
|
12
|
+
export declare function listUsableManualRegistrationTokens(workspaceId: string): Promise<ManualRegistrationToken[]>;
|
|
13
|
+
export declare function revokeWorkspaceManualRegistrationToken(params: {
|
|
14
|
+
tokenId: string;
|
|
15
|
+
workspaceId: string;
|
|
16
|
+
}): Promise<ManualRegistrationToken>;
|
|
17
|
+
//# sourceMappingURL=manual-registration-tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual-registration-tokens.d.ts","sourceRoot":"","sources":["../../src/core/manual-registration-tokens.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,yCAAyC,CAAC;AAGrF,MAAM,WAAW,4CAA4C;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,4CAA4C;IAC3D,KAAK,EAAE,uBAAuB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,4CAA4C,GACnD,OAAO,CAAC,4CAA4C,CAAC,CAavD;AAED,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAEpC;AAED,wBAAsB,sCAAsC,CAAC,MAAM,EAAE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAInC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { extractDisplayPrefix, generateOpaqueToken, hashOpaqueToken } from '@shipfox/node-tokens';
|
|
2
|
+
import { createManualRegistrationToken, listUsableManualRegistrationTokensByWorkspaceId, revokeManualRegistrationToken } from '#db/manual-registration-tokens.js';
|
|
3
|
+
import { ManualRegistrationTokenNotFoundError } from './errors.js';
|
|
4
|
+
export async function createWorkspaceManualRegistrationToken(params) {
|
|
5
|
+
const rawToken = generateOpaqueToken('manualRegistrationToken');
|
|
6
|
+
const expiresAt = params.ttlSeconds ? new Date(Date.now() + params.ttlSeconds * 1000) : undefined;
|
|
7
|
+
const token = await createManualRegistrationToken({
|
|
8
|
+
workspaceId: params.workspaceId,
|
|
9
|
+
hashedToken: hashOpaqueToken(rawToken),
|
|
10
|
+
prefix: extractDisplayPrefix(rawToken),
|
|
11
|
+
name: params.name,
|
|
12
|
+
expiresAt
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
token,
|
|
16
|
+
rawToken
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function listUsableManualRegistrationTokens(workspaceId) {
|
|
20
|
+
return listUsableManualRegistrationTokensByWorkspaceId(workspaceId);
|
|
21
|
+
}
|
|
22
|
+
export async function revokeWorkspaceManualRegistrationToken(params) {
|
|
23
|
+
const token = await revokeManualRegistrationToken(params);
|
|
24
|
+
if (!token) throw new ManualRegistrationTokenNotFoundError(params.tokenId);
|
|
25
|
+
return token;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=manual-registration-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/manual-registration-tokens.ts"],"sourcesContent":["import {extractDisplayPrefix, generateOpaqueToken, hashOpaqueToken} from '@shipfox/node-tokens';\nimport {\n createManualRegistrationToken,\n listUsableManualRegistrationTokensByWorkspaceId,\n revokeManualRegistrationToken,\n} from '#db/manual-registration-tokens.js';\nimport type {ManualRegistrationToken} from './entities/manual-registration-token.js';\nimport {ManualRegistrationTokenNotFoundError} from './errors.js';\n\nexport interface CreateWorkspaceManualRegistrationTokenParams {\n workspaceId: string;\n name?: string | undefined;\n ttlSeconds?: number | undefined;\n}\n\nexport interface CreateWorkspaceManualRegistrationTokenResult {\n token: ManualRegistrationToken;\n rawToken: string;\n}\n\nexport async function createWorkspaceManualRegistrationToken(\n params: CreateWorkspaceManualRegistrationTokenParams,\n): Promise<CreateWorkspaceManualRegistrationTokenResult> {\n const rawToken = generateOpaqueToken('manualRegistrationToken');\n const expiresAt = params.ttlSeconds ? new Date(Date.now() + params.ttlSeconds * 1000) : undefined;\n\n const token = await createManualRegistrationToken({\n workspaceId: params.workspaceId,\n hashedToken: hashOpaqueToken(rawToken),\n prefix: extractDisplayPrefix(rawToken),\n name: params.name,\n expiresAt,\n });\n\n return {token, rawToken};\n}\n\nexport function listUsableManualRegistrationTokens(\n workspaceId: string,\n): Promise<ManualRegistrationToken[]> {\n return listUsableManualRegistrationTokensByWorkspaceId(workspaceId);\n}\n\nexport async function revokeWorkspaceManualRegistrationToken(params: {\n tokenId: string;\n workspaceId: string;\n}): Promise<ManualRegistrationToken> {\n const token = await revokeManualRegistrationToken(params);\n if (!token) throw new ManualRegistrationTokenNotFoundError(params.tokenId);\n return token;\n}\n"],"names":["extractDisplayPrefix","generateOpaqueToken","hashOpaqueToken","createManualRegistrationToken","listUsableManualRegistrationTokensByWorkspaceId","revokeManualRegistrationToken","ManualRegistrationTokenNotFoundError","createWorkspaceManualRegistrationToken","params","rawToken","expiresAt","ttlSeconds","Date","now","undefined","token","workspaceId","hashedToken","prefix","name","listUsableManualRegistrationTokens","revokeWorkspaceManualRegistrationToken","tokenId"],"mappings":"AAAA,SAAQA,oBAAoB,EAAEC,mBAAmB,EAAEC,eAAe,QAAO,uBAAuB;AAChG,SACEC,6BAA6B,EAC7BC,+CAA+C,EAC/CC,6BAA6B,QACxB,oCAAoC;AAE3C,SAAQC,oCAAoC,QAAO,cAAc;AAajE,OAAO,eAAeC,uCACpBC,MAAoD;IAEpD,MAAMC,WAAWR,oBAAoB;IACrC,MAAMS,YAAYF,OAAOG,UAAU,GAAG,IAAIC,KAAKA,KAAKC,GAAG,KAAKL,OAAOG,UAAU,GAAG,QAAQG;IAExF,MAAMC,QAAQ,MAAMZ,8BAA8B;QAChDa,aAAaR,OAAOQ,WAAW;QAC/BC,aAAaf,gBAAgBO;QAC7BS,QAAQlB,qBAAqBS;QAC7BU,MAAMX,OAAOW,IAAI;QACjBT;IACF;IAEA,OAAO;QAACK;QAAON;IAAQ;AACzB;AAEA,OAAO,SAASW,mCACdJ,WAAmB;IAEnB,OAAOZ,gDAAgDY;AACzD;AAEA,OAAO,eAAeK,uCAAuCb,MAG5D;IACC,MAAMO,QAAQ,MAAMV,8BAA8BG;IAClD,IAAI,CAACO,OAAO,MAAM,IAAIT,qCAAqCE,OAAOc,OAAO;IACzE,OAAOP;AACT"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ProvisionedRunner, ProvisionedRunnerState } from '#core/entities/provisioned-runner.js';
|
|
2
|
+
import { type ProvisionedRunnerReportEvent } from '#db/index.js';
|
|
3
|
+
import type { ProvisionedRunnerBoundJobExecution } from '#db/job-executions.js';
|
|
4
|
+
export interface ReportProvisionedRunnersParams {
|
|
5
|
+
workspaceId: string;
|
|
6
|
+
provisionerId: string;
|
|
7
|
+
events: ProvisionedRunnerReportEvent[];
|
|
8
|
+
}
|
|
9
|
+
export interface ReportProvisionedRunnersResult {
|
|
10
|
+
accepted: number;
|
|
11
|
+
reservationsReleased: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ReconcileProvisionedRunnersParams {
|
|
14
|
+
workspaceId: string;
|
|
15
|
+
provisionerId: string;
|
|
16
|
+
observedProvisionedRunnerIds: string[];
|
|
17
|
+
}
|
|
18
|
+
export type ReconcileDesiredIntent = 'keep' | 'terminate';
|
|
19
|
+
type ReconcileDesiredIntentReason = 'job-cancelled' | 'terminal-state';
|
|
20
|
+
export interface ReconciledBoundJobExecution {
|
|
21
|
+
jobId: string;
|
|
22
|
+
jobExecutionId: string;
|
|
23
|
+
workflowRunAttemptId: string;
|
|
24
|
+
lastHeartbeatAt: Date;
|
|
25
|
+
cancellationRequestedAt: Date | null;
|
|
26
|
+
}
|
|
27
|
+
export interface ReconciledProvisionedRunner {
|
|
28
|
+
provisionedRunnerId: string;
|
|
29
|
+
state: ProvisionedRunnerState | null;
|
|
30
|
+
reservationId: string | null;
|
|
31
|
+
runnerSessionId: string | null;
|
|
32
|
+
boundJobExecution: ReconciledBoundJobExecution | null;
|
|
33
|
+
desiredIntent: ReconcileDesiredIntent;
|
|
34
|
+
desiredIntentReason: ReconcileDesiredIntentReason | null;
|
|
35
|
+
}
|
|
36
|
+
export interface ReconcileProvisionedRunnersResult {
|
|
37
|
+
runners: ReconciledProvisionedRunner[];
|
|
38
|
+
terminatedAbsentProvisionedRunnerIds: string[];
|
|
39
|
+
}
|
|
40
|
+
export type ActiveRunnerState = 'starting' | 'running' | 'stopping' | 'busy';
|
|
41
|
+
export interface ActiveRunner {
|
|
42
|
+
runnerSessionId: string | null;
|
|
43
|
+
provisionedRunnerId: string | null;
|
|
44
|
+
provisionerId: string | null;
|
|
45
|
+
state: ActiveRunnerState;
|
|
46
|
+
labels: string[];
|
|
47
|
+
templateKey: string | null;
|
|
48
|
+
providerKind: string | null;
|
|
49
|
+
jobId: string | null;
|
|
50
|
+
workflowRunAttemptId: string | null;
|
|
51
|
+
projectId: string | null;
|
|
52
|
+
reportedAt: Date | null;
|
|
53
|
+
lastHeartbeatAt: Date | null;
|
|
54
|
+
}
|
|
55
|
+
export declare function reportProvisionedRunners(params: ReportProvisionedRunnersParams): Promise<ReportProvisionedRunnersResult>;
|
|
56
|
+
export declare function reconcileProvisionedRunners(params: ReconcileProvisionedRunnersParams): Promise<ReconcileProvisionedRunnersResult>;
|
|
57
|
+
export declare function reconcileProvisionedRunnersFromDbResult(params: {
|
|
58
|
+
observedProvisionedRunnerIds: string[];
|
|
59
|
+
observedRows: ProvisionedRunner[];
|
|
60
|
+
boundJobExecutionsByProvisionedRunnerId: Map<string, ProvisionedRunnerBoundJobExecution>;
|
|
61
|
+
}): ReconciledProvisionedRunner[];
|
|
62
|
+
export declare function listActiveRunners(params: {
|
|
63
|
+
workspaceId: string;
|
|
64
|
+
}): Promise<ActiveRunner[]>;
|
|
65
|
+
export declare function desiredIntent(row: ProvisionedRunner | undefined, boundJobExecution: ProvisionedRunnerBoundJobExecution | undefined): ReconcileDesiredIntent;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=provisioned-runners.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioned-runners.d.ts","sourceRoot":"","sources":["../../src/core/provisioned-runners.ts"],"names":[],"mappings":"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"}
|