@vibesdotdev/config 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. package/README.md +85 -0
  2. package/SPEC.md +71 -0
  3. package/dist/adapters/cli/flags.d.ts +75 -0
  4. package/dist/adapters/cli/flags.d.ts.map +1 -0
  5. package/dist/adapters/cli/flags.js +221 -0
  6. package/dist/adapters/cli/flags.js.map +1 -0
  7. package/dist/adapters/cli/index.d.ts +12 -0
  8. package/dist/adapters/cli/index.d.ts.map +1 -0
  9. package/dist/adapters/cli/index.js +9 -0
  10. package/dist/adapters/cli/index.js.map +1 -0
  11. package/dist/adapters/cli/mappings.d.ts +17 -0
  12. package/dist/adapters/cli/mappings.d.ts.map +1 -0
  13. package/dist/adapters/cli/mappings.js +32 -0
  14. package/dist/adapters/cli/mappings.js.map +1 -0
  15. package/dist/adapters/cli/prompts.d.ts +28 -0
  16. package/dist/adapters/cli/prompts.d.ts.map +1 -0
  17. package/dist/adapters/cli/prompts.js +55 -0
  18. package/dist/adapters/cli/prompts.js.map +1 -0
  19. package/dist/adapters/cli/schemas/flags.schema.d.ts +8 -0
  20. package/dist/adapters/cli/schemas/flags.schema.d.ts.map +1 -0
  21. package/dist/adapters/cli/schemas/flags.schema.js +2 -0
  22. package/dist/adapters/cli/schemas/flags.schema.js.map +1 -0
  23. package/dist/adapters/cli/schemas/mappings.schema.d.ts +2 -0
  24. package/dist/adapters/cli/schemas/mappings.schema.d.ts.map +1 -0
  25. package/dist/adapters/cli/schemas/mappings.schema.js +2 -0
  26. package/dist/adapters/cli/schemas/mappings.schema.js.map +1 -0
  27. package/dist/adapters/cli/schemas/prompts.schema.d.ts +5 -0
  28. package/dist/adapters/cli/schemas/prompts.schema.d.ts.map +1 -0
  29. package/dist/adapters/cli/schemas/prompts.schema.js +2 -0
  30. package/dist/adapters/cli/schemas/prompts.schema.js.map +1 -0
  31. package/dist/adapters/cli/schemas/wizard.schema.d.ts +19 -0
  32. package/dist/adapters/cli/schemas/wizard.schema.d.ts.map +1 -0
  33. package/dist/adapters/cli/schemas/wizard.schema.js +2 -0
  34. package/dist/adapters/cli/schemas/wizard.schema.js.map +1 -0
  35. package/dist/adapters/cli/wizard.d.ts +33 -0
  36. package/dist/adapters/cli/wizard.d.ts.map +1 -0
  37. package/dist/adapters/cli/wizard.js +77 -0
  38. package/dist/adapters/cli/wizard.js.map +1 -0
  39. package/dist/browser/index.d.ts +7 -0
  40. package/dist/browser/index.d.ts.map +1 -0
  41. package/dist/browser/index.js +4 -0
  42. package/dist/browser/index.js.map +1 -0
  43. package/dist/cli/settings.descriptor.d.ts +9 -0
  44. package/dist/cli/settings.descriptor.d.ts.map +1 -0
  45. package/dist/cli/settings.descriptor.js +18 -0
  46. package/dist/cli/settings.descriptor.js.map +1 -0
  47. package/dist/cli/types.d.ts +57 -0
  48. package/dist/cli/types.d.ts.map +1 -0
  49. package/dist/cli/types.js +9 -0
  50. package/dist/cli/types.js.map +1 -0
  51. package/dist/client/index.d.ts +19 -0
  52. package/dist/client/index.d.ts.map +1 -0
  53. package/dist/client/index.js +145 -0
  54. package/dist/client/index.js.map +1 -0
  55. package/dist/client/storage.d.ts +48 -0
  56. package/dist/client/storage.d.ts.map +1 -0
  57. package/dist/client/storage.js +46 -0
  58. package/dist/client/storage.js.map +1 -0
  59. package/dist/collection/collection.d.ts +46 -0
  60. package/dist/collection/collection.d.ts.map +1 -0
  61. package/dist/collection/collection.js +93 -0
  62. package/dist/collection/collection.js.map +1 -0
  63. package/dist/collection/index.d.ts +6 -0
  64. package/dist/collection/index.d.ts.map +1 -0
  65. package/dist/collection/index.js +5 -0
  66. package/dist/collection/index.js.map +1 -0
  67. package/dist/common/index.d.ts +7 -0
  68. package/dist/common/index.d.ts.map +1 -0
  69. package/dist/common/index.js +4 -0
  70. package/dist/common/index.js.map +1 -0
  71. package/dist/config.context.descriptor.d.ts +21 -0
  72. package/dist/config.context.descriptor.d.ts.map +1 -0
  73. package/dist/config.context.descriptor.js +11 -0
  74. package/dist/config.context.descriptor.js.map +1 -0
  75. package/dist/config.plugin.d.ts +15 -0
  76. package/dist/config.plugin.d.ts.map +1 -0
  77. package/dist/config.plugin.js +166 -0
  78. package/dist/config.plugin.js.map +1 -0
  79. package/dist/crud/base-types.d.ts +10 -0
  80. package/dist/crud/base-types.d.ts.map +1 -0
  81. package/dist/crud/base-types.js +10 -0
  82. package/dist/crud/base-types.js.map +1 -0
  83. package/dist/crud/index.d.ts +4 -0
  84. package/dist/crud/index.d.ts.map +1 -0
  85. package/dist/crud/index.js +2 -0
  86. package/dist/crud/index.js.map +1 -0
  87. package/dist/crud/schemas/base-types.schema.d.ts +19 -0
  88. package/dist/crud/schemas/base-types.schema.d.ts.map +1 -0
  89. package/dist/crud/schemas/base-types.schema.js +2 -0
  90. package/dist/crud/schemas/base-types.schema.js.map +1 -0
  91. package/dist/crud/schemas/shared.schema.d.ts +13 -0
  92. package/dist/crud/schemas/shared.schema.d.ts.map +1 -0
  93. package/dist/crud/schemas/shared.schema.js +2 -0
  94. package/dist/crud/schemas/shared.schema.js.map +1 -0
  95. package/dist/crud/shared.d.ts +8 -0
  96. package/dist/crud/shared.d.ts.map +1 -0
  97. package/dist/crud/shared.js +8 -0
  98. package/dist/crud/shared.js.map +1 -0
  99. package/dist/crud/types.d.ts +250 -0
  100. package/dist/crud/types.d.ts.map +1 -0
  101. package/dist/crud/types.js +22 -0
  102. package/dist/crud/types.js.map +1 -0
  103. package/dist/docs/environment.docs.descriptor.d.ts +4 -0
  104. package/dist/docs/environment.docs.descriptor.d.ts.map +1 -0
  105. package/dist/docs/environment.docs.descriptor.js +383 -0
  106. package/dist/docs/environment.docs.descriptor.js.map +1 -0
  107. package/dist/docs/manifests.docs.descriptor.d.ts +4 -0
  108. package/dist/docs/manifests.docs.descriptor.d.ts.map +1 -0
  109. package/dist/docs/manifests.docs.descriptor.js +503 -0
  110. package/dist/docs/manifests.docs.descriptor.js.map +1 -0
  111. package/dist/docs/validation.docs.descriptor.d.ts +4 -0
  112. package/dist/docs/validation.docs.descriptor.d.ts.map +1 -0
  113. package/dist/docs/validation.docs.descriptor.js +441 -0
  114. package/dist/docs/validation.docs.descriptor.js.map +1 -0
  115. package/dist/doctor.d.ts +42 -0
  116. package/dist/doctor.d.ts.map +1 -0
  117. package/dist/doctor.js +119 -0
  118. package/dist/doctor.js.map +1 -0
  119. package/dist/env.d.ts +28 -0
  120. package/dist/env.d.ts.map +1 -0
  121. package/dist/env.js +75 -0
  122. package/dist/env.js.map +1 -0
  123. package/dist/env.runtime.d.ts +19 -0
  124. package/dist/env.runtime.d.ts.map +1 -0
  125. package/dist/env.runtime.js +37 -0
  126. package/dist/env.runtime.js.map +1 -0
  127. package/dist/environment/current.d.ts +32 -0
  128. package/dist/environment/current.d.ts.map +1 -0
  129. package/dist/environment/current.js +91 -0
  130. package/dist/environment/current.js.map +1 -0
  131. package/dist/environment/environment.config.descriptor.d.ts +11 -0
  132. package/dist/environment/environment.config.descriptor.d.ts.map +1 -0
  133. package/dist/environment/environment.config.descriptor.js +51 -0
  134. package/dist/environment/environment.config.descriptor.js.map +1 -0
  135. package/dist/environment/environment.config.schema.d.ts +47 -0
  136. package/dist/environment/environment.config.schema.d.ts.map +1 -0
  137. package/dist/environment/environment.config.schema.js +19 -0
  138. package/dist/environment/environment.config.schema.js.map +1 -0
  139. package/dist/environment/environment.local.descriptor.d.ts +11 -0
  140. package/dist/environment/environment.local.descriptor.d.ts.map +1 -0
  141. package/dist/environment/environment.local.descriptor.js +42 -0
  142. package/dist/environment/environment.local.descriptor.js.map +1 -0
  143. package/dist/environment/environment.plugin.d.ts +9 -0
  144. package/dist/environment/environment.plugin.d.ts.map +1 -0
  145. package/dist/environment/environment.plugin.js +27 -0
  146. package/dist/environment/environment.plugin.js.map +1 -0
  147. package/dist/environment/environment.production.descriptor.d.ts +10 -0
  148. package/dist/environment/environment.production.descriptor.d.ts.map +1 -0
  149. package/dist/environment/environment.production.descriptor.js +37 -0
  150. package/dist/environment/environment.production.descriptor.js.map +1 -0
  151. package/dist/environment/environment.staging.descriptor.d.ts +11 -0
  152. package/dist/environment/environment.staging.descriptor.d.ts.map +1 -0
  153. package/dist/environment/environment.staging.descriptor.js +22 -0
  154. package/dist/environment/environment.staging.descriptor.js.map +1 -0
  155. package/dist/environment/index.d.ts +8 -0
  156. package/dist/environment/index.d.ts.map +1 -0
  157. package/dist/environment/index.js +9 -0
  158. package/dist/environment/index.js.map +1 -0
  159. package/dist/environment/kinds/environment.default.d.ts +23 -0
  160. package/dist/environment/kinds/environment.default.d.ts.map +1 -0
  161. package/dist/environment/kinds/environment.default.js +49 -0
  162. package/dist/environment/kinds/environment.default.js.map +1 -0
  163. package/dist/environment/kinds/environment.interface.d.ts +7 -0
  164. package/dist/environment/kinds/environment.interface.d.ts.map +1 -0
  165. package/dist/environment/kinds/environment.interface.js +7 -0
  166. package/dist/environment/kinds/environment.interface.js.map +1 -0
  167. package/dist/environment/kinds/environment.kind.d.ts +10 -0
  168. package/dist/environment/kinds/environment.kind.d.ts.map +1 -0
  169. package/dist/environment/kinds/environment.kind.js +57 -0
  170. package/dist/environment/kinds/environment.kind.js.map +1 -0
  171. package/dist/environment/kinds/environment.schema.d.ts +34 -0
  172. package/dist/environment/kinds/environment.schema.d.ts.map +1 -0
  173. package/dist/environment/kinds/environment.schema.js +46 -0
  174. package/dist/environment/kinds/environment.schema.js.map +1 -0
  175. package/dist/environment/kinds/index.d.ts +8 -0
  176. package/dist/environment/kinds/index.d.ts.map +1 -0
  177. package/dist/environment/kinds/index.js +7 -0
  178. package/dist/environment/kinds/index.js.map +1 -0
  179. package/dist/environment/kinds/schemas/environment.interface.schema.d.ts +11 -0
  180. package/dist/environment/kinds/schemas/environment.interface.schema.d.ts.map +1 -0
  181. package/dist/environment/kinds/schemas/environment.interface.schema.js +2 -0
  182. package/dist/environment/kinds/schemas/environment.interface.schema.js.map +1 -0
  183. package/dist/environment/kinds/schemas/environment.schema.d.ts +30 -0
  184. package/dist/environment/kinds/schemas/environment.schema.d.ts.map +1 -0
  185. package/dist/environment/kinds/schemas/environment.schema.js +2 -0
  186. package/dist/environment/kinds/schemas/environment.schema.js.map +1 -0
  187. package/dist/environment/schemas/current.schema.d.ts +20 -0
  188. package/dist/environment/schemas/current.schema.d.ts.map +1 -0
  189. package/dist/environment/schemas/current.schema.js +2 -0
  190. package/dist/environment/schemas/current.schema.js.map +1 -0
  191. package/dist/environment/schemas/environment.config.schema.d.ts +4 -0
  192. package/dist/environment/schemas/environment.config.schema.d.ts.map +1 -0
  193. package/dist/environment/schemas/environment.config.schema.js +2 -0
  194. package/dist/environment/schemas/environment.config.schema.js.map +1 -0
  195. package/dist/extensions/index.d.ts +8 -0
  196. package/dist/extensions/index.d.ts.map +1 -0
  197. package/dist/extensions/index.js +8 -0
  198. package/dist/extensions/index.js.map +1 -0
  199. package/dist/extensions/registry.d.ts +41 -0
  200. package/dist/extensions/registry.d.ts.map +1 -0
  201. package/dist/extensions/registry.js +142 -0
  202. package/dist/extensions/registry.js.map +1 -0
  203. package/dist/extensions/types.d.ts +101 -0
  204. package/dist/extensions/types.d.ts.map +1 -0
  205. package/dist/extensions/types.js +8 -0
  206. package/dist/extensions/types.js.map +1 -0
  207. package/dist/form/core/field-resolver.d.ts +42 -0
  208. package/dist/form/core/field-resolver.d.ts.map +1 -0
  209. package/dist/form/core/field-resolver.js +293 -0
  210. package/dist/form/core/field-resolver.js.map +1 -0
  211. package/dist/form/core/groups.d.ts +20 -0
  212. package/dist/form/core/groups.d.ts.map +1 -0
  213. package/dist/form/core/groups.js +69 -0
  214. package/dist/form/core/groups.js.map +1 -0
  215. package/dist/form/core/index.d.ts +8 -0
  216. package/dist/form/core/index.d.ts.map +1 -0
  217. package/dist/form/core/index.js +6 -0
  218. package/dist/form/core/index.js.map +1 -0
  219. package/dist/form/core/nested-utils.d.ts +40 -0
  220. package/dist/form/core/nested-utils.d.ts.map +1 -0
  221. package/dist/form/core/nested-utils.js +98 -0
  222. package/dist/form/core/nested-utils.js.map +1 -0
  223. package/dist/form/core/schemas/validation.schema.d.ts +9 -0
  224. package/dist/form/core/schemas/validation.schema.d.ts.map +1 -0
  225. package/dist/form/core/schemas/validation.schema.js +2 -0
  226. package/dist/form/core/schemas/validation.schema.js.map +1 -0
  227. package/dist/form/core/types.d.ts +103 -0
  228. package/dist/form/core/types.d.ts.map +1 -0
  229. package/dist/form/core/types.js +2 -0
  230. package/dist/form/core/types.js.map +1 -0
  231. package/dist/form/core/validation.d.ts +23 -0
  232. package/dist/form/core/validation.d.ts.map +1 -0
  233. package/dist/form/core/validation.js +103 -0
  234. package/dist/form/core/validation.js.map +1 -0
  235. package/dist/form/core/visibility.d.ts +37 -0
  236. package/dist/form/core/visibility.d.ts.map +1 -0
  237. package/dist/form/core/visibility.js +128 -0
  238. package/dist/form/core/visibility.js.map +1 -0
  239. package/dist/form/index.d.ts +8 -0
  240. package/dist/form/index.d.ts.map +1 -0
  241. package/dist/form/index.js +2 -0
  242. package/dist/form/index.js.map +1 -0
  243. package/dist/index.d.ts +18 -0
  244. package/dist/index.d.ts.map +1 -0
  245. package/dist/index.js +18 -0
  246. package/dist/index.js.map +1 -0
  247. package/dist/loader/cli/index.d.ts +61 -0
  248. package/dist/loader/cli/index.d.ts.map +1 -0
  249. package/dist/loader/cli/index.js +263 -0
  250. package/dist/loader/cli/index.js.map +1 -0
  251. package/dist/loader/cli/loaders.d.ts +13 -0
  252. package/dist/loader/cli/loaders.d.ts.map +1 -0
  253. package/dist/loader/cli/loaders.js +132 -0
  254. package/dist/loader/cli/loaders.js.map +1 -0
  255. package/dist/loader/cli/types.d.ts +152 -0
  256. package/dist/loader/cli/types.d.ts.map +1 -0
  257. package/dist/loader/cli/types.js +5 -0
  258. package/dist/loader/cli/types.js.map +1 -0
  259. package/dist/loader/cli/utils.d.ts +53 -0
  260. package/dist/loader/cli/utils.d.ts.map +1 -0
  261. package/dist/loader/cli/utils.js +198 -0
  262. package/dist/loader/cli/utils.js.map +1 -0
  263. package/dist/loader/client.d.ts +18 -0
  264. package/dist/loader/client.d.ts.map +1 -0
  265. package/dist/loader/client.js +109 -0
  266. package/dist/loader/client.js.map +1 -0
  267. package/dist/loader/discovery.d.ts +48 -0
  268. package/dist/loader/discovery.d.ts.map +1 -0
  269. package/dist/loader/discovery.js +253 -0
  270. package/dist/loader/discovery.js.map +1 -0
  271. package/dist/loader/file-loader.d.ts +17 -0
  272. package/dist/loader/file-loader.d.ts.map +1 -0
  273. package/dist/loader/file-loader.js +237 -0
  274. package/dist/loader/file-loader.js.map +1 -0
  275. package/dist/loader/index.d.ts +9 -0
  276. package/dist/loader/index.d.ts.map +1 -0
  277. package/dist/loader/index.js +8 -0
  278. package/dist/loader/index.js.map +1 -0
  279. package/dist/loader/index.server.d.ts +66 -0
  280. package/dist/loader/index.server.d.ts.map +1 -0
  281. package/dist/loader/index.server.js +256 -0
  282. package/dist/loader/index.server.js.map +1 -0
  283. package/dist/loader/merge.d.ts +88 -0
  284. package/dist/loader/merge.d.ts.map +1 -0
  285. package/dist/loader/merge.js +301 -0
  286. package/dist/loader/merge.js.map +1 -0
  287. package/dist/loader/schemas/merge.schema.d.ts +8 -0
  288. package/dist/loader/schemas/merge.schema.d.ts.map +1 -0
  289. package/dist/loader/schemas/merge.schema.js +2 -0
  290. package/dist/loader/schemas/merge.schema.js.map +1 -0
  291. package/dist/loader/schemas/validation.schema.d.ts +17 -0
  292. package/dist/loader/schemas/validation.schema.d.ts.map +1 -0
  293. package/dist/loader/schemas/validation.schema.js +2 -0
  294. package/dist/loader/schemas/validation.schema.js.map +1 -0
  295. package/dist/loader/server.d.ts +3 -0
  296. package/dist/loader/server.d.ts.map +1 -0
  297. package/dist/loader/server.js +2 -0
  298. package/dist/loader/server.js.map +1 -0
  299. package/dist/loader/types.d.ts +136 -0
  300. package/dist/loader/types.d.ts.map +1 -0
  301. package/dist/loader/types.js +24 -0
  302. package/dist/loader/types.js.map +1 -0
  303. package/dist/loader/validation.d.ts +59 -0
  304. package/dist/loader/validation.d.ts.map +1 -0
  305. package/dist/loader/validation.js +218 -0
  306. package/dist/loader/validation.js.map +1 -0
  307. package/dist/manifest/builder.d.ts +172 -0
  308. package/dist/manifest/builder.d.ts.map +1 -0
  309. package/dist/manifest/builder.js +336 -0
  310. package/dist/manifest/builder.js.map +1 -0
  311. package/dist/manifest/config-manifest.d.ts +199 -0
  312. package/dist/manifest/config-manifest.d.ts.map +1 -0
  313. package/dist/manifest/config-manifest.js +388 -0
  314. package/dist/manifest/config-manifest.js.map +1 -0
  315. package/dist/manifest/index.d.ts +10 -0
  316. package/dist/manifest/index.d.ts.map +1 -0
  317. package/dist/manifest/index.js +20 -0
  318. package/dist/manifest/index.js.map +1 -0
  319. package/dist/manifest/schema.d.ts +460 -0
  320. package/dist/manifest/schema.d.ts.map +1 -0
  321. package/dist/manifest/schema.js +187 -0
  322. package/dist/manifest/schema.js.map +1 -0
  323. package/dist/manifest/schemas/builder.schema.d.ts +20 -0
  324. package/dist/manifest/schemas/builder.schema.d.ts.map +1 -0
  325. package/dist/manifest/schemas/builder.schema.js +2 -0
  326. package/dist/manifest/schemas/builder.schema.js.map +1 -0
  327. package/dist/manifest/schemas/config-manifest.schema.d.ts +2 -0
  328. package/dist/manifest/schemas/config-manifest.schema.d.ts.map +1 -0
  329. package/dist/manifest/schemas/config-manifest.schema.js +2 -0
  330. package/dist/manifest/schemas/config-manifest.schema.js.map +1 -0
  331. package/dist/manifest/schemas/schema.schema.d.ts +83 -0
  332. package/dist/manifest/schemas/schema.schema.d.ts.map +1 -0
  333. package/dist/manifest/schemas/schema.schema.js +2 -0
  334. package/dist/manifest/schemas/schema.schema.js.map +1 -0
  335. package/dist/manifest/types.d.ts +563 -0
  336. package/dist/manifest/types.d.ts.map +1 -0
  337. package/dist/manifest/types.js +9 -0
  338. package/dist/manifest/types.js.map +1 -0
  339. package/dist/routing/index.d.ts +29 -0
  340. package/dist/routing/index.d.ts.map +1 -0
  341. package/dist/routing/index.js +35 -0
  342. package/dist/routing/index.js.map +1 -0
  343. package/dist/routing/merge.d.ts +164 -0
  344. package/dist/routing/merge.d.ts.map +1 -0
  345. package/dist/routing/merge.js +460 -0
  346. package/dist/routing/merge.js.map +1 -0
  347. package/dist/routing/registry.d.ts +145 -0
  348. package/dist/routing/registry.d.ts.map +1 -0
  349. package/dist/routing/registry.js +459 -0
  350. package/dist/routing/registry.js.map +1 -0
  351. package/dist/routing/schemas/merge.schema.d.ts +5 -0
  352. package/dist/routing/schemas/merge.schema.d.ts.map +1 -0
  353. package/dist/routing/schemas/merge.schema.js +2 -0
  354. package/dist/routing/schemas/merge.schema.js.map +1 -0
  355. package/dist/routing/types.d.ts +358 -0
  356. package/dist/routing/types.d.ts.map +1 -0
  357. package/dist/routing/types.js +89 -0
  358. package/dist/routing/types.js.map +1 -0
  359. package/dist/schema/extend-zod.d.ts +137 -0
  360. package/dist/schema/extend-zod.d.ts.map +1 -0
  361. package/dist/schema/extend-zod.js +243 -0
  362. package/dist/schema/extend-zod.js.map +1 -0
  363. package/dist/schema/index.d.ts +9 -0
  364. package/dist/schema/index.d.ts.map +1 -0
  365. package/dist/schema/index.js +10 -0
  366. package/dist/schema/index.js.map +1 -0
  367. package/dist/schema/references.d.ts +9 -0
  368. package/dist/schema/references.d.ts.map +1 -0
  369. package/dist/schema/references.js +9 -0
  370. package/dist/schema/references.js.map +1 -0
  371. package/dist/schema/resolver.d.ts +45 -0
  372. package/dist/schema/resolver.d.ts.map +1 -0
  373. package/dist/schema/resolver.js +267 -0
  374. package/dist/schema/resolver.js.map +1 -0
  375. package/dist/schema/schemas/extend-zod.schema.d.ts +16 -0
  376. package/dist/schema/schemas/extend-zod.schema.d.ts.map +1 -0
  377. package/dist/schema/schemas/extend-zod.schema.js +2 -0
  378. package/dist/schema/schemas/extend-zod.schema.js.map +1 -0
  379. package/dist/schema/schemas/references.schema.d.ts +70 -0
  380. package/dist/schema/schemas/references.schema.d.ts.map +1 -0
  381. package/dist/schema/schemas/references.schema.js +2 -0
  382. package/dist/schema/schemas/references.schema.js.map +1 -0
  383. package/dist/schemas/collection.d.ts +31 -0
  384. package/dist/schemas/collection.d.ts.map +1 -0
  385. package/dist/schemas/collection.js +22 -0
  386. package/dist/schemas/collection.js.map +1 -0
  387. package/dist/schemas/config-manifest-descriptor.d.ts +495 -0
  388. package/dist/schemas/config-manifest-descriptor.d.ts.map +1 -0
  389. package/dist/schemas/config-manifest-descriptor.js +210 -0
  390. package/dist/schemas/config-manifest-descriptor.js.map +1 -0
  391. package/dist/schemas/config-registry-state.d.ts +8 -0
  392. package/dist/schemas/config-registry-state.d.ts.map +1 -0
  393. package/dist/schemas/config-registry-state.js +6 -0
  394. package/dist/schemas/config-registry-state.js.map +1 -0
  395. package/dist/schemas/doctor.schema.d.ts +25 -0
  396. package/dist/schemas/doctor.schema.d.ts.map +1 -0
  397. package/dist/schemas/doctor.schema.js +2 -0
  398. package/dist/schemas/doctor.schema.js.map +1 -0
  399. package/dist/schemas/index.d.ts +8 -0
  400. package/dist/schemas/index.d.ts.map +1 -0
  401. package/dist/schemas/index.js +21 -0
  402. package/dist/schemas/index.js.map +1 -0
  403. package/dist/server/index.d.ts +5 -0
  404. package/dist/server/index.d.ts.map +1 -0
  405. package/dist/server/index.js +4 -0
  406. package/dist/server/index.js.map +1 -0
  407. package/dist/services/config-accessor.d.ts +40 -0
  408. package/dist/services/config-accessor.d.ts.map +1 -0
  409. package/dist/services/config-accessor.js +180 -0
  410. package/dist/services/config-accessor.js.map +1 -0
  411. package/dist/services/config-storage/index.d.ts +8 -0
  412. package/dist/services/config-storage/index.d.ts.map +1 -0
  413. package/dist/services/config-storage/index.js +7 -0
  414. package/dist/services/config-storage/index.js.map +1 -0
  415. package/dist/services/config-storage/service.d.ts +63 -0
  416. package/dist/services/config-storage/service.d.ts.map +1 -0
  417. package/dist/services/config-storage/service.js +234 -0
  418. package/dist/services/config-storage/service.js.map +1 -0
  419. package/dist/services/config.d.ts +3 -0
  420. package/dist/services/config.d.ts.map +1 -0
  421. package/dist/services/config.js +30 -0
  422. package/dist/services/config.js.map +1 -0
  423. package/dist/services/encryption.d.ts +114 -0
  424. package/dist/services/encryption.d.ts.map +1 -0
  425. package/dist/services/encryption.js +232 -0
  426. package/dist/services/encryption.js.map +1 -0
  427. package/dist/services/index.d.ts +12 -0
  428. package/dist/services/index.d.ts.map +1 -0
  429. package/dist/services/index.js +16 -0
  430. package/dist/services/index.js.map +1 -0
  431. package/dist/services/loader/loader.descriptor.d.ts +103 -0
  432. package/dist/services/loader/loader.descriptor.d.ts.map +1 -0
  433. package/dist/services/loader/loader.descriptor.js +60 -0
  434. package/dist/services/loader/loader.descriptor.js.map +1 -0
  435. package/dist/services/loader/loader.impl.cloud.d.ts +55 -0
  436. package/dist/services/loader/loader.impl.cloud.d.ts.map +1 -0
  437. package/dist/services/loader/loader.impl.cloud.js +182 -0
  438. package/dist/services/loader/loader.impl.cloud.js.map +1 -0
  439. package/dist/services/loader/loader.impl.consumer.d.ts +48 -0
  440. package/dist/services/loader/loader.impl.consumer.d.ts.map +1 -0
  441. package/dist/services/loader/loader.impl.consumer.js +175 -0
  442. package/dist/services/loader/loader.impl.consumer.js.map +1 -0
  443. package/dist/services/loader/loader.impl.consumer.local-first.d.ts +59 -0
  444. package/dist/services/loader/loader.impl.consumer.local-first.d.ts.map +1 -0
  445. package/dist/services/loader/loader.impl.consumer.local-first.js +347 -0
  446. package/dist/services/loader/loader.impl.consumer.local-first.js.map +1 -0
  447. package/dist/services/manifest-utils.d.ts +47 -0
  448. package/dist/services/manifest-utils.d.ts.map +1 -0
  449. package/dist/services/manifest-utils.js +105 -0
  450. package/dist/services/manifest-utils.js.map +1 -0
  451. package/dist/services/schemas/config-accessor.schema.d.ts +10 -0
  452. package/dist/services/schemas/config-accessor.schema.d.ts.map +1 -0
  453. package/dist/services/schemas/config-accessor.schema.js +2 -0
  454. package/dist/services/schemas/config-accessor.schema.js.map +1 -0
  455. package/dist/services/schemas/encryption.schema.d.ts +22 -0
  456. package/dist/services/schemas/encryption.schema.d.ts.map +1 -0
  457. package/dist/services/schemas/encryption.schema.js +2 -0
  458. package/dist/services/schemas/encryption.schema.js.map +1 -0
  459. package/dist/services/schemas/manifest-utils.schema.d.ts +4 -0
  460. package/dist/services/schemas/manifest-utils.schema.d.ts.map +1 -0
  461. package/dist/services/schemas/manifest-utils.schema.js +2 -0
  462. package/dist/services/schemas/manifest-utils.schema.js.map +1 -0
  463. package/dist/settings/assemble.d.ts +28 -0
  464. package/dist/settings/assemble.d.ts.map +1 -0
  465. package/dist/settings/assemble.js +30 -0
  466. package/dist/settings/assemble.js.map +1 -0
  467. package/dist/settings/index.d.ts +10 -0
  468. package/dist/settings/index.d.ts.map +1 -0
  469. package/dist/settings/index.js +10 -0
  470. package/dist/settings/index.js.map +1 -0
  471. package/dist/settings/settings-section.schema.d.ts +49 -0
  472. package/dist/settings/settings-section.schema.d.ts.map +1 -0
  473. package/dist/settings/settings-section.schema.js +70 -0
  474. package/dist/settings/settings-section.schema.js.map +1 -0
  475. package/dist/storage/adapter.d.ts +11 -0
  476. package/dist/storage/adapter.d.ts.map +1 -0
  477. package/dist/storage/adapter.js +8 -0
  478. package/dist/storage/adapter.js.map +1 -0
  479. package/dist/storage/index.d.ts +8 -0
  480. package/dist/storage/index.d.ts.map +1 -0
  481. package/dist/storage/index.js +8 -0
  482. package/dist/storage/index.js.map +1 -0
  483. package/dist/storage/schemas.d.ts +257 -0
  484. package/dist/storage/schemas.d.ts.map +1 -0
  485. package/dist/storage/schemas.js +179 -0
  486. package/dist/storage/schemas.js.map +1 -0
  487. package/dist/storage/types.d.ts +74 -0
  488. package/dist/storage/types.d.ts.map +1 -0
  489. package/dist/storage/types.js +7 -0
  490. package/dist/storage/types.js.map +1 -0
  491. package/dist/system-constants.d.ts +95 -0
  492. package/dist/system-constants.d.ts.map +1 -0
  493. package/dist/system-constants.js +110 -0
  494. package/dist/system-constants.js.map +1 -0
  495. package/package.json +417 -0
  496. package/src/adapters/cli/flags.ts +260 -0
  497. package/src/adapters/cli/index.ts +24 -0
  498. package/src/adapters/cli/mappings.ts +43 -0
  499. package/src/adapters/cli/prompts.ts +70 -0
  500. package/src/adapters/cli/schemas/flags.schema.ts +8 -0
  501. package/src/adapters/cli/schemas/mappings.schema.ts +3 -0
  502. package/src/adapters/cli/schemas/prompts.schema.ts +4 -0
  503. package/src/adapters/cli/schemas/wizard.schema.ts +21 -0
  504. package/src/adapters/cli/wizard.ts +106 -0
  505. package/src/adapters/web/components/ManifestForm.svelte +817 -0
  506. package/src/browser/index.ts +86 -0
  507. package/src/cli/settings.descriptor.ts +23 -0
  508. package/src/cli/types.ts +59 -0
  509. package/src/client/index.ts +169 -0
  510. package/src/client/storage.ts +76 -0
  511. package/src/collection/collection.ts +121 -0
  512. package/src/collection/index.ts +6 -0
  513. package/src/common/index.ts +86 -0
  514. package/src/config.context.descriptor.ts +12 -0
  515. package/src/config.plugin.ts +214 -0
  516. package/src/crud/base-types.ts +10 -0
  517. package/src/crud/index.ts +15 -0
  518. package/src/crud/schemas/base-types.schema.ts +20 -0
  519. package/src/crud/schemas/shared.schema.ts +14 -0
  520. package/src/crud/shared.ts +8 -0
  521. package/src/crud/types.ts +299 -0
  522. package/src/docs/environment.docs.descriptor.ts +385 -0
  523. package/src/docs/manifests.docs.descriptor.ts +505 -0
  524. package/src/docs/validation.docs.descriptor.ts +443 -0
  525. package/src/doctor.ts +143 -0
  526. package/src/env.runtime.ts +49 -0
  527. package/src/env.ts +91 -0
  528. package/src/environment/current.ts +108 -0
  529. package/src/environment/environment.config.descriptor.ts +60 -0
  530. package/src/environment/environment.config.schema.ts +24 -0
  531. package/src/environment/environment.local.descriptor.ts +45 -0
  532. package/src/environment/environment.plugin.ts +31 -0
  533. package/src/environment/environment.production.descriptor.ts +40 -0
  534. package/src/environment/environment.staging.descriptor.ts +25 -0
  535. package/src/environment/index.ts +22 -0
  536. package/src/environment/kinds/environment.default.ts +57 -0
  537. package/src/environment/kinds/environment.interface.ts +10 -0
  538. package/src/environment/kinds/environment.kind.ts +69 -0
  539. package/src/environment/kinds/environment.schema.ts +57 -0
  540. package/src/environment/kinds/index.ts +8 -0
  541. package/src/environment/kinds/schemas/environment.interface.schema.ts +11 -0
  542. package/src/environment/kinds/schemas/environment.schema.ts +24 -0
  543. package/src/environment/schemas/current.schema.ts +21 -0
  544. package/src/environment/schemas/environment.config.schema.ts +3 -0
  545. package/src/extensions/index.ts +26 -0
  546. package/src/extensions/registry.ts +179 -0
  547. package/src/extensions/types.ts +123 -0
  548. package/src/form/core/field-resolver.ts +380 -0
  549. package/src/form/core/groups.ts +96 -0
  550. package/src/form/core/index.ts +41 -0
  551. package/src/form/core/nested-utils.ts +115 -0
  552. package/src/form/core/schemas/validation.schema.ts +9 -0
  553. package/src/form/core/types.ts +115 -0
  554. package/src/form/core/validation.ts +137 -0
  555. package/src/form/core/visibility.ts +172 -0
  556. package/src/form/index.ts +36 -0
  557. package/src/index.ts +69 -0
  558. package/src/js-yaml.d.ts +4 -0
  559. package/src/loader/cli/index.ts +386 -0
  560. package/src/loader/cli/loaders.ts +153 -0
  561. package/src/loader/cli/types.ts +181 -0
  562. package/src/loader/cli/utils.ts +236 -0
  563. package/src/loader/client.ts +140 -0
  564. package/src/loader/discovery.ts +291 -0
  565. package/src/loader/file-loader.ts +262 -0
  566. package/src/loader/index.server.ts +389 -0
  567. package/src/loader/index.ts +18 -0
  568. package/src/loader/merge.ts +366 -0
  569. package/src/loader/schemas/merge.schema.ts +8 -0
  570. package/src/loader/schemas/validation.schema.ts +18 -0
  571. package/src/loader/server.ts +15 -0
  572. package/src/loader/types.ts +142 -0
  573. package/src/loader/validation.ts +261 -0
  574. package/src/manifest/builder.ts +452 -0
  575. package/src/manifest/config-manifest.ts +482 -0
  576. package/src/manifest/index.ts +92 -0
  577. package/src/manifest/schema.ts +249 -0
  578. package/src/manifest/schemas/builder.schema.ts +33 -0
  579. package/src/manifest/schemas/config-manifest.schema.ts +1 -0
  580. package/src/manifest/schemas/schema.schema.ts +99 -0
  581. package/src/manifest/types.ts +726 -0
  582. package/src/routing/index.ts +105 -0
  583. package/src/routing/merge.ts +589 -0
  584. package/src/routing/registry.ts +595 -0
  585. package/src/routing/schemas/merge.schema.ts +6 -0
  586. package/src/routing/types.ts +470 -0
  587. package/src/schema/extend-zod.ts +289 -0
  588. package/src/schema/index.ts +44 -0
  589. package/src/schema/references.ts +21 -0
  590. package/src/schema/resolver.ts +343 -0
  591. package/src/schema/schemas/extend-zod.schema.ts +16 -0
  592. package/src/schema/schemas/references.schema.ts +86 -0
  593. package/src/schemas/collection.ts +38 -0
  594. package/src/schemas/config-manifest-descriptor.ts +259 -0
  595. package/src/schemas/config-registry-state.ts +13 -0
  596. package/src/schemas/doctor.schema.ts +27 -0
  597. package/src/schemas/index.ts +53 -0
  598. package/src/server/index.ts +4 -0
  599. package/src/services/config-accessor.ts +218 -0
  600. package/src/services/config-storage/index.ts +8 -0
  601. package/src/services/config-storage/service.ts +355 -0
  602. package/src/services/config.ts +37 -0
  603. package/src/services/encryption.ts +260 -0
  604. package/src/services/index.ts +34 -0
  605. package/src/services/loader/loader.descriptor.ts +96 -0
  606. package/src/services/loader/loader.impl.cloud.ts +214 -0
  607. package/src/services/loader/loader.impl.consumer.local-first.ts +417 -0
  608. package/src/services/loader/loader.impl.consumer.ts +213 -0
  609. package/src/services/manifest-utils.ts +119 -0
  610. package/src/services/schemas/config-accessor.schema.ts +11 -0
  611. package/src/services/schemas/encryption.schema.ts +23 -0
  612. package/src/services/schemas/manifest-utils.schema.ts +4 -0
  613. package/src/settings/assemble.ts +46 -0
  614. package/src/settings/index.ts +19 -0
  615. package/src/settings/settings-section.schema.ts +84 -0
  616. package/src/storage/adapter.ts +12 -0
  617. package/src/storage/index.ts +48 -0
  618. package/src/storage/schemas.ts +215 -0
  619. package/src/storage/types.ts +88 -0
  620. package/src/system-constants.ts +121 -0
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Config Storage Service
3
+ *
4
+ * Unified configuration storage using runtime-resolved storage adapter.
5
+ * Provides credentials and config document CRUD through SqlDatabaseHandle.
6
+ */
7
+
8
+ import { randomUUID } from 'crypto';
9
+ import { join } from 'path';
10
+
11
+ interface SqlStatement<T, P extends unknown[] = unknown[]> {
12
+ all(...params: P): T[];
13
+ get(...params: P): T | undefined;
14
+ run(...params: P): void;
15
+ }
16
+
17
+ interface SqlDatabaseHandle {
18
+ exec(sql: string): void;
19
+ query<T, P extends unknown[] = unknown[]>(sql: string): SqlStatement<T, P>;
20
+ }
21
+
22
+ const CONFIG_DB_PATH = join('.vibes', 'config.db');
23
+ const CONFIG_NAMESPACE = 'config';
24
+
25
+ export type ConfigScope = 'global' | 'local' | 'project';
26
+
27
+ export interface CredentialsInput {
28
+ environment: string;
29
+ apiKey?: string;
30
+ sessionToken?: string;
31
+ refreshToken?: string;
32
+ userId?: string;
33
+ email?: string;
34
+ name?: string;
35
+ expiresAt?: string;
36
+ metadata?: Record<string, unknown>;
37
+ }
38
+
39
+ export interface ConfigDocumentInput {
40
+ scope: ConfigScope;
41
+ content: Record<string, unknown>;
42
+ namespace?: string;
43
+ encrypted?: boolean;
44
+ changeReason?: string;
45
+ }
46
+
47
+ interface CredentialsRow {
48
+ id: string;
49
+ environment: string;
50
+ api_key: string | null;
51
+ session_token: string | null;
52
+ refresh_token: string | null;
53
+ user_id: string | null;
54
+ email: string | null;
55
+ name: string | null;
56
+ expires_at: string | null;
57
+ metadata: string | null;
58
+ created_at: string;
59
+ updated_at: string;
60
+ }
61
+
62
+ interface ConfigDocumentRow {
63
+ id: string;
64
+ scope: ConfigScope;
65
+ namespace: string | null;
66
+ content: string;
67
+ version: number;
68
+ encrypted: number;
69
+ created_at: string;
70
+ updated_at: string;
71
+ }
72
+
73
+ type StorageAdapter = {
74
+ getDatabaseConnection: () => unknown;
75
+ ensureReady: () => Promise<void>;
76
+ };
77
+
78
+ type Runtime = {
79
+ query: (kind: string) => {
80
+ withId: (id: string) => {
81
+ resolve: () => Promise<StorageAdapter>;
82
+ };
83
+ };
84
+ };
85
+
86
+ async function createStorageAdapter(runtime: Runtime): Promise<StorageAdapter> {
87
+ const adapter = await runtime.query('storage/adapter').withId(CONFIG_NAMESPACE).resolve();
88
+ await adapter.ensureReady();
89
+ return adapter;
90
+ }
91
+
92
+ function getSqlHandle(adapter: StorageAdapter): SqlDatabaseHandle {
93
+ return adapter.getDatabaseConnection() as SqlDatabaseHandle;
94
+ }
95
+
96
+ function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {
97
+ const result = { ...target };
98
+ for (const key of Object.keys(source)) {
99
+ const sourceValue = source[key];
100
+ const targetValue = result[key];
101
+ if (
102
+ sourceValue !== null &&
103
+ typeof sourceValue === 'object' &&
104
+ !Array.isArray(sourceValue) &&
105
+ targetValue !== null &&
106
+ typeof targetValue === 'object' &&
107
+ !Array.isArray(targetValue)
108
+ ) {
109
+ result[key] = deepMerge(targetValue as Record<string, unknown>, sourceValue as Record<string, unknown>);
110
+ } else {
111
+ result[key] = sourceValue;
112
+ }
113
+ }
114
+ return result;
115
+ }
116
+
117
+ export class ConfigStorageService {
118
+ private sql: SqlDatabaseHandle | null = null;
119
+ private initPromise: Promise<void> | null = null;
120
+ private runtime: Runtime;
121
+
122
+ constructor(runtime: Runtime) {
123
+ this.runtime = runtime;
124
+ }
125
+
126
+ private async ensureInitialized(): Promise<SqlDatabaseHandle> {
127
+ if (this.sql) return this.sql;
128
+ if (!this.initPromise) {
129
+ this.initPromise = (async () => {
130
+ const adapter = await createStorageAdapter(this.runtime);
131
+ this.sql = getSqlHandle(adapter);
132
+ this.createTables();
133
+ })();
134
+ }
135
+ await this.initPromise;
136
+ return this.sql!;
137
+ }
138
+
139
+ private createTables(): void {
140
+ if (!this.sql) return;
141
+ this.sql.exec(`
142
+ CREATE TABLE IF NOT EXISTS credentials (
143
+ id TEXT PRIMARY KEY,
144
+ environment TEXT NOT NULL UNIQUE,
145
+ api_key TEXT,
146
+ session_token TEXT,
147
+ refresh_token TEXT,
148
+ user_id TEXT,
149
+ email TEXT,
150
+ name TEXT,
151
+ expires_at TEXT,
152
+ metadata TEXT,
153
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
154
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
155
+ );
156
+ CREATE INDEX IF NOT EXISTS idx_credentials_environment ON credentials(environment);
157
+
158
+ CREATE TABLE IF NOT EXISTS config_documents (
159
+ id TEXT PRIMARY KEY,
160
+ scope TEXT NOT NULL CHECK(scope IN ('global', 'local', 'project')),
161
+ namespace TEXT,
162
+ content TEXT NOT NULL DEFAULT '{}',
163
+ version INTEGER NOT NULL DEFAULT 1,
164
+ encrypted INTEGER NOT NULL DEFAULT 0,
165
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
166
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
167
+ UNIQUE(scope, namespace)
168
+ );
169
+ CREATE INDEX IF NOT EXISTS idx_config_documents_scope ON config_documents(scope);
170
+ CREATE INDEX IF NOT EXISTS idx_config_documents_namespace ON config_documents(namespace);
171
+ `);
172
+ }
173
+
174
+ async getCredentials(environment: string): Promise<CredentialsInput | null> {
175
+ const sql = await this.ensureInitialized();
176
+ const row = sql.query<CredentialsRow, [string]>('SELECT * FROM credentials WHERE environment = ?').get(environment);
177
+ if (!row) return null;
178
+ return {
179
+ environment: row.environment,
180
+ apiKey: row.api_key ?? undefined,
181
+ sessionToken: row.session_token ?? undefined,
182
+ refreshToken: row.refresh_token ?? undefined,
183
+ userId: row.user_id ?? undefined,
184
+ email: row.email ?? undefined,
185
+ name: row.name ?? undefined,
186
+ expiresAt: row.expires_at ?? undefined,
187
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined
188
+ };
189
+ }
190
+
191
+ async setCredentials(input: CredentialsInput): Promise<void> {
192
+ const sql = await this.ensureInitialized();
193
+ const now = new Date().toISOString();
194
+ const existing = sql.query<{ id: string }, [string]>('SELECT id FROM credentials WHERE environment = ?').get(input.environment);
195
+ if (existing) {
196
+ sql.query(
197
+ `UPDATE credentials SET
198
+ api_key = ?, session_token = ?, refresh_token = ?,
199
+ user_id = ?, email = ?, name = ?, expires_at = ?,
200
+ metadata = ?, updated_at = ?
201
+ WHERE environment = ?`
202
+ ).run(
203
+ input.apiKey ?? null,
204
+ input.sessionToken ?? null,
205
+ input.refreshToken ?? null,
206
+ input.userId ?? null,
207
+ input.email ?? null,
208
+ input.name ?? null,
209
+ input.expiresAt ?? null,
210
+ input.metadata ? JSON.stringify(input.metadata) : null,
211
+ now,
212
+ input.environment
213
+ );
214
+ } else {
215
+ sql.query(
216
+ `INSERT INTO credentials
217
+ (id, environment, api_key, session_token, refresh_token,
218
+ user_id, email, name, expires_at, metadata, created_at, updated_at)
219
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
220
+ ).run(
221
+ randomUUID(),
222
+ input.environment,
223
+ input.apiKey ?? null,
224
+ input.sessionToken ?? null,
225
+ input.refreshToken ?? null,
226
+ input.userId ?? null,
227
+ input.email ?? null,
228
+ input.name ?? null,
229
+ input.expiresAt ?? null,
230
+ input.metadata ? JSON.stringify(input.metadata) : null,
231
+ now,
232
+ now
233
+ );
234
+ }
235
+ }
236
+
237
+ async deleteCredentials(environment: string): Promise<void> {
238
+ const sql = await this.ensureInitialized();
239
+ sql.query('DELETE FROM credentials WHERE environment = ?').run(environment);
240
+ }
241
+
242
+ async getDocument<T = Record<string, unknown>>(scope: ConfigScope, namespace: string | null = null): Promise<T | null> {
243
+ const sql = await this.ensureInitialized();
244
+ let row: ConfigDocumentRow | null;
245
+ if (namespace === null) {
246
+ row = sql.query<ConfigDocumentRow, [string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace IS NULL').get(scope) ?? null;
247
+ } else {
248
+ row = sql.query<ConfigDocumentRow, [string, string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace = ?').get(scope, namespace) ?? null;
249
+ }
250
+ if (!row) return null;
251
+ try {
252
+ return JSON.parse(row.content) as T;
253
+ } catch {
254
+ return null;
255
+ }
256
+ }
257
+
258
+ async getDocumentMerged<T = Record<string, unknown>>(
259
+ scopes: ConfigScope[],
260
+ namespace: string | null = null
261
+ ): Promise<{ config: T; sources: Array<{ scope: ConfigScope; version: number }> }> {
262
+ const sql = await this.ensureInitialized();
263
+ let merged: Record<string, unknown> = {};
264
+ const sources: Array<{ scope: ConfigScope; version: number }> = [];
265
+ for (const scope of scopes) {
266
+ let row: ConfigDocumentRow | null;
267
+ if (namespace === null) {
268
+ row = sql.query<ConfigDocumentRow, [string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace IS NULL').get(scope) ?? null;
269
+ } else {
270
+ row = sql.query<ConfigDocumentRow, [string, string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace = ?').get(scope, namespace) ?? null;
271
+ }
272
+ if (row) {
273
+ try {
274
+ const content = JSON.parse(row.content);
275
+ merged = deepMerge(merged, content);
276
+ sources.push({ scope, version: row.version });
277
+ } catch {
278
+ // Skip malformed content
279
+ }
280
+ }
281
+ }
282
+ return { config: merged as T, sources };
283
+ }
284
+
285
+ async setDocument(input: ConfigDocumentInput): Promise<void> {
286
+ const sql = await this.ensureInitialized();
287
+ const now = new Date().toISOString();
288
+ const namespace = input.namespace ?? null;
289
+ let existing: ConfigDocumentRow | null;
290
+ if (namespace === null) {
291
+ existing = sql.query<ConfigDocumentRow, [string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace IS NULL').get(input.scope) ?? null;
292
+ } else {
293
+ existing = sql.query<ConfigDocumentRow, [string, string]>('SELECT * FROM config_documents WHERE scope = ? AND namespace = ?').get(input.scope, namespace) ?? null;
294
+ }
295
+ const content = JSON.stringify(input.content);
296
+ const encrypted = input.encrypted ? 1 : 0;
297
+ if (existing) {
298
+ sql.query(
299
+ `UPDATE config_documents SET
300
+ content = ?, version = version + 1, encrypted = ?, updated_at = ?
301
+ WHERE id = ?`
302
+ ).run(content, encrypted, now, existing.id);
303
+ } else {
304
+ sql.query(
305
+ `INSERT INTO config_documents
306
+ (id, scope, namespace, content, version, encrypted, created_at, updated_at)
307
+ VALUES (?, ?, ?, ?, 1, ?, ?, ?)`
308
+ ).run(randomUUID(), input.scope, namespace, content, encrypted, now, now);
309
+ }
310
+ }
311
+
312
+ async mergeDocument(
313
+ scope: ConfigScope,
314
+ content: Record<string, unknown>,
315
+ namespace: string | null = null,
316
+ changeReason?: string
317
+ ): Promise<void> {
318
+ const existing = await this.getDocument<Record<string, unknown>>(scope, namespace);
319
+ const merged = deepMerge(existing || {}, content);
320
+ await this.setDocument({
321
+ scope,
322
+ namespace: namespace ?? undefined,
323
+ content: merged,
324
+ encrypted: false,
325
+ changeReason
326
+ });
327
+ }
328
+
329
+ async deleteDocument(scope: ConfigScope, namespace: string | null = null): Promise<void> {
330
+ const sql = await this.ensureInitialized();
331
+ if (namespace === null) {
332
+ sql.query('DELETE FROM config_documents WHERE scope = ? AND namespace IS NULL').run(scope);
333
+ } else {
334
+ sql.query('DELETE FROM config_documents WHERE scope = ? AND namespace = ?').run(scope, namespace);
335
+ }
336
+ }
337
+
338
+ async close(): Promise<void> {
339
+ this.sql = null;
340
+ this.initPromise = null;
341
+ }
342
+ }
343
+
344
+ let instance: ConfigStorageService | null = null;
345
+
346
+ export function getConfigStorageService(runtime: Runtime): ConfigStorageService {
347
+ if (!instance) {
348
+ instance = new ConfigStorageService(runtime);
349
+ }
350
+ return instance;
351
+ }
352
+
353
+ export function resetConfigStorageService(): void {
354
+ instance = null;
355
+ }
@@ -0,0 +1,37 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+
5
+ const VIBES_CONFIG_DIR = join(homedir(), '.config', 'vibes');
6
+ const GLOBAL_CONFIG_FILE = join(VIBES_CONFIG_DIR, 'config.json');
7
+
8
+ function ensureConfigDir(): void {
9
+ if (!existsSync(VIBES_CONFIG_DIR)) {
10
+ mkdirSync(VIBES_CONFIG_DIR, { recursive: true });
11
+ }
12
+ }
13
+
14
+ export async function loadConfigForScope(
15
+ scope: 'global' | 'project'
16
+ ): Promise<Record<string, unknown>> {
17
+ ensureConfigDir();
18
+ if (scope === 'global' && existsSync(GLOBAL_CONFIG_FILE)) {
19
+ try {
20
+ const content = readFileSync(GLOBAL_CONFIG_FILE, 'utf-8');
21
+ return JSON.parse(content) as Record<string, unknown>;
22
+ } catch {
23
+ return {};
24
+ }
25
+ }
26
+ return {};
27
+ }
28
+
29
+ export async function saveConfigForScope(
30
+ config: Record<string, unknown>,
31
+ scope: 'global' | 'project'
32
+ ): Promise<void> {
33
+ ensureConfigDir();
34
+ if (scope === 'global') {
35
+ writeFileSync(GLOBAL_CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
36
+ }
37
+ }
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Config Encryption Service
3
+ *
4
+ * Production-grade encryption for sensitive configuration values.
5
+ * Uses AES-256-GCM for authenticated encryption with PBKDF2 key derivation.
6
+ *
7
+ * Features:
8
+ * - AES-256-GCM authenticated encryption
9
+ * - PBKDF2 key derivation (100k iterations)
10
+ * - Random IV and salt generation
11
+ * - Constant-time comparison helpers
12
+ * - Browser and Node.js compatible (Web Crypto API)
13
+ */
14
+
15
+ import { createHash, randomBytes, createCipheriv, createDecipheriv, pbkdf2Sync } from 'crypto';
16
+
17
+ // Algorithm constants
18
+ const ALGORITHM = 'aes-256-gcm';
19
+ const IV_LENGTH = 16; // 128 bits for GCM
20
+ const AUTH_TAG_LENGTH = 16; // 128 bits
21
+ const SALT_LENGTH = 32; // 256 bits
22
+ const KEY_LENGTH = 32; // 256 bits
23
+ const PBKDF2_ITERATIONS = 100_000;
24
+
25
+ import type { EncryptedValue, SerializedEncryptedValue, EncryptionOptions } from './schemas/encryption.schema.ts';
26
+
27
+ export type { EncryptedValue, SerializedEncryptedValue, EncryptionOptions } from './schemas/encryption.schema.ts';
28
+
29
+ /**
30
+ * Derive a 256-bit key from password and salt using PBKDF2.
31
+ *
32
+ * @param password - The encryption password/key
33
+ * @param salt - Random salt for key derivation
34
+ * @returns 32-byte derived key
35
+ */
36
+ function deriveKey(password: string, salt: Buffer): Buffer {
37
+ return pbkdf2Sync(password, salt, PBKDF2_ITERATIONS, KEY_LENGTH, 'sha256');
38
+ }
39
+
40
+ /**
41
+ * Encrypt a string value using AES-256-GCM.
42
+ *
43
+ * @param value - The plaintext value to encrypt
44
+ * @param password - The encryption password/key
45
+ * @param options - Optional encryption parameters
46
+ * @returns EncryptedValue with all components needed for decryption
47
+ * @throws Error if encryption fails
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const encrypted = await encrypt('my-secret-api-key', 'my-master-password');
52
+ * // Store encrypted object
53
+ * ```
54
+ */
55
+ export async function encrypt(
56
+ value: string,
57
+ password: string,
58
+ options: EncryptionOptions = {}
59
+ ): Promise<EncryptedValue> {
60
+ if (!value) {
61
+ throw new Error('Cannot encrypt empty value');
62
+ }
63
+ if (!password) {
64
+ throw new Error('Encryption password is required');
65
+ }
66
+
67
+ // Generate random salt and IV
68
+ const salt = options.salt ?? randomBytes(SALT_LENGTH);
69
+ const iv = options.iv ?? randomBytes(IV_LENGTH);
70
+
71
+ // Derive key from password
72
+ const key = deriveKey(password, salt);
73
+
74
+ // Encrypt
75
+ const cipher = createCipheriv(ALGORITHM, key, iv);
76
+ let encrypted = cipher.update(value, 'utf8', 'base64');
77
+ encrypted += cipher.final('base64');
78
+ const tag = cipher.getAuthTag();
79
+
80
+ return {
81
+ ciphertext: encrypted,
82
+ iv: iv.toString('base64'),
83
+ salt: salt.toString('base64'),
84
+ tag: tag.toString('base64'),
85
+ algorithm: ALGORITHM,
86
+ iterations: PBKDF2_ITERATIONS
87
+ };
88
+ }
89
+
90
+ /**
91
+ * Decrypt an encrypted value using AES-256-GCM.
92
+ *
93
+ * @param encrypted - The encrypted value object
94
+ * @param password - The encryption password/key
95
+ * @returns The decrypted plaintext value
96
+ * @throws Error if decryption fails (wrong password, corrupted data, etc.)
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * const encrypted = {
101
+ * ciphertext: '...',
102
+ * iv: '...',
103
+ * salt: '...',
104
+ * tag: '...',
105
+ * algorithm: 'aes-256-gcm',
106
+ * iterations: 100000
107
+ * };
108
+ * const decrypted = await decrypt(encrypted, 'my-master-password');
109
+ * ```
110
+ */
111
+ export async function decrypt(encrypted: EncryptedValue, password: string): Promise<string> {
112
+ if (!password) {
113
+ throw new Error('Decryption password is required');
114
+ }
115
+
116
+ // Validate algorithm
117
+ if (encrypted.algorithm !== ALGORITHM) {
118
+ throw new Error(`Unsupported algorithm: ${encrypted.algorithm}`);
119
+ }
120
+
121
+ // Decode components
122
+ const salt = Buffer.from(encrypted.salt, 'base64');
123
+ const iv = Buffer.from(encrypted.iv, 'base64');
124
+ const tag = Buffer.from(encrypted.tag, 'base64');
125
+
126
+ // Derive key
127
+ const key = deriveKey(password, salt);
128
+
129
+ // Decrypt
130
+ try {
131
+ const decipher = createDecipheriv(ALGORITHM, key, iv);
132
+ decipher.setAuthTag(tag);
133
+ let decrypted = decipher.update(encrypted.ciphertext, 'base64', 'utf8');
134
+ decrypted += decipher.final('utf8');
135
+ return decrypted;
136
+ } catch (error) {
137
+ throw new Error('Decryption failed: invalid password or corrupted data');
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Serialize an encrypted value to a compact JSON object for storage.
143
+ *
144
+ * @param encrypted - The encrypted value
145
+ * @returns Compact serialized format
146
+ */
147
+ export function serializeEncrypted(encrypted: EncryptedValue): SerializedEncryptedValue {
148
+ return {
149
+ v: 1,
150
+ ct: encrypted.ciphertext,
151
+ iv: encrypted.iv,
152
+ s: encrypted.salt,
153
+ t: encrypted.tag,
154
+ a: encrypted.algorithm,
155
+ i: encrypted.iterations
156
+ };
157
+ }
158
+
159
+ /**
160
+ * Deserialize a compact JSON object back to EncryptedValue format.
161
+ *
162
+ * @param serialized - The serialized encrypted value
163
+ * @returns EncryptedValue object
164
+ */
165
+ export function deserializeEncrypted(serialized: SerializedEncryptedValue): EncryptedValue {
166
+ return {
167
+ ciphertext: serialized.ct,
168
+ iv: serialized.iv,
169
+ salt: serialized.s,
170
+ tag: serialized.t,
171
+ algorithm: serialized.a,
172
+ iterations: serialized.i
173
+ };
174
+ }
175
+
176
+ /**
177
+ * Encrypt a value and serialize it to a JSON string for storage.
178
+ *
179
+ * @param value - The plaintext value
180
+ * @param password - The encryption password
181
+ * @returns JSON string of serialized encrypted value
182
+ */
183
+ export async function encryptToString(value: string, password: string): Promise<string> {
184
+ const encrypted = await encrypt(value, password);
185
+ const serialized = serializeEncrypted(encrypted);
186
+ return JSON.stringify(serialized);
187
+ }
188
+
189
+ /**
190
+ * Decrypt a value from its serialized JSON string format.
191
+ *
192
+ * @param encryptedString - JSON string from encryptToString
193
+ * @param password - The encryption password
194
+ * @returns The decrypted plaintext value
195
+ */
196
+ export async function decryptFromString(encryptedString: string, password: string): Promise<string> {
197
+ const serialized = JSON.parse(encryptedString) as SerializedEncryptedValue;
198
+ const encrypted = deserializeEncrypted(serialized);
199
+ return decrypt(encrypted, password);
200
+ }
201
+
202
+ /**
203
+ * Generate a secure random password of the specified length.
204
+ *
205
+ * @param length - Password length (default: 32)
206
+ * @returns Base64-encoded random string
207
+ */
208
+ export function generateSecurePassword(length = 32): string {
209
+ return randomBytes(length).toString('base64').slice(0, length);
210
+ }
211
+
212
+ /**
213
+ * Hash a password for storage using SHA-256.
214
+ * This is NOT for encryption keys - use only for password verification.
215
+ *
216
+ * @param password - The password to hash
217
+ * @returns SHA-256 hash as hex string
218
+ */
219
+ export function hashPassword(password: string): string {
220
+ return createHash('sha256').update(password).digest('hex');
221
+ }
222
+
223
+ /**
224
+ * Verify a password against a stored hash.
225
+ *
226
+ * @param password - The password to verify
227
+ * @param hash - The stored hash
228
+ * @returns True if the password matches
229
+ */
230
+ export function verifyPassword(password: string, hash: string): boolean {
231
+ // Constant-time comparison to prevent timing attacks
232
+ const computed = hashPassword(password);
233
+ if (computed.length !== hash.length) return false;
234
+
235
+ let result = 0;
236
+ for (let i = 0; i < computed.length; i++) {
237
+ result |= computed.charCodeAt(i) ^ hash.charCodeAt(i);
238
+ }
239
+ return result === 0;
240
+ }
241
+
242
+ /**
243
+ * Check if a value appears to be an encrypted value.
244
+ *
245
+ * @param value - The value to check
246
+ * @returns True if the value looks like an encrypted config value
247
+ */
248
+ export function isEncryptedValue(value: unknown): value is SerializedEncryptedValue {
249
+ if (typeof value !== 'object' || value === null) return false;
250
+ const v = value as SerializedEncryptedValue;
251
+ return (
252
+ v.v === 1 &&
253
+ typeof v.ct === 'string' &&
254
+ typeof v.iv === 'string' &&
255
+ typeof v.s === 'string' &&
256
+ typeof v.t === 'string' &&
257
+ typeof v.a === 'string' &&
258
+ typeof v.i === 'number'
259
+ );
260
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Config Services
3
+ *
4
+ * Higher-level services built on top of the config infrastructure.
5
+ */
6
+
7
+ // Runtime-scoped config loader (replaces unified-loader.ts)
8
+ //
9
+ // IMPORTANT: do not re-export the consumer/cloud/local-first loader impls here.
10
+ // They are runtime-scoped and loaded lazily via dynamic import() in
11
+ // config.plugin.ts. Re-exporting them statically would let bundlers
12
+ // (e.g. workerd/cloudflare) walk the barrel and pull consumer-only code
13
+ // (localdb adapter) into worker bundles where it cannot resolve.
14
+ export {
15
+ configLoaderDescriptor
16
+ } from './loader/loader.descriptor.ts';
17
+ export type { ConfigLoaderInterface, LoadResult, SaveResult } from './loader/loader.descriptor.ts';
18
+
19
+ export { createConfigAccessor, createSyncConfigAccessor } from './config-accessor.ts';
20
+ export type { ConfigAccessor, ConfigAccessorInterface } from './config-accessor.ts';
21
+
22
+ export {
23
+ encrypt,
24
+ decrypt,
25
+ serializeEncrypted,
26
+ deserializeEncrypted,
27
+ encryptToString,
28
+ decryptFromString,
29
+ generateSecurePassword,
30
+ hashPassword,
31
+ verifyPassword,
32
+ isEncryptedValue
33
+ } from './encryption.ts';
34
+ export type { EncryptedValue, SerializedEncryptedValue, EncryptionOptions } from './encryption.ts';