@remnic/core 1.1.30 → 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 (1091) 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 +9 -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 +47 -15
  12. package/dist/access-schema.js +8 -8
  13. package/dist/{access-service-B5hgZPCN.d.ts → access-service-qrrIrC-0.d.ts} +11 -129
  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-QKZGQIPJ.js → chunk-3Q4H3OBR.js} +171 -64
  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-MG7NA5H3.js → chunk-4Q73JBSM.js} +17 -12
  91. package/dist/chunk-4Q73JBSM.js.map +1 -0
  92. package/dist/{chunk-XKLD5OK4.js → chunk-4RR6ROTB.js} +10 -11
  93. package/dist/chunk-4RR6ROTB.js.map +1 -0
  94. package/dist/{chunk-4KGVTPGD.js → chunk-6F6BXB7A.js} +9 -8
  95. package/dist/chunk-6F6BXB7A.js.map +1 -0
  96. package/dist/{chunk-NMZY542O.js → chunk-6URPAY2D.js} +41 -17
  97. package/dist/chunk-6URPAY2D.js.map +1 -0
  98. package/dist/{chunk-N53K2EXC.js → chunk-6VF75M3X.js} +2 -2
  99. package/dist/{chunk-XSZEP4SF.js → chunk-6XSPNR6L.js} +6 -5
  100. package/dist/chunk-6XSPNR6L.js.map +1 -0
  101. package/dist/{chunk-6H2TESSP.js → chunk-765K3SAT.js} +3 -3
  102. package/dist/{chunk-EDTHC6UD.js → chunk-77NAFXUD.js} +2 -2
  103. package/dist/{chunk-S7KDBTWT.js → chunk-7F7Z6MOS.js} +29 -14
  104. package/dist/chunk-7F7Z6MOS.js.map +1 -0
  105. package/dist/{chunk-MZH6EHNR.js → chunk-7H6CFEBJ.js} +41 -14
  106. package/dist/chunk-7H6CFEBJ.js.map +1 -0
  107. package/dist/{chunk-575RMLWN.js → chunk-7MV5CWTE.js} +26 -20
  108. package/dist/chunk-7MV5CWTE.js.map +1 -0
  109. package/dist/{chunk-MGKYQQYF.js → chunk-7Q3RCKAQ.js} +2 -2
  110. package/dist/chunk-7RXCMVFQ.js +27 -0
  111. package/dist/chunk-7RXCMVFQ.js.map +1 -0
  112. package/dist/{chunk-DGXUHMOV.js → chunk-A2IYSXDQ.js} +25 -6
  113. package/dist/chunk-A2IYSXDQ.js.map +1 -0
  114. package/dist/{chunk-EABGC2TL.js → chunk-A2Z6UCWT.js} +26 -4
  115. package/dist/chunk-A2Z6UCWT.js.map +1 -0
  116. package/dist/{chunk-3VAL7ZL2.js → chunk-A52AKD7C.js} +59 -24
  117. package/dist/chunk-A52AKD7C.js.map +1 -0
  118. package/dist/{chunk-5375UYTQ.js → chunk-A6D7A2FW.js} +4 -4
  119. package/dist/chunk-A6D7A2FW.js.map +1 -0
  120. package/dist/{chunk-FAAFWE4G.js → chunk-ALEPI75L.js} +24 -6
  121. package/dist/chunk-ALEPI75L.js.map +1 -0
  122. package/dist/{chunk-3SLRNYNG.js → chunk-AUDJPF4N.js} +15 -4
  123. package/dist/chunk-AUDJPF4N.js.map +1 -0
  124. package/dist/chunk-B5XMS73R.js +145 -0
  125. package/dist/chunk-B5XMS73R.js.map +1 -0
  126. package/dist/{chunk-HXXBL2KD.js → chunk-BECQDWBA.js} +44 -4
  127. package/dist/chunk-BECQDWBA.js.map +1 -0
  128. package/dist/{chunk-7SEAZFFB.js → chunk-BEUDU7Y4.js} +24 -4
  129. package/dist/chunk-BEUDU7Y4.js.map +1 -0
  130. package/dist/{chunk-XVVIG67A.js → chunk-BLZAVUD2.js} +61 -17
  131. package/dist/chunk-BLZAVUD2.js.map +1 -0
  132. package/dist/chunk-CHBI22MI.js +159 -0
  133. package/dist/chunk-CHBI22MI.js.map +1 -0
  134. package/dist/{chunk-GDFS42HT.js → chunk-CHCA44C3.js} +15 -8
  135. package/dist/chunk-CHCA44C3.js.map +1 -0
  136. package/dist/chunk-CINZGPSJ.js +22 -0
  137. package/dist/chunk-CINZGPSJ.js.map +1 -0
  138. package/dist/chunk-CMTINOFS.js +36 -0
  139. package/dist/chunk-CMTINOFS.js.map +1 -0
  140. package/dist/{chunk-34DQE4KF.js → chunk-CO7ZO4TU.js} +2 -2
  141. package/dist/{chunk-PFV5C235.js → chunk-CPPS65WS.js} +2 -1
  142. package/dist/{chunk-PFV5C235.js.map → chunk-CPPS65WS.js.map} +1 -1
  143. package/dist/{chunk-DINWEURR.js → chunk-CSKLPDN6.js} +20 -6
  144. package/dist/chunk-CSKLPDN6.js.map +1 -0
  145. package/dist/chunk-CWWMTTQE.js +566 -0
  146. package/dist/chunk-CWWMTTQE.js.map +1 -0
  147. package/dist/{chunk-IQT3XTKW.js → chunk-D24OXEPB.js} +13 -7
  148. package/dist/chunk-D24OXEPB.js.map +1 -0
  149. package/dist/{chunk-KRBK4BQH.js → chunk-D6WE5MTW.js} +272 -411
  150. package/dist/chunk-D6WE5MTW.js.map +1 -0
  151. package/dist/{chunk-WIICJPET.js → chunk-DEUNUKTD.js} +6 -4
  152. package/dist/{chunk-WIICJPET.js.map → chunk-DEUNUKTD.js.map} +1 -1
  153. package/dist/{chunk-ZYVPLJ4T.js → chunk-DHGSZ3UD.js} +9 -7
  154. package/dist/chunk-DHGSZ3UD.js.map +1 -0
  155. package/dist/{chunk-JR4ZC3G4.js → chunk-DLJ4IR6M.js} +91 -41
  156. package/dist/chunk-DLJ4IR6M.js.map +1 -0
  157. package/dist/{chunk-U4SCL7B7.js → chunk-DRD2Q7HQ.js} +82 -18
  158. package/dist/chunk-DRD2Q7HQ.js.map +1 -0
  159. package/dist/{chunk-2IWUMAES.js → chunk-E62SBGQ3.js} +28 -13
  160. package/dist/chunk-E62SBGQ3.js.map +1 -0
  161. package/dist/{chunk-C5BCH4ZS.js → chunk-EAZGEEG2.js} +21 -3
  162. package/dist/chunk-EAZGEEG2.js.map +1 -0
  163. package/dist/{chunk-TPB3I2AC.js → chunk-ECZU5BJH.js} +31 -10
  164. package/dist/chunk-ECZU5BJH.js.map +1 -0
  165. package/dist/{chunk-77H5NU3M.js → chunk-EDBEWFJO.js} +82 -18
  166. package/dist/chunk-EDBEWFJO.js.map +1 -0
  167. package/dist/chunk-EDQVAMQI.js +308 -0
  168. package/dist/chunk-EDQVAMQI.js.map +1 -0
  169. package/dist/{chunk-RRF5UOBJ.js → chunk-EI6V5UXY.js} +22 -15
  170. package/dist/chunk-EI6V5UXY.js.map +1 -0
  171. package/dist/{chunk-I5GLV3VE.js → chunk-EIPUHVKE.js} +31 -24
  172. package/dist/{chunk-I5GLV3VE.js.map → chunk-EIPUHVKE.js.map} +1 -1
  173. package/dist/{chunk-ZKSK55RC.js → chunk-ETUPBUHB.js} +2 -2
  174. package/dist/{chunk-25MQ7IHJ.js → chunk-EUML3N6B.js} +17 -6
  175. package/dist/chunk-EUML3N6B.js.map +1 -0
  176. package/dist/{chunk-5RGLBDQF.js → chunk-EVZFIAPG.js} +12 -12
  177. package/dist/chunk-EVZFIAPG.js.map +1 -0
  178. package/dist/{chunk-QRNI5JBH.js → chunk-EYIEWJNI.js} +2 -2
  179. package/dist/{chunk-3OWUCDKH.js → chunk-FER4WARO.js} +176 -42
  180. package/dist/chunk-FER4WARO.js.map +1 -0
  181. package/dist/{chunk-43PJZYGL.js → chunk-FPGE5NVO.js} +45 -10
  182. package/dist/chunk-FPGE5NVO.js.map +1 -0
  183. package/dist/{chunk-C6QPK5GG.js → chunk-FZZ2QTJI.js} +2 -2
  184. package/dist/{chunk-D46YSIYX.js → chunk-G3Z3QEF5.js} +19 -11
  185. package/dist/{chunk-D46YSIYX.js.map → chunk-G3Z3QEF5.js.map} +1 -1
  186. package/dist/{chunk-3JXBXXM2.js → chunk-G4IAEX6D.js} +2 -2
  187. package/dist/{chunk-MSWG7JI6.js → chunk-G56P5RLD.js} +8 -2
  188. package/dist/chunk-G56P5RLD.js.map +1 -0
  189. package/dist/{chunk-AGZQD76C.js → chunk-GCGJW34D.js} +48 -2
  190. package/dist/chunk-GCGJW34D.js.map +1 -0
  191. package/dist/chunk-H2NCNXMS.js +159 -0
  192. package/dist/chunk-H2NCNXMS.js.map +1 -0
  193. package/dist/{chunk-XYIK4LF6.js → chunk-H3FZVNRN.js} +8 -2
  194. package/dist/chunk-H3FZVNRN.js.map +1 -0
  195. package/dist/{chunk-TK4UEOSK.js → chunk-HDDRVXX4.js} +8 -8
  196. package/dist/chunk-HDDRVXX4.js.map +1 -0
  197. package/dist/{chunk-LLQ2LLWF.js → chunk-HENLZHIT.js} +15 -5
  198. package/dist/chunk-HENLZHIT.js.map +1 -0
  199. package/dist/{chunk-N2D6GXBM.js → chunk-HINSGUA7.js} +28 -20
  200. package/dist/chunk-HINSGUA7.js.map +1 -0
  201. package/dist/{chunk-APO3DCMU.js → chunk-HLAVGJ62.js} +30 -8
  202. package/dist/chunk-HLAVGJ62.js.map +1 -0
  203. package/dist/{chunk-TPMQ3G6Z.js → chunk-HOJZMQ4J.js} +2 -2
  204. package/dist/chunk-HOJZMQ4J.js.map +1 -0
  205. package/dist/{chunk-LUDTDZLK.js → chunk-HPWVAEET.js} +33 -7
  206. package/dist/chunk-HPWVAEET.js.map +1 -0
  207. package/dist/{chunk-NZL6GGQE.js → chunk-HQ6NIBL6.js} +92 -30
  208. package/dist/chunk-HQ6NIBL6.js.map +1 -0
  209. package/dist/{chunk-UWVJF25J.js → chunk-HWVTS5NO.js} +20 -6
  210. package/dist/chunk-HWVTS5NO.js.map +1 -0
  211. package/dist/{chunk-2WWLHTZY.js → chunk-IC4GELZE.js} +2 -2
  212. package/dist/{chunk-QA2ZAPBU.js → chunk-IPLYGWQF.js} +28 -20
  213. package/dist/chunk-IPLYGWQF.js.map +1 -0
  214. package/dist/{chunk-A6KTB5R6.js → chunk-IQ3OI2RR.js} +3 -3
  215. package/dist/chunk-IQ3OI2RR.js.map +1 -0
  216. package/dist/{chunk-6LVVDPJ4.js → chunk-J64TK33U.js} +3 -4
  217. package/dist/chunk-J64TK33U.js.map +1 -0
  218. package/dist/{chunk-6FC5EGNV.js → chunk-JBPKEARU.js} +15 -5
  219. package/dist/{chunk-6FC5EGNV.js.map → chunk-JBPKEARU.js.map} +1 -1
  220. package/dist/{chunk-RHY3HH7P.js → chunk-JFEKNTX7.js} +125 -33
  221. package/dist/chunk-JFEKNTX7.js.map +1 -0
  222. package/dist/{chunk-TZOLIGIG.js → chunk-JJEJJ7RK.js} +4 -2
  223. package/dist/chunk-JJEJJ7RK.js.map +1 -0
  224. package/dist/{chunk-PCUKNJAZ.js → chunk-JKV57BTN.js} +2 -2
  225. package/dist/{chunk-EJI5XIBB.js → chunk-JLNBQWZ2.js} +55 -7
  226. package/dist/chunk-JLNBQWZ2.js.map +1 -0
  227. package/dist/{chunk-XIG5PDM7.js → chunk-JUC24CTX.js} +8 -12
  228. package/dist/chunk-JUC24CTX.js.map +1 -0
  229. package/dist/{chunk-UL2NNBUL.js → chunk-JYIKKAK3.js} +106 -44
  230. package/dist/chunk-JYIKKAK3.js.map +1 -0
  231. package/dist/{chunk-OIGNEXKZ.js → chunk-K5O2QY6T.js} +5 -1
  232. package/dist/{chunk-OIGNEXKZ.js.map → chunk-K5O2QY6T.js.map} +1 -1
  233. package/dist/{chunk-ZTFCYYEZ.js → chunk-KCYE2MZM.js} +3 -3
  234. package/dist/chunk-KCYE2MZM.js.map +1 -0
  235. package/dist/{chunk-JWPLJLDU.js → chunk-KD3QD3A5.js} +2 -2
  236. package/dist/{chunk-JWPLJLDU.js.map → chunk-KD3QD3A5.js.map} +1 -1
  237. package/dist/{chunk-YRMVARQP.js → chunk-KFY3SGN7.js} +49 -2
  238. package/dist/chunk-KFY3SGN7.js.map +1 -0
  239. package/dist/{chunk-CYFQJMUV.js → chunk-KIB7SDIJ.js} +15 -10
  240. package/dist/chunk-KIB7SDIJ.js.map +1 -0
  241. package/dist/{chunk-3KW65B36.js → chunk-KILOTVIF.js} +95 -48
  242. package/dist/chunk-KILOTVIF.js.map +1 -0
  243. package/dist/{chunk-MXFBBHJU.js → chunk-KJMYHC7K.js} +10 -5
  244. package/dist/chunk-KJMYHC7K.js.map +1 -0
  245. package/dist/{chunk-W3LR522O.js → chunk-KM2A35EO.js} +36 -34
  246. package/dist/chunk-KM2A35EO.js.map +1 -0
  247. package/dist/{chunk-WELDCG6C.js → chunk-L227SKTB.js} +109 -36
  248. package/dist/chunk-L227SKTB.js.map +1 -0
  249. package/dist/{chunk-W6AQJ2PY.js → chunk-L7S47WZT.js} +35 -16
  250. package/dist/chunk-L7S47WZT.js.map +1 -0
  251. package/dist/{chunk-BVF3AGJP.js → chunk-LJBOVCQG.js} +26 -11
  252. package/dist/chunk-LJBOVCQG.js.map +1 -0
  253. package/dist/{chunk-2KI4QFHU.js → chunk-LMDRGRJ2.js} +2 -2
  254. package/dist/{chunk-MY6TPVXW.js → chunk-LMPHTYJC.js} +2 -2
  255. package/dist/{chunk-EHRTFRWW.js → chunk-LQHDIS7L.js} +10 -5
  256. package/dist/chunk-LQHDIS7L.js.map +1 -0
  257. package/dist/chunk-LUDUFZTV.js +170 -0
  258. package/dist/chunk-LUDUFZTV.js.map +1 -0
  259. package/dist/{chunk-5HRY2WRF.js → chunk-LZ3VEOU5.js} +2 -2
  260. package/dist/{chunk-Q7P4WJDP.js → chunk-M5T4Q2ZU.js} +1 -1
  261. package/dist/chunk-M5T4Q2ZU.js.map +1 -0
  262. package/dist/{chunk-ICRIXAP2.js → chunk-MC4FJXPA.js} +16 -6
  263. package/dist/chunk-MC4FJXPA.js.map +1 -0
  264. package/dist/{chunk-WPGJYVUH.js → chunk-MGVIEM2O.js} +23 -6
  265. package/dist/chunk-MGVIEM2O.js.map +1 -0
  266. package/dist/{chunk-OC7KHOOX.js → chunk-O27WNHTT.js} +22 -6
  267. package/dist/chunk-O27WNHTT.js.map +1 -0
  268. package/dist/{chunk-NGAVDO7E.js → chunk-OADWQ5CR.js} +2 -2
  269. package/dist/{chunk-2NMMFZ5T.js → chunk-OD4FM2U7.js} +6 -3
  270. package/dist/chunk-OD4FM2U7.js.map +1 -0
  271. package/dist/{chunk-OZHRDTDX.js → chunk-OKTXM5H4.js} +11 -1
  272. package/dist/chunk-OKTXM5H4.js.map +1 -0
  273. package/dist/{chunk-RXDLTSWT.js → chunk-ONPLNAPX.js} +16 -7
  274. package/dist/chunk-ONPLNAPX.js.map +1 -0
  275. package/dist/{chunk-FJ43PRLT.js → chunk-ORFGK3XI.js} +20 -14
  276. package/dist/chunk-ORFGK3XI.js.map +1 -0
  277. package/dist/{chunk-DOM4GKSW.js → chunk-OZKVVUJB.js} +3 -3
  278. package/dist/{chunk-MT4HVDUZ.js → chunk-PM3QHTFT.js} +3 -3
  279. package/dist/{chunk-4DWOBS2A.js → chunk-PRQJ5ESM.js} +27 -2
  280. package/dist/{chunk-4DWOBS2A.js.map → chunk-PRQJ5ESM.js.map} +1 -1
  281. package/dist/chunk-PU44GBL4.js +52 -0
  282. package/dist/chunk-PU44GBL4.js.map +1 -0
  283. package/dist/{chunk-MJFNCJXV.js → chunk-Q4CAQGKQ.js} +47 -9
  284. package/dist/chunk-Q4CAQGKQ.js.map +1 -0
  285. package/dist/{chunk-U3WSW6PZ.js → chunk-QMYXNM4P.js} +90 -35
  286. package/dist/chunk-QMYXNM4P.js.map +1 -0
  287. package/dist/{chunk-NBNN5GOB.js → chunk-QY7YA7OL.js} +11 -2
  288. package/dist/chunk-QY7YA7OL.js.map +1 -0
  289. package/dist/{chunk-QLLBRHAT.js → chunk-R26QUUQN.js} +181 -257
  290. package/dist/chunk-R26QUUQN.js.map +1 -0
  291. package/dist/{chunk-ZK7I7JYV.js → chunk-R3PS27B4.js} +7 -7
  292. package/dist/{chunk-TMQLARTH.js → chunk-RCTS5CKK.js} +33 -14
  293. package/dist/chunk-RCTS5CKK.js.map +1 -0
  294. package/dist/{chunk-2PRLKQAH.js → chunk-RLV3PQGH.js} +35 -19
  295. package/dist/chunk-RLV3PQGH.js.map +1 -0
  296. package/dist/{chunk-WW3QQF4H.js → chunk-ROZJACKP.js} +16 -1
  297. package/dist/chunk-ROZJACKP.js.map +1 -0
  298. package/dist/{chunk-7MNMYOFP.js → chunk-RSUYKGGZ.js} +3 -4
  299. package/dist/chunk-RSUYKGGZ.js.map +1 -0
  300. package/dist/{chunk-LT3NLYSI.js → chunk-RUZOJKNF.js} +10 -7
  301. package/dist/chunk-RUZOJKNF.js.map +1 -0
  302. package/dist/{chunk-326G7DJK.js → chunk-RW5DGAGO.js} +67 -13
  303. package/dist/chunk-RW5DGAGO.js.map +1 -0
  304. package/dist/{chunk-KOSORCJG.js → chunk-S53PKKWK.js} +63 -24
  305. package/dist/chunk-S53PKKWK.js.map +1 -0
  306. package/dist/{chunk-65PG43EQ.js → chunk-S7WU3Y3D.js} +21 -4
  307. package/dist/chunk-S7WU3Y3D.js.map +1 -0
  308. package/dist/{chunk-SKE7JYKA.js → chunk-SFXKHM7P.js} +2 -2
  309. package/dist/{chunk-HMDCOMYU.js → chunk-SKGV326D.js} +3 -3
  310. package/dist/chunk-T2PO5MUF.js +62 -0
  311. package/dist/chunk-T2PO5MUF.js.map +1 -0
  312. package/dist/{chunk-C7VW7C3F.js → chunk-TDKQGLJW.js} +3 -3
  313. package/dist/chunk-TDKQGLJW.js.map +1 -0
  314. package/dist/{chunk-3QKK7QOS.js → chunk-TERNBNJB.js} +3 -3
  315. package/dist/chunk-TERNBNJB.js.map +1 -0
  316. package/dist/{chunk-MXC3AP5I.js → chunk-TGQ2NTWH.js} +12 -7
  317. package/dist/chunk-TGQ2NTWH.js.map +1 -0
  318. package/dist/{chunk-3Y4P7RXM.js → chunk-TMSXWOBZ.js} +3 -4
  319. package/dist/chunk-TMSXWOBZ.js.map +1 -0
  320. package/dist/{chunk-3TNBOMQT.js → chunk-TVRN5QKH.js} +11 -11
  321. package/dist/{chunk-3TNBOMQT.js.map → chunk-TVRN5QKH.js.map} +1 -1
  322. package/dist/{chunk-5UM2VJ6D.js → chunk-UEY3VB6W.js} +2 -2
  323. package/dist/{chunk-I6K5FBRQ.js → chunk-UI3NYK34.js} +4 -1
  324. package/dist/{chunk-I6K5FBRQ.js.map → chunk-UI3NYK34.js.map} +1 -1
  325. package/dist/{chunk-VBJ7V5SK.js → chunk-UIPDNLXA.js} +21 -8
  326. package/dist/chunk-UIPDNLXA.js.map +1 -0
  327. package/dist/{chunk-GIF42EW3.js → chunk-UP6MOYCB.js} +3 -3
  328. package/dist/{chunk-K4FLSOR5.js → chunk-USYGGIJZ.js} +44 -15
  329. package/dist/chunk-USYGGIJZ.js.map +1 -0
  330. package/dist/{chunk-FIT6DMX6.js → chunk-UWY7GIVS.js} +152 -54
  331. package/dist/chunk-UWY7GIVS.js.map +1 -0
  332. package/dist/{chunk-MRILGULB.js → chunk-V2RCP53Q.js} +2 -2
  333. package/dist/{chunk-XKECPATV.js → chunk-VFUEZZBS.js} +113 -4
  334. package/dist/chunk-VFUEZZBS.js.map +1 -0
  335. package/dist/{chunk-FSFEQI74.js → chunk-W7L6HXUC.js} +2 -2
  336. package/dist/{chunk-3IQ2TR4N.js → chunk-WLEB7WCG.js} +2 -2
  337. package/dist/{chunk-GL6I6MEQ.js → chunk-WSGF57U2.js} +3 -3
  338. package/dist/{chunk-KNKUID7G.js → chunk-X7Y7WX73.js} +72 -6
  339. package/dist/chunk-X7Y7WX73.js.map +1 -0
  340. package/dist/{chunk-5NPGSAVB.js → chunk-XEKAG3FM.js} +23 -5
  341. package/dist/chunk-XEKAG3FM.js.map +1 -0
  342. package/dist/{chunk-3APJ5EVB.js → chunk-XKIQZXUB.js} +41 -26
  343. package/dist/chunk-XKIQZXUB.js.map +1 -0
  344. package/dist/chunk-XKXKSQU7.js +92 -0
  345. package/dist/chunk-XKXKSQU7.js.map +1 -0
  346. package/dist/{chunk-JA3AK3PT.js → chunk-XNLXAWHX.js} +4 -4
  347. package/dist/{chunk-CULXMQJH.js → chunk-XPXEJRUB.js} +3 -3
  348. package/dist/chunk-XPXEJRUB.js.map +1 -0
  349. package/dist/{chunk-PZIAX57I.js → chunk-XR6DNK4U.js} +7 -4
  350. package/dist/chunk-XR6DNK4U.js.map +1 -0
  351. package/dist/{chunk-47VWKCAF.js → chunk-XSQ4SGM5.js} +33 -4
  352. package/dist/chunk-XSQ4SGM5.js.map +1 -0
  353. package/dist/{chunk-66DHUKLO.js → chunk-XSWKORGM.js} +16 -14
  354. package/dist/chunk-XSWKORGM.js.map +1 -0
  355. package/dist/{chunk-QR3C7BKQ.js → chunk-XZ4WBBB5.js} +7 -8
  356. package/dist/chunk-XZ4WBBB5.js.map +1 -0
  357. package/dist/{chunk-WNARATI3.js → chunk-Y2SXZ5KZ.js} +59 -11
  358. package/dist/chunk-Y2SXZ5KZ.js.map +1 -0
  359. package/dist/{chunk-SIC6U3GZ.js → chunk-YHV3KRKS.js} +3 -3
  360. package/dist/{chunk-ZPKBYX2F.js → chunk-YNDLCWXS.js} +85 -9
  361. package/dist/chunk-YNDLCWXS.js.map +1 -0
  362. package/dist/{chunk-VLXA6PI2.js → chunk-YQMZ7IH2.js} +4 -4
  363. package/dist/{chunk-TMM4S4IJ.js → chunk-YR6GIWWY.js} +58 -8
  364. package/dist/chunk-YR6GIWWY.js.map +1 -0
  365. package/dist/{chunk-DK5LDEQM.js → chunk-YR7XMOWK.js} +39 -23
  366. package/dist/chunk-YR7XMOWK.js.map +1 -0
  367. package/dist/chunk-ZFXCQPNO.js +27 -0
  368. package/dist/chunk-ZFXCQPNO.js.map +1 -0
  369. package/dist/citations.js +1 -1
  370. package/dist/{cli-CJKI2JIe.d.ts → cli-X4NJoqSe.d.ts} +8 -31
  371. package/dist/cli.d.ts +10 -6
  372. package/dist/cli.js +122 -117
  373. package/dist/commitment-ledger.js +2 -2
  374. package/dist/compat/checks.js +1 -2
  375. package/dist/compounding/engine.d.ts +3 -2
  376. package/dist/compounding/engine.js +11 -11
  377. package/dist/compounding/preference-consolidator.d.ts +1 -0
  378. package/dist/compounding/preference-consolidator.js +8 -8
  379. package/dist/compounding/preference-consolidator.js.map +1 -1
  380. package/dist/compression-optimizer.d.ts +1 -0
  381. package/dist/compression-optimizer.js +1 -1
  382. package/dist/config.d.ts +1 -0
  383. package/dist/config.js +3 -2
  384. package/dist/connectors/codex-materialize-runner.d.ts +1 -0
  385. package/dist/connectors/codex-materialize-runner.js +12 -11
  386. package/dist/connectors/codex-materialize.d.ts +1 -0
  387. package/dist/connectors/codex-materialize.js +3 -2
  388. package/dist/connectors/index.d.ts +1 -0
  389. package/dist/connectors/index.js +14 -14
  390. package/dist/{connectors-cli-CwbyjGR7.d.ts → connectors-cli-DbTPNj2H.d.ts} +7 -1
  391. package/dist/connectors-cli.d.ts +1 -1
  392. package/dist/connectors-cli.js +3 -1
  393. package/dist/consolidation-provenance-check.d.ts +1 -0
  394. package/dist/consolidation-provenance-check.js +2 -2
  395. package/dist/consolidation-undo.d.ts +1 -0
  396. package/dist/consolidation-undo.js +1 -1
  397. package/dist/contradiction/index.d.ts +3 -1
  398. package/dist/contradiction/index.js +3 -3
  399. package/dist/{contradiction-review-ATP4S6IC.js → contradiction-review-6V2LXXK6.js} +2 -2
  400. package/dist/{contradiction-scan-5A4IDZV5.js → contradiction-scan-GIRVC4C7.js} +3 -3
  401. package/dist/conversation-index/backend.d.ts +3 -1
  402. package/dist/conversation-index/backend.js +3 -3
  403. package/dist/conversation-index/chunker.d.ts +1 -0
  404. package/dist/conversation-index/cleanup.js +1 -1
  405. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  406. package/dist/conversation-index/faiss-adapter.js +1 -1
  407. package/dist/conversation-index/indexer.d.ts +5 -2
  408. package/dist/conversation-index/indexer.js +1 -1
  409. package/dist/conversation-index/search.d.ts +2 -1
  410. package/dist/cross-namespace-budget.js +1 -1
  411. package/dist/cue-anchors.js +2 -2
  412. package/dist/dashboard-runtime.d.ts +6 -0
  413. package/dist/dashboard-runtime.js +3 -3
  414. package/dist/day-summary.d.ts +1 -0
  415. package/dist/day-summary.js +2 -2
  416. package/dist/delinearize.d.ts +1 -0
  417. package/dist/direct-answer-wiring.d.ts +1 -0
  418. package/dist/direct-answer.d.ts +1 -0
  419. package/dist/{dreams-ledger-LR2NBAZE.js → dreams-ledger-3WSCI5V4.js} +5 -4
  420. package/dist/{dreams-ledger-LR2NBAZE.js.map → dreams-ledger-3WSCI5V4.js.map} +1 -1
  421. package/dist/embedding-fallback.d.ts +3 -0
  422. package/dist/embedding-fallback.js +2 -2
  423. package/dist/enrichment/index.d.ts +1 -0
  424. package/dist/enrichment/index.js +1 -1
  425. package/dist/entity-retrieval.d.ts +2 -0
  426. package/dist/entity-retrieval.js +9 -9
  427. package/dist/entity-schema.d.ts +1 -0
  428. package/dist/evals.js +1 -1
  429. package/dist/explicit-capture.d.ts +5 -3
  430. package/dist/explicit-capture.js +2 -2
  431. package/dist/extraction-judge-telemetry.d.ts +2 -0
  432. package/dist/extraction-judge-training.d.ts +2 -0
  433. package/dist/extraction-judge.d.ts +2 -0
  434. package/dist/extraction.d.ts +2 -0
  435. package/dist/extraction.js +12 -12
  436. package/dist/{faiss-adapter-CzPghc4C.d.ts → faiss-adapter-BHecI1fF.d.ts} +4 -1
  437. package/dist/fallback-llm.d.ts +11 -1
  438. package/dist/fallback-llm.js +8 -6
  439. package/dist/{first-start-migration-4MHQEOSD.js → first-start-migration-CKTCTCQI.js} +5 -5
  440. package/dist/graph-dashboard-diff.d.ts +4 -0
  441. package/dist/graph-dashboard-diff.js +1 -1
  442. package/dist/graph-dashboard-parser.js +1 -1
  443. package/dist/{graph-edge-decay-5DI5GUNL.js → graph-edge-decay-MUP5J7CC.js} +6 -6
  444. package/dist/graph-events.js +1 -1
  445. package/dist/graph-snapshot.js +3 -3
  446. package/dist/graph.js +2 -2
  447. package/dist/harmonic-retrieval.js +4 -4
  448. package/dist/identity-continuity.d.ts +1 -0
  449. package/dist/importance.d.ts +1 -0
  450. package/dist/importers/index.d.ts +244 -0
  451. package/dist/importers/index.js +20 -0
  452. package/dist/index.d.ts +21 -351
  453. package/dist/index.js +886 -561
  454. package/dist/index.js.map +1 -1
  455. package/dist/intent.d.ts +1 -0
  456. package/dist/lcm/archive.d.ts +2 -2
  457. package/dist/lcm/archive.js +2 -2
  458. package/dist/lcm/engine.d.ts +3 -2
  459. package/dist/lcm/engine.js +6 -6
  460. package/dist/lcm/index.d.ts +1 -0
  461. package/dist/lcm/index.js +8 -8
  462. package/dist/lcm/recall.js +1 -1
  463. package/dist/lcm/summarizer.js +3 -3
  464. package/dist/lcm/tools.d.ts +1 -0
  465. package/dist/lifecycle.d.ts +1 -0
  466. package/dist/live-connectors-runner.d.ts +1 -0
  467. package/dist/live-connectors-runner.js +6 -6
  468. package/dist/local-llm.d.ts +1 -0
  469. package/dist/local-llm.js +2 -2
  470. package/dist/maintenance/archive-observations.js +1 -1
  471. package/dist/maintenance/memory-governance.d.ts +3 -1
  472. package/dist/maintenance/memory-governance.js +10 -8
  473. package/dist/maintenance/migrate-observations.js +3 -2
  474. package/dist/maintenance/observation-ledger-utils.d.ts +3 -0
  475. package/dist/maintenance/observation-ledger-utils.js +2 -1
  476. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -1
  477. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -8
  478. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -1
  479. package/dist/maintenance/rebuild-memory-projection.js +13 -10
  480. package/dist/maintenance/rebuild-observations.d.ts +1 -0
  481. package/dist/maintenance/rebuild-observations.js +3 -2
  482. package/dist/mcp-memory-inspector-app.d.ts +7 -4
  483. package/dist/mcp-memory-inspector-app.js +1 -1
  484. package/dist/memory-action-policy.d.ts +1 -0
  485. package/dist/memory-cache.d.ts +1 -0
  486. package/dist/memory-cache.js +1 -1
  487. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -0
  488. package/dist/memory-projection-store.d.ts +1 -0
  489. package/dist/memory-projection-store.js +1 -1
  490. package/dist/memory-provenance.d.ts +1 -0
  491. package/dist/memory-worth-outcomes.d.ts +1 -0
  492. package/dist/migrate/from-engram.js +2 -2
  493. package/dist/{migrate-from-identity-anchor-G27MCD6A.js → migrate-from-identity-anchor-EB4XI4Q2.js} +2 -2
  494. package/dist/model-registry.js +1 -1
  495. package/dist/models-json.d.ts +1 -0
  496. package/dist/namespaces/migrate.d.ts +3 -0
  497. package/dist/namespaces/migrate.js +24 -22
  498. package/dist/namespaces/principal.d.ts +1 -0
  499. package/dist/namespaces/principal.js +2 -1
  500. package/dist/namespaces/search.d.ts +1 -0
  501. package/dist/namespaces/search.js +15 -13
  502. package/dist/namespaces/storage.d.ts +4 -2
  503. package/dist/namespaces/storage.js +10 -9
  504. package/dist/native-knowledge.d.ts +1 -0
  505. package/dist/native-knowledge.js +1 -1
  506. package/dist/negative.js +1 -1
  507. package/dist/network/webdav.d.ts +16 -1
  508. package/dist/network/webdav.js +5 -3
  509. package/dist/objective-state-writers.js +4 -4
  510. package/dist/objective-state.js +2 -2
  511. package/dist/offline-sync.d.ts +8 -1
  512. package/dist/offline-sync.js +6 -4
  513. package/dist/operator-toolkit.d.ts +1 -0
  514. package/dist/operator-toolkit.js +35 -32
  515. package/dist/opik-exporter.js +1 -1
  516. package/dist/{orchestrator-DuWl9Hwx.d.ts → orchestrator-Co9nxRLF.d.ts} +4 -74
  517. package/dist/orchestrator.d.ts +5 -3
  518. package/dist/orchestrator.js +99 -96
  519. package/dist/page-versioning.js +1 -1
  520. package/dist/path-X2K5XCHL.js +9 -0
  521. package/dist/patterns-cli.d.ts +1 -0
  522. package/dist/peers/index.d.ts +328 -0
  523. package/dist/{peers-HCVGHMAE.js → peers/index.js} +4 -4
  524. package/dist/pipeline-D18UAKlN.d.ts +32 -0
  525. package/dist/plugin-entry-resolver.d.ts +9 -0
  526. package/dist/plugin-entry-resolver.js +8 -0
  527. package/dist/plugin-entry-resolver.js.map +1 -0
  528. package/dist/plugin-id.d.ts +2 -21
  529. package/dist/plugin-id.js +33 -4
  530. package/dist/plugin-id.js.map +1 -1
  531. package/dist/policy-runtime.d.ts +4 -0
  532. package/dist/policy-runtime.js +1 -1
  533. package/dist/profiling.js +1 -1
  534. package/dist/qmd-recall-cache.d.ts +1 -0
  535. package/dist/qmd.d.ts +1 -0
  536. package/dist/qmd.js +3 -3
  537. package/dist/recall-disclosure-escalation.d.ts +1 -0
  538. package/dist/recall-explain-renderer.d.ts +1 -0
  539. package/dist/recall-explain-renderer.js +3 -3
  540. package/dist/recall-state.d.ts +8 -1
  541. package/dist/recall-state.js +2 -1
  542. package/dist/recall-tag-filter.d.ts +1 -0
  543. package/dist/recall-xray-cli.d.ts +1 -0
  544. package/dist/recall-xray-cli.js +4 -4
  545. package/dist/recall-xray-renderer.d.ts +1 -0
  546. package/dist/recall-xray-renderer.js +3 -3
  547. package/dist/recall-xray.d.ts +1 -0
  548. package/dist/recall-xray.js +2 -2
  549. package/dist/relevance.d.ts +7 -1
  550. package/dist/relevance.js +2 -1
  551. package/dist/replay/normalizers/chatgpt.js +2 -2
  552. package/dist/replay/normalizers/claude.js +2 -2
  553. package/dist/replay/normalizers/openclaw.js +2 -2
  554. package/dist/replay/normalizers/shared.js +1 -1
  555. package/dist/replay/runner.js +1 -1
  556. package/dist/rerank.js +1 -1
  557. package/dist/{resolution-B7FNQSSP.js → resolution-ZY7VM6WS.js} +3 -3
  558. package/dist/resolution-ZY7VM6WS.js.map +1 -0
  559. package/dist/resolve-auth-token.d.ts +1 -0
  560. package/dist/resolve-auth-token.js +1 -1
  561. package/dist/resolve-provider-secret.d.ts +19 -29
  562. package/dist/resolve-provider-secret.js +2 -6
  563. package/dist/resume-bundles.js +10 -9
  564. package/dist/retrieval-agents.d.ts +2 -1
  565. package/dist/retrieval-agents.js +2 -1
  566. package/dist/retrieval-tiers.d.ts +1 -0
  567. package/dist/routing/engine.d.ts +1 -0
  568. package/dist/routing/store.d.ts +3 -0
  569. package/dist/routing/store.js +1 -1
  570. package/dist/runtime/env.js +1 -1
  571. package/dist/schemas.d.ts +213 -39
  572. package/dist/schemas.js +1 -1
  573. package/dist/sdk-compat.js +1 -1
  574. package/dist/search/document-scanner.js +1 -1
  575. package/dist/search/embed-helper.d.ts +7 -2
  576. package/dist/search/embed-helper.js +3 -1
  577. package/dist/search/factory.d.ts +2 -1
  578. package/dist/search/factory.js +13 -12
  579. package/dist/search/index.d.ts +2 -1
  580. package/dist/search/index.js +19 -18
  581. package/dist/search/lancedb-backend.d.ts +7 -6
  582. package/dist/search/lancedb-backend.js +4 -2
  583. package/dist/search/meilisearch-backend.d.ts +7 -6
  584. package/dist/search/meilisearch-backend.js +4 -2
  585. package/dist/search/noop-backend.d.ts +1 -0
  586. package/dist/search/orama-backend.d.ts +9 -7
  587. package/dist/search/orama-backend.js +8 -4
  588. package/dist/search/port.d.ts +1 -0
  589. package/dist/search/remote-backend.d.ts +1 -0
  590. package/dist/secure-store/index.d.ts +16 -3
  591. package/dist/secure-store/index.js +2 -2
  592. package/dist/{semantic-VwGI14Ok.d.ts → semantic-SLAa_prH.d.ts} +5 -3
  593. package/dist/semantic-consolidation.d.ts +1 -0
  594. package/dist/semantic-consolidation.js +14 -13
  595. package/dist/semantic-rule-promotion.js +8 -8
  596. package/dist/semantic-rule-verifier.d.ts +1 -0
  597. package/dist/semantic-rule-verifier.js +8 -8
  598. package/dist/session-integrity.d.ts +1 -0
  599. package/dist/session-integrity.js +1 -1
  600. package/dist/session-observer-bands.d.ts +1 -0
  601. package/dist/session-observer-state.d.ts +6 -1
  602. package/dist/session-observer-state.js +1 -1
  603. package/dist/shared-context/manager.d.ts +5 -0
  604. package/dist/shared-context/manager.js +3 -3
  605. package/dist/signal.d.ts +1 -0
  606. package/dist/signal.js +1 -1
  607. package/dist/source-attribution.js +1 -1
  608. package/dist/state-store-4QZISH3J.js +30 -0
  609. package/dist/state-store-4QZISH3J.js.map +1 -0
  610. package/dist/storage-C4DX8CuG.d.ts +157 -0
  611. package/dist/storage.d.ts +2 -0
  612. package/dist/storage.js +7 -7
  613. package/dist/store-contract.js +1 -1
  614. package/dist/summarizer.d.ts +1 -0
  615. package/dist/summarizer.js +7 -7
  616. package/dist/summary-snapshot.d.ts +1 -0
  617. package/dist/surfaces/dreams.js +48 -17
  618. package/dist/surfaces/dreams.js.map +1 -1
  619. package/dist/temporal-supersession.d.ts +1 -0
  620. package/dist/temporal-supersession.js +1 -1
  621. package/dist/temporal-validity.d.ts +1 -0
  622. package/dist/threading.d.ts +1 -0
  623. package/dist/tier-migration.d.ts +1 -0
  624. package/dist/tier-routing.d.ts +1 -0
  625. package/dist/{tier-stats-62ZVDFKS.js → tier-stats-SKML2OSF.js} +5 -5
  626. package/dist/tmt.js +1 -1
  627. package/dist/tokens.js +2 -2
  628. package/dist/topics.d.ts +1 -0
  629. package/dist/{trace-C5ETWBEF.js → trace-WM7V4CKI.js} +31 -1
  630. package/dist/trace-WM7V4CKI.js.map +1 -0
  631. package/dist/transcript.d.ts +1 -0
  632. package/dist/transcript.js +2 -2
  633. package/dist/transfer/autodetect.js +7 -7
  634. package/dist/transfer/backup.js +5 -5
  635. package/dist/transfer/capsule-export.js +5 -5
  636. package/dist/transfer/capsule-import.d.ts +6 -0
  637. package/dist/transfer/capsule-import.js +4 -4
  638. package/dist/transfer/export-json.js +3 -3
  639. package/dist/transfer/export-md.js +3 -3
  640. package/dist/transfer/export-sqlite.js +3 -3
  641. package/dist/transfer/fs-utils.d.ts +2 -1
  642. package/dist/transfer/fs-utils.js +5 -3
  643. package/dist/transfer/import-json.js +3 -3
  644. package/dist/transfer/import-md.js +3 -3
  645. package/dist/transfer/import-sqlite.js +3 -3
  646. package/dist/transfer/types.d.ts +12 -12
  647. package/dist/trust-zones.js +2 -2
  648. package/dist/types-B1VHaf2w.d.ts +126 -0
  649. package/dist/types-BliCnURB.d.ts +83 -0
  650. package/dist/types.d.ts +35 -0
  651. package/dist/types.js +1 -1
  652. package/dist/utility-learner.js +3 -3
  653. package/dist/utility-runtime.d.ts +1 -0
  654. package/dist/utility-runtime.js +4 -4
  655. package/dist/utility-telemetry.js +2 -2
  656. package/dist/verified-recall.js +9 -9
  657. package/dist/work/board.js +2 -2
  658. package/dist/work/boundary.js +1 -1
  659. package/dist/work/storage.d.ts +5 -0
  660. package/dist/work/storage.js +1 -1
  661. package/dist/work-product-ledger.js +2 -2
  662. package/package.json +74 -3
  663. package/scripts/ensure-better-sqlite3.mjs +8 -7
  664. package/scripts/faiss_index.py +141 -29
  665. package/src/access-cli.test.ts +87 -2
  666. package/src/access-cli.ts +59 -5
  667. package/src/access-http.test.ts +321 -0
  668. package/src/access-http.ts +201 -35
  669. package/src/access-idempotency.ts +136 -3
  670. package/src/access-mcp.test.ts +155 -0
  671. package/src/access-mcp.ts +116 -30
  672. package/src/access-schema.ts +22 -4
  673. package/src/access-service-project-tag.test.ts +37 -0
  674. package/src/access-service.ts +42 -10
  675. package/src/active-recall.test.ts +29 -1
  676. package/src/active-recall.ts +11 -7
  677. package/src/adapters/claude-code.ts +7 -8
  678. package/src/adapters/codex.ts +6 -7
  679. package/src/adapters/hermes.ts +1 -5
  680. package/src/adapters/registry.test.ts +63 -0
  681. package/src/adapters/registry.ts +10 -0
  682. package/src/adapters/replit.ts +5 -7
  683. package/src/adapters/types.ts +24 -1
  684. package/src/behavior-signals.ts +1 -1
  685. package/src/binary-lifecycle/backend.ts +16 -4
  686. package/src/binary-lifecycle/pipeline.test.ts +149 -0
  687. package/src/binary-lifecycle/pipeline.ts +49 -7
  688. package/src/binary-lifecycle/scanner.ts +19 -4
  689. package/src/boxes.ts +119 -32
  690. package/src/buffer-session.test.ts +28 -0
  691. package/src/buffer.ts +10 -14
  692. package/src/bulk-import/types.ts +10 -0
  693. package/src/calibration.test.ts +99 -0
  694. package/src/calibration.ts +57 -13
  695. package/src/causal-consolidation.test.ts +214 -0
  696. package/src/causal-consolidation.ts +131 -14
  697. package/src/causal-retrieval.ts +16 -3
  698. package/src/citations.test.ts +75 -0
  699. package/src/citations.ts +19 -6
  700. package/src/cli.ts +134 -109
  701. package/src/coding/coding-namespace.test.ts +7 -0
  702. package/src/coding/coding-namespace.ts +8 -0
  703. package/src/coding/review-context.test.ts +30 -0
  704. package/src/coding/review-context.ts +79 -9
  705. package/src/coding/wire-coding-context.test.ts +16 -0
  706. package/src/compat/checks.test.ts +33 -0
  707. package/src/compat/checks.ts +64 -4
  708. package/src/compounding/engine.ts +2 -2
  709. package/src/compounding/preference-consolidator.test.ts +47 -0
  710. package/src/compounding/preference-consolidator.ts +8 -8
  711. package/src/compression-optimizer.ts +5 -2
  712. package/src/config.test.ts +34 -2
  713. package/src/config.ts +62 -18
  714. package/src/connectors/codex-materialize-runner.ts +4 -3
  715. package/src/connectors/codex-materialize.ts +149 -34
  716. package/src/connectors/index.test.ts +144 -7
  717. package/src/connectors/index.ts +86 -15
  718. package/src/connectors/live/github.test.ts +47 -0
  719. package/src/connectors/live/github.ts +29 -1
  720. package/src/connectors/live/index.ts +2 -0
  721. package/src/connectors/live/live-connectors.test.ts +359 -73
  722. package/src/connectors/live/notion.test.ts +84 -0
  723. package/src/connectors/live/notion.ts +18 -1
  724. package/src/connectors/live/state-store.ts +419 -38
  725. package/src/connectors/weclone-installer.test.ts +16 -18
  726. package/src/connectors-cli.ts +19 -0
  727. package/src/console/trace.test.ts +28 -0
  728. package/src/console/trace.ts +42 -5
  729. package/src/contradiction/contradiction-judge.test.ts +49 -0
  730. package/src/contradiction/contradiction-judge.ts +15 -5
  731. package/src/contradiction/contradiction-review.ts +31 -7
  732. package/src/contradiction/contradiction-scan.ts +28 -18
  733. package/src/contradiction/contradiction.test.ts +237 -1
  734. package/src/contradiction/resolution.ts +43 -4
  735. package/src/conversation-index/backend.ts +13 -5
  736. package/src/conversation-index/cleanup.ts +25 -4
  737. package/src/conversation-index/faiss-adapter.ts +24 -15
  738. package/src/conversation-index/indexer.test.ts +71 -10
  739. package/src/conversation-index/indexer.ts +22 -3
  740. package/src/cross-namespace-budget.test.ts +59 -0
  741. package/src/cross-namespace-budget.ts +15 -7
  742. package/src/curation/index.ts +18 -17
  743. package/src/dashboard-runtime.test.ts +98 -0
  744. package/src/dashboard-runtime.ts +96 -6
  745. package/src/dedup/index.test.ts +133 -0
  746. package/src/dedup/index.ts +73 -10
  747. package/src/dedup/semantic.test.ts +77 -2
  748. package/src/dedup/semantic.ts +26 -6
  749. package/src/embedding-fallback.ts +47 -15
  750. package/src/enrichment/audit.ts +8 -1
  751. package/src/enrichment/pipeline.ts +21 -13
  752. package/src/enrichment/web-search-provider.ts +1 -6
  753. package/src/entity-retrieval.ts +57 -6
  754. package/src/evals.ts +22 -13
  755. package/src/explicit-capture.test.ts +40 -0
  756. package/src/explicit-capture.ts +14 -2
  757. package/src/extraction.ts +42 -30
  758. package/src/fallback-llm.ts +35 -2
  759. package/src/graph-dashboard-diff.test.ts +57 -0
  760. package/src/graph-dashboard-diff.ts +24 -2
  761. package/src/graph-dashboard-parser.test.ts +31 -0
  762. package/src/graph-dashboard-parser.ts +4 -1
  763. package/src/graph-events.ts +6 -4
  764. package/src/graph.test.ts +69 -0
  765. package/src/graph.ts +7 -4
  766. package/src/importers/base.test.ts +70 -0
  767. package/src/importers/base.ts +56 -7
  768. package/src/index.ts +6 -2
  769. package/src/lcm/archive.ts +65 -16
  770. package/src/lcm/engine.ts +27 -8
  771. package/src/lcm/recall.ts +5 -5
  772. package/src/lcm-engine.test.ts +87 -1
  773. package/src/lcm-recall.test.ts +71 -0
  774. package/src/live-connectors-runner.ts +100 -36
  775. package/src/maintenance/archive-observations.ts +24 -3
  776. package/src/maintenance/atomic-file.ts +85 -0
  777. package/src/maintenance/dreams-ledger.ts +15 -8
  778. package/src/maintenance/memory-governance.test.ts +53 -0
  779. package/src/maintenance/memory-governance.ts +15 -5
  780. package/src/maintenance/observation-ledger-utils.ts +6 -5
  781. package/src/maintenance/purge.test.ts +64 -0
  782. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +22 -9
  783. package/src/maintenance/rebuild-memory-projection.ts +22 -9
  784. package/src/maintenance/rebuild-observations.ts +7 -3
  785. package/src/mcp-memory-inspector-app.ts +26 -3
  786. package/src/memory-cache.test.ts +19 -0
  787. package/src/memory-cache.ts +1 -0
  788. package/src/memory-extension/codex-publisher.ts +25 -4
  789. package/src/memory-extension-host/host-discovery.test.ts +69 -0
  790. package/src/memory-extension-host/host-discovery.ts +63 -6
  791. package/src/memory-projection-store.ts +114 -62
  792. package/src/message-parts/index.ts +46 -31
  793. package/src/message-parts/message-parts.test.ts +77 -0
  794. package/src/migrate/from-engram.ts +68 -14
  795. package/src/model-registry.test.ts +38 -0
  796. package/src/model-registry.ts +12 -7
  797. package/src/namespaces/identity.test.ts +66 -0
  798. package/src/namespaces/identity.ts +23 -0
  799. package/src/namespaces/migrate.test.ts +62 -0
  800. package/src/namespaces/migrate.ts +82 -14
  801. package/src/namespaces/principal.test.ts +37 -1
  802. package/src/namespaces/principal.ts +18 -7
  803. package/src/namespaces/search.test.ts +76 -6
  804. package/src/namespaces/search.ts +22 -21
  805. package/src/namespaces/storage.ts +93 -11
  806. package/src/native-knowledge.ts +23 -3
  807. package/src/negative.ts +50 -5
  808. package/src/network/webdav.ts +177 -58
  809. package/src/offline-sync.ts +22 -11
  810. package/src/onboarding/index.test.ts +105 -0
  811. package/src/onboarding/index.ts +17 -5
  812. package/src/operator-toolkit.ts +39 -4
  813. package/src/orchestrator.ts +52 -17
  814. package/src/page-versioning.ts +31 -5
  815. package/src/peers/peers.test.ts +70 -0
  816. package/src/peers/storage.ts +32 -3
  817. package/src/plugin-entry-resolver.test.ts +60 -0
  818. package/src/plugin-entry-resolver.ts +48 -0
  819. package/src/plugin-id.test.ts +38 -0
  820. package/src/plugin-id.ts +31 -64
  821. package/src/policy-runtime.test.ts +75 -0
  822. package/src/policy-runtime.ts +32 -3
  823. package/src/procedural/procedure-miner.test.ts +152 -0
  824. package/src/procedural/procedure-miner.ts +124 -19
  825. package/src/profiling.test.ts +23 -0
  826. package/src/profiling.ts +10 -1
  827. package/src/projection/index.test.ts +253 -0
  828. package/src/projection/index.ts +159 -18
  829. package/src/qmd-client.test.ts +45 -0
  830. package/src/qmd.ts +8 -8
  831. package/src/recall-disclosure.test.ts +15 -1
  832. package/src/recall-state.ts +24 -5
  833. package/src/relevance.ts +24 -5
  834. package/src/replay/normalizers/chatgpt.ts +14 -4
  835. package/src/replay/normalizers/claude.ts +8 -3
  836. package/src/replay/normalizers/openclaw.ts +35 -12
  837. package/src/replay/normalizers/replay-normalizers.test.ts +65 -0
  838. package/src/replay/normalizers/shared.ts +4 -1
  839. package/src/replay/runner.ts +1 -1
  840. package/src/rerank.test.ts +41 -1
  841. package/src/rerank.ts +2 -2
  842. package/src/resolve-auth-token.test.ts +29 -0
  843. package/src/resolve-auth-token.ts +12 -7
  844. package/src/resolve-provider-secret.test.ts +78 -22
  845. package/src/resolve-provider-secret.ts +55 -223
  846. package/src/retrieval-agents.ts +51 -14
  847. package/src/review/index.test.ts +75 -1
  848. package/src/review/index.ts +88 -30
  849. package/src/routing/store.ts +36 -6
  850. package/src/runtime/env.test.ts +73 -0
  851. package/src/runtime/env.ts +7 -11
  852. package/src/schemas.ts +16 -1
  853. package/src/search/abort.ts +18 -0
  854. package/src/search/document-scanner.test.ts +80 -0
  855. package/src/search/document-scanner.ts +51 -9
  856. package/src/search/embed-helper.ts +19 -6
  857. package/src/search/factory.ts +9 -5
  858. package/src/search/lancedb-backend.ts +62 -22
  859. package/src/search/meilisearch-backend.ts +35 -12
  860. package/src/search/orama-backend.test.ts +27 -0
  861. package/src/search/orama-backend.ts +65 -15
  862. package/src/secure-store/cli-handlers.ts +70 -6
  863. package/src/secure-store/cli-renderer.ts +13 -7
  864. package/src/secure-store/secure-fs.ts +11 -5
  865. package/src/secure-store/secure-store.test.ts +70 -0
  866. package/src/semantic-consolidation.test.ts +45 -0
  867. package/src/semantic-consolidation.ts +3 -3
  868. package/src/session-integrity.test.ts +98 -0
  869. package/src/session-integrity.ts +51 -1
  870. package/src/session-observer-state.ts +108 -41
  871. package/src/shared-context/manager.ts +93 -15
  872. package/src/signal.test.ts +14 -0
  873. package/src/signal.ts +8 -1
  874. package/src/source-attribution.test.ts +8 -0
  875. package/src/source-attribution.ts +24 -2
  876. package/src/spaces/index.test.ts +93 -0
  877. package/src/spaces/index.ts +75 -9
  878. package/src/storage.ts +14 -1
  879. package/src/store-contract.test.ts +35 -0
  880. package/src/store-contract.ts +39 -5
  881. package/src/summarizer.ts +24 -18
  882. package/src/summary-snapshot.test.ts +77 -0
  883. package/src/surfaces/dreams.test.ts +73 -0
  884. package/src/surfaces/dreams.ts +53 -19
  885. package/src/sync/index.ts +42 -17
  886. package/src/taxonomy/taxonomy-loader.ts +43 -4
  887. package/src/temporal-supersession.test.ts +67 -0
  888. package/src/temporal-supersession.ts +8 -0
  889. package/src/tmt.test.ts +50 -0
  890. package/src/tmt.ts +35 -11
  891. package/src/tokens.test.ts +18 -0
  892. package/src/tokens.ts +7 -0
  893. package/src/training-export/converter.test.ts +55 -2
  894. package/src/training-export/converter.ts +36 -10
  895. package/src/training-export/registry.test.ts +17 -0
  896. package/src/training-export/registry.ts +19 -1
  897. package/src/transcript.ts +2 -2
  898. package/src/transfer/backup.ts +18 -7
  899. package/src/transfer/capsule-crypto.ts +105 -21
  900. package/src/transfer/capsule-encrypt.test.ts +106 -7
  901. package/src/transfer/capsule-export.ts +23 -14
  902. package/src/transfer/capsule-import.ts +11 -2
  903. package/src/transfer/exclusions.ts +7 -0
  904. package/src/transfer/export-sqlite.ts +14 -13
  905. package/src/transfer/fs-utils.ts +52 -1
  906. package/src/transfer/import-json.ts +12 -7
  907. package/src/transfer/import-md.ts +5 -5
  908. package/src/transfer/import-sqlite.ts +4 -5
  909. package/src/trust-zones.ts +1 -1
  910. package/src/types.ts +25 -0
  911. package/src/utility-telemetry.ts +1 -1
  912. package/src/utils/category-dir.test.ts +15 -0
  913. package/src/utils/category-dir.ts +3 -1
  914. package/src/work/boundary.ts +30 -18
  915. package/src/work/storage.ts +116 -38
  916. package/src/work-product-ledger.ts +1 -1
  917. package/dist/chunk-25MQ7IHJ.js.map +0 -1
  918. package/dist/chunk-2IWUMAES.js.map +0 -1
  919. package/dist/chunk-2NMMFZ5T.js.map +0 -1
  920. package/dist/chunk-2PRLKQAH.js.map +0 -1
  921. package/dist/chunk-326G7DJK.js.map +0 -1
  922. package/dist/chunk-3APJ5EVB.js.map +0 -1
  923. package/dist/chunk-3KW65B36.js.map +0 -1
  924. package/dist/chunk-3OWUCDKH.js.map +0 -1
  925. package/dist/chunk-3QKK7QOS.js.map +0 -1
  926. package/dist/chunk-3SLRNYNG.js.map +0 -1
  927. package/dist/chunk-3VAL7ZL2.js.map +0 -1
  928. package/dist/chunk-3Y4P7RXM.js.map +0 -1
  929. package/dist/chunk-43PJZYGL.js.map +0 -1
  930. package/dist/chunk-47VWKCAF.js.map +0 -1
  931. package/dist/chunk-4KGVTPGD.js.map +0 -1
  932. package/dist/chunk-5375UYTQ.js.map +0 -1
  933. package/dist/chunk-56K5QLHX.js.map +0 -1
  934. package/dist/chunk-575RMLWN.js.map +0 -1
  935. package/dist/chunk-5NPGSAVB.js.map +0 -1
  936. package/dist/chunk-5RGLBDQF.js.map +0 -1
  937. package/dist/chunk-65PG43EQ.js.map +0 -1
  938. package/dist/chunk-66DHUKLO.js.map +0 -1
  939. package/dist/chunk-6LVVDPJ4.js.map +0 -1
  940. package/dist/chunk-76FLAAUC.js.map +0 -1
  941. package/dist/chunk-77H5NU3M.js.map +0 -1
  942. package/dist/chunk-7MNMYOFP.js.map +0 -1
  943. package/dist/chunk-7OZ53EXP.js.map +0 -1
  944. package/dist/chunk-7SEAZFFB.js.map +0 -1
  945. package/dist/chunk-A6KTB5R6.js.map +0 -1
  946. package/dist/chunk-AGZQD76C.js.map +0 -1
  947. package/dist/chunk-APO3DCMU.js.map +0 -1
  948. package/dist/chunk-BVF3AGJP.js.map +0 -1
  949. package/dist/chunk-C5BCH4ZS.js.map +0 -1
  950. package/dist/chunk-C7VW7C3F.js.map +0 -1
  951. package/dist/chunk-CULXMQJH.js.map +0 -1
  952. package/dist/chunk-CYFQJMUV.js.map +0 -1
  953. package/dist/chunk-D654IBA6.js +0 -61
  954. package/dist/chunk-D654IBA6.js.map +0 -1
  955. package/dist/chunk-DGXUHMOV.js.map +0 -1
  956. package/dist/chunk-DINWEURR.js.map +0 -1
  957. package/dist/chunk-DK5LDEQM.js.map +0 -1
  958. package/dist/chunk-EABGC2TL.js.map +0 -1
  959. package/dist/chunk-EHRTFRWW.js.map +0 -1
  960. package/dist/chunk-EJI5XIBB.js.map +0 -1
  961. package/dist/chunk-FAAFWE4G.js.map +0 -1
  962. package/dist/chunk-FAJ7FZYM.js +0 -11
  963. package/dist/chunk-FAJ7FZYM.js.map +0 -1
  964. package/dist/chunk-FDU6HUUL.js +0 -147
  965. package/dist/chunk-FDU6HUUL.js.map +0 -1
  966. package/dist/chunk-FIT6DMX6.js.map +0 -1
  967. package/dist/chunk-FJ43PRLT.js.map +0 -1
  968. package/dist/chunk-FLTNHQK6.js +0 -262
  969. package/dist/chunk-FLTNHQK6.js.map +0 -1
  970. package/dist/chunk-GDFS42HT.js.map +0 -1
  971. package/dist/chunk-H3ME6L6D.js.map +0 -1
  972. package/dist/chunk-HXXBL2KD.js.map +0 -1
  973. package/dist/chunk-ICRIXAP2.js.map +0 -1
  974. package/dist/chunk-IQT3XTKW.js.map +0 -1
  975. package/dist/chunk-JR4ZC3G4.js.map +0 -1
  976. package/dist/chunk-K4FLSOR5.js.map +0 -1
  977. package/dist/chunk-KNKUID7G.js.map +0 -1
  978. package/dist/chunk-KOSORCJG.js.map +0 -1
  979. package/dist/chunk-KRBK4BQH.js.map +0 -1
  980. package/dist/chunk-LIRZNNUP.js.map +0 -1
  981. package/dist/chunk-LLQ2LLWF.js.map +0 -1
  982. package/dist/chunk-LPMVBPA3.js +0 -236
  983. package/dist/chunk-LPMVBPA3.js.map +0 -1
  984. package/dist/chunk-LT3NLYSI.js.map +0 -1
  985. package/dist/chunk-LUDTDZLK.js.map +0 -1
  986. package/dist/chunk-MG7NA5H3.js.map +0 -1
  987. package/dist/chunk-MJFNCJXV.js.map +0 -1
  988. package/dist/chunk-MSWG7JI6.js.map +0 -1
  989. package/dist/chunk-MXC3AP5I.js.map +0 -1
  990. package/dist/chunk-MXFBBHJU.js.map +0 -1
  991. package/dist/chunk-MZH6EHNR.js.map +0 -1
  992. package/dist/chunk-N2D6GXBM.js.map +0 -1
  993. package/dist/chunk-NBNN5GOB.js.map +0 -1
  994. package/dist/chunk-NMZY542O.js.map +0 -1
  995. package/dist/chunk-NZL6GGQE.js.map +0 -1
  996. package/dist/chunk-OC7KHOOX.js.map +0 -1
  997. package/dist/chunk-OZHRDTDX.js.map +0 -1
  998. package/dist/chunk-PZIAX57I.js.map +0 -1
  999. package/dist/chunk-Q7P4WJDP.js.map +0 -1
  1000. package/dist/chunk-QA2ZAPBU.js.map +0 -1
  1001. package/dist/chunk-QDZ2RLEC.js.map +0 -1
  1002. package/dist/chunk-QKZGQIPJ.js.map +0 -1
  1003. package/dist/chunk-QLLBRHAT.js.map +0 -1
  1004. package/dist/chunk-QR3C7BKQ.js.map +0 -1
  1005. package/dist/chunk-RHY3HH7P.js.map +0 -1
  1006. package/dist/chunk-RK2Y4XOM.js.map +0 -1
  1007. package/dist/chunk-RR2PKP3I.js +0 -63
  1008. package/dist/chunk-RR2PKP3I.js.map +0 -1
  1009. package/dist/chunk-RRF5UOBJ.js.map +0 -1
  1010. package/dist/chunk-RXDLTSWT.js.map +0 -1
  1011. package/dist/chunk-RYED3SPJ.js +0 -42
  1012. package/dist/chunk-RYED3SPJ.js.map +0 -1
  1013. package/dist/chunk-S7KDBTWT.js.map +0 -1
  1014. package/dist/chunk-TK4UEOSK.js.map +0 -1
  1015. package/dist/chunk-TMM4S4IJ.js.map +0 -1
  1016. package/dist/chunk-TMQLARTH.js.map +0 -1
  1017. package/dist/chunk-TPB3I2AC.js.map +0 -1
  1018. package/dist/chunk-TPMQ3G6Z.js.map +0 -1
  1019. package/dist/chunk-TZOLIGIG.js.map +0 -1
  1020. package/dist/chunk-U3WSW6PZ.js.map +0 -1
  1021. package/dist/chunk-U4SCL7B7.js.map +0 -1
  1022. package/dist/chunk-U66YHYC7.js +0 -31
  1023. package/dist/chunk-U66YHYC7.js.map +0 -1
  1024. package/dist/chunk-UL2NNBUL.js.map +0 -1
  1025. package/dist/chunk-UWVJF25J.js.map +0 -1
  1026. package/dist/chunk-VBJ7V5SK.js.map +0 -1
  1027. package/dist/chunk-W3LR522O.js.map +0 -1
  1028. package/dist/chunk-W4L6CZKA.js.map +0 -1
  1029. package/dist/chunk-W6AQJ2PY.js.map +0 -1
  1030. package/dist/chunk-WELDCG6C.js.map +0 -1
  1031. package/dist/chunk-WNARATI3.js.map +0 -1
  1032. package/dist/chunk-WPGJYVUH.js.map +0 -1
  1033. package/dist/chunk-WW3QQF4H.js.map +0 -1
  1034. package/dist/chunk-XIG5PDM7.js.map +0 -1
  1035. package/dist/chunk-XKECPATV.js.map +0 -1
  1036. package/dist/chunk-XKLD5OK4.js.map +0 -1
  1037. package/dist/chunk-XSZEP4SF.js.map +0 -1
  1038. package/dist/chunk-XVVIG67A.js.map +0 -1
  1039. package/dist/chunk-XYIK4LF6.js.map +0 -1
  1040. package/dist/chunk-YRMVARQP.js.map +0 -1
  1041. package/dist/chunk-ZPKBYX2F.js.map +0 -1
  1042. package/dist/chunk-ZTFCYYEZ.js.map +0 -1
  1043. package/dist/chunk-ZYVPLJ4T.js.map +0 -1
  1044. package/dist/path-MR5JPYOP.js +0 -9
  1045. package/dist/state-store-VZU2IA53.js +0 -16
  1046. package/dist/trace-C5ETWBEF.js.map +0 -1
  1047. /package/dist/{capsule-crypto-5CYAGVC5.js.map → bulk-import/index.js.map} +0 -0
  1048. /package/dist/{contradiction-review-ATP4S6IC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  1049. /package/dist/{capsule-merge-4MGKE7C5.js.map → capsule-merge-T2JRE46P.js.map} +0 -0
  1050. /package/dist/{chunk-SAZS2QZB.js.map → chunk-23UORJ4S.js.map} +0 -0
  1051. /package/dist/{chunk-PK7H5L6Y.js.map → chunk-2NM43EWN.js.map} +0 -0
  1052. /package/dist/{chunk-PYXS46O7.js.map → chunk-3BP57I6J.js.map} +0 -0
  1053. /package/dist/{chunk-FBYESMQ2.js.map → chunk-3C5RPJAX.js.map} +0 -0
  1054. /package/dist/{chunk-N53K2EXC.js.map → chunk-6VF75M3X.js.map} +0 -0
  1055. /package/dist/{chunk-6H2TESSP.js.map → chunk-765K3SAT.js.map} +0 -0
  1056. /package/dist/{chunk-EDTHC6UD.js.map → chunk-77NAFXUD.js.map} +0 -0
  1057. /package/dist/{chunk-MGKYQQYF.js.map → chunk-7Q3RCKAQ.js.map} +0 -0
  1058. /package/dist/{chunk-34DQE4KF.js.map → chunk-CO7ZO4TU.js.map} +0 -0
  1059. /package/dist/{chunk-ZKSK55RC.js.map → chunk-ETUPBUHB.js.map} +0 -0
  1060. /package/dist/{chunk-QRNI5JBH.js.map → chunk-EYIEWJNI.js.map} +0 -0
  1061. /package/dist/{chunk-C6QPK5GG.js.map → chunk-FZZ2QTJI.js.map} +0 -0
  1062. /package/dist/{chunk-3JXBXXM2.js.map → chunk-G4IAEX6D.js.map} +0 -0
  1063. /package/dist/{chunk-2WWLHTZY.js.map → chunk-IC4GELZE.js.map} +0 -0
  1064. /package/dist/{chunk-PCUKNJAZ.js.map → chunk-JKV57BTN.js.map} +0 -0
  1065. /package/dist/{chunk-2KI4QFHU.js.map → chunk-LMDRGRJ2.js.map} +0 -0
  1066. /package/dist/{chunk-MY6TPVXW.js.map → chunk-LMPHTYJC.js.map} +0 -0
  1067. /package/dist/{chunk-5HRY2WRF.js.map → chunk-LZ3VEOU5.js.map} +0 -0
  1068. /package/dist/{chunk-NGAVDO7E.js.map → chunk-OADWQ5CR.js.map} +0 -0
  1069. /package/dist/{chunk-DOM4GKSW.js.map → chunk-OZKVVUJB.js.map} +0 -0
  1070. /package/dist/{chunk-MT4HVDUZ.js.map → chunk-PM3QHTFT.js.map} +0 -0
  1071. /package/dist/{chunk-ZK7I7JYV.js.map → chunk-R3PS27B4.js.map} +0 -0
  1072. /package/dist/{chunk-SKE7JYKA.js.map → chunk-SFXKHM7P.js.map} +0 -0
  1073. /package/dist/{chunk-HMDCOMYU.js.map → chunk-SKGV326D.js.map} +0 -0
  1074. /package/dist/{chunk-5UM2VJ6D.js.map → chunk-UEY3VB6W.js.map} +0 -0
  1075. /package/dist/{chunk-GIF42EW3.js.map → chunk-UP6MOYCB.js.map} +0 -0
  1076. /package/dist/{chunk-MRILGULB.js.map → chunk-V2RCP53Q.js.map} +0 -0
  1077. /package/dist/{chunk-FSFEQI74.js.map → chunk-W7L6HXUC.js.map} +0 -0
  1078. /package/dist/{chunk-3IQ2TR4N.js.map → chunk-WLEB7WCG.js.map} +0 -0
  1079. /package/dist/{chunk-GL6I6MEQ.js.map → chunk-WSGF57U2.js.map} +0 -0
  1080. /package/dist/{chunk-JA3AK3PT.js.map → chunk-XNLXAWHX.js.map} +0 -0
  1081. /package/dist/{chunk-SIC6U3GZ.js.map → chunk-YHV3KRKS.js.map} +0 -0
  1082. /package/dist/{chunk-VLXA6PI2.js.map → chunk-YQMZ7IH2.js.map} +0 -0
  1083. /package/dist/{contradiction-scan-5A4IDZV5.js.map → contradiction-review-6V2LXXK6.js.map} +0 -0
  1084. /package/dist/{migrate-from-identity-anchor-G27MCD6A.js.map → contradiction-scan-GIRVC4C7.js.map} +0 -0
  1085. /package/dist/{first-start-migration-4MHQEOSD.js.map → first-start-migration-CKTCTCQI.js.map} +0 -0
  1086. /package/dist/{graph-edge-decay-5DI5GUNL.js.map → graph-edge-decay-MUP5J7CC.js.map} +0 -0
  1087. /package/dist/{path-MR5JPYOP.js.map → importers/index.js.map} +0 -0
  1088. /package/dist/{peers-HCVGHMAE.js.map → migrate-from-identity-anchor-EB4XI4Q2.js.map} +0 -0
  1089. /package/dist/{resolution-B7FNQSSP.js.map → path-X2K5XCHL.js.map} +0 -0
  1090. /package/dist/{state-store-VZU2IA53.js.map → peers/index.js.map} +0 -0
  1091. /package/dist/{tier-stats-62ZVDFKS.js.map → tier-stats-SKML2OSF.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/coding/git-context.ts","../src/coding/coding-namespace.ts","../src/procedural/reinforcement-core.ts"],"sourcesContent":["/**\n * GitContextResolver — pure module for detecting the git project + branch\n * a session is operating in.\n *\n * Introduced by issue #569 (coding-agent project/branch-scoped namespaces).\n *\n * This module is deliberately pure:\n * - no orchestrator references\n * - no config side-effects\n * - no namespace wiring\n *\n * Downstream slices (PR 2+ of #569) wire `resolveGitContext` into the\n * `NamespaceResolver` / `Orchestrator` so that memories are scoped to a\n * detected project / branch without leaking across repos.\n *\n * CLAUDE.md rule 17 (expand `~`): the `rootPath` returned here is always an\n * absolute, tilde-expanded path. Callers must not re-expand.\n *\n * CLAUDE.md rule 51 (reject invalid input): `cwd` must be an absolute path\n * and must exist. `resolveGitContext` returns `null` — rather than throwing —\n * when the directory is not inside a git worktree, because being outside a\n * repo is a normal runtime state (e.g. agent opened in a scratch dir).\n */\nimport path from \"node:path\";\n\nimport { expandTildePath } from \"../utils/path.js\";\nimport { launchProcessSync } from \"../runtime/child-process.js\";\n\n// Re-export so existing callers / tests that imported `expandTildePath` from\n// this module keep working. CLAUDE.md #17 requires consistent `~` expansion\n// across every user-facing path input; the canonical implementation now\n// lives in `utils/path.ts`.\nexport { expandTildePath };\n\n// ──────────────────────────────────────────────────────────────────────────\n// Public types\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface GitContext {\n /**\n * Stable identifier for the project. Derived from `git remote get-url origin`\n * when an origin remote is configured, otherwise from the repo root path.\n *\n * Formatted as `origin:<hex>` or `root:<hex>` so that the source is visible\n * to operators (see `remnic doctor`, issue #569 acceptance criteria).\n */\n projectId: string;\n /**\n * Current branch, e.g. `main`, `feat/foo`. `null` only in detached-HEAD\n * state (e.g. rebase in progress). Callers should treat `null` as \"no\n * branch-scope overlay applies\" without erroring.\n */\n branch: string | null;\n /**\n * Absolute path to the repository root (the directory containing `.git`).\n * Tilde-expanded per CLAUDE.md #17.\n */\n rootPath: string;\n /**\n * Best-effort default branch (usually `main` or `master`). Derived from the\n * `refs/remotes/origin/HEAD` symbolic ref. `null` when not available (e.g.\n * fresh clone without a default branch symref, or no origin remote).\n */\n defaultBranch: string | null;\n}\n\n/**\n * Injectable git-invocation surface. Only the commands `resolveGitContext`\n * actually needs are exposed. Tests inject a mock implementation to avoid\n * spawning a real git process.\n */\nexport interface GitInvoker {\n /**\n * Run `git <args>` with `cwd` as the working directory. Must return\n * `{ stdout, exitCode }` with `stdout` trimmed by the caller as needed.\n * Implementations should NOT throw for non-zero exit codes — they should\n * return the exit code so the resolver can decide how to recover.\n */\n (cwd: string, args: string[]): { stdout: string; exitCode: number };\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Default git invoker — spawns real `git` via the shared child-process helper\n// ──────────────────────────────────────────────────────────────────────────\n\nconst DEFAULT_GIT_TIMEOUT_MS = 2_000;\n\nexport function defaultGitInvoker(): GitInvoker {\n return (cwd: string, args: string[]) => {\n const result = launchProcessSync(\"git\", args, {\n cwd,\n encoding: \"utf-8\",\n timeout: DEFAULT_GIT_TIMEOUT_MS,\n shell: false,\n });\n if (result.error) {\n // Spawn failure (git not on PATH, timeout, etc.). Surface as non-zero.\n return { stdout: \"\", exitCode: 127 };\n }\n return {\n stdout: typeof result.stdout === \"string\" ? result.stdout : \"\",\n exitCode: typeof result.status === \"number\" ? result.status : 1,\n };\n };\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Stable hashing\n// ──────────────────────────────────────────────────────────────────────────\n\n/**\n * Non-cryptographic stable hash. Used only to derive a deterministic\n * `projectId` from either the origin URL or the root path. The hash does not\n * need to be collision-resistant against adversarial input — it is purely a\n * namespace discriminator.\n *\n * Uses FNV-1a 32-bit so we don't pull in `node:crypto` for a simple bucket\n * key. Output is lowercase hex, zero-padded to 8 characters.\n */\nexport function stableHash(input: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Origin URL normalization\n// ──────────────────────────────────────────────────────────────────────────\n\n/**\n * Normalize a git remote URL so that equivalent SSH / HTTPS forms of the\n * same repo produce the same `projectId`. Handles:\n * - `git@github.com:foo/bar.git` → `github.com/foo/bar`\n * - `https://github.com/foo/bar` → `github.com/foo/bar`\n * - `https://github.com/foo/bar.git` → `github.com/foo/bar`\n * - `ssh://git@github.com/foo/bar` → `github.com/foo/bar`\n * - `ssh://git@github.com:2222/foo/bar` → `github.com/foo/bar` (port stripped)\n *\n * Case-insensitive (remote hostnames and most repo paths on major forges are\n * case-insensitive in practice).\n */\nexport function normalizeOriginUrl(rawUrl: string): string {\n let url = rawUrl.trim();\n if (!url) return \"\";\n\n // Strip trailing `.git` case-insensitively — the whole result is\n // lowercased at the end, so `.GIT` / `.Git` must be treated the same as\n // `.git`. Previously the `.endsWith(\".git\")` check let `.GIT` leak\n // through and appear in the output.\n if (/\\.git$/i.test(url)) url = url.slice(0, -4);\n\n // Windows drive-letter local path (e.g. `C:/repos/app`): detect here\n // so the scp matcher below can accept single-character SSH host aliases\n // (`h:foo/bar` from `.ssh/config`). A drive letter is exactly one ASCII\n // letter followed by `:/` or `:\\`; SSH aliases never have a slash\n // immediately after the colon.\n if (/^[A-Za-z]:[\\\\/]/.test(url)) {\n return url.toLowerCase();\n }\n\n // Protocol-prefixed: ssh://, https://, http://, git://, file://\n // Must be tried FIRST so that scp-style detection below doesn't\n // incorrectly swallow an ssh:// URL that happens to contain `:port/`.\n //\n // Matches:\n // 1: host — bracketed IPv6 `[2001:db8::1]`, plain host with no `:` / `/`,\n // OR empty (for `file:///path` which has no host component).\n // 2: port (optional) — preserved in the output so two repos on the same\n // host under different ports get distinct project namespaces.\n // Losing the port risked false-coalescing separate repos on custom\n // SSH mesh setups.\n // 3: path (optional)\n const protoMatch =\n /^[a-z][a-z0-9+.-]*:\\/\\/(?:[^@/]+@)?(\\[[^\\]]+\\]|[^/:]*)(?::(\\d+))?(\\/.*)?$/i.exec(url);\n if (protoMatch) {\n let host = protoMatch[1] ?? \"\";\n // Detect IPv6 via the bracketed input form BEFORE stripping brackets,\n // so that when we later re-attach a port we can preserve the\n // `[host]:port` boundary. Without the brackets, `host:2222` is\n // ambiguous with a longer bare IPv6 address like `2001:db8::1:2222`.\n const wasBracketed =\n host.startsWith(\"[\") && host.endsWith(\"]\");\n if (wasBracketed) host = host.slice(1, -1);\n const port = protoMatch[2];\n const repoPath = (protoMatch[3] ?? \"\").replace(/^\\/+/, \"\");\n const hostPort = port\n ? wasBracketed\n ? `[${host}]:${port}`\n : `${host}:${port}`\n : host;\n // For protocols without a host component (file:///path), fall back to\n // a stable prefix so distinct local paths don't collapse to \"/path\".\n const prefix = hostPort.length > 0 ? hostPort : \"localhost\";\n return `${prefix}/${repoPath}`.toLowerCase();\n }\n\n // scp-like syntax: [user@]host:path. Protocol-prefixed URLs (`scheme://`)\n // are handled above, so the scp branch below guards against them: a\n // matched `host` of `scheme` followed by a path starting with `//` is\n // a protocol URL that fell through and must NOT be parsed here.\n // `user@` is optional — git also accepts userless scp forms like\n // `host:org/repo`. Valid scp paths may start with digits (e.g.\n // `git@host:123/repo.git`), so no numeric guard is needed: port-bearing\n // URLs have the `://` prefix and match the protocol branch above before\n // reaching here.\n //\n // Windows drive letters were filtered above, so single-character SSH\n // host aliases (`h:foo/bar`) are accepted here.\n //\n // Bracketed IPv6 (`[2001:db8::1]`) is supported: the host alternative\n // matches the bracketed literal up to `]` without splitting on internal\n // `:`. Brackets are stripped in the normalised form so the scp and\n // `ssh://` forms of the same IPv6 remote produce identical projectIds.\n const scpMatch =\n /^(?:([^@\\s/]+)@)?(\\[[^\\]]+\\]|[^:@\\s/]+):(.+)$/.exec(url);\n if (scpMatch) {\n let host = scpMatch[2] ?? \"\";\n if (host.startsWith(\"[\") && host.endsWith(\"]\")) host = host.slice(1, -1);\n const repoPath = scpMatch[3] ?? \"\";\n // Reject protocol-like leftovers (e.g. `file:///path` where the scp\n // regex greedily matched `file` as host and `///path` as path).\n if (repoPath.startsWith(\"//\")) {\n return url.toLowerCase();\n }\n return `${host}/${repoPath.replace(/^\\/+/, \"\")}`.toLowerCase();\n }\n\n // Fallback: use raw lowercased\n return url.toLowerCase();\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Resolver\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface ResolveGitContextOptions {\n /** Inject a git invoker (tests). Defaults to spawning real `git`. */\n invoker?: GitInvoker;\n}\n\n/**\n * Detect the git project + branch for `cwd`.\n *\n * Returns `null` when:\n * - `cwd` is not an absolute path (invalid input, CLAUDE.md #51)\n * - `cwd` is not inside a git worktree\n * - `git` is not available on PATH\n *\n * Never throws.\n */\nexport async function resolveGitContext(\n cwd: string,\n options: ResolveGitContextOptions = {},\n): Promise<GitContext | null> {\n // Wrap the whole body so the documented \"Never throws\" contract is\n // enforced. Possible throw sites include:\n // - `expandTildePath` → `resolveHomeDir()` → `os.homedir()` when HOME\n // is unset (e.g. minimal containers)\n // - a custom `options.invoker` that raises instead of returning a\n // non-zero exitCode\n // - any future helper added to this chain\n // All of those map to \"not in a repo\" / `null`.\n try {\n // Validate input: must be a non-empty string.\n if (typeof cwd !== \"string\" || cwd.length === 0) return null;\n\n // Expand `~` per CLAUDE.md #17, then require absolute path.\n const expanded = expandTildePath(cwd);\n if (!path.isAbsolute(expanded)) return null;\n\n const invoker = options.invoker ?? defaultGitInvoker();\n\n // 1. Locate the repo root.\n const topLevel = invoker(expanded, [\"rev-parse\", \"--show-toplevel\"]);\n if (topLevel.exitCode !== 0) return null;\n const rootPath = topLevel.stdout.trim();\n if (!rootPath) return null;\n\n // 2. Current branch. `--abbrev-ref HEAD` returns `HEAD` in detached\n // state, which we normalize to `null`. On a fresh `git init` the\n // HEAD ref is unborn and `--abbrev-ref HEAD` fails, but\n // `symbolic-ref HEAD` still returns the target branch. Fall back\n // so newly-initialized repos get a sensible branch name.\n const branchResult = invoker(rootPath, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n let branch: string | null = null;\n if (branchResult.exitCode === 0) {\n const raw = branchResult.stdout.trim();\n branch = raw && raw !== \"HEAD\" ? raw : null;\n } else {\n const unbornRef = invoker(rootPath, [\"symbolic-ref\", \"--quiet\", \"HEAD\"]);\n if (unbornRef.exitCode === 0) {\n const raw = unbornRef.stdout.trim();\n const prefix = \"refs/heads/\";\n if (raw.startsWith(prefix)) {\n const candidate = raw.slice(prefix.length);\n if (candidate) branch = candidate;\n }\n }\n }\n\n // 3. Origin URL — optional. Used to derive a stable `projectId`.\n const originResult = invoker(rootPath, [\"remote\", \"get-url\", \"origin\"]);\n let projectId: string;\n if (originResult.exitCode === 0) {\n const normalized = normalizeOriginUrl(originResult.stdout);\n projectId = normalized ? `origin:${stableHash(normalized)}` : `root:${stableHash(rootPath)}`;\n } else {\n projectId = `root:${stableHash(rootPath)}`;\n }\n\n // 4. Default branch — best effort.\n const headRef = invoker(rootPath, [\"symbolic-ref\", \"--quiet\", \"refs/remotes/origin/HEAD\"]);\n let defaultBranch: string | null = null;\n if (headRef.exitCode === 0) {\n const raw = headRef.stdout.trim();\n const prefix = \"refs/remotes/origin/\";\n if (raw.startsWith(prefix)) {\n const candidate = raw.slice(prefix.length);\n if (candidate) defaultBranch = candidate;\n }\n }\n\n return {\n projectId,\n branch,\n rootPath,\n defaultBranch,\n };\n } catch {\n // Never throws — any unexpected error falls back to \"not in a repo\".\n return null;\n }\n}\n","/**\n * Coding-agent namespace overlay (issue #569 PR 2 + PR 3).\n *\n * Given a `CodingContext` (from `resolveGitContext`) and a `CodingModeConfig`,\n * returns the namespace that recall + write paths should use — or `null` when\n * no overlay should apply (coding mode disabled, no context supplied, or\n * feature flags off).\n *\n * PR 2 ships the project overlay. PR 3 will add the branch overlay; the\n * function here already handles both flags so the schema / types / plumbing\n * don't have to change a second time when branch-scope lands.\n *\n * Pure function — no orchestrator, no config side-effects. Callers keep rule\n * 42 (read + write through same namespace layer) by consulting the same\n * function on both paths.\n */\n\nimport type { CodingContext, CodingModeConfig } from \"../types.js\";\nimport { stableHash } from \"./git-context.js\";\n\nexport interface CodingNamespaceOverlay {\n /**\n * Effective namespace to use for this session's memory operations. When\n * `branchScope` is on, takes the form `project:<id>/branch:<b>`; otherwise\n * `project:<id>`.\n */\n namespace: string;\n /**\n * Read fallbacks — additional namespaces a caller should include in recall\n * so that, for example, a branch-scoped session still sees project-level\n * memories that were written before the branch scope was enabled.\n *\n * Writes MUST go to `namespace` only; these are read-side only.\n *\n * Introduced to carry PR 3's branch→project fallback; PR 2 returns an empty\n * array here.\n */\n readFallbacks: string[];\n /**\n * `\"project\"` when only project scope applies, `\"branch\"` when branch scope\n * is also layered on. Used for diagnostics (`remnic doctor`) and logging.\n */\n scope: \"project\" | \"branch\";\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Sanitization\n// ──────────────────────────────────────────────────────────────────────────\n\n/**\n * Normalize a projectId / branch fragment so the resulting namespace passes\n * the router's `isSafeRouteNamespace` check (`[A-Za-z0-9._-]{1,64}`).\n *\n * Namespaces are used as filesystem directory names and must not contain\n * path separators (`/`, `\\`) or colons — so both `:` and `/` collapse to `-`.\n * The project-id format `origin:<8hex>` and branch names like `feat/x` both\n * flow through this helper before hitting the storage layer.\n *\n * NOT a security boundary — projectIds come from `resolveGitContext` (known\n * hex), and branch names come from local git. This defends against corrupt\n * input only.\n */\n/**\n * Single-pass sanitization — each input character is visited exactly once.\n * Rewriting as an explicit loop (instead of chained `replace()` calls with\n * greedy quantifiers) closes the polynomial-backtracking surface that\n * CodeQL flagged on patterns like `-+` and `^-+|-+$`.\n */\nfunction sanitizeFragment(input: string): string {\n if (typeof input !== \"string\") return \"\";\n const trimmed = input.trim().toLowerCase();\n let out = \"\";\n let prevIsDash = true; // suppress leading dashes\n for (let i = 0; i < trimmed.length; i += 1) {\n const c = trimmed[i]!;\n const cc = trimmed.charCodeAt(i);\n const isSafe =\n (cc >= 48 && cc <= 57) /* 0-9 */ ||\n (cc >= 97 && cc <= 122) /* a-z */ ||\n cc === 46 /* . */ ||\n cc === 95 /* _ */;\n if (isSafe) {\n out += c;\n prevIsDash = false;\n } else if (!prevIsDash) {\n out += \"-\";\n prevIsDash = true;\n }\n }\n // Strip a single trailing dash introduced by the final run of unsafe chars.\n if (out.endsWith(\"-\")) out = out.slice(0, -1);\n return out;\n}\n\n/**\n * Cap to the router's per-namespace upper bound.\n *\n * Raw truncation alone would collapse distinct long inputs that differ near\n * the end (e.g. two `feat/...` branches with different suffixes) into the\n * same namespace — silently mixing recall/write state across branches or\n * projects. When truncation is needed, we append a short deterministic\n * hash suffix (`-<8hex>`) derived from the FULL pre-truncated value so\n * collisions only happen under true hash collisions, not simple prefix\n * overlap.\n *\n * The tail is trimmed to leave room for the separator and 8-char hash and\n * any trailing `-` introduced by the slice is stripped so the final\n * character before `-<hash>` is always alphanumeric or `.`/`_`.\n */\nconst MAX_NAMESPACE_LEN = 64;\nconst HASH_SUFFIX_LEN = 9; // \"-\" + 8 hex chars\n\nfunction capLength(value: string): string {\n if (value.length <= MAX_NAMESPACE_LEN) return value;\n // Reuse the FNV-1a 32-bit hash from git-context — one canonical\n // implementation, one set of edge-case fixes. Uses Math.imul for\n // correct 32-bit wrap-around, which plain `*` would not guarantee\n // for the largest intermediate products.\n const hash = stableHash(value);\n // Trim trailing '-' with a linear, non-backtracking loop. A regex\n // like `-+$` is linear too, but an explicit loop keeps CodeQL happy\n // about polynomial backtracking warnings when several `\\-+` patterns\n // appear in the same module.\n let end = MAX_NAMESPACE_LEN - HASH_SUFFIX_LEN;\n while (end > 0 && value.charCodeAt(end - 1) === 45 /* '-' */) end -= 1;\n return `${value.slice(0, end)}-${hash}`;\n}\n\n/**\n * Produce the project-scope namespace name. Exported for tests and for\n * `remnic doctor` to render. Guaranteed to satisfy `isSafeRouteNamespace`:\n * no `/`, no `:`, lowercase only, length-capped to 64 chars.\n */\nexport function projectNamespaceName(projectId: string): string {\n const frag = sanitizeFragment(projectId);\n return capLength(`project-${frag || \"unknown\"}`);\n}\n\nexport function projectTagProjectId(projectTag: string): string {\n const trimmed = projectTag.trim();\n const frag = sanitizeFragment(trimmed);\n const disambig = trimmed.length > 0 && frag !== trimmed;\n const suffix = disambig ? `-${stableHash(trimmed)}` : \"\";\n return `tag:${frag || \"unknown\"}${suffix}`;\n}\n\n/**\n * Preserve case when sanitizing a principal-derived base namespace. The\n * router's `isSafeRouteNamespace` check accepts `[A-Za-z0-9._-]{1,64}`, so\n * upper-case characters in the principal name are safe and MUST be kept to\n * avoid colliding two otherwise-distinct principals (e.g. `Alice` vs\n * `alice`) into the same combined namespace.\n *\n * Otherwise identical to `sanitizeFragment`: single-pass, linear, no\n * polynomial-backtracking quantifiers, unsafe chars collapse to `-` with\n * leading/trailing dashes suppressed.\n */\nfunction sanitizeBaseFragment(input: string): string {\n if (typeof input !== \"string\") return \"\";\n const trimmed = input.trim();\n let out = \"\";\n let prevIsDash = true;\n for (let i = 0; i < trimmed.length; i += 1) {\n const c = trimmed[i]!;\n const cc = trimmed.charCodeAt(i);\n const isSafe =\n (cc >= 48 && cc <= 57) /* 0-9 */ ||\n (cc >= 65 && cc <= 90) /* A-Z */ ||\n (cc >= 97 && cc <= 122) /* a-z */ ||\n cc === 46 /* . */ ||\n cc === 95 /* _ */;\n if (isSafe) {\n out += c;\n prevIsDash = false;\n } else if (!prevIsDash) {\n out += \"-\";\n prevIsDash = true;\n }\n }\n if (out.endsWith(\"-\")) out = out.slice(0, -1);\n return out;\n}\n\n/**\n * Combine a principal-derived base namespace (e.g. `default`, `alice`) with a\n * coding-agent overlay namespace (e.g. `project-origin-abcd1234`). The result\n * is a single safe-route token that preserves principal isolation (CLAUDE.md\n * rule 42: read + write must resolve through the same namespace layer — and\n * here, through the same principal-scoped prefix) while layering project or\n * project/branch scope on top.\n *\n * Multiple principals working in the same repo thus get distinct namespaces:\n *\n * alice + project-origin-ab12 → alice-project-origin-ab12\n * bob + project-origin-ab12 → bob-project-origin-ab12\n * Alice + project-origin-ab12 → Alice-project-origin-ab12 (distinct)\n *\n * The base fragment preserves case so `Alice` and `alice` remain distinct;\n * the overlay fragment is still lowercase-sanitized because it derives from\n * deterministic, pre-lowercased git hashes.\n *\n * Output is re-capped through `capLength` so a very long base + overlay\n * combination still fits inside `isSafeRouteNamespace` (≤ 64 chars). The\n * deterministic hash suffix on truncation keeps distinct inputs distinct.\n */\nexport function combineNamespaces(base: string, overlay: string): string {\n const baseFrag = sanitizeBaseFragment(base);\n const overlayFrag = sanitizeFragment(overlay);\n if (!baseFrag) return capLength(overlayFrag || \"unknown\");\n if (!overlayFrag) return capLength(baseFrag);\n return capLength(`${baseFrag}-${overlayFrag}`);\n}\n\n/**\n * Produce the branch-scope namespace name. Format:\n * `project-<id>-branch-<name>[-<hash>]`. Uses `-` as the structural separator\n * rather than `/` or `:` so the result is a single safe route-namespace\n * token that can be used directly as a filesystem directory.\n *\n * Two failure modes must not collapse distinct branches to one namespace:\n *\n * 1. Sanitization is lossy (`feat/x` and `feat-x` both sanitize to\n * `feat-x`; `Feature` and `feature` both sanitize to `feature`). When\n * sanitization rewrote any character, we append a short hash of the\n * RAW branch so distinct inputs stay distinct.\n * 2. Truncation is applied when the total exceeds 64 chars. In that\n * mode `capLength` appends its own hash of the full pre-truncated\n * value.\n *\n * Long branches that also sanitize may receive both kinds of hashes — that\n * is acceptable: the router only requires the result be unique and\n * deterministic, and the two hashes derive from different domains so they\n * don't conflict.\n */\nexport function branchNamespaceName(projectId: string, branch: string): string {\n const projectFrag = sanitizeFragment(projectId);\n const trimmedBranch = branch.trim();\n const branchFrag = sanitizeFragment(trimmedBranch);\n // Lossy-sanitization disambiguator: append hash of the raw (trimmed)\n // branch when sanitization actually changed the string. Preserves\n // distinctness across `feat/x` vs `feat-x` and `Feature` vs `feature`.\n // The comparison uses the raw trimmed value (NOT `.toLowerCase()`) so\n // case-only variants are treated as lossy and receive their own hash.\n // Empty / already-safe-lowercase inputs get no hash so the common case\n // stays readable.\n const disambig = trimmedBranch.length > 0 && branchFrag !== trimmedBranch;\n const base = `project-${projectFrag || \"unknown\"}-branch-${branchFrag || \"unknown\"}`;\n const suffixed = disambig ? `${base}-${stableHash(trimmedBranch)}` : base;\n return capLength(suffixed);\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Overlay resolver\n// ──────────────────────────────────────────────────────────────────────────\n\n/**\n * Compute the namespace overlay for a session.\n *\n * Returns `null` when no overlay applies — callers should then use their\n * existing `defaultNamespaceForPrincipal(...)` result unchanged. This keeps\n * CLAUDE.md #30 (escape hatch): setting `codingMode.projectScope: false`\n * exactly restores pre-#569 behaviour at every call site.\n *\n * @param codingContext — git context from the connector\n * @param config — coding mode flags (projectScope, branchScope, globalFallback)\n * @param defaultNamespace — retained for call-site compatibility; no longer\n * used. The global fallback is expressed as an empty-string sentinel in\n * `readFallbacks`, which `combineNamespaces(principal, \"\")` resolves to the\n * principal's own namespace at the call site.\n */\nexport function resolveCodingNamespaceOverlay(\n codingContext: CodingContext | null | undefined,\n config: Pick<CodingModeConfig, \"projectScope\" | \"branchScope\" | \"globalFallback\">,\n defaultNamespace?: string,\n): CodingNamespaceOverlay | null {\n // No context supplied (session isn't in a git repo, or connector didn't\n // attach one) → no overlay.\n if (!codingContext) return null;\n\n // Project scope disabled → no overlay at all. Branch scope depends on\n // project scope being on; there is no branch-only mode.\n if (!config.projectScope) return null;\n\n // Require a non-empty projectId — defensive.\n const projectId = typeof codingContext.projectId === \"string\" ? codingContext.projectId.trim() : \"\";\n if (!projectId) return null;\n\n const projectNs = projectNamespaceName(projectId);\n\n // Root/global namespace fallback: when `globalFallback` is true, include\n // the principal's self namespace in readFallbacks so cross-project knowledge\n // remains visible. CLAUDE.md #30: the gate is `globalFallback` — set to\n // false for strict project isolation.\n //\n // The fallback value is \"\" (empty string), NOT the defaultNamespace name.\n // The orchestrator passes each fallback through combineNamespaces(principal, fallback),\n // and combineNamespaces(base, \"\") returns base unchanged — yielding the\n // principal's own namespace. Using the actual namespace name (e.g., \"default\")\n // would produce \"default-default\" after combination, missing the target.\n const includeRoot = config.globalFallback === true;\n\n // Branch-scope layering (PR 3):\n // - only when config.branchScope is explicitly true\n // - only when we actually have a branch (null in detached HEAD)\n // - project namespace becomes a read fallback so project-level memories\n // remain visible from any branch (deliberate asymmetry — branch writes\n // don't leak up, but project reads leak down).\n // - when globalFallback is on, the root namespace is also appended so\n // globally useful memories surface in every branch.\n if (config.branchScope && typeof codingContext.branch === \"string\" && codingContext.branch.length > 0) {\n const branchNs = branchNamespaceName(projectId, codingContext.branch);\n const fallbacks = [projectNs];\n if (includeRoot) fallbacks.push(\"\");\n return {\n namespace: branchNs,\n readFallbacks: fallbacks,\n scope: \"branch\",\n };\n }\n\n return {\n namespace: projectNs,\n readFallbacks: includeRoot ? [\"\"] : [],\n scope: \"project\",\n };\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Diagnostics (issue #569 PR 3 + PR 8)\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface CodingScopeDescription {\n /** \"none\" when no overlay is active; otherwise the resolved scope level. */\n scope: \"none\" | \"project\" | \"branch\";\n /** Project id (raw, not sanitized) when a context is attached. */\n projectId: string | null;\n /** Branch name (raw, not sanitized) when available. */\n branch: string | null;\n /** Effective namespace writes route to. `null` when no overlay applies. */\n effectiveNamespace: string | null;\n /** Read fallbacks included in recall (non-empty only when branch-scope is on). */\n readFallbacks: string[];\n /**\n * Why no overlay applies, when `scope === \"none\"`. One of:\n * - `\"no-context\"` — connector didn't attach a CodingContext\n * - `\"disabled\"` — codingMode.projectScope is false\n * - `\"empty-project\"` — codingContext.projectId was empty/whitespace\n */\n disabledReason: \"no-context\" | \"disabled\" | \"empty-project\" | null;\n}\n\n/**\n * Human-readable description of the coding-agent scope that currently applies\n * for a session. Consumed by `remnic doctor` (PR 8) and by logs to surface\n * why recall routes where it does.\n *\n * Pure — callers pass the coding context + config they already have.\n */\nexport function describeCodingScope(\n codingContext: CodingContext | null | undefined,\n config: Pick<CodingModeConfig, \"projectScope\" | \"branchScope\" | \"globalFallback\">,\n defaultNamespace?: string,\n): CodingScopeDescription {\n const projectId = codingContext?.projectId ?? null;\n const branch = codingContext?.branch ?? null;\n\n if (!codingContext) {\n return {\n scope: \"none\",\n projectId: null,\n branch: null,\n effectiveNamespace: null,\n readFallbacks: [],\n disabledReason: \"no-context\",\n };\n }\n if (!config.projectScope) {\n return {\n scope: \"none\",\n projectId,\n branch,\n effectiveNamespace: null,\n readFallbacks: [],\n disabledReason: \"disabled\",\n };\n }\n const trimmedId = typeof projectId === \"string\" ? projectId.trim() : \"\";\n if (!trimmedId) {\n return {\n scope: \"none\",\n projectId,\n branch,\n effectiveNamespace: null,\n readFallbacks: [],\n disabledReason: \"empty-project\",\n };\n }\n\n const overlay = resolveCodingNamespaceOverlay(codingContext, config, defaultNamespace);\n // Unreachable in practice given the guards above, but keep the return\n // shape consistent if the resolver grows new null branches later.\n if (!overlay) {\n return {\n scope: \"none\",\n projectId,\n branch,\n effectiveNamespace: null,\n readFallbacks: [],\n disabledReason: \"disabled\",\n };\n }\n return {\n scope: overlay.scope,\n projectId,\n branch,\n effectiveNamespace: overlay.namespace,\n readFallbacks: overlay.readFallbacks,\n disabledReason: null,\n };\n}\n","/**\n * Generic reinforcement-core primitives extracted from `procedure-miner.ts`\n * (issue #687 PR 1/4). Procedure-specific scoring (success rate, step\n * normalization) intentionally stays in the miner — this module only\n * exposes category-agnostic clustering and cluster summarization helpers\n * so future PRs can run reinforcement across non-procedural categories.\n *\n * Pure refactor — no behavior change.\n */\n\n/**\n * Group `items` into clusters keyed by `keyFn(item)`.\n *\n * - Preserves the original input order within each cluster's array.\n * - The returned `Map` insertion order matches first-seen key order, so\n * downstream iteration is deterministic for a given input.\n * - Throws `TypeError` if `keyFn` returns a non-string (e.g. `undefined`,\n * `null`, or a number). Callers must produce a stable string key.\n */\nexport function clusterByKey<T>(items: readonly T[], keyFn: (item: T) => string): Map<string, T[]> {\n const clusters = new Map<string, T[]>();\n for (const item of items) {\n const key = keyFn(item);\n if (typeof key !== \"string\") {\n throw new TypeError(\n `clusterByKey: keyFn must return a string, got ${key === null ? \"null\" : typeof key}`,\n );\n }\n const existing = clusters.get(key);\n if (existing) {\n existing.push(item);\n } else {\n clusters.set(key, [item]);\n }\n }\n return clusters;\n}\n\nexport interface ClusterSummary {\n /** Number of items in the cluster. */\n count: number;\n /** Earliest timestamp seen in the cluster (string min via `localeCompare`). */\n firstSeen: string;\n /** Latest timestamp seen in the cluster (string max via `localeCompare`). */\n lastSeen: string;\n}\n\n/**\n * Summarize a cluster by counting items and tracking earliest/latest\n * timestamps. Timestamp comparison uses `String#localeCompare`, which is\n * correct for ISO-8601 strings (lexicographic order matches chronological\n * order).\n *\n * - Throws `RangeError` on empty clusters — `firstSeen`/`lastSeen` are not\n * meaningful without at least one item.\n * - When all timestamps are equal, `firstSeen === lastSeen`.\n */\nexport function summarizeCluster<T>(\n cluster: readonly T[],\n extractTimestamp: (item: T) => string,\n): ClusterSummary {\n if (cluster.length === 0) {\n throw new RangeError(\"summarizeCluster: cluster must contain at least one item\");\n }\n let firstSeen = extractTimestamp(cluster[0]);\n let lastSeen = firstSeen;\n for (let i = 1; i < cluster.length; i += 1) {\n const ts = extractTimestamp(cluster[i]);\n if (ts.localeCompare(firstSeen) < 0) firstSeen = ts;\n if (ts.localeCompare(lastSeen) > 0) lastSeen = ts;\n }\n return { count: cluster.length, firstSeen, lastSeen };\n}\n"],"mappings":"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","names":[]}
@@ -61,21 +61,28 @@ function applyWorkExtractionBoundary(conversation) {
61
61
  let strippedUnterminated = bounded;
62
62
  const opener = "[WORK_LAYER_CONTEXT";
63
63
  const closer = "[/WORK_LAYER_CONTEXT]";
64
- const lastOpenerIdx = bounded.lastIndexOf(opener);
65
- if (lastOpenerIdx >= 0) {
66
- const isLineStart = lastOpenerIdx === 0 || bounded[lastOpenerIdx - 1] === "\n";
67
- if (isLineStart) {
68
- const afterOpener = bounded.indexOf("]", lastOpenerIdx);
69
- if (afterOpener >= 0) {
70
- const closerAfter = bounded.indexOf(closer, afterOpener);
71
- if (closerAfter < 0) {
72
- const bracketContent = bounded.substring(lastOpenerIdx, afterOpener + 1);
73
- if (bracketContent.includes("link_to_memory=") || bracketContent.includes("encoding=")) {
74
- strippedUnterminated = lastOpenerIdx > 0 ? bounded.substring(0, lastOpenerIdx - 1) : "";
75
- }
76
- }
77
- }
64
+ let unterminatedSearchFrom = 0;
65
+ while (true) {
66
+ const openerIdx = bounded.indexOf(opener, unterminatedSearchFrom);
67
+ if (openerIdx < 0) break;
68
+ const isLineStart = openerIdx === 0 || bounded[openerIdx - 1] === "\n";
69
+ if (!isLineStart) {
70
+ unterminatedSearchFrom = openerIdx + opener.length;
71
+ continue;
72
+ }
73
+ const afterOpener = bounded.indexOf("]", openerIdx);
74
+ const bracketContent = afterOpener >= 0 ? bounded.substring(openerIdx, afterOpener + 1) : bounded.substring(openerIdx);
75
+ const hasWrapperMetadata = bracketContent.includes("link_to_memory=") || bracketContent.includes("encoding=");
76
+ if (!hasWrapperMetadata) {
77
+ unterminatedSearchFrom = openerIdx + opener.length;
78
+ continue;
79
+ }
80
+ const closerAfter = afterOpener >= 0 ? bounded.indexOf(closer, afterOpener) : -1;
81
+ if (closerAfter < 0) {
82
+ strippedUnterminated = openerIdx > 0 ? bounded.substring(0, openerIdx - 1) : "";
83
+ break;
78
84
  }
85
+ unterminatedSearchFrom = closerAfter + closer.length;
79
86
  }
80
87
  const restoredEscapes = strippedUnterminated.replaceAll(WORK_LAYER_CONTEXT_ESCAPED_OPEN, WORK_LAYER_CONTEXT_OPEN).replaceAll(WORK_LAYER_CONTEXT_ESCAPED_CLOSE, WORK_LAYER_CONTEXT_CLOSE);
81
88
  const cleanedLines = restoredEscapes.split("\n").map((line) => line.trimEnd());
@@ -88,4 +95,4 @@ export {
88
95
  wrapWorkLayerContext,
89
96
  applyWorkExtractionBoundary
90
97
  };
91
- //# sourceMappingURL=chunk-RRF5UOBJ.js.map
98
+ //# sourceMappingURL=chunk-EI6V5UXY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/work/boundary.ts"],"sourcesContent":["export const WORK_LAYER_CONTEXT_OPEN = \"[WORK_LAYER_CONTEXT\";\nexport const WORK_LAYER_CONTEXT_CLOSE = \"[/WORK_LAYER_CONTEXT]\";\nconst WORK_LAYER_CONTEXT_ESCAPED_OPEN = \"[WORK_LAYER_ESCAPED_CONTEXT\";\nconst WORK_LAYER_CONTEXT_ESCAPED_CLOSE = \"[/WORK_LAYER_CONTEXT_ESC]\";\n\nexport function wrapWorkLayerContext(content: string, options?: { linkToMemory?: boolean }): string {\n const linkToMemory = options?.linkToMemory === true;\n const header = `${WORK_LAYER_CONTEXT_OPEN} link_to_memory=${linkToMemory ? \"true\" : \"false\"}]`;\n const payload = content\n .trim()\n .replaceAll(WORK_LAYER_CONTEXT_OPEN, WORK_LAYER_CONTEXT_ESCAPED_OPEN)\n .replaceAll(WORK_LAYER_CONTEXT_CLOSE, WORK_LAYER_CONTEXT_ESCAPED_CLOSE);\n return `${header}\\n${payload}\\n${WORK_LAYER_CONTEXT_CLOSE}`;\n}\n\nexport function applyWorkExtractionBoundary(conversation: string): string {\n if (conversation.trim().length === 0) return \"\";\n\n // Replace work-layer blocks using indexOf to avoid backtracking regex.\n let bounded = conversation;\n const OPEN_TAG = \"[WORK_LAYER_CONTEXT\";\n const CLOSE_TAG = \"[/WORK_LAYER_CONTEXT]\";\n let searchFrom = 0;\n while (true) {\n const openIdx = bounded.indexOf(OPEN_TAG, searchFrom);\n if (openIdx < 0) break;\n // Require line-start anchor\n if (openIdx > 0 && bounded[openIdx - 1] !== \"\\n\") {\n searchFrom = openIdx + OPEN_TAG.length;\n continue;\n }\n const closeBracket = bounded.indexOf(\"]\", openIdx + OPEN_TAG.length);\n if (closeBracket < 0) break;\n const header = bounded.substring(openIdx + OPEN_TAG.length, closeBracket);\n const closeIdx = bounded.indexOf(CLOSE_TAG, closeBracket + 1);\n if (closeIdx < 0) break;\n // Parse attributes from header\n const flagMatch = header.match(/\\blink_to_memory=(true|false)/);\n const encMatch = header.match(/\\bencoding=(base64)/);\n const flag = flagMatch?.[1];\n const encoding = encMatch?.[1];\n // Extract body (between ] and closer)\n let bodyStart = closeBracket + 1;\n if (bounded[bodyStart] === \"\\n\") bodyStart++;\n let bodyEnd = closeIdx;\n if (bodyEnd > bodyStart && bounded[bodyEnd - 1] === \"\\n\") bodyEnd--;\n const body = bounded.substring(bodyStart, bodyEnd);\n const shouldLink = flag === \"true\";\n const prefix = openIdx > 0 ? bounded.substring(0, openIdx) : \"\";\n const suffix = bounded.substring(closeIdx + CLOSE_TAG.length);\n if (!shouldLink) {\n bounded = prefix + suffix;\n searchFrom = prefix.length;\n } else if (encoding === \"base64\") {\n try {\n const decoded = Buffer.from(body.trim(), \"base64\").toString(\"utf8\").trim();\n bounded = prefix + decoded + suffix;\n searchFrom = prefix.length + decoded.length;\n } catch {\n bounded = prefix + suffix;\n searchFrom = prefix.length;\n }\n } else {\n bounded = prefix + body.trim() + suffix;\n searchFrom = prefix.length + body.trim().length;\n }\n }\n\n // Defensive hardening: if a *real wrapper opener* survives without a closer (e.g., turn-level truncation),\n // strip everything from the opener onward to avoid leaking excluded work-layer payloads.\n // Keep literal \"[WORK_LAYER_CONTEXT\" text unless it contains wrapper metadata attributes.\n // Strip unterminated work-layer openers using indexOf for safety (avoids backtracking).\n // Only match openers at the start of a line (like the original ^|\\n anchor).\n let strippedUnterminated = bounded;\n const opener = \"[WORK_LAYER_CONTEXT\";\n const closer = \"[/WORK_LAYER_CONTEXT]\";\n let unterminatedSearchFrom = 0;\n while (true) {\n const openerIdx = bounded.indexOf(opener, unterminatedSearchFrom);\n if (openerIdx < 0) break;\n\n const isLineStart = openerIdx === 0 || bounded[openerIdx - 1] === \"\\n\";\n if (!isLineStart) {\n unterminatedSearchFrom = openerIdx + opener.length;\n continue;\n }\n\n const afterOpener = bounded.indexOf(\"]\", openerIdx);\n const bracketContent = afterOpener >= 0\n ? bounded.substring(openerIdx, afterOpener + 1)\n : bounded.substring(openerIdx);\n const hasWrapperMetadata =\n bracketContent.includes(\"link_to_memory=\") || bracketContent.includes(\"encoding=\");\n if (!hasWrapperMetadata) {\n unterminatedSearchFrom = openerIdx + opener.length;\n continue;\n }\n\n const closerAfter = afterOpener >= 0 ? bounded.indexOf(closer, afterOpener) : -1;\n if (closerAfter < 0) {\n strippedUnterminated = openerIdx > 0\n ? bounded.substring(0, openerIdx - 1) // exclude the preceding \\n\n : \"\";\n break;\n }\n\n unterminatedSearchFrom = closerAfter + closer.length;\n }\n\n const restoredEscapes = strippedUnterminated\n .replaceAll(WORK_LAYER_CONTEXT_ESCAPED_OPEN, WORK_LAYER_CONTEXT_OPEN)\n .replaceAll(WORK_LAYER_CONTEXT_ESCAPED_CLOSE, WORK_LAYER_CONTEXT_CLOSE);\n\n const cleanedLines = restoredEscapes\n .split(\"\\n\")\n .map((line) => line.trimEnd());\n\n return cleanedLines.join(\"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n"],"mappings":"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","names":[]}
@@ -1,30 +1,30 @@
1
+ import {
2
+ LanceDbBackend
3
+ } from "./chunk-A52AKD7C.js";
4
+ import {
5
+ MeilisearchBackend
6
+ } from "./chunk-RCTS5CKK.js";
1
7
  import {
2
8
  NoopSearchBackend
3
9
  } from "./chunk-NJ3MJQZX.js";
4
10
  import {
5
11
  OramaBackend
6
- } from "./chunk-XVVIG67A.js";
12
+ } from "./chunk-BLZAVUD2.js";
7
13
  import {
8
14
  RemoteSearchBackend
9
15
  } from "./chunk-PIRJPV5T.js";
10
16
  import {
11
17
  EmbedHelper
12
- } from "./chunk-RXDLTSWT.js";
13
- import {
14
- LanceDbBackend
15
- } from "./chunk-3VAL7ZL2.js";
16
- import {
17
- MeilisearchBackend
18
- } from "./chunk-TMQLARTH.js";
18
+ } from "./chunk-ONPLNAPX.js";
19
19
  import {
20
20
  createConversationIndexBackend
21
- } from "./chunk-CYFQJMUV.js";
21
+ } from "./chunk-KIB7SDIJ.js";
22
22
  import {
23
23
  FaissConversationIndexAdapter
24
- } from "./chunk-FJ43PRLT.js";
24
+ } from "./chunk-ORFGK3XI.js";
25
25
  import {
26
26
  QmdClient
27
- } from "./chunk-3TNBOMQT.js";
27
+ } from "./chunk-TVRN5QKH.js";
28
28
  import {
29
29
  log
30
30
  } from "./chunk-2ODBA7MQ.js";
@@ -129,18 +129,25 @@ function createConversationSearchBackend(config) {
129
129
  }
130
130
  function createConversationIndexRuntime(config, overrides) {
131
131
  const qmd = createConversationSearchBackend(config);
132
- const faiss = config.conversationIndexEnabled && config.conversationIndexBackend === "faiss" ? new FaissConversationIndexAdapter({
133
- memoryDir: config.memoryDir,
134
- scriptPath: config.conversationIndexFaissScriptPath,
135
- pythonBin: config.conversationIndexFaissPythonBin,
136
- modelId: config.conversationIndexFaissModelId,
137
- indexDir: config.conversationIndexFaissIndexDir,
138
- upsertTimeoutMs: config.conversationIndexFaissUpsertTimeoutMs,
139
- searchTimeoutMs: config.conversationIndexFaissSearchTimeoutMs,
140
- healthTimeoutMs: config.conversationIndexFaissHealthTimeoutMs,
141
- maxBatchSize: config.conversationIndexFaissMaxBatchSize,
142
- maxSearchK: config.conversationIndexFaissMaxSearchK
143
- }) : void 0;
132
+ let faiss;
133
+ if (config.conversationIndexEnabled && config.conversationIndexBackend === "faiss") {
134
+ try {
135
+ faiss = new FaissConversationIndexAdapter({
136
+ memoryDir: config.memoryDir,
137
+ scriptPath: config.conversationIndexFaissScriptPath,
138
+ pythonBin: config.conversationIndexFaissPythonBin,
139
+ modelId: config.conversationIndexFaissModelId,
140
+ indexDir: config.conversationIndexFaissIndexDir,
141
+ upsertTimeoutMs: config.conversationIndexFaissUpsertTimeoutMs,
142
+ searchTimeoutMs: config.conversationIndexFaissSearchTimeoutMs,
143
+ healthTimeoutMs: config.conversationIndexFaissHealthTimeoutMs,
144
+ maxBatchSize: config.conversationIndexFaissMaxBatchSize,
145
+ maxSearchK: config.conversationIndexFaissMaxSearchK
146
+ });
147
+ } catch (err) {
148
+ log.warn(`Conversation index FAISS adapter disabled: ${err instanceof Error ? err.message : String(err)}`);
149
+ }
150
+ }
144
151
  const backend = createConversationIndexBackend({
145
152
  enabled: config.conversationIndexEnabled,
146
153
  backend: config.conversationIndexBackend,
@@ -156,4 +163,4 @@ export {
156
163
  createConversationSearchBackend,
157
164
  createConversationIndexRuntime
158
165
  };
159
- //# sourceMappingURL=chunk-I5GLV3VE.js.map
166
+ //# sourceMappingURL=chunk-EIPUHVKE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search/factory.ts"],"sourcesContent":["import type { PluginConfig } from \"../types.js\";\nimport type { SearchBackend } from \"./port.js\";\nimport path from \"node:path\";\nimport { NoopSearchBackend } from \"./noop-backend.js\";\nimport { RemoteSearchBackend } from \"./remote-backend.js\";\nimport { LanceDbBackend } from \"./lancedb-backend.js\";\nimport { MeilisearchBackend } from \"./meilisearch-backend.js\";\nimport { OramaBackend } from \"./orama-backend.js\";\nimport { EmbedHelper } from \"./embed-helper.js\";\nimport { QmdClient, type QmdClientOptions } from \"../qmd.js\";\nimport { log } from \"../logger.js\";\nimport { FaissConversationIndexAdapter } from \"../conversation-index/faiss-adapter.js\";\nimport {\n createConversationIndexBackend,\n type ConversationIndexBackend,\n type ConversationQmdRuntime,\n} from \"../conversation-index/backend.js\";\n\n/**\n * Resolve non-QMD backends from config.\n * Returns a SearchBackend for \"noop\" or \"remote\", or undefined to signal \"use QMD\".\n */\nfunction resolveNonQmdBackend(config: PluginConfig): SearchBackend | undefined {\n const backend = config.searchBackend ?? \"qmd\";\n const collection = config.qmdCollection;\n\n if (backend === \"noop\") {\n return new NoopSearchBackend();\n }\n\n if (backend === \"remote\") {\n const baseUrl = config.remoteSearchBaseUrl || \"http://localhost:8181\";\n if (!config.remoteSearchBaseUrl) {\n log.warn(\"searchBackend is 'remote' but remoteSearchBaseUrl is not configured; using default http://localhost:8181\");\n }\n return new RemoteSearchBackend({\n baseUrl,\n apiKey: config.remoteSearchApiKey,\n timeoutMs: config.remoteSearchTimeoutMs,\n });\n }\n\n if (backend === \"lancedb\") {\n const embedHelper = new EmbedHelper(config);\n return new LanceDbBackend({\n dbPath: config.lanceDbPath!,\n collection,\n embedHelper,\n memoryDir: config.memoryDir,\n embeddingDimension: config.lanceEmbeddingDimension!,\n });\n }\n\n if (backend === \"meilisearch\") {\n return new MeilisearchBackend({\n host: config.meilisearchHost!,\n apiKey: config.meilisearchApiKey,\n collection,\n timeoutMs: config.meilisearchTimeoutMs,\n autoIndex: config.meilisearchAutoIndex,\n memoryDir: config.memoryDir,\n });\n }\n\n if (backend === \"orama\") {\n const embedHelper = new EmbedHelper(config);\n return new OramaBackend({\n dbPath: config.oramaDbPath!,\n collection,\n embedHelper,\n memoryDir: config.memoryDir,\n embeddingDimension: config.oramaEmbeddingDimension!,\n });\n }\n\n return undefined;\n}\n\n/** Shared QMD options derived from plugin config. */\nfunction qmdOptions(config: PluginConfig): QmdClientOptions {\n return {\n slowLog: {\n enabled: config.slowLogEnabled,\n thresholdMs: config.slowLogThresholdMs,\n },\n updateTimeoutMs: config.qmdUpdateTimeoutMs,\n updateMinIntervalMs: config.qmdUpdateMinIntervalMs,\n qmdPath: config.qmdPath,\n daemonUrl: config.qmdDaemonEnabled ? config.qmdDaemonUrl : undefined,\n daemonRecheckIntervalMs: config.qmdDaemonRecheckIntervalMs,\n qmdSupportedVersion: config.qmdSupportedVersion,\n qmdAutoUpgradeEnabled: config.qmdAutoUpgradeEnabled,\n qmdAutoUpgradeCheckIntervalMs: config.qmdAutoUpgradeCheckIntervalMs,\n qmdChunkStrategy: config.qmdChunkStrategy,\n qmdCandidateLimit: config.qmdCandidateLimit,\n qmdQueryRerankEnabled: config.qmdQueryRerankEnabled,\n qmdIndexName: config.qmdIndexName,\n qmdForceCpu: config.qmdForceCpu,\n qmdGpuBackend: config.qmdGpuBackend,\n qmdEmbedParallelism: config.qmdEmbedParallelism,\n qmdEmbedModel: config.qmdEmbedModel,\n qmdRerankModel: config.qmdRerankModel,\n qmdGenerateModel: config.qmdGenerateModel,\n };\n}\n\n/**\n * Create a SearchBackend from plugin config.\n *\n * - \"noop\" → NoopSearchBackend\n * - \"remote\" → RemoteSearchBackend (HTTP REST)\n * - \"qmd\" (default) → QmdClient if qmdEnabled, else NoopSearchBackend\n */\nexport function createSearchBackend(config: PluginConfig): SearchBackend {\n const nonQmd = resolveNonQmdBackend(config);\n if (nonQmd) return nonQmd;\n\n // Default: QMD — fall back to noop if qmdEnabled is false\n if (!config.qmdEnabled) {\n return new NoopSearchBackend();\n }\n\n return new QmdClient(config.qmdCollection, config.qmdMaxResults, qmdOptions(config));\n}\n\n/**\n * Create a SearchBackend for conversation index use.\n * Returns undefined if conversation index is not enabled or not using qmd backend.\n */\nexport function createConversationSearchBackend(config: PluginConfig): SearchBackend | undefined {\n if (!config.conversationIndexEnabled || config.conversationIndexBackend !== \"qmd\") {\n return undefined;\n }\n\n // Conversation index is QMD-only — do not use lancedb/meilisearch/orama even if\n // searchBackend is set to one of those. Only respect \"noop\" to allow disabling.\n const backend = config.searchBackend ?? \"qmd\";\n if (backend === \"noop\") return undefined;\n\n // QMD — respect qmdEnabled to avoid spawning the binary\n if (!config.qmdEnabled) return undefined;\n\n return new QmdClient(\n config.conversationIndexQmdCollection,\n Math.max(6, config.conversationRecallTopK),\n qmdOptions(config),\n );\n}\n\nexport interface ConversationIndexRuntime {\n qmd?: ConversationQmdRuntime;\n faiss?: FaissConversationIndexAdapter;\n backend?: ConversationIndexBackend;\n}\n\nexport function createConversationIndexRuntime(\n config: PluginConfig,\n overrides?: {\n getQmd?: () => ConversationQmdRuntime | undefined;\n getFaiss?: () => FaissConversationIndexAdapter | undefined;\n },\n): ConversationIndexRuntime {\n const qmd = createConversationSearchBackend(config) as ConversationQmdRuntime | undefined;\n const faiss =\n config.conversationIndexEnabled && config.conversationIndexBackend === \"faiss\"\n ? new FaissConversationIndexAdapter({\n memoryDir: config.memoryDir,\n scriptPath: config.conversationIndexFaissScriptPath,\n pythonBin: config.conversationIndexFaissPythonBin,\n modelId: config.conversationIndexFaissModelId,\n indexDir: config.conversationIndexFaissIndexDir,\n upsertTimeoutMs: config.conversationIndexFaissUpsertTimeoutMs,\n searchTimeoutMs: config.conversationIndexFaissSearchTimeoutMs,\n healthTimeoutMs: config.conversationIndexFaissHealthTimeoutMs,\n maxBatchSize: config.conversationIndexFaissMaxBatchSize,\n maxSearchK: config.conversationIndexFaissMaxSearchK,\n })\n : undefined;\n\n const backend = createConversationIndexBackend({\n enabled: config.conversationIndexEnabled,\n backend: config.conversationIndexBackend,\n getQmd: () => overrides?.getQmd?.() ?? qmd,\n getFaiss: () => overrides?.getFaiss?.() ?? faiss,\n collectionDir: path.join(config.memoryDir, \"conversation-index\"),\n });\n\n return { qmd, faiss, backend };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/search/factory.ts"],"sourcesContent":["import type { PluginConfig } from \"../types.js\";\nimport type { SearchBackend } from \"./port.js\";\nimport path from \"node:path\";\nimport { NoopSearchBackend } from \"./noop-backend.js\";\nimport { RemoteSearchBackend } from \"./remote-backend.js\";\nimport { LanceDbBackend } from \"./lancedb-backend.js\";\nimport { MeilisearchBackend } from \"./meilisearch-backend.js\";\nimport { OramaBackend } from \"./orama-backend.js\";\nimport { EmbedHelper } from \"./embed-helper.js\";\nimport { QmdClient, type QmdClientOptions } from \"../qmd.js\";\nimport { log } from \"../logger.js\";\nimport { FaissConversationIndexAdapter } from \"../conversation-index/faiss-adapter.js\";\nimport {\n createConversationIndexBackend,\n type ConversationIndexBackend,\n type ConversationQmdRuntime,\n} from \"../conversation-index/backend.js\";\n\n/**\n * Resolve non-QMD backends from config.\n * Returns a SearchBackend for \"noop\" or \"remote\", or undefined to signal \"use QMD\".\n */\nfunction resolveNonQmdBackend(config: PluginConfig): SearchBackend | undefined {\n const backend = config.searchBackend ?? \"qmd\";\n const collection = config.qmdCollection;\n\n if (backend === \"noop\") {\n return new NoopSearchBackend();\n }\n\n if (backend === \"remote\") {\n const baseUrl = config.remoteSearchBaseUrl || \"http://localhost:8181\";\n if (!config.remoteSearchBaseUrl) {\n log.warn(\"searchBackend is 'remote' but remoteSearchBaseUrl is not configured; using default http://localhost:8181\");\n }\n return new RemoteSearchBackend({\n baseUrl,\n apiKey: config.remoteSearchApiKey,\n timeoutMs: config.remoteSearchTimeoutMs,\n });\n }\n\n if (backend === \"lancedb\") {\n const embedHelper = new EmbedHelper(config);\n return new LanceDbBackend({\n dbPath: config.lanceDbPath!,\n collection,\n embedHelper,\n memoryDir: config.memoryDir,\n embeddingDimension: config.lanceEmbeddingDimension!,\n });\n }\n\n if (backend === \"meilisearch\") {\n return new MeilisearchBackend({\n host: config.meilisearchHost!,\n apiKey: config.meilisearchApiKey,\n collection,\n timeoutMs: config.meilisearchTimeoutMs,\n autoIndex: config.meilisearchAutoIndex,\n memoryDir: config.memoryDir,\n });\n }\n\n if (backend === \"orama\") {\n const embedHelper = new EmbedHelper(config);\n return new OramaBackend({\n dbPath: config.oramaDbPath!,\n collection,\n embedHelper,\n memoryDir: config.memoryDir,\n embeddingDimension: config.oramaEmbeddingDimension!,\n });\n }\n\n return undefined;\n}\n\n/** Shared QMD options derived from plugin config. */\nfunction qmdOptions(config: PluginConfig): QmdClientOptions {\n return {\n slowLog: {\n enabled: config.slowLogEnabled,\n thresholdMs: config.slowLogThresholdMs,\n },\n updateTimeoutMs: config.qmdUpdateTimeoutMs,\n updateMinIntervalMs: config.qmdUpdateMinIntervalMs,\n qmdPath: config.qmdPath,\n daemonUrl: config.qmdDaemonEnabled ? config.qmdDaemonUrl : undefined,\n daemonRecheckIntervalMs: config.qmdDaemonRecheckIntervalMs,\n qmdSupportedVersion: config.qmdSupportedVersion,\n qmdAutoUpgradeEnabled: config.qmdAutoUpgradeEnabled,\n qmdAutoUpgradeCheckIntervalMs: config.qmdAutoUpgradeCheckIntervalMs,\n qmdChunkStrategy: config.qmdChunkStrategy,\n qmdCandidateLimit: config.qmdCandidateLimit,\n qmdQueryRerankEnabled: config.qmdQueryRerankEnabled,\n qmdIndexName: config.qmdIndexName,\n qmdForceCpu: config.qmdForceCpu,\n qmdGpuBackend: config.qmdGpuBackend,\n qmdEmbedParallelism: config.qmdEmbedParallelism,\n qmdEmbedModel: config.qmdEmbedModel,\n qmdRerankModel: config.qmdRerankModel,\n qmdGenerateModel: config.qmdGenerateModel,\n };\n}\n\n/**\n * Create a SearchBackend from plugin config.\n *\n * - \"noop\" → NoopSearchBackend\n * - \"remote\" → RemoteSearchBackend (HTTP REST)\n * - \"qmd\" (default) → QmdClient if qmdEnabled, else NoopSearchBackend\n */\nexport function createSearchBackend(config: PluginConfig): SearchBackend {\n const nonQmd = resolveNonQmdBackend(config);\n if (nonQmd) return nonQmd;\n\n // Default: QMD — fall back to noop if qmdEnabled is false\n if (!config.qmdEnabled) {\n return new NoopSearchBackend();\n }\n\n return new QmdClient(config.qmdCollection, config.qmdMaxResults, qmdOptions(config));\n}\n\n/**\n * Create a SearchBackend for conversation index use.\n * Returns undefined if conversation index is not enabled or not using qmd backend.\n */\nexport function createConversationSearchBackend(config: PluginConfig): SearchBackend | undefined {\n if (!config.conversationIndexEnabled || config.conversationIndexBackend !== \"qmd\") {\n return undefined;\n }\n\n // Conversation index is QMD-only — do not use lancedb/meilisearch/orama even if\n // searchBackend is set to one of those. Only respect \"noop\" to allow disabling.\n const backend = config.searchBackend ?? \"qmd\";\n if (backend === \"noop\") return undefined;\n\n // QMD — respect qmdEnabled to avoid spawning the binary\n if (!config.qmdEnabled) return undefined;\n\n return new QmdClient(\n config.conversationIndexQmdCollection,\n Math.max(6, config.conversationRecallTopK),\n qmdOptions(config),\n );\n}\n\nexport interface ConversationIndexRuntime {\n qmd?: ConversationQmdRuntime;\n faiss?: FaissConversationIndexAdapter;\n backend?: ConversationIndexBackend;\n}\n\nexport function createConversationIndexRuntime(\n config: PluginConfig,\n overrides?: {\n getQmd?: () => ConversationQmdRuntime | undefined;\n getFaiss?: () => FaissConversationIndexAdapter | undefined;\n },\n): ConversationIndexRuntime {\n const qmd = createConversationSearchBackend(config) as ConversationQmdRuntime | undefined;\n let faiss: FaissConversationIndexAdapter | undefined;\n if (config.conversationIndexEnabled && config.conversationIndexBackend === \"faiss\") {\n try {\n faiss = new FaissConversationIndexAdapter({\n memoryDir: config.memoryDir,\n scriptPath: config.conversationIndexFaissScriptPath,\n pythonBin: config.conversationIndexFaissPythonBin,\n modelId: config.conversationIndexFaissModelId,\n indexDir: config.conversationIndexFaissIndexDir,\n upsertTimeoutMs: config.conversationIndexFaissUpsertTimeoutMs,\n searchTimeoutMs: config.conversationIndexFaissSearchTimeoutMs,\n healthTimeoutMs: config.conversationIndexFaissHealthTimeoutMs,\n maxBatchSize: config.conversationIndexFaissMaxBatchSize,\n maxSearchK: config.conversationIndexFaissMaxSearchK,\n });\n } catch (err) {\n log.warn(`Conversation index FAISS adapter disabled: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n const backend = createConversationIndexBackend({\n enabled: config.conversationIndexEnabled,\n backend: config.conversationIndexBackend,\n getQmd: () => overrides?.getQmd?.() ?? qmd,\n getFaiss: () => overrides?.getFaiss?.() ?? faiss,\n collectionDir: path.join(config.memoryDir, \"conversation-index\"),\n });\n\n return { qmd, faiss, backend };\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  WORK_ID_PATTERN,
3
3
  WorkStorage
4
- } from "./chunk-WELDCG6C.js";
4
+ } from "./chunk-L227SKTB.js";
5
5
 
6
6
  // src/work/board.ts
7
7
  var BOARD_STATUS_ORDER = [
@@ -266,4 +266,4 @@ export {
266
266
  exportWorkBoardMarkdown,
267
267
  importWorkBoardSnapshot
268
268
  };
269
- //# sourceMappingURL=chunk-ZKSK55RC.js.map
269
+ //# sourceMappingURL=chunk-ETUPBUHB.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- isSafeRouteNamespace
3
- } from "./chunk-U3PN77QT.js";
4
1
  import {
5
2
  sanitizeMemoryContent
6
3
  } from "./chunk-FVQJYWH7.js";
4
+ import {
5
+ isSafeRouteNamespace
6
+ } from "./chunk-U3PN77QT.js";
7
7
 
8
8
  // src/explicit-capture.ts
9
9
  import { randomUUID } from "crypto";
@@ -147,6 +147,14 @@ function parseExplicitCaptureTtl(ttl) {
147
147
  const multiplier = unit === "m" ? 6e4 : unit === "h" ? 60 * 6e4 : unit === "d" ? 24 * 60 * 6e4 : 7 * 24 * 60 * 6e4;
148
148
  return new Date(Date.now() + amount * multiplier).toISOString();
149
149
  }
150
+ function parseInlineConfidence(value) {
151
+ const trimmed = value.trim();
152
+ if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(trimmed)) {
153
+ return Number.NaN;
154
+ }
155
+ const parsed = Number(trimmed);
156
+ return Number.isFinite(parsed) ? parsed : Number.NaN;
157
+ }
150
158
  function parseInlineNote(block) {
151
159
  const lines = block.replace(/\r/g, "").split("\n");
152
160
  const note = {};
@@ -187,7 +195,7 @@ function parseInlineNote(block) {
187
195
  note.category = value;
188
196
  break;
189
197
  case "confidence":
190
- note.confidence = Number.parseFloat(value);
198
+ note.confidence = parseInlineConfidence(value);
191
199
  break;
192
200
  case "namespace":
193
201
  note.namespace = value;
@@ -251,7 +259,10 @@ function validateExplicitCaptureInput(input, mode = "strict_explicit") {
251
259
  assertNoSecretLikeMetadata("entityRef", input.entityRef);
252
260
  assertNoSecretLikeMetadata("ttl", input.ttl);
253
261
  assertNoSecretLikeMetadataList("tags", input.tags);
254
- const confidence = Number.isFinite(input.confidence) ? Number(input.confidence) : 0.95;
262
+ if (input.confidence !== void 0 && !Number.isFinite(input.confidence)) {
263
+ throw new Error("confidence must be a finite number");
264
+ }
265
+ const confidence = input.confidence === void 0 ? 0.95 : Number(input.confidence);
255
266
  if (confidence < 0 || confidence > 1) {
256
267
  throw new Error("confidence must be between 0 and 1");
257
268
  }
@@ -424,4 +435,4 @@ export {
424
435
  shouldSkipImplicitExtraction,
425
436
  shouldProcessInlineExplicitCapture
426
437
  };
427
- //# sourceMappingURL=chunk-25MQ7IHJ.js.map
438
+ //# sourceMappingURL=chunk-EUML3N6B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/explicit-capture.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { Orchestrator } from \"./orchestrator.js\";\nimport { isSafeRouteNamespace } from \"./routing/engine.js\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport { ContentHashIndex } from \"./storage.js\";\nimport type { CaptureMode, MemoryCategory, MemoryLifecycleEvent, PluginConfig } from \"./types.js\";\n\nexport type ExplicitCaptureInput = {\n content: string;\n category?: string;\n confidence?: number;\n namespace?: string;\n tags?: string[];\n entityRef?: string;\n ttl?: string;\n sourceReason?: string;\n};\n\nexport type ValidExplicitCapture = {\n content: string;\n category: MemoryCategory;\n confidence: number;\n namespace?: string;\n tags: string[];\n entityRef?: string;\n expiresAt?: string;\n sourceReason?: string;\n};\n\nexport type ExplicitCaptureSource = \"memory_store\" | \"memory_capture\" | \"suggestion_submit\" | \"inline\";\ntype ExplicitCaptureValidationMode = \"legacy_tool\" | \"strict_explicit\";\n\nconst INLINE_NOTE_RE = /<memory_note>\\s*([\\s\\S]*?)\\s*<\\/memory_note>/gi;\nconst INLINE_NOTE_MARKUP_RE = /<memory_note>\\s*[\\s\\S]*?\\s*<\\/memory_note>/i;\nconst INLINE_ALLOWED_CATEGORIES = new Set<MemoryCategory>([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n]);\n\nconst SECRET_PATTERNS: RegExp[] = [\n /\\bsk-[A-Za-z0-9]{16,}\\b/,\n /\\bAKIA[0-9A-Z]{16}\\b/,\n /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/i,\n /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/i,\n /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/i,\n];\nconst SECRET_REDACTION_PATTERNS: Array<{ pattern: RegExp; replacement: string }> = [\n { pattern: /\\bsk-[A-Za-z0-9]{16,}\\b/g, replacement: \"[redacted openai key]\" },\n { pattern: /\\bAKIA[0-9A-Z]{16}\\b/g, replacement: \"[redacted aws key]\" },\n { pattern: /\\bBearer\\s+[A-Za-z0-9._-]{16,}\\b/gi, replacement: \"Bearer [redacted token]\" },\n {\n pattern: /\\b(?:api[_-]?key|secret|token|password|passwd)\\s*[:=]\\s*[^\\s]{8,}\\b/gi,\n replacement: \"[redacted credential]\",\n },\n {\n pattern: /\\b(?:authorization)\\s*:\\s*[^\\s]{8,}\\b/gi,\n replacement: \"authorization: [redacted credential]\",\n },\n];\nconst EXPLICIT_CAPTURE_REVIEW_TAGS = [\"explicit-capture\", \"queued-review\"];\n\nfunction explicitCaptureActor(source: ExplicitCaptureSource): string {\n switch (source) {\n case \"inline\":\n return \"inline.memory_note\";\n case \"memory_store\":\n return \"tool.memory_store\";\n case \"suggestion_submit\":\n return \"tool.suggestion_submit\";\n default:\n return \"tool.memory_capture\";\n }\n}\n\nfunction asTrimmed(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeCaptureContent(value: string): string {\n return value\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction redactSecrets(value: string): string {\n let redacted = value;\n for (const { pattern, replacement } of SECRET_REDACTION_PATTERNS) {\n redacted = redacted.replace(pattern, replacement);\n }\n return redacted;\n}\n\nfunction containsSecretLikeValue(value: string): boolean {\n return SECRET_PATTERNS.some((pattern) => pattern.test(value));\n}\n\nfunction assertNoSecretLikeMetadata(field: string, value: string | undefined): void {\n const trimmed = asTrimmed(value);\n if (trimmed && containsSecretLikeValue(trimmed)) {\n throw new Error(`${field} appears to contain a secret or credential`);\n }\n}\n\nfunction assertNoSecretLikeMetadataList(field: string, values: string[] | undefined): void {\n for (const value of values ?? []) {\n assertNoSecretLikeMetadata(field, value);\n }\n}\n\nfunction sanitizeReviewText(value: string | undefined, fallback: string): string {\n const redacted = redactSecrets(asTrimmed(value) ?? fallback);\n const sanitized = sanitizeMemoryContent(redacted);\n const safe = sanitized.text.trim();\n return safe.length > 0 ? safe : fallback;\n}\n\nfunction sanitizeReviewMetadata(value: string | undefined): string | undefined {\n const trimmed = asTrimmed(value);\n if (!trimmed) return undefined;\n return sanitizeReviewText(trimmed, \"[redacted]\");\n}\n\nfunction sanitizeReviewTags(tags: string[] | undefined): string[] {\n return Array.from(new Set((tags ?? [])\n .map((tag) => sanitizeReviewMetadata(tag))\n .filter((tag): tag is string => typeof tag === \"string\" && tag.length > 0)));\n}\n\nfunction normalizeExplicitCaptureError(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) return error.message.trim();\n const rendered = String(error).trim();\n return rendered.length > 0 ? rendered : \"explicit capture failed\";\n}\n\nfunction resolveExplicitCaptureReviewNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined,\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n return resolveExplicitCaptureNamespace(orchestrator, normalized);\n}\n\nfunction resolveExplicitCaptureNamespace(\n orchestrator: Orchestrator,\n namespace: string | undefined,\n): string | undefined {\n const normalized = asTrimmed(namespace);\n if (!normalized) return undefined;\n if (!orchestrator.config.namespacesEnabled) {\n if (normalized !== orchestrator.config.defaultNamespace) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n }\n const allowed = new Set([\n orchestrator.config.defaultNamespace,\n orchestrator.config.sharedNamespace,\n ...orchestrator.config.namespacePolicies.map((policy) => policy.name),\n ].map((value) => value.trim()).filter(Boolean));\n if (!allowed.has(normalized)) {\n throw new Error(`unsupported namespace: ${normalized}`);\n }\n return normalized;\n}\n\nfunction parseExplicitCaptureTtl(ttl: string | undefined): string | undefined {\n const raw = asTrimmed(ttl);\n if (!raw) return undefined;\n\n const absoluteMs = Date.parse(raw);\n if (Number.isFinite(absoluteMs)) {\n return new Date(absoluteMs).toISOString();\n }\n\n const relative = raw.match(/^(\\d+)\\s*([mhdw])$/i);\n if (!relative) {\n throw new Error(\"ttl must be an ISO-8601 timestamp or relative duration like 30m, 12h, 7d, or 2w\");\n }\n\n const amount = Number.parseInt(relative[1] ?? \"\", 10);\n const unit = (relative[2] ?? \"\").toLowerCase();\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error(\"ttl duration must be a positive integer\");\n }\n\n const multiplier =\n unit === \"m\" ? 60_000\n : unit === \"h\" ? 60 * 60_000\n : unit === \"d\" ? 24 * 60 * 60_000\n : 7 * 24 * 60 * 60_000;\n return new Date(Date.now() + amount * multiplier).toISOString();\n}\n\nfunction parseInlineConfidence(value: string): number {\n const trimmed = value.trim();\n if (!/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(trimmed)) {\n return Number.NaN;\n }\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : Number.NaN;\n}\n\nfunction parseInlineNote(block: string): ExplicitCaptureInput | null {\n const lines = block.replace(/\\r/g, \"\").split(\"\\n\");\n const note: Partial<ExplicitCaptureInput> = {};\n let idx = 0;\n\n while (idx < lines.length) {\n const rawLine = lines[idx] ?? \"\";\n const line = rawLine.trim();\n idx += 1;\n if (line.length === 0) continue;\n const colonIdx = line.indexOf(\":\");\n if (colonIdx < 0) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n\n if (key === \"content\" && value === \"|\") {\n const contentLines: string[] = [];\n while (idx < lines.length) {\n const next = lines[idx] ?? \"\";\n if (next.startsWith(\" \") || next.startsWith(\"\\t\")) {\n contentLines.push(next.replace(/^( |\\t)/, \"\"));\n idx += 1;\n continue;\n }\n if (next.trim().length === 0) {\n contentLines.push(\"\");\n idx += 1;\n continue;\n }\n break;\n }\n note.content = contentLines.join(\"\\n\").trim();\n continue;\n }\n\n switch (key) {\n case \"content\":\n note.content = value;\n break;\n case \"category\":\n note.category = value;\n break;\n case \"confidence\":\n note.confidence = parseInlineConfidence(value);\n break;\n case \"namespace\":\n note.namespace = value;\n break;\n case \"tags\":\n note.tags = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n break;\n case \"entityRef\":\n note.entityRef = value;\n break;\n case \"ttl\":\n note.ttl = value;\n break;\n case \"sourceReason\":\n note.sourceReason = value;\n break;\n default:\n break;\n }\n }\n\n return asTrimmed(note.content) ? (note as ExplicitCaptureInput) : null;\n}\n\nexport function parseInlineExplicitCaptureNotes(text: string): ExplicitCaptureInput[] {\n const notes: ExplicitCaptureInput[] = [];\n for (const match of text.matchAll(INLINE_NOTE_RE)) {\n const parsed = parseInlineNote(match[1] ?? \"\");\n if (parsed) notes.push(parsed);\n }\n return notes;\n}\n\nexport function hasInlineExplicitCaptureMarkup(text: string): boolean {\n return INLINE_NOTE_MARKUP_RE.test(text);\n}\n\nexport function stripInlineExplicitCaptureNotes(text: string): string {\n return text.replace(INLINE_NOTE_RE, \"\").trim();\n}\n\nexport function validateExplicitCaptureInput(\n input: ExplicitCaptureInput,\n mode: ExplicitCaptureValidationMode = \"strict_explicit\",\n): ValidExplicitCapture {\n const content = asTrimmed(input.content);\n if (!content) throw new Error(\"content is required\");\n if (mode === \"strict_explicit\") {\n if (content.length < 10) throw new Error(\"content must be at least 10 characters\");\n if (content.length > 4000) throw new Error(\"content must be 4000 characters or fewer\");\n }\n if (/<memory_note>/i.test(content) || /<\\/memory_note>/i.test(content)) {\n throw new Error(\"nested memory_note blocks are not allowed\");\n }\n\n const category = (asTrimmed(input.category) ?? \"fact\") as MemoryCategory;\n if (!INLINE_ALLOWED_CATEGORIES.has(category)) {\n throw new Error(`unsupported category: ${input.category ?? category}`);\n }\n\n const sanitized = sanitizeMemoryContent(content);\n if (!sanitized.clean) {\n throw new Error(\"content failed memory sanitization\");\n }\n for (const pattern of SECRET_PATTERNS) {\n if (pattern.test(content)) {\n throw new Error(\"content appears to contain a secret or credential\");\n }\n }\n assertNoSecretLikeMetadata(\"sourceReason\", input.sourceReason);\n assertNoSecretLikeMetadata(\"entityRef\", input.entityRef);\n assertNoSecretLikeMetadata(\"ttl\", input.ttl);\n assertNoSecretLikeMetadataList(\"tags\", input.tags);\n\n if (input.confidence !== undefined && !Number.isFinite(input.confidence)) {\n throw new Error(\"confidence must be a finite number\");\n }\n const confidence = input.confidence === undefined ? 0.95 : Number(input.confidence);\n if (confidence < 0 || confidence > 1) {\n throw new Error(\"confidence must be between 0 and 1\");\n }\n const requestedNamespace = asTrimmed(input.namespace);\n if (requestedNamespace && !isSafeRouteNamespace(requestedNamespace)) {\n throw new Error(`unsafe namespace: ${requestedNamespace}`);\n }\n const expiresAt = parseExplicitCaptureTtl(input.ttl);\n\n return {\n content,\n category,\n confidence,\n namespace: asTrimmed(input.namespace),\n tags: Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean))),\n entityRef: asTrimmed(input.entityRef),\n expiresAt,\n sourceReason: asTrimmed(input.sourceReason),\n };\n}\n\nasync function findDuplicateExplicitCapture(\n orchestrator: Orchestrator,\n resolvedNamespace: string | undefined,\n candidate: ValidExplicitCapture,\n): Promise<string | null> {\n const storage = await orchestrator.getStorage(resolvedNamespace);\n if (\n candidate.category === \"fact\"\n && typeof (storage as { hasFactContentHash?: (content: string) => Promise<boolean> }).hasFactContentHash === \"function\"\n ) {\n try {\n const hasHash = await (storage as { hasFactContentHash: (content: string) => Promise<boolean> }).hasFactContentHash(\n candidate.content,\n );\n if (!hasHash) {\n const authoritative =\n typeof (storage as { isFactContentHashAuthoritative?: () => Promise<boolean> | boolean }).isFactContentHashAuthoritative\n === \"function\"\n ? await (storage as { isFactContentHashAuthoritative: () => Promise<boolean> | boolean })\n .isFactContentHashAuthoritative()\n : false;\n if (authoritative) return null;\n }\n } catch (err) {\n // Fail open: hash index is only an optimization, so fall back to the full corpus scan.\n void err;\n }\n }\n const existing = await storage.readAllMemories();\n const normalizedCandidate = normalizeCaptureContent(candidate.content);\n const match = existing.find((memory) => {\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"active\") return false;\n if (memory.frontmatter.category !== candidate.category) return false;\n return normalizeCaptureContent(memory.content) === normalizedCandidate;\n });\n return match?.frontmatter.id ?? null;\n}\n\nexport async function persistExplicitCapture(\n orchestrator: Orchestrator,\n candidate: ValidExplicitCapture,\n source: ExplicitCaptureSource,\n): Promise<{ id: string; duplicateOf?: string }> {\n const resolvedNamespace = resolveExplicitCaptureNamespace(orchestrator, candidate.namespace);\n const duplicateOf = await findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate);\n if (duplicateOf) {\n return { id: duplicateOf, duplicateOf };\n }\n\n const storage = await orchestrator.getStorage(resolvedNamespace);\n const id = await storage.writeMemory(candidate.category, candidate.content, {\n confidence: candidate.confidence,\n tags: candidate.tags,\n entityRef: candidate.entityRef,\n expiresAt: candidate.expiresAt,\n source: source === \"inline\" ? \"explicit-inline\" : \"explicit\",\n });\n\n const created = new Date().toISOString();\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: \"explicit_capture_accepted\",\n timestamp: created,\n actor: explicitCaptureActor(source),\n reasonCode: candidate.sourceReason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n\n return { id };\n}\n\nfunction buildExplicitCaptureReviewContent(input: ExplicitCaptureInput, reason: string): string {\n const requestedContent = asTrimmed(input.content);\n const safeContent = sanitizeReviewText(requestedContent, \"[empty explicit capture]\");\n const safeCategory = sanitizeReviewMetadata(input.category);\n const safeNamespace = sanitizeReviewMetadata(input.namespace);\n const safeEntityRef = sanitizeReviewMetadata(input.entityRef);\n const safeTtl = sanitizeReviewMetadata(input.ttl);\n const safeSourceReason = sanitizeReviewMetadata(input.sourceReason);\n const safeTags = sanitizeReviewTags(input.tags);\n const lines = [\n \"Explicit capture queued for review.\",\n \"\",\n `Reason: ${reason}`,\n \"\",\n \"Submitted content:\",\n safeContent,\n ];\n const metadata = [\n safeCategory ? `Requested category: ${safeCategory}` : undefined,\n safeNamespace ? `Requested namespace: ${safeNamespace}` : undefined,\n safeEntityRef ? `Requested entityRef: ${safeEntityRef}` : undefined,\n safeTtl ? `Requested ttl: ${safeTtl}` : undefined,\n safeSourceReason ? `Requested sourceReason: ${safeSourceReason}` : undefined,\n safeTags.length > 0 ? `Requested tags: ${safeTags.join(\", \")}` : undefined,\n ].filter((entry): entry is string => typeof entry === \"string\" && entry.length > 0);\n if (metadata.length > 0) {\n lines.push(\"\", ...metadata);\n }\n return lines.join(\"\\n\");\n}\n\nasync function findQueuedExplicitCaptureDuplicate(\n orchestrator: Orchestrator,\n namespace: string | undefined,\n content: string,\n): Promise<string | null> {\n const storage = await orchestrator.getStorage(namespace);\n const existing = await storage.readAllMemories();\n const normalized = normalizeCaptureContent(content);\n const match = existing.find((memory) => {\n const status = memory.frontmatter.status ?? \"active\";\n if (status !== \"pending_review\") return false;\n if (!(memory.frontmatter.tags ?? []).includes(\"queued-review\")) return false;\n return normalizeCaptureContent(memory.content) === normalized;\n });\n return match?.frontmatter.id ?? null;\n}\n\nexport async function queueExplicitCaptureForReview(\n orchestrator: Orchestrator,\n input: ExplicitCaptureInput,\n source: ExplicitCaptureSource,\n error: unknown,\n): Promise<{ id: string; duplicateOf?: string }> {\n const reason = sanitizeReviewText(normalizeExplicitCaptureError(error), \"explicit capture failed\");\n const requestedNamespace = asTrimmed(input.namespace);\n const queueNamespace = resolveExplicitCaptureReviewNamespace(orchestrator, requestedNamespace);\n const content = buildExplicitCaptureReviewContent(input, reason);\n const duplicateOf = await findQueuedExplicitCaptureDuplicate(orchestrator, queueNamespace, content);\n if (duplicateOf) {\n return { id: duplicateOf, duplicateOf };\n }\n\n const requestedCategory = asTrimmed(input.category);\n const reviewCategory = requestedCategory && INLINE_ALLOWED_CATEGORIES.has(requestedCategory as MemoryCategory)\n ? requestedCategory as MemoryCategory\n : \"fact\";\n const requestedTags = sanitizeReviewTags(input.tags);\n const storage = await orchestrator.getStorage(queueNamespace);\n const id = await storage.writeMemory(reviewCategory, content, {\n confidence: 0.2,\n tags: Array.from(new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),\n entityRef: sanitizeReviewMetadata(input.entityRef),\n source: source === \"inline\" ? \"explicit-inline-review\" : \"explicit-review\",\n });\n const created = await storage.getMemoryById(id);\n if (created) {\n await storage.writeMemoryFrontmatter(created, {\n status: \"pending_review\",\n updated: new Date().toISOString(),\n }, {\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n });\n }\n const event: MemoryLifecycleEvent = {\n eventId: `mle-${randomUUID()}`,\n memoryId: id,\n eventType: \"explicit_capture_queued\",\n timestamp: new Date().toISOString(),\n actor: explicitCaptureActor(source),\n reasonCode: reason,\n ruleVersion: \"explicit-capture.v1\",\n };\n await storage.appendMemoryLifecycleEvents([event]);\n return { id };\n}\n\nexport function shouldSkipImplicitExtraction(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode === \"explicit\";\n}\n\nexport function shouldProcessInlineExplicitCapture(cfg: Pick<PluginConfig, \"captureMode\">): boolean {\n return cfg.captureMode !== \"implicit\";\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,kBAAkB;AAgC3B,IAAM,iBAAiB;AACvB,IAAM,wBAAwB;AAC9B,IAAM,4BAA4B,oBAAI,IAAoB;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kBAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,4BAA6E;AAAA,EACjF,EAAE,SAAS,4BAA4B,aAAa,wBAAwB;AAAA,EAC5E,EAAE,SAAS,yBAAyB,aAAa,qBAAqB;AAAA,EACtE,EAAE,SAAS,sCAAsC,aAAa,0BAA0B;AAAA,EACxF;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AACF;AACA,IAAM,+BAA+B,CAAC,oBAAoB,eAAe;AAEzE,SAAS,qBAAqB,QAAuC;AACnE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,UAAU,OAA+C;AAChE,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,WAAW,QAAQ,SAAS,IAAI,UAAU;AACnD;AAEA,SAAS,wBAAwB,OAAuB;AACtD,SAAO,MACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAAS,cAAc,OAAuB;AAC5C,MAAI,WAAW;AACf,aAAW,EAAE,SAAS,YAAY,KAAK,2BAA2B;AAChE,eAAW,SAAS,QAAQ,SAAS,WAAW;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAwB;AACvD,SAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,KAAK,KAAK,CAAC;AAC9D;AAEA,SAAS,2BAA2B,OAAe,OAAiC;AAClF,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,WAAW,wBAAwB,OAAO,GAAG;AAC/C,UAAM,IAAI,MAAM,GAAG,KAAK,4CAA4C;AAAA,EACtE;AACF;AAEA,SAAS,+BAA+B,OAAe,QAAoC;AACzF,aAAW,SAAS,UAAU,CAAC,GAAG;AAChC,+BAA2B,OAAO,KAAK;AAAA,EACzC;AACF;AAEA,SAAS,mBAAmB,OAA2B,UAA0B;AAC/E,QAAM,WAAW,cAAc,UAAU,KAAK,KAAK,QAAQ;AAC3D,QAAM,YAAY,sBAAsB,QAAQ;AAChD,QAAM,OAAO,UAAU,KAAK,KAAK;AACjC,SAAO,KAAK,SAAS,IAAI,OAAO;AAClC;AAEA,SAAS,uBAAuB,OAA+C;AAC7E,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,mBAAmB,SAAS,YAAY;AACjD;AAEA,SAAS,mBAAmB,MAAsC;AAChE,SAAO,MAAM,KAAK,IAAI,KAAK,QAAQ,CAAC,GACjC,IAAI,CAAC,QAAQ,uBAAuB,GAAG,CAAC,EACxC,OAAO,CAAC,QAAuB,OAAO,QAAQ,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC;AAC/E;AAEA,SAAS,8BAA8B,OAAwB;AAC7D,MAAI,iBAAiB,SAAS,MAAM,QAAQ,KAAK,EAAE,SAAS,EAAG,QAAO,MAAM,QAAQ,KAAK;AACzF,QAAM,WAAW,OAAO,KAAK,EAAE,KAAK;AACpC,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;AAEA,SAAS,sCACP,cACA,WACoB;AACpB,QAAM,aAAa,UAAU,SAAS;AACtC,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,gCAAgC,cAAc,UAAU;AACjE;AAEA,SAAS,gCACP,cACA,WACoB;AACpB,QAAM,aAAa,UAAU,SAAS;AACtC,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,CAAC,aAAa,OAAO,mBAAmB;AAC1C,QAAI,eAAe,aAAa,OAAO,kBAAkB;AACvD,YAAM,IAAI,MAAM,0BAA0B,UAAU,EAAE;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,IAAI;AAAA,IACtB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,GAAG,aAAa,OAAO,kBAAkB,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,EACtE,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AAC9C,MAAI,CAAC,QAAQ,IAAI,UAAU,GAAG;AAC5B,UAAM,IAAI,MAAM,0BAA0B,UAAU,EAAE;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,KAA6C;AAC5E,QAAM,MAAM,UAAU,GAAG;AACzB,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,aAAa,KAAK,MAAM,GAAG;AACjC,MAAI,OAAO,SAAS,UAAU,GAAG;AAC/B,WAAO,IAAI,KAAK,UAAU,EAAE,YAAY;AAAA,EAC1C;AAEA,QAAM,WAAW,IAAI,MAAM,qBAAqB;AAChD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,iFAAiF;AAAA,EACnG;AAEA,QAAM,SAAS,OAAO,SAAS,SAAS,CAAC,KAAK,IAAI,EAAE;AACpD,QAAM,QAAQ,SAAS,CAAC,KAAK,IAAI,YAAY;AAC7C,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,QAAM,aACJ,SAAS,MAAM,MACX,SAAS,MAAM,KAAK,MAClB,SAAS,MAAM,KAAK,KAAK,MACvB,IAAI,KAAK,KAAK;AACxB,SAAO,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,UAAU,EAAE,YAAY;AAChE;AAEA,SAAS,sBAAsB,OAAuB;AACpD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,gDAAgD,KAAK,OAAO,GAAG;AAClE,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,SAAS,OAAO,OAAO;AAC7B,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS,OAAO;AACnD;AAEA,SAAS,gBAAgB,OAA4C;AACnE,QAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,EAAE,MAAM,IAAI;AACjD,QAAM,OAAsC,CAAC;AAC7C,MAAI,MAAM;AAEV,SAAO,MAAM,MAAM,QAAQ;AACzB,UAAM,UAAU,MAAM,GAAG,KAAK;AAC9B,UAAM,OAAO,QAAQ,KAAK;AAC1B,WAAO;AACP,QAAI,KAAK,WAAW,EAAG;AACvB,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,WAAW,EAAG;AAClB,UAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK;AACzC,UAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAE5C,QAAI,QAAQ,aAAa,UAAU,KAAK;AACtC,YAAM,eAAyB,CAAC;AAChC,aAAO,MAAM,MAAM,QAAQ;AACzB,cAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,YAAI,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,GAAI,GAAG;AAClD,uBAAa,KAAK,KAAK,QAAQ,YAAY,EAAE,CAAC;AAC9C,iBAAO;AACP;AAAA,QACF;AACA,YAAI,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5B,uBAAa,KAAK,EAAE;AACpB,iBAAO;AACP;AAAA,QACF;AACA;AAAA,MACF;AACA,WAAK,UAAU,aAAa,KAAK,IAAI,EAAE,KAAK;AAC5C;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,KAAK;AACH,aAAK,UAAU;AACf;AAAA,MACF,KAAK;AACH,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AACH,aAAK,aAAa,sBAAsB,KAAK;AAC7C;AAAA,MACF,KAAK;AACH,aAAK,YAAY;AACjB;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MACT,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACjB;AAAA,MACF,KAAK;AACH,aAAK,YAAY;AACjB;AAAA,MACF,KAAK;AACH,aAAK,MAAM;AACX;AAAA,MACF,KAAK;AACH,aAAK,eAAe;AACpB;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,UAAU,KAAK,OAAO,IAAK,OAAgC;AACpE;AAEO,SAAS,gCAAgC,MAAsC;AACpF,QAAM,QAAgC,CAAC;AACvC,aAAW,SAAS,KAAK,SAAS,cAAc,GAAG;AACjD,UAAM,SAAS,gBAAgB,MAAM,CAAC,KAAK,EAAE;AAC7C,QAAI,OAAQ,OAAM,KAAK,MAAM;AAAA,EAC/B;AACA,SAAO;AACT;AAEO,SAAS,+BAA+B,MAAuB;AACpE,SAAO,sBAAsB,KAAK,IAAI;AACxC;AAEO,SAAS,gCAAgC,MAAsB;AACpE,SAAO,KAAK,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAC/C;AAEO,SAAS,6BACd,OACA,OAAsC,mBAChB;AACtB,QAAM,UAAU,UAAU,MAAM,OAAO;AACvC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,qBAAqB;AACnD,MAAI,SAAS,mBAAmB;AAC9B,QAAI,QAAQ,SAAS,GAAI,OAAM,IAAI,MAAM,wCAAwC;AACjF,QAAI,QAAQ,SAAS,IAAM,OAAM,IAAI,MAAM,0CAA0C;AAAA,EACvF;AACA,MAAI,iBAAiB,KAAK,OAAO,KAAK,mBAAmB,KAAK,OAAO,GAAG;AACtE,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,QAAM,WAAY,UAAU,MAAM,QAAQ,KAAK;AAC/C,MAAI,CAAC,0BAA0B,IAAI,QAAQ,GAAG;AAC5C,UAAM,IAAI,MAAM,yBAAyB,MAAM,YAAY,QAAQ,EAAE;AAAA,EACvE;AAEA,QAAM,YAAY,sBAAsB,OAAO;AAC/C,MAAI,CAAC,UAAU,OAAO;AACpB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,aAAW,WAAW,iBAAiB;AACrC,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAAA,EACF;AACA,6BAA2B,gBAAgB,MAAM,YAAY;AAC7D,6BAA2B,aAAa,MAAM,SAAS;AACvD,6BAA2B,OAAO,MAAM,GAAG;AAC3C,iCAA+B,QAAQ,MAAM,IAAI;AAEjD,MAAI,MAAM,eAAe,UAAa,CAAC,OAAO,SAAS,MAAM,UAAU,GAAG;AACxE,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,QAAM,aAAa,MAAM,eAAe,SAAY,OAAO,OAAO,MAAM,UAAU;AAClF,MAAI,aAAa,KAAK,aAAa,GAAG;AACpC,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,QAAM,qBAAqB,UAAU,MAAM,SAAS;AACpD,MAAI,sBAAsB,CAAC,qBAAqB,kBAAkB,GAAG;AACnE,UAAM,IAAI,MAAM,qBAAqB,kBAAkB,EAAE;AAAA,EAC3D;AACA,QAAM,YAAY,wBAAwB,MAAM,GAAG;AAEnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,UAAU,MAAM,SAAS;AAAA,IACpC,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAAA,IACrF,WAAW,UAAU,MAAM,SAAS;AAAA,IACpC;AAAA,IACA,cAAc,UAAU,MAAM,YAAY;AAAA,EAC5C;AACF;AAEA,eAAe,6BACb,cACA,mBACA,WACwB;AACxB,QAAM,UAAU,MAAM,aAAa,WAAW,iBAAiB;AAC/D,MACE,UAAU,aAAa,UACpB,OAAQ,QAA2E,uBAAuB,YAC7G;AACA,QAAI;AACF,YAAM,UAAU,MAAO,QAA0E;AAAA,QAC/F,UAAU;AAAA,MACZ;AACA,UAAI,CAAC,SAAS;AACZ,cAAM,gBACJ,OAAQ,QAAkF,mCACpF,aACF,MAAO,QACN,+BAA+B,IAChC;AACN,YAAI,cAAe,QAAO;AAAA,MAC5B;AAAA,IACF,SAAS,KAAK;AAEZ,WAAK;AAAA,IACP;AAAA,EACF;AACA,QAAM,WAAW,MAAM,QAAQ,gBAAgB;AAC/C,QAAM,sBAAsB,wBAAwB,UAAU,OAAO;AACrE,QAAM,QAAQ,SAAS,KAAK,CAAC,WAAW;AACtC,UAAM,SAAS,OAAO,YAAY,UAAU;AAC5C,QAAI,WAAW,SAAU,QAAO;AAChC,QAAI,OAAO,YAAY,aAAa,UAAU,SAAU,QAAO;AAC/D,WAAO,wBAAwB,OAAO,OAAO,MAAM;AAAA,EACrD,CAAC;AACD,SAAO,OAAO,YAAY,MAAM;AAClC;AAEA,eAAsB,uBACpB,cACA,WACA,QAC+C;AAC/C,QAAM,oBAAoB,gCAAgC,cAAc,UAAU,SAAS;AAC3F,QAAM,cAAc,MAAM,6BAA6B,cAAc,mBAAmB,SAAS;AACjG,MAAI,aAAa;AACf,WAAO,EAAE,IAAI,aAAa,YAAY;AAAA,EACxC;AAEA,QAAM,UAAU,MAAM,aAAa,WAAW,iBAAiB;AAC/D,QAAM,KAAK,MAAM,QAAQ,YAAY,UAAU,UAAU,UAAU,SAAS;AAAA,IAC1E,YAAY,UAAU;AAAA,IACtB,MAAM,UAAU;AAAA,IAChB,WAAW,UAAU;AAAA,IACrB,WAAW,UAAU;AAAA,IACrB,QAAQ,WAAW,WAAW,oBAAoB;AAAA,EACpD,CAAC;AAED,QAAM,WAAU,oBAAI,KAAK,GAAE,YAAY;AACvC,QAAM,QAA8B;AAAA,IAClC,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B,UAAU;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO,qBAAqB,MAAM;AAAA,IAClC,YAAY,UAAU;AAAA,IACtB,aAAa;AAAA,EACf;AACA,QAAM,QAAQ,4BAA4B,CAAC,KAAK,CAAC;AAEjD,SAAO,EAAE,GAAG;AACd;AAEA,SAAS,kCAAkC,OAA6B,QAAwB;AAC9F,QAAM,mBAAmB,UAAU,MAAM,OAAO;AAChD,QAAM,cAAc,mBAAmB,kBAAkB,0BAA0B;AACnF,QAAM,eAAe,uBAAuB,MAAM,QAAQ;AAC1D,QAAM,gBAAgB,uBAAuB,MAAM,SAAS;AAC5D,QAAM,gBAAgB,uBAAuB,MAAM,SAAS;AAC5D,QAAM,UAAU,uBAAuB,MAAM,GAAG;AAChD,QAAM,mBAAmB,uBAAuB,MAAM,YAAY;AAClE,QAAM,WAAW,mBAAmB,MAAM,IAAI;AAC9C,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IACf,eAAe,uBAAuB,YAAY,KAAK;AAAA,IACvD,gBAAgB,wBAAwB,aAAa,KAAK;AAAA,IAC1D,gBAAgB,wBAAwB,aAAa,KAAK;AAAA,IAC1D,UAAU,kBAAkB,OAAO,KAAK;AAAA,IACxC,mBAAmB,2BAA2B,gBAAgB,KAAK;AAAA,IACnE,SAAS,SAAS,IAAI,mBAAmB,SAAS,KAAK,IAAI,CAAC,KAAK;AAAA,EACnE,EAAE,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AAClF,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,KAAK,IAAI,GAAG,QAAQ;AAAA,EAC5B;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,mCACb,cACA,WACA,SACwB;AACxB,QAAM,UAAU,MAAM,aAAa,WAAW,SAAS;AACvD,QAAM,WAAW,MAAM,QAAQ,gBAAgB;AAC/C,QAAM,aAAa,wBAAwB,OAAO;AAClD,QAAM,QAAQ,SAAS,KAAK,CAAC,WAAW;AACtC,UAAM,SAAS,OAAO,YAAY,UAAU;AAC5C,QAAI,WAAW,iBAAkB,QAAO;AACxC,QAAI,EAAE,OAAO,YAAY,QAAQ,CAAC,GAAG,SAAS,eAAe,EAAG,QAAO;AACvE,WAAO,wBAAwB,OAAO,OAAO,MAAM;AAAA,EACrD,CAAC;AACD,SAAO,OAAO,YAAY,MAAM;AAClC;AAEA,eAAsB,8BACpB,cACA,OACA,QACA,OAC+C;AAC/C,QAAM,SAAS,mBAAmB,8BAA8B,KAAK,GAAG,yBAAyB;AACjG,QAAM,qBAAqB,UAAU,MAAM,SAAS;AACpD,QAAM,iBAAiB,sCAAsC,cAAc,kBAAkB;AAC7F,QAAM,UAAU,kCAAkC,OAAO,MAAM;AAC/D,QAAM,cAAc,MAAM,mCAAmC,cAAc,gBAAgB,OAAO;AAClG,MAAI,aAAa;AACf,WAAO,EAAE,IAAI,aAAa,YAAY;AAAA,EACxC;AAEA,QAAM,oBAAoB,UAAU,MAAM,QAAQ;AAClD,QAAM,iBAAiB,qBAAqB,0BAA0B,IAAI,iBAAmC,IACzG,oBACA;AACJ,QAAM,gBAAgB,mBAAmB,MAAM,IAAI;AACnD,QAAM,UAAU,MAAM,aAAa,WAAW,cAAc;AAC5D,QAAM,KAAK,MAAM,QAAQ,YAAY,gBAAgB,SAAS;AAAA,IAC5D,YAAY;AAAA,IACZ,MAAM,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,8BAA8B,GAAG,aAAa,CAAC,CAAC;AAAA,IAC7E,WAAW,uBAAuB,MAAM,SAAS;AAAA,IACjD,QAAQ,WAAW,WAAW,2BAA2B;AAAA,EAC3D,CAAC;AACD,QAAM,UAAU,MAAM,QAAQ,cAAc,EAAE;AAC9C,MAAI,SAAS;AACX,UAAM,QAAQ,uBAAuB,SAAS;AAAA,MAC5C,QAAQ;AAAA,MACR,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,GAAG;AAAA,MACD,OAAO,qBAAqB,MAAM;AAAA,MAClC,YAAY;AAAA,MACZ,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACA,QAAM,QAA8B;AAAA,IAClC,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,OAAO,qBAAqB,MAAM;AAAA,IAClC,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AACA,QAAM,QAAQ,4BAA4B,CAAC,KAAK,CAAC;AACjD,SAAO,EAAE,GAAG;AACd;AAEO,SAAS,6BAA6B,KAAiD;AAC5F,SAAO,IAAI,gBAAgB;AAC7B;AAEO,SAAS,mCAAmC,KAAiD;AAClG,SAAO,IAAI,gBAAgB;AAC7B;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  scanSignals
3
- } from "./chunk-XYIK4LF6.js";
3
+ } from "./chunk-H3FZVNRN.js";
4
4
  import {
5
5
  log
6
6
  } from "./chunk-2ODBA7MQ.js";
@@ -44,12 +44,12 @@ var SmartBuffer = class {
44
44
  return run;
45
45
  }
46
46
  entryFor(key) {
47
- this.state.entries ??= {};
48
- if (key === "__proto__" || key === "constructor" || key === "prototype") {
49
- key = `__safe_${key}`;
47
+ if (!this.state.entries) {
48
+ this.state.entries = /* @__PURE__ */ Object.create(null);
50
49
  }
51
- if (Object.hasOwn(this.state.entries, key)) {
52
- const stored = this.state.entries[key];
50
+ const entries = this.state.entries;
51
+ if (Object.hasOwn(entries, key)) {
52
+ const stored = entries[key];
53
53
  if (stored && typeof stored === "object" && Array.isArray(stored.turns)) {
54
54
  return stored;
55
55
  }
@@ -59,13 +59,10 @@ var SmartBuffer = class {
59
59
  lastExtractionAt: null,
60
60
  extractionCount: 0
61
61
  };
62
- this.state.entries[key] = created;
62
+ entries[key] = created;
63
63
  return created;
64
64
  }
65
65
  peekEntry(key) {
66
- if (key === "__proto__" || key === "constructor" || key === "prototype") {
67
- key = `__safe_${key}`;
68
- }
69
66
  const existing = this.state.entries?.[key];
70
67
  if (existing) return existing;
71
68
  if (key !== "default") return null;
@@ -76,7 +73,10 @@ var SmartBuffer = class {
76
73
  };
77
74
  }
78
75
  normalizeState(state) {
79
- const entries = state.entries ?? {};
76
+ const entries = Object.assign(
77
+ /* @__PURE__ */ Object.create(null),
78
+ state.entries ?? {}
79
+ );
80
80
  if (!entries.default) {
81
81
  entries.default = {
82
82
  turns: Array.isArray(state.turns) ? [...state.turns] : [],
@@ -593,4 +593,4 @@ function probeWithTimeout(inflight, timeoutMs) {
593
593
  export {
594
594
  SmartBuffer
595
595
  };
596
- //# sourceMappingURL=chunk-5RGLBDQF.js.map
596
+ //# sourceMappingURL=chunk-EVZFIAPG.js.map