@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,138 @@
1
+ /**
2
+ * Kind: infra/compute-source
3
+ *
4
+ * One registered source we can lease a machine, container or sandbox from.
5
+ *
6
+ * Forge CI and build jobs should not own compute. They state what a job needs
7
+ * and the fleet leases a host; every place a host can come from — a Cloudflare
8
+ * sandbox, a DigitalOcean droplet, an AWS instance, or a machine the user
9
+ * brought themselves — is one descriptor of this kind. That is what keeps
10
+ * "bring your own provider" the same code path as ours rather than a second
11
+ * one, and it is why selection can stay a single policy instead of a branch
12
+ * per caller.
13
+ *
14
+ * Every field states what the source can ACTUALLY provide, mirroring
15
+ * `ci/executor`. A descriptor that overstates itself is how a
16
+ * `runsOn: windows` job quietly runs on linux, so selection filters on these
17
+ * and refuses rather than substitutes.
18
+ *
19
+ * Not to be confused with `infra/inventory`, which is read-only enumeration of
20
+ * existing provider resources. This kind is about where new compute comes from.
21
+ */
22
+ import * as z from 'zod/v4';
23
+ import type { RuntimeDescriptor } from '@vibesdotdev/kernel/schemas/descriptor';
24
+ import type { KindContext } from '@vibesdotdev/kernel/schemas/kind';
25
+ export declare const ComputeSourceOsSchema: z.ZodEnum<{
26
+ linux: "linux";
27
+ macos: "macos";
28
+ windows: "windows";
29
+ }>;
30
+ export type ComputeSourceOs = z.infer<typeof ComputeSourceOsSchema>;
31
+ export declare const ComputeSourceArchSchema: z.ZodEnum<{
32
+ x64: "x64";
33
+ arm64: "arm64";
34
+ }>;
35
+ export type ComputeSourceArch = z.infer<typeof ComputeSourceArchSchema>;
36
+ /**
37
+ * Who owns the hardware, which decides who pays for it.
38
+ *
39
+ * `vibes` — our inventory, billed to the requesting account in credits.
40
+ * `byo` — the user's own provider. We facilitate; we do not bill compute.
41
+ * Mirrors the `hardware: 'consumer'` path the billing rating engine
42
+ * already short-circuits to zero credits.
43
+ */
44
+ export declare const ComputeSourceOwnerScopeSchema: z.ZodEnum<{
45
+ vibes: "vibes";
46
+ byo: "byo";
47
+ }>;
48
+ export type ComputeSourceOwnerScope = z.infer<typeof ComputeSourceOwnerScopeSchema>;
49
+ export declare const ComputeSourceCapabilitiesSchema: z.ZodObject<{
50
+ os: z.ZodArray<z.ZodEnum<{
51
+ linux: "linux";
52
+ macos: "macos";
53
+ windows: "windows";
54
+ }>>;
55
+ arch: z.ZodArray<z.ZodEnum<{
56
+ x64: "x64";
57
+ arm64: "arm64";
58
+ }>>;
59
+ labels: z.ZodDefault<z.ZodArray<z.ZodString>>;
60
+ }, z.core.$strip>;
61
+ export type ComputeSourceCapabilities = z.infer<typeof ComputeSourceCapabilitiesSchema>;
62
+ export declare const ComputeSourceDescriptorSchema: z.ZodObject<{
63
+ id: z.ZodString;
64
+ name: z.ZodOptional<z.ZodString>;
65
+ description: z.ZodOptional<z.ZodString>;
66
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
67
+ hardware: z.ZodOptional<z.ZodArray<z.ZodString>>;
68
+ enabled: z.ZodOptional<z.ZodBoolean>;
69
+ priority: z.ZodOptional<z.ZodNumber>;
70
+ capabilityId: z.ZodOptional<z.ZodString>;
71
+ requiredContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
72
+ optionalContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
73
+ config: z.ZodOptional<z.ZodUnknown>;
74
+ retention: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
75
+ maxAgeDays: z.ZodOptional<z.ZodNumber>;
76
+ maxEntries: z.ZodOptional<z.ZodNumber>;
77
+ maxBytes: z.ZodOptional<z.ZodNumber>;
78
+ cascadeFrom: z.ZodOptional<z.ZodString>;
79
+ ageField: z.ZodOptional<z.ZodString>;
80
+ reason: z.ZodString;
81
+ enforcedBy: z.ZodOptional<z.ZodString>;
82
+ }, z.core.$strip>]>>;
83
+ kind: z.ZodLiteral<"infra/compute-source">;
84
+ provides: z.ZodObject<{
85
+ os: z.ZodArray<z.ZodEnum<{
86
+ linux: "linux";
87
+ macos: "macos";
88
+ windows: "windows";
89
+ }>>;
90
+ arch: z.ZodArray<z.ZodEnum<{
91
+ x64: "x64";
92
+ arm64: "arm64";
93
+ }>>;
94
+ labels: z.ZodDefault<z.ZodArray<z.ZodString>>;
95
+ }, z.core.$strip>;
96
+ ephemeral: z.ZodBoolean;
97
+ cost: z.ZodObject<{
98
+ usdPerSecond: z.ZodNumber;
99
+ usdPerSecondCpuActive: z.ZodOptional<z.ZodNumber>;
100
+ initialUsd: z.ZodOptional<z.ZodNumber>;
101
+ minimumUsd: z.ZodOptional<z.ZodNumber>;
102
+ source: z.ZodEnum<{
103
+ published: "published";
104
+ manual: "manual";
105
+ measured: "measured";
106
+ heuristic: "heuristic";
107
+ }>;
108
+ confidence: z.ZodEnum<{
109
+ low: "low";
110
+ medium: "medium";
111
+ high: "high";
112
+ }>;
113
+ effectiveAt: z.ZodString;
114
+ note: z.ZodOptional<z.ZodString>;
115
+ }, z.core.$strip>;
116
+ ownerScope: z.ZodDefault<z.ZodEnum<{
117
+ vibes: "vibes";
118
+ byo: "byo";
119
+ }>>;
120
+ owner: z.ZodOptional<z.ZodObject<{
121
+ type: z.ZodString;
122
+ id: z.ZodString;
123
+ }, z.core.$strip>>;
124
+ warmPool: z.ZodDefault<z.ZodBoolean>;
125
+ maxLeaseSeconds: z.ZodNumber;
126
+ supportsCancellation: z.ZodDefault<z.ZodBoolean>;
127
+ }, z.core.$strip>;
128
+ export type ComputeSourceDescriptor = z.infer<typeof ComputeSourceDescriptorSchema>;
129
+ declare class DefaultComputeSourceImplementation {
130
+ readonly descriptor: RuntimeDescriptor;
131
+ readonly context: KindContext;
132
+ /** The descriptor as this kind's schema reads it. */
133
+ readonly config: ComputeSourceDescriptor;
134
+ constructor(descriptor: RuntimeDescriptor, context: KindContext);
135
+ }
136
+ export declare const computeSourceKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<DefaultComputeSourceImplementation>;
137
+ export {};
138
+ //# sourceMappingURL=compute-source.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-source.kind.d.ts","sourceRoot":"","sources":["../../src/kinds/compute-source.kind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;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;AAQpE,eAAO,MAAM,qBAAqB;;;;EAAwC,CAAC;AAC3E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,uBAAuB;;;EAA2B,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B;;;EAA2B,CAAC;AACtE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,eAAO,MAAM,+BAA+B;;;;;;;;;;;iBAK1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmFxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,cAAM,kCAAkC;aAItB,UAAU,EAAE,iBAAiB;aAC7B,OAAO,EAAE,WAAW;IAJrC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;gBAExB,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,WAAW;CAKrC;AAED,eAAO,MAAM,iBAAiB,+FAQ5B,CAAC"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Kind: infra/compute-source
3
+ *
4
+ * One registered source we can lease a machine, container or sandbox from.
5
+ *
6
+ * Forge CI and build jobs should not own compute. They state what a job needs
7
+ * and the fleet leases a host; every place a host can come from — a Cloudflare
8
+ * sandbox, a DigitalOcean droplet, an AWS instance, or a machine the user
9
+ * brought themselves — is one descriptor of this kind. That is what keeps
10
+ * "bring your own provider" the same code path as ours rather than a second
11
+ * one, and it is why selection can stay a single policy instead of a branch
12
+ * per caller.
13
+ *
14
+ * Every field states what the source can ACTUALLY provide, mirroring
15
+ * `ci/executor`. A descriptor that overstates itself is how a
16
+ * `runsOn: windows` job quietly runs on linux, so selection filters on these
17
+ * and refuses rather than substitutes.
18
+ *
19
+ * Not to be confused with `infra/inventory`, which is read-only enumeration of
20
+ * existing provider resources. This kind is about where new compute comes from.
21
+ */
22
+ import * as z from 'zod/v4';
23
+ import { createRuntimeKind } from '@vibesdotdev/kernel/factory/kind';
24
+ import { RuntimeDescriptorSchema } from '@vibesdotdev/kernel/schemas/descriptor';
25
+ import { readKindDescriptor } from "./read-descriptor.js";
26
+ import { costBasisConfidenceSchema, costBasisSourceSchema } from '@vibesdotdev/shared/billing/cost-basis';
27
+ import { INFRA_DISCOVERY_PATTERNS } from "./discovery.js";
28
+ export const ComputeSourceOsSchema = z.enum(['linux', 'macos', 'windows']);
29
+ export const ComputeSourceArchSchema = z.enum(['x64', 'arm64']);
30
+ /**
31
+ * Who owns the hardware, which decides who pays for it.
32
+ *
33
+ * `vibes` — our inventory, billed to the requesting account in credits.
34
+ * `byo` — the user's own provider. We facilitate; we do not bill compute.
35
+ * Mirrors the `hardware: 'consumer'` path the billing rating engine
36
+ * already short-circuits to zero credits.
37
+ */
38
+ export const ComputeSourceOwnerScopeSchema = z.enum(['vibes', 'byo']);
39
+ export const ComputeSourceCapabilitiesSchema = z.object({
40
+ os: z.array(ComputeSourceOsSchema).min(1),
41
+ arch: z.array(ComputeSourceArchSchema).min(1),
42
+ /** Extra capabilities a job may demand, e.g. `gpu`, `docker`, `nested-virt`. */
43
+ labels: z.array(z.string().min(1)).default([])
44
+ });
45
+ export const ComputeSourceDescriptorSchema = RuntimeDescriptorSchema.extend({
46
+ kind: z.literal('infra/compute-source'),
47
+ /** What this source can actually provide. Selection filters on exactly this. */
48
+ provides: ComputeSourceCapabilitiesSchema,
49
+ /**
50
+ * Whether a lease is destroyed after a single job.
51
+ *
52
+ * Deliberately has NO default. Untrusted refs (fork PRs) may only land on
53
+ * ephemeral sources, so this field decides whether a source can run code
54
+ * nobody has reviewed. A default would silently answer that question for a
55
+ * descriptor author who never considered it; requiring it makes the author
56
+ * say so. Guessing either way is wrong — `true` wrongly admits a persistent
57
+ * host, `false` wrongly excludes a genuinely disposable one.
58
+ */
59
+ ephemeral: z.boolean(),
60
+ /**
61
+ * What this source costs us, quoted from the provider's own price list
62
+ * rather than assigned by hand.
63
+ *
64
+ * An earlier draft ranked on an integer `costTier` somebody picked. That is
65
+ * a guess dressed as a fact, and it drifts the moment a provider changes
66
+ * price. A real rate ranks correctly on its own and is the same number the
67
+ * rating engine bills from, so selection and the invoice can never disagree
68
+ * about which source was cheaper.
69
+ *
70
+ * The field set is dictated by how the two providers actually bill, learned
71
+ * by reading their price lists rather than assumed:
72
+ *
73
+ * * `usdPerSecond` is charged for every second of the lease. On a
74
+ * Cloudflare container that is the PROVISIONED memory and disk, which
75
+ * bill whether or not the job is doing anything.
76
+ * * `usdPerSecondCpuActive` is charged ON TOP, but only while the vCPUs
77
+ * are actually busy. Cloudflare priced CPU on active usage in November
78
+ * 2025; before that it was provisioned like memory. A source that bills
79
+ * CPU as part of a flat rate — a DigitalOcean droplet — omits this.
80
+ * * `initialUsd` is a genuine one-time additive charge for getting the
81
+ * machine at all. Absent means there is none, not that nobody filled it
82
+ * in.
83
+ * * `minimumUsd` is a FLOOR on the whole lease, not a fee added to it.
84
+ * DigitalOcean bills per second but never less than 60 seconds or $0.01,
85
+ * whichever is higher. Modelling that as `initialUsd` would have
86
+ * overcharged every lease by the floor, because setup is additive and a
87
+ * minimum is not. The distinction is the reason both fields exist.
88
+ *
89
+ * A bring-your-own source sets `usdPerSecond: 0`. It costs us nothing
90
+ * because it is not our hardware.
91
+ */
92
+ cost: z.object({
93
+ usdPerSecond: z.number().nonnegative(),
94
+ usdPerSecondCpuActive: z.number().nonnegative().optional(),
95
+ initialUsd: z.number().nonnegative().optional(),
96
+ minimumUsd: z.number().nonnegative().optional(),
97
+ /**
98
+ * Where this quote came from and how much to trust it. Reuses the
99
+ * billing vocabulary the AI model descriptors already quote prices in,
100
+ * so "published" means the same thing about a droplet as about a token.
101
+ */
102
+ source: costBasisSourceSchema,
103
+ confidence: costBasisConfidenceSchema,
104
+ /** ISO-8601 instant this quote was read from the provider. */
105
+ effectiveAt: z.string().min(1),
106
+ /** How the number was derived, for whoever has to re-check it later. */
107
+ note: z.string().min(1).optional()
108
+ }),
109
+ ownerScope: ComputeSourceOwnerScopeSchema.default('vibes'),
110
+ /**
111
+ * Billing subject for a `byo` source. Required when `ownerScope` is `byo`:
112
+ * a bring-your-own machine must only be selectable by the scope that
113
+ * brought it, never by another tenant's run.
114
+ */
115
+ owner: z
116
+ .object({ type: z.string().min(1), id: z.string().min(1) })
117
+ .optional(),
118
+ /** Whether this source can hold idle capacity, making a lease warm. */
119
+ warmPool: z.boolean().default(false),
120
+ /** Longest single lease this source will grant, in seconds. */
121
+ maxLeaseSeconds: z.number().int().positive(),
122
+ /** Whether an in-flight lease can be torn down. */
123
+ supportsCancellation: z.boolean().default(false)
124
+ }).refine((d) => d.ownerScope !== 'byo' || d.owner !== undefined, {
125
+ message: "a 'byo' compute source must declare its owner, otherwise it could be selected by another tenant's run",
126
+ path: ['owner']
127
+ });
128
+ class DefaultComputeSourceImplementation {
129
+ descriptor;
130
+ context;
131
+ /** The descriptor as this kind's schema reads it. */
132
+ config;
133
+ constructor(descriptor, context) {
134
+ this.descriptor = descriptor;
135
+ this.context = context;
136
+ this.config = readKindDescriptor(ComputeSourceDescriptorSchema, descriptor);
137
+ }
138
+ }
139
+ export const computeSourceKind = createRuntimeKind({
140
+ id: 'infra/compute-source',
141
+ descriptorSchema: ComputeSourceDescriptorSchema,
142
+ defaultImplementation: DefaultComputeSourceImplementation,
143
+ discoveryPatterns: INFRA_DISCOVERY_PATTERNS
144
+ });
145
+ //# sourceMappingURL=compute-source.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-source.kind.js","sourceRoot":"","sources":["../../src/kinds/compute-source.kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The compute sources we actually own, priced from the providers' own lists.
3
+ *
4
+ * These are data, like `training/executor`'s reference descriptors. They exist
5
+ * so `infra/compute-source` stops being a schema with no rows: selection can
6
+ * only be honest about which machine is cheaper if somebody has written down
7
+ * what the machines cost.
8
+ *
9
+ * Every rate here was read from the provider on 2026-09-08 rather than
10
+ * estimated, and the arithmetic is left in the source so the next person can
11
+ * re-derive it instead of trusting a decimal. Deriving DigitalOcean's rate by
12
+ * hand as `$24/month ÷ 730h ÷ 3600s` gives $0.00000913/s, which is 8% under
13
+ * what DigitalOcean actually charges — the monthly price is a cap, not the
14
+ * basis for the hourly rate. That is exactly the kind of quiet error a
15
+ * hand-typed number produces, and the reason `source` and `effectiveAt` are
16
+ * required fields.
17
+ *
18
+ * Capability claims are deliberately conservative. `labels` is empty on both:
19
+ * an overstated capability is how a job that demands `docker` silently lands
20
+ * somewhere without it, and the kind refuses rather than substitutes. Add a
21
+ * label when someone has verified it, not because it is probably true.
22
+ */
23
+ import type { ComputeSourceDescriptor } from './compute-source.kind.ts';
24
+ /**
25
+ * Cloudflare Containers `standard-4` — what `forge-ci-worker` runs on today
26
+ * (`wrangler.jsonc`, `instance_type: "standard-4"`): 4 vCPU, 12 GiB memory,
27
+ * 20 GB disk.
28
+ *
29
+ * Cloudflare bills memory and disk on PROVISIONED resources and CPU on ACTIVE
30
+ * usage only (a November 2025 pricing change), so the two rates are split.
31
+ * A CI job is CPU-bound almost by definition, so its real cost sits near
32
+ * `usdPerSecond + usdPerSecondCpuActive`; an idle container costs the floor.
33
+ */
34
+ export declare const cfContainerStandard4: ComputeSourceDescriptor;
35
+ /**
36
+ * DigitalOcean droplet `s-2vcpu-4gb`: 2 vCPU, 4 GiB memory, 80 GB disk.
37
+ *
38
+ * Billed per second with a floor of 60 seconds or $0.01, whichever is higher.
39
+ * At this size 60 seconds is $0.000595, so $0.01 is always the binding floor —
40
+ * which means a 10-second lease and a 16-minute lease cost the same.
41
+ */
42
+ export declare const doDropletS2vcpu4gb: ComputeSourceDescriptor;
43
+ /** Every compute source we own, cheapest-first ordering left to the selector. */
44
+ export declare const vibesComputeSources: readonly ComputeSourceDescriptor[];
45
+ //# sourceMappingURL=compute-sources.descriptors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-sources.descriptors.d.ts","sourceRoot":"","sources":["../../src/kinds/compute-sources.descriptors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAexE;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,uBA4BlC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,uBA6BhC,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,EAAE,SAAS,uBAAuB,EAGjE,CAAC"}
@@ -0,0 +1,93 @@
1
+ /** When these quotes were read from the providers. */
2
+ const QUOTED_AT = '2026-09-08T00:00:00.000Z';
3
+ /**
4
+ * The Forge job contract caps a whole job at 7 days
5
+ * (`MAX_FORGE_ACTIONS_JOB_TIMEOUT_MINUTES`), and neither source imposes a
6
+ * shorter limit of its own that we have measured. This is that contract
7
+ * ceiling, not a provider limit — if a provider turns out to cap a lease
8
+ * sooner, the real number belongs here and selection will start refusing jobs
9
+ * that ask for longer, which is the correct outcome.
10
+ */
11
+ const FORGE_JOB_CONTRACT_CEILING_SECONDS = 7 * 24 * 60 * 60;
12
+ /**
13
+ * Cloudflare Containers `standard-4` — what `forge-ci-worker` runs on today
14
+ * (`wrangler.jsonc`, `instance_type: "standard-4"`): 4 vCPU, 12 GiB memory,
15
+ * 20 GB disk.
16
+ *
17
+ * Cloudflare bills memory and disk on PROVISIONED resources and CPU on ACTIVE
18
+ * usage only (a November 2025 pricing change), so the two rates are split.
19
+ * A CI job is CPU-bound almost by definition, so its real cost sits near
20
+ * `usdPerSecond + usdPerSecondCpuActive`; an idle container costs the floor.
21
+ */
22
+ export const cfContainerStandard4 = {
23
+ kind: 'infra/compute-source',
24
+ id: 'cf-container-standard-4',
25
+ name: 'Cloudflare Containers standard-4',
26
+ description: '4 vCPU / 12 GiB / 20 GB Cloudflare container, the current Forge CI executor',
27
+ provides: { os: ['linux'], arch: ['x64'], labels: [] },
28
+ ephemeral: true,
29
+ cost: {
30
+ // Provisioned floor: memory + disk bill for the whole lease.
31
+ // 12 GiB × $0.0000025/GiB-s + 20 GB × $0.00000007/GB-s
32
+ usdPerSecond: 12 * 0.0000025 + 20 * 0.00000007,
33
+ // Charged on top, only while the vCPUs are busy.
34
+ // 4 vCPU × $0.000020/vCPU-s
35
+ usdPerSecondCpuActive: 4 * 0.00002,
36
+ source: 'published',
37
+ confidence: 'high',
38
+ effectiveAt: QUOTED_AT,
39
+ note: 'developers.cloudflare.com/containers/pricing, read 2026-09-08. Excludes the $5/mo Workers Paid plan and the included monthly allotment (25 GiB-hours memory, 375 vCPU-minutes, 200 GB-hours disk), which are account-level and not attributable to one lease.'
40
+ },
41
+ ownerScope: 'vibes',
42
+ // Conservative: a Durable Object container sleeps on inactivity rather than
43
+ // holding reserved warm capacity we can hand to the next job.
44
+ warmPool: false,
45
+ maxLeaseSeconds: FORGE_JOB_CONTRACT_CEILING_SECONDS,
46
+ // Left false pending someone verifying an in-flight container can actually
47
+ // be torn down mid-job. False under-sells the source; a wrong true would
48
+ // have the allocator promise a cancellation it cannot perform.
49
+ supportsCancellation: false
50
+ };
51
+ /**
52
+ * DigitalOcean droplet `s-2vcpu-4gb`: 2 vCPU, 4 GiB memory, 80 GB disk.
53
+ *
54
+ * Billed per second with a floor of 60 seconds or $0.01, whichever is higher.
55
+ * At this size 60 seconds is $0.000595, so $0.01 is always the binding floor —
56
+ * which means a 10-second lease and a 16-minute lease cost the same.
57
+ */
58
+ export const doDropletS2vcpu4gb = {
59
+ kind: 'infra/compute-source',
60
+ id: 'do-droplet-s-2vcpu-4gb',
61
+ name: 'DigitalOcean droplet s-2vcpu-4gb',
62
+ description: '2 vCPU / 4 GiB / 80 GB DigitalOcean droplet',
63
+ // No arm64: the account's own /v2/sizes listing returns no arm slugs at all,
64
+ // so claiming arm64 here would be a capability we cannot provision.
65
+ provides: { os: ['linux'], arch: ['x64'], labels: [] },
66
+ // A fleet host outlives the job it was leased for, which is precisely why
67
+ // it must not be handed unreviewed code.
68
+ ephemeral: false,
69
+ cost: {
70
+ // DigitalOcean's own published hourly rate for this slug, per second.
71
+ // Read live from GET /v2/sizes rather than divided out of the monthly price.
72
+ usdPerSecond: 0.03571 / 3600,
73
+ // "billed per second with a minimum charge of 60 seconds or $0.01,
74
+ // whichever is higher" — a floor on the lease, never added to it.
75
+ minimumUsd: 0.01,
76
+ source: 'published',
77
+ confidence: 'high',
78
+ effectiveAt: QUOTED_AT,
79
+ note: 'DigitalOcean GET /v2/sizes price_hourly=0.03571 for s-2vcpu-4gb, read 2026-09-08; minimum charge from docs.digitalocean.com/products/droplets/details/pricing. Bundled-plan usage is capped at 672h/month, which caps a long-lived host but not a single lease.'
80
+ },
81
+ ownerScope: 'vibes',
82
+ // A persistent host is reusable capacity by construction.
83
+ warmPool: true,
84
+ maxLeaseSeconds: FORGE_JOB_CONTRACT_CEILING_SECONDS,
85
+ // `vibes fleet destroy` exists and does this.
86
+ supportsCancellation: true
87
+ };
88
+ /** Every compute source we own, cheapest-first ordering left to the selector. */
89
+ export const vibesComputeSources = [
90
+ cfContainerStandard4,
91
+ doDropletS2vcpu4gb
92
+ ];
93
+ //# sourceMappingURL=compute-sources.descriptors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-sources.descriptors.js","sourceRoot":"","sources":["../../src/kinds/compute-sources.descriptors.ts"],"names":[],"mappings":"AAwBA,sDAAsD;AACtD,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,kCAAkC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE5D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA4B;IAC5D,IAAI,EAAE,sBAAsB;IAC5B,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,kCAAkC;IACxC,WAAW,EAAE,6EAA6E;IAC1F,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IACtD,SAAS,EAAE,IAAI;IACf,IAAI,EAAE;QACL,6DAA6D;QAC7D,2DAA2D;QAC3D,YAAY,EAAE,EAAE,GAAG,SAAS,GAAG,EAAE,GAAG,UAAU;QAC9C,iDAAiD;QACjD,8BAA8B;QAC9B,qBAAqB,EAAE,CAAC,GAAG,OAAO;QAClC,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,+PAA+P;KACrQ;IACD,UAAU,EAAE,OAAO;IACnB,4EAA4E;IAC5E,8DAA8D;IAC9D,QAAQ,EAAE,KAAK;IACf,eAAe,EAAE,kCAAkC;IACnD,2EAA2E;IAC3E,yEAAyE;IACzE,+DAA+D;IAC/D,oBAAoB,EAAE,KAAK;CAC3B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA4B;IAC1D,IAAI,EAAE,sBAAsB;IAC5B,EAAE,EAAE,wBAAwB;IAC5B,IAAI,EAAE,kCAAkC;IACxC,WAAW,EAAE,6CAA6C;IAC1D,6EAA6E;IAC7E,oEAAoE;IACpE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IACtD,0EAA0E;IAC1E,yCAAyC;IACzC,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE;QACL,sEAAsE;QACtE,6EAA6E;QAC7E,YAAY,EAAE,OAAO,GAAG,IAAI;QAC5B,mEAAmE;QACnE,kEAAkE;QAClE,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,iQAAiQ;KACvQ;IACD,UAAU,EAAE,OAAO;IACnB,0DAA0D;IAC1D,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,kCAAkC;IACnD,8CAA8C;IAC9C,oBAAoB,EAAE,IAAI;CAC1B,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAuC;IACtE,oBAAoB;IACpB,kBAAkB;CAClB,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Kind: infra/container-registry
3
+ *
4
+ * Provider-neutral container image registry descriptor.
5
+ */
6
+ import * as z from 'zod/v4';
7
+ import type { RuntimeDescriptor } from '@vibesdotdev/kernel/schemas/descriptor';
8
+ import type { KindContext } from '@vibesdotdev/kernel/schemas/kind';
9
+ /**
10
+ * Adapter-specific configuration: the adapter id plus its own fields. Each
11
+ * adapter package defines and parses its own config schema (DigitalOcean's
12
+ * container registry config lives in
13
+ * `@vibesdotdev/integrations-digitalocean`); this kind names no provider,
14
+ * so a config for any adapter — including one contributed by a user
15
+ * plugin — parses here, and the adapter validates its own grammar.
16
+ */
17
+ export declare const ContainerRegistryConfigSchema: z.ZodObject<{
18
+ adapter: z.ZodString;
19
+ }, z.core.$loose>;
20
+ export type ContainerRegistryConfig = z.infer<typeof ContainerRegistryConfigSchema>;
21
+ export declare const ContainerRegistryDescriptorSchema: z.ZodObject<{
22
+ id: z.ZodString;
23
+ name: z.ZodOptional<z.ZodString>;
24
+ description: z.ZodOptional<z.ZodString>;
25
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ hardware: z.ZodOptional<z.ZodArray<z.ZodString>>;
27
+ enabled: z.ZodOptional<z.ZodBoolean>;
28
+ priority: z.ZodOptional<z.ZodNumber>;
29
+ capabilityId: z.ZodOptional<z.ZodString>;
30
+ requiredContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
+ optionalContext: z.ZodOptional<z.ZodArray<z.ZodString>>;
32
+ retention: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
33
+ maxAgeDays: z.ZodOptional<z.ZodNumber>;
34
+ maxEntries: z.ZodOptional<z.ZodNumber>;
35
+ maxBytes: z.ZodOptional<z.ZodNumber>;
36
+ cascadeFrom: z.ZodOptional<z.ZodString>;
37
+ ageField: z.ZodOptional<z.ZodString>;
38
+ reason: z.ZodString;
39
+ enforcedBy: z.ZodOptional<z.ZodString>;
40
+ }, z.core.$strip>]>>;
41
+ kind: z.ZodLiteral<"infra/container-registry">;
42
+ region: z.ZodOptional<z.ZodString>;
43
+ tier: z.ZodOptional<z.ZodEnum<{
44
+ starter: "starter";
45
+ basic: "basic";
46
+ professional: "professional";
47
+ }>>;
48
+ config: z.ZodOptional<z.ZodObject<{
49
+ adapter: z.ZodString;
50
+ }, z.core.$loose>>;
51
+ }, z.core.$strip>;
52
+ export type ContainerRegistryDescriptor = z.infer<typeof ContainerRegistryDescriptorSchema>;
53
+ declare class DefaultContainerRegistryImplementation {
54
+ readonly descriptor: RuntimeDescriptor;
55
+ readonly context: KindContext;
56
+ /** The descriptor as this kind's schema reads it. */
57
+ readonly config: ContainerRegistryDescriptor;
58
+ constructor(descriptor: RuntimeDescriptor, context: KindContext);
59
+ }
60
+ export declare const containerRegistryKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<DefaultContainerRegistryImplementation>;
61
+ export {};
62
+ //# sourceMappingURL=container-registry.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-registry.kind.d.ts","sourceRoot":"","sources":["../../src/kinds/container-registry.kind.ts"],"names":[],"mappings":"AAAA;;;;GAIG;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;AAUpE;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B;;iBAExC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAE5C,CAAC;AAEH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F,cAAM,sCAAsC;aAI1B,UAAU,EAAE,iBAAiB;aAC7B,OAAO,EAAE,WAAW;IAJrC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;gBAE5B,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,WAAW;CAKrC;AAED,eAAO,MAAM,qBAAqB,mGAQhC,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Kind: infra/container-registry
3
+ *
4
+ * Provider-neutral container image registry descriptor.
5
+ */
6
+ import * as z from 'zod/v4';
7
+ import { createRuntimeKind } from '@vibesdotdev/kernel/factory/kind';
8
+ import { RuntimeDescriptorSchema } from '@vibesdotdev/kernel/schemas/descriptor';
9
+ import { readKindDescriptor } from "./read-descriptor.js";
10
+ import { INFRA_DISCOVERY_PATTERNS } from "./discovery.js";
11
+ const ContainerRegistryBaseSchema = RuntimeDescriptorSchema.extend({
12
+ kind: z.literal('infra/container-registry'),
13
+ region: z.string().min(1).optional(),
14
+ tier: z.enum(['starter', 'basic', 'professional']).optional()
15
+ });
16
+ /**
17
+ * Adapter-specific configuration: the adapter id plus its own fields. Each
18
+ * adapter package defines and parses its own config schema (DigitalOcean's
19
+ * container registry config lives in
20
+ * `@vibesdotdev/integrations-digitalocean`); this kind names no provider,
21
+ * so a config for any adapter — including one contributed by a user
22
+ * plugin — parses here, and the adapter validates its own grammar.
23
+ */
24
+ export const ContainerRegistryConfigSchema = z.looseObject({
25
+ adapter: z.string().min(1)
26
+ });
27
+ export const ContainerRegistryDescriptorSchema = ContainerRegistryBaseSchema.extend({
28
+ config: ContainerRegistryConfigSchema.optional()
29
+ });
30
+ class DefaultContainerRegistryImplementation {
31
+ descriptor;
32
+ context;
33
+ /** The descriptor as this kind's schema reads it. */
34
+ config;
35
+ constructor(descriptor, context) {
36
+ this.descriptor = descriptor;
37
+ this.context = context;
38
+ this.config = readKindDescriptor(ContainerRegistryDescriptorSchema, descriptor);
39
+ }
40
+ }
41
+ export const containerRegistryKind = createRuntimeKind({
42
+ id: 'infra/container-registry',
43
+ descriptorSchema: ContainerRegistryDescriptorSchema,
44
+ defaultImplementation: DefaultContainerRegistryImplementation,
45
+ discoveryPatterns: INFRA_DISCOVERY_PATTERNS
46
+ });
47
+ //# sourceMappingURL=container-registry.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-registry.kind.js","sourceRoot":"","sources":["../../src/kinds/container-registry.kind.ts"],"names":[],"mappings":"AAAA;;;;GAIG;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,2BAA2B,GAAG,uBAAuB,CAAC,MAAM,CAAC;IAClE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,WAAW,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iCAAiC,GAAG,2BAA2B,CAAC,MAAM,CAAC;IACnF,MAAM,EAAE,6BAA6B,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAC;AAIH,MAAM,sCAAsC;IAI1B;IACA;IAJjB,qDAAqD;IAC5C,MAAM,CAA8B;IAC7C,YACiB,UAA6B,EAC7B,OAAoB;QADpB,eAAU,GAAV,UAAU,CAAmB;QAC7B,YAAO,GAAP,OAAO,CAAa;QAEpC,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC,iCAAiC,EAAE,UAAU,CAAC,CAAC;IACjF,CAAC;CAED;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAGpD;IACD,EAAE,EAAE,0BAA0B;IAC9B,gBAAgB,EAAE,iCAAiC;IACnD,qBAAqB,EAAE,sCAAsC;IAC7D,iBAAiB,EAAE,wBAAwB;CAC3C,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type DatabaseMigratorImplementation } from '../schemas/database-migration.ts';
2
+ export declare const DATABASE_MIGRATOR_KIND = "infra/database-migrator";
3
+ /** Schema-only: every engine registers its own implementation. */
4
+ /** Engines are constructed with the resolving runtime itself: they reach its secrets, execution and filesystem. */
5
+ export declare const databaseMigratorKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<DatabaseMigratorImplementation>;
6
+ //# sourceMappingURL=database-migrator.kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-migrator.kind.d.ts","sourceRoot":"","sources":["../../src/kinds/database-migrator.kind.ts"],"names":[],"mappings":"AAoBA,OAAO,EAGN,KAAK,8BAA8B,EACnC,MAAM,kCAAkC,CAAC;AAE1C,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE,kEAAkE;AAClE,mHAAmH;AACnH,eAAO,MAAM,oBAAoB,2FAI/B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Kind: infra/database-migrator
3
+ *
4
+ * Applies an app's schema migrations to the databases it declares. One
5
+ * implementation per database engine and provider (Cloudflare D1 through
6
+ * wrangler, Postgres, Turso, ...) registers against this kind; the deploy
7
+ * driver resolves every registered migrator at call time and asks each which
8
+ * of the app's databases it serves. Nothing here names a provider.
9
+ *
10
+ * The migration files come from a migration format (`storage/migration-format`,
11
+ * e.g. a drizzle journal), named by id on each target. The driver owns the
12
+ * ledger semantics every engine shares: pending = journal minus ledger, apply
13
+ * one file then record it, never record a failure, adopt exact receipts from an
14
+ * older ledger by intersection with the current journal. The engine owns how
15
+ * statements run and how its ledger is spelled. Contracts: `../schemas/database-migration.ts`.
16
+ */
17
+ import { createRuntimeKind } from '@vibesdotdev/kernel/factory/kind';
18
+ import { INFRA_DISCOVERY_PATTERNS } from "./discovery.js";
19
+ import { DatabaseMigratorDescriptorSchema } from "../schemas/database-migration.js";
20
+ export const DATABASE_MIGRATOR_KIND = 'infra/database-migrator';
21
+ /** Schema-only: every engine registers its own implementation. */
22
+ /** Engines are constructed with the resolving runtime itself: they reach its secrets, execution and filesystem. */
23
+ export const databaseMigratorKind = createRuntimeKind({
24
+ id: DATABASE_MIGRATOR_KIND,
25
+ descriptorSchema: DatabaseMigratorDescriptorSchema,
26
+ discoveryPatterns: INFRA_DISCOVERY_PATTERNS
27
+ });
28
+ //# sourceMappingURL=database-migrator.kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-migrator.kind.js","sourceRoot":"","sources":["../../src/kinds/database-migrator.kind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACN,gCAAgC,EAGhC,MAAM,kCAAkC,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAEhE,kEAAkE;AAClE,mHAAmH;AACnH,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAwF;IAC5I,EAAE,EAAE,sBAAsB;IAC1B,gBAAgB,EAAE,gCAAgC;IAClD,iBAAiB,EAAE,wBAAwB;CAC3C,CAAC,CAAC"}