@remnic/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (551) hide show
  1. package/dist/abstraction-nodes.d.ts +52 -0
  2. package/dist/abstraction-nodes.js +15 -0
  3. package/dist/abstraction-nodes.js.map +1 -0
  4. package/dist/access-cli.d.ts +5 -0
  5. package/dist/access-cli.js +308 -0
  6. package/dist/access-cli.js.map +1 -0
  7. package/dist/access-http.d.ts +158 -0
  8. package/dist/access-http.js +32 -0
  9. package/dist/access-http.js.map +1 -0
  10. package/dist/access-idempotency.d.ts +31 -0
  11. package/dist/access-idempotency.js +11 -0
  12. package/dist/access-idempotency.js.map +1 -0
  13. package/dist/access-mcp.d.ts +76 -0
  14. package/dist/access-mcp.js +8 -0
  15. package/dist/access-mcp.js.map +1 -0
  16. package/dist/access-schema.d.ts +266 -0
  17. package/dist/access-schema.js +29 -0
  18. package/dist/access-schema.js.map +1 -0
  19. package/dist/access-service.d.ts +614 -0
  20. package/dist/access-service.js +32 -0
  21. package/dist/access-service.js.map +1 -0
  22. package/dist/behavior-learner.d.ts +16 -0
  23. package/dist/behavior-learner.js +124 -0
  24. package/dist/behavior-learner.js.map +1 -0
  25. package/dist/behavior-signals.d.ts +15 -0
  26. package/dist/behavior-signals.js +11 -0
  27. package/dist/behavior-signals.js.map +1 -0
  28. package/dist/bootstrap.d.ts +46 -0
  29. package/dist/bootstrap.js +9 -0
  30. package/dist/bootstrap.js.map +1 -0
  31. package/dist/boxes.d.ts +93 -0
  32. package/dist/boxes.js +14 -0
  33. package/dist/boxes.js.map +1 -0
  34. package/dist/buffer.d.ts +22 -0
  35. package/dist/buffer.js +9 -0
  36. package/dist/buffer.js.map +1 -0
  37. package/dist/calibration.d.ts +81 -0
  38. package/dist/calibration.js +239 -0
  39. package/dist/calibration.js.map +1 -0
  40. package/dist/causal-behavior.d.ts +79 -0
  41. package/dist/causal-behavior.js +190 -0
  42. package/dist/causal-behavior.js.map +1 -0
  43. package/dist/causal-chain.d.ts +61 -0
  44. package/dist/causal-chain.js +24 -0
  45. package/dist/causal-chain.js.map +1 -0
  46. package/dist/causal-consolidation.d.ts +71 -0
  47. package/dist/causal-consolidation.js +211 -0
  48. package/dist/causal-consolidation.js.map +1 -0
  49. package/dist/causal-retrieval.d.ts +44 -0
  50. package/dist/causal-retrieval.js +184 -0
  51. package/dist/causal-retrieval.js.map +1 -0
  52. package/dist/causal-trajectory-graph.d.ts +13 -0
  53. package/dist/causal-trajectory-graph.js +59 -0
  54. package/dist/causal-trajectory-graph.js.map +1 -0
  55. package/dist/causal-trajectory.d.ts +68 -0
  56. package/dist/causal-trajectory.js +18 -0
  57. package/dist/causal-trajectory.js.map +1 -0
  58. package/dist/chunk-2CJCWDMR.js +87 -0
  59. package/dist/chunk-2CJCWDMR.js.map +1 -0
  60. package/dist/chunk-2NMMFZ5T.js +216 -0
  61. package/dist/chunk-2NMMFZ5T.js.map +1 -0
  62. package/dist/chunk-2PO5ZRKV.js +103 -0
  63. package/dist/chunk-2PO5ZRKV.js.map +1 -0
  64. package/dist/chunk-3QKK7QOS.js +154 -0
  65. package/dist/chunk-3QKK7QOS.js.map +1 -0
  66. package/dist/chunk-3SLRNYNG.js +26 -0
  67. package/dist/chunk-3SLRNYNG.js.map +1 -0
  68. package/dist/chunk-4A24LIM2.js +68 -0
  69. package/dist/chunk-4A24LIM2.js.map +1 -0
  70. package/dist/chunk-6HZ6AO2P.js +164 -0
  71. package/dist/chunk-6HZ6AO2P.js.map +1 -0
  72. package/dist/chunk-763GUIOU.js +302 -0
  73. package/dist/chunk-763GUIOU.js.map +1 -0
  74. package/dist/chunk-AAI7JARD.js +173 -0
  75. package/dist/chunk-AAI7JARD.js.map +1 -0
  76. package/dist/chunk-B7LOFDVE.js +112 -0
  77. package/dist/chunk-B7LOFDVE.js.map +1 -0
  78. package/dist/chunk-BDFZXRSO.js +318 -0
  79. package/dist/chunk-BDFZXRSO.js.map +1 -0
  80. package/dist/chunk-BOUYNNYD.js +707 -0
  81. package/dist/chunk-BOUYNNYD.js.map +1 -0
  82. package/dist/chunk-BRK4ODMI.js +60 -0
  83. package/dist/chunk-BRK4ODMI.js.map +1 -0
  84. package/dist/chunk-C6QPK5GG.js +111 -0
  85. package/dist/chunk-C6QPK5GG.js.map +1 -0
  86. package/dist/chunk-C7VW7C3F.js +117 -0
  87. package/dist/chunk-C7VW7C3F.js.map +1 -0
  88. package/dist/chunk-CDW777AI.js +621 -0
  89. package/dist/chunk-CDW777AI.js.map +1 -0
  90. package/dist/chunk-CULXMQJH.js +185 -0
  91. package/dist/chunk-CULXMQJH.js.map +1 -0
  92. package/dist/chunk-CXWFUJR2.js +1203 -0
  93. package/dist/chunk-CXWFUJR2.js.map +1 -0
  94. package/dist/chunk-DGXUHMOV.js +61 -0
  95. package/dist/chunk-DGXUHMOV.js.map +1 -0
  96. package/dist/chunk-DM2T26WE.js +61 -0
  97. package/dist/chunk-DM2T26WE.js.map +1 -0
  98. package/dist/chunk-DORBM6OB.js +81 -0
  99. package/dist/chunk-DORBM6OB.js.map +1 -0
  100. package/dist/chunk-DT5TVLJE.js +32 -0
  101. package/dist/chunk-DT5TVLJE.js.map +1 -0
  102. package/dist/chunk-EEQLFRUM.js +89 -0
  103. package/dist/chunk-EEQLFRUM.js.map +1 -0
  104. package/dist/chunk-EQINRHYR.js +672 -0
  105. package/dist/chunk-EQINRHYR.js.map +1 -0
  106. package/dist/chunk-ESSMF2FR.js +146 -0
  107. package/dist/chunk-ESSMF2FR.js.map +1 -0
  108. package/dist/chunk-ETOW6ACV.js +158 -0
  109. package/dist/chunk-ETOW6ACV.js.map +1 -0
  110. package/dist/chunk-FYIYMQ5N.js +221 -0
  111. package/dist/chunk-FYIYMQ5N.js.map +1 -0
  112. package/dist/chunk-G3AG3KZN.js +78 -0
  113. package/dist/chunk-G3AG3KZN.js.map +1 -0
  114. package/dist/chunk-GJR6D6KC.js +61 -0
  115. package/dist/chunk-GJR6D6KC.js.map +1 -0
  116. package/dist/chunk-GPGBSNKM.js +380 -0
  117. package/dist/chunk-GPGBSNKM.js.map +1 -0
  118. package/dist/chunk-H63EDPFJ.js +57 -0
  119. package/dist/chunk-H63EDPFJ.js.map +1 -0
  120. package/dist/chunk-HG2NKWR2.js +185 -0
  121. package/dist/chunk-HG2NKWR2.js.map +1 -0
  122. package/dist/chunk-HL4DB7TO.js +13 -0
  123. package/dist/chunk-HL4DB7TO.js.map +1 -0
  124. package/dist/chunk-HLBYLYRD.js +346 -0
  125. package/dist/chunk-HLBYLYRD.js.map +1 -0
  126. package/dist/chunk-HLXVTBF3.js +109 -0
  127. package/dist/chunk-HLXVTBF3.js.map +1 -0
  128. package/dist/chunk-IFFFR3MR.js +68 -0
  129. package/dist/chunk-IFFFR3MR.js.map +1 -0
  130. package/dist/chunk-ISY75RLM.js +1027 -0
  131. package/dist/chunk-ISY75RLM.js.map +1 -0
  132. package/dist/chunk-IZME7KW2.js +1886 -0
  133. package/dist/chunk-IZME7KW2.js.map +1 -0
  134. package/dist/chunk-J3BT33K7.js +720 -0
  135. package/dist/chunk-J3BT33K7.js.map +1 -0
  136. package/dist/chunk-J47FNDR7.js +113 -0
  137. package/dist/chunk-J47FNDR7.js.map +1 -0
  138. package/dist/chunk-JWPLJLDU.js +63 -0
  139. package/dist/chunk-JWPLJLDU.js.map +1 -0
  140. package/dist/chunk-K6WK37A6.js +865 -0
  141. package/dist/chunk-K6WK37A6.js.map +1 -0
  142. package/dist/chunk-KL4CP4SB.js +130 -0
  143. package/dist/chunk-KL4CP4SB.js.map +1 -0
  144. package/dist/chunk-KT4NEUNF.js +315 -0
  145. package/dist/chunk-KT4NEUNF.js.map +1 -0
  146. package/dist/chunk-KWBU5S5U.js +42 -0
  147. package/dist/chunk-KWBU5S5U.js.map +1 -0
  148. package/dist/chunk-L5RPWGFK.js +59 -0
  149. package/dist/chunk-L5RPWGFK.js.map +1 -0
  150. package/dist/chunk-L7WO3MZ4.js +128 -0
  151. package/dist/chunk-L7WO3MZ4.js.map +1 -0
  152. package/dist/chunk-LIRZNNUP.js +74 -0
  153. package/dist/chunk-LIRZNNUP.js.map +1 -0
  154. package/dist/chunk-LK6SGL53.js +22 -0
  155. package/dist/chunk-LK6SGL53.js.map +1 -0
  156. package/dist/chunk-LOBRX7VD.js +200 -0
  157. package/dist/chunk-LOBRX7VD.js.map +1 -0
  158. package/dist/chunk-LPSF4OQH.js +47 -0
  159. package/dist/chunk-LPSF4OQH.js.map +1 -0
  160. package/dist/chunk-LU3GQNDQ.js +152 -0
  161. package/dist/chunk-LU3GQNDQ.js.map +1 -0
  162. package/dist/chunk-M5KEYE5E.js +350 -0
  163. package/dist/chunk-M5KEYE5E.js.map +1 -0
  164. package/dist/chunk-M62O4P4T.js +41 -0
  165. package/dist/chunk-M62O4P4T.js.map +1 -0
  166. package/dist/chunk-MARWOCVP.js +48 -0
  167. package/dist/chunk-MARWOCVP.js.map +1 -0
  168. package/dist/chunk-MDDAA2AO.js +925 -0
  169. package/dist/chunk-MDDAA2AO.js.map +1 -0
  170. package/dist/chunk-MWGVGUIS.js +198 -0
  171. package/dist/chunk-MWGVGUIS.js.map +1 -0
  172. package/dist/chunk-N5AKDXAI.js +74 -0
  173. package/dist/chunk-N5AKDXAI.js.map +1 -0
  174. package/dist/chunk-NGAVDO7E.js +115 -0
  175. package/dist/chunk-NGAVDO7E.js.map +1 -0
  176. package/dist/chunk-NTTLPF7F.js +283 -0
  177. package/dist/chunk-NTTLPF7F.js.map +1 -0
  178. package/dist/chunk-ONRU4L2N.js +240 -0
  179. package/dist/chunk-ONRU4L2N.js.map +1 -0
  180. package/dist/chunk-ORZMT74A.js +209 -0
  181. package/dist/chunk-ORZMT74A.js.map +1 -0
  182. package/dist/chunk-OTAVQCSF.js +268 -0
  183. package/dist/chunk-OTAVQCSF.js.map +1 -0
  184. package/dist/chunk-PGK3VUHN.js +160 -0
  185. package/dist/chunk-PGK3VUHN.js.map +1 -0
  186. package/dist/chunk-Q6FETXJA.js +1362 -0
  187. package/dist/chunk-Q6FETXJA.js.map +1 -0
  188. package/dist/chunk-QANCTXQF.js +271 -0
  189. package/dist/chunk-QANCTXQF.js.map +1 -0
  190. package/dist/chunk-QCCCQT3O.js +189 -0
  191. package/dist/chunk-QCCCQT3O.js.map +1 -0
  192. package/dist/chunk-QDOSNLB4.js +1048 -0
  193. package/dist/chunk-QDOSNLB4.js.map +1 -0
  194. package/dist/chunk-QFQVZOGA.js +2168 -0
  195. package/dist/chunk-QFQVZOGA.js.map +1 -0
  196. package/dist/chunk-QPKFPHOO.js +178 -0
  197. package/dist/chunk-QPKFPHOO.js.map +1 -0
  198. package/dist/chunk-QSVPYQPG.js +268 -0
  199. package/dist/chunk-QSVPYQPG.js.map +1 -0
  200. package/dist/chunk-QWUUMMIK.js +3045 -0
  201. package/dist/chunk-QWUUMMIK.js.map +1 -0
  202. package/dist/chunk-QY2BHY5O.js +2378 -0
  203. package/dist/chunk-QY2BHY5O.js.map +1 -0
  204. package/dist/chunk-SCHEKPYH.js +349 -0
  205. package/dist/chunk-SCHEKPYH.js.map +1 -0
  206. package/dist/chunk-SCU65EZI.js +15 -0
  207. package/dist/chunk-SCU65EZI.js.map +1 -0
  208. package/dist/chunk-T4WRIV2C.js +170 -0
  209. package/dist/chunk-T4WRIV2C.js.map +1 -0
  210. package/dist/chunk-TKO4HZCK.js +1852 -0
  211. package/dist/chunk-TKO4HZCK.js.map +1 -0
  212. package/dist/chunk-TP4FZJIZ.js +93 -0
  213. package/dist/chunk-TP4FZJIZ.js.map +1 -0
  214. package/dist/chunk-TPB3I2AC.js +403 -0
  215. package/dist/chunk-TPB3I2AC.js.map +1 -0
  216. package/dist/chunk-TVVVQQAK.js +1431 -0
  217. package/dist/chunk-TVVVQQAK.js.map +1 -0
  218. package/dist/chunk-U4PV25RD.js +14 -0
  219. package/dist/chunk-U4PV25RD.js.map +1 -0
  220. package/dist/chunk-UCYSTFZR.js +284 -0
  221. package/dist/chunk-UCYSTFZR.js.map +1 -0
  222. package/dist/chunk-UHGBNIOS.js +205 -0
  223. package/dist/chunk-UHGBNIOS.js.map +1 -0
  224. package/dist/chunk-UIYZ5T3I.js +108 -0
  225. package/dist/chunk-UIYZ5T3I.js.map +1 -0
  226. package/dist/chunk-UV2FO7J4.js +747 -0
  227. package/dist/chunk-UV2FO7J4.js.map +1 -0
  228. package/dist/chunk-UZB5KHKX.js +63 -0
  229. package/dist/chunk-UZB5KHKX.js.map +1 -0
  230. package/dist/chunk-V3RXWQIE.js +626 -0
  231. package/dist/chunk-V3RXWQIE.js.map +1 -0
  232. package/dist/chunk-V4YC4LUK.js +444 -0
  233. package/dist/chunk-V4YC4LUK.js.map +1 -0
  234. package/dist/chunk-VEWZZM3H.js +133 -0
  235. package/dist/chunk-VEWZZM3H.js.map +1 -0
  236. package/dist/chunk-WWIQTB2Y.js +98 -0
  237. package/dist/chunk-WWIQTB2Y.js.map +1 -0
  238. package/dist/chunk-X7XN6YU4.js +24 -0
  239. package/dist/chunk-X7XN6YU4.js.map +1 -0
  240. package/dist/chunk-XKECPATV.js +202 -0
  241. package/dist/chunk-XKECPATV.js.map +1 -0
  242. package/dist/chunk-XYIK4LF6.js +75 -0
  243. package/dist/chunk-XYIK4LF6.js.map +1 -0
  244. package/dist/chunk-Y27UJK6V.js +39 -0
  245. package/dist/chunk-Y27UJK6V.js.map +1 -0
  246. package/dist/chunk-Y4Z4I6WK.js +9 -0
  247. package/dist/chunk-Y4Z4I6WK.js.map +1 -0
  248. package/dist/chunk-YAPUAHAY.js +10761 -0
  249. package/dist/chunk-YAPUAHAY.js.map +1 -0
  250. package/dist/chunk-YAZNBMNF.js +92 -0
  251. package/dist/chunk-YAZNBMNF.js.map +1 -0
  252. package/dist/chunk-YCN4BVDK.js +66 -0
  253. package/dist/chunk-YCN4BVDK.js.map +1 -0
  254. package/dist/chunk-YNCQ7E4M.js +388 -0
  255. package/dist/chunk-YNCQ7E4M.js.map +1 -0
  256. package/dist/chunk-YNI4S5WT.js +143 -0
  257. package/dist/chunk-YNI4S5WT.js.map +1 -0
  258. package/dist/chunk-YRMVARQP.js +406 -0
  259. package/dist/chunk-YRMVARQP.js.map +1 -0
  260. package/dist/chunk-Z5AAYHUC.js +79 -0
  261. package/dist/chunk-Z5AAYHUC.js.map +1 -0
  262. package/dist/chunk-Z5LAYHGJ.js +15 -0
  263. package/dist/chunk-Z5LAYHGJ.js.map +1 -0
  264. package/dist/chunk-ZJLY4QSU.js +823 -0
  265. package/dist/chunk-ZJLY4QSU.js.map +1 -0
  266. package/dist/chunk-ZKYI7UVO.js +276 -0
  267. package/dist/chunk-ZKYI7UVO.js.map +1 -0
  268. package/dist/chunk-ZPKBYX2F.js +297 -0
  269. package/dist/chunk-ZPKBYX2F.js.map +1 -0
  270. package/dist/chunking.d.ts +48 -0
  271. package/dist/chunking.js +11 -0
  272. package/dist/chunking.js.map +1 -0
  273. package/dist/cli.d.ts +1162 -0
  274. package/dist/cli.js +7187 -0
  275. package/dist/cli.js.map +1 -0
  276. package/dist/commitment-ledger.d.ts +83 -0
  277. package/dist/commitment-ledger.js +19 -0
  278. package/dist/commitment-ledger.js.map +1 -0
  279. package/dist/compression-optimizer.d.ts +37 -0
  280. package/dist/compression-optimizer.js +13 -0
  281. package/dist/compression-optimizer.js.map +1 -0
  282. package/dist/config.d.ts +6 -0
  283. package/dist/config.js +12 -0
  284. package/dist/config.js.map +1 -0
  285. package/dist/cue-anchors.d.ts +50 -0
  286. package/dist/cue-anchors.js +15 -0
  287. package/dist/cue-anchors.js.map +1 -0
  288. package/dist/dashboard-runtime.d.ts +46 -0
  289. package/dist/dashboard-runtime.js +10 -0
  290. package/dist/dashboard-runtime.js.map +1 -0
  291. package/dist/day-summary.d.ts +6 -0
  292. package/dist/day-summary.js +10 -0
  293. package/dist/day-summary.js.map +1 -0
  294. package/dist/delinearize.d.ts +34 -0
  295. package/dist/delinearize.js +11 -0
  296. package/dist/delinearize.js.map +1 -0
  297. package/dist/embedding-fallback.d.ts +22 -0
  298. package/dist/embedding-fallback.js +8 -0
  299. package/dist/embedding-fallback.js.map +1 -0
  300. package/dist/engine-P26JFSVY.js +19 -0
  301. package/dist/engine-P26JFSVY.js.map +1 -0
  302. package/dist/entity-retrieval.d.ts +23 -0
  303. package/dist/entity-retrieval.js +24 -0
  304. package/dist/entity-retrieval.js.map +1 -0
  305. package/dist/evals.d.ts +282 -0
  306. package/dist/evals.js +32 -0
  307. package/dist/evals.js.map +1 -0
  308. package/dist/explicit-capture.d.ts +60 -0
  309. package/dist/explicit-capture.js +23 -0
  310. package/dist/explicit-capture.js.map +1 -0
  311. package/dist/extraction.d.ts +141 -0
  312. package/dist/extraction.js +22 -0
  313. package/dist/extraction.js.map +1 -0
  314. package/dist/fallback-llm.d.ts +95 -0
  315. package/dist/fallback-llm.js +12 -0
  316. package/dist/fallback-llm.js.map +1 -0
  317. package/dist/graph-dashboard-diff.d.ts +12 -0
  318. package/dist/graph-dashboard-diff.js +8 -0
  319. package/dist/graph-dashboard-diff.js.map +1 -0
  320. package/dist/graph-dashboard-key.d.ts +5 -0
  321. package/dist/graph-dashboard-key.js +7 -0
  322. package/dist/graph-dashboard-key.js.map +1 -0
  323. package/dist/graph-dashboard-parser.d.ts +20 -0
  324. package/dist/graph-dashboard-parser.js +8 -0
  325. package/dist/graph-dashboard-parser.js.map +1 -0
  326. package/dist/graph.d.ts +157 -0
  327. package/dist/graph.js +27 -0
  328. package/dist/graph.js.map +1 -0
  329. package/dist/harmonic-retrieval.d.ts +27 -0
  330. package/dist/harmonic-retrieval.js +12 -0
  331. package/dist/harmonic-retrieval.js.map +1 -0
  332. package/dist/himem.d.ts +23 -0
  333. package/dist/himem.js +7 -0
  334. package/dist/himem.js.map +1 -0
  335. package/dist/hygiene.d.ts +24 -0
  336. package/dist/hygiene.js +9 -0
  337. package/dist/hygiene.js.map +1 -0
  338. package/dist/identity-continuity.d.ts +17 -0
  339. package/dist/identity-continuity.js +19 -0
  340. package/dist/identity-continuity.js.map +1 -0
  341. package/dist/importance.d.ts +25 -0
  342. package/dist/importance.js +11 -0
  343. package/dist/importance.js.map +1 -0
  344. package/dist/index.d.ts +923 -0
  345. package/dist/index.js +2512 -0
  346. package/dist/index.js.map +1 -0
  347. package/dist/intent.d.ts +8 -0
  348. package/dist/intent.js +13 -0
  349. package/dist/intent.js.map +1 -0
  350. package/dist/json-extract.d.ts +14 -0
  351. package/dist/json-extract.js +9 -0
  352. package/dist/json-extract.js.map +1 -0
  353. package/dist/json-store.d.ts +5 -0
  354. package/dist/json-store.js +11 -0
  355. package/dist/json-store.js.map +1 -0
  356. package/dist/legacy-hook-compat.d.ts +3 -0
  357. package/dist/legacy-hook-compat.js +35 -0
  358. package/dist/legacy-hook-compat.js.map +1 -0
  359. package/dist/lifecycle.d.ts +52 -0
  360. package/dist/lifecycle.js +21 -0
  361. package/dist/lifecycle.js.map +1 -0
  362. package/dist/local-llm.d.ts +154 -0
  363. package/dist/local-llm.js +10 -0
  364. package/dist/local-llm.js.map +1 -0
  365. package/dist/logger.d.ts +15 -0
  366. package/dist/logger.js +9 -0
  367. package/dist/logger.js.map +1 -0
  368. package/dist/memory-action-policy.d.ts +13 -0
  369. package/dist/memory-action-policy.js +7 -0
  370. package/dist/memory-action-policy.js.map +1 -0
  371. package/dist/memory-cache.d.ts +35 -0
  372. package/dist/memory-cache.js +37 -0
  373. package/dist/memory-cache.js.map +1 -0
  374. package/dist/memory-lifecycle-ledger-utils.d.ts +13 -0
  375. package/dist/memory-lifecycle-ledger-utils.js +23 -0
  376. package/dist/memory-lifecycle-ledger-utils.js.map +1 -0
  377. package/dist/memory-projection-format.d.ts +4 -0
  378. package/dist/memory-projection-format.js +9 -0
  379. package/dist/memory-projection-format.js.map +1 -0
  380. package/dist/memory-projection-store-NxMkbocT.d.ts +221 -0
  381. package/dist/memory-projection-store.d.ts +3 -0
  382. package/dist/memory-projection-store.js +31 -0
  383. package/dist/memory-projection-store.js.map +1 -0
  384. package/dist/model-registry.d.ts +60 -0
  385. package/dist/model-registry.js +8 -0
  386. package/dist/model-registry.js.map +1 -0
  387. package/dist/native-knowledge.d.ts +94 -0
  388. package/dist/native-knowledge.js +26 -0
  389. package/dist/native-knowledge.js.map +1 -0
  390. package/dist/negative.d.ts +26 -0
  391. package/dist/negative.js +8 -0
  392. package/dist/negative.js.map +1 -0
  393. package/dist/objective-state-writers.d.ts +22 -0
  394. package/dist/objective-state-writers.js +313 -0
  395. package/dist/objective-state-writers.js.map +1 -0
  396. package/dist/objective-state.d.ts +75 -0
  397. package/dist/objective-state.js +17 -0
  398. package/dist/objective-state.js.map +1 -0
  399. package/dist/openai-chat-compat.d.ts +13 -0
  400. package/dist/openai-chat-compat.js +11 -0
  401. package/dist/openai-chat-compat.js.map +1 -0
  402. package/dist/operator-toolkit.d.ts +304 -0
  403. package/dist/operator-toolkit.js +41 -0
  404. package/dist/operator-toolkit.js.map +1 -0
  405. package/dist/opik-exporter.d.ts +72 -0
  406. package/dist/opik-exporter.js +361 -0
  407. package/dist/opik-exporter.js.map +1 -0
  408. package/dist/orchestrator-zTa-Qo-1.d.ts +1104 -0
  409. package/dist/orchestrator.d.ts +21 -0
  410. package/dist/orchestrator.js +145 -0
  411. package/dist/orchestrator.js.map +1 -0
  412. package/dist/policy-runtime.d.ts +37 -0
  413. package/dist/policy-runtime.js +13 -0
  414. package/dist/policy-runtime.js.map +1 -0
  415. package/dist/port-C1GZFv8h.d.ts +41 -0
  416. package/dist/profiling.d.ts +80 -0
  417. package/dist/profiling.js +10 -0
  418. package/dist/profiling.js.map +1 -0
  419. package/dist/qmd-recall-cache.d.ts +29 -0
  420. package/dist/qmd-recall-cache.js +13 -0
  421. package/dist/qmd-recall-cache.js.map +1 -0
  422. package/dist/qmd.d.ts +105 -0
  423. package/dist/qmd.js +13 -0
  424. package/dist/qmd.js.map +1 -0
  425. package/dist/recall-qos.d.ts +33 -0
  426. package/dist/recall-qos.js +10 -0
  427. package/dist/recall-qos.js.map +1 -0
  428. package/dist/recall-query-policy.d.ts +20 -0
  429. package/dist/recall-query-policy.js +11 -0
  430. package/dist/recall-query-policy.js.map +1 -0
  431. package/dist/recall-state.d.ts +113 -0
  432. package/dist/recall-state.js +12 -0
  433. package/dist/recall-state.js.map +1 -0
  434. package/dist/recall-tokenization.d.ts +4 -0
  435. package/dist/recall-tokenization.js +9 -0
  436. package/dist/recall-tokenization.js.map +1 -0
  437. package/dist/reconstruct.d.ts +16 -0
  438. package/dist/reconstruct.js +7 -0
  439. package/dist/reconstruct.js.map +1 -0
  440. package/dist/release-changelog.d.ts +7 -0
  441. package/dist/release-changelog.js +30 -0
  442. package/dist/release-changelog.js.map +1 -0
  443. package/dist/relevance.d.ts +18 -0
  444. package/dist/relevance.js +8 -0
  445. package/dist/relevance.js.map +1 -0
  446. package/dist/rerank.d.ts +57 -0
  447. package/dist/rerank.js +11 -0
  448. package/dist/rerank.js.map +1 -0
  449. package/dist/resolve-provider-secret.d.ts +16 -0
  450. package/dist/resolve-provider-secret.js +11 -0
  451. package/dist/resolve-provider-secret.js.map +1 -0
  452. package/dist/resume-bundles.d.ts +66 -0
  453. package/dist/resume-bundles.js +27 -0
  454. package/dist/resume-bundles.js.map +1 -0
  455. package/dist/retrieval-agents.d.ts +129 -0
  456. package/dist/retrieval-agents.js +23 -0
  457. package/dist/retrieval-agents.js.map +1 -0
  458. package/dist/retrieval.d.ts +19 -0
  459. package/dist/retrieval.js +10 -0
  460. package/dist/retrieval.js.map +1 -0
  461. package/dist/sanitize.d.ts +9 -0
  462. package/dist/sanitize.js +9 -0
  463. package/dist/sanitize.js.map +1 -0
  464. package/dist/schemas.d.ts +688 -0
  465. package/dist/schemas.js +51 -0
  466. package/dist/schemas.js.map +1 -0
  467. package/dist/sdk-compat.d.ts +21 -0
  468. package/dist/sdk-compat.js +28 -0
  469. package/dist/sdk-compat.js.map +1 -0
  470. package/dist/semantic-consolidation.d.ts +42 -0
  471. package/dist/semantic-consolidation.js +12 -0
  472. package/dist/semantic-consolidation.js.map +1 -0
  473. package/dist/semantic-rule-promotion.d.ts +28 -0
  474. package/dist/semantic-rule-promotion.js +17 -0
  475. package/dist/semantic-rule-promotion.js.map +1 -0
  476. package/dist/semantic-rule-verifier.d.ts +19 -0
  477. package/dist/semantic-rule-verifier.js +18 -0
  478. package/dist/semantic-rule-verifier.js.map +1 -0
  479. package/dist/session-integrity.d.ts +67 -0
  480. package/dist/session-integrity.js +11 -0
  481. package/dist/session-integrity.js.map +1 -0
  482. package/dist/session-observer-bands.d.ts +6 -0
  483. package/dist/session-observer-bands.js +9 -0
  484. package/dist/session-observer-bands.js.map +1 -0
  485. package/dist/session-observer-state.d.ts +40 -0
  486. package/dist/session-observer-state.js +11 -0
  487. package/dist/session-observer-state.js.map +1 -0
  488. package/dist/signal.d.ts +6 -0
  489. package/dist/signal.js +9 -0
  490. package/dist/signal.js.map +1 -0
  491. package/dist/storage.d.ts +453 -0
  492. package/dist/storage.js +24 -0
  493. package/dist/storage.js.map +1 -0
  494. package/dist/store-contract.d.ts +10 -0
  495. package/dist/store-contract.js +21 -0
  496. package/dist/store-contract.js.map +1 -0
  497. package/dist/summarizer.d.ts +35 -0
  498. package/dist/summarizer.js +17 -0
  499. package/dist/summarizer.js.map +1 -0
  500. package/dist/summary-snapshot.d.ts +8 -0
  501. package/dist/summary-snapshot.js +13 -0
  502. package/dist/summary-snapshot.js.map +1 -0
  503. package/dist/temporal-index.d.ts +139 -0
  504. package/dist/temporal-index.js +29 -0
  505. package/dist/temporal-index.js.map +1 -0
  506. package/dist/threading.d.ts +62 -0
  507. package/dist/threading.js +8 -0
  508. package/dist/threading.js.map +1 -0
  509. package/dist/tier-migration.d.ts +44 -0
  510. package/dist/tier-migration.js +7 -0
  511. package/dist/tier-migration.js.map +1 -0
  512. package/dist/tier-routing.d.ts +21 -0
  513. package/dist/tier-routing.js +10 -0
  514. package/dist/tier-routing.js.map +1 -0
  515. package/dist/tmt.d.ts +79 -0
  516. package/dist/tmt.js +29 -0
  517. package/dist/tmt.js.map +1 -0
  518. package/dist/tokens.d.ts +24 -0
  519. package/dist/tokens.js +21 -0
  520. package/dist/tokens.js.map +1 -0
  521. package/dist/topics.d.ts +29 -0
  522. package/dist/topics.js +9 -0
  523. package/dist/topics.js.map +1 -0
  524. package/dist/transcript.d.ts +171 -0
  525. package/dist/transcript.js +9 -0
  526. package/dist/transcript.js.map +1 -0
  527. package/dist/trust-zones.d.ts +170 -0
  528. package/dist/trust-zones.js +32 -0
  529. package/dist/trust-zones.js.map +1 -0
  530. package/dist/types.d.ts +1243 -0
  531. package/dist/types.js +9 -0
  532. package/dist/types.js.map +1 -0
  533. package/dist/utility-learner.d.ts +59 -0
  534. package/dist/utility-learner.js +17 -0
  535. package/dist/utility-learner.js.map +1 -0
  536. package/dist/utility-runtime.d.ts +21 -0
  537. package/dist/utility-runtime.js +16 -0
  538. package/dist/utility-runtime.js.map +1 -0
  539. package/dist/utility-telemetry.d.ts +68 -0
  540. package/dist/utility-telemetry.js +17 -0
  541. package/dist/utility-telemetry.js.map +1 -0
  542. package/dist/verified-recall.d.ts +17 -0
  543. package/dist/verified-recall.js +19 -0
  544. package/dist/verified-recall.js.map +1 -0
  545. package/dist/version-utils.d.ts +4 -0
  546. package/dist/version-utils.js +7 -0
  547. package/dist/version-utils.js.map +1 -0
  548. package/dist/work-product-ledger.d.ts +65 -0
  549. package/dist/work-product-ledger.js +18 -0
  550. package/dist/work-product-ledger.js.map +1 -0
  551. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/trust-zones.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { listJsonFiles, readJsonFile } from \"./json-store.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\nimport {\n assertIsoRecordedAt,\n assertSafePathSegment,\n assertString,\n isRecord,\n optionalString,\n optionalStringArray,\n recordStoreDay,\n validateStringRecord,\n} from \"./store-contract.js\";\n\nexport type TrustZoneName = \"quarantine\" | \"working\" | \"trusted\";\nexport type TrustZoneRecordKind = \"memory\" | \"artifact\" | \"state\" | \"trajectory\" | \"external\";\nexport type TrustZoneSourceClass =\n | \"tool_output\"\n | \"web_content\"\n | \"subagent_trace\"\n | \"system_memory\"\n | \"user_input\"\n | \"manual\";\n\nexport function isTrustZoneName(value: string): value is TrustZoneName {\n return value === \"quarantine\" || value === \"working\" || value === \"trusted\";\n}\n\nexport interface TrustZoneProvenance {\n sourceClass: TrustZoneSourceClass;\n observedAt: string;\n sessionKey?: string;\n sourceId?: string;\n evidenceHash?: string;\n}\n\nexport interface TrustZoneRecord {\n schemaVersion: 1;\n recordId: string;\n zone: TrustZoneName;\n recordedAt: string;\n kind: TrustZoneRecordKind;\n summary: string;\n provenance: TrustZoneProvenance;\n promotedFromZone?: TrustZoneName;\n entityRefs?: string[];\n tags?: string[];\n metadata?: Record<string, string>;\n}\n\nexport type TrustZoneScoreBand = \"low\" | \"medium\" | \"high\";\n\nexport interface TrustZoneProvenanceScore {\n total: number;\n band: TrustZoneScoreBand;\n anchored: boolean;\n sourceClassWeight: number;\n sourceIdBonus: number;\n evidenceHashBonus: number;\n sessionKeyBonus: number;\n}\n\nexport interface TrustZoneStoreStatus {\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled: boolean;\n rootDir: string;\n zonesDir: string;\n records: {\n total: number;\n valid: number;\n invalid: number;\n byZone: Partial<Record<TrustZoneName, number>>;\n byKind: Partial<Record<TrustZoneRecordKind, number>>;\n latestRecordId?: string;\n latestRecordedAt?: string;\n latestZone?: TrustZoneName;\n averageTrustScore?: number;\n byTrustBand?: Partial<Record<TrustZoneScoreBand, number>>;\n };\n latestRecord?: TrustZoneRecord;\n latestRecordTrustScore?: TrustZoneProvenanceScore;\n invalidRecords: Array<{\n path: string;\n error: string;\n }>;\n}\n\nexport interface TrustZonePromotionPlan {\n allowed: boolean;\n reasons: string[];\n sourceRecordId: string;\n sourceZone: TrustZoneName;\n targetZone: TrustZoneName;\n provenanceAnchored: boolean;\n}\n\nexport interface TrustZonePromotionResult {\n plan: TrustZonePromotionPlan;\n wroteRecord: boolean;\n record: TrustZoneRecord;\n filePath?: string;\n sourceRecord: TrustZoneRecord;\n}\n\ninterface TrustZoneCorroborationSummary {\n count: number;\n sourceClasses: TrustZoneSourceClass[];\n}\n\nexport interface TrustZoneSearchResult {\n record: TrustZoneRecord;\n score: number;\n matchedFields: string[];\n}\n\nexport interface TrustZoneRecordEntry {\n filePath: string;\n record: TrustZoneRecord;\n}\n\nexport interface TrustZoneListResult {\n total: number;\n count: number;\n limit: number;\n offset: number;\n records: TrustZoneRecordEntry[];\n allRecords: TrustZoneRecord[];\n}\n\nexport interface TrustZonePromotionReadiness {\n nextTargetZone?: TrustZoneName;\n allowed: boolean;\n reasons: string[];\n requiresCorroboration: boolean;\n corroborationCount: number;\n corroborationSourceClasses: TrustZoneSourceClass[];\n}\n\nexport interface TrustZoneDemoSeedResult {\n scenario: string;\n dryRun: boolean;\n recordsWritten: number;\n records: TrustZoneRecord[];\n filePaths: string[];\n}\n\nfunction validateMetadata(raw: unknown): Record<string, string> | undefined {\n return validateStringRecord(raw, \"metadata\");\n}\n\nfunction validateZone(raw: unknown, field: string): TrustZoneName {\n const value = assertString(raw, field);\n if (![\"quarantine\", \"working\", \"trusted\"].includes(value)) {\n throw new Error(`${field} must be one of quarantine|working|trusted`);\n }\n return value as TrustZoneName;\n}\n\nfunction validateKind(raw: unknown): TrustZoneRecordKind {\n const value = assertString(raw, \"kind\");\n if (![\"memory\", \"artifact\", \"state\", \"trajectory\", \"external\"].includes(value)) {\n throw new Error(\"kind must be one of memory|artifact|state|trajectory|external\");\n }\n return value as TrustZoneRecordKind;\n}\n\nfunction validateProvenance(raw: unknown): TrustZoneProvenance {\n if (!isRecord(raw)) throw new Error(\"provenance must be an object\");\n const sourceClass = assertString(raw.sourceClass, \"provenance.sourceClass\");\n if (![\"tool_output\", \"web_content\", \"subagent_trace\", \"system_memory\", \"user_input\", \"manual\"].includes(sourceClass)) {\n throw new Error(\"provenance.sourceClass must be one of tool_output|web_content|subagent_trace|system_memory|user_input|manual\");\n }\n return {\n sourceClass: sourceClass as TrustZoneSourceClass,\n observedAt: assertIsoRecordedAt(assertString(raw.observedAt, \"provenance.observedAt\"), \"provenance.observedAt\"),\n sessionKey: optionalString(raw.sessionKey),\n sourceId: optionalString(raw.sourceId),\n evidenceHash: optionalString(raw.evidenceHash),\n };\n}\n\nexport function resolveTrustZoneStoreDir(memoryDir: string, overrideDir?: string): string {\n if (typeof overrideDir === \"string\" && overrideDir.trim().length > 0) {\n return overrideDir.trim();\n }\n return path.join(memoryDir, \"state\", \"trust-zones\");\n}\n\nexport function validateTrustZoneRecord(raw: unknown): TrustZoneRecord {\n if (!isRecord(raw)) throw new Error(\"trust-zone record must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n\n return {\n schemaVersion: 1,\n recordId: assertSafePathSegment(assertString(raw.recordId, \"recordId\"), \"recordId\"),\n zone: validateZone(raw.zone, \"zone\"),\n recordedAt: assertIsoRecordedAt(assertString(raw.recordedAt, \"recordedAt\")),\n kind: validateKind(raw.kind),\n summary: assertString(raw.summary, \"summary\"),\n provenance: validateProvenance(raw.provenance),\n promotedFromZone: raw.promotedFromZone === undefined ? undefined : validateZone(raw.promotedFromZone, \"promotedFromZone\"),\n entityRefs: optionalStringArray(raw.entityRefs, \"entityRefs\"),\n tags: optionalStringArray(raw.tags, \"tags\"),\n metadata: validateMetadata(raw.metadata),\n };\n}\n\nexport async function recordTrustZoneRecord(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n record: TrustZoneRecord;\n}): Promise<string> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const validated = validateTrustZoneRecord(options.record);\n const day = recordStoreDay(validated.recordedAt);\n const zoneDir = path.join(rootDir, \"zones\", validated.zone, day);\n const filePath = path.join(zoneDir, `${validated.recordId}.json`);\n await mkdir(zoneDir, { recursive: true });\n await writeFile(filePath, JSON.stringify(validated, null, 2), \"utf8\");\n return filePath;\n}\n\nfunction hasAnchoredProvenance(record: TrustZoneRecord): boolean {\n return Boolean(record.provenance.sourceId && record.provenance.evidenceHash);\n}\n\nfunction buildPromotionRecordId(sourceRecordId: string, targetZone: TrustZoneName, recordedAt: string): string {\n const suffix = recordedAt.replace(/[^0-9]/g, \"\").slice(0, 14);\n return `${sourceRecordId}-${targetZone}-${suffix}`;\n}\n\nfunction dedupeStrings(values: Array<string | undefined>): string[] | undefined {\n const out = values.filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (out.length === 0) return undefined;\n return [...new Set(out)];\n}\n\nfunction hasOverlap(left: string[] | undefined, right: string[] | undefined): boolean {\n if (!left || !right || left.length === 0 || right.length === 0) return false;\n const rightSet = new Set(right);\n return left.some((value) => rightSet.has(value));\n}\n\nfunction corroborationTags(record: TrustZoneRecord): string[] | undefined {\n if (!record.tags || record.tags.length === 0) return undefined;\n const filtered = record.tags.filter((tag) => tag !== \"trust-zone-demo\" && tag !== \"enterprise-demo\");\n return filtered.length > 0 ? filtered : undefined;\n}\n\nfunction requiresCorroboration(record: TrustZoneRecord, targetZone: TrustZoneName, poisoningDefenseEnabled: boolean): boolean {\n return (\n poisoningDefenseEnabled === true\n && targetZone === \"trusted\"\n && record.zone === \"working\"\n && [\"tool_output\", \"web_content\", \"subagent_trace\"].includes(record.provenance.sourceClass)\n );\n}\n\nfunction summarizeCorroboration(options: {\n sourceRecord: TrustZoneRecord;\n records: TrustZoneRecord[];\n}): TrustZoneCorroborationSummary {\n const corroborating = options.records.filter((candidate) => {\n if (candidate.recordId === options.sourceRecord.recordId) return false;\n if (candidate.zone === \"quarantine\") return false;\n if (hasAnchoredProvenance(candidate) !== true) return false;\n if (candidate.provenance.sourceClass === options.sourceRecord.provenance.sourceClass) return false;\n return (\n hasOverlap(candidate.entityRefs, options.sourceRecord.entityRefs)\n || hasOverlap(corroborationTags(candidate), corroborationTags(options.sourceRecord))\n );\n });\n\n return {\n count: corroborating.length,\n sourceClasses: [...new Set(corroborating.map((record) => record.provenance.sourceClass))],\n };\n}\n\nconst SOURCE_CLASS_WEIGHTS: Record<TrustZoneSourceClass, number> = {\n manual: 0.9,\n system_memory: 0.85,\n user_input: 0.75,\n tool_output: 0.55,\n subagent_trace: 0.45,\n web_content: 0.35,\n};\n\nfunction roundTrustScore(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction trustScoreBand(total: number): TrustZoneScoreBand {\n if (total >= 0.8) return \"high\";\n if (total >= 0.5) return \"medium\";\n return \"low\";\n}\n\nexport function scoreTrustZoneProvenance(record: TrustZoneRecord): TrustZoneProvenanceScore {\n const sourceClassWeight = SOURCE_CLASS_WEIGHTS[record.provenance.sourceClass];\n const sourceIdBonus = typeof record.provenance.sourceId === \"string\" ? 0.1 : 0;\n const evidenceHashBonus = typeof record.provenance.evidenceHash === \"string\" ? 0.2 : 0;\n const sessionKeyBonus = typeof record.provenance.sessionKey === \"string\" ? 0.05 : 0;\n const total = roundTrustScore(\n Math.min(1, sourceClassWeight + sourceIdBonus + evidenceHashBonus + sessionKeyBonus),\n );\n\n return {\n total,\n band: trustScoreBand(total),\n anchored: hasAnchoredProvenance(record),\n sourceClassWeight,\n sourceIdBonus,\n evidenceHashBonus,\n sessionKeyBonus,\n };\n}\n\nexport function planTrustZonePromotion(options: {\n record: TrustZoneRecord;\n targetZone: TrustZoneName;\n}): TrustZonePromotionPlan {\n const { record, targetZone } = options;\n const reasons: string[] = [];\n const provenanceAnchored = hasAnchoredProvenance(record);\n\n if (record.zone === targetZone) {\n reasons.push(`record is already in the ${targetZone} zone`);\n }\n if (record.zone === \"trusted\") {\n reasons.push(\"trusted records are terminal and cannot be promoted again\");\n }\n if (record.zone === \"quarantine\" && targetZone === \"trusted\") {\n reasons.push(\"quarantine records must pass through working before trusted promotion\");\n }\n if (record.zone === \"working\" && targetZone === \"quarantine\") {\n reasons.push(\"working records cannot be demoted back into quarantine in this promotion path\");\n }\n if (record.zone === \"quarantine\" && targetZone !== \"working\") {\n reasons.push(\"quarantine promotions only support the working zone\");\n }\n if (record.zone === \"working\" && targetZone !== \"trusted\") {\n reasons.push(\"working promotions only support the trusted zone\");\n }\n if (\n targetZone === \"trusted\" &&\n [\"tool_output\", \"web_content\", \"subagent_trace\"].includes(record.provenance.sourceClass) &&\n provenanceAnchored !== true\n ) {\n reasons.push(\"trusted promotion for external/tool-derived provenance requires both provenance.sourceId and provenance.evidenceHash\");\n }\n\n return {\n allowed: reasons.length === 0,\n reasons,\n sourceRecordId: record.recordId,\n sourceZone: record.zone,\n targetZone,\n provenanceAnchored,\n };\n}\n\nasync function findTrustZoneRecordById(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n recordId: string;\n}): Promise<TrustZoneRecord | null> {\n const { entries } = await readTrustZoneRecordEntries(options);\n entries.sort((a, b) => b.record.recordedAt.localeCompare(a.record.recordedAt));\n return entries.find((entry) => entry.record.recordId === options.recordId)?.record ?? null;\n}\n\nexport async function promoteTrustZoneRecord(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled?: boolean;\n sourceRecordId: string;\n targetZone: TrustZoneName;\n recordedAt: string;\n promotionReason: string;\n summary?: string;\n dryRun?: boolean;\n}): Promise<TrustZonePromotionResult> {\n if (options.enabled !== true) {\n throw new Error(\"trust zone promotion requires trustZonesEnabled=true\");\n }\n if (options.promotionEnabled !== true) {\n throw new Error(\"trust zone promotion requires quarantinePromotionEnabled=true\");\n }\n\n const sourceRecord = await findTrustZoneRecordById({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n recordId: assertSafePathSegment(assertString(options.sourceRecordId, \"sourceRecordId\"), \"sourceRecordId\"),\n });\n if (!sourceRecord) {\n throw new Error(`source trust-zone record not found: ${options.sourceRecordId}`);\n }\n\n const plan = planTrustZonePromotion({\n record: sourceRecord,\n targetZone: options.targetZone,\n });\n if (!plan.allowed) {\n throw new Error(`trust-zone promotion denied: ${plan.reasons.join(\"; \")}`);\n }\n\n const corroboration = requiresCorroboration(sourceRecord, options.targetZone, options.poisoningDefenseEnabled === true)\n ? summarizeCorroboration({\n sourceRecord,\n records: (await readTrustZoneRecordEntries({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n })).entries.map((entry) => entry.record),\n })\n : null;\n\n if (corroboration && corroboration.count === 0) {\n throw new Error(\"trust-zone promotion denied: corroboration is required for risky trusted promotions\");\n }\n\n const recordedAt = assertIsoRecordedAt(assertString(options.recordedAt, \"recordedAt\"));\n const promotionReason = assertString(options.promotionReason, \"promotionReason\");\n const nextRecord: TrustZoneRecord = {\n schemaVersion: 1,\n recordId: buildPromotionRecordId(sourceRecord.recordId, options.targetZone, recordedAt),\n zone: options.targetZone,\n recordedAt,\n kind: sourceRecord.kind,\n summary: optionalString(options.summary) ?? sourceRecord.summary,\n provenance: sourceRecord.provenance,\n promotedFromZone: sourceRecord.zone,\n entityRefs: sourceRecord.entityRefs,\n tags: dedupeStrings([...(sourceRecord.tags ?? []), \"promotion\"]),\n metadata: {\n ...(sourceRecord.metadata ?? {}),\n sourceRecordId: sourceRecord.recordId,\n promotionReason,\n ...(corroboration\n ? {\n corroborated: \"true\",\n corroborationCount: String(corroboration.count),\n corroborationSources: corroboration.sourceClasses.join(\",\"),\n }\n : {}),\n },\n };\n\n if (options.dryRun === true) {\n return {\n plan,\n wroteRecord: false,\n record: nextRecord,\n sourceRecord,\n };\n }\n\n const filePath = await recordTrustZoneRecord({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n record: nextRecord,\n });\n\n return {\n plan,\n wroteRecord: true,\n record: nextRecord,\n filePath,\n sourceRecord,\n };\n}\n\nasync function readTrustZoneRecordEntries(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n}): Promise<{\n files: string[];\n entries: TrustZoneRecordEntry[];\n invalidRecords: Array<{ path: string; error: string }>;\n}> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const files = await listJsonFiles(path.join(rootDir, \"zones\"));\n const entries: TrustZoneRecordEntry[] = [];\n const invalidRecords: Array<{ path: string; error: string }> = [];\n for (const filePath of files) {\n try {\n entries.push({\n filePath,\n record: validateTrustZoneRecord(await readJsonFile(filePath)),\n });\n } catch (error) {\n invalidRecords.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { files, entries, invalidRecords };\n}\n\nfunction lexicalScoreTrustZoneRecord(\n record: TrustZoneRecord,\n queryTokens: Set<string>,\n): { score: number; matchedFields: string[] } {\n const weightedFields: Array<[field: string, value: string | undefined, weight: number]> = [\n [\"summary\", record.summary, 4],\n [\"kind\", record.kind, 1],\n [\"zone\", record.zone, 1],\n [\"sourceClass\", record.provenance.sourceClass, 1],\n [\"entityRefs\", record.entityRefs?.join(\" \"), 2],\n [\"tags\", record.tags?.join(\" \"), 2],\n [\"metadata\", record.metadata ? Object.values(record.metadata).join(\" \") : undefined, 1],\n ];\n\n let score = 0;\n const matchedFields: string[] = [];\n for (const [field, value, weight] of weightedFields) {\n const matches = countRecallTokenOverlap(queryTokens, value, [\"what\"]);\n if (matches > 0) matchedFields.push(field);\n score += matches * weight;\n }\n return { score, matchedFields };\n}\n\nfunction zonePriority(zone: TrustZoneName): number {\n switch (zone) {\n case \"trusted\":\n return 3;\n case \"working\":\n return 2;\n case \"quarantine\":\n return 1;\n }\n}\n\nfunction scoreTrustZoneRecord(\n record: TrustZoneRecord,\n lexicalScore: number,\n sessionKey?: string,\n): number {\n let score = lexicalScore;\n score += zonePriority(record.zone);\n if (sessionKey && record.provenance.sessionKey === sessionKey) score += 1;\n\n const recordedAtMs = Date.parse(record.recordedAt);\n if (Number.isFinite(recordedAtMs)) {\n const ageHours = Math.max(0, (Date.now() - recordedAtMs) / 3_600_000);\n score += 1 / (1 + ageHours);\n }\n return score;\n}\n\nexport async function searchTrustZoneRecords(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n query: string;\n maxResults: number;\n sessionKey?: string;\n}): Promise<TrustZoneSearchResult[]> {\n const maxResults = Math.max(0, Math.floor(options.maxResults));\n if (maxResults === 0) return [];\n\n const { entries } = await readTrustZoneRecordEntries(options);\n const records = entries.map((entry) => entry.record);\n const candidates = records.filter((record) => record.zone !== \"quarantine\");\n if (candidates.length === 0) return [];\n\n const queryTokens = new Set(normalizeRecallTokens(options.query, [\"what\"]));\n if (queryTokens.size === 0) return [];\n\n const scored = candidates.map((record) => {\n const lexical = lexicalScoreTrustZoneRecord(record, queryTokens);\n return {\n record,\n matchedFields: lexical.matchedFields,\n lexicalScore: lexical.score,\n score: scoreTrustZoneRecord(record, lexical.score, options.sessionKey),\n };\n });\n\n const filtered = scored.filter((result) => result.lexicalScore > 0);\n filtered.sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n return right.record.recordedAt.localeCompare(left.record.recordedAt);\n });\n\n return filtered.slice(0, maxResults).map(({ record, score, matchedFields }) => ({\n record,\n score,\n matchedFields,\n }));\n}\n\nexport async function listTrustZoneRecords(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n query?: string;\n zone?: TrustZoneName;\n kind?: TrustZoneRecordKind;\n sourceClass?: TrustZoneSourceClass;\n limit?: number;\n offset?: number;\n}): Promise<TrustZoneListResult> {\n const limit = Number.isFinite(options.limit) ? Math.max(1, Math.min(200, Math.floor(options.limit ?? 25))) : 25;\n const offset = Number.isFinite(options.offset) ? Math.max(0, Math.floor(options.offset ?? 0)) : 0;\n const zoneFilter = options.zone?.trim();\n const kindFilter = options.kind?.trim();\n const sourceClassFilter = options.sourceClass?.trim();\n const queryTokens = new Set(normalizeRecallTokens(options.query ?? \"\", [\"what\"]));\n\n const { entries } = await readTrustZoneRecordEntries(options);\n const filtered = entries\n .filter((entry) => !zoneFilter || entry.record.zone === zoneFilter)\n .filter((entry) => !kindFilter || entry.record.kind === kindFilter)\n .filter((entry) => !sourceClassFilter || entry.record.provenance.sourceClass === sourceClassFilter)\n .map((entry) => ({\n entry,\n lexical: queryTokens.size > 0 ? lexicalScoreTrustZoneRecord(entry.record, queryTokens) : null,\n }))\n .filter((candidate) => queryTokens.size === 0 || (candidate.lexical?.score ?? 0) > 0);\n\n filtered.sort((left, right) => {\n const leftScore = left.lexical?.score ?? 0;\n const rightScore = right.lexical?.score ?? 0;\n if (rightScore !== leftScore) return rightScore - leftScore;\n return right.entry.record.recordedAt.localeCompare(left.entry.record.recordedAt);\n });\n\n return {\n total: filtered.length,\n count: filtered.slice(offset, offset + limit).length,\n limit,\n offset,\n records: filtered.slice(offset, offset + limit).map((candidate) => candidate.entry),\n allRecords: entries.map((entry) => entry.record),\n };\n}\n\nexport function summarizeTrustZonePromotionReadiness(options: {\n record: TrustZoneRecord;\n allRecords: TrustZoneRecord[];\n poisoningDefenseEnabled: boolean;\n}): TrustZonePromotionReadiness {\n if (options.record.zone === \"trusted\") {\n return {\n allowed: false,\n reasons: [\"trusted records are terminal and do not have a next promotion step\"],\n requiresCorroboration: false,\n corroborationCount: 0,\n corroborationSourceClasses: [],\n };\n }\n\n const nextTargetZone: TrustZoneName = options.record.zone === \"quarantine\" ? \"working\" : \"trusted\";\n const plan = planTrustZonePromotion({\n record: options.record,\n targetZone: nextTargetZone,\n });\n const requires = requiresCorroboration(options.record, nextTargetZone, options.poisoningDefenseEnabled);\n const corroboration = requires\n ? summarizeCorroboration({\n sourceRecord: options.record,\n records: options.allRecords,\n })\n : { count: 0, sourceClasses: [] };\n\n const reasons = [...plan.reasons];\n if (requires && corroboration.count === 0) {\n reasons.push(\"trusted promotion requires corroboration from an independent non-quarantine source\");\n }\n\n return {\n nextTargetZone,\n allowed: plan.allowed && (!requires || corroboration.count > 0),\n reasons,\n requiresCorroboration: requires,\n corroborationCount: corroboration.count,\n corroborationSourceClasses: corroboration.sourceClasses,\n };\n}\n\nfunction addMinutes(baseIso: string, minutes: number): string {\n const baseMs = Date.parse(baseIso);\n if (!Number.isFinite(baseMs)) {\n throw new Error(\"recordedAt must be a valid ISO timestamp\");\n }\n return new Date(baseMs + minutes * 60_000).toISOString();\n}\n\nfunction buildTrustZoneDemoSeedRunId(baseRecordedAt: string): string {\n return baseRecordedAt.replace(/[^0-9]/g, \"\");\n}\n\nfunction buildTrustZoneDemoRecordId(baseId: string, seedRunId: string): string {\n return `${baseId}-${seedRunId}`;\n}\n\nfunction buildTrustZoneDemoRecords(baseRecordedAt: string, scenario: string): TrustZoneRecord[] {\n const demoTag = \"trust-zone-demo\";\n const commonMetadata = {\n demoScenario: scenario,\n demoSeed: \"true\",\n };\n const seedRunId = buildTrustZoneDemoSeedRunId(baseRecordedAt);\n return [\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-quarantine-ready\", seedRunId),\n zone: \"quarantine\",\n recordedAt: addMinutes(baseRecordedAt, 0),\n kind: \"external\",\n summary: \"Vendor portal policy excerpt captured before validation for Acme Industrial onboarding.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, -2),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"https://vendor.example.com/policies/acme-industrial.pdf\",\n evidenceHash: \"sha256:vendor-portal-policy-proof\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"captured-external-policy\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-blocked\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 2),\n kind: \"external\",\n summary: \"Unverified rumor about a production freeze captured without source evidence.\",\n provenance: {\n sourceClass: \"subagent_trace\",\n observedAt: addMinutes(baseRecordedAt, 1),\n sessionKey: \"demo:enterprise-buyer-v1\",\n },\n entityRefs: [\"workspace:finance\", \"incident:freeze-rumor\"],\n tags: [demoTag, \"enterprise-demo\", \"needs-evidence\"],\n metadata: {\n ...commonMetadata,\n story: \"working-missing-provenance\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-awaiting-corroboration\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 6),\n kind: \"state\",\n summary: \"Tool output says the finance SSO certificate rotation completed successfully.\",\n provenance: {\n sourceClass: \"tool_output\",\n observedAt: addMinutes(baseRecordedAt, 5),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"tool:sso-rotation-run-42\",\n evidenceHash: \"sha256:sso-rotation-log\",\n },\n entityRefs: [\"finding:finance-sso-certificate-rotation-tool-output-pending\"],\n tags: [demoTag, \"enterprise-demo\", \"sso-rotation-pending\"],\n metadata: {\n ...commonMetadata,\n story: \"working-awaiting-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-corroborated\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 7),\n kind: \"state\",\n summary: \"Tool output says the vendor onboarding policy sync completed with anchored evidence ready for promotion.\",\n provenance: {\n sourceClass: \"tool_output\",\n observedAt: addMinutes(baseRecordedAt, 6),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"tool:vendor-policy-sync-run-9\",\n evidenceHash: \"sha256:vendor-policy-sync-log\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"working-with-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-corroboration\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 9),\n kind: \"external\",\n summary: \"Change ticket confirms the same vendor onboarding policy sync with matching artifact hash.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, 7),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"https://tickets.example.com/changes/CHG-4821\",\n evidenceHash: \"sha256:sso-rotation-ticket-proof\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"independent-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-trusted-governance-rule\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 13),\n kind: \"memory\",\n summary: \"Trusted promotion requires a ticket id and artifact hash before shared recall can use operator actions.\",\n provenance: {\n sourceClass: \"manual\",\n observedAt: addMinutes(baseRecordedAt, 11),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"review:trust-zone-policy\",\n evidenceHash: \"sha256:trust-zone-policy\",\n },\n promotedFromZone: \"working\",\n entityRefs: [\"policy:trust-zone-promotion\"],\n tags: [demoTag, \"enterprise-demo\", \"operator-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-policy\",\n },\n },\n ];\n}\n\nexport async function seedTrustZoneDemoDataset(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n scenario?: string;\n recordedAt?: string;\n dryRun?: boolean;\n}): Promise<TrustZoneDemoSeedResult> {\n if (options.enabled !== true) {\n throw new Error(\"trust zone demo seed requires trustZonesEnabled=true\");\n }\n\n const scenario = (options.scenario ?? \"enterprise-buyer-v1\").trim();\n if (scenario !== \"enterprise-buyer-v1\") {\n throw new Error(`unsupported trust-zone demo scenario: ${scenario}`);\n }\n\n const baseRecordedAt = assertIsoRecordedAt(options.recordedAt ?? new Date().toISOString(), \"recordedAt\");\n if (!Number.isFinite(Date.parse(baseRecordedAt))) {\n throw new Error(\"recordedAt must be a valid ISO timestamp\");\n }\n const records = buildTrustZoneDemoRecords(baseRecordedAt, scenario);\n if (options.dryRun === true) {\n return {\n scenario,\n dryRun: true,\n recordsWritten: 0,\n records,\n filePaths: [],\n };\n }\n\n const filePaths: string[] = [];\n for (const record of records) {\n filePaths.push(await recordTrustZoneRecord({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n record,\n }));\n }\n\n return {\n scenario,\n dryRun: false,\n recordsWritten: filePaths.length,\n records,\n filePaths,\n };\n}\n\nexport async function getTrustZoneStoreStatus(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled: boolean;\n}): Promise<TrustZoneStoreStatus> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const zonesDir = path.join(rootDir, \"zones\");\n const { files, entries, invalidRecords } = await readTrustZoneRecordEntries(options);\n const records = entries.map((entry) => entry.record);\n records.sort((a, b) => b.recordedAt.localeCompare(a.recordedAt));\n\n const byZone: Partial<Record<TrustZoneName, number>> = {};\n const byKind: Partial<Record<TrustZoneRecordKind, number>> = {};\n const byTrustBand: Partial<Record<TrustZoneScoreBand, number>> = {};\n let trustScoreTotal = 0;\n for (const record of records) {\n byZone[record.zone] = (byZone[record.zone] ?? 0) + 1;\n byKind[record.kind] = (byKind[record.kind] ?? 0) + 1;\n if (options.poisoningDefenseEnabled === true) {\n const score = scoreTrustZoneProvenance(record);\n byTrustBand[score.band] = (byTrustBand[score.band] ?? 0) + 1;\n trustScoreTotal += score.total;\n }\n }\n\n const averageTrustScore =\n options.poisoningDefenseEnabled === true && records.length > 0\n ? roundTrustScore(trustScoreTotal / records.length)\n : undefined;\n const latestRecordTrustScore =\n options.poisoningDefenseEnabled === true && records[0] ? scoreTrustZoneProvenance(records[0]) : undefined;\n\n return {\n enabled: options.enabled,\n promotionEnabled: options.promotionEnabled,\n poisoningDefenseEnabled: options.poisoningDefenseEnabled,\n rootDir,\n zonesDir,\n records: {\n total: files.length,\n valid: records.length,\n invalid: invalidRecords.length,\n byZone,\n byKind,\n latestRecordId: records[0]?.recordId,\n latestRecordedAt: records[0]?.recordedAt,\n latestZone: records[0]?.zone,\n averageTrustScore,\n byTrustBand: options.poisoningDefenseEnabled === true ? byTrustBand : undefined,\n },\n latestRecord: records[0],\n latestRecordTrustScore,\n invalidRecords,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,146 @@
1
+ // src/memory-cache.ts
2
+ var hotCacheByDir = /* @__PURE__ */ new Map();
3
+ var archiveCacheByDir = /* @__PURE__ */ new Map();
4
+ function getCachedMemories(baseDir, currentVersion) {
5
+ if (currentVersion === 0) return null;
6
+ const entry = hotCacheByDir.get(baseDir);
7
+ if (!entry || entry.version !== currentVersion) return null;
8
+ return [...entry.memories.values()];
9
+ }
10
+ function setCachedMemories(baseDir, memories, version) {
11
+ const map = /* @__PURE__ */ new Map();
12
+ for (const m of memories) map.set(m.path, m);
13
+ hotCacheByDir.set(baseDir, { memories: map, version, loadedAt: Date.now() });
14
+ }
15
+ function updateCacheOnWrite(baseDir, memory) {
16
+ const entry = hotCacheByDir.get(baseDir);
17
+ if (entry) entry.memories.set(memory.path, memory);
18
+ }
19
+ function updateCacheOnDelete(baseDir, filePath) {
20
+ const entry = hotCacheByDir.get(baseDir);
21
+ if (entry) entry.memories.delete(filePath);
22
+ }
23
+ function getCachedArchivedMemories(baseDir, currentVersion) {
24
+ if (currentVersion === 0) return null;
25
+ const entry = archiveCacheByDir.get(baseDir);
26
+ if (!entry || entry.version !== currentVersion) return null;
27
+ return [...entry.memories.values()];
28
+ }
29
+ function setCachedArchivedMemories(baseDir, memories, version) {
30
+ const map = /* @__PURE__ */ new Map();
31
+ for (const m of memories) map.set(m.path, m);
32
+ archiveCacheByDir.set(baseDir, { memories: map, version, loadedAt: Date.now() });
33
+ }
34
+ var entityCacheByDir = /* @__PURE__ */ new Map();
35
+ function getCachedEntities(baseDir, currentVersion) {
36
+ if (currentVersion === 0) return null;
37
+ const entry = entityCacheByDir.get(baseDir);
38
+ if (!entry || entry.version !== currentVersion) return null;
39
+ return entry.entities;
40
+ }
41
+ function setCachedEntities(baseDir, entities, version) {
42
+ entityCacheByDir.set(baseDir, { entities, version, loadedAt: Date.now() });
43
+ }
44
+ var episodeMapByDir = /* @__PURE__ */ new Map();
45
+ var ruleMemoriesByDir = /* @__PURE__ */ new Map();
46
+ function getCachedEpisodeMap(baseDir, currentVersion) {
47
+ if (currentVersion === 0) return null;
48
+ const entry = episodeMapByDir.get(baseDir);
49
+ if (!entry || entry.sourceVersion !== currentVersion) return null;
50
+ return entry.data;
51
+ }
52
+ function setCachedEpisodeMap(baseDir, memories, version) {
53
+ const map = /* @__PURE__ */ new Map();
54
+ for (const m of memories) {
55
+ if (m.frontmatter.status === "archived") continue;
56
+ if (m.frontmatter.memoryKind !== "episode") continue;
57
+ map.set(m.frontmatter.id, m);
58
+ }
59
+ episodeMapByDir.set(baseDir, { data: map, sourceVersion: version });
60
+ return map;
61
+ }
62
+ function getCachedRuleMemories(baseDir, currentVersion) {
63
+ if (currentVersion === 0) return null;
64
+ const entry = ruleMemoriesByDir.get(baseDir);
65
+ if (!entry || entry.sourceVersion !== currentVersion) return null;
66
+ return entry.data;
67
+ }
68
+ function setCachedRuleMemories(baseDir, memories, version) {
69
+ const byId = /* @__PURE__ */ new Map();
70
+ const all = [];
71
+ for (const m of memories) {
72
+ byId.set(m.frontmatter.id, m);
73
+ if (m.frontmatter.category === "rule" && m.frontmatter.status !== "archived") {
74
+ all.push(m);
75
+ }
76
+ }
77
+ const result = { all, byId };
78
+ ruleMemoriesByDir.set(baseDir, { data: result, sourceVersion: version });
79
+ return result;
80
+ }
81
+ var QMD_CACHE_TTL_MS = 6e4;
82
+ var qmdSearchCache = /* @__PURE__ */ new Map();
83
+ function getCachedQmdSearch(cacheKey) {
84
+ const entry = qmdSearchCache.get(cacheKey);
85
+ if (!entry) return null;
86
+ if (Date.now() - entry.cachedAt > QMD_CACHE_TTL_MS) {
87
+ qmdSearchCache.delete(cacheKey);
88
+ return null;
89
+ }
90
+ return entry.results;
91
+ }
92
+ function setCachedQmdSearch(cacheKey, results) {
93
+ qmdSearchCache.set(cacheKey, { results, cachedAt: Date.now() });
94
+ if (qmdSearchCache.size > 200) {
95
+ const now = Date.now();
96
+ for (const [key, entry] of qmdSearchCache) {
97
+ if (now - entry.cachedAt > QMD_CACHE_TTL_MS) qmdSearchCache.delete(key);
98
+ }
99
+ }
100
+ }
101
+ function clearMemoryCache(baseDir) {
102
+ if (baseDir) {
103
+ hotCacheByDir.delete(baseDir);
104
+ archiveCacheByDir.delete(baseDir);
105
+ entityCacheByDir.delete(baseDir);
106
+ episodeMapByDir.delete(baseDir);
107
+ ruleMemoriesByDir.delete(baseDir);
108
+ } else {
109
+ hotCacheByDir.clear();
110
+ archiveCacheByDir.clear();
111
+ entityCacheByDir.clear();
112
+ episodeMapByDir.clear();
113
+ ruleMemoriesByDir.clear();
114
+ qmdSearchCache.clear();
115
+ }
116
+ }
117
+ function getMemoryCacheStats(baseDir) {
118
+ const hot = hotCacheByDir.get(baseDir);
119
+ const archive = archiveCacheByDir.get(baseDir);
120
+ return {
121
+ hotSize: hot?.memories.size ?? 0,
122
+ archiveSize: archive?.memories.size ?? 0,
123
+ hotVersion: hot?.version ?? null,
124
+ archiveVersion: archive?.version ?? null
125
+ };
126
+ }
127
+
128
+ export {
129
+ getCachedMemories,
130
+ setCachedMemories,
131
+ updateCacheOnWrite,
132
+ updateCacheOnDelete,
133
+ getCachedArchivedMemories,
134
+ setCachedArchivedMemories,
135
+ getCachedEntities,
136
+ setCachedEntities,
137
+ getCachedEpisodeMap,
138
+ setCachedEpisodeMap,
139
+ getCachedRuleMemories,
140
+ setCachedRuleMemories,
141
+ getCachedQmdSearch,
142
+ setCachedQmdSearch,
143
+ clearMemoryCache,
144
+ getMemoryCacheStats
145
+ };
146
+ //# sourceMappingURL=chunk-ESSMF2FR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/memory-cache.ts"],"sourcesContent":["import type { EntityFile, MemoryFile } from \"./types.js\";\n\ninterface CacheEntry {\n memories: Map<string, MemoryFile>; // keyed by file path\n version: number;\n loadedAt: number;\n}\n\n// Module-level singleton — shared across all StorageManager instances and sessions\nconst hotCacheByDir = new Map<string, CacheEntry>();\nconst archiveCacheByDir = new Map<string, CacheEntry>();\n\nexport function getCachedMemories(baseDir: string, currentVersion: number): MemoryFile[] | null {\n // Don't serve from cache when version tracking is unavailable (version=0).\n // This ensures tests and fresh installs without a version file always read disk.\n if (currentVersion === 0) return null;\n const entry = hotCacheByDir.get(baseDir);\n if (!entry || entry.version !== currentVersion) return null;\n return [...entry.memories.values()];\n}\n\nexport function setCachedMemories(baseDir: string, memories: MemoryFile[], version: number): void {\n const map = new Map<string, MemoryFile>();\n for (const m of memories) map.set(m.path, m);\n hotCacheByDir.set(baseDir, { memories: map, version, loadedAt: Date.now() });\n}\n\nexport function updateCacheOnWrite(baseDir: string, memory: MemoryFile): void {\n const entry = hotCacheByDir.get(baseDir);\n if (entry) entry.memories.set(memory.path, memory);\n}\n\nexport function updateCacheOnDelete(baseDir: string, filePath: string): void {\n const entry = hotCacheByDir.get(baseDir);\n if (entry) entry.memories.delete(filePath);\n}\n\n// Archive cache — same pattern, separate store\nexport function getCachedArchivedMemories(baseDir: string, currentVersion: number): MemoryFile[] | null {\n if (currentVersion === 0) return null;\n const entry = archiveCacheByDir.get(baseDir);\n if (!entry || entry.version !== currentVersion) return null;\n return [...entry.memories.values()];\n}\n\nexport function setCachedArchivedMemories(baseDir: string, memories: MemoryFile[], version: number): void {\n const map = new Map<string, MemoryFile>();\n for (const m of memories) map.set(m.path, m);\n archiveCacheByDir.set(baseDir, { memories: map, version, loadedAt: Date.now() });\n}\n\n// Entity cache — same pattern as memory cache\nconst entityCacheByDir = new Map<string, { entities: EntityFile[]; version: number; loadedAt: number }>();\n\nexport function getCachedEntities(baseDir: string, currentVersion: number): EntityFile[] | null {\n if (currentVersion === 0) return null;\n const entry = entityCacheByDir.get(baseDir);\n if (!entry || entry.version !== currentVersion) return null;\n return entry.entities;\n}\n\nexport function setCachedEntities(baseDir: string, entities: EntityFile[], version: number): void {\n entityCacheByDir.set(baseDir, { entities, version, loadedAt: Date.now() });\n}\n\n// Derived caches — pre-filtered views invalidated alongside the main cache.\n// These avoid O(146K) filter+map on every verified recall/rules call.\ninterface DerivedCacheEntry<T> {\n data: T;\n sourceVersion: number; // matches the hot cache version it was derived from\n}\n\nconst episodeMapByDir = new Map<string, DerivedCacheEntry<Map<string, MemoryFile>>>();\nconst ruleMemoriesByDir = new Map<string, DerivedCacheEntry<{ all: MemoryFile[]; byId: Map<string, MemoryFile> }>>();\n\n/** Get a pre-filtered Map of episode memories (keyed by ID). Derived from hot cache. */\nexport function getCachedEpisodeMap(baseDir: string, currentVersion: number): Map<string, MemoryFile> | null {\n if (currentVersion === 0) return null;\n const entry = episodeMapByDir.get(baseDir);\n if (!entry || entry.sourceVersion !== currentVersion) return null;\n return entry.data;\n}\n\n/** Build and cache the episode memory map from the full memory list. */\nexport function setCachedEpisodeMap(baseDir: string, memories: MemoryFile[], version: number): Map<string, MemoryFile> {\n const map = new Map<string, MemoryFile>();\n for (const m of memories) {\n if (m.frontmatter.status === \"archived\") continue;\n if (m.frontmatter.memoryKind !== \"episode\") continue;\n map.set(m.frontmatter.id, m);\n }\n episodeMapByDir.set(baseDir, { data: map, sourceVersion: version });\n return map;\n}\n\n/** Get pre-filtered rule memories. Derived from hot cache. */\nexport function getCachedRuleMemories(baseDir: string, currentVersion: number): { all: MemoryFile[]; byId: Map<string, MemoryFile> } | null {\n if (currentVersion === 0) return null;\n const entry = ruleMemoriesByDir.get(baseDir);\n if (!entry || entry.sourceVersion !== currentVersion) return null;\n return entry.data;\n}\n\n/** Build and cache the rule memories from the full memory list. */\nexport function setCachedRuleMemories(baseDir: string, memories: MemoryFile[], version: number): { all: MemoryFile[]; byId: Map<string, MemoryFile> } {\n const byId = new Map<string, MemoryFile>();\n const all: MemoryFile[] = [];\n for (const m of memories) {\n byId.set(m.frontmatter.id, m);\n if (m.frontmatter.category === \"rule\" && m.frontmatter.status !== \"archived\") {\n all.push(m);\n }\n }\n const result = { all, byId };\n ruleMemoriesByDir.set(baseDir, { data: result, sourceVersion: version });\n return result;\n}\n\n// QMD search result cache — short-lived (60s TTL) to avoid stale results\n// while reducing redundant daemon calls for repeated/similar queries.\ninterface QmdCacheEntry {\n results: unknown[];\n cachedAt: number;\n}\nconst QMD_CACHE_TTL_MS = 60_000;\nconst qmdSearchCache = new Map<string, QmdCacheEntry>();\n\nexport function getCachedQmdSearch(cacheKey: string): unknown[] | null {\n const entry = qmdSearchCache.get(cacheKey);\n if (!entry) return null;\n if (Date.now() - entry.cachedAt > QMD_CACHE_TTL_MS) {\n qmdSearchCache.delete(cacheKey);\n return null;\n }\n return entry.results;\n}\n\nexport function setCachedQmdSearch(cacheKey: string, results: unknown[]): void {\n qmdSearchCache.set(cacheKey, { results, cachedAt: Date.now() });\n // Evict old entries to prevent unbounded growth\n if (qmdSearchCache.size > 200) {\n const now = Date.now();\n for (const [key, entry] of qmdSearchCache) {\n if (now - entry.cachedAt > QMD_CACHE_TTL_MS) qmdSearchCache.delete(key);\n }\n }\n}\n\nexport function clearMemoryCache(baseDir?: string): void {\n if (baseDir) {\n hotCacheByDir.delete(baseDir);\n archiveCacheByDir.delete(baseDir);\n entityCacheByDir.delete(baseDir);\n episodeMapByDir.delete(baseDir);\n ruleMemoriesByDir.delete(baseDir);\n } else {\n hotCacheByDir.clear();\n archiveCacheByDir.clear();\n entityCacheByDir.clear();\n episodeMapByDir.clear();\n ruleMemoriesByDir.clear();\n qmdSearchCache.clear();\n }\n}\n\nexport function getMemoryCacheStats(baseDir: string): {\n hotSize: number;\n archiveSize: number;\n hotVersion: number | null;\n archiveVersion: number | null;\n} {\n const hot = hotCacheByDir.get(baseDir);\n const archive = archiveCacheByDir.get(baseDir);\n return {\n hotSize: hot?.memories.size ?? 0,\n archiveSize: archive?.memories.size ?? 0,\n hotVersion: hot?.version ?? null,\n archiveVersion: archive?.version ?? null,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,158 @@
1
+ // src/summary-snapshot.ts
2
+ import {
3
+ mkdir,
4
+ open,
5
+ readFile,
6
+ stat,
7
+ unlink,
8
+ utimes,
9
+ writeFile
10
+ } from "fs/promises";
11
+ import path from "path";
12
+ import { z } from "zod";
13
+ var summarySnapshotSchemaVersion = 1;
14
+ var SummarySnapshotItemSchema = z.object({
15
+ hour: z.string(),
16
+ sessionKey: z.string(),
17
+ bullets: z.array(z.string()),
18
+ turnCount: z.number().int().nonnegative(),
19
+ generatedAt: z.string()
20
+ });
21
+ var SummarySnapshotSchema = z.object({
22
+ schemaVersion: z.number().default(summarySnapshotSchemaVersion),
23
+ sessionKey: z.string(),
24
+ generatedAt: z.string().datetime({ offset: true }),
25
+ summaries: z.array(SummarySnapshotItemSchema)
26
+ });
27
+ var summarySnapshotUpserts = /* @__PURE__ */ new Map();
28
+ var summarySnapshotLockTimeoutMs = 5e3;
29
+ var summarySnapshotLockStaleMs = 3e4;
30
+ var summarySnapshotLockHeartbeatMs = Math.max(
31
+ 1e3,
32
+ Math.floor(summarySnapshotLockStaleMs / 3)
33
+ );
34
+ function summarySnapshotPath(memoryDir, sessionKey) {
35
+ return path.join(memoryDir, "state", "summaries", `${sessionKey}.json`);
36
+ }
37
+ function summarySnapshotLockPath(memoryDir, sessionKey) {
38
+ return path.join(memoryDir, "state", "summaries", `${sessionKey}.lock`);
39
+ }
40
+ async function readSummarySnapshot(memoryDir, sessionKey) {
41
+ try {
42
+ const filePath = summarySnapshotPath(memoryDir, sessionKey);
43
+ const raw = await readFile(filePath, "utf-8");
44
+ const data = SummarySnapshotSchema.parse(JSON.parse(raw));
45
+ if (data.sessionKey !== sessionKey) return null;
46
+ return data.summaries;
47
+ } catch {
48
+ return null;
49
+ }
50
+ }
51
+ async function writeSummarySnapshot(memoryDir, sessionKey, summaries) {
52
+ const filePath = summarySnapshotPath(memoryDir, sessionKey);
53
+ await mkdir(path.dirname(filePath), { recursive: true });
54
+ const payload = {
55
+ schemaVersion: summarySnapshotSchemaVersion,
56
+ sessionKey,
57
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
58
+ summaries: summaries.map((summary) => ({
59
+ hour: summary.hour,
60
+ sessionKey: summary.sessionKey,
61
+ bullets: summary.bullets,
62
+ turnCount: summary.turnCount,
63
+ generatedAt: summary.generatedAt
64
+ })).sort((a, b) => new Date(b.hour).getTime() - new Date(a.hour).getTime())
65
+ };
66
+ await writeFile(filePath, JSON.stringify(payload, null, 2), "utf-8");
67
+ }
68
+ async function withSummarySnapshotLock(memoryDir, sessionKey, work) {
69
+ const previous = summarySnapshotUpserts.get(sessionKey) ?? Promise.resolve();
70
+ let release;
71
+ const current = new Promise((resolve) => {
72
+ release = resolve;
73
+ });
74
+ const chained = previous.then(() => current);
75
+ summarySnapshotUpserts.set(sessionKey, chained);
76
+ await previous;
77
+ try {
78
+ return await withExclusiveSummarySnapshotFileLock(
79
+ summarySnapshotLockPath(memoryDir, sessionKey),
80
+ work
81
+ );
82
+ } finally {
83
+ release();
84
+ if (summarySnapshotUpserts.get(sessionKey) === chained) {
85
+ summarySnapshotUpserts.delete(sessionKey);
86
+ }
87
+ }
88
+ }
89
+ async function upsertSummarySnapshot(memoryDir, summary) {
90
+ await withSummarySnapshotLock(memoryDir, summary.sessionKey, async () => {
91
+ const existing = await readSummarySnapshot(memoryDir, summary.sessionKey);
92
+ const byHour = /* @__PURE__ */ new Map();
93
+ for (const item of existing ?? []) {
94
+ byHour.set(item.hour, {
95
+ ...item,
96
+ generatedAt: item.generatedAt || (/* @__PURE__ */ new Date()).toISOString(),
97
+ sessionKey: summary.sessionKey
98
+ });
99
+ }
100
+ byHour.set(summary.hour, summary);
101
+ const next = Array.from(byHour.values()).sort(
102
+ (a, b) => new Date(b.hour).getTime() - new Date(a.hour).getTime()
103
+ );
104
+ await writeSummarySnapshot(memoryDir, summary.sessionKey, next);
105
+ });
106
+ }
107
+ async function withExclusiveSummarySnapshotFileLock(lockPath, callback) {
108
+ await mkdir(path.dirname(lockPath), { recursive: true });
109
+ const startedAt = Date.now();
110
+ while (true) {
111
+ try {
112
+ const handle = await open(lockPath, "wx");
113
+ let heartbeat = null;
114
+ if (summarySnapshotLockHeartbeatMs > 0) {
115
+ heartbeat = setInterval(() => {
116
+ void utimes(lockPath, /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date()).catch(() => void 0);
117
+ }, summarySnapshotLockHeartbeatMs);
118
+ heartbeat.unref?.();
119
+ }
120
+ try {
121
+ return await callback();
122
+ } finally {
123
+ if (heartbeat) clearInterval(heartbeat);
124
+ await handle.close().catch(() => void 0);
125
+ await unlink(lockPath).catch(() => void 0);
126
+ }
127
+ } catch (error) {
128
+ if (!isAlreadyExistsError(error)) throw error;
129
+ try {
130
+ const lockStat = await stat(lockPath);
131
+ if (Date.now() - lockStat.mtimeMs > summarySnapshotLockStaleMs) {
132
+ await unlink(lockPath).catch(() => void 0);
133
+ continue;
134
+ }
135
+ } catch {
136
+ continue;
137
+ }
138
+ if (Date.now() - startedAt > summarySnapshotLockTimeoutMs) {
139
+ throw new Error("timed out acquiring summary snapshot lock");
140
+ }
141
+ await sleep(10);
142
+ }
143
+ }
144
+ }
145
+ function isAlreadyExistsError(error) {
146
+ return typeof error === "object" && error !== null && "code" in error && error.code === "EEXIST";
147
+ }
148
+ function sleep(ms) {
149
+ return new Promise((resolve) => setTimeout(resolve, ms));
150
+ }
151
+
152
+ export {
153
+ summarySnapshotPath,
154
+ readSummarySnapshot,
155
+ writeSummarySnapshot,
156
+ upsertSummarySnapshot
157
+ };
158
+ //# sourceMappingURL=chunk-ETOW6ACV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/summary-snapshot.ts"],"sourcesContent":["import {\n mkdir,\n open,\n readFile,\n stat,\n unlink,\n utimes,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HourlySummary } from \"./types.js\";\n\nconst summarySnapshotSchemaVersion = 1;\n\nconst SummarySnapshotItemSchema = z.object({\n hour: z.string(),\n sessionKey: z.string(),\n bullets: z.array(z.string()),\n turnCount: z.number().int().nonnegative(),\n generatedAt: z.string(),\n});\n\nconst SummarySnapshotSchema = z.object({\n schemaVersion: z.number().default(summarySnapshotSchemaVersion),\n sessionKey: z.string(),\n generatedAt: z.string().datetime({ offset: true }),\n summaries: z.array(SummarySnapshotItemSchema),\n});\n\ntype SummarySnapshot = z.infer<typeof SummarySnapshotSchema>;\n\nconst summarySnapshotUpserts = new Map<string, Promise<void>>();\nconst summarySnapshotLockTimeoutMs = 5_000;\nconst summarySnapshotLockStaleMs = 30_000;\nconst summarySnapshotLockHeartbeatMs = Math.max(\n 1_000,\n Math.floor(summarySnapshotLockStaleMs / 3),\n);\n\nexport function summarySnapshotPath(\n memoryDir: string,\n sessionKey: string,\n): string {\n return path.join(memoryDir, \"state\", \"summaries\", `${sessionKey}.json`);\n}\n\nfunction summarySnapshotLockPath(memoryDir: string, sessionKey: string): string {\n return path.join(memoryDir, \"state\", \"summaries\", `${sessionKey}.lock`);\n}\n\nexport async function readSummarySnapshot(\n memoryDir: string,\n sessionKey: string,\n): Promise<HourlySummary[] | null> {\n try {\n const filePath = summarySnapshotPath(memoryDir, sessionKey);\n const raw = await readFile(filePath, \"utf-8\");\n const data = SummarySnapshotSchema.parse(JSON.parse(raw));\n if (data.sessionKey !== sessionKey) return null;\n return data.summaries;\n } catch {\n return null;\n }\n}\n\nexport async function writeSummarySnapshot(\n memoryDir: string,\n sessionKey: string,\n summaries: HourlySummary[],\n): Promise<void> {\n const filePath = summarySnapshotPath(memoryDir, sessionKey);\n await mkdir(path.dirname(filePath), { recursive: true });\n const payload: SummarySnapshot = {\n schemaVersion: summarySnapshotSchemaVersion,\n sessionKey,\n generatedAt: new Date().toISOString(),\n summaries: summaries\n .map((summary) => ({\n hour: summary.hour,\n sessionKey: summary.sessionKey,\n bullets: summary.bullets,\n turnCount: summary.turnCount,\n generatedAt: summary.generatedAt,\n }))\n .sort((a, b) => new Date(b.hour).getTime() - new Date(a.hour).getTime()),\n };\n await writeFile(filePath, JSON.stringify(payload, null, 2), \"utf-8\");\n}\n\nasync function withSummarySnapshotLock<T>(\n memoryDir: string,\n sessionKey: string,\n work: () => Promise<T>,\n): Promise<T> {\n const previous = summarySnapshotUpserts.get(sessionKey) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chained = previous.then(() => current);\n summarySnapshotUpserts.set(sessionKey, chained);\n\n await previous;\n try {\n return await withExclusiveSummarySnapshotFileLock(\n summarySnapshotLockPath(memoryDir, sessionKey),\n work,\n );\n } finally {\n release();\n if (summarySnapshotUpserts.get(sessionKey) === chained) {\n summarySnapshotUpserts.delete(sessionKey);\n }\n }\n}\n\nexport async function upsertSummarySnapshot(\n memoryDir: string,\n summary: HourlySummary,\n): Promise<void> {\n await withSummarySnapshotLock(memoryDir, summary.sessionKey, async () => {\n const existing = await readSummarySnapshot(memoryDir, summary.sessionKey);\n const byHour = new Map<string, HourlySummary>();\n for (const item of existing ?? []) {\n byHour.set(item.hour, {\n ...item,\n generatedAt: item.generatedAt || new Date().toISOString(),\n sessionKey: summary.sessionKey,\n });\n }\n byHour.set(summary.hour, summary);\n const next = Array.from(byHour.values()).sort(\n (a, b) => new Date(b.hour).getTime() - new Date(a.hour).getTime(),\n );\n await writeSummarySnapshot(memoryDir, summary.sessionKey, next);\n });\n}\n\nasync function withExclusiveSummarySnapshotFileLock<T>(\n lockPath: string,\n callback: () => Promise<T>,\n): Promise<T> {\n await mkdir(path.dirname(lockPath), { recursive: true });\n const startedAt = Date.now();\n\n while (true) {\n try {\n const handle = await open(lockPath, \"wx\");\n let heartbeat: NodeJS.Timeout | null = null;\n if (summarySnapshotLockHeartbeatMs > 0) {\n heartbeat = setInterval(() => {\n void utimes(lockPath, new Date(), new Date()).catch(() => undefined);\n }, summarySnapshotLockHeartbeatMs);\n heartbeat.unref?.();\n }\n try {\n return await callback();\n } finally {\n if (heartbeat) clearInterval(heartbeat);\n await handle.close().catch(() => undefined);\n await unlink(lockPath).catch(() => undefined);\n }\n } catch (error) {\n if (!isAlreadyExistsError(error)) throw error;\n try {\n const lockStat = await stat(lockPath);\n if (Date.now() - lockStat.mtimeMs > summarySnapshotLockStaleMs) {\n await unlink(lockPath).catch(() => undefined);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - startedAt > summarySnapshotLockTimeoutMs) {\n throw new Error(\"timed out acquiring summary snapshot lock\");\n }\n await sleep(10);\n }\n }\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"EEXIST\";\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"mappings":"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","names":[]}