@vibesdotdev/integrations-digitalocean 0.0.0-stage → 1.0.0-rc.2
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 +126 -0
- package/README.md +78 -2
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +4 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/inference.transport.impl.d.ts +5 -0
- package/dist/ai/inference.transport.impl.d.ts.map +1 -0
- package/dist/ai/inference.transport.impl.js +54 -0
- package/dist/ai/inference.transport.impl.js.map +1 -0
- package/dist/ai/provider.plugin.d.ts +6 -0
- package/dist/ai/provider.plugin.d.ts.map +1 -0
- package/dist/ai/provider.plugin.js +126 -0
- package/dist/ai/provider.plugin.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.d.ts +62 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.js +73 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.d.ts +2 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.js +2 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.d.ts +183 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.js +66 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.js.map +1 -0
- package/dist/apps/api-client.d.ts +45 -0
- package/dist/apps/api-client.d.ts.map +1 -0
- package/dist/apps/api-client.js +47 -0
- package/dist/apps/api-client.js.map +1 -0
- package/dist/apps/build-spec.d.ts +44 -0
- package/dist/apps/build-spec.d.ts.map +1 -0
- package/dist/apps/build-spec.js +463 -0
- package/dist/apps/build-spec.js.map +1 -0
- package/dist/apps/deploy-client.d.ts +42 -0
- package/dist/apps/deploy-client.d.ts.map +1 -0
- package/dist/apps/deploy-client.js +300 -0
- package/dist/apps/deploy-client.js.map +1 -0
- package/dist/apps/index.d.ts +5 -0
- package/dist/apps/index.d.ts.map +1 -0
- package/dist/apps/index.js +4 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/types.d.ts +204 -0
- package/dist/apps/types.d.ts.map +1 -0
- package/dist/apps/types.js +13 -0
- package/dist/apps/types.js.map +1 -0
- package/dist/client/control-plane.d.ts +49 -0
- package/dist/client/control-plane.d.ts.map +1 -0
- package/dist/client/control-plane.js +85 -0
- package/dist/client/control-plane.js.map +1 -0
- package/dist/client/do-fetch.d.ts +41 -0
- package/dist/client/do-fetch.d.ts.map +1 -0
- package/dist/client/do-fetch.js +199 -0
- package/dist/client/do-fetch.js.map +1 -0
- package/dist/client/errors.d.ts +6 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +34 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/factory.d.ts +53 -0
- package/dist/client/factory.d.ts.map +1 -0
- package/dist/client/factory.js +220 -0
- package/dist/client/factory.js.map +1 -0
- package/dist/client/helpers.d.ts +5 -0
- package/dist/client/helpers.d.ts.map +1 -0
- package/dist/client/helpers.js +8 -0
- package/dist/client/helpers.js.map +1 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +10 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/paginated.d.ts +19 -0
- package/dist/client/paginated.d.ts.map +1 -0
- package/dist/client/paginated.js +56 -0
- package/dist/client/paginated.js.map +1 -0
- package/dist/client/retry.d.ts +34 -0
- package/dist/client/retry.d.ts.map +1 -0
- package/dist/client/retry.js +53 -0
- package/dist/client/retry.js.map +1 -0
- package/dist/config/digitalocean.config.descriptor.d.ts +197 -0
- package/dist/config/digitalocean.config.descriptor.d.ts.map +1 -0
- package/dist/config/digitalocean.config.descriptor.js +59 -0
- package/dist/config/digitalocean.config.descriptor.js.map +1 -0
- package/dist/credentials/index.d.ts +38 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +56 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/databases/index.d.ts +82 -0
- package/dist/databases/index.d.ts.map +1 -0
- package/dist/databases/index.js +57 -0
- package/dist/databases/index.js.map +1 -0
- package/dist/digitalocean-friction.policy.d.ts +29 -0
- package/dist/digitalocean-friction.policy.d.ts.map +1 -0
- package/dist/digitalocean-friction.policy.js +21 -0
- package/dist/digitalocean-friction.policy.js.map +1 -0
- package/dist/digitalocean.plugin.d.ts +3 -0
- package/dist/digitalocean.plugin.d.ts.map +1 -0
- package/dist/digitalocean.plugin.js +27 -0
- package/dist/digitalocean.plugin.js.map +1 -0
- package/dist/droplets/index.d.ts +106 -0
- package/dist/droplets/index.d.ts.map +1 -0
- package/dist/droplets/index.js +227 -0
- package/dist/droplets/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/inference-control-plane/index.d.ts +63 -0
- package/dist/inference-control-plane/index.d.ts.map +1 -0
- package/dist/inference-control-plane/index.js +93 -0
- package/dist/inference-control-plane/index.js.map +1 -0
- package/dist/infra/billing.d.ts +26 -0
- package/dist/infra/billing.d.ts.map +1 -0
- package/dist/infra/billing.js +43 -0
- package/dist/infra/billing.js.map +1 -0
- package/dist/infra/credentials.d.ts +11 -0
- package/dist/infra/credentials.d.ts.map +1 -0
- package/dist/infra/credentials.js +15 -0
- package/dist/infra/credentials.js.map +1 -0
- package/dist/infra/deployment-provider/deploy-secrets.d.ts +10 -0
- package/dist/infra/deployment-provider/deploy-secrets.d.ts.map +1 -0
- package/dist/infra/deployment-provider/deploy-secrets.js +66 -0
- package/dist/infra/deployment-provider/deploy-secrets.js.map +1 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.d.ts +97 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.d.ts.map +1 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.js +242 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.js.map +1 -0
- package/dist/infra/deployment-provider/image-publish.d.ts +39 -0
- package/dist/infra/deployment-provider/image-publish.d.ts.map +1 -0
- package/dist/infra/deployment-provider/image-publish.js +146 -0
- package/dist/infra/deployment-provider/image-publish.js.map +1 -0
- package/dist/infra/deployment-provider.descriptor.d.ts +34 -0
- package/dist/infra/deployment-provider.descriptor.d.ts.map +1 -0
- package/dist/infra/deployment-provider.descriptor.js +9 -0
- package/dist/infra/deployment-provider.descriptor.js.map +1 -0
- package/dist/infra/digitalocean-infra.plugin.d.ts +101 -0
- package/dist/infra/digitalocean-infra.plugin.d.ts.map +1 -0
- package/dist/infra/digitalocean-infra.plugin.js +283 -0
- package/dist/infra/digitalocean-infra.plugin.js.map +1 -0
- package/dist/infra/doks/clients.d.ts +183 -0
- package/dist/infra/doks/clients.d.ts.map +1 -0
- package/dist/infra/doks/clients.js +172 -0
- package/dist/infra/doks/clients.js.map +1 -0
- package/dist/infra/doks/digitalocean.d.ts +34 -0
- package/dist/infra/doks/digitalocean.d.ts.map +1 -0
- package/dist/infra/doks/digitalocean.js +267 -0
- package/dist/infra/doks/digitalocean.js.map +1 -0
- package/dist/infra/doks/service-release-schemas.d.ts +1037 -0
- package/dist/infra/doks/service-release-schemas.d.ts.map +1 -0
- package/dist/infra/doks/service-release-schemas.js +51 -0
- package/dist/infra/doks/service-release-schemas.js.map +1 -0
- package/dist/infra/doks/service-release.d.ts +415 -0
- package/dist/infra/doks/service-release.d.ts.map +1 -0
- package/dist/infra/doks/service-release.js +3201 -0
- package/dist/infra/doks/service-release.js.map +1 -0
- package/dist/infra/doks/worker.d.ts +14 -0
- package/dist/infra/doks/worker.d.ts.map +1 -0
- package/dist/infra/doks/worker.js +343 -0
- package/dist/infra/doks/worker.js.map +1 -0
- package/dist/infra/droplet.impl.d.ts +172 -0
- package/dist/infra/droplet.impl.d.ts.map +1 -0
- package/dist/infra/droplet.impl.js +379 -0
- package/dist/infra/droplet.impl.js.map +1 -0
- package/dist/infra/functions.impl.d.ts +123 -0
- package/dist/infra/functions.impl.d.ts.map +1 -0
- package/dist/infra/functions.impl.js +202 -0
- package/dist/infra/functions.impl.js.map +1 -0
- package/dist/infra/index.d.ts +15 -0
- package/dist/infra/index.d.ts.map +1 -0
- package/dist/infra/index.js +12 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/infra/inventory.d.ts +7 -0
- package/dist/infra/inventory.d.ts.map +1 -0
- package/dist/infra/inventory.js +259 -0
- package/dist/infra/inventory.js.map +1 -0
- package/dist/infra/kubernetes-log-stream.d.ts +5 -0
- package/dist/infra/kubernetes-log-stream.d.ts.map +1 -0
- package/dist/infra/kubernetes-log-stream.js +186 -0
- package/dist/infra/kubernetes-log-stream.js.map +1 -0
- package/dist/infra/kubernetes-logs.d.ts +33 -0
- package/dist/infra/kubernetes-logs.d.ts.map +1 -0
- package/dist/infra/kubernetes-logs.descriptor.d.ts +14 -0
- package/dist/infra/kubernetes-logs.descriptor.d.ts.map +1 -0
- package/dist/infra/kubernetes-logs.descriptor.js +28 -0
- package/dist/infra/kubernetes-logs.descriptor.js.map +1 -0
- package/dist/infra/kubernetes-logs.js +196 -0
- package/dist/infra/kubernetes-logs.js.map +1 -0
- package/dist/infra/utilization.d.ts +44 -0
- package/dist/infra/utilization.d.ts.map +1 -0
- package/dist/infra/utilization.js +108 -0
- package/dist/infra/utilization.js.map +1 -0
- package/dist/kubernetes/authority.d.ts +40 -0
- package/dist/kubernetes/authority.d.ts.map +1 -0
- package/dist/kubernetes/authority.js +90 -0
- package/dist/kubernetes/authority.js.map +1 -0
- package/dist/kubernetes/encoding.d.ts +4 -0
- package/dist/kubernetes/encoding.d.ts.map +1 -0
- package/dist/kubernetes/encoding.js +8 -0
- package/dist/kubernetes/encoding.js.map +1 -0
- package/dist/kubernetes/index.d.ts +105 -0
- package/dist/kubernetes/index.d.ts.map +1 -0
- package/dist/kubernetes/index.js +99 -0
- package/dist/kubernetes/index.js.map +1 -0
- package/dist/kubernetes/transport.d.ts +11 -0
- package/dist/kubernetes/transport.d.ts.map +1 -0
- package/dist/kubernetes/transport.js +27 -0
- package/dist/kubernetes/transport.js.map +1 -0
- package/dist/network/index.d.ts +24 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +16 -0
- package/dist/network/index.js.map +1 -0
- package/dist/registry/index.d.ts +39 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +20 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/schemas/app-deployment.d.ts +1474 -0
- package/dist/schemas/app-deployment.d.ts.map +1 -0
- package/dist/schemas/app-deployment.js +156 -0
- package/dist/schemas/app-deployment.js.map +1 -0
- package/dist/schemas/app-platform.d.ts +755 -0
- package/dist/schemas/app-platform.d.ts.map +1 -0
- package/dist/schemas/app-platform.js +253 -0
- package/dist/schemas/app-platform.js.map +1 -0
- package/dist/schemas/cache-database.d.ts +210 -0
- package/dist/schemas/cache-database.d.ts.map +1 -0
- package/dist/schemas/cache-database.js +105 -0
- package/dist/schemas/cache-database.js.map +1 -0
- package/dist/schemas/control-plane.d.ts +456 -0
- package/dist/schemas/control-plane.d.ts.map +1 -0
- package/dist/schemas/control-plane.js +123 -0
- package/dist/schemas/control-plane.js.map +1 -0
- package/dist/schemas/credential-use.d.ts +714 -0
- package/dist/schemas/credential-use.d.ts.map +1 -0
- package/dist/schemas/credential-use.js +73 -0
- package/dist/schemas/credential-use.js.map +1 -0
- package/dist/schemas/doks-worker.d.ts +4071 -0
- package/dist/schemas/doks-worker.d.ts.map +1 -0
- package/dist/schemas/doks-worker.js +330 -0
- package/dist/schemas/doks-worker.js.map +1 -0
- package/dist/schemas/droplet.d.ts +110 -0
- package/dist/schemas/droplet.d.ts.map +1 -0
- package/dist/schemas/droplet.js +22 -0
- package/dist/schemas/droplet.js.map +1 -0
- package/dist/schemas/functions.d.ts +22 -0
- package/dist/schemas/functions.d.ts.map +1 -0
- package/dist/schemas/functions.js +25 -0
- package/dist/schemas/functions.js.map +1 -0
- package/dist/schemas/gitea-git-hosting.d.ts +20 -0
- package/dist/schemas/gitea-git-hosting.d.ts.map +1 -0
- package/dist/schemas/gitea-git-hosting.js +26 -0
- package/dist/schemas/gitea-git-hosting.js.map +1 -0
- package/dist/schemas/http.d.ts +2594 -0
- package/dist/schemas/http.d.ts.map +1 -0
- package/dist/schemas/http.js +4548 -0
- package/dist/schemas/http.js.map +1 -0
- package/dist/schemas/infra-kinds.d.ts +113 -0
- package/dist/schemas/infra-kinds.d.ts.map +1 -0
- package/dist/schemas/infra-kinds.js +93 -0
- package/dist/schemas/infra-kinds.js.map +1 -0
- package/dist/schemas/kubernetes-responses.d.ts +457 -0
- package/dist/schemas/kubernetes-responses.d.ts.map +1 -0
- package/dist/schemas/kubernetes-responses.js +681 -0
- package/dist/schemas/kubernetes-responses.js.map +1 -0
- package/dist/schemas/kubernetes.d.ts +143 -0
- package/dist/schemas/kubernetes.d.ts.map +1 -0
- package/dist/schemas/kubernetes.js +68 -0
- package/dist/schemas/kubernetes.js.map +1 -0
- package/dist/schemas/logs.d.ts +15 -0
- package/dist/schemas/logs.d.ts.map +1 -0
- package/dist/schemas/logs.js +11 -0
- package/dist/schemas/logs.js.map +1 -0
- package/dist/schemas/object-storage.d.ts +167 -0
- package/dist/schemas/object-storage.d.ts.map +1 -0
- package/dist/schemas/object-storage.js +124 -0
- package/dist/schemas/object-storage.js.map +1 -0
- package/dist/schemas/service-settings.d.ts +9 -0
- package/dist/schemas/service-settings.d.ts.map +1 -0
- package/dist/schemas/service-settings.js +21 -0
- package/dist/schemas/service-settings.js.map +1 -0
- package/dist/schemas/utilization.d.ts +57 -0
- package/dist/schemas/utilization.d.ts.map +1 -0
- package/dist/schemas/utilization.js +58 -0
- package/dist/schemas/utilization.js.map +1 -0
- package/dist/schemas/worker-status.d.ts +22 -0
- package/dist/schemas/worker-status.d.ts.map +1 -0
- package/dist/schemas/worker-status.js +14 -0
- package/dist/schemas/worker-status.js.map +1 -0
- package/dist/schemas/worker.d.ts +125 -0
- package/dist/schemas/worker.d.ts.map +1 -0
- package/dist/schemas/worker.js +129 -0
- package/dist/schemas/worker.js.map +1 -0
- package/dist/secrets/app-platform/app-credentials.impl.d.ts +14 -0
- package/dist/secrets/app-platform/app-credentials.impl.d.ts.map +1 -0
- package/dist/secrets/app-platform/app-credentials.impl.js +237 -0
- package/dist/secrets/app-platform/app-credentials.impl.js.map +1 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.d.ts +11 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.d.ts.map +1 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.js +26 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.js.map +1 -0
- package/dist/secrets/doks-secret.descriptor.d.ts +18 -0
- package/dist/secrets/doks-secret.descriptor.d.ts.map +1 -0
- package/dist/secrets/doks-secret.descriptor.js +35 -0
- package/dist/secrets/doks-secret.descriptor.js.map +1 -0
- package/dist/secrets/doks-secret.impl.d.ts +98 -0
- package/dist/secrets/doks-secret.impl.d.ts.map +1 -0
- package/dist/secrets/doks-secret.impl.js +451 -0
- package/dist/secrets/doks-secret.impl.js.map +1 -0
- package/dist/secrets/index.d.ts +4 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +4 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/secrets-backend-doks.plugin.d.ts +3 -0
- package/dist/secrets/secrets-backend-doks.plugin.d.ts.map +1 -0
- package/dist/secrets/secrets-backend-doks.plugin.js +35 -0
- package/dist/secrets/secrets-backend-doks.plugin.js.map +1 -0
- package/dist/storage/index.d.ts +50 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +92 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/spaces-keys.d.ts +25 -0
- package/dist/storage/spaces-keys.d.ts.map +1 -0
- package/dist/storage/spaces-keys.js +32 -0
- package/dist/storage/spaces-keys.js.map +1 -0
- package/package.json +172 -4
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { CapabilityError, CaughtFailureSchema, settle } from '@vibesdotdev/kernel';
|
|
2
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
3
|
+
import { getVibesSecretsClient } from '@vibesdotdev/secrets/client';
|
|
4
|
+
import { CredentialUseBindingSchema } from '@vibesdotdev/secrets/schemas';
|
|
5
|
+
import { loadDigitalOceanCredentialSettings } from "../config/digitalocean.config.descriptor.js";
|
|
6
|
+
import { DigitalOceanCredentialUseOutcomeSchema, DigitalOceanSpacesCredentialUseOutcomeSchema } from "../schemas/control-plane.js";
|
|
7
|
+
import { DigitalOceanCredentialUseReadSchema, DigitalOceanCredentialUseRequestSchema, DigitalOceanCredentialProvenanceSchema, DigitalOceanModelAuthenticatedRequestSchema, DigitalOceanModelCredentialProvenanceSchema, DigitalOceanSpacesCredentialUseRequestSchema } from "../schemas/credential-use.js";
|
|
8
|
+
import { DigitalOceanControlPlaneClient } from "./control-plane.js";
|
|
9
|
+
import { DigitalOceanAppsClient } from "../apps/api-client.js";
|
|
10
|
+
import { DigitalOceanDropletsClient } from "../droplets/index.js";
|
|
11
|
+
import { DigitalOceanStorageClient } from "../storage/index.js";
|
|
12
|
+
import { DigitalOceanKubernetesClient } from "../kubernetes/index.js";
|
|
13
|
+
import { DigitalOceanDatabasesClient } from "../databases/index.js";
|
|
14
|
+
import { DigitalOceanAppDeployClient } from "../apps/deploy-client.js";
|
|
15
|
+
import { requireApiToken } from "../credentials/index.js";
|
|
16
|
+
/** Only confirmed absence advances to the next candidate; every other refusal propagates. */
|
|
17
|
+
function isConfirmedAbsence(failure) {
|
|
18
|
+
return (failure instanceof CapabilityError &&
|
|
19
|
+
failure.code === 'NOT_FOUND' &&
|
|
20
|
+
failure.reason === 'credential-not-set');
|
|
21
|
+
}
|
|
22
|
+
/** The refusal when no candidate held the credential: the references tried, never a value. */
|
|
23
|
+
function credentialMissing(candidates) {
|
|
24
|
+
const references = candidates.map((candidate) => 'reference' in candidate ? candidate.reference : candidate);
|
|
25
|
+
return new CapabilityError('No DigitalOcean credential candidate is set.', 'AUTH_REQUIRED', {
|
|
26
|
+
reason: 'digitalocean-credential-missing',
|
|
27
|
+
recoveryHint: 'Store the credential through secrets/store, or compose its reference in the credential-use settings.',
|
|
28
|
+
details: {
|
|
29
|
+
candidates: references.map(({ key, store }) => ({ key, store }))
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function sendWithCredentialReferences(runtime, request, candidates) {
|
|
34
|
+
const secrets = await getVibesSecretsClient(runtime);
|
|
35
|
+
for (const candidate of candidates) {
|
|
36
|
+
const presenceInput = {
|
|
37
|
+
key: candidate.reference.key,
|
|
38
|
+
store: candidate.reference.store
|
|
39
|
+
};
|
|
40
|
+
if (request.operation !== undefined)
|
|
41
|
+
presenceInput.operation = request.operation;
|
|
42
|
+
const presence = await settle(() => secrets.checkCredentialPresence(presenceInput));
|
|
43
|
+
if (!presence.ok) {
|
|
44
|
+
const failure = CaughtFailureSchema.parse(presence.cause);
|
|
45
|
+
if (!isConfirmedAbsence(failure))
|
|
46
|
+
throw failure;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const additionalBindings = request.options.credentialBindings;
|
|
50
|
+
const options = additionalBindings === undefined
|
|
51
|
+
? {
|
|
52
|
+
...request.options,
|
|
53
|
+
credential: candidate.reference
|
|
54
|
+
}
|
|
55
|
+
: {
|
|
56
|
+
...request.options,
|
|
57
|
+
credentialBindings: [
|
|
58
|
+
...additionalBindings,
|
|
59
|
+
CredentialUseBindingSchema.parse({
|
|
60
|
+
kind: 'header',
|
|
61
|
+
candidates: [candidate.reference],
|
|
62
|
+
header: 'Authorization',
|
|
63
|
+
prefix: 'Bearer '
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
};
|
|
67
|
+
const authenticatedInput = {
|
|
68
|
+
url: request.url,
|
|
69
|
+
options
|
|
70
|
+
};
|
|
71
|
+
if (request.signal !== undefined)
|
|
72
|
+
authenticatedInput.signal = request.signal;
|
|
73
|
+
if (request.operation !== undefined)
|
|
74
|
+
authenticatedInput.operation = request.operation;
|
|
75
|
+
const attempt = await settle(() => secrets.sendAuthenticatedRequest(authenticatedInput));
|
|
76
|
+
if (attempt.ok)
|
|
77
|
+
return { response: attempt.value, provenance: candidate.provenance };
|
|
78
|
+
throw CaughtFailureSchema.parse(attempt.cause);
|
|
79
|
+
}
|
|
80
|
+
throw credentialMissing(candidates.map(({ reference }) => reference));
|
|
81
|
+
}
|
|
82
|
+
/** The runtime owns this semantic factory and the lifetime of its clients. */
|
|
83
|
+
export class DigitalOceanClientFactory extends BaseRuntimeClient {
|
|
84
|
+
async sendAuthenticatedRequest(input) {
|
|
85
|
+
const parsed = DigitalOceanCredentialUseRequestSchema.safeParse(input);
|
|
86
|
+
if (!parsed.success) {
|
|
87
|
+
throw new CapabilityError('DigitalOcean authenticated request is invalid.', 'INVALID_INPUT', {
|
|
88
|
+
reason: 'digitalocean-credential-use-invalid',
|
|
89
|
+
retryable: false,
|
|
90
|
+
details: { issueCount: parsed.error.issues.length }
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const settings = await loadDigitalOceanCredentialSettings(this.runtime);
|
|
94
|
+
const candidates = parsed.data.candidates ?? settings.apiTokenCandidates;
|
|
95
|
+
return sendWithCredentialReferences(this.runtime, {
|
|
96
|
+
url: parsed.data.url,
|
|
97
|
+
options: parsed.data.options,
|
|
98
|
+
signal: parsed.data.signal,
|
|
99
|
+
operation: parsed.data.operation
|
|
100
|
+
}, candidates.map((candidate) => ({
|
|
101
|
+
reference: candidate.reference,
|
|
102
|
+
provenance: DigitalOceanCredentialProvenanceSchema.parse(candidate)
|
|
103
|
+
})));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Send a provider request through the configured ordered model-key references.
|
|
107
|
+
* Secrets resolves each reference, binds bearer authority and sends the request.
|
|
108
|
+
*/
|
|
109
|
+
async sendModelAuthenticatedRequest(input) {
|
|
110
|
+
const parsed = DigitalOceanModelAuthenticatedRequestSchema.safeParse(input);
|
|
111
|
+
if (!parsed.success) {
|
|
112
|
+
throw new CapabilityError('DigitalOcean model request is invalid.', 'INVALID_INPUT', {
|
|
113
|
+
reason: 'digitalocean-credential-use-invalid',
|
|
114
|
+
retryable: false,
|
|
115
|
+
details: { issueCount: parsed.error.issues.length }
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
const settings = await loadDigitalOceanCredentialSettings(this.runtime);
|
|
119
|
+
const candidates = settings.modelAccessKeyCandidates.map((reference) => ({
|
|
120
|
+
reference,
|
|
121
|
+
provenance: DigitalOceanModelCredentialProvenanceSchema.parse({
|
|
122
|
+
reference,
|
|
123
|
+
kind: 'model-access-key'
|
|
124
|
+
})
|
|
125
|
+
}));
|
|
126
|
+
return sendWithCredentialReferences(this.runtime, parsed.data, candidates);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Read one credential through its ordered references. The value is resolved by
|
|
130
|
+
* the Secrets store owner and never returned: the caller receives the selected
|
|
131
|
+
* complete reference and the environment it answered for.
|
|
132
|
+
*/
|
|
133
|
+
async useCredential(input) {
|
|
134
|
+
const parsed = DigitalOceanCredentialUseReadSchema.safeParse(input);
|
|
135
|
+
if (!parsed.success) {
|
|
136
|
+
throw new CapabilityError('DigitalOcean credential use read is invalid.', 'INVALID_INPUT', {
|
|
137
|
+
reason: 'digitalocean-credential-use-invalid',
|
|
138
|
+
retryable: false,
|
|
139
|
+
details: { issueCount: parsed.error.issues.length }
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const settings = await loadDigitalOceanCredentialSettings(this.runtime);
|
|
143
|
+
const candidates = parsed.data.candidates ?? settings.modelAccessKeyCandidates;
|
|
144
|
+
const outcome = await this.findCredential(candidates);
|
|
145
|
+
if (outcome !== undefined)
|
|
146
|
+
return outcome;
|
|
147
|
+
throw credentialMissing(candidates);
|
|
148
|
+
}
|
|
149
|
+
/** Resolve ordered candidates while preserving every non-absence refusal. */
|
|
150
|
+
async findCredential(candidates) {
|
|
151
|
+
const environment = this.runtime.scope.qualifiers.environmentTier;
|
|
152
|
+
if (environment === undefined) {
|
|
153
|
+
throw new CapabilityError('No environment tier is declared, so no credential can be used.', 'INTERNAL', {
|
|
154
|
+
reason: 'digitalocean-credential-environment-undeclared',
|
|
155
|
+
retryable: false
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
for (const reference of candidates) {
|
|
159
|
+
const attempt = await settle(() => this.checkCredentialPresence(reference));
|
|
160
|
+
if (!attempt.ok) {
|
|
161
|
+
const failure = CaughtFailureSchema.parse(attempt.cause);
|
|
162
|
+
if (!isConfirmedAbsence(failure))
|
|
163
|
+
throw failure;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (!attempt.value)
|
|
167
|
+
continue;
|
|
168
|
+
return DigitalOceanCredentialUseOutcomeSchema.parse({ reference, environment });
|
|
169
|
+
}
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Use a Spaces key pair. Each half resolves through its own ordered references;
|
|
174
|
+
* the outcome names both selected references and whether both halves were
|
|
175
|
+
* present, so a caller can act on a partial pair without ever holding a value.
|
|
176
|
+
*/
|
|
177
|
+
async useSpacesCredentials(input) {
|
|
178
|
+
const parsed = DigitalOceanSpacesCredentialUseRequestSchema.safeParse(input);
|
|
179
|
+
if (!parsed.success) {
|
|
180
|
+
throw new CapabilityError('DigitalOcean Spaces credential use is invalid.', 'INVALID_INPUT', {
|
|
181
|
+
reason: 'digitalocean-credential-use-invalid',
|
|
182
|
+
retryable: false,
|
|
183
|
+
details: { issueCount: parsed.error.issues.length }
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const settings = await loadDigitalOceanCredentialSettings(this.runtime);
|
|
187
|
+
const accessKeyIdCandidates = parsed.data.accessKeyId.candidates ?? settings.spacesAccessKeyIdCandidates;
|
|
188
|
+
const secretAccessKeyCandidates = parsed.data.secretAccessKey.candidates ?? settings.spacesSecretKeyCandidates;
|
|
189
|
+
const [accessKeyId, secretAccessKey] = await Promise.all([
|
|
190
|
+
this.findCredential(accessKeyIdCandidates),
|
|
191
|
+
this.findCredential(secretAccessKeyCandidates)
|
|
192
|
+
]);
|
|
193
|
+
return DigitalOceanSpacesCredentialUseOutcomeSchema.parse({ accessKeyId, secretAccessKey });
|
|
194
|
+
}
|
|
195
|
+
/** Availability checks ask Secrets for value-free presence, never resolve a value. */
|
|
196
|
+
async checkCredentialPresence(reference) {
|
|
197
|
+
const secrets = await getVibesSecretsClient(this.runtime);
|
|
198
|
+
await secrets.checkCredentialPresence({ key: reference.key, store: reference.store });
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
create(token) {
|
|
202
|
+
const controlPlane = new DigitalOceanControlPlaneClient({
|
|
203
|
+
runtime: this.runtime,
|
|
204
|
+
credentialRuntime: this.runtime,
|
|
205
|
+
token: requireApiToken(token)
|
|
206
|
+
});
|
|
207
|
+
return {
|
|
208
|
+
controlPlane,
|
|
209
|
+
apps: new DigitalOceanAppsClient(controlPlane),
|
|
210
|
+
droplets: new DigitalOceanDropletsClient(controlPlane),
|
|
211
|
+
storage: new DigitalOceanStorageClient(controlPlane),
|
|
212
|
+
kubernetes: new DigitalOceanKubernetesClient(controlPlane),
|
|
213
|
+
databases: new DigitalOceanDatabasesClient(controlPlane)
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
createAppDeploy(options) {
|
|
217
|
+
return new DigitalOceanAppDeployClient(undefined, undefined, this.runtime, options);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/client/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RuntimeRef, VibesRuntime } from '@vibesdotdev/kernel';
|
|
2
|
+
import type { DigitalOceanClientFactory } from './factory.ts';
|
|
3
|
+
export declare function getDigitalOceanClientFactory(runtime: RuntimeRef): Promise<DigitalOceanClientFactory>;
|
|
4
|
+
export declare function tryGetDigitalOceanClientFactory(runtime: VibesRuntime): DigitalOceanClientFactory | undefined;
|
|
5
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/client/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE9D,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,UAAU,sCAE/D;AACD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,YAAY,yCAEpE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { getVibesClient, tryGetVibesClient } from '@vibesdotdev/kernel/client';
|
|
2
|
+
export function getDigitalOceanClientFactory(runtime) {
|
|
3
|
+
return getVibesClient('digitalocean-client-factory', runtime);
|
|
4
|
+
}
|
|
5
|
+
export function tryGetDigitalOceanClientFactory(runtime) {
|
|
6
|
+
return tryGetVibesClient('digitalocean-client-factory', runtime);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/client/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAI/E,MAAM,UAAU,4BAA4B,CAAC,OAAmB;IAC/D,OAAO,cAAc,CAA4B,6BAA6B,EAAE,OAAO,CAAC,CAAC;AAC1F,CAAC;AACD,MAAM,UAAU,+BAA+B,CAAC,OAAqB;IACpE,OAAO,iBAAiB,CAA4B,6BAA6B,EAAE,OAAO,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { DIGITALOCEAN_CONTROL_PLANE_BASE_URL, DIGITALOCEAN_INFERENCE_BASE_URL, doFetch, type DoFetchContext, type DoFetchImpl, type DoFetchRequest } from './do-fetch.ts';
|
|
2
|
+
export type { DigitalOceanErrorBody } from './errors.ts';
|
|
3
|
+
export { collectPaginated, paginate, type DoListLinks, type DoListMeta, type DoListResponse, type CollectOptions, type PaginateOptions } from './paginated.ts';
|
|
4
|
+
export { computeRetryDelay, defaultIsRetryable, resolveRetryOptions, withRetry, type ResolvedRetryOptions, type RetryOptions } from './retry.ts';
|
|
5
|
+
export { DigitalOceanControlPlaneClient, DigitalOceanPaginatedClient, type DigitalOceanControlPlaneClientOptions } from './control-plane.ts';
|
|
6
|
+
export { digitalOceanApiError, digitalOceanNetworkError, digitalOceanHttpStatus } from './errors.ts';
|
|
7
|
+
export { getDigitalOceanClientFactory, tryGetDigitalOceanClientFactory } from './helpers.ts';
|
|
8
|
+
export type { DigitalOceanClientFactory } from './factory.ts';
|
|
9
|
+
export * from '../schemas/control-plane.ts';
|
|
10
|
+
export * from '../schemas/credential-use.ts';
|
|
11
|
+
export * from '../schemas/http.ts';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,mCAAmC,EACnC,+BAA+B,EAC/B,OAAO,EACP,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EACN,gBAAgB,EAChB,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,8BAA8B,EAC9B,2BAA2B,EAC3B,KAAK,qCAAqC,EAC1C,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,4BAA4B,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC7F,YAAY,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC9D,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { DIGITALOCEAN_CONTROL_PLANE_BASE_URL, DIGITALOCEAN_INFERENCE_BASE_URL, doFetch } from "./do-fetch.js";
|
|
2
|
+
export { collectPaginated, paginate } from "./paginated.js";
|
|
3
|
+
export { computeRetryDelay, defaultIsRetryable, resolveRetryOptions, withRetry } from "./retry.js";
|
|
4
|
+
export { DigitalOceanControlPlaneClient, DigitalOceanPaginatedClient } from "./control-plane.js";
|
|
5
|
+
export { digitalOceanApiError, digitalOceanNetworkError, digitalOceanHttpStatus } from "./errors.js";
|
|
6
|
+
export { getDigitalOceanClientFactory, tryGetDigitalOceanClientFactory } from "./helpers.js";
|
|
7
|
+
export * from "../schemas/control-plane.js";
|
|
8
|
+
export * from "../schemas/credential-use.js";
|
|
9
|
+
export * from "../schemas/http.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,mCAAmC,EACnC,+BAA+B,EAC/B,OAAO,EAIP,MAAM,eAAe,CAAC;AAIvB,OAAO,EACN,gBAAgB,EAChB,QAAQ,EAMR,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EAGT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,8BAA8B,EAC9B,2BAA2B,EAE3B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,4BAA4B,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE7F,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type * as z from 'zod/v4';
|
|
2
|
+
import type { DoFetchContext, DoFetchRequest } from './do-fetch.ts';
|
|
3
|
+
export type { DoListResponse, DoListLinks, DoListMeta } from '../schemas/control-plane.ts';
|
|
4
|
+
import type { DoListResponse } from '../schemas/control-plane.ts';
|
|
5
|
+
export interface PaginateOptions<T extends DoListResponse> {
|
|
6
|
+
path: string;
|
|
7
|
+
request?: Omit<DoFetchRequest, 'method' | 'body' | 'json'>;
|
|
8
|
+
perPage?: number;
|
|
9
|
+
maxPages?: number;
|
|
10
|
+
schema: z.ZodType<T>;
|
|
11
|
+
extract: (page: NoInfer<T>) => readonly unknown[] | null | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface CollectOptions<T extends DoListResponse, Item> extends PaginateOptions<T> {
|
|
14
|
+
itemSchema: z.ZodType<Item>;
|
|
15
|
+
extract: (page: NoInfer<T>) => readonly Item[] | null | undefined;
|
|
16
|
+
}
|
|
17
|
+
export declare function paginate<T extends DoListResponse>(context: DoFetchContext, options: PaginateOptions<T>): AsyncGenerator<T, void, void>;
|
|
18
|
+
export declare function collectPaginated<T extends DoListResponse, Item>(context: DoFetchContext, options: CollectOptions<T, Item>): Promise<Item[]>;
|
|
19
|
+
//# sourceMappingURL=paginated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginated.d.ts","sourceRoot":"","sources":["../../src/client/paginated.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,CAAC,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,cAAc;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CACrE;AACD,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IACzF,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC;CAClE;AAED,wBAAuB,QAAQ,CAAC,CAAC,SAAS,cAAc,EACvD,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAClD,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CA8B/B;AAED,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EACpE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,GACvD,OAAO,CAAC,IAAI,EAAE,CAAC,CAYjB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { CapabilityError, settleNow } from '@vibesdotdev/kernel';
|
|
2
|
+
import { doFetch, digitalOceanRequestUrl } from "./do-fetch.js";
|
|
3
|
+
import { DigitalOceanListSchema, PaginationSettingsSchema } from "../schemas/control-plane.js";
|
|
4
|
+
export async function* paginate(context, options) {
|
|
5
|
+
const parsedSettings = PaginationSettingsSchema.safeParse(options);
|
|
6
|
+
if (!parsedSettings.success)
|
|
7
|
+
throw new CapabilityError('DigitalOcean pagination settings are invalid.', 'INVALID_INPUT', {
|
|
8
|
+
reason: 'digitalocean-pagination-invalid', cause: parsedSettings.error
|
|
9
|
+
});
|
|
10
|
+
const settings = parsedSettings.data;
|
|
11
|
+
let url = digitalOceanRequestUrl(context.baseUrl, options.path);
|
|
12
|
+
if (!url.searchParams.has('per_page'))
|
|
13
|
+
url.searchParams.set('per_page', String(settings.perPage));
|
|
14
|
+
let pages = 0;
|
|
15
|
+
while (url) {
|
|
16
|
+
const page = await doFetch(context, url.href, options.request ?? {}, options.schema);
|
|
17
|
+
const envelope = DigitalOceanListSchema.safeParse(page);
|
|
18
|
+
if (!envelope.success)
|
|
19
|
+
throw new CapabilityError('DigitalOcean pagination response is invalid.', 'UNAVAILABLE', {
|
|
20
|
+
reason: 'digitalocean-response-invalid', retryable: false, cause: envelope.error
|
|
21
|
+
});
|
|
22
|
+
yield page;
|
|
23
|
+
pages += 1;
|
|
24
|
+
if (settings.maxPages !== undefined && pages >= settings.maxPages)
|
|
25
|
+
return;
|
|
26
|
+
const next = envelope.data.links?.pages?.next;
|
|
27
|
+
if (!next)
|
|
28
|
+
return;
|
|
29
|
+
if (next.startsWith('/') || URL.canParse(next)) {
|
|
30
|
+
url = digitalOceanRequestUrl(context.baseUrl, next);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const resolved = settleNow(() => new URL(next, url).href);
|
|
34
|
+
if (!resolved.ok)
|
|
35
|
+
throw new CapabilityError('DigitalOcean pagination URL is invalid.', 'INVALID_INPUT', {
|
|
36
|
+
reason: 'digitalocean-url-invalid', cause: resolved.cause
|
|
37
|
+
});
|
|
38
|
+
url = digitalOceanRequestUrl(context.baseUrl, resolved.value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function collectPaginated(context, options) {
|
|
43
|
+
const out = [];
|
|
44
|
+
for await (const page of paginate(context, options)) {
|
|
45
|
+
for (const item of options.extract(page) ?? []) {
|
|
46
|
+
const parsed = options.itemSchema.safeParse(item);
|
|
47
|
+
if (!parsed.success)
|
|
48
|
+
throw new CapabilityError('DigitalOcean collection item is invalid.', 'UNAVAILABLE', {
|
|
49
|
+
reason: 'digitalocean-response-invalid', retryable: false, cause: parsed.error
|
|
50
|
+
});
|
|
51
|
+
out.push(parsed.data);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=paginated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginated.js","sourceRoot":"","sources":["../../src/client/paginated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGjE,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAiB/F,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAC9B,OAAuB,EAAE,OAA2B;IAEpD,MAAM,cAAc,GAAG,wBAAwB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC,cAAc,CAAC,OAAO;QAAE,MAAM,IAAI,eAAe,CAAC,+CAA+C,EAAE,eAAe,EAAE;YACxH,MAAM,EAAE,iCAAiC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK;SACtE,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC;IACrC,IAAI,GAAG,GAAoB,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAClG,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,8CAA8C,EAAE,aAAa,EAAE;gBAC/G,MAAM,EAAE,+BAA+B,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK;aAChF,CAAC,CAAC;QACH,MAAM,IAAI,CAAC;QACX,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,IAAI,QAAQ,CAAC,QAAQ;YAAE,OAAO;QAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;QAC9C,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACP,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,eAAe,CAAC,yCAAyC,EAAE,eAAe,EAAE;oBACvG,MAAM,EAAE,0BAA0B,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK;iBACzD,CAAC,CAAC;YACH,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,OAAuB,EAAE,OAAgC;IAEzD,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,eAAe,CAAC,0CAA0C,EAAE,aAAa,EAAE;oBACzG,MAAM,EAAE,+BAA+B,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;iBAC9E,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type CaughtFailure, type VibesRuntime } from '@vibesdotdev/kernel';
|
|
2
|
+
export interface RetryOptions {
|
|
3
|
+
maxAttempts?: number;
|
|
4
|
+
baseDelayMs?: number;
|
|
5
|
+
maxDelayMs?: number;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
8
|
+
isRetryable?: (error: CaughtFailure) => boolean;
|
|
9
|
+
onRetry?: (info: {
|
|
10
|
+
attempt: number;
|
|
11
|
+
delayMs: number;
|
|
12
|
+
error: CaughtFailure;
|
|
13
|
+
}) => void;
|
|
14
|
+
}
|
|
15
|
+
export interface ResolvedRetryOptions {
|
|
16
|
+
maxAttempts: number;
|
|
17
|
+
baseDelayMs: number;
|
|
18
|
+
maxDelayMs: number;
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
sleep: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
21
|
+
isRetryable: (error: CaughtFailure) => boolean;
|
|
22
|
+
onRetry?: (info: {
|
|
23
|
+
attempt: number;
|
|
24
|
+
delayMs: number;
|
|
25
|
+
error: CaughtFailure;
|
|
26
|
+
}) => void;
|
|
27
|
+
}
|
|
28
|
+
export type RetryRuntime = Pick<VibesRuntime, 'lifecycle'>;
|
|
29
|
+
export declare function defaultIsRetryable(error: CaughtFailure): boolean;
|
|
30
|
+
export declare function resolveRetryOptions(runtime: RetryRuntime, opts?: RetryOptions): ResolvedRetryOptions;
|
|
31
|
+
export declare function computeRetryDelay(attempt: number, error: CaughtFailure, opts: ResolvedRetryOptions, random?: () => number): number;
|
|
32
|
+
/** Bounded request attempts; all waiting and cancellation belong to the handed lifecycle. */
|
|
33
|
+
export declare function withRetry<T>(runtime: RetryRuntime, run: (attempt: number) => Promise<T>, options?: RetryOptions, random?: () => number): Promise<T>;
|
|
34
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/client/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIrG,MAAM,WAAW,YAAY;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC;KAAE,KAAK,IAAI,CAAC;CACtF;AACD,MAAM,WAAW,oBAAoB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,WAAW,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC;KAAE,KAAK,IAAI,CAAC;CACtF;AACD,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAGhE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,GAAE,YAAiB,GAAG,oBAAoB,CAYxG;AAED,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,oBAAoB,EACjE,MAAM,GAAE,MAAM,MAAoB,GAChC,MAAM,CAOR;AAED,6FAA6F;AAC7F,wBAAsB,SAAS,CAAC,CAAC,EAChC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3D,OAAO,GAAE,YAAiB,EAAE,MAAM,GAAE,MAAM,MAAoB,GAC5D,OAAO,CAAC,CAAC,CAAC,CAmBZ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CapabilityError, settle } from '@vibesdotdev/kernel';
|
|
2
|
+
import { RetrySettingsSchema } from "../schemas/control-plane.js";
|
|
3
|
+
import { digitalOceanHttpStatus } from "./errors.js";
|
|
4
|
+
export function defaultIsRetryable(error) {
|
|
5
|
+
return error instanceof CapabilityError &&
|
|
6
|
+
['digitalocean-http-failed', 'digitalocean-network-failed'].includes(error.reason) && error.retryable;
|
|
7
|
+
}
|
|
8
|
+
export function resolveRetryOptions(runtime, opts = {}) {
|
|
9
|
+
const settings = RetrySettingsSchema.safeParse(opts);
|
|
10
|
+
if (!settings.success) {
|
|
11
|
+
throw new CapabilityError('DigitalOcean retry settings are invalid.', 'INVALID_INPUT', {
|
|
12
|
+
reason: 'digitalocean-retry-invalid', cause: settings.error
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
...settings.data, signal: opts.signal,
|
|
17
|
+
sleep: opts.sleep ?? ((ms, signal) => runtime.lifecycle.delay(ms, signal)),
|
|
18
|
+
isRetryable: opts.isRetryable ?? defaultIsRetryable, onRetry: opts.onRetry
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function computeRetryDelay(attempt, error, opts, random = Math.random) {
|
|
22
|
+
if (digitalOceanHttpStatus(error) === 429 && error instanceof CapabilityError) {
|
|
23
|
+
const hint = error.details?.retryAfterMs;
|
|
24
|
+
if (Number.isFinite(hint) && Number(hint) >= 0)
|
|
25
|
+
return Number(hint);
|
|
26
|
+
}
|
|
27
|
+
const exp = Math.min(opts.maxDelayMs, opts.baseDelayMs * 2 ** (attempt - 1));
|
|
28
|
+
return Math.floor(random() * exp);
|
|
29
|
+
}
|
|
30
|
+
/** Bounded request attempts; all waiting and cancellation belong to the handed lifecycle. */
|
|
31
|
+
export async function withRetry(runtime, run, options = {}, random = Math.random) {
|
|
32
|
+
const opts = resolveRetryOptions(runtime, options);
|
|
33
|
+
const signal = opts.signal
|
|
34
|
+
? AbortSignal.any([opts.signal, runtime.lifecycle.signal])
|
|
35
|
+
: runtime.lifecycle.signal;
|
|
36
|
+
for (let attempt = 1;; attempt += 1) {
|
|
37
|
+
if (signal.aborted) {
|
|
38
|
+
throw new CapabilityError('DigitalOcean request cancelled.', 'CANCELLED', {
|
|
39
|
+
reason: 'digitalocean-request-cancelled', cause: signal.reason
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const result = await settle(() => run(attempt));
|
|
43
|
+
if (result.ok)
|
|
44
|
+
return result.value;
|
|
45
|
+
const failure = result.cause;
|
|
46
|
+
if (signal.aborted || attempt >= opts.maxAttempts || !opts.isRetryable(failure))
|
|
47
|
+
throw failure;
|
|
48
|
+
const delayMs = computeRetryDelay(attempt, failure, opts, random);
|
|
49
|
+
opts.onRetry?.({ attempt, delayMs, error: failure });
|
|
50
|
+
await opts.sleep(delayMs, signal);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/client/retry.ts"],"names":[],"mappings":"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"}
|