@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,655 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ const require_tree_index = require('./tree-index.cjs');
3
+ let _aigne_afs = require("@aigne/afs");
4
+
5
+ //#region src/tree-query.ts
6
+ /**
7
+ * TreeQuery — the shared collection-query engine for the did-space TreeIndex
8
+ * family (afs-collection-query Phase 1, design §3.5).
9
+ *
10
+ * One compilation layer, three executors:
11
+ * - SQL builder (`buildTreeQueryStatements`) shared verbatim by
12
+ * SQLiteTreeIndex and (Phase 2) D1TreeIndex — identical dialect
13
+ * (json_extract / json_each / json_type all available on both).
14
+ * - JS executor (`runTreeQueryInMemory`) for MemoryTreeIndex, built on the
15
+ * SAME helpers the SQL path uses for ordering/keyset (`tree-index.ts`) and
16
+ * the canonical core `where` semantics (`whereMatches` from @aigne/afs) —
17
+ * conformance + the lockstep test pin all backends to one behavior.
18
+ *
19
+ * Semantics contract (must match `evaluateCollectionQuery` in @aigne/afs):
20
+ * - string comparisons fold case; numbers/booleans are type-strict
21
+ * - `notIn` includes records where the field is missing/null
22
+ * - `contains` requires an array field; missing/non-array never match
23
+ * - groupBy unnests arrays; missing/null/non-primitive group under `null`;
24
+ * string group keys are folded to lower case
25
+ * - keyset cursor: v2 format shared with list (`v2:<b64>:<b64>`), tie on the
26
+ * child's unique `name`; WHERE applies before pagination so total is the
27
+ * exact filtered count
28
+ */
29
+ const ENGINE_ORDER_COLUMNS = {
30
+ name: "name",
31
+ path: "path",
32
+ size: "size",
33
+ ctime: "ctime",
34
+ mtime: "mtime",
35
+ mimeType: "mime_type"
36
+ };
37
+ const DEFAULT_QUERY_LIMIT = 1e3;
38
+ /**
39
+ * Provider-level constraints on the (already core-validated) spec that the
40
+ * tree engine enforces uniformly. Strict contract: reject, never ignore.
41
+ *
42
+ * Aggregate-mode orderBy is a totally different field set (group keys +
43
+ * `as` names) — those have already been validated by the core; nothing
44
+ * more for the engine to assert here.
45
+ */
46
+ function assertTreeQuerySpec(spec) {
47
+ if (spec.text !== void 0) throw new _aigne_afs.AFSValidationError("Invalid query spec: text: not supported by this provider");
48
+ if (spec.aggregations) return;
49
+ if (spec.orderBy && spec.orderBy.length > 1) throw new _aigne_afs.AFSValidationError("Invalid query spec: orderBy: this provider supports a single sort key");
50
+ const field = spec.orderBy?.[0]?.[0];
51
+ if (field !== void 0 && !ENGINE_ORDER_COLUMNS[field] && !field.startsWith("meta.")) throw new _aigne_afs.AFSValidationError(`Invalid query spec: orderBy: unsupported field ${field}`);
52
+ }
53
+ /** Effective single sort key: requested tuple or the children default (name asc). */
54
+ function effectiveOrder(spec) {
55
+ const tuple = spec.orderBy?.[0];
56
+ return {
57
+ field: tuple?.[0] ?? "name",
58
+ order: tuple?.[1] ?? "asc"
59
+ };
60
+ }
61
+ /** Quoted JSON path for a core-validated dot-path (segments are [\w-]+). */
62
+ function jsonPathOf(field) {
63
+ return `$.${field.split(".").map((seg) => `"${seg}"`).join(".")}`;
64
+ }
65
+ /**
66
+ * Resolve a where/orderBy field to its source JSON column expression and the
67
+ * `$.path` argument to `json_extract`. `meta.*` paths dispatch to the
68
+ * `entries.metadata` column (planning/agent-hub/metadata-foundation.md);
69
+ * everything else stays on the record (inline content JSON).
70
+ *
71
+ * `doc` (doc-mode = dir-per-record) decides where `meta.*` reads from:
72
+ * application metadata is persisted on the FILE row (`cf.metadata`), not on
73
+ * the parent dir row (`e.metadata`), so a doc-mode meta.* filter MUST read
74
+ * `cf` first and fall back to the dir row — the SAME precedence the orderBy
75
+ * path already uses (`COALESCE(cf.metadata, e.metadata)`). Without this a
76
+ * meta.* WHERE/groupBy/aggregate on a `{uuid}/item.json` collection reads the
77
+ * dir row's (always NULL) metadata and never matches. In file mode `e` IS the
78
+ * record file, so `e.metadata` is correct and `cf` doesn't exist in the FROM.
79
+ */
80
+ function fieldSource(field, rec, doc) {
81
+ if (field.startsWith("meta.")) return {
82
+ src: doc ? "COALESCE(cf.metadata, e.metadata)" : "e.metadata",
83
+ path: jsonPathOf(field.slice(5))
84
+ };
85
+ return {
86
+ src: rec,
87
+ path: jsonPathOf(field)
88
+ };
89
+ }
90
+ /**
91
+ * Compile one where leaf against the record expression. Type-strict by spec
92
+ * value type, case-folded for strings — mirrors `whereMatches`.
93
+ */
94
+ function compileLeaf(rec, leaf, doc) {
95
+ const { src, path: p } = fieldSource(leaf.field, rec, doc);
96
+ const eqCond = (value) => {
97
+ if (typeof value === "boolean") return {
98
+ sql: `json_type(${src}, ?) = '${value ? "true" : "false"}'`,
99
+ args: [p]
100
+ };
101
+ if (typeof value === "number") return {
102
+ sql: `(json_type(${src}, ?) IN ('integer','real') AND json_extract(${src}, ?) = ?)`,
103
+ args: [
104
+ p,
105
+ p,
106
+ value
107
+ ]
108
+ };
109
+ return {
110
+ sql: `(json_type(${src}, ?) = 'text' AND lower(json_extract(${src}, ?)) = lower(?))`,
111
+ args: [
112
+ p,
113
+ p,
114
+ value
115
+ ]
116
+ };
117
+ };
118
+ if ("eq" in leaf) return eqCond(leaf.eq);
119
+ if ("in" in leaf || "notIn" in leaf) {
120
+ const parts = (leaf.in ?? leaf.notIn).map((v) => eqCond(v));
121
+ const inSql = `(${parts.map((f) => f.sql).join(" OR ")})`;
122
+ const inArgs = parts.flatMap((f) => f.args);
123
+ if ("in" in leaf) return {
124
+ sql: inSql,
125
+ args: inArgs
126
+ };
127
+ return {
128
+ sql: `(json_type(${src}, ?) IS NULL OR json_type(${src}, ?) = 'null' OR NOT ${inSql})`,
129
+ args: [
130
+ p,
131
+ p,
132
+ ...inArgs
133
+ ]
134
+ };
135
+ }
136
+ if ("contains" in leaf) {
137
+ const v = leaf.contains;
138
+ const member = typeof v === "number" ? {
139
+ sql: `(je.type IN ('integer','real') AND je.value = ?)`,
140
+ args: [v]
141
+ } : {
142
+ sql: `(je.type = 'text' AND lower(je.value) = lower(?))`,
143
+ args: [v]
144
+ };
145
+ return {
146
+ sql: `(json_type(${src}, ?) = 'array' AND EXISTS (SELECT 1 FROM json_each(json_extract(${src}, ?)) je WHERE ${member.sql}))`,
147
+ args: [
148
+ p,
149
+ p,
150
+ ...member.args
151
+ ]
152
+ };
153
+ }
154
+ const op = "gte" in leaf ? ">=" : "<=";
155
+ const bound = "gte" in leaf ? leaf.gte : leaf.lte;
156
+ if (typeof bound === "number") return {
157
+ sql: `(json_type(${src}, ?) IN ('integer','real') AND json_extract(${src}, ?) ${op} ?)`,
158
+ args: [
159
+ p,
160
+ p,
161
+ bound
162
+ ]
163
+ };
164
+ return {
165
+ sql: `(json_type(${src}, ?) = 'text' AND lower(json_extract(${src}, ?)) ${op} lower(?))`,
166
+ args: [
167
+ p,
168
+ p,
169
+ bound
170
+ ]
171
+ };
172
+ }
173
+ /**
174
+ * Build the three statements (page rows / exact count / optional groups) for
175
+ * a collection query over direct children of `parent` in `scope`.
176
+ *
177
+ * Candidate rows:
178
+ * - doc form: ALL direct children; record = LEFT-JOINed `<dir>/<doc>` inline
179
+ * content (file children have no record — `notIn` still matches them, the
180
+ * same as the reference evaluator's missing-field semantics).
181
+ * - file form: direct FILE children; record = the row's own inline content.
182
+ *
183
+ * Malformed/missing inline JSON collapses to NULL record (json_valid guard),
184
+ * never an engine error.
185
+ */
186
+ /**
187
+ * THE single source of the children-candidates FROM clause — the doc
188
+ * sub-file LEFT JOIN used by the query engine (`listChildren` shares it in
189
+ * the join-free `buildChildrenFrom(undefined)` form post-T4.3), so the
190
+ * dir-per-record join condition can never drift. The `e.kind = 'dir'` join
191
+ * condition is
192
+ * load-bearing: without it a FILE row `items/foo` would join
193
+ * `items/fooitem.json` if such a path happened to exist.
194
+ */
195
+ const CHILDREN_INDEX = "idx_entries_children";
196
+ /**
197
+ * Index that serves `ORDER BY <field>` NATIVELY for a `(scope, parent)`
198
+ * children query (E-S-R rule: equality columns then the sort column). ctime /
199
+ * mtime each have a matching `(scope, parent, <col>, name)` index so the sort
200
+ * is index-only and `LIMIT` terminates early instead of reading the whole
201
+ * directory into a temp b-tree. name / size / mimeType / meta.* have no such
202
+ * index → keep `idx_entries_children` (they still sort, but that is unchanged
203
+ * pre-existing behavior, not the aside feed's hot ctime path).
204
+ *
205
+ * Guard: `idx_entries_children` alone forces the (scope,parent,name) index,
206
+ * which cannot order by ctime — so it silently reintroduced the exact
207
+ * `USE TEMP B-TREE FOR ORDER BY` full-directory scan feed-sort-createdat
208
+ * removed (regression caught by e2e-driver-s3-orderby). This routes the ROWS
209
+ * query back onto the ordered index; the count/groups/aggregate FROM keeps the
210
+ * children index (no ORDER BY there — the children hint bounds correctly).
211
+ */
212
+ function orderedChildrenIndex(orderField) {
213
+ if (orderField === "ctime") return "idx_entries_parent_ctime";
214
+ if (orderField === "mtime") return "idx_entries_parent_mtime";
215
+ return CHILDREN_INDEX;
216
+ }
217
+ function buildChildrenFrom(docFile, indexName = CHILDREN_INDEX) {
218
+ const hint = ` INDEXED BY ${indexName}`;
219
+ if (!docFile) return {
220
+ sql: `FROM ds_entries e${hint}`,
221
+ args: []
222
+ };
223
+ return {
224
+ sql: `FROM ds_entries e${hint} LEFT JOIN ds_entries cf ON e.kind = 'dir' AND cf.scope = e.scope AND cf.path = e.path || ?`,
225
+ args: [docFile]
226
+ };
227
+ }
228
+ /**
229
+ * SQL expression producing the canonical `time_bucket` string for a unix-ms
230
+ * source expression. Matches the JS `bucketizeTimestamp()` shape exactly so
231
+ * SQL ↔ memory backends stay byte-equal in the lockstep test:
232
+ *
233
+ * - `day` / `month` / `year` map to direct `strftime` formats.
234
+ * - `week` produces ISO 8601 `YYYY-Www` via a Thursday-anchor formula. SQLite
235
+ * has no `%V`, so we shift the date to its ISO Thursday with the
236
+ * `'-3 days', 'weekday 4'` modifier pair, then count weeks from Jan-4's
237
+ * Thursday of that ISO year (which is always in ISO week 1).
238
+ *
239
+ * `srcExpr` MUST be a SQL expression evaluating to a unix-ms integer (caller
240
+ * guarantees — we wrap with `cast(... as integer) / 1000` for the
241
+ * `'unixepoch'` modifier).
242
+ */
243
+ function buildTimeBucketExpr(srcExpr, granularity) {
244
+ const unix = `(cast(${srcExpr} as integer) / 1000)`;
245
+ switch (granularity) {
246
+ case "day": return `strftime('%Y-%m-%d', ${unix}, 'unixepoch')`;
247
+ case "month": return `strftime('%Y-%m', ${unix}, 'unixepoch')`;
248
+ case "year": return `strftime('%Y', ${unix}, 'unixepoch')`;
249
+ case "week": {
250
+ const thu = `date(${unix}, 'unixepoch', '-3 days', 'weekday 4')`;
251
+ const isoYear = `strftime('%Y', ${thu})`;
252
+ return `(${isoYear} || '-W' || printf('%02d', ${`cast(((julianday(${thu}) - julianday(${`date(${isoYear} || '-01-04', '-3 days', 'weekday 4')`})) / 7) + 1 as integer)`}))`;
253
+ }
254
+ }
255
+ }
256
+ /**
257
+ * Resolve a group-key dimension name to a SQL expression. `time_bucket` is
258
+ * synthesized from `spec.timeBucketField` (default `meta.timestamp`).
259
+ * Everything else is a field dot-path that goes through `fieldSource()` so
260
+ * `meta.*` lands on `entries.metadata` and content paths stay on the
261
+ * record. Returns the column expression and (for `time_bucket`) any
262
+ * pre-extraction expression with the granularity baked in.
263
+ */
264
+ function groupKeyExpr(name, spec, rec) {
265
+ const doc = !!spec.doc;
266
+ if (name === _aigne_afs.TIME_BUCKET_KEY) {
267
+ const { src: src$1, path: p$1 } = fieldSource(spec.timeBucketField ?? "meta.timestamp", rec, doc);
268
+ return buildTimeBucketExpr(`json_extract(${src$1}, '${p$1}')`, spec.timeGranularity);
269
+ }
270
+ const { src, path: p } = fieldSource(name, rec, doc);
271
+ return `json_extract(${src}, '${p}')`;
272
+ }
273
+ /**
274
+ * Compile one aggregation op to its SQL expression. Numeric ops cast to
275
+ * REAL to match the JS reference's `Number(v)` semantics — non-numeric
276
+ * strings/null collapse to 0, BigNumber.toString() roundtrips correctly.
277
+ * `count` is `COUNT(*)` (counts rows, including those with NULL fields).
278
+ */
279
+ function aggregateOpExpr(op, rec, doc) {
280
+ if (op.op === "count") return "COUNT(*)";
281
+ const { src, path: p } = fieldSource(op.field, rec, doc);
282
+ const num = `CAST(json_extract(${src}, '${p}') AS REAL)`;
283
+ switch (op.op) {
284
+ case "sum": return `COALESCE(SUM(${num}), 0)`;
285
+ case "avg": return `AVG(${num})`;
286
+ case "max": return `MAX(${num})`;
287
+ case "min": return `MIN(${num})`;
288
+ }
289
+ }
290
+ function buildTreeQueryStatements(opts) {
291
+ const { scope, parent, spec } = opts;
292
+ const doc = spec.doc;
293
+ const { field, order } = effectiveOrder(spec);
294
+ const rawRec = doc ? "cf.content" : "e.content";
295
+ const rec = `(CASE WHEN ${rawRec} IS NOT NULL AND json_valid(${rawRec}) THEN ${rawRec} ELSE NULL END)`;
296
+ let col;
297
+ let colExpr;
298
+ let nullable;
299
+ if (field.startsWith("meta.")) {
300
+ const metaPath = jsonPathOf(field.slice(5));
301
+ colExpr = doc ? `COALESCE(json_extract(cf.metadata, '${metaPath}'), json_extract(e.metadata, '${metaPath}'))` : `json_extract(e.metadata, '${metaPath}')`;
302
+ col = colExpr;
303
+ nullable = true;
304
+ } else {
305
+ col = ENGINE_ORDER_COLUMNS[field];
306
+ colExpr = `e.${col}`;
307
+ nullable = col === "mime_type";
308
+ }
309
+ const from = buildChildrenFrom(doc);
310
+ const fromSql = from.sql;
311
+ const fromArgs = from.args;
312
+ const rowsFrom = buildChildrenFrom(doc, orderedChildrenIndex(field));
313
+ const baseWhere = ["e.scope = ?", "e.parent = ?"];
314
+ const baseArgs = [scope, parent];
315
+ if (!doc) baseWhere.push("e.kind = 'file'");
316
+ const whereLeaves = (0, _aigne_afs.normalizeWhere)(spec.where);
317
+ for (const leaf of whereLeaves) {
318
+ const frag = compileLeaf(rec, leaf, !!doc);
319
+ baseWhere.push(frag.sql);
320
+ baseArgs.push(...frag.args);
321
+ }
322
+ const whereSql = baseWhere.join(" AND ");
323
+ const parsed = require_tree_index.parseTreeCursor(spec.cursor, true);
324
+ const parts = require_tree_index.buildOrderedQueryParts({
325
+ col: colExpr,
326
+ nullable,
327
+ order,
328
+ tieCol: "e.name",
329
+ cursor: parsed.kind === "v2" ? parsed.cursor : void 0
330
+ });
331
+ const limit = spec.count ? 0 : spec.limit ?? DEFAULT_QUERY_LIMIT;
332
+ const offset = spec.offset ?? 0;
333
+ let rowsSql = `SELECT e.path, e.name, e.kind, e.cid, e.size, e.mtime, e.ctime, e.mime_type, e.metadata AS metadata${doc ? ", cf.content AS cf_content, cf.cid AS cf_cid, cf.metadata AS cf_metadata" : ", e.content AS content"} ${rowsFrom.sql} WHERE ${whereSql}`;
334
+ const rowsArgs = [...rowsFrom.args, ...baseArgs];
335
+ if (parts.cursorWhereSql) {
336
+ rowsSql += ` AND ${parts.cursorWhereSql}`;
337
+ rowsArgs.push(...parts.cursorArgs);
338
+ }
339
+ rowsSql += ` ORDER BY ${parts.orderSql} LIMIT ? OFFSET ?`;
340
+ rowsArgs.push(limit + 1, offset);
341
+ const countFrom = doc && whereLeaves.length === 0 ? buildChildrenFrom(void 0) : from;
342
+ const statements = {
343
+ rows: {
344
+ sql: rowsSql,
345
+ args: rowsArgs
346
+ },
347
+ count: spec.skipTotal ? void 0 : {
348
+ sql: `SELECT COUNT(*) AS cnt ${countFrom.sql} WHERE ${whereSql}`,
349
+ args: [...countFrom.args, ...baseArgs]
350
+ },
351
+ order: {
352
+ field,
353
+ order,
354
+ col
355
+ }
356
+ };
357
+ if (spec.aggregations) {
358
+ const groupKeys = (0, _aigne_afs.aggregateGroupKeyNames)(spec);
359
+ const keySelects = [];
360
+ for (let i = 0; i < groupKeys.length; i++) keySelects.push(`${groupKeyExpr(groupKeys[i], spec, rec)} AS k_${i}`);
361
+ const aggSelects = [];
362
+ for (const agg of spec.aggregations) aggSelects.push(`${aggregateOpExpr(agg, rec, !!doc)} AS ${agg.as}`);
363
+ const asSet = new Set(spec.aggregations.map((a) => a.as));
364
+ const groupSet = new Map(groupKeys.map((k, i) => [k, `k_${i}`]));
365
+ const orderParts = [];
366
+ for (const [orderField, dir] of spec.orderBy ?? []) {
367
+ const expr = groupSet.get(orderField) ?? (asSet.has(orderField) ? orderField : null);
368
+ if (expr) orderParts.push(`${expr} IS NULL ${dir === "asc" ? "ASC" : "DESC"}, ${expr} ${dir === "asc" ? "ASC" : "DESC"}`);
369
+ }
370
+ for (let i = 0; i < groupKeys.length; i++) orderParts.push(`k_${i} ASC`);
371
+ const orderSql = orderParts.length > 0 ? ` ORDER BY ${orderParts.join(", ")}` : "";
372
+ const groupBySql = groupKeys.length > 0 ? ` GROUP BY ${groupKeys.map((_, i) => `k_${i}`).join(", ")}` : "";
373
+ const aggLimit = spec.limit ?? DEFAULT_QUERY_LIMIT;
374
+ const aggOffset = spec.offset ?? 0;
375
+ const aggregateRowsSql = `SELECT ${[...keySelects, ...aggSelects].join(", ")} ${fromSql} WHERE ${whereSql}${groupBySql}${orderSql} LIMIT ? OFFSET ?`;
376
+ const countGroupsSql = groupKeys.length === 0 ? `SELECT 1 AS cnt ${fromSql} WHERE ${whereSql}` : `SELECT COUNT(*) AS cnt FROM (SELECT ${keySelects.join(", ")} ${fromSql} WHERE ${whereSql} GROUP BY ${groupKeys.map((_, i) => `k_${i}`).join(", ")})`;
377
+ statements.aggregate = {
378
+ select: {
379
+ sql: aggregateRowsSql,
380
+ args: [
381
+ ...fromArgs,
382
+ ...baseArgs,
383
+ aggLimit,
384
+ aggOffset
385
+ ]
386
+ },
387
+ countGroups: {
388
+ sql: countGroupsSql,
389
+ args: groupKeys.length === 0 ? [...fromArgs, ...baseArgs] : [...fromArgs, ...baseArgs]
390
+ },
391
+ groupKeys,
392
+ aggregations: spec.aggregations
393
+ };
394
+ return statements;
395
+ }
396
+ if (typeof spec.groupBy === "string") {
397
+ const gp = jsonPathOf(spec.groupBy);
398
+ statements.groups = {
399
+ sql: `SELECT je.type AS t, CASE WHEN je.type = 'text' THEN lower(je.value) ELSE je.value END AS v, COUNT(*) AS cnt ${fromSql}, json_each(CASE json_type(${rec}, ?) WHEN 'array' THEN json_extract(${rec}, ?) WHEN 'true' THEN '[true]' WHEN 'false' THEN '[false]' ELSE json_array(json_extract(${rec}, ?)) END) je WHERE ${whereSql} GROUP BY t, v`,
400
+ args: [
401
+ ...fromArgs,
402
+ gp,
403
+ gp,
404
+ gp,
405
+ ...baseArgs
406
+ ]
407
+ };
408
+ }
409
+ if (spec.seekId !== void 0) statements.seek = {
410
+ sql: `SELECT rn FROM (SELECT e.name AS nm, (ROW_NUMBER() OVER (ORDER BY ${parts.orderSql}) - 1) AS rn ${fromSql} WHERE ${whereSql}) AS _seek WHERE _seek.nm = ?`,
411
+ args: [
412
+ ...fromArgs,
413
+ ...baseArgs,
414
+ spec.seekId
415
+ ]
416
+ };
417
+ return statements;
418
+ }
419
+ /**
420
+ * Assemble a TreeQueryResult from raw SQL rows — shared by SQLiteTreeIndex
421
+ * and D1TreeIndex so row mapping / hasMore slicing / keyset-cursor
422
+ * construction stay one implementation across SQL backends. `rawRows` is
423
+ * the (limit+1)-sized page from `TreeQueryStatements.rows`.
424
+ */
425
+ function buildTreeQueryResultFromSql(opts) {
426
+ const { rawRows, total, groupRows, spec, orderField, seekOffset } = opts;
427
+ const limit = spec.count ? 0 : spec.limit ?? DEFAULT_QUERY_LIMIT;
428
+ const num = (v) => typeof v === "bigint" ? Number(v) : v ?? 0;
429
+ const hasMore = rawRows.length > limit;
430
+ const rows = (hasMore ? rawRows.slice(0, limit) : rawRows).map((r) => {
431
+ const row = {
432
+ path: r.path,
433
+ name: r.name,
434
+ kind: r.kind === "dir" ? "dir" : "file",
435
+ cid: r.cid ?? "",
436
+ size: num(r.size),
437
+ mtime: num(r.mtime),
438
+ ctime: num(r.ctime),
439
+ mimeType: r.mime_type ?? void 0
440
+ };
441
+ if (r.content != null) row.content = r.content;
442
+ if (r.cf_content != null) {
443
+ row.content = r.cf_content;
444
+ row.contentCid = r.cf_cid ?? void 0;
445
+ }
446
+ const meta = require_tree_index.parseTreeEntryMetadata(r.cf_metadata ?? r.metadata);
447
+ if (meta !== void 0) row.metadata = meta;
448
+ return row;
449
+ });
450
+ const result = {
451
+ rows,
452
+ total
453
+ };
454
+ if (groupRows) result.groups = mapGroupRows(groupRows);
455
+ const last = rows[rows.length - 1];
456
+ if (hasMore && last && !spec.count) result.cursor = require_tree_index.buildKeysetCursor(rowSortValue(last, orderField), last.name);
457
+ if (seekOffset !== void 0) result.seekOffset = seekOffset;
458
+ return result;
459
+ }
460
+ /** Sort-column value of a row (NULL mimeType stays null — sorts last). */
461
+ function rowSortValue(row, field) {
462
+ if (field.startsWith("meta.")) {
463
+ let cur = row.metadata;
464
+ for (const seg of field.slice(5).split(".")) {
465
+ if (cur == null || typeof cur !== "object" || Array.isArray(cur)) return null;
466
+ cur = cur[seg];
467
+ }
468
+ if (cur == null) return null;
469
+ if (typeof cur === "string" || typeof cur === "number") return cur;
470
+ return String(cur);
471
+ }
472
+ switch (field) {
473
+ case "name": return row.name;
474
+ case "path": return row.path;
475
+ case "mimeType": return row.mimeType ?? null;
476
+ case "size": return row.size;
477
+ case "ctime": return row.ctime;
478
+ case "mtime": return row.mtime;
479
+ default: return null;
480
+ }
481
+ }
482
+ /** Canonical group ordering: count desc, then String(value) asc. */
483
+ function sortGroups(groups) {
484
+ return groups.sort((a, b) => b.count - a.count || String(a.value).localeCompare(String(b.value)));
485
+ }
486
+ /**
487
+ * Map raw aggregate-mode SQL rows into the canonical `AFSAggregateGroup[]`.
488
+ * Each row has `k_0..k_N` for group dimensions (in `groupKeys` order) plus
489
+ * each aggregation alias. Numeric aggregates that come back as bigint are
490
+ * coerced to Number so callers don't have to worry about wire types.
491
+ */
492
+ function mapAggregateRows(rows, groupKeys, aggregations) {
493
+ const coerce = (v) => {
494
+ if (typeof v === "bigint") return Number(v);
495
+ return v;
496
+ };
497
+ return rows.map((r) => {
498
+ const key = {};
499
+ for (let i = 0; i < groupKeys.length; i++) {
500
+ const v = coerce(r[`k_${i}`]);
501
+ key[groupKeys[i]] = v === null || v === void 0 ? null : typeof v === "string" || typeof v === "number" || typeof v === "boolean" ? v : String(v);
502
+ }
503
+ const out = { key };
504
+ for (const agg of aggregations) {
505
+ const raw = coerce(r[agg.as]);
506
+ if (agg.op === "count") out[agg.as] = typeof raw === "number" ? raw : 0;
507
+ else if (agg.op === "sum") out[agg.as] = typeof raw === "number" ? raw : 0;
508
+ else out[agg.as] = typeof raw === "number" ? raw : null;
509
+ }
510
+ return out;
511
+ });
512
+ }
513
+ /** Map raw group rows (t, v, cnt) into the canonical groups array. */
514
+ function mapGroupRows(rows) {
515
+ const merged = /* @__PURE__ */ new Map();
516
+ for (const r of rows) {
517
+ const t = String(r.t);
518
+ let value;
519
+ if (t === "text") value = String(r.v);
520
+ else if (t === "integer" || t === "real") value = Number(r.v);
521
+ else if (t === "true") value = true;
522
+ else if (t === "false") value = false;
523
+ else value = null;
524
+ const key = `${typeof value}:${String(value)}`;
525
+ const count = typeof r.cnt === "bigint" ? Number(r.cnt) : r.cnt;
526
+ const existing = merged.get(key);
527
+ if (existing) existing.count += count;
528
+ else merged.set(key, {
529
+ value,
530
+ count
531
+ });
532
+ }
533
+ return sortGroups([...merged.values()]);
534
+ }
535
+ /** Parse a record text into a JSON value; malformed → undefined (no record). */
536
+ function parseRecordText(text) {
537
+ if (text === void 0) return void 0;
538
+ try {
539
+ return JSON.parse(text);
540
+ } catch {
541
+ return;
542
+ }
543
+ }
544
+ function foldPrimitive(value) {
545
+ if (typeof value === "string") return value.toLowerCase();
546
+ if (typeof value === "number" || typeof value === "boolean") return value;
547
+ return null;
548
+ }
549
+ /** Group-count with unnest semantics over parsed records (lockstep with SQL). */
550
+ function computeGroups(records, groupBy) {
551
+ const counts = /* @__PURE__ */ new Map();
552
+ const bump = (raw) => {
553
+ const value = foldPrimitive(raw);
554
+ const key = `${typeof value}:${String(value)}`;
555
+ const existing = counts.get(key);
556
+ if (existing) existing.count += 1;
557
+ else counts.set(key, {
558
+ value,
559
+ count: 1
560
+ });
561
+ };
562
+ for (const record of records) {
563
+ const value = (0, _aigne_afs.resolveFieldPath)(record, groupBy);
564
+ if (Array.isArray(value)) for (const member of value) bump(member);
565
+ else bump(value ?? null);
566
+ }
567
+ return sortGroups([...counts.values()]);
568
+ }
569
+ /**
570
+ * Project `select` fields out of a parsed record (nested shape for
571
+ * dot-paths) — same projection rule as the core reference evaluator.
572
+ */
573
+ function projectRecordFields(record, select) {
574
+ const out = {};
575
+ for (const field of select) {
576
+ const value = (0, _aigne_afs.resolveFieldPath)(record, field);
577
+ if (value === void 0) continue;
578
+ const segments = field.split(".");
579
+ let target = out;
580
+ for (let i = 0; i < segments.length - 1; i++) {
581
+ const seg = segments[i];
582
+ if (typeof target[seg] !== "object" || target[seg] === null) target[seg] = {};
583
+ target = target[seg];
584
+ }
585
+ target[segments.at(-1)] = value;
586
+ }
587
+ return out;
588
+ }
589
+ /**
590
+ * Execute a tree query over in-memory candidates — semantics locked to the
591
+ * SQL path by the lockstep test. `where` uses `whereMatchesItem` so that
592
+ * `meta.*` paths resolve against the candidate's `metadata` column the same
593
+ * way the SQL path reads `entries.metadata`.
594
+ */
595
+ function runTreeQueryInMemory(candidates, spec) {
596
+ const filtered = spec.where ? candidates.filter((c) => (0, _aigne_afs.whereMatchesItem)({
597
+ entry: {
598
+ id: c.path,
599
+ path: c.path,
600
+ meta: c.metadata
601
+ },
602
+ record: c.record
603
+ }, spec.where)) : [...candidates];
604
+ if (spec.aggregations) {
605
+ const result$1 = (0, _aigne_afs.evaluateCollectionQuery)(filtered.map((c) => ({
606
+ entry: {
607
+ id: c.path,
608
+ path: c.path,
609
+ meta: c.metadata
610
+ },
611
+ record: c.record
612
+ })), spec);
613
+ return {
614
+ rows: [],
615
+ total: result$1.total,
616
+ aggregateGroups: result$1.aggregateGroups
617
+ };
618
+ }
619
+ const total = spec.skipTotal ? -1 : filtered.length;
620
+ const groups = typeof spec.groupBy === "string" ? computeGroups(filtered.map((c) => c.record), spec.groupBy) : void 0;
621
+ const { field, order } = effectiveOrder(spec);
622
+ filtered.sort((a, b) => {
623
+ const cmp = require_tree_index.compareTreeSortValues(rowSortValue(a, field), rowSortValue(b, field), order);
624
+ if (cmp !== 0) return cmp;
625
+ const tie = a.name === b.name ? 0 : a.name < b.name ? -1 : 1;
626
+ return order === "desc" ? -tie : tie;
627
+ });
628
+ const parsed = require_tree_index.parseTreeCursor(spec.cursor, true);
629
+ const afterCursor = parsed.kind === "v2" ? filtered.filter((row) => require_tree_index.keysetAfter(rowSortValue(row, field), row.name, parsed.cursor, order)) : filtered;
630
+ let seekOffset;
631
+ if (spec.seekId !== void 0) seekOffset = filtered.findIndex((c) => c.name === spec.seekId);
632
+ const offset = spec.offset ?? 0;
633
+ const limit = spec.count ? 0 : spec.limit ?? DEFAULT_QUERY_LIMIT;
634
+ const page = afterCursor.slice(offset, offset + limit);
635
+ const hasMore = offset + limit < afterCursor.length;
636
+ const last = page[page.length - 1];
637
+ const result = {
638
+ rows: page.map(({ record: _record, ...row }) => row),
639
+ total
640
+ };
641
+ if (groups) result.groups = groups;
642
+ if (hasMore && last && !spec.count) result.cursor = require_tree_index.buildKeysetCursor(rowSortValue(last, field), last.name);
643
+ if (seekOffset !== void 0) result.seekOffset = seekOffset;
644
+ return result;
645
+ }
646
+
647
+ //#endregion
648
+ exports.assertTreeQuerySpec = assertTreeQuerySpec;
649
+ exports.buildChildrenFrom = buildChildrenFrom;
650
+ exports.buildTreeQueryResultFromSql = buildTreeQueryResultFromSql;
651
+ exports.buildTreeQueryStatements = buildTreeQueryStatements;
652
+ exports.mapAggregateRows = mapAggregateRows;
653
+ exports.parseRecordText = parseRecordText;
654
+ exports.projectRecordFields = projectRecordFields;
655
+ exports.runTreeQueryInMemory = runTreeQueryInMemory;