@vibesdotdev/integrations-digitalocean 0.0.0-stage → 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/LICENSE +126 -0
  2. package/README.md +78 -2
  3. package/dist/ai/index.d.ts +4 -0
  4. package/dist/ai/index.d.ts.map +1 -0
  5. package/dist/ai/index.js +4 -0
  6. package/dist/ai/index.js.map +1 -0
  7. package/dist/ai/inference.transport.impl.d.ts +5 -0
  8. package/dist/ai/inference.transport.impl.d.ts.map +1 -0
  9. package/dist/ai/inference.transport.impl.js +54 -0
  10. package/dist/ai/inference.transport.impl.js.map +1 -0
  11. package/dist/ai/provider.plugin.d.ts +6 -0
  12. package/dist/ai/provider.plugin.d.ts.map +1 -0
  13. package/dist/ai/provider.plugin.js +126 -0
  14. package/dist/ai/provider.plugin.js.map +1 -0
  15. package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.d.ts +62 -0
  16. package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.d.ts.map +1 -0
  17. package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.js +73 -0
  18. package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.js.map +1 -0
  19. package/dist/ai/providers/cloud/frontier/digitalocean/index.d.ts +2 -0
  20. package/dist/ai/providers/cloud/frontier/digitalocean/index.d.ts.map +1 -0
  21. package/dist/ai/providers/cloud/frontier/digitalocean/index.js +2 -0
  22. package/dist/ai/providers/cloud/frontier/digitalocean/index.js.map +1 -0
  23. package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.d.ts +183 -0
  24. package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.d.ts.map +1 -0
  25. package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.js +66 -0
  26. package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.js.map +1 -0
  27. package/dist/apps/api-client.d.ts +45 -0
  28. package/dist/apps/api-client.d.ts.map +1 -0
  29. package/dist/apps/api-client.js +47 -0
  30. package/dist/apps/api-client.js.map +1 -0
  31. package/dist/apps/build-spec.d.ts +44 -0
  32. package/dist/apps/build-spec.d.ts.map +1 -0
  33. package/dist/apps/build-spec.js +463 -0
  34. package/dist/apps/build-spec.js.map +1 -0
  35. package/dist/apps/deploy-client.d.ts +42 -0
  36. package/dist/apps/deploy-client.d.ts.map +1 -0
  37. package/dist/apps/deploy-client.js +300 -0
  38. package/dist/apps/deploy-client.js.map +1 -0
  39. package/dist/apps/index.d.ts +5 -0
  40. package/dist/apps/index.d.ts.map +1 -0
  41. package/dist/apps/index.js +4 -0
  42. package/dist/apps/index.js.map +1 -0
  43. package/dist/apps/types.d.ts +204 -0
  44. package/dist/apps/types.d.ts.map +1 -0
  45. package/dist/apps/types.js +13 -0
  46. package/dist/apps/types.js.map +1 -0
  47. package/dist/client/control-plane.d.ts +49 -0
  48. package/dist/client/control-plane.d.ts.map +1 -0
  49. package/dist/client/control-plane.js +85 -0
  50. package/dist/client/control-plane.js.map +1 -0
  51. package/dist/client/do-fetch.d.ts +41 -0
  52. package/dist/client/do-fetch.d.ts.map +1 -0
  53. package/dist/client/do-fetch.js +199 -0
  54. package/dist/client/do-fetch.js.map +1 -0
  55. package/dist/client/errors.d.ts +6 -0
  56. package/dist/client/errors.d.ts.map +1 -0
  57. package/dist/client/errors.js +34 -0
  58. package/dist/client/errors.js.map +1 -0
  59. package/dist/client/factory.d.ts +53 -0
  60. package/dist/client/factory.d.ts.map +1 -0
  61. package/dist/client/factory.js +220 -0
  62. package/dist/client/factory.js.map +1 -0
  63. package/dist/client/helpers.d.ts +5 -0
  64. package/dist/client/helpers.d.ts.map +1 -0
  65. package/dist/client/helpers.js +8 -0
  66. package/dist/client/helpers.js.map +1 -0
  67. package/dist/client/index.d.ts +12 -0
  68. package/dist/client/index.d.ts.map +1 -0
  69. package/dist/client/index.js +10 -0
  70. package/dist/client/index.js.map +1 -0
  71. package/dist/client/paginated.d.ts +19 -0
  72. package/dist/client/paginated.d.ts.map +1 -0
  73. package/dist/client/paginated.js +56 -0
  74. package/dist/client/paginated.js.map +1 -0
  75. package/dist/client/retry.d.ts +34 -0
  76. package/dist/client/retry.d.ts.map +1 -0
  77. package/dist/client/retry.js +53 -0
  78. package/dist/client/retry.js.map +1 -0
  79. package/dist/config/digitalocean.config.descriptor.d.ts +197 -0
  80. package/dist/config/digitalocean.config.descriptor.d.ts.map +1 -0
  81. package/dist/config/digitalocean.config.descriptor.js +59 -0
  82. package/dist/config/digitalocean.config.descriptor.js.map +1 -0
  83. package/dist/credentials/index.d.ts +38 -0
  84. package/dist/credentials/index.d.ts.map +1 -0
  85. package/dist/credentials/index.js +56 -0
  86. package/dist/credentials/index.js.map +1 -0
  87. package/dist/databases/index.d.ts +82 -0
  88. package/dist/databases/index.d.ts.map +1 -0
  89. package/dist/databases/index.js +57 -0
  90. package/dist/databases/index.js.map +1 -0
  91. package/dist/digitalocean-friction.policy.d.ts +29 -0
  92. package/dist/digitalocean-friction.policy.d.ts.map +1 -0
  93. package/dist/digitalocean-friction.policy.js +21 -0
  94. package/dist/digitalocean-friction.policy.js.map +1 -0
  95. package/dist/digitalocean.plugin.d.ts +3 -0
  96. package/dist/digitalocean.plugin.d.ts.map +1 -0
  97. package/dist/digitalocean.plugin.js +27 -0
  98. package/dist/digitalocean.plugin.js.map +1 -0
  99. package/dist/droplets/index.d.ts +106 -0
  100. package/dist/droplets/index.d.ts.map +1 -0
  101. package/dist/droplets/index.js +227 -0
  102. package/dist/droplets/index.js.map +1 -0
  103. package/dist/index.d.ts +35 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +32 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/inference-control-plane/index.d.ts +63 -0
  108. package/dist/inference-control-plane/index.d.ts.map +1 -0
  109. package/dist/inference-control-plane/index.js +93 -0
  110. package/dist/inference-control-plane/index.js.map +1 -0
  111. package/dist/infra/billing.d.ts +26 -0
  112. package/dist/infra/billing.d.ts.map +1 -0
  113. package/dist/infra/billing.js +43 -0
  114. package/dist/infra/billing.js.map +1 -0
  115. package/dist/infra/credentials.d.ts +11 -0
  116. package/dist/infra/credentials.d.ts.map +1 -0
  117. package/dist/infra/credentials.js +15 -0
  118. package/dist/infra/credentials.js.map +1 -0
  119. package/dist/infra/deployment-provider/deploy-secrets.d.ts +10 -0
  120. package/dist/infra/deployment-provider/deploy-secrets.d.ts.map +1 -0
  121. package/dist/infra/deployment-provider/deploy-secrets.js +66 -0
  122. package/dist/infra/deployment-provider/deploy-secrets.js.map +1 -0
  123. package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.d.ts +96 -0
  124. package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.d.ts.map +1 -0
  125. package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.js +242 -0
  126. package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.js.map +1 -0
  127. package/dist/infra/deployment-provider/image-publish.d.ts +39 -0
  128. package/dist/infra/deployment-provider/image-publish.d.ts.map +1 -0
  129. package/dist/infra/deployment-provider/image-publish.js +146 -0
  130. package/dist/infra/deployment-provider/image-publish.js.map +1 -0
  131. package/dist/infra/deployment-provider.descriptor.d.ts +34 -0
  132. package/dist/infra/deployment-provider.descriptor.d.ts.map +1 -0
  133. package/dist/infra/deployment-provider.descriptor.js +9 -0
  134. package/dist/infra/deployment-provider.descriptor.js.map +1 -0
  135. package/dist/infra/digitalocean-infra.plugin.d.ts +101 -0
  136. package/dist/infra/digitalocean-infra.plugin.d.ts.map +1 -0
  137. package/dist/infra/digitalocean-infra.plugin.js +283 -0
  138. package/dist/infra/digitalocean-infra.plugin.js.map +1 -0
  139. package/dist/infra/doks/clients.d.ts +183 -0
  140. package/dist/infra/doks/clients.d.ts.map +1 -0
  141. package/dist/infra/doks/clients.js +172 -0
  142. package/dist/infra/doks/clients.js.map +1 -0
  143. package/dist/infra/doks/digitalocean.d.ts +34 -0
  144. package/dist/infra/doks/digitalocean.d.ts.map +1 -0
  145. package/dist/infra/doks/digitalocean.js +267 -0
  146. package/dist/infra/doks/digitalocean.js.map +1 -0
  147. package/dist/infra/doks/service-release-schemas.d.ts +1037 -0
  148. package/dist/infra/doks/service-release-schemas.d.ts.map +1 -0
  149. package/dist/infra/doks/service-release-schemas.js +51 -0
  150. package/dist/infra/doks/service-release-schemas.js.map +1 -0
  151. package/dist/infra/doks/service-release.d.ts +415 -0
  152. package/dist/infra/doks/service-release.d.ts.map +1 -0
  153. package/dist/infra/doks/service-release.js +3201 -0
  154. package/dist/infra/doks/service-release.js.map +1 -0
  155. package/dist/infra/doks/worker.d.ts +14 -0
  156. package/dist/infra/doks/worker.d.ts.map +1 -0
  157. package/dist/infra/doks/worker.js +343 -0
  158. package/dist/infra/doks/worker.js.map +1 -0
  159. package/dist/infra/droplet.impl.d.ts +172 -0
  160. package/dist/infra/droplet.impl.d.ts.map +1 -0
  161. package/dist/infra/droplet.impl.js +379 -0
  162. package/dist/infra/droplet.impl.js.map +1 -0
  163. package/dist/infra/functions.impl.d.ts +123 -0
  164. package/dist/infra/functions.impl.d.ts.map +1 -0
  165. package/dist/infra/functions.impl.js +202 -0
  166. package/dist/infra/functions.impl.js.map +1 -0
  167. package/dist/infra/index.d.ts +15 -0
  168. package/dist/infra/index.d.ts.map +1 -0
  169. package/dist/infra/index.js +12 -0
  170. package/dist/infra/index.js.map +1 -0
  171. package/dist/infra/inventory.d.ts +7 -0
  172. package/dist/infra/inventory.d.ts.map +1 -0
  173. package/dist/infra/inventory.js +259 -0
  174. package/dist/infra/inventory.js.map +1 -0
  175. package/dist/infra/kubernetes-log-stream.d.ts +5 -0
  176. package/dist/infra/kubernetes-log-stream.d.ts.map +1 -0
  177. package/dist/infra/kubernetes-log-stream.js +186 -0
  178. package/dist/infra/kubernetes-log-stream.js.map +1 -0
  179. package/dist/infra/kubernetes-logs.d.ts +33 -0
  180. package/dist/infra/kubernetes-logs.d.ts.map +1 -0
  181. package/dist/infra/kubernetes-logs.descriptor.d.ts +14 -0
  182. package/dist/infra/kubernetes-logs.descriptor.d.ts.map +1 -0
  183. package/dist/infra/kubernetes-logs.descriptor.js +28 -0
  184. package/dist/infra/kubernetes-logs.descriptor.js.map +1 -0
  185. package/dist/infra/kubernetes-logs.js +196 -0
  186. package/dist/infra/kubernetes-logs.js.map +1 -0
  187. package/dist/infra/utilization.d.ts +44 -0
  188. package/dist/infra/utilization.d.ts.map +1 -0
  189. package/dist/infra/utilization.js +108 -0
  190. package/dist/infra/utilization.js.map +1 -0
  191. package/dist/kubernetes/authority.d.ts +40 -0
  192. package/dist/kubernetes/authority.d.ts.map +1 -0
  193. package/dist/kubernetes/authority.js +90 -0
  194. package/dist/kubernetes/authority.js.map +1 -0
  195. package/dist/kubernetes/encoding.d.ts +4 -0
  196. package/dist/kubernetes/encoding.d.ts.map +1 -0
  197. package/dist/kubernetes/encoding.js +8 -0
  198. package/dist/kubernetes/encoding.js.map +1 -0
  199. package/dist/kubernetes/index.d.ts +105 -0
  200. package/dist/kubernetes/index.d.ts.map +1 -0
  201. package/dist/kubernetes/index.js +99 -0
  202. package/dist/kubernetes/index.js.map +1 -0
  203. package/dist/kubernetes/transport.d.ts +11 -0
  204. package/dist/kubernetes/transport.d.ts.map +1 -0
  205. package/dist/kubernetes/transport.js +27 -0
  206. package/dist/kubernetes/transport.js.map +1 -0
  207. package/dist/network/index.d.ts +24 -0
  208. package/dist/network/index.d.ts.map +1 -0
  209. package/dist/network/index.js +16 -0
  210. package/dist/network/index.js.map +1 -0
  211. package/dist/registry/index.d.ts +39 -0
  212. package/dist/registry/index.d.ts.map +1 -0
  213. package/dist/registry/index.js +20 -0
  214. package/dist/registry/index.js.map +1 -0
  215. package/dist/schemas/app-deployment.d.ts +1472 -0
  216. package/dist/schemas/app-deployment.d.ts.map +1 -0
  217. package/dist/schemas/app-deployment.js +156 -0
  218. package/dist/schemas/app-deployment.js.map +1 -0
  219. package/dist/schemas/app-platform.d.ts +755 -0
  220. package/dist/schemas/app-platform.d.ts.map +1 -0
  221. package/dist/schemas/app-platform.js +253 -0
  222. package/dist/schemas/app-platform.js.map +1 -0
  223. package/dist/schemas/cache-database.d.ts +210 -0
  224. package/dist/schemas/cache-database.d.ts.map +1 -0
  225. package/dist/schemas/cache-database.js +105 -0
  226. package/dist/schemas/cache-database.js.map +1 -0
  227. package/dist/schemas/control-plane.d.ts +456 -0
  228. package/dist/schemas/control-plane.d.ts.map +1 -0
  229. package/dist/schemas/control-plane.js +123 -0
  230. package/dist/schemas/control-plane.js.map +1 -0
  231. package/dist/schemas/credential-use.d.ts +714 -0
  232. package/dist/schemas/credential-use.d.ts.map +1 -0
  233. package/dist/schemas/credential-use.js +73 -0
  234. package/dist/schemas/credential-use.js.map +1 -0
  235. package/dist/schemas/doks-worker.d.ts +4062 -0
  236. package/dist/schemas/doks-worker.d.ts.map +1 -0
  237. package/dist/schemas/doks-worker.js +330 -0
  238. package/dist/schemas/doks-worker.js.map +1 -0
  239. package/dist/schemas/droplet.d.ts +110 -0
  240. package/dist/schemas/droplet.d.ts.map +1 -0
  241. package/dist/schemas/droplet.js +22 -0
  242. package/dist/schemas/droplet.js.map +1 -0
  243. package/dist/schemas/functions.d.ts +22 -0
  244. package/dist/schemas/functions.d.ts.map +1 -0
  245. package/dist/schemas/functions.js +25 -0
  246. package/dist/schemas/functions.js.map +1 -0
  247. package/dist/schemas/gitea-git-hosting.d.ts +20 -0
  248. package/dist/schemas/gitea-git-hosting.d.ts.map +1 -0
  249. package/dist/schemas/gitea-git-hosting.js +26 -0
  250. package/dist/schemas/gitea-git-hosting.js.map +1 -0
  251. package/dist/schemas/http.d.ts +2594 -0
  252. package/dist/schemas/http.d.ts.map +1 -0
  253. package/dist/schemas/http.js +4548 -0
  254. package/dist/schemas/http.js.map +1 -0
  255. package/dist/schemas/infra-kinds.d.ts +113 -0
  256. package/dist/schemas/infra-kinds.d.ts.map +1 -0
  257. package/dist/schemas/infra-kinds.js +93 -0
  258. package/dist/schemas/infra-kinds.js.map +1 -0
  259. package/dist/schemas/kubernetes-responses.d.ts +457 -0
  260. package/dist/schemas/kubernetes-responses.d.ts.map +1 -0
  261. package/dist/schemas/kubernetes-responses.js +681 -0
  262. package/dist/schemas/kubernetes-responses.js.map +1 -0
  263. package/dist/schemas/kubernetes.d.ts +143 -0
  264. package/dist/schemas/kubernetes.d.ts.map +1 -0
  265. package/dist/schemas/kubernetes.js +68 -0
  266. package/dist/schemas/kubernetes.js.map +1 -0
  267. package/dist/schemas/logs.d.ts +15 -0
  268. package/dist/schemas/logs.d.ts.map +1 -0
  269. package/dist/schemas/logs.js +11 -0
  270. package/dist/schemas/logs.js.map +1 -0
  271. package/dist/schemas/object-storage.d.ts +167 -0
  272. package/dist/schemas/object-storage.d.ts.map +1 -0
  273. package/dist/schemas/object-storage.js +124 -0
  274. package/dist/schemas/object-storage.js.map +1 -0
  275. package/dist/schemas/service-settings.d.ts +9 -0
  276. package/dist/schemas/service-settings.d.ts.map +1 -0
  277. package/dist/schemas/service-settings.js +21 -0
  278. package/dist/schemas/service-settings.js.map +1 -0
  279. package/dist/schemas/utilization.d.ts +57 -0
  280. package/dist/schemas/utilization.d.ts.map +1 -0
  281. package/dist/schemas/utilization.js +58 -0
  282. package/dist/schemas/utilization.js.map +1 -0
  283. package/dist/schemas/worker-status.d.ts +22 -0
  284. package/dist/schemas/worker-status.d.ts.map +1 -0
  285. package/dist/schemas/worker-status.js +14 -0
  286. package/dist/schemas/worker-status.js.map +1 -0
  287. package/dist/schemas/worker.d.ts +125 -0
  288. package/dist/schemas/worker.d.ts.map +1 -0
  289. package/dist/schemas/worker.js +129 -0
  290. package/dist/schemas/worker.js.map +1 -0
  291. package/dist/secrets/app-platform/app-credentials.impl.d.ts +14 -0
  292. package/dist/secrets/app-platform/app-credentials.impl.d.ts.map +1 -0
  293. package/dist/secrets/app-platform/app-credentials.impl.js +237 -0
  294. package/dist/secrets/app-platform/app-credentials.impl.js.map +1 -0
  295. package/dist/secrets/container-registry/image-publish-settings.descriptor.d.ts +6 -0
  296. package/dist/secrets/container-registry/image-publish-settings.descriptor.d.ts.map +1 -0
  297. package/dist/secrets/container-registry/image-publish-settings.descriptor.js +14 -0
  298. package/dist/secrets/container-registry/image-publish-settings.descriptor.js.map +1 -0
  299. package/dist/secrets/doks-secret.descriptor.d.ts +18 -0
  300. package/dist/secrets/doks-secret.descriptor.d.ts.map +1 -0
  301. package/dist/secrets/doks-secret.descriptor.js +35 -0
  302. package/dist/secrets/doks-secret.descriptor.js.map +1 -0
  303. package/dist/secrets/doks-secret.impl.d.ts +98 -0
  304. package/dist/secrets/doks-secret.impl.d.ts.map +1 -0
  305. package/dist/secrets/doks-secret.impl.js +451 -0
  306. package/dist/secrets/doks-secret.impl.js.map +1 -0
  307. package/dist/secrets/index.d.ts +4 -0
  308. package/dist/secrets/index.d.ts.map +1 -0
  309. package/dist/secrets/index.js +4 -0
  310. package/dist/secrets/index.js.map +1 -0
  311. package/dist/secrets/secrets-backend-doks.plugin.d.ts +3 -0
  312. package/dist/secrets/secrets-backend-doks.plugin.d.ts.map +1 -0
  313. package/dist/secrets/secrets-backend-doks.plugin.js +35 -0
  314. package/dist/secrets/secrets-backend-doks.plugin.js.map +1 -0
  315. package/dist/storage/index.d.ts +50 -0
  316. package/dist/storage/index.d.ts.map +1 -0
  317. package/dist/storage/index.js +92 -0
  318. package/dist/storage/index.js.map +1 -0
  319. package/dist/storage/spaces-keys.d.ts +25 -0
  320. package/dist/storage/spaces-keys.d.ts.map +1 -0
  321. package/dist/storage/spaces-keys.js +32 -0
  322. package/dist/storage/spaces-keys.js.map +1 -0
  323. 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":"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"}
@@ -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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"}