@vibesdotdev/infra-core 0.0.1 → 1.0.0-rc.4

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 (320) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +33 -63
  3. package/dist/bootstrap/seed.descriptor.d.ts +1 -1
  4. package/dist/bootstrap/seed.descriptor.d.ts.map +1 -1
  5. package/dist/bootstrap/seed.descriptor.js +1 -1
  6. package/dist/bootstrap/seed.descriptor.js.map +1 -1
  7. package/dist/bootstrap/seed.impl-shape.d.ts +1 -1
  8. package/dist/bootstrap/seed.impl-shape.d.ts.map +1 -1
  9. package/dist/bootstrap/seed.kind.d.ts +1 -3
  10. package/dist/bootstrap/seed.kind.d.ts.map +1 -1
  11. package/dist/bootstrap/seed.kind.js +17 -4
  12. package/dist/bootstrap/seed.kind.js.map +1 -1
  13. package/dist/bootstrap/seed.runner.d.ts +9 -2
  14. package/dist/bootstrap/seed.runner.d.ts.map +1 -1
  15. package/dist/bootstrap/seed.runner.js +37 -18
  16. package/dist/bootstrap/seed.runner.js.map +1 -1
  17. package/dist/capped-id.d.ts +19 -0
  18. package/dist/capped-id.d.ts.map +1 -0
  19. package/dist/capped-id.js +64 -0
  20. package/dist/capped-id.js.map +1 -0
  21. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.d.ts +23 -0
  22. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.d.ts.map +1 -0
  23. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.js +33 -0
  24. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.js.map +1 -0
  25. package/dist/cli/generate/artifact/artifact.cli-command.impl.d.ts +24 -0
  26. package/dist/cli/generate/artifact/artifact.cli-command.impl.d.ts.map +1 -0
  27. package/dist/cli/generate/artifact/artifact.cli-command.impl.js +73 -0
  28. package/dist/cli/generate/artifact/artifact.cli-command.impl.js.map +1 -0
  29. package/dist/cli/generate/context.d.ts +17 -0
  30. package/dist/cli/generate/context.d.ts.map +1 -0
  31. package/dist/cli/generate/context.js +24 -0
  32. package/dist/cli/generate/context.js.map +1 -0
  33. package/dist/cli/generate/generate/generate.cli-command.descriptor.d.ts +30 -0
  34. package/dist/cli/generate/generate/generate.cli-command.descriptor.d.ts.map +1 -0
  35. package/dist/cli/generate/generate/generate.cli-command.descriptor.js +25 -0
  36. package/dist/cli/generate/generate/generate.cli-command.descriptor.js.map +1 -0
  37. package/dist/cli/generate/generate/generate.cli-command.impl.d.ts +25 -0
  38. package/dist/cli/generate/generate/generate.cli-command.impl.d.ts.map +1 -0
  39. package/dist/cli/generate/generate/generate.cli-command.impl.js +64 -0
  40. package/dist/cli/generate/generate/generate.cli-command.impl.js.map +1 -0
  41. package/dist/cli/generate/generate-core.d.ts +51 -0
  42. package/dist/cli/generate/generate-core.d.ts.map +1 -0
  43. package/dist/cli/generate/generate-core.js +172 -0
  44. package/dist/cli/generate/generate-core.js.map +1 -0
  45. package/dist/cli/generate/index.d.ts +5 -0
  46. package/dist/cli/generate/index.d.ts.map +1 -0
  47. package/dist/cli/generate/index.js +5 -0
  48. package/dist/cli/generate/index.js.map +1 -0
  49. package/dist/credentials/resolve.d.ts +82 -22
  50. package/dist/credentials/resolve.d.ts.map +1 -1
  51. package/dist/credentials/resolve.js +251 -77
  52. package/dist/credentials/resolve.js.map +1 -1
  53. package/dist/deployment-environment.d.ts +30 -0
  54. package/dist/deployment-environment.d.ts.map +1 -0
  55. package/dist/deployment-environment.js +53 -0
  56. package/dist/deployment-environment.js.map +1 -0
  57. package/dist/deployment.d.ts +8 -4
  58. package/dist/deployment.d.ts.map +1 -1
  59. package/dist/deployment.js +30 -0
  60. package/dist/deployment.js.map +1 -1
  61. package/dist/doks/cloud/base.d.ts +49 -0
  62. package/dist/doks/cloud/base.d.ts.map +1 -0
  63. package/dist/doks/cloud/base.js +138 -0
  64. package/dist/doks/cloud/base.js.map +1 -0
  65. package/dist/doks/cloud/factory.d.ts +18 -0
  66. package/dist/doks/cloud/factory.d.ts.map +1 -0
  67. package/dist/doks/cloud/factory.js +22 -0
  68. package/dist/doks/cloud/factory.js.map +1 -0
  69. package/dist/doks/cloud/index.d.ts +5 -0
  70. package/dist/doks/cloud/index.d.ts.map +1 -0
  71. package/dist/doks/cloud/index.js +4 -0
  72. package/dist/doks/cloud/index.js.map +1 -0
  73. package/dist/doks/types.d.ts +95 -0
  74. package/dist/doks/types.d.ts.map +1 -0
  75. package/dist/doks/types.js +14 -0
  76. package/dist/doks/types.js.map +1 -0
  77. package/dist/generate/index.d.ts +29 -0
  78. package/dist/generate/index.d.ts.map +1 -0
  79. package/dist/generate/index.js +28 -0
  80. package/dist/generate/index.js.map +1 -0
  81. package/dist/generate/infra-generate.plugin.d.ts +3 -0
  82. package/dist/generate/infra-generate.plugin.d.ts.map +1 -0
  83. package/dist/generate/infra-generate.plugin.js +23 -0
  84. package/dist/generate/infra-generate.plugin.js.map +1 -0
  85. package/dist/generate/plugin.d.ts +2 -0
  86. package/dist/generate/plugin.d.ts.map +1 -0
  87. package/dist/generate/plugin.js +2 -0
  88. package/dist/generate/plugin.js.map +1 -0
  89. package/dist/heartbeat/cron-heartbeat.d.ts +97 -0
  90. package/dist/heartbeat/cron-heartbeat.d.ts.map +1 -0
  91. package/dist/heartbeat/cron-heartbeat.js +200 -0
  92. package/dist/heartbeat/cron-heartbeat.js.map +1 -0
  93. package/dist/index.d.ts +34 -20
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +28 -14
  96. package/dist/index.js.map +1 -1
  97. package/dist/infra.plugin.d.ts +1 -1
  98. package/dist/infra.plugin.d.ts.map +1 -1
  99. package/dist/infra.plugin.js +62 -12
  100. package/dist/infra.plugin.js.map +1 -1
  101. package/dist/kinds/alerts.kind.d.ts +64 -25
  102. package/dist/kinds/alerts.kind.d.ts.map +1 -1
  103. package/dist/kinds/alerts.kind.js +43 -16
  104. package/dist/kinds/alerts.kind.js.map +1 -1
  105. package/dist/kinds/artifact.kind.d.ts +58 -10
  106. package/dist/kinds/artifact.kind.d.ts.map +1 -1
  107. package/dist/kinds/artifact.kind.js +26 -9
  108. package/dist/kinds/artifact.kind.js.map +1 -1
  109. package/dist/kinds/billing.kind.d.ts +88 -0
  110. package/dist/kinds/billing.kind.d.ts.map +1 -0
  111. package/dist/kinds/billing.kind.js +48 -0
  112. package/dist/kinds/billing.kind.js.map +1 -0
  113. package/dist/kinds/build-job.kind.d.ts +381 -0
  114. package/dist/kinds/build-job.kind.d.ts.map +1 -0
  115. package/dist/kinds/build-job.kind.js +216 -0
  116. package/dist/kinds/build-job.kind.js.map +1 -0
  117. package/dist/kinds/cache.kind.d.ts +39 -92
  118. package/dist/kinds/cache.kind.d.ts.map +1 -1
  119. package/dist/kinds/cache.kind.js +26 -51
  120. package/dist/kinds/cache.kind.js.map +1 -1
  121. package/dist/kinds/cluster.kind.d.ts +154 -0
  122. package/dist/kinds/cluster.kind.d.ts.map +1 -0
  123. package/dist/kinds/cluster.kind.js +99 -0
  124. package/dist/kinds/cluster.kind.js.map +1 -0
  125. package/dist/kinds/compute-source.kind.d.ts +138 -0
  126. package/dist/kinds/compute-source.kind.d.ts.map +1 -0
  127. package/dist/kinds/compute-source.kind.js +145 -0
  128. package/dist/kinds/compute-source.kind.js.map +1 -0
  129. package/dist/kinds/compute-sources.descriptors.d.ts +45 -0
  130. package/dist/kinds/compute-sources.descriptors.d.ts.map +1 -0
  131. package/dist/kinds/compute-sources.descriptors.js +93 -0
  132. package/dist/kinds/compute-sources.descriptors.js.map +1 -0
  133. package/dist/kinds/container-registry.kind.d.ts +62 -0
  134. package/dist/kinds/container-registry.kind.d.ts.map +1 -0
  135. package/dist/kinds/container-registry.kind.js +47 -0
  136. package/dist/kinds/container-registry.kind.js.map +1 -0
  137. package/dist/kinds/database-migrator.kind.d.ts +6 -0
  138. package/dist/kinds/database-migrator.kind.d.ts.map +1 -0
  139. package/dist/kinds/database-migrator.kind.js +28 -0
  140. package/dist/kinds/database-migrator.kind.js.map +1 -0
  141. package/dist/kinds/database.kind.d.ts +114 -93
  142. package/dist/kinds/database.kind.d.ts.map +1 -1
  143. package/dist/kinds/database.kind.js +93 -54
  144. package/dist/kinds/database.kind.js.map +1 -1
  145. package/dist/kinds/deployment-provider.kind.d.ts +5 -0
  146. package/dist/kinds/deployment-provider.kind.d.ts.map +1 -0
  147. package/dist/kinds/deployment-provider.kind.js +11 -0
  148. package/dist/kinds/deployment-provider.kind.js.map +1 -0
  149. package/dist/kinds/discovery.d.ts +5 -12
  150. package/dist/kinds/discovery.d.ts.map +1 -1
  151. package/dist/kinds/discovery.js +5 -17
  152. package/dist/kinds/discovery.js.map +1 -1
  153. package/dist/kinds/dns.kind.d.ts +162 -0
  154. package/dist/kinds/dns.kind.d.ts.map +1 -0
  155. package/dist/kinds/dns.kind.js +54 -0
  156. package/dist/kinds/dns.kind.js.map +1 -0
  157. package/dist/kinds/drift.kind.d.ts +115 -0
  158. package/dist/kinds/drift.kind.d.ts.map +1 -0
  159. package/dist/kinds/drift.kind.js +60 -0
  160. package/dist/kinds/drift.kind.js.map +1 -0
  161. package/dist/kinds/edge-tls.kind.d.ts +194 -0
  162. package/dist/kinds/edge-tls.kind.d.ts.map +1 -0
  163. package/dist/kinds/edge-tls.kind.js +58 -0
  164. package/dist/kinds/edge-tls.kind.js.map +1 -0
  165. package/dist/kinds/firewall.kind.d.ts +92 -0
  166. package/dist/kinds/firewall.kind.d.ts.map +1 -0
  167. package/dist/kinds/firewall.kind.js +59 -0
  168. package/dist/kinds/firewall.kind.js.map +1 -0
  169. package/dist/kinds/git-hosting.kind.d.ts +36 -38
  170. package/dist/kinds/git-hosting.kind.d.ts.map +1 -1
  171. package/dist/kinds/git-hosting.kind.js +23 -34
  172. package/dist/kinds/git-hosting.kind.js.map +1 -1
  173. package/dist/kinds/index.d.ts +40 -15
  174. package/dist/kinds/index.d.ts.map +1 -1
  175. package/dist/kinds/index.js +39 -14
  176. package/dist/kinds/index.js.map +1 -1
  177. package/dist/kinds/inventory.kind.d.ts +326 -0
  178. package/dist/kinds/inventory.kind.d.ts.map +1 -0
  179. package/dist/kinds/inventory.kind.js +188 -0
  180. package/dist/kinds/inventory.kind.js.map +1 -0
  181. package/dist/kinds/load-balancer.kind.d.ts +135 -0
  182. package/dist/kinds/load-balancer.kind.d.ts.map +1 -0
  183. package/dist/kinds/load-balancer.kind.js +71 -0
  184. package/dist/kinds/load-balancer.kind.js.map +1 -0
  185. package/dist/kinds/logs.kind.d.ts +74 -3
  186. package/dist/kinds/logs.kind.d.ts.map +1 -1
  187. package/dist/kinds/logs.kind.js +26 -17
  188. package/dist/kinds/logs.kind.js.map +1 -1
  189. package/dist/kinds/nfs.kind.d.ts +67 -0
  190. package/dist/kinds/nfs.kind.d.ts.map +1 -0
  191. package/dist/kinds/nfs.kind.js +45 -0
  192. package/dist/kinds/nfs.kind.js.map +1 -0
  193. package/dist/kinds/node-pool.kind.d.ts +134 -0
  194. package/dist/kinds/node-pool.kind.d.ts.map +1 -0
  195. package/dist/kinds/node-pool.kind.js +88 -0
  196. package/dist/kinds/node-pool.kind.js.map +1 -0
  197. package/dist/kinds/object-storage.kind.d.ts +50 -24
  198. package/dist/kinds/object-storage.kind.d.ts.map +1 -1
  199. package/dist/kinds/object-storage.kind.js +40 -23
  200. package/dist/kinds/object-storage.kind.js.map +1 -1
  201. package/dist/kinds/observability.kind.d.ts +104 -6
  202. package/dist/kinds/observability.kind.d.ts.map +1 -1
  203. package/dist/kinds/observability.kind.js +67 -9
  204. package/dist/kinds/observability.kind.js.map +1 -1
  205. package/dist/kinds/package-registry.kind.d.ts +27 -31
  206. package/dist/kinds/package-registry.kind.d.ts.map +1 -1
  207. package/dist/kinds/package-registry.kind.js +13 -26
  208. package/dist/kinds/package-registry.kind.js.map +1 -1
  209. package/dist/kinds/queue.kind.d.ts +67 -63
  210. package/dist/kinds/queue.kind.d.ts.map +1 -1
  211. package/dist/kinds/queue.kind.js +55 -33
  212. package/dist/kinds/queue.kind.js.map +1 -1
  213. package/dist/kinds/read-descriptor.d.ts +15 -0
  214. package/dist/kinds/read-descriptor.d.ts.map +1 -0
  215. package/dist/kinds/read-descriptor.js +11 -0
  216. package/dist/kinds/read-descriptor.js.map +1 -0
  217. package/dist/kinds/rum.kind.d.ts +36 -6
  218. package/dist/kinds/rum.kind.d.ts.map +1 -1
  219. package/dist/kinds/rum.kind.js +6 -7
  220. package/dist/kinds/rum.kind.js.map +1 -1
  221. package/dist/kinds/sandbox.kind.d.ts +136 -36
  222. package/dist/kinds/sandbox.kind.d.ts.map +1 -1
  223. package/dist/kinds/sandbox.kind.js +80 -34
  224. package/dist/kinds/sandbox.kind.js.map +1 -1
  225. package/dist/kinds/select-compute-source.d.ts +72 -0
  226. package/dist/kinds/select-compute-source.d.ts.map +1 -0
  227. package/dist/kinds/select-compute-source.js +170 -0
  228. package/dist/kinds/select-compute-source.js.map +1 -0
  229. package/dist/kinds/service-release.kind.d.ts +771 -0
  230. package/dist/kinds/service-release.kind.d.ts.map +1 -0
  231. package/dist/kinds/service-release.kind.js +676 -0
  232. package/dist/kinds/service-release.kind.js.map +1 -0
  233. package/dist/kinds/spend-guard.kind.d.ts +40 -0
  234. package/dist/kinds/spend-guard.kind.d.ts.map +1 -0
  235. package/dist/kinds/spend-guard.kind.js +133 -0
  236. package/dist/kinds/spend-guard.kind.js.map +1 -0
  237. package/dist/kinds/utilization.kind.d.ts +88 -0
  238. package/dist/kinds/utilization.kind.d.ts.map +1 -0
  239. package/dist/kinds/utilization.kind.js +62 -0
  240. package/dist/kinds/utilization.kind.js.map +1 -0
  241. package/dist/kinds/volume.kind.d.ts +54 -0
  242. package/dist/kinds/volume.kind.d.ts.map +1 -0
  243. package/dist/kinds/volume.kind.js +39 -0
  244. package/dist/kinds/volume.kind.js.map +1 -0
  245. package/dist/kinds/vpc.kind.d.ts +61 -0
  246. package/dist/kinds/vpc.kind.d.ts.map +1 -0
  247. package/dist/kinds/vpc.kind.js +51 -0
  248. package/dist/kinds/vpc.kind.js.map +1 -0
  249. package/dist/kinds/web-app.kind.d.ts +115 -45
  250. package/dist/kinds/web-app.kind.d.ts.map +1 -1
  251. package/dist/kinds/web-app.kind.js +69 -42
  252. package/dist/kinds/web-app.kind.js.map +1 -1
  253. package/dist/kinds/worker.kind.d.ts +291 -188
  254. package/dist/kinds/worker.kind.d.ts.map +1 -1
  255. package/dist/kinds/worker.kind.js +45 -123
  256. package/dist/kinds/worker.kind.js.map +1 -1
  257. package/dist/schemas/database-migration.d.ts +173 -0
  258. package/dist/schemas/database-migration.d.ts.map +1 -0
  259. package/dist/schemas/database-migration.js +88 -0
  260. package/dist/schemas/database-migration.js.map +1 -0
  261. package/dist/schemas/deployment-environment.d.ts +11 -0
  262. package/dist/schemas/deployment-environment.d.ts.map +1 -0
  263. package/dist/schemas/deployment-environment.js +9 -0
  264. package/dist/schemas/deployment-environment.js.map +1 -0
  265. package/dist/schemas/deployment-provider.d.ts +336 -0
  266. package/dist/schemas/deployment-provider.d.ts.map +1 -0
  267. package/dist/schemas/deployment-provider.js +198 -0
  268. package/dist/schemas/deployment-provider.js.map +1 -0
  269. package/dist/schemas/log-stream.d.ts +27 -0
  270. package/dist/schemas/log-stream.d.ts.map +1 -0
  271. package/dist/schemas/log-stream.js +31 -0
  272. package/dist/schemas/log-stream.js.map +1 -0
  273. package/dist/schemas/spend-guard.d.ts +155 -0
  274. package/dist/schemas/spend-guard.d.ts.map +1 -0
  275. package/dist/schemas/spend-guard.js +61 -0
  276. package/dist/schemas/spend-guard.js.map +1 -0
  277. package/dist/schemas.d.ts +190 -20
  278. package/dist/schemas.d.ts.map +1 -1
  279. package/dist/schemas.js +137 -31
  280. package/dist/schemas.js.map +1 -1
  281. package/dist/service.d.ts +87 -0
  282. package/dist/service.d.ts.map +1 -0
  283. package/dist/service.js +199 -0
  284. package/dist/service.js.map +1 -0
  285. package/dist/settle-work.d.ts +20 -0
  286. package/dist/settle-work.d.ts.map +1 -0
  287. package/dist/settle-work.js +22 -0
  288. package/dist/settle-work.js.map +1 -0
  289. package/dist/web-app-projection.d.ts +132 -0
  290. package/dist/web-app-projection.d.ts.map +1 -0
  291. package/dist/web-app-projection.js +93 -0
  292. package/dist/web-app-projection.js.map +1 -0
  293. package/package.json +89 -39
  294. package/SPEC.md +0 -169
  295. package/src/bootstrap/index.ts +0 -15
  296. package/src/bootstrap/seed.descriptor.ts +0 -24
  297. package/src/bootstrap/seed.impl-shape.ts +0 -5
  298. package/src/bootstrap/seed.kind.ts +0 -26
  299. package/src/bootstrap/seed.runner.ts +0 -87
  300. package/src/credentials/resolve.ts +0 -205
  301. package/src/deployment.ts +0 -57
  302. package/src/index.ts +0 -149
  303. package/src/infra.plugin.ts +0 -54
  304. package/src/kinds/alerts.kind.ts +0 -164
  305. package/src/kinds/artifact.kind.ts +0 -96
  306. package/src/kinds/cache.kind.ts +0 -104
  307. package/src/kinds/database.kind.ts +0 -120
  308. package/src/kinds/discovery.ts +0 -26
  309. package/src/kinds/git-hosting.kind.ts +0 -100
  310. package/src/kinds/index.ts +0 -139
  311. package/src/kinds/logs.kind.ts +0 -104
  312. package/src/kinds/object-storage.kind.ts +0 -101
  313. package/src/kinds/observability.kind.ts +0 -178
  314. package/src/kinds/package-registry.kind.ts +0 -95
  315. package/src/kinds/queue.kind.ts +0 -102
  316. package/src/kinds/rum.kind.ts +0 -135
  317. package/src/kinds/sandbox.kind.ts +0 -115
  318. package/src/kinds/web-app.kind.ts +0 -103
  319. package/src/kinds/worker.kind.ts +0 -203
  320. package/src/schemas.ts +0 -127
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Selection policy for `infra/compute-source`.
3
+ *
4
+ * A pure policy over descriptors, mirroring `selectCiExecutorDescriptor`:
5
+ * no runtime instance, only the `CapabilityError` taxonomy for its refusals
6
+ * (consumers read them structurally, `isCapabilityError`, so a nested copy of
7
+ * `@vibesdotdev/kernel` still classifies them).
8
+ *
9
+ * Every filter fails LOUD, typed `NOT_FOUND compute-source-<filter>`, with the
10
+ * candidates it rejected in the refusal's details. A source that
11
+ * silently substitutes a different machine class is how a `runsOn: windows`
12
+ * job quietly runs on linux, and how a fork PR quietly lands on a persistent
13
+ * host somebody else will reuse.
14
+ *
15
+ * Order is capability, then trust, then ownership, then cost — and that order
16
+ * is the design. Neither Cloudflare nor DigitalOcean sells a Windows kernel at
17
+ * any price, so cost ranking must never run before capability filtering or the
18
+ * cheapest source would win a job it cannot serve.
19
+ */
20
+ import { CapabilityError } from '@vibesdotdev/kernel';
21
+ /** The candidates a filter rejected, as details: ids and capabilities, never anything the caller sent. */
22
+ function candidates(sources) {
23
+ return sources.map((s) => ({
24
+ id: s.id,
25
+ os: [...s.provides.os],
26
+ arch: [...s.provides.arch],
27
+ ephemeral: s.ephemeral === true,
28
+ ownerScope: s.ownerScope,
29
+ usdPerSecond: s.cost.usdPerSecond
30
+ }));
31
+ }
32
+ /** One filter's typed refusal: `NOT_FOUND compute-source-<filter>`, fixed message, the rejected candidates in details. */
33
+ function noSource(reason, message, rejected) {
34
+ return new CapabilityError(message, 'NOT_FOUND', { reason, retryable: false, details: { candidates: candidates(rejected) } });
35
+ }
36
+ function sameOwner(a, b) {
37
+ return a !== undefined && b !== undefined && a.type === b.type && a.id === b.id;
38
+ }
39
+ /**
40
+ * What a lease of this length would cost us, in the provider's own terms.
41
+ *
42
+ * Conservative on purpose. `usdPerSecondCpuActive` is only charged while the
43
+ * vCPUs are busy, and we do not measure CPU-seconds in CI, so ranking assumes
44
+ * they are busy the whole time. Assuming idle would rank a CPU-metered source
45
+ * as cheap and then hand us the bill — the failure the caller cannot see. A
46
+ * job that really does idle costs less than this says, never more.
47
+ *
48
+ * `minimumUsd` is applied as a floor rather than added, because that is how a
49
+ * provider minimum actually works: a 10-second droplet costs the minimum, not
50
+ * the minimum plus 10 seconds.
51
+ *
52
+ * When the caller states no duration there is nothing to multiply, so the
53
+ * comparison falls back to the fixed costs — which still orders a free
54
+ * bring-your-own machine below a paid one.
55
+ */
56
+ export function expectedCostUsd(source, maxDurationSeconds) {
57
+ const setup = source.cost.initialUsd ?? 0;
58
+ const floor = source.cost.minimumUsd ?? 0;
59
+ if (maxDurationSeconds === undefined)
60
+ return Math.max(floor, setup);
61
+ const perSecond = source.cost.usdPerSecond + (source.cost.usdPerSecondCpuActive ?? 0);
62
+ return Math.max(floor, setup + perSecond * maxDurationSeconds);
63
+ }
64
+ /**
65
+ * Which registered compute source should serve this demand.
66
+ *
67
+ * Throws rather than returning undefined: a caller that cannot get the machine
68
+ * class it asked for must stop, not proceed on something else.
69
+ */
70
+ export function selectComputeSource(sources, demand) {
71
+ const enabled = sources.filter((s) => s.enabled !== false);
72
+ if (enabled.length === 0) {
73
+ throw noSource('compute-source-none', 'No compute source is registered.', []);
74
+ }
75
+ const byOs = demand.os === undefined ? enabled : enabled.filter((s) => s.provides.os.includes(demand.os));
76
+ if (byOs.length === 0) {
77
+ throw noSource('compute-source-os-unavailable', 'No compute source provides the demanded operating system.', enabled);
78
+ }
79
+ const byArch = demand.arch === undefined
80
+ ? byOs
81
+ : byOs.filter((s) => s.provides.arch.includes(demand.arch));
82
+ if (byArch.length === 0) {
83
+ throw noSource('compute-source-arch-unavailable', 'No compute source provides the demanded architecture.', byOs);
84
+ }
85
+ const demanded = demand.labels ?? [];
86
+ const byLabels = demanded.length === 0
87
+ ? byArch
88
+ : byArch.filter((s) => demanded.every((label) => s.provides.labels.includes(label)));
89
+ if (byLabels.length === 0) {
90
+ throw noSource('compute-source-labels-unavailable', 'No compute source provides every required label.', byArch);
91
+ }
92
+ // Untrusted code only ever runs somewhere that is destroyed afterwards.
93
+ // This is the filter that keeps a fork PR off a warm host the next job
94
+ // would reuse, and off a machine a user brought themselves.
95
+ const byTrust = demand.trust === 'untrusted' ? byLabels.filter((s) => s.ephemeral === true) : byLabels;
96
+ if (byTrust.length === 0) {
97
+ throw noSource('compute-source-untrusted-needs-ephemeral', 'An untrusted ref may only use an ephemeral compute source, and none of the matching sources is ephemeral.', byLabels);
98
+ }
99
+ // A bring-your-own source belongs to exactly one scope and is invisible to
100
+ // every other one. Ours are available to all.
101
+ const byOwnership = byTrust.filter((s) => s.ownerScope !== 'byo' || sameOwner(s.owner, demand.owner));
102
+ if (byOwnership.length === 0) {
103
+ throw noSource('compute-source-owned-elsewhere', 'The only matching compute sources are bring-your-own and belong to another scope.', byTrust);
104
+ }
105
+ const byDuration = demand.maxDurationSeconds === undefined
106
+ ? byOwnership
107
+ : byOwnership.filter((s) => s.maxLeaseSeconds >= demand.maxDurationSeconds);
108
+ if (byDuration.length === 0) {
109
+ throw noSource('compute-source-lease-too-short', 'No compute source grants a lease long enough for the demanded duration.', byOwnership);
110
+ }
111
+ // Only now does cost matter. Bring-your-own first — it is the user's own
112
+ // hardware, so it costs them no credits regardless of what it would cost
113
+ // us — then genuinely cheapest for THIS job, then the descriptor's own
114
+ // priority as a stable tiebreak.
115
+ //
116
+ // Ranking on real money rather than a hand-assigned tier means a source
117
+ // with a setup cost can still win a long job, and lose a short one, which
118
+ // is the truth an integer tier cannot express.
119
+ return [...byDuration].sort((a, b) => {
120
+ const aByo = a.ownerScope === 'byo' ? 0 : 1;
121
+ const bByo = b.ownerScope === 'byo' ? 0 : 1;
122
+ if (aByo !== bByo)
123
+ return aByo - bByo;
124
+ const aCost = expectedCostUsd(a, demand.maxDurationSeconds);
125
+ const bCost = expectedCostUsd(b, demand.maxDurationSeconds);
126
+ if (aCost !== bCost)
127
+ return aCost - bCost;
128
+ const aRate = a.cost.usdPerSecond + (a.cost.usdPerSecondCpuActive ?? 0);
129
+ const bRate = b.cost.usdPerSecond + (b.cost.usdPerSecondCpuActive ?? 0);
130
+ if (aRate !== bRate)
131
+ return aRate - bRate;
132
+ return (b.priority ?? 100) - (a.priority ?? 100);
133
+ })[0];
134
+ }
135
+ /**
136
+ * The cost basis to bill a lease from, in the billing layer's own vocabulary.
137
+ *
138
+ * The rating engine takes `CostBasis[]` and, when given none, falls back to
139
+ * `unknownCostHeuristic` — a $0.0001/compute-second floor doubled by a safety
140
+ * multiplier, or $0.72/hour. Every source we own is cheaper than that: a
141
+ * Cloudflare `standard-4` at full CPU is $0.40/hour and a DigitalOcean
142
+ * `s-2vcpu-4gb` is $0.036/hour. Handing the engine the real number is
143
+ * therefore not a tightening — it stops CI from being billed at up to twenty
144
+ * times what it costs us.
145
+ *
146
+ * Deliberately uses the SAME rate `expectedCostUsd` ranks on, including the
147
+ * assumption that metered CPU is fully active. If selection and the invoice
148
+ * disagreed about what a source costs, one of them would be lying, and the
149
+ * cheaper-looking source would win work it could not afford. The assumption
150
+ * only ever errs toward billing our real exposure rather than under-recovering
151
+ * it, and it still lands well under the heuristic it replaces.
152
+ *
153
+ * `minimumUsd` is NOT expressed here. A provider floor applies to a lease, not
154
+ * to a second, and there is no way to say "per-unit, but never less than X" in
155
+ * a per-unit basis. Folding it into the rate would inflate every long lease.
156
+ * The floor belongs to whatever holds the lease, and this returns only what is
157
+ * true per second.
158
+ */
159
+ export function computeSourceCostBasis(source) {
160
+ return [
161
+ {
162
+ units: 'compute_second',
163
+ usdPerUnit: source.cost.usdPerSecond + (source.cost.usdPerSecondCpuActive ?? 0),
164
+ source: source.cost.source,
165
+ confidence: source.cost.confidence,
166
+ effectiveAt: source.cost.effectiveAt
167
+ }
168
+ ];
169
+ }
170
+ //# sourceMappingURL=select-compute-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-compute-source.js","sourceRoot":"","sources":["../../src/kinds/select-compute-source.ts"],"names":[],"mappings":"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"}