@noy-db/hub 0.3.0-pre.9 → 0.3.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 (958) hide show
  1. package/dist/aggregate/index.js +5 -5
  2. package/dist/api-ZGS6LCOF.js +20 -0
  3. package/dist/as/index.js +11 -11
  4. package/dist/attestation/index.js +18 -18
  5. package/dist/backup-BJ57IKAO.js +242 -0
  6. package/dist/backup-BJ57IKAO.js.map +1 -0
  7. package/dist/blobs/index.js +13 -11
  8. package/dist/blobs/index.js.map +1 -1
  9. package/dist/broker/index.js +92 -0
  10. package/dist/broker/index.js.map +1 -0
  11. package/dist/bundle/index.js +25 -22
  12. package/dist/bundle/index.js.map +1 -1
  13. package/dist/by/index.js +2 -2
  14. package/dist/cargo/index.js +31 -32
  15. package/dist/chunk-2NVOWNI3.js +167 -0
  16. package/dist/chunk-2NVOWNI3.js.map +1 -0
  17. package/dist/chunk-3B5VVCNY.js +71 -0
  18. package/dist/chunk-3LQ2YKO4.js +230 -0
  19. package/dist/chunk-3QCRBHCY.js +54 -0
  20. package/dist/chunk-454JXE57.js +1697 -0
  21. package/dist/chunk-454JXE57.js.map +1 -0
  22. package/dist/chunk-4CTHCN4J.js +480 -0
  23. package/dist/chunk-4CTHCN4J.js.map +1 -0
  24. package/dist/chunk-4GPE63GU.js +111 -0
  25. package/dist/chunk-4GPE63GU.js.map +1 -0
  26. package/dist/chunk-4JBYV75E.js +150 -0
  27. package/dist/chunk-4NXKCLLQ.js +97 -0
  28. package/dist/chunk-4VNQOLML.js +29 -0
  29. package/dist/chunk-4VNQOLML.js.map +1 -0
  30. package/dist/chunk-5M5DVGV7.js +69 -0
  31. package/dist/chunk-5O3XF4DV.js +150 -0
  32. package/dist/chunk-5O3XF4DV.js.map +1 -0
  33. package/dist/chunk-5YOLBEQ6.js +30 -0
  34. package/dist/chunk-6CRIV7DE.js +129 -0
  35. package/dist/chunk-6JTIAGHD.js +621 -0
  36. package/dist/chunk-6JTIAGHD.js.map +1 -0
  37. package/dist/chunk-6QTNZJBS.js +255 -0
  38. package/dist/chunk-6T2SCQRU.js +86 -0
  39. package/dist/chunk-7DSTRQIJ.js +45 -0
  40. package/dist/chunk-AUSTCW2X.js +589 -0
  41. package/dist/chunk-B3HJYUOF.js +209 -0
  42. package/dist/chunk-BDVFPG6Y.js +164 -0
  43. package/dist/chunk-BIOUI4HL.js +1554 -0
  44. package/dist/chunk-BIOUI4HL.js.map +1 -0
  45. package/dist/chunk-CAF6WOK7.js +36 -0
  46. package/dist/chunk-CDUQTA3Z.js +381 -0
  47. package/dist/chunk-CDUQTA3Z.js.map +1 -0
  48. package/dist/chunk-CIE2BASH.js +404 -0
  49. package/dist/chunk-CRI4OUV4.js +42 -0
  50. package/dist/chunk-DLG74CNB.js +91 -0
  51. package/dist/chunk-E5ZQT5KX.js +30 -0
  52. package/dist/chunk-E5ZQT5KX.js.map +1 -0
  53. package/dist/chunk-EQO2UVP4.js +247 -0
  54. package/dist/chunk-EQO2UVP4.js.map +1 -0
  55. package/dist/chunk-ERJ7FU55.js +367 -0
  56. package/dist/chunk-EVVGJDRQ.js +205 -0
  57. package/dist/chunk-EVX47VBM.js +74 -0
  58. package/dist/chunk-EVX47VBM.js.map +1 -0
  59. package/dist/chunk-EXK7QRWF.js +59 -0
  60. package/dist/chunk-EYZ6IQ6X.js +202 -0
  61. package/dist/chunk-F64IRYG3.js +45 -0
  62. package/dist/chunk-FHS2HQSH.js +823 -0
  63. package/dist/chunk-FM3G3NOY.js +206 -0
  64. package/dist/chunk-FM3G3NOY.js.map +1 -0
  65. package/dist/chunk-FUG4SFN3.js +36 -0
  66. package/dist/chunk-FUG4SFN3.js.map +1 -0
  67. package/dist/chunk-GKEWXIV5.js +80 -0
  68. package/dist/chunk-GTGPO5KW.js +59 -0
  69. package/dist/chunk-HB3RFQSC.js +95 -0
  70. package/dist/chunk-HDMEGAQE.js +957 -0
  71. package/dist/chunk-HDMEGAQE.js.map +1 -0
  72. package/dist/chunk-HDQIIUPH.js +135 -0
  73. package/dist/chunk-HDQIIUPH.js.map +1 -0
  74. package/dist/chunk-HTJQYHZP.js +344 -0
  75. package/dist/chunk-HTJQYHZP.js.map +1 -0
  76. package/dist/chunk-I6GALP6E.js +99 -0
  77. package/dist/chunk-IGJCYUT5.js +99 -0
  78. package/dist/chunk-IGJCYUT5.js.map +1 -0
  79. package/dist/chunk-IL6POWCW.js +130 -0
  80. package/dist/chunk-IU6SNYX6.js +117 -0
  81. package/dist/chunk-J2ZX2XUV.js +778 -0
  82. package/dist/chunk-JIF24JPM.js +495 -0
  83. package/dist/chunk-JIF24JPM.js.map +1 -0
  84. package/dist/chunk-JK733I5V.js +23 -0
  85. package/dist/chunk-JK733I5V.js.map +1 -0
  86. package/dist/chunk-JKJOGPZN.js +29 -0
  87. package/dist/chunk-JNAI2HN2.js +32 -0
  88. package/dist/chunk-JNAI2HN2.js.map +1 -0
  89. package/dist/chunk-JZUV47FZ.js +41 -0
  90. package/dist/chunk-K5IMOGHB.js +30 -0
  91. package/dist/chunk-KPZS5QAQ.js +151 -0
  92. package/dist/chunk-KPZS5QAQ.js.map +1 -0
  93. package/dist/chunk-KSKBRKGJ.js +291 -0
  94. package/dist/chunk-KSKBRKGJ.js.map +1 -0
  95. package/dist/chunk-LASZKVMO.js +382 -0
  96. package/dist/chunk-LXEXBTKL.js +515 -0
  97. package/dist/chunk-LXEXBTKL.js.map +1 -0
  98. package/dist/chunk-M4CV6BRT.js +524 -0
  99. package/dist/chunk-M4CV6BRT.js.map +1 -0
  100. package/dist/chunk-MEFJPTZ4.js +371 -0
  101. package/dist/chunk-MEFJPTZ4.js.map +1 -0
  102. package/dist/chunk-MV43JSJF.js +265 -0
  103. package/dist/chunk-MV43JSJF.js.map +1 -0
  104. package/dist/chunk-NJ4EOKMB.js +392 -0
  105. package/dist/chunk-NJ4EOKMB.js.map +1 -0
  106. package/dist/chunk-NR5LT5RY.js +135 -0
  107. package/dist/chunk-NWSGI5C7.js +261 -0
  108. package/dist/chunk-OSDB5WW3.js +739 -0
  109. package/dist/chunk-OSDB5WW3.js.map +1 -0
  110. package/dist/chunk-PN2XMATY.js +37 -0
  111. package/dist/chunk-PN2XMATY.js.map +1 -0
  112. package/dist/chunk-Q5VNKNE5.js +70 -0
  113. package/dist/chunk-QLWMEXCT.js +21 -0
  114. package/dist/chunk-QRB7NAOJ.js +123 -0
  115. package/dist/chunk-R4ROFEYC.js +74 -0
  116. package/dist/chunk-RCVJZMFE.js +164 -0
  117. package/dist/chunk-RCVJZMFE.js.map +1 -0
  118. package/dist/chunk-RIX4V2TB.js +367 -0
  119. package/dist/chunk-RYCTDFUX.js +40 -0
  120. package/dist/chunk-RZ5SVOYR.js +155 -0
  121. package/dist/chunk-SLFHQTTW.js +99 -0
  122. package/dist/chunk-SNZ6URZZ.js +2782 -0
  123. package/dist/chunk-SNZ6URZZ.js.map +1 -0
  124. package/dist/chunk-T2FFWNPK.js +75 -0
  125. package/dist/chunk-UNFPPVNI.js +23 -0
  126. package/dist/chunk-VFUPHI2Z.js +333 -0
  127. package/dist/chunk-VFUPHI2Z.js.map +1 -0
  128. package/dist/chunk-VLFCJYTL.js +235 -0
  129. package/dist/chunk-VN3DBQAU.js +124 -0
  130. package/dist/chunk-VYYM3MEN.js +98 -0
  131. package/dist/chunk-VYYM3MEN.js.map +1 -0
  132. package/dist/chunk-VZRODIM3.js +49 -0
  133. package/dist/chunk-W22IKJE2.js +94 -0
  134. package/dist/chunk-X3YYQWOQ.js +155 -0
  135. package/dist/chunk-X7QBD67R.js +14405 -0
  136. package/dist/chunk-X7QBD67R.js.map +1 -0
  137. package/dist/chunk-XDYREZWE.js +1128 -0
  138. package/dist/chunk-XDYREZWE.js.map +1 -0
  139. package/dist/chunk-XWZVFISC.js +720 -0
  140. package/dist/chunk-XWZVFISC.js.map +1 -0
  141. package/dist/chunk-YFXZEAYK.js +85 -0
  142. package/dist/chunk-ZAJAVEXY.js +50 -0
  143. package/dist/chunk-ZICD77GM.js +34 -0
  144. package/dist/chunk-ZJ2AK4V7.js +38 -0
  145. package/dist/chunk-ZUODRVHY.js +14 -0
  146. package/dist/classified/index.js +5 -5
  147. package/dist/classified-marker-CZKA6ITE.js +28 -0
  148. package/dist/classified-marker-CZKA6ITE.js.map +1 -0
  149. package/dist/collection-facade-TLWIPI76.js +44 -0
  150. package/dist/computed-ZIQTYTDI.js +11 -0
  151. package/dist/consent/index.js +9 -9
  152. package/dist/crdt/index.js +1 -1
  153. package/dist/dead-filter-ESOBZZP5.js +28 -0
  154. package/dist/delegation-W7ZV2322.js +25 -0
  155. package/dist/derivations/index.js +12 -12
  156. package/dist/derive-H2BJTLUI.js +21 -0
  157. package/dist/enclave-AP3I5W7O.js +141 -0
  158. package/dist/executor-KGWTNEQD.js +9 -0
  159. package/dist/executor-OVEXR6RT.js +9 -0
  160. package/dist/executor-UNEH5ZYH.js +25 -0
  161. package/dist/export-accessible-PCMXSUZS.js +23 -0
  162. package/dist/extract-partition-SWHFSYJO.js +38 -0
  163. package/dist/fanout-sidecar-A765THMX.js +74 -0
  164. package/dist/find-N6345CNT.js +11 -0
  165. package/dist/forget/index.js +10 -10
  166. package/dist/forget/index.js.map +1 -1
  167. package/dist/guards/index.js +6 -6
  168. package/dist/history/index.js +14 -11
  169. package/dist/history/index.js.map +1 -1
  170. package/dist/i18n/index.js +21 -19
  171. package/dist/i18n/index.js.map +1 -1
  172. package/dist/index.d.ts +307 -1493
  173. package/dist/index.js +309 -190
  174. package/dist/index.js.map +1 -1
  175. package/dist/indexing/index.js +7 -7
  176. package/dist/indexing/index.js.map +1 -1
  177. package/dist/issue-5OKB6I2R.js +19 -0
  178. package/dist/kernel/best-effort-revert.d.ts +52 -0
  179. package/dist/kernel/cache/index.d.ts +10 -0
  180. package/dist/kernel/cache/lru.d.ts +97 -0
  181. package/dist/kernel/cache/policy.d.ts +32 -0
  182. package/dist/kernel/collection-config.d.ts +809 -0
  183. package/dist/kernel/collection.d.ts +1522 -0
  184. package/dist/kernel/constants.d.ts +18 -0
  185. package/dist/kernel/debug.d.ts +25 -0
  186. package/dist/kernel/enclave/broker/proof.d.ts +154 -0
  187. package/dist/kernel/enclave/classify/bidx.d.ts +77 -0
  188. package/dist/kernel/enclave/classify/compare.d.ts +10 -0
  189. package/dist/kernel/enclave/classify/digest.d.ts +8 -0
  190. package/dist/kernel/enclave/classify/find.d.ts +36 -0
  191. package/dist/kernel/enclave/classify/kofn.d.ts +7 -0
  192. package/dist/kernel/enclave/classify/normalize.d.ts +7 -0
  193. package/dist/kernel/enclave/classify/reveal.d.ts +10 -0
  194. package/dist/kernel/enclave/classify/vdig.d.ts +39 -0
  195. package/dist/kernel/enclave/classify/verify.d.ts +36 -0
  196. package/dist/kernel/enclave/classify/write.d.ts +8 -0
  197. package/dist/kernel/enclave/crypto.d.ts +263 -0
  198. package/dist/kernel/enclave/index.d.ts +79 -0
  199. package/dist/kernel/enclave/record-keys/deterministic.d.ts +55 -0
  200. package/dist/kernel/enclave/record-keys/envelope-body.d.ts +79 -0
  201. package/dist/kernel/enclave/record-keys/lifecycle.d.ts +107 -0
  202. package/dist/kernel/enclave/record-keys/record-codec.d.ts +328 -0
  203. package/dist/kernel/enclave/record-keys/sealed-slot.d.ts +14 -0
  204. package/dist/kernel/enclave/record-keys/sealed-slots.d.ts +123 -0
  205. package/dist/kernel/enclave/record-keys/sealing.d.ts +70 -0
  206. package/dist/kernel/enclave/record-keys/tombstone.d.ts +57 -0
  207. package/dist/kernel/env-check.d.ts +1 -0
  208. package/dist/kernel/errors.d.ts +1922 -0
  209. package/dist/kernel/events.d.ts +11 -0
  210. package/dist/kernel/lazy-count.d.ts +13 -0
  211. package/dist/kernel/memory-store.d.ts +17 -0
  212. package/dist/kernel/mutation.d.ts +14 -0
  213. package/dist/kernel/noydb.d.ts +826 -0
  214. package/dist/kernel/paths.d.ts +25 -0
  215. package/dist/kernel/query/builder.d.ts +520 -0
  216. package/dist/kernel/query/index.d.ts +31 -0
  217. package/dist/kernel/query/join.d.ts +205 -0
  218. package/dist/kernel/query/live.d.ts +111 -0
  219. package/dist/kernel/query/predicate.d.ts +139 -0
  220. package/dist/kernel/query/scan-builder.d.ts +334 -0
  221. package/dist/kernel/refs.d.ts +205 -0
  222. package/dist/kernel/schema.d.ts +134 -0
  223. package/dist/kernel/sync-policy.d.ts +188 -0
  224. package/dist/kernel/tier-visibility.d.ts +54 -0
  225. package/dist/kernel/types.d.ts +3239 -0
  226. package/dist/kernel/util/discriminant.d.ts +58 -0
  227. package/dist/kernel/util/index.d.ts +14 -0
  228. package/dist/kernel/util/sanitize-filename.d.ts +75 -0
  229. package/dist/kernel/validation.d.ts +130 -0
  230. package/dist/kernel/vault.d.ts +1740 -0
  231. package/dist/kernel/via/compose.d.ts +144 -0
  232. package/dist/kernel/via/dispatch.d.ts +195 -0
  233. package/dist/kernel/via/graph-wiring.d.ts +145 -0
  234. package/dist/kernel/via/graph.d.ts +166 -0
  235. package/dist/kernel/via/index.d.ts +200 -0
  236. package/dist/kernel/via/pipeline.d.ts +266 -0
  237. package/dist/kernel/via/reconcile.d.ts +153 -0
  238. package/dist/kernel/via/taint-binding.d.ts +66 -0
  239. package/dist/kernel/write-queue.d.ts +46 -0
  240. package/dist/ledger-GFBKVPV4.js +42 -0
  241. package/dist/legacy/bundle.d.ts +30 -0
  242. package/dist/legacy/kernel.d.ts +33 -0
  243. package/dist/liberate-3VDOT4KO.js +24 -0
  244. package/dist/link-set-Z7Q2ASFX.js +31 -0
  245. package/dist/materialized-views/index.js +19 -17
  246. package/dist/noydb-ZCJOYBDI.js +68 -0
  247. package/dist/on/index.js +9 -9
  248. package/dist/overlay-views/index.js +4 -4
  249. package/dist/periods/index.js +12 -12
  250. package/dist/pod/index.js +11 -11
  251. package/dist/policy-Z3RUAIY2.js +41 -0
  252. package/dist/port/as/index.d.ts +26 -0
  253. package/dist/port/at/index.d.ts +18 -0
  254. package/dist/port/by/default-provider.d.ts +9 -0
  255. package/dist/port/by/index.d.ts +17 -0
  256. package/dist/port/by/types.d.ts +86 -0
  257. package/dist/port/in/index.d.ts +21 -0
  258. package/dist/port/on/index.d.ts +27 -0
  259. package/dist/port/to/index.d.ts +19 -0
  260. package/dist/port/ui/index.d.ts +21 -0
  261. package/dist/port/with/blob-strategy.d.ts +98 -0
  262. package/dist/port/with/broker-strategy.d.ts +84 -0
  263. package/dist/port/with/capabilities.d.ts +31 -0
  264. package/dist/port/with/classified-marker.d.ts +9 -0
  265. package/dist/port/with/classified-strategy.d.ts +62 -0
  266. package/dist/port/with/computed-strategy.d.ts +19 -0
  267. package/dist/port/with/i18n-strategy.d.ts +175 -0
  268. package/dist/port/with/index.d.ts +18 -0
  269. package/dist/port/with/lazy-strategy.d.ts +48 -0
  270. package/dist/port/with/lookup-strategy.d.ts +129 -0
  271. package/dist/port/with/service-bus.d.ts +156 -0
  272. package/dist/port/with/team-strategy.d.ts +36 -0
  273. package/dist/port/with/write-hooks.d.ts +34 -0
  274. package/dist/portability/index.js +8 -8
  275. package/dist/post-register-JTH76BLY.js +60 -0
  276. package/dist/post-register-JTH76BLY.js.map +1 -0
  277. package/dist/public-envelope-B4KNWVUA.js +32 -0
  278. package/dist/purge-scope-FGNNLWHD.js +24 -0
  279. package/dist/purge-scope-FGNNLWHD.js.map +1 -0
  280. package/dist/query/index.js +7 -7
  281. package/dist/read-only-facade-CHCKSEPD.js +8 -0
  282. package/dist/register-VAHONCID.js +23 -0
  283. package/dist/registry-7MLVD3VO.js +19 -0
  284. package/dist/registry-EPKPD5SM.js +18 -0
  285. package/dist/registry-P5T7PS2U.js +9 -0
  286. package/dist/request-withdrawal-TI3A5WPS.js +31 -0
  287. package/dist/reveal-DIBHLUZX.js +38 -0
  288. package/dist/reveal-DIBHLUZX.js.map +1 -0
  289. package/dist/revoke-FDRD6GRW.js +24 -0
  290. package/dist/satellites/index.js +1 -1
  291. package/dist/sealed-record/index.js +12 -12
  292. package/dist/seed-Q6M2IZFL.js +231 -0
  293. package/dist/seed-Q6M2IZFL.js.map +1 -0
  294. package/dist/session/index.js +9 -9
  295. package/dist/shadow/index.js +2 -2
  296. package/dist/signer-MUWEIUI6.js +25 -0
  297. package/dist/snapshots/index.js +10 -10
  298. package/dist/stale-OSQ7J3AA.js +29 -0
  299. package/dist/storage-MVFCGEQE.js +23 -0
  300. package/dist/store-coordination-provider-64OEZFGS.js +142 -0
  301. package/dist/sync/index.js +9 -9
  302. package/dist/team/index.js +15 -15
  303. package/dist/tiers/index.js +14 -10
  304. package/dist/to/index.js +1 -2
  305. package/dist/tx/index.js +3 -3
  306. package/dist/util/index.js +1 -1
  307. package/dist/verify-ZASTRNPR.js +140 -0
  308. package/dist/verify-ZASTRNPR.js.map +1 -0
  309. package/dist/via/blob/active.d.ts +34 -0
  310. package/dist/via/blob/binding.d.ts +86 -0
  311. package/dist/via/blob/index.d.ts +34 -0
  312. package/dist/via/classified/active.d.ts +3 -0
  313. package/dist/via/classified/binding.d.ts +83 -0
  314. package/dist/via/classified/config-drift.d.ts +34 -0
  315. package/dist/via/classified/descriptor.d.ts +66 -0
  316. package/dist/via/classified/errors.d.ts +19 -0
  317. package/dist/via/classified/guards.d.ts +23 -0
  318. package/dist/via/classified/index.d.ts +11 -0
  319. package/dist/via/classified/presets.d.ts +65 -0
  320. package/dist/via/classified/resolve.d.ts +9 -0
  321. package/dist/via/classified/strategy.d.ts +11 -0
  322. package/dist/via/classified/validators.d.ts +3 -0
  323. package/dist/via/classified/write.d.ts +4 -0
  324. package/dist/via/computed/binding.d.ts +34 -0
  325. package/dist/via/computed/descriptor.d.ts +35 -0
  326. package/dist/via/i18n/active.d.ts +28 -0
  327. package/dist/via/i18n/binding.d.ts +36 -0
  328. package/dist/via/i18n/core.d.ts +267 -0
  329. package/dist/via/i18n/densify.d.ts +24 -0
  330. package/dist/via/i18n/dictionary.d.ts +200 -0
  331. package/dist/via/i18n/index.d.ts +21 -0
  332. package/dist/via/i18n/policy.d.ts +44 -0
  333. package/dist/via/i18n/script.d.ts +26 -0
  334. package/dist/via/i18n/strategy.d.ts +13 -0
  335. package/dist/via/lookup/active.d.ts +19 -0
  336. package/dist/via/lookup/binding.d.ts +99 -0
  337. package/dist/via/lookup/descriptor.d.ts +123 -0
  338. package/dist/via/lookup/handle.d.ts +220 -0
  339. package/dist/via/lookup/index.d.ts +17 -0
  340. package/dist/via/lookup/registry.d.ts +228 -0
  341. package/dist/via/lookup/snapshot.d.ts +67 -0
  342. package/dist/via/money/arith.d.ts +68 -0
  343. package/dist/via/money/binding.d.ts +21 -0
  344. package/dist/via/money/branded.d.ts +61 -0
  345. package/dist/via/money/descriptor.d.ts +73 -0
  346. package/dist/via/money/fixed-point.d.ts +51 -0
  347. package/dist/via/money/index.d.ts +15 -0
  348. package/dist/via/money/iso4217.d.ts +6 -0
  349. package/dist/via/money/money-reducer.d.ts +33 -0
  350. package/dist/via/money/normalize.d.ts +105 -0
  351. package/dist/via/money/paths.d.ts +61 -0
  352. package/dist/via/money/where.d.ts +127 -0
  353. package/dist/walk-SVNDIZ62.js +241 -0
  354. package/dist/with/index.js +11 -11
  355. package/dist/with-audit/attestation/active.d.ts +10 -0
  356. package/dist/with-audit/attestation/index.d.ts +16 -0
  357. package/dist/with-audit/attestation/issue.d.ts +29 -0
  358. package/dist/with-audit/attestation/revoke.d.ts +15 -0
  359. package/dist/with-audit/attestation/signer.d.ts +33 -0
  360. package/dist/with-audit/attestation/strategy.d.ts +44 -0
  361. package/dist/with-audit/attestation/vault-facade.d.ts +62 -0
  362. package/dist/with-audit/consent/active.d.ts +14 -0
  363. package/dist/with-audit/consent/consent.d.ts +114 -0
  364. package/dist/with-audit/consent/index.d.ts +14 -0
  365. package/dist/with-audit/consent/strategy.d.ts +36 -0
  366. package/dist/with-audit/forget/active.d.ts +31 -0
  367. package/dist/with-audit/forget/index.d.ts +28 -0
  368. package/dist/with-audit/forget/purge-scope.d.ts +54 -0
  369. package/dist/with-audit/forget/strategy.d.ts +199 -0
  370. package/dist/with-audit/forget/subject-index.d.ts +83 -0
  371. package/dist/with-audit/guards/executor.d.ts +26 -0
  372. package/dist/with-audit/guards/immutable-guard.d.ts +63 -0
  373. package/dist/with-audit/guards/index.d.ts +10 -0
  374. package/dist/with-audit/guards/read-only-facade.d.ts +31 -0
  375. package/dist/with-audit/guards/registry.d.ts +83 -0
  376. package/dist/with-audit/guards/transition-guard.d.ts +82 -0
  377. package/dist/with-audit/guards/types.d.ts +134 -0
  378. package/dist/with-audit/guards/with-guard.d.ts +15 -0
  379. package/dist/with-audit/periods/active.d.ts +11 -0
  380. package/dist/with-audit/periods/index.d.ts +18 -0
  381. package/dist/with-audit/periods/periods.d.ts +417 -0
  382. package/dist/with-audit/periods/strategy.d.ts +32 -0
  383. package/dist/with-audit/periods/vault-facade.d.ts +95 -0
  384. package/dist/with-audit/portability/active.d.ts +11 -0
  385. package/dist/with-audit/portability/export-accessible.d.ts +46 -0
  386. package/dist/with-audit/portability/index.d.ts +18 -0
  387. package/dist/with-audit/portability/request-withdrawal.d.ts +85 -0
  388. package/dist/with-audit/portability/strategy.d.ts +31 -0
  389. package/dist/with-audit/portability/withdraw-accessible.d.ts +82 -0
  390. package/dist/with-audit/sealed-record/active.d.ts +9 -0
  391. package/dist/with-audit/sealed-record/index.d.ts +55 -0
  392. package/dist/with-audit/sealed-record/strategy.d.ts +34 -0
  393. package/dist/with-audit/sealed-record/types.d.ts +27 -0
  394. package/dist/with-audit/tiers/active.d.ts +9 -0
  395. package/dist/with-audit/tiers/index.d.ts +394 -0
  396. package/dist/with-audit/tiers/strategy.d.ts +36 -0
  397. package/dist/with-cargo/active.d.ts +11 -0
  398. package/dist/with-cargo/adopt-partition.d.ts +81 -0
  399. package/dist/with-cargo/decrypt-partition.d.ts +19 -0
  400. package/dist/with-cargo/describe-extraction.d.ts +41 -0
  401. package/dist/with-cargo/extract-partition.d.ts +155 -0
  402. package/dist/with-cargo/index.d.ts +33 -0
  403. package/dist/with-cargo/strategy.d.ts +30 -0
  404. package/dist/with-cargo/vault-diff.d.ts +144 -0
  405. package/dist/with-cargo/walk-closure.d.ts +67 -0
  406. package/dist/with-commit/crdt/active.d.ts +25 -0
  407. package/dist/with-commit/crdt/crdt.d.ts +42 -0
  408. package/dist/with-commit/crdt/index.d.ts +16 -0
  409. package/dist/with-commit/crdt/strategy.d.ts +25 -0
  410. package/dist/with-commit/history/active.d.ts +40 -0
  411. package/dist/with-commit/history/diff.d.ts +23 -0
  412. package/dist/with-commit/history/history.d.ts +73 -0
  413. package/dist/with-commit/history/index.d.ts +30 -0
  414. package/dist/with-commit/history/ledger/constants.d.ts +37 -0
  415. package/dist/with-commit/history/ledger/entry.d.ts +195 -0
  416. package/dist/with-commit/history/ledger/hash.d.ts +30 -0
  417. package/dist/with-commit/history/ledger/index.d.ts +19 -0
  418. package/dist/with-commit/history/ledger/patch.d.ts +99 -0
  419. package/dist/with-commit/history/ledger/store.d.ts +356 -0
  420. package/dist/with-commit/history/strategy.d.ts +136 -0
  421. package/dist/with-commit/history/time-machine.d.ts +202 -0
  422. package/dist/with-commit/numbering/descriptor.d.ts +27 -0
  423. package/dist/with-commit/numbering/index.d.ts +69 -0
  424. package/dist/with-commit/sequence/active.d.ts +10 -0
  425. package/dist/with-commit/sequence/index.d.ts +150 -0
  426. package/dist/with-commit/sequence/strategy.d.ts +26 -0
  427. package/dist/with-commit/tx/active.d.ts +27 -0
  428. package/dist/with-commit/tx/dry-run.d.ts +29 -0
  429. package/dist/with-commit/tx/elevated-handle.d.ts +59 -0
  430. package/dist/with-commit/tx/index.d.ts +13 -0
  431. package/dist/with-commit/tx/invariants.d.ts +68 -0
  432. package/dist/with-commit/tx/strategy.d.ts +23 -0
  433. package/dist/with-commit/tx/transaction.d.ts +212 -0
  434. package/dist/with-fork/archive/engine.d.ts +71 -0
  435. package/dist/with-fork/archive/index.d.ts +23 -0
  436. package/dist/with-fork/shadow/active.d.ts +6 -0
  437. package/dist/with-fork/shadow/index.d.ts +14 -0
  438. package/dist/with-fork/shadow/strategy.d.ts +28 -0
  439. package/dist/with-fork/shadow/vault-frame.d.ts +93 -0
  440. package/dist/with-fork/snapshots/active.d.ts +20 -0
  441. package/dist/with-fork/snapshots/engine.d.ts +36 -0
  442. package/dist/with-fork/snapshots/index.d.ts +5 -0
  443. package/dist/with-fork/snapshots/noydb-facade.d.ts +64 -0
  444. package/dist/with-fork/snapshots/policy.d.ts +23 -0
  445. package/dist/with-fork/snapshots/scheduler.d.ts +34 -0
  446. package/dist/with-fork/snapshots/strategy.d.ts +48 -0
  447. package/dist/with-formula/computed/index.d.ts +48 -0
  448. package/dist/with-formula/computed/lazy.d.ts +13 -0
  449. package/dist/with-formula/derivations/executor.d.ts +61 -0
  450. package/dist/with-formula/derivations/fanout-sidecar.d.ts +75 -0
  451. package/dist/with-formula/derivations/index.d.ts +6 -0
  452. package/dist/with-formula/derivations/registry.d.ts +67 -0
  453. package/dist/with-formula/derivations/stale.d.ts +39 -0
  454. package/dist/with-formula/derivations/strategy-hash.d.ts +1 -0
  455. package/dist/with-formula/derivations/types.d.ts +248 -0
  456. package/dist/with-formula/derivations/with-derivation.d.ts +10 -0
  457. package/dist/with-formula/derivations/with-rollup.d.ts +34 -0
  458. package/dist/with-formula/materialized-views/dependency-analyzer.d.ts +58 -0
  459. package/dist/with-formula/materialized-views/executor.d.ts +80 -0
  460. package/dist/with-formula/materialized-views/index.d.ts +11 -0
  461. package/dist/with-formula/materialized-views/query-hash.d.ts +23 -0
  462. package/dist/with-formula/materialized-views/registry.d.ts +99 -0
  463. package/dist/with-formula/materialized-views/stale.d.ts +113 -0
  464. package/dist/with-formula/materialized-views/types.d.ts +318 -0
  465. package/dist/with-formula/materialized-views/with-materialized-view.d.ts +24 -0
  466. package/dist/with-formula/overlay-views/index.d.ts +5 -0
  467. package/dist/with-formula/overlay-views/registry.d.ts +42 -0
  468. package/dist/with-formula/overlay-views/types.d.ts +97 -0
  469. package/dist/with-formula/overlay-views/virtual-collection.d.ts +90 -0
  470. package/dist/with-formula/overlay-views/with-overlayed-view.d.ts +9 -0
  471. package/dist/with-lookup/aggregate/active.d.ts +33 -0
  472. package/dist/with-lookup/aggregate/aggregation.d.ts +166 -0
  473. package/dist/with-lookup/aggregate/canonical-key.d.ts +16 -0
  474. package/dist/with-lookup/aggregate/groupby.d.ts +280 -0
  475. package/dist/with-lookup/aggregate/index.d.ts +23 -0
  476. package/dist/with-lookup/aggregate/reducers.d.ts +257 -0
  477. package/dist/with-lookup/aggregate/strategy.d.ts +59 -0
  478. package/dist/with-lookup/embeddings/cosine.d.ts +2 -0
  479. package/dist/with-lookup/embeddings/descriptor.d.ts +8 -0
  480. package/dist/with-lookup/embeddings/index.d.ts +4 -0
  481. package/dist/with-lookup/embeddings/vec-id.d.ts +47 -0
  482. package/dist/with-lookup/embeddings/vector-set.d.ts +19 -0
  483. package/dist/with-lookup/indexing/active.d.ts +30 -0
  484. package/dist/with-lookup/indexing/collection-facade.d.ts +157 -0
  485. package/dist/with-lookup/indexing/eager-indexes.d.ts +122 -0
  486. package/dist/with-lookup/indexing/index.d.ts +27 -0
  487. package/dist/with-lookup/indexing/lazy-builder.d.ts +102 -0
  488. package/dist/with-lookup/indexing/persisted-indexes.d.ts +229 -0
  489. package/dist/with-lookup/indexing/strategy.d.ts +56 -0
  490. package/dist/with-lookup/indexing/unique-constraints.d.ts +74 -0
  491. package/dist/with-lookup/search/active.d.ts +10 -0
  492. package/dist/with-lookup/search/build-docs.d.ts +15 -0
  493. package/dist/with-lookup/search/collection-facade.d.ts +163 -0
  494. package/dist/with-lookup/search/fuse.d.ts +22 -0
  495. package/dist/with-lookup/search/index-store.d.ts +19 -0
  496. package/dist/with-lookup/search/index.d.ts +19 -0
  497. package/dist/with-lookup/search/inverted-index.d.ts +47 -0
  498. package/dist/with-lookup/search/persisted-index-store.d.ts +121 -0
  499. package/dist/with-lookup/search/retrieve-types.d.ts +29 -0
  500. package/dist/with-lookup/search/scan.d.ts +28 -0
  501. package/dist/with-lookup/search/segment.d.ts +15 -0
  502. package/dist/with-lookup/search/serialize.d.ts +4 -0
  503. package/dist/with-lookup/search/snippet.d.ts +5 -0
  504. package/dist/with-lookup/search/strategy.d.ts +41 -0
  505. package/dist/with-lookup/search/tokenize.d.ts +12 -0
  506. package/dist/with-party/auth-introspection/index.d.ts +44 -0
  507. package/dist/with-party/broker/active.d.ts +23 -0
  508. package/dist/with-party/broker/index.d.ts +28 -0
  509. package/dist/with-party/broker/seed.d.ts +77 -0
  510. package/dist/with-party/custody/active.d.ts +10 -0
  511. package/dist/with-party/custody/index.d.ts +69 -0
  512. package/dist/with-party/custody/liberate.d.ts +64 -0
  513. package/dist/with-party/custody/strategy.d.ts +48 -0
  514. package/dist/with-party/directory/index.d.ts +11 -0
  515. package/dist/with-party/directory/public-envelope/index.d.ts +12 -0
  516. package/dist/with-party/directory/public-envelope/schema.d.ts +24 -0
  517. package/dist/with-party/directory/public-envelope/storage.d.ts +59 -0
  518. package/dist/with-party/directory/public-envelope/types.d.ts +80 -0
  519. package/dist/with-party/directory/storage.d.ts +33 -0
  520. package/dist/with-party/directory/types.d.ts +43 -0
  521. package/dist/with-party/directory/user-envelope/api.d.ts +201 -0
  522. package/dist/with-party/directory/user-envelope/index.d.ts +12 -0
  523. package/dist/with-party/directory/user-envelope/storage.d.ts +54 -0
  524. package/dist/with-party/directory/visibility.d.ts +47 -0
  525. package/dist/with-party/policy/engine.d.ts +60 -0
  526. package/dist/with-party/policy/index.d.ts +15 -0
  527. package/dist/with-party/policy/noydb-facade.d.ts +39 -0
  528. package/dist/with-party/policy/presets.d.ts +38 -0
  529. package/dist/with-party/policy/storage.d.ts +31 -0
  530. package/dist/with-party/session/active.d.ts +34 -0
  531. package/dist/with-party/session/dev-unlock.d.ts +128 -0
  532. package/dist/with-party/session/index.d.ts +23 -0
  533. package/dist/with-party/session/session-policy.d.ts +92 -0
  534. package/dist/with-party/session/session.d.ts +131 -0
  535. package/dist/with-party/session/strategy.d.ts +42 -0
  536. package/dist/with-party/session/unlock-state.d.ts +47 -0
  537. package/dist/with-party/sync/index.d.ts +31 -0
  538. package/dist/with-party/tab-coordination.d.ts +73 -0
  539. package/dist/with-party/tab-write-relay.d.ts +39 -0
  540. package/dist/with-party/team/active.d.ts +13 -0
  541. package/dist/with-party/team/authenticators.d.ts +95 -0
  542. package/dist/with-party/team/deed.d.ts +97 -0
  543. package/dist/with-party/team/delegation.d.ts +88 -0
  544. package/dist/with-party/team/index.d.ts +38 -0
  545. package/dist/with-party/team/keyring.d.ts +318 -0
  546. package/dist/with-party/team/magic-link-grant.d.ts +152 -0
  547. package/dist/with-party/team/managed-passphrase.d.ts +280 -0
  548. package/dist/with-party/team/noydb-facade.d.ts +484 -0
  549. package/dist/with-party/team/peer-recover.d.ts +81 -0
  550. package/dist/with-party/team/presence.d.ts +81 -0
  551. package/dist/with-party/team/recovery.d.ts +191 -0
  552. package/dist/with-party/team/reserved-secret-collections.d.ts +41 -0
  553. package/dist/with-party/team/rotate-recover.d.ts +275 -0
  554. package/dist/with-party/team/shamir-recovery-provider.d.ts +15 -0
  555. package/dist/with-party/team/strategy.d.ts +9 -0
  556. package/dist/with-party/team/sync-active.d.ts +33 -0
  557. package/dist/with-party/team/sync-credentials.d.ts +113 -0
  558. package/dist/with-party/team/sync-strategy.d.ts +67 -0
  559. package/dist/with-party/team/sync-transaction.d.ts +39 -0
  560. package/dist/with-party/team/sync.d.ts +174 -0
  561. package/dist/with-party/team/tiers.d.ts +39 -0
  562. package/dist/with-party/team/wrapped-deks.d.ts +86 -0
  563. package/dist/with-pod/backup.d.ts +74 -0
  564. package/dist/with-pod/bundle.d.ts +414 -0
  565. package/dist/with-pod/format.d.ts +203 -0
  566. package/dist/with-pod/index.d.ts +20 -0
  567. package/dist/with-pod/pod-store.d.ts +54 -0
  568. package/dist/with-pod/ulid.d.ts +64 -0
  569. package/dist/with-shape/blobs/blob-compaction.d.ts +170 -0
  570. package/dist/with-shape/blobs/blob-intent.d.ts +153 -0
  571. package/dist/with-shape/blobs/blob-set.d.ts +1286 -0
  572. package/dist/with-shape/blobs/export-blobs.d.ts +110 -0
  573. package/dist/with-shape/blobs/import-external.d.ts +50 -0
  574. package/dist/with-shape/blobs/mime-magic.d.ts +48 -0
  575. package/dist/with-shape/blobs/object-projection.d.ts +70 -0
  576. package/dist/with-shape/introspection/describe.d.ts +237 -0
  577. package/dist/with-shape/introspection/field-meta.d.ts +61 -0
  578. package/dist/with-shape/introspection/fields.d.ts +14 -0
  579. package/dist/with-shape/introspection/index.d.ts +12 -0
  580. package/dist/with-shape/introspection/json-schema.d.ts +13 -0
  581. package/dist/with-shape/introspection/meta.d.ts +22 -0
  582. package/dist/with-shape/introspection/projection.d.ts +13 -0
  583. package/dist/with-shape/introspection/types.d.ts +154 -0
  584. package/dist/with-shape/introspection/walk.d.ts +50 -0
  585. package/dist/with-shape/links/lazy-handle.d.ts +36 -0
  586. package/dist/with-shape/links/link-set.d.ts +67 -0
  587. package/dist/with-shape/links/names.d.ts +65 -0
  588. package/dist/with-shape/links/vault-facade.d.ts +211 -0
  589. package/dist/with-shape/persisted-schemas/canonicalize.d.ts +11 -0
  590. package/dist/with-shape/persisted-schemas/derive.d.ts +29 -0
  591. package/dist/with-shape/persisted-schemas/index.d.ts +21 -0
  592. package/dist/with-shape/persisted-schemas/register.d.ts +66 -0
  593. package/dist/with-shape/persisted-schemas/storage.d.ts +61 -0
  594. package/dist/with-shape/persisted-schemas/types.d.ts +54 -0
  595. package/dist/with-shape/satellites/dead-filter.d.ts +21 -0
  596. package/dist/with-shape/satellites/declare.d.ts +60 -0
  597. package/dist/with-shape/satellites/existence.d.ts +5 -0
  598. package/dist/with-shape/satellites/fanout.d.ts +38 -0
  599. package/dist/with-shape/satellites/forget.d.ts +47 -0
  600. package/dist/with-shape/satellites/index.d.ts +3 -0
  601. package/dist/with-shape/satellites/joined.d.ts +19 -0
  602. package/dist/with-shape/satellites/marker.d.ts +10 -0
  603. package/dist/with-shape/satellites/migrate-cek.d.ts +26 -0
  604. package/dist/with-shape/satellites/post-register.d.ts +6 -0
  605. package/dist/with-shape/satellites/proxy.d.ts +37 -0
  606. package/dist/with-shape/satellites/raw-target.d.ts +14 -0
  607. package/dist/with-shape/satellites/registry.d.ts +19 -0
  608. package/dist/with-shape/satellites/types.d.ts +37 -0
  609. package/dist/with-shape/satellites/validate.d.ts +17 -0
  610. package/dist/with-shape/schema-update/client-registry.d.ts +35 -0
  611. package/dist/with-shape/schema-update/cutover.d.ts +5 -0
  612. package/dist/with-shape/schema-update/delta.d.ts +2 -0
  613. package/dist/with-shape/schema-update/dispatch.d.ts +3 -0
  614. package/dist/with-shape/schema-update/fence-controller.d.ts +62 -0
  615. package/dist/with-shape/schema-update/fence-watcher.d.ts +37 -0
  616. package/dist/with-shape/schema-update/fence.d.ts +15 -0
  617. package/dist/with-shape/schema-update/gate.d.ts +16 -0
  618. package/dist/with-shape/schema-update/index.d.ts +6 -0
  619. package/dist/with-shape/schema-update/store-coordination-provider.d.ts +29 -0
  620. package/dist/with-shape/schema-update/strategies.d.ts +12 -0
  621. package/dist/with-shape/schema-update/types.d.ts +53 -0
  622. package/dist/with-store/index.d.ts +15 -0
  623. package/dist/with-store/lazy/active.d.ts +12 -0
  624. package/dist/with-store/lazy/index.d.ts +14 -0
  625. package/dist/with-store/lazy/strategy.d.ts +9 -0
  626. package/dist/with-store/route-store.d.ts +259 -0
  627. package/dist/with-store/store-middleware.d.ts +189 -0
  628. package/dist/withdraw-accessible-WZIEVWSR.js +28 -0
  629. package/package.json +47 -55
  630. package/dist/adapter/index.d.ts +0 -4
  631. package/dist/adapter/index.js +0 -15
  632. package/dist/aggregate/index.d.ts +0 -41
  633. package/dist/api-HV4PDUWF.js +0 -20
  634. package/dist/as/index.d.ts +0 -6
  635. package/dist/at/index.d.ts +0 -4
  636. package/dist/attestation/index.d.ts +0 -19
  637. package/dist/backup-ODXO7OGA.js +0 -225
  638. package/dist/backup-ODXO7OGA.js.map +0 -1
  639. package/dist/blobs/index.d.ts +0 -43
  640. package/dist/bundle/index.d.ts +0 -121
  641. package/dist/bundle-DlSxo31R.d.ts +0 -548
  642. package/dist/by/index.d.ts +0 -1
  643. package/dist/cargo/index.d.ts +0 -8
  644. package/dist/chunk-2644KEGW.js +0 -247
  645. package/dist/chunk-2644KEGW.js.map +0 -1
  646. package/dist/chunk-2HVUKRNE.js +0 -21
  647. package/dist/chunk-2KOSJTMU.js +0 -69
  648. package/dist/chunk-2UQ4RMHV.js +0 -167
  649. package/dist/chunk-2UQ4RMHV.js.map +0 -1
  650. package/dist/chunk-2XE6LIXT.js +0 -515
  651. package/dist/chunk-2XE6LIXT.js.map +0 -1
  652. package/dist/chunk-34RRRIC3.js +0 -71
  653. package/dist/chunk-3C5CKXFI.js +0 -621
  654. package/dist/chunk-3C5CKXFI.js.map +0 -1
  655. package/dist/chunk-3I4KYWNP.js +0 -30
  656. package/dist/chunk-42KVY3OC.js +0 -86
  657. package/dist/chunk-4C4WBS4V.js +0 -13822
  658. package/dist/chunk-4C4WBS4V.js.map +0 -1
  659. package/dist/chunk-4G3IT7J7.js +0 -280
  660. package/dist/chunk-4G3IT7J7.js.map +0 -1
  661. package/dist/chunk-4RQ62VSR.js +0 -53
  662. package/dist/chunk-4RQ62VSR.js.map +0 -1
  663. package/dist/chunk-4ZSGSRBI.js +0 -1221
  664. package/dist/chunk-4ZSGSRBI.js.map +0 -1
  665. package/dist/chunk-5GAX2QOH.js +0 -132
  666. package/dist/chunk-5GAX2QOH.js.map +0 -1
  667. package/dist/chunk-5SAZMBW7.js +0 -202
  668. package/dist/chunk-5TZZUL5X.js +0 -30
  669. package/dist/chunk-6CU3FN74.js +0 -777
  670. package/dist/chunk-6G2SCQYS.js +0 -29
  671. package/dist/chunk-6G2SCQYS.js.map +0 -1
  672. package/dist/chunk-6MWUANRF.js +0 -29
  673. package/dist/chunk-6S7T6WC4.js +0 -111
  674. package/dist/chunk-6S7T6WC4.js.map +0 -1
  675. package/dist/chunk-6ULCYCMU.js +0 -74
  676. package/dist/chunk-7HAPHVRJ.js +0 -1695
  677. package/dist/chunk-7HAPHVRJ.js.map +0 -1
  678. package/dist/chunk-7IZQTCTR.js +0 -382
  679. package/dist/chunk-7ZANJ6JZ.js +0 -265
  680. package/dist/chunk-7ZANJ6JZ.js.map +0 -1
  681. package/dist/chunk-A2APWS32.js +0 -150
  682. package/dist/chunk-A2APWS32.js.map +0 -1
  683. package/dist/chunk-A4MAD6PO.js +0 -99
  684. package/dist/chunk-ANDBBA2P.js +0 -36
  685. package/dist/chunk-ANDBBA2P.js.map +0 -1
  686. package/dist/chunk-AUR7MRHA.js +0 -404
  687. package/dist/chunk-AYGZMQP5.js +0 -75
  688. package/dist/chunk-BGIZAFY7.js +0 -1
  689. package/dist/chunk-CJEMA2Z6.js +0 -230
  690. package/dist/chunk-CTSFKDGA.js +0 -40
  691. package/dist/chunk-CU62BBRB.js +0 -1465
  692. package/dist/chunk-CU62BBRB.js.map +0 -1
  693. package/dist/chunk-CWCCYH34.js +0 -23
  694. package/dist/chunk-DEYAO3N6.js +0 -589
  695. package/dist/chunk-DFIBOSOQ.js +0 -85
  696. package/dist/chunk-E5AHO65E.js +0 -150
  697. package/dist/chunk-FC3XK5JT.js +0 -99
  698. package/dist/chunk-FGOGS7CE.js +0 -662
  699. package/dist/chunk-FGOGS7CE.js.map +0 -1
  700. package/dist/chunk-GX2BYNCT.js +0 -117
  701. package/dist/chunk-GZ2MOPVX.js +0 -291
  702. package/dist/chunk-GZ2MOPVX.js.map +0 -1
  703. package/dist/chunk-H57P2SJB.js +0 -126
  704. package/dist/chunk-H57P2SJB.js.map +0 -1
  705. package/dist/chunk-HBTT7YQX.js +0 -94
  706. package/dist/chunk-HOCEGVGQ.js +0 -36
  707. package/dist/chunk-ICV32FPK.js +0 -50
  708. package/dist/chunk-IIP5WFVT.js +0 -462
  709. package/dist/chunk-IIP5WFVT.js.map +0 -1
  710. package/dist/chunk-IUKGIB2Q.js +0 -91
  711. package/dist/chunk-IWTYFS3D.js +0 -129
  712. package/dist/chunk-JC5R7P44.js +0 -355
  713. package/dist/chunk-JC5R7P44.js.map +0 -1
  714. package/dist/chunk-K2WCO3NX.js +0 -1
  715. package/dist/chunk-KBBWY46Y.js +0 -14
  716. package/dist/chunk-KBF5GSGX.js +0 -367
  717. package/dist/chunk-KCG3BHFG.js +0 -99
  718. package/dist/chunk-KCG3BHFG.js.map +0 -1
  719. package/dist/chunk-KNXN47MO.js +0 -155
  720. package/dist/chunk-KWLD2D75.js +0 -38
  721. package/dist/chunk-KXKLKJW4.js +0 -49
  722. package/dist/chunk-KYC4LIEU.js +0 -123
  723. package/dist/chunk-LEOXZY36.js +0 -130
  724. package/dist/chunk-M5I354EE.js +0 -235
  725. package/dist/chunk-MK2BSS44.js +0 -34
  726. package/dist/chunk-MSVY7ULZ.js +0 -70
  727. package/dist/chunk-NNWK3PSY.js +0 -135
  728. package/dist/chunk-NSZ6J5DF.js +0 -59
  729. package/dist/chunk-NUEFXLZU.js +0 -59
  730. package/dist/chunk-NYVQCZ54.js +0 -261
  731. package/dist/chunk-OQAODTYR.js +0 -45
  732. package/dist/chunk-OV4CMJGR.js +0 -164
  733. package/dist/chunk-PEDZFFKW.js +0 -41
  734. package/dist/chunk-PF3FQCCF.js +0 -164
  735. package/dist/chunk-PF3FQCCF.js.map +0 -1
  736. package/dist/chunk-Q2KVKTC2.js +0 -823
  737. package/dist/chunk-QJR3W3MF.js +0 -23
  738. package/dist/chunk-QJR3W3MF.js.map +0 -1
  739. package/dist/chunk-QTXQ6RNZ.js +0 -255
  740. package/dist/chunk-RJ5522XX.js +0 -453
  741. package/dist/chunk-RJ5522XX.js.map +0 -1
  742. package/dist/chunk-RMUXPHIH.js +0 -930
  743. package/dist/chunk-RMUXPHIH.js.map +0 -1
  744. package/dist/chunk-S6AQXDN4.js +0 -155
  745. package/dist/chunk-SSFC3IYA.js +0 -275
  746. package/dist/chunk-SSFC3IYA.js.map +0 -1
  747. package/dist/chunk-SZCHEDML.js +0 -209
  748. package/dist/chunk-TDPEJINP.js +0 -188
  749. package/dist/chunk-TDPEJINP.js.map +0 -1
  750. package/dist/chunk-TQ3REHVF.js +0 -95
  751. package/dist/chunk-TQ3REHVF.js.map +0 -1
  752. package/dist/chunk-UNJU345Q.js +0 -32
  753. package/dist/chunk-UNJU345Q.js.map +0 -1
  754. package/dist/chunk-V7RNIND6.js +0 -265
  755. package/dist/chunk-V7RNIND6.js.map +0 -1
  756. package/dist/chunk-VJ3NQK4K.js +0 -205
  757. package/dist/chunk-WNA6T3MA.js +0 -686
  758. package/dist/chunk-WNA6T3MA.js.map +0 -1
  759. package/dist/chunk-WVCQ75OK.js +0 -124
  760. package/dist/chunk-X66MXMR5.js +0 -42
  761. package/dist/chunk-XHD3L3JO.js +0 -930
  762. package/dist/chunk-XHD3L3JO.js.map +0 -1
  763. package/dist/chunk-XJK2WIYN.js +0 -430
  764. package/dist/chunk-XJK2WIYN.js.map +0 -1
  765. package/dist/chunk-XQ7UYPVN.js +0 -95
  766. package/dist/chunk-Y2OCKFZ3.js +0 -80
  767. package/dist/chunk-YBFOBRTO.js +0 -367
  768. package/dist/chunk-YLN33ADH.js +0 -97
  769. package/dist/chunk-Z5YFRMG5.js +0 -45
  770. package/dist/chunk-ZWQFOXBR.js +0 -54
  771. package/dist/classified/index.d.ts +0 -16
  772. package/dist/classified-marker-IO5EBW7Q.js +0 -24
  773. package/dist/classified-marker-IO5EBW7Q.js.map +0 -1
  774. package/dist/collection-facade-3RAXG2OU.js +0 -38
  775. package/dist/computed-R62HGCO4.js +0 -11
  776. package/dist/consent/index.d.ts +0 -22
  777. package/dist/crdt/index.d.ts +0 -33
  778. package/dist/dead-filter-VNA4M3GP.js +0 -28
  779. package/dist/decrypt-partition-IHtxEnTi.d.ts +0 -21
  780. package/dist/delegation-ZKII5UBI.js +0 -25
  781. package/dist/derivations/index.d.ts +0 -69
  782. package/dist/derive-5D2C3WG4.js +0 -21
  783. package/dist/describe/index.d.ts +0 -4
  784. package/dist/describe/index.js +0 -1
  785. package/dist/dev-unlock-DDTafVO6.d.ts +0 -263
  786. package/dist/discriminant-BN9REW3o.d.ts +0 -60
  787. package/dist/enclave-EUBEJGPG.js +0 -125
  788. package/dist/executor-IL7SRNUZ.js +0 -23
  789. package/dist/executor-OUA2Y6YC.js +0 -9
  790. package/dist/executor-WAEI6PDV.js +0 -9
  791. package/dist/export-accessible-O55RKAGC.js +0 -23
  792. package/dist/extract-partition-VBGCBA6Q.js +0 -36
  793. package/dist/fanout-sidecar-CI5BCMQM.js +0 -74
  794. package/dist/find-FISGUWSK.js +0 -11
  795. package/dist/forget/index.d.ts +0 -36
  796. package/dist/guards/index.d.ts +0 -34
  797. package/dist/hash-DBkZfIBW.d.ts +0 -72
  798. package/dist/history/index.d.ts +0 -60
  799. package/dist/i18n/index.d.ts +0 -56
  800. package/dist/in/index.d.ts +0 -4
  801. package/dist/index-B9QdHytu.d.ts +0 -123
  802. package/dist/index-CyclmyDr.d.ts +0 -122
  803. package/dist/index-DzhNI2vE.d.ts +0 -23260
  804. package/dist/indexing/index.d.ts +0 -38
  805. package/dist/issue-EQAWIYFQ.js +0 -19
  806. package/dist/kernel/index.d.ts +0 -31
  807. package/dist/kernel/index.js +0 -60
  808. package/dist/lazy/index.d.ts +0 -20
  809. package/dist/ledger-AJA2SR3C.js +0 -42
  810. package/dist/liberate-SEGR4JLY.js +0 -24
  811. package/dist/link-set-YBAC2DQT.js +0 -31
  812. package/dist/materialized-views/index.d.ts +0 -182
  813. package/dist/mime-magic-CbV1quyp.d.ts +0 -103
  814. package/dist/noydb-AMEOU456.js +0 -65
  815. package/dist/on/index.d.ts +0 -4
  816. package/dist/overlay-views/index.d.ts +0 -97
  817. package/dist/periods/index.d.ts +0 -19
  818. package/dist/pod/index.d.ts +0 -62
  819. package/dist/policy-SDGRWVIL.js +0 -41
  820. package/dist/portability/index.d.ts +0 -19
  821. package/dist/post-register-MROIUA5O.js +0 -55
  822. package/dist/post-register-MROIUA5O.js.map +0 -1
  823. package/dist/public-envelope-J5PLQOW2.js +0 -32
  824. package/dist/query/index.d.ts +0 -4
  825. package/dist/read-only-facade-UCYNRE56.js +0 -8
  826. package/dist/register-OVJKW7BS.js +0 -23
  827. package/dist/registry-5RJSK5AJ.js +0 -9
  828. package/dist/registry-DQRNTWRL.js +0 -18
  829. package/dist/registry-LTGLERS7.js +0 -19
  830. package/dist/request-withdrawal-27O77D2V.js +0 -31
  831. package/dist/reveal-LT3I2K4P.js +0 -38
  832. package/dist/reveal-LT3I2K4P.js.map +0 -1
  833. package/dist/revoke-4N45G7D2.js +0 -24
  834. package/dist/revoke-4N45G7D2.js.map +0 -1
  835. package/dist/satellites/index.d.ts +0 -4
  836. package/dist/sealed-record/index.d.ts +0 -68
  837. package/dist/session/index.d.ts +0 -43
  838. package/dist/shadow/index.d.ts +0 -14
  839. package/dist/signer-XJCOV7JD.js +0 -25
  840. package/dist/signer-XJCOV7JD.js.map +0 -1
  841. package/dist/snapshots/index.d.ts +0 -25
  842. package/dist/stale-IYYXEH3U.js +0 -14
  843. package/dist/stale-IYYXEH3U.js.map +0 -1
  844. package/dist/storage-Y44CAPE6.js +0 -23
  845. package/dist/storage-Y44CAPE6.js.map +0 -1
  846. package/dist/store-coordination-provider-WKGAE2WI.js +0 -142
  847. package/dist/subject-index-CyOgGMJL.d.ts +0 -380
  848. package/dist/sync/index.d.ts +0 -40
  849. package/dist/team/index.d.ts +0 -154
  850. package/dist/tiers/index.d.ts +0 -4
  851. package/dist/to/index.d.ts +0 -4
  852. package/dist/transition-guard-BOUkzQU4.d.ts +0 -165
  853. package/dist/tx/index.d.ts +0 -34
  854. package/dist/ui/index.d.ts +0 -4
  855. package/dist/ulid-DRH25k3y.d.ts +0 -66
  856. package/dist/util/index.d.ts +0 -79
  857. package/dist/validators-B3SalxlJ.d.ts +0 -101
  858. package/dist/vault-diff-Dt9NkLzw.d.ts +0 -147
  859. package/dist/verify-GH6CWVSW.js +0 -139
  860. package/dist/verify-GH6CWVSW.js.map +0 -1
  861. package/dist/walk-76UCFXYV.js +0 -241
  862. package/dist/with/index.d.ts +0 -37
  863. package/dist/with-materialized-view-BP33v1Z6.d.ts +0 -27
  864. package/dist/with-overlayed-view-DntFpOKN.d.ts +0 -12
  865. package/dist/with-rollup-ClCHO6-4.d.ts +0 -47
  866. package/dist/withdraw-accessible-6J2UH3IN.js +0 -28
  867. package/dist/withdraw-accessible-6J2UH3IN.js.map +0 -1
  868. /package/dist/{adapter/index.js.map → api-ZGS6LCOF.js.map} +0 -0
  869. /package/dist/{chunk-34RRRIC3.js.map → chunk-3B5VVCNY.js.map} +0 -0
  870. /package/dist/{chunk-CJEMA2Z6.js.map → chunk-3LQ2YKO4.js.map} +0 -0
  871. /package/dist/{chunk-ZWQFOXBR.js.map → chunk-3QCRBHCY.js.map} +0 -0
  872. /package/dist/{chunk-E5AHO65E.js.map → chunk-4JBYV75E.js.map} +0 -0
  873. /package/dist/{chunk-YLN33ADH.js.map → chunk-4NXKCLLQ.js.map} +0 -0
  874. /package/dist/{chunk-2KOSJTMU.js.map → chunk-5M5DVGV7.js.map} +0 -0
  875. /package/dist/{chunk-3I4KYWNP.js.map → chunk-5YOLBEQ6.js.map} +0 -0
  876. /package/dist/{chunk-IWTYFS3D.js.map → chunk-6CRIV7DE.js.map} +0 -0
  877. /package/dist/{chunk-QTXQ6RNZ.js.map → chunk-6QTNZJBS.js.map} +0 -0
  878. /package/dist/{chunk-42KVY3OC.js.map → chunk-6T2SCQRU.js.map} +0 -0
  879. /package/dist/{chunk-Z5YFRMG5.js.map → chunk-7DSTRQIJ.js.map} +0 -0
  880. /package/dist/{chunk-DEYAO3N6.js.map → chunk-AUSTCW2X.js.map} +0 -0
  881. /package/dist/{chunk-SZCHEDML.js.map → chunk-B3HJYUOF.js.map} +0 -0
  882. /package/dist/{chunk-OV4CMJGR.js.map → chunk-BDVFPG6Y.js.map} +0 -0
  883. /package/dist/{chunk-HOCEGVGQ.js.map → chunk-CAF6WOK7.js.map} +0 -0
  884. /package/dist/{chunk-AUR7MRHA.js.map → chunk-CIE2BASH.js.map} +0 -0
  885. /package/dist/{chunk-X66MXMR5.js.map → chunk-CRI4OUV4.js.map} +0 -0
  886. /package/dist/{chunk-IUKGIB2Q.js.map → chunk-DLG74CNB.js.map} +0 -0
  887. /package/dist/{chunk-YBFOBRTO.js.map → chunk-ERJ7FU55.js.map} +0 -0
  888. /package/dist/{chunk-VJ3NQK4K.js.map → chunk-EVVGJDRQ.js.map} +0 -0
  889. /package/dist/{chunk-NSZ6J5DF.js.map → chunk-EXK7QRWF.js.map} +0 -0
  890. /package/dist/{chunk-5SAZMBW7.js.map → chunk-EYZ6IQ6X.js.map} +0 -0
  891. /package/dist/{chunk-OQAODTYR.js.map → chunk-F64IRYG3.js.map} +0 -0
  892. /package/dist/{chunk-Q2KVKTC2.js.map → chunk-FHS2HQSH.js.map} +0 -0
  893. /package/dist/{chunk-Y2OCKFZ3.js.map → chunk-GKEWXIV5.js.map} +0 -0
  894. /package/dist/{chunk-NUEFXLZU.js.map → chunk-GTGPO5KW.js.map} +0 -0
  895. /package/dist/{chunk-XQ7UYPVN.js.map → chunk-HB3RFQSC.js.map} +0 -0
  896. /package/dist/{chunk-FC3XK5JT.js.map → chunk-I6GALP6E.js.map} +0 -0
  897. /package/dist/{chunk-LEOXZY36.js.map → chunk-IL6POWCW.js.map} +0 -0
  898. /package/dist/{chunk-GX2BYNCT.js.map → chunk-IU6SNYX6.js.map} +0 -0
  899. /package/dist/{chunk-6CU3FN74.js.map → chunk-J2ZX2XUV.js.map} +0 -0
  900. /package/dist/{chunk-6MWUANRF.js.map → chunk-JKJOGPZN.js.map} +0 -0
  901. /package/dist/{chunk-PEDZFFKW.js.map → chunk-JZUV47FZ.js.map} +0 -0
  902. /package/dist/{chunk-5TZZUL5X.js.map → chunk-K5IMOGHB.js.map} +0 -0
  903. /package/dist/{chunk-7IZQTCTR.js.map → chunk-LASZKVMO.js.map} +0 -0
  904. /package/dist/{chunk-NNWK3PSY.js.map → chunk-NR5LT5RY.js.map} +0 -0
  905. /package/dist/{chunk-NYVQCZ54.js.map → chunk-NWSGI5C7.js.map} +0 -0
  906. /package/dist/{chunk-MSVY7ULZ.js.map → chunk-Q5VNKNE5.js.map} +0 -0
  907. /package/dist/{chunk-2HVUKRNE.js.map → chunk-QLWMEXCT.js.map} +0 -0
  908. /package/dist/{chunk-KYC4LIEU.js.map → chunk-QRB7NAOJ.js.map} +0 -0
  909. /package/dist/{chunk-6ULCYCMU.js.map → chunk-R4ROFEYC.js.map} +0 -0
  910. /package/dist/{chunk-KBF5GSGX.js.map → chunk-RIX4V2TB.js.map} +0 -0
  911. /package/dist/{chunk-CTSFKDGA.js.map → chunk-RYCTDFUX.js.map} +0 -0
  912. /package/dist/{chunk-S6AQXDN4.js.map → chunk-RZ5SVOYR.js.map} +0 -0
  913. /package/dist/{chunk-A4MAD6PO.js.map → chunk-SLFHQTTW.js.map} +0 -0
  914. /package/dist/{chunk-AYGZMQP5.js.map → chunk-T2FFWNPK.js.map} +0 -0
  915. /package/dist/{chunk-CWCCYH34.js.map → chunk-UNFPPVNI.js.map} +0 -0
  916. /package/dist/{chunk-M5I354EE.js.map → chunk-VLFCJYTL.js.map} +0 -0
  917. /package/dist/{chunk-WVCQ75OK.js.map → chunk-VN3DBQAU.js.map} +0 -0
  918. /package/dist/{chunk-KXKLKJW4.js.map → chunk-VZRODIM3.js.map} +0 -0
  919. /package/dist/{chunk-HBTT7YQX.js.map → chunk-W22IKJE2.js.map} +0 -0
  920. /package/dist/{chunk-KNXN47MO.js.map → chunk-X3YYQWOQ.js.map} +0 -0
  921. /package/dist/{chunk-DFIBOSOQ.js.map → chunk-YFXZEAYK.js.map} +0 -0
  922. /package/dist/{chunk-ICV32FPK.js.map → chunk-ZAJAVEXY.js.map} +0 -0
  923. /package/dist/{chunk-MK2BSS44.js.map → chunk-ZICD77GM.js.map} +0 -0
  924. /package/dist/{chunk-KWLD2D75.js.map → chunk-ZJ2AK4V7.js.map} +0 -0
  925. /package/dist/{chunk-KBBWY46Y.js.map → chunk-ZUODRVHY.js.map} +0 -0
  926. /package/dist/{api-HV4PDUWF.js.map → collection-facade-TLWIPI76.js.map} +0 -0
  927. /package/dist/{chunk-BGIZAFY7.js.map → computed-ZIQTYTDI.js.map} +0 -0
  928. /package/dist/{dead-filter-VNA4M3GP.js.map → dead-filter-ESOBZZP5.js.map} +0 -0
  929. /package/dist/{chunk-K2WCO3NX.js.map → delegation-W7ZV2322.js.map} +0 -0
  930. /package/dist/{collection-facade-3RAXG2OU.js.map → derive-H2BJTLUI.js.map} +0 -0
  931. /package/dist/{computed-R62HGCO4.js.map → enclave-AP3I5W7O.js.map} +0 -0
  932. /package/dist/{delegation-ZKII5UBI.js.map → executor-KGWTNEQD.js.map} +0 -0
  933. /package/dist/{derive-5D2C3WG4.js.map → executor-OVEXR6RT.js.map} +0 -0
  934. /package/dist/{describe/index.js.map → executor-UNEH5ZYH.js.map} +0 -0
  935. /package/dist/{enclave-EUBEJGPG.js.map → export-accessible-PCMXSUZS.js.map} +0 -0
  936. /package/dist/{executor-IL7SRNUZ.js.map → extract-partition-SWHFSYJO.js.map} +0 -0
  937. /package/dist/{fanout-sidecar-CI5BCMQM.js.map → fanout-sidecar-A765THMX.js.map} +0 -0
  938. /package/dist/{executor-OUA2Y6YC.js.map → find-N6345CNT.js.map} +0 -0
  939. /package/dist/{executor-WAEI6PDV.js.map → issue-5OKB6I2R.js.map} +0 -0
  940. /package/dist/{export-accessible-O55RKAGC.js.map → ledger-GFBKVPV4.js.map} +0 -0
  941. /package/dist/{extract-partition-VBGCBA6Q.js.map → liberate-3VDOT4KO.js.map} +0 -0
  942. /package/dist/{find-FISGUWSK.js.map → link-set-Z7Q2ASFX.js.map} +0 -0
  943. /package/dist/{issue-EQAWIYFQ.js.map → noydb-ZCJOYBDI.js.map} +0 -0
  944. /package/dist/{kernel/index.js.map → policy-Z3RUAIY2.js.map} +0 -0
  945. /package/dist/{ledger-AJA2SR3C.js.map → public-envelope-B4KNWVUA.js.map} +0 -0
  946. /package/dist/{liberate-SEGR4JLY.js.map → read-only-facade-CHCKSEPD.js.map} +0 -0
  947. /package/dist/{link-set-YBAC2DQT.js.map → register-VAHONCID.js.map} +0 -0
  948. /package/dist/{noydb-AMEOU456.js.map → registry-7MLVD3VO.js.map} +0 -0
  949. /package/dist/{policy-SDGRWVIL.js.map → registry-EPKPD5SM.js.map} +0 -0
  950. /package/dist/{public-envelope-J5PLQOW2.js.map → registry-P5T7PS2U.js.map} +0 -0
  951. /package/dist/{read-only-facade-UCYNRE56.js.map → request-withdrawal-TI3A5WPS.js.map} +0 -0
  952. /package/dist/{register-OVJKW7BS.js.map → revoke-FDRD6GRW.js.map} +0 -0
  953. /package/dist/{registry-5RJSK5AJ.js.map → signer-MUWEIUI6.js.map} +0 -0
  954. /package/dist/{registry-DQRNTWRL.js.map → stale-OSQ7J3AA.js.map} +0 -0
  955. /package/dist/{registry-LTGLERS7.js.map → storage-MVFCGEQE.js.map} +0 -0
  956. /package/dist/{store-coordination-provider-WKGAE2WI.js.map → store-coordination-provider-64OEZFGS.js.map} +0 -0
  957. /package/dist/{walk-76UCFXYV.js.map → walk-SVNDIZ62.js.map} +0 -0
  958. /package/dist/{request-withdrawal-27O77D2V.js.map → withdraw-accessible-WZIEVWSR.js.map} +0 -0
@@ -0,0 +1,151 @@
1
+ import {
2
+ readPath
3
+ } from "./chunk-IGJCYUT5.js";
4
+
5
+ // src/with-lookup/indexing/eager-indexes.ts
6
+ var CollectionIndexes = class {
7
+ indexes = /* @__PURE__ */ new Map();
8
+ /**
9
+ * Per-field bucket-key canonicalizer (#672 review C1), registered ONCE
10
+ * via {@link setCanonicalizer} when the collection wires indexing up
11
+ * (money-aware via `ViaPipeline.canonicalizeIndexKey`). Consulted by
12
+ * EVERY bucket-mutation site — `build`/`upsert`/`remove` — so bucket
13
+ * membership is symmetric by construction: a value can never be added
14
+ * under a canonical key and later removed under the raw one (or vice
15
+ * versa), which is what stranded ids on `put`/`delete` before this fix.
16
+ */
17
+ canonicalize;
18
+ /**
19
+ * Register the bucket-key canonicalizer. Called once, where the
20
+ * collection constructs its indexing state — safe to call again (the
21
+ * closure is simply replaced) but there is normally only one caller.
22
+ */
23
+ setCanonicalizer(fn) {
24
+ this.canonicalize = fn;
25
+ }
26
+ /**
27
+ * Declare an index. Subsequent record additions are tracked under it.
28
+ * Calling this twice for the same field is a no-op (idempotent).
29
+ */
30
+ declare(field) {
31
+ if (this.indexes.has(field)) return;
32
+ this.indexes.set(field, { field, buckets: /* @__PURE__ */ new Map() });
33
+ }
34
+ /** True if the given field has a declared index. */
35
+ has(field) {
36
+ return this.indexes.has(field);
37
+ }
38
+ /** All declared field names, in declaration order. */
39
+ fields() {
40
+ return [...this.indexes.keys()];
41
+ }
42
+ /**
43
+ * Build all declared indexes from a snapshot of records.
44
+ * Called once per hydration. O(N × indexes.size). Buckets through the
45
+ * registered {@link setCanonicalizer} closure, same as `upsert`/`remove`.
46
+ */
47
+ build(records) {
48
+ for (const idx of this.indexes.values()) {
49
+ idx.buckets.clear();
50
+ for (const { id, record } of records) {
51
+ addToIndex(idx, id, record, this.canonicalize);
52
+ }
53
+ }
54
+ }
55
+ /**
56
+ * Insert or update a single record across all indexes.
57
+ * Called by `Collection.put()` after the encrypted write succeeds.
58
+ *
59
+ * If `previousRecord` is provided, the record is removed from any old
60
+ * buckets first — this is the update path. Pass `null` for fresh adds.
61
+ */
62
+ upsert(id, newRecord, previousRecord) {
63
+ if (this.indexes.size === 0) return;
64
+ if (previousRecord !== null) {
65
+ this.remove(id, previousRecord);
66
+ }
67
+ for (const idx of this.indexes.values()) {
68
+ addToIndex(idx, id, newRecord, this.canonicalize);
69
+ }
70
+ }
71
+ /**
72
+ * Remove a record from all indexes. Called by `Collection.delete()`
73
+ * (and as the first half of `upsert` for the update path).
74
+ */
75
+ remove(id, record) {
76
+ if (this.indexes.size === 0) return;
77
+ for (const idx of this.indexes.values()) {
78
+ removeFromIndex(idx, id, record, this.canonicalize);
79
+ }
80
+ }
81
+ /** Drop all index data. Called when the collection is invalidated. */
82
+ clear() {
83
+ for (const idx of this.indexes.values()) {
84
+ idx.buckets.clear();
85
+ }
86
+ }
87
+ /**
88
+ * Equality lookup: return the set of record ids whose `field` matches
89
+ * the given value. Returns `null` if no index covers the field — the
90
+ * caller should fall back to a linear scan.
91
+ *
92
+ * The returned Set is a reference to the index's internal storage —
93
+ * callers must NOT mutate it.
94
+ */
95
+ lookupEqual(field, value) {
96
+ const idx = this.indexes.get(field);
97
+ if (!idx) return null;
98
+ const key = stringifyKey(value);
99
+ return idx.buckets.get(key) ?? EMPTY_SET;
100
+ }
101
+ /**
102
+ * Set lookup: return the union of record ids whose `field` matches any
103
+ * of the given values. Returns `null` if no index covers the field.
104
+ */
105
+ lookupIn(field, values) {
106
+ const idx = this.indexes.get(field);
107
+ if (!idx) return null;
108
+ const out = /* @__PURE__ */ new Set();
109
+ for (const value of values) {
110
+ const key = stringifyKey(value);
111
+ const bucket = idx.buckets.get(key);
112
+ if (bucket) {
113
+ for (const id of bucket) out.add(id);
114
+ }
115
+ }
116
+ return out;
117
+ }
118
+ };
119
+ var EMPTY_SET = /* @__PURE__ */ new Set();
120
+ function stringifyKey(value) {
121
+ if (value === null || value === void 0) return "\0NULL\0";
122
+ if (typeof value === "string") return value;
123
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
124
+ if (value instanceof Date) return value.toISOString();
125
+ return "\0OBJECT\0";
126
+ }
127
+ function addToIndex(idx, id, record, canonicalize) {
128
+ const value = readPath(record, idx.field);
129
+ if (value === null || value === void 0) return;
130
+ const key = canonicalize?.(idx.field, value) ?? stringifyKey(value);
131
+ let bucket = idx.buckets.get(key);
132
+ if (!bucket) {
133
+ bucket = /* @__PURE__ */ new Set();
134
+ idx.buckets.set(key, bucket);
135
+ }
136
+ bucket.add(id);
137
+ }
138
+ function removeFromIndex(idx, id, record, canonicalize) {
139
+ const value = readPath(record, idx.field);
140
+ if (value === null || value === void 0) return;
141
+ const key = canonicalize?.(idx.field, value) ?? stringifyKey(value);
142
+ const bucket = idx.buckets.get(key);
143
+ if (!bucket) return;
144
+ bucket.delete(id);
145
+ if (bucket.size === 0) idx.buckets.delete(key);
146
+ }
147
+
148
+ export {
149
+ CollectionIndexes
150
+ };
151
+ //# sourceMappingURL=chunk-KPZS5QAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/with-lookup/indexing/eager-indexes.ts"],"sourcesContent":["/**\n * Secondary indexes for the query DSL.\n *\n * ships **in-memory hash indexes**:\n * - Built during `Collection.ensureHydrated()` from the decrypted cache\n * - Maintained incrementally on `put` and `delete`\n * - Consulted by the query executor for `==` and `in` operators on\n * indexed fields, falling back to a linear scan otherwise\n * - Live entirely in memory — no adapter writes for the index itself\n *\n * Persistent encrypted index blobs (the spec's \"store as a separate\n * AES-256-GCM blob\" note) are deferred to a follow-up issue. The reasons\n * are documented in the PR body — short version: at the target\n * scale of 1K–50K records, building the index during hydrate is free,\n * so persistence buys nothing measurable.\n */\n\nimport { readPath } from '../../kernel/query/predicate.js'\n\n/**\n * Index declaration accepted by `Collection`'s constructor.\n *\n * Accepts:\n * - `string` — a single-field hash index (`'clientId'`)\n * - `{ fields: [...] }` or `readonly string[]` — a composite index\n * over an ordered field tuple. Only lazy-mode\n * collections consume composite declarations today; eager mode\n * silently treats a composite as equivalent to declaring each\n * component field as its own single-field index.\n *\n * Additive variants (unique constraints, partial indexes) will land as\n * further union members without breaking existing declarations.\n */\nexport type IndexDef =\n | string\n | { readonly fields: readonly string[]; readonly unique?: boolean }\n | readonly string[]\n\n/**\n * Internal representation of a built hash index.\n *\n * Maps stringified field values to the set of record ids whose value\n * for that field matches. Stringification keeps the index simple and\n * works uniformly for primitives (`'open'`, `'42'`, `'true'`).\n *\n * Records whose indexed field is `undefined` or `null` are NOT inserted\n * — `query().where('field', '==', undefined)` falls back to a linear\n * scan, which is the conservative behavior.\n */\nexport interface HashIndex {\n readonly field: string\n readonly buckets: Map<string, Set<string>>\n}\n\n/**\n * Container for all indexes on a single collection.\n *\n * Methods are pure with respect to the in-memory `buckets` Map — they\n * never touch the adapter or the keyring. The Collection class owns\n * lifecycle (build on hydrate, maintain on put/delete).\n */\nexport class CollectionIndexes {\n private readonly indexes = new Map<string, HashIndex>()\n\n /**\n * Per-field bucket-key canonicalizer (#672 review C1), registered ONCE\n * via {@link setCanonicalizer} when the collection wires indexing up\n * (money-aware via `ViaPipeline.canonicalizeIndexKey`). Consulted by\n * EVERY bucket-mutation site — `build`/`upsert`/`remove` — so bucket\n * membership is symmetric by construction: a value can never be added\n * under a canonical key and later removed under the raw one (or vice\n * versa), which is what stranded ids on `put`/`delete` before this fix.\n */\n private canonicalize?: (field: string, value: unknown) => string | undefined\n\n /**\n * Register the bucket-key canonicalizer. Called once, where the\n * collection constructs its indexing state — safe to call again (the\n * closure is simply replaced) but there is normally only one caller.\n */\n setCanonicalizer(fn: (field: string, value: unknown) => string | undefined): void {\n this.canonicalize = fn\n }\n\n /**\n * Declare an index. Subsequent record additions are tracked under it.\n * Calling this twice for the same field is a no-op (idempotent).\n */\n declare(field: string): void {\n if (this.indexes.has(field)) return\n this.indexes.set(field, { field, buckets: new Map() })\n }\n\n /** True if the given field has a declared index. */\n has(field: string): boolean {\n return this.indexes.has(field)\n }\n\n /** All declared field names, in declaration order. */\n fields(): string[] {\n return [...this.indexes.keys()]\n }\n\n /**\n * Build all declared indexes from a snapshot of records.\n * Called once per hydration. O(N × indexes.size). Buckets through the\n * registered {@link setCanonicalizer} closure, same as `upsert`/`remove`.\n */\n build<T>(records: ReadonlyArray<{ id: string; record: T }>): void {\n for (const idx of this.indexes.values()) {\n idx.buckets.clear()\n for (const { id, record } of records) {\n addToIndex(idx, id, record, this.canonicalize)\n }\n }\n }\n\n /**\n * Insert or update a single record across all indexes.\n * Called by `Collection.put()` after the encrypted write succeeds.\n *\n * If `previousRecord` is provided, the record is removed from any old\n * buckets first — this is the update path. Pass `null` for fresh adds.\n */\n upsert<T>(id: string, newRecord: T, previousRecord: T | null): void {\n if (this.indexes.size === 0) return\n if (previousRecord !== null) {\n this.remove(id, previousRecord)\n }\n for (const idx of this.indexes.values()) {\n addToIndex(idx, id, newRecord, this.canonicalize)\n }\n }\n\n /**\n * Remove a record from all indexes. Called by `Collection.delete()`\n * (and as the first half of `upsert` for the update path).\n */\n remove<T>(id: string, record: T): void {\n if (this.indexes.size === 0) return\n for (const idx of this.indexes.values()) {\n removeFromIndex(idx, id, record, this.canonicalize)\n }\n }\n\n /** Drop all index data. Called when the collection is invalidated. */\n clear(): void {\n for (const idx of this.indexes.values()) {\n idx.buckets.clear()\n }\n }\n\n /**\n * Equality lookup: return the set of record ids whose `field` matches\n * the given value. Returns `null` if no index covers the field — the\n * caller should fall back to a linear scan.\n *\n * The returned Set is a reference to the index's internal storage —\n * callers must NOT mutate it.\n */\n lookupEqual(field: string, value: unknown): ReadonlySet<string> | null {\n const idx = this.indexes.get(field)\n if (!idx) return null\n const key = stringifyKey(value)\n return idx.buckets.get(key) ?? EMPTY_SET\n }\n\n /**\n * Set lookup: return the union of record ids whose `field` matches any\n * of the given values. Returns `null` if no index covers the field.\n */\n lookupIn(field: string, values: readonly unknown[]): ReadonlySet<string> | null {\n const idx = this.indexes.get(field)\n if (!idx) return null\n const out = new Set<string>()\n for (const value of values) {\n const key = stringifyKey(value)\n const bucket = idx.buckets.get(key)\n if (bucket) {\n for (const id of bucket) out.add(id)\n }\n }\n return out\n }\n}\n\nconst EMPTY_SET: ReadonlySet<string> = new Set()\n\n/**\n * Stringify a value into a stable bucket key.\n *\n * `null`/`undefined` produce a sentinel that records will never match\n * (so we never index nullish values — `where('x', '==', null)` falls back\n * to a linear scan). Numbers, booleans, strings, and Date objects are\n * coerced via `String()`. Objects produce a sentinel that no real record\n * will match — querying with object values is a code smell.\n */\nfunction stringifyKey(value: unknown): string {\n if (value === null || value === undefined) return '\\0NULL\\0'\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (value instanceof Date) return value.toISOString()\n return '\\0OBJECT\\0'\n}\n\nfunction addToIndex<T>(\n idx: HashIndex,\n id: string,\n record: T,\n canonicalize?: (field: string, value: unknown) => string | undefined,\n): void {\n const value = readPath(record, idx.field)\n if (value === null || value === undefined) return\n const key = canonicalize?.(idx.field, value) ?? stringifyKey(value)\n let bucket = idx.buckets.get(key)\n if (!bucket) {\n bucket = new Set()\n idx.buckets.set(key, bucket)\n }\n bucket.add(id)\n}\n\nfunction removeFromIndex<T>(\n idx: HashIndex,\n id: string,\n record: T,\n canonicalize?: (field: string, value: unknown) => string | undefined,\n): void {\n const value = readPath(record, idx.field)\n if (value === null || value === undefined) return\n const key = canonicalize?.(idx.field, value) ?? stringifyKey(value)\n const bucket = idx.buckets.get(key)\n if (!bucket) return\n bucket.delete(id)\n // Clean up empty buckets so the Map doesn't accumulate dead keys.\n if (bucket.size === 0) idx.buckets.delete(key)\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,291 @@
1
+ import {
2
+ sha256Hex
3
+ } from "./chunk-CIE2BASH.js";
4
+ import {
5
+ MaterializedViewSourceUnknownError
6
+ } from "./chunk-BIOUI4HL.js";
7
+
8
+ // src/with-formula/materialized-views/dependency-analyzer.ts
9
+ function analyzeDependencies(query) {
10
+ const deps = /* @__PURE__ */ new Set();
11
+ const plan = query._plan();
12
+ const ctx = query._joinContext();
13
+ if (ctx?.leftCollection) {
14
+ deps.add(ctx.leftCollection);
15
+ }
16
+ for (const leg of plan.joins) {
17
+ deps.add(leg.target);
18
+ }
19
+ for (const clause of plan.clauses) {
20
+ if (clause.type === "crossJoin") {
21
+ deps.add(clause.target);
22
+ }
23
+ }
24
+ walkClausesForJoins(plan, deps, ctx);
25
+ return deps;
26
+ }
27
+ function walkClausesForJoins(plan, deps, ctx) {
28
+ void ctx;
29
+ for (const clause of plan.clauses) {
30
+ if (clause.type === "group") {
31
+ }
32
+ }
33
+ }
34
+ function summarizeQueryPlan(query) {
35
+ const plan = query._plan();
36
+ const ctx = query._joinContext();
37
+ return JSON.stringify({
38
+ root: ctx?.leftCollection ?? null,
39
+ clauses: plan.clauses.map((c) => {
40
+ if (c.type === "crossJoin") {
41
+ return {
42
+ type: "crossJoin",
43
+ target: c.target,
44
+ as: c.as,
45
+ // Inline on: callback: use sentinel — drift detection disabled for this MV
46
+ onPredicateName: c.onPredicateName ?? (c.on ? "[inline]" : null),
47
+ maxRows: c.maxRows ?? null
48
+ };
49
+ }
50
+ return c;
51
+ }),
52
+ orderBy: plan.orderBy,
53
+ limit: plan.limit ?? null,
54
+ offset: plan.offset,
55
+ joins: plan.joins.map((j) => ({ field: j.field, as: j.as, target: j.target, mode: j.mode }))
56
+ });
57
+ }
58
+ function summarizeUnionPlan(spec) {
59
+ const arms = (spec.unionSources ?? []).map((s) => {
60
+ const joins = s.join?.length ? `[${s.join.map((j) => `${j.field}\u2192${j.as}`).join(";")}]` : "";
61
+ return `${s.collection}${joins}`;
62
+ }).join(",");
63
+ const groupBy = Array.isArray(spec.groupBy) ? [...spec.groupBy].sort().join(",") : typeof spec.groupBy === "string" ? spec.groupBy : "";
64
+ const aggKeys = spec.aggregate ? Object.keys(spec.aggregate).sort().join(",") : "";
65
+ const moneyKeys = spec.moneyFields ? Object.keys(spec.moneyFields).sort().join(",") : "";
66
+ return `union(${arms})|groupBy(${groupBy})|aggregate(${aggKeys})|money(${moneyKeys})`;
67
+ }
68
+
69
+ // src/with-formula/materialized-views/query-hash.ts
70
+ async function computeQueryHash(mvName, dependencies, queryPlanSummary) {
71
+ const canonical = JSON.stringify({
72
+ mvName,
73
+ dependencies: [...dependencies].sort(),
74
+ queryPlanSummary
75
+ });
76
+ const bytes = new TextEncoder().encode(canonical);
77
+ return sha256Hex(bytes);
78
+ }
79
+ function canonicalizeQueryPlan(plan) {
80
+ return JSON.stringify(plan, (_key, value) => {
81
+ if (value && typeof value === "object" && !Array.isArray(value)) {
82
+ const sorted = {};
83
+ for (const k of Object.keys(value).sort()) {
84
+ sorted[k] = value[k];
85
+ }
86
+ return sorted;
87
+ }
88
+ return value;
89
+ });
90
+ }
91
+
92
+ // src/with-formula/materialized-views/registry.ts
93
+ var WHOLE_RECORD = "*";
94
+ var MaterializedViewRegistry = class {
95
+ /** Keyed by `spec.name`. */
96
+ _byName = /* @__PURE__ */ new Map();
97
+ /** Keyed by dependency source-collection → MVs that depend on it. */
98
+ _bySource = /* @__PURE__ */ new Map();
99
+ /**
100
+ * Register an MV. Invokes `spec.query()` once at registration time to
101
+ * read the plan + join context; the resulting `Query<T>` is discarded
102
+ * after dependency extraction. `vault.collection(...)` must therefore
103
+ * be functional by the time this runs — typically wired from
104
+ * `Vault._initMaterializedViews` after collection bootstrap.
105
+ *
106
+ * Throws `MaterializedViewSourceUnknownError` if the analyzer
107
+ * surfaces a dependency the vault doesn't know about (when a
108
+ * `knownCollections` checker is supplied).
109
+ */
110
+ async register(spec, db, options) {
111
+ const dbForQuery = spec.predicates ? wrapDbWithPredicates(db, spec.predicates) : db;
112
+ let dependencies;
113
+ let queryPlanSummary;
114
+ let qAny = null;
115
+ let isQuery = false;
116
+ if (spec.unionSources) {
117
+ dependencies = new Set(spec.unionSources.map((s) => s.collection));
118
+ if (spec.sources) for (const s of spec.sources) dependencies.add(s);
119
+ queryPlanSummary = summarizeUnionPlan(spec);
120
+ } else {
121
+ const q = spec.query(dbForQuery);
122
+ qAny = q;
123
+ isQuery = typeof qAny._plan === "function";
124
+ if (isQuery) {
125
+ dependencies = analyzeDependencies(qAny);
126
+ queryPlanSummary = summarizeQueryPlan(qAny);
127
+ const predicateRefs = extractPredicateRefs(qAny._plan());
128
+ if (predicateRefs.length > 0) {
129
+ queryPlanSummary = JSON.stringify({ plan: queryPlanSummary, predicates: predicateRefs });
130
+ }
131
+ if (spec.sources) for (const s of spec.sources) dependencies.add(s);
132
+ } else {
133
+ if (!spec.sources || spec.sources.length === 0) {
134
+ throw new Error(
135
+ `withMaterializedView "${spec.name}": query() returned an aggregate (Aggregation or GroupedAggregation) but no \`sources\` field is declared. The dependency analyzer cannot walk through groupBy().aggregate() back to the source \u2014 declare sources: [...] explicitly.`
136
+ );
137
+ }
138
+ dependencies = new Set(spec.sources);
139
+ queryPlanSummary = JSON.stringify({ aggregate: true, sources: [...spec.sources].sort() });
140
+ }
141
+ }
142
+ if (options?.knownCollections) {
143
+ for (const dep of dependencies) {
144
+ if (!options.knownCollections(dep)) {
145
+ throw new MaterializedViewSourceUnknownError(spec.name, dep);
146
+ }
147
+ }
148
+ }
149
+ const outputCollection = spec.output?.collection ?? spec.name;
150
+ const queryHash = await computeQueryHash(spec.name, dependencies, queryPlanSummary);
151
+ const partitionClauses = [];
152
+ const partitionField = spec.output?.partition?.field;
153
+ if (partitionField !== void 0 && isQuery) {
154
+ const plan = qAny._plan();
155
+ for (const clause of plan.clauses) {
156
+ if (isFieldClauseOnField(clause, partitionField)) partitionClauses.push(clause);
157
+ }
158
+ }
159
+ const grain = spec.unionSources || isQuery ? "record" : "aggregate";
160
+ const reg = { spec, outputCollection, dependencies, queryHash, partitionClauses, grain };
161
+ this._byName.set(spec.name, reg);
162
+ for (const dep of dependencies) {
163
+ const arr = this._bySource.get(dep);
164
+ if (arr) arr.push(reg);
165
+ else this._bySource.set(dep, [reg]);
166
+ }
167
+ }
168
+ /** All MVs that depend on `source`, in registration order. */
169
+ mvsForSource(source) {
170
+ return this._bySource.get(source) ?? [];
171
+ }
172
+ /** Single MV by name, or `undefined`. */
173
+ byName(name) {
174
+ return this._byName.get(name);
175
+ }
176
+ /** Iterate over every registered MV. */
177
+ all() {
178
+ return [...this._byName.values()];
179
+ }
180
+ /**
181
+ * Graph edges for #638 Task 2: one `'mv'` edge per registered MV — target
182
+ * = the output collection (a `WHOLE_RECORD` artifact node), sources =
183
+ * every dependency (also `WHOLE_RECORD` nodes). Same-collection edges
184
+ * (`dep === outputCollection`) are skipped IFF the MV declares an
185
+ * `output.partition` discriminator AND the query has a where-clause that
186
+ * provably excludes the partition value (`partitionDisjoint`) — the SAME
187
+ * condition the old local DFS used. Grain comes from the registration-time
188
+ * `RegisteredMV.grain`.
189
+ */
190
+ edges() {
191
+ const out = [];
192
+ for (const reg of this._byName.values()) {
193
+ const sources = [];
194
+ for (const dep of reg.dependencies) {
195
+ if (dep === reg.outputCollection && partitionDisjoint(reg)) continue;
196
+ sources.push({ collection: dep, field: WHOLE_RECORD });
197
+ }
198
+ if (sources.length === 0) continue;
199
+ out.push({ target: { collection: reg.outputCollection, field: WHOLE_RECORD }, sources, kind: "mv", grain: reg.grain });
200
+ }
201
+ return out;
202
+ }
203
+ /**
204
+ * Cycle detection, delegated to `ViaGraph.assertAcyclic()` (#638 Task 2 —
205
+ * retires the local DFS). `graph` is the caller's shared per-vault graph,
206
+ * ALREADY carrying this registry's `edges()` AND `DerivationRegistry`'s
207
+ * (registered by the caller — see `Vault._initMaterializedViews`, which
208
+ * runs after `_initDerivations`, so a pure-derivation cycle already threw
209
+ * `DerivationCycleError` there; any cycle surfacing here necessarily
210
+ * touches an MV edge). Throws `MaterializedViewCycleError` — SAME class as
211
+ * before.
212
+ */
213
+ validate(graph) {
214
+ graph.assertAcyclic();
215
+ }
216
+ };
217
+ function isFieldClauseOnField(clause, field) {
218
+ return clause.type === "field" && clause.field === field;
219
+ }
220
+ function wrapDbWithPredicates(db, predicates) {
221
+ const map = /* @__PURE__ */ new Map();
222
+ for (const [name, decl] of Object.entries(predicates)) {
223
+ map.set(name, {
224
+ hash: decl.hash,
225
+ fn: decl.fn
226
+ });
227
+ }
228
+ return {
229
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
230
+ collection(name) {
231
+ const c = db.collection(name);
232
+ return new Proxy(c, {
233
+ get(target, prop, receiver) {
234
+ if (prop === "query") {
235
+ return (...args) => {
236
+ const q = target.query(...args);
237
+ if (q && typeof q._withPredicates === "function") {
238
+ return q._withPredicates(map);
239
+ }
240
+ return q;
241
+ };
242
+ }
243
+ return Reflect.get(target, prop, receiver);
244
+ }
245
+ });
246
+ }
247
+ };
248
+ }
249
+ function extractPredicateRefs(plan) {
250
+ const refs = [];
251
+ const walk = (clauses) => {
252
+ for (const c of clauses) {
253
+ if (c.type === "wherePredicate") {
254
+ refs.push({ name: c.name, predicateHash: c.predicateHash, ctxHash: c.ctxHash });
255
+ } else if (c.type === "group") {
256
+ walk(c.clauses);
257
+ }
258
+ }
259
+ };
260
+ walk(plan.clauses);
261
+ refs.sort((a, b) => {
262
+ if (a.name !== b.name) return a.name < b.name ? -1 : 1;
263
+ if (a.predicateHash !== b.predicateHash) return a.predicateHash < b.predicateHash ? -1 : 1;
264
+ return a.ctxHash < b.ctxHash ? -1 : a.ctxHash > b.ctxHash ? 1 : 0;
265
+ });
266
+ return refs;
267
+ }
268
+ function partitionDisjoint(reg) {
269
+ const partition = reg.spec.output?.partition;
270
+ if (partition === void 0) return false;
271
+ const value = partition.value;
272
+ for (const c of reg.partitionClauses) {
273
+ if (c.op === "==" && c.value !== value) return true;
274
+ if (c.op === "!=" && c.value === value) return true;
275
+ if (c.op === "in" && Array.isArray(c.value)) {
276
+ const list = c.value;
277
+ if (!list.includes(value)) return true;
278
+ }
279
+ }
280
+ return false;
281
+ }
282
+
283
+ export {
284
+ analyzeDependencies,
285
+ summarizeQueryPlan,
286
+ computeQueryHash,
287
+ canonicalizeQueryPlan,
288
+ MaterializedViewRegistry,
289
+ wrapDbWithPredicates
290
+ };
291
+ //# sourceMappingURL=chunk-KSKBRKGJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/with-formula/materialized-views/dependency-analyzer.ts","../src/with-formula/materialized-views/query-hash.ts","../src/with-formula/materialized-views/registry.ts"],"sourcesContent":["import type { Query, QueryPlan } from '../../kernel/query/builder.js'\nimport type { JoinContext } from '../../kernel/query/join.js'\nimport type { MaterializedViewStrategy } from './types.js'\n\n/**\n * Walks a `Query<T>` plan and returns the set of source collection\n * names that any source-write should trigger a refresh on.\n *\n * Handles:\n * - root collection (the one the query was built from)\n * - FK join targets (`.join(field, { as })`)\n *\n * Also handles:\n * - cross-join targets (`.crossJoin(target, { as })`) — v3\n *\n * Deferred:\n * - `.wherePredicate(name)` — v2 predicate primitive\n * - Overlay-name expansion to {base, overlay}\n *\n * The set is materialized at MV registration time. The MV registry\n * uses it to (a) dispatch `onSourceWrite` only to MVs that actually\n * care, and (b) contribute edges to the shared cycle-detection graph.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function analyzeDependencies(query: Query<any>): Set<string> {\n const deps = new Set<string>()\n const plan = query._plan()\n const ctx = query._joinContext()\n\n // The root collection is always a dependency.\n if (ctx?.leftCollection) {\n deps.add(ctx.leftCollection)\n }\n\n // FK join targets contribute additional sources.\n for (const leg of plan.joins) {\n deps.add(leg.target)\n }\n\n // Cross-join targets are also dependency sources — writes to either side\n // must trigger MV refresh. Symmetric with FK-join target handling above.\n for (const clause of plan.clauses) {\n if (clause.type === 'crossJoin') {\n deps.add(clause.target)\n }\n }\n\n // Sub-plans inside OR clauses can carry nested joins. Walk them.\n // (Today only top-level `.join()` populates `plan.joins`, but the\n // OR-group machinery permits sub-plans, so we recurse defensively.)\n walkClausesForJoins(plan, deps, ctx)\n\n return deps\n}\n\nfunction walkClausesForJoins(\n plan: QueryPlan,\n deps: Set<string>,\n ctx: JoinContext | undefined,\n): void {\n void ctx\n // Today `plan.joins` carries all join legs at top level. Sub-plans\n // inside OR groups don't currently support nested joins, so the loop\n // below is a no-op safety net for future builder extensions.\n for (const clause of plan.clauses) {\n if (clause.type === 'group') {\n // Group clauses don't (yet) carry their own joins; this is a\n // forward-compat anchor for when OR-groups support nested\n // sources.\n }\n }\n}\n\n/**\n * Convenience: produce a stable string summary of the query plan\n * suitable for `queryHash` derivation. Captures everything the\n * dependency analyzer reads + the where/orderBy/limit/offset\n * structure that affects materialized rows.\n *\n * `joinContext` is intentionally NOT included — the join-resolution\n * function references would defeat hash determinism. The set of join\n * TARGETS (collection names) IS included via the plan.joins legs.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function summarizeQueryPlan(query: Query<any>): string {\n const plan = query._plan()\n const ctx = query._joinContext()\n return JSON.stringify({\n root: ctx?.leftCollection ?? null,\n clauses: plan.clauses.map(c => {\n if (c.type === 'crossJoin') {\n return {\n type: 'crossJoin',\n target: c.target,\n as: c.as,\n // Inline on: callback: use sentinel — drift detection disabled for this MV\n onPredicateName: c.onPredicateName ?? (c.on ? '[inline]' : null),\n maxRows: c.maxRows ?? null,\n }\n }\n return c\n }),\n orderBy: plan.orderBy,\n limit: plan.limit ?? null,\n offset: plan.offset,\n joins: plan.joins.map(j => ({ field: j.field, as: j.as, target: j.target, mode: j.mode })),\n })\n}\n\n/**\n * Canonical string description of a UNION MV's plan, used as input to\n * `computeQueryHash`.\n *\n * Asymmetry note:\n * - Arm collection names are NOT sorted. Declaration order is\n * semantically meaningful for the dedup-only UNION path —\n * `materializeUnionResult` iterates `spec.unionSources` in\n * declaration order and keeps the first-seen row per composite key\n * (tie-break precedence). If we sorted arms here, a consumer who\n * reordered `unionSources` to change precedence would compute the\n * same `queryHash`, refresh would be a no-op, and stale MV rows\n * would persist. Hashing in declaration order makes any reorder\n * trigger a refresh.\n * - `groupBy` fields ARE sorted. Multi-key groupBy buckets are\n * commutative (`canonicalGroupKey` produces the same composite key\n * regardless of field order in the input spec).\n * - `aggregate` keys ARE sorted. Reducer-spec keys are independent\n * of each other — order of declaration doesn't change output.\n *\n * Per-arm `map` functions are NOT fingerprinted; consumers must bump\n * the MV's `name` (or rely on application-level cache busting) when\n * `map` semantics change non-equivalently.\n */\nexport function summarizeUnionPlan<T extends Record<string, unknown>>(\n spec: MaterializedViewStrategy<T>,\n): string {\n const arms = (spec.unionSources ?? [])\n .map(s => {\n // Fold each arm's join legs into the summary so adding or\n // reordering joins (which changes the materialized rows) bumps\n // queryHash. Leg order is declaration-significant (legs chain), so\n // it is NOT sorted — same rationale as arm declaration order.\n const joins = s.join?.length\n ? `[${s.join.map(j => `${j.field}→${j.as}`).join(';')}]`\n : ''\n return `${s.collection}${joins}`\n })\n .join(',')\n const groupBy: string = Array.isArray(spec.groupBy)\n ? [...spec.groupBy].sort().join(',')\n : typeof spec.groupBy === 'string'\n ? spec.groupBy\n : ''\n const aggKeys = spec.aggregate ? Object.keys(spec.aggregate).sort().join(',') : ''\n // `moneyFields` changes reducer semantics (float → exact BigInt), so\n // declaring / removing / re-keying it must bump queryHash. Keys are\n // sorted — they're independent of each other (one descriptor per\n // output field), same rationale as aggregate keys.\n const moneyKeys = spec.moneyFields ? Object.keys(spec.moneyFields).sort().join(',') : ''\n return `union(${arms})|groupBy(${groupBy})|aggregate(${aggKeys})|money(${moneyKeys})`\n}\n","/**\n * Deterministic hash of a materialized view strategy's \"shape\": MV\n * name + canonical query-plan summary + sorted dependency-set.\n *\n * Used to detect strategy drift: a row whose `_materializedFrom.queryHash`\n * doesn't match the current strategy is considered stale.\n *\n * Web Crypto SHA-256 — no extra deps. Mirrors the v1\n * `computeStrategyHash` pattern.\n */\nimport { sha256Hex } from '../../kernel/enclave/index.js'\n\nexport async function computeQueryHash(\n mvName: string,\n /**\n * Source-collection set the query depends on. Sorted before\n * canonicalization so set iteration order doesn't affect the hash.\n */\n dependencies: ReadonlySet<string>,\n /**\n * Stringified query-plan summary. The caller produces this from the\n * `Query<T>` builder — concretely: a JSON serialization of clauses +\n * orderBy + limit + offset + joins. Function bodies inside\n * `wherePredicate` are NOT included here (those carry their own\n * `predicateHash` to be folded in by a later sub-issue).\n */\n queryPlanSummary: string,\n): Promise<string> {\n const canonical = JSON.stringify({\n mvName,\n dependencies: [...dependencies].sort(),\n queryPlanSummary,\n })\n const bytes = new TextEncoder().encode(canonical)\n return sha256Hex(bytes)\n}\n\n/**\n * Canonicalize a query plan for hashing. Walks the plan structure\n * with sorted keys so insertion order doesn't perturb the result.\n * Lives here rather than in `query/builder.ts` to keep that module\n * stable across MV-specific evolutions.\n *\n * @internal exported for testing\n */\nexport function canonicalizeQueryPlan(plan: unknown): string {\n return JSON.stringify(plan, (_key, value) => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record<string, unknown> = {}\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[k] = (value as Record<string, unknown>)[k]\n }\n return sorted\n }\n return value\n })\n}\n","import { MaterializedViewSourceUnknownError } from '../../kernel/errors.js'\nimport type { ViaGraph, FieldRef, EdgeKind, Grain } from '../../kernel/via/graph.js'\nimport type { Clause, FieldClause } from '../../kernel/query/predicate.js'\nimport type { DeclaredPredicate } from '../../kernel/query/builder.js'\nimport { analyzeDependencies, summarizeQueryPlan, summarizeUnionPlan } from './dependency-analyzer.js'\nimport { computeQueryHash } from './query-hash.js'\nimport type { MaterializedViewStrategy, MVQueryContext } from './types.js'\n\n/**\n * Whole-record artifact-grain field marker (#638 Task 2) — MUST match\n * `derivations/registry.ts`'s and `vault.ts`'s overlay-edge marker so\n * cross-registry edges (a derivation feeding an MV, or vice versa) resolve\n * to the SAME graph node. See that file's `WHOLE_RECORD` doc comment.\n */\nconst WHOLE_RECORD = '*'\n\n/**\n * One registered MV strategy alongside its derived metadata. Stored\n * type-erased on `TRow` so the registry can hold heterogeneous MVs.\n */\nexport interface RegisteredMV {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly spec: MaterializedViewStrategy<any>\n /** Output collection name (`spec.output?.collection ?? spec.name`). */\n readonly outputCollection: string\n /** Set of source collections; populated at registration via the analyzer. */\n readonly dependencies: ReadonlySet<string>\n /** Canonical `queryHash` — `_materializedFrom.queryHash` for every emitted row. */\n readonly queryHash: string\n /**\n * Top-level FieldClauses on the partition field, captured at\n * registration time. Used by the cycle detector to resolve\n * same-collection-as-source edges via the partition-discriminator\n * check. Empty when `spec.output?.partition` is undefined.\n */\n readonly partitionClauses: readonly FieldClause[]\n /**\n * #638 Task 2 — `'record'` for a row-per-source-row Query<T> or\n * `unionSources` MV, `'aggregate'` for a `.groupBy().aggregate()` MV\n * (the shape that requires explicit `sources`, since the dependency\n * analyzer can't walk an aggregate plan). Feeds `edges()`'s grain.\n */\n readonly grain: Grain\n}\n\n/**\n * Vault-internal registry of MV strategies. Owned by `Vault`; not\n * exported. Parallel to v1's `DerivationRegistry`; the two graphs share\n * a single cycle-detection pass at vault open (see `validate`).\n *\n * @internal\n */\nexport class MaterializedViewRegistry {\n /** Keyed by `spec.name`. */\n private readonly _byName = new Map<string, RegisteredMV>()\n /** Keyed by dependency source-collection → MVs that depend on it. */\n private readonly _bySource = new Map<string, RegisteredMV[]>()\n\n /**\n * Register an MV. Invokes `spec.query()` once at registration time to\n * read the plan + join context; the resulting `Query<T>` is discarded\n * after dependency extraction. `vault.collection(...)` must therefore\n * be functional by the time this runs — typically wired from\n * `Vault._initMaterializedViews` after collection bootstrap.\n *\n * Throws `MaterializedViewSourceUnknownError` if the analyzer\n * surfaces a dependency the vault doesn't know about (when a\n * `knownCollections` checker is supplied).\n */\n async register(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n spec: MaterializedViewStrategy<any>,\n db: MVQueryContext,\n options?: { knownCollections?: (name: string) => boolean },\n ): Promise<void> {\n // Build a predicate-aware db wrapper. If `spec.predicates` is\n // declared, the wrapper intercepts `.collection().query()` and\n // attaches the predicates map to the resulting Query<T>. With no\n // predicates declared, the wrapper is the original db unchanged.\n const dbForQuery = spec.predicates ? wrapDbWithPredicates(db, spec.predicates) : db\n\n // Invoke the query callback once to inspect its plan / dependencies.\n // For Query<T> shapes the analyzer extracts deps + plan summary\n // automatically. Aggregation / GroupedAggregation shapes don't\n // expose the underlying Query, so the spec must declare `sources`\n // explicitly. `partitionClauses` are only populated for Query<T>\n // since same-collection-partition is a non-aggregate concern.\n // UNION-form strategies: dependencies and plan summary come\n // straight off the strategy — no `query` callback to introspect.\n // The dependency-analyzer + summarizer are bypassed entirely; the\n // executor handles materialization via `materializeUnionResult`.\n let dependencies: Set<string>\n let queryPlanSummary: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let qAny: any = null\n let isQuery = false\n if (spec.unionSources) {\n dependencies = new Set(spec.unionSources.map(s => s.collection))\n // Per-arm joins resolve right-side collections that aren't among\n // the arm `collection`s. The consumer lists those in `sources`;\n // fold them into the dependency set so a write to a join-target\n // collection triggers MV refresh (and contributes a cycle edge).\n if (spec.sources) for (const s of spec.sources) dependencies.add(s)\n queryPlanSummary = summarizeUnionPlan(spec)\n } else {\n const q = spec.query!(dbForQuery)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n qAny = q as any\n isQuery = typeof qAny._plan === 'function'\n if (isQuery) {\n // `q` is the `Query` arm of the union here (runtime-confirmed via\n // `qAny._plan` above); reuse the already-`any` `qAny` the block uses\n // for `_plan()` rather than re-narrowing.\n dependencies = analyzeDependencies(qAny)\n queryPlanSummary = summarizeQueryPlan(qAny)\n // Fold `.wherePredicate(name, ctx)` references into the plan\n // summary so predicate function or ctx changes (signalled by\n // bumping `hash` or supplying a different ctx) propagate into\n // `queryHash` and force refresh on next visit.\n const predicateRefs = extractPredicateRefs(qAny._plan())\n if (predicateRefs.length > 0) {\n queryPlanSummary = JSON.stringify({ plan: queryPlanSummary, predicates: predicateRefs })\n }\n // If `sources` is ALSO declared, take the union (consumer's\n // explicit list extends the auto-analyzed set).\n if (spec.sources) for (const s of spec.sources) dependencies.add(s)\n } else {\n // Aggregate shape: require explicit `sources`.\n if (!spec.sources || spec.sources.length === 0) {\n throw new Error(\n `withMaterializedView \"${spec.name}\": query() returned an aggregate ` +\n `(Aggregation or GroupedAggregation) but no \\`sources\\` field is declared. ` +\n `The dependency analyzer cannot walk through groupBy().aggregate() ` +\n `back to the source — declare sources: [...] explicitly.`,\n )\n }\n dependencies = new Set(spec.sources)\n // Aggregate plans don't carry a chainable query plan for summary\n // purposes; the dep-set + spec.name serve as the queryHash inputs.\n queryPlanSummary = JSON.stringify({ aggregate: true, sources: [...spec.sources].sort() })\n }\n }\n\n // Sanity-check declared dependencies against the vault's known\n // collections. Optional — when the checker isn't supplied (test\n // wiring, in-process composition) the registration succeeds and\n // any typo surfaces at first onSourceWrite as a no-op.\n if (options?.knownCollections) {\n for (const dep of dependencies) {\n if (!options.knownCollections(dep)) {\n throw new MaterializedViewSourceUnknownError(spec.name, dep)\n }\n }\n }\n\n const outputCollection = spec.output?.collection ?? spec.name\n const queryHash = await computeQueryHash(spec.name, dependencies, queryPlanSummary)\n // For same-collection-as-source MVs, capture the where-clauses on\n // the partition field so cycle detection can prove disjointness.\n // Only applicable to Query<T> shapes — aggregate MVs don't carry\n // a chainable plan to inspect (and same-collection aggregation\n // doesn't make sense for same-collection aggregation).\n const partitionClauses: FieldClause[] = []\n const partitionField = spec.output?.partition?.field\n if (partitionField !== undefined && isQuery) {\n const plan = qAny._plan()\n for (const clause of plan.clauses) {\n if (isFieldClauseOnField(clause, partitionField)) partitionClauses.push(clause)\n }\n }\n // #638 Task 2 — 'aggregate' only for the explicit-sources aggregate shape\n // (groupBy().aggregate() with no chainable plan); a row-per-source-row\n // Query<T> or a unionSources MV is 'record'.\n const grain: Grain = spec.unionSources || isQuery ? 'record' : 'aggregate'\n const reg: RegisteredMV = { spec, outputCollection, dependencies, queryHash, partitionClauses, grain }\n\n this._byName.set(spec.name, reg)\n for (const dep of dependencies) {\n const arr = this._bySource.get(dep)\n if (arr) arr.push(reg)\n else this._bySource.set(dep, [reg])\n }\n }\n\n /** All MVs that depend on `source`, in registration order. */\n mvsForSource(source: string): ReadonlyArray<RegisteredMV> {\n return this._bySource.get(source) ?? []\n }\n\n /** Single MV by name, or `undefined`. */\n byName(name: string): RegisteredMV | undefined {\n return this._byName.get(name)\n }\n\n /** Iterate over every registered MV. */\n all(): ReadonlyArray<RegisteredMV> {\n return [...this._byName.values()]\n }\n\n /**\n * Graph edges for #638 Task 2: one `'mv'` edge per registered MV — target\n * = the output collection (a `WHOLE_RECORD` artifact node), sources =\n * every dependency (also `WHOLE_RECORD` nodes). Same-collection edges\n * (`dep === outputCollection`) are skipped IFF the MV declares an\n * `output.partition` discriminator AND the query has a where-clause that\n * provably excludes the partition value (`partitionDisjoint`) — the SAME\n * condition the old local DFS used. Grain comes from the registration-time\n * `RegisteredMV.grain`.\n */\n edges(): ReadonlyArray<{ readonly target: FieldRef; readonly sources: readonly FieldRef[]; readonly kind: EdgeKind; readonly grain: Grain }> {\n const out: Array<{ target: FieldRef; sources: FieldRef[]; kind: EdgeKind; grain: Grain }> = []\n for (const reg of this._byName.values()) {\n const sources: FieldRef[] = []\n for (const dep of reg.dependencies) {\n if (dep === reg.outputCollection && partitionDisjoint(reg)) continue\n sources.push({ collection: dep, field: WHOLE_RECORD })\n }\n if (sources.length === 0) continue\n out.push({ target: { collection: reg.outputCollection, field: WHOLE_RECORD }, sources, kind: 'mv', grain: reg.grain })\n }\n return out\n }\n\n /**\n * Cycle detection, delegated to `ViaGraph.assertAcyclic()` (#638 Task 2 —\n * retires the local DFS). `graph` is the caller's shared per-vault graph,\n * ALREADY carrying this registry's `edges()` AND `DerivationRegistry`'s\n * (registered by the caller — see `Vault._initMaterializedViews`, which\n * runs after `_initDerivations`, so a pure-derivation cycle already threw\n * `DerivationCycleError` there; any cycle surfacing here necessarily\n * touches an MV edge). Throws `MaterializedViewCycleError` — SAME class as\n * before.\n */\n validate(graph: ViaGraph): void {\n graph.assertAcyclic()\n }\n}\n\n/**\n * Type guard: is the clause a top-level `FieldClause` on the given\n * field? Used by the partition-disjoint check.\n *\n * @internal\n */\nfunction isFieldClauseOnField(clause: Clause, field: string): clause is FieldClause {\n return clause.type === 'field' && clause.field === field\n}\n\n/**\n * Wrap an `MVQueryContext` so its `.collection().query()` returns a\n * Query<T> with the MV's declared predicates attached. Bare Queries\n * (outside of any MV) don't gain `.wherePredicate()` — only Queries\n * obtained through this wrapped db do.\n *\n * @internal\n */\nexport function wrapDbWithPredicates(\n db: MVQueryContext,\n predicates: NonNullable<MaterializedViewStrategy<Record<string, unknown>>['predicates']>,\n): MVQueryContext {\n // Build the predicate map once — the fn signature in the MV spec\n // is row-typed but the QueryBuilder casts to unknown, so we widen\n // here for the Map.\n const map = new Map<string, DeclaredPredicate>()\n for (const [name, decl] of Object.entries(predicates)) {\n map.set(name, {\n hash: decl.hash,\n fn: decl.fn as (record: unknown, ctx?: unknown) => boolean,\n })\n }\n return {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n collection<T extends Record<string, unknown>>(name: string): any {\n const c = db.collection<T>(name)\n // Return an object that delegates everything to `c` but\n // overrides `.query()` to attach predicates via the new\n // `Query._withPredicates()` accessor.\n return new Proxy(c, {\n get(target, prop, receiver) {\n if (prop === 'query') {\n return (...args: unknown[]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const q = (target.query as any)(...args)\n // For non-aggregate Query<T>, attach predicates. For\n // legacy predicate-arg overload that returns T[] (sync\n // filter), pass through unchanged.\n \n if (q && typeof q._withPredicates === 'function') {\n return q._withPredicates(map)\n }\n return q\n }\n }\n return Reflect.get(target, prop, receiver)\n },\n })\n },\n }\n}\n\n/**\n * Walk a QueryPlan's clauses and collect predicate-reference markers\n * for `queryHash` derivation. Returns a sorted array (deterministic\n * order) of `{ name, predicateHash, ctxHash }` tuples — these are the\n * hashable identity of each `.wherePredicate()` call site.\n *\n * @internal\n */\nfunction extractPredicateRefs(\n plan: { clauses: readonly Clause[] },\n): Array<{ name: string; predicateHash: string; ctxHash: string }> {\n const refs: Array<{ name: string; predicateHash: string; ctxHash: string }> = []\n const walk = (clauses: readonly Clause[]): void => {\n for (const c of clauses) {\n if (c.type === 'wherePredicate') {\n refs.push({ name: c.name, predicateHash: c.predicateHash, ctxHash: c.ctxHash })\n } else if (c.type === 'group') {\n walk(c.clauses)\n }\n }\n }\n walk(plan.clauses)\n // Stable-sort by (name, predicateHash, ctxHash) — same predicate\n // appearing twice with different ctx hashes both flow through.\n refs.sort((a, b) => {\n if (a.name !== b.name) return a.name < b.name ? -1 : 1\n if (a.predicateHash !== b.predicateHash) return a.predicateHash < b.predicateHash ? -1 : 1\n return a.ctxHash < b.ctxHash ? -1 : a.ctxHash > b.ctxHash ? 1 : 0\n })\n return refs\n}\n\n/**\n * Provability check for the same-collection partition-discriminator.\n * Returns `true` when\n * the captured partition clauses on the MV's query provably exclude\n * the partition's value — meaning the input filter and the output\n * partition are disjoint and the same-collection edge isn't really a\n * cycle.\n *\n * Supported provability shapes (narrow on purpose — DERIV-PP30-001\n * is the load-bearing case):\n *\n * - `.where(field, '==', X)` where X !== partition.value → disjoint\n * - `.where(field, '!=', partition.value)` → disjoint\n * - `.where(field, 'in', [...])` where partition.value NOT in list → disjoint\n *\n * Anything else (no clause on the partition field, an 'in' list that\n * contains partition.value, unsupported operators) → not disjoint,\n * the cycle detector surfaces `MaterializedViewCycleError`.\n *\n * @internal\n */\nfunction partitionDisjoint(reg: RegisteredMV): boolean {\n const partition = reg.spec.output?.partition\n if (partition === undefined) return false\n const value = partition.value\n // The OR-semantics of multiple where-clauses on the same field\n // would muddy this check. v2 only treats AND-chained clauses;\n // any clause that proves disjoint is sufficient.\n for (const c of reg.partitionClauses) {\n if (c.op === '==' && c.value !== value) return true\n if (c.op === '!=' && c.value === value) return true\n if (c.op === 'in' && Array.isArray(c.value)) {\n const list = c.value as readonly unknown[]\n if (!list.includes(value)) return true\n }\n }\n return false\n}\n"],"mappings":"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","names":[]}