@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 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/infra/doks/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Implementation: infra/sandbox -> digitalocean-droplet
3
+ *
4
+ * Cloud-safe DigitalOcean Droplet provisioner for platform on-demand hosts.
5
+ * This intentionally lives outside infra-doks so platform-web can register
6
+ * the sandbox adapter without bundling Kubernetes or Node-only DOKS helpers.
7
+ */
8
+ import { type VibesRuntime } from '@vibesdotdev/kernel';
9
+ import type { SandboxHostLaunchPreflight, SandboxHostLaunchRequest } from '@vibesdotdev/infra-core/kinds';
10
+ import { DigitalOceanControlPlaneClient, type DigitalOceanControlPlaneClientOptions } from '../client/index.ts';
11
+ import { type DoDropletDescriptorInput } from '../schemas/droplet.ts';
12
+ export { DoDropletConfigSchema, DoDropletDescriptorSchema } from '../schemas/droplet.ts';
13
+ export type { DigitalOceanDroplet, DigitalOceanDropletListResponse, DigitalOceanDropletNetworkV4, DigitalOceanDropletResponse, DoDropletConfig, DoDropletDescriptor, DoDropletDescriptorInput } from '../schemas/droplet.ts';
14
+ export interface SandboxProvisionResult {
15
+ instanceId: string;
16
+ publicIp?: string;
17
+ privateIp?: string;
18
+ region: string;
19
+ createdAt: Date;
20
+ }
21
+ /**
22
+ * Optional lifecycle hooks for `provision()`.
23
+ *
24
+ * `onCreated` fires as soon as a droplet exists for the descriptor — right
25
+ * after the create call returns, or when the resource-tag lookup finds one
26
+ * from an earlier attempt — and BEFORE the wait-for-active poll (up to
27
+ * `waitTimeoutMs`, 300 s by default). Callers persist the droplet id there so
28
+ * a request that dies during the poll cannot orphan a running, billing
29
+ * droplet. The hook is awaited; a throwing hook aborts the provision.
30
+ */
31
+ export interface DoDropletProvisionHooks {
32
+ onCreated?: (created: SandboxProvisionResult) => void | Promise<void>;
33
+ }
34
+ export interface DoDropletDestroyOptions {
35
+ instanceId?: string;
36
+ descriptorId?: string;
37
+ /**
38
+ * Host id (kebab-case). Adds a `vibes:hostId:<hostId>` tag lookup to the
39
+ * sweep, matching the tag platform-web stamps on every provisioned host.
40
+ */
41
+ hostId?: string;
42
+ region?: string;
43
+ apiToken?: string;
44
+ baseUrl?: string;
45
+ }
46
+ /**
47
+ * What `destroy()` actually deleted. `deletedInstanceIds` is empty when no
48
+ * droplet matched the instance id / tag sweep — callers must report that as
49
+ * a no-op rather than a teardown.
50
+ */
51
+ export interface DoDropletDestroyReport {
52
+ deletedInstanceIds: string[];
53
+ /** Pause snapshots of this host that the sweep deleted (they bill per GB-month). */
54
+ deletedSnapshotIds?: string[];
55
+ }
56
+ /**
57
+ * Name prefix of the snapshot a pause leaves behind. `destroy({ hostId })`
58
+ * sweeps snapshots by it, so a destroyed host leaves no billing image even when
59
+ * the platform lost the snapshot id.
60
+ */
61
+ export declare function pauseSnapshotPrefix(hostId: string): string;
62
+ /** What a resume needs to recreate the droplet: its size, region and tags. */
63
+ export interface DoDropletPlacement {
64
+ size: string;
65
+ region: string;
66
+ tags: string[];
67
+ snapshotName: string;
68
+ }
69
+ /**
70
+ * One pause in progress, advanced a step at a time by `advancePause` (a snapshot
71
+ * of a GPU disk takes minutes, longer than one request). The droplet is deleted
72
+ * only after its snapshot completed and was found; a failed snapshot throws and
73
+ * leaves the droplet in place.
74
+ */
75
+ export type DoDropletPauseProgress = (DoDropletPlacement & {
76
+ phase: 'stopping';
77
+ instanceId: string;
78
+ requestedAt: string;
79
+ powerOffSent?: boolean;
80
+ }) | (DoDropletPlacement & {
81
+ phase: 'snapshotting';
82
+ instanceId: string;
83
+ actionId: number;
84
+ }) | (DoDropletPlacement & {
85
+ phase: 'paused';
86
+ snapshotId: string;
87
+ });
88
+ export interface DoDropletPauseOptions {
89
+ hostId: string;
90
+ /** The droplet to pause; required to start, ignored once progress exists. */
91
+ instanceId?: string;
92
+ progress?: DoDropletPauseProgress;
93
+ apiToken?: string;
94
+ baseUrl?: string;
95
+ now?: Date;
96
+ }
97
+ export interface DoDropletResumeOptions {
98
+ hostId: string;
99
+ /** Same descriptor id provision used (`host-<hostId>`): its resource tag makes resume idempotent. */
100
+ descriptorId: string;
101
+ snapshotId: string;
102
+ placement: DoDropletPlacement;
103
+ name?: string;
104
+ apiToken?: string;
105
+ baseUrl?: string;
106
+ }
107
+ /**
108
+ * Refuse a fleet launch DigitalOcean would reject, before any paid call, instead
109
+ * of surfacing the provider's 422 as a 502: a driver-bearing `gpu-*-base`
110
+ * image needs an SSH key. `--image gpu-h100x1-base --ssh-key-id <id>` works.
111
+ */
112
+ export declare function assertDigitalOceanImageSshKeys(request: Pick<SandboxHostLaunchRequest, 'image' | 'sshKeyIds'>): void;
113
+ export type DigitalOceanDropletClient = Pick<DigitalOceanControlPlaneClient, 'get' | 'post' | 'delete'>;
114
+ export type DoDropletClientFactory = (options: DigitalOceanControlPlaneClientOptions) => DigitalOceanDropletClient | Promise<DigitalOceanDropletClient>;
115
+ export interface DoDropletSandboxOptions {
116
+ /**
117
+ * The handed runtime: its kernel resolves the API token when a descriptor
118
+ * carries no explicit `apiToken`, and its lifecycle bounds the active-wait.
119
+ */
120
+ runtime: VibesRuntime;
121
+ clientFactory?: DoDropletClientFactory;
122
+ waitIntervalMs?: number;
123
+ waitTimeoutMs?: number;
124
+ baseUrl?: string;
125
+ fetchImpl?: typeof fetch;
126
+ }
127
+ export declare function normalizeDigitalOceanTag(input: string): string | null;
128
+ export declare class DoDropletSandbox implements SandboxHostLaunchPreflight {
129
+ private readonly runtime;
130
+ private readonly clientFactory;
131
+ private readonly waitIntervalMs;
132
+ private readonly waitTimeoutMs;
133
+ private readonly baseUrl?;
134
+ private readonly fetchImpl?;
135
+ constructor(options: DoDropletSandboxOptions);
136
+ /** Fleet launch preflight through the `infra/sandbox` kind; no API call. */
137
+ preflightHostLaunch(request: SandboxHostLaunchRequest): void;
138
+ provision(descriptorInput: DoDropletDescriptorInput, hooks?: DoDropletProvisionHooks): Promise<SandboxProvisionResult>;
139
+ destroy(opts: DoDropletDestroyOptions): Promise<DoDropletDestroyReport>;
140
+ /**
141
+ * Advance one pause by one step: shut down → snapshot → delete the droplet.
142
+ * A powered-off droplet still bills; only a snapshot (per GB-month) does not
143
+ * bill compute. Call again with the returned progress until `phase: 'paused'`.
144
+ */
145
+ advancePause(opts: DoDropletPauseOptions): Promise<DoDropletPauseProgress>;
146
+ /**
147
+ * Recreate a paused host's droplet from its snapshot with the same size,
148
+ * region and tags, and no user data: the restored disk already holds the
149
+ * enrolled daemon and its durable host token. `onCreated` fires before the
150
+ * wait for active so the caller can persist the new instance id first. The
151
+ * snapshot is kept; `deletePauseSnapshot` removes it once the host is back.
152
+ */
153
+ resume(opts: DoDropletResumeOptions, hooks?: DoDropletProvisionHooks): Promise<SandboxProvisionResult>;
154
+ /** Delete one pause snapshot; an already-deleted snapshot is success (`deleted: false`). */
155
+ deletePauseSnapshot(opts: {
156
+ snapshotId: string;
157
+ apiToken?: string;
158
+ baseUrl?: string;
159
+ }): Promise<{
160
+ deleted: boolean;
161
+ }>;
162
+ private controlConfig;
163
+ private getDroplet;
164
+ private dropletAction;
165
+ private startSnapshot;
166
+ private deletePauseSnapshots;
167
+ private createClient;
168
+ private listDropletsByTag;
169
+ private waitForActive;
170
+ }
171
+ export declare function createDoDropletImpl(options: DoDropletSandboxOptions): DoDropletSandbox;
172
+ //# sourceMappingURL=droplet.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droplet.impl.d.ts","sourceRoot":"","sources":["../../src/infra/droplet.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,379 @@
1
+ import { DropletActionResponseSchema, SnapshotsListResponseSchema } from "../schemas/http.js";
2
+ import { DigitalOceanDropletListResponseSchema, DigitalOceanDropletResponseSchema } from "../schemas/droplet.js";
3
+ /**
4
+ * Implementation: infra/sandbox -> digitalocean-droplet
5
+ *
6
+ * Cloud-safe DigitalOcean Droplet provisioner for platform on-demand hosts.
7
+ * This intentionally lives outside infra-doks so platform-web can register
8
+ * the sandbox adapter without bundling Kubernetes or Node-only DOKS helpers.
9
+ */
10
+ import { CapabilityError, isCapabilityError, settle } from '@vibesdotdev/kernel';
11
+ import { DigitalOceanControlPlaneClient } from "../client/index.js";
12
+ import { digitalOceanHttpStatus } from "../client/index.js";
13
+ import { DoDropletDescriptorSchema } from "../schemas/droplet.js";
14
+ export { DoDropletConfigSchema, DoDropletDescriptorSchema } from "../schemas/droplet.js";
15
+ /**
16
+ * Name prefix of the snapshot a pause leaves behind. `destroy({ hostId })`
17
+ * sweeps snapshots by it, so a destroyed host leaves no billing image even when
18
+ * the platform lost the snapshot id.
19
+ */
20
+ export function pauseSnapshotPrefix(hostId) {
21
+ return `vibes-pause-${hostId}-`;
22
+ }
23
+ /** Exactly this host's pause snapshots: the prefix plus the millisecond stamp, nothing else (`pk-gpu` never matches `pk-gpu-1`'s). */
24
+ function pauseSnapshotName(hostId) {
25
+ const prefix = pauseSnapshotPrefix(hostId).replace(/[.*+?^$()|[\]\\{}]/g, '\\$&');
26
+ return new RegExp('^' + prefix + '\\d+$');
27
+ }
28
+ /** DigitalOcean images that refuse to create without an SSH key (422 "does not use root passwords", measured 2026-10-24). */
29
+ const SSH_KEY_REQUIRED_IMAGE = /^gpu-.*-base$/;
30
+ /**
31
+ * Refuse a fleet launch DigitalOcean would reject, before any paid call, instead
32
+ * of surfacing the provider's 422 as a 502: a driver-bearing `gpu-*-base`
33
+ * image needs an SSH key. `--image gpu-h100x1-base --ssh-key-id <id>` works.
34
+ */
35
+ export function assertDigitalOceanImageSshKeys(request) {
36
+ if (SSH_KEY_REQUIRED_IMAGE.test(request.image) && request.sshKeyIds.length === 0) {
37
+ throw new CapabilityError(`Image '${request.image}' needs --ssh-key-id: DigitalOcean refuses to create it without an SSH key.`, 'INVALID_INPUT', {
38
+ reason: 'digitalocean-image-ssh-key-required',
39
+ retryable: false,
40
+ recoveryHint: 'Pass --ssh-key-id <your DigitalOcean key id>, or launch the stock image.',
41
+ details: { image: request.image }
42
+ });
43
+ }
44
+ }
45
+ /** A graceful shutdown that has not powered the droplet off by then gets a power-off. */
46
+ const SHUTDOWN_GRACE_MS = 120_000;
47
+ export function normalizeDigitalOceanTag(input) {
48
+ const normalized = input
49
+ .trim()
50
+ .replace(/=/g, ':')
51
+ .replace(/[^A-Za-z0-9:_-]+/g, '-')
52
+ .replace(/^-+|-+$/g, '')
53
+ .slice(0, 255);
54
+ return normalized.length > 0 ? normalized : null;
55
+ }
56
+ function uniqueDigitalOceanTags(tags) {
57
+ const seen = new Set();
58
+ for (const tag of tags) {
59
+ const normalized = normalizeDigitalOceanTag(tag);
60
+ if (normalized)
61
+ seen.add(normalized);
62
+ }
63
+ return [...seen];
64
+ }
65
+ function mapDroplet(droplet, fallbackRegion) {
66
+ const networks = droplet.networks?.v4 ?? [];
67
+ const publicIp = networks.find((network) => network.type === 'public')?.ip_address;
68
+ const privateIp = networks.find((network) => network.type === 'private')?.ip_address;
69
+ return {
70
+ instanceId: String(droplet.id),
71
+ publicIp,
72
+ privateIp,
73
+ region: droplet.region?.slug ?? fallbackRegion,
74
+ createdAt: droplet.created_at ? new Date(droplet.created_at) : new Date()
75
+ };
76
+ }
77
+ function requireField(value, label) {
78
+ if (!value)
79
+ throw new Error(`DigitalOcean response did not include the ${label}.`);
80
+ return value;
81
+ }
82
+ function requireDroplet(response, label) {
83
+ if (!response.droplet) {
84
+ throw new Error(`DigitalOcean ${label} response did not include a droplet.`);
85
+ }
86
+ return response.droplet;
87
+ }
88
+ export class DoDropletSandbox {
89
+ runtime;
90
+ clientFactory;
91
+ waitIntervalMs;
92
+ waitTimeoutMs;
93
+ baseUrl;
94
+ fetchImpl;
95
+ constructor(options) {
96
+ this.runtime = options.runtime;
97
+ this.clientFactory = options.clientFactory ?? ((clientOptions) => {
98
+ if (clientOptions.token !== undefined) {
99
+ return new DigitalOceanControlPlaneClient({ ...clientOptions, runtime: this.runtime });
100
+ }
101
+ return DigitalOceanControlPlaneClient.fromRuntime(this.runtime, {
102
+ baseUrl: clientOptions.baseUrl,
103
+ fetchImpl: clientOptions.fetchImpl,
104
+ userAgent: clientOptions.userAgent,
105
+ retry: clientOptions.retry,
106
+ onCredentialSelected: clientOptions.onCredentialSelected,
107
+ credentialCandidates: clientOptions.credentialCandidates,
108
+ operation: clientOptions.operation
109
+ });
110
+ });
111
+ this.waitIntervalMs = options.waitIntervalMs ?? 5_000;
112
+ this.waitTimeoutMs = options.waitTimeoutMs ?? 300_000;
113
+ this.baseUrl = options.baseUrl;
114
+ this.fetchImpl = options.fetchImpl;
115
+ }
116
+ /** Fleet launch preflight through the `infra/sandbox` kind; no API call. */
117
+ preflightHostLaunch(request) {
118
+ assertDigitalOceanImageSshKeys(request);
119
+ }
120
+ async provision(descriptorInput, hooks = {}) {
121
+ const descriptor = DoDropletDescriptorSchema.parse(descriptorInput);
122
+ const config = descriptor.config;
123
+ const client = await this.createClient(config);
124
+ const dropletSize = config.dropletSize;
125
+ const resourceTag = normalizeDigitalOceanTag(`vibes:resourceId:${descriptor.id}`) ?? descriptor.id;
126
+ const tags = uniqueDigitalOceanTags([...config.tags, resourceTag]);
127
+ const existing = await this.listDropletsByTag(client, resourceTag);
128
+ if (existing.length > 0) {
129
+ const candidate = existing[0];
130
+ const found = mapDroplet(candidate, config.region);
131
+ await hooks.onCreated?.(found);
132
+ if (candidate.status === 'active')
133
+ return found;
134
+ return this.waitForActive(client, candidate.id, config.region);
135
+ }
136
+ const created = requireDroplet(await client.post('/droplets', {
137
+ name: descriptor.name ?? `vibes-${descriptor.id}`,
138
+ region: config.region,
139
+ size: dropletSize,
140
+ image: config.image,
141
+ ssh_keys: config.sshKeyIds,
142
+ tags,
143
+ user_data: descriptor.cloudInitScript
144
+ }, {}, DigitalOceanDropletResponseSchema), 'create droplet');
145
+ // The droplet exists (and bills) from here on. Hand the id to the
146
+ // caller BEFORE the wait-for-active poll so a dropped request cannot
147
+ // leave an untracked droplet behind.
148
+ const createdResult = mapDroplet(created, config.region);
149
+ await hooks.onCreated?.(createdResult);
150
+ if (created.status === 'active')
151
+ return createdResult;
152
+ return this.waitForActive(client, created.id, config.region);
153
+ }
154
+ async destroy(opts) {
155
+ const client = await this.createClient({
156
+ adapter: 'digitalocean-droplet',
157
+ region: opts.region ?? 'nyc3',
158
+ dropletSize: 'destroy-only',
159
+ image: 'ubuntu-24-04-x64',
160
+ tags: [],
161
+ sshKeyIds: [],
162
+ apiToken: opts.apiToken,
163
+ baseUrl: opts.baseUrl
164
+ });
165
+ if (opts.instanceId) {
166
+ await client.delete(`/droplets/${encodeURIComponent(opts.instanceId)}`);
167
+ const deletedSnapshotIds = opts.hostId ? await this.deletePauseSnapshots(client, opts.hostId) : [];
168
+ return { deletedInstanceIds: [opts.instanceId], deletedSnapshotIds };
169
+ }
170
+ if (!opts.descriptorId && !opts.hostId) {
171
+ throw new Error('digitalocean-droplet destroy failed: pass instanceId, descriptorId or hostId.');
172
+ }
173
+ // Tag sweep: the provision-time resource tag (`vibes:resourceId:<descriptorId>`)
174
+ // and the platform host tag (`vibes:hostId:<hostId>`). Both are stamped at
175
+ // create time; either alone identifies the droplet when the platform never
176
+ // persisted its id.
177
+ const lookupTags = [];
178
+ if (opts.descriptorId) {
179
+ lookupTags.push(normalizeDigitalOceanTag(`vibes:resourceId:${opts.descriptorId}`) ?? opts.descriptorId);
180
+ }
181
+ if (opts.hostId) {
182
+ lookupTags.push(normalizeDigitalOceanTag(`vibes:hostId:${opts.hostId}`) ?? opts.hostId);
183
+ }
184
+ const matched = new Map();
185
+ for (const tag of lookupTags) {
186
+ for (const droplet of await this.listDropletsByTag(client, tag)) {
187
+ matched.set(droplet.id, droplet);
188
+ }
189
+ }
190
+ const deletedInstanceIds = [];
191
+ for (const droplet of matched.values()) {
192
+ await client.delete(`/droplets/${encodeURIComponent(String(droplet.id))}`);
193
+ deletedInstanceIds.push(String(droplet.id));
194
+ }
195
+ const deletedSnapshotIds = opts.hostId ? await this.deletePauseSnapshots(client, opts.hostId) : [];
196
+ return { deletedInstanceIds, deletedSnapshotIds };
197
+ }
198
+ /**
199
+ * Advance one pause by one step: shut down → snapshot → delete the droplet.
200
+ * A powered-off droplet still bills; only a snapshot (per GB-month) does not
201
+ * bill compute. Call again with the returned progress until `phase: 'paused'`.
202
+ */
203
+ async advancePause(opts) {
204
+ const client = await this.createClient(this.controlConfig(opts));
205
+ const now = opts.now ?? new Date();
206
+ const progress = opts.progress;
207
+ if (!progress) {
208
+ if (!opts.instanceId)
209
+ throw new Error('digitalocean-droplet pause needs the droplet instanceId.');
210
+ const droplet = await this.getDroplet(client, opts.instanceId);
211
+ const placement = {
212
+ size: requireField(droplet.size_slug, `droplet ${droplet.id} size`),
213
+ region: requireField(droplet.region?.slug, `droplet ${droplet.id} region`),
214
+ tags: droplet.tags ?? [],
215
+ snapshotName: `${pauseSnapshotPrefix(opts.hostId)}${now.getTime()}`
216
+ };
217
+ const instanceId = String(droplet.id);
218
+ if (droplet.status === 'off')
219
+ return this.startSnapshot(client, instanceId, placement);
220
+ await this.dropletAction(client, instanceId, { type: 'shutdown' });
221
+ return { ...placement, phase: 'stopping', instanceId, requestedAt: now.toISOString() };
222
+ }
223
+ if (progress.phase === 'stopping') {
224
+ const droplet = await this.getDroplet(client, progress.instanceId);
225
+ if (droplet.status === 'off')
226
+ return this.startSnapshot(client, progress.instanceId, progress);
227
+ if (!progress.powerOffSent && now.getTime() - Date.parse(progress.requestedAt) > SHUTDOWN_GRACE_MS) {
228
+ await this.dropletAction(client, progress.instanceId, { type: 'power_off' });
229
+ return { ...progress, powerOffSent: true };
230
+ }
231
+ return progress;
232
+ }
233
+ if (progress.phase === 'snapshotting') {
234
+ const action = await client.get(`/droplets/${encodeURIComponent(progress.instanceId)}/actions/${progress.actionId}`, {}, DropletActionResponseSchema);
235
+ if (action.action.status === 'in-progress')
236
+ return progress;
237
+ if (action.action.status === 'errored') {
238
+ throw new Error(`digitalocean-droplet pause: snapshot action ${progress.actionId} of droplet ${progress.instanceId} errored; the droplet was kept.`);
239
+ }
240
+ const snapshots = await client.get(`/droplets/${encodeURIComponent(progress.instanceId)}/snapshots`, { query: { per_page: 200 } }, SnapshotsListResponseSchema);
241
+ const snapshot = (snapshots.snapshots ?? []).find((item) => item.name === progress.snapshotName);
242
+ if (!snapshot) {
243
+ throw new Error(`digitalocean-droplet pause: snapshot '${progress.snapshotName}' completed but is not listed for droplet ${progress.instanceId}; the droplet was kept.`);
244
+ }
245
+ await client.delete(`/droplets/${encodeURIComponent(progress.instanceId)}`);
246
+ const { instanceId: _deleted, actionId: _action, phase: _phase, ...placement } = progress;
247
+ return { ...placement, phase: 'paused', snapshotId: snapshot.id };
248
+ }
249
+ return progress;
250
+ }
251
+ /**
252
+ * Recreate a paused host's droplet from its snapshot with the same size,
253
+ * region and tags, and no user data: the restored disk already holds the
254
+ * enrolled daemon and its durable host token. `onCreated` fires before the
255
+ * wait for active so the caller can persist the new instance id first. The
256
+ * snapshot is kept; `deletePauseSnapshot` removes it once the host is back.
257
+ */
258
+ async resume(opts, hooks = {}) {
259
+ const client = await this.createClient(this.controlConfig(opts, opts.placement.region));
260
+ const resourceTag = normalizeDigitalOceanTag(`vibes:resourceId:${opts.descriptorId}`) ?? opts.descriptorId;
261
+ const tags = uniqueDigitalOceanTags([...opts.placement.tags, resourceTag]);
262
+ const existing = await this.listDropletsByTag(client, resourceTag);
263
+ let droplet = existing[0];
264
+ if (!droplet) {
265
+ droplet = requireDroplet(await client.post('/droplets', {
266
+ name: opts.name ?? `vibes-${opts.descriptorId}`,
267
+ region: opts.placement.region,
268
+ size: opts.placement.size,
269
+ image: Number(opts.snapshotId),
270
+ tags
271
+ }, {}, DigitalOceanDropletResponseSchema), 'restore droplet');
272
+ }
273
+ await hooks.onCreated?.(mapDroplet(droplet, opts.placement.region));
274
+ if (droplet.status === 'active')
275
+ return mapDroplet(droplet, opts.placement.region);
276
+ return this.waitForActive(client, droplet.id, opts.placement.region);
277
+ }
278
+ /** Delete one pause snapshot; an already-deleted snapshot is success (`deleted: false`). */
279
+ async deletePauseSnapshot(opts) {
280
+ const client = await this.createClient(this.controlConfig(opts));
281
+ const deleted = await settle(() => client.delete(`/snapshots/${encodeURIComponent(opts.snapshotId)}`));
282
+ if (deleted.ok)
283
+ return { deleted: true };
284
+ if (digitalOceanHttpStatus(deleted.cause) === 404)
285
+ return { deleted: false };
286
+ throw deleted.cause;
287
+ }
288
+ controlConfig(opts, region = 'nyc3') {
289
+ return {
290
+ adapter: 'digitalocean-droplet',
291
+ region,
292
+ dropletSize: 'lifecycle-only',
293
+ image: 'ubuntu-24-04-x64',
294
+ tags: [],
295
+ sshKeyIds: [],
296
+ apiToken: opts.apiToken,
297
+ baseUrl: opts.baseUrl
298
+ };
299
+ }
300
+ async getDroplet(client, instanceId) {
301
+ return requireDroplet(await client.get(`/droplets/${encodeURIComponent(instanceId)}`, {}, DigitalOceanDropletResponseSchema), 'get droplet');
302
+ }
303
+ async dropletAction(client, instanceId, body) {
304
+ const response = await client.post(`/droplets/${encodeURIComponent(instanceId)}/actions`, body, {}, DropletActionResponseSchema);
305
+ return response.action.id;
306
+ }
307
+ async startSnapshot(client, instanceId, placement) {
308
+ const actionId = await this.dropletAction(client, instanceId, { type: 'snapshot', name: placement.snapshotName });
309
+ return {
310
+ size: placement.size,
311
+ region: placement.region,
312
+ tags: placement.tags,
313
+ snapshotName: placement.snapshotName,
314
+ phase: 'snapshotting',
315
+ instanceId,
316
+ actionId
317
+ };
318
+ }
319
+ async deletePauseSnapshots(client, hostId) {
320
+ const name = pauseSnapshotName(hostId);
321
+ const matched = [];
322
+ for (let page = 1;; page++) {
323
+ const response = await client.get('/snapshots', { query: { resource_type: 'droplet', per_page: 200, page } }, SnapshotsListResponseSchema);
324
+ const snapshots = response.snapshots ?? [];
325
+ for (const snapshot of snapshots)
326
+ if (name.test(snapshot.name))
327
+ matched.push(snapshot.id);
328
+ if (snapshots.length < 200)
329
+ break;
330
+ }
331
+ // Collected first: deleting while paging would shift later pages.
332
+ for (const id of matched)
333
+ await client.delete(`/snapshots/${encodeURIComponent(id)}`);
334
+ return matched;
335
+ }
336
+ async createClient(config) {
337
+ const options = {
338
+ runtime: this.runtime,
339
+ baseUrl: config.baseUrl ?? this.baseUrl,
340
+ fetchImpl: this.fetchImpl,
341
+ userAgent: 'vibes-infra-digitalocean/0.0.1'
342
+ };
343
+ if (config.apiToken !== undefined) {
344
+ options.token = { value: config.apiToken, kind: 'explicit' };
345
+ }
346
+ return await this.clientFactory(options);
347
+ }
348
+ async listDropletsByTag(client, tag) {
349
+ const response = await client.get('/droplets', {
350
+ query: { tag_name: tag }
351
+ }, DigitalOceanDropletListResponseSchema);
352
+ return response.droplets ?? [];
353
+ }
354
+ async waitForActive(client, id, region) {
355
+ let lastStatus;
356
+ try {
357
+ return await this.runtime.lifecycle.wait(async (signal) => {
358
+ for (;;) {
359
+ const last = requireDroplet(await client.get(`/droplets/${encodeURIComponent(String(id))}`, {}, DigitalOceanDropletResponseSchema), 'get droplet');
360
+ lastStatus = last.status;
361
+ if (last.status === 'active')
362
+ return mapDroplet(last, region);
363
+ await this.runtime.lifecycle.delay(this.waitIntervalMs, signal);
364
+ }
365
+ }, { timeoutMs: this.waitTimeoutMs, reason: `waiting-for-droplet-${id}-active` });
366
+ }
367
+ catch (error) {
368
+ if (error instanceof Error && isCapabilityError(error) && error.reason === 'wait-timeout') {
369
+ throw new Error(`digitalocean-droplet provision timed out waiting for droplet ${id} to become active` +
370
+ (lastStatus ? ` (last status: ${lastStatus})` : ''), { cause: error });
371
+ }
372
+ throw error;
373
+ }
374
+ }
375
+ }
376
+ export function createDoDropletImpl(options) {
377
+ return new DoDropletSandbox(options);
378
+ }
379
+ //# sourceMappingURL=droplet.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droplet.impl.js","sourceRoot":"","sources":["../../src/infra/droplet.impl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACN,qCAAqC,EACrC,iCAAiC,EAIjC,MAAM,uBAAuB,CAAC;AAC/B;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAqB,MAAM,qBAAqB,CAAC;AAEpG,OAAO,EACN,8BAA8B,EAE9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EACN,yBAAyB,EAGzB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAyDzF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IACjD,OAAO,eAAe,MAAM,GAAG,CAAC;AACjC,CAAC;AAED,sIAAsI;AACtI,SAAS,iBAAiB,CAAC,MAAc;IACxC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAClF,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAC3C,CAAC;AA0CD,6HAA6H;AAC7H,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAA8D;IAC5G,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,eAAe,CACxB,UAAU,OAAO,CAAC,KAAK,6EAA6E,EACpG,eAAe,EACf;YACC,MAAM,EAAE,qCAAqC;YAC7C,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,0EAA0E;YACxF,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;SACjC,CACD,CAAC;IACH,CAAC;AACF,CAAC;AAED,yFAAyF;AACzF,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAwBlC,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACrD,MAAM,UAAU,GAAG,KAAK;SACtB,IAAI,EAAE;SACN,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChB,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAc;IAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,UAAU;YAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,OAA4B,EAAE,cAAsB;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,UAAU,CAAC;IACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,UAAU,CAAC;IACrF,OAAO;QACN,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,QAAQ;QACR,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI,cAAc;QAC9C,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;KACzE,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB,EAAE,KAAa;IAC7D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,GAAG,CAAC,CAAC;IACnF,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,QAAqC,EAAE,KAAa;IAC3E,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,sCAAsC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AACzB,CAAC;AAED,MAAM,OAAO,gBAAgB;IACX,OAAO,CAAqC;IAC5C,aAAa,CAAyB;IACtC,cAAc,CAAS;IACvB,aAAa,CAAS;IACtB,OAAO,CAAU;IACjB,SAAS,CAAgB;IAE1C,YAAY,OAAgC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;YAChE,IAAI,aAAa,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,IAAI,8BAA8B,CAAC,EAAE,GAAG,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,OAAO,8BAA8B,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE;gBAC/D,OAAO,EAAE,aAAa,CAAC,OAAO;gBAC9B,SAAS,EAAE,aAAa,CAAC,SAAS;gBAClC,SAAS,EAAE,aAAa,CAAC,SAAS;gBAClC,KAAK,EAAE,aAAa,CAAC,KAAK;gBAC1B,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;gBACxD,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;gBACxD,SAAS,EAAE,aAAa,CAAC,SAAS;aAClC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,4EAA4E;IAC5E,mBAAmB,CAAC,OAAiC;QACpD,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,SAAS,CACd,eAAyC,EACzC,QAAiC,EAAE;QAEnC,MAAM,UAAU,GAAG,yBAAyB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,MAAM,WAAW,GAChB,wBAAwB,CAAC,oBAAoB,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAChD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAC7B,MAAM,MAAM,CAAC,IAAI,CAChB,WAAW,EACX;YACC,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,SAAS,UAAU,CAAC,EAAE,EAAE;YACjD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,IAAI;YACJ,SAAS,EAAE,UAAU,CAAC,eAAe;SACrC,EACD,EAAE,EACF,iCAAiC,CACjC,EACD,gBAAgB,CAChB,CAAC;QAEF,kEAAkE;QAClE,qEAAqE;QACrE,qCAAqC;QACrC,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;QAEvC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,aAAa,CAAC;QACtD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAA6B;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;YACtC,OAAO,EAAE,sBAAsB;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM;YAC7B,WAAW,EAAE,cAAc;YAC3B,KAAK,EAAE,kBAAkB;YACzB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnG,OAAO,EAAE,kBAAkB,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACd,+EAA+E,CAC/E,CAAC;QACH,CAAC;QAED,iFAAiF;QACjF,2EAA2E;QAC3E,2EAA2E;QAC3E,oBAAoB;QACpB,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CACd,wBAAwB,CAAC,oBAAoB,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,CACtF,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;QAED,MAAM,kBAAkB,GAAa,EAAE,CAAC;QACxC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3E,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,IAA2B;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAClG,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAuB;gBACrC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,OAAO,CAAC,EAAE,OAAO,CAAC;gBACnE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,OAAO,CAAC,EAAE,SAAS,CAAC;gBAC1E,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;gBACxB,YAAY,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE;aACnE,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YACvF,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACnE,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACxF,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC/F,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,iBAAiB,EAAE,CAAC;gBACpG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC7E,OAAO,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YAC5C,CAAC;YACD,OAAO,QAAQ,CAAC;QACjB,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC9B,aAAa,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,QAAQ,CAAC,QAAQ,EAAE,EACnF,EAAE,EACF,2BAA2B,CAC3B,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa;gBAAE,OAAO,QAAQ,CAAC;YAC5D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACd,+CAA+C,QAAQ,CAAC,QAAQ,eAAe,QAAQ,CAAC,UAAU,iCAAiC,CACnI,CAAC;YACH,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CACjC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,EAChE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAC5B,2BAA2B,CAC3B,CAAC;YACF,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,YAAY,CAAC,CAAC;YACjG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACd,yCAAyC,QAAQ,CAAC,YAAY,6CAA6C,QAAQ,CAAC,UAAU,yBAAyB,CACvJ,CAAC;YACH,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5E,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC;YAC1F,OAAO,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;QACnE,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,IAA4B,EAAE,QAAiC,EAAE;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACxF,MAAM,WAAW,GAAG,wBAAwB,CAAC,oBAAoB,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC;QAC3G,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QAE3E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,GAAG,cAAc,CACvB,MAAM,MAAM,CAAC,IAAI,CAChB,WAAW,EACX;gBACC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,EAAE;gBAC/C,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;gBAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;gBACzB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC9B,IAAI;aACJ,EACD,EAAE,EACF,iCAAiC,CACjC,EACD,iBAAiB,CACjB,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,mBAAmB,CAAC,IAAiE;QAC1F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACvG,IAAI,OAAO,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzC,IAAI,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7E,MAAM,OAAO,CAAC,KAAK,CAAC;IACrB,CAAC;IAEO,aAAa,CACpB,IAA6C,EAC7C,MAAM,GAAG,MAAM;QAEf,OAAO;YACN,OAAO,EAAE,sBAAsB;YAC/B,MAAM;YACN,WAAW,EAAE,gBAAgB;YAC7B,KAAK,EAAE,kBAAkB;YACzB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,MAAiC,EAAE,UAAkB;QAC7E,OAAO,cAAc,CACpB,MAAM,MAAM,CAAC,GAAG,CACf,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAC7C,EAAE,EACF,iCAAiC,CACjC,EACD,aAAa,CACb,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAC1B,MAAiC,EACjC,UAAkB,EAClB,IAAqC;QAErC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CACjC,aAAa,kBAAkB,CAAC,UAAU,CAAC,UAAU,EACrD,IAAI,EACJ,EAAE,EACF,2BAA2B,CAC3B,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,aAAa,CAC1B,MAAiC,EACjC,UAAkB,EAClB,SAA6B;QAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;QAClH,OAAO;YACN,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,KAAK,EAAE,cAAc;YACrB,UAAU;YACV,QAAQ;SACR,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,MAAiC,EAAE,MAAc;QACnF,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,IAAI,GAAG,CAAC,GAAI,IAAI,EAAE,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAChC,YAAY,EACZ,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAC5D,2BAA2B,CAC3B,CAAC;YACF,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;YAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS;gBAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1F,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG;gBAAE,MAAM;QACnC,CAAC;QACD,kEAAkE;QAClE,KAAK,MAAM,EAAE,IAAI,OAAO;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAuB;QACjD,MAAM,OAAO,GAA0C;YACtD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,gCAAgC;SAC3C,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC9B,MAAiC,EACjC,GAAW;QAEX,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAChC,WAAW,EACX;YACC,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;SACxB,EACD,qCAAqC,CACrC,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,aAAa,CAC1B,MAAiC,EACjC,EAAU,EACV,MAAc;QAEd,IAAI,UAA8B,CAAC;QACnC,IAAI,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CACvC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChB,SAAS,CAAC;oBACT,MAAM,IAAI,GAAG,cAAc,CAC1B,MAAM,MAAM,CAAC,GAAG,CACf,aAAa,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAC7C,EAAE,EACF,iCAAiC,CACjC,EACD,aAAa,CACb,CAAC;oBACF,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;oBACzB,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;wBAAE,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC9D,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBACjE,CAAC;YACF,CAAC,EACD,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,uBAAuB,EAAE,SAAS,EAAE,CAC7E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gBAC3F,MAAM,IAAI,KAAK,CACd,gEAAgE,EAAE,mBAAmB;oBACpF,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EACpD,EAAE,KAAK,EAAE,KAAK,EAAE,CAChB,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;CACD;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgC;IACnE,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}