@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,204 @@
1
+ /**
2
+ * Storage Plugin
3
+ *
4
+ * Registers storage/adapter, storage/manifest, and storage/record kinds with the runtime.
5
+ * This is the entry point for the storage module's runtime integration.
6
+ *
7
+ * Also registers storage-owned TUI surfaces during activation:
8
+ * - `storage.explorer` (tui/app) — interactive storage browser
9
+ * - `storage.open` (tui/command) — opens the explorer via `/storage`
10
+ */
11
+ import { createRuntimePlugin, loader } from '@vibesdotdev/runtime';
12
+ import { createRuntimeImplementation } from '@vibesdotdev/runtime/factory/implementation';
13
+ import storagePolicyContextDescriptor from './storage-policy.context.descriptor';
14
+ import { loadStoragePolicyContext } from './storage-policy.context.server';
15
+ // CLI
16
+ import storageGroup from "./cli/storage.cli-group.descriptor.js";
17
+ import storageSyncGroup from "./cli/storage.sync.cli-group.descriptor.js";
18
+ import storageList from "./cli/commands/list/storage.list.cli-command.descriptor.js";
19
+ import storageSyncPull from "./cli/commands/sync/pull/storage.sync.pull.cli-command.descriptor.js";
20
+ import storageSyncPush from "./cli/commands/sync/push/storage.sync.push.cli-command.descriptor.js";
21
+ import storageSyncResolve from "./cli/commands/sync/resolve/storage.sync.resolve.cli-command.descriptor.js";
22
+ import storageSyncStatus from "./cli/commands/sync/status/storage.sync.status.cli-command.descriptor.js";
23
+ // TUI
24
+ import storageExplorerDescriptor from './tui/storage-explorer.descriptor';
25
+ import storageOpenDescriptor from './tui/storage-open.descriptor';
26
+ // Docs
27
+ import adaptersDescriptor from './docs/adapters.docs.descriptor';
28
+ import recordsDescriptor from './docs/records.docs.descriptor';
29
+ import syncDescriptor from './docs/sync.docs.descriptor';
30
+ import manifestsDescriptor from './docs/manifests.docs.descriptor';
31
+ import { StorageAdapterDescriptorSchema } from './schemas/adapter-descriptor';
32
+ import { StorageManifestDescriptorSchema } from './schemas/manifest-descriptor';
33
+ import { StorageRecordDescriptorSchema } from './schemas/record';
34
+ import { SyncBridgeDescriptorSchema } from './schemas/sync-bridge-descriptor';
35
+ import { StorageTransformDescriptorSchema } from './transform/transform-descriptor';
36
+ import { StorageManifest } from './manifest/base';
37
+ import { storageRecordEvents } from './record/events';
38
+ const storageRecordDefaultImplementation = (() => {
39
+ if (typeof globalThis !== 'undefined' && 'window' in globalThis)
40
+ return undefined;
41
+ try {
42
+ const runtimeRequire = import.meta.require;
43
+ if (typeof runtimeRequire !== 'function')
44
+ return undefined;
45
+ return runtimeRequire('./record/base.ts').StorageRecord;
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ })();
51
+ // Kind definitions - types are inferred to work with AnyKindDefinition
52
+ const storageAdapterKind = {
53
+ id: 'storage/adapter',
54
+ descriptorSchema: StorageAdapterDescriptorSchema,
55
+ /**
56
+ * Resolution strategy: Find adapter matching hardware target.
57
+ * Prefers persistent adapters over memory when available.
58
+ *
59
+ * No defaultImplementation — adapter packages register their own descriptor + loader
60
+ * via their plugin (e.g. `storageAdapterMemoryPlugin`). Consumers must register at
61
+ * least one adapter plugin matching their scope.
62
+ */
63
+ resolve: (candidates, scope) => {
64
+ // Filter to candidates matching hardware
65
+ const matching = candidates.filter((d) => !d.hardware || d.hardware.length === 0 || d.hardware.includes(scope.hardware));
66
+ if (matching.length === 0)
67
+ return undefined;
68
+ // Prefer persistent adapters
69
+ const persistent = matching.filter((d) => d.persistent);
70
+ if (persistent.length > 0)
71
+ return persistent[0];
72
+ // Fall back to any matching
73
+ return matching[0];
74
+ }
75
+ };
76
+ const storageManifestKind = {
77
+ id: 'storage/manifest',
78
+ descriptorSchema: StorageManifestDescriptorSchema,
79
+ contexts: ['runtime/workspace-path'],
80
+ /**
81
+ * Default implementation: StorageManifest
82
+ *
83
+ * Base class providing document operations (load, save, exists, delete).
84
+ * Modules can extend this for custom methods.
85
+ * Constructor signature: (descriptor, context) - context provides runtime access.
86
+ */
87
+ defaultImplementation: StorageManifest
88
+ // No custom resolve - manifests are looked up by ID, not scope-based
89
+ };
90
+ const storageRecordKind = {
91
+ id: 'storage/record',
92
+ descriptorSchema: StorageRecordDescriptorSchema,
93
+ contexts: ['runtime/workspace-path', 'storage/policy'],
94
+ ...(storageRecordDefaultImplementation
95
+ ? { defaultImplementation: storageRecordDefaultImplementation }
96
+ : {})
97
+ };
98
+ const storageSyncBridgeKind = {
99
+ id: 'storage/sync-bridge',
100
+ descriptorSchema: SyncBridgeDescriptorSchema
101
+ // No defaultImplementation — SyncBridge is server/CLI only.
102
+ // Implementations are registered by the bun loader during discovery.
103
+ };
104
+ const storageTransformKind = {
105
+ id: 'storage/transform',
106
+ descriptorSchema: StorageTransformDescriptorSchema
107
+ // No defaultImplementation — transforms are plugin-registered per
108
+ // manifest. The wire shape is `{ fromRow, toRow? }` (see
109
+ // `./transform/transform-descriptor.ts`). Consumers resolve via
110
+ // `resolveStorageTransform(runtime, id)`.
111
+ };
112
+ function loadTuiImplementation(kind, id, load) {
113
+ return async () => {
114
+ const mod = await load();
115
+ return createRuntimeImplementation({
116
+ kind,
117
+ id,
118
+ implementation: mod.default
119
+ });
120
+ };
121
+ }
122
+ /**
123
+ * Storage plugin - registers storage kinds with the runtime.
124
+ *
125
+ * Kinds registered:
126
+ * - `storage/adapter` - Storage backends. Adapter implementations live in sibling
127
+ * packages (`storage-adapter-{memory,json,localdb,cloud-api,drizzle}`) and register
128
+ * themselves via their own plugins. The storage core does not import them.
129
+ * - `storage/manifest` - Storable data type definitions
130
+ * - `storage/record` - Single-table CRUD operations with relations
131
+ * - `storage/sync-bridge` - Declarative runtime kind ↔ cloud CRUD sync
132
+ *
133
+ * @example
134
+ * ```ts
135
+ * import { getVibesRuntime } from '@vibesdotdev/runtime/factory/plugin';
136
+ * import storagePlugin from './storage.plugin';
137
+ *
138
+ * const runtime = getVibesRuntime();
139
+ * await runtime.registerPlugin(storagePlugin);
140
+ *
141
+ * // Now you can query storage adapters
142
+ * const adapter = await runtime.query('storage/adapter')
143
+ * .forHardware('consumer')
144
+ * .resolve();
145
+ * ```
146
+ */
147
+ export default createRuntimePlugin({
148
+ id: 'storage',
149
+ name: 'Storage Module',
150
+ description: 'Interface-driven storage providers for document and repository-style storage',
151
+ dependencies: ['context'],
152
+ kinds: [
153
+ storageAdapterKind,
154
+ storageManifestKind,
155
+ storageRecordKind,
156
+ storageSyncBridgeKind,
157
+ storageTransformKind
158
+ ],
159
+ descriptors: [
160
+ storageGroup,
161
+ storageSyncGroup,
162
+ storageList,
163
+ storageSyncPull,
164
+ storageSyncPush,
165
+ storageSyncResolve,
166
+ storageSyncStatus,
167
+ ...storageRecordEvents,
168
+ adaptersDescriptor,
169
+ recordsDescriptor,
170
+ syncDescriptor,
171
+ manifestsDescriptor
172
+ ],
173
+ loaders: [
174
+ loader('storage.list', () => import('./cli/commands/list/storage.list.cli-command.impl.js')),
175
+ loader('storage.sync.push', () => import('./cli/commands/sync/push/storage.sync.push.cli-command.impl.js')),
176
+ loader('storage.sync.pull', () => import('./cli/commands/sync/pull/storage.sync.pull.cli-command.impl.js')),
177
+ loader('storage.sync.status', () => import('./cli/commands/sync/status/storage.sync.status.cli-command.impl.js')),
178
+ loader('storage.sync.resolve', () => import('./cli/commands/sync/resolve/storage.sync.resolve.cli-command.impl.js'))
179
+ ],
180
+ onRegister: async (runtime) => {
181
+ // Register storage-owned TUI surfaces only when the tui/* kinds are
182
+ // available. The standard bootstrap (see apps/cli-bin defaults.ts)
183
+ // loads tui before storage. Keeping this conditional lets minimal
184
+ // test setups register storage without spinning up the TUI stack.
185
+ if (runtime.hasKind('tui/app')) {
186
+ runtime.registerDescriptor('tui/app', storageExplorerDescriptor);
187
+ runtime.registerLoader('tui/app', storageExplorerDescriptor.id, loadTuiImplementation('tui/app', storageExplorerDescriptor.id, () => import('./tui/storage-explorer.impl.consumer')));
188
+ }
189
+ if (runtime.hasKind('tui/command')) {
190
+ runtime.registerDescriptor('tui/command', storageOpenDescriptor);
191
+ runtime.registerLoader('tui/command', storageOpenDescriptor.id, loadTuiImplementation('tui/command', storageOpenDescriptor.id, () => import('./tui/storage-open.impl.consumer')));
192
+ }
193
+ // Register storage policy context
194
+ runtime.registerDescriptor('context', storagePolicyContextDescriptor);
195
+ runtime.registerLoader('context', storagePolicyContextDescriptor.id, async () => createRuntimeImplementation({
196
+ kind: 'context',
197
+ id: storagePolicyContextDescriptor.id,
198
+ implementation: {
199
+ provide: async () => loadStoragePolicyContext()
200
+ }
201
+ }));
202
+ }
203
+ });
204
+ //# sourceMappingURL=storage.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.plugin.js","sourceRoot":"","sources":["../src/storage.plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
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
+ import type { CloudPullOptions, CloudPullResult } from './schemas/cloud-pull';
9
+ export type { CloudPullOptions, CloudPullResult } from './schemas/cloud-pull';
10
+ /**
11
+ * Pull data from cloud for all eligible manifests.
12
+ * Called at daemon startup and periodically by the sync job.
13
+ */
14
+ export declare function pullFromCloud(options?: CloudPullOptions): Promise<CloudPullResult>;
15
+ //# sourceMappingURL=cloud-pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-pull.d.ts","sourceRoot":"","sources":["../../src/sync/cloud-pull.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAW9E,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI9E;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoG5F"}
@@ -0,0 +1,130 @@
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
+ import { getLogger } from '@vibesdotdev/logging';
9
+ const logger = getLogger('storage:cloud-pull');
10
+ import { loadSyncState, saveSyncState, getManifestSyncState, computeHash, markSynced, markConflict, markError } from './sync-state.consumer.js';
11
+ const LOG_PREFIX = '[cloud-pull]';
12
+ /**
13
+ * Pull data from cloud for all eligible manifests.
14
+ * Called at daemon startup and periodically by the sync job.
15
+ */
16
+ export async function pullFromCloud(options = {}) {
17
+ const { manifestIds, force = false, dryRun = false } = options;
18
+ const result = { pulled: 0, skipped: 0, conflicts: 0, errors: 0, details: [] };
19
+ try {
20
+ const { getVibesRuntime } = await import('@vibesdotdev/runtime');
21
+ const { StorageManifest } = await import('../manifest/base.js');
22
+ const runtime = getVibesRuntime();
23
+ // Find manifests with cloud-api support
24
+ const descriptors = runtime.query('storage/manifest').descriptors();
25
+ const eligible = descriptors.filter((d) => {
26
+ if (!d.allowedAdapters?.includes('storage.cloud-api'))
27
+ return false;
28
+ if (manifestIds?.length && !manifestIds.includes(d.id))
29
+ return false;
30
+ return true;
31
+ });
32
+ if (eligible.length === 0) {
33
+ logger.debug(`${LOG_PREFIX} No eligible manifests for cloud pull`);
34
+ return result;
35
+ }
36
+ const syncState = await loadSyncState();
37
+ // Resolve cloud adapter once
38
+ const cloudAdapter = await runtime
39
+ .query('storage/adapter')
40
+ .filter((d) => d.id === 'storage.cloud-api')
41
+ .resolve();
42
+ if (!cloudAdapter) {
43
+ logger.debug(`${LOG_PREFIX} Cloud adapter not available`);
44
+ return result;
45
+ }
46
+ const adapter = cloudAdapter;
47
+ for (const descriptor of eligible) {
48
+ try {
49
+ const pullResult = await pullManifest(descriptor, adapter, syncState, new StorageManifest(descriptor.id), { force, dryRun });
50
+ result.details.push(pullResult);
51
+ switch (pullResult.action) {
52
+ case 'pulled':
53
+ result.pulled++;
54
+ break;
55
+ case 'conflict':
56
+ result.conflicts++;
57
+ break;
58
+ case 'error':
59
+ result.errors++;
60
+ break;
61
+ default:
62
+ result.skipped++;
63
+ }
64
+ }
65
+ catch (error) {
66
+ const msg = error.message;
67
+ logger.warn(`${LOG_PREFIX} Pull failed for ${descriptor.id}`, { error: msg });
68
+ markError(syncState, descriptor.id, msg);
69
+ result.details.push({ manifestId: descriptor.id, action: 'error', message: msg });
70
+ result.errors++;
71
+ }
72
+ }
73
+ if (!dryRun) {
74
+ await saveSyncState(syncState);
75
+ }
76
+ logger.info(`${LOG_PREFIX} Pull complete`, {
77
+ pulled: result.pulled,
78
+ skipped: result.skipped,
79
+ conflicts: result.conflicts,
80
+ errors: result.errors
81
+ });
82
+ }
83
+ catch (error) {
84
+ logger.error(`${LOG_PREFIX} Pull failed`, error);
85
+ }
86
+ return result;
87
+ }
88
+ async function pullManifest(descriptor, adapter, syncState, localManifest, options) {
89
+ const { id: manifestId, namespace, schema } = descriptor;
90
+ const cloudConfig = descriptor.adapterConfig?.['storage.cloud-api'] ?? {};
91
+ adapter.configure(cloudConfig);
92
+ const store = adapter.documentStore(namespace, schema);
93
+ // Load remote
94
+ let remoteData;
95
+ try {
96
+ remoteData = await store.load();
97
+ }
98
+ catch {
99
+ return { manifestId, action: 'skipped', message: 'Cloud not reachable' };
100
+ }
101
+ if (!remoteData) {
102
+ return { manifestId, action: 'skipped', message: 'No remote data' };
103
+ }
104
+ const remoteHash = computeHash(remoteData);
105
+ const prev = getManifestSyncState(syncState, manifestId);
106
+ // Load local for comparison
107
+ const localData = await localManifest.load();
108
+ const localHash = localData ? computeHash(localData) : null;
109
+ // Already in sync
110
+ if (localHash === remoteHash) {
111
+ markSynced(syncState, manifestId, remoteHash, 'pull');
112
+ return { manifestId, action: 'skipped', message: 'Already in sync' };
113
+ }
114
+ // Check for conflicts
115
+ const localChanged = localHash !== prev.localHash && localHash !== null;
116
+ const remoteChanged = remoteHash !== prev.remoteHash;
117
+ if (localChanged && remoteChanged && !options.force) {
118
+ markConflict(syncState, manifestId, localHash ?? '', remoteHash);
119
+ return { manifestId, action: 'conflict', message: 'Both sides changed' };
120
+ }
121
+ // Pull remote → local
122
+ if (options.dryRun) {
123
+ return { manifestId, action: 'pulled', message: '[dry-run] Would pull from cloud' };
124
+ }
125
+ await localManifest.save(remoteData);
126
+ markSynced(syncState, manifestId, remoteHash, 'pull');
127
+ logger.info(`${LOG_PREFIX} Pulled ${manifestId} from cloud`);
128
+ return { manifestId, action: 'pulled' };
129
+ }
130
+ //# sourceMappingURL=cloud-pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-pull.js","sourceRoot":"","sources":["../../src/sync/cloud-pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
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
+ import type { StorageRecordDescriptor } from '../schemas/record';
9
+ export type CloudRecordCrudConfig = {
10
+ apiPath: string;
11
+ entityPath?: string;
12
+ listField?: string;
13
+ totalField?: string;
14
+ createMethod?: 'POST' | 'PUT';
15
+ updateMethod?: 'PUT' | 'PATCH';
16
+ deleteMethod?: 'DELETE';
17
+ };
18
+ export declare function resolveCloudRecordCrudConfig(descriptor: StorageRecordDescriptor): CloudRecordCrudConfig;
19
+ //# sourceMappingURL=cloud-record-crud-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-record-crud-config.d.ts","sourceRoot":"","sources":["../../src/sync/cloud-record-crud-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IAC/B,YAAY,CAAC,EAAE,QAAQ,CAAC;CACxB,CAAC;AAEF,wBAAgB,4BAA4B,CAC3C,UAAU,EAAE,uBAAuB,GACjC,qBAAqB,CAkBvB"}
@@ -0,0 +1,22 @@
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
+ export function resolveCloudRecordCrudConfig(descriptor) {
9
+ const remoteCrud = descriptor.remote?.adapter === 'storage.cloud-api' ? descriptor.remote.crud : null;
10
+ if (remoteCrud) {
11
+ return remoteCrud;
12
+ }
13
+ const raw = descriptor.adapterConfig?.['storage.cloud-api'];
14
+ const value = raw && typeof raw === 'object' && 'record' in raw ? raw.record : raw;
15
+ if (!value ||
16
+ typeof value !== 'object' ||
17
+ typeof value.apiPath !== 'string') {
18
+ throw new Error(`Record '${descriptor.id}' is missing storage.cloud-api remote CRUD metadata.`);
19
+ }
20
+ return value;
21
+ }
22
+ //# sourceMappingURL=cloud-record-crud-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-record-crud-config.js","sourceRoot":"","sources":["../../src/sync/cloud-record-crud-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,UAAU,4BAA4B,CAC3C,UAAmC;IAEnC,MAAM,UAAU,GACf,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,UAAmC,CAAC;IAC5C,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC5D,MAAM,KAAK,GACV,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAE,GAA2B,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/F,IACC,CAAC,KAAK;QACN,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ,EAC3D,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,CAAC,EAAE,sDAAsD,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,KAA8B,CAAC;AACvC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { StorageRecordDescriptor } from '../schemas/record';
2
+ import type { SyncBridgeDescriptor } from '../schemas/sync-bridge-descriptor';
3
+ export declare function isSyncableStorageRecord(descriptor: StorageRecordDescriptor): boolean;
4
+ export declare function createRecordSyncBridgeDescriptor(descriptor: StorageRecordDescriptor): SyncBridgeDescriptor;
5
+ //# sourceMappingURL=record-sync-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-sync-bridge.d.ts","sourceRoot":"","sources":["../../src/sync/record-sync-bridge.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACX,uBAAuB,EAGvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AA0B9E,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CASpF;AAED,wBAAgB,gCAAgC,CAC/C,UAAU,EAAE,uBAAuB,GACjC,oBAAoB,CA4DtB"}
@@ -0,0 +1,121 @@
1
+ import { getVibesRuntime } from '@vibesdotdev/runtime';
2
+ import { resolveWorkspacePath } from '../paths.js';
3
+ import { StorageRecord } from '../record';
4
+ import { resolveCloudRecordCrudConfig } from './cloud-record-crud-config.js';
5
+ const PAGE_SIZE = 200;
6
+ export function isSyncableStorageRecord(descriptor) {
7
+ if (descriptor.enabled === false)
8
+ return false;
9
+ if (!descriptor.allowedAdapters.includes('storage.cloud-api'))
10
+ return false;
11
+ try {
12
+ resolveCloudRecordCrudConfig(descriptor);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ export function createRecordSyncBridgeDescriptor(descriptor) {
20
+ const sync = descriptor.sync;
21
+ const remote = resolveCloudRecordCrudConfig(descriptor);
22
+ const beforePush = sync?.beforePush;
23
+ const deleteRemote = sync?.deleteRemote;
24
+ return {
25
+ kind: 'storage/sync-bridge',
26
+ id: descriptor.id,
27
+ name: `${descriptor.name} Sync`,
28
+ description: `Syncs ${descriptor.name} through storage/record metadata`,
29
+ tags: [...(descriptor.tags ?? []), 'storage', 'record', 'sync'],
30
+ source: { runtimeKind: descriptor.id },
31
+ target: {
32
+ apiPath: remote.apiPath,
33
+ entityPath: remote.entityPath,
34
+ listField: remote.listField,
35
+ totalField: remote.totalField,
36
+ includeDeleted: Boolean(descriptor.softDelete)
37
+ },
38
+ sync: {
39
+ direction: 'bidirectional',
40
+ ownershipFilter: sync?.ownershipFilter ?? 'all',
41
+ conflictStrategy: sync?.conflictStrategy ?? 'local-wins',
42
+ sensitiveFields: sync?.sensitiveFields ?? [],
43
+ idField: sync?.idField ?? descriptor.primaryKey ?? 'id'
44
+ },
45
+ collect: () => collectRecordItems(descriptor, sync),
46
+ toRemote: sync?.toRemote,
47
+ fromRemote: sync?.fromRemote,
48
+ beforePush: beforePush
49
+ ? (record, context) => beforePush(record, {
50
+ ...context,
51
+ runtime: getVibesRuntime()
52
+ })
53
+ : undefined,
54
+ deleteRemote: deleteRemote
55
+ ? (record, context) => deleteRemote(record, {
56
+ ...context,
57
+ runtime: getVibesRuntime()
58
+ })
59
+ : undefined,
60
+ writePulled: (items) => writePulledRecordItems(descriptor, sync, items)
61
+ };
62
+ }
63
+ async function collectRecordItems(descriptor, sync) {
64
+ const runtime = getVibesRuntime();
65
+ const record = await resolveLocalRecord(descriptor);
66
+ const collect = sync?.collect;
67
+ if (collect) {
68
+ return collect({
69
+ runtime,
70
+ record: record
71
+ });
72
+ }
73
+ return listAllRecords(record);
74
+ }
75
+ async function writePulledRecordItems(descriptor, sync, items) {
76
+ const runtime = getVibesRuntime();
77
+ const record = (await resolveLocalRecord(descriptor));
78
+ const writePulled = sync?.writePulled;
79
+ if (writePulled) {
80
+ await writePulled(items, { runtime, record });
81
+ return;
82
+ }
83
+ const idField = sync?.idField ?? descriptor.primaryKey ?? 'id';
84
+ for (const item of items) {
85
+ const id = item[idField];
86
+ if (typeof id !== 'string')
87
+ continue;
88
+ await record.delete(id, { force: true }).catch(() => undefined);
89
+ await record.create(item);
90
+ }
91
+ }
92
+ async function resolveLocalRecord(descriptor) {
93
+ const localAdapters = descriptor.persistence?.localAdapters ?? ['storage.localdb'];
94
+ const localDescriptor = {
95
+ ...descriptor,
96
+ defaultAdapter: localAdapters[0] ?? descriptor.defaultAdapter,
97
+ persistence: {
98
+ ...(descriptor.persistence ?? { mode: 'local-first' }),
99
+ mode: 'local-only',
100
+ localAdapters,
101
+ remoteAdapters: descriptor.persistence?.remoteAdapters ?? ['storage.cloud-api']
102
+ }
103
+ };
104
+ const record = new StorageRecord(localDescriptor, {
105
+ 'runtime/workspace-path': resolveWorkspacePath()
106
+ });
107
+ await record.initialize();
108
+ return record;
109
+ }
110
+ async function listAllRecords(record) {
111
+ const items = [];
112
+ let offset = 0;
113
+ for (;;) {
114
+ const page = await record.list({ limit: PAGE_SIZE, offset, includeDeleted: true });
115
+ items.push(...page.items);
116
+ if (page.items.length < PAGE_SIZE)
117
+ return items;
118
+ offset += PAGE_SIZE;
119
+ }
120
+ }
121
+ //# sourceMappingURL=record-sync-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-sync-bridge.js","sourceRoot":"","sources":["../../src/sync/record-sync-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
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
+ export interface SyncTarget {
18
+ syncTarget: string;
19
+ envName: string;
20
+ apiToken?: string;
21
+ }
22
+ export declare function resolveSyncTarget(): Promise<SyncTarget>;
23
+ //# sourceMappingURL=resolve-sync-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-sync-target.d.ts","sourceRoot":"","sources":["../../src/sync/resolve-sync-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,MAAM,WAAW,UAAU;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,UAAU,CAAC,CA+B7D"}
@@ -0,0 +1,45 @@
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
+ import { getRuntimeEnv, getVibesRuntime } from '@vibesdotdev/runtime';
18
+ export async function resolveSyncTarget() {
19
+ let syncTarget = getRuntimeEnv('VIBES_API_URL') ?? 'unknown';
20
+ let envName = 'env';
21
+ let apiToken;
22
+ try {
23
+ const runtime = getVibesRuntime();
24
+ const env = (await runtime.query('config/environment').resolve());
25
+ if (env?.apiUrl)
26
+ syncTarget = env.apiUrl;
27
+ if (env?.name)
28
+ envName = env.name;
29
+ else if (env?.id)
30
+ envName = env.id;
31
+ if (env?.apiToken)
32
+ apiToken = env.apiToken;
33
+ }
34
+ catch {
35
+ // Environment resolution may fail; use fallback
36
+ }
37
+ // Credential store lives in the app layer; consumers must supply auth via
38
+ // environment config or VIBES_AUTH_TOKEN.
39
+ // Fallback to environment variable
40
+ if (!apiToken && getRuntimeEnv('VIBES_AUTH_TOKEN')) {
41
+ apiToken = getRuntimeEnv('VIBES_AUTH_TOKEN');
42
+ }
43
+ return { syncTarget, envName, apiToken };
44
+ }
45
+ //# sourceMappingURL=resolve-sync-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-sync-target.js","sourceRoot":"","sources":["../../src/sync/resolve-sync-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAQtE,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACtC,IAAI,UAAU,GAAG,aAAa,CAAC,eAAe,CAAC,IAAI,SAAS,CAAC;IAC7D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAA4B,CAAC;IAEjC,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAKxD,CAAC;QAET,IAAI,GAAG,EAAE,MAAM;YAAE,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;QACzC,IAAI,GAAG,EAAE,IAAI;YAAE,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;aAC7B,IAAI,GAAG,EAAE,EAAE;YAAE,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,GAAG,EAAE,QAAQ;YAAE,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACR,gDAAgD;IACjD,CAAC;IAED,0EAA0E;IAC1E,0CAA0C;IAE1C,mCAAmC;IACnC,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpD,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC"}