@vibesdotdev/infra-core 0.0.1 → 1.0.0-rc.11
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 +34 -63
- 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-budget.d.ts +319 -0
- package/dist/deployment-budget.d.ts.map +1 -0
- package/dist/deployment-budget.js +660 -0
- package/dist/deployment-budget.js.map +1 -0
- 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-graph.d.ts +185 -0
- package/dist/deployment-graph.d.ts.map +1 -0
- package/dist/deployment-graph.js +705 -0
- package/dist/deployment-graph.js.map +1 -0
- package/dist/deployment.d.ts +25 -4
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +105 -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 +37 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -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 +64 -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 +383 -0
- package/dist/kinds/build-job.kind.d.ts.map +1 -0
- package/dist/kinds/build-job.kind.js +218 -0
- package/dist/kinds/build-job.kind.js.map +1 -0
- package/dist/kinds/cache-byte-store.d.ts +23 -0
- package/dist/kinds/cache-byte-store.d.ts.map +1 -0
- package/dist/kinds/cache-byte-store.js +9 -0
- package/dist/kinds/cache-byte-store.js.map +1 -0
- package/dist/kinds/cache.kind.d.ts +38 -94
- package/dist/kinds/cache.kind.d.ts.map +1 -1
- package/dist/kinds/cache.kind.js +39 -50
- 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 +155 -0
- package/dist/kinds/compute-source.kind.d.ts.map +1 -0
- package/dist/kinds/compute-source.kind.js +158 -0
- package/dist/kinds/compute-source.kind.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-hostname.kind.d.ts +124 -0
- package/dist/kinds/edge-hostname.kind.d.ts.map +1 -0
- package/dist/kinds/edge-hostname.kind.js +87 -0
- package/dist/kinds/edge-hostname.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 +23 -34
- package/dist/kinds/git-hosting.kind.js.map +1 -1
- package/dist/kinds/index.d.ts +41 -15
- package/dist/kinds/index.d.ts.map +1 -1
- package/dist/kinds/index.js +40 -14
- package/dist/kinds/index.js.map +1 -1
- package/dist/kinds/inventory.kind.d.ts +245 -0
- package/dist/kinds/inventory.kind.d.ts.map +1 -0
- package/dist/kinds/inventory.kind.js +243 -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 +141 -35
- 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 -40
- package/dist/kinds/sandbox.kind.d.ts.map +1 -1
- package/dist/kinds/sandbox.kind.js +82 -43
- 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 +41 -0
- package/dist/kinds/spend-guard.kind.d.ts.map +1 -0
- package/dist/kinds/spend-guard.kind.js +140 -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 +118 -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 +129 -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 +383 -0
- package/dist/schemas/deployment-provider.d.ts.map +1 -0
- package/dist/schemas/deployment-provider.js +211 -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 +195 -20
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +151 -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 +208 -0
- package/dist/web-app-projection.d.ts.map +1 -0
- package/dist/web-app-projection.js +95 -0
- package/dist/web-app-projection.js.map +1 -0
- package/package.json +123 -40
- package/SPEC.md +0 -169
- 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
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* (alerts, RUM, observability, …) reads from the same credential chain
|
|
6
6
|
* the rest of the platform uses. The chain (highest precedence first):
|
|
7
7
|
*
|
|
8
|
-
* 1.
|
|
9
|
-
* 2. The tier-resolved secrets/store implementation
|
|
8
|
+
* 1. The tier-resolved secrets/store implementation
|
|
10
9
|
* - local tier → encrypted-local → env-file
|
|
11
10
|
* - production → cloudflare-secrets-store → cloudflare-api
|
|
11
|
+
* There is no ambient-environment fallback: credentials resolve only through
|
|
12
|
+
* registered secrets stores, using the handed runtime (first argument).
|
|
12
13
|
*
|
|
13
14
|
* Adapters declare the secret KEY NAMES (e.g. CLOUDFLARE_API_TOKEN) on
|
|
14
15
|
* their descriptor's `adapterConfig` and use this helper to resolve
|
|
@@ -16,15 +17,28 @@
|
|
|
16
17
|
* (e.g. prefer a scoped CLOUDFLARE_NOTIFICATIONS_API_TOKEN, fall back
|
|
17
18
|
* to the broad CLOUDFLARE_API_TOKEN).
|
|
18
19
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
20
|
+
* Every refusal is a typed `CapabilityError` with a fixed message. What a
|
|
21
|
+
* backend threw is never repeated: each failing backend is carried as its
|
|
22
|
+
* value-free facts (`valueFreeFailure`) in the refusal's details. A walk in
|
|
23
|
+
* which any backend failed is `UNAVAILABLE credential-store-unavailable`,
|
|
24
|
+
* never absence; `NOT_FOUND credential-missing` (message prefix
|
|
25
|
+
* `Missing credential:`) means every backend answered and none held a candidate.
|
|
26
|
+
*
|
|
27
|
+
* Each store call is the work of a `runtime.lifecycle.wait`, so a call still
|
|
28
|
+
* running after its deadline is owned by the runtime and joined at disposal.
|
|
25
29
|
*/
|
|
26
|
-
|
|
30
|
+
import * as z from 'zod/v4';
|
|
31
|
+
import { type VibesRuntime } from '@vibesdotdev/kernel';
|
|
32
|
+
declare const EnvironmentTierSchema: z.ZodEnum<{
|
|
33
|
+
local: "local";
|
|
34
|
+
dev: "dev";
|
|
35
|
+
staging: "staging";
|
|
36
|
+
production: "production";
|
|
37
|
+
}>;
|
|
38
|
+
export type EnvironmentTier = z.infer<typeof EnvironmentTierSchema>;
|
|
27
39
|
export interface ResolveAdapterCredentialOptions {
|
|
40
|
+
/** Opaque Secrets-owned context; forward unchanged across backend bootstrap. */
|
|
41
|
+
operationContext?: unknown;
|
|
28
42
|
/**
|
|
29
43
|
* Ordered list of candidate keys. First one that resolves to a
|
|
30
44
|
* non-empty value wins. Useful for scoped → fallback patterns:
|
|
@@ -43,38 +57,84 @@ export interface ResolveAdapterCredentialOptions {
|
|
|
43
57
|
*/
|
|
44
58
|
tier?: EnvironmentTier;
|
|
45
59
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
60
|
+
* When true, search every registered secrets/store backend by priority
|
|
61
|
+
* instead of only the backend matching the target tier. This is useful for
|
|
62
|
+
* operator control-plane credentials, which may be stored in an encrypted
|
|
63
|
+
* local backend even when the target environment is production.
|
|
64
|
+
*/
|
|
65
|
+
includeAllStoreBackends?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Additional environment names to check after `environment`. Values are
|
|
68
|
+
* tried against each candidate backend in order.
|
|
49
69
|
*/
|
|
50
|
-
|
|
70
|
+
fallbackEnvironments?: readonly string[];
|
|
51
71
|
/**
|
|
52
|
-
* Optional human-readable name for the credential
|
|
53
|
-
*
|
|
72
|
+
* Optional human-readable name for the credential. Refusals are fixed
|
|
73
|
+
* text, so it is carried in their details, never in a message.
|
|
54
74
|
*/
|
|
55
75
|
humanName?: string;
|
|
76
|
+
/** Maximum time allowed for each backend resolve/get attempt. Defaults to 15s. */
|
|
77
|
+
backendTimeoutMs?: number;
|
|
78
|
+
/** Total deadline for the complete backend walk. Defaults to 90s. */
|
|
79
|
+
resolutionTimeoutMs?: number;
|
|
56
80
|
}
|
|
57
81
|
export interface ResolvedAdapterCredential {
|
|
58
82
|
/** The KEY that resolved (one of keyCandidates). Useful for audit. */
|
|
59
83
|
key: string;
|
|
60
84
|
/** The resolved secret value. Never logged. */
|
|
61
85
|
value: string;
|
|
62
|
-
/** Where the value came from:
|
|
86
|
+
/** Where the value came from: the store backend id. */
|
|
87
|
+
source: string;
|
|
88
|
+
/** Environment requested by the operator-facing command. */
|
|
89
|
+
requestedEnvironment: string;
|
|
90
|
+
/** Actual environment containing the value. */
|
|
91
|
+
resolvedEnvironment: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Operator control-plane credentials are resolved on the consumer machine even
|
|
95
|
+
* when they target staging or production. Every infra inventory/audit adapter
|
|
96
|
+
* must use this narrower contract so one surface cannot silently select a
|
|
97
|
+
* different secrets backend than another.
|
|
98
|
+
*
|
|
99
|
+
* The policy is fixed: every registered store backend is eligible by
|
|
100
|
+
* priority, and non-local targets may fall back to the operator's local
|
|
101
|
+
* secrets environment. Callers still own key candidates, human-readable
|
|
102
|
+
* labels, and bounded resolution deadlines.
|
|
103
|
+
*/
|
|
104
|
+
export interface ResolveOperatorCredentialOptions extends Omit<ResolveAdapterCredentialOptions, 'tier' | 'includeAllStoreBackends' | 'fallbackEnvironments'> {
|
|
105
|
+
environment: string;
|
|
106
|
+
}
|
|
107
|
+
export type OperatorCredentialResolutionPolicy = Pick<ResolveAdapterCredentialOptions, 'environment' | 'includeAllStoreBackends' | 'fallbackEnvironments'>;
|
|
108
|
+
/** Safe-to-log selection metadata. Deliberately excludes the credential value. */
|
|
109
|
+
export interface AdapterCredentialSelection {
|
|
110
|
+
requestedEnvironment: string;
|
|
111
|
+
resolvedEnvironment: string;
|
|
112
|
+
key: string;
|
|
63
113
|
source: string;
|
|
64
114
|
}
|
|
115
|
+
export declare function operatorCredentialResolutionPolicy(environment: string): OperatorCredentialResolutionPolicy;
|
|
116
|
+
export declare function adapterCredentialSelection(credential: ResolvedAdapterCredential): AdapterCredentialSelection;
|
|
65
117
|
/**
|
|
66
118
|
* Resolve a single credential by walking the candidate keys against
|
|
67
|
-
*
|
|
119
|
+
* the active secrets store. Returns the first match.
|
|
68
120
|
*
|
|
69
|
-
*
|
|
70
|
-
* up so the CLI surfaces a clean "missing credentials" message
|
|
71
|
-
* than a vague "401 Unauthorized" downstream.
|
|
121
|
+
* Refuses typed when no candidate resolves — adapters should let this
|
|
122
|
+
* bubble up so the CLI surfaces a clean "missing credentials" message
|
|
123
|
+
* rather than a vague "401 Unauthorized" downstream.
|
|
72
124
|
*/
|
|
73
|
-
export declare function resolveAdapterCredential(options: ResolveAdapterCredentialOptions): Promise<ResolvedAdapterCredential>;
|
|
125
|
+
export declare function resolveAdapterCredential(runtime: VibesRuntime, options: ResolveAdapterCredentialOptions): Promise<ResolvedAdapterCredential>;
|
|
74
126
|
/**
|
|
75
127
|
* Convenience wrapper for resolving multiple credentials at once.
|
|
76
128
|
* Each key gets a candidate list of one (the key itself). Use the
|
|
77
129
|
* single-credential form when you need fallback chains.
|
|
78
130
|
*/
|
|
79
|
-
export declare function resolveAdapterCredentials(keys: readonly string[], options?: Omit<ResolveAdapterCredentialOptions, 'keyCandidates' | 'humanName'>): Promise<Record<string, ResolvedAdapterCredential>>;
|
|
131
|
+
export declare function resolveAdapterCredentials(runtime: VibesRuntime, keys: readonly string[], options?: Omit<ResolveAdapterCredentialOptions, 'keyCandidates' | 'humanName'>): Promise<Record<string, ResolvedAdapterCredential>>;
|
|
132
|
+
/**
|
|
133
|
+
* Resolve an operator credential with the shared inventory/audit policy.
|
|
134
|
+
* Use `resolveAdapterCredential` directly only when a non-operator workflow
|
|
135
|
+
* intentionally needs a different selection policy (for example, store-only
|
|
136
|
+
* recovery validation).
|
|
137
|
+
*/
|
|
138
|
+
export declare function resolveOperatorCredential(runtime: VibesRuntime, options: ResolveOperatorCredentialOptions): Promise<ResolvedAdapterCredential>;
|
|
139
|
+
export {};
|
|
80
140
|
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/credentials/resolve.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/credentials/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,OAAO,EAKN,KAAK,YAAY,EACjB,MAAM,qBAAqB,CAAC;AAS7B,QAAA,MAAM,qBAAqB;;;;;EAAoD,CAAC;AAChF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,WAAW,+BAA+B;IAC/C,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAqBD,MAAM,WAAW,yBAAyB;IACzC,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gCAAiC,SAAQ,IAAI,CAC7D,+BAA+B,EAC/B,MAAM,GAAG,yBAAyB,GAAG,sBAAsB,CAC3D;IACA,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,kCAAkC,GAAG,IAAI,CACpD,+BAA+B,EAC/B,aAAa,GAAG,yBAAyB,GAAG,sBAAsB,CAClE,CAAC;AAEF,kFAAkF;AAClF,MAAM,WAAW,0BAA0B;IAC1C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,kCAAkC,CACjD,WAAW,EAAE,MAAM,GACjB,kCAAkC,CAMpC;AAED,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,yBAAyB,GACnC,0BAA0B,CAO5B;AA0JD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,+BAA+B,GACtC,OAAO,CAAC,yBAAyB,CAAC,CA+EpC;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,IAAI,CAAC,+BAA+B,EAAE,eAAe,GAAG,WAAW,CAAC,GAC5E,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAUpD;AAaD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,gCAAgC,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAMpC"}
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* (alerts, RUM, observability, …) reads from the same credential chain
|
|
6
6
|
* the rest of the platform uses. The chain (highest precedence first):
|
|
7
7
|
*
|
|
8
|
-
* 1.
|
|
9
|
-
* 2. The tier-resolved secrets/store implementation
|
|
8
|
+
* 1. The tier-resolved secrets/store implementation
|
|
10
9
|
* - local tier → encrypted-local → env-file
|
|
11
10
|
* - production → cloudflare-secrets-store → cloudflare-api
|
|
11
|
+
* There is no ambient-environment fallback: credentials resolve only through
|
|
12
|
+
* registered secrets stores, using the handed runtime (first argument).
|
|
12
13
|
*
|
|
13
14
|
* Adapters declare the secret KEY NAMES (e.g. CLOUDFLARE_API_TOKEN) on
|
|
14
15
|
* their descriptor's `adapterConfig` and use this helper to resolve
|
|
@@ -16,113 +17,286 @@
|
|
|
16
17
|
* (e.g. prefer a scoped CLOUDFLARE_NOTIFICATIONS_API_TOKEN, fall back
|
|
17
18
|
* to the broad CLOUDFLARE_API_TOKEN).
|
|
18
19
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
20
|
+
* Every refusal is a typed `CapabilityError` with a fixed message. What a
|
|
21
|
+
* backend threw is never repeated: each failing backend is carried as its
|
|
22
|
+
* value-free facts (`valueFreeFailure`) in the refusal's details. A walk in
|
|
23
|
+
* which any backend failed is `UNAVAILABLE credential-store-unavailable`,
|
|
24
|
+
* never absence; `NOT_FOUND credential-missing` (message prefix
|
|
25
|
+
* `Missing credential:`) means every backend answered and none held a candidate.
|
|
26
|
+
*
|
|
27
|
+
* Each store call is the work of a `runtime.lifecycle.wait`, so a call still
|
|
28
|
+
* running after its deadline is owned by the runtime and joined at disposal.
|
|
25
29
|
*/
|
|
26
|
-
import
|
|
30
|
+
import * as z from 'zod/v4';
|
|
31
|
+
import { readUntrusted, settleUntrusted } from '@vibesdotdev/config/manifest/read-untrusted';
|
|
32
|
+
import { getLogger } from '@vibesdotdev/logging';
|
|
33
|
+
import { CapabilityError, isCapabilityError, valueFreeFailure } from '@vibesdotdev/kernel';
|
|
34
|
+
import { settleWork } from "../settle-work.js";
|
|
35
|
+
/** The logger the opt-in `VIBES_DEBUG_SECRETS=1` trace writes to, on the handed runtime. */
|
|
36
|
+
const DEBUG_LOGGER_ID = 'infra.credentials';
|
|
37
|
+
const secretsDebugEnabled = (runtime) => runtime.getEnv('VIBES_DEBUG_SECRETS') === '1';
|
|
38
|
+
const EnvironmentTierSchema = z.enum(['local', 'dev', 'staging', 'production']);
|
|
39
|
+
/** The options as read once at the boundary: every field parsed independently, the context forwarded as given. */
|
|
40
|
+
const ResolveOptionsSchema = z.object({
|
|
41
|
+
operationContext: z.unknown().optional(),
|
|
42
|
+
keyCandidates: z.array(z.string().min(1)).min(1),
|
|
43
|
+
environment: z.string().min(1).optional(),
|
|
44
|
+
tier: EnvironmentTierSchema.optional(),
|
|
45
|
+
includeAllStoreBackends: z.boolean().optional(),
|
|
46
|
+
fallbackEnvironments: z.array(z.string()).optional(),
|
|
47
|
+
humanName: z.string().optional(),
|
|
48
|
+
backendTimeoutMs: z.number().positive().optional(),
|
|
49
|
+
resolutionTimeoutMs: z.number().positive().optional()
|
|
50
|
+
});
|
|
51
|
+
const OPTIONS_INVALID = {
|
|
52
|
+
code: 'INVALID_INPUT',
|
|
53
|
+
reason: 'credential-options-invalid',
|
|
54
|
+
message: () => 'Credential resolution options are invalid.'
|
|
55
|
+
};
|
|
56
|
+
export function operatorCredentialResolutionPolicy(environment) {
|
|
57
|
+
return {
|
|
58
|
+
environment,
|
|
59
|
+
includeAllStoreBackends: true,
|
|
60
|
+
fallbackEnvironments: environment === 'local' ? [] : ['local']
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function adapterCredentialSelection(credential) {
|
|
64
|
+
return {
|
|
65
|
+
requestedEnvironment: credential.requestedEnvironment,
|
|
66
|
+
resolvedEnvironment: credential.resolvedEnvironment,
|
|
67
|
+
key: credential.key,
|
|
68
|
+
source: credential.source
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** A resolved store that offers `get`, kept as the original object (its methods use `this`). */
|
|
72
|
+
const SecretsStoreReadsSchema = z.object({ get: z.function() });
|
|
73
|
+
const SecretsStoreReaderSchema = z.custom((value) => SecretsStoreReadsSchema.safeParse(value).success);
|
|
74
|
+
/** What a store answered for one key: a string value, or nothing. */
|
|
75
|
+
const StoredValueSchema = z.string().optional();
|
|
76
|
+
/** The selection facts of one registered store descriptor. */
|
|
77
|
+
const SecretsStoreSelectionSchema = z.looseObject({
|
|
78
|
+
id: z.string().min(1),
|
|
79
|
+
priority: z.number().optional(),
|
|
80
|
+
tiers: z.array(EnvironmentTierSchema).optional()
|
|
81
|
+
});
|
|
82
|
+
const STORE_UNREADABLE = {
|
|
83
|
+
code: 'UNAVAILABLE',
|
|
84
|
+
reason: 'secrets-store-unreadable',
|
|
85
|
+
message: () => 'A secrets store did not answer in its declared shape.'
|
|
86
|
+
};
|
|
87
|
+
/** A failed attempt, by the value-free facts `settleWork` read from what the backend threw. */
|
|
88
|
+
function backendFailure(store, failure, at = {}) {
|
|
89
|
+
return { store, ...at, failure };
|
|
90
|
+
}
|
|
91
|
+
/** The failures as JSON details: names, codes and reasons only. */
|
|
92
|
+
function failureDetails(failures) {
|
|
93
|
+
return failures.map(({ store, environment, key, failure }) => {
|
|
94
|
+
const detail = { store, name: failure.name };
|
|
95
|
+
if (environment !== undefined)
|
|
96
|
+
detail.environment = environment;
|
|
97
|
+
if (key !== undefined)
|
|
98
|
+
detail.key = key;
|
|
99
|
+
if (failure.code !== undefined)
|
|
100
|
+
detail.code = failure.code;
|
|
101
|
+
if (failure.reason !== undefined)
|
|
102
|
+
detail.reason = failure.reason;
|
|
103
|
+
return detail;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
27
106
|
/**
|
|
28
107
|
* Tier-aware backend selection. Mirrors the secrets/store kind's own
|
|
29
|
-
* resolver (`
|
|
108
|
+
* resolver (`secrets/src/kinds/store.kind.ts`) so callers
|
|
30
109
|
* don't need to import internal helpers.
|
|
31
110
|
*/
|
|
32
|
-
function
|
|
111
|
+
function pickBackends(descriptors, tier, includeAllStoreBackends = false) {
|
|
33
112
|
if (descriptors.length === 0)
|
|
34
|
-
return
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
113
|
+
return [];
|
|
114
|
+
const pool = includeAllStoreBackends
|
|
115
|
+
? descriptors
|
|
116
|
+
: descriptors.filter((d) => (d.tiers ?? []).includes(tier));
|
|
117
|
+
const candidates = pool.length > 0 ? pool : descriptors;
|
|
118
|
+
return [...candidates].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
39
119
|
}
|
|
40
120
|
function inferTier(environment, override) {
|
|
41
121
|
if (override)
|
|
42
122
|
return override;
|
|
43
|
-
|
|
44
|
-
|
|
123
|
+
const known = EnvironmentTierSchema.safeParse(environment);
|
|
124
|
+
return known.success ? known.data : 'local';
|
|
125
|
+
}
|
|
126
|
+
/** Every registered store's selection facts; one that does not read is a carried failure, never dropped. */
|
|
127
|
+
function storeSelections(runtime, failures) {
|
|
128
|
+
const selections = [];
|
|
129
|
+
for (const [index, descriptor] of runtime.assets('secrets/store').descriptors().entries()) {
|
|
130
|
+
const read = settleUntrusted(SecretsStoreSelectionSchema, () => descriptor, STORE_UNREADABLE);
|
|
131
|
+
if (read.ok)
|
|
132
|
+
selections.push(read.data);
|
|
133
|
+
else
|
|
134
|
+
failures.push(backendFailure(`#${index + 1}`, valueFreeFailure(read.error)));
|
|
135
|
+
}
|
|
136
|
+
return selections;
|
|
137
|
+
}
|
|
138
|
+
/** Walk the backends in priority order under the resolution deadline's `signal`; never reads past it. */
|
|
139
|
+
async function walkBackends(runtime, plan, failures, signal) {
|
|
140
|
+
const debug = secretsDebugEnabled(runtime) ? getLogger(DEBUG_LOGGER_ID, runtime) : undefined;
|
|
141
|
+
for (const target of plan.targets) {
|
|
142
|
+
if (signal.aborted)
|
|
143
|
+
return { kind: 'aborted' };
|
|
144
|
+
const opened = await settleWork(async () => {
|
|
145
|
+
const resolved = await runtime.lifecycle.wait(() => runtime.query('secrets/store').withId(target.id).resolve(), { timeoutMs: plan.backendTimeoutMs, reason: `secrets-store-${target.id}-resolution`, signal });
|
|
146
|
+
return readUntrusted(SecretsStoreReaderSchema, () => resolved, STORE_UNREADABLE);
|
|
147
|
+
});
|
|
148
|
+
if (!opened.ok) {
|
|
149
|
+
failures.push(backendFailure(target.id, opened.failure));
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const store = opened.value;
|
|
153
|
+
for (const environment of plan.environments) {
|
|
154
|
+
for (const key of plan.keys) {
|
|
155
|
+
if (signal.aborted)
|
|
156
|
+
return { kind: 'aborted' };
|
|
157
|
+
const read = await settleWork(async () => {
|
|
158
|
+
const stored = await runtime.lifecycle.wait(() => store.get(environment, key, plan.operationContext), { timeoutMs: plan.backendTimeoutMs, reason: `secrets-store-${target.id}-read`, signal });
|
|
159
|
+
return readUntrusted(StoredValueSchema, () => stored, STORE_UNREADABLE);
|
|
160
|
+
});
|
|
161
|
+
if (!read.ok) {
|
|
162
|
+
failures.push(backendFailure(target.id, read.failure, { environment, key }));
|
|
163
|
+
}
|
|
164
|
+
else if (read.value !== undefined && read.value.length > 0) {
|
|
165
|
+
debug?.info('secrets debug: credential resolved', { key, store: target.id, environment });
|
|
166
|
+
return {
|
|
167
|
+
kind: 'resolved',
|
|
168
|
+
credential: { key, value: read.value, source: target.id, requestedEnvironment: plan.requestedEnvironment, resolvedEnvironment: environment }
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
45
173
|
}
|
|
46
|
-
return '
|
|
174
|
+
return { kind: 'exhausted' };
|
|
47
175
|
}
|
|
48
176
|
/**
|
|
49
177
|
* Resolve a single credential by walking the candidate keys against
|
|
50
|
-
*
|
|
178
|
+
* the active secrets store. Returns the first match.
|
|
51
179
|
*
|
|
52
|
-
*
|
|
53
|
-
* up so the CLI surfaces a clean "missing credentials" message
|
|
54
|
-
* than a vague "401 Unauthorized" downstream.
|
|
180
|
+
* Refuses typed when no candidate resolves — adapters should let this
|
|
181
|
+
* bubble up so the CLI surfaces a clean "missing credentials" message
|
|
182
|
+
* rather than a vague "401 Unauthorized" downstream.
|
|
55
183
|
*/
|
|
56
|
-
export async function resolveAdapterCredential(options) {
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
//
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
184
|
+
export async function resolveAdapterCredential(runtime, options) {
|
|
185
|
+
const input = readUntrusted(ResolveOptionsSchema, () => options, OPTIONS_INVALID);
|
|
186
|
+
const env = input.environment ?? 'local';
|
|
187
|
+
const tier = inferTier(env, input.tier);
|
|
188
|
+
// Ceilings sized for the MEASURED store path, not the hoped-for one: a
|
|
189
|
+
// resolution walks the key-candidate list serially, and each miss is a
|
|
190
|
+
// full secrets-store roundtrip (Cloudflare-backed; observed 5-15s per read
|
|
191
|
+
// under load, 2026-08-18). Five candidates at 20s total aborted a healthy
|
|
192
|
+
// resolution mid-walk — the operator saw "timed out" while the store was
|
|
193
|
+
// merely slow, and worked around the blessed path by hand.
|
|
194
|
+
const backendTimeoutMs = input.backendTimeoutMs ?? 15_000;
|
|
195
|
+
const resolutionTimeoutMs = input.resolutionTimeoutMs ?? 90_000;
|
|
196
|
+
const keys = input.keyCandidates;
|
|
197
|
+
const subject = { keys: [...keys], environment: env, tier };
|
|
198
|
+
if (input.humanName !== undefined)
|
|
199
|
+
subject.humanName = input.humanName;
|
|
71
200
|
if (!runtime.hasKind('secrets/store')) {
|
|
72
|
-
throw new
|
|
73
|
-
'
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
.descriptors();
|
|
78
|
-
// `VIBES_DEBUG_SECRETS=1` dumps the visible descriptor pool when
|
|
79
|
-
// you're tracing why a credential is missing or getting misrouted.
|
|
80
|
-
if (process.env.VIBES_DEBUG_SECRETS === '1') {
|
|
81
|
-
console.error(`[secrets-debug] descriptors visible at tier=${tier}:`);
|
|
82
|
-
for (const d of descriptors) {
|
|
83
|
-
console.error(` - id=${d.id} priority=${d.priority ?? '-'} tiers=${JSON.stringify(d.tiers)}`);
|
|
84
|
-
}
|
|
201
|
+
throw new CapabilityError('No secrets/store kind is registered; the credential cannot resolve.', 'UNAVAILABLE', {
|
|
202
|
+
reason: 'secrets-store-unregistered',
|
|
203
|
+
details: subject,
|
|
204
|
+
recoveryHint: 'Load the secrets plugin (and a backend like encrypted-local) before calling this adapter.'
|
|
205
|
+
});
|
|
85
206
|
}
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
207
|
+
const failures = [];
|
|
208
|
+
const selections = storeSelections(runtime, failures);
|
|
209
|
+
const debug = secretsDebugEnabled(runtime) ? getLogger(DEBUG_LOGGER_ID, runtime) : undefined;
|
|
210
|
+
// `VIBES_DEBUG_SECRETS=1` traces the visible descriptor pool (ids, priorities, tiers; never a value).
|
|
211
|
+
debug?.info('secrets debug: stores visible', {
|
|
212
|
+
tier,
|
|
213
|
+
stores: selections.map((s) => ({ id: s.id, priority: s.priority ?? null, tiers: s.tiers ?? null }))
|
|
214
|
+
});
|
|
215
|
+
const targets = pickBackends(selections, tier, input.includeAllStoreBackends);
|
|
216
|
+
if (targets.length === 0) {
|
|
217
|
+
throw new CapabilityError('No secrets/store backend is available for this tier.', 'UNAVAILABLE', {
|
|
218
|
+
reason: 'secrets-store-backend-unavailable',
|
|
219
|
+
details: { ...subject, failures: failureDetails(failures) },
|
|
220
|
+
recoveryHint: 'Register a backend (encrypted-local for local, cloudflare-secrets-store for production).'
|
|
221
|
+
});
|
|
90
222
|
}
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
223
|
+
const plan = {
|
|
224
|
+
targets,
|
|
225
|
+
environments: [env, ...(input.fallbackEnvironments ?? []).filter((candidate) => candidate && candidate !== env)],
|
|
226
|
+
keys,
|
|
227
|
+
requestedEnvironment: env,
|
|
228
|
+
backendTimeoutMs,
|
|
229
|
+
operationContext: input.operationContext
|
|
230
|
+
};
|
|
231
|
+
let outcome;
|
|
232
|
+
try {
|
|
233
|
+
outcome = await runtime.lifecycle.wait((signal) => walkBackends(runtime, plan, failures, signal), {
|
|
234
|
+
timeoutMs: resolutionTimeoutMs,
|
|
235
|
+
reason: 'credential-resolution'
|
|
236
|
+
});
|
|
97
237
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
catch {
|
|
106
|
-
// next candidate
|
|
238
|
+
catch (error) {
|
|
239
|
+
if (error instanceof Error && isCapabilityError(error) && error.reason === 'wait-timeout') {
|
|
240
|
+
throw new CapabilityError('Credential resolution timed out.', 'TIMEOUT', {
|
|
241
|
+
reason: 'credential-resolution-timeout',
|
|
242
|
+
details: { ...subject, timeoutMs: resolutionTimeoutMs, failures: failureDetails(failures) },
|
|
243
|
+
cause: valueFreeFailure(error)
|
|
244
|
+
});
|
|
107
245
|
}
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
if (outcome.kind === 'resolved')
|
|
249
|
+
return outcome.credential;
|
|
250
|
+
const stores = targets.map((d) => d.id);
|
|
251
|
+
// Absence only when every backend answered: one failed store may hold the credential.
|
|
252
|
+
if (outcome.kind === 'exhausted' && failures.length === 0) {
|
|
253
|
+
throw new CapabilityError('Missing credential: none of the candidate keys resolved from the secrets store.', 'NOT_FOUND', {
|
|
254
|
+
reason: 'credential-missing',
|
|
255
|
+
details: { ...subject, stores, failures: failureDetails(failures) },
|
|
256
|
+
recoveryHint: `Provision it through the configured Vibes secrets workflow for environment "${env}".`
|
|
257
|
+
});
|
|
108
258
|
}
|
|
109
|
-
throw new
|
|
110
|
-
|
|
111
|
-
|
|
259
|
+
throw new CapabilityError('The secrets store could not be read for this credential.', 'UNAVAILABLE', {
|
|
260
|
+
reason: 'credential-store-unavailable',
|
|
261
|
+
details: { ...subject, stores, failures: failureDetails(failures) }
|
|
262
|
+
});
|
|
112
263
|
}
|
|
113
264
|
/**
|
|
114
265
|
* Convenience wrapper for resolving multiple credentials at once.
|
|
115
266
|
* Each key gets a candidate list of one (the key itself). Use the
|
|
116
267
|
* single-credential form when you need fallback chains.
|
|
117
268
|
*/
|
|
118
|
-
export async function resolveAdapterCredentials(keys, options) {
|
|
269
|
+
export async function resolveAdapterCredentials(runtime, keys, options) {
|
|
270
|
+
const input = readUntrusted(PluralOptionsSchema, () => ({ keys, options }), OPTIONS_INVALID);
|
|
119
271
|
const out = {};
|
|
120
|
-
for (const key of keys) {
|
|
121
|
-
out[key] = await resolveAdapterCredential({
|
|
272
|
+
for (const key of input.keys) {
|
|
273
|
+
out[key] = await resolveAdapterCredential(runtime, {
|
|
122
274
|
keyCandidates: [key],
|
|
123
|
-
...
|
|
275
|
+
...input.options
|
|
124
276
|
});
|
|
125
277
|
}
|
|
126
278
|
return out;
|
|
127
279
|
}
|
|
280
|
+
/** The plural form's keys and shared options, read once at its boundary. */
|
|
281
|
+
const PluralOptionsSchema = z.object({
|
|
282
|
+
keys: z.array(z.string().min(1)),
|
|
283
|
+
options: ResolveOptionsSchema.omit({ keyCandidates: true, humanName: true }).optional()
|
|
284
|
+
});
|
|
285
|
+
/** The operator form's options, read once at its boundary; the selection policy is fixed, never taken from the caller. */
|
|
286
|
+
const OperatorOptionsSchema = ResolveOptionsSchema.omit({ tier: true, includeAllStoreBackends: true, fallbackEnvironments: true }).extend({
|
|
287
|
+
environment: z.string().min(1)
|
|
288
|
+
});
|
|
289
|
+
/**
|
|
290
|
+
* Resolve an operator credential with the shared inventory/audit policy.
|
|
291
|
+
* Use `resolveAdapterCredential` directly only when a non-operator workflow
|
|
292
|
+
* intentionally needs a different selection policy (for example, store-only
|
|
293
|
+
* recovery validation).
|
|
294
|
+
*/
|
|
295
|
+
export async function resolveOperatorCredential(runtime, options) {
|
|
296
|
+
const input = readUntrusted(OperatorOptionsSchema, () => options, OPTIONS_INVALID);
|
|
297
|
+
return resolveAdapterCredential(runtime, {
|
|
298
|
+
...input,
|
|
299
|
+
...operatorCredentialResolutionPolicy(input.environment)
|
|
300
|
+
});
|
|
301
|
+
}
|
|
128
302
|
//# sourceMappingURL=resolve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/credentials/resolve.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/credentials/resolve.ts"],"names":[],"mappings":"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"}
|