@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,183 @@
1
+ /**
2
+ * The semantic runtime clients a host composes for DOKS.
3
+ *
4
+ * Planning and client construction are credential- and network-free: a control
5
+ * plane is assembled from the vendor clients it needs, and the operator token is
6
+ * acquired by the shared owner in `../credentials.ts` on the first request that
7
+ * actually needs it. Planning a release or a worker never resolves a credential.
8
+ */
9
+ import type { DigitalOceanKubernetesServiceReleaseClient as ReleaseClient } from './service-release.ts';
10
+ import { type VibesRuntime } from '@vibesdotdev/kernel';
11
+ import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
12
+ import { planDigitalOceanKubernetesServiceRelease } from './service-release.ts';
13
+ import { planDigitalOceanDoksWorkerApply, planDigitalOceanDoksWorkerBuild } from './worker.ts';
14
+ import type { DigitalOceanDoksWorkerCreateOptions, DigitalOceanDoksWorkerExecutionOwner } from '../../schemas/doks-worker.ts';
15
+ export declare class DigitalOceanServiceReleaseRuntimeClient extends BaseRuntimeClient<VibesRuntime> {
16
+ plan(...args: Parameters<typeof planDigitalOceanKubernetesServiceRelease>): import("./service-release.ts").KubernetesServiceReleasePlan;
17
+ /** Compose existing typed vendor clients; HTTP/TLS remains owned by their transports. */
18
+ connect(...args: Tail<ConstructorParameters<typeof ReleaseClient>>): ReleaseClient;
19
+ create(): Promise<ReleaseClient>;
20
+ }
21
+ export declare class DigitalOceanDoksWorkerRuntimeClient extends BaseRuntimeClient<VibesRuntime> {
22
+ planApply(...args: Parameters<typeof planDigitalOceanDoksWorkerApply>): {
23
+ provider: "digitalocean-kubernetes";
24
+ operation: "build" | "apply";
25
+ fieldManager: "vibes-infra-doks-worker";
26
+ conflictPolicy: "fail";
27
+ cluster: {
28
+ id?: string | undefined;
29
+ name?: string | undefined;
30
+ };
31
+ worker: string;
32
+ namespace: string;
33
+ image: string;
34
+ resources: {
35
+ apiVersion: string;
36
+ kind: string;
37
+ name: string;
38
+ manifest: {
39
+ [x: string]: unknown;
40
+ apiVersion: string;
41
+ kind: string;
42
+ metadata: {
43
+ [x: string]: unknown;
44
+ name: string;
45
+ namespace?: string | undefined;
46
+ };
47
+ };
48
+ namespace?: string | undefined;
49
+ }[];
50
+ sourceRevision?: string | undefined;
51
+ requiredSecrets?: {
52
+ namespace: string;
53
+ name: string;
54
+ keys: string[];
55
+ }[] | undefined;
56
+ credentialBindings?: ({
57
+ kind: "source-lease";
58
+ namespace: string;
59
+ name: string;
60
+ key: string;
61
+ repositoryId: string;
62
+ ref: string;
63
+ authority: {
64
+ key: string;
65
+ store?: string | undefined;
66
+ env?: string | undefined;
67
+ };
68
+ } | {
69
+ kind: "docr";
70
+ namespace: string;
71
+ name: string;
72
+ key: "config.json";
73
+ expirySeconds: number;
74
+ } | {
75
+ kind: "package-registry";
76
+ namespace: string;
77
+ name: string;
78
+ key: ".npmrc" | ".bunfig.toml";
79
+ authority: {
80
+ key: string;
81
+ store?: string | undefined;
82
+ env?: string | undefined;
83
+ };
84
+ })[] | undefined;
85
+ credentialLease?: {
86
+ operationId: string;
87
+ repositoryId: string;
88
+ ref: string;
89
+ namespace: string;
90
+ name: string;
91
+ authority: {
92
+ key: string;
93
+ store?: string | undefined;
94
+ env?: string | undefined;
95
+ };
96
+ } | undefined;
97
+ };
98
+ planBuild(...args: Parameters<typeof planDigitalOceanDoksWorkerBuild>): {
99
+ provider: "digitalocean-kubernetes";
100
+ operation: "build" | "apply";
101
+ fieldManager: "vibes-infra-doks-worker";
102
+ conflictPolicy: "fail";
103
+ cluster: {
104
+ id?: string | undefined;
105
+ name?: string | undefined;
106
+ };
107
+ worker: string;
108
+ namespace: string;
109
+ image: string;
110
+ resources: {
111
+ apiVersion: string;
112
+ kind: string;
113
+ name: string;
114
+ manifest: {
115
+ [x: string]: unknown;
116
+ apiVersion: string;
117
+ kind: string;
118
+ metadata: {
119
+ [x: string]: unknown;
120
+ name: string;
121
+ namespace?: string | undefined;
122
+ };
123
+ };
124
+ namespace?: string | undefined;
125
+ }[];
126
+ sourceRevision?: string | undefined;
127
+ requiredSecrets?: {
128
+ namespace: string;
129
+ name: string;
130
+ keys: string[];
131
+ }[] | undefined;
132
+ credentialBindings?: ({
133
+ kind: "source-lease";
134
+ namespace: string;
135
+ name: string;
136
+ key: string;
137
+ repositoryId: string;
138
+ ref: string;
139
+ authority: {
140
+ key: string;
141
+ store?: string | undefined;
142
+ env?: string | undefined;
143
+ };
144
+ } | {
145
+ kind: "docr";
146
+ namespace: string;
147
+ name: string;
148
+ key: "config.json";
149
+ expirySeconds: number;
150
+ } | {
151
+ kind: "package-registry";
152
+ namespace: string;
153
+ name: string;
154
+ key: ".npmrc" | ".bunfig.toml";
155
+ authority: {
156
+ key: string;
157
+ store?: string | undefined;
158
+ env?: string | undefined;
159
+ };
160
+ })[] | undefined;
161
+ credentialLease?: {
162
+ operationId: string;
163
+ repositoryId: string;
164
+ ref: string;
165
+ namespace: string;
166
+ name: string;
167
+ authority: {
168
+ key: string;
169
+ store?: string | undefined;
170
+ env?: string | undefined;
171
+ };
172
+ } | undefined;
173
+ };
174
+ /**
175
+ * Return the plan-based adapter consumed by Infra Deploy. Each operation
176
+ * reduces the caller's plan to its identity and re-derives authorization
177
+ * from the descriptor selected by the runtime.
178
+ */
179
+ create(options?: DigitalOceanDoksWorkerCreateOptions): Promise<DigitalOceanDoksWorkerExecutionOwner>;
180
+ }
181
+ type Tail<T extends unknown[]> = T extends [unknown, ...infer Rest] ? Rest : never;
182
+ export {};
183
+ //# sourceMappingURL=clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../../src/infra/doks/clients.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,0CAA0C,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,iBAAiB,EAAkB,MAAM,4BAA4B,CAAC;AAO/E,OAAO,EAEN,wCAAwC,EACxC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,+BAA+B,EAC/B,+BAA+B,EAC/B,MAAM,aAAa,CAAC;AAOrB,OAAO,KAAK,EACX,mCAAmC,EAEnC,oCAAoC,EAEpC,MAAM,8BAA8B,CAAC;AAsFtC,qBAAa,uCAAwC,SAAQ,iBAAiB,CAAC,YAAY,CAAC;IAC3F,IAAI,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,wCAAwC,CAAC;IAIzE,yFAAyF;IACzF,OAAO,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC;IAI5D,MAAM;CAQZ;AAED,qBAAa,mCAAoC,SAAQ,iBAAiB,CAAC,YAAY,CAAC;IACvF,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,+BAA+B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIrE,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,+BAA+B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIrE;;;;OAIG;IACG,MAAM,CACX,OAAO,CAAC,EAAE,mCAAmC,GAC3C,OAAO,CAAC,oCAAoC,CAAC;CA6DhD;AAED,KAAK,IAAI,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC"}
@@ -0,0 +1,172 @@
1
+ import { CapabilityError } from '@vibesdotdev/kernel';
2
+ import { BaseRuntimeClient, getVibesClient } from '@vibesdotdev/kernel/client';
3
+ import { createDigitalOceanProviderControlPlaneClient } from "../credentials.js";
4
+ import { DigitalOceanKubernetesClient } from "../../kubernetes/index.js";
5
+ import { DigitalOceanSpacesKeysClient } from "../../storage/spaces-keys.js";
6
+ import { DigitalOceanKubernetesServiceReleaseClient, planDigitalOceanKubernetesServiceRelease } from "./service-release.js";
7
+ import { planDigitalOceanDoksWorkerApply, planDigitalOceanDoksWorkerBuild } from "./worker.js";
8
+ import { DigitalOceanDoksWorkerCreateOptionsSchema, DigitalOceanDoksWorkerExecutionInputSchema, DigitalOceanDoksWorkerExecutionOwnerSchema, DigitalOceanDoksWorkerPlanSchema } from "../../schemas/doks-worker.js";
9
+ /**
10
+ * A control plane whose authority is acquired on the first request.
11
+ *
12
+ * The vendor clients hold this object and call its named methods, so nothing
13
+ * resolves a credential until a request is actually made. Each method acquires
14
+ * inside its own body, so the acquisition promise is never handed to a callback
15
+ * that expects a client, and a failed acquisition is not cached: the next
16
+ * request retries it and sees the original failure.
17
+ */
18
+ function lazyControlPlane(runtime) {
19
+ let pending;
20
+ const acquire = async () => {
21
+ if (!pending) {
22
+ const opening = createDigitalOceanProviderControlPlaneClient(runtime);
23
+ pending = opening;
24
+ try {
25
+ return await opening;
26
+ }
27
+ catch (cause) {
28
+ if (pending === opening)
29
+ pending = undefined;
30
+ throw cause;
31
+ }
32
+ }
33
+ return await pending;
34
+ };
35
+ // Every member acquires inside its own body at the request boundary, so the
36
+ // acquisition promise is never handed to a callback expecting a client. Each
37
+ // call reads the method off the resolved client and invokes it as a method
38
+ // of that client, so the real client's receiver — and its `context` — is
39
+ // preserved, and the overloaded signatures are the client's own.
40
+ return {
41
+ // The context belongs to the resolved client and is not fabricated. The
42
+ // vendor clients that hold this control plane never read it — they call
43
+ // the named methods, which acquire first. This accessor refuses a member
44
+ // that no reachable caller can resolve instead of inventing a context.
45
+ get context() {
46
+ throw new Error('The lazy DigitalOcean control plane has no context before acquisition; ' +
47
+ 'request through its methods, which acquire first.');
48
+ },
49
+ async request(...args) {
50
+ const client = await acquire();
51
+ return client.request(...args);
52
+ },
53
+ async get(...args) {
54
+ const client = await acquire();
55
+ return client.get(...args);
56
+ },
57
+ async post(...args) {
58
+ const client = await acquire();
59
+ return client.post(...args);
60
+ },
61
+ async put(...args) {
62
+ const client = await acquire();
63
+ return client.put(...args);
64
+ },
65
+ async patch(...args) {
66
+ const client = await acquire();
67
+ return client.patch(...args);
68
+ },
69
+ async delete(...args) {
70
+ const client = await acquire();
71
+ return client.delete(...args);
72
+ },
73
+ async getOrNull(...args) {
74
+ const client = await acquire();
75
+ return client.getOrNull(...args);
76
+ },
77
+ // `paginate` returns an AsyncGenerator; awaiting it would lose the
78
+ // iterator contract the vendor clients iterate, so pages are yielded.
79
+ paginate: async function* (options) {
80
+ const client = await acquire();
81
+ for await (const page of client.paginate(options))
82
+ yield page;
83
+ },
84
+ async collect(options) {
85
+ const client = await acquire();
86
+ return client.collect(options);
87
+ }
88
+ };
89
+ }
90
+ export class DigitalOceanServiceReleaseRuntimeClient extends BaseRuntimeClient {
91
+ plan(...args) {
92
+ return planDigitalOceanKubernetesServiceRelease(...args);
93
+ }
94
+ /** Compose existing typed vendor clients; HTTP/TLS remains owned by their transports. */
95
+ connect(...args) {
96
+ return new DigitalOceanKubernetesServiceReleaseClient(this.runtime, ...args);
97
+ }
98
+ async create() {
99
+ const controlPlane = lazyControlPlane(this.runtime);
100
+ return this.connect(new DigitalOceanKubernetesClient(controlPlane), undefined, new DigitalOceanSpacesKeysClient(controlPlane));
101
+ }
102
+ }
103
+ export class DigitalOceanDoksWorkerRuntimeClient extends BaseRuntimeClient {
104
+ planApply(...args) {
105
+ return planDigitalOceanDoksWorkerApply(...args);
106
+ }
107
+ planBuild(...args) {
108
+ return planDigitalOceanDoksWorkerBuild(...args);
109
+ }
110
+ /**
111
+ * Return the plan-based adapter consumed by Infra Deploy. Each operation
112
+ * reduces the caller's plan to its identity and re-derives authorization
113
+ * from the descriptor selected by the runtime.
114
+ */
115
+ async create(options) {
116
+ const parsedOptions = DigitalOceanDoksWorkerCreateOptionsSchema.safeParse(options ?? {});
117
+ if (!parsedOptions.success) {
118
+ throw new CapabilityError('DOKS worker create options are invalid.', 'INVALID_INPUT', {
119
+ reason: 'doks-worker-create-options-invalid',
120
+ cause: parsedOptions.error
121
+ });
122
+ }
123
+ const factory = await getVibesClient('digitalocean-kubernetes-service-release', this.runtime);
124
+ const client = await factory.create();
125
+ const executionInput = (candidate) => {
126
+ const parsedPlan = DigitalOceanDoksWorkerPlanSchema.safeParse(candidate);
127
+ if (!parsedPlan.success) {
128
+ throw new CapabilityError('DOKS worker plan is invalid.', 'INVALID_INPUT', {
129
+ reason: 'doks-worker-plan-invalid',
130
+ cause: parsedPlan.error
131
+ });
132
+ }
133
+ const plan = parsedPlan.data;
134
+ const input = plan.operation === 'build'
135
+ ? plan.sourceRevision
136
+ ? { operation: 'build', worker: plan.worker, sourceRevision: plan.sourceRevision }
137
+ : undefined
138
+ : { operation: 'apply', worker: plan.worker };
139
+ if (!input) {
140
+ throw new CapabilityError('DOKS build plan has no source revision.', 'INVALID_INPUT', {
141
+ reason: 'doks-worker-plan-invalid'
142
+ });
143
+ }
144
+ const parsedInput = DigitalOceanDoksWorkerExecutionInputSchema.safeParse(input);
145
+ if (!parsedInput.success) {
146
+ throw new CapabilityError('DOKS worker execution input is invalid.', 'INVALID_INPUT', {
147
+ reason: 'doks-worker-execution-invalid',
148
+ cause: parsedInput.error
149
+ });
150
+ }
151
+ return DigitalOceanDoksWorkerExecutionInputSchema.parse({
152
+ ...parsedInput.data,
153
+ environment: parsedOptions.data.environment ?? parsedInput.data.environment
154
+ });
155
+ };
156
+ const adapter = {
157
+ planApply: planDigitalOceanDoksWorkerApply,
158
+ planBuild: planDigitalOceanDoksWorkerBuild,
159
+ apply: (plan) => client.applyWorkerPlan(executionInput(plan)),
160
+ status: (plan) => client.getWorkerPlanStatus(executionInput(plan))
161
+ };
162
+ const parsedAdapter = DigitalOceanDoksWorkerExecutionOwnerSchema.safeParse(adapter);
163
+ if (!parsedAdapter.success) {
164
+ throw new CapabilityError('DOKS worker adapter is invalid.', 'INTERNAL', {
165
+ reason: 'doks-worker-adapter-invalid',
166
+ cause: parsedAdapter.error
167
+ });
168
+ }
169
+ return adapter;
170
+ }
171
+ }
172
+ //# sourceMappingURL=clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.js","sourceRoot":"","sources":["../../../src/infra/doks/clients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * DigitalOcean Cloud Provider Implementation
3
+ *
4
+ * Implements the CloudProvider interface for DigitalOcean.
5
+ */
6
+ import { BaseCloudProvider } from '@vibesdotdev/infra-core/doks/cloud';
7
+ import { type VibesRuntime } from '@vibesdotdev/kernel';
8
+ import type { CloudInstance, InstanceConfig, InstanceFilters, CloudVolume, VolumeConfig, VolumeFilters, SSHKey } from '@vibesdotdev/infra-core/doks/types';
9
+ export declare class DigitalOceanProvider extends BaseCloudProvider {
10
+ name: string;
11
+ private readonly client;
12
+ constructor(runtime: Pick<VibesRuntime, 'lifecycle'>, apiToken: string, defaultRegion?: string);
13
+ private doRequest;
14
+ createInstance(config: InstanceConfig): Promise<CloudInstance>;
15
+ deleteInstance(instanceId: string): Promise<void>;
16
+ getInstance(instanceId: string): Promise<CloudInstance | null>;
17
+ listInstances(filters?: InstanceFilters): Promise<CloudInstance[]>;
18
+ createVolume(config: VolumeConfig): Promise<CloudVolume>;
19
+ attachVolume(volumeId: string, instanceId: string): Promise<void>;
20
+ detachVolume(volumeId: string): Promise<void>;
21
+ deleteVolume(volumeId: string): Promise<void>;
22
+ listVolumes(filters?: VolumeFilters): Promise<CloudVolume[]>;
23
+ getOrCreateVPC(name: string): Promise<string>;
24
+ addSSHKey(name: string, publicKey: string): Promise<string>;
25
+ listSSHKeys(): Promise<SSHKey[]>;
26
+ private waitForDropletReady;
27
+ private mapDropletToInstance;
28
+ private mapDropletStatus;
29
+ private mapVolumeToCloudVolume;
30
+ private extractDropletId;
31
+ private formatTags;
32
+ private parseTags;
33
+ }
34
+ //# sourceMappingURL=digitalocean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digitalocean.d.ts","sourceRoot":"","sources":["../../../src/infra/doks/digitalocean.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpG,OAAO,KAAK,EACX,aAAa,EACb,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,MAAM,EAEN,MAAM,oCAAoC,CAAC;AAiC5C,qBAAa,oBAAqB,SAAQ,iBAAiB;IAC1D,IAAI,SAAkB;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAGvD,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EACxC,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,MAAe;YASjB,SAAS;IAiBjB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA6B9D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgB9D,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA2BlE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBxD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgB5D,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkC7C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB3D,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAiBxB,mBAAmB;IAiDjC,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;CAYjB"}
@@ -0,0 +1,267 @@
1
+ import * as z from 'zod/v4';
2
+ import { digitalOceanHttpStatus } from "../../client/errors.js";
3
+ import { DigitalOceanResponseSchema } from "../../schemas/control-plane.js";
4
+ import { ProviderDropletResponseSchema, ProviderDropletsResponseSchema, ProviderVolumeResponseSchema, ProviderVolumesResponseSchema, VpcsResponseSchema, VpcResponseSchema, ProviderSshKeyResponseSchema, ProviderSshKeysResponseSchema } from "../../schemas/http.js";
5
+ /**
6
+ * DigitalOcean Cloud Provider Implementation
7
+ *
8
+ * Implements the CloudProvider interface for DigitalOcean.
9
+ */
10
+ import { BaseCloudProvider } from '@vibesdotdev/infra-core/doks/cloud';
11
+ import { CapabilityError, settle, isCapabilityError } from '@vibesdotdev/kernel';
12
+ import { DigitalOceanControlPlaneClient } from "../../client/index.js";
13
+ export class DigitalOceanProvider extends BaseCloudProvider {
14
+ name = 'digitalocean';
15
+ client;
16
+ constructor(runtime, apiToken, defaultRegion = 'nyc3') {
17
+ super(runtime, apiToken, defaultRegion);
18
+ this.client = new DigitalOceanControlPlaneClient({
19
+ runtime,
20
+ token: { value: apiToken, kind: 'explicit' }
21
+ });
22
+ }
23
+ async doRequest(path, options, schema) {
24
+ const result = await settle(() => this.client.request(path, options, schema));
25
+ if (result.ok)
26
+ return result.value;
27
+ const error = result.cause;
28
+ if (error instanceof CapabilityError && error.reason === 'digitalocean-http-failed') {
29
+ throw this.createError(`DigitalOcean API error: ${error.details?.status}`, 'API_ERROR', {
30
+ status: digitalOceanHttpStatus(error)
31
+ }, error);
32
+ }
33
+ throw error;
34
+ }
35
+ async createInstance(config) {
36
+ const dropletData = {
37
+ name: config.name,
38
+ region: config.region || this.defaultRegion,
39
+ size: config.type,
40
+ image: config.image,
41
+ ssh_keys: config.sshKeys || [],
42
+ vpc_uuid: config.vpcId,
43
+ tags: this.formatTags(this.buildTags(config.tags)),
44
+ user_data: config.userData
45
+ };
46
+ const response = await this.doRequest('/droplets', {
47
+ method: 'POST',
48
+ body: JSON.stringify(dropletData)
49
+ }, ProviderDropletResponseSchema);
50
+ const droplet = response.droplet;
51
+ // Wait for droplet to be ready
52
+ const readyDroplet = await this.waitForDropletReady(droplet.id);
53
+ return this.mapDropletToInstance(readyDroplet);
54
+ }
55
+ async deleteInstance(instanceId) {
56
+ const numericId = this.extractDropletId(instanceId);
57
+ await this.doRequest(`/droplets/${numericId}`, {
58
+ method: 'DELETE'
59
+ }, DigitalOceanResponseSchema);
60
+ }
61
+ async getInstance(instanceId) {
62
+ const numericId = this.extractDropletId(instanceId);
63
+ const result = await settle(() => this.doRequest(`/droplets/${numericId}`, {}, ProviderDropletResponseSchema));
64
+ if (result.ok)
65
+ return this.mapDropletToInstance(result.value.droplet);
66
+ const error = result.cause;
67
+ if (error instanceof CapabilityError &&
68
+ error.reason === 'cloud-provider-api-error' &&
69
+ error.details?.status === 404)
70
+ return null;
71
+ throw error;
72
+ }
73
+ async listInstances(filters) {
74
+ const params = new URLSearchParams();
75
+ if (filters?.tags) {
76
+ params.append('tag_name', this.formatTags(filters.tags).join(','));
77
+ }
78
+ const response = await this.doRequest(`/droplets?${params.toString()}`, {}, ProviderDropletsResponseSchema);
79
+ const droplets = response.droplets;
80
+ let instances = droplets.map((d) => this.mapDropletToInstance(d));
81
+ // Apply additional filters
82
+ if (filters?.status) {
83
+ instances = instances.filter((i) => filters.status.includes(i.status));
84
+ }
85
+ if (filters?.region) {
86
+ instances = instances.filter((i) => i.region === filters.region);
87
+ }
88
+ return instances;
89
+ }
90
+ async createVolume(config) {
91
+ const volumeData = {
92
+ name: config.name,
93
+ size_gigabytes: config.size,
94
+ region: config.region || this.defaultRegion,
95
+ tags: config.tags ? this.formatTags(config.tags) : []
96
+ };
97
+ const response = await this.doRequest('/volumes', {
98
+ method: 'POST',
99
+ body: JSON.stringify(volumeData)
100
+ }, ProviderVolumeResponseSchema);
101
+ return this.mapVolumeToCloudVolume(response.volume);
102
+ }
103
+ async attachVolume(volumeId, instanceId) {
104
+ const numericId = this.extractDropletId(instanceId);
105
+ await this.doRequest(`/volumes/${volumeId}/actions`, {
106
+ method: 'POST',
107
+ body: JSON.stringify({
108
+ type: 'attach',
109
+ droplet_id: numericId
110
+ })
111
+ }, DigitalOceanResponseSchema);
112
+ // Wait for volume to be attached
113
+ await this.waitForVolumeStatus(volumeId, 'in-use');
114
+ }
115
+ async detachVolume(volumeId) {
116
+ await this.doRequest(`/volumes/${volumeId}/actions`, {
117
+ method: 'POST',
118
+ body: JSON.stringify({
119
+ type: 'detach'
120
+ })
121
+ }, DigitalOceanResponseSchema);
122
+ // Wait for volume to be available
123
+ await this.waitForVolumeStatus(volumeId, 'available');
124
+ }
125
+ async deleteVolume(volumeId) {
126
+ await this.doRequest(`/volumes/${volumeId}`, {
127
+ method: 'DELETE'
128
+ }, DigitalOceanResponseSchema);
129
+ }
130
+ async listVolumes(filters) {
131
+ const params = new URLSearchParams();
132
+ if (filters?.region) {
133
+ params.append('region', filters.region);
134
+ }
135
+ const response = await this.doRequest(`/volumes?${params.toString()}`, {}, ProviderVolumesResponseSchema);
136
+ const volumes = response.volumes;
137
+ return volumes.map((v) => this.mapVolumeToCloudVolume(v));
138
+ }
139
+ async getOrCreateVPC(name) {
140
+ // List existing VPCs
141
+ const response = await this.doRequest('/vpcs', {}, VpcsResponseSchema);
142
+ const vpcs = response.vpcs || [];
143
+ // Check if VPC with this name exists
144
+ const existingVpc = vpcs.find((vpc) => vpc.name === name);
145
+ if (existingVpc) {
146
+ return existingVpc.id;
147
+ }
148
+ // Create new VPC
149
+ const vpcData = {
150
+ name,
151
+ region: this.defaultRegion,
152
+ ip_range: '10.0.0.0/16'
153
+ };
154
+ const createResponse = await this.doRequest('/vpcs', {
155
+ method: 'POST',
156
+ body: JSON.stringify(vpcData)
157
+ }, VpcResponseSchema);
158
+ return createResponse.vpc.id;
159
+ }
160
+ async addSSHKey(name, publicKey) {
161
+ const response = await this.doRequest('/account/keys', {
162
+ method: 'POST',
163
+ body: JSON.stringify({
164
+ name,
165
+ public_key: publicKey
166
+ })
167
+ }, ProviderSshKeyResponseSchema);
168
+ return response.ssh_key.fingerprint;
169
+ }
170
+ async listSSHKeys() {
171
+ const response = await this.doRequest('/account/keys', {}, ProviderSshKeysResponseSchema);
172
+ const keys = response.ssh_keys;
173
+ return keys.map((key) => ({
174
+ id: key.fingerprint,
175
+ name: key.name,
176
+ fingerprint: key.fingerprint,
177
+ publicKey: key.public_key
178
+ }));
179
+ }
180
+ // Helper methods
181
+ async waitForDropletReady(dropletId) {
182
+ const timeout = 300000;
183
+ const pollInterval = 5000;
184
+ const result = await settle(async () => {
185
+ return await this.runtime.lifecycle.wait(async (signal) => {
186
+ while (true) {
187
+ const response = await this.doRequest(`/droplets/${dropletId}`, {}, ProviderDropletResponseSchema);
188
+ const droplet = response.droplet;
189
+ if (droplet.status === 'active') {
190
+ return droplet;
191
+ }
192
+ if (droplet.status === 'error' || droplet.status === 'archive') {
193
+ throw this.createError(`Droplet entered error state: ${droplet.status}`, 'DROPLET_ERROR', { dropletId, status: droplet.status });
194
+ }
195
+ await this.runtime.lifecycle.delay(pollInterval, signal);
196
+ }
197
+ }, { timeoutMs: timeout, reason: 'waiting-for-droplet-active' });
198
+ });
199
+ if (result.ok)
200
+ return result.value;
201
+ const err = result.cause;
202
+ if (err instanceof Error && isCapabilityError(err) && err.reason === 'wait-timeout') {
203
+ throw this.createError('Timeout waiting for droplet to be ready', 'TIMEOUT', {
204
+ dropletId,
205
+ timeout
206
+ }, err);
207
+ }
208
+ throw err;
209
+ }
210
+ mapDropletToInstance(droplet) {
211
+ const publicIp = droplet.networks.v4.find((n) => n.type === 'public')?.ip_address;
212
+ const privateIp = droplet.networks.v4.find((n) => n.type === 'private')?.ip_address;
213
+ return {
214
+ id: `do-${droplet.id}`,
215
+ name: droplet.name,
216
+ type: droplet.size.slug,
217
+ region: droplet.region.slug,
218
+ status: this.mapDropletStatus(droplet.status),
219
+ publicIp,
220
+ privateIp,
221
+ createdAt: new Date(droplet.created_at),
222
+ tags: this.parseTags(droplet.tags)
223
+ };
224
+ }
225
+ mapDropletStatus(doStatus) {
226
+ const statusMap = {
227
+ new: 'pending',
228
+ active: 'running',
229
+ off: 'stopped',
230
+ archive: 'terminated',
231
+ error: 'error'
232
+ };
233
+ return Object.entries(statusMap).find(([status]) => status === doStatus)?.[1] ?? 'pending';
234
+ }
235
+ mapVolumeToCloudVolume(volume) {
236
+ return {
237
+ id: volume.id,
238
+ name: volume.name,
239
+ size: volume.size_gigabytes,
240
+ region: volume.region.slug,
241
+ status: volume.droplet_ids.length > 0 ? 'in-use' : 'available',
242
+ attachedTo: volume.droplet_ids.length > 0 ? `do-${volume.droplet_ids[0]}` : undefined,
243
+ createdAt: new Date(volume.created_at),
244
+ tags: this.parseTags(volume.tags)
245
+ };
246
+ }
247
+ extractDropletId(instanceId) {
248
+ if (instanceId.startsWith('do-')) {
249
+ return parseInt(instanceId.substring(3), 10);
250
+ }
251
+ return parseInt(instanceId, 10);
252
+ }
253
+ formatTags(tags) {
254
+ return Object.entries(tags).map(([key, value]) => `${key}:${value}`);
255
+ }
256
+ parseTags(tags) {
257
+ const result = {};
258
+ for (const tag of tags) {
259
+ const [key, value] = tag.split(':');
260
+ if (key && value) {
261
+ result[key] = value;
262
+ }
263
+ }
264
+ return result;
265
+ }
266
+ }
267
+ //# sourceMappingURL=digitalocean.js.map