@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,43 @@
1
+ import { BalanceSchema, PreviewSchema } from "../schemas/http.js";
2
+ import { BillingSummarySchema, sanitizeInfraProviderFailure } from '@vibesdotdev/infra-core';
3
+ const clean = (error) => sanitizeInfraProviderFailure(error).message;
4
+ export class DigitalOceanBillingClient {
5
+ client;
6
+ constructor(client) {
7
+ this.client = client;
8
+ }
9
+ getBalance() {
10
+ return this.client.get('/customers/my/balance', {}, BalanceSchema);
11
+ }
12
+ getInvoicePreviewSummary() {
13
+ return this.client.get('/customers/my/invoices/preview/summary', {}, PreviewSchema);
14
+ }
15
+ getBillingHistory() {
16
+ return this.client.get('/customers/my/billing_history');
17
+ }
18
+ async summary() {
19
+ const [b, p] = await Promise.allSettled([this.getBalance(), this.getInvoicePreviewSummary()]);
20
+ const errors = [];
21
+ if (b.status === 'rejected')
22
+ errors.push({ source: 'balance', message: clean(b.reason) });
23
+ if (p.status === 'rejected')
24
+ errors.push({ source: 'invoice-preview', message: clean(p.reason) });
25
+ const balance = b.status === 'fulfilled' ? b.value : undefined, preview = p.status === 'fulfilled' ? p.value : undefined;
26
+ const usd = (amount) => amount === undefined ? undefined : { currency: 'USD', amount };
27
+ return BillingSummarySchema.parse({
28
+ provider: 'digitalocean',
29
+ collectedAt: balance?.generated_at ?? new Date().toISOString(),
30
+ accountBalance: usd(balance?.account_balance),
31
+ monthToDateUsage: usd(balance?.month_to_date_usage),
32
+ monthToDateBalance: usd(balance?.month_to_date_balance),
33
+ grossProductCharges: usd(preview?.product_charges?.amount),
34
+ invoiceCreditsAndAdjustments: usd(preview?.credits_and_adjustments?.amount),
35
+ sponsorshipCredits: {
36
+ status: 'unknown',
37
+ reason: 'DigitalOcean billing APIs used by this command do not prove remaining sponsorship credit or expiry; inspect the authenticated Billing Credits surface.'
38
+ },
39
+ errors
40
+ });
41
+ }
42
+ }
43
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/infra/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EACN,oBAAoB,EACpB,4BAA4B,EAE5B,MAAM,yBAAyB,CAAC;AAWjC,MAAM,KAAK,GAAG,CAAC,KAAkD,EAAE,EAAE,CACpE,4BAA4B,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC7C,MAAM,OAAO,yBAAyB;IACR;IAA7B,YAA6B,MAAsC;QAAtC,WAAM,GAAN,MAAM,CAAgC;IAAG,CAAC;IACvE,UAAU;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAU,uBAAuB,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;IAC7E,CAAC;IACD,wBAAwB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAU,wCAAwC,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;IAC9F,CAAC;IACD,iBAAiB;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,CAAC,OAAO;QACZ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;YAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC7D,OAAO,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,GAAG,GAAG,CAAC,MAAe,EAAE,EAAE,CAC/B,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAChE,OAAO,oBAAoB,CAAC,KAAK,CAAC;YACjC,QAAQ,EAAE,cAAc;YACxB,WAAW,EAAE,OAAO,EAAE,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9D,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC;YAC7C,gBAAgB,EAAE,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC;YACnD,kBAAkB,EAAE,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAC;YACvD,mBAAmB,EAAE,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC;YAC1D,4BAA4B,EAAE,GAAG,CAAC,OAAO,EAAE,uBAAuB,EAAE,MAAM,CAAC;YAC3E,kBAAkB,EAAE;gBACnB,MAAM,EAAE,SAAS;gBACjB,MAAM,EACL,wJAAwJ;aACzJ;YACD,MAAM;SACN,CAAC,CAAC;IACJ,CAAC;CACD"}
@@ -0,0 +1,11 @@
1
+ import type { VibesRuntime } from '@vibesdotdev/kernel';
2
+ import type { StoreOperationContext } from '@vibesdotdev/secrets';
3
+ import { DigitalOceanControlPlaneClient } from '../client/control-plane.ts';
4
+ import type { DigitalOceanTokenCredentialCandidate } from '../schemas/control-plane.ts';
5
+ /**
6
+ * Construct a safe control-plane facade for the runtime's ordered credential
7
+ * candidates. Resolution and the authenticated request remain in the registered
8
+ * digitalocean-client-factory and Secrets client.
9
+ */
10
+ export declare function createDigitalOceanProviderControlPlaneClient(runtime: VibesRuntime, candidates?: readonly DigitalOceanTokenCredentialCandidate[], operation?: StoreOperationContext): Promise<DigitalOceanControlPlaneClient>;
11
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACN,8BAA8B,EAE9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,6BAA6B,CAAC;AAExF;;;;GAIG;AACH,wBAAsB,4CAA4C,CACjE,OAAO,EAAE,YAAY,EACrB,UAAU,CAAC,EAAE,SAAS,oCAAoC,EAAE,EAC5D,SAAS,CAAC,EAAE,qBAAqB,GAC/B,OAAO,CAAC,8BAA8B,CAAC,CAQzC"}
@@ -0,0 +1,15 @@
1
+ import { DigitalOceanControlPlaneClient } from "../client/control-plane.js";
2
+ /**
3
+ * Construct a safe control-plane facade for the runtime's ordered credential
4
+ * candidates. Resolution and the authenticated request remain in the registered
5
+ * digitalocean-client-factory and Secrets client.
6
+ */
7
+ export async function createDigitalOceanProviderControlPlaneClient(runtime, candidates, operation) {
8
+ const options = {};
9
+ if (candidates !== undefined)
10
+ options.credentialCandidates = candidates;
11
+ if (operation !== undefined)
12
+ options.operation = operation;
13
+ return DigitalOceanControlPlaneClient.fromRuntime(runtime, options);
14
+ }
15
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,8BAA8B,EAE9B,MAAM,4BAA4B,CAAC;AAGpC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4CAA4C,CACjE,OAAqB,EACrB,UAA4D,EAC5D,SAAiC;IAEjC,MAAM,OAAO,GAGT,EAAE,CAAC;IACP,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,CAAC,oBAAoB,GAAG,UAAU,CAAC;IACxE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC3D,OAAO,8BAA8B,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { DigitalOceanAppWebAppConfig } from '../../schemas/app-platform.ts';
2
+ /**
3
+ * Pull typed App Platform config out of a deployment module export.
4
+ * A recognized malformed export refuses before any credential access or HTTP;
5
+ * silently treating it as absent could lose an existing App id and CREATE a duplicate.
6
+ */
7
+ export declare function extractDigitalOceanAppConfig(exported: unknown): DigitalOceanAppWebAppConfig | undefined;
8
+ /** The ledger's provider trace for an App and its deployment. */
9
+ export declare function digitalOceanProviderTraceRef(appId: string | undefined, deploymentId: string | undefined): string | undefined;
10
+ //# sourceMappingURL=deploy-secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-secrets.d.ts","sourceRoot":"","sources":["../../../src/infra/deployment-provider/deploy-secrets.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAGjF;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,OAAO,GAAG,2BAA2B,GAAG,SAAS,CA2DvG;AAED,iEAAiE;AACjE,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC9B,MAAM,GAAG,SAAS,CAKpB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Pure App Platform provider projections: recognize the declared config shape
3
+ * and build a value-free trace reference.
4
+ */
5
+ import { CapabilityError } from '@vibesdotdev/kernel';
6
+ import { DIGITALOCEAN_APPS_ADAPTER_ID, DigitalOceanAppAdapterConfigSchema, DigitalOceanAppExportCandidateSchema, DigitalOceanAppExportContainerSchema } from "../../schemas/app-deployment.js";
7
+ /**
8
+ * Pull typed App Platform config out of a deployment module export.
9
+ * A recognized malformed export refuses before any credential access or HTTP;
10
+ * silently treating it as absent could lose an existing App id and CREATE a duplicate.
11
+ */
12
+ export function extractDigitalOceanAppConfig(exported) {
13
+ const parsedRaw = DigitalOceanAppExportContainerSchema.safeParse(exported);
14
+ if (!parsedRaw.success)
15
+ return undefined;
16
+ const container = parsedRaw.data;
17
+ const candidates = [];
18
+ if (Object.hasOwn(container, 'digitaloceanApp')) {
19
+ candidates.push({ key: 'digitaloceanApp', value: container.digitaloceanApp });
20
+ }
21
+ if (Object.hasOwn(container, 'digitalocean')) {
22
+ candidates.push({ key: 'digitalocean', value: container.digitalocean });
23
+ }
24
+ if (Object.hasOwn(container, 'doApp')) {
25
+ candidates.push({ key: 'doApp', value: container.doApp });
26
+ }
27
+ const appConfigAdapter = DigitalOceanAppAdapterConfigSchema.safeParse(container.appConfig);
28
+ if (Object.hasOwn(container, 'appConfig') &&
29
+ appConfigAdapter.success &&
30
+ appConfigAdapter.data.adapter === DIGITALOCEAN_APPS_ADAPTER_ID) {
31
+ candidates.push({ key: 'appConfig', value: container.appConfig });
32
+ }
33
+ const configAdapter = DigitalOceanAppAdapterConfigSchema.safeParse(container.config);
34
+ if (Object.hasOwn(container, 'config') &&
35
+ configAdapter.success &&
36
+ configAdapter.data.adapter === DIGITALOCEAN_APPS_ADAPTER_ID) {
37
+ candidates.push({ key: 'config', value: container.config });
38
+ }
39
+ for (const candidate of candidates) {
40
+ const parsed = DigitalOceanAppExportCandidateSchema.safeParse({ key: candidate.key, config: candidate.value });
41
+ if (parsed.success)
42
+ return parsed.data.config;
43
+ throw new CapabilityError(`The supplied DigitalOcean App configuration under '${candidate.key}' is malformed.`, 'INVALID_INPUT', {
44
+ reason: 'digitalocean-app-config-invalid',
45
+ retryable: false,
46
+ details: {
47
+ key: candidate.key,
48
+ problem: 'app-config-invalid',
49
+ issues: parsed.error.issues.map((issue) => ({ path: issue.path.join('.'), message: issue.message })).slice(0, 20)
50
+ },
51
+ recoveryHint: 'Fix the digitaloceanApp export; it is validated before credentials resolve or any request is made.'
52
+ });
53
+ }
54
+ return undefined;
55
+ }
56
+ /** The ledger's provider trace for an App and its deployment. */
57
+ export function digitalOceanProviderTraceRef(appId, deploymentId) {
58
+ if (appId && deploymentId)
59
+ return `digitalocean-app://apps/${appId}/deployments/${deploymentId}`;
60
+ if (deploymentId)
61
+ return `digitalocean-app://deployments/${deploymentId}`;
62
+ if (appId)
63
+ return `digitalocean-app://apps/${appId}`;
64
+ return undefined;
65
+ }
66
+ //# sourceMappingURL=deploy-secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-secrets.js","sourceRoot":"","sources":["../../../src/infra/deployment-provider/deploy-secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * DigitalOcean App Platform deployment provider.
3
+ *
4
+ * Planning and dry-run produce value-free evidence without resolving credentials,
5
+ * starting processes, or contacting DigitalOcean. Execution resolves credentials
6
+ * through its runtime clients and delivers them only to the HTTP and Secrets
7
+ * mutation seams.
8
+ */
9
+ import { type KindContext, type VibesRuntime } from '@vibesdotdev/kernel';
10
+ import type { RuntimeDescriptor } from '@vibesdotdev/kernel/schemas/descriptor';
11
+ import { type JsonObject } from '@vibesdotdev/kernel/schemas/json';
12
+ import { type DeploymentArtifactOptions, type DeploymentArtifactResult, type DeploymentInspection, type DeploymentInspectionOptions, type DeploymentRollbackOutcome, type DeploymentProviderEnvironment, type DeploymentProviderImplementation, type DeploymentReleaseOptions, type DeploymentReleaseResult } from '@vibesdotdev/infra-core/kinds';
13
+ import { type WebAppDescriptor, type WebAppProjectionOptions } from '@vibesdotdev/infra-core';
14
+ /** Constructed by the kernel for the digitalocean-app descriptor with its resolving runtime. */
15
+ export declare class DigitalOceanAppDeploymentProvider implements DeploymentProviderImplementation {
16
+ #private;
17
+ readonly descriptor: RuntimeDescriptor;
18
+ constructor(descriptor: RuntimeDescriptor, context: KindContext<VibesRuntime>);
19
+ projectWebApp(descriptor: WebAppDescriptor, _options: WebAppProjectionOptions): Promise<{
20
+ deployment: {
21
+ appId: string;
22
+ appName: string;
23
+ provider: string;
24
+ runtime: "worker" | "browser" | "edge" | "node";
25
+ build: {
26
+ workspaceRootDir: string;
27
+ appDir: string;
28
+ buildCommand: string;
29
+ outputDir: string;
30
+ installCommand?: string | undefined;
31
+ };
32
+ origins: {
33
+ hostname: string;
34
+ origin: string;
35
+ kind: "internal" | "redirect" | "preview" | "primary" | "alias";
36
+ description?: string | undefined;
37
+ }[];
38
+ env: {
39
+ name: string;
40
+ public?: boolean | undefined;
41
+ required?: boolean | undefined;
42
+ value?: string | undefined;
43
+ secret?: boolean | undefined;
44
+ description?: string | undefined;
45
+ storeKey?: string | undefined;
46
+ storeBinding?: boolean | undefined;
47
+ }[];
48
+ dependsOn: {
49
+ appId: string;
50
+ reason: string;
51
+ required: boolean;
52
+ }[];
53
+ upstreams: {
54
+ name: string;
55
+ origin: string;
56
+ purpose: string;
57
+ originEnvVar?: string | undefined;
58
+ }[];
59
+ tags: string[];
60
+ kvNamespaces: {
61
+ binding: string;
62
+ id: string;
63
+ preview_id?: string | undefined;
64
+ }[];
65
+ preDeployCommands: {
66
+ command: string;
67
+ description?: string | undefined;
68
+ }[];
69
+ execution?: {
70
+ pty?: boolean | undefined;
71
+ shell?: boolean | undefined;
72
+ maxSessions?: number | undefined;
73
+ } | undefined;
74
+ migrations?: {
75
+ requiredForLocalDev: boolean;
76
+ } | undefined;
77
+ };
78
+ provider: string;
79
+ managed: boolean;
80
+ workerName: string | null;
81
+ artifact: {
82
+ content: string;
83
+ filename: string;
84
+ path: string;
85
+ metadata?: Record<string, unknown> | undefined;
86
+ } | null;
87
+ }>;
88
+ validateOptions(options: JsonObject): void;
89
+ environment(): Promise<DeploymentProviderEnvironment>;
90
+ release(options: DeploymentReleaseOptions): Promise<DeploymentReleaseResult>;
91
+ inspect(options: DeploymentInspectionOptions): Promise<DeploymentInspection>;
92
+ regenerate(options: DeploymentArtifactOptions): Promise<DeploymentArtifactResult>;
93
+ rollback(): Promise<DeploymentRollbackOutcome>;
94
+ }
95
+ export default DigitalOceanAppDeploymentProvider;
96
+ //# sourceMappingURL=digitalocean-deployment-provider.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digitalocean-deployment-provider.impl.d.ts","sourceRoot":"","sources":["../../../src/infra/deployment-provider/digitalocean-deployment-provider.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAG3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACpF,OAAO,EAMN,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAA0B,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AA6EtH,gGAAgG;AAChG,qBAAa,iCAAkC,YAAW,gCAAgC;;IAG7E,QAAQ,CAAC,UAAU,EAAE,iBAAiB;gBAA7B,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,CAAC,YAAY,CAAC;IAIhF,aAAa,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASnF,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAIpC,WAAW,IAAI,OAAO,CAAC,6BAA6B,CAAC;IAIrD,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiI5E,OAAO,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2B5E,UAAU,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAQjF,QAAQ,IAAI,OAAO,CAAC,yBAAyB,CAAC;CAMpD;AAED,eAAe,iCAAiC,CAAC"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * DigitalOcean App Platform deployment provider.
3
+ *
4
+ * Planning and dry-run produce value-free evidence without resolving credentials,
5
+ * starting processes, or contacting DigitalOcean. Execution resolves credentials
6
+ * through its runtime clients and delivers them only to the HTTP and Secrets
7
+ * mutation seams.
8
+ */
9
+ import { CapabilityError } from '@vibesdotdev/kernel';
10
+ import { prepareRegistryStandaloneBuildContext } from '@vibesdotdev/registry/standalone-install';
11
+ import { JsonValueSchema } from '@vibesdotdev/kernel/schemas/json';
12
+ import { DeploymentArtifactResultSchema, DeploymentEnvironmentFactsSchema, DeploymentProviderEnvironmentSchema, DeploymentReadinessCheckSchema, DeploymentReleaseResultSchema } from '@vibesdotdev/infra-core/kinds';
13
+ import { WebAppProjectionSchema } from '@vibesdotdev/infra-core';
14
+ import { DigitalOceanAppWebAppConfigSchema } from "../../schemas/app-platform.js";
15
+ import { getDigitalOceanClientFactory } from "../../client/helpers.js";
16
+ import { DigitalOceanReleaseOptionsSchema } from "../../schemas/app-deployment.js";
17
+ import { loadDigitalOceanImagePublishSettings } from "../../secrets/container-registry/image-publish-settings.descriptor.js";
18
+ import { digitalOceanProviderTraceRef, extractDigitalOceanAppConfig } from "./deploy-secrets.js";
19
+ import { publishDigitalOceanAppImage, requireImagePublishSettings, resolveDigitalOceanImageTag, shouldPublishDigitalOceanContainerImage } from "./image-publish.js";
20
+ const IMMUTABLE_IMAGE_DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/i;
21
+ async function withBuildContextCleanup(context, work) {
22
+ let result;
23
+ try {
24
+ result = await work();
25
+ }
26
+ catch (failure) {
27
+ if (context) {
28
+ try {
29
+ await context.cleanup();
30
+ }
31
+ catch (cleanup) {
32
+ throw new AggregateError([failure, cleanup], 'Image publication and build context cleanup failed.', {
33
+ cause: failure
34
+ });
35
+ }
36
+ }
37
+ throw failure;
38
+ }
39
+ await context?.cleanup();
40
+ return result;
41
+ }
42
+ function assertImmutableImageDigest(digest) {
43
+ if (digest && IMMUTABLE_IMAGE_DIGEST_PATTERN.test(digest)) {
44
+ return digest.toLowerCase();
45
+ }
46
+ throw new CapabilityError('DigitalOcean container image deployment requires an immutable sha256 digest.', 'UNAVAILABLE', {
47
+ reason: 'digitalocean-image-digest-missing',
48
+ retryable: false,
49
+ recoveryHint: 'Publish or configure the container image with an immutable sha256:<64-hex> digest.'
50
+ });
51
+ }
52
+ function readReleaseOptions(options) {
53
+ const parsed = DigitalOceanReleaseOptionsSchema.safeParse(options);
54
+ if (!parsed.success) {
55
+ throw new CapabilityError('Invalid DigitalOcean deploy options.', 'INVALID_INPUT', {
56
+ reason: 'digitalocean-deploy-options-invalid',
57
+ retryable: false,
58
+ details: { issues: parsed.error.issues.map((issue) => ({ path: issue.path.join('.'), message: issue.message })) }
59
+ });
60
+ }
61
+ return parsed.data;
62
+ }
63
+ /** Constructed by the kernel for the digitalocean-app descriptor with its resolving runtime. */
64
+ export class DigitalOceanAppDeploymentProvider {
65
+ descriptor;
66
+ #runtime;
67
+ constructor(descriptor, context) {
68
+ this.descriptor = descriptor;
69
+ this.#runtime = context.runtime;
70
+ }
71
+ async projectWebApp(descriptor, _options) {
72
+ DigitalOceanAppWebAppConfigSchema.parse(descriptor.config);
73
+ return WebAppProjectionSchema.parse({
74
+ deployment: descriptor.deployment, provider: descriptor.deployment.provider,
75
+ managed: false, workerName: descriptor.config.digitaloceanAppName ?? descriptor.deployment.appId,
76
+ artifact: null
77
+ });
78
+ }
79
+ validateOptions(options) {
80
+ readReleaseOptions(options);
81
+ }
82
+ async environment() {
83
+ return DeploymentProviderEnvironmentSchema.parse({ variables: {}, projected: false });
84
+ }
85
+ async release(options) {
86
+ const runtime = this.#runtime;
87
+ const flags = readReleaseOptions(options.options);
88
+ const { deployment, dryRun, onLine, log } = options;
89
+ const appConfig = extractDigitalOceanAppConfig(options.module.exported);
90
+ const appId = flags.doAppId ?? appConfig?.id;
91
+ const doRegion = flags.doRegion ?? appConfig?.region;
92
+ const doDryRunSpec = flags.doDryRunSpec === true;
93
+ const isDryRun = dryRun || doDryRunSpec;
94
+ const immutableRelease = Boolean(options.source.compositionDigest);
95
+ const git = flags.doGitRepo
96
+ ? { repoCloneUrl: flags.doGitRepo, branch: flags.doGitBranch ?? options.source.branch }
97
+ : undefined;
98
+ const factory = await getDigitalOceanClientFactory(runtime);
99
+ let effectiveAppConfig = appConfig;
100
+ if (!isDryRun) {
101
+ if (immutableRelease && !options.host.assertSource) {
102
+ throw new CapabilityError('Immutable DigitalOcean release requires a workspace source verifier.', 'CONFLICT', { reason: 'workspace-source-verifier-missing', retryable: false });
103
+ }
104
+ if (immutableRelease && flags.doGitRepo) {
105
+ throw new CapabilityError('Immutable DigitalOcean release cannot deploy from a mutable remote Git branch.', 'INVALID_INPUT', {
106
+ reason: 'digitalocean-git-source-mutable',
107
+ retryable: false,
108
+ details: {
109
+ repoCloneUrl: flags.doGitRepo,
110
+ branch: flags.doGitBranch ?? options.source.branch ?? null
111
+ }
112
+ });
113
+ }
114
+ await options.host.assertSource?.();
115
+ const wantsImage = shouldPublishDigitalOceanContainerImage({
116
+ appConfig,
117
+ doGitRepo: flags.doGitRepo
118
+ });
119
+ const publishSettings = wantsImage
120
+ ? requireImagePublishSettings(await loadDigitalOceanImagePublishSettings(runtime))
121
+ : undefined;
122
+ if (wantsImage && publishSettings && appConfig?.dockerfilePath) {
123
+ const appRepositoryRoot = options.repositoryRoot ?? options.workspaceRoot;
124
+ const context = appConfig.registryStandaloneContext
125
+ ? await prepareRegistryStandaloneBuildContext(runtime, { cwd: appRepositoryRoot })
126
+ : undefined;
127
+ const dockerfilePath = appConfig.dockerfilePath;
128
+ const published = await withBuildContextCleanup(context, async () => {
129
+ await context?.verify();
130
+ await options.host.assertSource?.();
131
+ const image = await publishDigitalOceanAppImage({
132
+ runtime,
133
+ appRepositoryRoot,
134
+ dockerfilePath,
135
+ standaloneContext: context?.directory,
136
+ repository: deployment.appId,
137
+ tag: resolveDigitalOceanImageTag(runtime, options.source.commit),
138
+ settings: publishSettings,
139
+ onLine
140
+ });
141
+ await context?.verify();
142
+ return image;
143
+ });
144
+ const digest = assertImmutableImageDigest(published.digest);
145
+ await options.host.assertSource?.();
146
+ effectiveAppConfig = { ...appConfig, containerImage: { ...published, digest } };
147
+ onLine('stdout', '[digitalocean] published container image ' + published.registry + '/' + published.repository + ':' + published.tag + '@' + digest);
148
+ }
149
+ else if (immutableRelease && effectiveAppConfig?.containerImage) {
150
+ const digest = assertImmutableImageDigest(effectiveAppConfig.containerImage.digest);
151
+ effectiveAppConfig = {
152
+ ...effectiveAppConfig,
153
+ containerImage: { ...effectiveAppConfig.containerImage, digest }
154
+ };
155
+ }
156
+ }
157
+ const client = factory.createAppDeploy({ credentialLog: log });
158
+ const result = await client.deployApp({
159
+ deployment,
160
+ appId,
161
+ appConfig: effectiveAppConfig,
162
+ region: doRegion,
163
+ git,
164
+ dryRun,
165
+ dryRunSpec: doDryRunSpec,
166
+ waitForActive: !isDryRun || flags.doWait,
167
+ waitTimeoutMs: flags.doWaitTimeout,
168
+ onLine
169
+ });
170
+ const tail = result.phase ? ' [phase=' + result.phase + ']' : '';
171
+ const summary = doDryRunSpec
172
+ ? 'Printed safe App deployment evidence for ' + deployment.appId + ' (no API call).'
173
+ : dryRun
174
+ ? 'Planned DO App ' + deployment.appId + ' without credentials or API calls.'
175
+ : result.liveUrl
176
+ ? 'Deployed DO App ' + result.appId + ' at ' + result.liveUrl + tail
177
+ : 'Deployed DO App ' + result.appId + tail;
178
+ const fields = { appId: result.appId };
179
+ if (result.liveUrl !== undefined)
180
+ fields.liveUrl = result.liveUrl;
181
+ if (result.phase !== undefined)
182
+ fields.phase = result.phase;
183
+ if (result.deploymentId !== undefined)
184
+ fields.deploymentId = result.deploymentId;
185
+ if (effectiveAppConfig?.containerImage?.digest !== undefined) {
186
+ fields.imageDigest = effectiveAppConfig.containerImage.digest;
187
+ }
188
+ if (result.spec !== undefined)
189
+ fields.spec = JsonValueSchema.parse(result.spec);
190
+ return DeploymentReleaseResultSchema.parse({
191
+ status: isDryRun ? 'dry-run' : 'released',
192
+ deployedUrl: result.liveUrl,
193
+ externalDeploymentId: result.deploymentId,
194
+ providerTraceRef: digitalOceanProviderTraceRef(result.appId, result.deploymentId),
195
+ probe: !isDryRun,
196
+ notes: result.phase ? 'phase=' + result.phase : doDryRunSpec ? 'dry-run-spec' : undefined,
197
+ summary,
198
+ result: fields
199
+ });
200
+ }
201
+ async inspect(options) {
202
+ const { deployment } = options;
203
+ const routes = options.environment === 'production'
204
+ ? deployment.origins.filter((origin) => origin.kind === 'primary' || origin.kind === 'redirect').map((origin) => origin.hostname)
205
+ : [];
206
+ return {
207
+ facts: DeploymentEnvironmentFactsSchema.parse({
208
+ generated: false,
209
+ resolved: true,
210
+ providerEnvironment: null,
211
+ explicitEnvironment: true,
212
+ routesInherited: false,
213
+ routes,
214
+ boundSecrets: [],
215
+ declaredRequirements: deployment.env.filter((entry) => entry.secret && entry.required !== false).map((entry) => entry.name)
216
+ }),
217
+ checks: [DeploymentReadinessCheckSchema.parse({
218
+ id: 'generated-config',
219
+ label: 'Generated provider config',
220
+ status: 'pass',
221
+ summary: 'No generated provider config is required for ' + this.descriptor.id + '.',
222
+ evidence: ['provider: ' + this.descriptor.id],
223
+ action: null
224
+ })]
225
+ };
226
+ }
227
+ async regenerate(options) {
228
+ return DeploymentArtifactResultSchema.parse({
229
+ status: 'skipped',
230
+ path: options.appDir,
231
+ reason: 'DigitalOcean App Platform renders its App spec at deploy; no committed provider artifact.'
232
+ });
233
+ }
234
+ async rollback() {
235
+ throw new CapabilityError('DigitalOcean App Platform rollback is not available through vibes infra deploy rollback.', 'UNAVAILABLE', {
236
+ reason: 'deployment-rollback-unsupported',
237
+ retryable: false
238
+ });
239
+ }
240
+ }
241
+ export default DigitalOceanAppDeploymentProvider;
242
+ //# sourceMappingURL=digitalocean-deployment-provider.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digitalocean-deployment-provider.impl.js","sourceRoot":"","sources":["../../../src/infra/deployment-provider/digitalocean-deployment-provider.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Build and publish a Dockerfile App image through the Secrets execution owner.
3
+ */
4
+ import { type VibesRuntime } from '@vibesdotdev/kernel';
5
+ import type { ExecutionOutputLine } from '@vibesdotdev/kernel/execution';
6
+ import type { DigitalOceanAppImageRef, DigitalOceanAppWebAppConfig } from '../../schemas/app-platform.ts';
7
+ import type { DigitalOceanImagePublishSettings } from '../../schemas/app-deployment.ts';
8
+ export declare const DIGITALOCEAN_CONTAINER_REGISTRY_HOST = "registry.digitalocean.com";
9
+ /**
10
+ * Extract the immutable manifest digest (`sha256:<64-hex>`) emitted by `docker push`.
11
+ * Refuses when the registry push output reports no immutable digest.
12
+ */
13
+ export declare function extractPublishedImageDigest(...outputs: Array<string | undefined>): string;
14
+ export declare function shouldPublishDigitalOceanContainerImage(input: {
15
+ appConfig: DigitalOceanAppWebAppConfig | undefined;
16
+ doGitRepo: string | undefined;
17
+ }): boolean;
18
+ /** Prefer the immutable build version; fall back to the resolved source commit. */
19
+ export declare function resolveDigitalOceanImageTag(runtime: Pick<VibesRuntime, 'getEnv'>, sourceCommit: string | undefined): string;
20
+ export interface PublishDigitalOceanAppImageInput {
21
+ runtime: VibesRuntime;
22
+ appRepositoryRoot: string;
23
+ dockerfilePath: string;
24
+ standaloneContext?: string;
25
+ repository: string;
26
+ tag: string;
27
+ settings: DigitalOceanImagePublishSettings;
28
+ onLine?: ExecutionOutputLine;
29
+ }
30
+ /**
31
+ * Resolve the credential reference and spawn one supervised shell through
32
+ * Secrets. Docker login, build and push stay in that process tree; its config
33
+ * directory is temporary and removed on exit. The package never receives the
34
+ * token value, and every child output byte is redacted by the owner.
35
+ */
36
+ export declare function publishDigitalOceanAppImage(input: PublishDigitalOceanAppImageInput): Promise<DigitalOceanAppImageRef>;
37
+ /** Refuse a Dockerfile publish whose delivery settings were never composed. */
38
+ export declare function requireImagePublishSettings(settings: DigitalOceanImagePublishSettings | undefined): DigitalOceanImagePublishSettings;
39
+ //# sourceMappingURL=image-publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-publish.d.ts","sourceRoot":"","sources":["../../../src/infra/deployment-provider/image-publish.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AAExF,eAAO,MAAM,oCAAoC,8BAA8B,CAAC;AAMhF;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAgBzF;AAED,wBAAgB,uCAAuC,CAAC,KAAK,EAAE;IAC9D,SAAS,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACnD,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GAAG,OAAO,CAKV;AAED,mFAAmF;AACnF,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EACrC,YAAY,EAAE,MAAM,GAAG,SAAS,GAC9B,MAAM,CASR;AAED,MAAM,WAAW,gCAAgC;IAChD,OAAO,EAAE,YAAY,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,gCAAgC,CAAC;IAC3C,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AA+BD;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAChD,KAAK,EAAE,gCAAgC,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAmDlC;AAED,+EAA+E;AAC/E,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,gCAAgC,GAAG,SAAS,GACpD,gCAAgC,CAalC"}