@vibesdotdev/storage 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 (423) hide show
  1. package/README.md +75 -0
  2. package/SPEC.md +60 -0
  3. package/dist/adapters/index.d.ts +14 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +15 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/bridge/index.d.ts +3 -0
  8. package/dist/bridge/index.d.ts.map +1 -0
  9. package/dist/bridge/index.js +2 -0
  10. package/dist/bridge/index.js.map +1 -0
  11. package/dist/bridge/storage-kind-bridge.d.ts +27 -0
  12. package/dist/bridge/storage-kind-bridge.d.ts.map +1 -0
  13. package/dist/bridge/storage-kind-bridge.js +110 -0
  14. package/dist/bridge/storage-kind-bridge.js.map +1 -0
  15. package/dist/bridge/types.d.ts +45 -0
  16. package/dist/bridge/types.d.ts.map +1 -0
  17. package/dist/bridge/types.js +8 -0
  18. package/dist/bridge/types.js.map +1 -0
  19. package/dist/cli/commands/list/storage.list.cli-command.descriptor.d.ts +4 -0
  20. package/dist/cli/commands/list/storage.list.cli-command.descriptor.d.ts.map +1 -0
  21. package/dist/cli/commands/list/storage.list.cli-command.descriptor.js +18 -0
  22. package/dist/cli/commands/list/storage.list.cli-command.descriptor.js.map +1 -0
  23. package/dist/cli/commands/list/storage.list.cli-command.impl.d.ts +11 -0
  24. package/dist/cli/commands/list/storage.list.cli-command.impl.d.ts.map +1 -0
  25. package/dist/cli/commands/list/storage.list.cli-command.impl.js +48 -0
  26. package/dist/cli/commands/list/storage.list.cli-command.impl.js.map +1 -0
  27. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.d.ts +4 -0
  28. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.d.ts.map +1 -0
  29. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.js +26 -0
  30. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.js.map +1 -0
  31. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.d.ts +13 -0
  32. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.d.ts.map +1 -0
  33. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.js +136 -0
  34. package/dist/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.js.map +1 -0
  35. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.d.ts +4 -0
  36. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.d.ts.map +1 -0
  37. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.js +26 -0
  38. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.js.map +1 -0
  39. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.d.ts +13 -0
  40. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.d.ts.map +1 -0
  41. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.js +165 -0
  42. package/dist/cli/commands/sync/push/storage.sync.push.cli-command.impl.js.map +1 -0
  43. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.d.ts +4 -0
  44. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.d.ts.map +1 -0
  45. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.js +20 -0
  46. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.js.map +1 -0
  47. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.d.ts +12 -0
  48. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.d.ts.map +1 -0
  49. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.js +95 -0
  50. package/dist/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.js.map +1 -0
  51. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.d.ts +4 -0
  52. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.d.ts.map +1 -0
  53. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.js +15 -0
  54. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.js.map +1 -0
  55. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.d.ts +13 -0
  56. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.d.ts.map +1 -0
  57. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.js +150 -0
  58. package/dist/cli/commands/sync/status/storage.sync.status.cli-command.impl.js.map +1 -0
  59. package/dist/cli/context.consumer.d.ts +26 -0
  60. package/dist/cli/context.consumer.d.ts.map +1 -0
  61. package/dist/cli/context.consumer.js +164 -0
  62. package/dist/cli/context.consumer.js.map +1 -0
  63. package/dist/cli/storage.cli-group.descriptor.d.ts +4 -0
  64. package/dist/cli/storage.cli-group.descriptor.d.ts.map +1 -0
  65. package/dist/cli/storage.cli-group.descriptor.js +11 -0
  66. package/dist/cli/storage.cli-group.descriptor.js.map +1 -0
  67. package/dist/cli/storage.sync.cli-group.descriptor.d.ts +4 -0
  68. package/dist/cli/storage.sync.cli-group.descriptor.d.ts.map +1 -0
  69. package/dist/cli/storage.sync.cli-group.descriptor.js +12 -0
  70. package/dist/cli/storage.sync.cli-group.descriptor.js.map +1 -0
  71. package/dist/cli/types.d.ts +26 -0
  72. package/dist/cli/types.d.ts.map +1 -0
  73. package/dist/cli/types.js +11 -0
  74. package/dist/cli/types.js.map +1 -0
  75. package/dist/client/index.d.ts +10 -0
  76. package/dist/client/index.d.ts.map +1 -0
  77. package/dist/client/index.js +10 -0
  78. package/dist/client/index.js.map +1 -0
  79. package/dist/client/list-browsable-adapters.d.ts +31 -0
  80. package/dist/client/list-browsable-adapters.d.ts.map +1 -0
  81. package/dist/client/list-browsable-adapters.js +40 -0
  82. package/dist/client/list-browsable-adapters.js.map +1 -0
  83. package/dist/daemon/commands/sync.d.ts +23 -0
  84. package/dist/daemon/commands/sync.d.ts.map +1 -0
  85. package/dist/daemon/commands/sync.js +169 -0
  86. package/dist/daemon/commands/sync.js.map +1 -0
  87. package/dist/docs/adapters.docs.descriptor.d.ts +4 -0
  88. package/dist/docs/adapters.docs.descriptor.d.ts.map +1 -0
  89. package/dist/docs/adapters.docs.descriptor.js +223 -0
  90. package/dist/docs/adapters.docs.descriptor.js.map +1 -0
  91. package/dist/docs/manifests.docs.descriptor.d.ts +4 -0
  92. package/dist/docs/manifests.docs.descriptor.d.ts.map +1 -0
  93. package/dist/docs/manifests.docs.descriptor.js +316 -0
  94. package/dist/docs/manifests.docs.descriptor.js.map +1 -0
  95. package/dist/docs/records.docs.descriptor.d.ts +4 -0
  96. package/dist/docs/records.docs.descriptor.d.ts.map +1 -0
  97. package/dist/docs/records.docs.descriptor.js +269 -0
  98. package/dist/docs/records.docs.descriptor.js.map +1 -0
  99. package/dist/docs/sync.docs.descriptor.d.ts +4 -0
  100. package/dist/docs/sync.docs.descriptor.d.ts.map +1 -0
  101. package/dist/docs/sync.docs.descriptor.js +279 -0
  102. package/dist/docs/sync.docs.descriptor.js.map +1 -0
  103. package/dist/index.d.ts +27 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +29 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/interfaces/adapter.d.ts +382 -0
  108. package/dist/interfaces/adapter.d.ts.map +1 -0
  109. package/dist/interfaces/adapter.js +11 -0
  110. package/dist/interfaces/adapter.js.map +1 -0
  111. package/dist/interfaces/document-store.d.ts +62 -0
  112. package/dist/interfaces/document-store.d.ts.map +1 -0
  113. package/dist/interfaces/document-store.js +8 -0
  114. package/dist/interfaces/document-store.js.map +1 -0
  115. package/dist/interfaces/index.d.ts +17 -0
  116. package/dist/interfaces/index.d.ts.map +1 -0
  117. package/dist/interfaces/index.js +24 -0
  118. package/dist/interfaces/index.js.map +1 -0
  119. package/dist/interfaces/key-value.d.ts +95 -0
  120. package/dist/interfaces/key-value.d.ts.map +1 -0
  121. package/dist/interfaces/key-value.js +8 -0
  122. package/dist/interfaces/key-value.js.map +1 -0
  123. package/dist/interfaces/query-builder.d.ts +31 -0
  124. package/dist/interfaces/query-builder.d.ts.map +1 -0
  125. package/dist/interfaces/query-builder.js +11 -0
  126. package/dist/interfaces/query-builder.js.map +1 -0
  127. package/dist/interfaces/record/index.d.ts +7 -0
  128. package/dist/interfaces/record/index.d.ts.map +1 -0
  129. package/dist/interfaces/record/index.js +7 -0
  130. package/dist/interfaces/record/index.js.map +1 -0
  131. package/dist/interfaces/record/interface.d.ts +593 -0
  132. package/dist/interfaces/record/interface.d.ts.map +1 -0
  133. package/dist/interfaces/record/interface.js +49 -0
  134. package/dist/interfaces/record/interface.js.map +1 -0
  135. package/dist/interfaces/repository.d.ts +262 -0
  136. package/dist/interfaces/repository.d.ts.map +1 -0
  137. package/dist/interfaces/repository.js +8 -0
  138. package/dist/interfaces/repository.js.map +1 -0
  139. package/dist/interfaces/schema/index.d.ts +8 -0
  140. package/dist/interfaces/schema/index.d.ts.map +1 -0
  141. package/dist/interfaces/schema/index.js +10 -0
  142. package/dist/interfaces/schema/index.js.map +1 -0
  143. package/dist/interfaces/schema/schema-interface.d.ts +516 -0
  144. package/dist/interfaces/schema/schema-interface.d.ts.map +1 -0
  145. package/dist/interfaces/schema/schema-interface.js +31 -0
  146. package/dist/interfaces/schema/schema-interface.js.map +1 -0
  147. package/dist/interfaces/schema/table-interface.d.ts +250 -0
  148. package/dist/interfaces/schema/table-interface.d.ts.map +1 -0
  149. package/dist/interfaces/schema/table-interface.js +31 -0
  150. package/dist/interfaces/schema/table-interface.js.map +1 -0
  151. package/dist/interfaces/storage-consumer-fs.d.ts +40 -0
  152. package/dist/interfaces/storage-consumer-fs.d.ts.map +1 -0
  153. package/dist/interfaces/storage-consumer-fs.js +42 -0
  154. package/dist/interfaces/storage-consumer-fs.js.map +1 -0
  155. package/dist/manifest/base.d.ts +187 -0
  156. package/dist/manifest/base.d.ts.map +1 -0
  157. package/dist/manifest/base.js +516 -0
  158. package/dist/manifest/base.js.map +1 -0
  159. package/dist/manifest/cloud-sync.consumer.d.ts +7 -0
  160. package/dist/manifest/cloud-sync.consumer.d.ts.map +1 -0
  161. package/dist/manifest/cloud-sync.consumer.js +82 -0
  162. package/dist/manifest/cloud-sync.consumer.js.map +1 -0
  163. package/dist/manifest/index.d.ts +7 -0
  164. package/dist/manifest/index.d.ts.map +1 -0
  165. package/dist/manifest/index.js +7 -0
  166. package/dist/manifest/index.js.map +1 -0
  167. package/dist/manifest/source-policy.d.ts +8 -0
  168. package/dist/manifest/source-policy.d.ts.map +1 -0
  169. package/dist/manifest/source-policy.js +62 -0
  170. package/dist/manifest/source-policy.js.map +1 -0
  171. package/dist/paths.d.ts +6 -0
  172. package/dist/paths.d.ts.map +1 -0
  173. package/dist/paths.js +152 -0
  174. package/dist/paths.js.map +1 -0
  175. package/dist/policy/context.d.ts +9 -0
  176. package/dist/policy/context.d.ts.map +1 -0
  177. package/dist/policy/context.js +29 -0
  178. package/dist/policy/context.js.map +1 -0
  179. package/dist/policy/index.d.ts +4 -0
  180. package/dist/policy/index.d.ts.map +1 -0
  181. package/dist/policy/index.js +4 -0
  182. package/dist/policy/index.js.map +1 -0
  183. package/dist/policy/overrides.d.ts +40 -0
  184. package/dist/policy/overrides.d.ts.map +1 -0
  185. package/dist/policy/overrides.js +37 -0
  186. package/dist/policy/overrides.js.map +1 -0
  187. package/dist/policy/persistence.d.ts +38 -0
  188. package/dist/policy/persistence.d.ts.map +1 -0
  189. package/dist/policy/persistence.js +65 -0
  190. package/dist/policy/persistence.js.map +1 -0
  191. package/dist/policy/types.d.ts +21 -0
  192. package/dist/policy/types.d.ts.map +1 -0
  193. package/dist/policy/types.js +7 -0
  194. package/dist/policy/types.js.map +1 -0
  195. package/dist/record/base.d.ts +186 -0
  196. package/dist/record/base.d.ts.map +1 -0
  197. package/dist/record/base.js +1437 -0
  198. package/dist/record/base.js.map +1 -0
  199. package/dist/record/events.d.ts +71 -0
  200. package/dist/record/events.d.ts.map +1 -0
  201. package/dist/record/events.js +52 -0
  202. package/dist/record/events.js.map +1 -0
  203. package/dist/record/extensions.d.ts +51 -0
  204. package/dist/record/extensions.d.ts.map +1 -0
  205. package/dist/record/extensions.js +222 -0
  206. package/dist/record/extensions.js.map +1 -0
  207. package/dist/record/index.d.ts +7 -0
  208. package/dist/record/index.d.ts.map +1 -0
  209. package/dist/record/index.js +7 -0
  210. package/dist/record/index.js.map +1 -0
  211. package/dist/resolver/storage-backed-resolver.d.ts +23 -0
  212. package/dist/resolver/storage-backed-resolver.d.ts.map +1 -0
  213. package/dist/resolver/storage-backed-resolver.js +187 -0
  214. package/dist/resolver/storage-backed-resolver.js.map +1 -0
  215. package/dist/schemas/adapter-descriptor.d.ts +108 -0
  216. package/dist/schemas/adapter-descriptor.d.ts.map +1 -0
  217. package/dist/schemas/adapter-descriptor.js +101 -0
  218. package/dist/schemas/adapter-descriptor.js.map +1 -0
  219. package/dist/schemas/index.d.ts +14 -0
  220. package/dist/schemas/index.d.ts.map +1 -0
  221. package/dist/schemas/index.js +12 -0
  222. package/dist/schemas/index.js.map +1 -0
  223. package/dist/schemas/manifest-descriptor.d.ts +110 -0
  224. package/dist/schemas/manifest-descriptor.d.ts.map +1 -0
  225. package/dist/schemas/manifest-descriptor.js +114 -0
  226. package/dist/schemas/manifest-descriptor.js.map +1 -0
  227. package/dist/schemas/record/descriptor.d.ts +570 -0
  228. package/dist/schemas/record/descriptor.d.ts.map +1 -0
  229. package/dist/schemas/record/descriptor.js +389 -0
  230. package/dist/schemas/record/descriptor.js.map +1 -0
  231. package/dist/schemas/record/index.d.ts +8 -0
  232. package/dist/schemas/record/index.d.ts.map +1 -0
  233. package/dist/schemas/record/index.js +7 -0
  234. package/dist/schemas/record/index.js.map +1 -0
  235. package/dist/schemas/record/relation.d.ts +36 -0
  236. package/dist/schemas/record/relation.d.ts.map +1 -0
  237. package/dist/schemas/record/relation.js +37 -0
  238. package/dist/schemas/record/relation.js.map +1 -0
  239. package/dist/schemas/schema/descriptor.d.ts +231 -0
  240. package/dist/schemas/schema/descriptor.d.ts.map +1 -0
  241. package/dist/schemas/schema/descriptor.js +205 -0
  242. package/dist/schemas/schema/descriptor.js.map +1 -0
  243. package/dist/schemas/schema/index.d.ts +7 -0
  244. package/dist/schemas/schema/index.d.ts.map +1 -0
  245. package/dist/schemas/schema/index.js +7 -0
  246. package/dist/schemas/schema/index.js.map +1 -0
  247. package/dist/schemas/sync-bridge-descriptor.d.ts +124 -0
  248. package/dist/schemas/sync-bridge-descriptor.d.ts.map +1 -0
  249. package/dist/schemas/sync-bridge-descriptor.js +67 -0
  250. package/dist/schemas/sync-bridge-descriptor.js.map +1 -0
  251. package/dist/server/manifest-route.d.ts +92 -0
  252. package/dist/server/manifest-route.d.ts.map +1 -0
  253. package/dist/server/manifest-route.js +226 -0
  254. package/dist/server/manifest-route.js.map +1 -0
  255. package/dist/storage-policy.context.descriptor.d.ts +16 -0
  256. package/dist/storage-policy.context.descriptor.d.ts.map +1 -0
  257. package/dist/storage-policy.context.descriptor.js +16 -0
  258. package/dist/storage-policy.context.descriptor.js.map +1 -0
  259. package/dist/storage-policy.context.server.d.ts +14 -0
  260. package/dist/storage-policy.context.server.d.ts.map +1 -0
  261. package/dist/storage-policy.context.server.js +27 -0
  262. package/dist/storage-policy.context.server.js.map +1 -0
  263. package/dist/storage.plugin.d.ts +38 -0
  264. package/dist/storage.plugin.d.ts.map +1 -0
  265. package/dist/storage.plugin.js +204 -0
  266. package/dist/storage.plugin.js.map +1 -0
  267. package/dist/sync/cloud-pull.d.ts +15 -0
  268. package/dist/sync/cloud-pull.d.ts.map +1 -0
  269. package/dist/sync/cloud-pull.js +130 -0
  270. package/dist/sync/cloud-pull.js.map +1 -0
  271. package/dist/sync/cloud-record-crud-config.d.ts +19 -0
  272. package/dist/sync/cloud-record-crud-config.d.ts.map +1 -0
  273. package/dist/sync/cloud-record-crud-config.js +22 -0
  274. package/dist/sync/cloud-record-crud-config.js.map +1 -0
  275. package/dist/sync/record-sync-bridge.d.ts +5 -0
  276. package/dist/sync/record-sync-bridge.d.ts.map +1 -0
  277. package/dist/sync/record-sync-bridge.js +121 -0
  278. package/dist/sync/record-sync-bridge.js.map +1 -0
  279. package/dist/sync/resolve-sync-target.d.ts +23 -0
  280. package/dist/sync/resolve-sync-target.d.ts.map +1 -0
  281. package/dist/sync/resolve-sync-target.js +45 -0
  282. package/dist/sync/resolve-sync-target.js.map +1 -0
  283. package/dist/sync/schemas/cloud-pull.d.ts +25 -0
  284. package/dist/sync/schemas/cloud-pull.d.ts.map +1 -0
  285. package/dist/sync/schemas/cloud-pull.js +7 -0
  286. package/dist/sync/schemas/cloud-pull.js.map +1 -0
  287. package/dist/sync/schemas/index.d.ts +9 -0
  288. package/dist/sync/schemas/index.d.ts.map +1 -0
  289. package/dist/sync/schemas/index.js +9 -0
  290. package/dist/sync/schemas/index.js.map +1 -0
  291. package/dist/sync/schemas/sync-helpers.d.ts +17 -0
  292. package/dist/sync/schemas/sync-helpers.d.ts.map +1 -0
  293. package/dist/sync/schemas/sync-helpers.js +7 -0
  294. package/dist/sync/schemas/sync-helpers.js.map +1 -0
  295. package/dist/sync/schemas/sync-state.d.ts +65 -0
  296. package/dist/sync/schemas/sync-state.d.ts.map +1 -0
  297. package/dist/sync/schemas/sync-state.js +32 -0
  298. package/dist/sync/schemas/sync-state.js.map +1 -0
  299. package/dist/sync/sync-bridge.d.ts +80 -0
  300. package/dist/sync/sync-bridge.d.ts.map +1 -0
  301. package/dist/sync/sync-bridge.js +617 -0
  302. package/dist/sync/sync-bridge.js.map +1 -0
  303. package/dist/sync/sync-manifest.d.ts +20 -0
  304. package/dist/sync/sync-manifest.d.ts.map +1 -0
  305. package/dist/sync/sync-manifest.js +140 -0
  306. package/dist/sync/sync-manifest.js.map +1 -0
  307. package/dist/sync/sync-state.consumer.d.ts +23 -0
  308. package/dist/sync/sync-state.consumer.d.ts.map +1 -0
  309. package/dist/sync/sync-state.consumer.js +111 -0
  310. package/dist/sync/sync-state.consumer.js.map +1 -0
  311. package/dist/transform/index.d.ts +75 -0
  312. package/dist/transform/index.d.ts.map +1 -0
  313. package/dist/transform/index.js +81 -0
  314. package/dist/transform/index.js.map +1 -0
  315. package/dist/transform/transform-descriptor.d.ts +51 -0
  316. package/dist/transform/transform-descriptor.d.ts.map +1 -0
  317. package/dist/transform/transform-descriptor.js +30 -0
  318. package/dist/transform/transform-descriptor.js.map +1 -0
  319. package/dist/tui/storage-explorer.descriptor.d.ts +14 -0
  320. package/dist/tui/storage-explorer.descriptor.d.ts.map +1 -0
  321. package/dist/tui/storage-explorer.descriptor.js +29 -0
  322. package/dist/tui/storage-explorer.descriptor.js.map +1 -0
  323. package/dist/tui/storage-explorer.impl.consumer.d.ts +11 -0
  324. package/dist/tui/storage-explorer.impl.consumer.d.ts.map +1 -0
  325. package/dist/tui/storage-explorer.impl.consumer.js +13 -0
  326. package/dist/tui/storage-explorer.impl.consumer.js.map +1 -0
  327. package/dist/tui/storage-open.descriptor.d.ts +14 -0
  328. package/dist/tui/storage-open.descriptor.d.ts.map +1 -0
  329. package/dist/tui/storage-open.descriptor.js +28 -0
  330. package/dist/tui/storage-open.descriptor.js.map +1 -0
  331. package/dist/tui/storage-open.impl.consumer.d.ts +11 -0
  332. package/dist/tui/storage-open.impl.consumer.d.ts.map +1 -0
  333. package/dist/tui/storage-open.impl.consumer.js +13 -0
  334. package/dist/tui/storage-open.impl.consumer.js.map +1 -0
  335. package/dist/utils/error-context.d.ts +2 -0
  336. package/dist/utils/error-context.d.ts.map +1 -0
  337. package/dist/utils/error-context.js +17 -0
  338. package/dist/utils/error-context.js.map +1 -0
  339. package/package.json +241 -0
  340. package/src/adapters/index.ts +13 -0
  341. package/src/bridge/index.ts +2 -0
  342. package/src/bridge/storage-kind-bridge.ts +131 -0
  343. package/src/bridge/types.ts +46 -0
  344. package/src/cli/commands/list/storage.list.cli-command.descriptor.ts +20 -0
  345. package/src/cli/commands/list/storage.list.cli-command.impl.ts +72 -0
  346. package/src/cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.ts +28 -0
  347. package/src/cli/commands/sync/pull/storage.sync.pull.cli-command.impl.ts +171 -0
  348. package/src/cli/commands/sync/push/storage.sync.push.cli-command.descriptor.ts +28 -0
  349. package/src/cli/commands/sync/push/storage.sync.push.cli-command.impl.ts +213 -0
  350. package/src/cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.ts +22 -0
  351. package/src/cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.ts +129 -0
  352. package/src/cli/commands/sync/status/storage.sync.status.cli-command.descriptor.ts +17 -0
  353. package/src/cli/commands/sync/status/storage.sync.status.cli-command.impl.ts +192 -0
  354. package/src/cli/context.consumer.ts +195 -0
  355. package/src/cli/storage.cli-group.descriptor.ts +13 -0
  356. package/src/cli/storage.sync.cli-group.descriptor.ts +14 -0
  357. package/src/cli/types.ts +25 -0
  358. package/src/client/index.ts +10 -0
  359. package/src/client/list-browsable-adapters.ts +42 -0
  360. package/src/daemon/commands/sync.ts +225 -0
  361. package/src/docs/adapters.docs.descriptor.ts +225 -0
  362. package/src/docs/manifests.docs.descriptor.ts +318 -0
  363. package/src/docs/records.docs.descriptor.ts +271 -0
  364. package/src/docs/sync.docs.descriptor.ts +281 -0
  365. package/src/index.ts +109 -0
  366. package/src/interfaces/adapter.ts +451 -0
  367. package/src/interfaces/document-store.ts +74 -0
  368. package/src/interfaces/index.ts +117 -0
  369. package/src/interfaces/key-value.ts +112 -0
  370. package/src/interfaces/query-builder.ts +31 -0
  371. package/src/interfaces/record/index.ts +58 -0
  372. package/src/interfaces/record/interface.ts +723 -0
  373. package/src/interfaces/repository.ts +300 -0
  374. package/src/interfaces/schema/index.ts +37 -0
  375. package/src/interfaces/schema/schema-interface.ts +586 -0
  376. package/src/interfaces/schema/table-interface.ts +314 -0
  377. package/src/interfaces/storage-consumer-fs.ts +66 -0
  378. package/src/manifest/base.ts +594 -0
  379. package/src/manifest/cloud-sync.consumer.ts +120 -0
  380. package/src/manifest/index.ts +7 -0
  381. package/src/manifest/source-policy.ts +74 -0
  382. package/src/paths.ts +171 -0
  383. package/src/policy/context.ts +30 -0
  384. package/src/policy/index.ts +20 -0
  385. package/src/policy/overrides.ts +46 -0
  386. package/src/policy/persistence.ts +117 -0
  387. package/src/policy/types.ts +28 -0
  388. package/src/record/base.ts +1872 -0
  389. package/src/record/events.ts +56 -0
  390. package/src/record/extensions.ts +308 -0
  391. package/src/record/index.ts +7 -0
  392. package/src/resolver/storage-backed-resolver.ts +255 -0
  393. package/src/schemas/adapter-descriptor.ts +128 -0
  394. package/src/schemas/index.ts +104 -0
  395. package/src/schemas/manifest-descriptor.ts +143 -0
  396. package/src/schemas/record/descriptor.ts +621 -0
  397. package/src/schemas/record/index.ts +60 -0
  398. package/src/schemas/record/relation.ts +49 -0
  399. package/src/schemas/schema/descriptor.ts +278 -0
  400. package/src/schemas/schema/index.ts +14 -0
  401. package/src/schemas/sync-bridge-descriptor.ts +143 -0
  402. package/src/server/manifest-route.ts +319 -0
  403. package/src/storage-policy.context.descriptor.ts +17 -0
  404. package/src/storage-policy.context.server.ts +34 -0
  405. package/src/storage.plugin.ts +264 -0
  406. package/src/sync/cloud-pull.ts +202 -0
  407. package/src/sync/cloud-record-crud-config.ts +41 -0
  408. package/src/sync/record-sync-bridge.ts +183 -0
  409. package/src/sync/resolve-sync-target.ts +57 -0
  410. package/src/sync/schemas/cloud-pull.ts +26 -0
  411. package/src/sync/schemas/index.ts +18 -0
  412. package/src/sync/schemas/sync-helpers.ts +18 -0
  413. package/src/sync/schemas/sync-state.ts +41 -0
  414. package/src/sync/sync-bridge.ts +763 -0
  415. package/src/sync/sync-manifest.ts +212 -0
  416. package/src/sync/sync-state.consumer.ts +144 -0
  417. package/src/transform/index.ts +130 -0
  418. package/src/transform/transform-descriptor.ts +53 -0
  419. package/src/tui/storage-explorer.descriptor.ts +32 -0
  420. package/src/tui/storage-explorer.impl.consumer.ts +14 -0
  421. package/src/tui/storage-open.descriptor.ts +31 -0
  422. package/src/tui/storage-open.impl.consumer.ts +14 -0
  423. package/src/utils/error-context.ts +19 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Cloud Pull Service
3
+ *
4
+ * Pulls data from cloud storage for manifests that have cloud-api configured.
5
+ * Used at daemon startup to hydrate local state from cloud, and by the
6
+ * sync job for bidirectional sync.
7
+ */
8
+
9
+ import { getLogger } from '@vibesdotdev/logging';
10
+ import type { SyncState } from './schemas/sync-state';
11
+
12
+ const logger = getLogger('storage:cloud-pull');
13
+ import type { CloudPullOptions, CloudPullResult } from './schemas/cloud-pull';
14
+ import {
15
+ loadSyncState,
16
+ saveSyncState,
17
+ getManifestSyncState,
18
+ computeHash,
19
+ markSynced,
20
+ markConflict,
21
+ markError
22
+ } from './sync-state.consumer';
23
+
24
+ export type { CloudPullOptions, CloudPullResult } from './schemas/cloud-pull';
25
+
26
+ const LOG_PREFIX = '[cloud-pull]';
27
+
28
+ /**
29
+ * Pull data from cloud for all eligible manifests.
30
+ * Called at daemon startup and periodically by the sync job.
31
+ */
32
+ export async function pullFromCloud(options: CloudPullOptions = {}): Promise<CloudPullResult> {
33
+ const { manifestIds, force = false, dryRun = false } = options;
34
+
35
+ const result: CloudPullResult = { pulled: 0, skipped: 0, conflicts: 0, errors: 0, details: [] };
36
+
37
+ try {
38
+ const { getVibesRuntime } = await import('@vibesdotdev/runtime');
39
+ const { StorageManifest } = await import('../manifest/base');
40
+ const runtime = getVibesRuntime();
41
+
42
+ // Find manifests with cloud-api support
43
+ const descriptors = runtime.query('storage/manifest').descriptors() as unknown as Array<{
44
+ id: string;
45
+ allowedAdapters?: string[];
46
+ namespace: string;
47
+ schema: unknown;
48
+ adapterConfig?: Record<string, Record<string, unknown>>;
49
+ }>;
50
+
51
+ const eligible = descriptors.filter((d) => {
52
+ if (!d.allowedAdapters?.includes('storage.cloud-api')) return false;
53
+ if (manifestIds?.length && !manifestIds.includes(d.id)) return false;
54
+ return true;
55
+ });
56
+
57
+ if (eligible.length === 0) {
58
+ logger.debug(`${LOG_PREFIX} No eligible manifests for cloud pull`);
59
+ return result;
60
+ }
61
+
62
+ const syncState = await loadSyncState();
63
+
64
+ // Resolve cloud adapter once
65
+ const cloudAdapter = await runtime
66
+ .query('storage/adapter')
67
+ .filter((d: { id: string }) => d.id === 'storage.cloud-api')
68
+ .resolve();
69
+
70
+ if (!cloudAdapter) {
71
+ logger.debug(`${LOG_PREFIX} Cloud adapter not available`);
72
+ return result;
73
+ }
74
+
75
+ const adapter = cloudAdapter as {
76
+ configure(config: Record<string, unknown>): void;
77
+ documentStore<T>(
78
+ ns: string,
79
+ schema: unknown,
80
+ manifest?: unknown
81
+ ): { load(): Promise<T | null> };
82
+ };
83
+
84
+ for (const descriptor of eligible) {
85
+ try {
86
+ const pullResult = await pullManifest(
87
+ descriptor,
88
+ adapter,
89
+ syncState,
90
+ new StorageManifest(descriptor.id),
91
+ { force, dryRun }
92
+ );
93
+ result.details.push(pullResult);
94
+
95
+ switch (pullResult.action) {
96
+ case 'pulled':
97
+ result.pulled++;
98
+ break;
99
+ case 'conflict':
100
+ result.conflicts++;
101
+ break;
102
+ case 'error':
103
+ result.errors++;
104
+ break;
105
+ default:
106
+ result.skipped++;
107
+ }
108
+ } catch (error) {
109
+ const msg = (error as Error).message;
110
+ logger.warn(`${LOG_PREFIX} Pull failed for ${descriptor.id}`, { error: msg });
111
+ markError(syncState, descriptor.id, msg);
112
+ result.details.push({ manifestId: descriptor.id, action: 'error', message: msg });
113
+ result.errors++;
114
+ }
115
+ }
116
+
117
+ if (!dryRun) {
118
+ await saveSyncState(syncState);
119
+ }
120
+
121
+ logger.info(`${LOG_PREFIX} Pull complete`, {
122
+ pulled: result.pulled,
123
+ skipped: result.skipped,
124
+ conflicts: result.conflicts,
125
+ errors: result.errors
126
+ });
127
+ } catch (error) {
128
+ logger.error(`${LOG_PREFIX} Pull failed`, error as Error);
129
+ }
130
+
131
+ return result;
132
+ }
133
+
134
+ async function pullManifest(
135
+ descriptor: {
136
+ id: string;
137
+ namespace: string;
138
+ schema: unknown;
139
+ adapterConfig?: Record<string, Record<string, unknown>>;
140
+ },
141
+ adapter: {
142
+ configure(config: Record<string, unknown>): void;
143
+ documentStore<T>(ns: string, schema: unknown): { load(): Promise<T | null> };
144
+ },
145
+ syncState: SyncState,
146
+ localManifest: { load(): Promise<unknown>; save(data: never): Promise<void> },
147
+ options: { force: boolean; dryRun: boolean }
148
+ ): Promise<{
149
+ manifestId: string;
150
+ action: 'pulled' | 'skipped' | 'conflict' | 'error';
151
+ message?: string;
152
+ }> {
153
+ const { id: manifestId, namespace, schema } = descriptor;
154
+ const cloudConfig = descriptor.adapterConfig?.['storage.cloud-api'] ?? {};
155
+
156
+ adapter.configure(cloudConfig);
157
+ const store = adapter.documentStore<unknown>(namespace, schema);
158
+
159
+ // Load remote
160
+ let remoteData: unknown;
161
+ try {
162
+ remoteData = await store.load();
163
+ } catch {
164
+ return { manifestId, action: 'skipped', message: 'Cloud not reachable' };
165
+ }
166
+
167
+ if (!remoteData) {
168
+ return { manifestId, action: 'skipped', message: 'No remote data' };
169
+ }
170
+
171
+ const remoteHash = computeHash(remoteData);
172
+ const prev = getManifestSyncState(syncState, manifestId);
173
+
174
+ // Load local for comparison
175
+ const localData = await localManifest.load();
176
+ const localHash = localData ? computeHash(localData) : null;
177
+
178
+ // Already in sync
179
+ if (localHash === remoteHash) {
180
+ markSynced(syncState, manifestId, remoteHash, 'pull');
181
+ return { manifestId, action: 'skipped', message: 'Already in sync' };
182
+ }
183
+
184
+ // Check for conflicts
185
+ const localChanged = localHash !== prev.localHash && localHash !== null;
186
+ const remoteChanged = remoteHash !== prev.remoteHash;
187
+
188
+ if (localChanged && remoteChanged && !options.force) {
189
+ markConflict(syncState, manifestId, localHash ?? '', remoteHash);
190
+ return { manifestId, action: 'conflict', message: 'Both sides changed' };
191
+ }
192
+
193
+ // Pull remote → local
194
+ if (options.dryRun) {
195
+ return { manifestId, action: 'pulled', message: '[dry-run] Would pull from cloud' };
196
+ }
197
+
198
+ await localManifest.save(remoteData as never);
199
+ markSynced(syncState, manifestId, remoteHash, 'pull');
200
+ logger.info(`${LOG_PREFIX} Pulled ${manifestId} from cloud`);
201
+ return { manifestId, action: 'pulled' };
202
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Resolve a record's cloud-API CRUD configuration from its descriptor.
3
+ *
4
+ * Reads `StorageRecordDescriptor` metadata only; consumed by storage core's
5
+ * `record-sync-bridge`. Storage core owns it because adapters depend on core,
6
+ * not the other way around.
7
+ */
8
+
9
+ import type { StorageRecordDescriptor } from '../schemas/record';
10
+
11
+ export type CloudRecordCrudConfig = {
12
+ apiPath: string;
13
+ entityPath?: string;
14
+ listField?: string;
15
+ totalField?: string;
16
+ createMethod?: 'POST' | 'PUT';
17
+ updateMethod?: 'PUT' | 'PATCH';
18
+ deleteMethod?: 'DELETE';
19
+ };
20
+
21
+ export function resolveCloudRecordCrudConfig(
22
+ descriptor: StorageRecordDescriptor
23
+ ): CloudRecordCrudConfig {
24
+ const remoteCrud =
25
+ descriptor.remote?.adapter === 'storage.cloud-api' ? descriptor.remote.crud : null;
26
+ if (remoteCrud) {
27
+ return remoteCrud as CloudRecordCrudConfig;
28
+ }
29
+
30
+ const raw = descriptor.adapterConfig?.['storage.cloud-api'];
31
+ const value =
32
+ raw && typeof raw === 'object' && 'record' in raw ? (raw as { record: unknown }).record : raw;
33
+ if (
34
+ !value ||
35
+ typeof value !== 'object' ||
36
+ typeof (value as { apiPath?: unknown }).apiPath !== 'string'
37
+ ) {
38
+ throw new Error(`Record '${descriptor.id}' is missing storage.cloud-api remote CRUD metadata.`);
39
+ }
40
+ return value as CloudRecordCrudConfig;
41
+ }
@@ -0,0 +1,183 @@
1
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
2
+ import { resolveWorkspacePath } from '../paths';
3
+ import { StorageRecord } from '../record';
4
+ import { resolveCloudRecordCrudConfig } from './cloud-record-crud-config';
5
+ import type { StorageRecordInterface } from '../interfaces/record';
6
+ import type {
7
+ StorageRecordDescriptor,
8
+ StorageRecordLocalSyncContext,
9
+ StorageRecordRemoteSyncContext
10
+ } from '../schemas/record';
11
+ import type { SyncBridgeDescriptor } from '../schemas/sync-bridge-descriptor';
12
+
13
+ const PAGE_SIZE = 200;
14
+
15
+ /** Subset of `descriptor.sync` (StorageSyncConfig) used by the bridge. */
16
+ type RecordSyncConfig = NonNullable<StorageRecordDescriptor['sync']>;
17
+
18
+ /** Hook signatures matching `StorageRecordSyncHooks`, derived locally for callable narrowing. */
19
+ type CollectHook = (
20
+ context: StorageRecordLocalSyncContext
21
+ ) => Promise<Record<string, unknown>[]>;
22
+ type ToRemoteHook = (
23
+ item: Record<string, unknown>,
24
+ context?: StorageRecordLocalSyncContext
25
+ ) => Record<string, unknown>;
26
+ type FromRemoteHook = (item: Record<string, unknown>) => Record<string, unknown>;
27
+ type BeforePushHook = (
28
+ item: Record<string, unknown>,
29
+ context: StorageRecordRemoteSyncContext
30
+ ) => Promise<void>;
31
+ type DeleteRemoteHook = BeforePushHook;
32
+ type WritePulledHook = (
33
+ items: Record<string, unknown>[],
34
+ context: StorageRecordLocalSyncContext
35
+ ) => Promise<void>;
36
+
37
+ export function isSyncableStorageRecord(descriptor: StorageRecordDescriptor): boolean {
38
+ if (descriptor.enabled === false) return false;
39
+ if (!descriptor.allowedAdapters.includes('storage.cloud-api')) return false;
40
+ try {
41
+ resolveCloudRecordCrudConfig(descriptor);
42
+ return true;
43
+ } catch {
44
+ return false;
45
+ }
46
+ }
47
+
48
+ export function createRecordSyncBridgeDescriptor(
49
+ descriptor: StorageRecordDescriptor
50
+ ): SyncBridgeDescriptor {
51
+ const sync = descriptor.sync as RecordSyncConfig | undefined;
52
+ const remote = resolveCloudRecordCrudConfig(descriptor);
53
+ const beforePush = sync?.beforePush as BeforePushHook | undefined;
54
+ const deleteRemote = sync?.deleteRemote as DeleteRemoteHook | undefined;
55
+ return {
56
+ kind: 'storage/sync-bridge',
57
+ id: descriptor.id,
58
+ name: `${descriptor.name} Sync`,
59
+ description: `Syncs ${descriptor.name} through storage/record metadata`,
60
+ tags: [...(descriptor.tags ?? []), 'storage', 'record', 'sync'],
61
+ source: { runtimeKind: descriptor.id },
62
+ target: {
63
+ apiPath: remote.apiPath,
64
+ entityPath: remote.entityPath,
65
+ listField: remote.listField,
66
+ totalField: remote.totalField,
67
+ includeDeleted: Boolean(descriptor.softDelete)
68
+ },
69
+ sync: {
70
+ direction: 'bidirectional',
71
+ ownershipFilter: sync?.ownershipFilter ?? 'all',
72
+ conflictStrategy: sync?.conflictStrategy ?? 'local-wins',
73
+ sensitiveFields: sync?.sensitiveFields ?? [],
74
+ idField: sync?.idField ?? descriptor.primaryKey ?? 'id'
75
+ },
76
+ collect: () => collectRecordItems(descriptor, sync),
77
+ toRemote: sync?.toRemote as ToRemoteHook | undefined,
78
+ fromRemote: sync?.fromRemote as FromRemoteHook | undefined,
79
+ beforePush: beforePush
80
+ ? (
81
+ record: Record<string, unknown>,
82
+ context: {
83
+ apiEndpoint: string;
84
+ apiToken?: string;
85
+ fetch: (input: string, init?: RequestInit) => Promise<Response>;
86
+ }
87
+ ) =>
88
+ beforePush(record, {
89
+ ...context,
90
+ runtime: getVibesRuntime()
91
+ } as StorageRecordRemoteSyncContext)
92
+ : undefined,
93
+ deleteRemote: deleteRemote
94
+ ? (
95
+ record: Record<string, unknown>,
96
+ context: {
97
+ apiEndpoint: string;
98
+ apiToken?: string;
99
+ fetch: (input: string, init?: RequestInit) => Promise<Response>;
100
+ }
101
+ ) =>
102
+ deleteRemote(record, {
103
+ ...context,
104
+ runtime: getVibesRuntime()
105
+ } as StorageRecordRemoteSyncContext)
106
+ : undefined,
107
+ writePulled: (items: Record<string, unknown>[]) =>
108
+ writePulledRecordItems(descriptor, sync, items)
109
+ };
110
+ }
111
+
112
+ async function collectRecordItems(
113
+ descriptor: StorageRecordDescriptor,
114
+ sync: RecordSyncConfig | undefined
115
+ ): Promise<Record<string, unknown>[]> {
116
+ const runtime = getVibesRuntime();
117
+ const record = await resolveLocalRecord(descriptor);
118
+ const collect = sync?.collect as CollectHook | undefined;
119
+ if (collect) {
120
+ return collect({
121
+ runtime,
122
+ record: record as StorageRecordInterface<Record<string, unknown>>
123
+ });
124
+ }
125
+ return listAllRecords(record as StorageRecordInterface<Record<string, unknown>>);
126
+ }
127
+
128
+ async function writePulledRecordItems(
129
+ descriptor: StorageRecordDescriptor,
130
+ sync: RecordSyncConfig | undefined,
131
+ items: Record<string, unknown>[]
132
+ ): Promise<void> {
133
+ const runtime = getVibesRuntime();
134
+ const record = (await resolveLocalRecord(descriptor)) as StorageRecordInterface<
135
+ Record<string, unknown>
136
+ >;
137
+ const writePulled = sync?.writePulled as WritePulledHook | undefined;
138
+ if (writePulled) {
139
+ await writePulled(items, { runtime, record });
140
+ return;
141
+ }
142
+ const idField = sync?.idField ?? descriptor.primaryKey ?? 'id';
143
+ for (const item of items) {
144
+ const id = item[idField];
145
+ if (typeof id !== 'string') continue;
146
+ await record.delete(id, { force: true }).catch(() => undefined);
147
+ await record.create(item);
148
+ }
149
+ }
150
+
151
+ async function resolveLocalRecord(
152
+ descriptor: StorageRecordDescriptor
153
+ ): Promise<StorageRecord<Record<string, unknown>>> {
154
+ const localAdapters = descriptor.persistence?.localAdapters ?? ['storage.localdb'];
155
+ const localDescriptor: StorageRecordDescriptor = {
156
+ ...descriptor,
157
+ defaultAdapter: localAdapters[0] ?? descriptor.defaultAdapter,
158
+ persistence: {
159
+ ...(descriptor.persistence ?? { mode: 'local-first' }),
160
+ mode: 'local-only',
161
+ localAdapters,
162
+ remoteAdapters: descriptor.persistence?.remoteAdapters ?? ['storage.cloud-api']
163
+ }
164
+ };
165
+ const record = new StorageRecord<Record<string, unknown>>(localDescriptor, {
166
+ 'runtime/workspace-path': resolveWorkspacePath()
167
+ });
168
+ await record.initialize();
169
+ return record;
170
+ }
171
+
172
+ async function listAllRecords(
173
+ record: StorageRecordInterface<Record<string, unknown>>
174
+ ): Promise<Record<string, unknown>[]> {
175
+ const items: Record<string, unknown>[] = [];
176
+ let offset = 0;
177
+ for (;;) {
178
+ const page = await record.list({ limit: PAGE_SIZE, offset, includeDeleted: true });
179
+ items.push(...page.items);
180
+ if (page.items.length < PAGE_SIZE) return items;
181
+ offset += PAGE_SIZE;
182
+ }
183
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Resolve Sync Target
3
+ *
4
+ * Resolves the current sync target URL, environment name, and auth token from the runtime.
5
+ * Used by CLI commands and sync-bridge to determine where to push/pull data.
6
+ *
7
+ * Resolution chain for sync target:
8
+ * 1. config/environment → apiUrl
9
+ * 2. VIBES_API_URL environment variable
10
+ * 3. 'unknown' (no target configured)
11
+ *
12
+ * Resolution chain for auth token:
13
+ * 1. config/environment → apiToken
14
+ * 2. config/manifest#auth → credentials.token (CLI credential store)
15
+ * 3. VIBES_AUTH_TOKEN environment variable
16
+ */
17
+
18
+ import { getRuntimeEnv, getVibesRuntime } from '@vibesdotdev/runtime';
19
+
20
+ export interface SyncTarget {
21
+ syncTarget: string;
22
+ envName: string;
23
+ apiToken?: string;
24
+ }
25
+
26
+ export async function resolveSyncTarget(): Promise<SyncTarget> {
27
+ let syncTarget = getRuntimeEnv('VIBES_API_URL') ?? 'unknown';
28
+ let envName = 'env';
29
+ let apiToken: string | undefined;
30
+
31
+ try {
32
+ const runtime = getVibesRuntime();
33
+ const env = (await runtime.query('config/environment').resolve()) as {
34
+ apiUrl?: string;
35
+ id?: string;
36
+ name?: string;
37
+ apiToken?: string;
38
+ } | null;
39
+
40
+ if (env?.apiUrl) syncTarget = env.apiUrl;
41
+ if (env?.name) envName = env.name;
42
+ else if (env?.id) envName = env.id;
43
+ if (env?.apiToken) apiToken = env.apiToken;
44
+ } catch {
45
+ // Environment resolution may fail; use fallback
46
+ }
47
+
48
+ // Credential store lives in the app layer; consumers must supply auth via
49
+ // environment config or VIBES_AUTH_TOKEN.
50
+
51
+ // Fallback to environment variable
52
+ if (!apiToken && getRuntimeEnv('VIBES_AUTH_TOKEN')) {
53
+ apiToken = getRuntimeEnv('VIBES_AUTH_TOKEN');
54
+ }
55
+
56
+ return { syncTarget, envName, apiToken };
57
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Cloud Pull Schemas
3
+ *
4
+ * Types for cloud pull operations — options and result structures.
5
+ */
6
+
7
+ export interface CloudPullOptions {
8
+ /** Only pull specific manifests */
9
+ manifestIds?: string[];
10
+ /** Force overwrite local even if local has changes */
11
+ force?: boolean;
12
+ /** Preview without writing */
13
+ dryRun?: boolean;
14
+ }
15
+
16
+ export interface CloudPullResult {
17
+ pulled: number;
18
+ skipped: number;
19
+ conflicts: number;
20
+ errors: number;
21
+ details: Array<{
22
+ manifestId: string;
23
+ action: 'pulled' | 'skipped' | 'conflict' | 'error';
24
+ message?: string;
25
+ }>;
26
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Storage Sync Schemas
3
+ *
4
+ * Re-exports all sync-related schemas and types.
5
+ */
6
+
7
+ export {
8
+ SyncStatusSchema,
9
+ ManifestSyncStateSchema,
10
+ SyncStateSchema,
11
+ type SyncStatus,
12
+ type ManifestSyncState,
13
+ type SyncState
14
+ } from './sync-state';
15
+
16
+ export { type CloudPullOptions, type CloudPullResult } from './cloud-pull';
17
+
18
+ export { type SyncHelpers } from './sync-helpers';
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Sync Helpers Schema
3
+ *
4
+ * Interface for sync operation helper functions passed between sync components.
5
+ */
6
+
7
+ import type { SyncState, ManifestSyncState } from './sync-state';
8
+
9
+ export interface SyncHelpers {
10
+ dryRun: boolean;
11
+ computeHash: (data: unknown) => string;
12
+ getManifestSyncState: (state: SyncState, id: string) => ManifestSyncState;
13
+ markSynced: (state: SyncState, id: string, hash: string, dir: 'push' | 'pull') => void;
14
+ markLocalAhead: (state: SyncState, id: string, hash: string) => void;
15
+ markConflict: (state: SyncState, id: string, local: string, remote: string) => void;
16
+ markError: (state: SyncState, id: string, msg: string) => void;
17
+ markRemoteAhead: (state: SyncState, id: string, hash: string) => void;
18
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Sync State Schemas
3
+ *
4
+ * Zod schemas and inferred types for per-manifest sync state tracking.
5
+ * Pure schemas — no host/fs imports.
6
+ */
7
+
8
+ import * as z from 'zod/v4';
9
+
10
+ export const SyncStatusSchema = z.enum([
11
+ 'in-sync',
12
+ 'local-ahead',
13
+ 'remote-ahead',
14
+ 'conflict',
15
+ 'paused',
16
+ 'never-synced'
17
+ ]);
18
+
19
+ export type SyncStatus = z.infer<typeof SyncStatusSchema>;
20
+
21
+ export const ManifestSyncStateSchema = z.object({
22
+ manifestId: z.string(),
23
+ localHash: z.string().nullable(),
24
+ remoteHash: z.string().nullable(),
25
+ lastLocalChange: z.string().nullable(),
26
+ lastRemoteChange: z.string().nullable(),
27
+ lastSyncAt: z.string().nullable(),
28
+ lastSyncDirection: z.enum(['push', 'pull']).nullable(),
29
+ syncStatus: SyncStatusSchema,
30
+ errorMessage: z.string().nullable()
31
+ });
32
+
33
+ export type ManifestSyncState = z.infer<typeof ManifestSyncStateSchema>;
34
+
35
+ export const SyncStateSchema = z.object({
36
+ version: z.literal(1),
37
+ updatedAt: z.string(),
38
+ manifests: z.record(z.string(), ManifestSyncStateSchema)
39
+ });
40
+
41
+ export type SyncState = z.infer<typeof SyncStateSchema>;