@shipfox/api-runners 10.1.0 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/CHANGELOG.md +20 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +8 -13
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/admin-runner-instances.d.ts +34 -0
  7. package/dist/core/admin-runner-instances.d.ts.map +1 -0
  8. package/dist/core/admin-runner-instances.js +58 -0
  9. package/dist/core/admin-runner-instances.js.map +1 -0
  10. package/dist/core/errors.d.ts +6 -0
  11. package/dist/core/errors.d.ts.map +1 -1
  12. package/dist/core/errors.js +12 -0
  13. package/dist/core/errors.js.map +1 -1
  14. package/dist/core/index.d.ts +3 -2
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js +3 -2
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/provisioner-tokens.d.ts +33 -0
  19. package/dist/core/provisioner-tokens.d.ts.map +1 -1
  20. package/dist/core/provisioner-tokens.js +107 -2
  21. package/dist/core/provisioner-tokens.js.map +1 -1
  22. package/dist/db/admin-runner-instances.d.ts +34 -0
  23. package/dist/db/admin-runner-instances.d.ts.map +1 -0
  24. package/dist/db/admin-runner-instances.js +62 -0
  25. package/dist/db/admin-runner-instances.js.map +1 -0
  26. package/dist/db/db.d.ts +290 -0
  27. package/dist/db/db.d.ts.map +1 -1
  28. package/dist/db/db.js +2 -0
  29. package/dist/db/db.js.map +1 -1
  30. package/dist/db/index.d.ts +3 -1
  31. package/dist/db/index.d.ts.map +1 -1
  32. package/dist/db/index.js +2 -1
  33. package/dist/db/index.js.map +1 -1
  34. package/dist/db/job-executions.d.ts.map +1 -1
  35. package/dist/db/job-executions.js +11 -0
  36. package/dist/db/job-executions.js.map +1 -1
  37. package/dist/db/provisioner-tokens.d.ts +38 -0
  38. package/dist/db/provisioner-tokens.d.ts.map +1 -1
  39. package/dist/db/provisioner-tokens.js +157 -3
  40. package/dist/db/provisioner-tokens.js.map +1 -1
  41. package/dist/db/reservations.d.ts.map +1 -1
  42. package/dist/db/reservations.js +60 -8
  43. package/dist/db/reservations.js.map +1 -1
  44. package/dist/db/schema/admin-command-results.d.ts +134 -0
  45. package/dist/db/schema/admin-command-results.d.ts.map +1 -0
  46. package/dist/db/schema/admin-command-results.js +18 -0
  47. package/dist/db/schema/admin-command-results.js.map +1 -0
  48. package/dist/db/schema/runner-instances.d.ts +17 -0
  49. package/dist/db/schema/runner-instances.d.ts.map +1 -1
  50. package/dist/db/schema/runner-instances.js +3 -0
  51. package/dist/db/schema/runner-instances.js.map +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +6 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/presentation/dto/admin-provisioner-token.d.ts +16 -0
  56. package/dist/presentation/dto/admin-provisioner-token.d.ts.map +1 -0
  57. package/dist/presentation/dto/admin-provisioner-token.js +22 -0
  58. package/dist/presentation/dto/admin-provisioner-token.js.map +1 -0
  59. package/dist/presentation/dto/admin-runner-instances.d.ts +23 -0
  60. package/dist/presentation/dto/admin-runner-instances.d.ts.map +1 -0
  61. package/dist/presentation/dto/admin-runner-instances.js +19 -0
  62. package/dist/presentation/dto/admin-runner-instances.js.map +1 -0
  63. package/dist/presentation/dto/index.d.ts +2 -0
  64. package/dist/presentation/dto/index.d.ts.map +1 -1
  65. package/dist/presentation/dto/index.js +2 -0
  66. package/dist/presentation/dto/index.js.map +1 -1
  67. package/dist/presentation/routes/admin-provisioner-tokens.d.ts +4 -0
  68. package/dist/presentation/routes/admin-provisioner-tokens.d.ts.map +1 -0
  69. package/dist/presentation/routes/admin-provisioner-tokens.js +167 -0
  70. package/dist/presentation/routes/admin-provisioner-tokens.js.map +1 -0
  71. package/dist/presentation/routes/admin-runner-instances.d.ts +3 -0
  72. package/dist/presentation/routes/admin-runner-instances.d.ts.map +1 -0
  73. package/dist/presentation/routes/admin-runner-instances.js +63 -0
  74. package/dist/presentation/routes/admin-runner-instances.js.map +1 -0
  75. package/dist/presentation/routes/index.d.ts.map +1 -1
  76. package/dist/presentation/routes/index.js +11 -1
  77. package/dist/presentation/routes/index.js.map +1 -1
  78. package/dist/presentation/routes/runner-enrollment.d.ts +1 -0
  79. package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -1
  80. package/dist/presentation/routes/runner-enrollment.js +11 -4
  81. package/dist/presentation/routes/runner-enrollment.js.map +1 -1
  82. package/dist/tsconfig.test.tsbuildinfo +1 -1
  83. package/drizzle/0002_special_shadowcat.sql +1 -0
  84. package/drizzle/0003_flaky_sally_floyd.sql +11 -0
  85. package/drizzle/meta/0002_snapshot.json +2099 -0
  86. package/drizzle/meta/0003_snapshot.json +2178 -0
  87. package/drizzle/meta/_journal.json +14 -0
  88. package/package.json +8 -7
  89. package/src/config.test.ts +11 -0
  90. package/src/config.ts +19 -8
  91. package/src/core/admin-runner-instances.ts +125 -0
  92. package/src/core/errors.ts +14 -0
  93. package/src/core/index.ts +12 -0
  94. package/src/core/provisioner-tokens.ts +157 -1
  95. package/src/db/admin-runner-instances.ts +121 -0
  96. package/src/db/db.ts +2 -0
  97. package/src/db/index.ts +10 -0
  98. package/src/db/job-executions.test.ts +17 -0
  99. package/src/db/job-executions.ts +22 -0
  100. package/src/db/provisioner-tokens.ts +263 -9
  101. package/src/db/reservations.test.ts +253 -0
  102. package/src/db/reservations.ts +170 -15
  103. package/src/db/schema/admin-command-results.ts +29 -0
  104. package/src/db/schema/runner-instances.ts +1 -0
  105. package/src/index.test.ts +1 -1
  106. package/src/index.ts +6 -1
  107. package/src/presentation/dto/admin-provisioner-token.ts +23 -0
  108. package/src/presentation/dto/admin-runner-instances.ts +19 -0
  109. package/src/presentation/dto/index.ts +2 -0
  110. package/src/presentation/routes/admin-provisioner-tokens.test.ts +227 -0
  111. package/src/presentation/routes/admin-provisioner-tokens.ts +177 -0
  112. package/src/presentation/routes/admin-runner-instances.test.ts +671 -0
  113. package/src/presentation/routes/admin-runner-instances.ts +67 -0
  114. package/src/presentation/routes/index.ts +8 -0
  115. package/src/presentation/routes/runner-enrollment.test.ts +60 -2
  116. package/src/presentation/routes/runner-enrollment.ts +24 -4
  117. package/test/globalSetup.ts +1 -0
  118. package/tsconfig.build.tsbuildinfo +1 -1
package/dist/db/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/db/db.ts"],"sourcesContent":["import {drizzle, type NodePgDatabase} from '@shipfox/node-drizzle';\nimport {pgClient} from '@shipfox/node-postgres';\nimport {ephemeralRegistrationTokens} from './schema/ephemeral-registration-tokens.js';\nimport {manualRegistrationTokens} from './schema/manual-registration-tokens.js';\nimport {runnersOutbox} from './schema/outbox.js';\nimport {pendingJobExecutions} from './schema/pending-job-executions.js';\nimport {provisionerCapabilitySnapshots} from './schema/provisioner-capability-snapshots.js';\nimport {provisionerTokens} from './schema/provisioner-tokens.js';\nimport {runnersRateLimits} from './schema/rate-limits.js';\nimport {reservations} from './schema/reservations.js';\nimport {runnerActivationTokens} from './schema/runner-activation-tokens.js';\nimport {runnerBootstrapTokens, runnerControlSessions} from './schema/runner-control-sessions.js';\nimport {providerRunners} from './schema/runner-instances.js';\nimport {runnerSessions} from './schema/runner-sessions.js';\nimport {runningJobExecutions} from './schema/running-job-executions.js';\n\nexport const schema = {\n ephemeralRegistrationTokens,\n pendingJobExecutions,\n providerRunners,\n provisionerCapabilitySnapshots,\n provisionerTokens,\n runnersRateLimits,\n reservations,\n runnerSessions,\n runnerBootstrapTokens,\n runnerControlSessions,\n runnerActivationTokens,\n manualRegistrationTokens,\n runningJobExecutions,\n runnersOutbox,\n};\n\nlet _db: NodePgDatabase<typeof schema> | undefined;\n\nexport function db() {\n if (!_db) _db = drizzle(pgClient(), {schema});\n return _db;\n}\n\nexport function closeDb(): void {\n _db = undefined;\n}\n\nexport type Tx = Parameters<Parameters<NodePgDatabase<typeof schema>['transaction']>[0]>[0];\n"],"names":["drizzle","pgClient","ephemeralRegistrationTokens","manualRegistrationTokens","runnersOutbox","pendingJobExecutions","provisionerCapabilitySnapshots","provisionerTokens","runnersRateLimits","reservations","runnerActivationTokens","runnerBootstrapTokens","runnerControlSessions","providerRunners","runnerSessions","runningJobExecutions","schema","_db","db","closeDb","undefined"],"mappings":"AAAA,SAAQA,OAAO,QAA4B,wBAAwB;AACnE,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,2BAA2B,QAAO,4CAA4C;AACtF,SAAQC,wBAAwB,QAAO,yCAAyC;AAChF,SAAQC,aAAa,QAAO,qBAAqB;AACjD,SAAQC,oBAAoB,QAAO,qCAAqC;AACxE,SAAQC,8BAA8B,QAAO,+CAA+C;AAC5F,SAAQC,iBAAiB,QAAO,iCAAiC;AACjE,SAAQC,iBAAiB,QAAO,0BAA0B;AAC1D,SAAQC,YAAY,QAAO,2BAA2B;AACtD,SAAQC,sBAAsB,QAAO,uCAAuC;AAC5E,SAAQC,qBAAqB,EAAEC,qBAAqB,QAAO,sCAAsC;AACjG,SAAQC,eAAe,QAAO,+BAA+B;AAC7D,SAAQC,cAAc,QAAO,8BAA8B;AAC3D,SAAQC,oBAAoB,QAAO,qCAAqC;AAExE,OAAO,MAAMC,SAAS;IACpBd;IACAG;IACAQ;IACAP;IACAC;IACAC;IACAC;IACAK;IACAH;IACAC;IACAF;IACAP;IACAY;IACAX;AACF,EAAE;AAEF,IAAIa;AAEJ,OAAO,SAASC;IACd,IAAI,CAACD,KAAKA,MAAMjB,QAAQC,YAAY;QAACe;IAAM;IAC3C,OAAOC;AACT;AAEA,OAAO,SAASE;IACdF,MAAMG;AACR"}
1
+ {"version":3,"sources":["../../src/db/db.ts"],"sourcesContent":["import {drizzle, type NodePgDatabase} from '@shipfox/node-drizzle';\nimport {pgClient} from '@shipfox/node-postgres';\nimport {runnersAdminCommandResults} from './schema/admin-command-results.js';\nimport {ephemeralRegistrationTokens} from './schema/ephemeral-registration-tokens.js';\nimport {manualRegistrationTokens} from './schema/manual-registration-tokens.js';\nimport {runnersOutbox} from './schema/outbox.js';\nimport {pendingJobExecutions} from './schema/pending-job-executions.js';\nimport {provisionerCapabilitySnapshots} from './schema/provisioner-capability-snapshots.js';\nimport {provisionerTokens} from './schema/provisioner-tokens.js';\nimport {runnersRateLimits} from './schema/rate-limits.js';\nimport {reservations} from './schema/reservations.js';\nimport {runnerActivationTokens} from './schema/runner-activation-tokens.js';\nimport {runnerBootstrapTokens, runnerControlSessions} from './schema/runner-control-sessions.js';\nimport {providerRunners} from './schema/runner-instances.js';\nimport {runnerSessions} from './schema/runner-sessions.js';\nimport {runningJobExecutions} from './schema/running-job-executions.js';\n\nexport const schema = {\n runnersAdminCommandResults,\n ephemeralRegistrationTokens,\n pendingJobExecutions,\n providerRunners,\n provisionerCapabilitySnapshots,\n provisionerTokens,\n runnersRateLimits,\n reservations,\n runnerSessions,\n runnerBootstrapTokens,\n runnerControlSessions,\n runnerActivationTokens,\n manualRegistrationTokens,\n runningJobExecutions,\n runnersOutbox,\n};\n\nlet _db: NodePgDatabase<typeof schema> | undefined;\n\nexport function db() {\n if (!_db) _db = drizzle(pgClient(), {schema});\n return _db;\n}\n\nexport function closeDb(): void {\n _db = undefined;\n}\n\nexport type Tx = Parameters<Parameters<NodePgDatabase<typeof schema>['transaction']>[0]>[0];\n"],"names":["drizzle","pgClient","runnersAdminCommandResults","ephemeralRegistrationTokens","manualRegistrationTokens","runnersOutbox","pendingJobExecutions","provisionerCapabilitySnapshots","provisionerTokens","runnersRateLimits","reservations","runnerActivationTokens","runnerBootstrapTokens","runnerControlSessions","providerRunners","runnerSessions","runningJobExecutions","schema","_db","db","closeDb","undefined"],"mappings":"AAAA,SAAQA,OAAO,QAA4B,wBAAwB;AACnE,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,0BAA0B,QAAO,oCAAoC;AAC7E,SAAQC,2BAA2B,QAAO,4CAA4C;AACtF,SAAQC,wBAAwB,QAAO,yCAAyC;AAChF,SAAQC,aAAa,QAAO,qBAAqB;AACjD,SAAQC,oBAAoB,QAAO,qCAAqC;AACxE,SAAQC,8BAA8B,QAAO,+CAA+C;AAC5F,SAAQC,iBAAiB,QAAO,iCAAiC;AACjE,SAAQC,iBAAiB,QAAO,0BAA0B;AAC1D,SAAQC,YAAY,QAAO,2BAA2B;AACtD,SAAQC,sBAAsB,QAAO,uCAAuC;AAC5E,SAAQC,qBAAqB,EAAEC,qBAAqB,QAAO,sCAAsC;AACjG,SAAQC,eAAe,QAAO,+BAA+B;AAC7D,SAAQC,cAAc,QAAO,8BAA8B;AAC3D,SAAQC,oBAAoB,QAAO,qCAAqC;AAExE,OAAO,MAAMC,SAAS;IACpBf;IACAC;IACAG;IACAQ;IACAP;IACAC;IACAC;IACAC;IACAK;IACAH;IACAC;IACAF;IACAP;IACAY;IACAX;AACF,EAAE;AAEF,IAAIa;AAEJ,OAAO,SAASC;IACd,IAAI,CAACD,KAAKA,MAAMlB,QAAQC,YAAY;QAACgB;IAAM;IAC3C,OAAOC;AACT;AAEA,OAAO,SAASE;IACdF,MAAMG;AACR"}
@@ -1,3 +1,5 @@
1
+ export type { AdministratorRunnerAssignmentFilter, AdministratorRunnerInstanceRow, ListAdministratorRunnerInstancesParams, ListAdministratorRunnerInstancesResult, } from './admin-runner-instances.js';
2
+ export { listAdministratorRunnerInstances } from './admin-runner-instances.js';
1
3
  export { closeDb, db, schema } from './db.js';
2
4
  export type { CreateEphemeralRegistrationTokenParams, DeleteExpiredEphemeralRegistrationTokensParams, } from './ephemeral-registration-tokens.js';
3
5
  export { createEphemeralRegistrationToken, createRunnerSessionConsumingEphemeralToken, deleteExpiredEphemeralRegistrationTokens, resolveEphemeralRegistrationTokenByHash, } from './ephemeral-registration-tokens.js';
@@ -7,7 +9,7 @@ export type { CreateManualRegistrationTokenParams } from './manual-registration-
7
9
  export { createManualRegistrationToken, listUsableManualRegistrationTokensByWorkspaceId, resolveManualRegistrationTokenByHash, revokeManualRegistrationToken, } from './manual-registration-tokens.js';
8
10
  export { hasActiveWorkspaceProvisionerCapability, listActiveWorkspaceProvisionerCapabilitySnapshots, listStaleWorkspaceProvisionerCapabilitySnapshots, publishWorkspaceProvisionerCapabilitySnapshot, } from './provisioner-capability-snapshots.js';
9
11
  export type { CreateProvisionerTokenParams } from './provisioner-tokens.js';
10
- export { createProvisionerToken, listActiveProvisionerTokens, listUsableProvisionerTokensByWorkspaceId, resolveProvisionerTokenByHash, revokeProvisionerToken, touchProvisionerLastSeen, } from './provisioner-tokens.js';
12
+ export { createInstallationProvisionerTokenWithAudit, createProvisionerToken, listActiveProvisionerTokens, listInstallationProvisionerTokens, listUsableProvisionerTokensByWorkspaceId, resolveProvisionerTokenByHash, revokeInstallationProvisionerTokenWithAudit, revokeProvisionerToken, touchProvisionerLastSeen, } from './provisioner-tokens.js';
11
13
  export { consumeRunnersRateLimit, pruneExpiredRunnersRateLimits, } from './rate-limits.js';
12
14
  export type { DemandStat, PollDemandAndReserveParams, ReservationGrant, ReservationTemplate, } from './reservations.js';
13
15
  export { deleteExpiredReservations, deleteReservationsByIds, pollDemandAndReserve, releaseReservationUnits, } from './reservations.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,sCAAsC,EACtC,8CAA8C,GAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gCAAgC,EAChC,0CAA0C,EAC1C,wCAAwC,EACxC,uCAAuC,GACxC,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,8BAA8B,EAC9B,0CAA0C,EAC1C,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAC,mCAAmC,EAAC,MAAM,iCAAiC,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,+CAA+C,EAC/C,oCAAoC,EACpC,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,uCAAuC,EACvC,iDAAiD,EACjD,gDAAgD,EAChD,6CAA6C,GAC9C,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EAAC,4BAA4B,EAAC,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,wCAAwC,EACxC,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EACV,iCAAiC,EACjC,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,0CAA0C,EAC1C,yBAAyB,EACzB,oCAAoC,EACpC,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,mBAAmB,EAAE,2BAA2B,EAAC,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,qBAAqB,EAAE,qBAAqB,EAAC,MAAM,qCAAqC,CAAC;AAEjG,eAAO,MAAM,cAAc,QAAoE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,mCAAmC,EACnC,8BAA8B,EAC9B,sCAAsC,EACtC,sCAAsC,GACvC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,gCAAgC,EAAC,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,sCAAsC,EACtC,8CAA8C,GAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gCAAgC,EAChC,0CAA0C,EAC1C,wCAAwC,EACxC,uCAAuC,GACxC,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,mBAAmB,EACnB,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,8BAA8B,EAC9B,0CAA0C,EAC1C,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAC,mCAAmC,EAAC,MAAM,iCAAiC,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,+CAA+C,EAC/C,oCAAoC,EACpC,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,uCAAuC,EACvC,iDAAiD,EACjD,gDAAgD,EAChD,6CAA6C,GAC9C,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EAAC,4BAA4B,EAAC,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EACL,2CAA2C,EAC3C,sBAAsB,EACtB,2BAA2B,EAC3B,iCAAiC,EACjC,wCAAwC,EACxC,6BAA6B,EAC7B,2CAA2C,EAC3C,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,UAAU,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EACV,iCAAiC,EACjC,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,0CAA0C,EAC1C,yBAAyB,EACzB,oCAAoC,EACpC,+BAA+B,EAC/B,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAC,mBAAmB,EAAE,2BAA2B,EAAC,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,qBAAqB,EAAE,qBAAqB,EAAC,MAAM,qCAAqC,CAAC;AAEjG,eAAO,MAAM,cAAc,QAAoE,CAAC"}
package/dist/db/index.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import { dirname, resolve } from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
+ export { listAdministratorRunnerInstances } from './admin-runner-instances.js';
3
4
  export { closeDb, db, schema } from './db.js';
4
5
  export { createEphemeralRegistrationToken, createRunnerSessionConsumingEphemeralToken, deleteExpiredEphemeralRegistrationTokens, resolveEphemeralRegistrationTokenByHash } from './ephemeral-registration-tokens.js';
5
6
  export { cancelRunnerJobs, claimPendingJobExecution, enqueueJobExecution, expireStuckJobExecutions, getWorkspaceJobCounts, isJobLeaseActive, listActiveRunningJobExecutions, listRunningJobExecutionsByRunnerInstanceTx, recordHeartbeat, releaseJobExecution } from './job-executions.js';
6
7
  export { createManualRegistrationToken, listUsableManualRegistrationTokensByWorkspaceId, resolveManualRegistrationTokenByHash, revokeManualRegistrationToken } from './manual-registration-tokens.js';
7
8
  export { hasActiveWorkspaceProvisionerCapability, listActiveWorkspaceProvisionerCapabilitySnapshots, listStaleWorkspaceProvisionerCapabilitySnapshots, publishWorkspaceProvisionerCapabilitySnapshot } from './provisioner-capability-snapshots.js';
8
- export { createProvisionerToken, listActiveProvisionerTokens, listUsableProvisionerTokensByWorkspaceId, resolveProvisionerTokenByHash, revokeProvisionerToken, touchProvisionerLastSeen } from './provisioner-tokens.js';
9
+ export { createInstallationProvisionerTokenWithAudit, createProvisionerToken, listActiveProvisionerTokens, listInstallationProvisionerTokens, listUsableProvisionerTokensByWorkspaceId, resolveProvisionerTokenByHash, revokeInstallationProvisionerTokenWithAudit, revokeProvisionerToken, touchProvisionerLastSeen } from './provisioner-tokens.js';
9
10
  export { consumeRunnersRateLimit, pruneExpiredRunnersRateLimits } from './rate-limits.js';
10
11
  export { deleteExpiredReservations, deleteReservationsByIds, pollDemandAndReserve, releaseReservationUnits } from './reservations.js';
11
12
  export { assignRunnerInstances } from './runner-assignments.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {closeDb, db, schema} from './db.js';\nexport type {\n CreateEphemeralRegistrationTokenParams,\n DeleteExpiredEphemeralRegistrationTokensParams,\n} from './ephemeral-registration-tokens.js';\nexport {\n createEphemeralRegistrationToken,\n createRunnerSessionConsumingEphemeralToken,\n deleteExpiredEphemeralRegistrationTokens,\n resolveEphemeralRegistrationTokenByHash,\n} from './ephemeral-registration-tokens.js';\nexport type {\n ClaimedJobExecution,\n EnqueueJobExecutionParams,\n RunnerInstanceBoundJobExecution,\n} from './job-executions.js';\nexport {\n cancelRunnerJobs,\n claimPendingJobExecution,\n enqueueJobExecution,\n expireStuckJobExecutions,\n getWorkspaceJobCounts,\n isJobLeaseActive,\n listActiveRunningJobExecutions,\n listRunningJobExecutionsByRunnerInstanceTx,\n recordHeartbeat,\n releaseJobExecution,\n} from './job-executions.js';\nexport type {CreateManualRegistrationTokenParams} from './manual-registration-tokens.js';\nexport {\n createManualRegistrationToken,\n listUsableManualRegistrationTokensByWorkspaceId,\n resolveManualRegistrationTokenByHash,\n revokeManualRegistrationToken,\n} from './manual-registration-tokens.js';\nexport {\n hasActiveWorkspaceProvisionerCapability,\n listActiveWorkspaceProvisionerCapabilitySnapshots,\n listStaleWorkspaceProvisionerCapabilitySnapshots,\n publishWorkspaceProvisionerCapabilitySnapshot,\n} from './provisioner-capability-snapshots.js';\nexport type {CreateProvisionerTokenParams} from './provisioner-tokens.js';\nexport {\n createProvisionerToken,\n listActiveProvisionerTokens,\n listUsableProvisionerTokensByWorkspaceId,\n resolveProvisionerTokenByHash,\n revokeProvisionerToken,\n touchProvisionerLastSeen,\n} from './provisioner-tokens.js';\nexport {\n consumeRunnersRateLimit,\n pruneExpiredRunnersRateLimits,\n} from './rate-limits.js';\nexport type {\n DemandStat,\n PollDemandAndReserveParams,\n ReservationGrant,\n ReservationTemplate,\n} from './reservations.js';\nexport {\n deleteExpiredReservations,\n deleteReservationsByIds,\n pollDemandAndReserve,\n releaseReservationUnits,\n} from './reservations.js';\nexport {assignRunnerInstances} from './runner-assignments.js';\nexport type {\n ActiveRunnerInstanceTemplateCount,\n ReapStaleRunnerInstancesResult,\n ReconcileRunnerInstancesDbResult,\n ReconcileRunnerInstancesParams,\n ReportRunnerInstancesParams,\n RunnerInstanceReportEvent,\n RunnerInstanceTerminateIntent,\n RunnerInstanceTerminateIntentReason,\n} from './runner-instances.js';\nexport {\n attachRunnerInstanceProviderId,\n isTerminalState,\n listActiveRunnerInstanceCountsByTemplateTx,\n listActiveRunnerInstances,\n listProvisionerTerminateIntentRowsTx,\n listProvisionerTerminateIntents,\n reapStaleRunnerInstances,\n reconcileRunnerInstances,\n reportRunnerInstances,\n} from './runner-instances.js';\nexport type {\n CreateRunnerSessionParams,\n DeleteExpiredRunnerSessionsParams,\n} from './runner-sessions.js';\nexport {createRunnerSession, deleteExpiredRunnerSessions} from './runner-sessions.js';\nexport {runnersOutbox} from './schema/outbox.js';\nexport {runnerBootstrapTokens, runnerControlSessions} from './schema/runner-control-sessions.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","closeDb","db","schema","createEphemeralRegistrationToken","createRunnerSessionConsumingEphemeralToken","deleteExpiredEphemeralRegistrationTokens","resolveEphemeralRegistrationTokenByHash","cancelRunnerJobs","claimPendingJobExecution","enqueueJobExecution","expireStuckJobExecutions","getWorkspaceJobCounts","isJobLeaseActive","listActiveRunningJobExecutions","listRunningJobExecutionsByRunnerInstanceTx","recordHeartbeat","releaseJobExecution","createManualRegistrationToken","listUsableManualRegistrationTokensByWorkspaceId","resolveManualRegistrationTokenByHash","revokeManualRegistrationToken","hasActiveWorkspaceProvisionerCapability","listActiveWorkspaceProvisionerCapabilitySnapshots","listStaleWorkspaceProvisionerCapabilitySnapshots","publishWorkspaceProvisionerCapabilitySnapshot","createProvisionerToken","listActiveProvisionerTokens","listUsableProvisionerTokensByWorkspaceId","resolveProvisionerTokenByHash","revokeProvisionerToken","touchProvisionerLastSeen","consumeRunnersRateLimit","pruneExpiredRunnersRateLimits","deleteExpiredReservations","deleteReservationsByIds","pollDemandAndReserve","releaseReservationUnits","assignRunnerInstances","attachRunnerInstanceProviderId","isTerminalState","listActiveRunnerInstanceCountsByTemplateTx","listActiveRunnerInstances","listProvisionerTerminateIntentRowsTx","listProvisionerTerminateIntents","reapStaleRunnerInstances","reconcileRunnerInstances","reportRunnerInstances","createRunnerSession","deleteExpiredRunnerSessions","runnersOutbox","runnerBootstrapTokens","runnerControlSessions","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAK5C,SACEC,gCAAgC,EAChCC,0CAA0C,EAC1CC,wCAAwC,EACxCC,uCAAuC,QAClC,qCAAqC;AAM5C,SACEC,gBAAgB,EAChBC,wBAAwB,EACxBC,mBAAmB,EACnBC,wBAAwB,EACxBC,qBAAqB,EACrBC,gBAAgB,EAChBC,8BAA8B,EAC9BC,0CAA0C,EAC1CC,eAAe,EACfC,mBAAmB,QACd,sBAAsB;AAE7B,SACEC,6BAA6B,EAC7BC,+CAA+C,EAC/CC,oCAAoC,EACpCC,6BAA6B,QACxB,kCAAkC;AACzC,SACEC,uCAAuC,EACvCC,iDAAiD,EACjDC,gDAAgD,EAChDC,6CAA6C,QACxC,wCAAwC;AAE/C,SACEC,sBAAsB,EACtBC,2BAA2B,EAC3BC,wCAAwC,EACxCC,6BAA6B,EAC7BC,sBAAsB,EACtBC,wBAAwB,QACnB,0BAA0B;AACjC,SACEC,uBAAuB,EACvBC,6BAA6B,QACxB,mBAAmB;AAO1B,SACEC,yBAAyB,EACzBC,uBAAuB,EACvBC,oBAAoB,EACpBC,uBAAuB,QAClB,oBAAoB;AAC3B,SAAQC,qBAAqB,QAAO,0BAA0B;AAW9D,SACEC,8BAA8B,EAC9BC,eAAe,EACfC,0CAA0C,EAC1CC,yBAAyB,EACzBC,oCAAoC,EACpCC,+BAA+B,EAC/BC,wBAAwB,EACxBC,wBAAwB,EACxBC,qBAAqB,QAChB,wBAAwB;AAK/B,SAAQC,mBAAmB,EAAEC,2BAA2B,QAAO,uBAAuB;AACtF,SAAQC,aAAa,QAAO,qBAAqB;AACjD,SAAQC,qBAAqB,EAAEC,qBAAqB,QAAO,sCAAsC;AAEjG,OAAO,MAAMC,iBAAiBtD,QAAQD,QAAQE,cAAc,YAAYsD,GAAG,IAAI,iBAAiB"}
1
+ {"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport type {\n AdministratorRunnerAssignmentFilter,\n AdministratorRunnerInstanceRow,\n ListAdministratorRunnerInstancesParams,\n ListAdministratorRunnerInstancesResult,\n} from './admin-runner-instances.js';\nexport {listAdministratorRunnerInstances} from './admin-runner-instances.js';\nexport {closeDb, db, schema} from './db.js';\nexport type {\n CreateEphemeralRegistrationTokenParams,\n DeleteExpiredEphemeralRegistrationTokensParams,\n} from './ephemeral-registration-tokens.js';\nexport {\n createEphemeralRegistrationToken,\n createRunnerSessionConsumingEphemeralToken,\n deleteExpiredEphemeralRegistrationTokens,\n resolveEphemeralRegistrationTokenByHash,\n} from './ephemeral-registration-tokens.js';\nexport type {\n ClaimedJobExecution,\n EnqueueJobExecutionParams,\n RunnerInstanceBoundJobExecution,\n} from './job-executions.js';\nexport {\n cancelRunnerJobs,\n claimPendingJobExecution,\n enqueueJobExecution,\n expireStuckJobExecutions,\n getWorkspaceJobCounts,\n isJobLeaseActive,\n listActiveRunningJobExecutions,\n listRunningJobExecutionsByRunnerInstanceTx,\n recordHeartbeat,\n releaseJobExecution,\n} from './job-executions.js';\nexport type {CreateManualRegistrationTokenParams} from './manual-registration-tokens.js';\nexport {\n createManualRegistrationToken,\n listUsableManualRegistrationTokensByWorkspaceId,\n resolveManualRegistrationTokenByHash,\n revokeManualRegistrationToken,\n} from './manual-registration-tokens.js';\nexport {\n hasActiveWorkspaceProvisionerCapability,\n listActiveWorkspaceProvisionerCapabilitySnapshots,\n listStaleWorkspaceProvisionerCapabilitySnapshots,\n publishWorkspaceProvisionerCapabilitySnapshot,\n} from './provisioner-capability-snapshots.js';\nexport type {CreateProvisionerTokenParams} from './provisioner-tokens.js';\nexport {\n createInstallationProvisionerTokenWithAudit,\n createProvisionerToken,\n listActiveProvisionerTokens,\n listInstallationProvisionerTokens,\n listUsableProvisionerTokensByWorkspaceId,\n resolveProvisionerTokenByHash,\n revokeInstallationProvisionerTokenWithAudit,\n revokeProvisionerToken,\n touchProvisionerLastSeen,\n} from './provisioner-tokens.js';\nexport {\n consumeRunnersRateLimit,\n pruneExpiredRunnersRateLimits,\n} from './rate-limits.js';\nexport type {\n DemandStat,\n PollDemandAndReserveParams,\n ReservationGrant,\n ReservationTemplate,\n} from './reservations.js';\nexport {\n deleteExpiredReservations,\n deleteReservationsByIds,\n pollDemandAndReserve,\n releaseReservationUnits,\n} from './reservations.js';\nexport {assignRunnerInstances} from './runner-assignments.js';\nexport type {\n ActiveRunnerInstanceTemplateCount,\n ReapStaleRunnerInstancesResult,\n ReconcileRunnerInstancesDbResult,\n ReconcileRunnerInstancesParams,\n ReportRunnerInstancesParams,\n RunnerInstanceReportEvent,\n RunnerInstanceTerminateIntent,\n RunnerInstanceTerminateIntentReason,\n} from './runner-instances.js';\nexport {\n attachRunnerInstanceProviderId,\n isTerminalState,\n listActiveRunnerInstanceCountsByTemplateTx,\n listActiveRunnerInstances,\n listProvisionerTerminateIntentRowsTx,\n listProvisionerTerminateIntents,\n reapStaleRunnerInstances,\n reconcileRunnerInstances,\n reportRunnerInstances,\n} from './runner-instances.js';\nexport type {\n CreateRunnerSessionParams,\n DeleteExpiredRunnerSessionsParams,\n} from './runner-sessions.js';\nexport {createRunnerSession, deleteExpiredRunnerSessions} from './runner-sessions.js';\nexport {runnersOutbox} from './schema/outbox.js';\nexport {runnerBootstrapTokens, runnerControlSessions} from './schema/runner-control-sessions.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","listAdministratorRunnerInstances","closeDb","db","schema","createEphemeralRegistrationToken","createRunnerSessionConsumingEphemeralToken","deleteExpiredEphemeralRegistrationTokens","resolveEphemeralRegistrationTokenByHash","cancelRunnerJobs","claimPendingJobExecution","enqueueJobExecution","expireStuckJobExecutions","getWorkspaceJobCounts","isJobLeaseActive","listActiveRunningJobExecutions","listRunningJobExecutionsByRunnerInstanceTx","recordHeartbeat","releaseJobExecution","createManualRegistrationToken","listUsableManualRegistrationTokensByWorkspaceId","resolveManualRegistrationTokenByHash","revokeManualRegistrationToken","hasActiveWorkspaceProvisionerCapability","listActiveWorkspaceProvisionerCapabilitySnapshots","listStaleWorkspaceProvisionerCapabilitySnapshots","publishWorkspaceProvisionerCapabilitySnapshot","createInstallationProvisionerTokenWithAudit","createProvisionerToken","listActiveProvisionerTokens","listInstallationProvisionerTokens","listUsableProvisionerTokensByWorkspaceId","resolveProvisionerTokenByHash","revokeInstallationProvisionerTokenWithAudit","revokeProvisionerToken","touchProvisionerLastSeen","consumeRunnersRateLimit","pruneExpiredRunnersRateLimits","deleteExpiredReservations","deleteReservationsByIds","pollDemandAndReserve","releaseReservationUnits","assignRunnerInstances","attachRunnerInstanceProviderId","isTerminalState","listActiveRunnerInstanceCountsByTemplateTx","listActiveRunnerInstances","listProvisionerTerminateIntentRowsTx","listProvisionerTerminateIntents","reapStaleRunnerInstances","reconcileRunnerInstances","reportRunnerInstances","createRunnerSession","deleteExpiredRunnerSessions","runnersOutbox","runnerBootstrapTokens","runnerControlSessions","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAQvC,SAAQC,gCAAgC,QAAO,8BAA8B;AAC7E,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAK5C,SACEC,gCAAgC,EAChCC,0CAA0C,EAC1CC,wCAAwC,EACxCC,uCAAuC,QAClC,qCAAqC;AAM5C,SACEC,gBAAgB,EAChBC,wBAAwB,EACxBC,mBAAmB,EACnBC,wBAAwB,EACxBC,qBAAqB,EACrBC,gBAAgB,EAChBC,8BAA8B,EAC9BC,0CAA0C,EAC1CC,eAAe,EACfC,mBAAmB,QACd,sBAAsB;AAE7B,SACEC,6BAA6B,EAC7BC,+CAA+C,EAC/CC,oCAAoC,EACpCC,6BAA6B,QACxB,kCAAkC;AACzC,SACEC,uCAAuC,EACvCC,iDAAiD,EACjDC,gDAAgD,EAChDC,6CAA6C,QACxC,wCAAwC;AAE/C,SACEC,2CAA2C,EAC3CC,sBAAsB,EACtBC,2BAA2B,EAC3BC,iCAAiC,EACjCC,wCAAwC,EACxCC,6BAA6B,EAC7BC,2CAA2C,EAC3CC,sBAAsB,EACtBC,wBAAwB,QACnB,0BAA0B;AACjC,SACEC,uBAAuB,EACvBC,6BAA6B,QACxB,mBAAmB;AAO1B,SACEC,yBAAyB,EACzBC,uBAAuB,EACvBC,oBAAoB,EACpBC,uBAAuB,QAClB,oBAAoB;AAC3B,SAAQC,qBAAqB,QAAO,0BAA0B;AAW9D,SACEC,8BAA8B,EAC9BC,eAAe,EACfC,0CAA0C,EAC1CC,yBAAyB,EACzBC,oCAAoC,EACpCC,+BAA+B,EAC/BC,wBAAwB,EACxBC,wBAAwB,EACxBC,qBAAqB,QAChB,wBAAwB;AAK/B,SAAQC,mBAAmB,EAAEC,2BAA2B,QAAO,uBAAuB;AACtF,SAAQC,aAAa,QAAO,qBAAqB;AACjD,SAAQC,qBAAqB,EAAEC,qBAAqB,QAAO,sCAAsC;AAEjG,OAAO,MAAMC,iBAAiB1D,QAAQD,QAAQE,cAAc,YAAY0D,GAAG,IAAI,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"job-executions.d.ts","sourceRoot":"","sources":["../../src/db/job-executions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job-executions.d.ts","sourceRoot":"","sources":["../../src/db/job-executions.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount } from '#metri
8
8
  import { db } from './db.js';
9
9
  import { runnersOutbox } from './schema/outbox.js';
10
10
  import { pendingJobExecutions } from './schema/pending-job-executions.js';
11
+ import { providerRunners } from './schema/runner-instances.js';
11
12
  import { runnerSessions } from './schema/runner-sessions.js';
12
13
  import { runningJobExecutions } from './schema/running-job-executions.js';
13
14
  export async function getWorkspaceJobCounts(params) {
@@ -89,11 +90,13 @@ export async function claimPendingJobExecution(params) {
89
90
  return await db().transaction(async (tx)=>{
90
91
  let provisionerId = null;
91
92
  let providerRunnerId = null;
93
+ let runnerInstanceId = null;
92
94
  if (params.maxClaims !== null) {
93
95
  const [session] = await tx.select({
94
96
  maxClaims: runnerSessions.maxClaims,
95
97
  claimsUsed: runnerSessions.claimsUsed,
96
98
  revokedAt: runnerSessions.revokedAt,
99
+ runnerInstanceId: runnerSessions.runnerInstanceId,
97
100
  provisionerId: runnerSessions.provisionerId,
98
101
  providerRunnerId: runnerSessions.providerRunnerId
99
102
  }).from(runnerSessions).where(eq(runnerSessions.id, params.runnerSessionId)).limit(1).for('update');
@@ -102,6 +105,7 @@ export async function claimPendingJobExecution(params) {
102
105
  }
103
106
  // Ephemeral sessions are the only capped sessions, and the DB check keeps
104
107
  // their provisioned-runner link present as a pair.
108
+ runnerInstanceId = session.runnerInstanceId;
105
109
  provisionerId = session.provisionerId;
106
110
  providerRunnerId = session.providerRunnerId;
107
111
  }
@@ -137,6 +141,13 @@ export async function claimPendingJobExecution(params) {
137
141
  });
138
142
  const claimed = inserted[0];
139
143
  if (!claimed) return null;
144
+ const runnerInstanceCondition = runnerInstanceId ? eq(providerRunners.id, runnerInstanceId) : provisionerId && providerRunnerId ? and(eq(providerRunners.provisionerId, provisionerId), eq(providerRunners.providerRunnerId, providerRunnerId)) : null;
145
+ if (runnerInstanceCondition) {
146
+ await tx.update(providerRunners).set({
147
+ firstClaimedAt: sql`coalesce(${providerRunners.firstClaimedAt}, ${claimed.claimedAt})`,
148
+ updatedAt: sql`now()`
149
+ }).where(runnerInstanceCondition);
150
+ }
140
151
  if (params.maxClaims !== null) {
141
152
  await tx.update(runnerSessions).set({
142
153
  claimsUsed: sql`${runnerSessions.claimsUsed} + 1`,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/db/job-executions.ts"],"sourcesContent":["import {\n RUNNER_JOB_CLAIMED,\n RUNNER_JOB_LEASE_EXPIRED,\n RUNNER_JOB_QUEUED,\n type RunnersEventMap,\n type RunnerToolCapabilitiesDto,\n} from '@shipfox/api-runners-dto';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {writeOutboxEvent, writeOutboxEvents} from '@shipfox/node-outbox';\nimport {canonicalizeLabels} from '@shipfox/runner-labels';\nimport {\n and,\n arrayContained,\n asc,\n count,\n desc,\n eq,\n gt,\n inArray,\n isNotNull,\n isNull,\n lt,\n lte,\n or,\n sql,\n} from 'drizzle-orm';\nimport {\n EmptyRequiredLabelsError,\n RunnerSessionExhaustedError,\n RunningJobExecutionNotFoundError,\n} from '#core/errors.js';\nimport {jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount} from '#metrics/instance.js';\nimport type {Tx} from './db.js';\nimport {db} from './db.js';\nimport {runnersOutbox} from './schema/outbox.js';\nimport {pendingJobExecutions} from './schema/pending-job-executions.js';\nimport {runnerSessions} from './schema/runner-sessions.js';\nimport {runningJobExecutions} from './schema/running-job-executions.js';\n\nexport interface EnqueueJobExecutionParams {\n workspaceId: string;\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n requiredLabels: string[];\n}\n\nexport async function getWorkspaceJobCounts(params: {\n workspaceIds: string[];\n}): Promise<Array<{workspaceId: string; queued: number; running: number}>> {\n const [pendingRows, runningRows] = await Promise.all([\n db()\n .select({workspaceId: pendingJobExecutions.workspaceId, count: count()})\n .from(pendingJobExecutions)\n .where(inArray(pendingJobExecutions.workspaceId, params.workspaceIds))\n .groupBy(pendingJobExecutions.workspaceId),\n db()\n .select({workspaceId: runningJobExecutions.workspaceId, count: count()})\n .from(runningJobExecutions)\n .where(inArray(runningJobExecutions.workspaceId, params.workspaceIds))\n .groupBy(runningJobExecutions.workspaceId),\n ]);\n\n const queuedByWorkspace = new Map(pendingRows.map((row) => [row.workspaceId, Number(row.count)]));\n const runningByWorkspace = new Map(\n runningRows.map((row) => [row.workspaceId, Number(row.count)]),\n );\n\n return params.workspaceIds.map((workspaceId) => ({\n workspaceId,\n queued: queuedByWorkspace.get(workspaceId) ?? 0,\n running: runningByWorkspace.get(workspaceId) ?? 0,\n }));\n}\n\n// Idempotent while the job execution is still pending: a duplicate jobExecutionId already in\n// `runners_pending_jobs` is a no-op. Temporal retries the enqueue activity\n// at-least-once, so a unique-violation throw on a retry-after-lost-result\n// would permanently fail a healthy job execution's workflow. The guard does not extend\n// past the claim: once the job execution has moved to `runners_running_jobs`, a retry\n// can reinsert an orphan pending row, which a later `claimPendingJobExecution` drops\n// via the running-execution unique constraint (onConflictDoNothing) instead of failing.\nexport async function enqueueJobExecution(params: EnqueueJobExecutionParams): Promise<void> {\n const requiredLabels = [...canonicalizeLabels(params.requiredLabels)];\n if (requiredLabels.length === 0) throw new EmptyRequiredLabelsError();\n\n const enqueued = await db().transaction(async (tx) => {\n const [inserted] = await tx\n .insert(pendingJobExecutions)\n .values({\n workspaceId: params.workspaceId,\n workflowRunId: params.workflowRunId,\n workflowRunAttemptId: params.workflowRunAttemptId,\n jobId: params.jobId,\n jobExecutionId: params.jobExecutionId,\n projectId: params.projectId,\n requiredLabels,\n })\n .onConflictDoNothing({target: pendingJobExecutions.jobExecutionId})\n .returning({createdAt: pendingJobExecutions.createdAt});\n\n // A retry that hits the conflict inserts nothing: the first enqueue already\n // emitted the queued event (durably, in the outbox), so re-emitting would\n // only add a redundant row the subscriber coalesces away. Skip it.\n if (!inserted) return false;\n\n await writeOutboxEvent<RunnersEventMap>(tx, runnersOutbox, {\n type: RUNNER_JOB_QUEUED,\n payload: {\n workflowRunId: params.workflowRunId,\n workflowRunAttemptId: params.workflowRunAttemptId,\n jobId: params.jobId,\n jobExecutionId: params.jobExecutionId,\n queuedAt: inserted.createdAt.toISOString(),\n },\n });\n return true;\n });\n\n if (enqueued) jobExecutionEnqueuedCount.add(1);\n}\n\nexport interface ClaimedJobExecution {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n}\n\nexport interface ActiveRunningJobExecution {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n runnerSessionId: string;\n provisionerId: string | null;\n providerRunnerId: string | null;\n requiredLabels: string[];\n runnerLabels: string[];\n startedAt: Date;\n lastHeartbeatAt: Date;\n}\n\nexport interface RunnerInstanceBoundJobExecution {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n providerRunnerId: string;\n startedAt: Date;\n lastHeartbeatAt: Date;\n cancellationRequestedAt: Date | null;\n}\n\nexport async function claimPendingJobExecution(params: {\n workspaceId: string;\n runnerSessionId: string;\n sessionLabels: string[];\n maxClaims: number | null;\n runnerSessionLivenessThrottleSeconds: number;\n}): Promise<ClaimedJobExecution | null> {\n await touchRunnerSessionLiveness({\n workspaceId: params.workspaceId,\n runnerSessionId: params.runnerSessionId,\n throttleSeconds: params.runnerSessionLivenessThrottleSeconds,\n });\n\n if (params.sessionLabels.length === 0) return null;\n\n return await db().transaction(async (tx) => {\n let provisionerId: string | null = null;\n let providerRunnerId: string | null = null;\n\n if (params.maxClaims !== null) {\n const [session] = await tx\n .select({\n maxClaims: runnerSessions.maxClaims,\n claimsUsed: runnerSessions.claimsUsed,\n revokedAt: runnerSessions.revokedAt,\n provisionerId: runnerSessions.provisionerId,\n providerRunnerId: runnerSessions.providerRunnerId,\n })\n .from(runnerSessions)\n .where(eq(runnerSessions.id, params.runnerSessionId))\n .limit(1)\n .for('update');\n\n if (\n !session ||\n session.revokedAt ||\n session.maxClaims === null ||\n session.claimsUsed >= session.maxClaims\n ) {\n throw new RunnerSessionExhaustedError(params.runnerSessionId);\n }\n\n // Ephemeral sessions are the only capped sessions, and the DB check keeps\n // their provisioned-runner link present as a pair.\n provisionerId = session.provisionerId;\n providerRunnerId = session.providerRunnerId;\n }\n\n // `id` is a uuidv7 (time-ordered), so it is a deterministic FIFO tiebreaker\n // for rows sharing a created_at within a batch.\n const [row] = await tx\n .select()\n .from(pendingJobExecutions)\n .where(\n and(\n eq(pendingJobExecutions.workspaceId, params.workspaceId),\n arrayContained(pendingJobExecutions.requiredLabels, params.sessionLabels),\n ),\n )\n .orderBy(asc(pendingJobExecutions.createdAt), asc(pendingJobExecutions.id))\n .limit(1)\n .for('update', {skipLocked: true});\n\n if (!row) return null;\n\n await tx.delete(pendingJobExecutions).where(eq(pendingJobExecutions.id, row.id));\n\n // An enqueue retry that lands after a prior claim can leave an orphan pending\n // row whose jobExecutionId is already in `runners_running_jobs`. Insert-or-skip\n // on the jobExecutionId unique constraint: when the job execution is already running\n // the insert touches no row, so we commit the orphan's deletion and return\n // null rather than let the unique violation roll the claim back into a poison\n // loop. The runner just re-polls for a real job execution.\n const inserted = await tx\n .insert(runningJobExecutions)\n .values({\n workspaceId: row.workspaceId,\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n projectId: row.projectId,\n runnerSessionId: params.runnerSessionId,\n provisionerId,\n providerRunnerId,\n requiredLabels: row.requiredLabels,\n runnerLabels: params.sessionLabels,\n })\n .onConflictDoNothing({target: runningJobExecutions.jobExecutionId})\n .returning({claimedAt: runningJobExecutions.startedAt});\n\n const claimed = inserted[0];\n if (!claimed) return null;\n\n if (params.maxClaims !== null) {\n await tx\n .update(runnerSessions)\n .set({claimsUsed: sql`${runnerSessions.claimsUsed} + 1`, updatedAt: sql`now()`})\n .where(eq(runnerSessions.id, params.runnerSessionId));\n }\n\n // The running-row insert is the runner claiming the job execution. Emit in the same tx; the\n // payload carries the row's own claim instant so a consumer records the true time,\n // not the outbox drain time.\n await writeOutboxEvent<RunnersEventMap>(tx, runnersOutbox, {\n type: RUNNER_JOB_CLAIMED,\n payload: {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n claimedAt: claimed.claimedAt.toISOString(),\n },\n });\n\n return {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n projectId: row.projectId,\n };\n });\n}\n\nasync function touchRunnerSessionLiveness(params: {\n workspaceId: string;\n runnerSessionId: string;\n throttleSeconds: number;\n}): Promise<void> {\n await db()\n .update(runnerSessions)\n .set({updatedAt: sql`now()`})\n .where(\n and(\n eq(runnerSessions.id, params.runnerSessionId),\n eq(runnerSessions.workspaceId, params.workspaceId),\n sql`${runnerSessions.updatedAt} < now() - (${params.throttleSeconds} || ' seconds')::interval`,\n ),\n );\n}\n\n/**\n * Releases a job execution's lease when the orchestration workflow finalizes it: deletes the\n * running-job-execution row AND any lingering pending row for the same execution, in one tx.\n * Idempotent (0-row no-op), no token scope (the workflow is authoritative), and\n * emits no event — the workflow already owns the outcome. Sweeping the pending row\n * too closes the at-least-once window where an enqueue retry left an orphan that a\n * later claim would otherwise pick up for an already-finished job execution.\n */\nexport async function releaseJobExecution(params: {jobExecutionId: string}): Promise<void> {\n await db().transaction(async (tx) => {\n // Delete pending before running to match `claimPendingJobExecution`'s lock-acquisition\n // order (it locks the pending row first, then the running row). A concurrent\n // claim picking up an orphan pending row for this same job execution would otherwise\n // deadlock against the reverse order here.\n await tx\n .delete(pendingJobExecutions)\n .where(eq(pendingJobExecutions.jobExecutionId, params.jobExecutionId));\n await tx\n .delete(runningJobExecutions)\n .where(eq(runningJobExecutions.jobExecutionId, params.jobExecutionId));\n });\n}\n\n/**\n * Reaps stale leases (bounded by `limit`), emitting one\n * `runners.job.lease_expired` event per reaped job execution.\n *\n * The cutoff is re-checked in the DELETE, not just the locking subquery, so a\n * heartbeat landing mid-call spares the live row. Each reaped execution also sweeps its\n * pending row: a failed best-effort `releaseJobExecution` would otherwise leave an orphan\n * that a later claim re-runs as an already-finished job execution.\n *\n * Locks running-then-pending, the inverse of `claimPendingJobExecution` / `releaseJobExecution`.\n * That pre-existing asymmetry opens a narrow deadlock window against a concurrent\n * claim of the same orphan-pending job execution; Postgres breaks it and the cron retries.\n */\nexport async function expireStuckJobExecutions(params: {\n thresholdSeconds: number;\n noFirstHeartbeatGraceSeconds: number;\n limit?: number;\n}): Promise<\n Array<{\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n }>\n> {\n const reaped = await db().transaction(async (tx) => {\n const heartbeatCutoff = sql`now() - (${params.thresholdSeconds} || ' seconds')::interval`;\n const firstHeartbeatCutoff = sql`now() - (${params.noFirstHeartbeatGraceSeconds} || ' seconds')::interval`;\n const stalePredicate = or(\n and(\n isNull(runningJobExecutions.firstHeartbeatAt),\n lte(runningJobExecutions.lastHeartbeatAt, runningJobExecutions.startedAt),\n lt(runningJobExecutions.startedAt, firstHeartbeatCutoff),\n ),\n and(\n or(\n isNotNull(runningJobExecutions.firstHeartbeatAt),\n gt(runningJobExecutions.lastHeartbeatAt, runningJobExecutions.startedAt),\n ),\n lt(runningJobExecutions.lastHeartbeatAt, heartbeatCutoff),\n ),\n );\n\n const staleIds = tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(stalePredicate)\n .orderBy(\n asc(\n sql`CASE WHEN ${runningJobExecutions.firstHeartbeatAt} IS NULL AND ${runningJobExecutions.lastHeartbeatAt} <= ${runningJobExecutions.startedAt} THEN ${runningJobExecutions.startedAt} ELSE ${runningJobExecutions.lastHeartbeatAt} END`,\n ),\n )\n .limit(params.limit ?? 100)\n .for('update', {skipLocked: true});\n\n const deleted = await tx\n .delete(runningJobExecutions)\n .where(and(inArray(runningJobExecutions.id, staleIds), stalePredicate))\n .returning({\n workflowRunId: runningJobExecutions.workflowRunId,\n workflowRunAttemptId: runningJobExecutions.workflowRunAttemptId,\n jobId: runningJobExecutions.jobId,\n jobExecutionId: runningJobExecutions.jobExecutionId,\n });\n\n if (deleted.length === 0) return [];\n\n await tx.delete(pendingJobExecutions).where(\n inArray(\n pendingJobExecutions.jobExecutionId,\n deleted.map((row) => row.jobExecutionId),\n ),\n );\n\n await writeOutboxEvents<RunnersEventMap>(\n tx,\n runnersOutbox,\n deleted.map((row) => ({\n type: RUNNER_JOB_LEASE_EXPIRED,\n payload: {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n },\n })),\n );\n\n return deleted;\n });\n\n if (reaped.length > 0) jobExecutionLeaseExpiredCount.add(reaped.length);\n\n return reaped;\n}\n\nexport async function getJobExecutionQueueDepth(): Promise<{\n pendingJobExecutions: number;\n runningJobExecutions: number;\n}> {\n const [pending] = await db().select({value: count()}).from(pendingJobExecutions);\n const [running] = await db().select({value: count()}).from(runningJobExecutions);\n return {\n pendingJobExecutions: pending?.value ?? 0,\n runningJobExecutions: running?.value ?? 0,\n };\n}\n\nexport async function listActiveRunningJobExecutions(params: {\n workspaceId: string;\n windowSeconds: number;\n limit?: number;\n}): Promise<ActiveRunningJobExecution[]> {\n return await db()\n .select({\n jobId: runningJobExecutions.jobId,\n jobExecutionId: runningJobExecutions.jobExecutionId,\n workflowRunId: runningJobExecutions.workflowRunId,\n workflowRunAttemptId: runningJobExecutions.workflowRunAttemptId,\n projectId: runningJobExecutions.projectId,\n runnerSessionId: runningJobExecutions.runnerSessionId,\n provisionerId: runningJobExecutions.provisionerId,\n providerRunnerId: runningJobExecutions.providerRunnerId,\n requiredLabels: runningJobExecutions.requiredLabels,\n runnerLabels: runningJobExecutions.runnerLabels,\n startedAt: runningJobExecutions.startedAt,\n lastHeartbeatAt: runningJobExecutions.lastHeartbeatAt,\n })\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, params.workspaceId),\n sql`${runningJobExecutions.lastHeartbeatAt} > now() - (${params.windowSeconds} || ' seconds')::interval`,\n ),\n )\n .orderBy(desc(runningJobExecutions.lastHeartbeatAt), desc(runningJobExecutions.id))\n .limit(params.limit ?? 1000);\n}\n\nexport async function listRunningJobExecutionsByRunnerInstanceTx(\n tx: Tx,\n params: {\n workspaceId: string;\n provisionerId: string;\n providerRunnerIds: string[];\n },\n): Promise<RunnerInstanceBoundJobExecution[]> {\n if (params.providerRunnerIds.length === 0) return [];\n\n const duplicateRows = await tx\n .select({\n providerRunnerId: runningJobExecutions.providerRunnerId,\n count: count(),\n })\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, params.workspaceId),\n eq(runningJobExecutions.provisionerId, params.provisionerId),\n inArray(runningJobExecutions.providerRunnerId, params.providerRunnerIds),\n ),\n )\n .groupBy(runningJobExecutions.providerRunnerId)\n .having(sql`count(*) > 1`);\n\n const duplicateRunnerInstanceIds = duplicateRows.flatMap((row) =>\n row.providerRunnerId ? [row.providerRunnerId] : [],\n );\n if (duplicateRunnerInstanceIds.length > 0) {\n logger().warn(\n {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: duplicateRunnerInstanceIds,\n },\n 'multiple running job executions are bound to the same provisioned runner',\n );\n }\n\n const result = await tx.execute<{\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n providerRunnerId: string;\n startedAt: Date | string;\n lastHeartbeatAt: Date | string;\n cancellationRequestedAt: Date | string | null;\n }>(sql`\n SELECT DISTINCT ON (${runningJobExecutions.providerRunnerId})\n ${runningJobExecutions.workflowRunId} AS \"workflowRunId\",\n ${runningJobExecutions.workflowRunAttemptId} AS \"workflowRunAttemptId\",\n ${runningJobExecutions.jobId} AS \"jobId\",\n ${runningJobExecutions.jobExecutionId} AS \"jobExecutionId\",\n ${runningJobExecutions.providerRunnerId} AS \"providerRunnerId\",\n ${runningJobExecutions.startedAt} AS \"startedAt\",\n ${runningJobExecutions.lastHeartbeatAt} AS \"lastHeartbeatAt\",\n ${runningJobExecutions.cancellationRequestedAt} AS \"cancellationRequestedAt\"\n FROM ${runningJobExecutions}\n WHERE\n ${runningJobExecutions.workspaceId} = ${params.workspaceId}\n AND ${runningJobExecutions.provisionerId} = ${params.provisionerId}\n AND ${runningJobExecutions.providerRunnerId} IN (${sql.join(\n params.providerRunnerIds.map((providerRunnerId) => sql`${providerRunnerId}`),\n sql`, `,\n )})\n ORDER BY ${runningJobExecutions.providerRunnerId}, ${runningJobExecutions.startedAt} DESC, ${runningJobExecutions.jobExecutionId} DESC\n `);\n\n return result.rows.map((row) => ({\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n providerRunnerId: row.providerRunnerId,\n startedAt: toDate(row.startedAt),\n lastHeartbeatAt: toDate(row.lastHeartbeatAt),\n cancellationRequestedAt: row.cancellationRequestedAt\n ? toDate(row.cancellationRequestedAt)\n : null,\n }));\n}\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport async function isJobLeaseActive(params: {\n jobId?: string;\n jobExecutionId: string;\n runnerSessionId: string;\n}): Promise<boolean> {\n const [row] = await db()\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.jobExecutionId, params.jobExecutionId),\n eq(runningJobExecutions.runnerSessionId, params.runnerSessionId),\n params.jobId === undefined ? undefined : eq(runningJobExecutions.jobId, params.jobId),\n ),\n )\n .limit(1);\n\n return row !== undefined;\n}\n\nexport async function recordHeartbeat(params: {\n jobExecutionId: string;\n runnerSessionId: string;\n toolCapabilities?: RunnerToolCapabilitiesDto | null;\n}): Promise<{\n cancellationRequested: boolean;\n previousToolCapabilities: RunnerToolCapabilitiesDto | null;\n currentToolCapabilities: RunnerToolCapabilitiesDto | null;\n runningJobExecution: {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n workspaceId: string;\n runnerSessionId: string;\n };\n}> {\n const result = await db().transaction(async (tx) => {\n const updated = await tx\n .update(runningJobExecutions)\n .set({\n firstHeartbeatAt: sql`COALESCE(${runningJobExecutions.firstHeartbeatAt}, now())`,\n lastHeartbeatAt: sql`now()`,\n })\n .where(\n and(\n eq(runningJobExecutions.jobExecutionId, params.jobExecutionId),\n eq(runningJobExecutions.runnerSessionId, params.runnerSessionId),\n ),\n )\n .returning({\n cancellationRequestedAt: runningJobExecutions.cancellationRequestedAt,\n workflowRunId: runningJobExecutions.workflowRunId,\n workflowRunAttemptId: runningJobExecutions.workflowRunAttemptId,\n jobId: runningJobExecutions.jobId,\n jobExecutionId: runningJobExecutions.jobExecutionId,\n projectId: runningJobExecutions.projectId,\n workspaceId: runningJobExecutions.workspaceId,\n runnerSessionId: runningJobExecutions.runnerSessionId,\n });\n\n const row = updated[0];\n if (!row) throw new RunningJobExecutionNotFoundError(params.jobExecutionId);\n\n const [previous] = await tx\n .select({toolCapabilities: runnerSessions.toolCapabilities})\n .from(runnerSessions)\n .where(eq(runnerSessions.id, params.runnerSessionId))\n .limit(1)\n .for('update');\n\n const [session] = await tx\n .update(runnerSessions)\n .set({\n toolCapabilities: params.toolCapabilities ?? null,\n toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,\n updatedAt: sql`now()`,\n })\n .where(eq(runnerSessions.id, params.runnerSessionId))\n .returning({toolCapabilities: runnerSessions.toolCapabilities});\n\n return {\n row,\n previousToolCapabilities: previous?.toolCapabilities ?? null,\n currentToolCapabilities: session?.toolCapabilities ?? null,\n };\n });\n\n const row = result.row;\n if (!row) throw new RunningJobExecutionNotFoundError(params.jobExecutionId);\n return {\n cancellationRequested: row.cancellationRequestedAt !== null,\n previousToolCapabilities: result.previousToolCapabilities,\n currentToolCapabilities: result.currentToolCapabilities,\n runningJobExecution: {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n projectId: row.projectId,\n workspaceId: row.workspaceId,\n runnerSessionId: row.runnerSessionId,\n },\n };\n}\n\nexport async function requestJobExecutionCancellation(params: {\n jobExecutionId: string;\n}): Promise<void> {\n await db()\n .update(runningJobExecutions)\n .set({\n cancellationRequestedAt: sql`COALESCE(${runningJobExecutions.cancellationRequestedAt}, now())`,\n })\n .where(eq(runningJobExecutions.jobExecutionId, params.jobExecutionId));\n}\n\nexport async function cancelRunnerJobs(params: {jobIds: string[]}): Promise<void> {\n if (params.jobIds.length === 0) return;\n\n await db().transaction(async (tx) => {\n await tx.delete(pendingJobExecutions).where(inArray(pendingJobExecutions.jobId, params.jobIds));\n await tx\n .update(runningJobExecutions)\n .set({\n cancellationRequestedAt: sql`COALESCE(${runningJobExecutions.cancellationRequestedAt}, now())`,\n })\n .where(inArray(runningJobExecutions.jobId, params.jobIds));\n });\n}\n"],"names":["RUNNER_JOB_CLAIMED","RUNNER_JOB_LEASE_EXPIRED","RUNNER_JOB_QUEUED","logger","writeOutboxEvent","writeOutboxEvents","canonicalizeLabels","and","arrayContained","asc","count","desc","eq","gt","inArray","isNotNull","isNull","lt","lte","or","sql","EmptyRequiredLabelsError","RunnerSessionExhaustedError","RunningJobExecutionNotFoundError","jobExecutionEnqueuedCount","jobExecutionLeaseExpiredCount","db","runnersOutbox","pendingJobExecutions","runnerSessions","runningJobExecutions","getWorkspaceJobCounts","params","pendingRows","runningRows","Promise","all","select","workspaceId","from","where","workspaceIds","groupBy","queuedByWorkspace","Map","map","row","Number","runningByWorkspace","queued","get","running","enqueueJobExecution","requiredLabels","length","enqueued","transaction","tx","inserted","insert","values","workflowRunId","workflowRunAttemptId","jobId","jobExecutionId","projectId","onConflictDoNothing","target","returning","createdAt","type","payload","queuedAt","toISOString","add","claimPendingJobExecution","touchRunnerSessionLiveness","runnerSessionId","throttleSeconds","runnerSessionLivenessThrottleSeconds","sessionLabels","provisionerId","providerRunnerId","maxClaims","session","claimsUsed","revokedAt","id","limit","for","orderBy","skipLocked","delete","runnerLabels","claimedAt","startedAt","claimed","update","set","updatedAt","releaseJobExecution","expireStuckJobExecutions","reaped","heartbeatCutoff","thresholdSeconds","firstHeartbeatCutoff","noFirstHeartbeatGraceSeconds","stalePredicate","firstHeartbeatAt","lastHeartbeatAt","staleIds","deleted","getJobExecutionQueueDepth","pending","value","listActiveRunningJobExecutions","windowSeconds","listRunningJobExecutionsByRunnerInstanceTx","providerRunnerIds","duplicateRows","having","duplicateRunnerInstanceIds","flatMap","warn","result","execute","cancellationRequestedAt","join","rows","toDate","Date","isJobLeaseActive","undefined","recordHeartbeat","updated","previous","toolCapabilities","toolCapabilitiesReportedAt","previousToolCapabilities","currentToolCapabilities","cancellationRequested","runningJobExecution","requestJobExecutionCancellation","cancelRunnerJobs","jobIds"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/db/job-executions.ts"],"sourcesContent":["import {\n RUNNER_JOB_CLAIMED,\n RUNNER_JOB_LEASE_EXPIRED,\n RUNNER_JOB_QUEUED,\n type RunnersEventMap,\n type RunnerToolCapabilitiesDto,\n} from '@shipfox/api-runners-dto';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {writeOutboxEvent, writeOutboxEvents} from '@shipfox/node-outbox';\nimport {canonicalizeLabels} from '@shipfox/runner-labels';\nimport {\n and,\n arrayContained,\n asc,\n count,\n desc,\n eq,\n gt,\n inArray,\n isNotNull,\n isNull,\n lt,\n lte,\n or,\n sql,\n} from 'drizzle-orm';\nimport {\n EmptyRequiredLabelsError,\n RunnerSessionExhaustedError,\n RunningJobExecutionNotFoundError,\n} from '#core/errors.js';\nimport {jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount} from '#metrics/instance.js';\nimport type {Tx} from './db.js';\nimport {db} from './db.js';\nimport {runnersOutbox} from './schema/outbox.js';\nimport {pendingJobExecutions} from './schema/pending-job-executions.js';\nimport {providerRunners} from './schema/runner-instances.js';\nimport {runnerSessions} from './schema/runner-sessions.js';\nimport {runningJobExecutions} from './schema/running-job-executions.js';\n\nexport interface EnqueueJobExecutionParams {\n workspaceId: string;\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n requiredLabels: string[];\n}\n\nexport async function getWorkspaceJobCounts(params: {\n workspaceIds: string[];\n}): Promise<Array<{workspaceId: string; queued: number; running: number}>> {\n const [pendingRows, runningRows] = await Promise.all([\n db()\n .select({workspaceId: pendingJobExecutions.workspaceId, count: count()})\n .from(pendingJobExecutions)\n .where(inArray(pendingJobExecutions.workspaceId, params.workspaceIds))\n .groupBy(pendingJobExecutions.workspaceId),\n db()\n .select({workspaceId: runningJobExecutions.workspaceId, count: count()})\n .from(runningJobExecutions)\n .where(inArray(runningJobExecutions.workspaceId, params.workspaceIds))\n .groupBy(runningJobExecutions.workspaceId),\n ]);\n\n const queuedByWorkspace = new Map(pendingRows.map((row) => [row.workspaceId, Number(row.count)]));\n const runningByWorkspace = new Map(\n runningRows.map((row) => [row.workspaceId, Number(row.count)]),\n );\n\n return params.workspaceIds.map((workspaceId) => ({\n workspaceId,\n queued: queuedByWorkspace.get(workspaceId) ?? 0,\n running: runningByWorkspace.get(workspaceId) ?? 0,\n }));\n}\n\n// Idempotent while the job execution is still pending: a duplicate jobExecutionId already in\n// `runners_pending_jobs` is a no-op. Temporal retries the enqueue activity\n// at-least-once, so a unique-violation throw on a retry-after-lost-result\n// would permanently fail a healthy job execution's workflow. The guard does not extend\n// past the claim: once the job execution has moved to `runners_running_jobs`, a retry\n// can reinsert an orphan pending row, which a later `claimPendingJobExecution` drops\n// via the running-execution unique constraint (onConflictDoNothing) instead of failing.\nexport async function enqueueJobExecution(params: EnqueueJobExecutionParams): Promise<void> {\n const requiredLabels = [...canonicalizeLabels(params.requiredLabels)];\n if (requiredLabels.length === 0) throw new EmptyRequiredLabelsError();\n\n const enqueued = await db().transaction(async (tx) => {\n const [inserted] = await tx\n .insert(pendingJobExecutions)\n .values({\n workspaceId: params.workspaceId,\n workflowRunId: params.workflowRunId,\n workflowRunAttemptId: params.workflowRunAttemptId,\n jobId: params.jobId,\n jobExecutionId: params.jobExecutionId,\n projectId: params.projectId,\n requiredLabels,\n })\n .onConflictDoNothing({target: pendingJobExecutions.jobExecutionId})\n .returning({createdAt: pendingJobExecutions.createdAt});\n\n // A retry that hits the conflict inserts nothing: the first enqueue already\n // emitted the queued event (durably, in the outbox), so re-emitting would\n // only add a redundant row the subscriber coalesces away. Skip it.\n if (!inserted) return false;\n\n await writeOutboxEvent<RunnersEventMap>(tx, runnersOutbox, {\n type: RUNNER_JOB_QUEUED,\n payload: {\n workflowRunId: params.workflowRunId,\n workflowRunAttemptId: params.workflowRunAttemptId,\n jobId: params.jobId,\n jobExecutionId: params.jobExecutionId,\n queuedAt: inserted.createdAt.toISOString(),\n },\n });\n return true;\n });\n\n if (enqueued) jobExecutionEnqueuedCount.add(1);\n}\n\nexport interface ClaimedJobExecution {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n}\n\nexport interface ActiveRunningJobExecution {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n runnerSessionId: string;\n provisionerId: string | null;\n providerRunnerId: string | null;\n requiredLabels: string[];\n runnerLabels: string[];\n startedAt: Date;\n lastHeartbeatAt: Date;\n}\n\nexport interface RunnerInstanceBoundJobExecution {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n providerRunnerId: string;\n startedAt: Date;\n lastHeartbeatAt: Date;\n cancellationRequestedAt: Date | null;\n}\n\nexport async function claimPendingJobExecution(params: {\n workspaceId: string;\n runnerSessionId: string;\n sessionLabels: string[];\n maxClaims: number | null;\n runnerSessionLivenessThrottleSeconds: number;\n}): Promise<ClaimedJobExecution | null> {\n await touchRunnerSessionLiveness({\n workspaceId: params.workspaceId,\n runnerSessionId: params.runnerSessionId,\n throttleSeconds: params.runnerSessionLivenessThrottleSeconds,\n });\n\n if (params.sessionLabels.length === 0) return null;\n\n return await db().transaction(async (tx) => {\n let provisionerId: string | null = null;\n let providerRunnerId: string | null = null;\n let runnerInstanceId: string | null = null;\n\n if (params.maxClaims !== null) {\n const [session] = await tx\n .select({\n maxClaims: runnerSessions.maxClaims,\n claimsUsed: runnerSessions.claimsUsed,\n revokedAt: runnerSessions.revokedAt,\n runnerInstanceId: runnerSessions.runnerInstanceId,\n provisionerId: runnerSessions.provisionerId,\n providerRunnerId: runnerSessions.providerRunnerId,\n })\n .from(runnerSessions)\n .where(eq(runnerSessions.id, params.runnerSessionId))\n .limit(1)\n .for('update');\n\n if (\n !session ||\n session.revokedAt ||\n session.maxClaims === null ||\n session.claimsUsed >= session.maxClaims\n ) {\n throw new RunnerSessionExhaustedError(params.runnerSessionId);\n }\n\n // Ephemeral sessions are the only capped sessions, and the DB check keeps\n // their provisioned-runner link present as a pair.\n runnerInstanceId = session.runnerInstanceId;\n provisionerId = session.provisionerId;\n providerRunnerId = session.providerRunnerId;\n }\n\n // `id` is a uuidv7 (time-ordered), so it is a deterministic FIFO tiebreaker\n // for rows sharing a created_at within a batch.\n const [row] = await tx\n .select()\n .from(pendingJobExecutions)\n .where(\n and(\n eq(pendingJobExecutions.workspaceId, params.workspaceId),\n arrayContained(pendingJobExecutions.requiredLabels, params.sessionLabels),\n ),\n )\n .orderBy(asc(pendingJobExecutions.createdAt), asc(pendingJobExecutions.id))\n .limit(1)\n .for('update', {skipLocked: true});\n\n if (!row) return null;\n\n await tx.delete(pendingJobExecutions).where(eq(pendingJobExecutions.id, row.id));\n\n // An enqueue retry that lands after a prior claim can leave an orphan pending\n // row whose jobExecutionId is already in `runners_running_jobs`. Insert-or-skip\n // on the jobExecutionId unique constraint: when the job execution is already running\n // the insert touches no row, so we commit the orphan's deletion and return\n // null rather than let the unique violation roll the claim back into a poison\n // loop. The runner just re-polls for a real job execution.\n const inserted = await tx\n .insert(runningJobExecutions)\n .values({\n workspaceId: row.workspaceId,\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n projectId: row.projectId,\n runnerSessionId: params.runnerSessionId,\n provisionerId,\n providerRunnerId,\n requiredLabels: row.requiredLabels,\n runnerLabels: params.sessionLabels,\n })\n .onConflictDoNothing({target: runningJobExecutions.jobExecutionId})\n .returning({claimedAt: runningJobExecutions.startedAt});\n\n const claimed = inserted[0];\n if (!claimed) return null;\n\n const runnerInstanceCondition = runnerInstanceId\n ? eq(providerRunners.id, runnerInstanceId)\n : provisionerId && providerRunnerId\n ? and(\n eq(providerRunners.provisionerId, provisionerId),\n eq(providerRunners.providerRunnerId, providerRunnerId),\n )\n : null;\n if (runnerInstanceCondition) {\n await tx\n .update(providerRunners)\n .set({\n firstClaimedAt: sql`coalesce(${providerRunners.firstClaimedAt}, ${claimed.claimedAt})`,\n updatedAt: sql`now()`,\n })\n .where(runnerInstanceCondition);\n }\n\n if (params.maxClaims !== null) {\n await tx\n .update(runnerSessions)\n .set({claimsUsed: sql`${runnerSessions.claimsUsed} + 1`, updatedAt: sql`now()`})\n .where(eq(runnerSessions.id, params.runnerSessionId));\n }\n\n // The running-row insert is the runner claiming the job execution. Emit in the same tx; the\n // payload carries the row's own claim instant so a consumer records the true time,\n // not the outbox drain time.\n await writeOutboxEvent<RunnersEventMap>(tx, runnersOutbox, {\n type: RUNNER_JOB_CLAIMED,\n payload: {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n claimedAt: claimed.claimedAt.toISOString(),\n },\n });\n\n return {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n projectId: row.projectId,\n };\n });\n}\n\nasync function touchRunnerSessionLiveness(params: {\n workspaceId: string;\n runnerSessionId: string;\n throttleSeconds: number;\n}): Promise<void> {\n await db()\n .update(runnerSessions)\n .set({updatedAt: sql`now()`})\n .where(\n and(\n eq(runnerSessions.id, params.runnerSessionId),\n eq(runnerSessions.workspaceId, params.workspaceId),\n sql`${runnerSessions.updatedAt} < now() - (${params.throttleSeconds} || ' seconds')::interval`,\n ),\n );\n}\n\n/**\n * Releases a job execution's lease when the orchestration workflow finalizes it: deletes the\n * running-job-execution row AND any lingering pending row for the same execution, in one tx.\n * Idempotent (0-row no-op), no token scope (the workflow is authoritative), and\n * emits no event — the workflow already owns the outcome. Sweeping the pending row\n * too closes the at-least-once window where an enqueue retry left an orphan that a\n * later claim would otherwise pick up for an already-finished job execution.\n */\nexport async function releaseJobExecution(params: {jobExecutionId: string}): Promise<void> {\n await db().transaction(async (tx) => {\n // Delete pending before running to match `claimPendingJobExecution`'s lock-acquisition\n // order (it locks the pending row first, then the running row). A concurrent\n // claim picking up an orphan pending row for this same job execution would otherwise\n // deadlock against the reverse order here.\n await tx\n .delete(pendingJobExecutions)\n .where(eq(pendingJobExecutions.jobExecutionId, params.jobExecutionId));\n await tx\n .delete(runningJobExecutions)\n .where(eq(runningJobExecutions.jobExecutionId, params.jobExecutionId));\n });\n}\n\n/**\n * Reaps stale leases (bounded by `limit`), emitting one\n * `runners.job.lease_expired` event per reaped job execution.\n *\n * The cutoff is re-checked in the DELETE, not just the locking subquery, so a\n * heartbeat landing mid-call spares the live row. Each reaped execution also sweeps its\n * pending row: a failed best-effort `releaseJobExecution` would otherwise leave an orphan\n * that a later claim re-runs as an already-finished job execution.\n *\n * Locks running-then-pending, the inverse of `claimPendingJobExecution` / `releaseJobExecution`.\n * That pre-existing asymmetry opens a narrow deadlock window against a concurrent\n * claim of the same orphan-pending job execution; Postgres breaks it and the cron retries.\n */\nexport async function expireStuckJobExecutions(params: {\n thresholdSeconds: number;\n noFirstHeartbeatGraceSeconds: number;\n limit?: number;\n}): Promise<\n Array<{\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n }>\n> {\n const reaped = await db().transaction(async (tx) => {\n const heartbeatCutoff = sql`now() - (${params.thresholdSeconds} || ' seconds')::interval`;\n const firstHeartbeatCutoff = sql`now() - (${params.noFirstHeartbeatGraceSeconds} || ' seconds')::interval`;\n const stalePredicate = or(\n and(\n isNull(runningJobExecutions.firstHeartbeatAt),\n lte(runningJobExecutions.lastHeartbeatAt, runningJobExecutions.startedAt),\n lt(runningJobExecutions.startedAt, firstHeartbeatCutoff),\n ),\n and(\n or(\n isNotNull(runningJobExecutions.firstHeartbeatAt),\n gt(runningJobExecutions.lastHeartbeatAt, runningJobExecutions.startedAt),\n ),\n lt(runningJobExecutions.lastHeartbeatAt, heartbeatCutoff),\n ),\n );\n\n const staleIds = tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(stalePredicate)\n .orderBy(\n asc(\n sql`CASE WHEN ${runningJobExecutions.firstHeartbeatAt} IS NULL AND ${runningJobExecutions.lastHeartbeatAt} <= ${runningJobExecutions.startedAt} THEN ${runningJobExecutions.startedAt} ELSE ${runningJobExecutions.lastHeartbeatAt} END`,\n ),\n )\n .limit(params.limit ?? 100)\n .for('update', {skipLocked: true});\n\n const deleted = await tx\n .delete(runningJobExecutions)\n .where(and(inArray(runningJobExecutions.id, staleIds), stalePredicate))\n .returning({\n workflowRunId: runningJobExecutions.workflowRunId,\n workflowRunAttemptId: runningJobExecutions.workflowRunAttemptId,\n jobId: runningJobExecutions.jobId,\n jobExecutionId: runningJobExecutions.jobExecutionId,\n });\n\n if (deleted.length === 0) return [];\n\n await tx.delete(pendingJobExecutions).where(\n inArray(\n pendingJobExecutions.jobExecutionId,\n deleted.map((row) => row.jobExecutionId),\n ),\n );\n\n await writeOutboxEvents<RunnersEventMap>(\n tx,\n runnersOutbox,\n deleted.map((row) => ({\n type: RUNNER_JOB_LEASE_EXPIRED,\n payload: {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n },\n })),\n );\n\n return deleted;\n });\n\n if (reaped.length > 0) jobExecutionLeaseExpiredCount.add(reaped.length);\n\n return reaped;\n}\n\nexport async function getJobExecutionQueueDepth(): Promise<{\n pendingJobExecutions: number;\n runningJobExecutions: number;\n}> {\n const [pending] = await db().select({value: count()}).from(pendingJobExecutions);\n const [running] = await db().select({value: count()}).from(runningJobExecutions);\n return {\n pendingJobExecutions: pending?.value ?? 0,\n runningJobExecutions: running?.value ?? 0,\n };\n}\n\nexport async function listActiveRunningJobExecutions(params: {\n workspaceId: string;\n windowSeconds: number;\n limit?: number;\n}): Promise<ActiveRunningJobExecution[]> {\n return await db()\n .select({\n jobId: runningJobExecutions.jobId,\n jobExecutionId: runningJobExecutions.jobExecutionId,\n workflowRunId: runningJobExecutions.workflowRunId,\n workflowRunAttemptId: runningJobExecutions.workflowRunAttemptId,\n projectId: runningJobExecutions.projectId,\n runnerSessionId: runningJobExecutions.runnerSessionId,\n provisionerId: runningJobExecutions.provisionerId,\n providerRunnerId: runningJobExecutions.providerRunnerId,\n requiredLabels: runningJobExecutions.requiredLabels,\n runnerLabels: runningJobExecutions.runnerLabels,\n startedAt: runningJobExecutions.startedAt,\n lastHeartbeatAt: runningJobExecutions.lastHeartbeatAt,\n })\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, params.workspaceId),\n sql`${runningJobExecutions.lastHeartbeatAt} > now() - (${params.windowSeconds} || ' seconds')::interval`,\n ),\n )\n .orderBy(desc(runningJobExecutions.lastHeartbeatAt), desc(runningJobExecutions.id))\n .limit(params.limit ?? 1000);\n}\n\nexport async function listRunningJobExecutionsByRunnerInstanceTx(\n tx: Tx,\n params: {\n workspaceId: string;\n provisionerId: string;\n providerRunnerIds: string[];\n },\n): Promise<RunnerInstanceBoundJobExecution[]> {\n if (params.providerRunnerIds.length === 0) return [];\n\n const duplicateRows = await tx\n .select({\n providerRunnerId: runningJobExecutions.providerRunnerId,\n count: count(),\n })\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, params.workspaceId),\n eq(runningJobExecutions.provisionerId, params.provisionerId),\n inArray(runningJobExecutions.providerRunnerId, params.providerRunnerIds),\n ),\n )\n .groupBy(runningJobExecutions.providerRunnerId)\n .having(sql`count(*) > 1`);\n\n const duplicateRunnerInstanceIds = duplicateRows.flatMap((row) =>\n row.providerRunnerId ? [row.providerRunnerId] : [],\n );\n if (duplicateRunnerInstanceIds.length > 0) {\n logger().warn(\n {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: duplicateRunnerInstanceIds,\n },\n 'multiple running job executions are bound to the same provisioned runner',\n );\n }\n\n const result = await tx.execute<{\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n providerRunnerId: string;\n startedAt: Date | string;\n lastHeartbeatAt: Date | string;\n cancellationRequestedAt: Date | string | null;\n }>(sql`\n SELECT DISTINCT ON (${runningJobExecutions.providerRunnerId})\n ${runningJobExecutions.workflowRunId} AS \"workflowRunId\",\n ${runningJobExecutions.workflowRunAttemptId} AS \"workflowRunAttemptId\",\n ${runningJobExecutions.jobId} AS \"jobId\",\n ${runningJobExecutions.jobExecutionId} AS \"jobExecutionId\",\n ${runningJobExecutions.providerRunnerId} AS \"providerRunnerId\",\n ${runningJobExecutions.startedAt} AS \"startedAt\",\n ${runningJobExecutions.lastHeartbeatAt} AS \"lastHeartbeatAt\",\n ${runningJobExecutions.cancellationRequestedAt} AS \"cancellationRequestedAt\"\n FROM ${runningJobExecutions}\n WHERE\n ${runningJobExecutions.workspaceId} = ${params.workspaceId}\n AND ${runningJobExecutions.provisionerId} = ${params.provisionerId}\n AND ${runningJobExecutions.providerRunnerId} IN (${sql.join(\n params.providerRunnerIds.map((providerRunnerId) => sql`${providerRunnerId}`),\n sql`, `,\n )})\n ORDER BY ${runningJobExecutions.providerRunnerId}, ${runningJobExecutions.startedAt} DESC, ${runningJobExecutions.jobExecutionId} DESC\n `);\n\n return result.rows.map((row) => ({\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n providerRunnerId: row.providerRunnerId,\n startedAt: toDate(row.startedAt),\n lastHeartbeatAt: toDate(row.lastHeartbeatAt),\n cancellationRequestedAt: row.cancellationRequestedAt\n ? toDate(row.cancellationRequestedAt)\n : null,\n }));\n}\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport async function isJobLeaseActive(params: {\n jobId?: string;\n jobExecutionId: string;\n runnerSessionId: string;\n}): Promise<boolean> {\n const [row] = await db()\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.jobExecutionId, params.jobExecutionId),\n eq(runningJobExecutions.runnerSessionId, params.runnerSessionId),\n params.jobId === undefined ? undefined : eq(runningJobExecutions.jobId, params.jobId),\n ),\n )\n .limit(1);\n\n return row !== undefined;\n}\n\nexport async function recordHeartbeat(params: {\n jobExecutionId: string;\n runnerSessionId: string;\n toolCapabilities?: RunnerToolCapabilitiesDto | null;\n}): Promise<{\n cancellationRequested: boolean;\n previousToolCapabilities: RunnerToolCapabilitiesDto | null;\n currentToolCapabilities: RunnerToolCapabilitiesDto | null;\n runningJobExecution: {\n workflowRunId: string;\n workflowRunAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n workspaceId: string;\n runnerSessionId: string;\n };\n}> {\n const result = await db().transaction(async (tx) => {\n const updated = await tx\n .update(runningJobExecutions)\n .set({\n firstHeartbeatAt: sql`COALESCE(${runningJobExecutions.firstHeartbeatAt}, now())`,\n lastHeartbeatAt: sql`now()`,\n })\n .where(\n and(\n eq(runningJobExecutions.jobExecutionId, params.jobExecutionId),\n eq(runningJobExecutions.runnerSessionId, params.runnerSessionId),\n ),\n )\n .returning({\n cancellationRequestedAt: runningJobExecutions.cancellationRequestedAt,\n workflowRunId: runningJobExecutions.workflowRunId,\n workflowRunAttemptId: runningJobExecutions.workflowRunAttemptId,\n jobId: runningJobExecutions.jobId,\n jobExecutionId: runningJobExecutions.jobExecutionId,\n projectId: runningJobExecutions.projectId,\n workspaceId: runningJobExecutions.workspaceId,\n runnerSessionId: runningJobExecutions.runnerSessionId,\n });\n\n const row = updated[0];\n if (!row) throw new RunningJobExecutionNotFoundError(params.jobExecutionId);\n\n const [previous] = await tx\n .select({toolCapabilities: runnerSessions.toolCapabilities})\n .from(runnerSessions)\n .where(eq(runnerSessions.id, params.runnerSessionId))\n .limit(1)\n .for('update');\n\n const [session] = await tx\n .update(runnerSessions)\n .set({\n toolCapabilities: params.toolCapabilities ?? null,\n toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,\n updatedAt: sql`now()`,\n })\n .where(eq(runnerSessions.id, params.runnerSessionId))\n .returning({toolCapabilities: runnerSessions.toolCapabilities});\n\n return {\n row,\n previousToolCapabilities: previous?.toolCapabilities ?? null,\n currentToolCapabilities: session?.toolCapabilities ?? null,\n };\n });\n\n const row = result.row;\n if (!row) throw new RunningJobExecutionNotFoundError(params.jobExecutionId);\n return {\n cancellationRequested: row.cancellationRequestedAt !== null,\n previousToolCapabilities: result.previousToolCapabilities,\n currentToolCapabilities: result.currentToolCapabilities,\n runningJobExecution: {\n workflowRunId: row.workflowRunId,\n workflowRunAttemptId: row.workflowRunAttemptId,\n jobId: row.jobId,\n jobExecutionId: row.jobExecutionId,\n projectId: row.projectId,\n workspaceId: row.workspaceId,\n runnerSessionId: row.runnerSessionId,\n },\n };\n}\n\nexport async function requestJobExecutionCancellation(params: {\n jobExecutionId: string;\n}): Promise<void> {\n await db()\n .update(runningJobExecutions)\n .set({\n cancellationRequestedAt: sql`COALESCE(${runningJobExecutions.cancellationRequestedAt}, now())`,\n })\n .where(eq(runningJobExecutions.jobExecutionId, params.jobExecutionId));\n}\n\nexport async function cancelRunnerJobs(params: {jobIds: string[]}): Promise<void> {\n if (params.jobIds.length === 0) return;\n\n await db().transaction(async (tx) => {\n await tx.delete(pendingJobExecutions).where(inArray(pendingJobExecutions.jobId, params.jobIds));\n await tx\n .update(runningJobExecutions)\n .set({\n cancellationRequestedAt: sql`COALESCE(${runningJobExecutions.cancellationRequestedAt}, now())`,\n })\n .where(inArray(runningJobExecutions.jobId, params.jobIds));\n });\n}\n"],"names":["RUNNER_JOB_CLAIMED","RUNNER_JOB_LEASE_EXPIRED","RUNNER_JOB_QUEUED","logger","writeOutboxEvent","writeOutboxEvents","canonicalizeLabels","and","arrayContained","asc","count","desc","eq","gt","inArray","isNotNull","isNull","lt","lte","or","sql","EmptyRequiredLabelsError","RunnerSessionExhaustedError","RunningJobExecutionNotFoundError","jobExecutionEnqueuedCount","jobExecutionLeaseExpiredCount","db","runnersOutbox","pendingJobExecutions","providerRunners","runnerSessions","runningJobExecutions","getWorkspaceJobCounts","params","pendingRows","runningRows","Promise","all","select","workspaceId","from","where","workspaceIds","groupBy","queuedByWorkspace","Map","map","row","Number","runningByWorkspace","queued","get","running","enqueueJobExecution","requiredLabels","length","enqueued","transaction","tx","inserted","insert","values","workflowRunId","workflowRunAttemptId","jobId","jobExecutionId","projectId","onConflictDoNothing","target","returning","createdAt","type","payload","queuedAt","toISOString","add","claimPendingJobExecution","touchRunnerSessionLiveness","runnerSessionId","throttleSeconds","runnerSessionLivenessThrottleSeconds","sessionLabels","provisionerId","providerRunnerId","runnerInstanceId","maxClaims","session","claimsUsed","revokedAt","id","limit","for","orderBy","skipLocked","delete","runnerLabels","claimedAt","startedAt","claimed","runnerInstanceCondition","update","set","firstClaimedAt","updatedAt","releaseJobExecution","expireStuckJobExecutions","reaped","heartbeatCutoff","thresholdSeconds","firstHeartbeatCutoff","noFirstHeartbeatGraceSeconds","stalePredicate","firstHeartbeatAt","lastHeartbeatAt","staleIds","deleted","getJobExecutionQueueDepth","pending","value","listActiveRunningJobExecutions","windowSeconds","listRunningJobExecutionsByRunnerInstanceTx","providerRunnerIds","duplicateRows","having","duplicateRunnerInstanceIds","flatMap","warn","result","execute","cancellationRequestedAt","join","rows","toDate","Date","isJobLeaseActive","undefined","recordHeartbeat","updated","previous","toolCapabilities","toolCapabilitiesReportedAt","previousToolCapabilities","currentToolCapabilities","cancellationRequested","runningJobExecution","requestJobExecutionCancellation","cancelRunnerJobs","jobIds"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import type { AdministrationActionEvent } from '@shipfox/api-common-dto';
2
+ import { type TimestampIdCursor } from '@shipfox/node-drizzle';
1
3
  import type { ActiveProvisionerToken, ProvisionerScope, ProvisionerToken } from '#core/entities/provisioner-token.js';
2
4
  export interface CreateProvisionerTokenParams {
3
5
  scope: ProvisionerScope;
@@ -9,10 +11,45 @@ export interface CreateProvisionerTokenParams {
9
11
  expiresAt?: Date | undefined;
10
12
  }
11
13
  export declare function createProvisionerToken(params: CreateProvisionerTokenParams): Promise<ProvisionerToken>;
14
+ interface AuditedProvisionerTokenCommandParams {
15
+ actorId: string;
16
+ command: string;
17
+ correlationId: string;
18
+ idempotencyKeyFingerprint: string;
19
+ requestFingerprint: string;
20
+ event: (tokenId: string) => AdministrationActionEvent;
21
+ }
22
+ export declare function createInstallationProvisionerTokenWithAudit(params: AuditedProvisionerTokenCommandParams & {
23
+ name?: string | undefined;
24
+ ttlSeconds?: number | undefined;
25
+ hashedToken: string;
26
+ prefix: string;
27
+ }): Promise<{
28
+ token: ProvisionerToken;
29
+ correlationId: string;
30
+ replayed: boolean;
31
+ }>;
12
32
  export declare function revokeInstallationProvisionerToken(params: {
13
33
  tokenId: string;
14
34
  revokedByUserId: string;
15
35
  }): Promise<ProvisionerToken | undefined>;
36
+ export declare function revokeInstallationProvisionerTokenWithAudit(params: AuditedProvisionerTokenCommandParams & {
37
+ tokenId: string;
38
+ }): Promise<{
39
+ token: ProvisionerToken;
40
+ correlationId: string;
41
+ replayed: boolean;
42
+ } | undefined>;
43
+ export type InstallationProvisionerTokenStatus = 'active' | 'expired' | 'revoked';
44
+ export interface ListInstallationProvisionerTokensParams {
45
+ limit: number;
46
+ cursor?: TimestampIdCursor | undefined;
47
+ status?: InstallationProvisionerTokenStatus | undefined;
48
+ }
49
+ export declare function listInstallationProvisionerTokens(params: ListInstallationProvisionerTokensParams): Promise<{
50
+ tokens: ProvisionerToken[];
51
+ nextCursor: TimestampIdCursor | null;
52
+ }>;
16
53
  export declare function listUsableProvisionerTokensByWorkspaceId(workspaceId: string): Promise<ProvisionerToken[]>;
17
54
  export declare function resolveProvisionerTokenByHash(hashedToken: string): Promise<ProvisionerToken | undefined>;
18
55
  export declare function revokeProvisionerToken(params: {
@@ -28,4 +65,5 @@ export declare function listActiveProvisionerTokens(params: {
28
65
  workspaceId: string;
29
66
  windowSeconds: number;
30
67
  }): Promise<ActiveProvisionerToken[]>;
68
+ export {};
31
69
  //# sourceMappingURL=provisioner-tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provisioner-tokens.d.ts","sourceRoot":"","sources":["../../src/db/provisioner-tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,qCAAqC,CAAC;AAQ7C,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,gBAAgB,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CAC9B;AAwDD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAiB3B;AAED,wBAAsB,kCAAkC,CAAC,MAAM,EAAE;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA+BxC;AAED,wBAAsB,wCAAwC,CAC5D,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgB7B;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAUvC;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAoCxC;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB;AAED,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAkBpC"}
1
+ {"version":3,"file":"provisioner-tokens.d.ts","sourceRoot":"","sources":["../../src/db/provisioner-tokens.ts"],"names":[],"mappings":"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"}