@remnic/core 1.1.31 → 9.3.515

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 (1087) hide show
  1. package/dist/abstraction-nodes.js +2 -2
  2. package/dist/access-cli.d.ts +1 -1
  3. package/dist/access-cli.js +156 -119
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +8 -5
  6. package/dist/access-http.js +51 -51
  7. package/dist/access-idempotency.d.ts +2 -0
  8. package/dist/access-idempotency.js +1 -1
  9. package/dist/access-mcp.d.ts +16 -9
  10. package/dist/access-mcp.js +44 -44
  11. package/dist/access-schema.d.ts +45 -13
  12. package/dist/access-schema.js +8 -8
  13. package/dist/{access-service-CkZyb35d.d.ts → access-service-qrrIrC-0.d.ts} +5 -128
  14. package/dist/access-service.d.ts +7 -4
  15. package/dist/access-service.js +40 -40
  16. package/dist/action-confidence.d.ts +1 -0
  17. package/dist/active-memory-bridge.d.ts +1 -0
  18. package/dist/active-memory-bridge.js +3 -2
  19. package/dist/active-recall.d.ts +1 -0
  20. package/dist/active-recall.js +14 -9
  21. package/dist/active-recall.js.map +1 -1
  22. package/dist/adapters/claude-code.d.ts +6 -2
  23. package/dist/adapters/claude-code.js +2 -2
  24. package/dist/adapters/codex.d.ts +5 -1
  25. package/dist/adapters/codex.js +2 -2
  26. package/dist/adapters/hermes.js +2 -2
  27. package/dist/adapters/index.js +6 -6
  28. package/dist/adapters/registry.js +6 -6
  29. package/dist/adapters/replit.d.ts +4 -2
  30. package/dist/adapters/replit.js +2 -2
  31. package/dist/adapters/types.d.ts +4 -0
  32. package/dist/adapters/types.js +1 -1
  33. package/dist/behavior-learner.d.ts +1 -0
  34. package/dist/behavior-signals.d.ts +1 -0
  35. package/dist/behavior-signals.js +1 -1
  36. package/dist/bootstrap.d.ts +5 -3
  37. package/dist/bootstrap.js +2 -2
  38. package/dist/boxes.d.ts +1 -0
  39. package/dist/boxes.js +1 -1
  40. package/dist/briefing.d.ts +1 -0
  41. package/dist/briefing.js +9 -9
  42. package/dist/buffer-surprise-report.d.ts +1 -0
  43. package/dist/buffer.d.ts +1 -0
  44. package/dist/buffer.js +2 -2
  45. package/dist/bulk-import/index.d.ts +28 -0
  46. package/dist/bulk-import/index.js +31 -0
  47. package/dist/calibration.d.ts +2 -0
  48. package/dist/calibration.js +50 -17
  49. package/dist/calibration.js.map +1 -1
  50. package/dist/{capsule-crypto-5CYAGVC5.js → capsule-crypto-7FJQINUR.js} +2 -2
  51. package/dist/{capsule-merge-4MGKE7C5.js → capsule-merge-T2JRE46P.js} +3 -3
  52. package/dist/causal-behavior.d.ts +1 -0
  53. package/dist/causal-behavior.js +4 -4
  54. package/dist/causal-chain.js +4 -4
  55. package/dist/causal-consolidation.d.ts +16 -1
  56. package/dist/causal-consolidation.js +115 -32
  57. package/dist/causal-consolidation.js.map +1 -1
  58. package/dist/causal-retrieval.js +14 -6
  59. package/dist/causal-retrieval.js.map +1 -1
  60. package/dist/causal-trajectory-graph.js +2 -2
  61. package/dist/causal-trajectory.js +2 -2
  62. package/dist/{chunk-SAZS2QZB.js → chunk-23UORJ4S.js} +3 -3
  63. package/dist/{chunk-76FLAAUC.js → chunk-2AN2L4NL.js} +17 -6
  64. package/dist/chunk-2AN2L4NL.js.map +1 -0
  65. package/dist/{chunk-W4L6CZKA.js → chunk-2DL3OFLD.js} +15 -10
  66. package/dist/chunk-2DL3OFLD.js.map +1 -0
  67. package/dist/{chunk-7OZ53EXP.js → chunk-2NLLXCJG.js} +21 -10
  68. package/dist/chunk-2NLLXCJG.js.map +1 -0
  69. package/dist/{chunk-PK7H5L6Y.js → chunk-2NM43EWN.js} +2 -2
  70. package/dist/{chunk-PYXS46O7.js → chunk-3BP57I6J.js} +2 -2
  71. package/dist/{chunk-FBYESMQ2.js → chunk-3C5RPJAX.js} +2 -2
  72. package/dist/{chunk-ZAVUCJ4H.js → chunk-3Q4H3OBR.js} +150 -65
  73. package/dist/chunk-3Q4H3OBR.js.map +1 -0
  74. package/dist/{chunk-FKFMOY3N.js → chunk-42NQ7AVG.js} +3 -4
  75. package/dist/{chunk-FKFMOY3N.js.map → chunk-42NQ7AVG.js.map} +1 -1
  76. package/dist/chunk-4426WSWL.js +73 -0
  77. package/dist/chunk-4426WSWL.js.map +1 -0
  78. package/dist/{chunk-LIRZNNUP.js → chunk-44442YCH.js} +5 -2
  79. package/dist/chunk-44442YCH.js.map +1 -0
  80. package/dist/{chunk-H3ME6L6D.js → chunk-46GJIW5M.js} +23 -20
  81. package/dist/chunk-46GJIW5M.js.map +1 -0
  82. package/dist/{chunk-QDZ2RLEC.js → chunk-472U7RDF.js} +3 -3
  83. package/dist/chunk-472U7RDF.js.map +1 -0
  84. package/dist/{chunk-NN2DKE4T.js → chunk-4H5ZJHEN.js} +16 -3
  85. package/dist/{chunk-NN2DKE4T.js.map → chunk-4H5ZJHEN.js.map} +1 -1
  86. package/dist/{chunk-56K5QLHX.js → chunk-4HP7HIE3.js} +56 -13
  87. package/dist/chunk-4HP7HIE3.js.map +1 -0
  88. package/dist/{chunk-RK2Y4XOM.js → chunk-4JRRISLU.js} +9 -6
  89. package/dist/chunk-4JRRISLU.js.map +1 -0
  90. package/dist/{chunk-U7EJOMFC.js → chunk-4Q73JBSM.js} +4 -4
  91. package/dist/{chunk-XKLD5OK4.js → chunk-4RR6ROTB.js} +10 -11
  92. package/dist/chunk-4RR6ROTB.js.map +1 -0
  93. package/dist/{chunk-4KGVTPGD.js → chunk-6F6BXB7A.js} +9 -8
  94. package/dist/chunk-6F6BXB7A.js.map +1 -0
  95. package/dist/{chunk-NMZY542O.js → chunk-6URPAY2D.js} +41 -17
  96. package/dist/chunk-6URPAY2D.js.map +1 -0
  97. package/dist/{chunk-N53K2EXC.js → chunk-6VF75M3X.js} +2 -2
  98. package/dist/{chunk-XSZEP4SF.js → chunk-6XSPNR6L.js} +6 -5
  99. package/dist/chunk-6XSPNR6L.js.map +1 -0
  100. package/dist/{chunk-6H2TESSP.js → chunk-765K3SAT.js} +3 -3
  101. package/dist/{chunk-EDTHC6UD.js → chunk-77NAFXUD.js} +2 -2
  102. package/dist/{chunk-S7KDBTWT.js → chunk-7F7Z6MOS.js} +29 -14
  103. package/dist/chunk-7F7Z6MOS.js.map +1 -0
  104. package/dist/{chunk-MZH6EHNR.js → chunk-7H6CFEBJ.js} +41 -14
  105. package/dist/chunk-7H6CFEBJ.js.map +1 -0
  106. package/dist/{chunk-575RMLWN.js → chunk-7MV5CWTE.js} +26 -20
  107. package/dist/chunk-7MV5CWTE.js.map +1 -0
  108. package/dist/{chunk-MGKYQQYF.js → chunk-7Q3RCKAQ.js} +2 -2
  109. package/dist/chunk-7RXCMVFQ.js +27 -0
  110. package/dist/chunk-7RXCMVFQ.js.map +1 -0
  111. package/dist/{chunk-DGXUHMOV.js → chunk-A2IYSXDQ.js} +25 -6
  112. package/dist/chunk-A2IYSXDQ.js.map +1 -0
  113. package/dist/{chunk-EABGC2TL.js → chunk-A2Z6UCWT.js} +26 -4
  114. package/dist/chunk-A2Z6UCWT.js.map +1 -0
  115. package/dist/{chunk-3VAL7ZL2.js → chunk-A52AKD7C.js} +59 -24
  116. package/dist/chunk-A52AKD7C.js.map +1 -0
  117. package/dist/{chunk-5375UYTQ.js → chunk-A6D7A2FW.js} +4 -4
  118. package/dist/chunk-A6D7A2FW.js.map +1 -0
  119. package/dist/{chunk-FAAFWE4G.js → chunk-ALEPI75L.js} +24 -6
  120. package/dist/chunk-ALEPI75L.js.map +1 -0
  121. package/dist/{chunk-3SLRNYNG.js → chunk-AUDJPF4N.js} +15 -4
  122. package/dist/chunk-AUDJPF4N.js.map +1 -0
  123. package/dist/chunk-B5XMS73R.js +145 -0
  124. package/dist/chunk-B5XMS73R.js.map +1 -0
  125. package/dist/{chunk-HXXBL2KD.js → chunk-BECQDWBA.js} +44 -4
  126. package/dist/chunk-BECQDWBA.js.map +1 -0
  127. package/dist/{chunk-7SEAZFFB.js → chunk-BEUDU7Y4.js} +24 -4
  128. package/dist/chunk-BEUDU7Y4.js.map +1 -0
  129. package/dist/{chunk-XVVIG67A.js → chunk-BLZAVUD2.js} +61 -17
  130. package/dist/chunk-BLZAVUD2.js.map +1 -0
  131. package/dist/chunk-CHBI22MI.js +159 -0
  132. package/dist/chunk-CHBI22MI.js.map +1 -0
  133. package/dist/{chunk-GDFS42HT.js → chunk-CHCA44C3.js} +15 -8
  134. package/dist/chunk-CHCA44C3.js.map +1 -0
  135. package/dist/chunk-CINZGPSJ.js +22 -0
  136. package/dist/chunk-CINZGPSJ.js.map +1 -0
  137. package/dist/chunk-CMTINOFS.js +36 -0
  138. package/dist/chunk-CMTINOFS.js.map +1 -0
  139. package/dist/{chunk-34DQE4KF.js → chunk-CO7ZO4TU.js} +2 -2
  140. package/dist/{chunk-PFV5C235.js → chunk-CPPS65WS.js} +2 -1
  141. package/dist/{chunk-PFV5C235.js.map → chunk-CPPS65WS.js.map} +1 -1
  142. package/dist/{chunk-DINWEURR.js → chunk-CSKLPDN6.js} +20 -6
  143. package/dist/chunk-CSKLPDN6.js.map +1 -0
  144. package/dist/chunk-CWWMTTQE.js +566 -0
  145. package/dist/chunk-CWWMTTQE.js.map +1 -0
  146. package/dist/{chunk-IQT3XTKW.js → chunk-D24OXEPB.js} +13 -7
  147. package/dist/chunk-D24OXEPB.js.map +1 -0
  148. package/dist/{chunk-TPU5L5EY.js → chunk-D6WE5MTW.js} +272 -411
  149. package/dist/chunk-D6WE5MTW.js.map +1 -0
  150. package/dist/{chunk-WIICJPET.js → chunk-DEUNUKTD.js} +6 -4
  151. package/dist/{chunk-WIICJPET.js.map → chunk-DEUNUKTD.js.map} +1 -1
  152. package/dist/{chunk-ZYVPLJ4T.js → chunk-DHGSZ3UD.js} +9 -7
  153. package/dist/chunk-DHGSZ3UD.js.map +1 -0
  154. package/dist/{chunk-JR4ZC3G4.js → chunk-DLJ4IR6M.js} +91 -41
  155. package/dist/chunk-DLJ4IR6M.js.map +1 -0
  156. package/dist/{chunk-U4SCL7B7.js → chunk-DRD2Q7HQ.js} +82 -18
  157. package/dist/chunk-DRD2Q7HQ.js.map +1 -0
  158. package/dist/{chunk-2IWUMAES.js → chunk-E62SBGQ3.js} +28 -13
  159. package/dist/chunk-E62SBGQ3.js.map +1 -0
  160. package/dist/{chunk-C5BCH4ZS.js → chunk-EAZGEEG2.js} +21 -3
  161. package/dist/chunk-EAZGEEG2.js.map +1 -0
  162. package/dist/{chunk-TPB3I2AC.js → chunk-ECZU5BJH.js} +31 -10
  163. package/dist/chunk-ECZU5BJH.js.map +1 -0
  164. package/dist/{chunk-77H5NU3M.js → chunk-EDBEWFJO.js} +82 -18
  165. package/dist/chunk-EDBEWFJO.js.map +1 -0
  166. package/dist/chunk-EDQVAMQI.js +308 -0
  167. package/dist/chunk-EDQVAMQI.js.map +1 -0
  168. package/dist/{chunk-RRF5UOBJ.js → chunk-EI6V5UXY.js} +22 -15
  169. package/dist/chunk-EI6V5UXY.js.map +1 -0
  170. package/dist/{chunk-I5GLV3VE.js → chunk-EIPUHVKE.js} +31 -24
  171. package/dist/{chunk-I5GLV3VE.js.map → chunk-EIPUHVKE.js.map} +1 -1
  172. package/dist/{chunk-ZKSK55RC.js → chunk-ETUPBUHB.js} +2 -2
  173. package/dist/{chunk-25MQ7IHJ.js → chunk-EUML3N6B.js} +17 -6
  174. package/dist/chunk-EUML3N6B.js.map +1 -0
  175. package/dist/{chunk-5RGLBDQF.js → chunk-EVZFIAPG.js} +12 -12
  176. package/dist/chunk-EVZFIAPG.js.map +1 -0
  177. package/dist/{chunk-QRNI5JBH.js → chunk-EYIEWJNI.js} +2 -2
  178. package/dist/{chunk-YU5KIWYQ.js → chunk-FER4WARO.js} +79 -41
  179. package/dist/chunk-FER4WARO.js.map +1 -0
  180. package/dist/{chunk-43PJZYGL.js → chunk-FPGE5NVO.js} +45 -10
  181. package/dist/chunk-FPGE5NVO.js.map +1 -0
  182. package/dist/{chunk-C6QPK5GG.js → chunk-FZZ2QTJI.js} +2 -2
  183. package/dist/{chunk-D46YSIYX.js → chunk-G3Z3QEF5.js} +19 -11
  184. package/dist/{chunk-D46YSIYX.js.map → chunk-G3Z3QEF5.js.map} +1 -1
  185. package/dist/{chunk-3JXBXXM2.js → chunk-G4IAEX6D.js} +2 -2
  186. package/dist/{chunk-MSWG7JI6.js → chunk-G56P5RLD.js} +8 -2
  187. package/dist/chunk-G56P5RLD.js.map +1 -0
  188. package/dist/{chunk-AGZQD76C.js → chunk-GCGJW34D.js} +48 -2
  189. package/dist/chunk-GCGJW34D.js.map +1 -0
  190. package/dist/chunk-H2NCNXMS.js +159 -0
  191. package/dist/chunk-H2NCNXMS.js.map +1 -0
  192. package/dist/{chunk-XYIK4LF6.js → chunk-H3FZVNRN.js} +8 -2
  193. package/dist/chunk-H3FZVNRN.js.map +1 -0
  194. package/dist/{chunk-TK4UEOSK.js → chunk-HDDRVXX4.js} +8 -8
  195. package/dist/chunk-HDDRVXX4.js.map +1 -0
  196. package/dist/{chunk-LLQ2LLWF.js → chunk-HENLZHIT.js} +15 -5
  197. package/dist/chunk-HENLZHIT.js.map +1 -0
  198. package/dist/{chunk-N2D6GXBM.js → chunk-HINSGUA7.js} +28 -20
  199. package/dist/chunk-HINSGUA7.js.map +1 -0
  200. package/dist/{chunk-APO3DCMU.js → chunk-HLAVGJ62.js} +30 -8
  201. package/dist/chunk-HLAVGJ62.js.map +1 -0
  202. package/dist/{chunk-TPMQ3G6Z.js → chunk-HOJZMQ4J.js} +2 -2
  203. package/dist/chunk-HOJZMQ4J.js.map +1 -0
  204. package/dist/{chunk-LUDTDZLK.js → chunk-HPWVAEET.js} +33 -7
  205. package/dist/chunk-HPWVAEET.js.map +1 -0
  206. package/dist/{chunk-NZL6GGQE.js → chunk-HQ6NIBL6.js} +92 -30
  207. package/dist/chunk-HQ6NIBL6.js.map +1 -0
  208. package/dist/{chunk-UWVJF25J.js → chunk-HWVTS5NO.js} +20 -6
  209. package/dist/chunk-HWVTS5NO.js.map +1 -0
  210. package/dist/{chunk-2WWLHTZY.js → chunk-IC4GELZE.js} +2 -2
  211. package/dist/{chunk-QA2ZAPBU.js → chunk-IPLYGWQF.js} +28 -20
  212. package/dist/chunk-IPLYGWQF.js.map +1 -0
  213. package/dist/{chunk-A6KTB5R6.js → chunk-IQ3OI2RR.js} +3 -3
  214. package/dist/chunk-IQ3OI2RR.js.map +1 -0
  215. package/dist/{chunk-6LVVDPJ4.js → chunk-J64TK33U.js} +3 -4
  216. package/dist/chunk-J64TK33U.js.map +1 -0
  217. package/dist/{chunk-6FC5EGNV.js → chunk-JBPKEARU.js} +15 -5
  218. package/dist/{chunk-6FC5EGNV.js.map → chunk-JBPKEARU.js.map} +1 -1
  219. package/dist/{chunk-RHY3HH7P.js → chunk-JFEKNTX7.js} +125 -33
  220. package/dist/chunk-JFEKNTX7.js.map +1 -0
  221. package/dist/{chunk-TZOLIGIG.js → chunk-JJEJJ7RK.js} +4 -2
  222. package/dist/chunk-JJEJJ7RK.js.map +1 -0
  223. package/dist/{chunk-PCUKNJAZ.js → chunk-JKV57BTN.js} +2 -2
  224. package/dist/{chunk-EJI5XIBB.js → chunk-JLNBQWZ2.js} +55 -7
  225. package/dist/chunk-JLNBQWZ2.js.map +1 -0
  226. package/dist/{chunk-XIG5PDM7.js → chunk-JUC24CTX.js} +8 -12
  227. package/dist/chunk-JUC24CTX.js.map +1 -0
  228. package/dist/{chunk-3ZLVGM76.js → chunk-JYIKKAK3.js} +106 -44
  229. package/dist/chunk-JYIKKAK3.js.map +1 -0
  230. package/dist/{chunk-OIGNEXKZ.js → chunk-K5O2QY6T.js} +5 -1
  231. package/dist/{chunk-OIGNEXKZ.js.map → chunk-K5O2QY6T.js.map} +1 -1
  232. package/dist/{chunk-ZTFCYYEZ.js → chunk-KCYE2MZM.js} +3 -3
  233. package/dist/chunk-KCYE2MZM.js.map +1 -0
  234. package/dist/{chunk-JWPLJLDU.js → chunk-KD3QD3A5.js} +2 -2
  235. package/dist/{chunk-JWPLJLDU.js.map → chunk-KD3QD3A5.js.map} +1 -1
  236. package/dist/{chunk-YRMVARQP.js → chunk-KFY3SGN7.js} +49 -2
  237. package/dist/chunk-KFY3SGN7.js.map +1 -0
  238. package/dist/{chunk-CYFQJMUV.js → chunk-KIB7SDIJ.js} +15 -10
  239. package/dist/chunk-KIB7SDIJ.js.map +1 -0
  240. package/dist/{chunk-3KW65B36.js → chunk-KILOTVIF.js} +95 -48
  241. package/dist/chunk-KILOTVIF.js.map +1 -0
  242. package/dist/{chunk-MXFBBHJU.js → chunk-KJMYHC7K.js} +10 -5
  243. package/dist/chunk-KJMYHC7K.js.map +1 -0
  244. package/dist/{chunk-W3LR522O.js → chunk-KM2A35EO.js} +36 -34
  245. package/dist/chunk-KM2A35EO.js.map +1 -0
  246. package/dist/{chunk-WELDCG6C.js → chunk-L227SKTB.js} +109 -36
  247. package/dist/chunk-L227SKTB.js.map +1 -0
  248. package/dist/{chunk-W6AQJ2PY.js → chunk-L7S47WZT.js} +35 -16
  249. package/dist/chunk-L7S47WZT.js.map +1 -0
  250. package/dist/{chunk-BVF3AGJP.js → chunk-LJBOVCQG.js} +26 -11
  251. package/dist/chunk-LJBOVCQG.js.map +1 -0
  252. package/dist/{chunk-2KI4QFHU.js → chunk-LMDRGRJ2.js} +2 -2
  253. package/dist/{chunk-MY6TPVXW.js → chunk-LMPHTYJC.js} +2 -2
  254. package/dist/{chunk-EHRTFRWW.js → chunk-LQHDIS7L.js} +10 -5
  255. package/dist/chunk-LQHDIS7L.js.map +1 -0
  256. package/dist/chunk-LUDUFZTV.js +170 -0
  257. package/dist/chunk-LUDUFZTV.js.map +1 -0
  258. package/dist/{chunk-5HRY2WRF.js → chunk-LZ3VEOU5.js} +2 -2
  259. package/dist/{chunk-Q7P4WJDP.js → chunk-M5T4Q2ZU.js} +1 -1
  260. package/dist/chunk-M5T4Q2ZU.js.map +1 -0
  261. package/dist/{chunk-ICRIXAP2.js → chunk-MC4FJXPA.js} +16 -6
  262. package/dist/chunk-MC4FJXPA.js.map +1 -0
  263. package/dist/{chunk-WPGJYVUH.js → chunk-MGVIEM2O.js} +23 -6
  264. package/dist/chunk-MGVIEM2O.js.map +1 -0
  265. package/dist/{chunk-YROHKYBY.js → chunk-O27WNHTT.js} +22 -6
  266. package/dist/chunk-O27WNHTT.js.map +1 -0
  267. package/dist/{chunk-NGAVDO7E.js → chunk-OADWQ5CR.js} +2 -2
  268. package/dist/{chunk-2NMMFZ5T.js → chunk-OD4FM2U7.js} +6 -3
  269. package/dist/chunk-OD4FM2U7.js.map +1 -0
  270. package/dist/{chunk-OZHRDTDX.js → chunk-OKTXM5H4.js} +11 -1
  271. package/dist/chunk-OKTXM5H4.js.map +1 -0
  272. package/dist/{chunk-RXDLTSWT.js → chunk-ONPLNAPX.js} +16 -7
  273. package/dist/chunk-ONPLNAPX.js.map +1 -0
  274. package/dist/{chunk-FJ43PRLT.js → chunk-ORFGK3XI.js} +20 -14
  275. package/dist/chunk-ORFGK3XI.js.map +1 -0
  276. package/dist/{chunk-DOM4GKSW.js → chunk-OZKVVUJB.js} +3 -3
  277. package/dist/{chunk-MT4HVDUZ.js → chunk-PM3QHTFT.js} +3 -3
  278. package/dist/{chunk-4DWOBS2A.js → chunk-PRQJ5ESM.js} +27 -2
  279. package/dist/{chunk-4DWOBS2A.js.map → chunk-PRQJ5ESM.js.map} +1 -1
  280. package/dist/chunk-PU44GBL4.js +52 -0
  281. package/dist/chunk-PU44GBL4.js.map +1 -0
  282. package/dist/{chunk-MJFNCJXV.js → chunk-Q4CAQGKQ.js} +47 -9
  283. package/dist/chunk-Q4CAQGKQ.js.map +1 -0
  284. package/dist/{chunk-U3WSW6PZ.js → chunk-QMYXNM4P.js} +90 -35
  285. package/dist/chunk-QMYXNM4P.js.map +1 -0
  286. package/dist/{chunk-NBNN5GOB.js → chunk-QY7YA7OL.js} +11 -2
  287. package/dist/chunk-QY7YA7OL.js.map +1 -0
  288. package/dist/{chunk-QLLBRHAT.js → chunk-R26QUUQN.js} +181 -257
  289. package/dist/chunk-R26QUUQN.js.map +1 -0
  290. package/dist/{chunk-ZK7I7JYV.js → chunk-R3PS27B4.js} +7 -7
  291. package/dist/{chunk-TMQLARTH.js → chunk-RCTS5CKK.js} +33 -14
  292. package/dist/chunk-RCTS5CKK.js.map +1 -0
  293. package/dist/{chunk-2PRLKQAH.js → chunk-RLV3PQGH.js} +35 -19
  294. package/dist/chunk-RLV3PQGH.js.map +1 -0
  295. package/dist/{chunk-WW3QQF4H.js → chunk-ROZJACKP.js} +16 -1
  296. package/dist/chunk-ROZJACKP.js.map +1 -0
  297. package/dist/{chunk-7MNMYOFP.js → chunk-RSUYKGGZ.js} +3 -4
  298. package/dist/chunk-RSUYKGGZ.js.map +1 -0
  299. package/dist/{chunk-LT3NLYSI.js → chunk-RUZOJKNF.js} +10 -7
  300. package/dist/chunk-RUZOJKNF.js.map +1 -0
  301. package/dist/{chunk-326G7DJK.js → chunk-RW5DGAGO.js} +67 -13
  302. package/dist/chunk-RW5DGAGO.js.map +1 -0
  303. package/dist/{chunk-KOSORCJG.js → chunk-S53PKKWK.js} +63 -24
  304. package/dist/chunk-S53PKKWK.js.map +1 -0
  305. package/dist/{chunk-65PG43EQ.js → chunk-S7WU3Y3D.js} +21 -4
  306. package/dist/chunk-S7WU3Y3D.js.map +1 -0
  307. package/dist/{chunk-SKE7JYKA.js → chunk-SFXKHM7P.js} +2 -2
  308. package/dist/{chunk-HMDCOMYU.js → chunk-SKGV326D.js} +3 -3
  309. package/dist/chunk-T2PO5MUF.js +62 -0
  310. package/dist/chunk-T2PO5MUF.js.map +1 -0
  311. package/dist/{chunk-C7VW7C3F.js → chunk-TDKQGLJW.js} +3 -3
  312. package/dist/chunk-TDKQGLJW.js.map +1 -0
  313. package/dist/{chunk-3QKK7QOS.js → chunk-TERNBNJB.js} +3 -3
  314. package/dist/chunk-TERNBNJB.js.map +1 -0
  315. package/dist/{chunk-MXC3AP5I.js → chunk-TGQ2NTWH.js} +12 -7
  316. package/dist/chunk-TGQ2NTWH.js.map +1 -0
  317. package/dist/{chunk-3Y4P7RXM.js → chunk-TMSXWOBZ.js} +3 -4
  318. package/dist/chunk-TMSXWOBZ.js.map +1 -0
  319. package/dist/{chunk-3TNBOMQT.js → chunk-TVRN5QKH.js} +11 -11
  320. package/dist/{chunk-3TNBOMQT.js.map → chunk-TVRN5QKH.js.map} +1 -1
  321. package/dist/{chunk-5UM2VJ6D.js → chunk-UEY3VB6W.js} +2 -2
  322. package/dist/{chunk-I6K5FBRQ.js → chunk-UI3NYK34.js} +4 -1
  323. package/dist/{chunk-I6K5FBRQ.js.map → chunk-UI3NYK34.js.map} +1 -1
  324. package/dist/{chunk-VBJ7V5SK.js → chunk-UIPDNLXA.js} +21 -8
  325. package/dist/chunk-UIPDNLXA.js.map +1 -0
  326. package/dist/{chunk-GIF42EW3.js → chunk-UP6MOYCB.js} +3 -3
  327. package/dist/{chunk-K4FLSOR5.js → chunk-USYGGIJZ.js} +44 -15
  328. package/dist/chunk-USYGGIJZ.js.map +1 -0
  329. package/dist/{chunk-FIT6DMX6.js → chunk-UWY7GIVS.js} +152 -54
  330. package/dist/chunk-UWY7GIVS.js.map +1 -0
  331. package/dist/{chunk-MRILGULB.js → chunk-V2RCP53Q.js} +2 -2
  332. package/dist/{chunk-XKECPATV.js → chunk-VFUEZZBS.js} +113 -4
  333. package/dist/chunk-VFUEZZBS.js.map +1 -0
  334. package/dist/{chunk-FSFEQI74.js → chunk-W7L6HXUC.js} +2 -2
  335. package/dist/{chunk-3IQ2TR4N.js → chunk-WLEB7WCG.js} +2 -2
  336. package/dist/{chunk-GL6I6MEQ.js → chunk-WSGF57U2.js} +3 -3
  337. package/dist/{chunk-KNKUID7G.js → chunk-X7Y7WX73.js} +72 -6
  338. package/dist/chunk-X7Y7WX73.js.map +1 -0
  339. package/dist/{chunk-5NPGSAVB.js → chunk-XEKAG3FM.js} +23 -5
  340. package/dist/chunk-XEKAG3FM.js.map +1 -0
  341. package/dist/{chunk-3APJ5EVB.js → chunk-XKIQZXUB.js} +41 -26
  342. package/dist/chunk-XKIQZXUB.js.map +1 -0
  343. package/dist/chunk-XKXKSQU7.js +92 -0
  344. package/dist/chunk-XKXKSQU7.js.map +1 -0
  345. package/dist/{chunk-JA3AK3PT.js → chunk-XNLXAWHX.js} +4 -4
  346. package/dist/{chunk-CULXMQJH.js → chunk-XPXEJRUB.js} +3 -3
  347. package/dist/chunk-XPXEJRUB.js.map +1 -0
  348. package/dist/{chunk-PZIAX57I.js → chunk-XR6DNK4U.js} +7 -4
  349. package/dist/chunk-XR6DNK4U.js.map +1 -0
  350. package/dist/{chunk-47VWKCAF.js → chunk-XSQ4SGM5.js} +33 -4
  351. package/dist/chunk-XSQ4SGM5.js.map +1 -0
  352. package/dist/{chunk-66DHUKLO.js → chunk-XSWKORGM.js} +16 -14
  353. package/dist/chunk-XSWKORGM.js.map +1 -0
  354. package/dist/{chunk-QR3C7BKQ.js → chunk-XZ4WBBB5.js} +7 -8
  355. package/dist/chunk-XZ4WBBB5.js.map +1 -0
  356. package/dist/{chunk-WNARATI3.js → chunk-Y2SXZ5KZ.js} +59 -11
  357. package/dist/chunk-Y2SXZ5KZ.js.map +1 -0
  358. package/dist/{chunk-SIC6U3GZ.js → chunk-YHV3KRKS.js} +3 -3
  359. package/dist/{chunk-ZPKBYX2F.js → chunk-YNDLCWXS.js} +85 -9
  360. package/dist/chunk-YNDLCWXS.js.map +1 -0
  361. package/dist/{chunk-VLXA6PI2.js → chunk-YQMZ7IH2.js} +4 -4
  362. package/dist/{chunk-TMM4S4IJ.js → chunk-YR6GIWWY.js} +58 -8
  363. package/dist/chunk-YR6GIWWY.js.map +1 -0
  364. package/dist/{chunk-DK5LDEQM.js → chunk-YR7XMOWK.js} +39 -23
  365. package/dist/chunk-YR7XMOWK.js.map +1 -0
  366. package/dist/chunk-ZFXCQPNO.js +27 -0
  367. package/dist/chunk-ZFXCQPNO.js.map +1 -0
  368. package/dist/citations.js +1 -1
  369. package/dist/{cli-kuh9PwZ5.d.ts → cli-X4NJoqSe.d.ts} +8 -31
  370. package/dist/cli.d.ts +10 -6
  371. package/dist/cli.js +122 -117
  372. package/dist/commitment-ledger.js +2 -2
  373. package/dist/compat/checks.js +1 -2
  374. package/dist/compounding/engine.d.ts +3 -2
  375. package/dist/compounding/engine.js +11 -11
  376. package/dist/compounding/preference-consolidator.d.ts +1 -0
  377. package/dist/compounding/preference-consolidator.js +8 -8
  378. package/dist/compounding/preference-consolidator.js.map +1 -1
  379. package/dist/compression-optimizer.d.ts +1 -0
  380. package/dist/compression-optimizer.js +1 -1
  381. package/dist/config.d.ts +1 -0
  382. package/dist/config.js +3 -2
  383. package/dist/connectors/codex-materialize-runner.d.ts +1 -0
  384. package/dist/connectors/codex-materialize-runner.js +12 -11
  385. package/dist/connectors/codex-materialize.d.ts +1 -0
  386. package/dist/connectors/codex-materialize.js +3 -2
  387. package/dist/connectors/index.d.ts +1 -0
  388. package/dist/connectors/index.js +14 -14
  389. package/dist/{connectors-cli-CwbyjGR7.d.ts → connectors-cli-DbTPNj2H.d.ts} +7 -1
  390. package/dist/connectors-cli.d.ts +1 -1
  391. package/dist/connectors-cli.js +3 -1
  392. package/dist/consolidation-provenance-check.d.ts +1 -0
  393. package/dist/consolidation-provenance-check.js +2 -2
  394. package/dist/consolidation-undo.d.ts +1 -0
  395. package/dist/consolidation-undo.js +1 -1
  396. package/dist/contradiction/index.d.ts +3 -1
  397. package/dist/contradiction/index.js +3 -3
  398. package/dist/{contradiction-review-ATP4S6IC.js → contradiction-review-6V2LXXK6.js} +2 -2
  399. package/dist/{contradiction-scan-5A4IDZV5.js → contradiction-scan-GIRVC4C7.js} +3 -3
  400. package/dist/conversation-index/backend.d.ts +3 -1
  401. package/dist/conversation-index/backend.js +3 -3
  402. package/dist/conversation-index/chunker.d.ts +1 -0
  403. package/dist/conversation-index/cleanup.js +1 -1
  404. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  405. package/dist/conversation-index/faiss-adapter.js +1 -1
  406. package/dist/conversation-index/indexer.d.ts +5 -2
  407. package/dist/conversation-index/indexer.js +1 -1
  408. package/dist/conversation-index/search.d.ts +2 -1
  409. package/dist/cross-namespace-budget.js +1 -1
  410. package/dist/cue-anchors.js +2 -2
  411. package/dist/dashboard-runtime.d.ts +6 -0
  412. package/dist/dashboard-runtime.js +3 -3
  413. package/dist/day-summary.d.ts +1 -0
  414. package/dist/day-summary.js +2 -2
  415. package/dist/delinearize.d.ts +1 -0
  416. package/dist/direct-answer-wiring.d.ts +1 -0
  417. package/dist/direct-answer.d.ts +1 -0
  418. package/dist/{dreams-ledger-LR2NBAZE.js → dreams-ledger-3WSCI5V4.js} +5 -4
  419. package/dist/{dreams-ledger-LR2NBAZE.js.map → dreams-ledger-3WSCI5V4.js.map} +1 -1
  420. package/dist/embedding-fallback.d.ts +3 -0
  421. package/dist/embedding-fallback.js +2 -2
  422. package/dist/enrichment/index.d.ts +1 -0
  423. package/dist/enrichment/index.js +1 -1
  424. package/dist/entity-retrieval.d.ts +2 -0
  425. package/dist/entity-retrieval.js +9 -9
  426. package/dist/entity-schema.d.ts +1 -0
  427. package/dist/evals.js +1 -1
  428. package/dist/explicit-capture.d.ts +5 -3
  429. package/dist/explicit-capture.js +2 -2
  430. package/dist/extraction-judge-telemetry.d.ts +2 -0
  431. package/dist/extraction-judge-training.d.ts +2 -0
  432. package/dist/extraction-judge.d.ts +2 -0
  433. package/dist/extraction.d.ts +2 -0
  434. package/dist/extraction.js +12 -12
  435. package/dist/{faiss-adapter-CzPghc4C.d.ts → faiss-adapter-BHecI1fF.d.ts} +4 -1
  436. package/dist/fallback-llm.d.ts +11 -1
  437. package/dist/fallback-llm.js +8 -6
  438. package/dist/{first-start-migration-4MHQEOSD.js → first-start-migration-CKTCTCQI.js} +5 -5
  439. package/dist/graph-dashboard-diff.d.ts +4 -0
  440. package/dist/graph-dashboard-diff.js +1 -1
  441. package/dist/graph-dashboard-parser.js +1 -1
  442. package/dist/{graph-edge-decay-5DI5GUNL.js → graph-edge-decay-MUP5J7CC.js} +6 -6
  443. package/dist/graph-events.js +1 -1
  444. package/dist/graph-snapshot.js +3 -3
  445. package/dist/graph.js +2 -2
  446. package/dist/harmonic-retrieval.js +4 -4
  447. package/dist/identity-continuity.d.ts +1 -0
  448. package/dist/importance.d.ts +1 -0
  449. package/dist/importers/index.d.ts +244 -0
  450. package/dist/importers/index.js +20 -0
  451. package/dist/index.d.ts +20 -350
  452. package/dist/index.js +884 -561
  453. package/dist/index.js.map +1 -1
  454. package/dist/intent.d.ts +1 -0
  455. package/dist/lcm/archive.d.ts +2 -2
  456. package/dist/lcm/archive.js +2 -2
  457. package/dist/lcm/engine.d.ts +3 -2
  458. package/dist/lcm/engine.js +6 -6
  459. package/dist/lcm/index.d.ts +1 -0
  460. package/dist/lcm/index.js +8 -8
  461. package/dist/lcm/recall.js +1 -1
  462. package/dist/lcm/summarizer.js +3 -3
  463. package/dist/lcm/tools.d.ts +1 -0
  464. package/dist/lifecycle.d.ts +1 -0
  465. package/dist/live-connectors-runner.d.ts +1 -0
  466. package/dist/live-connectors-runner.js +6 -6
  467. package/dist/local-llm.d.ts +1 -0
  468. package/dist/local-llm.js +2 -2
  469. package/dist/maintenance/archive-observations.js +1 -1
  470. package/dist/maintenance/memory-governance.d.ts +3 -1
  471. package/dist/maintenance/memory-governance.js +10 -8
  472. package/dist/maintenance/migrate-observations.js +3 -2
  473. package/dist/maintenance/observation-ledger-utils.d.ts +3 -0
  474. package/dist/maintenance/observation-ledger-utils.js +2 -1
  475. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -1
  476. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -8
  477. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -1
  478. package/dist/maintenance/rebuild-memory-projection.js +13 -10
  479. package/dist/maintenance/rebuild-observations.d.ts +1 -0
  480. package/dist/maintenance/rebuild-observations.js +3 -2
  481. package/dist/mcp-memory-inspector-app.d.ts +7 -4
  482. package/dist/mcp-memory-inspector-app.js +1 -1
  483. package/dist/memory-action-policy.d.ts +1 -0
  484. package/dist/memory-cache.d.ts +1 -0
  485. package/dist/memory-cache.js +1 -1
  486. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -0
  487. package/dist/memory-projection-store.d.ts +1 -0
  488. package/dist/memory-projection-store.js +1 -1
  489. package/dist/memory-provenance.d.ts +1 -0
  490. package/dist/memory-worth-outcomes.d.ts +1 -0
  491. package/dist/migrate/from-engram.js +2 -2
  492. package/dist/{migrate-from-identity-anchor-G27MCD6A.js → migrate-from-identity-anchor-EB4XI4Q2.js} +2 -2
  493. package/dist/model-registry.js +1 -1
  494. package/dist/models-json.d.ts +1 -0
  495. package/dist/namespaces/migrate.d.ts +3 -0
  496. package/dist/namespaces/migrate.js +24 -22
  497. package/dist/namespaces/principal.d.ts +1 -0
  498. package/dist/namespaces/principal.js +2 -1
  499. package/dist/namespaces/search.d.ts +1 -0
  500. package/dist/namespaces/search.js +15 -13
  501. package/dist/namespaces/storage.d.ts +4 -2
  502. package/dist/namespaces/storage.js +10 -9
  503. package/dist/native-knowledge.d.ts +1 -0
  504. package/dist/native-knowledge.js +1 -1
  505. package/dist/negative.js +1 -1
  506. package/dist/network/webdav.d.ts +16 -1
  507. package/dist/network/webdav.js +5 -3
  508. package/dist/objective-state-writers.js +4 -4
  509. package/dist/objective-state.js +2 -2
  510. package/dist/offline-sync.js +4 -4
  511. package/dist/operator-toolkit.d.ts +1 -0
  512. package/dist/operator-toolkit.js +35 -32
  513. package/dist/opik-exporter.js +1 -1
  514. package/dist/{orchestrator-DuWl9Hwx.d.ts → orchestrator-Co9nxRLF.d.ts} +4 -74
  515. package/dist/orchestrator.d.ts +5 -3
  516. package/dist/orchestrator.js +99 -96
  517. package/dist/page-versioning.js +1 -1
  518. package/dist/path-X2K5XCHL.js +9 -0
  519. package/dist/patterns-cli.d.ts +1 -0
  520. package/dist/peers/index.d.ts +328 -0
  521. package/dist/{peers-HCVGHMAE.js → peers/index.js} +4 -4
  522. package/dist/pipeline-D18UAKlN.d.ts +32 -0
  523. package/dist/plugin-entry-resolver.d.ts +9 -0
  524. package/dist/plugin-entry-resolver.js +8 -0
  525. package/dist/plugin-entry-resolver.js.map +1 -0
  526. package/dist/plugin-id.d.ts +2 -21
  527. package/dist/plugin-id.js +33 -4
  528. package/dist/plugin-id.js.map +1 -1
  529. package/dist/policy-runtime.d.ts +4 -0
  530. package/dist/policy-runtime.js +1 -1
  531. package/dist/profiling.js +1 -1
  532. package/dist/qmd-recall-cache.d.ts +1 -0
  533. package/dist/qmd.d.ts +1 -0
  534. package/dist/qmd.js +3 -3
  535. package/dist/recall-disclosure-escalation.d.ts +1 -0
  536. package/dist/recall-explain-renderer.d.ts +1 -0
  537. package/dist/recall-explain-renderer.js +3 -3
  538. package/dist/recall-state.d.ts +8 -1
  539. package/dist/recall-state.js +2 -1
  540. package/dist/recall-tag-filter.d.ts +1 -0
  541. package/dist/recall-xray-cli.d.ts +1 -0
  542. package/dist/recall-xray-cli.js +4 -4
  543. package/dist/recall-xray-renderer.d.ts +1 -0
  544. package/dist/recall-xray-renderer.js +3 -3
  545. package/dist/recall-xray.d.ts +1 -0
  546. package/dist/recall-xray.js +2 -2
  547. package/dist/relevance.d.ts +7 -1
  548. package/dist/relevance.js +2 -1
  549. package/dist/replay/normalizers/chatgpt.js +2 -2
  550. package/dist/replay/normalizers/claude.js +2 -2
  551. package/dist/replay/normalizers/openclaw.js +2 -2
  552. package/dist/replay/normalizers/shared.js +1 -1
  553. package/dist/replay/runner.js +1 -1
  554. package/dist/rerank.js +1 -1
  555. package/dist/{resolution-B7FNQSSP.js → resolution-ZY7VM6WS.js} +3 -3
  556. package/dist/resolution-ZY7VM6WS.js.map +1 -0
  557. package/dist/resolve-auth-token.d.ts +1 -0
  558. package/dist/resolve-auth-token.js +1 -1
  559. package/dist/resolve-provider-secret.d.ts +19 -29
  560. package/dist/resolve-provider-secret.js +2 -6
  561. package/dist/resume-bundles.js +10 -9
  562. package/dist/retrieval-agents.d.ts +2 -1
  563. package/dist/retrieval-agents.js +2 -1
  564. package/dist/retrieval-tiers.d.ts +1 -0
  565. package/dist/routing/engine.d.ts +1 -0
  566. package/dist/routing/store.d.ts +3 -0
  567. package/dist/routing/store.js +1 -1
  568. package/dist/runtime/env.js +1 -1
  569. package/dist/schemas.d.ts +191 -17
  570. package/dist/schemas.js +1 -1
  571. package/dist/sdk-compat.js +1 -1
  572. package/dist/search/document-scanner.js +1 -1
  573. package/dist/search/embed-helper.d.ts +7 -2
  574. package/dist/search/embed-helper.js +3 -1
  575. package/dist/search/factory.d.ts +2 -1
  576. package/dist/search/factory.js +13 -12
  577. package/dist/search/index.d.ts +2 -1
  578. package/dist/search/index.js +19 -18
  579. package/dist/search/lancedb-backend.d.ts +7 -6
  580. package/dist/search/lancedb-backend.js +4 -2
  581. package/dist/search/meilisearch-backend.d.ts +7 -6
  582. package/dist/search/meilisearch-backend.js +4 -2
  583. package/dist/search/noop-backend.d.ts +1 -0
  584. package/dist/search/orama-backend.d.ts +9 -7
  585. package/dist/search/orama-backend.js +8 -4
  586. package/dist/search/port.d.ts +1 -0
  587. package/dist/search/remote-backend.d.ts +1 -0
  588. package/dist/secure-store/index.d.ts +16 -3
  589. package/dist/secure-store/index.js +2 -2
  590. package/dist/{semantic-VwGI14Ok.d.ts → semantic-SLAa_prH.d.ts} +5 -3
  591. package/dist/semantic-consolidation.d.ts +1 -0
  592. package/dist/semantic-consolidation.js +14 -13
  593. package/dist/semantic-rule-promotion.js +8 -8
  594. package/dist/semantic-rule-verifier.d.ts +1 -0
  595. package/dist/semantic-rule-verifier.js +8 -8
  596. package/dist/session-integrity.d.ts +1 -0
  597. package/dist/session-integrity.js +1 -1
  598. package/dist/session-observer-bands.d.ts +1 -0
  599. package/dist/session-observer-state.d.ts +6 -1
  600. package/dist/session-observer-state.js +1 -1
  601. package/dist/shared-context/manager.d.ts +5 -0
  602. package/dist/shared-context/manager.js +3 -3
  603. package/dist/signal.d.ts +1 -0
  604. package/dist/signal.js +1 -1
  605. package/dist/source-attribution.js +1 -1
  606. package/dist/state-store-4QZISH3J.js +30 -0
  607. package/dist/state-store-4QZISH3J.js.map +1 -0
  608. package/dist/storage-C4DX8CuG.d.ts +157 -0
  609. package/dist/storage.d.ts +2 -0
  610. package/dist/storage.js +7 -7
  611. package/dist/store-contract.js +1 -1
  612. package/dist/summarizer.d.ts +1 -0
  613. package/dist/summarizer.js +7 -7
  614. package/dist/summary-snapshot.d.ts +1 -0
  615. package/dist/surfaces/dreams.js +48 -17
  616. package/dist/surfaces/dreams.js.map +1 -1
  617. package/dist/temporal-supersession.d.ts +1 -0
  618. package/dist/temporal-supersession.js +1 -1
  619. package/dist/temporal-validity.d.ts +1 -0
  620. package/dist/threading.d.ts +1 -0
  621. package/dist/tier-migration.d.ts +1 -0
  622. package/dist/tier-routing.d.ts +1 -0
  623. package/dist/{tier-stats-62ZVDFKS.js → tier-stats-SKML2OSF.js} +5 -5
  624. package/dist/tmt.js +1 -1
  625. package/dist/tokens.js +2 -2
  626. package/dist/topics.d.ts +1 -0
  627. package/dist/{trace-C5ETWBEF.js → trace-WM7V4CKI.js} +31 -1
  628. package/dist/trace-WM7V4CKI.js.map +1 -0
  629. package/dist/transcript.d.ts +1 -0
  630. package/dist/transcript.js +2 -2
  631. package/dist/transfer/autodetect.js +7 -7
  632. package/dist/transfer/backup.js +5 -5
  633. package/dist/transfer/capsule-export.js +5 -5
  634. package/dist/transfer/capsule-import.d.ts +6 -0
  635. package/dist/transfer/capsule-import.js +4 -4
  636. package/dist/transfer/export-json.js +3 -3
  637. package/dist/transfer/export-md.js +3 -3
  638. package/dist/transfer/export-sqlite.js +3 -3
  639. package/dist/transfer/fs-utils.d.ts +2 -1
  640. package/dist/transfer/fs-utils.js +5 -3
  641. package/dist/transfer/import-json.js +3 -3
  642. package/dist/transfer/import-md.js +3 -3
  643. package/dist/transfer/import-sqlite.js +3 -3
  644. package/dist/trust-zones.js +2 -2
  645. package/dist/types-B1VHaf2w.d.ts +126 -0
  646. package/dist/types-BliCnURB.d.ts +83 -0
  647. package/dist/types.d.ts +35 -0
  648. package/dist/types.js +1 -1
  649. package/dist/utility-learner.js +3 -3
  650. package/dist/utility-runtime.d.ts +1 -0
  651. package/dist/utility-runtime.js +4 -4
  652. package/dist/utility-telemetry.js +2 -2
  653. package/dist/verified-recall.js +9 -9
  654. package/dist/work/board.js +2 -2
  655. package/dist/work/boundary.js +1 -1
  656. package/dist/work/storage.d.ts +5 -0
  657. package/dist/work/storage.js +1 -1
  658. package/dist/work-product-ledger.js +2 -2
  659. package/package.json +74 -3
  660. package/scripts/ensure-better-sqlite3.mjs +8 -7
  661. package/scripts/faiss_index.py +141 -29
  662. package/src/access-cli.test.ts +87 -2
  663. package/src/access-cli.ts +59 -5
  664. package/src/access-http.test.ts +150 -0
  665. package/src/access-http.ts +89 -34
  666. package/src/access-idempotency.ts +136 -3
  667. package/src/access-mcp.test.ts +155 -0
  668. package/src/access-mcp.ts +116 -30
  669. package/src/access-schema.ts +22 -4
  670. package/src/access-service-project-tag.test.ts +37 -0
  671. package/src/access-service.ts +11 -10
  672. package/src/active-recall.test.ts +29 -1
  673. package/src/active-recall.ts +11 -7
  674. package/src/adapters/claude-code.ts +7 -8
  675. package/src/adapters/codex.ts +6 -7
  676. package/src/adapters/hermes.ts +1 -5
  677. package/src/adapters/registry.test.ts +63 -0
  678. package/src/adapters/registry.ts +10 -0
  679. package/src/adapters/replit.ts +5 -7
  680. package/src/adapters/types.ts +24 -1
  681. package/src/behavior-signals.ts +1 -1
  682. package/src/binary-lifecycle/backend.ts +16 -4
  683. package/src/binary-lifecycle/pipeline.test.ts +149 -0
  684. package/src/binary-lifecycle/pipeline.ts +49 -7
  685. package/src/binary-lifecycle/scanner.ts +19 -4
  686. package/src/boxes.ts +119 -32
  687. package/src/buffer-session.test.ts +28 -0
  688. package/src/buffer.ts +10 -14
  689. package/src/bulk-import/types.ts +10 -0
  690. package/src/calibration.test.ts +99 -0
  691. package/src/calibration.ts +57 -13
  692. package/src/causal-consolidation.test.ts +214 -0
  693. package/src/causal-consolidation.ts +131 -14
  694. package/src/causal-retrieval.ts +16 -3
  695. package/src/citations.test.ts +75 -0
  696. package/src/citations.ts +19 -6
  697. package/src/cli.ts +134 -109
  698. package/src/coding/coding-namespace.test.ts +7 -0
  699. package/src/coding/coding-namespace.ts +8 -0
  700. package/src/coding/review-context.test.ts +30 -0
  701. package/src/coding/review-context.ts +79 -9
  702. package/src/coding/wire-coding-context.test.ts +16 -0
  703. package/src/compat/checks.test.ts +33 -0
  704. package/src/compat/checks.ts +64 -4
  705. package/src/compounding/engine.ts +2 -2
  706. package/src/compounding/preference-consolidator.test.ts +47 -0
  707. package/src/compounding/preference-consolidator.ts +8 -8
  708. package/src/compression-optimizer.ts +5 -2
  709. package/src/config.test.ts +34 -2
  710. package/src/config.ts +62 -18
  711. package/src/connectors/codex-materialize-runner.ts +4 -3
  712. package/src/connectors/codex-materialize.ts +149 -34
  713. package/src/connectors/index.test.ts +144 -7
  714. package/src/connectors/index.ts +86 -15
  715. package/src/connectors/live/github.test.ts +47 -0
  716. package/src/connectors/live/github.ts +29 -1
  717. package/src/connectors/live/index.ts +2 -0
  718. package/src/connectors/live/live-connectors.test.ts +359 -73
  719. package/src/connectors/live/notion.test.ts +84 -0
  720. package/src/connectors/live/notion.ts +18 -1
  721. package/src/connectors/live/state-store.ts +419 -38
  722. package/src/connectors/weclone-installer.test.ts +16 -18
  723. package/src/connectors-cli.ts +19 -0
  724. package/src/console/trace.test.ts +28 -0
  725. package/src/console/trace.ts +42 -5
  726. package/src/contradiction/contradiction-judge.test.ts +49 -0
  727. package/src/contradiction/contradiction-judge.ts +15 -5
  728. package/src/contradiction/contradiction-review.ts +31 -7
  729. package/src/contradiction/contradiction-scan.ts +28 -18
  730. package/src/contradiction/contradiction.test.ts +237 -1
  731. package/src/contradiction/resolution.ts +43 -4
  732. package/src/conversation-index/backend.ts +13 -5
  733. package/src/conversation-index/cleanup.ts +25 -4
  734. package/src/conversation-index/faiss-adapter.ts +24 -15
  735. package/src/conversation-index/indexer.test.ts +71 -10
  736. package/src/conversation-index/indexer.ts +22 -3
  737. package/src/cross-namespace-budget.test.ts +59 -0
  738. package/src/cross-namespace-budget.ts +15 -7
  739. package/src/curation/index.ts +18 -17
  740. package/src/dashboard-runtime.test.ts +98 -0
  741. package/src/dashboard-runtime.ts +96 -6
  742. package/src/dedup/index.test.ts +133 -0
  743. package/src/dedup/index.ts +73 -10
  744. package/src/dedup/semantic.test.ts +77 -2
  745. package/src/dedup/semantic.ts +26 -6
  746. package/src/embedding-fallback.ts +47 -15
  747. package/src/enrichment/audit.ts +8 -1
  748. package/src/enrichment/pipeline.ts +21 -13
  749. package/src/enrichment/web-search-provider.ts +1 -6
  750. package/src/entity-retrieval.ts +57 -6
  751. package/src/evals.ts +22 -13
  752. package/src/explicit-capture.test.ts +40 -0
  753. package/src/explicit-capture.ts +14 -2
  754. package/src/extraction.ts +42 -30
  755. package/src/fallback-llm.ts +35 -2
  756. package/src/graph-dashboard-diff.test.ts +57 -0
  757. package/src/graph-dashboard-diff.ts +24 -2
  758. package/src/graph-dashboard-parser.test.ts +31 -0
  759. package/src/graph-dashboard-parser.ts +4 -1
  760. package/src/graph-events.ts +6 -4
  761. package/src/graph.test.ts +69 -0
  762. package/src/graph.ts +7 -4
  763. package/src/importers/base.test.ts +70 -0
  764. package/src/importers/base.ts +56 -7
  765. package/src/index.ts +5 -2
  766. package/src/lcm/archive.ts +65 -16
  767. package/src/lcm/engine.ts +27 -8
  768. package/src/lcm/recall.ts +5 -5
  769. package/src/lcm-engine.test.ts +87 -1
  770. package/src/lcm-recall.test.ts +71 -0
  771. package/src/live-connectors-runner.ts +100 -36
  772. package/src/maintenance/archive-observations.ts +24 -3
  773. package/src/maintenance/atomic-file.ts +85 -0
  774. package/src/maintenance/dreams-ledger.ts +15 -8
  775. package/src/maintenance/memory-governance.test.ts +53 -0
  776. package/src/maintenance/memory-governance.ts +15 -5
  777. package/src/maintenance/observation-ledger-utils.ts +6 -5
  778. package/src/maintenance/purge.test.ts +64 -0
  779. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +22 -9
  780. package/src/maintenance/rebuild-memory-projection.ts +22 -9
  781. package/src/maintenance/rebuild-observations.ts +7 -3
  782. package/src/mcp-memory-inspector-app.ts +26 -3
  783. package/src/memory-cache.test.ts +19 -0
  784. package/src/memory-cache.ts +1 -0
  785. package/src/memory-extension/codex-publisher.ts +25 -4
  786. package/src/memory-extension-host/host-discovery.test.ts +69 -0
  787. package/src/memory-extension-host/host-discovery.ts +63 -6
  788. package/src/memory-projection-store.ts +114 -62
  789. package/src/message-parts/index.ts +46 -31
  790. package/src/message-parts/message-parts.test.ts +77 -0
  791. package/src/migrate/from-engram.ts +68 -14
  792. package/src/model-registry.test.ts +38 -0
  793. package/src/model-registry.ts +12 -7
  794. package/src/namespaces/identity.test.ts +66 -0
  795. package/src/namespaces/identity.ts +23 -0
  796. package/src/namespaces/migrate.test.ts +62 -0
  797. package/src/namespaces/migrate.ts +82 -14
  798. package/src/namespaces/principal.test.ts +37 -1
  799. package/src/namespaces/principal.ts +18 -7
  800. package/src/namespaces/search.test.ts +76 -6
  801. package/src/namespaces/search.ts +22 -21
  802. package/src/namespaces/storage.ts +93 -11
  803. package/src/native-knowledge.ts +23 -3
  804. package/src/negative.ts +50 -5
  805. package/src/network/webdav.ts +177 -58
  806. package/src/onboarding/index.test.ts +105 -0
  807. package/src/onboarding/index.ts +17 -5
  808. package/src/operator-toolkit.ts +39 -4
  809. package/src/orchestrator.ts +52 -17
  810. package/src/page-versioning.ts +31 -5
  811. package/src/peers/peers.test.ts +70 -0
  812. package/src/peers/storage.ts +32 -3
  813. package/src/plugin-entry-resolver.test.ts +60 -0
  814. package/src/plugin-entry-resolver.ts +48 -0
  815. package/src/plugin-id.test.ts +38 -0
  816. package/src/plugin-id.ts +31 -64
  817. package/src/policy-runtime.test.ts +75 -0
  818. package/src/policy-runtime.ts +32 -3
  819. package/src/procedural/procedure-miner.test.ts +152 -0
  820. package/src/procedural/procedure-miner.ts +124 -19
  821. package/src/profiling.test.ts +23 -0
  822. package/src/profiling.ts +10 -1
  823. package/src/projection/index.test.ts +253 -0
  824. package/src/projection/index.ts +159 -18
  825. package/src/qmd-client.test.ts +45 -0
  826. package/src/qmd.ts +8 -8
  827. package/src/recall-disclosure.test.ts +15 -1
  828. package/src/recall-state.ts +24 -5
  829. package/src/relevance.ts +24 -5
  830. package/src/replay/normalizers/chatgpt.ts +14 -4
  831. package/src/replay/normalizers/claude.ts +8 -3
  832. package/src/replay/normalizers/openclaw.ts +35 -12
  833. package/src/replay/normalizers/replay-normalizers.test.ts +65 -0
  834. package/src/replay/normalizers/shared.ts +4 -1
  835. package/src/replay/runner.ts +1 -1
  836. package/src/rerank.test.ts +41 -1
  837. package/src/rerank.ts +2 -2
  838. package/src/resolve-auth-token.test.ts +29 -0
  839. package/src/resolve-auth-token.ts +12 -7
  840. package/src/resolve-provider-secret.test.ts +78 -22
  841. package/src/resolve-provider-secret.ts +55 -223
  842. package/src/retrieval-agents.ts +51 -14
  843. package/src/review/index.test.ts +75 -1
  844. package/src/review/index.ts +88 -30
  845. package/src/routing/store.ts +36 -6
  846. package/src/runtime/env.test.ts +73 -0
  847. package/src/runtime/env.ts +7 -11
  848. package/src/schemas.ts +16 -1
  849. package/src/search/abort.ts +18 -0
  850. package/src/search/document-scanner.test.ts +80 -0
  851. package/src/search/document-scanner.ts +51 -9
  852. package/src/search/embed-helper.ts +19 -6
  853. package/src/search/factory.ts +9 -5
  854. package/src/search/lancedb-backend.ts +62 -22
  855. package/src/search/meilisearch-backend.ts +35 -12
  856. package/src/search/orama-backend.test.ts +27 -0
  857. package/src/search/orama-backend.ts +65 -15
  858. package/src/secure-store/cli-handlers.ts +70 -6
  859. package/src/secure-store/cli-renderer.ts +13 -7
  860. package/src/secure-store/secure-fs.ts +11 -5
  861. package/src/secure-store/secure-store.test.ts +70 -0
  862. package/src/semantic-consolidation.test.ts +45 -0
  863. package/src/semantic-consolidation.ts +3 -3
  864. package/src/session-integrity.test.ts +98 -0
  865. package/src/session-integrity.ts +51 -1
  866. package/src/session-observer-state.ts +108 -41
  867. package/src/shared-context/manager.ts +93 -15
  868. package/src/signal.test.ts +14 -0
  869. package/src/signal.ts +8 -1
  870. package/src/source-attribution.test.ts +8 -0
  871. package/src/source-attribution.ts +24 -2
  872. package/src/spaces/index.test.ts +93 -0
  873. package/src/spaces/index.ts +75 -9
  874. package/src/storage.ts +14 -1
  875. package/src/store-contract.test.ts +35 -0
  876. package/src/store-contract.ts +39 -5
  877. package/src/summarizer.ts +24 -18
  878. package/src/summary-snapshot.test.ts +77 -0
  879. package/src/surfaces/dreams.test.ts +73 -0
  880. package/src/surfaces/dreams.ts +53 -19
  881. package/src/sync/index.ts +42 -17
  882. package/src/taxonomy/taxonomy-loader.ts +43 -4
  883. package/src/temporal-supersession.test.ts +67 -0
  884. package/src/temporal-supersession.ts +8 -0
  885. package/src/tmt.test.ts +50 -0
  886. package/src/tmt.ts +35 -11
  887. package/src/tokens.test.ts +18 -0
  888. package/src/tokens.ts +7 -0
  889. package/src/training-export/converter.test.ts +55 -2
  890. package/src/training-export/converter.ts +36 -10
  891. package/src/training-export/registry.test.ts +17 -0
  892. package/src/training-export/registry.ts +19 -1
  893. package/src/transcript.ts +2 -2
  894. package/src/transfer/backup.ts +18 -7
  895. package/src/transfer/capsule-crypto.ts +105 -21
  896. package/src/transfer/capsule-encrypt.test.ts +106 -7
  897. package/src/transfer/capsule-export.ts +23 -14
  898. package/src/transfer/capsule-import.ts +11 -2
  899. package/src/transfer/exclusions.ts +7 -0
  900. package/src/transfer/export-sqlite.ts +14 -13
  901. package/src/transfer/fs-utils.ts +52 -1
  902. package/src/transfer/import-json.ts +12 -7
  903. package/src/transfer/import-md.ts +5 -5
  904. package/src/transfer/import-sqlite.ts +4 -5
  905. package/src/trust-zones.ts +1 -1
  906. package/src/types.ts +25 -0
  907. package/src/utility-telemetry.ts +1 -1
  908. package/src/utils/category-dir.test.ts +15 -0
  909. package/src/utils/category-dir.ts +3 -1
  910. package/src/work/boundary.ts +30 -18
  911. package/src/work/storage.ts +116 -38
  912. package/src/work-product-ledger.ts +1 -1
  913. package/dist/chunk-25MQ7IHJ.js.map +0 -1
  914. package/dist/chunk-2IWUMAES.js.map +0 -1
  915. package/dist/chunk-2NMMFZ5T.js.map +0 -1
  916. package/dist/chunk-2PRLKQAH.js.map +0 -1
  917. package/dist/chunk-326G7DJK.js.map +0 -1
  918. package/dist/chunk-3APJ5EVB.js.map +0 -1
  919. package/dist/chunk-3KW65B36.js.map +0 -1
  920. package/dist/chunk-3QKK7QOS.js.map +0 -1
  921. package/dist/chunk-3SLRNYNG.js.map +0 -1
  922. package/dist/chunk-3VAL7ZL2.js.map +0 -1
  923. package/dist/chunk-3Y4P7RXM.js.map +0 -1
  924. package/dist/chunk-3ZLVGM76.js.map +0 -1
  925. package/dist/chunk-43PJZYGL.js.map +0 -1
  926. package/dist/chunk-47VWKCAF.js.map +0 -1
  927. package/dist/chunk-4KGVTPGD.js.map +0 -1
  928. package/dist/chunk-5375UYTQ.js.map +0 -1
  929. package/dist/chunk-56K5QLHX.js.map +0 -1
  930. package/dist/chunk-575RMLWN.js.map +0 -1
  931. package/dist/chunk-5NPGSAVB.js.map +0 -1
  932. package/dist/chunk-5RGLBDQF.js.map +0 -1
  933. package/dist/chunk-65PG43EQ.js.map +0 -1
  934. package/dist/chunk-66DHUKLO.js.map +0 -1
  935. package/dist/chunk-6LVVDPJ4.js.map +0 -1
  936. package/dist/chunk-76FLAAUC.js.map +0 -1
  937. package/dist/chunk-77H5NU3M.js.map +0 -1
  938. package/dist/chunk-7MNMYOFP.js.map +0 -1
  939. package/dist/chunk-7OZ53EXP.js.map +0 -1
  940. package/dist/chunk-7SEAZFFB.js.map +0 -1
  941. package/dist/chunk-A6KTB5R6.js.map +0 -1
  942. package/dist/chunk-AGZQD76C.js.map +0 -1
  943. package/dist/chunk-APO3DCMU.js.map +0 -1
  944. package/dist/chunk-BVF3AGJP.js.map +0 -1
  945. package/dist/chunk-C5BCH4ZS.js.map +0 -1
  946. package/dist/chunk-C7VW7C3F.js.map +0 -1
  947. package/dist/chunk-CULXMQJH.js.map +0 -1
  948. package/dist/chunk-CYFQJMUV.js.map +0 -1
  949. package/dist/chunk-D654IBA6.js +0 -61
  950. package/dist/chunk-D654IBA6.js.map +0 -1
  951. package/dist/chunk-DGXUHMOV.js.map +0 -1
  952. package/dist/chunk-DINWEURR.js.map +0 -1
  953. package/dist/chunk-DK5LDEQM.js.map +0 -1
  954. package/dist/chunk-EABGC2TL.js.map +0 -1
  955. package/dist/chunk-EHRTFRWW.js.map +0 -1
  956. package/dist/chunk-EJI5XIBB.js.map +0 -1
  957. package/dist/chunk-FAAFWE4G.js.map +0 -1
  958. package/dist/chunk-FAJ7FZYM.js +0 -11
  959. package/dist/chunk-FAJ7FZYM.js.map +0 -1
  960. package/dist/chunk-FDU6HUUL.js +0 -147
  961. package/dist/chunk-FDU6HUUL.js.map +0 -1
  962. package/dist/chunk-FIT6DMX6.js.map +0 -1
  963. package/dist/chunk-FJ43PRLT.js.map +0 -1
  964. package/dist/chunk-FLTNHQK6.js +0 -262
  965. package/dist/chunk-FLTNHQK6.js.map +0 -1
  966. package/dist/chunk-GDFS42HT.js.map +0 -1
  967. package/dist/chunk-H3ME6L6D.js.map +0 -1
  968. package/dist/chunk-HXXBL2KD.js.map +0 -1
  969. package/dist/chunk-ICRIXAP2.js.map +0 -1
  970. package/dist/chunk-IQT3XTKW.js.map +0 -1
  971. package/dist/chunk-JR4ZC3G4.js.map +0 -1
  972. package/dist/chunk-K4FLSOR5.js.map +0 -1
  973. package/dist/chunk-KNKUID7G.js.map +0 -1
  974. package/dist/chunk-KOSORCJG.js.map +0 -1
  975. package/dist/chunk-LIRZNNUP.js.map +0 -1
  976. package/dist/chunk-LLQ2LLWF.js.map +0 -1
  977. package/dist/chunk-LPMVBPA3.js +0 -236
  978. package/dist/chunk-LPMVBPA3.js.map +0 -1
  979. package/dist/chunk-LT3NLYSI.js.map +0 -1
  980. package/dist/chunk-LUDTDZLK.js.map +0 -1
  981. package/dist/chunk-MJFNCJXV.js.map +0 -1
  982. package/dist/chunk-MSWG7JI6.js.map +0 -1
  983. package/dist/chunk-MXC3AP5I.js.map +0 -1
  984. package/dist/chunk-MXFBBHJU.js.map +0 -1
  985. package/dist/chunk-MZH6EHNR.js.map +0 -1
  986. package/dist/chunk-N2D6GXBM.js.map +0 -1
  987. package/dist/chunk-NBNN5GOB.js.map +0 -1
  988. package/dist/chunk-NMZY542O.js.map +0 -1
  989. package/dist/chunk-NZL6GGQE.js.map +0 -1
  990. package/dist/chunk-OZHRDTDX.js.map +0 -1
  991. package/dist/chunk-PZIAX57I.js.map +0 -1
  992. package/dist/chunk-Q7P4WJDP.js.map +0 -1
  993. package/dist/chunk-QA2ZAPBU.js.map +0 -1
  994. package/dist/chunk-QDZ2RLEC.js.map +0 -1
  995. package/dist/chunk-QLLBRHAT.js.map +0 -1
  996. package/dist/chunk-QR3C7BKQ.js.map +0 -1
  997. package/dist/chunk-RHY3HH7P.js.map +0 -1
  998. package/dist/chunk-RK2Y4XOM.js.map +0 -1
  999. package/dist/chunk-RR2PKP3I.js +0 -63
  1000. package/dist/chunk-RR2PKP3I.js.map +0 -1
  1001. package/dist/chunk-RRF5UOBJ.js.map +0 -1
  1002. package/dist/chunk-RXDLTSWT.js.map +0 -1
  1003. package/dist/chunk-RYED3SPJ.js +0 -42
  1004. package/dist/chunk-RYED3SPJ.js.map +0 -1
  1005. package/dist/chunk-S7KDBTWT.js.map +0 -1
  1006. package/dist/chunk-TK4UEOSK.js.map +0 -1
  1007. package/dist/chunk-TMM4S4IJ.js.map +0 -1
  1008. package/dist/chunk-TMQLARTH.js.map +0 -1
  1009. package/dist/chunk-TPB3I2AC.js.map +0 -1
  1010. package/dist/chunk-TPMQ3G6Z.js.map +0 -1
  1011. package/dist/chunk-TPU5L5EY.js.map +0 -1
  1012. package/dist/chunk-TZOLIGIG.js.map +0 -1
  1013. package/dist/chunk-U3WSW6PZ.js.map +0 -1
  1014. package/dist/chunk-U4SCL7B7.js.map +0 -1
  1015. package/dist/chunk-U66YHYC7.js +0 -31
  1016. package/dist/chunk-U66YHYC7.js.map +0 -1
  1017. package/dist/chunk-UWVJF25J.js.map +0 -1
  1018. package/dist/chunk-VBJ7V5SK.js.map +0 -1
  1019. package/dist/chunk-W3LR522O.js.map +0 -1
  1020. package/dist/chunk-W4L6CZKA.js.map +0 -1
  1021. package/dist/chunk-W6AQJ2PY.js.map +0 -1
  1022. package/dist/chunk-WELDCG6C.js.map +0 -1
  1023. package/dist/chunk-WNARATI3.js.map +0 -1
  1024. package/dist/chunk-WPGJYVUH.js.map +0 -1
  1025. package/dist/chunk-WW3QQF4H.js.map +0 -1
  1026. package/dist/chunk-XIG5PDM7.js.map +0 -1
  1027. package/dist/chunk-XKECPATV.js.map +0 -1
  1028. package/dist/chunk-XKLD5OK4.js.map +0 -1
  1029. package/dist/chunk-XSZEP4SF.js.map +0 -1
  1030. package/dist/chunk-XVVIG67A.js.map +0 -1
  1031. package/dist/chunk-XYIK4LF6.js.map +0 -1
  1032. package/dist/chunk-YRMVARQP.js.map +0 -1
  1033. package/dist/chunk-YROHKYBY.js.map +0 -1
  1034. package/dist/chunk-YU5KIWYQ.js.map +0 -1
  1035. package/dist/chunk-ZAVUCJ4H.js.map +0 -1
  1036. package/dist/chunk-ZPKBYX2F.js.map +0 -1
  1037. package/dist/chunk-ZTFCYYEZ.js.map +0 -1
  1038. package/dist/chunk-ZYVPLJ4T.js.map +0 -1
  1039. package/dist/path-MR5JPYOP.js +0 -9
  1040. package/dist/state-store-VZU2IA53.js +0 -16
  1041. package/dist/trace-C5ETWBEF.js.map +0 -1
  1042. /package/dist/{capsule-crypto-5CYAGVC5.js.map → bulk-import/index.js.map} +0 -0
  1043. /package/dist/{contradiction-review-ATP4S6IC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  1044. /package/dist/{capsule-merge-4MGKE7C5.js.map → capsule-merge-T2JRE46P.js.map} +0 -0
  1045. /package/dist/{chunk-SAZS2QZB.js.map → chunk-23UORJ4S.js.map} +0 -0
  1046. /package/dist/{chunk-PK7H5L6Y.js.map → chunk-2NM43EWN.js.map} +0 -0
  1047. /package/dist/{chunk-PYXS46O7.js.map → chunk-3BP57I6J.js.map} +0 -0
  1048. /package/dist/{chunk-FBYESMQ2.js.map → chunk-3C5RPJAX.js.map} +0 -0
  1049. /package/dist/{chunk-U7EJOMFC.js.map → chunk-4Q73JBSM.js.map} +0 -0
  1050. /package/dist/{chunk-N53K2EXC.js.map → chunk-6VF75M3X.js.map} +0 -0
  1051. /package/dist/{chunk-6H2TESSP.js.map → chunk-765K3SAT.js.map} +0 -0
  1052. /package/dist/{chunk-EDTHC6UD.js.map → chunk-77NAFXUD.js.map} +0 -0
  1053. /package/dist/{chunk-MGKYQQYF.js.map → chunk-7Q3RCKAQ.js.map} +0 -0
  1054. /package/dist/{chunk-34DQE4KF.js.map → chunk-CO7ZO4TU.js.map} +0 -0
  1055. /package/dist/{chunk-ZKSK55RC.js.map → chunk-ETUPBUHB.js.map} +0 -0
  1056. /package/dist/{chunk-QRNI5JBH.js.map → chunk-EYIEWJNI.js.map} +0 -0
  1057. /package/dist/{chunk-C6QPK5GG.js.map → chunk-FZZ2QTJI.js.map} +0 -0
  1058. /package/dist/{chunk-3JXBXXM2.js.map → chunk-G4IAEX6D.js.map} +0 -0
  1059. /package/dist/{chunk-2WWLHTZY.js.map → chunk-IC4GELZE.js.map} +0 -0
  1060. /package/dist/{chunk-PCUKNJAZ.js.map → chunk-JKV57BTN.js.map} +0 -0
  1061. /package/dist/{chunk-2KI4QFHU.js.map → chunk-LMDRGRJ2.js.map} +0 -0
  1062. /package/dist/{chunk-MY6TPVXW.js.map → chunk-LMPHTYJC.js.map} +0 -0
  1063. /package/dist/{chunk-5HRY2WRF.js.map → chunk-LZ3VEOU5.js.map} +0 -0
  1064. /package/dist/{chunk-NGAVDO7E.js.map → chunk-OADWQ5CR.js.map} +0 -0
  1065. /package/dist/{chunk-DOM4GKSW.js.map → chunk-OZKVVUJB.js.map} +0 -0
  1066. /package/dist/{chunk-MT4HVDUZ.js.map → chunk-PM3QHTFT.js.map} +0 -0
  1067. /package/dist/{chunk-ZK7I7JYV.js.map → chunk-R3PS27B4.js.map} +0 -0
  1068. /package/dist/{chunk-SKE7JYKA.js.map → chunk-SFXKHM7P.js.map} +0 -0
  1069. /package/dist/{chunk-HMDCOMYU.js.map → chunk-SKGV326D.js.map} +0 -0
  1070. /package/dist/{chunk-5UM2VJ6D.js.map → chunk-UEY3VB6W.js.map} +0 -0
  1071. /package/dist/{chunk-GIF42EW3.js.map → chunk-UP6MOYCB.js.map} +0 -0
  1072. /package/dist/{chunk-MRILGULB.js.map → chunk-V2RCP53Q.js.map} +0 -0
  1073. /package/dist/{chunk-FSFEQI74.js.map → chunk-W7L6HXUC.js.map} +0 -0
  1074. /package/dist/{chunk-3IQ2TR4N.js.map → chunk-WLEB7WCG.js.map} +0 -0
  1075. /package/dist/{chunk-GL6I6MEQ.js.map → chunk-WSGF57U2.js.map} +0 -0
  1076. /package/dist/{chunk-JA3AK3PT.js.map → chunk-XNLXAWHX.js.map} +0 -0
  1077. /package/dist/{chunk-SIC6U3GZ.js.map → chunk-YHV3KRKS.js.map} +0 -0
  1078. /package/dist/{chunk-VLXA6PI2.js.map → chunk-YQMZ7IH2.js.map} +0 -0
  1079. /package/dist/{contradiction-scan-5A4IDZV5.js.map → contradiction-review-6V2LXXK6.js.map} +0 -0
  1080. /package/dist/{migrate-from-identity-anchor-G27MCD6A.js.map → contradiction-scan-GIRVC4C7.js.map} +0 -0
  1081. /package/dist/{first-start-migration-4MHQEOSD.js.map → first-start-migration-CKTCTCQI.js.map} +0 -0
  1082. /package/dist/{graph-edge-decay-5DI5GUNL.js.map → graph-edge-decay-MUP5J7CC.js.map} +0 -0
  1083. /package/dist/{path-MR5JPYOP.js.map → importers/index.js.map} +0 -0
  1084. /package/dist/{peers-HCVGHMAE.js.map → migrate-from-identity-anchor-EB4XI4Q2.js.map} +0 -0
  1085. /package/dist/{resolution-B7FNQSSP.js.map → path-X2K5XCHL.js.map} +0 -0
  1086. /package/dist/{state-store-VZU2IA53.js.map → peers/index.js.map} +0 -0
  1087. /package/dist/{tier-stats-62ZVDFKS.js.map → tier-stats-SKML2OSF.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/access-http.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport { randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath, URL } from \"node:url\";\nimport { gunzipSync } from \"node:zlib\";\nimport { log } from \"./logger.js\";\nimport { EngramAccessInputError, type EngramAccessService } from \"./access-service.js\";\nimport { EngramMcpServer } from \"./access-mcp.js\";\nimport { validateRequest, type SchemaName, type SchemaTypeFor } from \"./access-schema.js\";\nimport {\n OFFLINE_SYNC_APPLY_MAX_BODY_BYTES,\n OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES,\n OFFLINE_SYNC_SNAPSHOT_BASE_MAX_BODY_BYTES,\n} from \"./offline-sync.js\";\nimport type { RecallDisclosure, RecallPlanMode } from \"./types.js\";\nimport { isRecallDisclosure } from \"./types.js\";\nimport { isTrustZoneName, type TrustZoneName, type TrustZoneRecordKind, type TrustZoneSourceClass } from \"./trust-zones.js\";\nimport { AdapterRegistry, type ResolvedIdentity } from \"./adapters/index.js\";\nimport type { CitationEntry } from \"./citations.js\";\nimport {\n subscribeGraphEvents,\n type GraphEvent,\n} from \"./graph-events.js\";\nimport { expandTildePath } from \"./utils/path.js\";\nimport { projectTagProjectId } from \"./coding/coding-namespace.js\";\n\nexport interface EngramAccessHttpServerOptions {\n service: EngramAccessService;\n host?: string;\n port?: number;\n authToken?: string;\n /** Additional valid tokens (for multi-connector auth). Checked alongside authToken. */\n authTokens?: string[];\n /** Dynamic token loader — called on each auth check so new/revoked tokens take effect without restart. */\n authTokensGetter?: () => string[];\n principal?: string;\n maxBodyBytes?: number;\n adminConsoleEnabled?: boolean;\n adminConsolePublicDir?: string;\n trustPrincipalHeader?: boolean;\n /** Enable adapter-based identity resolution from request headers */\n enableAdapters?: boolean;\n /** Custom adapter registry (defaults to built-in adapters) */\n adapterRegistry?: AdapterRegistry;\n /** Enable oai-mem-citation blocks in recall responses (issue #379). */\n citationsEnabled?: boolean;\n /** Auto-enable citations for Codex adapter connections (issue #379). */\n citationsAutoDetect?: boolean;\n}\n\nexport interface EngramAccessHttpServerStatus {\n running: boolean;\n host: string;\n port: number;\n maxBodyBytes: number;\n}\n\nfunction resolveDefaultAdminConsolePublicDir(): string {\n const thisDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // Standard: admin-console sibling to src/ (development layout)\n path.resolve(thisDir, \"../admin-console/public\"),\n // Bundled: admin-console inside dist/ alongside the bundle\n path.resolve(thisDir, \"./admin-console/public\"),\n // Package root: walk up from dist/ to the package root\n path.resolve(thisDir, \"../../admin-console/public\"),\n ];\n return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];\n}\n\nconst defaultAdminConsolePublicDir = resolveDefaultAdminConsolePublicDir();\nconst correlationIdStore = new AsyncLocalStorage<string>();\n\nconst WRITE_RATE_LIMIT_WINDOW_MS = 60_000;\nconst WRITE_RATE_LIMIT_MAX_REQUESTS = 30;\nconst TRUST_ZONE_RECORD_KINDS = [\"memory\", \"artifact\", \"state\", \"trajectory\", \"external\"] as const;\nconst TRUST_ZONE_SOURCE_CLASSES = [\"tool_output\", \"web_content\", \"subagent_trace\", \"system_memory\", \"user_input\", \"manual\"] as const;\n\nclass HttpError extends Error {\n readonly code: string;\n readonly details?: unknown;\n constructor(readonly status: number, message: string, code?: string, details?: unknown) {\n super(message);\n this.code = code ?? `http_${status}`;\n this.details = details;\n }\n}\n\nfunction hostToUrlAuthority(host: string): string {\n if (host.includes(\":\") && !host.startsWith(\"[\") && !host.endsWith(\"]\")) {\n return `[${host}]`;\n }\n return host;\n}\n\nfunction parseHttpServerPort(port: number | undefined): number {\n if (port === undefined) return 0;\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(\"access HTTP port must be an integer from 0 to 65535\");\n }\n return port;\n}\n\nfunction parseTrustZoneKindFilter(raw: string | null): TrustZoneRecordKind | undefined {\n if (raw === null) return undefined;\n if ((TRUST_ZONE_RECORD_KINDS as readonly string[]).includes(raw)) {\n return raw as TrustZoneRecordKind;\n }\n throw new HttpError(400, `kind must be one of ${TRUST_ZONE_RECORD_KINDS.join(\"|\")}`, \"invalid_kind_filter\");\n}\n\nfunction parseTrustZoneSourceClassFilter(raw: string | null): TrustZoneSourceClass | undefined {\n if (raw === null) return undefined;\n if ((TRUST_ZONE_SOURCE_CLASSES as readonly string[]).includes(raw)) {\n return raw as TrustZoneSourceClass;\n }\n throw new HttpError(400, `sourceClass must be one of ${TRUST_ZONE_SOURCE_CLASSES.join(\"|\")}`, \"invalid_source_class_filter\");\n}\n\nfunction parseTrustZoneFilter(raw: string | null): TrustZoneName | undefined {\n if (raw === null) return undefined;\n if (isTrustZoneName(raw)) {\n return raw;\n }\n throw new HttpError(400, \"zone must be one of quarantine|working|trusted\", \"invalid_zone_filter\");\n}\n\nfunction summarizeHttpRequest(req: IncomingMessage): string {\n const method = req.method ?? \"UNKNOWN\";\n try {\n const parsed = new URL(req.url ?? \"/\", \"http://localhost\");\n return `${method} ${parsed.pathname}`;\n } catch {\n return `${method} ${(req.url ?? \"/\").split(\"?\")[0]}`;\n }\n}\n\nfunction parseStrictIntegerQuery(\n raw: string | null,\n field: string,\n defaultValue: number,\n minValue: number,\n): number {\n if (raw === null) return defaultValue;\n if (!/^(?:0|[1-9]\\d*)$/.test(raw)) {\n throw new HttpError(400, `${field} must be an integer`, `invalid_${field}`);\n }\n const value = Number(raw);\n if (!Number.isInteger(value) || value < minValue) {\n throw new HttpError(400, `${field} must be an integer >= ${minValue}`, `invalid_${field}`);\n }\n return value;\n}\n\nfunction parseMemorySort(raw: string | null): \"updated_desc\" | \"updated_asc\" | \"created_desc\" | \"created_asc\" | undefined {\n if (raw === null) return undefined;\n if (\n raw === \"updated_desc\" ||\n raw === \"updated_asc\" ||\n raw === \"created_desc\" ||\n raw === \"created_asc\"\n ) {\n return raw;\n }\n throw new HttpError(400, \"sort must be one of updated_desc|updated_asc|created_desc|created_asc\", \"invalid_sort\");\n}\n\n/**\n * Decode a `:peerId` URL path segment, converting malformed percent-encoded\n * input (e.g., `%E0%A4%A`) into a 400 client error rather than letting\n * `URIError` bubble up as a 500 `internal_error`.\n */\nfunction decodePeerIdSegment(raw: string): string {\n try {\n return decodeURIComponent(raw);\n } catch {\n throw new EngramAccessInputError(\"peerId path segment is not valid percent-encoded input\");\n }\n}\n\nfunction codingContextFromProjectTag(projectTag: string): {\n projectId: string;\n branch: string | null;\n rootPath: string;\n defaultBranch: string | null;\n} {\n const projectId = projectTagProjectId(projectTag);\n return {\n projectId,\n branch: null,\n rootPath: projectId,\n defaultBranch: null,\n };\n}\n\nexport class EngramAccessHttpServer {\n private readonly service: EngramAccessService;\n private readonly host: string;\n private readonly requestedPort: number;\n private readonly authToken?: string;\n private readonly authTokens: string[];\n private readonly authTokensGetter?: () => string[];\n private readonly authenticatedPrincipal?: string;\n private readonly maxBodyBytes: number;\n private readonly adminConsoleEnabled: boolean;\n private readonly adminConsolePublicDir: string;\n private readonly trustPrincipalHeader: boolean;\n private readonly adapterRegistry: AdapterRegistry | null;\n private readonly writeRequestTimestamps: number[] = [];\n private readonly mcpServer: EngramMcpServer;\n private server: Server | null = null;\n private boundPort = 0;\n /** Active SSE response objects for /engram/v1/graph/events. */\n private readonly sseClients = new Set<ServerResponse>();\n /** Throttle batch: pending SSE event batches per client. */\n private readonly sseBatchTimers = new Map<ServerResponse, ReturnType<typeof setTimeout>>();\n private readonly ssePendingBatches = new Map<ServerResponse, GraphEvent[]>();\n /**\n * Per-client cleanup callbacks: clear heartbeat interval, flush timer,\n * unsubscribe from bus, and end the response. Stored here so `stop()`\n * can invoke them even when the client hasn't disconnected yet\n * (Cursor review thread `access-http.ts:232`).\n */\n private readonly sseCleanupFns = new Set<() => void>();\n\n constructor(options: EngramAccessHttpServerOptions) {\n this.service = options.service;\n this.host = options.host?.trim() || \"127.0.0.1\";\n this.requestedPort = parseHttpServerPort(options.port);\n this.authToken = options.authToken?.trim() || undefined;\n this.authTokens = (options.authTokens ?? []).map((t) => t.trim()).filter(Boolean);\n this.authTokensGetter = options.authTokensGetter;\n this.authenticatedPrincipal = options.principal?.trim() || undefined;\n this.maxBodyBytes = Number.isFinite(options.maxBodyBytes)\n ? Math.max(1, Math.floor(options.maxBodyBytes ?? 131072))\n : 131072;\n this.adminConsoleEnabled = options.adminConsoleEnabled !== false;\n this.adminConsolePublicDir = options.adminConsolePublicDir ?? defaultAdminConsolePublicDir;\n this.trustPrincipalHeader = options.trustPrincipalHeader === true;\n this.adapterRegistry = options.enableAdapters !== false\n ? (options.adapterRegistry ?? new AdapterRegistry())\n : null;\n this.mcpServer = new EngramMcpServer(this.service, {\n principal: options.principal,\n citationsEnabled: options.citationsEnabled,\n citationsAutoDetect: options.citationsAutoDetect,\n });\n }\n\n async start(): Promise<EngramAccessHttpServerStatus> {\n if (!this.authToken && this.authTokens.length === 0 && !this.authTokensGetter) {\n throw new Error(\"engram access HTTP requires authToken or authTokens\");\n }\n if (this.server) return this.status();\n\n const server = createServer((req, res) => {\n const correlationId = randomUUID();\n correlationIdStore.run(correlationId, () => {\n void this.handle(req, res, correlationId).catch((err) => {\n log.debug(`engram access HTTP request failed [${correlationId}]: ${err}`);\n if (err instanceof HttpError) {\n const payload: Record<string, unknown> = { error: err.message, code: err.code };\n if (err.details) payload.details = err.details;\n this.respondJson(res, err.status, payload);\n return;\n }\n if (err instanceof EngramAccessInputError) {\n this.respondJson(res, 400, { error: err.message, code: \"input_error\" });\n return;\n }\n if (res.headersSent) {\n res.destroy(err as Error);\n return;\n }\n log.error(\n `engram access HTTP internal error [${correlationId}] ${summarizeHttpRequest(req)}`,\n err,\n );\n this.respondJson(res, 500, { error: \"internal_error\", code: \"internal_error\" });\n });\n });\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(this.requestedPort, this.host);\n });\n } catch (err) {\n server.close();\n throw err;\n }\n\n this.server = server;\n const address = server.address();\n this.boundPort = typeof address === \"object\" && address ? address.port : this.requestedPort;\n return this.status();\n }\n\n async stop(): Promise<void> {\n if (!this.server) return;\n const server = this.server;\n this.server = null;\n this.boundPort = 0;\n // Invoke each SSE client's cleanup callback so heartbeat intervals,\n // batch timers, and graph-bus subscriptions are all released before the\n // HTTP server closes. Without this, long-running SSE connections leak\n // setInterval handles and EventEmitter listeners (Cursor review thread\n // `access-http.ts:232`).\n for (const cleanup of this.sseCleanupFns) {\n try { cleanup(); } catch { /* ignore */ }\n }\n this.sseCleanupFns.clear();\n // Belt-and-suspenders: clear any state not yet reached by cleanup fns.\n for (const [res, timer] of this.sseBatchTimers.entries()) {\n clearTimeout(timer);\n this.sseBatchTimers.delete(res);\n }\n this.ssePendingBatches.clear();\n for (const res of this.sseClients) {\n try { res.end(); } catch { /* ignore */ }\n }\n this.sseClients.clear();\n await new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n status(): EngramAccessHttpServerStatus {\n return {\n running: this.server !== null,\n host: this.host,\n port: this.boundPort,\n maxBodyBytes: this.maxBodyBytes,\n };\n }\n\n /**\n * Resolve the adapter identity for the incoming request.\n * Includes MCP clientInfo from the last initialize handshake if available.\n * Returns null if no adapter matches or adapters are disabled.\n */\n resolveAdapterIdentity(req: IncomingMessage): ResolvedIdentity | null {\n if (!this.adapterRegistry) return null;\n // Look up clientInfo for this specific MCP session to avoid cross-session leaks.\n // Non-MCP requests (no mcp-session-id header) get undefined clientInfo and\n // rely on HTTP headers for adapter matching.\n const sessionId = (() => {\n const raw = req.headers[\"mcp-session-id\"];\n return typeof raw === \"string\" ? raw.trim() : undefined;\n })();\n return this.adapterRegistry.resolve({\n headers: req.headers as Record<string, string | string[] | undefined>,\n clientInfo: this.mcpServer.getClientInfo(sessionId),\n });\n }\n\n /** Cache for per-request identity resolution (avoids double adapter resolution) */\n private identityCache = new WeakMap<IncomingMessage, { principal?: string; namespace?: string; sessionKey?: string }>();\n\n /** Resolve principal, namespace, and session key from request headers and adapter identity */\n private resolveRequestIdentity(req: IncomingMessage): { principal?: string; namespace?: string; sessionKey?: string } {\n const cached = this.identityCache.get(req);\n if (cached) return cached;\n let principal: string | undefined;\n let namespace: string | undefined;\n let sessionKey: string | undefined;\n\n // Explicit header override takes priority for principal\n if (this.trustPrincipalHeader) {\n const headerVal = req.headers[\"x-engram-principal\"];\n const raw = Array.isArray(headerVal) ? headerVal[0] : headerVal;\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n if (trimmed.length > 0) {\n principal = trimmed;\n }\n }\n }\n\n if (!principal) {\n principal = this.authenticatedPrincipal;\n }\n\n // Try adapter-based identity resolution for namespace and, only when no\n // server principal is configured, an adapter-owned default principal.\n const adapterIdentity = this.resolveAdapterIdentity(req);\n if (adapterIdentity) {\n if (!principal) {\n principal = adapterIdentity.principal;\n }\n namespace = adapterIdentity.namespace;\n sessionKey = adapterIdentity.sessionKey;\n }\n\n const result = { principal, namespace, sessionKey };\n this.identityCache.set(req, result);\n return result;\n }\n\n private resolveRequestPrincipal(req: IncomingMessage): string | undefined {\n return this.resolveRequestIdentity(req).principal;\n }\n\n /** Resolve namespace: only use the explicit body value. Adapter-inferred namespace\n * is intentionally NOT used as a fallback for REST requests — omitting namespace\n * should default to the server's global namespace, not silently scope to an adapter. */\n private resolveNamespace(_req: IncomingMessage, bodyNamespace?: string): string | undefined {\n return bodyNamespace || undefined;\n }\n\n /**\n * Resolve the recall disclosure depth from the request (issue #677 PR\n * 2/4). Explicit body value wins; otherwise we accept a\n * `?disclosure=...` query parameter so curl/browser tooling can use the\n * three-tier surface without rewriting JSON. Invalid query values\n * throw `EngramAccessInputError` (CLAUDE.md rule 51 — no silent\n * fallback). An absent body field AND an absent query param yields\n * `undefined`, which the service maps to `DEFAULT_RECALL_DISCLOSURE`.\n */\n private resolveRecallDisclosure(\n bodyDisclosure: RecallDisclosure | undefined,\n parsed: URL,\n ): RecallDisclosure | undefined {\n if (bodyDisclosure !== undefined) {\n return bodyDisclosure;\n }\n const queryDisclosure = parsed.searchParams.get(\"disclosure\");\n if (queryDisclosure === null) {\n return undefined;\n }\n if (!isRecallDisclosure(queryDisclosure)) {\n throw new EngramAccessInputError(\n `disclosure must be one of: chunk, section, raw (got: ${queryDisclosure})`,\n );\n }\n return queryDisclosure;\n }\n\n private async handle(req: IncomingMessage, res: ServerResponse, correlationId: string): Promise<void> {\n const parsed = new URL(req.url ?? \"/\", `http://${hostToUrlAuthority(this.host)}`);\n const pathname = parsed.pathname;\n\n if (this.adminConsoleEnabled && await this.handleAdminConsole(req, res, pathname)) {\n return;\n }\n\n if (!this.isAuthorized(req, pathname)) {\n const body = JSON.stringify({ error: \"unauthorized\", code: \"unauthorized\" });\n res.writeHead(401, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"www-authenticate\": \"Bearer\",\n \"x-request-id\": correlationId,\n });\n res.end(body);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/mcp\") {\n await this.handleMcpRequest(req, res);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/health\") {\n this.respondJson(res, 200, await this.service.health());\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/adapters\") {\n const identity = this.resolveAdapterIdentity(req);\n this.respondJson(res, 200, {\n adaptersEnabled: this.adapterRegistry !== null,\n registered: this.adapterRegistry?.list() ?? [],\n resolved: identity,\n });\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/recall\") {\n const body = await this.readValidatedBody(req, \"recall\");\n // Preserve the distinction between `codingContext: null` (explicit\n // clear) and `codingContext` missing from the JSON payload\n // (untouched). The previous `?? undefined` collapsed both into\n // undefined, so callers lost the ability to clear the session's\n // attached context through the recall endpoint.\n const codingContext =\n \"codingContext\" in body ? body.codingContext : undefined;\n // Disclosure resolution (issue #677 PR 2/4): accept the value from\n // the validated body OR the `?disclosure=` query parameter, with\n // the body taking precedence so an explicit JSON payload is never\n // silently overridden by a stale URL. CLAUDE.md rule 51: invalid\n // query-param values throw, never fall back silently.\n const disclosure = this.resolveRecallDisclosure(body.disclosure, parsed);\n // Issue #680 — historical recall pin (`asOf`). Body field wins\n // over `?as_of=` query param. Empty query is rejected only when\n // the body didn't supply a valid pin (codex P2 + cursor Medium).\n const asOfQueryRaw = parsed.searchParams.get(\"as_of\");\n const bodyHasAsOf =\n typeof body.asOf === \"string\" && body.asOf.length > 0;\n if (\n !bodyHasAsOf &&\n asOfQueryRaw !== null &&\n asOfQueryRaw.length === 0\n ) {\n throw new EngramAccessInputError(\n \"as_of must be a non-empty timestamp (got empty value)\",\n );\n }\n const asOf =\n body.asOf ??\n (asOfQueryRaw !== null && asOfQueryRaw.length > 0\n ? asOfQueryRaw\n : undefined);\n // Tag filter (issue #689). Body presence wins over query params\n // — explicit `tags: []` in body clears the filter even with\n // stale `?tag=` URLs.\n const bodyHasTagsField =\n body !== null &&\n typeof body === \"object\" &&\n \"tags\" in (body as Record<string, unknown>);\n const bodyTagsValue = bodyHasTagsField\n ? (body as { tags?: unknown }).tags\n : undefined;\n const bodyTags = Array.isArray(bodyTagsValue)\n ? (bodyTagsValue as string[])\n : undefined;\n const queryTags = parsed.searchParams.getAll(\"tag\");\n const tags = bodyHasTagsField\n ? bodyTags\n : queryTags.length > 0\n ? queryTags\n : undefined;\n const bodyTagMatch = (body as { tagMatch?: unknown }).tagMatch;\n let tagMatch: \"any\" | \"all\" | undefined;\n if (bodyTagMatch !== undefined) {\n if (bodyTagMatch === \"any\" || bodyTagMatch === \"all\") {\n tagMatch = bodyTagMatch;\n }\n } else {\n const queryTagMatch = parsed.searchParams.get(\"tag_match\");\n if (queryTagMatch !== null) {\n if (queryTagMatch !== \"any\" && queryTagMatch !== \"all\") {\n throw new EngramAccessInputError(\n `tag_match must be one of: any, all (got: ${queryTagMatch})`,\n );\n }\n tagMatch = queryTagMatch;\n }\n }\n // Issue #681 — `?include_low_confidence=true|false` mirrors the CLI\n // `--include-low-confidence` flag. Body field wins so a JSON payload can\n // explicitly clear a stale query parameter.\n const bodyIncludeLowConfidence =\n (body as { includeLowConfidence?: unknown }).includeLowConfidence;\n const queryIncludeLowConfidence = parsed.searchParams.get(\"include_low_confidence\");\n if (\n bodyIncludeLowConfidence === undefined &&\n queryIncludeLowConfidence !== null &&\n queryIncludeLowConfidence !== \"true\" &&\n queryIncludeLowConfidence !== \"false\"\n ) {\n throw new EngramAccessInputError(\n `include_low_confidence must be one of: true, false (got: ${queryIncludeLowConfidence})`,\n );\n }\n const includeLowConfidence =\n bodyIncludeLowConfidence === true ||\n (bodyIncludeLowConfidence === undefined &&\n queryIncludeLowConfidence === \"true\");\n const response = await this.service.recall({\n query: body.query ?? \"\",\n sessionKey: body.sessionKey,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n idempotencyKey: body.idempotencyKey,\n namespace: this.resolveNamespace(req, body.namespace),\n topK: body.topK,\n mode: body.mode as RecallPlanMode | \"auto\" | undefined,\n includeDebug: body.includeDebug === true,\n // Forward the validated disclosure depth to the service layer\n // (issue #677). The zod schema accepts/rejects body values;\n // `resolveRecallDisclosure()` validates the query-param fallback.\n disclosure,\n codingContext,\n // Forward cwd/projectTag for auto git-context resolution (issue #569).\n cwd: body.cwd,\n projectTag: body.projectTag,\n ...(asOf !== undefined ? { asOf } : {}),\n ...(tags !== undefined ? { tags } : {}),\n ...(tagMatch !== undefined ? { tagMatch } : {}),\n ...(includeLowConfidence ? { includeLowConfidence: true } : {}),\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n // Attach / clear coding-agent context for a session (issue #569 PR 5).\n // Mirrors `setCodingContext` on the access service. Connectors call this\n // at session start after resolving a git context for the cwd; `remnic\n // doctor` (PR 8) surfaces the attached context.\n if (req.method === \"POST\" && pathname === \"/engram/v1/coding-context\") {\n const body = await this.readValidatedBody(req, \"setCodingContext\");\n const codingContext =\n body.codingContext !== undefined\n ? body.codingContext\n : typeof body.projectTag === \"string\"\n ? codingContextFromProjectTag(body.projectTag)\n : (() => {\n throw new EngramAccessInputError(\"codingContext or projectTag is required\");\n })();\n this.service.setCodingContext({\n sessionKey: body.sessionKey,\n codingContext,\n });\n this.respondJson(res, 200, { ok: true });\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/capsules/export\" || pathname === \"/remnic/v1/capsules/export\")\n ) {\n const body = await this.readValidatedBody(req, \"capsuleExport\");\n this.ensureWriteRateLimitAvailable();\n const result = await this.service.capsuleExport({\n name: body.name,\n namespace: this.resolveNamespace(req, body.namespace),\n principal: this.resolveRequestPrincipal(req),\n since: body.since,\n includeKinds: body.includeKinds,\n peerIds: body.peerIds,\n includeTranscripts: body.includeTranscripts,\n encrypt: body.encrypt,\n });\n this.recordWriteRateLimitHit();\n this.respondJson(res, 200, result);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/capsules/import\" || pathname === \"/remnic/v1/capsules/import\")\n ) {\n const body = await this.readValidatedBody(req, \"capsuleImport\");\n this.ensureWriteRateLimitAvailable();\n const result = await this.service.capsuleImport({\n archivePath: expandTildePath(body.archivePath),\n namespace: this.resolveNamespace(req, body.namespace),\n principal: this.resolveRequestPrincipal(req),\n mode: body.mode,\n passphrase: body.passphrase,\n });\n this.recordWriteRateLimitHit();\n this.respondJson(res, 200, result);\n return;\n }\n\n if (\n req.method === \"GET\" &&\n (pathname === \"/engram/v1/offline-sync/snapshot\" || pathname === \"/remnic/v1/offline-sync/snapshot\")\n ) {\n const includeTranscriptsRaw = parsed.searchParams.get(\"include_transcripts\");\n const includeContentRaw = parsed.searchParams.get(\"content\");\n if (\n includeTranscriptsRaw !== null &&\n includeTranscriptsRaw !== \"true\" &&\n includeTranscriptsRaw !== \"false\"\n ) {\n throw new EngramAccessInputError(\n `include_transcripts must be one of: true, false (got: ${includeTranscriptsRaw})`,\n );\n }\n if (\n includeContentRaw !== null &&\n includeContentRaw !== \"true\" &&\n includeContentRaw !== \"false\"\n ) {\n throw new EngramAccessInputError(\n `content must be one of: true, false (got: ${includeContentRaw})`,\n );\n }\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const result = await this.service.offlineSyncSnapshot({\n namespace: this.resolveNamespace(\n req,\n namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined,\n ),\n principal: this.resolveRequestPrincipal(req),\n includeTranscripts: includeTranscriptsRaw !== \"false\",\n includeContent: includeContentRaw !== \"false\",\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n if (\n req.method === \"GET\" &&\n (pathname === \"/engram/v1/offline-sync/snapshot-stream\" ||\n pathname === \"/remnic/v1/offline-sync/snapshot-stream\")\n ) {\n const includeTranscriptsRaw = parsed.searchParams.get(\"include_transcripts\");\n const includeContentRaw = parsed.searchParams.get(\"content\");\n if (\n includeTranscriptsRaw !== null &&\n includeTranscriptsRaw !== \"true\" &&\n includeTranscriptsRaw !== \"false\"\n ) {\n throw new EngramAccessInputError(\n `include_transcripts must be one of: true, false (got: ${includeTranscriptsRaw})`,\n );\n }\n if (\n includeContentRaw !== null &&\n includeContentRaw !== \"false\"\n ) {\n throw new EngramAccessInputError(\"snapshot-stream content must be false\");\n }\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const result = await this.service.offlineSyncSnapshotStream({\n namespace: this.resolveNamespace(\n req,\n namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined,\n ),\n principal: this.resolveRequestPrincipal(req),\n includeTranscripts: includeTranscriptsRaw !== \"false\",\n includeContent: false,\n });\n await this.respondOfflineSnapshotStream(res, result);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/offline-sync/snapshot\" || pathname === \"/remnic/v1/offline-sync/snapshot\")\n ) {\n const body = await this.readValidatedBody(\n req,\n \"offlineSyncSnapshot\",\n OFFLINE_SYNC_SNAPSHOT_BASE_MAX_BODY_BYTES,\n );\n const result = await this.service.offlineSyncSnapshot({\n namespace: this.resolveNamespace(req, body.namespace),\n principal: this.resolveRequestPrincipal(req),\n includeTranscripts: body.includeTranscripts,\n includeContent: body.includeContent,\n baseFiles: body.baseFiles,\n ...(body.baseCapturedAt ? { baseCapturedAt: new Date(body.baseCapturedAt) } : {}),\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/offline-sync/files\" || pathname === \"/remnic/v1/offline-sync/files\")\n ) {\n const body = await this.readValidatedBody(req, \"offlineSyncFiles\");\n const result = await this.service.offlineSyncFiles({\n namespace: this.resolveNamespace(req, body.namespace),\n principal: this.resolveRequestPrincipal(req),\n includeTranscripts: body.includeTranscripts,\n paths: body.paths,\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (\n pathname === \"/engram/v1/offline-sync/file-content\" ||\n pathname === \"/remnic/v1/offline-sync/file-content\"\n )\n ) {\n const body = await this.readValidatedBody(req, \"offlineSyncFileContent\");\n const result = await this.service.offlineSyncFileContent({\n namespace: this.resolveNamespace(req, body.namespace),\n principal: this.resolveRequestPrincipal(req),\n includeTranscripts: body.includeTranscripts,\n path: body.path,\n offset: body.offset,\n length: body.length,\n });\n this.respondBinary(res, 200, result.content, {\n \"x-remnic-namespace\": encodeURIComponent(result.namespace),\n \"x-remnic-file-path\": encodeURIComponent(result.path),\n \"x-remnic-file-bytes\": String(result.bytes),\n \"x-remnic-file-mtime-ms\": String(result.mtimeMs),\n \"x-remnic-chunk-offset\": String(result.offset),\n \"x-remnic-chunk-bytes\": String(result.chunkBytes),\n ...(result.sha256 ? { \"x-remnic-file-sha256\": result.sha256 } : {}),\n });\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (\n pathname === \"/engram/v1/offline-sync/apply-file-content\" ||\n pathname === \"/remnic/v1/offline-sync/apply-file-content\"\n )\n ) {\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const bytes = this.readRequiredIntegerHeader(req, \"x-remnic-file-bytes\");\n const offset = this.readOptionalIntegerHeader(req, \"x-remnic-chunk-offset\") ?? 0;\n const content = await this.readBinaryBody(req, OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES);\n const result = await this.service.offlineSyncApplyFileContent({\n namespace: this.resolveNamespace(\n req,\n namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined,\n ),\n principal: this.resolveRequestPrincipal(req),\n includeTranscripts: this.parseOptionalBooleanHeader(\n req,\n \"x-remnic-include-transcripts\",\n true,\n ),\n sourceId: this.readRequiredDecodedHeader(req, \"x-remnic-source-id\"),\n path: this.readRequiredDecodedHeader(req, \"x-remnic-file-path\"),\n sha256: this.readRequiredHeader(req, \"x-remnic-file-sha256\"),\n bytes,\n mtimeMs: this.readRequiredNumberHeader(req, \"x-remnic-file-mtime-ms\"),\n offset,\n baseSha256: this.readOptionalHeader(req, \"x-remnic-base-sha256\"),\n content,\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/offline-sync/apply\" || pathname === \"/remnic/v1/offline-sync/apply\")\n ) {\n const body = await this.readValidatedBody(req, \"offlineSyncApply\", OFFLINE_SYNC_APPLY_MAX_BODY_BYTES);\n const result = await this.service.offlineSyncApply({\n namespace: this.resolveNamespace(req, body.namespace),\n principal: this.resolveRequestPrincipal(req),\n changeset: body.changeset,\n returnCurrentFiles: body.returnCurrentFiles,\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/recall/explain\") {\n const body = await this.readValidatedBody(req, \"recallExplain\");\n const response = await this.service.recallExplain({\n sessionKey: body.sessionKey,\n namespace: this.resolveNamespace(req, body.namespace),\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/action-confidence\" || pathname === \"/remnic/v1/action-confidence\")\n ) {\n const body = await this.readValidatedBody(req, \"actionConfidence\");\n this.respondJson(res, 200, await this.service.actionConfidence(body));\n return;\n }\n\n // Tier-explain (issue #518): structured per-result annotation from\n // the direct-answer retrieval tier. Orthogonal to /recall/explain\n // above, which returns a graph-path explanation document.\n if (req.method === \"GET\" && pathname === \"/engram/v1/recall/tier-explain\") {\n const sessionParam = parsed.searchParams.get(\"session\");\n const sessionKey = sessionParam && sessionParam.length > 0 ? sessionParam : undefined;\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const namespace = this.resolveNamespace(\n req,\n namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined,\n );\n const payload = await this.service.recallTierExplain(\n sessionKey,\n namespace,\n this.resolveRequestPrincipal(req),\n );\n this.respondJson(res, 200, payload);\n return;\n }\n\n // Recall X-ray (issue #570 PR 4): unified per-result attribution\n // snapshot. Requires bearer auth (same as every other endpoint\n // here) and enforces namespace scope before the recall fires\n // (CLAUDE.md rule 42). Query comes from the `q` search param so\n // GET stays cacheable; `namespace` / `session` / `budget` are\n // optional.\n if (req.method === \"GET\" && pathname === \"/engram/v1/recall/xray\") {\n const queryParam = parsed.searchParams.get(\"q\");\n if (!queryParam || queryParam.trim().length === 0) {\n this.respondJson(res, 400, {\n error: \"missing_query\",\n code: \"missing_query\",\n message: \"q search parameter is required and must be non-empty\",\n });\n return;\n }\n const sessionParam = parsed.searchParams.get(\"session\");\n const sessionKey = sessionParam && sessionParam.length > 0\n ? sessionParam\n : undefined;\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const namespace = this.resolveNamespace(\n req,\n namespaceParam && namespaceParam.length > 0\n ? namespaceParam\n : undefined,\n );\n const budgetParam = parsed.searchParams.get(\"budget\");\n // Reject invalid `budget` with 400 rather than silently\n // defaulting (CLAUDE.md rules 14 + 51).\n let budget: number | undefined;\n if (budgetParam !== null && budgetParam !== \"\") {\n const parsedBudget = Number(budgetParam);\n if (\n !Number.isFinite(parsedBudget)\n || parsedBudget <= 0\n || !Number.isInteger(parsedBudget)\n ) {\n this.respondJson(res, 400, {\n error: \"invalid_budget\",\n code: \"invalid_budget\",\n message:\n \"budget expects a positive integer\",\n });\n return;\n }\n budget = parsedBudget;\n }\n // Disclosure depth (issue #677 PR 3/4 telemetry plumbing). When\n // present, must match the chunk|section|raw allow-list; invalid\n // values surface as a 400 (CLAUDE.md rule 51 — no silent\n // fallback) rather than silently disabling the per-disclosure\n // summary table.\n const disclosureParam = parsed.searchParams.get(\"disclosure\");\n let disclosure: RecallDisclosure | undefined;\n if (disclosureParam !== null && disclosureParam.length > 0) {\n if (!isRecallDisclosure(disclosureParam)) {\n this.respondJson(res, 400, {\n error: \"invalid_disclosure\",\n code: \"invalid_disclosure\",\n message:\n \"disclosure must be one of: chunk, section, raw\",\n });\n return;\n }\n disclosure = disclosureParam;\n }\n // Only translate validation errors (empty query, bad budget)\n // into 400s. Backend faults (timeouts, storage errors,\n // unexpected orchestrator failures) must bubble to the global\n // `handle()` error handler so they return 500 and get logged\n // properly. `service.recallXray` prefixes its validation\n // errors with \"recallXray:\" so we key off that prefix rather\n // than catching everything.\n let payload: Awaited<ReturnType<typeof this.service.recallXray>>;\n try {\n payload = await this.service.recallXray({\n query: queryParam,\n sessionKey,\n namespace,\n budget,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n ...(disclosure !== undefined ? { disclosure } : {}),\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.startsWith(\"recallXray:\")) {\n this.respondJson(res, 400, {\n error: \"invalid_request\",\n code: \"invalid_request\",\n message,\n });\n return;\n }\n // Anything else is a server-side fault; rethrow so the\n // outer `handle()` catch returns 500 + logs the error.\n throw err;\n }\n this.respondJson(res, 200, payload);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/observe\") {\n const body = await this.readValidatedBody(req, \"observe\");\n this.ensureWriteRateLimitAvailable();\n const response = await this.service.observe({\n sessionKey: body.sessionKey,\n messages: body.messages.map((message) => ({\n role: message.role,\n content: message.content,\n sourceFormat: message.sourceFormat ?? undefined,\n rawContent: message.rawContent ?? undefined,\n parts: message.parts ?? undefined,\n })),\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n skipExtraction: body.skipExtraction === true,\n // Forward cwd/projectTag for auto git-context resolution (issue #569).\n cwd: body.cwd,\n projectTag: body.projectTag,\n });\n this.recordWriteRateLimitHit();\n this.respondJson(res, 202, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/lcm/search\") {\n const body = await this.readValidatedBody(req, \"lcmSearch\");\n const response = await this.service.lcmSearch({\n query: body.query,\n sessionKey: body.sessionKey,\n sessionPrefix: body.sessionPrefix,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n limit: body.limit,\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/lcm/compaction/flush\" || pathname === \"/remnic/v1/lcm/compaction/flush\")\n ) {\n const body = await this.readValidatedBody(req, \"lcmCompactionFlush\");\n this.ensureWriteRateLimitAvailable();\n const response = await this.service.lcmCompactionFlush({\n sessionKey: body.sessionKey,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n this.recordWriteRateLimitHit();\n this.respondJson(res, 200, response);\n return;\n }\n\n if (\n req.method === \"POST\" &&\n (pathname === \"/engram/v1/lcm/compaction/record\" || pathname === \"/remnic/v1/lcm/compaction/record\")\n ) {\n const body = await this.readValidatedBody(req, \"lcmCompactionRecord\");\n this.ensureWriteRateLimitAvailable();\n const response = await this.service.lcmCompactionRecord({\n sessionKey: body.sessionKey,\n namespace: this.resolveNamespace(req, body.namespace),\n tokensBefore: body.tokensBefore,\n tokensAfter: body.tokensAfter,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n this.recordWriteRateLimitHit();\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/lcm/status\") {\n this.respondJson(res, 200, await this.service.lcmStatus());\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/memories\") {\n const body = await this.readValidatedBody(req, \"memoryStore\");\n const request = {\n schemaVersion: body.schemaVersion,\n idempotencyKey: body.idempotencyKey,\n dryRun: body.dryRun === true,\n sessionKey: body.sessionKey,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n content: body.content,\n category: body.category,\n confidence: body.confidence,\n namespace: this.resolveNamespace(req, body.namespace),\n tags: body.tags,\n entityRef: body.entityRef,\n ttl: body.ttl,\n sourceReason: body.sourceReason,\n };\n const idempotencyStatus = await this.service.peekMemoryStoreIdempotency(request);\n if (idempotencyStatus === \"miss\" && request.dryRun !== true) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.memoryStore(request);\n if (this.shouldCountWriteRateLimit(response as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, this.writeResponseStatus(response), response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/suggestions\") {\n const body = await this.readValidatedBody(req, \"suggestionSubmit\");\n const request = {\n schemaVersion: body.schemaVersion,\n idempotencyKey: body.idempotencyKey,\n dryRun: body.dryRun === true,\n sessionKey: body.sessionKey,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n content: body.content,\n category: body.category,\n confidence: body.confidence,\n namespace: this.resolveNamespace(req, body.namespace),\n tags: body.tags,\n entityRef: body.entityRef,\n ttl: body.ttl,\n sourceReason: body.sourceReason,\n };\n const idempotencyStatus = await this.service.peekSuggestionSubmitIdempotency(request);\n if (idempotencyStatus === \"miss\" && request.dryRun !== true) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.suggestionSubmit(request);\n if (this.shouldCountWriteRateLimit(response as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, this.writeResponseStatus(response), response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/memories\") {\n const limit = parseStrictIntegerQuery(parsed.searchParams.get(\"limit\"), \"limit\", 50, 1);\n const offset = parseStrictIntegerQuery(parsed.searchParams.get(\"offset\"), \"offset\", 0, 0);\n const sort = parseMemorySort(parsed.searchParams.get(\"sort\"));\n const response = await this.service.memoryBrowse({\n query: parsed.searchParams.get(\"q\") ?? undefined,\n status: parsed.searchParams.get(\"status\") ?? undefined,\n category: parsed.searchParams.get(\"category\") ?? undefined,\n namespace: parsed.searchParams.get(\"namespace\") ?? undefined,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n sort,\n limit,\n offset,\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n const memoryMatch = pathname.match(/^\\/engram\\/v1\\/memories\\/([^/]+)$/);\n if (req.method === \"GET\" && memoryMatch) {\n const memoryId = decodeURIComponent(memoryMatch[1] ?? \"\");\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const response = await this.service.memoryGet(memoryId, namespace, this.resolveRequestPrincipal(req));\n this.respondJson(res, response.found ? 200 : 404, response);\n return;\n }\n\n const timelineMatch = pathname.match(/^\\/engram\\/v1\\/memories\\/([^/]+)\\/timeline$/);\n if (req.method === \"GET\" && timelineMatch) {\n const memoryId = decodeURIComponent(timelineMatch[1] ?? \"\");\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const limit = parseStrictIntegerQuery(parsed.searchParams.get(\"limit\"), \"limit\", 200, 1);\n const response = await this.service.memoryTimeline(memoryId, namespace, limit, this.resolveRequestPrincipal(req));\n this.respondJson(res, response.found ? 200 : 404, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/entities\") {\n const limit = parseStrictIntegerQuery(parsed.searchParams.get(\"limit\"), \"limit\", 50, 1);\n const offset = parseStrictIntegerQuery(parsed.searchParams.get(\"offset\"), \"offset\", 0, 0);\n const response = await this.service.entityList({\n namespace: parsed.searchParams.get(\"namespace\") ?? undefined,\n query: parsed.searchParams.get(\"q\") ?? undefined,\n limit,\n offset,\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n const entityMatch = pathname.match(/^\\/engram\\/v1\\/entities\\/([^/]+)$/);\n if (req.method === \"GET\" && entityMatch) {\n const entityName = decodeURIComponent(entityMatch[1] ?? \"\");\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const response = await this.service.entityGet(entityName, namespace);\n this.respondJson(res, response.found ? 200 : 404, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/review-queue\") {\n const response = await this.service.reviewQueue(\n parsed.searchParams.get(\"runId\") ?? undefined,\n parsed.searchParams.get(\"namespace\") ?? undefined,\n this.resolveRequestPrincipal(req),\n );\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/maintenance\") {\n this.respondJson(res, 200, await this.service.maintenance(parsed.searchParams.get(\"namespace\") ?? undefined, this.resolveRequestPrincipal(req)));\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/quality\") {\n this.respondJson(res, 200, await this.service.quality(parsed.searchParams.get(\"namespace\") ?? undefined, this.resolveRequestPrincipal(req)));\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/trust-zones/status\") {\n this.respondJson(\n res,\n 200,\n await this.service.trustZoneStatus(parsed.searchParams.get(\"namespace\") ?? undefined, this.resolveRequestPrincipal(req)),\n );\n return;\n }\n\n // Procedural memory stats (issue #567 PR 5/5). Read-only; namespace is\n // scoped via the same resolver used by recall/trust-zones so cross-\n // tenant reads aren't possible (CLAUDE.md rule 42).\n if (req.method === \"GET\" && pathname === \"/engram/v1/procedural/stats\") {\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n this.respondJson(\n res,\n 200,\n await this.service.procedureStats(\n {\n namespace: this.resolveNamespace(\n req,\n namespaceParam && namespaceParam.length > 0\n ? namespaceParam\n : undefined,\n ),\n },\n this.resolveRequestPrincipal(req),\n ),\n );\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/trust-zones/records\") {\n const limit = parseStrictIntegerQuery(parsed.searchParams.get(\"limit\"), \"limit\", 25, 1);\n const offset = parseStrictIntegerQuery(parsed.searchParams.get(\"offset\"), \"offset\", 0, 0);\n const response = await this.service.trustZoneBrowse({\n query: parsed.searchParams.get(\"q\") ?? undefined,\n zone: parseTrustZoneFilter(parsed.searchParams.get(\"zone\")),\n kind: parseTrustZoneKindFilter(parsed.searchParams.get(\"kind\")),\n sourceClass: parseTrustZoneSourceClassFilter(parsed.searchParams.get(\"sourceClass\")),\n namespace: parsed.searchParams.get(\"namespace\") ?? undefined,\n limit,\n offset,\n }, this.resolveRequestPrincipal(req));\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/review-disposition\") {\n const body = await this.readValidatedBody(req, \"reviewDisposition\");\n this.ensureWriteRateLimitAvailable();\n const response = await this.service.reviewDisposition({\n memoryId: body.memoryId,\n status: body.status,\n reasonCode: body.reasonCode,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/trust-zones/promote\") {\n const body = await this.readValidatedBody(req, \"trustZonePromote\");\n const dryRun = body.dryRun === true;\n if (!dryRun) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.trustZonePromote({\n recordId: body.recordId,\n targetZone: body.targetZone,\n promotionReason: body.promotionReason,\n recordedAt: body.recordedAt,\n summary: body.summary,\n dryRun,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, response.dryRun ? 200 : 201, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/trust-zones/demo-seed\") {\n const body = await this.readValidatedBody(req, \"trustZoneDemoSeed\");\n const dryRun = body.dryRun === true;\n if (!dryRun) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.trustZoneDemoSeed({\n scenario: body.scenario,\n recordedAt: body.recordedAt,\n dryRun,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, response.dryRun ? 200 : 201, response);\n return;\n }\n\n // Citation usage tracking (issue #379)\n if (req.method === \"POST\" && pathname === \"/v1/citations/observed\") {\n const body = await this.readJsonBody(req);\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n throw new HttpError(400, \"request body must be a JSON object\", \"invalid_body\");\n }\n const payload = body as Record<string, unknown>;\n const sessionId = typeof payload.sessionId === \"string\" ? payload.sessionId : undefined;\n const namespace = typeof payload.namespace === \"string\" ? payload.namespace : undefined;\n const citationsRaw = payload.citations;\n if (!citationsRaw || typeof citationsRaw !== \"object\" || Array.isArray(citationsRaw)) {\n throw new HttpError(400, \"citations must be a JSON object with entries and rolloutIds\", \"invalid_citations\");\n }\n const citObj = citationsRaw as Record<string, unknown>;\n const entries: CitationEntry[] = [];\n if (Array.isArray(citObj.entries)) {\n for (const raw of citObj.entries) {\n if (raw && typeof raw === \"object\" && !Array.isArray(raw)) {\n const e = raw as Record<string, unknown>;\n if (\n typeof e.path === \"string\" &&\n typeof e.lineStart === \"number\" &&\n typeof e.lineEnd === \"number\"\n ) {\n entries.push({\n path: e.path,\n lineStart: e.lineStart,\n lineEnd: e.lineEnd,\n note: typeof e.note === \"string\" ? e.note : \"\",\n });\n }\n }\n }\n }\n const rolloutIds: string[] = [];\n if (Array.isArray(citObj.rolloutIds)) {\n for (const id of citObj.rolloutIds) {\n if (typeof id === \"string\" && id.length > 0) {\n rolloutIds.push(id);\n }\n }\n }\n\n // Record usage: for each citation entry, try to increment usage on the\n // matching memory. The service exposes recordAccess for this purpose.\n // Pass authenticatedPrincipal so namespace ACL checks use the same\n // identity resolution as other write endpoints (Finding #1, issue #379).\n let matched = 0;\n let submitted = 0;\n if (typeof this.service.recordCitationUsage === \"function\") {\n const result = await this.service.recordCitationUsage({\n sessionId,\n namespace: this.resolveNamespace(req, namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n entries,\n rolloutIds,\n });\n submitted = result.submitted;\n matched = result.matched;\n }\n\n this.respondJson(res, 200, {\n ok: true,\n submitted,\n matched,\n entriesReceived: entries.length,\n rolloutIdsReceived: rolloutIds.length,\n });\n return;\n }\n\n // ── Contradiction Review (issue #520) ─────────────────────────────────────\n if (req.method === \"GET\" && pathname === \"/engram/v1/review/contradictions\") {\n const VALID_FILTERS = new Set([\"all\", \"unresolved\", \"contradicts\", \"independent\", \"duplicates\", \"needs-user\"]);\n const rawFilter = parsed.searchParams.get(\"filter\") ?? \"unresolved\";\n if (!VALID_FILTERS.has(rawFilter)) {\n this.respondJson(res, 400, { error: `Invalid filter '${rawFilter}'. Valid: ${[...VALID_FILTERS].join(\", \")}` });\n return;\n }\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const limit = parseStrictIntegerQuery(parsed.searchParams.get(\"limit\"), \"limit\", 50, 1);\n const {\n isDefaultReviewNamespace,\n listPairs,\n } = await import(\"./contradiction/contradiction-review.js\");\n const principal = this.resolveRequestPrincipal(req);\n const resolved = await this.service.getReadableStorageForNamespace(namespace, principal);\n const reviewNamespace = this.service.configRef.namespacesEnabled ? resolved.namespace : undefined;\n const includeUnscopedForNamespace = Boolean(\n reviewNamespace && isDefaultReviewNamespace(this.service.configRef.defaultNamespace, namespace, reviewNamespace),\n );\n const result = listPairs(this.service.memoryDir, {\n filter: rawFilter as \"all\" | \"unresolved\" | \"contradicts\" | \"independent\" | \"duplicates\" | \"needs-user\",\n namespace: reviewNamespace,\n includeUnscopedForNamespace,\n limit,\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n if (req.method === \"GET\" && pathname.startsWith(\"/engram/v1/review/contradictions/\")) {\n const pairId = pathname.split(\"/\").pop() ?? \"\";\n const { readPair } = await import(\"./contradiction/contradiction-review.js\");\n const pair = readPair(this.service.memoryDir, pairId);\n if (!pair) {\n this.respondJson(res, 404, { error: \"pair_not_found\" });\n return;\n }\n try {\n await this.service.getReadableStorageForNamespace(pair.namespace, this.resolveRequestPrincipal(req));\n } catch {\n this.respondJson(res, 404, { error: \"pair_not_found\" });\n return;\n }\n this.respondJson(res, 200, pair);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/review/resolve\") {\n const body = await this.readJsonBody(req) as Record<string, unknown>;\n const pairId = typeof body.pairId === \"string\" ? body.pairId : \"\";\n const verb = typeof body.verb === \"string\" ? body.verb : \"\";\n if (!pairId || !verb) {\n this.respondJson(res, 400, { error: \"pairId and verb are required\" });\n return;\n }\n const { isValidResolutionVerb, executeResolution } = await import(\"./contradiction/resolution.js\");\n if (!isValidResolutionVerb(verb)) {\n this.respondJson(res, 400, { error: `Invalid verb: ${verb}. Must be one of: keep-a, keep-b, merge, both-valid, needs-more-context` });\n return;\n }\n const principal = this.resolveRequestPrincipal(req);\n const result = await executeResolution(this.service.memoryDir, this.service.storageRef, pairId, verb, {\n mergedMemoryId: typeof body.mergedMemoryId === \"string\" ? body.mergedMemoryId : undefined,\n mergedContent: typeof body.mergedContent === \"string\" ? body.mergedContent : undefined,\n storageForNamespace: async (namespace) => {\n const resolved = await this.service.getWritableStorageForNamespace(namespace, principal);\n return resolved.storage;\n },\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n // Graph snapshot (issue #691 PR 2/5) — read-only adjacency view used by\n // the admin-pane scaffold shipped in PR 1/5. All filters are query\n // params so the surface stays cacheable; invalid values yield 400 with\n // a descriptive body (CLAUDE.md rule 51 — never silently default).\n if (req.method === \"GET\" && pathname === \"/engram/v1/graph/snapshot\") {\n const limitRaw = parsed.searchParams.get(\"limit\");\n let limit: number | undefined;\n if (limitRaw !== null && limitRaw.length > 0) {\n const parsedLimit = Number(limitRaw);\n if (\n !Number.isFinite(parsedLimit)\n || !Number.isInteger(parsedLimit)\n || parsedLimit <= 0\n ) {\n this.respondJson(res, 400, {\n error: \"invalid_limit\",\n code: \"invalid_limit\",\n message: \"limit must be a positive integer\",\n });\n return;\n }\n limit = parsedLimit;\n }\n const sinceRaw = parsed.searchParams.get(\"since\");\n let since: string | undefined;\n if (sinceRaw !== null && sinceRaw.length > 0) {\n // Validate up-front so the access service can stay focused on the\n // pure snapshot logic (parser also runs there as a defense in\n // depth, but rejecting at the boundary preserves the\n // \"invalid_since\" error code instead of leaking a generic 500).\n if (!Number.isFinite(Date.parse(sinceRaw))) {\n this.respondJson(res, 400, {\n error: \"invalid_since\",\n code: \"invalid_since\",\n message: \"since must be a parseable ISO timestamp\",\n });\n return;\n }\n since = sinceRaw;\n }\n const focusNodeIdRaw = parsed.searchParams.get(\"focusNodeId\");\n const focusNodeId = focusNodeIdRaw && focusNodeIdRaw.length > 0\n ? focusNodeIdRaw\n : undefined;\n const categoriesRaw = parsed.searchParams.get(\"categories\");\n let categories: string[] | undefined;\n if (categoriesRaw !== null && categoriesRaw.length > 0) {\n categories = categoriesRaw\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n if (categories.length === 0) {\n this.respondJson(res, 400, {\n error: \"invalid_categories\",\n code: \"invalid_categories\",\n message:\n \"categories must be a comma-separated list with at least one non-empty value\",\n });\n return;\n }\n }\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const namespace = this.resolveNamespace(\n req,\n namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined,\n );\n try {\n const snapshot = await this.service.graphSnapshot(\n {\n namespace,\n ...(limit !== undefined ? { limit } : {}),\n ...(since !== undefined ? { since } : {}),\n ...(focusNodeId !== undefined ? { focusNodeId } : {}),\n ...(categories !== undefined ? { categories } : {}),\n },\n this.resolveRequestPrincipal(req),\n );\n this.respondJson(res, 200, snapshot);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.startsWith(\"graphSnapshot:\")) {\n this.respondJson(res, 400, {\n error: \"invalid_request\",\n code: \"invalid_request\",\n message,\n });\n return;\n }\n throw err;\n }\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/contradiction-scan\") {\n const body = await this.readJsonBody(req) as Record<string, unknown>;\n const { runContradictionScan } = await import(\"./contradiction/contradiction-scan.js\");\n const principal = this.resolveRequestPrincipal(req);\n const result = await runContradictionScan({\n storage: this.service.storageRef,\n config: this.service.configRef,\n memoryDir: this.service.memoryDir,\n embeddingLookupFactory: this.service.embeddingLookupFactoryRef,\n storageForNamespace: (namespace) =>\n this.service.getWritableStorageForNamespace(namespace, principal),\n localLlm: this.service.localLlmRef,\n fallbackLlm: this.service.fallbackLlmRef,\n namespace: typeof body.namespace === \"string\" ? body.namespace : undefined,\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n // ── Graph mutation event stream (issue #691 PR 5/5) ──────────────────────\n //\n // GET /engram/v1/graph/events\n //\n // Server-Sent Events stream that emits graph mutation events in real time.\n // Event types: node-added, node-updated, edge-added, edge-updated, edge-removed.\n //\n // Auth: same Bearer token scheme as every other endpoint (checked above).\n //\n // The SSE handler subscribes to the in-process graph event bus for the\n // resolved memory dir. Events are batched within a 200 ms window so a\n // burst of writes (e.g. extraction of a large turn) doesn't overwhelm\n // the admin UI canvas with individual re-renders.\n //\n // The client receives a `data: <json>\\n\\n` line per batch. Each batch\n // payload is { events: GraphEvent[] }.\n //\n // The stream sends a heartbeat `data: {\"type\":\"heartbeat\"}\\n\\n` every\n // 25 s so load balancers and proxies don't time out idle connections.\n if (req.method === \"GET\" && pathname === \"/engram/v1/graph/events\") {\n await this.handleGraphEventsSSE(req, res);\n return;\n }\n\n // ── Peer Registry endpoints (issue #679) ─────────────────────────────────\n // GET /engram/v1/console/state — operator console engine-state snapshot (issue #688 PR 2/3).\n // Read-only; namespace-aware via resolveRequestPrincipal so cross-tenant\n // reads are not possible (CLAUDE.md rule 42).\n if (req.method === \"GET\" && pathname === \"/engram/v1/console/state\") {\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const snapshot = await this.service.consoleState(namespace, this.resolveRequestPrincipal(req));\n this.respondJson(res, 200, snapshot);\n return;\n }\n\n // GET /engram/v1/peers — list all peers\n // GET /engram/v1/peers/:id — get one peer\n // PUT /engram/v1/peers/:id — upsert (create/update)\n // DELETE /engram/v1/peers/:id — delete identity only (idempotent)\n // DELETE /engram/v1/peers/:id?forget=true — destructive full purge (issue #679 completion)\n // GET /engram/v1/peers/:id/profile — get peer profile\n if (req.method === \"GET\" && pathname === \"/engram/v1/peers\") {\n const result = await this.service.peerList();\n this.respondJson(res, 200, result);\n return;\n }\n\n const peerProfileMatch = /^\\/engram\\/v1\\/peers\\/([^/]+)\\/profile$/.exec(pathname);\n if (peerProfileMatch) {\n if (req.method !== \"GET\") {\n this.respondJson(res, 405, { error: \"method_not_allowed\", code: \"method_not_allowed\" });\n return;\n }\n const peerId = decodePeerIdSegment(peerProfileMatch[1] ?? \"\");\n const result = await this.service.peerProfileGet(peerId);\n if (!result.found) {\n this.respondJson(res, 404, { error: \"peer_profile_not_found\", code: \"peer_profile_not_found\" });\n return;\n }\n this.respondJson(res, 200, result);\n return;\n }\n\n const peerIdMatch = /^\\/engram\\/v1\\/peers\\/([^/]+)$/.exec(pathname);\n if (peerIdMatch) {\n const peerId = decodePeerIdSegment(peerIdMatch[1] ?? \"\");\n\n if (req.method === \"GET\") {\n const result = await this.service.peerGet(peerId);\n if (!result.found) {\n this.respondJson(res, 404, { error: \"peer_not_found\", code: \"peer_not_found\" });\n return;\n }\n this.respondJson(res, 200, result);\n return;\n }\n\n if (req.method === \"PUT\") {\n const body = await this.readJsonBody(req) as Record<string, unknown>;\n // Reject malformed types up front rather than silently dropping them\n // to undefined and letting peerSet fall back to defaults\n // (CLAUDE.md rule 51: no silent defaults on bad input).\n if (\"kind\" in body && body.kind !== undefined && typeof body.kind !== \"string\") {\n throw new EngramAccessInputError(\"kind must be a string when provided\");\n }\n if (\n \"displayName\" in body &&\n body.displayName !== undefined &&\n typeof body.displayName !== \"string\"\n ) {\n throw new EngramAccessInputError(\"displayName must be a string when provided\");\n }\n if (\"notes\" in body && body.notes !== undefined && typeof body.notes !== \"string\") {\n throw new EngramAccessInputError(\"notes must be a string when provided\");\n }\n const result = await this.service.peerSet({\n id: peerId,\n kind: typeof body.kind === \"string\" ? body.kind : undefined,\n displayName: typeof body.displayName === \"string\" ? body.displayName : undefined,\n notes: typeof body.notes === \"string\" ? body.notes : undefined,\n });\n this.respondJson(res, result.created ? 201 : 200, result);\n return;\n }\n\n if (req.method === \"DELETE\") {\n // `?forget=true` triggers the destructive full-purge path (issue #679\n // completion). The caller must also pass `confirm=yes` in the request\n // body; absent confirmation yields 400. Plain DELETE (no ?forget) keeps\n // the existing soft-delete behaviour (identity.md only).\n const forgetParam = parsed.searchParams.get(\"forget\");\n if (forgetParam === \"true\") {\n const body = await this.readJsonBody(req) as Record<string, unknown>;\n const confirm = typeof body.confirm === \"string\" ? body.confirm : \"\";\n if (confirm !== \"yes\") {\n this.respondJson(res, 400, {\n error: \"confirm_required\",\n code: \"confirm_required\",\n message: \"DELETE ?forget=true requires { confirm: 'yes' } in the request body\",\n });\n return;\n }\n const result = await this.service.peerForget(peerId, { confirm: \"yes\" });\n this.respondJson(res, 200, result);\n return;\n }\n const result = await this.service.peerDelete(peerId);\n this.respondJson(res, 200, result);\n return;\n }\n\n this.respondJson(res, 405, { error: \"method_not_allowed\", code: \"method_not_allowed\" });\n return;\n }\n\n // ── Dreams telemetry (issue #678 PR 3+4) ──────────────────────────────────\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/dreams/status\") {\n const { normalizeDreamsStatusWindowHours } = await import(\"./maintenance/dreams-ledger.js\");\n const windowHoursRaw = parsed.searchParams.get(\"windowHours\");\n let windowHours: number;\n try {\n windowHours = normalizeDreamsStatusWindowHours(\n windowHoursRaw !== null ? Number(windowHoursRaw) : undefined,\n );\n } catch {\n this.respondJson(res, 400, { error: \"windowHours must be a positive integer\" });\n return;\n }\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const namespace = namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined;\n const result = await this.service.dreamsStatus({\n windowHours,\n namespace,\n principal: this.resolveRequestPrincipal(req),\n });\n this.respondJson(res, 200, result);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/dreams/run\") {\n const body = await this.readJsonBody(req) as Record<string, unknown>;\n const VALID_PHASES = [\"lightSleep\", \"rem\", \"deepSleep\"] as const;\n const phase = typeof body.phase === \"string\" ? body.phase : undefined;\n if (!phase || !(VALID_PHASES as readonly string[]).includes(phase)) {\n this.respondJson(res, 400, {\n error: `phase is required and must be one of: ${VALID_PHASES.join(\", \")}`,\n });\n return;\n }\n if (\n \"dryRun\" in body &&\n body.dryRun !== undefined &&\n typeof body.dryRun !== \"boolean\"\n ) {\n this.respondJson(res, 400, {\n error: \"dryRun must be a boolean when provided\",\n });\n return;\n }\n if (\n \"namespace\" in body &&\n body.namespace !== undefined &&\n typeof body.namespace !== \"string\"\n ) {\n this.respondJson(res, 400, {\n error: \"namespace must be a string when provided\",\n });\n return;\n }\n const dryRun = body.dryRun === true;\n const namespace =\n typeof body.namespace === \"string\" ? body.namespace : undefined;\n if (!dryRun) {\n this.ensureWriteRateLimitAvailable();\n }\n const result = await this.service.dreamsRun({\n phase: phase as import(\"./types.js\").DreamsPhase,\n dryRun,\n namespace,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n if (this.shouldCountWriteRateLimit(result as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, 200, result);\n return;\n }\n\n this.respondJson(res, 404, { error: \"not_found\", code: \"not_found\" });\n }\n\n /**\n * SSE handler for /engram/v1/graph/events.\n *\n * Lifecycle:\n * 1. Write SSE headers (Content-Type: text/event-stream).\n * 2. Register this response in `sseClients`.\n * 3. Resolve the namespace from the request and subscribe to THAT\n * namespace's graph event bus (Codex P1: in multi-namespace\n * deployments each namespace has its own bus keyed by its storage\n * dir — subscribing to the global root leaks events across tenants).\n * 4. On each event, add to a 200 ms batch; flush batch as a single SSE frame.\n * 5. Send heartbeat every 25 s.\n * 6. On client disconnect (req \"close\"), clean up timers and unsubscribe.\n * 7. Register the cleanup callback in `sseCleanupFns` so `stop()` can\n * release the heartbeat interval and bus subscription even when the\n * client never disconnects (Cursor review thread `access-http.ts:232`).\n */\n private async handleGraphEventsSSE(req: IncomingMessage, res: ServerResponse): Promise<void> {\n // Resolve namespace from the ?namespace= query parameter (same pattern\n // as graphSnapshot and other read endpoints). Falls back to the\n // default namespace when absent.\n const parsed = new URL(req.url ?? \"/\", `http://${hostToUrlAuthority(this.host)}`);\n const namespaceParam = parsed.searchParams.get(\"namespace\");\n const namespace = namespaceParam && namespaceParam.length > 0 ? namespaceParam : undefined;\n // Resolve to the per-namespace storage directory so the bus subscription\n // is scoped to the correct tenant (CLAUDE.md rule 42).\n // Pass the request principal so namespace ACL is enforced — without it,\n // resolveReadableNamespace throws when namespacesEnabled=true (Cursor\n // thread PRRT_kwDORJXyws59snoR / Codex thread PRRT_kwDORJXyws59soGJ).\n const principal = this.resolveRequestPrincipal(req);\n const memoryDir = await this.service.getMemoryDirForNamespace(namespace, principal);\n\n res.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-cache, no-store, must-revalidate\",\n \"connection\": \"keep-alive\",\n \"x-accel-buffering\": \"no\", // prevent nginx buffering\n \"transfer-encoding\": \"chunked\",\n });\n\n // Send initial \"connected\" frame so the client knows the stream is live.\n const writeSSE = (payload: unknown): void => {\n try {\n res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n } catch {\n // client already gone — cleanup will fire via \"close\"\n }\n };\n\n writeSSE({ type: \"connected\" });\n\n this.sseClients.add(res);\n\n // --- 200 ms batch throttle -----------------------------------------------\n const flushBatch = (): void => {\n const batch = this.ssePendingBatches.get(res);\n if (!batch || batch.length === 0) return;\n this.ssePendingBatches.delete(res);\n this.sseBatchTimers.delete(res);\n writeSSE({ type: \"batch\", events: batch });\n };\n\n const unsubscribe = subscribeGraphEvents(memoryDir, (event: GraphEvent) => {\n let batch = this.ssePendingBatches.get(res);\n if (!batch) {\n batch = [];\n this.ssePendingBatches.set(res, batch);\n }\n batch.push(event);\n if (!this.sseBatchTimers.has(res)) {\n this.sseBatchTimers.set(res, setTimeout(flushBatch, 200));\n }\n });\n\n // --- 25 s heartbeat -------------------------------------------------------\n const heartbeatInterval = setInterval(() => {\n writeSSE({ type: \"heartbeat\" });\n }, 25_000);\n\n // --- Cleanup on client disconnect -----------------------------------------\n const cleanup = (): void => {\n clearInterval(heartbeatInterval);\n const timer = this.sseBatchTimers.get(res);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.sseBatchTimers.delete(res);\n }\n this.ssePendingBatches.delete(res);\n unsubscribe();\n this.sseClients.delete(res);\n this.sseCleanupFns.delete(cleanup);\n try { res.end(); } catch { /* ignore */ }\n };\n\n // Register so stop() can invoke cleanup even when the client is still\n // connected (releases the heartbeat interval and bus subscription\n // before the HTTP server is torn down).\n this.sseCleanupFns.add(cleanup);\n\n req.once(\"close\", cleanup);\n req.once(\"error\", cleanup);\n }\n\n private async handleMcpRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await this.readJsonBody(req);\n const request = body as {\n jsonrpc?: string;\n id?: string | number | null;\n method?: string;\n params?: Record<string, unknown>;\n };\n\n // Enforce write rate limiting for MCP tool calls that mutate state,\n // matching the same protection applied to the REST write endpoints.\n // Pre-check ensures capacity; post-check skips counting dry runs and\n // idempotency replays, consistent with the REST handlers.\n const toolName = typeof request.params?.name === \"string\" ? request.params.name : \"\";\n const toolArgs = request.params?.arguments;\n const dreamsRunDryRun =\n (toolName === \"engram.dreams_run\" || toolName === \"remnic.dreams_run\") &&\n toolArgs !== null &&\n typeof toolArgs === \"object\" &&\n !Array.isArray(toolArgs) &&\n (toolArgs as { dryRun?: unknown }).dryRun === true;\n const memoryActionApplyDryRun =\n (toolName === \"engram.memory_action_apply\" || toolName === \"remnic.memory_action_apply\") &&\n toolArgs !== null &&\n typeof toolArgs === \"object\" &&\n !Array.isArray(toolArgs) &&\n (toolArgs as { dryRun?: unknown }).dryRun === true;\n const isMcpWrite =\n request.method === \"tools/call\" &&\n (\n toolName === \"engram.memory_store\" ||\n toolName === \"remnic.memory_store\" ||\n toolName === \"engram.suggestion_submit\" ||\n toolName === \"remnic.suggestion_submit\" ||\n toolName === \"engram.observe\" ||\n toolName === \"remnic.observe\" ||\n toolName === \"engram.lcm_compaction_flush\" ||\n toolName === \"remnic.lcm_compaction_flush\" ||\n toolName === \"engram.lcm_compaction_record\" ||\n toolName === \"remnic.lcm_compaction_record\" ||\n toolName === \"engram.capsule_export\" ||\n toolName === \"remnic.capsule_export\" ||\n toolName === \"engram.capsule_import\" ||\n toolName === \"remnic.capsule_import\" ||\n (\n !dreamsRunDryRun &&\n (toolName === \"engram.dreams_run\" || toolName === \"remnic.dreams_run\")\n ) ||\n (\n !memoryActionApplyDryRun &&\n (\n toolName === \"engram.memory_action_apply\" ||\n toolName === \"remnic.memory_action_apply\"\n )\n )\n );\n if (isMcpWrite) {\n this.ensureWriteRateLimitAvailable();\n }\n\n const sessionId = (() => {\n const raw = req.headers[\"mcp-session-id\"];\n return typeof raw === \"string\" ? raw.trim() : undefined;\n })();\n const mcpCorrelationId = correlationIdStore.getStore() ?? randomUUID();\n const requestIdentity = this.resolveRequestIdentity(req);\n const response = await this.mcpServer.handleRequest(request, {\n principalOverride: requestIdentity.principal,\n namespaceOverride: requestIdentity.namespace,\n sessionKeyOverride: requestIdentity.sessionKey,\n sessionId,\n correlationId: mcpCorrelationId,\n });\n\n if (isMcpWrite && response !== null) {\n const result = (response as Record<string, unknown>).result as Record<string, unknown> | undefined;\n const isError = result?.isError === true;\n const structured = result?.structuredContent as { dryRun?: boolean; idempotencyReplay?: boolean } | undefined;\n if (!isError && structured && this.shouldCountWriteRateLimit(structured)) {\n this.recordWriteRateLimitHit();\n }\n }\n if (response === null) {\n res.statusCode = 202;\n res.end();\n return;\n }\n // If this was an initialize response, pop the session ID keyed by\n // correlation ID (unique per HTTP request, not client-chosen JSON-RPC id).\n const assignedSessionId = this.mcpServer.popInitSessionId(mcpCorrelationId);\n if (assignedSessionId) {\n res.setHeader(\"mcp-session-id\", assignedSessionId);\n }\n this.respondJson(res, 200, response);\n }\n\n private respondJson(res: ServerResponse, status: number, payload: unknown): void {\n const body = JSON.stringify(payload, null, 2);\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.setHeader(\"content-length\", String(Buffer.byteLength(body)));\n const cid = correlationIdStore.getStore();\n if (cid) {\n res.setHeader(\"x-request-id\", cid);\n }\n res.end(body);\n }\n\n private async respondOfflineSnapshotStream(\n res: ServerResponse,\n snapshot: Awaited<ReturnType<EngramAccessService[\"offlineSyncSnapshotStream\"]>>,\n ): Promise<void> {\n res.statusCode = 200;\n res.setHeader(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n res.setHeader(\"cache-control\", \"no-store\");\n const cid = correlationIdStore.getStore();\n if (cid) {\n res.setHeader(\"x-request-id\", cid);\n }\n const waitForDrainOrClose = async (): Promise<boolean> => new Promise((resolve, reject) => {\n const cleanup = () => {\n res.off(\"drain\", onDrain);\n res.off(\"close\", onClose);\n res.off(\"error\", onError);\n };\n const onDrain = () => {\n cleanup();\n resolve(true);\n };\n const onClose = () => {\n cleanup();\n resolve(false);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n res.once(\"drain\", onDrain);\n res.once(\"close\", onClose);\n res.once(\"error\", onError);\n });\n const writeLine = async (payload: unknown): Promise<boolean> => {\n if (res.destroyed || res.writableEnded) return false;\n if (res.write(`${JSON.stringify(payload)}\\n`)) return true;\n if (res.destroyed || res.writableEnded) return false;\n return waitForDrainOrClose();\n };\n if (!await writeLine({\n type: \"snapshot\",\n namespace: snapshot.namespace,\n format: snapshot.format,\n schemaVersion: snapshot.schemaVersion,\n createdAt: snapshot.createdAt,\n sourceId: snapshot.sourceId,\n includeTranscripts: snapshot.includeTranscripts,\n })) return;\n for await (const file of snapshot.files) {\n if (!await writeLine({ type: \"file\", file })) return;\n }\n if (!res.destroyed && !res.writableEnded) {\n res.end();\n }\n }\n\n private respondBinary(\n res: ServerResponse,\n status: number,\n body: Buffer,\n headers: Record<string, string> = {},\n ): void {\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/octet-stream\");\n res.setHeader(\"content-length\", String(body.length));\n for (const [key, value] of Object.entries(headers)) {\n res.setHeader(key, value);\n }\n const cid = correlationIdStore.getStore();\n if (cid) {\n res.setHeader(\"x-request-id\", cid);\n }\n res.end(body);\n }\n\n private async handleAdminConsole(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ): Promise<boolean> {\n if (req.method !== \"GET\") return false;\n if (pathname === \"/remnic/ui\" || pathname === \"/engram/ui\") {\n res.statusCode = 301;\n res.setHeader(\"location\", pathname + \"/\");\n res.end();\n return true;\n }\n if (pathname === \"/remnic/ui/\" || pathname === \"/engram/ui/\") {\n await this.respondStatic(res, path.join(this.adminConsolePublicDir, \"index.html\"), \"text/html; charset=utf-8\");\n return true;\n }\n if (pathname === \"/remnic/ui/app.js\" || pathname === \"/engram/ui/app.js\") {\n await this.respondStatic(res, path.join(this.adminConsolePublicDir, \"app.js\"), \"application/javascript; charset=utf-8\");\n return true;\n }\n return false;\n }\n\n private async respondStatic(res: ServerResponse, filePath: string, contentType: string): Promise<void> {\n try {\n const body = await readFile(filePath, \"utf-8\");\n res.statusCode = 200;\n res.setHeader(\"content-type\", contentType);\n res.setHeader(\"content-length\", String(Buffer.byteLength(body)));\n res.end(body);\n } catch {\n this.respondJson(res, 404, { error: \"not_found\" });\n }\n }\n\n private async readJsonBody(\n req: IncomingMessage,\n maxBodyBytes = this.maxBodyBytes,\n ): Promise<Record<string, unknown>> {\n const encoding = (this.readOptionalHeader(req, \"content-encoding\") ?? \"identity\").toLowerCase();\n if (encoding !== \"identity\" && encoding !== \"gzip\") {\n throw new HttpError(415, \"unsupported_content_encoding\", \"unsupported_content_encoding\");\n }\n const chunks: Buffer[] = [];\n let total = 0;\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n total += buffer.length;\n if (total > maxBodyBytes) {\n throw new HttpError(413, \"request_body_too_large\", \"request_body_too_large\");\n }\n chunks.push(buffer);\n }\n if (chunks.length === 0) return {};\n let body = Buffer.concat(chunks, total);\n if (encoding === \"gzip\") {\n try {\n body = gunzipSync(body, { maxOutputLength: maxBodyBytes });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ERR_BUFFER_TOO_LARGE\") {\n throw new HttpError(413, \"request_body_too_large\", \"request_body_too_large\");\n }\n throw new HttpError(400, \"invalid_gzip_body\", \"invalid_gzip_body\");\n }\n if (body.byteLength > maxBodyBytes) {\n throw new HttpError(413, \"request_body_too_large\", \"request_body_too_large\");\n }\n }\n const raw = body.toString(\"utf-8\").trim();\n if (raw.length === 0) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new HttpError(400, \"invalid_json\", \"invalid_json\");\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new HttpError(400, \"invalid_json_object\", \"invalid_json_object\");\n }\n return parsed as Record<string, unknown>;\n }\n\n private async readBinaryBody(req: IncomingMessage, maxBytes: number): Promise<Buffer> {\n const chunks: Buffer[] = [];\n let total = 0;\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n total += buffer.length;\n if (total > maxBytes) {\n throw new HttpError(413, \"request_body_too_large\", \"request_body_too_large\");\n }\n chunks.push(buffer);\n }\n return Buffer.concat(chunks, total);\n }\n\n private readRequiredHeader(req: IncomingMessage, name: string): string {\n const value = this.readOptionalHeader(req, name);\n if (value === undefined || value.length === 0) {\n throw new EngramAccessInputError(`${name} header is required`);\n }\n return value;\n }\n\n private readOptionalHeader(req: IncomingMessage, name: string): string | undefined {\n const raw = req.headers[name.toLowerCase()];\n if (Array.isArray(raw)) return raw[0]?.trim() || undefined;\n return raw?.trim() || undefined;\n }\n\n private readRequiredDecodedHeader(req: IncomingMessage, name: string): string {\n const raw = this.readRequiredHeader(req, name);\n try {\n return decodeURIComponent(raw);\n } catch {\n throw new EngramAccessInputError(`${name} header is not valid percent-encoded input`);\n }\n }\n\n private readRequiredIntegerHeader(req: IncomingMessage, name: string): number {\n const raw = this.readRequiredHeader(req, name);\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new EngramAccessInputError(`${name} header must be a non-negative integer`);\n }\n return parsed;\n }\n\n private readOptionalIntegerHeader(req: IncomingMessage, name: string): number | undefined {\n const raw = this.readOptionalHeader(req, name);\n if (raw === undefined) return undefined;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new EngramAccessInputError(`${name} header must be a non-negative integer`);\n }\n return parsed;\n }\n\n private readRequiredNumberHeader(req: IncomingMessage, name: string): number {\n const raw = this.readRequiredHeader(req, name);\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new EngramAccessInputError(`${name} header must be a non-negative finite number`);\n }\n return parsed;\n }\n\n private parseOptionalBooleanHeader(\n req: IncomingMessage,\n name: string,\n defaultValue: boolean,\n ): boolean {\n const raw = this.readOptionalHeader(req, name);\n if (raw === undefined) return defaultValue;\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n throw new EngramAccessInputError(`${name} header must be one of: true, false`);\n }\n\n private async readValidatedBody<S extends SchemaName>(\n req: IncomingMessage,\n schemaName: S,\n maxBodyBytes?: number,\n ): Promise<SchemaTypeFor<S>> {\n const raw = await this.readJsonBody(req, maxBodyBytes);\n const result = validateRequest(schemaName, raw);\n if (!result.success) {\n throw new HttpError(400, result.error.error, \"validation_error\", result.error.details);\n }\n return result.data as SchemaTypeFor<S>;\n }\n\n private isAuthorized(req: IncomingMessage, pathname?: string): boolean {\n if (!this.authToken && this.authTokens.length === 0 && !this.authTokensGetter) return false;\n // Primary path: Authorization: Bearer <token> header.\n const raw = req.headers.authorization;\n let candidate: string | null = null;\n if (raw) {\n const separator = raw.indexOf(\" \");\n if (separator > 0) {\n const scheme = raw.slice(0, separator).toLowerCase();\n if (scheme === \"bearer\") {\n candidate = raw.slice(separator + 1).trim();\n }\n }\n }\n // Fallback: ?token= query parameter — ONLY accepted for the SSE\n // endpoint (/engram/v1/graph/events). EventSource cannot set request\n // headers, so SSE clients must pass the token via the query string.\n // Allowing this fallback on every endpoint would let a CSRF attacker\n // embed a credentialed URL anywhere — restricting it to SSE limits the\n // attack surface (Codex P2 review thread `access-http.ts:1406`; Cursor\n // review thread `access-http.ts:1412`). Authorization header always\n // wins; timing-safe compare used below.\n if (!candidate && pathname === \"/engram/v1/graph/events\") {\n try {\n const parsed = new URL(req.url ?? \"/\", `http://${hostToUrlAuthority(this.host)}`);\n const queryToken = parsed.searchParams.get(\"token\");\n if (queryToken && queryToken.length > 0) {\n candidate = queryToken;\n }\n } catch {\n // Malformed URL — don't authenticate\n }\n }\n if (!candidate) return false;\n const token = candidate;\n // Check primary token\n if (this.authToken && this.timingSafeStringEqual(token, this.authToken)) return true;\n // Check static multi-connector tokens\n for (const valid of this.authTokens) {\n if (this.timingSafeStringEqual(token, valid)) return true;\n }\n // Check dynamic tokens (reloaded per request for generate/revoke without restart)\n if (this.authTokensGetter) {\n for (const valid of this.authTokensGetter()) {\n if (this.timingSafeStringEqual(token, valid)) return true;\n }\n }\n return false;\n }\n\n private timingSafeStringEqual(a: string, b: string): boolean {\n const left = this.encodeSecret(a);\n const right = this.encodeSecret(b);\n if (!left || !right) return false;\n return timingSafeEqual(left, right);\n }\n\n private encodeSecret(value: string): Buffer | null {\n const encoded = Buffer.from(value, \"utf-8\");\n if (encoded.length > 1024) return null;\n const out = Buffer.alloc(2 + 1024);\n out.writeUInt16BE(encoded.length, 0);\n encoded.copy(out, 2);\n return out;\n }\n\n private writeResponseStatus(response: { dryRun: boolean; status: string }): number {\n if (response.dryRun === true) return 200;\n if (response.status === \"stored\" || response.status === \"queued_for_review\") return 201;\n return 200;\n }\n\n private ensureWriteRateLimitAvailable(): void {\n const now = Date.now();\n while (\n this.writeRequestTimestamps.length > 0 &&\n now - (this.writeRequestTimestamps[0] ?? 0) > WRITE_RATE_LIMIT_WINDOW_MS\n ) {\n this.writeRequestTimestamps.shift();\n }\n if (this.writeRequestTimestamps.length >= WRITE_RATE_LIMIT_MAX_REQUESTS) {\n throw new HttpError(429, \"write_rate_limited\", \"write_rate_limited\");\n }\n }\n\n private recordWriteRateLimitHit(): void {\n this.writeRequestTimestamps.push(Date.now());\n }\n\n private shouldCountWriteRateLimit(response: { dryRun?: boolean; idempotencyReplay?: boolean }): boolean {\n return response.dryRun !== true && response.idempotencyReplay !== true;\n }\n}\n"],"mappings":"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","names":["result"]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  collectNativeKnowledgeChunks
3
- } from "./chunk-7SEAZFFB.js";
3
+ } from "./chunk-BEUDU7Y4.js";
4
4
  import {
5
5
  compareEntityTimestamps,
6
6
  normalizeEntityName
7
- } from "./chunk-VBJ7V5SK.js";
7
+ } from "./chunk-UIPDNLXA.js";
8
8
  import {
9
9
  sanitizeMemoryContent
10
10
  } from "./chunk-FVQJYWH7.js";
@@ -191,6 +191,25 @@ async function readNativeChunks(config, recallNamespaces) {
191
191
  defaultNamespace: config.defaultNamespace
192
192
  }).catch(() => []);
193
193
  }
194
+ async function resolveEntityIndexStorages(storage, config, recallNamespaces, namespaceStorage) {
195
+ if (!config.namespacesEnabled || !namespaceStorage || !recallNamespaces || recallNamespaces.length === 0) {
196
+ return [storage];
197
+ }
198
+ const storages = [];
199
+ const seenDirs = /* @__PURE__ */ new Set();
200
+ for (const namespace of uniqueStrings(recallNamespaces)) {
201
+ try {
202
+ const scopedStorage = await namespaceStorage(namespace);
203
+ const storageDir = path.resolve(scopedStorage.dir);
204
+ if (seenDirs.has(storageDir)) continue;
205
+ seenDirs.add(storageDir);
206
+ storages.push(scopedStorage);
207
+ } catch {
208
+ continue;
209
+ }
210
+ }
211
+ return storages.length > 0 ? storages : [storage];
212
+ }
194
213
  function entityIndexStatePath(storage) {
195
214
  return path.join(storage.dir, "state", "entity-mention-index.json");
196
215
  }
@@ -256,13 +275,22 @@ function mergeNativeChunk(entry, chunk) {
256
275
  });
257
276
  entry.aliases = uniqueStrings([...entry.aliases, ...chunk.aliases ?? []]);
258
277
  }
259
- async function buildEntityMentionIndex(storage, config, recallNamespaces) {
260
- const [previousIndex, entityFiles, memories, nativeChunks] = await Promise.all([
261
- readEntityIndexState(storage),
262
- storage.readAllEntityFiles(),
263
- storage.readAllMemories(),
278
+ async function buildEntityMentionIndex(storage, config, recallNamespaces, namespaceStorage) {
279
+ const storages = await resolveEntityIndexStorages(
280
+ storage,
281
+ config,
282
+ recallNamespaces,
283
+ namespaceStorage
284
+ );
285
+ const shouldPersistIndex = storages.length === 1 && path.resolve(storages[0].dir) === path.resolve(storage.dir);
286
+ const [previousIndex, entityFileSets, memorySets, nativeChunks] = await Promise.all([
287
+ shouldPersistIndex ? readEntityIndexState(storage) : Promise.resolve(null),
288
+ Promise.all(storages.map((scopedStorage) => scopedStorage.readAllEntityFiles())),
289
+ Promise.all(storages.map((scopedStorage) => scopedStorage.readAllMemories())),
264
290
  readNativeChunks(config, recallNamespaces)
265
291
  ]);
292
+ const entityFiles = entityFileSets.flat();
293
+ const memories = memorySets.flat();
266
294
  const entities = /* @__PURE__ */ new Map();
267
295
  for (const entity of entityFiles) {
268
296
  const canonicalId = normalizeEntityName(entity.name, entity.type);
@@ -326,7 +354,9 @@ async function buildEntityMentionIndex(storage, config, recallNamespaces) {
326
354
  updatedAt: previousIndex && previousEntities === nextEntities ? previousIndex.updatedAt : (/* @__PURE__ */ new Date()).toISOString(),
327
355
  entities: sortedEntities
328
356
  };
329
- await writeEntityIndexState(storage, index);
357
+ if (shouldPersistIndex) {
358
+ await writeEntityIndexState(storage, index);
359
+ }
330
360
  return index;
331
361
  }
332
362
  function resolveExplicitCandidates(index, query) {
@@ -542,7 +572,12 @@ function formatEntityHintSection(candidates, queryTokens, mode, maxRelatedEntiti
542
572
  async function buildEntityRecallSection(options) {
543
573
  const mode = detectEntityQueryMode(options.query);
544
574
  if (!mode) return null;
545
- const index = await buildEntityMentionIndex(options.storage, options.config, options.recallNamespaces);
575
+ const index = await buildEntityMentionIndex(
576
+ options.storage,
577
+ options.config,
578
+ options.recallNamespaces,
579
+ options.namespaceStorage
580
+ );
546
581
  if (index.entities.length === 0) return null;
547
582
  const explicitCandidates = resolveExplicitCandidates(index, options.query);
548
583
  const candidates = explicitCandidates.length > 0 ? explicitCandidates : resolveRecentTurnCandidates(index, options.transcriptEntries, options.recentTurns);
@@ -593,4 +628,4 @@ export {
593
628
  entityIndexVersion,
594
629
  entityRecentTranscriptLookbackHours
595
630
  };
596
- //# sourceMappingURL=chunk-43PJZYGL.js.map
631
+ //# sourceMappingURL=chunk-FPGE5NVO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entity-retrieval.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { collectNativeKnowledgeChunks, type NativeKnowledgeChunk } from \"./native-knowledge.js\";\nimport { compareEntityTimestamps, normalizeEntityName, type StorageManager } from \"./storage.js\";\nimport { normalizeEntityText, resolveRequestedEntitySectionKeys } from \"./entity-schema.js\";\nimport type { EntityStructuredSection, MemoryFile, PluginConfig, TranscriptEntry } from \"./types.js\";\n\nconst ENTITY_INDEX_VERSION = 3;\nconst RECENT_TRANSCRIPT_LOOKBACK_HOURS = 24;\nconst INSTRUCTION_LIKE_RE = /\\b(always|never|must|should|remember to|do not|don't|process|workflow|template|checklist|instruction)\\b/i;\nconst METADATA_WRAPPER_RE = /^(source|context|metadata|notes?):/i;\nconst ENTITY_PRONOUN_RE = /\\b(he|him|his|she|her|they|them|their|it|its)\\b/i;\n\ntype EntityQueryMode = \"direct\" | \"timeline\" | \"follow_up\";\n\ntype EntityMentionIndexEntry = {\n canonicalId: string;\n name: string;\n type: string;\n aliases: string[];\n summary?: string;\n facts: string[];\n timelineFacts: string[];\n structuredSections: EntityStructuredSection[];\n timeline: Array<{\n timestamp: string;\n text: string;\n source?: string;\n sessionKey?: string;\n principal?: string;\n }>;\n relationships: Array<{ target: string; label: string }>;\n activity: Array<{ date: string; note: string }>;\n factCount: number;\n memorySnippets: string[];\n nativeChunks: Array<{\n chunkId: string;\n title: string;\n sourceKind: NativeKnowledgeChunk[\"sourceKind\"];\n sourcePath: string;\n snippet: string;\n derivedDate?: string;\n }>;\n};\n\ntype EntityMentionIndex = {\n version: number;\n updatedAt: string;\n entities: EntityMentionIndexEntry[];\n};\n\ntype EntityCandidate = {\n entry: EntityMentionIndexEntry;\n alias: string;\n score: number;\n source: \"query\" | \"recent_turn\";\n};\n\ntype EntityHintSnippet = {\n text: string;\n score: number;\n kind: \"summary\" | \"fact\" | \"section\" | \"relationship\" | \"activity\" | \"memory\" | \"native\";\n};\n\nexport interface BuildEntityRecallSectionOptions {\n config: PluginConfig;\n storage: StorageManager;\n namespaceStorage?: (namespace: string) => Promise<StorageManager>;\n query: string;\n recallNamespaces?: string[];\n recentTurns: number;\n maxHints: number;\n maxSupportingFacts: number;\n maxRelatedEntities: number;\n maxChars: number;\n transcriptEntries: TranscriptEntry[];\n}\n\nfunction tokenize(value: string): string[] {\n return normalizeEntityText(value).split(/\\s+/).filter((token) => token.length >= 2);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))];\n}\n\nfunction containsPhrase(haystack: string, needle: string): boolean {\n if (!needle) return false;\n const escaped = needle.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`(^|\\\\b)${escaped}(\\\\b|$)`, \"i\").test(haystack);\n}\n\nfunction compactLine(value: string, maxLength: number = 220): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n if (normalized.length <= maxLength) return normalized;\n return `${normalized.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\nfunction dedupeHintSnippetsByText(snippets: EntityHintSnippet[]): EntityHintSnippet[] {\n const seen = new Set<string>();\n const result: EntityHintSnippet[] = [];\n for (const snippet of snippets) {\n const key = normalizeEntityText(snippet.text);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(snippet);\n }\n return result;\n}\n\nfunction relationLine(entry: EntityMentionIndexEntry, relationship: { target: string; label: string }): string {\n const normalizedLabel = relationship.label.replace(/\\s+/g, \" \").trim();\n if (normalizedLabel.length === 0) return `${entry.name} is connected to ${relationship.target}`;\n return `${entry.name} ${normalizedLabel} ${relationship.target}`;\n}\n\nfunction detectEntityQueryMode(query: string): EntityQueryMode | null {\n const normalized = normalizeEntityText(query);\n if (!normalized) return null;\n if (\n /^(what about|and what about|how about|what happened (with|to) (he|him|his|she|her|they|them|their|it|its)|did (he|she|they|it)|is (he|she|they|it)|was (he|she|they|it))\\b/.test(normalized)\n ) {\n return \"follow_up\";\n }\n if (\n /^(who is|who s|what do we know about|what does|tell me about|what can you tell me about|what s new with|what happened with|what happened to|status of|where is|how is)\\b/.test(normalized)\n ) {\n if (/^what does\\b/.test(normalized)) {\n if (/^what does (?:this|that|it|the|a|an|my|our|your|their)\\b/.test(normalized)) {\n return null;\n }\n if (\n /^what does [a-z0-9-]+ (?:error|warning|exception|failure|stack|trace|code|message|log)\\b/.test(normalized)\n && /\\b(mean|means|indicate|indicates|imply|implies)\\b/.test(normalized)\n ) {\n return null;\n }\n }\n return /what happened|what s new|status of|how is|where is/.test(normalized) ? \"timeline\" : \"direct\";\n }\n if (ENTITY_PRONOUN_RE.test(normalized) && normalized.split(/\\s+/).length <= 8) {\n return \"follow_up\";\n }\n return null;\n}\n\nfunction scoreAliasMatch(query: string, alias: string): number {\n const normalizedQuery = normalizeEntityText(query);\n const normalizedAlias = normalizeEntityText(alias);\n if (!normalizedAlias) return 0;\n if (normalizedQuery === normalizedAlias) return 10;\n if (containsPhrase(normalizedQuery, normalizedAlias)) return 8 + Math.min(normalizedAlias.split(/\\s+/).length, 3);\n const queryTokens = new Set(tokenize(normalizedQuery));\n const aliasTokens = tokenize(normalizedAlias);\n if (aliasTokens.length === 0) return 0;\n const overlap = aliasTokens.filter((token) => queryTokens.has(token)).length;\n if (overlap === 0) return 0;\n // Cross-entity contamination guard (#682 PR 2/3 R-2). For multi-token\n // aliases, partial-token overlap that hits ONLY shared common tokens\n // (like \"person\" in \"Person-A1\" / \"Person-B1\") would surface every\n // similarly-prefixed entity for a query that named only one. Require\n // that the overlap include at least one DISTINCTIVE alias token —\n // i.e. a token that does not also appear in any other entity's\n // alias-token vocabulary. Since this function is pure / per-pair, we\n // approximate \"distinctive\" by requiring the overlap to include at\n // least one token that is not a substring-of common identifier\n // affixes. The aliasTokens with length > 1 must contribute at least\n // one non-affix overlap. \"Alice Example\" ([\"alice\", \"example\"])\n // matched by query \"Tell me about Alice\" → overlap = 1 on \"alice\",\n // and \"alice\" is not an affix → score = 1. \"Person-A1\" tokens\n // [\"person\", \"a1\"] matched by query \"Who is Person-B1?\" → overlap =\n // 1 on \"person\", and \"person\" IS an affix → score = 0.\n if (aliasTokens.length > 1) {\n const nonAffixOverlap = aliasTokens.filter(\n (token) => queryTokens.has(token) && !isAliasAffixToken(token),\n ).length;\n if (nonAffixOverlap === 0) return 0;\n }\n return overlap;\n}\n\n/**\n * Tokens that look like type prefixes / generic role identifiers and\n * therefore should not, on their own, count as evidence that a\n * multi-token alias matches a query (#682 PR 2/3 R-2).\n *\n * Kept as a small explicit list rather than a regex so additions are\n * deliberate. The list mirrors the entity types listed in\n * `entity-schema.ts` plus the most common generic role identifiers\n * that frequently appear as the leading token of a display name.\n */\nconst ALIAS_AFFIX_TOKENS = new Set<string>([\n \"person\", \"people\", \"user\", \"users\", \"team\", \"teams\",\n \"project\", \"projects\", \"topic\", \"topics\",\n \"org\", \"orgs\", \"organization\", \"organizations\", \"company\", \"companies\",\n \"place\", \"places\", \"tool\", \"tools\", \"service\", \"services\",\n \"system\", \"systems\", \"agent\", \"agents\", \"bot\", \"bots\",\n]);\n\nfunction isAliasAffixToken(token: string): boolean {\n return ALIAS_AFFIX_TOKENS.has(token);\n}\n\nfunction isLikelyInstructionLike(value: string): boolean {\n return INSTRUCTION_LIKE_RE.test(value) || METADATA_WRAPPER_RE.test(value);\n}\n\nfunction sanitizeEntityFact(fact: string): string {\n const sanitized = sanitizeMemoryContent(fact);\n const clean = sanitized.text.trim();\n if (!clean) return \"\";\n if (INSTRUCTION_LIKE_RE.test(clean) && clean.length > 100) return \"\";\n return clean;\n}\n\nfunction scoreHintSnippet(snippet: EntityHintSnippet, queryTokens: string[]): EntityHintSnippet | null {\n const normalized = normalizeEntityText(snippet.text);\n if (!normalized) return null;\n const scored = { ...snippet };\n if (isLikelyInstructionLike(scored.text) && scored.kind !== \"summary\") {\n scored.score -= 3;\n }\n const overlap = queryTokens.filter((token) => normalized.includes(token)).length;\n scored.score += overlap * 2;\n if (METADATA_WRAPPER_RE.test(scored.text)) scored.score -= 2;\n if (scored.text.length <= 160) scored.score += 1;\n return scored.score > 0 ? scored : null;\n}\n\nfunction sortTimelineEntriesDesc(\n left: EntityMentionIndexEntry[\"timeline\"][number],\n right: EntityMentionIndexEntry[\"timeline\"][number],\n): number {\n const timestampOrder = compareEntityTimestamps(right.timestamp, left.timestamp);\n if (timestampOrder !== 0) {\n return timestampOrder;\n }\n return right.text.localeCompare(left.text);\n}\n\nfunction jaccardSimilarity(a: string, b: string): number {\n const aTokens = new Set(tokenize(a));\n const bTokens = new Set(tokenize(b));\n if (aTokens.size === 0 || bTokens.size === 0) return 0;\n let intersection = 0;\n for (const token of aTokens) {\n if (bTokens.has(token)) intersection += 1;\n }\n const union = new Set([...aTokens, ...bTokens]).size;\n return union === 0 ? 0 : intersection / union;\n}\n\nfunction buildAliasIndex(entries: EntityMentionIndexEntry[]): Map<string, EntityMentionIndexEntry[]> {\n const index = new Map<string, EntityMentionIndexEntry[]>();\n for (const entry of entries) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]).map(normalizeEntityText).filter(Boolean);\n for (const alias of aliases) {\n const existing = index.get(alias) ?? [];\n existing.push(entry);\n index.set(alias, existing);\n }\n }\n return index;\n}\n\nasync function readNativeChunks(\n config: PluginConfig,\n recallNamespaces?: string[],\n): Promise<NativeKnowledgeChunk[]> {\n if (!config.nativeKnowledge?.enabled) return [];\n return collectNativeKnowledgeChunks({\n workspaceDir: config.workspaceDir,\n memoryDir: config.memoryDir,\n config: config.nativeKnowledge,\n recallNamespaces: config.namespacesEnabled ? recallNamespaces : undefined,\n defaultNamespace: config.defaultNamespace,\n }).catch(() => []);\n}\n\nasync function resolveEntityIndexStorages(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n): Promise<StorageManager[]> {\n if (\n !config.namespacesEnabled ||\n !namespaceStorage ||\n !recallNamespaces ||\n recallNamespaces.length === 0\n ) {\n return [storage];\n }\n\n const storages: StorageManager[] = [];\n const seenDirs = new Set<string>();\n for (const namespace of uniqueStrings(recallNamespaces)) {\n try {\n const scopedStorage = await namespaceStorage(namespace);\n const storageDir = path.resolve(scopedStorage.dir);\n if (seenDirs.has(storageDir)) continue;\n seenDirs.add(storageDir);\n storages.push(scopedStorage);\n } catch {\n continue;\n }\n }\n\n return storages.length > 0 ? storages : [storage];\n}\n\nfunction entityIndexStatePath(storage: StorageManager): string {\n return path.join(storage.dir, \"state\", \"entity-mention-index.json\");\n}\n\nasync function readEntityIndexState(storage: StorageManager): Promise<EntityMentionIndex | null> {\n const raw = await readFile(entityIndexStatePath(storage), \"utf-8\").catch(() => \"\");\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<EntityMentionIndex>;\n if (parsed.version !== ENTITY_INDEX_VERSION || !Array.isArray(parsed.entities)) return null;\n return parsed as EntityMentionIndex;\n } catch {\n return null;\n }\n}\n\nasync function writeEntityIndexState(storage: StorageManager, index: EntityMentionIndex): Promise<void> {\n const statePath = entityIndexStatePath(storage);\n await mkdir(path.dirname(statePath), { recursive: true });\n const nextContent = JSON.stringify(index, null, 2) + \"\\n\";\n const currentContent = await readFile(statePath, \"utf-8\").catch(() => \"\");\n if (currentContent === nextContent) return;\n await writeFile(statePath, nextContent, \"utf-8\");\n}\n\nfunction nativePseudoCanonicalId(chunk: NativeKnowledgeChunk): string {\n return `native:${createHash(\"sha256\").update(chunk.sourcePath).digest(\"hex\").slice(0, 12)}`;\n}\n\nfunction createPseudoNativeEntry(chunk: NativeKnowledgeChunk): EntityMentionIndexEntry {\n const canonicalId = nativePseudoCanonicalId(chunk);\n return {\n canonicalId,\n name: chunk.title,\n type: chunk.sourceKind,\n aliases: uniqueStrings(chunk.aliases ?? []),\n facts: [],\n structuredSections: [],\n timelineFacts: [],\n timeline: [],\n relationships: [],\n activity: [],\n factCount: 0,\n memorySnippets: [],\n nativeChunks: [\n {\n chunkId: chunk.chunkId,\n title: chunk.title,\n sourceKind: chunk.sourceKind,\n sourcePath: chunk.sourcePath,\n snippet: compactLine(chunk.content, 180),\n derivedDate: chunk.derivedDate,\n },\n ],\n };\n}\n\nfunction mergeNativeChunk(entry: EntityMentionIndexEntry, chunk: NativeKnowledgeChunk): void {\n const existing = entry.nativeChunks.find((item) => item.chunkId === chunk.chunkId);\n if (existing) return;\n entry.nativeChunks.push({\n chunkId: chunk.chunkId,\n title: chunk.title,\n sourceKind: chunk.sourceKind,\n sourcePath: chunk.sourcePath,\n snippet: compactLine(chunk.content, 180),\n derivedDate: chunk.derivedDate,\n });\n entry.aliases = uniqueStrings([...entry.aliases, ...(chunk.aliases ?? [])]);\n}\n\nasync function buildEntityMentionIndex(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n): Promise<EntityMentionIndex> {\n const storages = await resolveEntityIndexStorages(\n storage,\n config,\n recallNamespaces,\n namespaceStorage,\n );\n const shouldPersistIndex =\n storages.length === 1 && path.resolve(storages[0]!.dir) === path.resolve(storage.dir);\n const [previousIndex, entityFileSets, memorySets, nativeChunks] = await Promise.all([\n shouldPersistIndex ? readEntityIndexState(storage) : Promise.resolve(null),\n Promise.all(storages.map((scopedStorage) => scopedStorage.readAllEntityFiles())),\n Promise.all(storages.map((scopedStorage) => scopedStorage.readAllMemories())),\n readNativeChunks(config, recallNamespaces),\n ]);\n const entityFiles = entityFileSets.flat();\n const memories = memorySets.flat();\n\n const entities = new Map<string, EntityMentionIndexEntry>();\n for (const entity of entityFiles) {\n const canonicalId = normalizeEntityName(entity.name, entity.type);\n const sanitizedFacts = entity.facts.map((fact) => sanitizeEntityFact(fact)).filter(Boolean).map((fact) => compactLine(fact, 180));\n const sanitizedTimelineFacts = entity.timeline\n .map((entry) => sanitizeEntityFact(entry.text))\n .filter(Boolean)\n .map((fact) => compactLine(fact, 180));\n entities.set(canonicalId, {\n canonicalId,\n name: entity.name,\n type: entity.type,\n aliases: uniqueStrings(entity.aliases),\n summary: entity.synthesis?.trim() || entity.summary?.trim() || undefined,\n facts: sanitizedFacts,\n timelineFacts: uniqueStrings(sanitizedTimelineFacts),\n structuredSections: (entity.structuredSections ?? []).map((section) => ({\n key: section.key,\n title: section.title,\n facts: section.facts\n .map((fact) => sanitizeEntityFact(fact))\n .filter(Boolean)\n .map((fact) => compactLine(fact, 180)),\n })).filter((section) => section.facts.length > 0),\n timeline: entity.timeline.map((entry) => ({ ...entry })),\n relationships: entity.relationships.map((relationship) => ({ ...relationship })),\n activity: entity.activity.map((activity) => ({ ...activity })),\n factCount: sanitizedFacts.length,\n memorySnippets: [],\n nativeChunks: [],\n });\n }\n\n for (const memory of memories) {\n const entityRef = typeof memory.frontmatter.entityRef === \"string\" ? memory.frontmatter.entityRef : \"\";\n if (!entityRef) continue;\n const entry = entities.get(entityRef);\n if (!entry) continue;\n const snippet = await readMemorySnippet(memory);\n if (!entry.memorySnippets.includes(snippet)) {\n entry.memorySnippets.push(snippet);\n }\n }\n\n const aliasIndex = buildAliasIndex([...entities.values()]);\n for (const chunk of nativeChunks) {\n const existingPseudo = entities.get(nativePseudoCanonicalId(chunk));\n if (existingPseudo) {\n mergeNativeChunk(existingPseudo, chunk);\n continue;\n }\n const candidateAliases = uniqueStrings([chunk.title, ...(chunk.aliases ?? [])]).map(normalizeEntityText).filter(Boolean);\n let matched = false;\n for (const alias of candidateAliases) {\n for (const entry of aliasIndex.get(alias) ?? []) {\n mergeNativeChunk(entry, chunk);\n matched = true;\n }\n }\n if (matched) continue;\n const pseudoEntry = createPseudoNativeEntry(chunk);\n entities.set(pseudoEntry.canonicalId, pseudoEntry);\n }\n\n const sortedEntities = [...entities.values()].sort((left, right) => left.name.localeCompare(right.name));\n const previousEntities = previousIndex ? JSON.stringify(previousIndex.entities) : \"\";\n const nextEntities = JSON.stringify(sortedEntities);\n const index: EntityMentionIndex = {\n version: ENTITY_INDEX_VERSION,\n updatedAt:\n previousIndex && previousEntities === nextEntities\n ? previousIndex.updatedAt\n : new Date().toISOString(),\n entities: sortedEntities,\n };\n if (shouldPersistIndex) {\n await writeEntityIndexState(storage, index);\n }\n return index;\n}\n\nfunction resolveExplicitCandidates(\n index: EntityMentionIndex,\n query: string,\n): EntityCandidate[] {\n const candidates: EntityCandidate[] = [];\n for (const entry of index.entities) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]);\n let bestAlias = \"\";\n let bestScore = 0;\n for (const alias of aliases) {\n const score = scoreAliasMatch(query, alias);\n if (score > bestScore) {\n bestAlias = alias;\n bestScore = score;\n }\n }\n if (bestScore <= 0) continue;\n candidates.push({ entry, alias: bestAlias, score: bestScore, source: \"query\" });\n }\n return candidates.sort((left, right) => right.score - left.score);\n}\n\nfunction resolveRecentTurnCandidates(\n index: EntityMentionIndex,\n transcriptEntries: TranscriptEntry[],\n recentTurns: number,\n): EntityCandidate[] {\n if (recentTurns <= 0 || transcriptEntries.length === 0) return [];\n const recentEntries = transcriptEntries.slice(-recentTurns);\n const candidates = new Map<string, EntityCandidate>();\n for (let indexOffset = recentEntries.length - 1; indexOffset >= 0; indexOffset -= 1) {\n const turn = recentEntries[indexOffset];\n const recencyBoost = recentEntries.length - indexOffset;\n const roleWeight = turn.role === \"user\" ? 2 : turn.role === \"assistant\" ? -1 : 0;\n for (const entry of index.entities) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]);\n for (const alias of aliases) {\n const score = scoreAliasMatch(turn.content, alias);\n if (score <= 0) continue;\n const current = candidates.get(entry.canonicalId);\n const weightedScore = score + Math.max(0, 6 - recencyBoost) + roleWeight;\n if (!current || weightedScore > current.score) {\n candidates.set(entry.canonicalId, {\n entry,\n alias,\n score: weightedScore,\n source: \"recent_turn\",\n });\n }\n }\n }\n }\n return [...candidates.values()].sort((left, right) => right.score - left.score);\n}\n\nasync function readMemorySnippet(memory: MemoryFile): Promise<string> {\n const content = memory.content.replace(/\\s+/g, \" \").trim();\n return compactLine(content, 180);\n}\n\nasync function buildHintSnippets(\n entry: EntityMentionIndexEntry,\n queryTokens: string[],\n mode: EntityQueryMode,\n maxSupportingFacts: number,\n requestedSectionKeys: Set<string>,\n): Promise<EntityHintSnippet[]> {\n const snippets: EntityHintSnippet[] = [];\n const aliasTokens = new Set(tokenize(uniqueStrings([entry.name, ...entry.aliases]).join(\" \")));\n if (entry.summary) {\n snippets.push({ text: compactLine(entry.summary, 180), score: 10, kind: \"summary\" });\n }\n\n if (requestedSectionKeys.size > 0) {\n for (const section of entry.structuredSections) {\n if (!requestedSectionKeys.has(normalizeEntityText(section.key).replace(/\\s+/g, \"_\"))) continue;\n for (const fact of section.facts) {\n snippets.push({ text: fact, score: mode === \"direct\" ? 8 : 9, kind: \"section\" });\n }\n }\n } else {\n for (const fact of entry.timelineFacts) {\n snippets.push({ text: fact, score: mode === \"direct\" ? 6 : 7, kind: \"fact\" });\n }\n for (const section of entry.structuredSections) {\n for (const fact of section.facts) {\n const normalizedFact = normalizeEntityText(fact);\n const hasNonAliasQueryOverlap = queryTokens.some((token) =>\n !aliasTokens.has(token) && normalizedFact.includes(token)\n );\n if (entry.timelineFacts.length > 0 && !hasNonAliasQueryOverlap) {\n continue;\n }\n snippets.push({ text: fact, score: mode === \"direct\" ? 6 : 7, kind: \"fact\" });\n }\n }\n if (entry.timelineFacts.length === 0 && entry.structuredSections.length === 0) {\n for (const fact of entry.facts) {\n if (!fact.trim()) continue;\n snippets.push({ text: fact, score: mode === \"direct\" ? 6 : 7, kind: \"fact\" });\n }\n }\n }\n\n if (requestedSectionKeys.size === 0) {\n for (const relationship of entry.relationships) {\n snippets.push({\n text: compactLine(relationLine(entry, relationship), 180),\n score: mode === \"direct\" && entry.type.toLowerCase() === \"person\" ? 6 : 4,\n kind: \"relationship\",\n });\n }\n\n for (const activity of entry.activity) {\n snippets.push({\n text: compactLine(`${activity.date}: ${activity.note}`, 180),\n score: 4,\n kind: \"activity\",\n });\n }\n\n for (const memorySnippet of entry.memorySnippets.slice(0, Math.min(maxSupportingFacts, 4))) {\n snippets.push({\n text: memorySnippet,\n score: 5,\n kind: \"memory\",\n });\n }\n\n for (const chunk of entry.nativeChunks) {\n snippets.push({\n text: compactLine(chunk.snippet, 180),\n score: 3,\n kind: \"native\",\n });\n }\n }\n\n const deduped = new Map<string, EntityHintSnippet>();\n for (const snippet of snippets) {\n const scored = scoreHintSnippet(snippet, queryTokens);\n if (!scored) continue;\n const normalized = normalizeEntityText(scored.text);\n const existing = deduped.get(normalized);\n if (!existing || scored.score > existing.score) deduped.set(normalized, scored);\n }\n\n return [...deduped.values()]\n .filter((snippet) => snippet.score > 0)\n .sort((left, right) => right.score - left.score)\n .slice(0, maxSupportingFacts);\n}\n\nfunction summarizeUncertainty(snippets: EntityHintSnippet[]): string | null {\n const direct = snippets.filter((snippet) =>\n snippet.kind === \"summary\"\n || snippet.kind === \"fact\"\n || snippet.kind === \"section\"\n || snippet.kind === \"memory\"\n );\n if (direct.length < 2) return null;\n for (let index = 0; index < direct.length; index += 1) {\n for (let compare = index + 1; compare < direct.length; compare += 1) {\n if (jaccardSimilarity(direct[index].text, direct[compare].text) < 0.2) {\n return \"Evidence is mixed across stored facts; treat the hints below as partial and verify before answering definitively.\";\n }\n }\n }\n return null;\n}\n\nfunction formatEntityHintSection(\n candidates: Array<{\n candidate: EntityCandidate;\n snippets: EntityHintSnippet[];\n uncertainty: string | null;\n }>,\n queryTokens: string[],\n mode: EntityQueryMode,\n maxRelatedEntities: number,\n maxChars: number,\n): string | null {\n if (candidates.length === 0) return null;\n const lines: string[] = [\"## entity_answer_hints\", \"\"];\n for (const { candidate, snippets, uncertainty } of candidates) {\n const hasSummary = Boolean(candidate.entry.summary?.trim());\n const preferredTopSnippets = hasSummary\n ? snippets.filter((snippet) => snippet.kind !== \"fact\")\n : snippets;\n let topSnippets = (\n preferredTopSnippets.length > 0 ? preferredTopSnippets : snippets\n ).slice(0, 3);\n const buildTimelineSnippets = (seedExcludedTexts: Set<string>): EntityHintSnippet[] => {\n const explicitTimelinePool = dedupeHintSnippetsByText(\n (candidate.entry.timeline ?? [])\n .slice()\n .sort(sortTimelineEntriesDesc)\n .map((entry) => sanitizeEntityFact(entry.text))\n .filter(Boolean)\n .map((text) => scoreHintSnippet({\n text: compactLine(text, 180),\n score: 7,\n kind: \"activity\" as const,\n }, queryTokens))\n .filter((snippet): snippet is EntityHintSnippet => snippet !== null)\n .filter((snippet) => !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n const activityTimelinePool = dedupeHintSnippetsByText(\n snippets\n .filter((snippet) => (\n snippet.kind === \"activity\" || snippet.kind === \"memory\"\n ) && !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n return explicitTimelinePool.length > 0\n ? explicitTimelinePool\n : activityTimelinePool.length > 0\n ? activityTimelinePool\n : dedupeHintSnippetsByText(\n snippets\n .filter((snippet) => (\n snippet.kind === \"fact\" || snippet.kind === \"summary\"\n ) && !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n };\n const baseTopSnippetTexts = new Set(topSnippets.map((snippet) => normalizeEntityText(snippet.text)));\n const timelinePool = mode !== \"direct\" ? buildTimelineSnippets(baseTopSnippetTexts) : [];\n if (mode !== \"direct\" && hasSummary && topSnippets.length < 2) {\n if (timelinePool.length > 0) {\n topSnippets = [...topSnippets, timelinePool[0]!].slice(0, 3);\n }\n }\n const topSnippetTexts = new Set(topSnippets.map((snippet) => normalizeEntityText(snippet.text)));\n lines.push(`- target: ${candidate.entry.name} (${candidate.entry.type})`);\n if (candidate.source === \"recent_turn\") {\n lines.push(`- resolution: carried forward from recent turns via alias \"${candidate.alias}\"`);\n } else {\n lines.push(`- resolution: matched alias \"${candidate.alias}\" in the query`);\n }\n if (uncertainty) lines.push(`- uncertainty: ${uncertainty}`);\n if (topSnippets.length > 0) {\n lines.push(\"- likely answer:\");\n for (const snippet of topSnippets) {\n lines.push(` - ${snippet.text}`);\n }\n }\n if (mode !== \"direct\") {\n const fallbackTimeline = timelinePool.filter(\n (snippet) => !topSnippetTexts.has(normalizeEntityText(snippet.text)),\n );\n if (fallbackTimeline.length > 0) {\n lines.push(\"- recent timeline:\");\n for (const snippet of fallbackTimeline) {\n lines.push(` - ${snippet.text}`);\n }\n }\n }\n const related = candidate.entry.relationships.slice(0, maxRelatedEntities).map((relationship) => relationship.target);\n if (related.length > 0) {\n lines.push(`- related entities: ${related.join(\", \")}`);\n }\n lines.push(`- support counts: facts=${candidate.entry.factCount}, memories=${candidate.entry.memorySnippets.length}, native=${candidate.entry.nativeChunks.length}`);\n lines.push(\"\");\n }\n\n let result = lines.join(\"\\n\");\n if (result.length > maxChars) {\n result = `${result.slice(0, Math.max(0, maxChars - 15)).trimEnd()}\\n\\n...(trimmed)\\n`;\n }\n return result.trim().length > 0 ? result.trimEnd() : null;\n}\n\nexport async function buildEntityRecallSection(options: BuildEntityRecallSectionOptions): Promise<string | null> {\n const mode = detectEntityQueryMode(options.query);\n if (!mode) return null;\n\n const index = await buildEntityMentionIndex(\n options.storage,\n options.config,\n options.recallNamespaces,\n options.namespaceStorage,\n );\n if (index.entities.length === 0) return null;\n\n const explicitCandidates = resolveExplicitCandidates(index, options.query);\n const candidates = explicitCandidates.length > 0\n ? explicitCandidates\n : resolveRecentTurnCandidates(index, options.transcriptEntries, options.recentTurns);\n\n if (candidates.length === 0) return null;\n\n const queryTokens = tokenize(options.query);\n const candidateLimit = explicitCandidates.length === 0 && mode === \"follow_up\"\n ? 1\n : options.maxHints;\n const rankedCandidates = candidates.slice(0, candidateLimit);\n const enriched = await Promise.all(\n rankedCandidates.map(async (candidate) => {\n const requestedSectionKeys = new Set(\n resolveRequestedEntitySectionKeys(\n options.query,\n candidate.entry.type,\n candidate.entry.structuredSections,\n options.config.entitySchemas,\n ),\n );\n const snippets = await buildHintSnippets(\n candidate.entry,\n queryTokens,\n mode,\n options.maxSupportingFacts,\n requestedSectionKeys,\n );\n return {\n candidate,\n snippets,\n uncertainty: summarizeUncertainty(snippets),\n };\n }),\n );\n\n const section = formatEntityHintSection(enriched, queryTokens, mode, options.maxRelatedEntities, options.maxChars);\n if (!section) return null;\n return section;\n}\n\nexport async function readRecentEntityTranscriptEntries(\n transcriptEntriesPromise: Promise<TranscriptEntry[]>,\n recentTurns: number,\n): Promise<TranscriptEntry[]> {\n if (recentTurns <= 0) return [];\n const transcriptEntries = await transcriptEntriesPromise.catch(() => []);\n if (transcriptEntries.length === 0) return [];\n return transcriptEntries.slice(-Math.max(1, recentTurns * 2));\n}\n\nexport const entityIndexVersion = ENTITY_INDEX_VERSION;\nexport const entityRecentTranscriptLookbackHours = RECENT_TRANSCRIPT_LOOKBACK_HOURS;\n"],"mappings":"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","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  isRecord,
6
6
  optionalStringArray,
7
7
  validateStringRecord
8
- } from "./chunk-DGXUHMOV.js";
8
+ } from "./chunk-A2IYSXDQ.js";
9
9
  import {
10
10
  listJsonFiles,
11
11
  readJsonFile
@@ -108,4 +108,4 @@ export {
108
108
  recordCueAnchor,
109
109
  getCueAnchorStoreStatus
110
110
  };
111
- //# sourceMappingURL=chunk-C6QPK5GG.js.map
111
+ //# sourceMappingURL=chunk-FZZ2QTJI.js.map