@vibesdotdev/infra-core 0.0.2 → 1.0.0-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -0
- package/README.md +27 -1
- package/dist/bootstrap/seed.descriptor.d.ts +1 -1
- package/dist/bootstrap/seed.descriptor.d.ts.map +1 -1
- package/dist/bootstrap/seed.descriptor.js +1 -1
- package/dist/bootstrap/seed.descriptor.js.map +1 -1
- package/dist/bootstrap/seed.impl-shape.d.ts +1 -1
- package/dist/bootstrap/seed.impl-shape.d.ts.map +1 -1
- package/dist/bootstrap/seed.kind.d.ts +1 -3
- package/dist/bootstrap/seed.kind.d.ts.map +1 -1
- package/dist/bootstrap/seed.kind.js +17 -4
- package/dist/bootstrap/seed.kind.js.map +1 -1
- package/dist/bootstrap/seed.runner.d.ts +9 -2
- package/dist/bootstrap/seed.runner.d.ts.map +1 -1
- package/dist/bootstrap/seed.runner.js +37 -18
- package/dist/bootstrap/seed.runner.js.map +1 -1
- package/dist/capped-id.d.ts +19 -0
- package/dist/capped-id.d.ts.map +1 -0
- package/dist/capped-id.js +64 -0
- package/dist/capped-id.js.map +1 -0
- package/dist/cli/generate/artifact/artifact.cli-command.descriptor.d.ts +23 -0
- package/dist/cli/generate/artifact/artifact.cli-command.descriptor.d.ts.map +1 -0
- package/dist/cli/generate/artifact/artifact.cli-command.descriptor.js +33 -0
- package/dist/cli/generate/artifact/artifact.cli-command.descriptor.js.map +1 -0
- package/dist/cli/generate/artifact/artifact.cli-command.impl.d.ts +24 -0
- package/dist/cli/generate/artifact/artifact.cli-command.impl.d.ts.map +1 -0
- package/dist/cli/generate/artifact/artifact.cli-command.impl.js +73 -0
- package/dist/cli/generate/artifact/artifact.cli-command.impl.js.map +1 -0
- package/dist/cli/generate/context.d.ts +17 -0
- package/dist/cli/generate/context.d.ts.map +1 -0
- package/dist/cli/generate/context.js +24 -0
- package/dist/cli/generate/context.js.map +1 -0
- package/dist/cli/generate/generate/generate.cli-command.descriptor.d.ts +30 -0
- package/dist/cli/generate/generate/generate.cli-command.descriptor.d.ts.map +1 -0
- package/dist/cli/generate/generate/generate.cli-command.descriptor.js +25 -0
- package/dist/cli/generate/generate/generate.cli-command.descriptor.js.map +1 -0
- package/dist/cli/generate/generate/generate.cli-command.impl.d.ts +25 -0
- package/dist/cli/generate/generate/generate.cli-command.impl.d.ts.map +1 -0
- package/dist/cli/generate/generate/generate.cli-command.impl.js +64 -0
- package/dist/cli/generate/generate/generate.cli-command.impl.js.map +1 -0
- package/dist/cli/generate/generate-core.d.ts +51 -0
- package/dist/cli/generate/generate-core.d.ts.map +1 -0
- package/dist/cli/generate/generate-core.js +172 -0
- package/dist/cli/generate/generate-core.js.map +1 -0
- package/dist/cli/generate/index.d.ts +5 -0
- package/dist/cli/generate/index.d.ts.map +1 -0
- package/dist/cli/generate/index.js +5 -0
- package/dist/cli/generate/index.js.map +1 -0
- package/dist/credentials/resolve.d.ts +82 -22
- package/dist/credentials/resolve.d.ts.map +1 -1
- package/dist/credentials/resolve.js +251 -77
- package/dist/credentials/resolve.js.map +1 -1
- package/dist/deployment-environment.d.ts +30 -0
- package/dist/deployment-environment.d.ts.map +1 -0
- package/dist/deployment-environment.js +53 -0
- package/dist/deployment-environment.js.map +1 -0
- package/dist/deployment.d.ts +8 -4
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +30 -0
- package/dist/deployment.js.map +1 -1
- package/dist/doks/cloud/base.d.ts +49 -0
- package/dist/doks/cloud/base.d.ts.map +1 -0
- package/dist/doks/cloud/base.js +138 -0
- package/dist/doks/cloud/base.js.map +1 -0
- package/dist/doks/cloud/factory.d.ts +18 -0
- package/dist/doks/cloud/factory.d.ts.map +1 -0
- package/dist/doks/cloud/factory.js +22 -0
- package/dist/doks/cloud/factory.js.map +1 -0
- package/dist/doks/cloud/index.d.ts +5 -0
- package/dist/doks/cloud/index.d.ts.map +1 -0
- package/dist/doks/cloud/index.js +4 -0
- package/dist/doks/cloud/index.js.map +1 -0
- package/dist/doks/types.d.ts +95 -0
- package/dist/doks/types.d.ts.map +1 -0
- package/dist/doks/types.js +14 -0
- package/dist/doks/types.js.map +1 -0
- package/dist/generate/index.d.ts +29 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +28 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/generate/infra-generate.plugin.d.ts +3 -0
- package/dist/generate/infra-generate.plugin.d.ts.map +1 -0
- package/dist/generate/infra-generate.plugin.js +23 -0
- package/dist/generate/infra-generate.plugin.js.map +1 -0
- package/dist/generate/plugin.d.ts +2 -0
- package/dist/generate/plugin.d.ts.map +1 -0
- package/dist/generate/plugin.js +2 -0
- package/dist/generate/plugin.js.map +1 -0
- package/dist/heartbeat/cron-heartbeat.d.ts +97 -0
- package/dist/heartbeat/cron-heartbeat.d.ts.map +1 -0
- package/dist/heartbeat/cron-heartbeat.js +200 -0
- package/dist/heartbeat/cron-heartbeat.js.map +1 -0
- package/dist/index.d.ts +35 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -14
- package/dist/index.js.map +1 -1
- package/dist/infra.plugin.d.ts +1 -1
- package/dist/infra.plugin.d.ts.map +1 -1
- package/dist/infra.plugin.js +62 -12
- package/dist/infra.plugin.js.map +1 -1
- package/dist/kinds/alerts.kind.d.ts +64 -25
- package/dist/kinds/alerts.kind.d.ts.map +1 -1
- package/dist/kinds/alerts.kind.js +43 -16
- package/dist/kinds/alerts.kind.js.map +1 -1
- package/dist/kinds/artifact.kind.d.ts +58 -10
- package/dist/kinds/artifact.kind.d.ts.map +1 -1
- package/dist/kinds/artifact.kind.js +26 -9
- package/dist/kinds/artifact.kind.js.map +1 -1
- package/dist/kinds/billing.kind.d.ts +88 -0
- package/dist/kinds/billing.kind.d.ts.map +1 -0
- package/dist/kinds/billing.kind.js +48 -0
- package/dist/kinds/billing.kind.js.map +1 -0
- package/dist/kinds/build-job.kind.d.ts +381 -0
- package/dist/kinds/build-job.kind.d.ts.map +1 -0
- package/dist/kinds/build-job.kind.js +216 -0
- package/dist/kinds/build-job.kind.js.map +1 -0
- package/dist/kinds/cache.kind.d.ts +39 -92
- package/dist/kinds/cache.kind.d.ts.map +1 -1
- package/dist/kinds/cache.kind.js +26 -51
- package/dist/kinds/cache.kind.js.map +1 -1
- package/dist/kinds/cluster.kind.d.ts +154 -0
- package/dist/kinds/cluster.kind.d.ts.map +1 -0
- package/dist/kinds/cluster.kind.js +99 -0
- package/dist/kinds/cluster.kind.js.map +1 -0
- package/dist/kinds/compute-source.kind.d.ts +138 -0
- package/dist/kinds/compute-source.kind.d.ts.map +1 -0
- package/dist/kinds/compute-source.kind.js +145 -0
- package/dist/kinds/compute-source.kind.js.map +1 -0
- package/dist/kinds/compute-sources.descriptors.d.ts +45 -0
- package/dist/kinds/compute-sources.descriptors.d.ts.map +1 -0
- package/dist/kinds/compute-sources.descriptors.js +93 -0
- package/dist/kinds/compute-sources.descriptors.js.map +1 -0
- package/dist/kinds/container-registry.kind.d.ts +62 -0
- package/dist/kinds/container-registry.kind.d.ts.map +1 -0
- package/dist/kinds/container-registry.kind.js +47 -0
- package/dist/kinds/container-registry.kind.js.map +1 -0
- package/dist/kinds/database-migrator.kind.d.ts +6 -0
- package/dist/kinds/database-migrator.kind.d.ts.map +1 -0
- package/dist/kinds/database-migrator.kind.js +28 -0
- package/dist/kinds/database-migrator.kind.js.map +1 -0
- package/dist/kinds/database.kind.d.ts +114 -93
- package/dist/kinds/database.kind.d.ts.map +1 -1
- package/dist/kinds/database.kind.js +93 -54
- package/dist/kinds/database.kind.js.map +1 -1
- package/dist/kinds/deployment-provider.kind.d.ts +5 -0
- package/dist/kinds/deployment-provider.kind.d.ts.map +1 -0
- package/dist/kinds/deployment-provider.kind.js +11 -0
- package/dist/kinds/deployment-provider.kind.js.map +1 -0
- package/dist/kinds/discovery.d.ts +5 -12
- package/dist/kinds/discovery.d.ts.map +1 -1
- package/dist/kinds/discovery.js +5 -17
- package/dist/kinds/discovery.js.map +1 -1
- package/dist/kinds/dns.kind.d.ts +162 -0
- package/dist/kinds/dns.kind.d.ts.map +1 -0
- package/dist/kinds/dns.kind.js +54 -0
- package/dist/kinds/dns.kind.js.map +1 -0
- package/dist/kinds/drift.kind.d.ts +115 -0
- package/dist/kinds/drift.kind.d.ts.map +1 -0
- package/dist/kinds/drift.kind.js +60 -0
- package/dist/kinds/drift.kind.js.map +1 -0
- package/dist/kinds/edge-tls.kind.d.ts +194 -0
- package/dist/kinds/edge-tls.kind.d.ts.map +1 -0
- package/dist/kinds/edge-tls.kind.js +58 -0
- package/dist/kinds/edge-tls.kind.js.map +1 -0
- package/dist/kinds/firewall.kind.d.ts +92 -0
- package/dist/kinds/firewall.kind.d.ts.map +1 -0
- package/dist/kinds/firewall.kind.js +59 -0
- package/dist/kinds/firewall.kind.js.map +1 -0
- package/dist/kinds/git-hosting.kind.d.ts +36 -38
- package/dist/kinds/git-hosting.kind.d.ts.map +1 -1
- package/dist/kinds/git-hosting.kind.js +21 -32
- package/dist/kinds/git-hosting.kind.js.map +1 -1
- package/dist/kinds/index.d.ts +40 -15
- package/dist/kinds/index.d.ts.map +1 -1
- package/dist/kinds/index.js +39 -14
- package/dist/kinds/index.js.map +1 -1
- package/dist/kinds/inventory.kind.d.ts +327 -0
- package/dist/kinds/inventory.kind.d.ts.map +1 -0
- package/dist/kinds/inventory.kind.js +188 -0
- package/dist/kinds/inventory.kind.js.map +1 -0
- package/dist/kinds/load-balancer.kind.d.ts +135 -0
- package/dist/kinds/load-balancer.kind.d.ts.map +1 -0
- package/dist/kinds/load-balancer.kind.js +71 -0
- package/dist/kinds/load-balancer.kind.js.map +1 -0
- package/dist/kinds/logs.kind.d.ts +74 -3
- package/dist/kinds/logs.kind.d.ts.map +1 -1
- package/dist/kinds/logs.kind.js +26 -17
- package/dist/kinds/logs.kind.js.map +1 -1
- package/dist/kinds/nfs.kind.d.ts +67 -0
- package/dist/kinds/nfs.kind.d.ts.map +1 -0
- package/dist/kinds/nfs.kind.js +45 -0
- package/dist/kinds/nfs.kind.js.map +1 -0
- package/dist/kinds/node-pool.kind.d.ts +134 -0
- package/dist/kinds/node-pool.kind.d.ts.map +1 -0
- package/dist/kinds/node-pool.kind.js +88 -0
- package/dist/kinds/node-pool.kind.js.map +1 -0
- package/dist/kinds/object-storage.kind.d.ts +50 -24
- package/dist/kinds/object-storage.kind.d.ts.map +1 -1
- package/dist/kinds/object-storage.kind.js +40 -23
- package/dist/kinds/object-storage.kind.js.map +1 -1
- package/dist/kinds/observability.kind.d.ts +104 -6
- package/dist/kinds/observability.kind.d.ts.map +1 -1
- package/dist/kinds/observability.kind.js +67 -9
- package/dist/kinds/observability.kind.js.map +1 -1
- package/dist/kinds/package-registry.kind.d.ts +139 -33
- package/dist/kinds/package-registry.kind.d.ts.map +1 -1
- package/dist/kinds/package-registry.kind.js +55 -25
- package/dist/kinds/package-registry.kind.js.map +1 -1
- package/dist/kinds/queue.kind.d.ts +67 -63
- package/dist/kinds/queue.kind.d.ts.map +1 -1
- package/dist/kinds/queue.kind.js +55 -33
- package/dist/kinds/queue.kind.js.map +1 -1
- package/dist/kinds/read-descriptor.d.ts +15 -0
- package/dist/kinds/read-descriptor.d.ts.map +1 -0
- package/dist/kinds/read-descriptor.js +11 -0
- package/dist/kinds/read-descriptor.js.map +1 -0
- package/dist/kinds/rum.kind.d.ts +36 -6
- package/dist/kinds/rum.kind.d.ts.map +1 -1
- package/dist/kinds/rum.kind.js +6 -7
- package/dist/kinds/rum.kind.js.map +1 -1
- package/dist/kinds/sandbox.kind.d.ts +136 -36
- package/dist/kinds/sandbox.kind.d.ts.map +1 -1
- package/dist/kinds/sandbox.kind.js +80 -34
- package/dist/kinds/sandbox.kind.js.map +1 -1
- package/dist/kinds/select-compute-source.d.ts +72 -0
- package/dist/kinds/select-compute-source.d.ts.map +1 -0
- package/dist/kinds/select-compute-source.js +170 -0
- package/dist/kinds/select-compute-source.js.map +1 -0
- package/dist/kinds/service-release.kind.d.ts +771 -0
- package/dist/kinds/service-release.kind.d.ts.map +1 -0
- package/dist/kinds/service-release.kind.js +676 -0
- package/dist/kinds/service-release.kind.js.map +1 -0
- package/dist/kinds/spend-guard.kind.d.ts +40 -0
- package/dist/kinds/spend-guard.kind.d.ts.map +1 -0
- package/dist/kinds/spend-guard.kind.js +133 -0
- package/dist/kinds/spend-guard.kind.js.map +1 -0
- package/dist/kinds/utilization.kind.d.ts +88 -0
- package/dist/kinds/utilization.kind.d.ts.map +1 -0
- package/dist/kinds/utilization.kind.js +62 -0
- package/dist/kinds/utilization.kind.js.map +1 -0
- package/dist/kinds/volume.kind.d.ts +54 -0
- package/dist/kinds/volume.kind.d.ts.map +1 -0
- package/dist/kinds/volume.kind.js +39 -0
- package/dist/kinds/volume.kind.js.map +1 -0
- package/dist/kinds/vpc.kind.d.ts +61 -0
- package/dist/kinds/vpc.kind.d.ts.map +1 -0
- package/dist/kinds/vpc.kind.js +51 -0
- package/dist/kinds/vpc.kind.js.map +1 -0
- package/dist/kinds/web-app.kind.d.ts +115 -45
- package/dist/kinds/web-app.kind.d.ts.map +1 -1
- package/dist/kinds/web-app.kind.js +69 -42
- package/dist/kinds/web-app.kind.js.map +1 -1
- package/dist/kinds/worker.kind.d.ts +293 -188
- package/dist/kinds/worker.kind.d.ts.map +1 -1
- package/dist/kinds/worker.kind.js +45 -123
- package/dist/kinds/worker.kind.js.map +1 -1
- package/dist/schemas/database-migration.d.ts +173 -0
- package/dist/schemas/database-migration.d.ts.map +1 -0
- package/dist/schemas/database-migration.js +88 -0
- package/dist/schemas/database-migration.js.map +1 -0
- package/dist/schemas/deployment-environment.d.ts +11 -0
- package/dist/schemas/deployment-environment.d.ts.map +1 -0
- package/dist/schemas/deployment-environment.js +9 -0
- package/dist/schemas/deployment-environment.js.map +1 -0
- package/dist/schemas/deployment-provider.d.ts +336 -0
- package/dist/schemas/deployment-provider.d.ts.map +1 -0
- package/dist/schemas/deployment-provider.js +198 -0
- package/dist/schemas/deployment-provider.js.map +1 -0
- package/dist/schemas/log-stream.d.ts +27 -0
- package/dist/schemas/log-stream.d.ts.map +1 -0
- package/dist/schemas/log-stream.js +31 -0
- package/dist/schemas/log-stream.js.map +1 -0
- package/dist/schemas/spend-guard.d.ts +155 -0
- package/dist/schemas/spend-guard.d.ts.map +1 -0
- package/dist/schemas/spend-guard.js +61 -0
- package/dist/schemas/spend-guard.js.map +1 -0
- package/dist/schemas.d.ts +190 -20
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +137 -31
- package/dist/schemas.js.map +1 -1
- package/dist/service.d.ts +87 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +199 -0
- package/dist/service.js.map +1 -0
- package/dist/settle-work.d.ts +20 -0
- package/dist/settle-work.d.ts.map +1 -0
- package/dist/settle-work.js +22 -0
- package/dist/settle-work.js.map +1 -0
- package/dist/web-app-projection.d.ts +132 -0
- package/dist/web-app-projection.d.ts.map +1 -0
- package/dist/web-app-projection.js +93 -0
- package/dist/web-app-projection.js.map +1 -0
- package/package.json +87 -36
- package/src/bootstrap/index.ts +0 -15
- package/src/bootstrap/seed.descriptor.ts +0 -24
- package/src/bootstrap/seed.impl-shape.ts +0 -5
- package/src/bootstrap/seed.kind.ts +0 -26
- package/src/bootstrap/seed.runner.ts +0 -87
- package/src/credentials/resolve.ts +0 -205
- package/src/deployment.ts +0 -57
- package/src/index.ts +0 -149
- package/src/infra.plugin.ts +0 -54
- package/src/kinds/alerts.kind.ts +0 -164
- package/src/kinds/artifact.kind.ts +0 -96
- package/src/kinds/cache.kind.ts +0 -104
- package/src/kinds/database.kind.ts +0 -120
- package/src/kinds/discovery.ts +0 -26
- package/src/kinds/git-hosting.kind.ts +0 -100
- package/src/kinds/index.ts +0 -139
- package/src/kinds/logs.kind.ts +0 -104
- package/src/kinds/object-storage.kind.ts +0 -101
- package/src/kinds/observability.kind.ts +0 -178
- package/src/kinds/package-registry.kind.ts +0 -95
- package/src/kinds/queue.kind.ts +0 -102
- package/src/kinds/rum.kind.ts +0 -135
- package/src/kinds/sandbox.kind.ts +0 -115
- package/src/kinds/web-app.kind.ts +0 -103
- package/src/kinds/worker.kind.ts +0 -203
- 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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"}
|