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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +97 -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 +1474 -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 +4071 -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 +11 -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 +26 -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,451 @@
1
+ /**
2
+ * `secrets/store` backed by a Kubernetes Secret on a DOKS cluster.
3
+ *
4
+ * `vault-secrets-operator` was installed on `exemplar-staging` to do exactly
5
+ * this and, measured 2026-09-08, held **zero** CRs across every namespace — a
6
+ * Vault, an injector and an operator running for 383 days, delivering nothing.
7
+ * Meanwhile the two realm federators got their signing keys by hand, and the
8
+ * key the manifests claimed came from `vibes secrets` had never been in the
9
+ * store at all.
10
+ *
11
+ * So the delivery step becomes a backend: `vibes secrets push --backend
12
+ * doks-secret` writes the store's values into a Kubernetes Secret that
13
+ * workloads read with an ordinary `secretKeyRef`. No operator, no second
14
+ * source of truth, no CRD.
15
+ *
16
+ * Values are never logged, returned in an error, or placed in argv. Kubernetes
17
+ * Secrets carry them to workloads; build jobs can read registry credentials from
18
+ * their mounted `.npmrc` or `.bunfig.toml` files.
19
+ */
20
+ import { decodeBase64Text, encodeBase64Text } from "../kubernetes/encoding.js";
21
+ import { CapabilityError, settle } from '@vibesdotdev/kernel';
22
+ import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
23
+ import { loadDigitalOceanServiceSettings } from "../config/digitalocean.config.descriptor.js";
24
+ import { DigitalOceanDoksDockerConfigSchema, DigitalOceanDoksSourceCredentialRequestSchema, DigitalOceanDoksWorkerCredentialLeaseSchema, DigitalOceanDoksWorkerSourceOperationAnnotationsSchema, DigitalOceanDoksWorkerPlanSchema } from "../schemas/doks-worker.js";
25
+ import { KubernetesIssuedSchema, KubernetesLeaseSecretSchema } from "../schemas/kubernetes-responses.js";
26
+ import { bindDigitalOceanDoksWorkerCredentialLease } from "../schemas/doks-worker.js";
27
+ import { DoksSecretConfigSchema, KubernetesSecretDataSchema } from "../schemas/kubernetes.js";
28
+ import { getLogger } from '@vibesdotdev/logging';
29
+ import { DOKS_SECRET_STORE_ACCESS } from "./doks-secret.descriptor.js";
30
+ import { DigitalOceanKubernetesClient } from "../kubernetes/index.js";
31
+ import { createKubernetesApi } from "../kubernetes/authority.js";
32
+ import { createDigitalOceanProviderControlPlaneClient } from "../infra/credentials.js";
33
+ /** Kubernetes Secret data keys are restricted; a vibes key that cannot be one is a hard error. */
34
+ const SECRET_DATA_KEY_PATTERN = /^[-._a-zA-Z0-9]+$/;
35
+ function assertDataKey(key) {
36
+ if (!SECRET_DATA_KEY_PATTERN.test(key)) {
37
+ throw new Error(`Secret key "${key}" cannot be a Kubernetes Secret data key ` +
38
+ '(allowed: letters, digits, "-", "_", ".").');
39
+ }
40
+ }
41
+ export function createDoksSecretStore(runtime, descriptor, options) {
42
+ const config = DoksSecretConfigSchema.parse(descriptor.config ?? {});
43
+ const diagnostics = getLogger('digitalocean.doks-secret', runtime);
44
+ const secretName = config.secretName;
45
+ let apiPromise;
46
+ function namespaceFor(environment) {
47
+ const namespace = config[`namespace.${environment}`] ?? config.namespace;
48
+ if (!namespace) {
49
+ throw new Error(`The ${descriptor.id} backend has no namespace for environment "${environment}". ` +
50
+ 'Set `config.namespace`, or `config["namespace.' +
51
+ environment +
52
+ '"]`.');
53
+ }
54
+ return namespace;
55
+ }
56
+ async function api(operationContext) {
57
+ if (options?.api)
58
+ return options.api;
59
+ if (!apiPromise) {
60
+ const pending = (async () => {
61
+ const controlPlane = await createDigitalOceanProviderControlPlaneClient(runtime, undefined, operationContext);
62
+ return createKubernetesApi({
63
+ runtime,
64
+ kubernetes: new DigitalOceanKubernetesClient(controlPlane),
65
+ cluster: { id: config.clusterId, name: config.clusterName }
66
+ });
67
+ })();
68
+ apiPromise = pending;
69
+ try {
70
+ return await pending;
71
+ }
72
+ catch (cause) {
73
+ if (apiPromise === pending)
74
+ apiPromise = undefined;
75
+ throw cause;
76
+ }
77
+ }
78
+ return apiPromise;
79
+ }
80
+ /**
81
+ * A connection whose cluster authority is acquired on the first request.
82
+ * Credential delivery admits a plan against the declared cluster and
83
+ * namespace before any authority is fetched, so a plan aimed at a target
84
+ * this store does not serve is refused without touching the cluster.
85
+ */
86
+ function lazyApi(operationContext) {
87
+ let opened;
88
+ return {
89
+ cluster: { id: config.clusterId ?? '', name: config.clusterName ?? '' },
90
+ request(path, init, allowNotFound) {
91
+ opened ??= api(operationContext);
92
+ return opened.then((connection) => connection.request(path, init, allowNotFound));
93
+ }
94
+ };
95
+ }
96
+ function secretPath(namespace) {
97
+ return namedSecretPath(namespace, secretName);
98
+ }
99
+ function namedSecretPath(namespace, name) {
100
+ return `/api/v1/namespaces/${encodeURIComponent(namespace)}/secrets/${encodeURIComponent(name)}`;
101
+ }
102
+ /** `null` when the Secret does not exist yet — an empty environment, not a failure. */
103
+ async function readData(environment, operationContext) {
104
+ const namespace = namespaceFor(environment);
105
+ const connection = await api(operationContext);
106
+ const response = await connection.request(secretPath(namespace), { method: 'GET' }, true);
107
+ if (!response)
108
+ return null;
109
+ const body = KubernetesSecretDataSchema.parse(await response.json());
110
+ const decoded = {};
111
+ for (const [key, value] of Object.entries(body.data ?? {})) {
112
+ decoded[key] = decodeBase64Text(value);
113
+ }
114
+ return decoded;
115
+ }
116
+ /**
117
+ * Merge-patch the Secret, creating it first if absent. A `null` value in the
118
+ * patch removes that key, which is how `unset` works.
119
+ */
120
+ async function writeData(environment, patch, operationContext) {
121
+ const namespace = namespaceFor(environment);
122
+ const connection = await api(operationContext);
123
+ const existing = await connection.request(secretPath(namespace), { method: 'GET' }, true);
124
+ if (!existing) {
125
+ await connection.request(`/api/v1/namespaces/${encodeURIComponent(namespace)}/secrets`, {
126
+ method: 'POST',
127
+ headers: { 'content-type': 'application/json' },
128
+ body: JSON.stringify({
129
+ apiVersion: 'v1',
130
+ kind: 'Secret',
131
+ type: 'Opaque',
132
+ metadata: {
133
+ name: secretName,
134
+ namespace,
135
+ labels: { 'app.kubernetes.io/managed-by': 'vibes-secrets' },
136
+ annotations: { 'vibes.dev/secrets-environment': environment }
137
+ },
138
+ stringData: Object.fromEntries(Object.entries(patch).filter((entry) => entry[1] !== null))
139
+ })
140
+ });
141
+ return;
142
+ }
143
+ await connection.request(secretPath(namespace), {
144
+ method: 'PATCH',
145
+ headers: { 'content-type': 'application/merge-patch+json' },
146
+ body: JSON.stringify({
147
+ metadata: {
148
+ labels: { 'app.kubernetes.io/managed-by': 'vibes-secrets' },
149
+ annotations: { 'vibes.dev/secrets-environment': environment }
150
+ },
151
+ stringData: Object.fromEntries(Object.entries(patch).filter((entry) => entry[1] !== null)),
152
+ // `stringData` cannot express a removal; `data: {key: null}` can.
153
+ data: Object.fromEntries(Object.entries(patch).filter(([, value]) => value === null))
154
+ })
155
+ });
156
+ }
157
+ function assertWorkerTarget(plan) {
158
+ let namespace;
159
+ try {
160
+ namespace = namespaceFor(plan.worker);
161
+ }
162
+ catch (cause) {
163
+ throw new CapabilityError('DOKS worker credential namespace is not configured by the selected Secrets descriptor.', 'INVALID_INPUT', { reason: 'doks-worker-secret-target-unconfigured', cause });
164
+ }
165
+ // A cluster is named by exactly one of id or name on each side; compare
166
+ // the identity each side actually declares rather than requiring both.
167
+ const clusterMatches = plan.cluster.id !== undefined
168
+ ? plan.cluster.id === config.clusterId
169
+ : plan.cluster.name === config.clusterName;
170
+ if (!clusterMatches || namespace !== plan.namespace) {
171
+ throw new CapabilityError('DOKS worker credential target does not match the selected Secrets descriptor.', 'INVALID_INPUT', { reason: 'doks-worker-secret-target-diverged' });
172
+ }
173
+ }
174
+ async function admitWorkerCredentials(input) {
175
+ const plan = DigitalOceanDoksWorkerPlanSchema.parse(input);
176
+ assertWorkerTarget(plan);
177
+ }
178
+ async function resolveCredential(authority) {
179
+ const result = await runtime.resolveCredential({ source: 'secret', ...authority });
180
+ if (!result.ok)
181
+ throw result.error;
182
+ return result.value;
183
+ }
184
+ async function writeCredentialSecret(namespace, name, key, value, annotations) {
185
+ assertDataKey(key);
186
+ const connection = lazyApi();
187
+ const query = new URLSearchParams({ fieldManager: 'vibes-secrets', force: 'false' });
188
+ const labels = { 'app.kubernetes.io/managed-by': 'vibes-secrets' };
189
+ const metadata = annotations
190
+ ? { name, namespace, labels, annotations }
191
+ : { name, namespace, labels };
192
+ const path = namedSecretPath(namespace, name);
193
+ await connection.request(`${path}?${query}`, {
194
+ method: 'PATCH',
195
+ headers: {
196
+ 'content-type': 'application/apply-patch+yaml',
197
+ accept: 'application/json'
198
+ },
199
+ body: JSON.stringify({
200
+ apiVersion: 'v1',
201
+ kind: 'Secret',
202
+ type: 'Opaque',
203
+ metadata,
204
+ data: { [key]: encodeBase64Text(value) }
205
+ })
206
+ });
207
+ const response = await connection.request(path, { method: 'GET', headers: { accept: 'application/json' } }, true);
208
+ if (!response) {
209
+ throw new CapabilityError(`DOKS worker prerequisite Secret ${namespace}/${name} was not found.`, 'UNAVAILABLE', { reason: 'doks-worker-secret-not-found' });
210
+ }
211
+ const secret = KubernetesLeaseSecretSchema.parse(await response.json());
212
+ if (!(key in (secret.data ?? {}))) {
213
+ throw new CapabilityError(`DOKS worker prerequisite Secret ${namespace}/${name} is missing keys [${key}].`, 'UNAVAILABLE', { reason: 'doks-worker-secret-key-missing' });
214
+ }
215
+ const expectedOperationId = annotations?.['vibes.dev/source-operation-id'];
216
+ const observedOperationId = secret.metadata?.annotations?.['vibes.dev/source-operation-id'];
217
+ if (expectedOperationId !== undefined && observedOperationId !== expectedOperationId) {
218
+ throw new CapabilityError('DOKS source credential Secret belongs to another operation.', 'CONFLICT', { reason: 'doks-worker-secret-operation-diverged' });
219
+ }
220
+ }
221
+ async function revokeSourceLease(lease) {
222
+ const [brokerResult, secretResult] = await Promise.allSettled([
223
+ (async () => {
224
+ const settings = await loadDigitalOceanServiceSettings(runtime);
225
+ const authority = await resolveCredential(lease.authority);
226
+ const serviceFetch = runtime.environment.httpFetch?.bind(runtime.environment) ?? fetch;
227
+ const response = await serviceFetch(`${settings.sourceBrokerOrigin}/api/internal/forge/source-credential`, {
228
+ method: 'DELETE',
229
+ headers: {
230
+ authorization: `Bearer ${authority}`,
231
+ 'content-type': 'application/json'
232
+ },
233
+ body: JSON.stringify(DigitalOceanDoksSourceCredentialRequestSchema.parse({
234
+ operationId: lease.operationId,
235
+ repositoryId: lease.repositoryId,
236
+ ref: lease.ref
237
+ }))
238
+ });
239
+ if (!response.ok && response.status !== 404) {
240
+ throw new Error(`Build source credential revocation failed (${response.status}); response body redacted.`);
241
+ }
242
+ })(),
243
+ (async () => {
244
+ const connection = await api();
245
+ const path = namedSecretPath(lease.namespace, lease.name);
246
+ const response = await connection.request(path, { method: 'GET' }, true);
247
+ if (!response)
248
+ return;
249
+ const secret = KubernetesLeaseSecretSchema.parse(await response.json());
250
+ if (secret.metadata?.annotations?.['vibes.dev/source-operation-id'] !== lease.operationId) {
251
+ throw new CapabilityError('DOKS source credential Secret belongs to another operation.', 'CONFLICT', { reason: 'doks-worker-secret-operation-diverged' });
252
+ }
253
+ const uid = secret.metadata?.uid;
254
+ if (!uid) {
255
+ throw new CapabilityError('DOKS source credential Secret cannot be safely removed without its UID.', 'UNAVAILABLE', { reason: 'doks-worker-secret-uid-unavailable' });
256
+ }
257
+ await connection.request(path, {
258
+ method: 'DELETE',
259
+ headers: { 'content-type': 'application/json', accept: 'application/json' },
260
+ body: JSON.stringify({ preconditions: { uid } })
261
+ });
262
+ })()
263
+ ]);
264
+ const failures = [brokerResult, secretResult]
265
+ .filter((result) => result.status === 'rejected')
266
+ .map((result) => result.reason);
267
+ if (failures.length > 0) {
268
+ throw new CapabilityError('DOKS worker source credential cleanup failed.', 'UNAVAILABLE', {
269
+ reason: 'doks-worker-credential-revocation-failed',
270
+ cause: new AggregateError(failures)
271
+ });
272
+ }
273
+ }
274
+ async function prepareWorkerCredentials(input) {
275
+ const plan = DigitalOceanDoksWorkerPlanSchema.parse(input);
276
+ assertWorkerTarget(plan);
277
+ const bindings = plan.credentialBindings ?? [];
278
+ if (bindings.length === 0)
279
+ return plan;
280
+ const needsServiceSettings = bindings.some((binding) => binding.kind === 'source-lease' || binding.kind === 'package-registry');
281
+ const settings = needsServiceSettings
282
+ ? await loadDigitalOceanServiceSettings(runtime)
283
+ : undefined;
284
+ const hasRegistryBinding = bindings.some((binding) => binding.kind === 'package-registry');
285
+ if (hasRegistryBinding && !settings?.packageScope) {
286
+ throw new CapabilityError('Package registry scope is not configured for DOKS credential delivery.', 'INVALID_INPUT', { reason: 'doks-worker-package-scope-unconfigured' });
287
+ }
288
+ const sourceBinding = bindings.find((binding) => binding.kind === 'source-lease');
289
+ const preparedPlan = sourceBinding
290
+ ? bindDigitalOceanDoksWorkerCredentialLease(plan, crypto.randomUUID())
291
+ : plan;
292
+ const lease = preparedPlan.credentialLease;
293
+ try {
294
+ for (const binding of bindings) {
295
+ let secretName = binding.name;
296
+ let value;
297
+ if (binding.kind === 'source-lease') {
298
+ if (!lease) {
299
+ throw new CapabilityError('DOKS source credential lease was not prepared.', 'INTERNAL', { reason: 'doks-worker-credential-lease-missing' });
300
+ }
301
+ const authority = await resolveCredential(binding.authority);
302
+ const serviceFetch = runtime.environment.httpFetch?.bind(runtime.environment) ?? fetch;
303
+ const response = await serviceFetch(`${settings.sourceBrokerOrigin}/api/internal/forge/source-credential`, {
304
+ method: 'POST',
305
+ headers: {
306
+ authorization: `Bearer ${authority}`,
307
+ 'content-type': 'application/json'
308
+ },
309
+ body: JSON.stringify(DigitalOceanDoksSourceCredentialRequestSchema.parse({
310
+ operationId: lease.operationId,
311
+ repositoryId: binding.repositoryId,
312
+ ref: binding.ref
313
+ }))
314
+ });
315
+ if (!response.ok) {
316
+ throw new Error(`Build source credential issuance failed (${response.status}); response body redacted.`);
317
+ }
318
+ const issued = KubernetesIssuedSchema.parse(await response.json());
319
+ if (!issued.token)
320
+ throw new Error('Build source credential issuance returned no token.');
321
+ value = issued.token;
322
+ secretName = lease.name;
323
+ }
324
+ else if (binding.kind === 'docr') {
325
+ const client = await createDigitalOceanProviderControlPlaneClient(runtime);
326
+ const dockerConfig = await client.get('/registry/docker-credentials', { query: { read_write: 'true', expiry_seconds: binding.expirySeconds } }, DigitalOceanDoksDockerConfigSchema);
327
+ value = JSON.stringify(dockerConfig);
328
+ }
329
+ else {
330
+ const packageScope = settings?.packageScope;
331
+ if (!packageScope) {
332
+ throw new CapabilityError('Package registry scope is not configured for DOKS credential delivery.', 'INVALID_INPUT', { reason: 'doks-worker-package-scope-unconfigured' });
333
+ }
334
+ const registryOrigin = settings?.packageRegistryOrigin;
335
+ if (!registryOrigin) {
336
+ throw new CapabilityError('Package registry origin is not configured for DOKS credential delivery.', 'INVALID_INPUT', { reason: 'doks-worker-package-origin-unconfigured' });
337
+ }
338
+ const token = await resolveCredential(binding.authority);
339
+ if (token.includes('\n') || token.includes('\r')) {
340
+ throw new CapabilityError('Package registry credential cannot be rendered safely.', 'INVALID_INPUT', { reason: 'doks-worker-package-credential-invalid' });
341
+ }
342
+ if (binding.key === '.npmrc') {
343
+ value =
344
+ `${packageScope}:registry=${registryOrigin}/\n` +
345
+ `//${new URL(registryOrigin).host}/:_authToken=${token}\n`;
346
+ }
347
+ else {
348
+ value =
349
+ `[install.scopes]\n` +
350
+ `${JSON.stringify(packageScope)} = { token = ${JSON.stringify(token)}, url = ${JSON.stringify(`${registryOrigin}/`)} }\n`;
351
+ }
352
+ }
353
+ const annotations = binding.kind === 'source-lease' && lease
354
+ ? DigitalOceanDoksWorkerSourceOperationAnnotationsSchema.parse({
355
+ 'vibes.dev/source-operation-id': lease.operationId
356
+ })
357
+ : undefined;
358
+ await writeCredentialSecret(binding.namespace, secretName, binding.key, value, annotations);
359
+ }
360
+ return preparedPlan;
361
+ }
362
+ catch (cause) {
363
+ // The cause travels with the failure the caller receives. The log names
364
+ // what was attempted and how far it got, never what it held.
365
+ diagnostics.warn(`DOKS worker credential preparation failed for ${plan.worker} (bindings=${bindings.length}, lease=${lease ? 'issued' : 'none'}).`);
366
+ const cleanup = lease
367
+ ? await settle(() => revokeWorkerCredentials(lease))
368
+ : null;
369
+ if (cleanup !== null && 'cause' in cleanup) {
370
+ throw new CapabilityError('DOKS worker credential preparation and cleanup failed.', 'UNAVAILABLE', {
371
+ reason: 'doks-worker-credential-prepare-cleanup-failed',
372
+ cause: new AggregateError([cause, cleanup.cause])
373
+ });
374
+ }
375
+ throw new CapabilityError('DOKS worker credential preparation failed.', 'UNAVAILABLE', {
376
+ reason: 'doks-worker-credential-prepare-failed',
377
+ cause
378
+ });
379
+ }
380
+ }
381
+ async function revokeWorkerCredentials(input) {
382
+ const lease = DigitalOceanDoksWorkerCredentialLeaseSchema.parse(input);
383
+ await revokeSourceLease(lease);
384
+ }
385
+ return {
386
+ id: descriptor.id,
387
+ descriptor,
388
+ async list(environment, operationContext) {
389
+ const data = await readData(environment, operationContext);
390
+ return Object.entries(data ?? {}).map(([key, value]) => ({
391
+ key,
392
+ hasValue: value.length > 0,
393
+ source: descriptor.id
394
+ }));
395
+ },
396
+ async get(environment, key, operationContext) {
397
+ const data = await readData(environment, operationContext);
398
+ return data?.[key];
399
+ },
400
+ async set(environment, key, value, operationContext) {
401
+ assertDataKey(key);
402
+ await writeData(environment, { [key]: value }, operationContext);
403
+ },
404
+ async unset(environment, key, operationContext) {
405
+ await writeData(environment, { [key]: null }, operationContext);
406
+ },
407
+ async getAll(environment, operationContext) {
408
+ return (await readData(environment, operationContext)) ?? {};
409
+ },
410
+ async setAll(environment, secrets, operationContext) {
411
+ for (const key of Object.keys(secrets))
412
+ assertDataKey(key);
413
+ if (Object.keys(secrets).length === 0)
414
+ return;
415
+ await writeData(environment, secrets, operationContext);
416
+ },
417
+ admitWorkerCredentials,
418
+ prepareWorkerCredentials,
419
+ revokeWorkerCredentials
420
+ };
421
+ }
422
+ export class DigitalOceanDoksSecretRuntimeClient extends BaseRuntimeClient {
423
+ #store;
424
+ constructor(descriptor, context) {
425
+ super(descriptor, context);
426
+ const storeDescriptor = context.runtime
427
+ .query('secrets/store')
428
+ .withId('doks-secret')
429
+ .descriptors()[0];
430
+ if (!storeDescriptor) {
431
+ throw new CapabilityError('The DOKS Secret store descriptor is unavailable.', 'UNAVAILABLE', {
432
+ reason: 'doks-secret-descriptor-unavailable',
433
+ retryable: false
434
+ });
435
+ }
436
+ this.#store = createDoksSecretStore(context.runtime, storeDescriptor);
437
+ }
438
+ [DOKS_SECRET_STORE_ACCESS]() {
439
+ return this.#store;
440
+ }
441
+ admitWorkerCredentials(plan) {
442
+ return this.#store.admitWorkerCredentials(plan);
443
+ }
444
+ prepareWorkerCredentials(plan) {
445
+ return this.#store.prepareWorkerCredentials(plan);
446
+ }
447
+ revokeWorkerCredentials(lease) {
448
+ return this.#store.revokeWorkerCredentials(lease);
449
+ }
450
+ }
451
+ //# sourceMappingURL=doks-secret.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doks-secret.impl.js","sourceRoot":"","sources":["../../src/secrets/doks-secret.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { createDoksSecretStore } from './doks-secret.impl.ts';
2
+ export { default as doksSecretDescriptor } from './doks-secret.descriptor.ts';
3
+ export { secretsBackendDoksPlugin } from './secrets-backend-doks.plugin.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/secrets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createDoksSecretStore } from "./doks-secret.impl.js";
2
+ export { default as doksSecretDescriptor } from "./doks-secret.descriptor.js";
3
+ export { secretsBackendDoksPlugin } from "./secrets-backend-doks.plugin.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/secrets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const secretsBackendDoksPlugin: import("@vibesdotdev/kernel").RuntimePlugin;
2
+ export default secretsBackendDoksPlugin;
3
+ //# sourceMappingURL=secrets-backend-doks.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-backend-doks.plugin.d.ts","sourceRoot":"","sources":["../../src/secrets/secrets-backend-doks.plugin.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,wBAAwB,6CA+BnC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Registers the DOKS Secret store and its runtime-owned credential delivery client.
3
+ *
4
+ * The store kind exposes only store operations. Worker execution resolves the
5
+ * semantic runtime client directly; both surfaces share its one implementation.
6
+ */
7
+ import { createRuntimePlugin } from '@vibesdotdev/kernel';
8
+ import { getVibesClient } from '@vibesdotdev/kernel/client';
9
+ import { kubernetesTransportKind } from "../kubernetes/transport.js";
10
+ import descriptor, { DOKS_SECRET_DELIVERY_CLIENT_ID, DOKS_SECRET_STORE_ACCESS } from "./doks-secret.descriptor.js";
11
+ export const secretsBackendDoksPlugin = createRuntimePlugin({
12
+ id: 'digitalocean/secrets/doks',
13
+ name: 'Secrets Backend: DOKS Kubernetes Secret',
14
+ description: 'Projects stored secrets into a Kubernetes Secret on a DOKS cluster through the Secrets store and delivery owner.',
15
+ dependencies: ['secrets', 'runtime-client', 'integrations-digitalocean'],
16
+ descriptors: [descriptor],
17
+ onRegister: async (runtime) => {
18
+ if (!runtime.hasKind(kubernetesTransportKind.id))
19
+ runtime.registerKind(kubernetesTransportKind);
20
+ runtime.registerDescriptor('runtime/client', {
21
+ id: DOKS_SECRET_DELIVERY_CLIENT_ID,
22
+ kind: 'runtime/client'
23
+ });
24
+ runtime.registerLoader('runtime/client', DOKS_SECRET_DELIVERY_CLIENT_ID, async () => {
25
+ const { DigitalOceanDoksSecretRuntimeClient } = await import("./doks-secret.impl.js");
26
+ return { impl: DigitalOceanDoksSecretRuntimeClient };
27
+ });
28
+ runtime.registerLoader('secrets/store', 'doks-secret', async () => {
29
+ const client = await getVibesClient(DOKS_SECRET_DELIVERY_CLIENT_ID, runtime);
30
+ return { impl: client[DOKS_SECRET_STORE_ACCESS]() };
31
+ }, { priority: 1, origin: 'integrations-digitalocean/secrets' });
32
+ }
33
+ });
34
+ export default secretsBackendDoksPlugin;
35
+ //# sourceMappingURL=secrets-backend-doks.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-backend-doks.plugin.js","sourceRoot":"","sources":["../../src/secrets/secrets-backend-doks.plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAsB,MAAM,4BAA4B,CAAC;AAGhF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,UAAU,EAAE,EAClB,8BAA8B,EAC9B,wBAAwB,EACxB,MAAM,6BAA6B,CAAC;AAOrC,MAAM,CAAC,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;IAC3D,EAAE,EAAE,2BAA2B;IAC/B,IAAI,EAAE,yCAAyC;IAC/C,WAAW,EACV,kHAAkH;IACnH,YAAY,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,2BAA2B,CAAC;IAExE,WAAW,EAAE,CAAC,UAAU,CAAC;IAEzB,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QAEhG,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;YAC5C,EAAE,EAAE,8BAA8B;YAClC,IAAI,EAAE,gBAAgB;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,8BAA8B,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,EAAE,mCAAmC,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YACtF,OAAO,EAAE,IAAI,EAAE,mCAAmC,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,cAAc,CACrB,eAAe,EACf,aAAa,EACb,KAAK,IAAI,EAAE;YACV,MAAM,MAAM,GAAG,MAAM,cAAc,CAA0B,8BAA8B,EAAE,OAAO,CAAC,CAAC;YACtG,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,wBAAwB,CAAC,EAAE,EAAE,CAAC;QACrD,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAC5D,CAAC;IACF,CAAC;CACD,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * DigitalOcean Storage: Spaces metadata, Volumes, snapshots, NFS.
3
+ *
4
+ * Bucket data/configuration uses the S3-compatible API. DigitalOcean's v2
5
+ * control plane separately owns scoped Spaces access-key lifecycle.
6
+ */
7
+ import type { DigitalOceanControlPlaneClient } from '../client/control-plane.ts';
8
+ export { DigitalOceanSpacesKeysClient, type DoSpacesKey, type DoSpacesKeyGrant, type DoSpacesKeyPermission } from './spaces-keys.ts';
9
+ export type DoVolume = import('zod/v4').infer<typeof import('../schemas/http.ts').DoVolumeSchema>;
10
+ export type DoVolumeSnapshot = import('zod/v4').infer<typeof import('../schemas/http.ts').DoVolumeSnapshotSchema>;
11
+ export type DoCdnEndpoint = import('zod/v4').infer<typeof import('../schemas/http.ts').DoCdnEndpointSchema>;
12
+ export type DoNfsShare = import('zod/v4').infer<typeof import('../schemas/http.ts').DoNfsShareSchema>;
13
+ export interface CreateVolumeOptions {
14
+ name: string;
15
+ region: string;
16
+ size_gigabytes: number;
17
+ description?: string;
18
+ tags?: string[];
19
+ filesystem_type?: 'ext4' | 'xfs';
20
+ filesystem_label?: string;
21
+ snapshot_id?: string;
22
+ }
23
+ export declare class DigitalOceanStorageClient {
24
+ private readonly client;
25
+ constructor(client: DigitalOceanControlPlaneClient);
26
+ listVolumes(filters?: {
27
+ region?: string;
28
+ name?: string;
29
+ }): Promise<DoVolume[]>;
30
+ getVolume(volumeId: string): Promise<DoVolume>;
31
+ getVolumeOrNull(volumeId: string): Promise<DoVolume | null>;
32
+ createVolume(options: CreateVolumeOptions): Promise<DoVolume>;
33
+ deleteVolume(volumeId: string): Promise<void>;
34
+ attachVolume(volumeId: string, dropletId: number, region: string): Promise<void>;
35
+ detachVolume(volumeId: string, dropletId: number, region: string): Promise<void>;
36
+ listVolumeSnapshots(volumeId: string): Promise<DoVolumeSnapshot[]>;
37
+ createVolumeSnapshot(volumeId: string, name: string, tags?: string[]): Promise<DoVolumeSnapshot>;
38
+ listCdnEndpoints(): Promise<DoCdnEndpoint[]>;
39
+ listNfsShares(): Promise<DoNfsShare[]>;
40
+ getNfsShare(shareId: string): Promise<DoNfsShare>;
41
+ createNfsShare(options: {
42
+ name: string;
43
+ region: string;
44
+ size_gibibytes: number;
45
+ access_rules?: DoNfsShare['access_rules'];
46
+ }): Promise<DoNfsShare>;
47
+ deleteNfsShare(shareId: string): Promise<void>;
48
+ updateNfsShareAccessRules(shareId: string, rules: NonNullable<DoNfsShare['access_rules']>): Promise<void>;
49
+ }
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}