@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,284 @@
1
+ import {
2
+ log
3
+ } from "./chunk-KWBU5S5U.js";
4
+
5
+ // src/threading.ts
6
+ import { readdir, readFile, writeFile, mkdir } from "fs/promises";
7
+ import path from "path";
8
+ var STOP_WORDS = /* @__PURE__ */ new Set([
9
+ "a",
10
+ "an",
11
+ "the",
12
+ "is",
13
+ "are",
14
+ "was",
15
+ "were",
16
+ "be",
17
+ "been",
18
+ "being",
19
+ "have",
20
+ "has",
21
+ "had",
22
+ "do",
23
+ "does",
24
+ "did",
25
+ "will",
26
+ "would",
27
+ "could",
28
+ "should",
29
+ "may",
30
+ "might",
31
+ "must",
32
+ "shall",
33
+ "can",
34
+ "need",
35
+ "to",
36
+ "of",
37
+ "in",
38
+ "for",
39
+ "on",
40
+ "with",
41
+ "at",
42
+ "by",
43
+ "from",
44
+ "as",
45
+ "into",
46
+ "through",
47
+ "during",
48
+ "before",
49
+ "after",
50
+ "above",
51
+ "below",
52
+ "between",
53
+ "this",
54
+ "that",
55
+ "these",
56
+ "those",
57
+ "i",
58
+ "me",
59
+ "my",
60
+ "we",
61
+ "our",
62
+ "you",
63
+ "your",
64
+ "he",
65
+ "she",
66
+ "it",
67
+ "they",
68
+ "them",
69
+ "their",
70
+ "what",
71
+ "which",
72
+ "who",
73
+ "how",
74
+ "when",
75
+ "where",
76
+ "why",
77
+ "and",
78
+ "but",
79
+ "or",
80
+ "if",
81
+ "because",
82
+ "so",
83
+ "just",
84
+ "about",
85
+ "like",
86
+ "also",
87
+ "very",
88
+ "really",
89
+ "here",
90
+ "there"
91
+ ]);
92
+ function extractKeywords(content, maxKeywords = 3) {
93
+ const words = content.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w.length >= 4 && !STOP_WORDS.has(w));
94
+ const freq = /* @__PURE__ */ new Map();
95
+ for (const word of words) {
96
+ freq.set(word, (freq.get(word) ?? 0) + 1);
97
+ }
98
+ return [...freq.entries()].sort((a, b) => b[1] - a[1]).slice(0, maxKeywords).map(([word]) => word);
99
+ }
100
+ function generateTitle(keywords) {
101
+ if (keywords.length === 0) return "Untitled Thread";
102
+ return keywords.map((k) => k.charAt(0).toUpperCase() + k.slice(1)).join(", ");
103
+ }
104
+ var ThreadingManager = class {
105
+ constructor(threadsDir, gapMinutes = 30) {
106
+ this.threadsDir = threadsDir;
107
+ this.gapMinutes = gapMinutes;
108
+ }
109
+ threadsDir;
110
+ gapMinutes;
111
+ currentThreadId = null;
112
+ lastTurnTimestamp = null;
113
+ lastSessionKey = null;
114
+ async ensureDirectory() {
115
+ await mkdir(this.threadsDir, { recursive: true });
116
+ }
117
+ /**
118
+ * Check if we should start a new thread based on session key and time gap.
119
+ */
120
+ shouldStartNewThread(turn) {
121
+ const turnTime = new Date(turn.timestamp).getTime();
122
+ if (turn.sessionKey && this.lastSessionKey && turn.sessionKey !== this.lastSessionKey) {
123
+ return true;
124
+ }
125
+ if (this.lastTurnTimestamp) {
126
+ const gapMs = turnTime - this.lastTurnTimestamp;
127
+ const gapMinutes = gapMs / (1e3 * 60);
128
+ if (gapMinutes > this.gapMinutes) {
129
+ return true;
130
+ }
131
+ }
132
+ if (!this.currentThreadId) {
133
+ return true;
134
+ }
135
+ return false;
136
+ }
137
+ /**
138
+ * Process a turn and return the thread ID it belongs to.
139
+ * Creates a new thread if needed.
140
+ */
141
+ async processTurn(turn, episodeIds) {
142
+ await this.ensureDirectory();
143
+ const turnTime = new Date(turn.timestamp).getTime();
144
+ if (this.shouldStartNewThread(turn)) {
145
+ const threadId = `thread-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
146
+ const thread = {
147
+ id: threadId,
148
+ title: "New Thread",
149
+ // Will be updated later with keywords
150
+ createdAt: turn.timestamp,
151
+ updatedAt: turn.timestamp,
152
+ sessionKey: turn.sessionKey,
153
+ episodeIds: [...episodeIds],
154
+ linkedThreadIds: []
155
+ };
156
+ await this.saveThread(thread);
157
+ this.currentThreadId = threadId;
158
+ log.debug(`created new thread ${threadId}`);
159
+ } else if (this.currentThreadId) {
160
+ const thread = await this.loadThread(this.currentThreadId);
161
+ if (thread) {
162
+ for (const id of episodeIds) {
163
+ if (!thread.episodeIds.includes(id)) {
164
+ thread.episodeIds.push(id);
165
+ }
166
+ }
167
+ thread.updatedAt = turn.timestamp;
168
+ await this.saveThread(thread);
169
+ }
170
+ }
171
+ this.lastTurnTimestamp = turnTime;
172
+ this.lastSessionKey = turn.sessionKey ?? null;
173
+ return this.currentThreadId;
174
+ }
175
+ /**
176
+ * Append persisted memory IDs to an existing thread.
177
+ * Keeps IDs unique and updates the thread timestamp.
178
+ */
179
+ async appendEpisodeIds(threadId, episodeIds) {
180
+ if (episodeIds.length === 0) return;
181
+ const thread = await this.loadThread(threadId);
182
+ if (!thread) return;
183
+ let changed = false;
184
+ for (const id of episodeIds) {
185
+ if (!thread.episodeIds.includes(id)) {
186
+ thread.episodeIds.push(id);
187
+ changed = true;
188
+ }
189
+ }
190
+ if (!changed) return;
191
+ thread.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
192
+ await this.saveThread(thread);
193
+ }
194
+ /**
195
+ * Update thread title based on accumulated content.
196
+ */
197
+ async updateThreadTitle(threadId, content) {
198
+ const thread = await this.loadThread(threadId);
199
+ if (!thread) return;
200
+ const keywords = extractKeywords(content);
201
+ const title = generateTitle(keywords);
202
+ if (title !== thread.title) {
203
+ thread.title = title;
204
+ thread.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
205
+ await this.saveThread(thread);
206
+ log.debug(`updated thread ${threadId} title: ${title}`);
207
+ }
208
+ }
209
+ /**
210
+ * Get all threads, sorted by updatedAt desc.
211
+ */
212
+ async getAllThreads() {
213
+ try {
214
+ const files = await readdir(this.threadsDir);
215
+ const threads = [];
216
+ for (const file of files) {
217
+ if (!file.endsWith(".json")) continue;
218
+ const thread = await this.loadThread(file.replace(".json", ""));
219
+ if (thread) threads.push(thread);
220
+ }
221
+ return threads.sort(
222
+ (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()
223
+ );
224
+ } catch {
225
+ return [];
226
+ }
227
+ }
228
+ /**
229
+ * Get a thread by ID.
230
+ */
231
+ async loadThread(threadId) {
232
+ const filePath = path.join(this.threadsDir, `${threadId}.json`);
233
+ try {
234
+ const raw = await readFile(filePath, "utf-8");
235
+ return JSON.parse(raw);
236
+ } catch {
237
+ return null;
238
+ }
239
+ }
240
+ /**
241
+ * Save a thread.
242
+ */
243
+ async saveThread(thread) {
244
+ await this.ensureDirectory();
245
+ const filePath = path.join(this.threadsDir, `${thread.id}.json`);
246
+ await writeFile(filePath, JSON.stringify(thread, null, 2), "utf-8");
247
+ }
248
+ /**
249
+ * Link two threads together.
250
+ */
251
+ async linkThreads(threadId1, threadId2) {
252
+ const thread1 = await this.loadThread(threadId1);
253
+ const thread2 = await this.loadThread(threadId2);
254
+ if (!thread1 || !thread2) return false;
255
+ if (!thread1.linkedThreadIds.includes(threadId2)) {
256
+ thread1.linkedThreadIds.push(threadId2);
257
+ await this.saveThread(thread1);
258
+ }
259
+ if (!thread2.linkedThreadIds.includes(threadId1)) {
260
+ thread2.linkedThreadIds.push(threadId1);
261
+ await this.saveThread(thread2);
262
+ }
263
+ return true;
264
+ }
265
+ /**
266
+ * Get the current thread ID (if any).
267
+ */
268
+ getCurrentThreadId() {
269
+ return this.currentThreadId;
270
+ }
271
+ /**
272
+ * Reset threading state (e.g., on plugin restart).
273
+ */
274
+ reset() {
275
+ this.currentThreadId = null;
276
+ this.lastTurnTimestamp = null;
277
+ this.lastSessionKey = null;
278
+ }
279
+ };
280
+
281
+ export {
282
+ ThreadingManager
283
+ };
284
+ //# sourceMappingURL=chunk-UCYSTFZR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/threading.ts"],"sourcesContent":["/**\n * Conversation Threading (Phase 3B)\n *\n * Groups related memories into conversation threads with auto-generated titles.\n * Thread boundary detection: new session key OR time gap > threshold.\n */\n\nimport { readdir, readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { log } from \"./logger.js\";\nimport type { BufferTurn, ConversationThread } from \"./types.js\";\n\n/** Stop words for title extraction */\nconst STOP_WORDS = new Set([\n \"a\", \"an\", \"the\", \"is\", \"are\", \"was\", \"were\", \"be\", \"been\", \"being\",\n \"have\", \"has\", \"had\", \"do\", \"does\", \"did\", \"will\", \"would\", \"could\",\n \"should\", \"may\", \"might\", \"must\", \"shall\", \"can\", \"need\", \"to\", \"of\",\n \"in\", \"for\", \"on\", \"with\", \"at\", \"by\", \"from\", \"as\", \"into\", \"through\",\n \"during\", \"before\", \"after\", \"above\", \"below\", \"between\", \"this\", \"that\",\n \"these\", \"those\", \"i\", \"me\", \"my\", \"we\", \"our\", \"you\", \"your\", \"he\",\n \"she\", \"it\", \"they\", \"them\", \"their\", \"what\", \"which\", \"who\", \"how\",\n \"when\", \"where\", \"why\", \"and\", \"but\", \"or\", \"if\", \"because\", \"so\",\n \"just\", \"about\", \"like\", \"also\", \"very\", \"really\", \"here\", \"there\",\n]);\n\n/**\n * Extract top keywords from content for thread title.\n * Simple TF approach (no IDF needed for single thread).\n */\nfunction extractKeywords(content: string, maxKeywords: number = 3): string[] {\n const words = content\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length >= 4 && !STOP_WORDS.has(w));\n\n // Count frequencies\n const freq = new Map<string, number>();\n for (const word of words) {\n freq.set(word, (freq.get(word) ?? 0) + 1);\n }\n\n // Sort by frequency, take top N\n return [...freq.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, maxKeywords)\n .map(([word]) => word);\n}\n\n/**\n * Generate a thread title from keywords.\n */\nfunction generateTitle(keywords: string[]): string {\n if (keywords.length === 0) return \"Untitled Thread\";\n // Capitalize and join\n return keywords\n .map((k) => k.charAt(0).toUpperCase() + k.slice(1))\n .join(\", \");\n}\n\nexport class ThreadingManager {\n private currentThreadId: string | null = null;\n private lastTurnTimestamp: number | null = null;\n private lastSessionKey: string | null = null;\n\n constructor(\n private readonly threadsDir: string,\n private readonly gapMinutes: number = 30,\n ) {}\n\n async ensureDirectory(): Promise<void> {\n await mkdir(this.threadsDir, { recursive: true });\n }\n\n /**\n * Check if we should start a new thread based on session key and time gap.\n */\n shouldStartNewThread(turn: BufferTurn): boolean {\n const turnTime = new Date(turn.timestamp).getTime();\n\n // Different session key = new thread\n if (turn.sessionKey && this.lastSessionKey && turn.sessionKey !== this.lastSessionKey) {\n return true;\n }\n\n // Time gap > threshold = new thread\n if (this.lastTurnTimestamp) {\n const gapMs = turnTime - this.lastTurnTimestamp;\n const gapMinutes = gapMs / (1000 * 60);\n if (gapMinutes > this.gapMinutes) {\n return true;\n }\n }\n\n // No current thread = new thread\n if (!this.currentThreadId) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Process a turn and return the thread ID it belongs to.\n * Creates a new thread if needed.\n */\n async processTurn(turn: BufferTurn, episodeIds: string[]): Promise<string> {\n await this.ensureDirectory();\n\n const turnTime = new Date(turn.timestamp).getTime();\n\n if (this.shouldStartNewThread(turn)) {\n // Create new thread\n const threadId = `thread-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n const thread: ConversationThread = {\n id: threadId,\n title: \"New Thread\", // Will be updated later with keywords\n createdAt: turn.timestamp,\n updatedAt: turn.timestamp,\n sessionKey: turn.sessionKey,\n episodeIds: [...episodeIds],\n linkedThreadIds: [],\n };\n\n await this.saveThread(thread);\n this.currentThreadId = threadId;\n log.debug(`created new thread ${threadId}`);\n } else if (this.currentThreadId) {\n // Add episodes to current thread\n const thread = await this.loadThread(this.currentThreadId);\n if (thread) {\n for (const id of episodeIds) {\n if (!thread.episodeIds.includes(id)) {\n thread.episodeIds.push(id);\n }\n }\n thread.updatedAt = turn.timestamp;\n await this.saveThread(thread);\n }\n }\n\n this.lastTurnTimestamp = turnTime;\n this.lastSessionKey = turn.sessionKey ?? null;\n\n return this.currentThreadId!;\n }\n\n /**\n * Append persisted memory IDs to an existing thread.\n * Keeps IDs unique and updates the thread timestamp.\n */\n async appendEpisodeIds(threadId: string, episodeIds: string[]): Promise<void> {\n if (episodeIds.length === 0) return;\n const thread = await this.loadThread(threadId);\n if (!thread) return;\n\n let changed = false;\n for (const id of episodeIds) {\n if (!thread.episodeIds.includes(id)) {\n thread.episodeIds.push(id);\n changed = true;\n }\n }\n if (!changed) return;\n\n thread.updatedAt = new Date().toISOString();\n await this.saveThread(thread);\n }\n\n /**\n * Update thread title based on accumulated content.\n */\n async updateThreadTitle(threadId: string, content: string): Promise<void> {\n const thread = await this.loadThread(threadId);\n if (!thread) return;\n\n const keywords = extractKeywords(content);\n const title = generateTitle(keywords);\n\n if (title !== thread.title) {\n thread.title = title;\n thread.updatedAt = new Date().toISOString();\n await this.saveThread(thread);\n log.debug(`updated thread ${threadId} title: ${title}`);\n }\n }\n\n /**\n * Get all threads, sorted by updatedAt desc.\n */\n async getAllThreads(): Promise<ConversationThread[]> {\n try {\n const files = await readdir(this.threadsDir);\n const threads: ConversationThread[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n const thread = await this.loadThread(file.replace(\".json\", \"\"));\n if (thread) threads.push(thread);\n }\n\n return threads.sort(\n (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n );\n } catch {\n return [];\n }\n }\n\n /**\n * Get a thread by ID.\n */\n async loadThread(threadId: string): Promise<ConversationThread | null> {\n const filePath = path.join(this.threadsDir, `${threadId}.json`);\n try {\n const raw = await readFile(filePath, \"utf-8\");\n return JSON.parse(raw) as ConversationThread;\n } catch {\n return null;\n }\n }\n\n /**\n * Save a thread.\n */\n async saveThread(thread: ConversationThread): Promise<void> {\n await this.ensureDirectory();\n const filePath = path.join(this.threadsDir, `${thread.id}.json`);\n await writeFile(filePath, JSON.stringify(thread, null, 2), \"utf-8\");\n }\n\n /**\n * Link two threads together.\n */\n async linkThreads(threadId1: string, threadId2: string): Promise<boolean> {\n const thread1 = await this.loadThread(threadId1);\n const thread2 = await this.loadThread(threadId2);\n\n if (!thread1 || !thread2) return false;\n\n // Add bidirectional links\n if (!thread1.linkedThreadIds.includes(threadId2)) {\n thread1.linkedThreadIds.push(threadId2);\n await this.saveThread(thread1);\n }\n\n if (!thread2.linkedThreadIds.includes(threadId1)) {\n thread2.linkedThreadIds.push(threadId1);\n await this.saveThread(thread2);\n }\n\n return true;\n }\n\n /**\n * Get the current thread ID (if any).\n */\n getCurrentThreadId(): string | null {\n return this.currentThreadId;\n }\n\n /**\n * Reset threading state (e.g., on plugin restart).\n */\n reset(): void {\n this.currentThreadId = null;\n this.lastTurnTimestamp = null;\n this.lastSessionKey = null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,205 @@
1
+ // src/topics.ts
2
+ var STOP_WORDS = /* @__PURE__ */ new Set([
3
+ "a",
4
+ "an",
5
+ "the",
6
+ "is",
7
+ "are",
8
+ "was",
9
+ "were",
10
+ "be",
11
+ "been",
12
+ "being",
13
+ "have",
14
+ "has",
15
+ "had",
16
+ "do",
17
+ "does",
18
+ "did",
19
+ "will",
20
+ "would",
21
+ "could",
22
+ "should",
23
+ "may",
24
+ "might",
25
+ "must",
26
+ "shall",
27
+ "can",
28
+ "need",
29
+ "to",
30
+ "of",
31
+ "in",
32
+ "for",
33
+ "on",
34
+ "with",
35
+ "at",
36
+ "by",
37
+ "from",
38
+ "as",
39
+ "into",
40
+ "through",
41
+ "during",
42
+ "before",
43
+ "after",
44
+ "above",
45
+ "below",
46
+ "between",
47
+ "this",
48
+ "that",
49
+ "these",
50
+ "those",
51
+ "i",
52
+ "me",
53
+ "my",
54
+ "we",
55
+ "our",
56
+ "you",
57
+ "your",
58
+ "he",
59
+ "she",
60
+ "it",
61
+ "they",
62
+ "them",
63
+ "their",
64
+ "what",
65
+ "which",
66
+ "who",
67
+ "how",
68
+ "when",
69
+ "where",
70
+ "why",
71
+ "and",
72
+ "but",
73
+ "or",
74
+ "if",
75
+ "because",
76
+ "so",
77
+ "just",
78
+ "about",
79
+ "like",
80
+ "also",
81
+ "very",
82
+ "really",
83
+ "here",
84
+ "there",
85
+ "now",
86
+ "then",
87
+ "only",
88
+ "even",
89
+ "still",
90
+ "already",
91
+ "always",
92
+ "never",
93
+ "often",
94
+ "sometimes",
95
+ "usually",
96
+ "well",
97
+ "much",
98
+ "more",
99
+ "most",
100
+ "some",
101
+ "any",
102
+ "all",
103
+ "each",
104
+ "every",
105
+ "both",
106
+ "few",
107
+ "many",
108
+ "other",
109
+ "same",
110
+ "such",
111
+ "own",
112
+ "than",
113
+ "too",
114
+ "very",
115
+ "just",
116
+ "over",
117
+ "under",
118
+ "again",
119
+ "further",
120
+ "once",
121
+ "here",
122
+ "there",
123
+ "when",
124
+ "where",
125
+ "why",
126
+ "how",
127
+ "user",
128
+ "agent",
129
+ "memory",
130
+ "fact",
131
+ "preference",
132
+ "using",
133
+ "used",
134
+ "use"
135
+ ]);
136
+ function extractTerms(content) {
137
+ return content.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w.length >= 3 && !STOP_WORDS.has(w));
138
+ }
139
+ function extractTopics(memories, topN = 50) {
140
+ if (memories.length === 0) return [];
141
+ const docFreq = /* @__PURE__ */ new Map();
142
+ const termFreqPerDoc = [];
143
+ for (const memory of memories) {
144
+ const terms = extractTerms(memory.content);
145
+ const termFreq = /* @__PURE__ */ new Map();
146
+ for (const term of terms) {
147
+ termFreq.set(term, (termFreq.get(term) ?? 0) + 1);
148
+ }
149
+ for (const term of termFreq.keys()) {
150
+ docFreq.set(term, (docFreq.get(term) ?? 0) + 1);
151
+ }
152
+ termFreqPerDoc.push(termFreq);
153
+ }
154
+ const totalDocs = memories.length;
155
+ const tfidfScores = /* @__PURE__ */ new Map();
156
+ for (let i = 0; i < memories.length; i++) {
157
+ const termFreq = termFreqPerDoc[i];
158
+ const totalTerms = [...termFreq.values()].reduce((a, b) => a + b, 0);
159
+ for (const [term, count] of termFreq) {
160
+ const tf = count / totalTerms;
161
+ const df = docFreq.get(term) ?? 1;
162
+ const idf = Math.log(totalDocs / df);
163
+ const tfidf = tf * idf;
164
+ const existing = tfidfScores.get(term);
165
+ if (existing) {
166
+ existing.score += tfidf;
167
+ existing.count += count;
168
+ } else {
169
+ tfidfScores.set(term, { score: tfidf, count });
170
+ }
171
+ }
172
+ }
173
+ const topics = [...tfidfScores.entries()].map(([term, { score, count }]) => ({ term, score, count })).sort((a, b) => b.score - a.score).slice(0, topN);
174
+ return topics;
175
+ }
176
+ function findTrendingTopics(currentTopics, previousTopics, threshold = 0.5) {
177
+ const prevMap = new Map(previousTopics.map((t) => [t.term, t.score]));
178
+ const currMap = new Map(currentTopics.map((t) => [t.term, t.score]));
179
+ const rising = [];
180
+ const falling = [];
181
+ for (const topic of currentTopics) {
182
+ const prevScore = prevMap.get(topic.term) ?? 0;
183
+ const change = topic.score - prevScore;
184
+ if (change > threshold) {
185
+ rising.push({ ...topic, score: change });
186
+ }
187
+ }
188
+ for (const topic of previousTopics) {
189
+ const currScore = currMap.get(topic.term) ?? 0;
190
+ const change = topic.score - currScore;
191
+ if (change > threshold && currScore < topic.score * 0.5) {
192
+ falling.push({ ...topic, score: change });
193
+ }
194
+ }
195
+ return {
196
+ rising: rising.sort((a, b) => b.score - a.score).slice(0, 10),
197
+ falling: falling.sort((a, b) => b.score - a.score).slice(0, 10)
198
+ };
199
+ }
200
+
201
+ export {
202
+ extractTopics,
203
+ findTrendingTopics
204
+ };
205
+ //# sourceMappingURL=chunk-UHGBNIOS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/topics.ts"],"sourcesContent":["/**\n * Topic Extraction (Phase 4B)\n *\n * Extract key topics from all memories using TF-IDF weighting.\n * Runs as a batch process during consolidation.\n */\n\nimport type { MemoryFile, TopicScore } from \"./types.js\";\n\n/** Stop words to exclude from topic extraction */\nconst STOP_WORDS = new Set([\n \"a\", \"an\", \"the\", \"is\", \"are\", \"was\", \"were\", \"be\", \"been\", \"being\",\n \"have\", \"has\", \"had\", \"do\", \"does\", \"did\", \"will\", \"would\", \"could\",\n \"should\", \"may\", \"might\", \"must\", \"shall\", \"can\", \"need\", \"to\", \"of\",\n \"in\", \"for\", \"on\", \"with\", \"at\", \"by\", \"from\", \"as\", \"into\", \"through\",\n \"during\", \"before\", \"after\", \"above\", \"below\", \"between\", \"this\", \"that\",\n \"these\", \"those\", \"i\", \"me\", \"my\", \"we\", \"our\", \"you\", \"your\", \"he\",\n \"she\", \"it\", \"they\", \"them\", \"their\", \"what\", \"which\", \"who\", \"how\",\n \"when\", \"where\", \"why\", \"and\", \"but\", \"or\", \"if\", \"because\", \"so\",\n \"just\", \"about\", \"like\", \"also\", \"very\", \"really\", \"here\", \"there\",\n \"now\", \"then\", \"only\", \"even\", \"still\", \"already\", \"always\", \"never\",\n \"often\", \"sometimes\", \"usually\", \"well\", \"much\", \"more\", \"most\", \"some\",\n \"any\", \"all\", \"each\", \"every\", \"both\", \"few\", \"many\", \"other\", \"same\",\n \"such\", \"own\", \"than\", \"too\", \"very\", \"just\", \"over\", \"under\", \"again\",\n \"further\", \"once\", \"here\", \"there\", \"when\", \"where\", \"why\", \"how\",\n \"user\", \"agent\", \"memory\", \"fact\", \"preference\", \"using\", \"used\", \"use\",\n]);\n\n/**\n * Extract terms from content.\n * Returns normalized lowercase terms >= 3 chars.\n */\nfunction extractTerms(content: string): string[] {\n return content\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length >= 3 && !STOP_WORDS.has(w));\n}\n\n/**\n * Calculate TF-IDF scores for terms across all memories.\n *\n * TF (term frequency) = count of term in document / total terms in document\n * IDF (inverse document frequency) = log(total documents / documents containing term)\n * TF-IDF = TF * IDF\n *\n * Terms with high TF-IDF are frequent in specific memories but rare overall.\n */\nexport function extractTopics(\n memories: MemoryFile[],\n topN: number = 50,\n): TopicScore[] {\n if (memories.length === 0) return [];\n\n // Count term frequency per document and document frequency\n const docFreq = new Map<string, number>(); // term -> number of documents containing it\n const termFreqPerDoc: Map<string, number>[] = []; // per-doc term frequencies\n\n for (const memory of memories) {\n const terms = extractTerms(memory.content);\n const termFreq = new Map<string, number>();\n\n for (const term of terms) {\n termFreq.set(term, (termFreq.get(term) ?? 0) + 1);\n }\n\n // Track which terms appear in this document\n for (const term of termFreq.keys()) {\n docFreq.set(term, (docFreq.get(term) ?? 0) + 1);\n }\n\n termFreqPerDoc.push(termFreq);\n }\n\n const totalDocs = memories.length;\n\n // Calculate TF-IDF for each term\n const tfidfScores = new Map<string, { score: number; count: number }>();\n\n for (let i = 0; i < memories.length; i++) {\n const termFreq = termFreqPerDoc[i];\n const totalTerms = [...termFreq.values()].reduce((a, b) => a + b, 0);\n\n for (const [term, count] of termFreq) {\n const tf = count / totalTerms;\n const df = docFreq.get(term) ?? 1;\n const idf = Math.log(totalDocs / df);\n const tfidf = tf * idf;\n\n const existing = tfidfScores.get(term);\n if (existing) {\n existing.score += tfidf;\n existing.count += count;\n } else {\n tfidfScores.set(term, { score: tfidf, count });\n }\n }\n }\n\n // Convert to array and sort by score\n const topics: TopicScore[] = [...tfidfScores.entries()]\n .map(([term, { score, count }]) => ({ term, score, count }))\n .sort((a, b) => b.score - a.score)\n .slice(0, topN);\n\n return topics;\n}\n\n/**\n * Compare two topic lists to find trending changes.\n * Returns topics that are new or significantly increased.\n */\nexport function findTrendingTopics(\n currentTopics: TopicScore[],\n previousTopics: TopicScore[],\n threshold: number = 0.5,\n): { rising: TopicScore[]; falling: TopicScore[] } {\n const prevMap = new Map(previousTopics.map((t) => [t.term, t.score]));\n const currMap = new Map(currentTopics.map((t) => [t.term, t.score]));\n\n const rising: TopicScore[] = [];\n const falling: TopicScore[] = [];\n\n for (const topic of currentTopics) {\n const prevScore = prevMap.get(topic.term) ?? 0;\n const change = topic.score - prevScore;\n\n if (change > threshold) {\n rising.push({ ...topic, score: change });\n }\n }\n\n for (const topic of previousTopics) {\n const currScore = currMap.get(topic.term) ?? 0;\n const change = topic.score - currScore;\n\n if (change > threshold && currScore < topic.score * 0.5) {\n falling.push({ ...topic, score: change });\n }\n }\n\n return {\n rising: rising.sort((a, b) => b.score - a.score).slice(0, 10),\n falling: falling.sort((a, b) => b.score - a.score).slice(0, 10),\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,108 @@
1
+ import {
2
+ BoxBuilder
3
+ } from "./chunk-M5KEYE5E.js";
4
+ import {
5
+ StorageManager
6
+ } from "./chunk-QWUUMMIK.js";
7
+ import {
8
+ getCachedEpisodeMap,
9
+ setCachedEpisodeMap
10
+ } from "./chunk-ESSMF2FR.js";
11
+ import {
12
+ countRecallTokenOverlap,
13
+ normalizeRecallTokens
14
+ } from "./chunk-DT5TVLJE.js";
15
+
16
+ // src/verified-recall.ts
17
+ function createReadOnlyBoxBuilder(memoryDir) {
18
+ return new BoxBuilder(memoryDir, {
19
+ memoryBoxesEnabled: true,
20
+ traceWeaverEnabled: false,
21
+ boxTopicShiftThreshold: 0.35,
22
+ boxTimeGapMs: 30 * 60 * 1e3,
23
+ boxMaxMemories: 50,
24
+ traceWeaverLookbackDays: 7,
25
+ traceWeaverOverlapThreshold: 0.4
26
+ });
27
+ }
28
+ function scoreVerifiedEpisodeCandidate(box, verifiedMemories, queryTokens) {
29
+ const matchedFields = /* @__PURE__ */ new Set();
30
+ let score = 0;
31
+ const topicMatches = countRecallTokenOverlap(queryTokens, box.topics.join(" "));
32
+ if (topicMatches > 0) {
33
+ score += topicMatches * 3;
34
+ matchedFields.add("topics");
35
+ }
36
+ const goalMatches = countRecallTokenOverlap(queryTokens, box.goal);
37
+ if (goalMatches > 0) {
38
+ score += goalMatches * 4;
39
+ matchedFields.add("goal");
40
+ }
41
+ const toolMatches = countRecallTokenOverlap(queryTokens, box.toolsUsed?.join(" "));
42
+ if (toolMatches > 0) {
43
+ score += toolMatches * 2;
44
+ matchedFields.add("toolsUsed");
45
+ }
46
+ let episodeContentMatches = 0;
47
+ for (const memory of verifiedMemories) {
48
+ episodeContentMatches += countRecallTokenOverlap(queryTokens, memory.content);
49
+ }
50
+ if (episodeContentMatches > 0) {
51
+ score += episodeContentMatches * 4;
52
+ matchedFields.add("episodeContent");
53
+ }
54
+ return { score, matchedFields };
55
+ }
56
+ function resolveVerifiedEpisodeMemoriesFromMap(memoryById, memoryIds) {
57
+ const verified = [];
58
+ for (const memoryId of memoryIds) {
59
+ try {
60
+ const memory = memoryById.get(memoryId);
61
+ if (!memory) continue;
62
+ if (memory.frontmatter.status === "archived") continue;
63
+ if (memory.frontmatter.memoryKind !== "episode") continue;
64
+ verified.push(memory);
65
+ } catch {
66
+ }
67
+ }
68
+ return verified;
69
+ }
70
+ async function searchVerifiedEpisodes(options) {
71
+ const queryTokens = new Set(normalizeRecallTokens(options.query, ["what", "which"]));
72
+ if (queryTokens.size === 0 || options.maxResults <= 0) return [];
73
+ const storage = new StorageManager(options.memoryDir);
74
+ const version = storage.getMemoryStatusVersion();
75
+ let verifiedMemoryById = getCachedEpisodeMap(storage.dir, version);
76
+ if (!verifiedMemoryById) {
77
+ const allMemories = await storage.readAllMemories();
78
+ verifiedMemoryById = setCachedEpisodeMap(storage.dir, allMemories, version);
79
+ }
80
+ const boxes = await createReadOnlyBoxBuilder(options.memoryDir).readRecentBoxes(Math.max(1, Math.floor(options.boxRecallDays ?? 3))).catch(() => []);
81
+ const candidates = [];
82
+ for (const box of boxes) {
83
+ const verifiedMemories = resolveVerifiedEpisodeMemoriesFromMap(verifiedMemoryById, box.memoryIds);
84
+ if (verifiedMemories.length === 0) continue;
85
+ const { score, matchedFields } = scoreVerifiedEpisodeCandidate(box, verifiedMemories, queryTokens);
86
+ if (score <= 0) continue;
87
+ candidates.push({
88
+ box,
89
+ score,
90
+ matchedFields,
91
+ verifiedMemories
92
+ });
93
+ }
94
+ return candidates.map((candidate) => ({
95
+ box: candidate.box,
96
+ score: candidate.score,
97
+ verifiedEpisodeCount: candidate.verifiedMemories.length,
98
+ verifiedMemoryIds: candidate.verifiedMemories.map((memory) => memory.frontmatter.id),
99
+ matchedFields: [...candidate.matchedFields].sort()
100
+ })).sort(
101
+ (left, right) => right.score - left.score || right.verifiedEpisodeCount - left.verifiedEpisodeCount || right.box.sealedAt.localeCompare(left.box.sealedAt)
102
+ ).slice(0, options.maxResults);
103
+ }
104
+
105
+ export {
106
+ searchVerifiedEpisodes
107
+ };
108
+ //# sourceMappingURL=chunk-UIYZ5T3I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/verified-recall.ts"],"sourcesContent":["import { BoxBuilder, type BoxFrontmatter } from \"./boxes.js\";\nimport { getCachedEpisodeMap, setCachedEpisodeMap } from \"./memory-cache.js\";\nimport { StorageManager } from \"./storage.js\";\nimport type { MemoryFile } from \"./types.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\n\nexport interface VerifiedEpisodeResult {\n box: BoxFrontmatter;\n score: number;\n verifiedEpisodeCount: number;\n verifiedMemoryIds: string[];\n matchedFields: string[];\n}\n\ninterface VerifiedEpisodeCandidate {\n box: BoxFrontmatter;\n score: number;\n matchedFields: Set<string>;\n verifiedMemories: MemoryFile[];\n}\n\nfunction createReadOnlyBoxBuilder(memoryDir: string): BoxBuilder {\n return new BoxBuilder(memoryDir, {\n memoryBoxesEnabled: true,\n traceWeaverEnabled: false,\n boxTopicShiftThreshold: 0.35,\n boxTimeGapMs: 30 * 60 * 1000,\n boxMaxMemories: 50,\n traceWeaverLookbackDays: 7,\n traceWeaverOverlapThreshold: 0.4,\n });\n}\n\nfunction scoreVerifiedEpisodeCandidate(box: BoxFrontmatter, verifiedMemories: MemoryFile[], queryTokens: Set<string>) {\n const matchedFields = new Set<string>();\n let score = 0;\n\n const topicMatches = countRecallTokenOverlap(queryTokens, box.topics.join(\" \"));\n if (topicMatches > 0) {\n score += topicMatches * 3;\n matchedFields.add(\"topics\");\n }\n\n const goalMatches = countRecallTokenOverlap(queryTokens, box.goal);\n if (goalMatches > 0) {\n score += goalMatches * 4;\n matchedFields.add(\"goal\");\n }\n\n const toolMatches = countRecallTokenOverlap(queryTokens, box.toolsUsed?.join(\" \"));\n if (toolMatches > 0) {\n score += toolMatches * 2;\n matchedFields.add(\"toolsUsed\");\n }\n\n let episodeContentMatches = 0;\n for (const memory of verifiedMemories) {\n episodeContentMatches += countRecallTokenOverlap(queryTokens, memory.content);\n }\n if (episodeContentMatches > 0) {\n score += episodeContentMatches * 4;\n matchedFields.add(\"episodeContent\");\n }\n\n return { score, matchedFields };\n}\n\nfunction resolveVerifiedEpisodeMemoriesFromMap(\n memoryById: ReadonlyMap<string, MemoryFile>,\n memoryIds: string[],\n): MemoryFile[] {\n const verified: MemoryFile[] = [];\n for (const memoryId of memoryIds) {\n try {\n const memory = memoryById.get(memoryId);\n if (!memory) continue;\n if (memory.frontmatter.status === \"archived\") continue;\n if (memory.frontmatter.memoryKind !== \"episode\") continue;\n verified.push(memory);\n } catch {\n // fail-open: malformed or unreadable memories should not abort recall\n }\n }\n return verified;\n}\n\nexport async function searchVerifiedEpisodes(options: {\n memoryDir: string;\n query: string;\n maxResults: number;\n boxRecallDays?: number;\n}): Promise<VerifiedEpisodeResult[]> {\n const queryTokens = new Set(normalizeRecallTokens(options.query, [\"what\", \"which\"]));\n if (queryTokens.size === 0 || options.maxResults <= 0) return [];\n\n const storage = new StorageManager(options.memoryDir);\n const version = storage.getMemoryStatusVersion();\n\n // Use derived episode cache to avoid O(146K) filter+map on every call.\n let verifiedMemoryById = getCachedEpisodeMap(storage.dir, version);\n if (!verifiedMemoryById) {\n const allMemories = await storage.readAllMemories();\n verifiedMemoryById = setCachedEpisodeMap(storage.dir, allMemories, version);\n }\n const boxes = await createReadOnlyBoxBuilder(options.memoryDir)\n .readRecentBoxes(Math.max(1, Math.floor(options.boxRecallDays ?? 3)))\n .catch(() => [] as BoxFrontmatter[]);\n\n const candidates: VerifiedEpisodeCandidate[] = [];\n for (const box of boxes) {\n const verifiedMemories = resolveVerifiedEpisodeMemoriesFromMap(verifiedMemoryById, box.memoryIds);\n if (verifiedMemories.length === 0) continue;\n const { score, matchedFields } = scoreVerifiedEpisodeCandidate(box, verifiedMemories, queryTokens);\n if (score <= 0) continue;\n candidates.push({\n box,\n score,\n matchedFields,\n verifiedMemories,\n });\n }\n\n return candidates\n .map((candidate) => ({\n box: candidate.box,\n score: candidate.score,\n verifiedEpisodeCount: candidate.verifiedMemories.length,\n verifiedMemoryIds: candidate.verifiedMemories.map((memory) => memory.frontmatter.id),\n matchedFields: [...candidate.matchedFields].sort(),\n }))\n .sort(\n (left, right) =>\n right.score - left.score\n || right.verifiedEpisodeCount - left.verifiedEpisodeCount\n || right.box.sealedAt.localeCompare(left.box.sealedAt),\n )\n .slice(0, options.maxResults);\n}\n"],"mappings":"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","names":[]}