@aigne/afs-did-space 1.12.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/LICENSE.md +26 -0
  2. package/README.md +129 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  4. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  5. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  6. package/dist/afs-metadata-context.cjs +20 -0
  7. package/dist/afs-metadata-context.d.cts +21 -0
  8. package/dist/afs-metadata-context.d.cts.map +1 -0
  9. package/dist/afs-metadata-context.d.mts +21 -0
  10. package/dist/afs-metadata-context.d.mts.map +1 -0
  11. package/dist/afs-metadata-context.mjs +18 -0
  12. package/dist/afs-metadata-context.mjs.map +1 -0
  13. package/dist/blocklet-hook.cjs +180 -0
  14. package/dist/blocklet-hook.d.cts +29 -0
  15. package/dist/blocklet-hook.d.cts.map +1 -0
  16. package/dist/blocklet-hook.d.mts +29 -0
  17. package/dist/blocklet-hook.d.mts.map +1 -0
  18. package/dist/blocklet-hook.mjs +178 -0
  19. package/dist/blocklet-hook.mjs.map +1 -0
  20. package/dist/changelog-schema.cjs +603 -0
  21. package/dist/changelog-schema.d.cts +395 -0
  22. package/dist/changelog-schema.d.cts.map +1 -0
  23. package/dist/changelog-schema.d.mts +395 -0
  24. package/dist/changelog-schema.d.mts.map +1 -0
  25. package/dist/changelog-schema.mjs +570 -0
  26. package/dist/changelog-schema.mjs.map +1 -0
  27. package/dist/changelog-write.cjs +80 -0
  28. package/dist/changelog-write.d.cts +70 -0
  29. package/dist/changelog-write.d.cts.map +1 -0
  30. package/dist/changelog-write.d.mts +70 -0
  31. package/dist/changelog-write.d.mts.map +1 -0
  32. package/dist/changelog-write.mjs +77 -0
  33. package/dist/changelog-write.mjs.map +1 -0
  34. package/dist/cid-byte-cache.cjs +126 -0
  35. package/dist/cid-byte-cache.d.cts +46 -0
  36. package/dist/cid-byte-cache.d.cts.map +1 -0
  37. package/dist/cid-byte-cache.d.mts +47 -0
  38. package/dist/cid-byte-cache.d.mts.map +1 -0
  39. package/dist/cid-byte-cache.mjs +125 -0
  40. package/dist/cid-byte-cache.mjs.map +1 -0
  41. package/dist/cid.cjs +68 -0
  42. package/dist/cid.d.cts +22 -0
  43. package/dist/cid.d.cts.map +1 -0
  44. package/dist/cid.d.mts +22 -0
  45. package/dist/cid.d.mts.map +1 -0
  46. package/dist/cid.mjs +65 -0
  47. package/dist/cid.mjs.map +1 -0
  48. package/dist/client.cjs +221 -0
  49. package/dist/client.d.cts +72 -0
  50. package/dist/client.d.cts.map +1 -0
  51. package/dist/client.d.mts +72 -0
  52. package/dist/client.d.mts.map +1 -0
  53. package/dist/client.mjs +220 -0
  54. package/dist/client.mjs.map +1 -0
  55. package/dist/cloudflare.cjs +510 -0
  56. package/dist/cloudflare.d.cts +307 -0
  57. package/dist/cloudflare.d.cts.map +1 -0
  58. package/dist/cloudflare.d.mts +308 -0
  59. package/dist/cloudflare.d.mts.map +1 -0
  60. package/dist/cloudflare.mjs +507 -0
  61. package/dist/cloudflare.mjs.map +1 -0
  62. package/dist/ctime-backfill.cjs +272 -0
  63. package/dist/ctime-backfill.d.cts +169 -0
  64. package/dist/ctime-backfill.d.cts.map +1 -0
  65. package/dist/ctime-backfill.d.mts +169 -0
  66. package/dist/ctime-backfill.d.mts.map +1 -0
  67. package/dist/ctime-backfill.mjs +267 -0
  68. package/dist/ctime-backfill.mjs.map +1 -0
  69. package/dist/d1-gc-queue.cjs +80 -0
  70. package/dist/d1-gc-queue.d.cts +59 -0
  71. package/dist/d1-gc-queue.d.cts.map +1 -0
  72. package/dist/d1-gc-queue.d.mts +59 -0
  73. package/dist/d1-gc-queue.d.mts.map +1 -0
  74. package/dist/d1-gc-queue.mjs +81 -0
  75. package/dist/d1-gc-queue.mjs.map +1 -0
  76. package/dist/d1-resolve-store.cjs +189 -0
  77. package/dist/d1-resolve-store.d.cts +93 -0
  78. package/dist/d1-resolve-store.d.cts.map +1 -0
  79. package/dist/d1-resolve-store.d.mts +93 -0
  80. package/dist/d1-resolve-store.d.mts.map +1 -0
  81. package/dist/d1-resolve-store.mjs +190 -0
  82. package/dist/d1-resolve-store.mjs.map +1 -0
  83. package/dist/d1-schema.cjs +361 -0
  84. package/dist/d1-schema.d.cts +237 -0
  85. package/dist/d1-schema.d.cts.map +1 -0
  86. package/dist/d1-schema.d.mts +237 -0
  87. package/dist/d1-schema.d.mts.map +1 -0
  88. package/dist/d1-schema.mjs +341 -0
  89. package/dist/d1-schema.mjs.map +1 -0
  90. package/dist/d1-share-store.cjs +0 -0
  91. package/dist/d1-share-store.d.cts +53 -0
  92. package/dist/d1-share-store.d.cts.map +1 -0
  93. package/dist/d1-share-store.d.mts +53 -0
  94. package/dist/d1-share-store.d.mts.map +1 -0
  95. package/dist/d1-share-store.mjs +0 -0
  96. package/dist/d1-share-store.mjs.map +1 -0
  97. package/dist/d1-tree-index.cjs +1098 -0
  98. package/dist/d1-tree-index.d.cts +203 -0
  99. package/dist/d1-tree-index.d.cts.map +1 -0
  100. package/dist/d1-tree-index.d.mts +203 -0
  101. package/dist/d1-tree-index.d.mts.map +1 -0
  102. package/dist/d1-tree-index.mjs +1094 -0
  103. package/dist/d1-tree-index.mjs.map +1 -0
  104. package/dist/data-backend.cjs +147 -0
  105. package/dist/data-backend.d.cts +30 -0
  106. package/dist/data-backend.d.cts.map +1 -0
  107. package/dist/data-backend.d.mts +30 -0
  108. package/dist/data-backend.d.mts.map +1 -0
  109. package/dist/data-backend.mjs +148 -0
  110. package/dist/data-backend.mjs.map +1 -0
  111. package/dist/dedup-backfill.cjs +278 -0
  112. package/dist/dedup-backfill.d.cts +165 -0
  113. package/dist/dedup-backfill.d.cts.map +1 -0
  114. package/dist/dedup-backfill.d.mts +165 -0
  115. package/dist/dedup-backfill.d.mts.map +1 -0
  116. package/dist/dedup-backfill.mjs +273 -0
  117. package/dist/dedup-backfill.mjs.map +1 -0
  118. package/dist/did-space-like.d.cts +2 -0
  119. package/dist/did-space-like.d.mts +2 -0
  120. package/dist/did-utils.cjs +44 -0
  121. package/dist/did-utils.d.cts +25 -0
  122. package/dist/did-utils.d.cts.map +1 -0
  123. package/dist/did-utils.d.mts +25 -0
  124. package/dist/did-utils.d.mts.map +1 -0
  125. package/dist/did-utils.mjs +43 -0
  126. package/dist/did-utils.mjs.map +1 -0
  127. package/dist/dirty-path-queue.cjs +31 -0
  128. package/dist/dirty-path-queue.d.cts +104 -0
  129. package/dist/dirty-path-queue.d.cts.map +1 -0
  130. package/dist/dirty-path-queue.d.mts +104 -0
  131. package/dist/dirty-path-queue.d.mts.map +1 -0
  132. package/dist/dirty-path-queue.mjs +31 -0
  133. package/dist/dirty-path-queue.mjs.map +1 -0
  134. package/dist/dirty-path-schema.cjs +142 -0
  135. package/dist/dirty-path-schema.d.cts +90 -0
  136. package/dist/dirty-path-schema.d.cts.map +1 -0
  137. package/dist/dirty-path-schema.d.mts +90 -0
  138. package/dist/dirty-path-schema.d.mts.map +1 -0
  139. package/dist/dirty-path-schema.mjs +136 -0
  140. package/dist/dirty-path-schema.mjs.map +1 -0
  141. package/dist/download-actions.cjs +43 -0
  142. package/dist/download-actions.mjs +40 -0
  143. package/dist/download-actions.mjs.map +1 -0
  144. package/dist/fs-object-store.cjs +153 -0
  145. package/dist/fs-object-store.d.cts +21 -0
  146. package/dist/fs-object-store.d.cts.map +1 -0
  147. package/dist/fs-object-store.d.mts +22 -0
  148. package/dist/fs-object-store.d.mts.map +1 -0
  149. package/dist/fs-object-store.mjs +153 -0
  150. package/dist/fs-object-store.mjs.map +1 -0
  151. package/dist/gc-queue.d.cts +43 -0
  152. package/dist/gc-queue.d.cts.map +1 -0
  153. package/dist/gc-queue.d.mts +43 -0
  154. package/dist/gc-queue.d.mts.map +1 -0
  155. package/dist/index.cjs +2712 -0
  156. package/dist/index.d.cts +504 -0
  157. package/dist/index.d.cts.map +1 -0
  158. package/dist/index.d.mts +505 -0
  159. package/dist/index.d.mts.map +1 -0
  160. package/dist/index.mjs +2537 -0
  161. package/dist/index.mjs.map +1 -0
  162. package/dist/inline-content-migration.cjs +212 -0
  163. package/dist/inline-content-migration.d.cts +110 -0
  164. package/dist/inline-content-migration.d.cts.map +1 -0
  165. package/dist/inline-content-migration.d.mts +111 -0
  166. package/dist/inline-content-migration.d.mts.map +1 -0
  167. package/dist/inline-content-migration.mjs +207 -0
  168. package/dist/inline-content-migration.mjs.map +1 -0
  169. package/dist/inline-content.cjs +145 -0
  170. package/dist/inline-content.d.cts +98 -0
  171. package/dist/inline-content.d.cts.map +1 -0
  172. package/dist/inline-content.d.mts +98 -0
  173. package/dist/inline-content.d.mts.map +1 -0
  174. package/dist/inline-content.mjs +137 -0
  175. package/dist/inline-content.mjs.map +1 -0
  176. package/dist/local-changelog.cjs +241 -0
  177. package/dist/local-changelog.d.cts +119 -0
  178. package/dist/local-changelog.d.cts.map +1 -0
  179. package/dist/local-changelog.d.mts +119 -0
  180. package/dist/local-changelog.d.mts.map +1 -0
  181. package/dist/local-changelog.mjs +240 -0
  182. package/dist/local-changelog.mjs.map +1 -0
  183. package/dist/local.cjs +435 -0
  184. package/dist/local.d.cts +254 -0
  185. package/dist/local.d.cts.map +1 -0
  186. package/dist/local.d.mts +254 -0
  187. package/dist/local.d.mts.map +1 -0
  188. package/dist/local.mjs +427 -0
  189. package/dist/local.mjs.map +1 -0
  190. package/dist/memory-gc-queue.cjs +36 -0
  191. package/dist/memory-gc-queue.d.cts +22 -0
  192. package/dist/memory-gc-queue.d.cts.map +1 -0
  193. package/dist/memory-gc-queue.d.mts +22 -0
  194. package/dist/memory-gc-queue.d.mts.map +1 -0
  195. package/dist/memory-gc-queue.mjs +36 -0
  196. package/dist/memory-gc-queue.mjs.map +1 -0
  197. package/dist/memory-tree-index.cjs +734 -0
  198. package/dist/memory-tree-index.d.cts +159 -0
  199. package/dist/memory-tree-index.d.cts.map +1 -0
  200. package/dist/memory-tree-index.d.mts +159 -0
  201. package/dist/memory-tree-index.d.mts.map +1 -0
  202. package/dist/memory-tree-index.mjs +735 -0
  203. package/dist/memory-tree-index.mjs.map +1 -0
  204. package/dist/metadata-db.cjs +562 -0
  205. package/dist/metadata-db.d.cts +102 -0
  206. package/dist/metadata-db.d.cts.map +1 -0
  207. package/dist/metadata-db.d.mts +102 -0
  208. package/dist/metadata-db.d.mts.map +1 -0
  209. package/dist/metadata-db.mjs +562 -0
  210. package/dist/metadata-db.mjs.map +1 -0
  211. package/dist/mime-utils.cjs +2 -0
  212. package/dist/mime-utils.d.cts +2 -0
  213. package/dist/mime-utils.d.mts +2 -0
  214. package/dist/mime-utils.mjs +3 -0
  215. package/dist/object-key.cjs +41 -0
  216. package/dist/object-key.d.cts +25 -0
  217. package/dist/object-key.d.cts.map +1 -0
  218. package/dist/object-key.d.mts +25 -0
  219. package/dist/object-key.d.mts.map +1 -0
  220. package/dist/object-key.mjs +40 -0
  221. package/dist/object-key.mjs.map +1 -0
  222. package/dist/packages/session/dist/index.cjs +788 -0
  223. package/dist/packages/session/dist/index.mjs +782 -0
  224. package/dist/packages/session/dist/index.mjs.map +1 -0
  225. package/dist/platform/r2/dist/types.d.cts +49 -0
  226. package/dist/platform/r2/dist/types.d.cts.map +1 -0
  227. package/dist/prefix-range.cjs +33 -0
  228. package/dist/prefix-range.d.cts +29 -0
  229. package/dist/prefix-range.d.cts.map +1 -0
  230. package/dist/prefix-range.d.mts +29 -0
  231. package/dist/prefix-range.d.mts.map +1 -0
  232. package/dist/prefix-range.mjs +33 -0
  233. package/dist/prefix-range.mjs.map +1 -0
  234. package/dist/prefixed-tree-index.cjs +238 -0
  235. package/dist/prefixed-tree-index.d.cts +85 -0
  236. package/dist/prefixed-tree-index.d.cts.map +1 -0
  237. package/dist/prefixed-tree-index.d.mts +85 -0
  238. package/dist/prefixed-tree-index.d.mts.map +1 -0
  239. package/dist/prefixed-tree-index.mjs +239 -0
  240. package/dist/prefixed-tree-index.mjs.map +1 -0
  241. package/dist/presign-signer.cjs +7 -0
  242. package/dist/presign-signer.d.cts +99 -0
  243. package/dist/presign-signer.d.cts.map +1 -0
  244. package/dist/presign-signer.d.mts +99 -0
  245. package/dist/presign-signer.d.mts.map +1 -0
  246. package/dist/presign-signer.mjs +7 -0
  247. package/dist/presign-signer.mjs.map +1 -0
  248. package/dist/providers/platform/r2/dist/index.d.mts +3 -0
  249. package/dist/providers/platform/r2/dist/types.d.mts +49 -0
  250. package/dist/providers/platform/r2/dist/types.d.mts.map +1 -0
  251. package/dist/reconcile.cjs +184 -0
  252. package/dist/reconcile.d.cts +26 -0
  253. package/dist/reconcile.d.cts.map +1 -0
  254. package/dist/reconcile.d.mts +26 -0
  255. package/dist/reconcile.d.mts.map +1 -0
  256. package/dist/reconcile.mjs +184 -0
  257. package/dist/reconcile.mjs.map +1 -0
  258. package/dist/reference-check.cjs +49 -0
  259. package/dist/reference-check.d.cts +10 -0
  260. package/dist/reference-check.d.cts.map +1 -0
  261. package/dist/reference-check.d.mts +10 -0
  262. package/dist/reference-check.d.mts.map +1 -0
  263. package/dist/reference-check.mjs +48 -0
  264. package/dist/reference-check.mjs.map +1 -0
  265. package/dist/remote-afs.cjs +681 -0
  266. package/dist/remote-afs.d.cts +236 -0
  267. package/dist/remote-afs.d.cts.map +1 -0
  268. package/dist/remote-afs.d.mts +236 -0
  269. package/dist/remote-afs.d.mts.map +1 -0
  270. package/dist/remote-afs.mjs +676 -0
  271. package/dist/remote-afs.mjs.map +1 -0
  272. package/dist/rename-guard.cjs +18 -0
  273. package/dist/rename-guard.mjs +18 -0
  274. package/dist/rename-guard.mjs.map +1 -0
  275. package/dist/resolve.cjs +260 -0
  276. package/dist/resolve.d.cts +113 -0
  277. package/dist/resolve.d.cts.map +1 -0
  278. package/dist/resolve.d.mts +113 -0
  279. package/dist/resolve.d.mts.map +1 -0
  280. package/dist/resolve.mjs +260 -0
  281. package/dist/resolve.mjs.map +1 -0
  282. package/dist/rsync-content.cjs +33 -0
  283. package/dist/rsync-content.mjs +33 -0
  284. package/dist/rsync-content.mjs.map +1 -0
  285. package/dist/rsync.cjs +400 -0
  286. package/dist/rsync.d.cts +157 -0
  287. package/dist/rsync.d.cts.map +1 -0
  288. package/dist/rsync.d.mts +157 -0
  289. package/dist/rsync.d.mts.map +1 -0
  290. package/dist/rsync.mjs +397 -0
  291. package/dist/rsync.mjs.map +1 -0
  292. package/dist/run-gc.cjs +57 -0
  293. package/dist/run-gc.d.cts +40 -0
  294. package/dist/run-gc.d.cts.map +1 -0
  295. package/dist/run-gc.d.mts +41 -0
  296. package/dist/run-gc.d.mts.map +1 -0
  297. package/dist/run-gc.mjs +57 -0
  298. package/dist/run-gc.mjs.map +1 -0
  299. package/dist/scope-id.cjs +70 -0
  300. package/dist/scope-id.d.cts +35 -0
  301. package/dist/scope-id.d.cts.map +1 -0
  302. package/dist/scope-id.d.mts +35 -0
  303. package/dist/scope-id.d.mts.map +1 -0
  304. package/dist/scope-id.mjs +68 -0
  305. package/dist/scope-id.mjs.map +1 -0
  306. package/dist/scope-migration-node.cjs +172 -0
  307. package/dist/scope-migration-node.d.cts +44 -0
  308. package/dist/scope-migration-node.d.cts.map +1 -0
  309. package/dist/scope-migration-node.d.mts +44 -0
  310. package/dist/scope-migration-node.d.mts.map +1 -0
  311. package/dist/scope-migration-node.mjs +171 -0
  312. package/dist/scope-migration-node.mjs.map +1 -0
  313. package/dist/scope-migration.cjs +155 -0
  314. package/dist/scope-migration.d.cts +65 -0
  315. package/dist/scope-migration.d.cts.map +1 -0
  316. package/dist/scope-migration.d.mts +65 -0
  317. package/dist/scope-migration.d.mts.map +1 -0
  318. package/dist/scope-migration.mjs +154 -0
  319. package/dist/scope-migration.mjs.map +1 -0
  320. package/dist/share-declaration.cjs +225 -0
  321. package/dist/share-declaration.d.cts +30 -0
  322. package/dist/share-declaration.d.cts.map +1 -0
  323. package/dist/share-declaration.d.mts +32 -0
  324. package/dist/share-declaration.d.mts.map +1 -0
  325. package/dist/share-declaration.mjs +221 -0
  326. package/dist/share-declaration.mjs.map +1 -0
  327. package/dist/share-hook.cjs +63 -0
  328. package/dist/share-hook.mjs +62 -0
  329. package/dist/share-hook.mjs.map +1 -0
  330. package/dist/share-resolve.cjs +176 -0
  331. package/dist/share-resolve.d.cts +36 -0
  332. package/dist/share-resolve.d.cts.map +1 -0
  333. package/dist/share-resolve.d.mts +36 -0
  334. package/dist/share-resolve.d.mts.map +1 -0
  335. package/dist/share-resolve.mjs +177 -0
  336. package/dist/share-resolve.mjs.map +1 -0
  337. package/dist/share-serve.cjs +145 -0
  338. package/dist/share-serve.d.cts +30 -0
  339. package/dist/share-serve.d.cts.map +1 -0
  340. package/dist/share-serve.d.mts +30 -0
  341. package/dist/share-serve.d.mts.map +1 -0
  342. package/dist/share-serve.mjs +144 -0
  343. package/dist/share-serve.mjs.map +1 -0
  344. package/dist/share-store.cjs +25 -0
  345. package/dist/share-store.d.cts +65 -0
  346. package/dist/share-store.d.cts.map +1 -0
  347. package/dist/share-store.d.mts +65 -0
  348. package/dist/share-store.d.mts.map +1 -0
  349. package/dist/share-store.mjs +25 -0
  350. package/dist/share-store.mjs.map +1 -0
  351. package/dist/share-virtual-path.cjs +102 -0
  352. package/dist/share-virtual-path.mjs +101 -0
  353. package/dist/share-virtual-path.mjs.map +1 -0
  354. package/dist/space-resolver.cjs +54 -0
  355. package/dist/space-resolver.d.cts +34 -0
  356. package/dist/space-resolver.d.cts.map +1 -0
  357. package/dist/space-resolver.d.mts +34 -0
  358. package/dist/space-resolver.d.mts.map +1 -0
  359. package/dist/space-resolver.mjs +55 -0
  360. package/dist/space-resolver.mjs.map +1 -0
  361. package/dist/sqlite-gc-queue.cjs +51 -0
  362. package/dist/sqlite-gc-queue.d.cts +22 -0
  363. package/dist/sqlite-gc-queue.d.cts.map +1 -0
  364. package/dist/sqlite-gc-queue.d.mts +22 -0
  365. package/dist/sqlite-gc-queue.d.mts.map +1 -0
  366. package/dist/sqlite-gc-queue.mjs +52 -0
  367. package/dist/sqlite-gc-queue.mjs.map +1 -0
  368. package/dist/sqlite-resolve-store.cjs +163 -0
  369. package/dist/sqlite-resolve-store.d.cts +50 -0
  370. package/dist/sqlite-resolve-store.d.cts.map +1 -0
  371. package/dist/sqlite-resolve-store.d.mts +50 -0
  372. package/dist/sqlite-resolve-store.d.mts.map +1 -0
  373. package/dist/sqlite-resolve-store.mjs +164 -0
  374. package/dist/sqlite-resolve-store.mjs.map +1 -0
  375. package/dist/sqlite-share-store.cjs +157 -0
  376. package/dist/sqlite-share-store.d.cts +31 -0
  377. package/dist/sqlite-share-store.d.cts.map +1 -0
  378. package/dist/sqlite-share-store.d.mts +31 -0
  379. package/dist/sqlite-share-store.d.mts.map +1 -0
  380. package/dist/sqlite-share-store.mjs +157 -0
  381. package/dist/sqlite-share-store.mjs.map +1 -0
  382. package/dist/sqlite-tree-index.cjs +901 -0
  383. package/dist/sqlite-tree-index.d.cts +107 -0
  384. package/dist/sqlite-tree-index.d.cts.map +1 -0
  385. package/dist/sqlite-tree-index.d.mts +107 -0
  386. package/dist/sqlite-tree-index.d.mts.map +1 -0
  387. package/dist/sqlite-tree-index.mjs +902 -0
  388. package/dist/sqlite-tree-index.mjs.map +1 -0
  389. package/dist/sync-engine.cjs +1324 -0
  390. package/dist/sync-engine.d.cts +473 -0
  391. package/dist/sync-engine.d.cts.map +1 -0
  392. package/dist/sync-engine.d.mts +473 -0
  393. package/dist/sync-engine.d.mts.map +1 -0
  394. package/dist/sync-engine.mjs +1315 -0
  395. package/dist/sync-engine.mjs.map +1 -0
  396. package/dist/sync-state.cjs +303 -0
  397. package/dist/sync-state.d.cts +224 -0
  398. package/dist/sync-state.d.cts.map +1 -0
  399. package/dist/sync-state.d.mts +224 -0
  400. package/dist/sync-state.d.mts.map +1 -0
  401. package/dist/sync-state.mjs +297 -0
  402. package/dist/sync-state.mjs.map +1 -0
  403. package/dist/timestamp.cjs +92 -0
  404. package/dist/timestamp.mjs +91 -0
  405. package/dist/timestamp.mjs.map +1 -0
  406. package/dist/transports/http.cjs +54 -0
  407. package/dist/transports/http.d.cts +26 -0
  408. package/dist/transports/http.d.cts.map +1 -0
  409. package/dist/transports/http.d.mts +26 -0
  410. package/dist/transports/http.d.mts.map +1 -0
  411. package/dist/transports/http.mjs +54 -0
  412. package/dist/transports/http.mjs.map +1 -0
  413. package/dist/transports/static.cjs +55 -0
  414. package/dist/transports/static.d.cts +28 -0
  415. package/dist/transports/static.d.cts.map +1 -0
  416. package/dist/transports/static.d.mts +28 -0
  417. package/dist/transports/static.d.mts.map +1 -0
  418. package/dist/transports/static.mjs +55 -0
  419. package/dist/transports/static.mjs.map +1 -0
  420. package/dist/transports/types.cjs +13 -0
  421. package/dist/transports/types.d.cts +72 -0
  422. package/dist/transports/types.d.cts.map +1 -0
  423. package/dist/transports/types.d.mts +72 -0
  424. package/dist/transports/types.d.mts.map +1 -0
  425. package/dist/transports/types.mjs +13 -0
  426. package/dist/transports/types.mjs.map +1 -0
  427. package/dist/transports/ws.cjs +207 -0
  428. package/dist/transports/ws.d.cts +47 -0
  429. package/dist/transports/ws.d.cts.map +1 -0
  430. package/dist/transports/ws.d.mts +47 -0
  431. package/dist/transports/ws.d.mts.map +1 -0
  432. package/dist/transports/ws.mjs +206 -0
  433. package/dist/transports/ws.mjs.map +1 -0
  434. package/dist/tree-index.cjs +333 -0
  435. package/dist/tree-index.d.cts +524 -0
  436. package/dist/tree-index.d.cts.map +1 -0
  437. package/dist/tree-index.d.mts +524 -0
  438. package/dist/tree-index.d.mts.map +1 -0
  439. package/dist/tree-index.mjs +322 -0
  440. package/dist/tree-index.mjs.map +1 -0
  441. package/dist/tree-query.cjs +655 -0
  442. package/dist/tree-query.d.cts +70 -0
  443. package/dist/tree-query.d.cts.map +1 -0
  444. package/dist/tree-query.d.mts +70 -0
  445. package/dist/tree-query.d.mts.map +1 -0
  446. package/dist/tree-query.mjs +648 -0
  447. package/dist/tree-query.mjs.map +1 -0
  448. package/dist/upload-actions.cjs +97 -0
  449. package/dist/upload-actions.d.cts +19 -0
  450. package/dist/upload-actions.d.cts.map +1 -0
  451. package/dist/upload-actions.d.mts +21 -0
  452. package/dist/upload-actions.d.mts.map +1 -0
  453. package/dist/upload-actions.mjs +90 -0
  454. package/dist/upload-actions.mjs.map +1 -0
  455. package/dist/upload-session-store.cjs +185 -0
  456. package/dist/upload-session-store.d.cts +99 -0
  457. package/dist/upload-session-store.d.cts.map +1 -0
  458. package/dist/upload-session-store.d.mts +99 -0
  459. package/dist/upload-session-store.d.mts.map +1 -0
  460. package/dist/upload-session-store.mjs +184 -0
  461. package/dist/upload-session-store.mjs.map +1 -0
  462. package/dist/url-normalize.cjs +61 -0
  463. package/dist/url-normalize.d.cts +33 -0
  464. package/dist/url-normalize.d.cts.map +1 -0
  465. package/dist/url-normalize.d.mts +33 -0
  466. package/dist/url-normalize.d.mts.map +1 -0
  467. package/dist/url-normalize.mjs +61 -0
  468. package/dist/url-normalize.mjs.map +1 -0
  469. package/dist/versioned-content-backends.cjs +155 -0
  470. package/dist/versioned-content-backends.d.cts +49 -0
  471. package/dist/versioned-content-backends.d.cts.map +1 -0
  472. package/dist/versioned-content-backends.d.mts +49 -0
  473. package/dist/versioned-content-backends.d.mts.map +1 -0
  474. package/dist/versioned-content-backends.mjs +154 -0
  475. package/dist/versioned-content-backends.mjs.map +1 -0
  476. package/dist/versioned-content-index.cjs +102 -0
  477. package/dist/versioned-content-index.d.cts +46 -0
  478. package/dist/versioned-content-index.d.cts.map +1 -0
  479. package/dist/versioned-content-index.d.mts +46 -0
  480. package/dist/versioned-content-index.d.mts.map +1 -0
  481. package/dist/versioned-content-index.mjs +103 -0
  482. package/dist/versioned-content-index.mjs.map +1 -0
  483. package/dist/versioned-content-store.cjs +121 -0
  484. package/dist/versioned-content-store.d.cts +90 -0
  485. package/dist/versioned-content-store.d.cts.map +1 -0
  486. package/dist/versioned-content-store.d.mts +90 -0
  487. package/dist/versioned-content-store.d.mts.map +1 -0
  488. package/dist/versioned-content-store.mjs +122 -0
  489. package/dist/versioned-content-store.mjs.map +1 -0
  490. package/dist/versioned-scope.cjs +39 -0
  491. package/dist/versioned-scope.d.cts +57 -0
  492. package/dist/versioned-scope.d.cts.map +1 -0
  493. package/dist/versioned-scope.d.mts +57 -0
  494. package/dist/versioned-scope.d.mts.map +1 -0
  495. package/dist/versioned-scope.mjs +37 -0
  496. package/dist/versioned-scope.mjs.map +1 -0
  497. package/migrations/0001_tree_entries.sql +17 -0
  498. package/migrations/0002_resolve_entries.sql +7 -0
  499. package/migrations/0003_entries_v2.sql +38 -0
  500. package/migrations/0004_gc_queue.sql +5 -0
  501. package/migrations/0006_resolve_enhance.sql +14 -0
  502. package/migrations/0007_resolve_created_at.sql +10 -0
  503. package/migrations/0008_changelog.sql +34 -0
  504. package/migrations/0009_device_sync_state.sql +29 -0
  505. package/migrations/0010_scope_meta.sql +33 -0
  506. package/migrations/0011_shares.sql +25 -0
  507. package/migrations/0012_scope_meta_file_count.sql +41 -0
  508. package/migrations/0013_scope_meta_total_bytes.sql +47 -0
  509. package/migrations/0014_rename_tables.sql +62 -0
  510. package/package.json +102 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-db.mjs","names":["client","stmts","now"],"sources":["../src/metadata-db.ts"],"sourcesContent":["/**\n * MetadataDB — local SQLite index for DID Space files.\n *\n * Opened at: ~/.afs/spaces/{userDid}/_metadata.db\n *\n * Tables:\n * entries — same schema as D1 (entries table in scalability-design §4.1)\n * cid_cache — path → cid + mtime_ms for avoiding repeated hash computation\n * sync_checkpoint — persistent sync state for resume-on-failure (Phase 3)\n *\n * SQLite tuning: WAL, cache_size 256 MB, mmap 1 GB, busy_timeout 30 s.\n */\n\n// biome-ignore lint/style/noRestrictedImports: MetadataDB is provider-internal Node-only code\nimport { mkdirSync, rmSync } from \"node:fs\";\n// biome-ignore lint/style/noRestrictedImports: MetadataDB is provider-internal Node-only code\nimport { dirname, join } from \"node:path\";\nimport {\n CHANGELOG_INDEX_SQL,\n CHANGELOG_TABLE_SQL,\n PREFIX_WATERMARK_TABLE_SQL,\n SYNC_STATE_INDEX_SQL,\n SYNC_STATE_TABLE_SQL,\n} from \"./changelog-schema.js\";\nimport { CHANGELOG_INSERT_SQL, validateDeviceId } from \"./changelog-write.js\";\nimport {\n ENTRIES_CONTENT_TYPE_COLUMN_SQL,\n ENTRIES_CONTENT_TYPE_INDEX_DROP_SQL,\n ENTRIES_DEDUP_INDEX_SQL,\n ENTRIES_DEDUP_KEY_COLUMN_SQL,\n ENTRIES_DEDUP_SCOPE_COLUMN_SQL,\n ENTRIES_INLINE_CONTENT_COLUMN_SQL,\n ENTRIES_METADATA_COLUMN_SQL,\n UPLOAD_SESSION_ENTRIES_TABLE_SQL,\n UPLOAD_SESSIONS_INDEX_SQL,\n UPLOAD_SESSIONS_TABLE_SQL,\n} from \"./d1-schema.js\";\nimport {\n DIRTY_PATH_INDEX_SQL,\n DIRTY_PATH_TABLE_SQL,\n DIRTY_PATH_TRIGGER_SQL,\n} from \"./dirty-path-schema.js\";\nimport { renameLegacyTable } from \"./rename-guard.js\";\nimport type { PutOpts } from \"./tree-index.js\";\n\nexport interface EntryRow {\n scope: string;\n path: string;\n parent: string;\n name: string;\n kind: \"file\" | \"dir\";\n cid: string | null;\n size: number;\n mime_type: string | null;\n ctime: number;\n mtime: number;\n}\n\nexport interface CidCacheRow {\n path: string;\n cid: string;\n size: number;\n mtime_ms: number;\n computed_at: number;\n}\n\nexport interface CheckpointRow {\n session_id: string;\n direction: string;\n remote_url: string;\n base_path: string;\n status: string;\n diff_json: string;\n /** JSON-encoded string[] of completed file paths */\n completed: string;\n created_at: number;\n updated_at: number;\n}\n\n/** Raw row shape returned by libsql queries */\ninterface RawEntryRow {\n scope: unknown;\n path: unknown;\n parent: unknown;\n name: unknown;\n kind: unknown;\n cid: unknown;\n size: unknown;\n mime_type: unknown;\n ctime: unknown;\n mtime: unknown;\n}\n\ninterface RawCidRow {\n path: unknown;\n cid: unknown;\n size: unknown;\n mtime_ms: unknown;\n computed_at: unknown;\n}\n\ninterface RawCheckpointRow {\n session_id: unknown;\n direction: unknown;\n remote_url: unknown;\n base_path: unknown;\n status: unknown;\n diff_json: unknown;\n completed: unknown;\n created_at: unknown;\n updated_at: unknown;\n}\n\nconst DB_FILENAME = \"_metadata.db\";\n\nconst SCHEMA_SQL = `\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA cache_size = -262144;\nPRAGMA mmap_size = 1073741824;\nPRAGMA busy_timeout = 30000;\nPRAGMA wal_autocheckpoint = 10000;\n\nCREATE TABLE IF NOT EXISTS ds_entries (\n scope TEXT NOT NULL,\n path TEXT NOT NULL,\n parent TEXT NOT NULL,\n name TEXT NOT NULL,\n kind TEXT NOT NULL DEFAULT 'file',\n cid TEXT,\n size INTEGER NOT NULL DEFAULT 0,\n mime_type TEXT,\n ctime INTEGER NOT NULL,\n mtime INTEGER NOT NULL,\n PRIMARY KEY (scope, path),\n CHECK (LENGTH(path) <= 4096),\n CHECK (LENGTH(name) <= 255),\n CHECK (kind IN ('file', 'dir')),\n CHECK (LENGTH(scope) <= 128)\n) WITHOUT ROWID;\n\nCREATE INDEX IF NOT EXISTS idx_entries_children\n ON ds_entries(scope, parent, name);\n\nCREATE INDEX IF NOT EXISTS idx_entries_mtime\n ON ds_entries(scope, mtime DESC);\n\nCREATE INDEX IF NOT EXISTS idx_entries_kind\n ON ds_entries(scope, kind);\n\nCREATE INDEX IF NOT EXISTS idx_entries_cid\n ON ds_entries(cid) WHERE cid IS NOT NULL;\n\n-- Ordered listChildren (did-space-sorting Phase 2): scope+parent equality,\n-- mtime/ctime range order, name tiebreak — index-only ordered scans.\nCREATE INDEX IF NOT EXISTS idx_entries_parent_mtime\n ON ds_entries(scope, parent, mtime, name);\n\nCREATE INDEX IF NOT EXISTS idx_entries_parent_ctime\n ON ds_entries(scope, parent, ctime, name);\n\nCREATE TABLE IF NOT EXISTS cid_cache (\n path TEXT PRIMARY KEY,\n cid TEXT NOT NULL,\n size INTEGER NOT NULL,\n mtime_ms INTEGER NOT NULL,\n computed_at INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS sync_checkpoint (\n session_id TEXT PRIMARY KEY,\n direction TEXT NOT NULL,\n remote_url TEXT NOT NULL,\n base_path TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n diff_json TEXT NOT NULL,\n completed TEXT NOT NULL DEFAULT '[]',\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n`;\n\nexport class MetadataDB {\n private client: import(\"@libsql/client\").Client;\n readonly dbPath: string;\n\n private constructor(client: import(\"@libsql/client\").Client, dbPath: string) {\n this.client = client;\n this.dbPath = dbPath;\n }\n\n /**\n * Internal: the raw libsql client, for `SQLiteTreeIndex` to run the same\n * atomic batches / queries D1TreeIndex runs on D1 (shared `entries` +\n * `changelog` tables). Kept package-internal — application code must go\n * through AFS / the TreeIndex interface, never this client directly.\n */\n get rawClient(): import(\"@libsql/client\").Client {\n return this.client;\n }\n\n /**\n * Open (or create) _metadata.db in the given directory.\n * Creates the directory if it does not exist.\n *\n * Executes the core schema (entries / cid_cache / sync_checkpoint) AND the\n * Phase 2 changelog table DDL. Changelog DDL is imported from\n * `changelog-schema.ts` so that D1, desktop SQLite, and the Swift/Kotlin\n * runtimes share byte-identical statements (verified by the CI parity\n * check).\n */\n static async open(userDir: string): Promise<MetadataDB> {\n const dbPath = join(userDir, DB_FILENAME);\n mkdirSync(dirname(dbPath), { recursive: true });\n\n const { createClient } = await import(\"@libsql/client\");\n\n const statements = [\n ...SCHEMA_SQL.split(\";\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n CHANGELOG_TABLE_SQL,\n ...CHANGELOG_INDEX_SQL,\n // Phase 3 Task 3.4 — local sync_state KV. Lives in the same DB file\n // as changelog so LocalChangelog.gc() can run against a single\n // connection. Task 3.5 extends the set of keys written to this table\n // without touching the schema.\n SYNC_STATE_TABLE_SQL,\n ...SYNC_STATE_INDEX_SQL,\n // Live Update Resilience §11.4 — per-prefix watermark for web reconcile.\n // Same DB file as changelog; D1-only/Node-sqlite, mobile does not mirror.\n PREFIX_WATERMARK_TABLE_SQL,\n // index-follower-dirty-path — the ds_dirty_path projection + its\n // AFTER INSERT ON ds_changelog trigger. Node has NO migration runner, so\n // (unlike CF's numbered migration) the table + trigger are materialised\n // here on DB open, from the SAME single-source DDL constants CF uses. The\n // trigger references ds_changelog, so it MUST come after CHANGELOG_TABLE_SQL\n // above — which it does. Covers every changelog write face (the 6 TreeIndex\n // methods AND the metadata-db direct upsert/delete paths) by construction.\n DIRTY_PATH_TABLE_SQL,\n ...DIRTY_PATH_INDEX_SQL,\n ...DIRTY_PATH_TRIGGER_SQL,\n // DID Space upload plane §9 — recoverable upload-session registry. Present\n // on Node so referencedAnywhereLibsql's prepared-session UNION (GC\n // in-flight protection) always has the tables to query.\n UPLOAD_SESSIONS_TABLE_SQL,\n UPLOAD_SESSION_ENTRIES_TABLE_SQL,\n ...UPLOAD_SESSIONS_INDEX_SQL,\n ];\n\n async function tryOpen() {\n const client = createClient({ url: `file:${dbPath}` });\n // Upgrade guard: rename all pre-0014 unprefixed tables to ds_* names before\n // running the CREATE TABLE IF NOT EXISTS statements below. Without this, the\n // CREATE creates a new empty table alongside the old one, silently losing all\n // existing data. State-checked via renameLegacyTable — dual-table databases\n // (stray legacy beside the ds_* table) must boot instead of throwing.\n const tableRenames: readonly [string, string][] = [\n [\"entries\", \"ds_entries\"],\n [\"changelog\", \"ds_changelog\"],\n [\"gc_queue\", \"ds_gc_queue\"],\n [\"sync_state\", \"ds_sync_state\"],\n [\"prefix_watermark\", \"ds_prefix_watermark\"],\n [\"upload_sessions\", \"ds_upload_sessions\"],\n [\"upload_session_entries\", \"ds_upload_session_entries\"],\n // D1-only tables that old Node migrations may have created in some databases:\n [\"versioned_scopes\", \"ds_versioned_scopes\"],\n [\"scope_meta\", \"ds_scope_meta\"],\n [\"device_sync_state\", \"ds_device_sync_state\"],\n ];\n for (const [oldName, newName] of tableRenames) {\n await renameLegacyTable(client, oldName, newName);\n }\n for (const stmt of statements) {\n await client.execute(stmt);\n }\n // Inline-content column migration (Layer 0, additive): probe\n // pragma_table_info so existing databases gain the column exactly once;\n // fresh databases get it here too (the CREATE TABLE stays column-free so\n // the shared ALTER statement is the single DDL source — see d1-schema.ts).\n const cols = await client.execute(\"SELECT name FROM pragma_table_info('ds_entries')\");\n const colNames = new Set<string>(cols.rows.map((r) => String(r.name)));\n if (!colNames.has(\"content\")) {\n try {\n await client.execute(ENTRIES_INLINE_CONTENT_COLUMN_SQL);\n } catch (err) {\n // Two concurrent opens of the same DB can both pass the probe and\n // race the ALTER (ADD COLUMN has no IF NOT EXISTS) — the loser's\n // \"duplicate column name\" is benign. Anything else propagates.\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes(\"duplicate column name\")) throw err;\n }\n }\n // Application metadata column (planning/agent-hub/metadata-foundation.md):\n // same additive ALTER pattern. Holds `AFSWriteEntryPayload.meta` as JSON.\n if (!colNames.has(\"metadata\")) {\n try {\n await client.execute(ENTRIES_METADATA_COLUMN_SQL);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes(\"duplicate column name\")) throw err;\n }\n }\n // Dedup-on-write columns + partial UNIQUE index (#1159): same additive\n // ALTER pattern; the index is created AFTER both columns exist and is\n // idempotent (IF NOT EXISTS). Production gets the generated 0117 migration.\n if (!colNames.has(\"dedup_scope\")) {\n try {\n await client.execute(ENTRIES_DEDUP_SCOPE_COLUMN_SQL);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes(\"duplicate column name\")) throw err;\n }\n }\n if (!colNames.has(\"dedup_key\")) {\n try {\n await client.execute(ENTRIES_DEDUP_KEY_COLUMN_SQL);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes(\"duplicate column name\")) throw err;\n }\n }\n await client.execute(ENTRIES_DEDUP_INDEX_SQL);\n // Content-type virtual generated column (#1293): additive ALTER pattern.\n // Column RETAINED; its backing index is NOT (see below). Production gets\n // the generated 0120 migration.\n if (!colNames.has(\"content_type\")) {\n try {\n await client.execute(ENTRIES_CONTENT_TYPE_COLUMN_SQL);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes(\"duplicate column name\")) throw err;\n }\n }\n // Drop the unused idx_entries_content_type (#1367): no query ever emitted\n // `WHERE content_type = ?`, so it only taxed every write. Node has no\n // migration runner — this idempotent guard cleans up existing local DBs a\n // prior open already indexed; no-op after the first drop.\n await client.execute(ENTRIES_CONTENT_TYPE_INDEX_DROP_SQL);\n // Verify the entries table is actually readable, not just creatable.\n // A corrupt main DB can still pass schema CREATE statements if the WAL has\n // schema pages, but fail on actual data reads (B-tree page reads).\n await client.execute(\"SELECT COUNT(*) FROM ds_entries\");\n // Same readability check for changelog — catches mismatched schema\n // drift that would otherwise only show up on first write.\n await client.execute(\"SELECT COUNT(*) FROM ds_changelog\");\n // Sync_state readability check — same rationale as changelog.\n await client.execute(\"SELECT COUNT(*) FROM ds_sync_state\");\n // Dirty-path readability check — same rationale (also proves the trigger\n // compiled: an invalid CREATE TRIGGER above would have thrown already).\n await client.execute(\"SELECT COUNT(*) FROM ds_dirty_path\");\n return client;\n }\n\n let client: import(\"@libsql/client\").Client;\n try {\n client = await tryOpen();\n } catch (err) {\n // Auto-recover from a corrupted database: delete all SQLite files and rebuild.\n // Must remove .db-wal and .db-shm too — a stale WAL file after the main DB is\n // deleted will cause the fresh DB to fail with SQLITE_CORRUPT on the next open.\n const msg = err instanceof Error ? err.message : String(err);\n if (\n msg.includes(\"SQLITE_CORRUPT\") ||\n msg.includes(\"SQLITE_NOTADB\") ||\n msg.includes(\"database disk image is malformed\") ||\n msg.includes(\"file is not a database\")\n ) {\n for (const suffix of [\"\", \"-wal\", \"-shm\"]) {\n rmSync(dbPath + suffix, { force: true });\n }\n client = await tryOpen();\n } else {\n throw err;\n }\n }\n\n return new MetadataDB(client, dbPath);\n }\n\n // ── entries ───────────────────────────────────────────────────\n\n /** Return all file entries (kind='file') for the given scope. */\n async getFiles(scope: string, basePath?: string): Promise<EntryRow[]> {\n let sql: string;\n let args: import(\"@libsql/client\").InValue[];\n\n if (basePath) {\n // Prefix-range query: basePath inclusive, basePath-with-next-char exclusive\n const end =\n basePath.slice(0, -1) + String.fromCharCode(basePath.charCodeAt(basePath.length - 1) + 1);\n sql = `SELECT * FROM ds_entries WHERE scope = ? AND kind = 'file' AND path >= ? AND path < ? ORDER BY path`;\n args = [scope, basePath, end];\n } else {\n sql = `SELECT * FROM ds_entries WHERE scope = ? AND kind = 'file' ORDER BY path`;\n args = [scope];\n }\n\n const result = await this.client.execute({ sql, args });\n return result.rows.map(toEntryRow);\n }\n\n /**\n * Read the current cid for (scope, path). Internal helper for atomic\n * changelog writes — callers need the old_cid to populate the changelog\n * row. Returns null if the row does not exist OR if its cid is null\n * (directory row).\n */\n private async getCurrentCid(scope: string, path: string): Promise<string | null> {\n const result = await this.client.execute({\n sql: `SELECT cid FROM ds_entries WHERE scope = ? AND path = ?`,\n args: [scope, path],\n });\n if (result.rows.length === 0) return null;\n const cid = result.rows[0]![0];\n return (cid as string | null) ?? null;\n }\n\n /**\n * Upsert a single entry. Writes `entries` + `changelog` atomically via libsql batch.\n *\n * Directory rows (kind='dir') and rows with cid=null never produce a\n * changelog entry — the changelog tracks file content mutations only.\n */\n async upsertEntry(row: EntryRow, opts: PutOpts): Promise<void> {\n validateDeviceId(opts.deviceId);\n\n // Read old_cid BEFORE the batch so the changelog row can record the\n // prior content hash. Skipped when skipChangelog is set (saves a RTT).\n const oldCid =\n !opts.skipChangelog && row.kind === \"file\"\n ? await this.getCurrentCid(row.scope, row.path)\n : null;\n\n const stmts: Array<{\n sql: string;\n args: import(\"@libsql/client\").InValue[];\n }> = [\n {\n sql: `INSERT OR REPLACE INTO ds_entries\n (scope, path, parent, name, kind, cid, size, mime_type, ctime, mtime)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n row.scope,\n row.path,\n row.parent,\n row.name,\n row.kind,\n row.cid ?? null,\n row.size,\n row.mime_type ?? null,\n row.ctime,\n row.mtime,\n ],\n },\n ];\n\n if (!opts.skipChangelog && row.kind === \"file\" && row.cid) {\n stmts.push({\n sql: CHANGELOG_INSERT_SQL,\n args: [row.scope, row.path, \"put\", row.cid, oldCid, row.size, row.mtime, opts.deviceId],\n });\n }\n\n await this.client.batch(stmts, \"write\");\n }\n\n /** Upsert multiple entries in a single atomic transaction. */\n async upsertEntries(rows: EntryRow[], opts: PutOpts): Promise<void> {\n if (rows.length === 0) return;\n validateDeviceId(opts.deviceId);\n\n // Pre-read old_cids in a single round trip per scope. Desktop flows\n // almost always pass a single scope, but we handle heterogeneous batches\n // defensively.\n const oldCidMap = new Map<string, string>();\n if (!opts.skipChangelog) {\n const byScope = new Map<string, string[]>();\n for (const r of rows) {\n if (r.kind !== \"file\") continue;\n const list = byScope.get(r.scope) ?? [];\n list.push(r.path);\n byScope.set(r.scope, list);\n }\n for (const [scope, paths] of byScope) {\n if (paths.length === 0) continue;\n const placeholders = paths.map(() => \"?\").join(\",\");\n const result = await this.client.execute({\n sql: `SELECT path, cid FROM ds_entries WHERE scope = ? AND path IN (${placeholders}) AND cid IS NOT NULL`,\n args: [scope, ...paths],\n });\n for (const r of result.rows) {\n const path = r[0] as string;\n const cid = r[1] as string | null;\n if (cid) oldCidMap.set(`${scope}\\x00${path}`, cid);\n }\n }\n }\n\n const stmts: Array<{\n sql: string;\n args: import(\"@libsql/client\").InValue[];\n }> = [];\n\n for (const row of rows) {\n stmts.push({\n sql: `INSERT OR REPLACE INTO ds_entries\n (scope, path, parent, name, kind, cid, size, mime_type, ctime, mtime)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n row.scope,\n row.path,\n row.parent,\n row.name,\n row.kind,\n row.cid ?? null,\n row.size,\n row.mime_type ?? null,\n row.ctime,\n row.mtime,\n ],\n });\n\n if (!opts.skipChangelog && row.kind === \"file\" && row.cid) {\n const oldCid = oldCidMap.get(`${row.scope}\\x00${row.path}`) ?? null;\n stmts.push({\n sql: CHANGELOG_INSERT_SQL,\n args: [row.scope, row.path, \"put\", row.cid, oldCid, row.size, row.mtime, opts.deviceId],\n });\n }\n }\n\n await this.client.batch(stmts, \"write\");\n }\n\n /** Delete an entry by scope + path. Writes changelog delete row atomically. */\n async deleteEntry(scope: string, path: string, opts: PutOpts): Promise<void> {\n validateDeviceId(opts.deviceId);\n\n const oldCid = opts.skipChangelog ? null : await this.getCurrentCid(scope, path);\n\n const stmts: Array<{\n sql: string;\n args: import(\"@libsql/client\").InValue[];\n }> = [\n {\n sql: `DELETE FROM ds_entries WHERE scope = ? AND path = ?`,\n args: [scope, path],\n },\n ];\n\n if (!opts.skipChangelog && oldCid) {\n stmts.push({\n sql: CHANGELOG_INSERT_SQL,\n args: [scope, path, \"delete\", null, oldCid, null, Date.now(), opts.deviceId],\n });\n }\n\n await this.client.batch(stmts, \"write\");\n }\n\n /** Delete all file entries for a scope whose paths are NOT in the given set. */\n async deleteEntriesNotIn(scope: string, keepPaths: Set<string>, opts: PutOpts): Promise<void> {\n validateDeviceId(opts.deviceId);\n\n if (keepPaths.size === 0) {\n // Bulk wipe: snapshot file rows first so every deletion is logged.\n let filesToLog: Array<{ path: string; cid: string }> = [];\n if (!opts.skipChangelog) {\n const snap = await this.client.execute({\n sql: `SELECT path, cid FROM ds_entries WHERE scope = ? AND kind = 'file' AND cid IS NOT NULL`,\n args: [scope],\n });\n filesToLog = snap.rows.map((r) => ({\n path: r[0] as string,\n cid: r[1] as string,\n }));\n }\n const stmts: Array<{\n sql: string;\n args: import(\"@libsql/client\").InValue[];\n }> = [{ sql: `DELETE FROM ds_entries WHERE scope = ?`, args: [scope] }];\n const now = Date.now();\n for (const row of filesToLog) {\n stmts.push({\n sql: CHANGELOG_INSERT_SQL,\n args: [scope, row.path, \"delete\", null, row.cid, null, now, opts.deviceId],\n });\n }\n await this.client.batch(stmts, \"write\");\n return;\n }\n\n // Partial delete: fetch paths + cid, diff against keepPaths.\n const result = await this.client.execute({\n sql: `SELECT path, cid FROM ds_entries WHERE scope = ? AND kind = 'file'`,\n args: [scope],\n });\n const toDelete: Array<{ path: string; cid: string | null }> = [];\n for (const r of result.rows) {\n const path = r[0] as string;\n const cid = r[1] as string | null;\n if (!keepPaths.has(path)) toDelete.push({ path, cid });\n }\n\n if (toDelete.length === 0) return;\n\n const stmts: Array<{\n sql: string;\n args: import(\"@libsql/client\").InValue[];\n }> = [];\n const now = Date.now();\n for (const row of toDelete) {\n stmts.push({\n sql: `DELETE FROM ds_entries WHERE scope = ? AND path = ?`,\n args: [scope, row.path],\n });\n if (!opts.skipChangelog && row.cid) {\n stmts.push({\n sql: CHANGELOG_INSERT_SQL,\n args: [scope, row.path, \"delete\", null, row.cid, null, now, opts.deviceId],\n });\n }\n }\n await this.client.batch(stmts, \"write\");\n }\n\n // ── cid_cache ─────────────────────────────────────────────────\n\n /** Get CID cache entry for a filesystem path. Returns null on cache miss. */\n async getCidCache(path: string): Promise<CidCacheRow | null> {\n const result = await this.client.execute({\n sql: `SELECT path, cid, size, mtime_ms, computed_at FROM cid_cache WHERE path = ?`,\n args: [path],\n });\n if (result.rows.length === 0) return null;\n return toCidCacheRow(result.rows[0] as unknown as RawCidRow);\n }\n\n /** Set (insert or replace) a CID cache entry. */\n async setCidCache(row: CidCacheRow): Promise<void> {\n await this.client.execute({\n sql: `INSERT OR REPLACE INTO cid_cache (path, cid, size, mtime_ms, computed_at)\n VALUES (?, ?, ?, ?, ?)`,\n args: [row.path, row.cid, row.size, row.mtime_ms, row.computed_at],\n });\n }\n\n // ── sync_checkpoint ───────────────────────────────────────────\n\n /**\n * Get the most recent active checkpoint for the given (direction, remoteUrl, basePath).\n * Returns null when no active session exists.\n */\n async getActiveCheckpoint(\n direction: string,\n remoteUrl: string,\n basePath: string,\n ): Promise<CheckpointRow | null> {\n const result = await this.client.execute({\n sql: `SELECT * FROM sync_checkpoint WHERE direction = ? AND remote_url = ? AND base_path = ? AND status = 'active' ORDER BY created_at DESC LIMIT 1`,\n args: [direction, remoteUrl, basePath],\n });\n if (result.rows.length === 0) return null;\n return toCheckpointRow(result.rows[0] as object);\n }\n\n /** Insert a new checkpoint record. */\n async createCheckpoint(row: CheckpointRow): Promise<void> {\n await this.client.execute({\n sql: `INSERT INTO sync_checkpoint (session_id, direction, remote_url, base_path, status, diff_json, completed, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n row.session_id,\n row.direction,\n row.remote_url,\n row.base_path,\n row.status,\n row.diff_json,\n row.completed,\n row.created_at,\n row.updated_at,\n ],\n });\n }\n\n /** Update the completed paths list for an active checkpoint. */\n async updateCheckpointCompleted(sessionId: string, completedPaths: string[]): Promise<void> {\n await this.client.execute({\n sql: `UPDATE sync_checkpoint SET completed = ?, updated_at = ? WHERE session_id = ?`,\n args: [JSON.stringify(completedPaths), Date.now(), sessionId],\n });\n }\n\n /** Mark a checkpoint as done. */\n async completeCheckpoint(sessionId: string): Promise<void> {\n await this.client.execute({\n sql: `UPDATE sync_checkpoint SET status = 'done', updated_at = ? WHERE session_id = ?`,\n args: [Date.now(), sessionId],\n });\n }\n\n /** Get a checkpoint by session_id (for test assertions). */\n async getCheckpoint(sessionId: string): Promise<CheckpointRow | null> {\n const result = await this.client.execute({\n sql: `SELECT * FROM sync_checkpoint WHERE session_id = ?`,\n args: [sessionId],\n });\n if (result.rows.length === 0) return null;\n return toCheckpointRow(result.rows[0] as object);\n }\n\n // ── lifecycle ─────────────────────────────────────────────────\n\n /** Close the database connection. */\n close(): void {\n this.client.close();\n }\n}\n\n// ── Row mappers ───────────────────────────────────────────────\n\nfunction toEntryRow(row: object): EntryRow {\n const r = row as unknown as RawEntryRow;\n return {\n scope: r.scope as string,\n path: r.path as string,\n parent: r.parent as string,\n name: r.name as string,\n kind: r.kind as \"file\" | \"dir\",\n cid: r.cid as string | null,\n size: r.size as number,\n mime_type: r.mime_type as string | null,\n ctime: r.ctime as number,\n mtime: r.mtime as number,\n };\n}\n\nfunction toCidCacheRow(row: RawCidRow): CidCacheRow {\n return {\n path: row.path as string,\n cid: row.cid as string,\n size: row.size as number,\n mtime_ms: row.mtime_ms as number,\n computed_at: row.computed_at as number,\n };\n}\n\nfunction toCheckpointRow(row: object): CheckpointRow {\n const r = row as unknown as RawCheckpointRow;\n return {\n session_id: r.session_id as string,\n direction: r.direction as string,\n remote_url: r.remote_url as string,\n base_path: r.base_path as string,\n status: r.status as string,\n diff_json: r.diff_json as string,\n completed: r.completed as string,\n created_at: r.created_at as number,\n updated_at: r.updated_at as number,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ let _aigne_afs_provider_utils = require("@aigne/afs-provider-utils");
@@ -0,0 +1,2 @@
1
+ import { detectMimeType, isTextMime } from "@aigne/afs-provider-utils";
2
+ export { detectMimeType, isTextMime };
@@ -0,0 +1,2 @@
1
+ import { detectMimeType, isTextMime } from "@aigne/afs-provider-utils";
2
+ export { detectMimeType, isTextMime };
@@ -0,0 +1,3 @@
1
+ import { detectMimeType, isTextMime } from "@aigne/afs-provider-utils";
2
+
3
+ export { detectMimeType, isTextMime };
@@ -0,0 +1,41 @@
1
+
2
+ //#region src/object-key.ts
3
+ /**
4
+ * object-key.ts — the single hardened CID→object-key builder (design §4.5, P1#3).
5
+ *
6
+ * Every place that turns a CID into an R2/FS object key MUST go through
7
+ * `objectKeyForCid`, which first runs `assertValidCid`. CIDs are content
8
+ * hashes (base32lower `b…` / base58btc `z…`, `[a-zA-Z0-9]` only) so they never
9
+ * contain `/` or `..`. Validating before building the key defends the delete
10
+ * path against a poisoned GC-queue row (`cid = "../_metadata.db"`) that would
11
+ * otherwise resolve to a root-internal traversal and destroy the space index
12
+ * (§4.5). This is the one place the rule lives; `runGc` and the provider both
13
+ * call it instead of concatenating `'objects/' + cid` by hand.
14
+ */
15
+ /**
16
+ * CID shape: base32lower (`b…`) or base58btc (`z…`), `[a-zA-Z0-9]` charset,
17
+ * length 22–101 total. Matches `computeCID()` output and the legacy private
18
+ * `DIDSpaceProvider.objectKey` regex.
19
+ */
20
+ const CID_RE = /^[bz][a-zA-Z0-9]{20,100}$/;
21
+ /**
22
+ * Throw if `cid` is not a well-formed CID. Rejects path-traversal strings
23
+ * (`../_metadata.db`, `objects/../x`), empty string, slashes, null bytes, and
24
+ * absurdly long input. Never silently returns — callers rely on the throw to
25
+ * skip a poisoned candidate rather than delete the wrong key.
26
+ */
27
+ function assertValidCid(cid) {
28
+ if (typeof cid !== "string" || !CID_RE.test(cid)) {
29
+ const shown = typeof cid === "string" ? cid.slice(0, 30) : typeof cid;
30
+ throw new Error(`Invalid CID: ${shown}`);
31
+ }
32
+ }
33
+ /** Build the object-store key for a CID, after validating it. */
34
+ function objectKeyForCid(cid) {
35
+ assertValidCid(cid);
36
+ return `objects/${cid}`;
37
+ }
38
+
39
+ //#endregion
40
+ exports.assertValidCid = assertValidCid;
41
+ exports.objectKeyForCid = objectKeyForCid;
@@ -0,0 +1,25 @@
1
+ //#region src/object-key.d.ts
2
+ /**
3
+ * object-key.ts — the single hardened CID→object-key builder (design §4.5, P1#3).
4
+ *
5
+ * Every place that turns a CID into an R2/FS object key MUST go through
6
+ * `objectKeyForCid`, which first runs `assertValidCid`. CIDs are content
7
+ * hashes (base32lower `b…` / base58btc `z…`, `[a-zA-Z0-9]` only) so they never
8
+ * contain `/` or `..`. Validating before building the key defends the delete
9
+ * path against a poisoned GC-queue row (`cid = "../_metadata.db"`) that would
10
+ * otherwise resolve to a root-internal traversal and destroy the space index
11
+ * (§4.5). This is the one place the rule lives; `runGc` and the provider both
12
+ * call it instead of concatenating `'objects/' + cid` by hand.
13
+ */
14
+ /**
15
+ * Throw if `cid` is not a well-formed CID. Rejects path-traversal strings
16
+ * (`../_metadata.db`, `objects/../x`), empty string, slashes, null bytes, and
17
+ * absurdly long input. Never silently returns — callers rely on the throw to
18
+ * skip a poisoned candidate rather than delete the wrong key.
19
+ */
20
+ declare function assertValidCid(cid: string): void;
21
+ /** Build the object-store key for a CID, after validating it. */
22
+ declare function objectKeyForCid(cid: string): string;
23
+ //#endregion
24
+ export { assertValidCid, objectKeyForCid };
25
+ //# sourceMappingURL=object-key.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-key.d.cts","names":[],"sources":["../src/object-key.ts"],"mappings":";;AA0BA;;;;;AAQA;;;;;;;;;;;;iBARgB,cAAA,CAAe,GAAA;;iBAQf,eAAA,CAAgB,GAAA"}
@@ -0,0 +1,25 @@
1
+ //#region src/object-key.d.ts
2
+ /**
3
+ * object-key.ts — the single hardened CID→object-key builder (design §4.5, P1#3).
4
+ *
5
+ * Every place that turns a CID into an R2/FS object key MUST go through
6
+ * `objectKeyForCid`, which first runs `assertValidCid`. CIDs are content
7
+ * hashes (base32lower `b…` / base58btc `z…`, `[a-zA-Z0-9]` only) so they never
8
+ * contain `/` or `..`. Validating before building the key defends the delete
9
+ * path against a poisoned GC-queue row (`cid = "../_metadata.db"`) that would
10
+ * otherwise resolve to a root-internal traversal and destroy the space index
11
+ * (§4.5). This is the one place the rule lives; `runGc` and the provider both
12
+ * call it instead of concatenating `'objects/' + cid` by hand.
13
+ */
14
+ /**
15
+ * Throw if `cid` is not a well-formed CID. Rejects path-traversal strings
16
+ * (`../_metadata.db`, `objects/../x`), empty string, slashes, null bytes, and
17
+ * absurdly long input. Never silently returns — callers rely on the throw to
18
+ * skip a poisoned candidate rather than delete the wrong key.
19
+ */
20
+ declare function assertValidCid(cid: string): void;
21
+ /** Build the object-store key for a CID, after validating it. */
22
+ declare function objectKeyForCid(cid: string): string;
23
+ //#endregion
24
+ export { assertValidCid, objectKeyForCid };
25
+ //# sourceMappingURL=object-key.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-key.d.mts","names":[],"sources":["../src/object-key.ts"],"mappings":";;AA0BA;;;;;AAQA;;;;;;;;;;;;iBARgB,cAAA,CAAe,GAAA;;iBAQf,eAAA,CAAgB,GAAA"}
@@ -0,0 +1,40 @@
1
+ //#region src/object-key.ts
2
+ /**
3
+ * object-key.ts — the single hardened CID→object-key builder (design §4.5, P1#3).
4
+ *
5
+ * Every place that turns a CID into an R2/FS object key MUST go through
6
+ * `objectKeyForCid`, which first runs `assertValidCid`. CIDs are content
7
+ * hashes (base32lower `b…` / base58btc `z…`, `[a-zA-Z0-9]` only) so they never
8
+ * contain `/` or `..`. Validating before building the key defends the delete
9
+ * path against a poisoned GC-queue row (`cid = "../_metadata.db"`) that would
10
+ * otherwise resolve to a root-internal traversal and destroy the space index
11
+ * (§4.5). This is the one place the rule lives; `runGc` and the provider both
12
+ * call it instead of concatenating `'objects/' + cid` by hand.
13
+ */
14
+ /**
15
+ * CID shape: base32lower (`b…`) or base58btc (`z…`), `[a-zA-Z0-9]` charset,
16
+ * length 22–101 total. Matches `computeCID()` output and the legacy private
17
+ * `DIDSpaceProvider.objectKey` regex.
18
+ */
19
+ const CID_RE = /^[bz][a-zA-Z0-9]{20,100}$/;
20
+ /**
21
+ * Throw if `cid` is not a well-formed CID. Rejects path-traversal strings
22
+ * (`../_metadata.db`, `objects/../x`), empty string, slashes, null bytes, and
23
+ * absurdly long input. Never silently returns — callers rely on the throw to
24
+ * skip a poisoned candidate rather than delete the wrong key.
25
+ */
26
+ function assertValidCid(cid) {
27
+ if (typeof cid !== "string" || !CID_RE.test(cid)) {
28
+ const shown = typeof cid === "string" ? cid.slice(0, 30) : typeof cid;
29
+ throw new Error(`Invalid CID: ${shown}`);
30
+ }
31
+ }
32
+ /** Build the object-store key for a CID, after validating it. */
33
+ function objectKeyForCid(cid) {
34
+ assertValidCid(cid);
35
+ return `objects/${cid}`;
36
+ }
37
+
38
+ //#endregion
39
+ export { assertValidCid, objectKeyForCid };
40
+ //# sourceMappingURL=object-key.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-key.mjs","names":[],"sources":["../src/object-key.ts"],"sourcesContent":["/**\n * object-key.ts — the single hardened CID→object-key builder (design §4.5, P1#3).\n *\n * Every place that turns a CID into an R2/FS object key MUST go through\n * `objectKeyForCid`, which first runs `assertValidCid`. CIDs are content\n * hashes (base32lower `b…` / base58btc `z…`, `[a-zA-Z0-9]` only) so they never\n * contain `/` or `..`. Validating before building the key defends the delete\n * path against a poisoned GC-queue row (`cid = \"../_metadata.db\"`) that would\n * otherwise resolve to a root-internal traversal and destroy the space index\n * (§4.5). This is the one place the rule lives; `runGc` and the provider both\n * call it instead of concatenating `'objects/' + cid` by hand.\n */\n\n/**\n * CID shape: base32lower (`b…`) or base58btc (`z…`), `[a-zA-Z0-9]` charset,\n * length 22–101 total. Matches `computeCID()` output and the legacy private\n * `DIDSpaceProvider.objectKey` regex.\n */\nconst CID_RE = /^[bz][a-zA-Z0-9]{20,100}$/;\n\n/**\n * Throw if `cid` is not a well-formed CID. Rejects path-traversal strings\n * (`../_metadata.db`, `objects/../x`), empty string, slashes, null bytes, and\n * absurdly long input. Never silently returns — callers rely on the throw to\n * skip a poisoned candidate rather than delete the wrong key.\n */\nexport function assertValidCid(cid: string): void {\n if (typeof cid !== \"string\" || !CID_RE.test(cid)) {\n const shown = typeof cid === \"string\" ? cid.slice(0, 30) : typeof cid;\n throw new Error(`Invalid CID: ${shown}`);\n }\n}\n\n/** Build the object-store key for a CID, after validating it. */\nexport function objectKeyForCid(cid: string): string {\n assertValidCid(cid);\n return `objects/${cid}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAM,SAAS;;;;;;;AAQf,SAAgB,eAAe,KAAmB;AAChD,KAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,KAAK,IAAI,EAAE;EAChD,MAAM,QAAQ,OAAO,QAAQ,WAAW,IAAI,MAAM,GAAG,GAAG,GAAG,OAAO;AAClE,QAAM,IAAI,MAAM,gBAAgB,QAAQ;;;;AAK5C,SAAgB,gBAAgB,KAAqB;AACnD,gBAAe,IAAI;AACnB,QAAO,WAAW"}