@nicia-ai/typegraph 0.37.0 → 0.38.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 (372) hide show
  1. package/README.md +12 -10
  2. package/dist/backend/drizzle/indexes.cjs +32 -0
  3. package/dist/backend/drizzle/indexes.cjs.map +1 -0
  4. package/dist/backend/drizzle/indexes.d.cts +43 -0
  5. package/dist/backend/drizzle/indexes.d.ts +43 -0
  6. package/dist/backend/drizzle/indexes.js +11 -0
  7. package/dist/backend/drizzle/indexes.js.map +1 -0
  8. package/dist/backend/index.cjs +161 -0
  9. package/dist/backend/index.cjs.map +1 -0
  10. package/dist/backend/index.d.cts +3 -0
  11. package/dist/backend/index.d.ts +3 -0
  12. package/dist/backend/index.js +8 -0
  13. package/dist/backend/index.js.map +1 -0
  14. package/dist/backend/postgres/index.cjs +32 -28
  15. package/dist/backend/postgres/index.d.cts +13 -12
  16. package/dist/backend/postgres/index.d.ts +13 -12
  17. package/dist/backend/postgres/index.js +19 -15
  18. package/dist/backend/postgres/pglite-store.cjs +67 -0
  19. package/dist/backend/postgres/pglite-store.cjs.map +1 -0
  20. package/dist/backend/postgres/pglite-store.d.cts +38 -0
  21. package/dist/backend/postgres/pglite-store.d.ts +38 -0
  22. package/dist/backend/postgres/pglite-store.js +65 -0
  23. package/dist/backend/postgres/pglite-store.js.map +1 -0
  24. package/dist/backend/postgres/pglite.cjs +25 -50
  25. package/dist/backend/postgres/pglite.cjs.map +1 -1
  26. package/dist/backend/postgres/pglite.d.cts +10 -9
  27. package/dist/backend/postgres/pglite.d.ts +10 -9
  28. package/dist/backend/postgres/pglite.js +20 -52
  29. package/dist/backend/postgres/pglite.js.map +1 -1
  30. package/dist/backend/sqlite/index.cjs +29 -25
  31. package/dist/backend/sqlite/index.d.cts +11 -11
  32. package/dist/backend/sqlite/index.d.ts +11 -11
  33. package/dist/backend/sqlite/index.js +17 -13
  34. package/dist/backend/sqlite/libsql.cjs +23 -19
  35. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  36. package/dist/backend/sqlite/libsql.d.cts +9 -10
  37. package/dist/backend/sqlite/libsql.d.ts +9 -10
  38. package/dist/backend/sqlite/libsql.js +19 -15
  39. package/dist/backend/sqlite/libsql.js.map +1 -1
  40. package/dist/backend/sqlite/local-store.cjs +72 -0
  41. package/dist/backend/sqlite/local-store.cjs.map +1 -0
  42. package/dist/backend/sqlite/local-store.d.cts +42 -0
  43. package/dist/backend/sqlite/local-store.d.ts +42 -0
  44. package/dist/backend/sqlite/local-store.js +67 -0
  45. package/dist/backend/sqlite/local-store.js.map +1 -0
  46. package/dist/backend/sqlite/local.cjs +28 -183
  47. package/dist/backend/sqlite/local.cjs.map +1 -1
  48. package/dist/backend/sqlite/local.d.cts +8 -81
  49. package/dist/backend/sqlite/local.d.ts +8 -81
  50. package/dist/backend/sqlite/local.js +20 -180
  51. package/dist/backend/sqlite/local.js.map +1 -1
  52. package/dist/chunk-2EBMPJBO.js +16 -0
  53. package/dist/chunk-2EBMPJBO.js.map +1 -0
  54. package/dist/{chunk-NBP2WTJW.cjs → chunk-2SL7OGPR.cjs} +2900 -1597
  55. package/dist/chunk-2SL7OGPR.cjs.map +1 -0
  56. package/dist/chunk-35S6P5ZU.js +27 -0
  57. package/dist/chunk-35S6P5ZU.js.map +1 -0
  58. package/dist/chunk-3LKL3S6X.js +50 -0
  59. package/dist/chunk-3LKL3S6X.js.map +1 -0
  60. package/dist/chunk-6G5CQ6JX.js +47 -0
  61. package/dist/chunk-6G5CQ6JX.js.map +1 -0
  62. package/dist/chunk-6XDBRDZE.js +312 -0
  63. package/dist/chunk-6XDBRDZE.js.map +1 -0
  64. package/dist/chunk-764JHTLT.cjs +15 -0
  65. package/dist/chunk-764JHTLT.cjs.map +1 -0
  66. package/dist/chunk-76HE7DJP.js +68 -0
  67. package/dist/chunk-76HE7DJP.js.map +1 -0
  68. package/dist/{chunk-VGDDG3XJ.cjs → chunk-7M3NACL3.cjs} +12 -12
  69. package/dist/{chunk-VGDDG3XJ.cjs.map → chunk-7M3NACL3.cjs.map} +1 -1
  70. package/dist/{chunk-NXQFATMF.cjs → chunk-7VLCN3JB.cjs} +153 -123
  71. package/dist/chunk-7VLCN3JB.cjs.map +1 -0
  72. package/dist/{chunk-552KNYQJ.js → chunk-A2FGSWMQ.js} +1907 -607
  73. package/dist/chunk-A2FGSWMQ.js.map +1 -0
  74. package/dist/chunk-AOL64O4Z.js +165 -0
  75. package/dist/chunk-AOL64O4Z.js.map +1 -0
  76. package/dist/{chunk-27SSDCEP.cjs → chunk-B63IFHXR.cjs} +53 -74
  77. package/dist/chunk-B63IFHXR.cjs.map +1 -0
  78. package/dist/{chunk-3XXGYU62.cjs → chunk-BKAKAVRW.cjs} +56 -53
  79. package/dist/chunk-BKAKAVRW.cjs.map +1 -0
  80. package/dist/{chunk-YTSN73ND.js → chunk-BQITNFQJ.js} +3 -3
  81. package/dist/{chunk-YTSN73ND.js.map → chunk-BQITNFQJ.js.map} +1 -1
  82. package/dist/{chunk-NUIG3BCV.cjs → chunk-CQC6VBAF.cjs} +93 -155
  83. package/dist/chunk-CQC6VBAF.cjs.map +1 -0
  84. package/dist/{chunk-6EEO3OVU.cjs → chunk-CWX77JB4.cjs} +22 -59
  85. package/dist/chunk-CWX77JB4.cjs.map +1 -0
  86. package/dist/{chunk-UGZUAYAR.js → chunk-D7PG5D5K.js} +4 -3
  87. package/dist/chunk-D7PG5D5K.js.map +1 -0
  88. package/dist/chunk-DDCIXXOO.js +9 -0
  89. package/dist/chunk-DDCIXXOO.js.map +1 -0
  90. package/dist/chunk-DDCYVIVV.cjs +44 -0
  91. package/dist/chunk-DDCYVIVV.cjs.map +1 -0
  92. package/dist/{chunk-XPCZADMT.cjs → chunk-DOVMTPKE.cjs} +89 -27
  93. package/dist/chunk-DOVMTPKE.cjs.map +1 -0
  94. package/dist/{chunk-5PNMDJ7J.js → chunk-DPNA466P.js} +14 -9
  95. package/dist/chunk-DPNA466P.js.map +1 -0
  96. package/dist/{chunk-BYPOGQWK.js → chunk-DRACN6XG.js} +6 -4
  97. package/dist/chunk-DRACN6XG.js.map +1 -0
  98. package/dist/chunk-E6TXEISH.cjs +175 -0
  99. package/dist/chunk-E6TXEISH.cjs.map +1 -0
  100. package/dist/{chunk-TKT2XHED.js → chunk-E6YZRKMM.js} +13 -12
  101. package/dist/chunk-E6YZRKMM.js.map +1 -0
  102. package/dist/{chunk-3C2RYI6L.cjs → chunk-EOJFGECD.cjs} +11 -11
  103. package/dist/chunk-EOJFGECD.cjs.map +1 -0
  104. package/dist/{chunk-XWV4JT34.js → chunk-ERZ4QPQX.js} +27 -22
  105. package/dist/chunk-ERZ4QPQX.js.map +1 -0
  106. package/dist/{chunk-DFVLCOP6.js → chunk-EZH7FNUS.js} +3 -3
  107. package/dist/{chunk-DFVLCOP6.js.map → chunk-EZH7FNUS.js.map} +1 -1
  108. package/dist/{chunk-WWFHO375.cjs → chunk-FJMPR3OH.cjs} +4 -3
  109. package/dist/chunk-FJMPR3OH.cjs.map +1 -0
  110. package/dist/chunk-FMNUSGZ4.cjs +12 -0
  111. package/dist/chunk-FMNUSGZ4.cjs.map +1 -0
  112. package/dist/{chunk-K3Q3LJY3.js → chunk-G32AO634.js} +201 -100
  113. package/dist/chunk-G32AO634.js.map +1 -0
  114. package/dist/{chunk-EXU3RASM.js → chunk-G3CSQLLT.js} +20 -474
  115. package/dist/chunk-G3CSQLLT.js.map +1 -0
  116. package/dist/chunk-GNPGGLAE.cjs +212 -0
  117. package/dist/chunk-GNPGGLAE.cjs.map +1 -0
  118. package/dist/{chunk-QARBLBXT.cjs → chunk-GUUWKPTK.cjs} +7 -7
  119. package/dist/{chunk-QARBLBXT.cjs.map → chunk-GUUWKPTK.cjs.map} +1 -1
  120. package/dist/chunk-GYA4JRP5.js +31 -0
  121. package/dist/chunk-GYA4JRP5.js.map +1 -0
  122. package/dist/chunk-I6FX7AAG.js +39 -0
  123. package/dist/chunk-I6FX7AAG.js.map +1 -0
  124. package/dist/chunk-IMQKXL4E.cjs +12 -0
  125. package/dist/{chunk-QSXTWU4U.cjs.map → chunk-IMQKXL4E.cjs.map} +1 -1
  126. package/dist/chunk-J6IJARLG.js +94 -0
  127. package/dist/chunk-J6IJARLG.js.map +1 -0
  128. package/dist/{chunk-W63OVYY4.js → chunk-K34OPSJK.js} +3 -3
  129. package/dist/{chunk-W63OVYY4.js.map → chunk-K34OPSJK.js.map} +1 -1
  130. package/dist/{chunk-TGOMW4MB.cjs → chunk-KCLZHYPU.cjs} +110 -109
  131. package/dist/chunk-KCLZHYPU.cjs.map +1 -0
  132. package/dist/{chunk-XGPUQ56G.js → chunk-KFLXWVUJ.js} +4 -38
  133. package/dist/chunk-KFLXWVUJ.js.map +1 -0
  134. package/dist/{chunk-3DS7Z4T4.cjs → chunk-LZ3TVJY4.cjs} +44 -43
  135. package/dist/chunk-LZ3TVJY4.cjs.map +1 -0
  136. package/dist/{chunk-UXLSNRYL.js → chunk-MTNEGGM2.js} +4 -4
  137. package/dist/chunk-MTNEGGM2.js.map +1 -0
  138. package/dist/{chunk-IP3CGGPA.cjs → chunk-N2V3HJFV.cjs} +92 -185
  139. package/dist/chunk-N2V3HJFV.cjs.map +1 -0
  140. package/dist/chunk-NAUA4PW5.cjs +28 -0
  141. package/dist/chunk-NAUA4PW5.cjs.map +1 -0
  142. package/dist/chunk-NMQ6C6TS.cjs +61 -0
  143. package/dist/chunk-NMQ6C6TS.cjs.map +1 -0
  144. package/dist/{chunk-2N6EOBTH.cjs → chunk-NPWACFQJ.cjs} +58 -53
  145. package/dist/chunk-NPWACFQJ.cjs.map +1 -0
  146. package/dist/{chunk-5KEQ74YU.cjs → chunk-NT6ILURI.cjs} +9 -86
  147. package/dist/chunk-NT6ILURI.cjs.map +1 -0
  148. package/dist/chunk-NU23DUSJ.cjs +192 -0
  149. package/dist/chunk-NU23DUSJ.cjs.map +1 -0
  150. package/dist/{chunk-WOJMKB3N.cjs → chunk-NWYCOFEZ.cjs} +1677 -308
  151. package/dist/chunk-NWYCOFEZ.cjs.map +1 -0
  152. package/dist/{chunk-3GH67G4Z.cjs → chunk-O5H62ZWJ.cjs} +4 -42
  153. package/dist/chunk-O5H62ZWJ.cjs.map +1 -0
  154. package/dist/{chunk-3SLPDKHQ.js → chunk-PH4IJ3V5.js} +5 -77
  155. package/dist/chunk-PH4IJ3V5.js.map +1 -0
  156. package/dist/chunk-PWXGB77L.cjs +56 -0
  157. package/dist/chunk-PWXGB77L.cjs.map +1 -0
  158. package/dist/chunk-PZHC5GCD.js +193 -0
  159. package/dist/chunk-PZHC5GCD.js.map +1 -0
  160. package/dist/chunk-QMQLUA66.js +12 -0
  161. package/dist/chunk-QMQLUA66.js.map +1 -0
  162. package/dist/{chunk-5WWVZMVX.js → chunk-QZ7A6HBM.js} +2 -2
  163. package/dist/{chunk-5WWVZMVX.js.map → chunk-QZ7A6HBM.js.map} +1 -1
  164. package/dist/{chunk-VKGKDOKR.js → chunk-RQPRCEIO.js} +1539 -206
  165. package/dist/chunk-RQPRCEIO.js.map +1 -0
  166. package/dist/chunk-RW24SAHI.cjs +74 -0
  167. package/dist/chunk-RW24SAHI.cjs.map +1 -0
  168. package/dist/{chunk-BVRDGYXQ.cjs → chunk-SAFZ6JTI.cjs} +14 -9
  169. package/dist/chunk-SAFZ6JTI.cjs.map +1 -0
  170. package/dist/{chunk-L7HQ2OSI.js → chunk-SCTZRFW5.js} +87 -166
  171. package/dist/chunk-SCTZRFW5.js.map +1 -0
  172. package/dist/{chunk-5KPNWT6X.js → chunk-SDHV2MWU.js} +24 -45
  173. package/dist/chunk-SDHV2MWU.js.map +1 -0
  174. package/dist/chunk-SVJ5GEXW.cjs +45 -0
  175. package/dist/chunk-SVJ5GEXW.cjs.map +1 -0
  176. package/dist/chunk-SVUKGWSN.cjs +102 -0
  177. package/dist/chunk-SVUKGWSN.cjs.map +1 -0
  178. package/dist/chunk-TAUGGLNQ.js +59 -0
  179. package/dist/chunk-TAUGGLNQ.js.map +1 -0
  180. package/dist/{chunk-J4IUSYFF.js → chunk-TE5ZA4VX.js} +69 -27
  181. package/dist/chunk-TE5ZA4VX.js.map +1 -0
  182. package/dist/{chunk-A42GCBGX.cjs → chunk-TRF4EBJT.cjs} +6 -4
  183. package/dist/chunk-TRF4EBJT.cjs.map +1 -0
  184. package/dist/{chunk-KQJ54OG5.js → chunk-U4JDJKPD.js} +19 -56
  185. package/dist/chunk-U4JDJKPD.js.map +1 -0
  186. package/dist/chunk-UH2USOMG.cjs +627 -0
  187. package/dist/chunk-UH2USOMG.cjs.map +1 -0
  188. package/dist/{chunk-RCVLFTCT.js → chunk-UPXDVI3T.js} +13 -12
  189. package/dist/chunk-UPXDVI3T.js.map +1 -0
  190. package/dist/{chunk-5VQM6VWP.cjs → chunk-UWG5GX6E.cjs} +2 -2
  191. package/dist/{chunk-5VQM6VWP.cjs.map → chunk-UWG5GX6E.cjs.map} +1 -1
  192. package/dist/{chunk-3RWZPJKV.js → chunk-VBH7ZXSZ.js} +21 -78
  193. package/dist/chunk-VBH7ZXSZ.js.map +1 -0
  194. package/dist/{chunk-K5UBVGJN.js → chunk-VDYA2HMS.js} +6 -6
  195. package/dist/{chunk-K5UBVGJN.js.map → chunk-VDYA2HMS.js.map} +1 -1
  196. package/dist/chunk-X4PVHAZ6.cjs +83 -0
  197. package/dist/chunk-X4PVHAZ6.cjs.map +1 -0
  198. package/dist/{chunk-UYQMBBWJ.js → chunk-X6CNEA32.js} +23 -20
  199. package/dist/chunk-X6CNEA32.js.map +1 -0
  200. package/dist/chunk-X6RDQ5NB.cjs +335 -0
  201. package/dist/chunk-X6RDQ5NB.cjs.map +1 -0
  202. package/dist/chunk-XD6X7O5R.js +184 -0
  203. package/dist/chunk-XD6X7O5R.js.map +1 -0
  204. package/dist/{chunk-DIQ3AV5W.cjs → chunk-XFY73JWD.cjs} +324 -224
  205. package/dist/chunk-XFY73JWD.cjs.map +1 -0
  206. package/dist/{chunk-DEFQM7JU.cjs → chunk-XRU7V7FF.cjs} +7 -7
  207. package/dist/{chunk-DEFQM7JU.cjs.map → chunk-XRU7V7FF.cjs.map} +1 -1
  208. package/dist/{chunk-TPF25IG6.js → chunk-XZA3Y4YH.js} +3 -3
  209. package/dist/{chunk-TPF25IG6.js.map → chunk-XZA3Y4YH.js.map} +1 -1
  210. package/dist/chunk-Y7M44XEK.js +462 -0
  211. package/dist/chunk-Y7M44XEK.js.map +1 -0
  212. package/dist/{chunk-RRSNR3TP.js → chunk-YIRLBUNN.js} +3 -3
  213. package/dist/{chunk-RRSNR3TP.js.map → chunk-YIRLBUNN.js.map} +1 -1
  214. package/dist/{chunk-IXGYRP2P.js → chunk-YJDSPA5E.js} +79 -49
  215. package/dist/chunk-YJDSPA5E.js.map +1 -0
  216. package/dist/{chunk-JBNOGRKW.cjs → chunk-YLINFV7Z.cjs} +157 -115
  217. package/dist/chunk-YLINFV7Z.cjs.map +1 -0
  218. package/dist/{chunk-QERAIDRJ.js → chunk-Z2PPIVOO.js} +82 -22
  219. package/dist/chunk-Z2PPIVOO.js.map +1 -0
  220. package/dist/chunk-Z5QHVL5U.cjs +12 -0
  221. package/dist/chunk-Z5QHVL5U.cjs.map +1 -0
  222. package/dist/chunk-ZDH3DX3C.cjs +30 -0
  223. package/dist/chunk-ZDH3DX3C.cjs.map +1 -0
  224. package/dist/chunk-ZE6NVENI.js +77 -0
  225. package/dist/chunk-ZE6NVENI.js.map +1 -0
  226. package/dist/chunk-ZHX4KEM7.cjs +49 -0
  227. package/dist/chunk-ZHX4KEM7.cjs.map +1 -0
  228. package/dist/chunk-ZKZAIX42.cjs +479 -0
  229. package/dist/chunk-ZKZAIX42.cjs.map +1 -0
  230. package/dist/{chunk-TEDRJXOG.cjs → chunk-ZY4GXIVN.cjs} +5 -5
  231. package/dist/{chunk-TEDRJXOG.cjs.map → chunk-ZY4GXIVN.cjs.map} +1 -1
  232. package/dist/core/index.cjs +117 -0
  233. package/dist/core/index.cjs.map +1 -0
  234. package/dist/core/index.d.cts +225 -0
  235. package/dist/core/index.d.ts +225 -0
  236. package/dist/core/index.js +12 -0
  237. package/dist/core/index.js.map +1 -0
  238. package/dist/{ddl-CS0KUVwB.d.ts → ddl-Dx3Z0_WC.d.ts} +3 -3
  239. package/dist/{ddl-BD-ZfKeX.d.cts → ddl-J6sDyABg.d.cts} +3 -3
  240. package/dist/define-graph-CzEvA_8F.d.cts +174 -0
  241. package/dist/define-graph-DRo9xpYN.d.ts +174 -0
  242. package/dist/{extension-types-BM2ACfYO.d.cts → extension-types-BLEVH4SG.d.cts} +1 -1
  243. package/dist/{extension-types-BM2ACfYO.d.ts → extension-types-BLEVH4SG.d.ts} +1 -1
  244. package/dist/graph-extension/index.cjs +21 -19
  245. package/dist/graph-extension/index.d.cts +4 -4
  246. package/dist/graph-extension/index.d.ts +4 -4
  247. package/dist/graph-extension/index.js +6 -4
  248. package/dist/graph-merge/index.cjs +265 -214
  249. package/dist/graph-merge/index.cjs.map +1 -1
  250. package/dist/graph-merge/index.d.cts +8 -89
  251. package/dist/graph-merge/index.d.ts +8 -89
  252. package/dist/graph-merge/index.js +141 -90
  253. package/dist/graph-merge/index.js.map +1 -1
  254. package/dist/{index-BeacbPoe.d.ts → index-BD_3TCgh.d.ts} +6 -4
  255. package/dist/{index-BPM59vsg.d.cts → index-BihFPsPu.d.cts} +6 -4
  256. package/dist/{fulltext-strategy-C27vXaeB.d.cts → index-Bq7vSPHy.d.ts} +3195 -2646
  257. package/dist/{fulltext-strategy-DebsMrqg.d.ts → index-CrFL_ENI.d.cts} +3195 -2646
  258. package/dist/index.cjs +326 -315
  259. package/dist/index.cjs.map +1 -1
  260. package/dist/index.d.cts +59 -240
  261. package/dist/index.d.ts +59 -240
  262. package/dist/index.js +46 -79
  263. package/dist/index.js.map +1 -1
  264. package/dist/indexes/index.cjs +26 -38
  265. package/dist/indexes/index.d.cts +6 -41
  266. package/dist/indexes/index.d.ts +6 -41
  267. package/dist/indexes/index.js +14 -10
  268. package/dist/interchange/index.cjs +48 -39
  269. package/dist/interchange/index.cjs.map +1 -1
  270. package/dist/interchange/index.d.cts +7 -8
  271. package/dist/interchange/index.d.ts +7 -8
  272. package/dist/interchange/index.js +23 -14
  273. package/dist/interchange/index.js.map +1 -1
  274. package/dist/local-options-CZ1BnIoF.d.cts +29 -0
  275. package/dist/local-options-CZ1BnIoF.d.ts +29 -0
  276. package/dist/{manager-D00_NXvT.d.ts → manager-CASfhmzV.d.ts} +4 -173
  277. package/dist/{manager-nU1vTJLy.d.cts → manager-nCEJiYBb.d.cts} +4 -173
  278. package/dist/{materialize-indexes-zK2J_flP.d.ts → materialize-indexes-D4iei4Kp.d.ts} +1 -1
  279. package/dist/{materialize-indexes-CuR3gAZb.d.cts → materialize-indexes-ExQ6OrAh.d.cts} +1 -1
  280. package/dist/{postgres-IaBA4RgE.d.ts → postgres-Cl1ZAN1G.d.ts} +1 -1
  281. package/dist/{postgres-YrYmPlaU.d.cts → postgres-DMgIKQU-.d.cts} +1 -1
  282. package/dist/postgres-execution-fKW0qRiN.d.cts +14 -0
  283. package/dist/postgres-execution-fKW0qRiN.d.ts +14 -0
  284. package/dist/profiler/index.cjs +9 -8
  285. package/dist/profiler/index.cjs.map +1 -1
  286. package/dist/profiler/index.d.cts +9 -17
  287. package/dist/profiler/index.d.ts +9 -17
  288. package/dist/profiler/index.js +8 -7
  289. package/dist/profiler/index.js.map +1 -1
  290. package/dist/provenance/index.cjs +61 -55
  291. package/dist/provenance/index.cjs.map +1 -1
  292. package/dist/provenance/index.d.cts +7 -8
  293. package/dist/provenance/index.d.ts +7 -8
  294. package/dist/provenance/index.js +34 -28
  295. package/dist/provenance/index.js.map +1 -1
  296. package/dist/schema/index.cjs +46 -37
  297. package/dist/schema/index.cjs.map +1 -1
  298. package/dist/schema/index.d.cts +8 -10
  299. package/dist/schema/index.d.ts +8 -10
  300. package/dist/schema/index.js +22 -13
  301. package/dist/schema/index.js.map +1 -1
  302. package/dist/{sqlite-BUOHPx7p.d.ts → sqlite-BDkW39aa.d.cts} +1 -1
  303. package/dist/{sqlite-Pp8O19WE.d.cts → sqlite-CYfhvESj.d.ts} +1 -1
  304. package/dist/sqlite-execution-DwbE2a9y.d.cts +32 -0
  305. package/dist/sqlite-execution-DwbE2a9y.d.ts +32 -0
  306. package/dist/{store-view-X96Rd00T.d.cts → store-view-BoHqdHjB.d.cts} +394 -1393
  307. package/dist/{store-view-ANL6mTph.d.ts → store-view-Ctq-3OHy.d.ts} +394 -1393
  308. package/dist/temporal-BC_NQV5Y.d.cts +281 -0
  309. package/dist/temporal-DqtOEo_B.d.ts +281 -0
  310. package/dist/{types-r-Zyq2Hz.d.cts → types-COq3-vMC.d.cts} +2 -2
  311. package/dist/{types-wsvuBgPK.d.ts → types-CUevi_D1.d.ts} +2 -2
  312. package/dist/{where-CJOpJj3a.d.ts → where-BdE_cYtx.d.ts} +5 -5
  313. package/dist/{where-K3uBP33l.d.cts → where-C92TXCzT.d.cts} +5 -5
  314. package/package.json +37 -6
  315. package/dist/chunk-27SSDCEP.cjs.map +0 -1
  316. package/dist/chunk-2N6EOBTH.cjs.map +0 -1
  317. package/dist/chunk-3C2RYI6L.cjs.map +0 -1
  318. package/dist/chunk-3DS7Z4T4.cjs.map +0 -1
  319. package/dist/chunk-3GH67G4Z.cjs.map +0 -1
  320. package/dist/chunk-3RWZPJKV.js.map +0 -1
  321. package/dist/chunk-3SLPDKHQ.js.map +0 -1
  322. package/dist/chunk-3XXGYU62.cjs.map +0 -1
  323. package/dist/chunk-44TA22QT.js +0 -1478
  324. package/dist/chunk-44TA22QT.js.map +0 -1
  325. package/dist/chunk-552KNYQJ.js.map +0 -1
  326. package/dist/chunk-5KEQ74YU.cjs.map +0 -1
  327. package/dist/chunk-5KPNWT6X.js.map +0 -1
  328. package/dist/chunk-5PNMDJ7J.js.map +0 -1
  329. package/dist/chunk-6EEO3OVU.cjs.map +0 -1
  330. package/dist/chunk-7YSP4V4R.cjs +0 -69
  331. package/dist/chunk-7YSP4V4R.cjs.map +0 -1
  332. package/dist/chunk-A42GCBGX.cjs.map +0 -1
  333. package/dist/chunk-BVRDGYXQ.cjs.map +0 -1
  334. package/dist/chunk-BYPOGQWK.js.map +0 -1
  335. package/dist/chunk-CUHM5CWJ.cjs +0 -12
  336. package/dist/chunk-CUHM5CWJ.cjs.map +0 -1
  337. package/dist/chunk-DIQ3AV5W.cjs.map +0 -1
  338. package/dist/chunk-EXU3RASM.js.map +0 -1
  339. package/dist/chunk-IP3CGGPA.cjs.map +0 -1
  340. package/dist/chunk-IPSVVTWT.cjs +0 -1540
  341. package/dist/chunk-IPSVVTWT.cjs.map +0 -1
  342. package/dist/chunk-IXGYRP2P.js.map +0 -1
  343. package/dist/chunk-J4IUSYFF.js.map +0 -1
  344. package/dist/chunk-JBNOGRKW.cjs.map +0 -1
  345. package/dist/chunk-K3Q3LJY3.js.map +0 -1
  346. package/dist/chunk-KQJ54OG5.js.map +0 -1
  347. package/dist/chunk-L7HQ2OSI.js.map +0 -1
  348. package/dist/chunk-M6VES7V6.js +0 -239
  349. package/dist/chunk-M6VES7V6.js.map +0 -1
  350. package/dist/chunk-NBP2WTJW.cjs.map +0 -1
  351. package/dist/chunk-NUIG3BCV.cjs.map +0 -1
  352. package/dist/chunk-NXQFATMF.cjs.map +0 -1
  353. package/dist/chunk-OHMP6N2J.js +0 -47
  354. package/dist/chunk-OHMP6N2J.js.map +0 -1
  355. package/dist/chunk-QERAIDRJ.js.map +0 -1
  356. package/dist/chunk-QSXTWU4U.cjs +0 -12
  357. package/dist/chunk-RCVLFTCT.js.map +0 -1
  358. package/dist/chunk-TGOMW4MB.cjs.map +0 -1
  359. package/dist/chunk-TKT2XHED.js.map +0 -1
  360. package/dist/chunk-UGZUAYAR.js.map +0 -1
  361. package/dist/chunk-UXLSNRYL.js.map +0 -1
  362. package/dist/chunk-UYQMBBWJ.js.map +0 -1
  363. package/dist/chunk-VKGKDOKR.js.map +0 -1
  364. package/dist/chunk-VL2V6PEN.cjs +0 -261
  365. package/dist/chunk-VL2V6PEN.cjs.map +0 -1
  366. package/dist/chunk-WOJMKB3N.cjs.map +0 -1
  367. package/dist/chunk-WWFHO375.cjs.map +0 -1
  368. package/dist/chunk-XGPUQ56G.js.map +0 -1
  369. package/dist/chunk-XGU7DZDA.cjs +0 -1095
  370. package/dist/chunk-XGU7DZDA.cjs.map +0 -1
  371. package/dist/chunk-XPCZADMT.cjs.map +0 -1
  372. package/dist/chunk-XWV4JT34.js.map +0 -1
@@ -1,175 +1,6 @@
1
- import { b as NodeRegistration, E as EdgeRegistration, D as DeleteBehavior, T as TemporalMode, G as GraphExtension, N as NodeType, A as AnyEdgeType, c as GraphDefaults, I as IndexEntity } from './extension-types-BM2ACfYO.cjs';
2
- import { O as OntologyRelation, I as IndexDeclaration, u as SerializedNodeDef, v as SerializedEdgeDef, s as SerializedSchema, H as SchemaVersionRow, G as GraphBackend } from './fulltext-strategy-C27vXaeB.cjs';
3
-
4
- /** Brand key for GraphDef */
5
- declare const GRAPH_DEF_BRAND: "__graphDef";
6
- /**
7
- * An edge entry in the graph definition.
8
- * Can be:
9
- * - EdgeType directly (constrained or unconstrained)
10
- * - EdgeRegistration object (always works, can override/narrow defaults)
11
- */
12
- type EdgeEntry = EdgeRegistration | AnyEdgeType;
13
- /**
14
- * Normalized edge map type - all entries become EdgeRegistration.
15
- * For bare EdgeTypes, constrained endpoints are extracted from the type;
16
- * unconstrained edges fall back to all node types in the graph.
17
- */
18
- type NormalizedEdges<TNodes extends Record<string, NodeRegistration>, TEdges extends Record<string, EdgeEntry>> = {
19
- [K in keyof TEdges]: TEdges[K] extends EdgeRegistration ? TEdges[K] : TEdges[K] extends AnyEdgeType ? EdgeRegistration<TEdges[K], TEdges[K]["from"] extends readonly (infer N extends NodeType)[] ? N : TNodes[keyof TNodes]["type"], TEdges[K]["to"] extends readonly (infer N extends NodeType)[] ? N : TNodes[keyof TNodes]["type"]> : never;
20
- };
21
- /**
22
- * Configuration for defineGraph.
23
- */
24
- type GraphDefConfig<TNodes extends Record<string, NodeRegistration>, TEdges extends Record<string, EdgeEntry>, TOntology extends readonly OntologyRelation[]> = Readonly<{
25
- /** Unique identifier for this graph */
26
- id: string;
27
- /** Node registrations */
28
- nodes: TNodes;
29
- /** Edge registrations or EdgeTypes with built-in domain/range */
30
- edges: TEdges;
31
- /** Ontology relations */
32
- ontology?: TOntology;
33
- /** Graph-wide defaults */
34
- defaults?: GraphDefaults;
35
- /**
36
- * Index declarations attached to this graph.
37
- *
38
- * Accepts the outputs of `defineNodeIndex` / `defineEdgeIndex` (which
39
- * already return `IndexDeclaration` values) or pre-built declarations
40
- * reconstructed from a stored schema or graph extension.
41
- *
42
- * Validated at definition time: every index must reference a `kind`
43
- * that exists in `nodes` / `edges`, and index `name`s must be unique
44
- * within the graph.
45
- *
46
- * Index DDL is **not** generated by `defineGraph`. Indexes flow into
47
- * `SerializedSchema.indexes` so they can later be materialized via
48
- * `store.materializeIndexes()` — lifting the storage concern out of
49
- * the schema-version commit path.
50
- */
51
- indexes?: readonly IndexDeclaration[];
52
- }>;
53
- /**
54
- * A graph definition.
55
- *
56
- * This is a compile-time artifact that describes the structure of a graph.
57
- * Use `createStore()` to create a runtime store from this definition.
58
- */
59
- type GraphDef<TNodes extends Record<string, NodeRegistration> = Record<string, NodeRegistration>, TEdges extends Record<string, EdgeRegistration> = Record<string, EdgeRegistration>, TOntology extends readonly OntologyRelation[] = readonly OntologyRelation[]> = Readonly<{
60
- [GRAPH_DEF_BRAND]: true;
61
- id: string;
62
- nodes: TNodes;
63
- edges: TEdges;
64
- ontology: TOntology;
65
- defaults: Readonly<{
66
- onNodeDelete: DeleteBehavior;
67
- temporalMode: TemporalMode;
68
- }>;
69
- /**
70
- * Index declarations attached to this graph. Preserves whatever the
71
- * caller passed to `defineGraph` (including an explicit empty array)
72
- * for introspection purposes.
73
- *
74
- * The serialized canonical form is order-canonicalized (sorted by
75
- * `name`) and treats `undefined` and `[]` as the same "no slice" form
76
- * — an empty array does not bump the schema hash, since indexes are
77
- * an unordered set keyed by name and `[]` carries no semantic meaning
78
- * that an absent slice doesn't.
79
- */
80
- indexes: readonly IndexDeclaration[] | undefined;
81
- /**
82
- * Graph extension this graph was merged with, if any. Set by
83
- * `mergeGraphExtension`; never set by `defineGraph` directly.
84
- * Exists solely so re-serialization is stable — the rest of the
85
- * system reads the merged kinds through `nodes` / `edges` /
86
- * `ontology` and never inspects this field. Absent on graphs that
87
- * have never been extended; legacy graphs hash byte-identically.
88
- */
89
- extension: GraphExtension | undefined;
90
- /**
91
- * Soft-deprecated kind names attached to this graph. Set by the
92
- * loader from the persisted schema and by `store.deprecateKinds(...)`
93
- * / `store.undeprecateKinds(...)`. A purely informational signal
94
- * surfaced for introspection — does not gate reads, writes, or
95
- * queries. Defaults to the empty set on freshly-defined graphs.
96
- */
97
- deprecatedKinds: ReadonlySet<string>;
98
- }>;
99
- /**
100
- * Extract node kind names from a GraphDef.
101
- */
102
- type NodeKinds<G extends GraphDef> = keyof G["nodes"] & string;
103
- /**
104
- * Extract edge kind names from a GraphDef.
105
- */
106
- type EdgeKinds<G extends GraphDef> = keyof G["edges"] & string;
107
- /**
108
- * Get a NodeType from a GraphDef by kind name.
109
- */
110
- type GetNodeType<G extends GraphDef, K extends NodeKinds<G>> = G["nodes"][K]["type"];
111
- /**
112
- * Get an EdgeType from a GraphDef by kind name.
113
- */
114
- type GetEdgeType<G extends GraphDef, K extends EdgeKinds<G>> = G["edges"][K]["type"];
115
- /**
116
- * Get all NodeTypes from a GraphDef.
117
- */
118
- type AllNodeTypes<G extends GraphDef> = {
119
- [K in NodeKinds<G>]: G["nodes"][K]["type"];
120
- }[NodeKinds<G>];
121
- /**
122
- * Get all EdgeTypes from a GraphDef.
123
- */
124
- type AllEdgeTypes<G extends GraphDef> = {
125
- [K in EdgeKinds<G>]: G["edges"][K]["type"];
126
- }[EdgeKinds<G>];
127
- /**
128
- * Creates a graph definition.
129
- *
130
- * @example
131
- * ```typescript
132
- * const graph = defineGraph({
133
- * id: "my_graph",
134
- * nodes: {
135
- * Person: { type: Person },
136
- * Company: { type: Company },
137
- * },
138
- * edges: {
139
- * // Traditional EdgeRegistration syntax
140
- * worksAt: {
141
- * type: worksAt,
142
- * from: [Person],
143
- * to: [Company],
144
- * cardinality: "many",
145
- * },
146
- * // Or use EdgeType directly if it has from/to defined
147
- * knows, // EdgeType with built-in domain/range
148
- * },
149
- * ontology: [
150
- * subClassOf(Company, Organization),
151
- * disjointWith(Person, Organization),
152
- * ],
153
- * defaults: {
154
- * onNodeDelete: "restrict",
155
- * temporalMode: "current",
156
- * },
157
- * });
158
- * ```
159
- */
160
- declare function defineGraph<const TNodes extends Record<string, NodeRegistration<NodeType>>, const TEdges extends Record<string, EdgeEntry>, const TOntology extends readonly OntologyRelation[]>(config: GraphDefConfig<TNodes, TEdges, TOntology>): GraphDef<TNodes, NormalizedEdges<TNodes, TEdges>, TOntology>;
161
- /**
162
- * Checks if a value is a GraphDef.
163
- */
164
- declare function isGraphDef(value: unknown): value is GraphDef;
165
- /**
166
- * Gets all node kind names from a GraphDef.
167
- */
168
- declare function getNodeKinds<G extends GraphDef>(graph: G): readonly (keyof G["nodes"] & string)[];
169
- /**
170
- * Gets all edge kind names from a GraphDef.
171
- */
172
- declare function getEdgeKinds<G extends GraphDef>(graph: G): readonly (keyof G["edges"] & string)[];
1
+ import { a as NodeType, A as AnyEdgeType, I as IndexEntity } from './extension-types-BLEVH4SG.cjs';
2
+ import { s as SerializedNodeDef, t as SerializedEdgeDef, I as IndexDeclaration, q as SerializedSchema, C as SchemaVersionRow, G as GraphBackend } from './index-CrFL_ENI.cjs';
3
+ import { G as GraphDef } from './define-graph-CzEvA_8F.cjs';
173
4
 
174
5
  /**
175
6
  * KindRegistry holds precomputed closures for ontological reasoning.
@@ -722,4 +553,4 @@ declare function isSchemaInitialized(backend: GraphBackend, graphId: string): Pr
722
553
  */
723
554
  declare function getSchemaChanges<G extends GraphDef>(backend: GraphBackend, graph: G): Promise<SchemaDiff | undefined>;
724
555
 
725
- export { type AllEdgeTypes as A, getNodeKinds as B, type ChangeSeverity as C, type DeprecatedKindsChange as D, type EdgeChange as E, isGraphDef as F, type GraphDef as G, type IndexChange as I, KindRegistry as K, type MigrationHookContext as M, type NodeChange as N, type OntologyChange as O, type SchemaDiff as S, type ChangeType as a, type ExtensionChange as b, type SchemaManagerOptions as c, type SchemaValidationResult as d, applyDeprecatedKinds as e, assertSchemaCurrent as f, computeSchemaDiff as g, ensureSchema as h, getActiveSchema as i, getMigrationActions as j, getSchemaChanges as k, initializeSchema as l, isBackwardsCompatible as m, isSchemaInitialized as n, loadActiveSchemaWithBootstrap as o, loadAndMergeGraphExtensionDocument as p, migrateSchema as q, parseSerializedSchema as r, rollbackSchema as s, type NodeKinds as t, type GetNodeType as u, type AllNodeTypes as v, type EdgeKinds as w, type GetEdgeType as x, defineGraph as y, getEdgeKinds as z };
556
+ export { type ChangeSeverity as C, type DeprecatedKindsChange as D, type EdgeChange as E, type IndexChange as I, KindRegistry as K, type MigrationHookContext as M, type NodeChange as N, type OntologyChange as O, type SchemaManagerOptions as S, type ChangeType as a, type ExtensionChange as b, type SchemaDiff as c, type SchemaValidationResult as d, applyDeprecatedKinds as e, assertSchemaCurrent as f, computeSchemaDiff as g, ensureSchema as h, getActiveSchema as i, getMigrationActions as j, getSchemaChanges as k, initializeSchema as l, isBackwardsCompatible as m, isSchemaInitialized as n, loadActiveSchemaWithBootstrap as o, loadAndMergeGraphExtensionDocument as p, migrateSchema as q, parseSerializedSchema as r, rollbackSchema as s };
@@ -1,4 +1,4 @@
1
- import { I as IndexEntity } from './extension-types-BM2ACfYO.js';
1
+ import { I as IndexEntity } from './extension-types-BLEVH4SG.js';
2
2
 
3
3
  /**
4
4
  * Index materialization — runs declared index DDL against the live
@@ -1,4 +1,4 @@
1
- import { I as IndexEntity } from './extension-types-BM2ACfYO.cjs';
1
+ import { I as IndexEntity } from './extension-types-BLEVH4SG.cjs';
2
2
 
3
3
  /**
4
4
  * Index materialization — runs declared index DDL against the live
@@ -1,5 +1,5 @@
1
1
  import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
2
- import { I as IndexDeclaration } from './fulltext-strategy-DebsMrqg.js';
2
+ import { I as IndexDeclaration } from './index-Bq7vSPHy.js';
3
3
 
4
4
  /**
5
5
  * Table name configuration.
@@ -1,5 +1,5 @@
1
1
  import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
2
- import { I as IndexDeclaration } from './fulltext-strategy-C27vXaeB.cjs';
2
+ import { I as IndexDeclaration } from './index-CrFL_ENI.cjs';
3
3
 
4
4
  /**
5
5
  * Table name configuration.
@@ -0,0 +1,14 @@
1
+ import { PgDatabase, PgQueryResultHKT, PgTransaction } from 'drizzle-orm/pg-core';
2
+ import { ExtractTablesWithRelations } from 'drizzle-orm/relations';
3
+
4
+ type AnyPgDatabase = PgDatabase<PgQueryResultHKT, Record<string, unknown>>;
5
+ /**
6
+ * A driver-agnostic Drizzle PostgreSQL transaction handle.
7
+ *
8
+ * Unlike {@link AnyPgDatabase}, this type cannot be satisfied by a root
9
+ * database. It is the native handle exposed to adapter-aware stores and
10
+ * accepted when adopting a caller-owned PostgreSQL transaction.
11
+ */
12
+ type AnyPgTransaction = PgTransaction<PgQueryResultHKT, Record<string, unknown>, ExtractTablesWithRelations<Record<string, unknown>>>;
13
+
14
+ export type { AnyPgDatabase as A, AnyPgTransaction as a };
@@ -0,0 +1,14 @@
1
+ import { PgDatabase, PgQueryResultHKT, PgTransaction } from 'drizzle-orm/pg-core';
2
+ import { ExtractTablesWithRelations } from 'drizzle-orm/relations';
3
+
4
+ type AnyPgDatabase = PgDatabase<PgQueryResultHKT, Record<string, unknown>>;
5
+ /**
6
+ * A driver-agnostic Drizzle PostgreSQL transaction handle.
7
+ *
8
+ * Unlike {@link AnyPgDatabase}, this type cannot be satisfied by a root
9
+ * database. It is the native handle exposed to adapter-aware stores and
10
+ * accepted when adopting a caller-owned PostgreSQL transaction.
11
+ */
12
+ type AnyPgTransaction = PgTransaction<PgQueryResultHKT, Record<string, unknown>, ExtractTablesWithRelations<Record<string, unknown>>>;
13
+
14
+ export type { AnyPgDatabase as A, AnyPgTransaction as a };
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkWWFHO375_cjs = require('../chunk-WWFHO375.cjs');
4
- require('../chunk-HAHNRASW.cjs');
3
+ var chunkFJMPR3OH_cjs = require('../chunk-FJMPR3OH.cjs');
5
4
  var chunkSJDMVITW_cjs = require('../chunk-SJDMVITW.cjs');
5
+ var chunk764JHTLT_cjs = require('../chunk-764JHTLT.cjs');
6
+ require('../chunk-HAHNRASW.cjs');
6
7
  var chunkTDXIBCGY_cjs = require('../chunk-TDXIBCGY.cjs');
7
8
 
8
9
  // src/profiler/ast-extractor.ts
@@ -221,7 +222,7 @@ function extractTargetFromFieldRef(ref) {
221
222
  return { __type: "prop", pointer: chunkTDXIBCGY_cjs.jsonPointer(ref.path.slice(1)) };
222
223
  }
223
224
  if (ref.path.length === 1) {
224
- return { __type: "system", field: ref.path[0] };
225
+ return { __type: "system", field: chunk764JHTLT_cjs.requireDefined(ref.path[0]) };
225
226
  }
226
227
  return void 0;
227
228
  }
@@ -519,7 +520,7 @@ var QueryProfiler = class {
519
520
  );
520
521
  }
521
522
  this.#attached = true;
522
- this.#schemaIntrospector = chunkWWFHO375_cjs.createSchemaIntrospector(
523
+ this.#schemaIntrospector = chunkFJMPR3OH_cjs.createSchemaIntrospector(
523
524
  buildNodeSchemaMap(store.graph),
524
525
  buildEdgeSchemaMap(store.graph)
525
526
  );
@@ -630,7 +631,7 @@ function resolveAccessPaths(access, schemaIntrospector) {
630
631
  return [
631
632
  {
632
633
  entityType: access.entityType,
633
- kind: kinds[0],
634
+ kind: chunk764JHTLT_cjs.requireDefined(kinds[0]),
634
635
  target: access.target
635
636
  }
636
637
  ];
@@ -639,7 +640,7 @@ function resolveAccessPaths(access, schemaIntrospector) {
639
640
  return [
640
641
  {
641
642
  entityType: access.entityType,
642
- kind: kinds[0],
643
+ kind: chunk764JHTLT_cjs.requireDefined(kinds[0]),
643
644
  target: access.target
644
645
  }
645
646
  ];
@@ -653,7 +654,7 @@ function resolveAccessPaths(access, schemaIntrospector) {
653
654
  pointer
654
655
  )
655
656
  );
656
- const kindsToUse = matchingKinds.length > 0 ? matchingKinds : [kinds[0]];
657
+ const kindsToUse = matchingKinds.length > 0 ? matchingKinds : [chunk764JHTLT_cjs.requireDefined(kinds[0])];
657
658
  return kindsToUse.map((kindName) => ({
658
659
  entityType: access.entityType,
659
660
  kind: kindName,
@@ -677,7 +678,7 @@ function getNodeEnv() {
677
678
  if (typeof process === "undefined") {
678
679
  return void 0;
679
680
  }
680
- return process.env.NODE_ENV;
681
+ return process.env["NODE_ENV"];
681
682
  }
682
683
  function hasPointerInSchema(schemaIntrospector, entityType, kindName, pointer) {
683
684
  const segments = chunkTDXIBCGY_cjs.parseJsonPointer(pointer);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/profiler/ast-extractor.ts","../../src/profiler/collector.ts","../../src/profiler/constants.ts","../../src/profiler/recommendations.ts","../../src/profiler/query-profiler.ts"],"names":["jsonPointer","normalizeJsonPointer","createSchemaIntrospector","parseJsonPointer","resolveFieldTypeInfoAtJsonPointer"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AST Extractor - Extracts property access patterns from QueryAst.\n *\n * Walks the query AST to identify all property accesses and their\n * usage contexts (filter, sort, select, groupBy).\n */\n\nimport {\n type FieldRef,\n type NodePredicate,\n type OrderSpec,\n type PredicateExpression,\n type ProjectedField,\n type QueryAst,\n type SelectiveField,\n} from \"../query/ast\";\nimport { jsonPointer } from \"../query/json-pointer\";\nimport {\n type ProfileEntityType,\n type PropertyTarget,\n type UsageContext,\n} from \"./types\";\n\n// ============================================================\n// Extracted Access Type\n// ============================================================\n\n/**\n * A property access extracted from the AST.\n */\ntype ExtractedAccess = Readonly<{\n /** Whether the access targets nodes or edges */\n entityType: ProfileEntityType;\n /** Expanded kind names for the alias */\n kindNames: readonly string[];\n /** The accessed target (props pointer or system field) */\n target: PropertyTarget;\n /** How the property was used */\n context: UsageContext;\n /** Predicate type if used in a filter (eq, contains, gt, etc.) */\n predicateType?: string;\n}>;\n\n// ============================================================\n// Main Extraction Function\n// ============================================================\n\n/**\n * Extracts all property accesses from a QueryAst.\n *\n * Walks the AST to find all property references and categorizes\n * them by usage context (filter, sort, select, groupBy).\n *\n * @param ast - The query AST to analyze\n * @returns Array of extracted property accesses\n */\nexport function extractPropertyAccesses(\n ast: QueryAst,\n): readonly ExtractedAccess[] {\n const accesses: ExtractedAccess[] = [];\n\n // Extract from predicates (filters)\n for (const predicate of ast.predicates) {\n const extracted = extractFromNodePredicate(predicate, ast);\n accesses.push(...extracted);\n }\n\n // Extract from orderBy (sorts)\n if (ast.orderBy) {\n for (const order of ast.orderBy) {\n const extracted = extractFromOrderSpec(order, ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n }\n\n // Extract from projection (selects)\n for (const field of ast.projection.fields) {\n const extracted = extractFromProjectedField(field, ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n\n // Extract from groupBy\n if (ast.groupBy) {\n for (const field of ast.groupBy.fields) {\n const extracted = extractFromFieldRef(field, \"groupBy\", ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n }\n\n // Extract from having (if it exists)\n if (ast.having) {\n const havingAccesses = extractFromExpression(ast.having, undefined, ast);\n accesses.push(...havingAccesses);\n }\n\n // Extract from selective fields (smart select optimization)\n if (ast.selectiveFields) {\n for (const field of ast.selectiveFields) {\n const extracted = extractFromSelectiveField(field, ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n }\n\n return accesses;\n}\n\n// ============================================================\n// Predicate Extraction\n// ============================================================\n\nfunction extractFromNodePredicate(\n predicate: NodePredicate,\n ast: QueryAst,\n): ExtractedAccess[] {\n return extractFromExpression(\n predicate.expression,\n predicate.targetAlias,\n ast,\n );\n}\n\nfunction extractFromExpression(\n expr: PredicateExpression,\n alias: string | undefined,\n ast: QueryAst,\n): ExtractedAccess[] {\n const accesses: ExtractedAccess[] = [];\n\n switch (expr.__type) {\n case \"comparison\": {\n const extracted = extractFromFieldRef(expr.left, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"string_op\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"null_check\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"between\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"between\" });\n }\n break;\n }\n\n case \"array_op\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"object_op\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"and\":\n case \"or\": {\n for (const sub of expr.predicates) {\n accesses.push(...extractFromExpression(sub, alias, ast));\n }\n break;\n }\n\n case \"not\": {\n accesses.push(...extractFromExpression(expr.predicate, alias, ast));\n break;\n }\n\n case \"aggregate_comparison\": {\n // For aggregate comparisons, extract the field being aggregated\n const extracted = extractFromFieldRef(\n expr.aggregate.field,\n \"filter\",\n ast,\n );\n if (extracted) {\n accesses.push({\n ...extracted,\n predicateType: `${expr.aggregate.function}_${expr.op}`,\n });\n }\n break;\n }\n\n case \"exists\": {\n // Recursively extract from subquery\n const subAccesses = extractPropertyAccesses(expr.subquery);\n accesses.push(...subAccesses);\n break;\n }\n\n case \"in_subquery\": {\n // Extract from the field being checked\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"in_subquery\" });\n }\n // Recursively extract from subquery\n const subAccesses = extractPropertyAccesses(expr.subquery);\n accesses.push(...subAccesses);\n break;\n }\n\n case \"vector_similarity\": {\n // Vector similarity is a special case - the field is an embedding\n // We track it but with a special predicate type\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"vector_similarity\" });\n }\n break;\n }\n\n case \"fulltext_match\": {\n // Fulltext match targets a searchable string field. Track as an\n // index hint so the profiler reports its usage.\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"fulltext_match\" });\n }\n break;\n }\n }\n\n return accesses;\n}\n\n// ============================================================\n// Order/Projection Extraction\n// ============================================================\n\nfunction extractFromOrderSpec(\n order: OrderSpec,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n return extractFromFieldRef(order.field, \"sort\", ast);\n}\n\nfunction extractFromProjectedField(\n field: ProjectedField,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n if (field.source.__type === \"aggregate\") {\n // For aggregates, extract the field being aggregated\n return extractFromFieldRef(field.source.field, \"select\", ast);\n }\n return extractFromFieldRef(field.source, \"select\", ast);\n}\n\n/**\n * Extracts property access from a SelectiveField.\n *\n * SelectiveFields are used by the smart select optimization to track\n * which specific fields were accessed in the select callback.\n */\nfunction extractFromSelectiveField(\n field: SelectiveField,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n // Skip system fields (id, kind, etc.) - they're always indexed\n if (field.isSystemField) {\n return undefined;\n }\n\n const resolved = resolveAliasToKinds(field.alias, ast);\n if (!resolved) {\n return undefined;\n }\n\n return {\n entityType: resolved.entityType,\n kindNames: resolved.kindNames,\n target: {\n __type: \"prop\",\n pointer: jsonPointer(field.field.split(\".\")),\n },\n context: \"select\",\n };\n}\n\n// ============================================================\n// Field Reference Extraction\n// ============================================================\n\nfunction extractFromFieldRef(\n ref: FieldRef,\n context: UsageContext,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n const resolved = resolveAliasToKinds(ref.alias, ast);\n if (!resolved) {\n return undefined;\n }\n\n const target = extractTargetFromFieldRef(ref);\n if (!target) {\n return undefined;\n }\n\n return {\n entityType: resolved.entityType,\n kindNames: resolved.kindNames,\n target,\n context,\n };\n}\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\n/**\n * Resolves an alias to its expanded kind names.\n */\ntype ResolvedAliasKinds = Readonly<{\n entityType: ProfileEntityType;\n kindNames: readonly string[];\n}>;\n\nfunction resolveAliasToKinds(\n alias: string,\n ast: QueryAst,\n): ResolvedAliasKinds | undefined {\n if (ast.start.alias === alias) {\n return { entityType: \"node\", kindNames: ast.start.kinds };\n }\n\n // Check traversals\n for (const traversal of ast.traversals) {\n if (traversal.nodeAlias === alias) {\n return { entityType: \"node\", kindNames: traversal.nodeKinds };\n }\n // Also check edge alias\n if (traversal.edgeAlias === alias) {\n return { entityType: \"edge\", kindNames: traversal.edgeKinds };\n }\n }\n\n return undefined;\n}\n\n/**\n * Extracts the accessed target from a FieldRef.\n */\nfunction extractTargetFromFieldRef(ref: FieldRef): PropertyTarget | undefined {\n if (ref.jsonPointer) {\n return { __type: \"prop\", pointer: ref.jsonPointer };\n }\n\n // For props access without jsonPointer (shouldn't happen normally)\n if (ref.path.length > 1 && ref.path[0] === \"props\") {\n return { __type: \"prop\", pointer: jsonPointer(ref.path.slice(1)) };\n }\n\n if (ref.path.length === 1) {\n return { __type: \"system\", field: ref.path[0]! };\n }\n\n return undefined;\n}\n","/**\n * ProfileCollector - Aggregates property access patterns.\n *\n * Mutable collector that tracks property access patterns across queries\n * and provides immutable snapshots for reporting.\n */\n\nimport {\n type JsonPointerInput,\n normalizeJsonPointer,\n} from \"../query/json-pointer\";\nimport {\n type ProfileEntityType,\n type ProfileSummary,\n type PropertyAccessStats,\n type PropertyPath,\n type UsageContext,\n} from \"./types\";\n\n// ============================================================\n// Serialization Helpers\n// ============================================================\n\n/**\n * Converts a PropertyPath to a string key for Map storage.\n *\n * @example\n * ```typescript\n * pathToKey({\n * entityType: \"node\",\n * kind: \"Person\",\n * target: { __type: \"prop\", pointer: \"/email\" },\n * })\n * // => \"node:Person:/email\"\n * ```\n */\nexport function pathToKey(path: PropertyPath): string {\n const targetKey =\n path.target.__type === \"prop\" ?\n path.target.pointer\n : `$${path.target.field}`;\n return `${path.entityType}:${path.kind}:${targetKey}`;\n}\n\n/**\n * Parses a key back to a PropertyPath.\n *\n * @example\n * ```typescript\n * keyToPath(\"node:Person:/email\")\n * // => { entityType: \"node\", kind: \"Person\", target: { __type: \"prop\", pointer: \"/email\" } }\n * ```\n */\nexport function keyToPath(key: string): PropertyPath {\n const firstColonIndex = key.indexOf(\":\");\n const secondColonIndex =\n firstColonIndex === -1 ? -1 : key.indexOf(\":\", firstColonIndex + 1);\n if (firstColonIndex === -1 || secondColonIndex === -1) {\n throw new Error(\n `Invalid profile key: \"${key}\". Expected format \"{entityType}:{kind}:{target}\".`,\n );\n }\n\n const entityTypePart = key.slice(0, firstColonIndex);\n const kind = key.slice(firstColonIndex + 1, secondColonIndex);\n if (kind === \"\") {\n throw new Error(`Invalid profile key: \"${key}\". Kind must not be empty.`);\n }\n const targetPart = key.slice(secondColonIndex + 1);\n\n const entityType = parseEntityType(entityTypePart);\n\n if (targetPart.startsWith(\"$\")) {\n const systemField = targetPart.slice(1);\n if (systemField === \"\") {\n throw new Error(\n `Invalid profile key: \"${key}\". System field must not be empty.`,\n );\n }\n return {\n entityType,\n kind,\n target: { __type: \"system\", field: systemField },\n };\n }\n\n const pointer = normalizeJsonPointer(\n targetPart as JsonPointerInput<Record<string, unknown>>,\n );\n\n return {\n entityType,\n kind,\n target: { __type: \"prop\", pointer },\n };\n}\n\n// ============================================================\n// Mutable Stats Type\n// ============================================================\n\ninterface MutableStats {\n count: number;\n contexts: Set<UsageContext>;\n predicateTypes: Set<string>;\n firstSeenMs: number;\n lastSeenMs: number;\n}\n\nfunction parseEntityType(value: string): ProfileEntityType {\n if (value === \"node\" || value === \"edge\") {\n return value;\n }\n // This indicates a bug in pathToKey() or data corruption.\n // Throw rather than silently defaulting to avoid incorrect recommendations.\n throw new Error(\n `Invalid entity type in profile key: \"${value}\". Expected \"node\" or \"edge\".`,\n );\n}\n\n// ============================================================\n// ProfileCollector Class\n// ============================================================\n\n/**\n * Collects and aggregates property access patterns.\n *\n * This class is mutable internally but provides immutable snapshots\n * via `getPatterns()` and `getSummary()`.\n *\n * @example\n * ```typescript\n * const collector = new ProfileCollector();\n *\n * collector.record(\n * { nodeKind: \"Person\", fieldPath: [\"email\"] },\n * \"filter\",\n * \"eq\"\n * );\n * collector.recordQuery();\n *\n * const patterns = collector.getPatterns();\n * const summary = collector.getSummary();\n * ```\n */\nexport class ProfileCollector {\n readonly #patterns = new Map<string, MutableStats>();\n readonly #startedAt = new Date();\n #queryCount = 0;\n\n /**\n * Records a property access.\n *\n * @param path - The property path that was accessed\n * @param context - How the property was used (filter, sort, select, groupBy)\n * @param predicateType - Optional predicate type (eq, contains, gt, etc.)\n */\n record(\n path: PropertyPath,\n context: UsageContext,\n predicateType?: string,\n ): void {\n const key = pathToKey(path);\n const existing = this.#patterns.get(key);\n const nowMs = Date.now();\n\n if (existing) {\n existing.count++;\n existing.contexts.add(context);\n if (predicateType) {\n existing.predicateTypes.add(predicateType);\n }\n existing.lastSeenMs = nowMs;\n } else {\n this.#patterns.set(key, {\n count: 1,\n contexts: new Set([context]),\n predicateTypes: predicateType ? new Set([predicateType]) : new Set(),\n firstSeenMs: nowMs,\n lastSeenMs: nowMs,\n });\n }\n }\n\n /**\n * Increments the query count.\n * Call this once per query execution.\n */\n recordQuery(): void {\n this.#queryCount++;\n }\n\n /**\n * Gets all patterns as an immutable map.\n *\n * Returns a new Map with immutable stats objects.\n */\n getPatterns(): ReadonlyMap<string, PropertyAccessStats> {\n const result = new Map<string, PropertyAccessStats>();\n\n for (const [key, stats] of this.#patterns) {\n result.set(key, {\n count: stats.count,\n contexts: new Set(stats.contexts),\n predicateTypes: new Set(stats.predicateTypes),\n firstSeen: new Date(stats.firstSeenMs),\n lastSeen: new Date(stats.lastSeenMs),\n });\n }\n\n return result;\n }\n\n /**\n * Gets summary statistics.\n */\n getSummary(): ProfileSummary {\n return {\n totalQueries: this.#queryCount,\n uniquePatterns: this.#patterns.size,\n startedAt: this.#startedAt,\n durationMs: Date.now() - this.#startedAt.getTime(),\n };\n }\n\n /**\n * Resets all collected data.\n *\n * Note: This does not reset the startedAt timestamp.\n * Create a new ProfileCollector for a fresh session.\n */\n reset(): void {\n this.#patterns.clear();\n this.#queryCount = 0;\n }\n}\n","export const DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION = 3 as const;\nexport const DEFAULT_HIGH_FREQUENCY_THRESHOLD = 10 as const;\nexport const DEFAULT_MEDIUM_FREQUENCY_THRESHOLD = 5 as const;\n","/**\n * Index Recommendations - Generates index suggestions from usage patterns.\n *\n * Analyzes collected property access patterns and generates prioritized\n * recommendations for missing indexes.\n */\n\nimport { keyToPath, pathToKey } from \"./collector\";\nimport {\n DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION,\n} from \"./constants\";\nimport {\n type DeclaredIndex,\n type IndexRecommendation,\n type PropertyAccessStats,\n type PropertyPath,\n type RecommendationPriority,\n} from \"./types\";\n\n// ============================================================\n// Main Functions\n// ============================================================\n\ntype GenerateRecommendationsOptions = Readonly<{\n minFrequencyForRecommendation?: number;\n mediumFrequencyThreshold?: number;\n highFrequencyThreshold?: number;\n}>;\n\n/**\n * Generates index recommendations based on usage patterns.\n *\n * Analyzes property access patterns and returns prioritized recommendations\n * for properties that would benefit from indexing.\n *\n * @param patterns - Collected property access patterns\n * @param declaredIndexes - Indexes that already exist\n * @param options - Threshold configuration (or legacy `minFrequency` number)\n * @returns Sorted array of index recommendations\n */\nexport function generateRecommendations(\n patterns: ReadonlyMap<string, PropertyAccessStats>,\n declaredIndexes: readonly DeclaredIndex[],\n options: number | GenerateRecommendationsOptions = {},\n): readonly IndexRecommendation[] {\n const recommendations: IndexRecommendation[] = [];\n const indexedPaths = buildIndexedPathsSet(declaredIndexes);\n\n const config = normalizeRecommendationsOptions(options);\n\n for (const [key, stats] of patterns) {\n // Only recommend indexes for filter and sort contexts.\n // Select and groupBy contexts are collected for completeness (useful for debugging\n // and future features like covering index suggestions) but don't drive recommendations\n // since they don't benefit from B-tree indexes in the same way.\n const hasFilterOrSort =\n stats.contexts.has(\"filter\") || stats.contexts.has(\"sort\");\n\n if (!hasFilterOrSort) {\n continue;\n }\n\n if (stats.count < config.minFrequencyForRecommendation) {\n continue;\n }\n\n const path = keyToPath(key);\n\n // Skip system fields - they're indexed by TypeGraph and/or not indexable as props.\n if (isSystemField(path)) {\n continue;\n }\n\n // Check if already indexed\n if (isIndexed(path, indexedPaths)) {\n continue;\n }\n\n recommendations.push({\n entityType: path.entityType,\n kind: path.kind,\n fields: path.target.__type === \"prop\" ? [path.target.pointer] : [],\n reason: buildReasonString(stats),\n frequency: stats.count,\n priority: getPriority(stats.count, config),\n });\n }\n\n // Sort by priority (high first), then by frequency (descending)\n return recommendations.toSorted((a, b) => {\n const priorityOrder: Record<RecommendationPriority, number> = {\n high: 0,\n medium: 1,\n low: 2,\n };\n const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n return b.frequency - a.frequency;\n });\n}\n\n/**\n * Gets properties used in filters that lack indexes.\n *\n * Useful for test assertions to ensure all filtered properties are indexed.\n *\n * @param patterns - Collected property access patterns\n * @param declaredIndexes - Indexes that already exist\n * @returns Array of unindexed property paths\n */\nexport function getUnindexedFilters(\n patterns: ReadonlyMap<string, PropertyAccessStats>,\n declaredIndexes: readonly DeclaredIndex[],\n): readonly PropertyPath[] {\n const indexedPaths = buildIndexedPathsSet(declaredIndexes);\n const unindexed: PropertyPath[] = [];\n\n for (const [key, stats] of patterns) {\n // Only check filter context\n if (!stats.contexts.has(\"filter\")) {\n continue;\n }\n\n const path = keyToPath(key);\n\n // Skip system fields\n if (isSystemField(path)) {\n continue;\n }\n\n if (!isIndexed(path, indexedPaths)) {\n unindexed.push(path);\n }\n }\n\n return unindexed;\n}\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\n/**\n * Builds a set of indexed property paths for fast lookup.\n */\nfunction buildIndexedPathsSet(indexes: readonly DeclaredIndex[]): Set<string> {\n const set = new Set<string>();\n\n for (const index of indexes) {\n const firstField = index.fields[0];\n if (!firstField) continue;\n\n // Prefix matching:\n // A composite index on (a, b, c) can be used for predicates on (a).\n set.add(\n pathToKey({\n entityType: index.entityType,\n kind: index.kind,\n target: { __type: \"prop\", pointer: firstField },\n }),\n );\n }\n\n return set;\n}\n\n/**\n * Checks if a property path is covered by an index.\n */\nfunction isIndexed(path: PropertyPath, indexedPaths: Set<string>): boolean {\n return indexedPaths.has(pathToKey(path));\n}\n\n/**\n * Checks if a property path refers to a system field.\n */\nfunction isSystemField(path: PropertyPath): boolean {\n return path.target.__type === \"system\";\n}\n\n/**\n * Builds a human-readable reason string for a recommendation.\n */\nfunction buildReasonString(stats: PropertyAccessStats): string {\n const contexts = [...stats.contexts].join(\", \");\n const predicates = [...stats.predicateTypes];\n\n let reason = `Used in ${contexts}`;\n if (predicates.length > 0) {\n reason += ` with ${predicates.join(\", \")}`;\n }\n reason += ` (${stats.count} ${stats.count === 1 ? \"time\" : \"times\"})`;\n\n return reason;\n}\n\n/**\n * Determines recommendation priority based on access frequency.\n */\ntype NormalizedRecommendationsOptions = Readonly<{\n minFrequencyForRecommendation: number;\n mediumFrequencyThreshold: number;\n highFrequencyThreshold: number;\n}>;\n\nfunction normalizeRecommendationsOptions(\n options: number | GenerateRecommendationsOptions,\n): NormalizedRecommendationsOptions {\n if (typeof options === \"number\") {\n return {\n minFrequencyForRecommendation: options,\n mediumFrequencyThreshold: DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n highFrequencyThreshold: DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n };\n }\n\n return {\n minFrequencyForRecommendation:\n options.minFrequencyForRecommendation ??\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION,\n mediumFrequencyThreshold:\n options.mediumFrequencyThreshold ?? DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n highFrequencyThreshold:\n options.highFrequencyThreshold ?? DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n };\n}\n\nfunction getPriority(\n frequency: number,\n options: NormalizedRecommendationsOptions,\n): RecommendationPriority {\n if (frequency >= options.highFrequencyThreshold) return \"high\";\n if (frequency >= options.mediumFrequencyThreshold) return \"medium\";\n return \"low\";\n}\n","/**\n * QueryProfiler - Main profiler class.\n *\n * Captures query patterns from the AST and generates index recommendations.\n * Uses Proxy to wrap Store and QueryBuilder for transparent interception.\n */\n\nimport { type z } from \"zod\";\n\nimport { type GraphDef } from \"../core/define-graph\";\nimport { type QueryAst } from \"../query/ast\";\nimport { resolveFieldTypeInfoAtJsonPointer } from \"../query/field-type-info\";\nimport {\n type JsonPointer,\n jsonPointer,\n parseJsonPointer,\n} from \"../query/json-pointer\";\nimport {\n createSchemaIntrospector,\n type SchemaIntrospector,\n} from \"../query/schema-introspector\";\nimport { type Store } from \"../store/store\";\nimport { extractPropertyAccesses } from \"./ast-extractor\";\nimport { ProfileCollector } from \"./collector\";\nimport {\n DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION,\n} from \"./constants\";\nimport {\n generateRecommendations,\n getUnindexedFilters,\n} from \"./recommendations\";\nimport {\n type DeclaredIndex,\n type ProfileReport,\n type ProfilerOptions,\n type PropertyPath,\n} from \"./types\";\n\n// ============================================================\n// ProfiledStore Type\n// ============================================================\n\n/**\n * A Store with profiling capabilities.\n *\n * Behaves exactly like a regular Store but tracks all query executions.\n * Access the profiler via the `profiler` property.\n */\nexport type ProfiledStore<G extends GraphDef> = Store<G> & {\n /** The profiler instance attached to this store */\n readonly profiler: QueryProfiler;\n};\n\n// ============================================================\n// QueryProfiler Class\n// ============================================================\n\n/**\n * QueryProfiler captures and analyzes query patterns.\n *\n * Attach to a store to automatically track all query executions,\n * then generate reports with index recommendations.\n *\n * @example\n * ```typescript\n * import { QueryProfiler } from \"@nicia-ai/typegraph/profiler\";\n *\n * const profiler = new QueryProfiler({\n * declaredIndexes: [\n * { nodeKind: \"Person\", fields: [\"email\"], unique: true, name: \"idx_email\" },\n * ],\n * });\n *\n * const profiledStore = profiler.attachToStore(store);\n *\n * // Run queries...\n * await profiledStore.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.email.eq(\"alice@example.com\"))\n * .select((ctx) => ctx.p)\n * .execute();\n *\n * // Get report\n * const report = profiler.getReport();\n * console.log(report.recommendations);\n * ```\n */\nexport class QueryProfiler {\n readonly #collector = new ProfileCollector();\n readonly #declaredIndexes: readonly DeclaredIndex[];\n readonly #minFrequencyForRecommendation: number;\n readonly #mediumFrequencyThreshold: number;\n readonly #highFrequencyThreshold: number;\n #schemaIntrospector: SchemaIntrospector | undefined;\n #attached = false;\n\n constructor(options?: ProfilerOptions) {\n this.#declaredIndexes = options?.declaredIndexes ?? [];\n this.#minFrequencyForRecommendation =\n options?.minFrequencyForRecommendation ??\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION;\n this.#mediumFrequencyThreshold =\n options?.mediumFrequencyThreshold ?? DEFAULT_MEDIUM_FREQUENCY_THRESHOLD;\n this.#highFrequencyThreshold =\n options?.highFrequencyThreshold ?? DEFAULT_HIGH_FREQUENCY_THRESHOLD;\n }\n\n /**\n * Records a query execution from its AST.\n *\n * This is called automatically when attached to a store.\n * Can also be called manually for custom integrations.\n *\n * @param ast - The query AST to analyze\n */\n recordQuery(ast: QueryAst): void {\n this.#collector.recordQuery();\n\n const accesses = extractPropertyAccesses(ast);\n for (const access of accesses) {\n const paths = resolveAccessPaths(access, this.#schemaIntrospector);\n for (const path of paths) {\n this.#collector.record(path, access.context, access.predicateType);\n }\n }\n }\n\n /**\n * Attaches the profiler to a store.\n *\n * Returns a wrapped store that tracks all query executions.\n * The wrapped store behaves identically to the original.\n *\n * @param store - The store to attach to\n * @returns A profiled store with the `profiler` property\n * @throws Error if the profiler is already attached to another store\n */\n attachToStore<G extends GraphDef>(store: Store<G>): ProfiledStore<G> {\n if (this.#attached) {\n throw new Error(\n \"Profiler is already attached. Call detach() first or create a new profiler.\",\n );\n }\n this.#attached = true;\n this.#schemaIntrospector = createSchemaIntrospector(\n buildNodeSchemaMap(store.graph),\n buildEdgeSchemaMap(store.graph),\n );\n return createProfiledStore(store, this);\n }\n\n /**\n * Generates a complete profile report.\n *\n * The report includes:\n * - All property access patterns with frequency and context\n * - Index recommendations sorted by priority\n * - List of unindexed filter properties\n * - Summary statistics\n *\n * @returns The profile report\n */\n getReport(): ProfileReport {\n const patterns = this.#collector.getPatterns();\n const summary = this.#collector.getSummary();\n\n return {\n patterns,\n recommendations: generateRecommendations(\n patterns,\n this.#declaredIndexes,\n {\n minFrequencyForRecommendation: this.#minFrequencyForRecommendation,\n mediumFrequencyThreshold: this.#mediumFrequencyThreshold,\n highFrequencyThreshold: this.#highFrequencyThreshold,\n },\n ),\n summary,\n unindexedFilters: getUnindexedFilters(patterns, this.#declaredIndexes),\n };\n }\n\n /**\n * Checks if all filtered properties are covered by indexes.\n *\n * Throws an error if any filtered properties lack indexes.\n * Useful for test assertions to ensure query performance.\n *\n * @throws Error if unindexed filter properties are found\n *\n * @example\n * ```typescript\n * // In your test file\n * it(\"all filtered properties should be indexed\", () => {\n * profiler.assertIndexCoverage();\n * });\n * ```\n */\n assertIndexCoverage(): void {\n const report = this.getReport();\n if (report.unindexedFilters.length > 0) {\n const missing = report.unindexedFilters\n .map((p) => formatPropertyPath(p))\n .join(\", \");\n throw new Error(`Unindexed filter properties: ${missing}`);\n }\n }\n\n /**\n * Resets all collected data.\n *\n * Clears patterns and query count. Useful for starting a fresh\n * profiling session without creating a new profiler instance.\n */\n reset(): void {\n this.#collector.reset();\n }\n\n /**\n * Marks the profiler as detached.\n *\n * Call this when you're done profiling to allow reattachment\n * to the same or a different store.\n */\n detach(): void {\n this.#attached = false;\n this.#schemaIntrospector = undefined;\n }\n\n /**\n * Whether the profiler is currently attached to a store.\n */\n get isAttached(): boolean {\n return this.#attached;\n }\n}\n\nfunction buildNodeSchemaMap(\n graph: GraphDef,\n): ReadonlyMap<string, Readonly<{ schema: z.ZodType }>> {\n const entries = Object.values(graph.nodes).map(\n (n) => [n.type.kind, { schema: n.type.schema }] as const,\n );\n return new Map(entries);\n}\n\nfunction buildEdgeSchemaMap(\n graph: GraphDef,\n): ReadonlyMap<string, Readonly<{ schema: z.ZodType }>> {\n const entries = Object.values(graph.edges).map(\n (edgeRegistration) =>\n [\n edgeRegistration.type.kind,\n { schema: edgeRegistration.type.schema },\n ] as const,\n );\n return new Map(entries);\n}\n\nfunction resolveAccessPaths(\n access: ReturnType<typeof extractPropertyAccesses>[number],\n schemaIntrospector: SchemaIntrospector | undefined,\n): readonly PropertyPath[] {\n const kinds = access.kindNames;\n if (kinds.length === 0) {\n // This indicates a bug in the AST extractor - aliases should always resolve to kinds.\n // Log warning and skip rather than silently dropping data.\n warnInDevelopment(\n `[QueryProfiler] Access pattern has empty kindNames for context \"${access.context}\". ` +\n `This may indicate a bug in alias resolution.`,\n );\n return [];\n }\n\n if (!schemaIntrospector) {\n return [\n {\n entityType: access.entityType,\n kind: kinds[0]!,\n target: access.target,\n },\n ];\n }\n\n if (access.target.__type !== \"prop\") {\n return [\n {\n entityType: access.entityType,\n kind: kinds[0]!,\n target: access.target,\n },\n ];\n }\n\n const pointer = access.target.pointer;\n const matchingKinds = kinds.filter((kindName) =>\n hasPointerInSchema(\n schemaIntrospector,\n access.entityType,\n kindName,\n pointer,\n ),\n );\n\n const kindsToUse = matchingKinds.length > 0 ? matchingKinds : [kinds[0]!];\n\n return kindsToUse.map((kindName) => ({\n entityType: access.entityType,\n kind: kindName,\n target: access.target,\n }));\n}\n\nfunction warnInDevelopment(message: string, details?: unknown): void {\n if (!isDevelopmentEnvironment()) {\n return;\n }\n if (details !== undefined) {\n console.warn(message, details);\n return;\n }\n console.warn(message);\n}\n\nfunction isDevelopmentEnvironment(): boolean {\n return getNodeEnv() !== \"production\";\n}\n\nfunction getNodeEnv(): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n return process.env.NODE_ENV;\n}\n\n/**\n * Checks whether a JSON pointer exists in the schema for the given kind.\n *\n * This is used to attribute multi-kind aliases (includeSubClasses) to the most\n * relevant concrete kinds by verifying that the accessed pointer exists.\n *\n * Returns false on missing fields or invalid pointers.\n */\nfunction hasPointerInSchema(\n schemaIntrospector: SchemaIntrospector,\n entityType: PropertyPath[\"entityType\"],\n kindName: string,\n pointer: JsonPointer,\n): boolean {\n const segments = parseJsonPointer(pointer);\n const [first, ...rest] = segments;\n if (!first) {\n return false;\n }\n\n const rootInfo =\n entityType === \"node\" ?\n schemaIntrospector.getFieldTypeInfo(kindName, first)\n : schemaIntrospector.getEdgeFieldTypeInfo(kindName, first);\n\n if (!rootInfo) {\n return false;\n }\n\n if (rest.length === 0) {\n return true;\n }\n\n try {\n const resolved = resolveFieldTypeInfoAtJsonPointer(\n rootInfo,\n jsonPointer(rest),\n );\n return resolved !== undefined;\n } catch (error) {\n warnInDevelopment(\n `[QueryProfiler] Failed to resolve pointer \"${pointer}\" for ${entityType} kind \"${kindName}\".`,\n error,\n );\n return false;\n }\n}\n\nfunction formatPropertyPath(path: PropertyPath): string {\n const target =\n path.target.__type === \"prop\" ?\n (path.target.pointer as string)\n : `$${path.target.field}`;\n return `${path.entityType}:${path.kind}:${target}`;\n}\n\n// ============================================================\n// Proxy Implementation\n// ============================================================\n\n/**\n * Creates a profiled store wrapper using Proxy.\n */\nfunction createProfiledStore<G extends GraphDef>(\n store: Store<G>,\n profiler: QueryProfiler,\n): ProfiledStore<G> {\n const storeProxyHandler: ProxyHandler<Store<G>> = {\n get(target, property, _receiver) {\n // Add profiler property\n if (property === \"profiler\") {\n return profiler;\n }\n\n // Wrap query() method\n if (property === \"query\") {\n return () => {\n const builder = target.query();\n return wrapQueryBuilder(builder, profiler);\n };\n }\n\n // IMPORTANT: Store is a class with private fields; accessors and methods\n // must be invoked with `this === target`, not the proxy receiver.\n const value: unknown = Reflect.get(target, property, target);\n\n // Bind functions to the target to preserve private field access.\n if (typeof value === \"function\") {\n return (value as (...args: unknown[]) => unknown).bind(target);\n }\n\n return value;\n },\n };\n\n return new Proxy(store, storeProxyHandler) as ProfiledStore<G>;\n}\n\n/**\n * Wraps a query builder to intercept method calls.\n *\n * The builder returns new builders for most methods, and returns\n * ExecutableQuery for select/aggregate. We need to recursively\n * wrap to ensure all paths lead to wrapped ExecutableQueries.\n */\nfunction wrapQueryBuilder<T extends object>(\n builder: T,\n profiler: QueryProfiler,\n): T {\n const builderProxyHandler: ProxyHandler<T> = {\n get(target, property, receiver) {\n const value: unknown = Reflect.get(target, property, receiver);\n\n // Not a function - return as-is\n if (typeof value !== \"function\") {\n return value;\n }\n\n // Wrap the method to intercept results\n return (...args: unknown[]): unknown => {\n const result: unknown = (\n value as (...args: unknown[]) => unknown\n ).apply(target, args);\n\n // If result is null/undefined or primitive, return as-is\n if (result === null || typeof result !== \"object\") {\n return result;\n }\n\n // Check if result is an ExecutableQuery (has toAst and execute)\n if (hasExecutableQueryShape(result)) {\n return wrapExecutableQuery(result, profiler);\n }\n\n // Check if result is a builder (has from, select, whereNode, etc.)\n if (hasQueryBuilderShape(result)) {\n return wrapQueryBuilder(result, profiler);\n }\n\n // Otherwise return as-is (e.g., compile() returns SQL)\n return result;\n };\n },\n };\n\n return new Proxy(builder, builderProxyHandler);\n}\n\n/**\n * Wraps an ExecutableQuery to intercept execute(), paginate(), stream().\n */\nfunction wrapExecutableQuery<T extends object>(\n query: T,\n profiler: QueryProfiler,\n): T {\n const executableQueryProxyHandler: ProxyHandler<T> = {\n get(target, property, receiver) {\n const value: unknown = Reflect.get(target, property, receiver);\n\n // Not a function - return as-is\n if (typeof value !== \"function\") {\n return value;\n }\n\n const fn = value as (...args: unknown[]) => unknown;\n\n // Always bind `this` to the original instance to preserve private fields.\n return (...args: unknown[]): unknown => {\n // Intercept execute, paginate, stream\n if (\n property === \"execute\" ||\n property === \"paginate\" ||\n property === \"stream\"\n ) {\n const toAst = Reflect.get(\n target,\n \"toAst\",\n receiver,\n ) as () => QueryAst;\n const ast = toAst.call(target);\n profiler.recordQuery(ast);\n }\n\n const result: unknown = fn.apply(target, args);\n\n // Any method that returns an ExecutableQuery-shaped object should remain wrapped.\n // Using duck-typing rather than a method whitelist ensures new chainable methods\n // (e.g., orderBy, limit, offset, pipe, union, intersect, etc.) are automatically handled.\n if (\n result &&\n typeof result === \"object\" &&\n hasExecutableQueryShape(result)\n ) {\n return wrapExecutableQuery(result, profiler);\n }\n\n return result;\n };\n },\n };\n\n return new Proxy(query, executableQueryProxyHandler);\n}\n\n// ============================================================\n// Type Guards\n// ============================================================\n\n/**\n * Checks if an object looks like an ExecutableQuery.\n */\nfunction hasExecutableQueryShape(object: object): boolean {\n return (\n \"toAst\" in object &&\n typeof object.toAst === \"function\" &&\n \"execute\" in object &&\n typeof object.execute === \"function\"\n );\n}\n\n/**\n * Checks if an object looks like a QueryBuilder or TraversalBuilder.\n * Covers both the main query builder and traversal/edge builder chains.\n */\nfunction hasQueryBuilderShape(object: object): boolean {\n return (\n (\"from\" in object && typeof object.from === \"function\") ||\n (\"select\" in object && typeof object.select === \"function\") ||\n (\"whereNode\" in object && typeof object.whereNode === \"function\") ||\n (\"traverse\" in object && typeof object.traverse === \"function\") ||\n // Traversal builder methods\n (\"whereEdge\" in object && typeof object.whereEdge === \"function\") ||\n (\"to\" in object && typeof object.to === \"function\")\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/profiler/ast-extractor.ts","../../src/profiler/collector.ts","../../src/profiler/constants.ts","../../src/profiler/recommendations.ts","../../src/profiler/query-profiler.ts"],"names":["jsonPointer","requireDefined","normalizeJsonPointer","createSchemaIntrospector","parseJsonPointer","resolveFieldTypeInfoAtJsonPointer"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AST Extractor - Extracts property access patterns from QueryAst.\n *\n * Walks the query AST to identify all property accesses and their\n * usage contexts (filter, sort, select, groupBy).\n */\nimport {\n type FieldRef,\n type NodePredicate,\n type OrderSpec,\n type PredicateExpression,\n type ProjectedField,\n type QueryAst,\n type SelectiveField,\n} from \"../query/ast\";\nimport { jsonPointer } from \"../query/json-pointer\";\nimport { requireDefined } from \"../utils/presence\";\nimport {\n type ProfileEntityType,\n type PropertyTarget,\n type UsageContext,\n} from \"./types\";\n\n// ============================================================\n// Extracted Access Type\n// ============================================================\n\n/**\n * A property access extracted from the AST.\n */\ntype ExtractedAccess = Readonly<{\n /** Whether the access targets nodes or edges */\n entityType: ProfileEntityType;\n /** Expanded kind names for the alias */\n kindNames: readonly string[];\n /** The accessed target (props pointer or system field) */\n target: PropertyTarget;\n /** How the property was used */\n context: UsageContext;\n /** Predicate type if used in a filter (eq, contains, gt, etc.) */\n predicateType?: string;\n}>;\n\n// ============================================================\n// Main Extraction Function\n// ============================================================\n\n/**\n * Extracts all property accesses from a QueryAst.\n *\n * Walks the AST to find all property references and categorizes\n * them by usage context (filter, sort, select, groupBy).\n *\n * @param ast - The query AST to analyze\n * @returns Array of extracted property accesses\n */\nexport function extractPropertyAccesses(\n ast: QueryAst,\n): readonly ExtractedAccess[] {\n const accesses: ExtractedAccess[] = [];\n\n // Extract from predicates (filters)\n for (const predicate of ast.predicates) {\n const extracted = extractFromNodePredicate(predicate, ast);\n accesses.push(...extracted);\n }\n\n // Extract from orderBy (sorts)\n if (ast.orderBy) {\n for (const order of ast.orderBy) {\n const extracted = extractFromOrderSpec(order, ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n }\n\n // Extract from projection (selects)\n for (const field of ast.projection.fields) {\n const extracted = extractFromProjectedField(field, ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n\n // Extract from groupBy\n if (ast.groupBy) {\n for (const field of ast.groupBy.fields) {\n const extracted = extractFromFieldRef(field, \"groupBy\", ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n }\n\n // Extract from having (if it exists)\n if (ast.having) {\n const havingAccesses = extractFromExpression(ast.having, undefined, ast);\n accesses.push(...havingAccesses);\n }\n\n // Extract from selective fields (smart select optimization)\n if (ast.selectiveFields) {\n for (const field of ast.selectiveFields) {\n const extracted = extractFromSelectiveField(field, ast);\n if (extracted) {\n accesses.push(extracted);\n }\n }\n }\n\n return accesses;\n}\n\n// ============================================================\n// Predicate Extraction\n// ============================================================\n\nfunction extractFromNodePredicate(\n predicate: NodePredicate,\n ast: QueryAst,\n): ExtractedAccess[] {\n return extractFromExpression(\n predicate.expression,\n predicate.targetAlias,\n ast,\n );\n}\n\nfunction extractFromExpression(\n expr: PredicateExpression,\n alias: string | undefined,\n ast: QueryAst,\n): ExtractedAccess[] {\n const accesses: ExtractedAccess[] = [];\n\n switch (expr.__type) {\n case \"comparison\": {\n const extracted = extractFromFieldRef(expr.left, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"string_op\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"null_check\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"between\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"between\" });\n }\n break;\n }\n\n case \"array_op\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"object_op\": {\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: expr.op });\n }\n break;\n }\n\n case \"and\":\n case \"or\": {\n for (const sub of expr.predicates) {\n accesses.push(...extractFromExpression(sub, alias, ast));\n }\n break;\n }\n\n case \"not\": {\n accesses.push(...extractFromExpression(expr.predicate, alias, ast));\n break;\n }\n\n case \"aggregate_comparison\": {\n // For aggregate comparisons, extract the field being aggregated\n const extracted = extractFromFieldRef(\n expr.aggregate.field,\n \"filter\",\n ast,\n );\n if (extracted) {\n accesses.push({\n ...extracted,\n predicateType: `${expr.aggregate.function}_${expr.op}`,\n });\n }\n break;\n }\n\n case \"exists\": {\n // Recursively extract from subquery\n const subAccesses = extractPropertyAccesses(expr.subquery);\n accesses.push(...subAccesses);\n break;\n }\n\n case \"in_subquery\": {\n // Extract from the field being checked\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"in_subquery\" });\n }\n // Recursively extract from subquery\n const subAccesses = extractPropertyAccesses(expr.subquery);\n accesses.push(...subAccesses);\n break;\n }\n\n case \"vector_similarity\": {\n // Vector similarity is a special case - the field is an embedding\n // We track it but with a special predicate type\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"vector_similarity\" });\n }\n break;\n }\n\n case \"fulltext_match\": {\n // Fulltext match targets a searchable string field. Track as an\n // index hint so the profiler reports its usage.\n const extracted = extractFromFieldRef(expr.field, \"filter\", ast);\n if (extracted) {\n accesses.push({ ...extracted, predicateType: \"fulltext_match\" });\n }\n break;\n }\n }\n\n return accesses;\n}\n\n// ============================================================\n// Order/Projection Extraction\n// ============================================================\n\nfunction extractFromOrderSpec(\n order: OrderSpec,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n return extractFromFieldRef(order.field, \"sort\", ast);\n}\n\nfunction extractFromProjectedField(\n field: ProjectedField,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n if (field.source.__type === \"aggregate\") {\n // For aggregates, extract the field being aggregated\n return extractFromFieldRef(field.source.field, \"select\", ast);\n }\n return extractFromFieldRef(field.source, \"select\", ast);\n}\n\n/**\n * Extracts property access from a SelectiveField.\n *\n * SelectiveFields are used by the smart select optimization to track\n * which specific fields were accessed in the select callback.\n */\nfunction extractFromSelectiveField(\n field: SelectiveField,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n // Skip system fields (id, kind, etc.) - they're always indexed\n if (field.isSystemField) {\n return undefined;\n }\n\n const resolved = resolveAliasToKinds(field.alias, ast);\n if (!resolved) {\n return undefined;\n }\n\n return {\n entityType: resolved.entityType,\n kindNames: resolved.kindNames,\n target: {\n __type: \"prop\",\n pointer: jsonPointer(field.field.split(\".\")),\n },\n context: \"select\",\n };\n}\n\n// ============================================================\n// Field Reference Extraction\n// ============================================================\n\nfunction extractFromFieldRef(\n ref: FieldRef,\n context: UsageContext,\n ast: QueryAst,\n): ExtractedAccess | undefined {\n const resolved = resolveAliasToKinds(ref.alias, ast);\n if (!resolved) {\n return undefined;\n }\n\n const target = extractTargetFromFieldRef(ref);\n if (!target) {\n return undefined;\n }\n\n return {\n entityType: resolved.entityType,\n kindNames: resolved.kindNames,\n target,\n context,\n };\n}\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\n/**\n * Resolves an alias to its expanded kind names.\n */\ntype ResolvedAliasKinds = Readonly<{\n entityType: ProfileEntityType;\n kindNames: readonly string[];\n}>;\n\nfunction resolveAliasToKinds(\n alias: string,\n ast: QueryAst,\n): ResolvedAliasKinds | undefined {\n if (ast.start.alias === alias) {\n return { entityType: \"node\", kindNames: ast.start.kinds };\n }\n\n // Check traversals\n for (const traversal of ast.traversals) {\n if (traversal.nodeAlias === alias) {\n return { entityType: \"node\", kindNames: traversal.nodeKinds };\n }\n // Also check edge alias\n if (traversal.edgeAlias === alias) {\n return { entityType: \"edge\", kindNames: traversal.edgeKinds };\n }\n }\n\n return undefined;\n}\n\n/**\n * Extracts the accessed target from a FieldRef.\n */\nfunction extractTargetFromFieldRef(ref: FieldRef): PropertyTarget | undefined {\n if (ref.jsonPointer) {\n return { __type: \"prop\", pointer: ref.jsonPointer };\n }\n\n // For props access without jsonPointer (shouldn't happen normally)\n if (ref.path.length > 1 && ref.path[0] === \"props\") {\n return { __type: \"prop\", pointer: jsonPointer(ref.path.slice(1)) };\n }\n\n if (ref.path.length === 1) {\n return { __type: \"system\", field: requireDefined(ref.path[0]) };\n }\n\n return undefined;\n}\n","/**\n * ProfileCollector - Aggregates property access patterns.\n *\n * Mutable collector that tracks property access patterns across queries\n * and provides immutable snapshots for reporting.\n */\n\nimport {\n type JsonPointerInput,\n normalizeJsonPointer,\n} from \"../query/json-pointer\";\nimport {\n type ProfileEntityType,\n type ProfileSummary,\n type PropertyAccessStats,\n type PropertyPath,\n type UsageContext,\n} from \"./types\";\n\n// ============================================================\n// Serialization Helpers\n// ============================================================\n\n/**\n * Converts a PropertyPath to a string key for Map storage.\n *\n * @example\n * ```typescript\n * pathToKey({\n * entityType: \"node\",\n * kind: \"Person\",\n * target: { __type: \"prop\", pointer: \"/email\" },\n * })\n * // => \"node:Person:/email\"\n * ```\n */\nexport function pathToKey(path: PropertyPath): string {\n const targetKey =\n path.target.__type === \"prop\" ?\n path.target.pointer\n : `$${path.target.field}`;\n return `${path.entityType}:${path.kind}:${targetKey}`;\n}\n\n/**\n * Parses a key back to a PropertyPath.\n *\n * @example\n * ```typescript\n * keyToPath(\"node:Person:/email\")\n * // => { entityType: \"node\", kind: \"Person\", target: { __type: \"prop\", pointer: \"/email\" } }\n * ```\n */\nexport function keyToPath(key: string): PropertyPath {\n const firstColonIndex = key.indexOf(\":\");\n const secondColonIndex =\n firstColonIndex === -1 ? -1 : key.indexOf(\":\", firstColonIndex + 1);\n if (firstColonIndex === -1 || secondColonIndex === -1) {\n throw new Error(\n `Invalid profile key: \"${key}\". Expected format \"{entityType}:{kind}:{target}\".`,\n );\n }\n\n const entityTypePart = key.slice(0, firstColonIndex);\n const kind = key.slice(firstColonIndex + 1, secondColonIndex);\n if (kind === \"\") {\n throw new Error(`Invalid profile key: \"${key}\". Kind must not be empty.`);\n }\n const targetPart = key.slice(secondColonIndex + 1);\n\n const entityType = parseEntityType(entityTypePart);\n\n if (targetPart.startsWith(\"$\")) {\n const systemField = targetPart.slice(1);\n if (systemField === \"\") {\n throw new Error(\n `Invalid profile key: \"${key}\". System field must not be empty.`,\n );\n }\n return {\n entityType,\n kind,\n target: { __type: \"system\", field: systemField },\n };\n }\n\n const pointer = normalizeJsonPointer(\n targetPart as JsonPointerInput<Record<string, unknown>>,\n );\n\n return {\n entityType,\n kind,\n target: { __type: \"prop\", pointer },\n };\n}\n\n// ============================================================\n// Mutable Stats Type\n// ============================================================\n\ninterface MutableStats {\n count: number;\n contexts: Set<UsageContext>;\n predicateTypes: Set<string>;\n firstSeenMs: number;\n lastSeenMs: number;\n}\n\nfunction parseEntityType(value: string): ProfileEntityType {\n if (value === \"node\" || value === \"edge\") {\n return value;\n }\n // This indicates a bug in pathToKey() or data corruption.\n // Throw rather than silently defaulting to avoid incorrect recommendations.\n throw new Error(\n `Invalid entity type in profile key: \"${value}\". Expected \"node\" or \"edge\".`,\n );\n}\n\n// ============================================================\n// ProfileCollector Class\n// ============================================================\n\n/**\n * Collects and aggregates property access patterns.\n *\n * This class is mutable internally but provides immutable snapshots\n * via `getPatterns()` and `getSummary()`.\n *\n * @example\n * ```typescript\n * const collector = new ProfileCollector();\n *\n * collector.record(\n * { nodeKind: \"Person\", fieldPath: [\"email\"] },\n * \"filter\",\n * \"eq\"\n * );\n * collector.recordQuery();\n *\n * const patterns = collector.getPatterns();\n * const summary = collector.getSummary();\n * ```\n */\nexport class ProfileCollector {\n readonly #patterns = new Map<string, MutableStats>();\n readonly #startedAt = new Date();\n #queryCount = 0;\n\n /**\n * Records a property access.\n *\n * @param path - The property path that was accessed\n * @param context - How the property was used (filter, sort, select, groupBy)\n * @param predicateType - Optional predicate type (eq, contains, gt, etc.)\n */\n record(\n path: PropertyPath,\n context: UsageContext,\n predicateType?: string,\n ): void {\n const key = pathToKey(path);\n const existing = this.#patterns.get(key);\n const nowMs = Date.now();\n\n if (existing) {\n existing.count++;\n existing.contexts.add(context);\n if (predicateType) {\n existing.predicateTypes.add(predicateType);\n }\n existing.lastSeenMs = nowMs;\n } else {\n this.#patterns.set(key, {\n count: 1,\n contexts: new Set([context]),\n predicateTypes: predicateType ? new Set([predicateType]) : new Set(),\n firstSeenMs: nowMs,\n lastSeenMs: nowMs,\n });\n }\n }\n\n /**\n * Increments the query count.\n * Call this once per query execution.\n */\n recordQuery(): void {\n this.#queryCount++;\n }\n\n /**\n * Gets all patterns as an immutable map.\n *\n * Returns a new Map with immutable stats objects.\n */\n getPatterns(): ReadonlyMap<string, PropertyAccessStats> {\n const result = new Map<string, PropertyAccessStats>();\n\n for (const [key, stats] of this.#patterns) {\n result.set(key, {\n count: stats.count,\n contexts: new Set(stats.contexts),\n predicateTypes: new Set(stats.predicateTypes),\n firstSeen: new Date(stats.firstSeenMs),\n lastSeen: new Date(stats.lastSeenMs),\n });\n }\n\n return result;\n }\n\n /**\n * Gets summary statistics.\n */\n getSummary(): ProfileSummary {\n return {\n totalQueries: this.#queryCount,\n uniquePatterns: this.#patterns.size,\n startedAt: this.#startedAt,\n durationMs: Date.now() - this.#startedAt.getTime(),\n };\n }\n\n /**\n * Resets all collected data.\n *\n * Note: This does not reset the startedAt timestamp.\n * Create a new ProfileCollector for a fresh session.\n */\n reset(): void {\n this.#patterns.clear();\n this.#queryCount = 0;\n }\n}\n","export const DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION = 3 as const;\nexport const DEFAULT_HIGH_FREQUENCY_THRESHOLD = 10 as const;\nexport const DEFAULT_MEDIUM_FREQUENCY_THRESHOLD = 5 as const;\n","/**\n * Index Recommendations - Generates index suggestions from usage patterns.\n *\n * Analyzes collected property access patterns and generates prioritized\n * recommendations for missing indexes.\n */\n\nimport { keyToPath, pathToKey } from \"./collector\";\nimport {\n DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION,\n} from \"./constants\";\nimport {\n type DeclaredIndex,\n type IndexRecommendation,\n type PropertyAccessStats,\n type PropertyPath,\n type RecommendationPriority,\n} from \"./types\";\n\n// ============================================================\n// Main Functions\n// ============================================================\n\ntype GenerateRecommendationsOptions = Readonly<{\n minFrequencyForRecommendation?: number;\n mediumFrequencyThreshold?: number;\n highFrequencyThreshold?: number;\n}>;\n\n/**\n * Generates index recommendations based on usage patterns.\n *\n * Analyzes property access patterns and returns prioritized recommendations\n * for properties that would benefit from indexing.\n *\n * @param patterns - Collected property access patterns\n * @param declaredIndexes - Indexes that already exist\n * @param options - Threshold configuration (or legacy `minFrequency` number)\n * @returns Sorted array of index recommendations\n */\nexport function generateRecommendations(\n patterns: ReadonlyMap<string, PropertyAccessStats>,\n declaredIndexes: readonly DeclaredIndex[],\n options: number | GenerateRecommendationsOptions = {},\n): readonly IndexRecommendation[] {\n const recommendations: IndexRecommendation[] = [];\n const indexedPaths = buildIndexedPathsSet(declaredIndexes);\n\n const config = normalizeRecommendationsOptions(options);\n\n for (const [key, stats] of patterns) {\n // Only recommend indexes for filter and sort contexts.\n // Select and groupBy contexts are collected for completeness (useful for debugging\n // and future features like covering index suggestions) but don't drive recommendations\n // since they don't benefit from B-tree indexes in the same way.\n const hasFilterOrSort =\n stats.contexts.has(\"filter\") || stats.contexts.has(\"sort\");\n\n if (!hasFilterOrSort) {\n continue;\n }\n\n if (stats.count < config.minFrequencyForRecommendation) {\n continue;\n }\n\n const path = keyToPath(key);\n\n // Skip system fields - they're indexed by TypeGraph and/or not indexable as props.\n if (isSystemField(path)) {\n continue;\n }\n\n // Check if already indexed\n if (isIndexed(path, indexedPaths)) {\n continue;\n }\n\n recommendations.push({\n entityType: path.entityType,\n kind: path.kind,\n fields: path.target.__type === \"prop\" ? [path.target.pointer] : [],\n reason: buildReasonString(stats),\n frequency: stats.count,\n priority: getPriority(stats.count, config),\n });\n }\n\n // Sort by priority (high first), then by frequency (descending)\n return recommendations.toSorted((a, b) => {\n const priorityOrder: Record<RecommendationPriority, number> = {\n high: 0,\n medium: 1,\n low: 2,\n };\n const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n return b.frequency - a.frequency;\n });\n}\n\n/**\n * Gets properties used in filters that lack indexes.\n *\n * Useful for test assertions to ensure all filtered properties are indexed.\n *\n * @param patterns - Collected property access patterns\n * @param declaredIndexes - Indexes that already exist\n * @returns Array of unindexed property paths\n */\nexport function getUnindexedFilters(\n patterns: ReadonlyMap<string, PropertyAccessStats>,\n declaredIndexes: readonly DeclaredIndex[],\n): readonly PropertyPath[] {\n const indexedPaths = buildIndexedPathsSet(declaredIndexes);\n const unindexed: PropertyPath[] = [];\n\n for (const [key, stats] of patterns) {\n // Only check filter context\n if (!stats.contexts.has(\"filter\")) {\n continue;\n }\n\n const path = keyToPath(key);\n\n // Skip system fields\n if (isSystemField(path)) {\n continue;\n }\n\n if (!isIndexed(path, indexedPaths)) {\n unindexed.push(path);\n }\n }\n\n return unindexed;\n}\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\n/**\n * Builds a set of indexed property paths for fast lookup.\n */\nfunction buildIndexedPathsSet(indexes: readonly DeclaredIndex[]): Set<string> {\n const set = new Set<string>();\n\n for (const index of indexes) {\n const firstField = index.fields[0];\n if (!firstField) continue;\n\n // Prefix matching:\n // A composite index on (a, b, c) can be used for predicates on (a).\n set.add(\n pathToKey({\n entityType: index.entityType,\n kind: index.kind,\n target: { __type: \"prop\", pointer: firstField },\n }),\n );\n }\n\n return set;\n}\n\n/**\n * Checks if a property path is covered by an index.\n */\nfunction isIndexed(path: PropertyPath, indexedPaths: Set<string>): boolean {\n return indexedPaths.has(pathToKey(path));\n}\n\n/**\n * Checks if a property path refers to a system field.\n */\nfunction isSystemField(path: PropertyPath): boolean {\n return path.target.__type === \"system\";\n}\n\n/**\n * Builds a human-readable reason string for a recommendation.\n */\nfunction buildReasonString(stats: PropertyAccessStats): string {\n const contexts = [...stats.contexts].join(\", \");\n const predicates = [...stats.predicateTypes];\n\n let reason = `Used in ${contexts}`;\n if (predicates.length > 0) {\n reason += ` with ${predicates.join(\", \")}`;\n }\n reason += ` (${stats.count} ${stats.count === 1 ? \"time\" : \"times\"})`;\n\n return reason;\n}\n\n/**\n * Determines recommendation priority based on access frequency.\n */\ntype NormalizedRecommendationsOptions = Readonly<{\n minFrequencyForRecommendation: number;\n mediumFrequencyThreshold: number;\n highFrequencyThreshold: number;\n}>;\n\nfunction normalizeRecommendationsOptions(\n options: number | GenerateRecommendationsOptions,\n): NormalizedRecommendationsOptions {\n if (typeof options === \"number\") {\n return {\n minFrequencyForRecommendation: options,\n mediumFrequencyThreshold: DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n highFrequencyThreshold: DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n };\n }\n\n return {\n minFrequencyForRecommendation:\n options.minFrequencyForRecommendation ??\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION,\n mediumFrequencyThreshold:\n options.mediumFrequencyThreshold ?? DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n highFrequencyThreshold:\n options.highFrequencyThreshold ?? DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n };\n}\n\nfunction getPriority(\n frequency: number,\n options: NormalizedRecommendationsOptions,\n): RecommendationPriority {\n if (frequency >= options.highFrequencyThreshold) return \"high\";\n if (frequency >= options.mediumFrequencyThreshold) return \"medium\";\n return \"low\";\n}\n","/**\n * QueryProfiler - Main profiler class.\n *\n * Captures query patterns from the AST and generates index recommendations.\n * Uses Proxy to wrap Store and QueryBuilder for transparent interception.\n */\nimport { type z } from \"zod\";\n\nimport { type GraphDef } from \"../core/define-graph\";\nimport { type QueryAst } from \"../query/ast\";\nimport { resolveFieldTypeInfoAtJsonPointer } from \"../query/field-type-info\";\nimport {\n type JsonPointer,\n jsonPointer,\n parseJsonPointer,\n} from \"../query/json-pointer\";\nimport {\n createSchemaIntrospector,\n type SchemaIntrospector,\n} from \"../query/schema-introspector\";\nimport { type Store } from \"../store/store\";\nimport { requireDefined } from \"../utils/presence\";\nimport { extractPropertyAccesses } from \"./ast-extractor\";\nimport { ProfileCollector } from \"./collector\";\nimport {\n DEFAULT_HIGH_FREQUENCY_THRESHOLD,\n DEFAULT_MEDIUM_FREQUENCY_THRESHOLD,\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION,\n} from \"./constants\";\nimport {\n generateRecommendations,\n getUnindexedFilters,\n} from \"./recommendations\";\nimport {\n type DeclaredIndex,\n type ProfileReport,\n type ProfilerOptions,\n type PropertyPath,\n} from \"./types\";\n\n// ============================================================\n// ProfiledStore Type\n// ============================================================\n\n/**\n * A Store with profiling capabilities.\n *\n * Behaves exactly like a regular Store but tracks all query executions.\n * Access the profiler via the `profiler` property.\n */\nexport type ProfiledStore<G extends GraphDef> = Store<G> & {\n /** The profiler instance attached to this store */\n readonly profiler: QueryProfiler;\n};\n\n// ============================================================\n// QueryProfiler Class\n// ============================================================\n\n/**\n * QueryProfiler captures and analyzes query patterns.\n *\n * Attach to a store to automatically track all query executions,\n * then generate reports with index recommendations.\n *\n * @example\n * ```typescript\n * import { QueryProfiler } from \"@nicia-ai/typegraph/profiler\";\n *\n * const profiler = new QueryProfiler({\n * declaredIndexes: [\n * { nodeKind: \"Person\", fields: [\"email\"], unique: true, name: \"idx_email\" },\n * ],\n * });\n *\n * const profiledStore = profiler.attachToStore(store);\n *\n * // Run queries...\n * await profiledStore.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.email.eq(\"alice@example.com\"))\n * .select((ctx) => ctx.p)\n * .execute();\n *\n * // Get report\n * const report = profiler.getReport();\n * console.log(report.recommendations);\n * ```\n */\nexport class QueryProfiler {\n readonly #collector = new ProfileCollector();\n readonly #declaredIndexes: readonly DeclaredIndex[];\n readonly #minFrequencyForRecommendation: number;\n readonly #mediumFrequencyThreshold: number;\n readonly #highFrequencyThreshold: number;\n #schemaIntrospector: SchemaIntrospector | undefined;\n #attached = false;\n\n constructor(options?: ProfilerOptions) {\n this.#declaredIndexes = options?.declaredIndexes ?? [];\n this.#minFrequencyForRecommendation =\n options?.minFrequencyForRecommendation ??\n DEFAULT_MIN_FREQUENCY_FOR_RECOMMENDATION;\n this.#mediumFrequencyThreshold =\n options?.mediumFrequencyThreshold ?? DEFAULT_MEDIUM_FREQUENCY_THRESHOLD;\n this.#highFrequencyThreshold =\n options?.highFrequencyThreshold ?? DEFAULT_HIGH_FREQUENCY_THRESHOLD;\n }\n\n /**\n * Records a query execution from its AST.\n *\n * This is called automatically when attached to a store.\n * Can also be called manually for custom integrations.\n *\n * @param ast - The query AST to analyze\n */\n recordQuery(ast: QueryAst): void {\n this.#collector.recordQuery();\n\n const accesses = extractPropertyAccesses(ast);\n for (const access of accesses) {\n const paths = resolveAccessPaths(access, this.#schemaIntrospector);\n for (const path of paths) {\n this.#collector.record(path, access.context, access.predicateType);\n }\n }\n }\n\n /**\n * Attaches the profiler to a store.\n *\n * Returns a wrapped store that tracks all query executions.\n * The wrapped store behaves identically to the original.\n *\n * @param store - The store to attach to\n * @returns A profiled store with the `profiler` property\n * @throws Error if the profiler is already attached to another store\n */\n attachToStore<G extends GraphDef>(store: Store<G>): ProfiledStore<G> {\n if (this.#attached) {\n throw new Error(\n \"Profiler is already attached. Call detach() first or create a new profiler.\",\n );\n }\n this.#attached = true;\n this.#schemaIntrospector = createSchemaIntrospector(\n buildNodeSchemaMap(store.graph),\n buildEdgeSchemaMap(store.graph),\n );\n return createProfiledStore(store, this);\n }\n\n /**\n * Generates a complete profile report.\n *\n * The report includes:\n * - All property access patterns with frequency and context\n * - Index recommendations sorted by priority\n * - List of unindexed filter properties\n * - Summary statistics\n *\n * @returns The profile report\n */\n getReport(): ProfileReport {\n const patterns = this.#collector.getPatterns();\n const summary = this.#collector.getSummary();\n\n return {\n patterns,\n recommendations: generateRecommendations(\n patterns,\n this.#declaredIndexes,\n {\n minFrequencyForRecommendation: this.#minFrequencyForRecommendation,\n mediumFrequencyThreshold: this.#mediumFrequencyThreshold,\n highFrequencyThreshold: this.#highFrequencyThreshold,\n },\n ),\n summary,\n unindexedFilters: getUnindexedFilters(patterns, this.#declaredIndexes),\n };\n }\n\n /**\n * Checks if all filtered properties are covered by indexes.\n *\n * Throws an error if any filtered properties lack indexes.\n * Useful for test assertions to ensure query performance.\n *\n * @throws Error if unindexed filter properties are found\n *\n * @example\n * ```typescript\n * // In your test file\n * it(\"all filtered properties should be indexed\", () => {\n * profiler.assertIndexCoverage();\n * });\n * ```\n */\n assertIndexCoverage(): void {\n const report = this.getReport();\n if (report.unindexedFilters.length > 0) {\n const missing = report.unindexedFilters\n .map((p) => formatPropertyPath(p))\n .join(\", \");\n throw new Error(`Unindexed filter properties: ${missing}`);\n }\n }\n\n /**\n * Resets all collected data.\n *\n * Clears patterns and query count. Useful for starting a fresh\n * profiling session without creating a new profiler instance.\n */\n reset(): void {\n this.#collector.reset();\n }\n\n /**\n * Marks the profiler as detached.\n *\n * Call this when you're done profiling to allow reattachment\n * to the same or a different store.\n */\n detach(): void {\n this.#attached = false;\n this.#schemaIntrospector = undefined;\n }\n\n /**\n * Whether the profiler is currently attached to a store.\n */\n get isAttached(): boolean {\n return this.#attached;\n }\n}\n\nfunction buildNodeSchemaMap(\n graph: GraphDef,\n): ReadonlyMap<string, Readonly<{ schema: z.ZodType }>> {\n const entries = Object.values(graph.nodes).map(\n (n) => [n.type.kind, { schema: n.type.schema }] as const,\n );\n return new Map(entries);\n}\n\nfunction buildEdgeSchemaMap(\n graph: GraphDef,\n): ReadonlyMap<string, Readonly<{ schema: z.ZodType }>> {\n const entries = Object.values(graph.edges).map(\n (edgeRegistration) =>\n [\n edgeRegistration.type.kind,\n { schema: edgeRegistration.type.schema },\n ] as const,\n );\n return new Map(entries);\n}\n\nfunction resolveAccessPaths(\n access: ReturnType<typeof extractPropertyAccesses>[number],\n schemaIntrospector: SchemaIntrospector | undefined,\n): readonly PropertyPath[] {\n const kinds = access.kindNames;\n if (kinds.length === 0) {\n // This indicates a bug in the AST extractor - aliases should always resolve to kinds.\n // Log warning and skip rather than silently dropping data.\n warnInDevelopment(\n `[QueryProfiler] Access pattern has empty kindNames for context \"${access.context}\". ` +\n `This may indicate a bug in alias resolution.`,\n );\n return [];\n }\n\n if (!schemaIntrospector) {\n return [\n {\n entityType: access.entityType,\n kind: requireDefined(kinds[0]),\n target: access.target,\n },\n ];\n }\n\n if (access.target.__type !== \"prop\") {\n return [\n {\n entityType: access.entityType,\n kind: requireDefined(kinds[0]),\n target: access.target,\n },\n ];\n }\n\n const pointer = access.target.pointer;\n const matchingKinds = kinds.filter((kindName) =>\n hasPointerInSchema(\n schemaIntrospector,\n access.entityType,\n kindName,\n pointer,\n ),\n );\n\n const kindsToUse =\n matchingKinds.length > 0 ? matchingKinds : [requireDefined(kinds[0])];\n\n return kindsToUse.map((kindName) => ({\n entityType: access.entityType,\n kind: kindName,\n target: access.target,\n }));\n}\n\nfunction warnInDevelopment(message: string, details?: unknown): void {\n if (!isDevelopmentEnvironment()) {\n return;\n }\n if (details !== undefined) {\n console.warn(message, details);\n return;\n }\n console.warn(message);\n}\n\nfunction isDevelopmentEnvironment(): boolean {\n return getNodeEnv() !== \"production\";\n}\n\nfunction getNodeEnv(): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n return process.env[\"NODE_ENV\"];\n}\n\n/**\n * Checks whether a JSON pointer exists in the schema for the given kind.\n *\n * This is used to attribute multi-kind aliases (includeSubClasses) to the most\n * relevant concrete kinds by verifying that the accessed pointer exists.\n *\n * Returns false on missing fields or invalid pointers.\n */\nfunction hasPointerInSchema(\n schemaIntrospector: SchemaIntrospector,\n entityType: PropertyPath[\"entityType\"],\n kindName: string,\n pointer: JsonPointer,\n): boolean {\n const segments = parseJsonPointer(pointer);\n const [first, ...rest] = segments;\n if (!first) {\n return false;\n }\n\n const rootInfo =\n entityType === \"node\" ?\n schemaIntrospector.getFieldTypeInfo(kindName, first)\n : schemaIntrospector.getEdgeFieldTypeInfo(kindName, first);\n\n if (!rootInfo) {\n return false;\n }\n\n if (rest.length === 0) {\n return true;\n }\n\n try {\n const resolved = resolveFieldTypeInfoAtJsonPointer(\n rootInfo,\n jsonPointer(rest),\n );\n return resolved !== undefined;\n } catch (error) {\n warnInDevelopment(\n `[QueryProfiler] Failed to resolve pointer \"${pointer}\" for ${entityType} kind \"${kindName}\".`,\n error,\n );\n return false;\n }\n}\n\nfunction formatPropertyPath(path: PropertyPath): string {\n const target =\n path.target.__type === \"prop\" ?\n (path.target.pointer as string)\n : `$${path.target.field}`;\n return `${path.entityType}:${path.kind}:${target}`;\n}\n\n// ============================================================\n// Proxy Implementation\n// ============================================================\n\n/**\n * Creates a profiled store wrapper using Proxy.\n */\nfunction createProfiledStore<G extends GraphDef>(\n store: Store<G>,\n profiler: QueryProfiler,\n): ProfiledStore<G> {\n const storeProxyHandler: ProxyHandler<Store<G>> = {\n get(target, property, _receiver) {\n // Add profiler property\n if (property === \"profiler\") {\n return profiler;\n }\n\n // Wrap query() method\n if (property === \"query\") {\n return () => {\n const builder = target.query();\n return wrapQueryBuilder(builder, profiler);\n };\n }\n\n // IMPORTANT: Store is a class with private fields; accessors and methods\n // must be invoked with `this === target`, not the proxy receiver.\n const value: unknown = Reflect.get(target, property, target);\n\n // Bind functions to the target to preserve private field access.\n if (typeof value === \"function\") {\n return (value as (...args: unknown[]) => unknown).bind(target);\n }\n\n return value;\n },\n };\n\n return new Proxy(store, storeProxyHandler) as ProfiledStore<G>;\n}\n\n/**\n * Wraps a query builder to intercept method calls.\n *\n * The builder returns new builders for most methods, and returns\n * ExecutableQuery for select/aggregate. We need to recursively\n * wrap to ensure all paths lead to wrapped ExecutableQueries.\n */\nfunction wrapQueryBuilder<T extends object>(\n builder: T,\n profiler: QueryProfiler,\n): T {\n const builderProxyHandler: ProxyHandler<T> = {\n get(target, property, receiver) {\n const value: unknown = Reflect.get(target, property, receiver);\n\n // Not a function - return as-is\n if (typeof value !== \"function\") {\n return value;\n }\n\n // Wrap the method to intercept results\n return (...args: unknown[]): unknown => {\n const result: unknown = (\n value as (...args: unknown[]) => unknown\n ).apply(target, args);\n\n // If result is null/undefined or primitive, return as-is\n if (result === null || typeof result !== \"object\") {\n return result;\n }\n\n // Check if result is an ExecutableQuery (has toAst and execute)\n if (hasExecutableQueryShape(result)) {\n return wrapExecutableQuery(result, profiler);\n }\n\n // Check if result is a builder (has from, select, whereNode, etc.)\n if (hasQueryBuilderShape(result)) {\n return wrapQueryBuilder(result, profiler);\n }\n\n // Otherwise return as-is (e.g., compile() returns SQL)\n return result;\n };\n },\n };\n\n return new Proxy(builder, builderProxyHandler);\n}\n\n/**\n * Wraps an ExecutableQuery to intercept execute(), paginate(), stream().\n */\nfunction wrapExecutableQuery<T extends object>(\n query: T,\n profiler: QueryProfiler,\n): T {\n const executableQueryProxyHandler: ProxyHandler<T> = {\n get(target, property, receiver) {\n const value: unknown = Reflect.get(target, property, receiver);\n\n // Not a function - return as-is\n if (typeof value !== \"function\") {\n return value;\n }\n\n const fn = value as (...args: unknown[]) => unknown;\n\n // Always bind `this` to the original instance to preserve private fields.\n return (...args: unknown[]): unknown => {\n // Intercept execute, paginate, stream\n if (\n property === \"execute\" ||\n property === \"paginate\" ||\n property === \"stream\"\n ) {\n const toAst = Reflect.get(\n target,\n \"toAst\",\n receiver,\n ) as () => QueryAst;\n const ast = toAst.call(target);\n profiler.recordQuery(ast);\n }\n\n const result: unknown = fn.apply(target, args);\n\n // Any method that returns an ExecutableQuery-shaped object should remain wrapped.\n // Using duck-typing rather than a method whitelist ensures new chainable methods\n // (e.g., orderBy, limit, offset, pipe, union, intersect, etc.) are automatically handled.\n if (\n result &&\n typeof result === \"object\" &&\n hasExecutableQueryShape(result)\n ) {\n return wrapExecutableQuery(result, profiler);\n }\n\n return result;\n };\n },\n };\n\n return new Proxy(query, executableQueryProxyHandler);\n}\n\n// ============================================================\n// Type Guards\n// ============================================================\n\n/**\n * Checks if an object looks like an ExecutableQuery.\n */\nfunction hasExecutableQueryShape(object: object): boolean {\n return (\n \"toAst\" in object &&\n typeof object.toAst === \"function\" &&\n \"execute\" in object &&\n typeof object.execute === \"function\"\n );\n}\n\n/**\n * Checks if an object looks like a QueryBuilder or TraversalBuilder.\n * Covers both the main query builder and traversal/edge builder chains.\n */\nfunction hasQueryBuilderShape(object: object): boolean {\n return (\n (\"from\" in object && typeof object.from === \"function\") ||\n (\"select\" in object && typeof object.select === \"function\") ||\n (\"whereNode\" in object && typeof object.whereNode === \"function\") ||\n (\"traverse\" in object && typeof object.traverse === \"function\") ||\n // Traversal builder methods\n (\"whereEdge\" in object && typeof object.whereEdge === \"function\") ||\n (\"to\" in object && typeof object.to === \"function\")\n );\n}\n"]}