@noy-db/hub 0.7.1-pre.0 → 0.8.0

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 (812) hide show
  1. package/CHANGELOG.md +147 -14
  2. package/LICENSE +202 -21
  3. package/NOTICE +1 -0
  4. package/README.md +5 -5
  5. package/codemods/0.8.0-pre.json +61 -0
  6. package/dist/api-OS747DS4.js +18 -0
  7. package/dist/as/index.js +11 -12
  8. package/dist/as/index.js.map +1 -1
  9. package/dist/at/index.js +9 -10
  10. package/dist/attestation/index.js +37 -26
  11. package/dist/attestation/index.js.map +1 -1
  12. package/dist/{backup-XKCXVKV3.js → backup-YE2VQ26S.js} +15 -16
  13. package/dist/backup-YE2VQ26S.js.map +1 -0
  14. package/dist/blobs/index.js +13 -14
  15. package/dist/blobs/index.js.map +1 -1
  16. package/dist/broker/index.js +12 -13
  17. package/dist/broker/index.js.map +1 -1
  18. package/dist/by/index.js +2 -2
  19. package/dist/capsule/contract.d.ts +159 -0
  20. package/dist/capsule/contract.js +95 -0
  21. package/dist/capsule/enclave-aes/bound.d.ts +52 -0
  22. package/dist/capsule/enclave-aes/capabilities.d.ts +2 -0
  23. package/dist/capsule/enclave-aes/classify/compare.d.ts +20 -0
  24. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/find.d.ts +1 -1
  25. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/reveal.d.ts +1 -1
  26. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/verify.d.ts +2 -2
  27. package/dist/{kernel/enclave → capsule/enclave-aes}/classify/write.d.ts +1 -1
  28. package/dist/{kernel/enclave → capsule/enclave-aes}/crypto.d.ts +33 -129
  29. package/dist/capsule/enclave-aes/index.d.ts +113 -0
  30. package/dist/capsule/enclave-aes/index.js +335 -0
  31. package/dist/capsule/enclave-aes/index.js.map +1 -0
  32. package/dist/capsule/enclave-aes/primitives.d.ts +29 -0
  33. package/dist/capsule/index.d.ts +27 -0
  34. package/dist/capsule/plumbing/ct-equal.d.ts +11 -0
  35. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/deterministic.d.ts +8 -21
  36. package/dist/capsule/plumbing/digest.d.ts +122 -0
  37. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/envelope-body.d.ts +44 -48
  38. package/dist/capsule/plumbing/index.d.ts +100 -0
  39. package/dist/capsule/plumbing/lifecycle.d.ts +50 -0
  40. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/record-codec.d.ts +80 -20
  41. package/dist/{kernel/enclave → capsule/plumbing}/record-envelope.d.ts +1 -1
  42. package/dist/capsule/plumbing/rekey-blob.d.ts +33 -0
  43. package/dist/capsule/plumbing/rekey.d.ts +44 -0
  44. package/dist/capsule/plumbing/sealed-slot.d.ts +22 -0
  45. package/dist/capsule/plumbing/sealed-slots.d.ts +37 -0
  46. package/dist/capsule/plumbing/sealing.d.ts +29 -0
  47. package/dist/capsule/plumbing/sign.d.ts +9 -0
  48. package/dist/{kernel/enclave/record-keys → capsule/plumbing}/tombstone.d.ts +2 -2
  49. package/dist/capsule-VOLX3QRQ.js +209 -0
  50. package/dist/cargo/index.js +39 -36
  51. package/dist/{chunk-Q2MPFCQ7.js → chunk-23D6M6VM.js} +5 -5
  52. package/dist/chunk-23D6M6VM.js.map +1 -0
  53. package/dist/{chunk-R7BX2NB3.js → chunk-244QBK7Z.js} +4 -4
  54. package/dist/chunk-244QBK7Z.js.map +1 -0
  55. package/dist/chunk-2AFX33YA.js +936 -0
  56. package/dist/chunk-2AFX33YA.js.map +1 -0
  57. package/dist/{chunk-MVMXZYXT.js → chunk-2GHDLTPE.js} +2 -2
  58. package/dist/{chunk-GYGLAVCX.js → chunk-2MG3SW7Q.js} +6 -2
  59. package/dist/chunk-2MG3SW7Q.js.map +1 -0
  60. package/dist/{chunk-XLMEZIAJ.js → chunk-2ODVB6LZ.js} +2 -2
  61. package/dist/{chunk-HJUWN7JN.js → chunk-2PVXF5CS.js} +33 -8
  62. package/dist/chunk-2PVXF5CS.js.map +1 -0
  63. package/dist/{chunk-YJRT5UQM.js → chunk-2RH777HH.js} +21 -20
  64. package/dist/{chunk-YJRT5UQM.js.map → chunk-2RH777HH.js.map} +1 -1
  65. package/dist/{chunk-7O3Y4PPD.js → chunk-37EPTBBR.js} +153 -16
  66. package/dist/chunk-37EPTBBR.js.map +1 -0
  67. package/dist/{chunk-2ENE6445.js → chunk-3A5DUZ56.js} +102 -16
  68. package/dist/chunk-3A5DUZ56.js.map +1 -0
  69. package/dist/chunk-3EWS67C7.js +461 -0
  70. package/dist/chunk-3EWS67C7.js.map +1 -0
  71. package/dist/{chunk-SGZAIJCV.js → chunk-3L2NBKDR.js} +4 -8
  72. package/dist/chunk-3L2NBKDR.js.map +1 -0
  73. package/dist/{chunk-YMUFFJCO.js → chunk-3TDUWVWB.js} +5 -2
  74. package/dist/chunk-3TDUWVWB.js.map +1 -0
  75. package/dist/{chunk-4GVM6QZA.js → chunk-3XJQBBZD.js} +26 -28
  76. package/dist/chunk-3XJQBBZD.js.map +1 -0
  77. package/dist/{chunk-4ZS56W5S.js → chunk-42ALPZ2B.js} +672 -664
  78. package/dist/chunk-42ALPZ2B.js.map +1 -0
  79. package/dist/chunk-4CIQDWRB.js +524 -0
  80. package/dist/chunk-4CIQDWRB.js.map +1 -0
  81. package/dist/{chunk-RMS3NEA3.js → chunk-4JPMZTJY.js} +2 -2
  82. package/dist/{chunk-P3MG6QCN.js → chunk-4T3SE27M.js} +5 -9
  83. package/dist/chunk-4T3SE27M.js.map +1 -0
  84. package/dist/chunk-4V3Q35WG.js +204 -0
  85. package/dist/chunk-4V3Q35WG.js.map +1 -0
  86. package/dist/{chunk-NQKIUNW5.js → chunk-52MGURXO.js} +2 -2
  87. package/dist/{chunk-EQEYOJBM.js → chunk-5A4345TG.js} +4 -4
  88. package/dist/chunk-5A4345TG.js.map +1 -0
  89. package/dist/{chunk-334WSVOW.js → chunk-5FE75J4S.js} +6 -6
  90. package/dist/chunk-5FE75J4S.js.map +1 -0
  91. package/dist/chunk-5KC7QYEC.js +565 -0
  92. package/dist/chunk-5KC7QYEC.js.map +1 -0
  93. package/dist/{chunk-RSGLUIO6.js → chunk-5UMK7GRI.js} +13 -12
  94. package/dist/chunk-5UMK7GRI.js.map +1 -0
  95. package/dist/chunk-5WWDGFOS.js +275 -0
  96. package/dist/chunk-5WWDGFOS.js.map +1 -0
  97. package/dist/{chunk-QPQUVOZ2.js → chunk-6QVKPHBF.js} +3 -5
  98. package/dist/chunk-6QVKPHBF.js.map +1 -0
  99. package/dist/{chunk-ACAQ2DSG.js → chunk-747G6CT3.js} +2 -2
  100. package/dist/chunk-747G6CT3.js.map +1 -0
  101. package/dist/{chunk-QTQUH4DS.js → chunk-7R2Q7CPL.js} +16 -16
  102. package/dist/chunk-7R2Q7CPL.js.map +1 -0
  103. package/dist/{chunk-UGTBXF5U.js → chunk-7XMHMVTS.js} +3 -3
  104. package/dist/{chunk-YJX7EOJD.js → chunk-A4XMIZT3.js} +6 -6
  105. package/dist/{chunk-YJX7EOJD.js.map → chunk-A4XMIZT3.js.map} +1 -1
  106. package/dist/{chunk-A66I4JOA.js → chunk-AEQGFRU4.js} +4 -4
  107. package/dist/chunk-AEQGFRU4.js.map +1 -0
  108. package/dist/chunk-AL6ML4LA.js +1558 -0
  109. package/dist/chunk-AL6ML4LA.js.map +1 -0
  110. package/dist/{chunk-BZ3534YM.js → chunk-AUKKUPVB.js} +2 -2
  111. package/dist/{chunk-CUZLNGD5.js → chunk-B2YY6WDD.js} +1 -1
  112. package/dist/chunk-B2YY6WDD.js.map +1 -0
  113. package/dist/chunk-BKT776R5.js +1 -0
  114. package/dist/chunk-BNWA3WG5.js +22 -0
  115. package/dist/chunk-BNWA3WG5.js.map +1 -0
  116. package/dist/{chunk-VXANTWBJ.js → chunk-BPWYQ25R.js} +92 -6
  117. package/dist/{chunk-VXANTWBJ.js.map → chunk-BPWYQ25R.js.map} +1 -1
  118. package/dist/{chunk-6LKOJBV6.js → chunk-BVCUTXE3.js} +2 -2
  119. package/dist/chunk-CY2CYVWZ.js +41 -0
  120. package/dist/chunk-CY2CYVWZ.js.map +1 -0
  121. package/dist/{chunk-M4YPHYEH.js → chunk-DHHGL42E.js} +70 -25
  122. package/dist/chunk-DHHGL42E.js.map +1 -0
  123. package/dist/{chunk-VTFVLCUH.js → chunk-DIZLQVAA.js} +2 -2
  124. package/dist/{chunk-G73UVHCA.js → chunk-DLD5LGDS.js} +11 -12
  125. package/dist/chunk-DLD5LGDS.js.map +1 -0
  126. package/dist/{chunk-WQBG4SZS.js → chunk-DQESF6RP.js} +60 -49
  127. package/dist/chunk-DQESF6RP.js.map +1 -0
  128. package/dist/{chunk-LWBCUYZW.js → chunk-E2N2T5ZO.js} +2 -2
  129. package/dist/{chunk-3PGS7TYR.js → chunk-EGVJ7TM4.js} +29 -32
  130. package/dist/chunk-EGVJ7TM4.js.map +1 -0
  131. package/dist/{chunk-JVIBCBC7.js → chunk-EJLV62NI.js} +2 -2
  132. package/dist/{chunk-KKEESNPE.js → chunk-EYG2CY2X.js} +126 -19
  133. package/dist/chunk-EYG2CY2X.js.map +1 -0
  134. package/dist/{enclave-55PAM4YO.js → chunk-EZGV6F47.js} +83 -56
  135. package/dist/chunk-EZGV6F47.js.map +1 -0
  136. package/dist/{chunk-CHQCZZWC.js → chunk-EZOAKKTB.js} +36 -27
  137. package/dist/chunk-EZOAKKTB.js.map +1 -0
  138. package/dist/chunk-F6NCB7KT.js +13 -0
  139. package/dist/chunk-F6NCB7KT.js.map +1 -0
  140. package/dist/chunk-FFJFE4T7.js +100 -0
  141. package/dist/chunk-FFJFE4T7.js.map +1 -0
  142. package/dist/{chunk-JMGDHKQF.js → chunk-FLPCETP6.js} +2 -2
  143. package/dist/chunk-FOEDQATO.js +53 -0
  144. package/dist/chunk-FOEDQATO.js.map +1 -0
  145. package/dist/{chunk-DGOZ4UZD.js → chunk-FVH5QYY2.js} +2 -2
  146. package/dist/{chunk-HIWCKBEY.js → chunk-G2MVBDFP.js} +54 -28
  147. package/dist/chunk-G2MVBDFP.js.map +1 -0
  148. package/dist/chunk-GMKGGY7V.js +234 -0
  149. package/dist/chunk-GMKGGY7V.js.map +1 -0
  150. package/dist/{chunk-EIPVYUEP.js → chunk-GQ4MF3CM.js} +3 -3
  151. package/dist/chunk-GQ4MF3CM.js.map +1 -0
  152. package/dist/{chunk-PEOZ34EM.js → chunk-GSAK56VF.js} +1 -1
  153. package/dist/chunk-GSAK56VF.js.map +1 -0
  154. package/dist/{chunk-5VCRVKOZ.js → chunk-GUZET4SG.js} +12 -4
  155. package/dist/chunk-GUZET4SG.js.map +1 -0
  156. package/dist/{chunk-JBDFMYKQ.js → chunk-GZT3NQRA.js} +2 -2
  157. package/dist/{chunk-K23VKTN4.js → chunk-H23XHRTT.js} +19 -34
  158. package/dist/chunk-H23XHRTT.js.map +1 -0
  159. package/dist/{chunk-TFR7DSOV.js → chunk-H427H63K.js} +2 -2
  160. package/dist/{chunk-DFMWUOU5.js → chunk-H7JBY4P7.js} +23 -32
  161. package/dist/chunk-H7JBY4P7.js.map +1 -0
  162. package/dist/{chunk-SKGMN35F.js → chunk-HS554XAF.js} +3 -3
  163. package/dist/chunk-HS554XAF.js.map +1 -0
  164. package/dist/{chunk-HK67PX4J.js → chunk-HW7CMKUG.js} +1 -1
  165. package/dist/chunk-HW7CMKUG.js.map +1 -0
  166. package/dist/{chunk-3BVH633C.js → chunk-IMQKWR46.js} +5 -7
  167. package/dist/chunk-IMQKWR46.js.map +1 -0
  168. package/dist/{chunk-R42NSZI6.js → chunk-IUBMZPHM.js} +7 -7
  169. package/dist/chunk-IUBMZPHM.js.map +1 -0
  170. package/dist/{chunk-CUQPWYRX.js → chunk-IUT3GWP3.js} +75 -386
  171. package/dist/chunk-IUT3GWP3.js.map +1 -0
  172. package/dist/{chunk-RF6D3Y5E.js → chunk-JDEYF3PJ.js} +4 -8
  173. package/dist/{chunk-RF6D3Y5E.js.map → chunk-JDEYF3PJ.js.map} +1 -1
  174. package/dist/{chunk-PPTHY5QO.js → chunk-JIBUPZHA.js} +99 -8
  175. package/dist/chunk-JIBUPZHA.js.map +1 -0
  176. package/dist/{chunk-SMH6SRX7.js → chunk-JOSPH3E5.js} +2 -2
  177. package/dist/chunk-JQYKPKG6.js +193 -0
  178. package/dist/chunk-JQYKPKG6.js.map +1 -0
  179. package/dist/{chunk-7APJ6CO6.js → chunk-JSMTXZR3.js} +45 -13
  180. package/dist/chunk-JSMTXZR3.js.map +1 -0
  181. package/dist/chunk-JWWYRR4Q.js +12 -0
  182. package/dist/chunk-JWWYRR4Q.js.map +1 -0
  183. package/dist/{chunk-BVN6KXL2.js → chunk-KZXDLBY6.js} +14 -9
  184. package/dist/chunk-KZXDLBY6.js.map +1 -0
  185. package/dist/chunk-LGNDFRYC.js +23 -0
  186. package/dist/chunk-LGNDFRYC.js.map +1 -0
  187. package/dist/{chunk-XKWGNJ26.js → chunk-LIOVX5TJ.js} +7 -11
  188. package/dist/chunk-LIOVX5TJ.js.map +1 -0
  189. package/dist/{chunk-AYX7AINO.js → chunk-LNSVGRHO.js} +5 -7
  190. package/dist/chunk-LNSVGRHO.js.map +1 -0
  191. package/dist/chunk-M5B2W6YY.js +293 -0
  192. package/dist/chunk-M5B2W6YY.js.map +1 -0
  193. package/dist/chunk-MBMTND6D.js +456 -0
  194. package/dist/chunk-MBMTND6D.js.map +1 -0
  195. package/dist/{chunk-3BZZJJMQ.js → chunk-MILI22XQ.js} +3 -3
  196. package/dist/{chunk-A2HKRLPV.js → chunk-MXKI4ABF.js} +18 -59
  197. package/dist/chunk-MXKI4ABF.js.map +1 -0
  198. package/dist/{chunk-ZYIYHJ5R.js → chunk-MXOQ5JCG.js} +869 -238
  199. package/dist/chunk-MXOQ5JCG.js.map +1 -0
  200. package/dist/{chunk-V7ZRRCRJ.js → chunk-N7EVQD5S.js} +9 -13
  201. package/dist/chunk-N7EVQD5S.js.map +1 -0
  202. package/dist/chunk-N7UDP5VU.js +757 -0
  203. package/dist/chunk-N7UDP5VU.js.map +1 -0
  204. package/dist/chunk-NBQ3KK6X.js +270 -0
  205. package/dist/chunk-NBQ3KK6X.js.map +1 -0
  206. package/dist/{chunk-ZORTV6NH.js → chunk-NCO25JZO.js} +88 -4
  207. package/dist/chunk-NCO25JZO.js.map +1 -0
  208. package/dist/chunk-NH2UOV3B.js +18 -0
  209. package/dist/chunk-NH2UOV3B.js.map +1 -0
  210. package/dist/chunk-NYMLINRP.js +28 -0
  211. package/dist/chunk-NYMLINRP.js.map +1 -0
  212. package/dist/{chunk-YYP7WSEB.js → chunk-O2IMQSNA.js} +2 -2
  213. package/dist/chunk-O46CHQT7.js +215 -0
  214. package/dist/chunk-O46CHQT7.js.map +1 -0
  215. package/dist/chunk-OIEO4WDL.js +27 -0
  216. package/dist/chunk-OIEO4WDL.js.map +1 -0
  217. package/dist/{chunk-TRGTKX5E.js → chunk-OKSTSITU.js} +27 -4
  218. package/dist/chunk-OKSTSITU.js.map +1 -0
  219. package/dist/chunk-OYW3I5M4.js +31 -0
  220. package/dist/chunk-OYW3I5M4.js.map +1 -0
  221. package/dist/{chunk-Q7HZX3IF.js → chunk-PD64727P.js} +2 -2
  222. package/dist/chunk-PD64727P.js.map +1 -0
  223. package/dist/{chunk-FET5XCAT.js → chunk-PP3K67AJ.js} +34 -6
  224. package/dist/chunk-PP3K67AJ.js.map +1 -0
  225. package/dist/chunk-Q2XRFWOI.js +40 -0
  226. package/dist/chunk-Q2XRFWOI.js.map +1 -0
  227. package/dist/{chunk-QIZPZMUI.js → chunk-Q4UHJ5SN.js} +2 -2
  228. package/dist/{chunk-FAHMLERK.js → chunk-QBLT6POL.js} +2 -2
  229. package/dist/chunk-QMWY2FDS.js +157 -0
  230. package/dist/chunk-QMWY2FDS.js.map +1 -0
  231. package/dist/{chunk-LH5A3ZPG.js → chunk-RB4DOPGZ.js} +150 -22
  232. package/dist/chunk-RB4DOPGZ.js.map +1 -0
  233. package/dist/chunk-RHVMZSUU.js +7 -0
  234. package/dist/chunk-RHVMZSUU.js.map +1 -0
  235. package/dist/{chunk-BUE2D7PX.js → chunk-SMV2HRDU.js} +2 -2
  236. package/dist/chunk-SUZKW6UR.js +25 -0
  237. package/dist/chunk-SUZKW6UR.js.map +1 -0
  238. package/dist/{chunk-7MG7SJT7.js → chunk-SV2PM2OY.js} +1 -1
  239. package/dist/chunk-SV2PM2OY.js.map +1 -0
  240. package/dist/{chunk-UXVWEX5L.js → chunk-SYNY3VB5.js} +6 -2
  241. package/dist/chunk-SYNY3VB5.js.map +1 -0
  242. package/dist/{chunk-4GFX6MPA.js → chunk-TEHHROZL.js} +6 -8
  243. package/dist/chunk-TEHHROZL.js.map +1 -0
  244. package/dist/chunk-TKVUE4JF.js +1289 -0
  245. package/dist/chunk-TKVUE4JF.js.map +1 -0
  246. package/dist/{chunk-SFAWCTEM.js → chunk-TZZBXPZK.js} +2 -2
  247. package/dist/{chunk-F3W6YMDC.js → chunk-U2FZNEWJ.js} +4 -4
  248. package/dist/chunk-U2FZNEWJ.js.map +1 -0
  249. package/dist/{chunk-BLN54W3L.js → chunk-UA372JHH.js} +56 -3
  250. package/dist/chunk-UA372JHH.js.map +1 -0
  251. package/dist/{chunk-6YXCPL4T.js → chunk-UEFOQH74.js} +2 -2
  252. package/dist/chunk-UEFOQH74.js.map +1 -0
  253. package/dist/{chunk-2N5ML6HT.js → chunk-UIYESRD6.js} +9 -11
  254. package/dist/chunk-UIYESRD6.js.map +1 -0
  255. package/dist/{chunk-UHHPLO3I.js → chunk-V3RWOOSO.js} +4 -4
  256. package/dist/{chunk-KTFRCC5C.js → chunk-V7ADQF5O.js} +82 -8
  257. package/dist/chunk-V7ADQF5O.js.map +1 -0
  258. package/dist/{chunk-453F654R.js → chunk-VAORSCSU.js} +3 -3
  259. package/dist/chunk-VAORSCSU.js.map +1 -0
  260. package/dist/{chunk-GPNTB4Y7.js → chunk-VFHCKG5M.js} +6 -10
  261. package/dist/chunk-VFHCKG5M.js.map +1 -0
  262. package/dist/{chunk-2577DKXB.js → chunk-VHBKYN2J.js} +3 -3
  263. package/dist/chunk-VHBKYN2J.js.map +1 -0
  264. package/dist/chunk-VHM7HCKB.js +220 -0
  265. package/dist/chunk-VHM7HCKB.js.map +1 -0
  266. package/dist/{chunk-ZHKOPKE3.js → chunk-VKI2EB3N.js} +3 -3
  267. package/dist/chunk-VKI2EB3N.js.map +1 -0
  268. package/dist/{chunk-UDHWDSRL.js → chunk-VMV5SBE4.js} +16 -17
  269. package/dist/chunk-VMV5SBE4.js.map +1 -0
  270. package/dist/{chunk-SPYWXKJN.js → chunk-VQDZYB2B.js} +3 -3
  271. package/dist/chunk-VQDZYB2B.js.map +1 -0
  272. package/dist/{chunk-Q2PU57HC.js → chunk-VVOLDVIR.js} +2 -2
  273. package/dist/{chunk-3VF3WQ4F.js → chunk-WPOYWFSE.js} +7 -7
  274. package/dist/{chunk-3VF3WQ4F.js.map → chunk-WPOYWFSE.js.map} +1 -1
  275. package/dist/{chunk-OTQZ7ZWU.js → chunk-WXE4W2U6.js} +7 -11
  276. package/dist/chunk-WXE4W2U6.js.map +1 -0
  277. package/dist/chunk-XBKH4FOC.js +195 -0
  278. package/dist/chunk-XBKH4FOC.js.map +1 -0
  279. package/dist/{chunk-TUFM4UZP.js → chunk-XQRFSKYM.js} +2 -2
  280. package/dist/{chunk-3V4KWFX7.js → chunk-XSPFDUDG.js} +58 -53
  281. package/dist/chunk-XSPFDUDG.js.map +1 -0
  282. package/dist/{chunk-GY4WYNNG.js → chunk-Y2RKVFKR.js} +2 -2
  283. package/dist/{chunk-UP4BECPY.js → chunk-Y3LPTBG7.js} +89 -27
  284. package/dist/chunk-Y3LPTBG7.js.map +1 -0
  285. package/dist/{chunk-4OZNXTO4.js → chunk-YRXFFWG4.js} +2 -2
  286. package/dist/classified/index.js +5 -5
  287. package/dist/{classified-marker-BWOFVYAC.js → classified-marker-SIYKUU5L.js} +3 -3
  288. package/dist/classified-marker-SIYKUU5L.js.map +1 -0
  289. package/dist/collection-facade-CS7CA2XO.js +47 -0
  290. package/dist/{computed-VPOKQK4N.js → computed-FAD7SED4.js} +3 -3
  291. package/dist/consent/index.js +10 -11
  292. package/dist/consent/index.js.map +1 -1
  293. package/dist/cover/index.js +10 -11
  294. package/dist/coverage/index.js +306 -0
  295. package/dist/coverage/index.js.map +1 -0
  296. package/dist/custody/index.js +12 -13
  297. package/dist/{dead-filter-PKQDLOT4.js → dead-filter-4F3LWYKH.js} +11 -3
  298. package/dist/dead-filter-4F3LWYKH.js.map +1 -0
  299. package/dist/debug/index.js +11 -2
  300. package/dist/debug/index.js.map +1 -1
  301. package/dist/{delegation-DS5NRILW.js → delegation-NANZDG4N.js} +13 -16
  302. package/dist/delegation-NANZDG4N.js.map +1 -0
  303. package/dist/derivations/index.js +25 -23
  304. package/dist/derive-XLOJVXPU.js +20 -0
  305. package/dist/directory/index.js +10 -11
  306. package/dist/{dispatch-IEPAVQUM.js → dispatch-H4HV32AM.js} +5 -5
  307. package/dist/{dispatch-Q6MWLOJY.js → dispatch-JDZNGEB3.js} +20 -21
  308. package/dist/dispatch-JDZNGEB3.js.map +1 -0
  309. package/dist/executor-FMPVN6DT.js +35 -0
  310. package/dist/executor-LBBBRTN5.js +8 -0
  311. package/dist/executor-OSRZST2U.js +8 -0
  312. package/dist/export-accessible-RAOJAAU5.js +22 -0
  313. package/dist/extract-partition-JD5CUSTG.js +37 -0
  314. package/dist/{fanout-sidecar-S3QL53YX.js → fanout-sidecar-L7NHPIOC.js} +13 -15
  315. package/dist/fanout-sidecar-L7NHPIOC.js.map +1 -0
  316. package/dist/find-JRN4RNQ5.js +10 -0
  317. package/dist/forget/index.js +9 -10
  318. package/dist/forget/index.js.map +1 -1
  319. package/dist/guards/index.js +4 -4
  320. package/dist/history/index.js +13 -14
  321. package/dist/history/index.js.map +1 -1
  322. package/dist/i18n/index.js +14 -15
  323. package/dist/i18n/index.js.map +1 -1
  324. package/dist/index.d.ts +36 -14
  325. package/dist/index.js +970 -163
  326. package/dist/index.js.map +1 -1
  327. package/dist/indexing/index.js +13 -5
  328. package/dist/indexing/index.js.map +1 -1
  329. package/dist/introspection/index.js +11 -12
  330. package/dist/issue-YIVBZUTH.js +19 -0
  331. package/dist/ivf-flat-UZ6DQDLS.js +314 -0
  332. package/dist/ivf-flat-UZ6DQDLS.js.map +1 -0
  333. package/dist/{json-schema-V3M5MUCM.js → json-schema-3SHX72CC.js} +2 -1
  334. package/dist/json-schema-3SHX72CC.js.map +1 -0
  335. package/dist/kernel/attestation-types.d.ts +62 -0
  336. package/dist/kernel/collection-config.d.ts +5 -68
  337. package/dist/kernel/collection.d.ts +30 -9
  338. package/dist/kernel/cutover-transform.d.ts +1 -1
  339. package/dist/kernel/errors.d.ts +257 -38
  340. package/dist/kernel/generation-map.d.ts +48 -0
  341. package/dist/kernel/merge-authority.d.ts +1 -1
  342. package/dist/kernel/noydb.d.ts +6 -1
  343. package/dist/kernel/paths.d.ts +29 -5
  344. package/dist/kernel/prepared-write.d.ts +1 -1
  345. package/dist/kernel/present-cache.d.ts +58 -0
  346. package/dist/kernel/query/all.d.ts +7 -0
  347. package/dist/kernel/query/builder.d.ts +601 -270
  348. package/dist/kernel/query/civil-date.d.ts +64 -0
  349. package/dist/kernel/query/cursor.d.ts +40 -0
  350. package/dist/kernel/query/distinct-key.d.ts +98 -0
  351. package/dist/kernel/query/hydration.d.ts +76 -0
  352. package/dist/kernel/query/index.d.ts +31 -15
  353. package/dist/kernel/query/internal/core.d.ts +30 -0
  354. package/dist/kernel/query/internal/hooks.d.ts +22 -0
  355. package/dist/kernel/query/internal/maintenance.d.ts +43 -0
  356. package/dist/kernel/query/live/incremental.d.ts +314 -0
  357. package/dist/kernel/query/live/index.d.ts +22 -0
  358. package/dist/kernel/query/live/install.d.ts +2 -0
  359. package/dist/kernel/query/{live.d.ts → live/live.d.ts} +39 -9
  360. package/dist/kernel/query/live/methods.d.ts +107 -0
  361. package/dist/kernel/query/predicate.d.ts +119 -1
  362. package/dist/kernel/query/reduce/date-trunc.d.ts +75 -0
  363. package/dist/kernel/query/reduce/index.d.ts +36 -0
  364. package/dist/kernel/query/reduce/install.d.ts +2 -0
  365. package/dist/kernel/query/reduce/methods.d.ts +259 -0
  366. package/dist/kernel/query/reduce/scan-methods.d.ts +121 -0
  367. package/dist/kernel/query/relate/explain.d.ts +199 -0
  368. package/dist/kernel/query/relate/index.d.ts +48 -0
  369. package/dist/kernel/query/relate/install.d.ts +2 -0
  370. package/dist/kernel/query/relate/join-on.d.ts +126 -0
  371. package/dist/kernel/query/relate/join-reduce.d.ts +16 -0
  372. package/dist/kernel/query/relate/join.d.ts +452 -0
  373. package/dist/kernel/query/relate/methods.d.ts +426 -0
  374. package/dist/kernel/query/relate/partition.d.ts +87 -0
  375. package/dist/kernel/query/relate/scan-methods.d.ts +163 -0
  376. package/dist/kernel/query/relate/traverse.d.ts +109 -0
  377. package/dist/kernel/query/scan-builder.d.ts +79 -176
  378. package/dist/kernel/query/sort-key.d.ts +52 -0
  379. package/dist/kernel/secret-mode.d.ts +1 -1
  380. package/dist/kernel/tx-write-gate.d.ts +77 -0
  381. package/dist/kernel/types.d.ts +113 -8
  382. package/dist/kernel/validation.d.ts +27 -10
  383. package/dist/kernel/vault.d.ts +11 -6
  384. package/dist/kernel/via/compose.d.ts +3 -0
  385. package/dist/kernel/via/index.d.ts +56 -0
  386. package/dist/kernel/via/pipeline.d.ts +48 -0
  387. package/dist/kernel/write-queue.d.ts +17 -0
  388. package/dist/{ledger-EDXFFZQL.js → ledger-5ZMGE44K.js} +11 -12
  389. package/dist/liberate-WZSZM2W6.js +24 -0
  390. package/dist/link-set-MFXC24VK.js +29 -0
  391. package/dist/{managed-secret-NCWEMPUQ.js → managed-secret-MFTFT22X.js} +10 -11
  392. package/dist/materialized-views/index.js +30 -24
  393. package/dist/{migrate-cek-5ENH64AA.js → migrate-cek-DZRFFOHW.js} +2 -2
  394. package/dist/money/index.js +5 -5
  395. package/dist/noydb-ITIGNKUF.js +96 -0
  396. package/dist/overlay-views/index.js +4 -4
  397. package/dist/periods/index.js +12 -13
  398. package/dist/pod/index.js +74 -67
  399. package/dist/{pod-handle-ECVCDIXW.js → pod-handle-A3LET7NO.js} +10 -11
  400. package/dist/pod-handle-A3LET7NO.js.map +1 -0
  401. package/dist/policy/index.js +10 -11
  402. package/dist/port/on/index.d.ts +1 -1
  403. package/dist/port/to/index.d.ts +1 -1
  404. package/dist/port/with/blob-strategy.d.ts +10 -1
  405. package/dist/port/with/classified-strategy.d.ts +1 -1
  406. package/dist/port/with/collection-options.d.ts +6 -1
  407. package/dist/port/with/collection-registries.d.ts +1 -1
  408. package/dist/port/with/coverage-strategy.d.ts +83 -0
  409. package/dist/port/with/lookup-strategy.d.ts +2 -2
  410. package/dist/port/with/service-bus.d.ts +46 -0
  411. package/dist/port/with/strategies.d.ts +2 -0
  412. package/dist/portability/index.js +8 -8
  413. package/dist/{post-register-3IPCSG6Q.js → post-register-7ND27CF2.js} +6 -6
  414. package/dist/post-register-7ND27CF2.js.map +1 -0
  415. package/dist/query/all/index.js +31 -0
  416. package/dist/query/index.js +20 -32
  417. package/dist/query/live/index.js +21 -0
  418. package/dist/query/live/index.js.map +1 -0
  419. package/dist/query/reduce/index.js +33 -0
  420. package/dist/query/reduce/index.js.map +1 -0
  421. package/dist/query/relate/index.js +56 -0
  422. package/dist/query/relate/index.js.map +1 -0
  423. package/dist/reduce/index.js +72 -18
  424. package/dist/reduce/index.js.map +1 -1
  425. package/dist/register-DT5HZ2LZ.js +30 -0
  426. package/dist/registry-BHRZGZHF.js +8 -0
  427. package/dist/registry-ET6ZFFWA.js +34 -0
  428. package/dist/registry-HXFGLGTG.js +8 -0
  429. package/dist/registry-THCPDEOD.js +23 -0
  430. package/dist/request-withdrawal-AV2MJJKY.js +30 -0
  431. package/dist/{reveal-QZDHSGD4.js → reveal-B2TLP4JQ.js} +10 -9
  432. package/dist/reveal-B2TLP4JQ.js.map +1 -0
  433. package/dist/revoke-6DWIEOCV.js +24 -0
  434. package/dist/satellites/index.js +1 -1
  435. package/dist/schema-update/index.js +2 -2
  436. package/dist/sealed-record/index.js +16 -18
  437. package/dist/sealed-record/index.js.map +1 -1
  438. package/dist/search/index.js +11 -5
  439. package/dist/{seed-X5CC22CQ.js → seed-XNSE4U3S.js} +15 -18
  440. package/dist/seed-XNSE4U3S.js.map +1 -0
  441. package/dist/sequence/index.js +9 -10
  442. package/dist/session/index.js +9 -10
  443. package/dist/session/index.js.map +1 -1
  444. package/dist/shadow/index.js +2 -2
  445. package/dist/signer-MHGW3OIL.js +23 -0
  446. package/dist/snapshots/index.js +11 -11
  447. package/dist/stale-6GCFMOOR.js +28 -0
  448. package/dist/storage-BYN5LO6Z.js +21 -0
  449. package/dist/storage-BYN5LO6Z.js.map +1 -0
  450. package/dist/store/index.js +1 -1
  451. package/dist/{store-coordination-provider-4WZAIRHC.js → store-coordination-provider-C4BPT5XF.js} +11 -12
  452. package/dist/store-coordination-provider-C4BPT5XF.js.map +1 -0
  453. package/dist/sync/index.js +10 -11
  454. package/dist/sync/index.js.map +1 -1
  455. package/dist/team/index.js +17 -16
  456. package/dist/tiers/index.js +13 -12
  457. package/dist/to/index.js +2 -2
  458. package/dist/transactions/index.js +3 -3
  459. package/dist/util/index.js +1 -1
  460. package/dist/vault-head/index.js +11 -14
  461. package/dist/vault-head/index.js.map +1 -1
  462. package/dist/{verify-6MDTIUEV.js → verify-UKALW7C2.js} +14 -12
  463. package/dist/verify-UKALW7C2.js.map +1 -0
  464. package/dist/via/blob/index.d.ts +1 -0
  465. package/dist/via/classified/binding.d.ts +2 -2
  466. package/dist/via/classified/config-drift.d.ts +2 -2
  467. package/dist/via/classified/errors.d.ts +1 -1
  468. package/dist/via/geo/binding.d.ts +31 -0
  469. package/dist/via/geo/descriptor.d.ts +54 -0
  470. package/dist/via/geo/geohash.d.ts +95 -0
  471. package/dist/via/geo/index.d.ts +13 -0
  472. package/dist/via/geo/where.d.ts +50 -0
  473. package/dist/via/i18n/core.d.ts +1 -1
  474. package/dist/via/lookup/handle.d.ts +4 -4
  475. package/dist/via/lookup/registry.d.ts +1 -1
  476. package/dist/via/lookup/snapshot.d.ts +3 -3
  477. package/dist/walk-4VPK7AS4.js +20 -0
  478. package/dist/walk-4VPK7AS4.js.map +1 -0
  479. package/dist/with-audit/attestation/index.d.ts +2 -1
  480. package/dist/with-audit/attestation/issue.d.ts +2 -2
  481. package/dist/with-audit/attestation/revoke.d.ts +2 -2
  482. package/dist/with-audit/attestation/scheme.d.ts +7 -0
  483. package/dist/with-audit/attestation/signer.d.ts +1 -1
  484. package/dist/with-audit/attestation/strategy.d.ts +2 -2
  485. package/dist/with-audit/attestation/types.d.ts +10 -0
  486. package/dist/with-audit/attestation/vault-facade.d.ts +2 -2
  487. package/dist/with-audit/attestation/verifier.d.ts +6 -0
  488. package/dist/with-audit/consent/consent.d.ts +1 -1
  489. package/dist/with-audit/consent/strategy.d.ts +1 -1
  490. package/dist/with-audit/coverage/accounting.d.ts +112 -0
  491. package/dist/with-audit/coverage/active.d.ts +29 -0
  492. package/dist/with-audit/coverage/index.d.ts +61 -0
  493. package/dist/with-audit/coverage/sketch.d.ts +75 -0
  494. package/dist/with-audit/forget/subject-index.d.ts +1 -1
  495. package/dist/with-audit/periods/periods.d.ts +55 -7
  496. package/dist/with-audit/periods/reserved-collections.d.ts +3 -0
  497. package/dist/with-audit/periods/vault-facade.d.ts +18 -1
  498. package/dist/with-audit/sealed-record/index.d.ts +2 -2
  499. package/dist/with-audit/sealed-record/strategy.d.ts +1 -1
  500. package/dist/with-audit/tiers/index.d.ts +53 -2
  501. package/dist/with-audit/tiers/strategy.d.ts +8 -0
  502. package/dist/with-cargo/adopt-partition.d.ts +1 -1
  503. package/dist/with-cargo/extract-partition.d.ts +1 -1
  504. package/dist/with-cargo/floor.d.ts +3 -3
  505. package/dist/with-commit/history/history.d.ts +2 -2
  506. package/dist/with-commit/history/index.d.ts +1 -1
  507. package/dist/with-commit/history/ledger/store.d.ts +1 -1
  508. package/dist/with-commit/history/strategy.d.ts +1 -1
  509. package/dist/with-commit/history/time-machine.d.ts +1 -1
  510. package/dist/with-commit/numbering/index.d.ts +1 -1
  511. package/dist/with-commit/sequence/index.d.ts +1 -1
  512. package/dist/with-commit/tx/invariants.d.ts +1 -1
  513. package/dist/with-commit/tx/transaction.d.ts +13 -3
  514. package/dist/with-commit/vault-head/head.d.ts +1 -1
  515. package/dist/with-commit/vault-head/index.d.ts +1 -1
  516. package/dist/with-commit/vault-head/strategy.d.ts +1 -1
  517. package/dist/with-commit/vault-head/verify.d.ts +1 -1
  518. package/dist/with-formula/derivations/dispatch.d.ts +1 -1
  519. package/dist/with-formula/derivations/fanout-sidecar.d.ts +1 -1
  520. package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +4 -3
  521. package/dist/with-formula/materialized-views/emit-memo.d.ts +40 -0
  522. package/dist/with-formula/materialized-views/executor.d.ts +8 -0
  523. package/dist/with-formula/materialized-views/index.d.ts +1 -1
  524. package/dist/with-formula/materialized-views/registry.d.ts +15 -0
  525. package/dist/with-formula/materialized-views/types.d.ts +106 -14
  526. package/dist/with-formula/materialized-views/window-stage.d.ts +11 -0
  527. package/dist/with-formula/overlay-views/types.d.ts +1 -1
  528. package/dist/with-formula/overlay-views/virtual-collection.d.ts +13 -4
  529. package/dist/with-lookup/embeddings/chunks.d.ts +79 -0
  530. package/dist/with-lookup/embeddings/descriptor.d.ts +21 -0
  531. package/dist/with-lookup/embeddings/index.d.ts +3 -0
  532. package/dist/with-lookup/embeddings/ivf-flat.d.ts +93 -0
  533. package/dist/with-lookup/embeddings/vector-index.d.ts +73 -0
  534. package/dist/with-lookup/embeddings/vector-set.d.ts +94 -1
  535. package/dist/with-lookup/embeddings/with-vector-index.d.ts +67 -0
  536. package/dist/with-lookup/indexing/collection-facade.d.ts +86 -3
  537. package/dist/with-lookup/indexing/compound-indexes.d.ts +129 -0
  538. package/dist/with-lookup/indexing/eager-indexes.d.ts +170 -1
  539. package/dist/with-lookup/indexing/index-snapshot.d.ts +62 -0
  540. package/dist/with-lookup/indexing/lazy-builder.d.ts +33 -0
  541. package/dist/with-lookup/indexing/persisted-field-indexes.d.ts +104 -0
  542. package/dist/with-lookup/indexing/persisted-indexes.d.ts +12 -0
  543. package/dist/with-lookup/indexing/sorted-indexes.d.ts +117 -0
  544. package/dist/with-lookup/indexing/unique-constraints.d.ts +106 -23
  545. package/dist/with-lookup/reduce/active.d.ts +2 -24
  546. package/dist/with-lookup/reduce/group-core.d.ts +43 -0
  547. package/dist/with-lookup/reduce/groupby.d.ts +195 -36
  548. package/dist/with-lookup/reduce/incremental-group.d.ts +153 -0
  549. package/dist/with-lookup/reduce/index.d.ts +26 -5
  550. package/dist/with-lookup/reduce/reducers.d.ts +255 -1
  551. package/dist/with-lookup/reduce/reduction.d.ts +44 -13
  552. package/dist/with-lookup/reduce/strategy.d.ts +43 -3
  553. package/dist/with-lookup/reduce/window.d.ts +262 -0
  554. package/dist/with-lookup/search/collection-facade.d.ts +45 -9
  555. package/dist/with-lookup/search/index-store.d.ts +5 -3
  556. package/dist/with-lookup/search/index.d.ts +4 -2
  557. package/dist/with-lookup/search/inverted-index.d.ts +38 -2
  558. package/dist/with-lookup/search/persisted-index-store.d.ts +5 -2
  559. package/dist/with-lookup/search/phrase.d.ts +28 -0
  560. package/dist/with-lookup/search/retrieve-types.d.ts +57 -1
  561. package/dist/with-lookup/search/serialize.d.ts +29 -3
  562. package/dist/with-lookup/search/strategy.d.ts +2 -6
  563. package/dist/with-party/broker/index.d.ts +3 -3
  564. package/dist/with-party/directory/cover/index.d.ts +1 -1
  565. package/dist/with-party/directory/cover/storage.d.ts +1 -1
  566. package/dist/with-party/directory/cover/types.d.ts +1 -1
  567. package/dist/with-party/directory/index.d.ts +1 -1
  568. package/dist/with-party/directory/types.d.ts +1 -1
  569. package/dist/with-party/directory/user-envelope/api.d.ts +1 -1
  570. package/dist/with-party/directory/user-envelope/storage.d.ts +1 -1
  571. package/dist/with-party/policy/engine.d.ts +1 -1
  572. package/dist/with-party/policy/index.d.ts +1 -1
  573. package/dist/with-party/policy/presets.d.ts +1 -1
  574. package/dist/with-party/team/authenticators.d.ts +91 -1
  575. package/dist/with-party/team/delegation.d.ts +1 -1
  576. package/dist/with-party/team/echo-secret.d.ts +2 -2
  577. package/dist/with-party/team/index.d.ts +4 -3
  578. package/dist/with-party/team/keyring.d.ts +2 -2
  579. package/dist/with-party/team/magic-link-grant.d.ts +1 -1
  580. package/dist/with-party/team/managed-secret.d.ts +1 -1
  581. package/dist/with-party/team/noydb-facade.d.ts +12 -3
  582. package/dist/with-party/team/recovery.d.ts +1 -1
  583. package/dist/with-party/team/roster-tag.d.ts +1 -1
  584. package/dist/with-party/team/rotate-recover.d.ts +1 -1
  585. package/dist/with-party/team/wrapped-deks.d.ts +1 -1
  586. package/dist/with-pod/format.d.ts +1 -1
  587. package/dist/with-pod/index.d.ts +1 -1
  588. package/dist/with-pod/pod.d.ts +1 -1
  589. package/dist/with-shape/blobs/blob-compaction.d.ts +17 -1
  590. package/dist/with-shape/blobs/blob-intent.d.ts +1 -1
  591. package/dist/with-shape/blobs/blob-set.d.ts +23 -4
  592. package/dist/with-shape/blobs/legacy-sweep.d.ts +35 -0
  593. package/dist/with-shape/introspection/describe.d.ts +7 -1
  594. package/dist/with-shape/introspection/field-meta.d.ts +18 -0
  595. package/dist/with-shape/introspection/types.d.ts +57 -1
  596. package/dist/with-shape/introspection/walk.d.ts +1 -1
  597. package/dist/with-shape/links/lazy-handle.d.ts +1 -1
  598. package/dist/with-shape/links/link-set.d.ts +1 -1
  599. package/dist/with-shape/links/vault-facade.d.ts +1 -1
  600. package/dist/with-shape/manifest/derive.d.ts +1 -1
  601. package/dist/with-shape/manifest/storage.d.ts +1 -1
  602. package/dist/with-shape/persisted-schemas/register.d.ts +1 -1
  603. package/dist/with-shape/persisted-schemas/storage.d.ts +1 -1
  604. package/dist/with-shape/satellites/dead-filter.d.ts +1 -1
  605. package/dist/with-shape/satellites/declare.d.ts +1 -1
  606. package/dist/with-shape/satellites/marker.d.ts +1 -1
  607. package/dist/with-shape/satellites/post-register.d.ts +1 -1
  608. package/dist/with-store/partitioned/index.d.ts +337 -0
  609. package/dist/with-sync/change-broadcast.d.ts +153 -0
  610. package/dist/with-sync/presence.d.ts +5 -10
  611. package/dist/withdraw-accessible-HL7GACUE.js +27 -0
  612. package/dist/withdraw-accessible-HL7GACUE.js.map +1 -0
  613. package/package.json +48 -12
  614. package/dist/api-WYW4YEQG.js +0 -19
  615. package/dist/backup-XKCXVKV3.js.map +0 -1
  616. package/dist/chunk-2577DKXB.js.map +0 -1
  617. package/dist/chunk-2ENE6445.js.map +0 -1
  618. package/dist/chunk-2N5ML6HT.js.map +0 -1
  619. package/dist/chunk-334WSVOW.js.map +0 -1
  620. package/dist/chunk-3BVH633C.js.map +0 -1
  621. package/dist/chunk-3PGS7TYR.js.map +0 -1
  622. package/dist/chunk-3V4KWFX7.js.map +0 -1
  623. package/dist/chunk-453F654R.js.map +0 -1
  624. package/dist/chunk-4GFX6MPA.js.map +0 -1
  625. package/dist/chunk-4GVM6QZA.js.map +0 -1
  626. package/dist/chunk-4ZS56W5S.js.map +0 -1
  627. package/dist/chunk-5VCRVKOZ.js.map +0 -1
  628. package/dist/chunk-6YXCPL4T.js.map +0 -1
  629. package/dist/chunk-7APJ6CO6.js.map +0 -1
  630. package/dist/chunk-7MG2LHO5.js +0 -1616
  631. package/dist/chunk-7MG2LHO5.js.map +0 -1
  632. package/dist/chunk-7MG7SJT7.js.map +0 -1
  633. package/dist/chunk-7O3Y4PPD.js.map +0 -1
  634. package/dist/chunk-A2HKRLPV.js.map +0 -1
  635. package/dist/chunk-A66I4JOA.js.map +0 -1
  636. package/dist/chunk-ACAQ2DSG.js.map +0 -1
  637. package/dist/chunk-ATL3ZVXT.js +0 -151
  638. package/dist/chunk-ATL3ZVXT.js.map +0 -1
  639. package/dist/chunk-AYX7AINO.js.map +0 -1
  640. package/dist/chunk-BLN54W3L.js.map +0 -1
  641. package/dist/chunk-BRLKZUBT.js +0 -95
  642. package/dist/chunk-BRLKZUBT.js.map +0 -1
  643. package/dist/chunk-BTDR2PXY.js +0 -29
  644. package/dist/chunk-BTDR2PXY.js.map +0 -1
  645. package/dist/chunk-BVN6KXL2.js.map +0 -1
  646. package/dist/chunk-CHQCZZWC.js.map +0 -1
  647. package/dist/chunk-CUQPWYRX.js.map +0 -1
  648. package/dist/chunk-CUZLNGD5.js.map +0 -1
  649. package/dist/chunk-DFMWUOU5.js.map +0 -1
  650. package/dist/chunk-EIPVYUEP.js.map +0 -1
  651. package/dist/chunk-EQEYOJBM.js.map +0 -1
  652. package/dist/chunk-F3W6YMDC.js.map +0 -1
  653. package/dist/chunk-FET5XCAT.js.map +0 -1
  654. package/dist/chunk-G73UVHCA.js.map +0 -1
  655. package/dist/chunk-GPNTB4Y7.js.map +0 -1
  656. package/dist/chunk-GYGLAVCX.js.map +0 -1
  657. package/dist/chunk-HIWCKBEY.js.map +0 -1
  658. package/dist/chunk-HJUWN7JN.js.map +0 -1
  659. package/dist/chunk-HK67PX4J.js.map +0 -1
  660. package/dist/chunk-HPVZCW43.js +0 -479
  661. package/dist/chunk-HPVZCW43.js.map +0 -1
  662. package/dist/chunk-I3ISCYT7.js +0 -159
  663. package/dist/chunk-I3ISCYT7.js.map +0 -1
  664. package/dist/chunk-K23VKTN4.js.map +0 -1
  665. package/dist/chunk-KKEESNPE.js.map +0 -1
  666. package/dist/chunk-KTFRCC5C.js.map +0 -1
  667. package/dist/chunk-LH5A3ZPG.js.map +0 -1
  668. package/dist/chunk-LP7BEXCT.js +0 -32
  669. package/dist/chunk-LP7BEXCT.js.map +0 -1
  670. package/dist/chunk-M4YPHYEH.js.map +0 -1
  671. package/dist/chunk-NSITFOCJ.js +0 -99
  672. package/dist/chunk-NSITFOCJ.js.map +0 -1
  673. package/dist/chunk-OTQZ7ZWU.js.map +0 -1
  674. package/dist/chunk-P3MG6QCN.js.map +0 -1
  675. package/dist/chunk-PEOZ34EM.js.map +0 -1
  676. package/dist/chunk-PPTHY5QO.js.map +0 -1
  677. package/dist/chunk-Q2MPFCQ7.js.map +0 -1
  678. package/dist/chunk-Q7HZX3IF.js.map +0 -1
  679. package/dist/chunk-QPQUVOZ2.js.map +0 -1
  680. package/dist/chunk-QTQUH4DS.js.map +0 -1
  681. package/dist/chunk-R42NSZI6.js.map +0 -1
  682. package/dist/chunk-R7BX2NB3.js.map +0 -1
  683. package/dist/chunk-RSGLUIO6.js.map +0 -1
  684. package/dist/chunk-RTBJ5IOO.js +0 -87
  685. package/dist/chunk-RTBJ5IOO.js.map +0 -1
  686. package/dist/chunk-SGZAIJCV.js.map +0 -1
  687. package/dist/chunk-SKGMN35F.js.map +0 -1
  688. package/dist/chunk-SPYWXKJN.js.map +0 -1
  689. package/dist/chunk-SZJ3DLZA.js +0 -66
  690. package/dist/chunk-SZJ3DLZA.js.map +0 -1
  691. package/dist/chunk-TRGTKX5E.js.map +0 -1
  692. package/dist/chunk-UDHWDSRL.js.map +0 -1
  693. package/dist/chunk-UP4BECPY.js.map +0 -1
  694. package/dist/chunk-UXVWEX5L.js.map +0 -1
  695. package/dist/chunk-V7ZRRCRJ.js.map +0 -1
  696. package/dist/chunk-WQBG4SZS.js.map +0 -1
  697. package/dist/chunk-XKWGNJ26.js.map +0 -1
  698. package/dist/chunk-YMUFFJCO.js.map +0 -1
  699. package/dist/chunk-ZHKOPKE3.js.map +0 -1
  700. package/dist/chunk-ZN4FD4PE.js +0 -364
  701. package/dist/chunk-ZN4FD4PE.js.map +0 -1
  702. package/dist/chunk-ZORTV6NH.js.map +0 -1
  703. package/dist/chunk-ZYIYHJ5R.js.map +0 -1
  704. package/dist/classified-marker-BWOFVYAC.js.map +0 -1
  705. package/dist/collection-facade-JSJYIKS4.js +0 -45
  706. package/dist/dead-filter-PKQDLOT4.js.map +0 -1
  707. package/dist/delegation-DS5NRILW.js.map +0 -1
  708. package/dist/derive-E642AOUB.js +0 -21
  709. package/dist/dispatch-Q6MWLOJY.js.map +0 -1
  710. package/dist/executor-5NIMLSKZ.js +0 -8
  711. package/dist/executor-7UQ3BZ4F.js +0 -29
  712. package/dist/executor-AQVXV5GZ.js +0 -8
  713. package/dist/export-accessible-ORMKLA3E.js +0 -22
  714. package/dist/extract-partition-NKYO3WNG.js +0 -37
  715. package/dist/fanout-sidecar-S3QL53YX.js.map +0 -1
  716. package/dist/find-NOGJ25VX.js +0 -10
  717. package/dist/issue-3DTQ7VJJ.js +0 -18
  718. package/dist/json-schema-V3M5MUCM.js.map +0 -1
  719. package/dist/kernel/enclave/classify/compare.d.ts +0 -10
  720. package/dist/kernel/enclave/index.d.ts +0 -87
  721. package/dist/kernel/enclave/record-keys/lifecycle.d.ts +0 -124
  722. package/dist/kernel/enclave/record-keys/rekey-blob.d.ts +0 -88
  723. package/dist/kernel/enclave/record-keys/rekey.d.ts +0 -91
  724. package/dist/kernel/enclave/record-keys/sealed-slot.d.ts +0 -14
  725. package/dist/kernel/enclave/record-keys/sealed-slots.d.ts +0 -123
  726. package/dist/kernel/enclave/record-keys/sealing.d.ts +0 -70
  727. package/dist/kernel/query/join.d.ts +0 -232
  728. package/dist/liberate-V35QUHJP.js +0 -24
  729. package/dist/link-set-2TTM3IZC.js +0 -30
  730. package/dist/noydb-62MX4QUG.js +0 -90
  731. package/dist/pod-handle-ECVCDIXW.js.map +0 -1
  732. package/dist/post-register-3IPCSG6Q.js.map +0 -1
  733. package/dist/register-HHLXEQDN.js +0 -31
  734. package/dist/registry-23WF3TGH.js +0 -8
  735. package/dist/registry-4AYVUNXK.js +0 -8
  736. package/dist/registry-JS3YFQQM.js +0 -18
  737. package/dist/registry-XX2Z7B46.js +0 -32
  738. package/dist/request-withdrawal-CHPATE4G.js +0 -30
  739. package/dist/reveal-QZDHSGD4.js.map +0 -1
  740. package/dist/revoke-7M2VW4ON.js +0 -23
  741. package/dist/seed-X5CC22CQ.js.map +0 -1
  742. package/dist/signer-SJQJVSM6.js +0 -24
  743. package/dist/stale-BZS6H2RY.js +0 -29
  744. package/dist/storage-RW4QBS23.js +0 -22
  745. package/dist/store-coordination-provider-4WZAIRHC.js.map +0 -1
  746. package/dist/verify-6MDTIUEV.js.map +0 -1
  747. package/dist/walk-ZURCH6RZ.js +0 -21
  748. package/dist/withdraw-accessible-PXR4IXDX.js +0 -27
  749. /package/dist/{api-WYW4YEQG.js.map → api-OS747DS4.js.map} +0 -0
  750. /package/dist/{computed-VPOKQK4N.js.map → capsule/contract.js.map} +0 -0
  751. /package/dist/{kernel/enclave → capsule/enclave-aes}/broker/proof.d.ts +0 -0
  752. /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/bidx.d.ts +0 -0
  753. /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/digest.d.ts +0 -0
  754. /package/dist/{kernel/enclave → capsule/enclave-aes}/classify/vdig.d.ts +0 -0
  755. /package/dist/{kernel/enclave/classify → capsule/plumbing}/kofn.d.ts +0 -0
  756. /package/dist/{kernel/enclave/classify → capsule/plumbing}/normalize.d.ts +0 -0
  757. /package/dist/{kernel/enclave → capsule/plumbing}/record-aad.d.ts +0 -0
  758. /package/dist/{collection-facade-JSJYIKS4.js.map → capsule-VOLX3QRQ.js.map} +0 -0
  759. /package/dist/{chunk-MVMXZYXT.js.map → chunk-2GHDLTPE.js.map} +0 -0
  760. /package/dist/{chunk-XLMEZIAJ.js.map → chunk-2ODVB6LZ.js.map} +0 -0
  761. /package/dist/{chunk-RMS3NEA3.js.map → chunk-4JPMZTJY.js.map} +0 -0
  762. /package/dist/{chunk-NQKIUNW5.js.map → chunk-52MGURXO.js.map} +0 -0
  763. /package/dist/{chunk-UGTBXF5U.js.map → chunk-7XMHMVTS.js.map} +0 -0
  764. /package/dist/{chunk-BZ3534YM.js.map → chunk-AUKKUPVB.js.map} +0 -0
  765. /package/dist/{derive-E642AOUB.js.map → chunk-BKT776R5.js.map} +0 -0
  766. /package/dist/{chunk-6LKOJBV6.js.map → chunk-BVCUTXE3.js.map} +0 -0
  767. /package/dist/{chunk-VTFVLCUH.js.map → chunk-DIZLQVAA.js.map} +0 -0
  768. /package/dist/{chunk-LWBCUYZW.js.map → chunk-E2N2T5ZO.js.map} +0 -0
  769. /package/dist/{chunk-JVIBCBC7.js.map → chunk-EJLV62NI.js.map} +0 -0
  770. /package/dist/{chunk-JMGDHKQF.js.map → chunk-FLPCETP6.js.map} +0 -0
  771. /package/dist/{chunk-DGOZ4UZD.js.map → chunk-FVH5QYY2.js.map} +0 -0
  772. /package/dist/{chunk-JBDFMYKQ.js.map → chunk-GZT3NQRA.js.map} +0 -0
  773. /package/dist/{chunk-TFR7DSOV.js.map → chunk-H427H63K.js.map} +0 -0
  774. /package/dist/{chunk-SMH6SRX7.js.map → chunk-JOSPH3E5.js.map} +0 -0
  775. /package/dist/{chunk-3BZZJJMQ.js.map → chunk-MILI22XQ.js.map} +0 -0
  776. /package/dist/{chunk-YYP7WSEB.js.map → chunk-O2IMQSNA.js.map} +0 -0
  777. /package/dist/{chunk-QIZPZMUI.js.map → chunk-Q4UHJ5SN.js.map} +0 -0
  778. /package/dist/{chunk-FAHMLERK.js.map → chunk-QBLT6POL.js.map} +0 -0
  779. /package/dist/{chunk-BUE2D7PX.js.map → chunk-SMV2HRDU.js.map} +0 -0
  780. /package/dist/{chunk-SFAWCTEM.js.map → chunk-TZZBXPZK.js.map} +0 -0
  781. /package/dist/{chunk-UHHPLO3I.js.map → chunk-V3RWOOSO.js.map} +0 -0
  782. /package/dist/{chunk-Q2PU57HC.js.map → chunk-VVOLDVIR.js.map} +0 -0
  783. /package/dist/{chunk-TUFM4UZP.js.map → chunk-XQRFSKYM.js.map} +0 -0
  784. /package/dist/{chunk-GY4WYNNG.js.map → chunk-Y2RKVFKR.js.map} +0 -0
  785. /package/dist/{chunk-4OZNXTO4.js.map → chunk-YRXFFWG4.js.map} +0 -0
  786. /package/dist/{enclave-55PAM4YO.js.map → collection-facade-CS7CA2XO.js.map} +0 -0
  787. /package/dist/{executor-5NIMLSKZ.js.map → computed-FAD7SED4.js.map} +0 -0
  788. /package/dist/{executor-7UQ3BZ4F.js.map → derive-XLOJVXPU.js.map} +0 -0
  789. /package/dist/{dispatch-IEPAVQUM.js.map → dispatch-H4HV32AM.js.map} +0 -0
  790. /package/dist/{executor-AQVXV5GZ.js.map → executor-FMPVN6DT.js.map} +0 -0
  791. /package/dist/{export-accessible-ORMKLA3E.js.map → executor-LBBBRTN5.js.map} +0 -0
  792. /package/dist/{extract-partition-NKYO3WNG.js.map → executor-OSRZST2U.js.map} +0 -0
  793. /package/dist/{find-NOGJ25VX.js.map → export-accessible-RAOJAAU5.js.map} +0 -0
  794. /package/dist/{issue-3DTQ7VJJ.js.map → extract-partition-JD5CUSTG.js.map} +0 -0
  795. /package/dist/{ledger-EDXFFZQL.js.map → find-JRN4RNQ5.js.map} +0 -0
  796. /package/dist/{liberate-V35QUHJP.js.map → issue-YIVBZUTH.js.map} +0 -0
  797. /package/dist/{link-set-2TTM3IZC.js.map → ledger-5ZMGE44K.js.map} +0 -0
  798. /package/dist/{managed-secret-NCWEMPUQ.js.map → liberate-WZSZM2W6.js.map} +0 -0
  799. /package/dist/{noydb-62MX4QUG.js.map → link-set-MFXC24VK.js.map} +0 -0
  800. /package/dist/{register-HHLXEQDN.js.map → managed-secret-MFTFT22X.js.map} +0 -0
  801. /package/dist/{migrate-cek-5ENH64AA.js.map → migrate-cek-DZRFFOHW.js.map} +0 -0
  802. /package/dist/{registry-23WF3TGH.js.map → noydb-ITIGNKUF.js.map} +0 -0
  803. /package/dist/{registry-4AYVUNXK.js.map → query/all/index.js.map} +0 -0
  804. /package/dist/{registry-JS3YFQQM.js.map → register-DT5HZ2LZ.js.map} +0 -0
  805. /package/dist/{registry-XX2Z7B46.js.map → registry-BHRZGZHF.js.map} +0 -0
  806. /package/dist/{request-withdrawal-CHPATE4G.js.map → registry-ET6ZFFWA.js.map} +0 -0
  807. /package/dist/{revoke-7M2VW4ON.js.map → registry-HXFGLGTG.js.map} +0 -0
  808. /package/dist/{signer-SJQJVSM6.js.map → registry-THCPDEOD.js.map} +0 -0
  809. /package/dist/{stale-BZS6H2RY.js.map → request-withdrawal-AV2MJJKY.js.map} +0 -0
  810. /package/dist/{storage-RW4QBS23.js.map → revoke-6DWIEOCV.js.map} +0 -0
  811. /package/dist/{walk-ZURCH6RZ.js.map → signer-MHGW3OIL.js.map} +0 -0
  812. /package/dist/{withdraw-accessible-PXR4IXDX.js.map → stale-6GCFMOOR.js.map} +0 -0
@@ -7,13 +7,15 @@
7
7
  import type { QueryField } from '../types.js';
8
8
  import type { Clause, Operator } from './predicate.js';
9
9
  import type { CollectionIndexes } from '../../with-lookup/indexing/eager-indexes.js';
10
- import type { JoinContext, JoinLeg, JoinStrategy } from './join.js';
11
- import type { LiveQuery } from './live.js';
12
- import type { ReduceSpec, ReduceResult, Reduction } from '../../with-lookup/reduce/reduction.js';
13
- import type { ReducerBuilder } from '../../with-lookup/reduce/reducers.js';
14
- import type { GroupedQuery, GroupedQueryN } from '../../with-lookup/reduce/groupby.js';
10
+ import type { JoinContext, JoinLeg } from './relate/join.js';
11
+ import type { HydrationGate } from './hydration.js';
12
+ import type { SourceChange } from './live/incremental.js';
15
13
  import { type ReduceStrategy } from '../../with-lookup/reduce/strategy.js';
16
14
  import type { ViaPipeline } from '../via/pipeline.js';
15
+ export declare function splitAroundJoins(clauses: readonly Clause[], joins: readonly JoinLeg[]): {
16
+ readonly preJoin: readonly Clause[];
17
+ readonly postJoin: readonly Clause[];
18
+ };
17
19
  export interface OrderBy {
18
20
  readonly field: string;
19
21
  readonly direction: 'asc' | 'desc';
@@ -41,6 +43,16 @@ export interface QueryPlan {
41
43
  readonly orderBy: readonly OrderBy[];
42
44
  readonly limit: number | undefined;
43
45
  readonly offset: number;
46
+ /**
47
+ * Opaque keyset cursor from `.after(cursor)` (#1346). When present, the
48
+ * window starts strictly after the `(sortKey, id)` the cursor names,
49
+ * instead of at a positional offset.
50
+ *
51
+ * OPTIONAL, unlike its `limit`/`offset` neighbours: `QueryPlan` is an
52
+ * exported type that consumers construct, so a required new property would
53
+ * be a breaking change where an optional one is additive.
54
+ */
55
+ readonly after?: string | undefined;
44
56
  /**
45
57
  * Zero-or-more join legs to apply after where/orderBy/limit/offset.
46
58
  * Each leg attaches a resolved right-side record (or null) under its
@@ -48,8 +60,72 @@ export interface QueryPlan {
48
60
  */
49
61
  readonly joins: readonly JoinLeg[];
50
62
  }
51
- /** Default row ceiling for cross-join expansion. Matches JoinTooLargeError's ceiling. */
52
- export declare const DEFAULT_CROSS_JOIN_MAX_ROWS = 50000;
63
+ /**
64
+ * Guard for the terminals that reduce rather than project (#1030). Grouping
65
+ * or aggregating over a joined alias silently bucketed every row under
66
+ * `undefined`, because these terminals never apply join legs at all.
67
+ *
68
+ * ⭐ **`aggregate()` and `groupBy()` NO LONGER CALL THIS — #1338 supplied the
69
+ * work the analysis below specifies, and they route instead of refusing.**
70
+ * The remaining caller is `distinct()`, whose Via question is a different one
71
+ * (`distinctKeyOf` canonicalises through the LEFT pipeline's index key, so an
72
+ * aliased value would dedup on the wrong canonicaliser) and which no issue has
73
+ * asked for. Everything below is the analysis #1338 was built from; it is kept
74
+ * because it names WHICH properties had to hold, and `join-reduce.ts` is where
75
+ * each one is now discharged:
76
+ *
77
+ * - the right side's reducer rewrite AND its posture gate, in one call —
78
+ * `joinAliasBinding` hands each aliased reducer to the right collection's
79
+ * own `wrapReducers` under its bare field name;
80
+ * - right-side change streams merged into the live upstreams —
81
+ * `Query.rightSideUpstreams()`, shared with `live()`;
82
+ * - and the case the analysis could not see, because the grouped terminal
83
+ * is one object further along the chain than `Query.aggregate()`: a
84
+ * reducer over an alias under a LEFT group key, which returned a confident
85
+ * `0`. `refuseAliasBinding` refuses it.
86
+ *
87
+ * Refusing rather than reordering was a DELIBERATE, REVIEWED DECISION
88
+ * (2026-08-10), not an oversight. What follows is why, so it is not
89
+ * re-litigated from scratch — and so nobody "fixes" it for the wrong reason.
90
+ *
91
+ * It is NOT a cardinality problem. A ref join is an equi-join on the target's
92
+ * PRIMARY KEY, so every left row matches at most one right record and the row
93
+ * count is constant across legs (see `join.ts`). Aggregating over joined rows
94
+ * is perfectly well-defined; `count()` is unambiguous. Anyone who reads this
95
+ * guard as "the semantics are unclear" has the wrong model.
96
+ *
97
+ * The actual blocker is that the Via pipeline is LEFT-SCOPED. `aggregate()`
98
+ * runs `this.source.via.wrapReducers(spec)`, which resolves `postureFor(field)`
99
+ * against the LEFT collection's field map. For `sum('client.balance')` that map
100
+ * has no entry, so two things silently do not happen:
101
+ *
102
+ * - money's exact-BigInt reducer rewrite is skipped, and a generic sum runs
103
+ * over stored scaled-integer strings — silently wrong numbers;
104
+ * - `refuseUnqueryableReducers` does not fire, so the `queryable: 'none'`
105
+ * gate that would refuse the field never applies.
106
+ *
107
+ * A gate that silently does not apply is worse than a missing feature, which
108
+ * is why this refuses instead of guessing. Supporting joined aggregation means
109
+ * resolving a joined field's posture and reducers from the RIGHT collection's
110
+ * Via pipeline (via `joinContext.resolveSource`), plus merging right-side
111
+ * change streams into the live-reduction upstreams the way `Query.live()`
112
+ * already does — otherwise a live joined aggregate silently stops updating.
113
+ * That is the work. It is not "apply the legs here".
114
+ *
115
+ * Two things that are already handled, so they are not reasons to defer: the
116
+ * MV dependency analyzer already treats `plan.joins` targets as sources and
117
+ * folds them into the queryHash, and `.crossJoin()` — whose clause lives in
118
+ * the clause list — already aggregates correctly today. The error below points
119
+ * there because it is a real answer, not a consolation.
120
+ *
121
+ * Deliberately NOT tracked as an issue: no consumer has asked, and #984 is the
122
+ * cautionary tale — a speculative deferral whose premises had drifted out of
123
+ * sync with the code by the time anyone re-read it. Build this when a real
124
+ * query needs it, and design it against that query.
125
+ * ⭐ It was tracked as one three weeks later (#1338, the accounting-report
126
+ * shape) and built against that query — which is the paragraph above working,
127
+ * not failing.
128
+ */
53
129
  /**
54
130
  * Source of records that a query executes against.
55
131
  *
@@ -64,8 +140,15 @@ export declare const DEFAULT_CROSS_JOIN_MAX_ROWS = 50000;
64
140
  export interface QuerySource<T> {
65
141
  /** Snapshot of all current records. The query never mutates this array. */
66
142
  snapshot(): readonly T[];
67
- /** Subscribe to mutations; returns an unsubscribe function. */
68
- subscribe?(cb: () => void): () => void;
143
+ /**
144
+ * Subscribe to mutations; returns an unsubscribe function.
145
+ *
146
+ * A source that knows WHICH record changed passes the delta (#1341) so
147
+ * `.live()` can patch its result set rather than re-run the plan. Calling
148
+ * `cb()` with no argument stays valid — it means "something changed", and
149
+ * the live query answers with a full re-run.
150
+ */
151
+ subscribe?(cb: (change?: SourceChange) => void): () => void;
69
152
  /** Index store for the indexed-fast-path. Optional. */
70
153
  getIndexes?(): CollectionIndexes | null;
71
154
  /** O(1) record lookup by id, used to materialize index hits. */
@@ -84,22 +167,52 @@ export interface QuerySource<T> {
84
167
  id: string;
85
168
  record: T;
86
169
  }[];
170
+ /**
171
+ * #1414 — cold-collection gate. Present only on collection-backed eager
172
+ * sources. While `isHydrated()` is false the collection's snapshot is empty
173
+ * by ABSENCE, not by content, so every terminal returns a pending result
174
+ * (awaitable, and throwing on synchronous use) instead of a confident empty.
175
+ * See `query/hydration.ts`.
176
+ */
177
+ hydration?: HydrationGate;
178
+ /**
179
+ * Stable name for this source (`<vault>/<collection>`), used to bind a
180
+ * keyset cursor to the query that minted it (#1346) so a cursor replayed
181
+ * against another collection is refused rather than silently mis-paged.
182
+ */
183
+ identity?: string;
184
+ /**
185
+ * #1417 — monotonic mutation counter for the backing cache. Two reads
186
+ * returning the same number means nothing changed between them, which is
187
+ * what lets `page()`/`after()` reuse one sort across a page walk instead of
188
+ * re-sorting the whole collection per page.
189
+ *
190
+ * Optional, and absence is safe: a source that does not supply it simply
191
+ * gets no memo. It is a CHANGE COUNTER, never a content hash — see
192
+ * `kernel/generation-map.ts` for why it is maintained by the container
193
+ * rather than at the mutation sites.
194
+ */
195
+ snapshotVersion?(): number;
87
196
  }
88
197
  /**
89
- * The chainable builder. All methods return a new Query — the original
90
- * remains unchanged. Terminal methods (`toArray`, `first`, `count`,
91
- * `subscribe`) execute the plan against the source.
92
- *
93
- * Type parameter T flows through the public API for ergonomics, but the
94
- * internal storage uses `unknown` so Collection<T> stays covariant.
95
- *
96
- * The optional `joinContext` is attached when the Query is constructed
97
- * via `Collection.query()` (Collection passes in a context built from
98
- * the Vault's join resolver). A Query constructed via `new Query`
99
- * directly — e.g. from tests with a plain-object source — has no
100
- * joinContext, and calling `.join()` on it throws with an actionable
101
- * error. See `query/join.ts` for the full design.
198
+ * @internal #1458 exported so the extension mixins in `query/{live,reduce,
199
+ * relate}/` can name the source they read. Not part of the published surface:
200
+ * `QuerySource<T>` above is what a consumer implements.
102
201
  */
202
+ export interface InternalSource {
203
+ snapshot(): readonly unknown[];
204
+ subscribe?(cb: (change?: SourceChange) => void): () => void;
205
+ getIndexes?(): CollectionIndexes | null;
206
+ lookupById?(id: string): unknown;
207
+ via?: ViaPipeline;
208
+ snapshotEntries?(): readonly {
209
+ id: string;
210
+ record: unknown;
211
+ }[];
212
+ hydration?: HydrationGate;
213
+ identity?: string;
214
+ snapshotVersion?(): number;
215
+ }
103
216
  /**
104
217
  * Declared deterministic predicate. Carries the consumer's
105
218
  * stable `hash` (for function-body identity), the function itself,
@@ -110,6 +223,67 @@ export interface DeclaredPredicate {
110
223
  hash: string;
111
224
  fn: (record: unknown, ctx?: unknown) => boolean;
112
225
  }
226
+ /**
227
+ * The chainable query builder over an eager collection's decrypted cache.
228
+ *
229
+ * ## Its terminals are SYNCHRONOUS (#1413)
230
+ *
231
+ * `toArray()`, `ids()`, `page()`, `first()`, `count()` and `exists()` return
232
+ * their value directly — `T[]`, `string[]`, `{ rows, nextCursor }`, `T | null`,
233
+ * `number`, `boolean` — **not** a `Promise` of it. That is the architecture
234
+ * showing through, not an oversight: `Query` runs over `source.snapshot()`, an
235
+ * already-decrypted in-memory view. Decryption happened at hydration, so by the
236
+ * time a plan executes there is nothing left to await. Making these async would
237
+ * break every call site and erase the one property that distinguishes a cached
238
+ * query from a fetch.
239
+ *
240
+ * ⚠️ **So `.catch()` / `.then()` on a terminal's result is not part of the
241
+ * contract.** `query().toArray().catch(fn)` fails with *"catch is not a
242
+ * function"* on a loaded collection. Handle errors with `try` / `catch` around
243
+ * the call.
244
+ *
245
+ * `await` is always safe, though — awaiting a plain array yields the array —
246
+ * and on an unhydrated collection it is REQUIRED. See below.
247
+ *
248
+ * ## The one exception, and it is not an async terminal (#1414)
249
+ *
250
+ * On a collection that has never been loaded, a terminal cannot answer: the
251
+ * snapshot is empty by ABSENCE, not by content. Rather than return a confident
252
+ * `[]` / `0` / `false`, it returns a **pending result** — a thenable that
253
+ * hydrates and re-runs the terminal when awaited, and throws
254
+ * {@link CollectionNotHydratedError} on every use that READS it — `.length`,
255
+ * indexing, iteration, spread, `JSON.stringify`, any property access.
256
+ * `Array.isArray` answers `true`, so the ordinary defensive guard for a `T[]`
257
+ * reaches that throw rather than silently substituting `[]` (#1462); `typeof`
258
+ * and truthiness are the two uses that cannot throw, and
259
+ * `query/hydration.ts` enumerates why. It is deliberately NOT a
260
+ * promise-shaped array: the moment the collection is hydrated the very same
261
+ * call returns the plain synchronous value again. Write
262
+ * `await collection.query().toArray()` — correct in both states — or
263
+ * `await collection.list()` first and then read synchronously.
264
+ * See `query/hydration.ts`.
265
+ *
266
+ * ## Where the same name IS async
267
+ *
268
+ * `PartitionedQuery.toArray()` (`with-store/partitioned/index.ts`) and the lazy
269
+ * builder's `LazyQuery.toArray()` (`with-lookup/indexing/lazy-builder.ts`)
270
+ * return `Promise<T[]>`. Both genuinely fetch — across partition legs, or
271
+ * through the persisted `_idx/` side-car — so both genuinely await. Same
272
+ * method name, different contract, because the surface underneath differs.
273
+ *
274
+ * ---
275
+ *
276
+ * All non-terminal methods return a NEW Query — the original is unchanged.
277
+ * Type parameter T flows through the public API for ergonomics, but the
278
+ * internal storage uses `unknown` so `Collection<T>` stays covariant.
279
+ *
280
+ * The optional `joinContext` is attached when the Query is constructed via
281
+ * `Collection.query()` (Collection passes in a context built from the Vault's
282
+ * join resolver). A Query constructed via `new Query` directly — e.g. from
283
+ * tests with a plain-object source — has no joinContext, and calling `.join()`
284
+ * on it throws with an actionable error. See `query/join.ts` for the full
285
+ * design.
286
+ */
113
287
  export declare class Query<T, S extends keyof T = never, Q extends keyof T & string = never, M extends keyof T & string = never> {
114
288
  private readonly source;
115
289
  private readonly plan;
@@ -129,6 +303,23 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
129
303
  * queries constructed without a Collection backing).
130
304
  */
131
305
  _joinContext(): JoinContext | undefined;
306
+ /**
307
+ * @internal #1414 — clone this Query with the cold-collection gate REMOVED.
308
+ *
309
+ * For engine-internal readers only. The materialized-view engine reads its
310
+ * source collections through the public `collection.query()` on paths that
311
+ * are synchronous by construction (registration inspects the plan; the
312
+ * executor's row scan is called from inside a write commit), and it has
313
+ * always read whatever the in-memory cache held. Gating those would turn a
314
+ * pre-existing read into a throw for consumers who never asked a question —
315
+ * so this preserves that behaviour EXACTLY, and confines #1414's change to
316
+ * the surface a consumer or a guard actually calls.
317
+ *
318
+ * ⚠️ It does not make an unhydrated read correct — an MV computed over a
319
+ * cold source is the same defect wearing a different hat. That is tracked
320
+ * separately; do not reach for this to silence the gate in new code.
321
+ */
322
+ _ungated(): Query<T, S, Q, M>;
132
323
  /**
133
324
  * @internal — clone this Query with a declared-predicate map
134
325
  * attached. Used by the materialized-view registry to enable
@@ -145,6 +336,32 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
145
336
  * Throws if the source is not collection-backed (no `snapshotEntries`).
146
337
  */
147
338
  _idArray(): string[];
339
+ /**
340
+ * The ids of the records this query matches (#1351) — the public spelling
341
+ * of {@link _idArray}, and the eager half of the subquery operand:
342
+ * `where(f, 'in', inner.ids())` and `where(f, 'in', inner)` build the SAME
343
+ * clause. Reach for the explicit form when you want to reuse the id set, or
344
+ * to see it.
345
+ *
346
+ * Requires a collection-backed query (`collection.query()`); a `crossJoin`
347
+ * plan is refused, because it produces new row objects and there is no id
348
+ * to recover.
349
+ *
350
+ * **Synchronous** (#1413) — returns `string[]`, not a promise; the cache it reads is
351
+ * already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
352
+ * (#1414); `.catch()` is not available. See the {@link Query} class doc.
353
+ */
354
+ ids(): string[];
355
+ /**
356
+ * @internal — the id-operand contract `normalizeSubqueryOperand()`
357
+ * (`predicate.ts`) duck-types when this Query is passed as the operand of
358
+ * `in`/`!in`. Separate from {@link ids} so the failure a subquery hits is
359
+ * phrased as a subquery failure rather than as a `retrieve({ within })` one.
360
+ */
361
+ _asIdOperand(): {
362
+ readonly ids: readonly string[];
363
+ readonly from: string;
364
+ };
148
365
  /**
149
366
  * Filter by a registered deterministic predicate. Requires
150
367
  * the Query to have been augmented with a predicates map (typically
@@ -200,6 +417,28 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
200
417
  }): Query<T, S, Q, M>;
201
418
  /** Cap the result size. */
202
419
  limit(n: number): Query<T, S, Q, M>;
420
+ /**
421
+ * Resume strictly after the row an opaque keyset cursor names (#1346).
422
+ *
423
+ * ```ts
424
+ * const first = people.query().orderBy('name').limit(20).page()
425
+ * const next = people.query().orderBy('name').limit(20).after(first.nextCursor!).page()
426
+ * ```
427
+ *
428
+ * Unlike `offset(n)`, the window is anchored to a `(sortKey, id)` position,
429
+ * so a record inserted or deleted before it — including the cursor's own
430
+ * row — cannot re-serve or skip a record.
431
+ *
432
+ * The cursor is OPAQUE: pass back a `nextCursor` from `.page()` verbatim
433
+ * and do not parse it. It is validated when the query executes (not here —
434
+ * the sort spec it is bound to may still be added to the chain), and a
435
+ * cursor from a different collection or a different `orderBy(...)` spec is
436
+ * REFUSED rather than mis-paged.
437
+ *
438
+ * Requires at least one `orderBy(...)`, an id-paired (collection-backed)
439
+ * source, no join legs and no `offset()`; each is a loud error at execution.
440
+ */
441
+ after(cursor: string): Query<T, S, Q, M>;
203
442
  /** Skip the first N matching records (after ordering). */
204
443
  offset(n: number): Query<T, S, Q, M>;
205
444
  /**
@@ -260,89 +499,69 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
260
499
  * correlation goes through `Noydb.queryAcross`, not
261
500
  * `.join()`.
262
501
  */
263
- join<As extends string, R = unknown>(field: QueryField<T, S>, opts: {
264
- as: As;
265
- strategy?: JoinStrategy;
266
- maxRows?: number;
267
- }): Query<T & Record<As, R | null>, S, Q, M>;
268
- /**
269
- * Cartesian-product cross-join against `target` collection. Each result row
270
- * carries the original `T` fields plus `result[as]` populated from every
271
- * right-side row (or the filtered subset when `on:` is supplied).
272
- *
273
- * **⚠️ INNER-join semantics — an empty right subset DROPS the left row.**
274
- * Each left row is emitted once per matching right row, so when `on:`
275
- * yields nothing the row vanishes with no error, no warning and no count
276
- * mismatch. This bites hardest on a reverse FK, where `.join()` (which is
277
- * forward-only, and already a genuine LEFT outer join) does not apply and
278
- * `.crossJoin()` is the only tool. To keep the row, return a one-element
279
- * array holding `null`:
280
- *
281
- * ```ts
282
- * .crossJoin('clients', { as: 'client', on: (b) => byEntity.get(b.entityId) ?? [null] })
283
- * // ^^^^^^^^
284
- * // the ONLY thing preserving the row
285
- * ```
286
- *
287
- * **Prefer `outer: true`**, which does exactly this and types the alias as
288
- * `TTarget | null`:
289
- *
290
- * ```ts
291
- * .crossJoin('clients', { as: 'client', outer: true, on: (b) => byEntity.get(b.entityId) ?? [] })
292
- * ```
293
- *
294
- * The `?? [null]` form remains valid and is what `outer` does internally, but
295
- * it is invisible intent: it types the alias as non-null while the row can
296
- * hold null, and a later "simplification" that drops it silently
297
- * reintroduces the row loss.
298
- *
299
- * **Order matters:** `.where().crossJoin()` filters BEFORE expanding (cheaper);
300
- * `.crossJoin().where('alias.field', ...)` filters AFTER (required when the
301
- * where clause references the aliased fields).
302
- *
303
- * **Cost ceiling:** `CrossJoinTooLargeError` fires before allocation when
304
- * `leftRows × rightRows` (or the cumulative lateral count) exceeds the limit.
305
- * Default: 50,000 rows. Override per-clause with `{ maxRows: N }`.
306
- *
307
- * **`on:` shapes:**
308
- * - `on: (left) => TTarget[]` — subset form (most efficient)
309
- * - `on: (left) => (right) => boolean` — predicate form
310
- * - `on: { predicate: 'name' }` — MV-safe, hash-tracked form
311
- * (requires the Query to have been augmented via `_withPredicates`)
312
- *
313
- * Requires a JoinContext (constructed via `collection.query()`).
314
- */
315
- crossJoin<TTarget = unknown, As extends string = string, TOuter extends boolean = false>(target: string, opts: {
316
- as: As;
317
- on?: ((left: T) => unknown[] | ((right: TTarget) => boolean)) | {
318
- readonly predicate: string;
319
- };
320
- maxRows?: number;
321
- /**
322
- * Keep the left row when its right side is empty, with `null` under
323
- * `as`, instead of dropping it (#1130). Widens the alias to
324
- * `TTarget | null` — which is why it is a type parameter rather than a
325
- * plain boolean: `outer: false` must not pay for a null the row can
326
- * never hold.
327
- */
328
- outer?: TOuter;
329
- }): Query<T & {
330
- [K in As]: TOuter extends true ? TTarget | null : TTarget;
331
- }, S, Q, M>;
332
502
  /**
333
503
  * Execute the plan and return the matching records. When the plan
334
504
  * carries any join legs, they are applied after `where` / `orderBy`
335
- * / `limit` / `offset` narrow the left set. See the `.join()` doc
336
- * for the ordering rationale.
505
+ * / `limit` / `offset` narrow the left set UNLESS a clause (#1030) or
506
+ * the ordering (#1337) addresses a join alias, in which case the legs run
507
+ * first and the sort/page observe the joined relation. See the `.join()`
508
+ * doc for the ordering rationale, and `.explain()` for which one a given
509
+ * plan gets.
337
510
  *
338
511
  * `opts.locale` resolves JOINED right-side i18n fields at the
339
512
  * `join` layer to that locale; without it, the owning collection's default
340
513
  * locale applies, and a locale-less query leaves joined i18n fields raw.
341
514
  * (Left/base i18n fields are resolved by `get`/`list`, not here.)
515
+ *
516
+ * **Synchronous** (#1413) — returns `T[]`, not a promise; the cache it reads is
517
+ * already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
518
+ * (#1414); `.catch()` is not available. See the {@link Query} class doc.
342
519
  */
343
520
  toArray(opts?: {
344
521
  locale?: string;
345
522
  }): T[];
523
+ /**
524
+ * Apply each aliased side's OWN Via result decode, in place of the
525
+ * top-level decode that cannot reach it (#1289, and the fix for #1335).
526
+ *
527
+ * `decodeVia` keys by bare field name, so it dresses exactly the fields
528
+ * sitting at the top of the row. Everything a join puts under an alias —
529
+ * a `.join()`/`.rightJoin()` right record, a `.crossJoin()` right record,
530
+ * and BOTH sides of a `.crossJoinWith()` pair — is therefore invisible to
531
+ * it, and was served raw: a self cross-join returned `"10.00"` on the left
532
+ * and `"1000"` on the right of the same field (#1335).
533
+ *
534
+ * Runs LAST, after every filter, sort and page. That is deliberate: a
535
+ * `where()` operand is built in raw stored space, so dressing earlier would
536
+ * make a post-join predicate compare a decoded string against a raw one.
537
+ * Dressing is presentation; it belongs after the plan has finished.
538
+ *
539
+ * Each alias is decoded by the Via pipeline of the collection the record
540
+ * came FROM — money on the right side is the right side's declaration, not
541
+ * this collection's. A source that declares no result decode returns the
542
+ * record unchanged, so the whole pass is a no-op for the common query and
543
+ * is skipped entirely when the plan has no aliases.
544
+ */
545
+ private dressAliases;
546
+ /**
547
+ * Alias → the Via pipeline of the collection whose records sit under it
548
+ * (#1337). Every alias this plan can produce: a `.join()`/`.rightJoin()`
549
+ * leg, a `.crossJoin()` right side, and both sides of `.crossJoinWith()`.
550
+ *
551
+ * ⭐ **Ordering compares in RAW STORED SPACE, never in dressed space, and
552
+ * that is what forces this map to exist.** `dressAliases` runs LAST — after
553
+ * every filter, sort and page — because a `where` operand is built raw. So
554
+ * the sort sees money as its stored scaled integer, where a generic compare
555
+ * is lexical and gets `'9882'` vs `'10004'` backwards. The left side has
556
+ * always avoided that by asking `source.via.compareForOrder`; an aliased
557
+ * field needs the same question asked of the RIGHT side's pipeline, keyed
558
+ * by the field name WITHOUT the alias prefix (a pipeline covers bare field
559
+ * names — that is the whole of #1335's shape).
560
+ *
561
+ * Empty when no alias resolves a pipeline, in which case the comparator
562
+ * falls back to exactly what it did before.
563
+ */
564
+ private aliasVia;
346
565
  /**
347
566
  * Joins need a `JoinContext`. Unreachable in practice — `.join()` throws
348
567
  * when one is missing — but belt-and-braces for a plan built through the
@@ -350,21 +569,97 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
350
569
  */
351
570
  private requireJoinContext;
352
571
  /**
353
- * Decode this source's Via-covered fields on read (e.g. money: stored
354
- * scaled-int canonical decimal), so `query().toArray()` agrees with
355
- * `get()`/`sum()` on the value. No-op when the source's Via pipeline
356
- * declares no result decode.
357
- *
358
- * The query layer carries no locale context, so money decodes with
359
- * `'raw'` — canonical decimal, WITHOUT fabricating locale-formatted
360
- * `<field>Formatted` / `<field>Number` virtuals. Producing a
361
- * guessed-locale string here would reintroduce a "two read paths
362
- * disagree" failure on the virtual field (e.g. it-IT via `get()` vs
363
- * en-US here). Consumers who need formatted money read through
364
- * `get()`/`list()` with a locale.
572
+ * Present this source's Via-covered fields on read, so `query().toArray()`
573
+ * agrees with `get()`/`list()` about what a record contains (#1416).
574
+ *
575
+ * THIS USED TO RUN `decodeResults`, WHICH IS NOT THE SAME QUESTION. That
576
+ * hook is money's stored→canonical decode and nothing else, so a
577
+ * `computed({ mode: 'virtual' })` field read `undefined` on a query row while
578
+ * `get()` returned it the same record with two shapes depending on which
579
+ * verb produced it, and a caller summing that field over a query result got
580
+ * `NaN` with no error. Reported at `receiptAmount get=84715.00 query=undefined`.
581
+ *
582
+ * The old doc comment defended the omission of money's `<field>Formatted` /
583
+ * `<field>Number` virtuals on the grounds that "the query layer carries no
584
+ * locale context", and that reasoning was right: fabricating a guessed-locale
585
+ * string here would make it-IT via `get()` disagree with en-US here. ⚠️ But
586
+ * the premise had gone stale — `toArray({ locale })` exists and threads its
587
+ * locale into `executePlanWithSource`, `applyJoins` and `applyOrderAndPage`.
588
+ * This was the one call site that never received it, which is also why joined
589
+ * ALIASES were dressed while the base row was not.
590
+ *
591
+ * So this presents at `'raw'`: values — money's canonical decode and every
592
+ * virtual computed field — while money's binding gates the locale-formatted
593
+ * virtuals on `locale !== 'raw'`, so nothing is guessed.
594
+ *
595
+ * ⛔ HONOURING `toArray({ locale })` HERE IS A SEPARATE CHANGE, and the
596
+ * obvious implementation is measurably wrong. Presenting twice — once raw for
597
+ * the plan, once at the locale for output — silently yields the RAW result:
598
+ *
599
+ * presentSync(stored, raw) -> { amount: "84715.00" }
600
+ * presentSync(that, 'en-US') -> { amount: "84715.00" } <-- no siblings
601
+ * presentSync(stored, 'en-US') -> { amount: "84715.00",
602
+ * amountFormatted: "THB 84,715.00", ... }
603
+ *
604
+ * because the second pass sees an already-decoded value and re-emits no
605
+ * siblings. So formatting has to happen in ONE pass at the final locale —
606
+ * and one of this method's call sites runs BEFORE the post-join filter,
607
+ * where a formatted value would change what a `where()` predicate compares
608
+ * against. That is the same rule `dressAliases` states: dressing is
609
+ * presentation and belongs after the plan has finished. Deciding it needs
610
+ * its own change; leaving `toArray({ locale })` inert for base rows is the
611
+ * status quo, not a new hole.
612
+ *
613
+ * ⚠️ SYNCHRONOUS, so it folds only the bindings that declared
614
+ * `presentIsSync` — money and computed. A collection also using i18n or
615
+ * lookup keeps those fields undressed here, exactly as today; `presentSync`
616
+ * reports them and `explain()` says so rather than leaving a silent hole.
617
+ * Making this complete would mean making `toArray()` async, which is the
618
+ * contract #1413 deliberately established.
365
619
  */
366
620
  private decodeVia;
367
- /** Return the first matching record, or null. Joins are applied. `opts.locale` resolves joined i18n fields. */
621
+ /**
622
+ * Terminal sibling of `toArray()` that also returns the cursor for the next
623
+ * page (#1346): `{ rows, nextCursor }`, where `nextCursor` is `null` once
624
+ * the last page has been served.
625
+ *
626
+ * ```ts
627
+ * const { rows, nextCursor } = people.query().orderBy('name').limit(20).page()
628
+ * ```
629
+ *
630
+ * Without a sorted index this is still a scan with a keyset filter — stable,
631
+ * not fast. The fast path is a separate concern (#1344).
632
+ *
633
+ * Same requirements as `.after()`: at least one `orderBy(...)`, an id-paired
634
+ * (collection-backed) source, no join legs, no `offset()`.
635
+ *
636
+ * **Synchronous** (#1413) — returns `{ rows, nextCursor }`, not a promise; the cache it reads is
637
+ * already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
638
+ * (#1414); `.catch()` is not available. See the {@link Query} class doc.
639
+ */
640
+ page(opts?: {
641
+ locale?: string;
642
+ }): {
643
+ rows: T[];
644
+ nextCursor: string | null;
645
+ };
646
+ /**
647
+ * The keyset engine behind `page()` / `after()`.
648
+ *
649
+ * It deliberately does NOT reuse `applyOrderAndPage`: paging by keyset needs
650
+ * a TOTAL order (the id breaks ties that the ordinary sort leaves to input
651
+ * order) and needs the id alongside each row to mint the cursor. Both are
652
+ * properties of this path only, so the ordinary read path is untouched.
653
+ */
654
+ private executeKeyset;
655
+ /**
656
+ * Return the first matching record, or null. Joins are applied. `opts.locale`
657
+ * resolves joined i18n fields.
658
+ *
659
+ * **Synchronous** (#1413) — returns `T | null`, not a promise; the cache it reads is
660
+ * already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
661
+ * (#1414); `.catch()` is not available. See the {@link Query} class doc.
662
+ */
368
663
  first(opts?: {
369
664
  locale?: string;
370
665
  }): T | null;
@@ -383,173 +678,45 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
383
678
  * A strict-mode `DanglingReferenceError` becomes reachable from `count()`
384
679
  * in exactly that case, which is acceptable: the caller asked to filter on
385
680
  * the joined side, so they asked for the join.
681
+ *
682
+ * **Synchronous** (#1413) — returns `number`, not a promise; the cache it reads is
683
+ * already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
684
+ * (#1414); `.catch()` is not available. See the {@link Query} class doc.
386
685
  */
387
686
  count(): number;
388
687
  /**
389
- * Reduce the matching records through a named set of reducers.
390
- * the aggregation terminal.
391
- *
392
- * ```ts
393
- * const { total, n, avgAmount } = invoices.query()
394
- * .where('status', '==', 'open')
395
- * .aggregate({
396
- * total: sum('amount'),
397
- * n: count(),
398
- * avgAmount: avg('amount'),
399
- * })
400
- * .run()
401
- * ```
402
- *
403
- * Returns an `Reduction<R>` wrapper with two terminals:
404
- * - `.run(): R` synchronous one-shot reduction
405
- * - `.live(): LiveReduction<R>` — reactive primitive that
406
- * re-runs the reduction whenever the source notifies of a
407
- * change. Always call `live.stop()` when finished.
408
- *
409
- * The reducer spec is bound here once and reused by both
410
- * terminals — this is why `.aggregate()` returns a wrapper instead
411
- * of being a direct terminal. Consumers who only need the static
412
- * value read `.run()`; consumers wiring a reactive UI read
413
- * `.live()`.
414
- *
415
- * Joins are intentionally NOT applied to aggregations in —
416
- * the same logic as `.count()`. Joins in are projection-only
417
- * (they attach an aliased field and never filter), so running
418
- * them just to throw the aliases away would be wasteful. If you
419
- * need a reducer that reads a joined field, open an issue —
420
- * aggregations-across-joins is explicitly out of scope for v1.
421
- *
422
- * Every reducer factory accepts an optional `{ seed }` parameter
423
- * that is plumbed through the protocol but unused by the
424
- * executor — that's constraint #2. When partition-aware
425
- * aggregation lands, the seed will carry running state across
426
- * partition boundaries without an API break.
427
- *
428
- * KNOWN GAP (sealed fields, bare-spec form): `where`/`orderBy`/`groupBy`
429
- * refuse a `sensitive` field at compile time, but a reducer over a sensitive
430
- * field in the BARE-SPEC form (e.g. `aggregate({ x: sum('ssn') })`) is NOT
431
- * refused — the reducer factories (`sum`/`min`/`max`/…) are standalone
432
- * `(field: string)` functions with no collection-type context. This form is
433
- * preserved as-is for backward compatibility.
434
- *
435
- * The BUILDER form closes this gap: `aggregate(b => ({ x: b.sum('field') }))`
436
- * types the builder's field parameter as `QueryField<T, S>`, refusing any
437
- * `sensitive` field at compile time. Use the builder form for new code that
438
- * aggregates over a collection with sensitive fields.
439
- *
440
- */
441
- aggregate<Spec extends ReduceSpec>(spec: Spec): Reduction<ReduceResult<Spec>>;
442
- aggregate<Spec extends ReduceSpec>(build: (b: ReducerBuilder<T, S, M>) => Spec): Reduction<ReduceResult<Spec>>;
443
- /**
444
- * Partition matching records into buckets keyed by a field, then
445
- * terminate with `.aggregate(spec)` to compute per-bucket
446
- * reducers..
447
- *
448
- * ```ts
449
- * const byClient = invoices.query()
450
- * .where('status', '==', 'open')
451
- * .groupBy('clientId')
452
- * .aggregate({ total: sum('amount'), n: count() })
453
- * .run()
454
- * // → [ { clientId: 'c1', total: 5250, n: 3 }, … ]
455
- * ```
456
- *
457
- * Result rows carry the group key value under the grouping field
458
- * name plus every reducer output from the spec. Buckets are
459
- * emitted in first-seen order — consumers who want a specific
460
- * ordering should `.sort()` downstream.
461
- *
462
- * **Cardinality caps:** a one-shot warning fires at 10_000
463
- * distinct groups; `GroupCardinalityError` throws at 100_000.
464
- * Grouping on a high-uniqueness field like `id` or `createdAt` is
465
- * almost always a query mistake — the error message names the
466
- * field and observed cardinality and suggests narrowing with
467
- * `.where()` first.
468
- *
469
- * **Null / undefined keys:** records with a missing or explicitly
470
- * `null` group field get their own buckets. `Map`-based
471
- * partitioning distinguishes `undefined` from `null`, so the two
472
- * cases do NOT merge. Consumers who want them merged should
473
- * coalesce upstream with `.filter()`.
474
- *
475
- * **Joins are not applied** — same rationale as `.count()` and
476
- * `.aggregate()`. Joined fields in are projection-only, so
477
- * running a join inside a grouping pipeline would be wasteful and
478
- * could trigger `DanglingReferenceError` in strict mode for a
479
- * call whose intent is purely to bucket-and-reduce. Grouping by
480
- * a joined field is explicitly out of scope for — file an
481
- * issue if a real consumer needs it.
482
- *
483
- * **Filter clauses (`.filter(fn)`):** grouped queries still
484
- * support filter clauses in the underlying plan — they run in
485
- * the same candidate/filter pipeline that `.aggregate()` uses.
486
- * The performance caveat is the same: filter clauses cost O(N)
487
- * per record and can't be index-accelerated.
488
- */
489
- groupBy<F extends QueryField<T, S>>(field: F): GroupedQuery<T, F, S, M>;
490
- groupBy<F extends readonly [QueryField<T, S>, QueryField<T, S>, ...QueryField<T, S>[]]>(...fields: F): GroupedQueryN<T, F, S, M>;
491
- /**
492
- * Re-run the query whenever the source notifies of changes.
493
- * Returns an unsubscribe function. The callback receives the latest result.
494
- * Throws if the source does not support subscriptions.
495
- *
496
- * **For joined queries, prefer `.live()`** — `subscribe()`
497
- * only re-fires on LEFT-side changes, so joined data can be
498
- * stale if the right side mutates between emissions. `.live()`
499
- * merges change streams from every join target.
500
- */
501
- subscribe(cb: (result: T[]) => void): () => void;
502
- /**
503
- * Reactive terminal — returns a `LiveQuery<T>` that re-runs the
504
- * query and updates its `value` whenever any source feeding it
505
- * mutates..
506
- *
507
- * For non-joined queries, `.live()` is a convenience over the
508
- * existing `.subscribe()` callback shape: a hand-rolled reactive
509
- * primitive with `value` / `error` fields and a `subscribe(cb)`
510
- * notification channel. Frame-agnostic — Vue / React / Solid
511
- * adapters wrap it in their own primitive.
512
- *
513
- * For joined queries, `.live()` additionally subscribes to every
514
- * join target's change stream. Mutations on a right-side
515
- * collection (insert / update / delete of a client referenced by
516
- * an invoice) re-fire the live query and re-evaluate every
517
- * dependent left row. Right-side targets are deduped by
518
- * collection name, so a chain that joins the same target twice
519
- * (e.g. billing client + shipping client → both 'clients') only
520
- * subscribes once.
521
- *
522
- * **Ref-mode behavior on right-side disappearance** — matches the
523
- * eager `.toArray()` contract from :
524
- * - `strict` → re-run throws `DanglingReferenceError`. The
525
- * LiveQuery catches the throw, stores it in `live.error`, and
526
- * notifies listeners (the throw does NOT propagate out of
527
- * the source's change handler — that would tear down the
528
- * emitter). Consumers check `live.error` after each
529
- * notification and render an error state in the UI.
530
- * - `warn` → joined value flips to `null`; the existing
531
- * warn-channel deduplication keeps repeated re-runs from
532
- * spamming the console.
533
- * - `cascade` → no special handling needed; the cascade-
534
- * delete mechanism propagates the right-side delete into the
535
- * left collection on the next tick, and the live query
536
- * naturally re-fires with the orphaned left rows gone.
537
- *
538
- * Always call `live.stop()` when finished — it tears down every
539
- * upstream subscription. The Vue layer's `onUnmounted` hook
540
- * should call `stop()` automatically; raw consumers must do it
541
- * themselves.
542
- *
543
- * **Limitations:**
544
- * - No granular delta updates — the whole query re-runs on
545
- * every change.
546
- * - No microtask batching — bursty changes produce one re-run
547
- * per change.
548
- * - No re-planning under live mutations — the planner picks
549
- * once at subscription time and reuses the same plan.
550
- * - Streaming live joins are deferred.
551
- */
552
- live(): LiveQuery<T>;
688
+ * The match set every reduce-shaped terminal reports over: `count()`,
689
+ * `distinct()`, and `exists()`'s non-short-circuit fallbacks.
690
+ *
691
+ * Extracted (#1347) rather than copied a third time, because "which records
692
+ * does this terminal see" is an INVARIANT across them — `distinct()`
693
+ * returning values `count()` never counted would be a bug nobody would look
694
+ * for. It is deliberately the `count()` pipeline: where/filter apply, joins
695
+ * apply only when a predicate addresses one (#1030), and orderBy/limit/offset
696
+ * do NOT — those describe a page, and a reduction is not paginated.
697
+ */
698
+ private matchedRecords;
699
+ /**
700
+ * Whether ANY record matches (#1347) — `count() > 0` without paying for the
701
+ * records after the first.
702
+ *
703
+ * The saving is real rather than cosmetic: `count()` evaluates every
704
+ * remaining clause against every candidate, so a `.filter(fn)` over 10_000
705
+ * records calls `fn` 10_000 times to answer a yes/no question. This returns
706
+ * at the first hit, and `__tests__/query-distinct-exists.test.ts` witnesses
707
+ * that by COUNTING the predicate's invocations — a boolean assertion cannot
708
+ * tell a short-circuit from a full scan.
709
+ *
710
+ * Same match set as `count()`. Two shapes do NOT short-circuit and fall
711
+ * back to it, because both must materialize the relation before anything
712
+ * can be tested: a `crossJoin` expansion, and a `where` clause addressing a
713
+ * join alias (#1030). Both still answer correctly.
714
+ *
715
+ * **Synchronous** (#1413) returns `boolean`, not a promise; the cache it reads is
716
+ * already decrypted. `await` is safe and is REQUIRED on an unhydrated collection
717
+ * (#1414); `.catch()` is not available. See the {@link Query} class doc.
718
+ */
719
+ exists(): boolean;
553
720
  /**
554
721
  * Return the plan as a JSON-friendly object. FilterClause entries are
555
722
  * stripped (their `fn` cannot be serialized) and replaced with
@@ -557,6 +724,95 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
557
724
  */
558
725
  toPlan(): unknown;
559
726
  }
727
+ export declare function isRangeOperator(op: string): op is '<' | '<=' | '>' | '>=' | 'between' | 'startsWith';
728
+ /**
729
+ * True when a Via binding claims the ORDERING of this field. Probed with
730
+ * two equal strings: `compareForOrder` returns `undefined` for any field
731
+ * no binding covers (money checks its field map first; lookup checks its
732
+ * `sortBy` declaration), and a number for one it does.
733
+ */
734
+ export declare function viaOrdersField(via: ViaPipeline | undefined, field: string): boolean;
735
+ /**
736
+ * A range operand for the component just past a compound index's equality
737
+ * prefix. `op` repeats {@link isRangeOperator}'s union rather than importing
738
+ * `RangeOperator`, keeping this file's import list unchanged.
739
+ */
740
+ /**
741
+ * The only slice of an index store the compound PICKERS read. Declared
742
+ * structurally (#1375) so `query/explain.ts` can share these pickers rather
743
+ * than re-implementing them — the mirror this file's `explain()` header warns
744
+ * about is one function narrower for every picker that moves here.
745
+ */
746
+ export interface CompoundTupleSource {
747
+ compoundTuples(): ReadonlyArray<readonly string[]>;
748
+ }
749
+ export interface CompoundRange {
750
+ readonly op: '<' | '<=' | '>' | '>=' | 'between' | 'startsWith';
751
+ readonly value: unknown;
752
+ }
753
+ export interface CompoundPick {
754
+ readonly fields: readonly string[];
755
+ /** Equality operands for `fields[0..values.length-1]`, in index order. */
756
+ readonly values: readonly unknown[];
757
+ readonly range?: CompoundRange;
758
+ /** Indices into the plan's clause list that this pick answers. */
759
+ readonly consumed: ReadonlySet<number>;
760
+ }
761
+ /**
762
+ * Split the top-level clauses into the `==` and range clauses a compound
763
+ * index could answer. Via-covered clauses are excluded for the same reason
764
+ * `candidateRecords` excludes them from the sorted path — a binding's
765
+ * `indexProbe` yields an equality operand in STORED form, never an ordered
766
+ * one, and this path compares raw operands. A repeated field keeps its FIRST
767
+ * clause; the duplicate stays in `remainingClauses` and is re-evaluated.
768
+ */
769
+ export declare function indexableClauses(clauses: readonly Clause[]): {
770
+ eq: Map<string, {
771
+ value: unknown;
772
+ at: number;
773
+ }>;
774
+ ranges: Map<string, {
775
+ op: CompoundRange['op'];
776
+ value: unknown;
777
+ at: number;
778
+ }>;
779
+ };
780
+ /**
781
+ * Choose the declared field tuple that answers the most clauses: the longest
782
+ * equality PREFIX of the tuple, plus a range on the component immediately
783
+ * after it. A pick answering fewer than two clauses is declined — the
784
+ * single-field hash or sorted index already covers that, at lower cost.
785
+ */
786
+ export declare function pickCompound(indexes: CompoundTupleSource, clauses: readonly Clause[]): CompoundPick | null;
787
+ /** The declared tuple that is exactly `eq`'s fields followed by `orderField`. */
788
+ export declare function pickCompoundOrder(indexes: CompoundTupleSource, eq: ReadonlyMap<string, {
789
+ value: unknown;
790
+ at: number;
791
+ }>, orderField: string): {
792
+ fields: readonly string[];
793
+ values: readonly unknown[];
794
+ } | null;
795
+ interface CandidateResult {
796
+ /** The reduced candidate set, materialized to record objects. */
797
+ readonly candidates: readonly unknown[];
798
+ /** The clauses that the index could not satisfy and must still be evaluated. */
799
+ readonly remainingClauses: readonly Clause[];
800
+ }
801
+ /**
802
+ * Pick a candidate record set using the index store when possible.
803
+ *
804
+ * Strategy: scan the top-level clauses for the FIRST `==` or `in` clause
805
+ * against an indexed field. If found, use the index to materialize a
806
+ * candidate set and return the OTHER clauses as `remainingClauses`. The
807
+ * caller skips re-evaluating the index-driving clause because the index
808
+ * is authoritative for that field.
809
+ *
810
+ * This is a deliberately simple planner. A future optimizer could pick
811
+ * the most selective index, intersect multiple indexes, or push composite
812
+ * keys through. For the single-index fast path is good enough.
813
+ */
814
+ /** @internal #1458 — used by the extension mixins in `query/reduce/`. */
815
+ export declare function candidateRecords(source: InternalSource, clauses: readonly Clause[]): CandidateResult;
560
816
  /**
561
817
  * Execute a plan against a snapshot of records.
562
818
  * Pure function — same input, same output, no side effects.
@@ -565,3 +821,78 @@ export declare class Query<T, S extends keyof T = never, Q extends keyof T & str
565
821
  * cast the return type at the API surface (see `Query.toArray()`).
566
822
  */
567
823
  export declare function executePlan(records: readonly unknown[], plan: QueryPlan): unknown[];
824
+ /**
825
+ * Build the per-record DECODED view factory for user-callback clauses
826
+ * (`filter` / `wherePredicate`) — those callbacks must see the canonical
827
+ * shape (e.g. money's decimal string), never a Via-transformed stored
828
+ * form. Field clauses are NOT affected: their operands were pre-built
829
+ * into raw stored space at build time. Returns undefined when the
830
+ * source's Via pipeline declares no result decode.
831
+ */
832
+ /** @internal #1458 — used by `query/internal/maintenance.ts`. */
833
+ export declare function fnViewDecoder(source: InternalSource): ((r: unknown) => unknown) | undefined;
834
+ /** @internal #1458 — used by `query/internal/maintenance.ts`. */
835
+ export declare function filterRecords(records: readonly unknown[], clauses: readonly Clause[], decodeForFns?: (r: unknown) => unknown): unknown[];
836
+ /**
837
+ * Walk the clause list in declaration order, batching filter clauses and
838
+ * expanding on crossJoin clauses. Falls back to `candidateRecords + filterRecords`
839
+ * (index fast-path) when no crossJoin clauses are present.
840
+ *
841
+ * Precondition: `joinContext` must be non-null when any `CrossJoinClause` is in `clauses`.
842
+ */
843
+ /** @internal #1458 — used by the extension mixins in `query/reduce/`. */
844
+ export declare function executeClausePipeline(source: InternalSource, clauses: readonly Clause[], joinContext: JoinContext): unknown[];
845
+ /**
846
+ * One `orderBy` entry, resolved: how to read its sort value off a record and
847
+ * how to compare two of those values.
848
+ *
849
+ * Split out of `sortRecords` so the keyset path (`page()`/`after()`) can
850
+ * compare a row against a cursor's STORED values with exactly the ordering
851
+ * the sort used — the alternative was a second comparator that would drift.
852
+ */
853
+ interface OrderKeyPlan {
854
+ readonly entries: readonly {
855
+ readonly field: string;
856
+ readonly direction: 'asc' | 'desc';
857
+ readonly labelResolver: ((code: string) => string | undefined) | undefined;
858
+ /**
859
+ * The pipeline to ask for this entry's exact ordering, and the name to
860
+ * ask it about (#1337). For a left-side field that is the source's own
861
+ * pipeline and the field verbatim; for `client.credit` it is the RIGHT
862
+ * collection's pipeline and `credit`, because a pipeline covers bare
863
+ * field names. `undefined` → the generic comparator, as before.
864
+ */
865
+ readonly via: ViaPipeline | undefined;
866
+ readonly viaField: string;
867
+ }[];
868
+ }
869
+ /** @internal #1458 — used by `query/internal/maintenance.ts`. */
870
+ export declare function buildOrderKeyPlan(orderBy: readonly OrderBy[], via?: ViaPipeline, labelMaps?: Map<string, (code: string) => string | undefined>, aliasVia?: ReadonlyMap<string, ViaPipeline>): OrderKeyPlan;
871
+ /** The sort-key tuple of one record, in `orderBy` order. */
872
+ /** @internal #1458 — used by `query/internal/maintenance.ts`. */
873
+ export declare function orderKeyOf(plan: OrderKeyPlan, record: unknown): unknown[];
874
+ /** @internal #1458 — used by `query/internal/maintenance.ts`. */
875
+ export declare function compareOrderKeys(plan: OrderKeyPlan, a: readonly unknown[], b: readonly unknown[]): number;
876
+ /**
877
+ * Exported (#1342) for the cross-collection union read path: a union's sort
878
+ * runs AFTER the legs are concatenated, and it has to be the same comparator
879
+ * a single collection's `orderBy` uses or two queries over the same rows
880
+ * would order them differently.
881
+ */
882
+ export declare function sortRecords(records: unknown[], orderBy: readonly OrderBy[], via?: ViaPipeline, labelMaps?: Map<string, (code: string) => string | undefined>, aliasVia?: ReadonlyMap<string, ViaPipeline>): unknown[];
883
+ /**
884
+ * Build a dict-label resolver for `Query.groupBy(field)` when the
885
+ * grouping field is a `dictKey`. Extracted from the inline closure
886
+ * inside `groupBy` so the multi-key path (which has no meaningful
887
+ * `<field>Label` shape) can skip it cleanly. Pure refactor — no
888
+ * behaviour change for the single-field path.
889
+ *
890
+ * Returns `undefined` when:
891
+ * - the join context lacks a `resolveDictSource` hook, or
892
+ * - no dictionary source is registered for `field`.
893
+ *
894
+ * @internal
895
+ */
896
+ /** @internal #1458 — used by the extension mixins in `query/reduce/`. */
897
+ export declare function buildDictLabelResolver(joinCtx: JoinContext | undefined, field: string): ((key: string, locale: string, fallback?: string | readonly string[]) => Promise<string | undefined>) | undefined;
898
+ export {};