@vibesdotdev/infra-core 0.0.2 → 1.0.0-rc.5

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 (319) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +27 -1
  3. package/dist/bootstrap/seed.descriptor.d.ts +1 -1
  4. package/dist/bootstrap/seed.descriptor.d.ts.map +1 -1
  5. package/dist/bootstrap/seed.descriptor.js +1 -1
  6. package/dist/bootstrap/seed.descriptor.js.map +1 -1
  7. package/dist/bootstrap/seed.impl-shape.d.ts +1 -1
  8. package/dist/bootstrap/seed.impl-shape.d.ts.map +1 -1
  9. package/dist/bootstrap/seed.kind.d.ts +1 -3
  10. package/dist/bootstrap/seed.kind.d.ts.map +1 -1
  11. package/dist/bootstrap/seed.kind.js +17 -4
  12. package/dist/bootstrap/seed.kind.js.map +1 -1
  13. package/dist/bootstrap/seed.runner.d.ts +9 -2
  14. package/dist/bootstrap/seed.runner.d.ts.map +1 -1
  15. package/dist/bootstrap/seed.runner.js +37 -18
  16. package/dist/bootstrap/seed.runner.js.map +1 -1
  17. package/dist/capped-id.d.ts +19 -0
  18. package/dist/capped-id.d.ts.map +1 -0
  19. package/dist/capped-id.js +64 -0
  20. package/dist/capped-id.js.map +1 -0
  21. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.d.ts +23 -0
  22. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.d.ts.map +1 -0
  23. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.js +33 -0
  24. package/dist/cli/generate/artifact/artifact.cli-command.descriptor.js.map +1 -0
  25. package/dist/cli/generate/artifact/artifact.cli-command.impl.d.ts +24 -0
  26. package/dist/cli/generate/artifact/artifact.cli-command.impl.d.ts.map +1 -0
  27. package/dist/cli/generate/artifact/artifact.cli-command.impl.js +73 -0
  28. package/dist/cli/generate/artifact/artifact.cli-command.impl.js.map +1 -0
  29. package/dist/cli/generate/context.d.ts +17 -0
  30. package/dist/cli/generate/context.d.ts.map +1 -0
  31. package/dist/cli/generate/context.js +24 -0
  32. package/dist/cli/generate/context.js.map +1 -0
  33. package/dist/cli/generate/generate/generate.cli-command.descriptor.d.ts +30 -0
  34. package/dist/cli/generate/generate/generate.cli-command.descriptor.d.ts.map +1 -0
  35. package/dist/cli/generate/generate/generate.cli-command.descriptor.js +25 -0
  36. package/dist/cli/generate/generate/generate.cli-command.descriptor.js.map +1 -0
  37. package/dist/cli/generate/generate/generate.cli-command.impl.d.ts +25 -0
  38. package/dist/cli/generate/generate/generate.cli-command.impl.d.ts.map +1 -0
  39. package/dist/cli/generate/generate/generate.cli-command.impl.js +64 -0
  40. package/dist/cli/generate/generate/generate.cli-command.impl.js.map +1 -0
  41. package/dist/cli/generate/generate-core.d.ts +51 -0
  42. package/dist/cli/generate/generate-core.d.ts.map +1 -0
  43. package/dist/cli/generate/generate-core.js +172 -0
  44. package/dist/cli/generate/generate-core.js.map +1 -0
  45. package/dist/cli/generate/index.d.ts +5 -0
  46. package/dist/cli/generate/index.d.ts.map +1 -0
  47. package/dist/cli/generate/index.js +5 -0
  48. package/dist/cli/generate/index.js.map +1 -0
  49. package/dist/credentials/resolve.d.ts +82 -22
  50. package/dist/credentials/resolve.d.ts.map +1 -1
  51. package/dist/credentials/resolve.js +251 -77
  52. package/dist/credentials/resolve.js.map +1 -1
  53. package/dist/deployment-environment.d.ts +30 -0
  54. package/dist/deployment-environment.d.ts.map +1 -0
  55. package/dist/deployment-environment.js +53 -0
  56. package/dist/deployment-environment.js.map +1 -0
  57. package/dist/deployment.d.ts +8 -4
  58. package/dist/deployment.d.ts.map +1 -1
  59. package/dist/deployment.js +30 -0
  60. package/dist/deployment.js.map +1 -1
  61. package/dist/doks/cloud/base.d.ts +49 -0
  62. package/dist/doks/cloud/base.d.ts.map +1 -0
  63. package/dist/doks/cloud/base.js +138 -0
  64. package/dist/doks/cloud/base.js.map +1 -0
  65. package/dist/doks/cloud/factory.d.ts +18 -0
  66. package/dist/doks/cloud/factory.d.ts.map +1 -0
  67. package/dist/doks/cloud/factory.js +22 -0
  68. package/dist/doks/cloud/factory.js.map +1 -0
  69. package/dist/doks/cloud/index.d.ts +5 -0
  70. package/dist/doks/cloud/index.d.ts.map +1 -0
  71. package/dist/doks/cloud/index.js +4 -0
  72. package/dist/doks/cloud/index.js.map +1 -0
  73. package/dist/doks/types.d.ts +95 -0
  74. package/dist/doks/types.d.ts.map +1 -0
  75. package/dist/doks/types.js +14 -0
  76. package/dist/doks/types.js.map +1 -0
  77. package/dist/generate/index.d.ts +29 -0
  78. package/dist/generate/index.d.ts.map +1 -0
  79. package/dist/generate/index.js +28 -0
  80. package/dist/generate/index.js.map +1 -0
  81. package/dist/generate/infra-generate.plugin.d.ts +3 -0
  82. package/dist/generate/infra-generate.plugin.d.ts.map +1 -0
  83. package/dist/generate/infra-generate.plugin.js +23 -0
  84. package/dist/generate/infra-generate.plugin.js.map +1 -0
  85. package/dist/generate/plugin.d.ts +2 -0
  86. package/dist/generate/plugin.d.ts.map +1 -0
  87. package/dist/generate/plugin.js +2 -0
  88. package/dist/generate/plugin.js.map +1 -0
  89. package/dist/heartbeat/cron-heartbeat.d.ts +97 -0
  90. package/dist/heartbeat/cron-heartbeat.d.ts.map +1 -0
  91. package/dist/heartbeat/cron-heartbeat.js +200 -0
  92. package/dist/heartbeat/cron-heartbeat.js.map +1 -0
  93. package/dist/index.d.ts +35 -21
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +28 -14
  96. package/dist/index.js.map +1 -1
  97. package/dist/infra.plugin.d.ts +1 -1
  98. package/dist/infra.plugin.d.ts.map +1 -1
  99. package/dist/infra.plugin.js +62 -12
  100. package/dist/infra.plugin.js.map +1 -1
  101. package/dist/kinds/alerts.kind.d.ts +64 -25
  102. package/dist/kinds/alerts.kind.d.ts.map +1 -1
  103. package/dist/kinds/alerts.kind.js +43 -16
  104. package/dist/kinds/alerts.kind.js.map +1 -1
  105. package/dist/kinds/artifact.kind.d.ts +58 -10
  106. package/dist/kinds/artifact.kind.d.ts.map +1 -1
  107. package/dist/kinds/artifact.kind.js +26 -9
  108. package/dist/kinds/artifact.kind.js.map +1 -1
  109. package/dist/kinds/billing.kind.d.ts +88 -0
  110. package/dist/kinds/billing.kind.d.ts.map +1 -0
  111. package/dist/kinds/billing.kind.js +48 -0
  112. package/dist/kinds/billing.kind.js.map +1 -0
  113. package/dist/kinds/build-job.kind.d.ts +381 -0
  114. package/dist/kinds/build-job.kind.d.ts.map +1 -0
  115. package/dist/kinds/build-job.kind.js +216 -0
  116. package/dist/kinds/build-job.kind.js.map +1 -0
  117. package/dist/kinds/cache.kind.d.ts +39 -92
  118. package/dist/kinds/cache.kind.d.ts.map +1 -1
  119. package/dist/kinds/cache.kind.js +26 -51
  120. package/dist/kinds/cache.kind.js.map +1 -1
  121. package/dist/kinds/cluster.kind.d.ts +154 -0
  122. package/dist/kinds/cluster.kind.d.ts.map +1 -0
  123. package/dist/kinds/cluster.kind.js +99 -0
  124. package/dist/kinds/cluster.kind.js.map +1 -0
  125. package/dist/kinds/compute-source.kind.d.ts +138 -0
  126. package/dist/kinds/compute-source.kind.d.ts.map +1 -0
  127. package/dist/kinds/compute-source.kind.js +145 -0
  128. package/dist/kinds/compute-source.kind.js.map +1 -0
  129. package/dist/kinds/compute-sources.descriptors.d.ts +45 -0
  130. package/dist/kinds/compute-sources.descriptors.d.ts.map +1 -0
  131. package/dist/kinds/compute-sources.descriptors.js +93 -0
  132. package/dist/kinds/compute-sources.descriptors.js.map +1 -0
  133. package/dist/kinds/container-registry.kind.d.ts +62 -0
  134. package/dist/kinds/container-registry.kind.d.ts.map +1 -0
  135. package/dist/kinds/container-registry.kind.js +47 -0
  136. package/dist/kinds/container-registry.kind.js.map +1 -0
  137. package/dist/kinds/database-migrator.kind.d.ts +6 -0
  138. package/dist/kinds/database-migrator.kind.d.ts.map +1 -0
  139. package/dist/kinds/database-migrator.kind.js +28 -0
  140. package/dist/kinds/database-migrator.kind.js.map +1 -0
  141. package/dist/kinds/database.kind.d.ts +114 -93
  142. package/dist/kinds/database.kind.d.ts.map +1 -1
  143. package/dist/kinds/database.kind.js +93 -54
  144. package/dist/kinds/database.kind.js.map +1 -1
  145. package/dist/kinds/deployment-provider.kind.d.ts +5 -0
  146. package/dist/kinds/deployment-provider.kind.d.ts.map +1 -0
  147. package/dist/kinds/deployment-provider.kind.js +11 -0
  148. package/dist/kinds/deployment-provider.kind.js.map +1 -0
  149. package/dist/kinds/discovery.d.ts +5 -12
  150. package/dist/kinds/discovery.d.ts.map +1 -1
  151. package/dist/kinds/discovery.js +5 -17
  152. package/dist/kinds/discovery.js.map +1 -1
  153. package/dist/kinds/dns.kind.d.ts +162 -0
  154. package/dist/kinds/dns.kind.d.ts.map +1 -0
  155. package/dist/kinds/dns.kind.js +54 -0
  156. package/dist/kinds/dns.kind.js.map +1 -0
  157. package/dist/kinds/drift.kind.d.ts +115 -0
  158. package/dist/kinds/drift.kind.d.ts.map +1 -0
  159. package/dist/kinds/drift.kind.js +60 -0
  160. package/dist/kinds/drift.kind.js.map +1 -0
  161. package/dist/kinds/edge-tls.kind.d.ts +194 -0
  162. package/dist/kinds/edge-tls.kind.d.ts.map +1 -0
  163. package/dist/kinds/edge-tls.kind.js +58 -0
  164. package/dist/kinds/edge-tls.kind.js.map +1 -0
  165. package/dist/kinds/firewall.kind.d.ts +92 -0
  166. package/dist/kinds/firewall.kind.d.ts.map +1 -0
  167. package/dist/kinds/firewall.kind.js +59 -0
  168. package/dist/kinds/firewall.kind.js.map +1 -0
  169. package/dist/kinds/git-hosting.kind.d.ts +36 -38
  170. package/dist/kinds/git-hosting.kind.d.ts.map +1 -1
  171. package/dist/kinds/git-hosting.kind.js +21 -32
  172. package/dist/kinds/git-hosting.kind.js.map +1 -1
  173. package/dist/kinds/index.d.ts +40 -15
  174. package/dist/kinds/index.d.ts.map +1 -1
  175. package/dist/kinds/index.js +39 -14
  176. package/dist/kinds/index.js.map +1 -1
  177. package/dist/kinds/inventory.kind.d.ts +327 -0
  178. package/dist/kinds/inventory.kind.d.ts.map +1 -0
  179. package/dist/kinds/inventory.kind.js +188 -0
  180. package/dist/kinds/inventory.kind.js.map +1 -0
  181. package/dist/kinds/load-balancer.kind.d.ts +135 -0
  182. package/dist/kinds/load-balancer.kind.d.ts.map +1 -0
  183. package/dist/kinds/load-balancer.kind.js +71 -0
  184. package/dist/kinds/load-balancer.kind.js.map +1 -0
  185. package/dist/kinds/logs.kind.d.ts +74 -3
  186. package/dist/kinds/logs.kind.d.ts.map +1 -1
  187. package/dist/kinds/logs.kind.js +26 -17
  188. package/dist/kinds/logs.kind.js.map +1 -1
  189. package/dist/kinds/nfs.kind.d.ts +67 -0
  190. package/dist/kinds/nfs.kind.d.ts.map +1 -0
  191. package/dist/kinds/nfs.kind.js +45 -0
  192. package/dist/kinds/nfs.kind.js.map +1 -0
  193. package/dist/kinds/node-pool.kind.d.ts +134 -0
  194. package/dist/kinds/node-pool.kind.d.ts.map +1 -0
  195. package/dist/kinds/node-pool.kind.js +88 -0
  196. package/dist/kinds/node-pool.kind.js.map +1 -0
  197. package/dist/kinds/object-storage.kind.d.ts +50 -24
  198. package/dist/kinds/object-storage.kind.d.ts.map +1 -1
  199. package/dist/kinds/object-storage.kind.js +40 -23
  200. package/dist/kinds/object-storage.kind.js.map +1 -1
  201. package/dist/kinds/observability.kind.d.ts +104 -6
  202. package/dist/kinds/observability.kind.d.ts.map +1 -1
  203. package/dist/kinds/observability.kind.js +67 -9
  204. package/dist/kinds/observability.kind.js.map +1 -1
  205. package/dist/kinds/package-registry.kind.d.ts +139 -33
  206. package/dist/kinds/package-registry.kind.d.ts.map +1 -1
  207. package/dist/kinds/package-registry.kind.js +55 -25
  208. package/dist/kinds/package-registry.kind.js.map +1 -1
  209. package/dist/kinds/queue.kind.d.ts +67 -63
  210. package/dist/kinds/queue.kind.d.ts.map +1 -1
  211. package/dist/kinds/queue.kind.js +55 -33
  212. package/dist/kinds/queue.kind.js.map +1 -1
  213. package/dist/kinds/read-descriptor.d.ts +15 -0
  214. package/dist/kinds/read-descriptor.d.ts.map +1 -0
  215. package/dist/kinds/read-descriptor.js +11 -0
  216. package/dist/kinds/read-descriptor.js.map +1 -0
  217. package/dist/kinds/rum.kind.d.ts +36 -6
  218. package/dist/kinds/rum.kind.d.ts.map +1 -1
  219. package/dist/kinds/rum.kind.js +6 -7
  220. package/dist/kinds/rum.kind.js.map +1 -1
  221. package/dist/kinds/sandbox.kind.d.ts +136 -36
  222. package/dist/kinds/sandbox.kind.d.ts.map +1 -1
  223. package/dist/kinds/sandbox.kind.js +80 -34
  224. package/dist/kinds/sandbox.kind.js.map +1 -1
  225. package/dist/kinds/select-compute-source.d.ts +72 -0
  226. package/dist/kinds/select-compute-source.d.ts.map +1 -0
  227. package/dist/kinds/select-compute-source.js +170 -0
  228. package/dist/kinds/select-compute-source.js.map +1 -0
  229. package/dist/kinds/service-release.kind.d.ts +771 -0
  230. package/dist/kinds/service-release.kind.d.ts.map +1 -0
  231. package/dist/kinds/service-release.kind.js +676 -0
  232. package/dist/kinds/service-release.kind.js.map +1 -0
  233. package/dist/kinds/spend-guard.kind.d.ts +40 -0
  234. package/dist/kinds/spend-guard.kind.d.ts.map +1 -0
  235. package/dist/kinds/spend-guard.kind.js +133 -0
  236. package/dist/kinds/spend-guard.kind.js.map +1 -0
  237. package/dist/kinds/utilization.kind.d.ts +88 -0
  238. package/dist/kinds/utilization.kind.d.ts.map +1 -0
  239. package/dist/kinds/utilization.kind.js +62 -0
  240. package/dist/kinds/utilization.kind.js.map +1 -0
  241. package/dist/kinds/volume.kind.d.ts +54 -0
  242. package/dist/kinds/volume.kind.d.ts.map +1 -0
  243. package/dist/kinds/volume.kind.js +39 -0
  244. package/dist/kinds/volume.kind.js.map +1 -0
  245. package/dist/kinds/vpc.kind.d.ts +61 -0
  246. package/dist/kinds/vpc.kind.d.ts.map +1 -0
  247. package/dist/kinds/vpc.kind.js +51 -0
  248. package/dist/kinds/vpc.kind.js.map +1 -0
  249. package/dist/kinds/web-app.kind.d.ts +115 -45
  250. package/dist/kinds/web-app.kind.d.ts.map +1 -1
  251. package/dist/kinds/web-app.kind.js +69 -42
  252. package/dist/kinds/web-app.kind.js.map +1 -1
  253. package/dist/kinds/worker.kind.d.ts +293 -188
  254. package/dist/kinds/worker.kind.d.ts.map +1 -1
  255. package/dist/kinds/worker.kind.js +45 -123
  256. package/dist/kinds/worker.kind.js.map +1 -1
  257. package/dist/schemas/database-migration.d.ts +173 -0
  258. package/dist/schemas/database-migration.d.ts.map +1 -0
  259. package/dist/schemas/database-migration.js +88 -0
  260. package/dist/schemas/database-migration.js.map +1 -0
  261. package/dist/schemas/deployment-environment.d.ts +11 -0
  262. package/dist/schemas/deployment-environment.d.ts.map +1 -0
  263. package/dist/schemas/deployment-environment.js +9 -0
  264. package/dist/schemas/deployment-environment.js.map +1 -0
  265. package/dist/schemas/deployment-provider.d.ts +336 -0
  266. package/dist/schemas/deployment-provider.d.ts.map +1 -0
  267. package/dist/schemas/deployment-provider.js +198 -0
  268. package/dist/schemas/deployment-provider.js.map +1 -0
  269. package/dist/schemas/log-stream.d.ts +27 -0
  270. package/dist/schemas/log-stream.d.ts.map +1 -0
  271. package/dist/schemas/log-stream.js +31 -0
  272. package/dist/schemas/log-stream.js.map +1 -0
  273. package/dist/schemas/spend-guard.d.ts +155 -0
  274. package/dist/schemas/spend-guard.d.ts.map +1 -0
  275. package/dist/schemas/spend-guard.js +61 -0
  276. package/dist/schemas/spend-guard.js.map +1 -0
  277. package/dist/schemas.d.ts +190 -20
  278. package/dist/schemas.d.ts.map +1 -1
  279. package/dist/schemas.js +137 -31
  280. package/dist/schemas.js.map +1 -1
  281. package/dist/service.d.ts +87 -0
  282. package/dist/service.d.ts.map +1 -0
  283. package/dist/service.js +199 -0
  284. package/dist/service.js.map +1 -0
  285. package/dist/settle-work.d.ts +20 -0
  286. package/dist/settle-work.d.ts.map +1 -0
  287. package/dist/settle-work.js +22 -0
  288. package/dist/settle-work.js.map +1 -0
  289. package/dist/web-app-projection.d.ts +132 -0
  290. package/dist/web-app-projection.d.ts.map +1 -0
  291. package/dist/web-app-projection.js +93 -0
  292. package/dist/web-app-projection.js.map +1 -0
  293. package/package.json +87 -36
  294. package/src/bootstrap/index.ts +0 -15
  295. package/src/bootstrap/seed.descriptor.ts +0 -24
  296. package/src/bootstrap/seed.impl-shape.ts +0 -5
  297. package/src/bootstrap/seed.kind.ts +0 -26
  298. package/src/bootstrap/seed.runner.ts +0 -87
  299. package/src/credentials/resolve.ts +0 -205
  300. package/src/deployment.ts +0 -57
  301. package/src/index.ts +0 -149
  302. package/src/infra.plugin.ts +0 -54
  303. package/src/kinds/alerts.kind.ts +0 -164
  304. package/src/kinds/artifact.kind.ts +0 -96
  305. package/src/kinds/cache.kind.ts +0 -104
  306. package/src/kinds/database.kind.ts +0 -120
  307. package/src/kinds/discovery.ts +0 -26
  308. package/src/kinds/git-hosting.kind.ts +0 -100
  309. package/src/kinds/index.ts +0 -139
  310. package/src/kinds/logs.kind.ts +0 -104
  311. package/src/kinds/object-storage.kind.ts +0 -101
  312. package/src/kinds/observability.kind.ts +0 -178
  313. package/src/kinds/package-registry.kind.ts +0 -95
  314. package/src/kinds/queue.kind.ts +0 -102
  315. package/src/kinds/rum.kind.ts +0 -135
  316. package/src/kinds/sandbox.kind.ts +0 -115
  317. package/src/kinds/web-app.kind.ts +0 -103
  318. package/src/kinds/worker.kind.ts +0 -203
  319. package/src/schemas.ts +0 -127
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Infra DNS Kind
3
+ *
4
+ * Provider-agnostic schema for authoritative DNS records. Per-provider
5
+ * implementations (cloudflare-dns, do-domains, route53) map this shape
6
+ * onto the native API.
7
+ *
8
+ * `proxied` is modeled here rather than in the Cloudflare adapter because
9
+ * whether a hostname is served through a reverse proxy is a product
10
+ * decision with protocol consequences, not a vendor detail. Git over HTTP
11
+ * requires a direct origin; a proxied record silently breaks smart-HTTP
12
+ * pack negotiation. Providers without a proxy layer reject `proxied: true`
13
+ * as unsupported rather than accepting and ignoring it.
14
+ */
15
+ import * as z from 'zod/v4';
16
+ import type { InfraAuthorityFingerprint } from './inventory.kind.ts';
17
+ declare const DnsRecordTypeSchema: z.ZodEnum<{
18
+ A: "A";
19
+ AAAA: "AAAA";
20
+ CNAME: "CNAME";
21
+ TXT: "TXT";
22
+ MX: "MX";
23
+ SRV: "SRV";
24
+ CAA: "CAA";
25
+ NS: "NS";
26
+ }>;
27
+ export type DnsRecordType = z.infer<typeof DnsRecordTypeSchema>;
28
+ declare const DnsRecordSchema: z.ZodObject<{
29
+ name: z.ZodString;
30
+ type: z.ZodEnum<{
31
+ A: "A";
32
+ AAAA: "AAAA";
33
+ CNAME: "CNAME";
34
+ TXT: "TXT";
35
+ MX: "MX";
36
+ SRV: "SRV";
37
+ CAA: "CAA";
38
+ NS: "NS";
39
+ }>;
40
+ content: z.ZodString;
41
+ ttl: z.ZodDefault<z.ZodNumber>;
42
+ proxied: z.ZodDefault<z.ZodBoolean>;
43
+ priority: z.ZodOptional<z.ZodNumber>;
44
+ comment: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strip>;
46
+ export type DnsRecord = z.infer<typeof DnsRecordSchema>;
47
+ export type DnsRecordInput = z.input<typeof DnsRecordSchema>;
48
+ declare const DnsBaseSchema: z.ZodObject<{
49
+ id: z.ZodString;
50
+ name: z.ZodOptional<z.ZodString>;
51
+ description: z.ZodOptional<z.ZodString>;
52
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
53
+ hardware: z.ZodOptional<z.ZodArray<z.ZodString>>;
54
+ enabled: z.ZodOptional<z.ZodBoolean>;
55
+ priority: z.ZodOptional<z.ZodNumber>;
56
+ capabilityId: z.ZodOptional<z.ZodString>;
57
+ requiredContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
+ optionalContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
59
+ config: z.ZodOptional<z.ZodUnknown>;
60
+ retention: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
61
+ maxAgeDays: z.ZodOptional<z.ZodNumber>;
62
+ maxEntries: z.ZodOptional<z.ZodNumber>;
63
+ maxBytes: z.ZodOptional<z.ZodNumber>;
64
+ cascadeFrom: z.ZodOptional<z.ZodString>;
65
+ ageField: z.ZodOptional<z.ZodString>;
66
+ reason: z.ZodString;
67
+ enforcedBy: z.ZodOptional<z.ZodString>;
68
+ }, z.core.$strip>]>>;
69
+ kind: z.ZodLiteral<"infra/dns">;
70
+ adapter: z.ZodString;
71
+ adapterConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
72
+ zone: z.ZodOptional<z.ZodString>;
73
+ environment: z.ZodDefault<z.ZodString>;
74
+ records: z.ZodDefault<z.ZodArray<z.ZodObject<{
75
+ name: z.ZodString;
76
+ type: z.ZodEnum<{
77
+ A: "A";
78
+ AAAA: "AAAA";
79
+ CNAME: "CNAME";
80
+ TXT: "TXT";
81
+ MX: "MX";
82
+ SRV: "SRV";
83
+ CAA: "CAA";
84
+ NS: "NS";
85
+ }>;
86
+ content: z.ZodString;
87
+ ttl: z.ZodDefault<z.ZodNumber>;
88
+ proxied: z.ZodDefault<z.ZodBoolean>;
89
+ priority: z.ZodOptional<z.ZodNumber>;
90
+ comment: z.ZodOptional<z.ZodString>;
91
+ }, z.core.$strip>>>;
92
+ }, z.core.$strip>;
93
+ export type InfraDnsDescriptor = z.infer<typeof DnsBaseSchema>;
94
+ export type InfraDnsDescriptorInput = z.input<typeof DnsBaseSchema>;
95
+ /** A record as it exists on the provider, carrying the provider-assigned id. */
96
+ export type LiveDnsRecord = DnsRecord & {
97
+ providerId: string;
98
+ zone: string;
99
+ };
100
+ export interface DnsZoneStatus {
101
+ zone: string;
102
+ status: string;
103
+ nameservers: string[];
104
+ activatedOn?: string;
105
+ modifiedOn?: string;
106
+ }
107
+ export interface DnsZoneActivationResult {
108
+ requested: boolean;
109
+ status: DnsZoneStatus;
110
+ }
111
+ /**
112
+ * Implementation contract every provider implements. `upsertRecord` is
113
+ * idempotent on (name, type): it updates the existing record in place
114
+ * rather than creating a duplicate RRset entry. Opt-in matchContent selects by
115
+ * exact content as well, creating a sibling when that value is absent. Callers
116
+ * must check supportsContentMatch before using this mode.
117
+ */
118
+ export interface DnsImplementation {
119
+ /** Whether diff/upsert support preserving siblings by matching exact content. */
120
+ supportsContentMatch?: boolean;
121
+ /** Redacted authority used by the latest provider request. */
122
+ getAuthority?(): Promise<InfraAuthorityFingerprint>;
123
+ /** List records, optionally narrowed by exact name and/or type. */
124
+ listRecords(filter?: {
125
+ name?: string;
126
+ type?: DnsRecordType;
127
+ }): Promise<LiveDnsRecord[]>;
128
+ /** Create or update a record by (name, type). Returns the provider id. */
129
+ upsertRecord(record: DnsRecordInput, options?: {
130
+ matchContent?: boolean;
131
+ }): Promise<{
132
+ providerId: string;
133
+ created: boolean;
134
+ }>;
135
+ /** Delete by provider id. Absence is not an error. */
136
+ deleteRecord(providerId: string): Promise<boolean>;
137
+ /**
138
+ * Diff desired against live for the names in `desired`. Records outside
139
+ * that set are never reported for deletion — this kind is additive by
140
+ * default so it can coexist with records owned elsewhere.
141
+ */
142
+ diff(desired: DnsRecordInput[], options?: {
143
+ matchContent?: boolean;
144
+ }): Promise<{
145
+ create: DnsRecord[];
146
+ update: Array<{
147
+ providerId: string;
148
+ from: LiveDnsRecord;
149
+ to: DnsRecord;
150
+ }>;
151
+ unchanged: LiveDnsRecord[];
152
+ }>;
153
+ /** Read the authoritative zone's provider activation state. */
154
+ getZoneStatus?(): Promise<DnsZoneStatus>;
155
+ /** Request an immediate provider activation check for a pending zone. */
156
+ requestZoneActivation?(): Promise<DnsZoneActivationResult>;
157
+ }
158
+ export declare const dnsKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<DnsImplementation>;
159
+ export type InfraDnsKind = InfraDnsDescriptor;
160
+ export type InfraDnsKindInput = InfraDnsDescriptorInput;
161
+ export { DnsBaseSchema as InfraDnsDescriptorSchema, DnsRecordSchema, DnsRecordTypeSchema };
162
+ //# sourceMappingURL=dns.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns.kind.d.ts","sourceRoot":"","sources":["../../src/kinds/dns.kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Infra DNS Kind
3
+ *
4
+ * Provider-agnostic schema for authoritative DNS records. Per-provider
5
+ * implementations (cloudflare-dns, do-domains, route53) map this shape
6
+ * onto the native API.
7
+ *
8
+ * `proxied` is modeled here rather than in the Cloudflare adapter because
9
+ * whether a hostname is served through a reverse proxy is a product
10
+ * decision with protocol consequences, not a vendor detail. Git over HTTP
11
+ * requires a direct origin; a proxied record silently breaks smart-HTTP
12
+ * pack negotiation. Providers without a proxy layer reject `proxied: true`
13
+ * as unsupported rather than accepting and ignoring it.
14
+ */
15
+ import * as z from 'zod/v4';
16
+ import { createRuntimeKind } from '@vibesdotdev/kernel/factory/kind';
17
+ import { RuntimeDescriptorSchema } from '@vibesdotdev/kernel/schemas/descriptor';
18
+ import { INFRA_DISCOVERY_PATTERNS } from "./discovery.js";
19
+ const DnsRecordTypeSchema = z.enum(['A', 'AAAA', 'CNAME', 'TXT', 'MX', 'SRV', 'CAA', 'NS']);
20
+ const DnsRecordSchema = z.object({
21
+ /** Fully-qualified record name (e.g. `git.vibes.dev`). */
22
+ name: z.string().min(1),
23
+ type: DnsRecordTypeSchema,
24
+ /** Record value: IP for A/AAAA, target for CNAME, payload for TXT. */
25
+ content: z.string().min(1),
26
+ /** TTL in seconds. `1` means "provider automatic" where supported. */
27
+ ttl: z.number().int().positive().default(1),
28
+ /**
29
+ * Serve through the provider's reverse proxy when true. Must be false
30
+ * for protocols the proxy cannot carry (git smart-HTTP, raw SSH).
31
+ */
32
+ proxied: z.boolean().default(false),
33
+ /** Priority for MX/SRV. */
34
+ priority: z.number().int().nonnegative().optional(),
35
+ comment: z.string().optional()
36
+ });
37
+ const DnsBaseSchema = RuntimeDescriptorSchema.extend({
38
+ kind: z.literal('infra/dns'),
39
+ /** Adapter id (e.g. 'cloudflare-dns', 'do-domains'). */
40
+ adapter: z.string().min(1),
41
+ adapterConfig: z.record(z.string(), z.unknown()).optional(),
42
+ /** Apex zone this descriptor is authoritative for (e.g. `vibes.dev`). */
43
+ zone: z.string().min(1).optional(),
44
+ /** Environment name for credential resolution via `vibes secrets`. */
45
+ environment: z.string().default('local'),
46
+ records: z.array(DnsRecordSchema).default([])
47
+ });
48
+ export const dnsKind = createRuntimeKind({
49
+ id: 'infra/dns',
50
+ descriptorSchema: DnsBaseSchema,
51
+ discoveryPatterns: INFRA_DISCOVERY_PATTERNS
52
+ });
53
+ export { DnsBaseSchema as InfraDnsDescriptorSchema, DnsRecordSchema, DnsRecordTypeSchema };
54
+ //# sourceMappingURL=dns.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dns.kind.js","sourceRoot":"","sources":["../../src/kinds/dns.kind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAI5F,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,0DAA0D;IAC1D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,mBAAmB;IACzB,sEAAsE;IACtE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,sEAAsE;IACtE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C;;;OAGG;IACH,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,2BAA2B;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACnD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAKH,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC;IACpD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,wDAAwD;IACxD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3D,yEAAyE;IACzE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,sEAAsE;IACtE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7C,CAAC,CAAC;AAuDH,MAAM,CAAC,MAAM,OAAO,GAAG,iBAAiB,CAAwC;IAC/E,EAAE,EAAE,WAAW;IACf,gBAAgB,EAAE,aAAa;IAC/B,iBAAiB,EAAE,wBAAwB;CAC3C,CAAC,CAAC;AAKH,OAAO,EAAE,aAAa,IAAI,wBAAwB,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Kind: infra/drift
3
+ *
4
+ * Generic drift descriptor. Reports differences between declared infra
5
+ * descriptors and the live provider state. Drift entries cover missing
6
+ * resources, unmanaged resources, stale resources, unsafe public exposure,
7
+ * and unexpected cost drivers.
8
+ */
9
+ import * as z from 'zod/v4';
10
+ import type { RuntimeDescriptor } from '@vibesdotdev/kernel/schemas/descriptor';
11
+ import type { KindContext } from '@vibesdotdev/kernel/schemas/kind';
12
+ export declare const DriftKindSchema: z.ZodEnum<{
13
+ missing: "missing";
14
+ unmanaged: "unmanaged";
15
+ stale: "stale";
16
+ "unsafe-public": "unsafe-public";
17
+ "cost-driver": "cost-driver";
18
+ "config-drift": "config-drift";
19
+ }>;
20
+ export type DriftKind = z.infer<typeof DriftKindSchema>;
21
+ export declare const DriftSeveritySchema: z.ZodEnum<{
22
+ info: "info";
23
+ critical: "critical";
24
+ warning: "warning";
25
+ }>;
26
+ export type DriftSeverity = z.infer<typeof DriftSeveritySchema>;
27
+ export declare const DriftEntrySchema: z.ZodObject<{
28
+ kind: z.ZodEnum<{
29
+ missing: "missing";
30
+ unmanaged: "unmanaged";
31
+ stale: "stale";
32
+ "unsafe-public": "unsafe-public";
33
+ "cost-driver": "cost-driver";
34
+ "config-drift": "config-drift";
35
+ }>;
36
+ severity: z.ZodDefault<z.ZodEnum<{
37
+ info: "info";
38
+ critical: "critical";
39
+ warning: "warning";
40
+ }>>;
41
+ resourceKind: z.ZodString;
42
+ resourceId: z.ZodOptional<z.ZodString>;
43
+ resourceName: z.ZodOptional<z.ZodString>;
44
+ message: z.ZodString;
45
+ expected: z.ZodOptional<z.ZodUnknown>;
46
+ actual: z.ZodOptional<z.ZodUnknown>;
47
+ }, z.core.$strip>;
48
+ export type DriftEntry = z.infer<typeof DriftEntrySchema>;
49
+ export declare const DriftReportSchema: z.ZodObject<{
50
+ provider: z.ZodString;
51
+ collectedAt: z.ZodString;
52
+ entries: z.ZodArray<z.ZodObject<{
53
+ kind: z.ZodEnum<{
54
+ missing: "missing";
55
+ unmanaged: "unmanaged";
56
+ stale: "stale";
57
+ "unsafe-public": "unsafe-public";
58
+ "cost-driver": "cost-driver";
59
+ "config-drift": "config-drift";
60
+ }>;
61
+ severity: z.ZodDefault<z.ZodEnum<{
62
+ info: "info";
63
+ critical: "critical";
64
+ warning: "warning";
65
+ }>>;
66
+ resourceKind: z.ZodString;
67
+ resourceId: z.ZodOptional<z.ZodString>;
68
+ resourceName: z.ZodOptional<z.ZodString>;
69
+ message: z.ZodString;
70
+ expected: z.ZodOptional<z.ZodUnknown>;
71
+ actual: z.ZodOptional<z.ZodUnknown>;
72
+ }, z.core.$strip>>;
73
+ }, z.core.$strip>;
74
+ export type DriftReport = z.infer<typeof DriftReportSchema>;
75
+ export declare const DriftDescriptorSchema: z.ZodObject<{
76
+ id: z.ZodString;
77
+ name: z.ZodOptional<z.ZodString>;
78
+ description: z.ZodOptional<z.ZodString>;
79
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ hardware: z.ZodOptional<z.ZodArray<z.ZodString>>;
81
+ enabled: z.ZodOptional<z.ZodBoolean>;
82
+ priority: z.ZodOptional<z.ZodNumber>;
83
+ capabilityId: z.ZodOptional<z.ZodString>;
84
+ requiredContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
85
+ optionalContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
86
+ config: z.ZodOptional<z.ZodUnknown>;
87
+ retention: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
88
+ maxAgeDays: z.ZodOptional<z.ZodNumber>;
89
+ maxEntries: z.ZodOptional<z.ZodNumber>;
90
+ maxBytes: z.ZodOptional<z.ZodNumber>;
91
+ cascadeFrom: z.ZodOptional<z.ZodString>;
92
+ ageField: z.ZodOptional<z.ZodString>;
93
+ reason: z.ZodString;
94
+ enforcedBy: z.ZodOptional<z.ZodString>;
95
+ }, z.core.$strip>]>>;
96
+ kind: z.ZodLiteral<"infra/drift">;
97
+ provider: z.ZodOptional<z.ZodString>;
98
+ }, z.core.$strip>;
99
+ export type DriftDescriptor = z.infer<typeof DriftDescriptorSchema>;
100
+ export interface DriftImplementation {
101
+ /** Compute drift between declared and live resources. */
102
+ detect(opts?: {
103
+ kinds?: string[];
104
+ }): Promise<DriftReport>;
105
+ }
106
+ declare class DefaultDriftImplementation {
107
+ readonly descriptor: RuntimeDescriptor;
108
+ readonly context: KindContext;
109
+ /** The descriptor as this kind's schema reads it. */
110
+ readonly config: DriftDescriptor;
111
+ constructor(descriptor: RuntimeDescriptor, context: KindContext);
112
+ }
113
+ export declare const driftKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<DefaultDriftImplementation>;
114
+ export {};
115
+ //# sourceMappingURL=drift.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.kind.d.ts","sourceRoot":"","sources":["../../src/kinds/drift.kind.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAIpE,eAAO,MAAM,eAAe;;;;;;;EAO1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,mBAAmB;;;;EAA0C,CAAC;AAC3E,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;iBAS3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;iBAI5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAO5D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;iBAAkB,CAAC;AACrD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IACnC,yDAAyD;IACzD,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1D;AAED,cAAM,0BAA0B;aAId,UAAU,EAAE,iBAAiB;aAC7B,OAAO,EAAE,WAAW;IAJrC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;gBAEhB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,WAAW;CAKrC;AAED,eAAO,MAAM,SAAS,uFAKpB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Kind: infra/drift
3
+ *
4
+ * Generic drift descriptor. Reports differences between declared infra
5
+ * descriptors and the live provider state. Drift entries cover missing
6
+ * resources, unmanaged resources, stale resources, unsafe public exposure,
7
+ * and unexpected cost drivers.
8
+ */
9
+ import * as z from 'zod/v4';
10
+ import { createRuntimeKind } from '@vibesdotdev/kernel/factory/kind';
11
+ import { RuntimeDescriptorSchema } from '@vibesdotdev/kernel/schemas/descriptor';
12
+ import { readKindDescriptor } from "./read-descriptor.js";
13
+ import { INFRA_DISCOVERY_PATTERNS } from "./discovery.js";
14
+ export const DriftKindSchema = z.enum([
15
+ 'missing',
16
+ 'unmanaged',
17
+ 'stale',
18
+ 'unsafe-public',
19
+ 'cost-driver',
20
+ 'config-drift'
21
+ ]);
22
+ export const DriftSeveritySchema = z.enum(['info', 'warning', 'critical']);
23
+ export const DriftEntrySchema = z.object({
24
+ kind: DriftKindSchema,
25
+ severity: DriftSeveritySchema.default('warning'),
26
+ resourceKind: z.string(),
27
+ resourceId: z.string().optional(),
28
+ resourceName: z.string().optional(),
29
+ message: z.string(),
30
+ expected: z.unknown().optional(),
31
+ actual: z.unknown().optional()
32
+ });
33
+ export const DriftReportSchema = z.object({
34
+ provider: z.string(),
35
+ collectedAt: z.string(),
36
+ entries: z.array(DriftEntrySchema)
37
+ });
38
+ const DriftBaseSchema = RuntimeDescriptorSchema.extend({
39
+ kind: z.literal('infra/drift'),
40
+ provider: z.string().min(1).optional()
41
+ });
42
+ export const DriftDescriptorSchema = DriftBaseSchema;
43
+ class DefaultDriftImplementation {
44
+ descriptor;
45
+ context;
46
+ /** The descriptor as this kind's schema reads it. */
47
+ config;
48
+ constructor(descriptor, context) {
49
+ this.descriptor = descriptor;
50
+ this.context = context;
51
+ this.config = readKindDescriptor(DriftDescriptorSchema, descriptor);
52
+ }
53
+ }
54
+ export const driftKind = createRuntimeKind({
55
+ id: 'infra/drift',
56
+ descriptorSchema: DriftDescriptorSchema,
57
+ defaultImplementation: DefaultDriftImplementation,
58
+ discoveryPatterns: INFRA_DISCOVERY_PATTERNS
59
+ });
60
+ //# sourceMappingURL=drift.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.kind.js","sourceRoot":"","sources":["../../src/kinds/drift.kind.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAGjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,SAAS;IACT,WAAW;IACX,OAAO;IACP,eAAe;IACf,aAAa;IACb,cAAc;CACd,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAG3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC;IAChD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CAClC,CAAC,CAAC;AAGH,MAAM,eAAe,GAAG,uBAAuB,CAAC,MAAM,CAAC;IACtD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAQrD,MAAM,0BAA0B;IAId;IACA;IAJjB,qDAAqD;IAC5C,MAAM,CAAkB;IACjC,YACiB,UAA6B,EAC7B,OAAoB;QADpB,eAAU,GAAV,UAAU,CAAmB;QAC7B,YAAO,GAAP,OAAO,CAAa;QAEpC,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;CAED;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CAA8C;IACvF,EAAE,EAAE,aAAa;IACjB,gBAAgB,EAAE,qBAAqB;IACvC,qBAAqB,EAAE,0BAA0B;IACjD,iBAAiB,EAAE,wBAAwB;CAC3C,CAAC,CAAC"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Infra Edge TLS Kind
3
+ *
4
+ * Provider-agnostic schema for the TLS policy an edge/CDN uses when it
5
+ * connects to an origin. This governs the edge→origin leg only; the
6
+ * browser→edge leg is certificate and hostname configuration, not this kind.
7
+ *
8
+ * The policy is modeled per hostname rather than per zone because a zone
9
+ * routinely fronts origins with different certificate maturity: a hardened
10
+ * origin needs `verified`, while a legacy origin with a self-signed or
11
+ * expired certificate still answers only under `opportunistic`. A zone-wide
12
+ * value forces the weakest origin's policy onto every hostname.
13
+ *
14
+ * `opportunistic` is a loop hazard, not merely weak: when the edge speaks
15
+ * plaintext to an origin that redirects to HTTPS, a same-zone subrequest
16
+ * bounces between edge and origin until the edge gives up. Any hostname whose
17
+ * origin redirects HTTP to HTTPS must be `verified` or `encrypted`.
18
+ */
19
+ import * as z from 'zod/v4';
20
+ import type { InfraAuthorityFingerprint } from './inventory.kind.ts';
21
+ /**
22
+ * - `verified`: encrypt and require a valid certificate for the origin hostname.
23
+ * - `encrypted`: encrypt without validating the origin certificate.
24
+ * - `opportunistic`: connect in plaintext when the origin allows it.
25
+ * - `off`: never encrypt the edge→origin leg.
26
+ */
27
+ declare const OriginTlsPolicySchema: z.ZodEnum<{
28
+ off: "off";
29
+ verified: "verified";
30
+ encrypted: "encrypted";
31
+ opportunistic: "opportunistic";
32
+ }>;
33
+ export type OriginTlsPolicy = z.infer<typeof OriginTlsPolicySchema>;
34
+ declare const EdgeTlsPolicySchema: z.ZodObject<{
35
+ hostnames: z.ZodArray<z.ZodString>;
36
+ policy: z.ZodEnum<{
37
+ off: "off";
38
+ verified: "verified";
39
+ encrypted: "encrypted";
40
+ opportunistic: "opportunistic";
41
+ }>;
42
+ description: z.ZodOptional<z.ZodString>;
43
+ }, z.core.$strip>;
44
+ export type EdgeTlsPolicy = z.infer<typeof EdgeTlsPolicySchema>;
45
+ export type EdgeTlsPolicyInput = z.input<typeof EdgeTlsPolicySchema>;
46
+ declare const EdgeTlsBaseSchema: z.ZodObject<{
47
+ id: z.ZodString;
48
+ name: z.ZodOptional<z.ZodString>;
49
+ description: z.ZodOptional<z.ZodString>;
50
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ hardware: z.ZodOptional<z.ZodArray<z.ZodString>>;
52
+ enabled: z.ZodOptional<z.ZodBoolean>;
53
+ priority: z.ZodOptional<z.ZodNumber>;
54
+ capabilityId: z.ZodOptional<z.ZodString>;
55
+ requiredContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
56
+ optionalContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
57
+ config: z.ZodOptional<z.ZodUnknown>;
58
+ retention: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
59
+ maxAgeDays: z.ZodOptional<z.ZodNumber>;
60
+ maxEntries: z.ZodOptional<z.ZodNumber>;
61
+ maxBytes: z.ZodOptional<z.ZodNumber>;
62
+ cascadeFrom: z.ZodOptional<z.ZodString>;
63
+ ageField: z.ZodOptional<z.ZodString>;
64
+ reason: z.ZodString;
65
+ enforcedBy: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>]>>;
67
+ kind: z.ZodLiteral<"infra/edge-tls">;
68
+ adapter: z.ZodString;
69
+ adapterConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
70
+ zone: z.ZodOptional<z.ZodString>;
71
+ environment: z.ZodDefault<z.ZodString>;
72
+ policies: z.ZodDefault<z.ZodArray<z.ZodObject<{
73
+ hostnames: z.ZodArray<z.ZodString>;
74
+ policy: z.ZodEnum<{
75
+ off: "off";
76
+ verified: "verified";
77
+ encrypted: "encrypted";
78
+ opportunistic: "opportunistic";
79
+ }>;
80
+ description: z.ZodOptional<z.ZodString>;
81
+ }, z.core.$strip>>>;
82
+ }, z.core.$strip>;
83
+ export type InfraEdgeTlsDescriptor = z.infer<typeof EdgeTlsBaseSchema>;
84
+ export type InfraEdgeTlsDescriptorInput = z.input<typeof EdgeTlsBaseSchema>;
85
+ /** A policy as it exists on the provider, carrying provider-assigned identity. */
86
+ export interface LiveEdgeTlsPolicy {
87
+ providerId: string;
88
+ zone: string;
89
+ hostnames: string[];
90
+ /** Null when the provider reports a value outside this kind's enum. */
91
+ policy: OriginTlsPolicy | null;
92
+ /** Raw provider value, kept so unmapped policies stay visible as evidence. */
93
+ providerValue: string;
94
+ /** Provider-native match condition, kept as evidence of what really matches. */
95
+ expression: string;
96
+ enabled: boolean;
97
+ description?: string;
98
+ /**
99
+ * False when the live shape is outside what this kind writes — a compound
100
+ * rule, or a condition that is not a plain hostname set. Unmanaged policies
101
+ * are reported but never rewritten.
102
+ */
103
+ managed: boolean;
104
+ }
105
+ export interface EdgeTlsZoneDefault {
106
+ zone: string;
107
+ /** Null when the provider reports a value outside this kind's enum. */
108
+ policy: OriginTlsPolicy | null;
109
+ providerValue: string;
110
+ /** False when the provider forbids changing the default on this plan. */
111
+ editable: boolean;
112
+ }
113
+ export interface EdgeTlsSnapshot {
114
+ zone: string;
115
+ default: EdgeTlsZoneDefault;
116
+ policies: LiveEdgeTlsPolicy[];
117
+ /**
118
+ * Configuration a co-tenant owns in the same provider container, which a
119
+ * write must carry forward untouched. Non-zero here means this kind is not
120
+ * the only author, so a full-replacement write would destroy work.
121
+ */
122
+ coTenantRules: number;
123
+ }
124
+ export interface EdgeTlsWriteResult {
125
+ providerId: string;
126
+ created: boolean;
127
+ /** Co-tenant configuration re-sent verbatim by this write. */
128
+ preservedRules: number;
129
+ /** Total entries in the provider container after the write. */
130
+ totalRules: number;
131
+ }
132
+ export interface EdgeTlsDeleteResult {
133
+ /** Policies removed outright because the hostname was their only member. */
134
+ removed: string[];
135
+ /** Policies kept but narrowed because they also covered other hostnames. */
136
+ narrowed: string[];
137
+ preservedRules: number;
138
+ totalRules: number;
139
+ }
140
+ export interface EdgeTlsZoneDefaultChange {
141
+ zone: string;
142
+ from: OriginTlsPolicy | null;
143
+ to: OriginTlsPolicy;
144
+ }
145
+ /**
146
+ * Implementation contract every provider implements.
147
+ *
148
+ * `setPolicy` is idempotent on the hostname set: it updates the live policy
149
+ * for exactly those hostnames rather than adding a second policy that would
150
+ * race it. Providers that store policies in a shared, wholesale-replaced
151
+ * container must merge co-tenant entries forward; the reported
152
+ * `preservedRules` is the evidence that they did.
153
+ */
154
+ export interface EdgeTlsImplementation {
155
+ /** Redacted authority used by the latest provider request. */
156
+ getAuthority?(): Promise<InfraAuthorityFingerprint>;
157
+ /** Live per-hostname policies plus the zone default, optionally narrowed. */
158
+ read(filter?: {
159
+ hostname?: string;
160
+ }): Promise<EdgeTlsSnapshot>;
161
+ setPolicy(policy: EdgeTlsPolicyInput): Promise<EdgeTlsWriteResult>;
162
+ /** Drop one hostname's policy. Absence is not an error. */
163
+ deletePolicy(filter: {
164
+ hostname: string;
165
+ }): Promise<EdgeTlsDeleteResult>;
166
+ /**
167
+ * Change the zone-wide default. `verified` breaks every hostname whose
168
+ * origin does not serve a valid certificate for its own name, including
169
+ * hostnames with no per-hostname policy of their own, so implementations
170
+ * refuse the call until the caller acknowledges that blast radius.
171
+ */
172
+ setZoneDefault(policy: OriginTlsPolicy, options: {
173
+ acknowledgeOriginBreakage: boolean;
174
+ }): Promise<EdgeTlsZoneDefaultChange>;
175
+ /**
176
+ * Diff desired against live for the hostname sets in `desired`. Policies
177
+ * outside those sets are never reported for deletion — this kind is
178
+ * additive by default so it can coexist with co-tenant policies.
179
+ */
180
+ diff(desired: EdgeTlsPolicyInput[]): Promise<{
181
+ create: EdgeTlsPolicy[];
182
+ update: Array<{
183
+ providerId: string;
184
+ from: LiveEdgeTlsPolicy;
185
+ to: EdgeTlsPolicy;
186
+ }>;
187
+ unchanged: LiveEdgeTlsPolicy[];
188
+ }>;
189
+ }
190
+ export declare const edgeTlsKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<EdgeTlsImplementation>;
191
+ export type InfraEdgeTlsKind = InfraEdgeTlsDescriptor;
192
+ export type InfraEdgeTlsKindInput = InfraEdgeTlsDescriptorInput;
193
+ export { EdgeTlsBaseSchema as InfraEdgeTlsDescriptorSchema, EdgeTlsPolicySchema, OriginTlsPolicySchema };
194
+ //# sourceMappingURL=edge-tls.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-tls.kind.d.ts","sourceRoot":"","sources":["../../src/kinds/edge-tls.kind.ts"],"names":[],"mappings":"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"}