@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,302 @@
1
+ import {
2
+ log
3
+ } from "./chunk-KWBU5S5U.js";
4
+
5
+ // src/profiling.ts
6
+ import {
7
+ existsSync,
8
+ mkdirSync,
9
+ writeFileSync,
10
+ promises as fsp
11
+ } from "fs";
12
+ import { join } from "path";
13
+ function percentile(sorted, p) {
14
+ if (sorted.length === 0) return 0;
15
+ const idx = Math.ceil(p / 100 * sorted.length) - 1;
16
+ return sorted[Math.max(0, Math.min(idx, sorted.length - 1))];
17
+ }
18
+ function aggregateStats(values) {
19
+ const count = values.length;
20
+ if (count === 0) return { count: 0, avgMs: 0, p50Ms: 0, p95Ms: 0, maxMs: 0 };
21
+ const sorted = [...values].sort((a, b) => a - b);
22
+ const sum = sorted.reduce((s, v) => s + v, 0);
23
+ return {
24
+ count,
25
+ avgMs: Math.round(sum / count),
26
+ p50Ms: Math.round(percentile(sorted, 50)),
27
+ p95Ms: Math.round(percentile(sorted, 95)),
28
+ maxMs: sorted[sorted.length - 1]
29
+ };
30
+ }
31
+ var traceCounter = 0;
32
+ var ProfilingCollector = class {
33
+ enabled;
34
+ storageDir;
35
+ maxTraces;
36
+ traces = [];
37
+ prunePromise = null;
38
+ // Active trace state — keyed by traceId so concurrent pipelines are isolated.
39
+ activeTraces = /* @__PURE__ */ new Map();
40
+ latestTraceId = "";
41
+ constructor(config) {
42
+ this.enabled = config.enabled;
43
+ this.storageDir = config.storageDir;
44
+ this.maxTraces = Math.max(0, config.maxTraces);
45
+ if (this.enabled) {
46
+ if (!existsSync(this.storageDir)) {
47
+ mkdirSync(this.storageDir, { recursive: true });
48
+ log.debug(`profiling: created storage dir ${this.storageDir}`);
49
+ }
50
+ }
51
+ }
52
+ get isEnabled() {
53
+ return this.enabled;
54
+ }
55
+ // ---- Trace lifecycle ---------------------------------------------------
56
+ startTrace(kind, sessionKey, configSnapshot) {
57
+ if (!this.enabled) return "";
58
+ traceCounter++;
59
+ const traceId = `t${traceCounter}-${Date.now().toString(36)}`;
60
+ this.activeTraces.set(traceId, {
61
+ kind,
62
+ start: Date.now(),
63
+ sessionKey,
64
+ configSnapshot,
65
+ spans: [],
66
+ spanStarts: /* @__PURE__ */ new Map(),
67
+ parallelGroups: []
68
+ });
69
+ this.latestTraceId = traceId;
70
+ log.debug(`profiling: started trace ${traceId} kind=${kind}`);
71
+ return traceId;
72
+ }
73
+ startSpan(name, traceId) {
74
+ const tid = traceId ?? this.latestTraceId;
75
+ const t = tid ? this.activeTraces.get(tid) : void 0;
76
+ if (!t) return;
77
+ const offset = Date.now() - t.start;
78
+ t.spanStarts.set(name, Date.now());
79
+ log.debug(`profiling: span ${name} started at +${offset}ms (trace=${tid})`);
80
+ }
81
+ endSpan(name, traceId) {
82
+ const tid = traceId ?? this.latestTraceId;
83
+ const t = tid ? this.activeTraces.get(tid) : void 0;
84
+ if (!t) return;
85
+ const start = t.spanStarts.get(name);
86
+ if (start === void 0) return;
87
+ const duration = Date.now() - start;
88
+ const startOffset = start - t.start;
89
+ t.spans.push({ name, startOffsetMs: startOffset, durationMs: duration });
90
+ t.spanStarts.delete(name);
91
+ log.debug(`profiling: span ${name} ended ${duration}ms (trace=${tid})`);
92
+ }
93
+ endTrace(traceId) {
94
+ const tid = traceId ?? this.latestTraceId;
95
+ const t = tid ? this.activeTraces.get(tid) : void 0;
96
+ if (!t) return null;
97
+ const now = Date.now();
98
+ for (const [name, start] of t.spanStarts) {
99
+ const duration = now - start;
100
+ const startOffset = start - t.start;
101
+ t.spans.push({ name, startOffsetMs: startOffset, durationMs: duration });
102
+ log.debug(`profiling: auto-closed span ${name} at trace end (${duration}ms, trace=${tid})`);
103
+ }
104
+ t.spanStarts.clear();
105
+ const trace = {
106
+ ts: (/* @__PURE__ */ new Date()).toISOString(),
107
+ kind: t.kind,
108
+ traceId: tid,
109
+ totalMs: Date.now() - t.start,
110
+ spans: t.spans,
111
+ configSnapshot: t.configSnapshot
112
+ };
113
+ if (t.sessionKey) {
114
+ trace.sessionKey = t.sessionKey;
115
+ }
116
+ if (t.parallelGroups.length > 0) {
117
+ trace.parallelGroups = t.parallelGroups;
118
+ }
119
+ this.activeTraces.delete(tid);
120
+ if (!this.enabled) {
121
+ log.debug("profiling: trace discarded (disabled)");
122
+ return null;
123
+ }
124
+ this.persistTrace(trace);
125
+ this.traces.push(trace);
126
+ if (this.traces.length > this.maxTraces) {
127
+ this.traces.shift();
128
+ }
129
+ if (!this.prunePromise) {
130
+ this.prunePromise = this.pruneFiles().finally(() => {
131
+ this.prunePromise = null;
132
+ });
133
+ }
134
+ log.debug(`profiling: trace ${trace.traceId} finalized totalMs=${trace.totalMs}`);
135
+ return trace;
136
+ }
137
+ // ---- Parallel group tracking -------------------------------------------
138
+ startParallelGroup(name, traceId) {
139
+ const tid = traceId ?? this.latestTraceId;
140
+ const t = tid ? this.activeTraces.get(tid) : void 0;
141
+ const startOffsetMs = t ? Date.now() - t.start : 0;
142
+ return { name, startOffsetMs, traceId: tid };
143
+ }
144
+ async endParallelGroup(handle, members) {
145
+ const wallStart = Date.now();
146
+ let nextResolvedIndex = 0;
147
+ const resolutionOrder = /* @__PURE__ */ new Map();
148
+ const timed = members.map(async (m) => {
149
+ const t0 = Date.now();
150
+ try {
151
+ await m.promise;
152
+ } catch {
153
+ }
154
+ resolutionOrder.set(m.name, nextResolvedIndex++);
155
+ return { name: m.name, durationMs: Date.now() - t0 };
156
+ });
157
+ const timedResults = await Promise.allSettled(timed);
158
+ const tid = handle.traceId ?? this.latestTraceId;
159
+ const t = tid ? this.activeTraces.get(tid) : void 0;
160
+ if (!t) return;
161
+ const wallMs = Date.now() - wallStart;
162
+ const groupMembers = members.map((m, i) => {
163
+ const timedResult = timedResults[i].status === "fulfilled" ? timedResults[i].value : { name: m.name, durationMs: wallMs };
164
+ return {
165
+ name: timedResult.name,
166
+ durationMs: timedResult.durationMs,
167
+ resolvedIndex: resolutionOrder.get(m.name) ?? i
168
+ };
169
+ });
170
+ t.parallelGroups.push({
171
+ name: handle.name,
172
+ startOffsetMs: handle.startOffsetMs,
173
+ wallMs,
174
+ members: groupMembers
175
+ });
176
+ log.debug(`profiling: parallel group ${handle.name} wallMs=${wallMs} (trace=${tid})`);
177
+ }
178
+ // ---- Query methods -----------------------------------------------------
179
+ getRecentTraces(limit) {
180
+ const n = limit ?? this.traces.length;
181
+ return this.traces.slice(-n);
182
+ }
183
+ getStats() {
184
+ const byKind = {};
185
+ const bySpan = {};
186
+ for (const trace of this.traces) {
187
+ if (!byKind[trace.kind]) byKind[trace.kind] = [];
188
+ byKind[trace.kind].push(trace.totalMs);
189
+ for (const span of trace.spans) {
190
+ if (!bySpan[span.name]) bySpan[span.name] = [];
191
+ bySpan[span.name].push(span.durationMs);
192
+ }
193
+ }
194
+ const result = { byKind: {}, bySpan: {} };
195
+ for (const [k, v] of Object.entries(byKind)) {
196
+ result.byKind[k] = aggregateStats(v);
197
+ }
198
+ for (const [k, v] of Object.entries(bySpan)) {
199
+ result.bySpan[k] = aggregateStats(v);
200
+ }
201
+ return result;
202
+ }
203
+ identifyBottleneck() {
204
+ if (this.traces.length === 0) return null;
205
+ const latest = this.traces[this.traces.length - 1];
206
+ if (latest.spans.length === 0) return null;
207
+ let slowest = latest.spans[0];
208
+ for (const span of latest.spans) {
209
+ if (span.durationMs > slowest.durationMs) slowest = span;
210
+ }
211
+ return slowest.name;
212
+ }
213
+ // ---- Persistence -------------------------------------------------------
214
+ persistTrace(trace) {
215
+ const filename = `${trace.kind}-${trace.traceId}.jsonl`;
216
+ const filepath = join(this.storageDir, filename);
217
+ try {
218
+ writeFileSync(filepath, JSON.stringify(trace) + "\n", "utf-8");
219
+ log.debug(`profiling: persisted ${filename}`);
220
+ } catch (err) {
221
+ log.warn(`profiling: failed to persist ${filename}`, err);
222
+ }
223
+ }
224
+ async pruneFiles() {
225
+ try {
226
+ const dir = this.storageDir;
227
+ const entries = await fsp.readdir(dir);
228
+ const jsonlFiles = entries.filter((f) => f.endsWith(".jsonl"));
229
+ const withMtime = await Promise.all(
230
+ jsonlFiles.map(async (f) => ({
231
+ name: f,
232
+ mtime: (await fsp.stat(join(dir, f))).mtimeMs
233
+ }))
234
+ );
235
+ const files = withMtime.sort((a, b) => a.mtime - b.mtime).map((f) => f.name);
236
+ while (files.length > this.maxTraces) {
237
+ const oldest = files.shift();
238
+ await fsp.unlink(join(dir, oldest));
239
+ log.debug(`profiling: pruned ${oldest}`);
240
+ }
241
+ } catch (err) {
242
+ log.warn("profiling: prune failed", err);
243
+ }
244
+ }
245
+ };
246
+ function formatProfileTraceAscii(trace) {
247
+ const lines = [];
248
+ const BAR_WIDTH = 40;
249
+ lines.push(`=== Profile: ${trace.kind} ===`);
250
+ lines.push(`Trace ID : ${trace.traceId}`);
251
+ lines.push(`Total : ${trace.totalMs}ms`);
252
+ if (trace.sessionKey) lines.push(`Session : ${trace.sessionKey}`);
253
+ lines.push("");
254
+ let bottleneckName = null;
255
+ if (trace.spans.length > 0) {
256
+ let slowest = trace.spans[0];
257
+ for (const s of trace.spans) {
258
+ if (s.durationMs > slowest.durationMs) slowest = s;
259
+ }
260
+ bottleneckName = slowest.name;
261
+ }
262
+ if (trace.spans.length > 0) {
263
+ const maxDuration = Math.max(...trace.spans.map((s) => s.durationMs), 1);
264
+ lines.push("Spans:");
265
+ for (const span of trace.spans) {
266
+ const barLen = Math.max(1, Math.round(span.durationMs / maxDuration * BAR_WIDTH));
267
+ const bar = "\u2588".repeat(barLen);
268
+ const suffix = span.name === bottleneckName ? " \u2190 bottleneck" : "";
269
+ lines.push(` ${span.name.padEnd(30)} ${String(span.durationMs).padStart(6)}ms ${bar}${suffix}`);
270
+ }
271
+ lines.push("");
272
+ }
273
+ if (trace.parallelGroups && trace.parallelGroups.length > 0) {
274
+ lines.push("Parallel Groups:");
275
+ for (const group of trace.parallelGroups) {
276
+ lines.push(` ${group.name}:`);
277
+ lines.push(` Wall time : ${group.wallMs}ms`);
278
+ const efficiency = parallelEfficiency(group);
279
+ if (efficiency !== null) {
280
+ lines.push(` Efficiency : ${efficiency}%`);
281
+ }
282
+ for (const member of group.members) {
283
+ lines.push(` [${String(member.resolvedIndex).padStart(2)}] ${member.name.padEnd(28)} ${String(member.durationMs).padStart(6)}ms`);
284
+ }
285
+ }
286
+ lines.push("");
287
+ }
288
+ lines.push("---");
289
+ return lines.join("\n");
290
+ }
291
+ function parallelEfficiency(group) {
292
+ if (group.members.length <= 1) return null;
293
+ const idealMs = Math.max(...group.members.map((m) => m.durationMs));
294
+ if (group.wallMs === 0) return null;
295
+ return Math.round(idealMs / group.wallMs * 100);
296
+ }
297
+
298
+ export {
299
+ ProfilingCollector,
300
+ formatProfileTraceAscii
301
+ };
302
+ //# sourceMappingURL=chunk-763GUIOU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/profiling.ts"],"sourcesContent":["// Performance profiling collector for recall and extraction traces.\n// Zero external dependencies — uses only node:fs and node:path.\n\nimport {\n existsSync,\n mkdirSync,\n writeFileSync,\n promises as fsp,\n} from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { log } from \"./logger.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ProfileSpan {\n name: string;\n startOffsetMs: number;\n durationMs: number;\n}\n\nexport interface ProfileParallelGroupMember {\n name: string;\n durationMs: number;\n resolvedIndex: number;\n}\n\nexport interface ProfileParallelGroup {\n name: string;\n startOffsetMs: number;\n wallMs: number;\n members: ProfileParallelGroupMember[];\n}\n\nexport interface ProfileTrace {\n ts: string;\n kind: \"recall\" | \"extraction\";\n traceId: string;\n sessionKey?: string;\n totalMs: number;\n spans: ProfileSpan[];\n parallelGroups?: ProfileParallelGroup[];\n configSnapshot?: Record<string, unknown>;\n}\n\nexport interface ProfilingConfig {\n enabled: boolean;\n storageDir: string;\n maxTraces: number;\n}\n\nexport interface ParallelGroupHandle {\n name: string;\n startOffsetMs: number;\n traceId?: string;\n}\n\nexport interface ProfilingStats {\n byKind: Record<string, { count: number; avgMs: number; p50Ms: number; p95Ms: number; maxMs: number }>;\n bySpan: Record<string, { count: number; avgMs: number; p50Ms: number; p95Ms: number; maxMs: number }>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, Math.min(idx, sorted.length - 1))];\n}\n\nfunction aggregateStats(values: number[]): { count: number; avgMs: number; p50Ms: number; p95Ms: number; maxMs: number } {\n const count = values.length;\n if (count === 0) return { count: 0, avgMs: 0, p50Ms: 0, p95Ms: 0, maxMs: 0 };\n const sorted = [...values].sort((a, b) => a - b);\n const sum = sorted.reduce((s, v) => s + v, 0);\n return {\n count,\n avgMs: Math.round(sum / count),\n p50Ms: Math.round(percentile(sorted, 50)),\n p95Ms: Math.round(percentile(sorted, 95)),\n maxMs: sorted[sorted.length - 1],\n };\n}\n\nlet traceCounter = 0;\n\n// ---------------------------------------------------------------------------\n// ProfilingCollector\n// ---------------------------------------------------------------------------\n\nexport class ProfilingCollector {\n private enabled: boolean;\n private storageDir: string;\n private maxTraces: number;\n private traces: ProfileTrace[] = [];\n private prunePromise: Promise<void> | null = null;\n\n // Active trace state — keyed by traceId so concurrent pipelines are isolated.\n private activeTraces = new Map<\n string,\n {\n kind: \"recall\" | \"extraction\";\n start: number;\n sessionKey?: string;\n configSnapshot?: Record<string, unknown>;\n spans: ProfileSpan[];\n spanStarts: Map<string, number>;\n parallelGroups: ProfileParallelGroup[];\n }\n >();\n private latestTraceId = \"\";\n\n constructor(config: ProfilingConfig) {\n this.enabled = config.enabled;\n this.storageDir = config.storageDir;\n this.maxTraces = Math.max(0, config.maxTraces);\n\n if (this.enabled) {\n if (!existsSync(this.storageDir)) {\n mkdirSync(this.storageDir, { recursive: true });\n log.debug(`profiling: created storage dir ${this.storageDir}`);\n }\n }\n }\n\n get isEnabled(): boolean {\n return this.enabled;\n }\n\n // ---- Trace lifecycle ---------------------------------------------------\n\n startTrace(kind: \"recall\" | \"extraction\", sessionKey?: string, configSnapshot?: Record<string, unknown>): string {\n if (!this.enabled) return \"\";\n traceCounter++;\n const traceId = `t${traceCounter}-${Date.now().toString(36)}`;\n this.activeTraces.set(traceId, {\n kind,\n start: Date.now(),\n sessionKey,\n configSnapshot,\n spans: [],\n spanStarts: new Map(),\n parallelGroups: [],\n });\n this.latestTraceId = traceId;\n log.debug(`profiling: started trace ${traceId} kind=${kind}`);\n return traceId;\n }\n\n startSpan(name: string, traceId?: string): void {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return;\n const offset = Date.now() - t.start;\n t.spanStarts.set(name, Date.now());\n log.debug(`profiling: span ${name} started at +${offset}ms (trace=${tid})`);\n }\n\n endSpan(name: string, traceId?: string): void {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return;\n const start = t.spanStarts.get(name);\n if (start === undefined) return;\n const duration = Date.now() - start;\n const startOffset = start - t.start;\n t.spans.push({ name, startOffsetMs: startOffset, durationMs: duration });\n t.spanStarts.delete(name);\n log.debug(`profiling: span ${name} ended ${duration}ms (trace=${tid})`);\n }\n\n endTrace(traceId?: string): ProfileTrace | null {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return null;\n\n // Auto-close any spans still open when the trace finalizes.\n const now = Date.now();\n for (const [name, start] of t.spanStarts) {\n const duration = now - start;\n const startOffset = start - t.start;\n t.spans.push({ name, startOffsetMs: startOffset, durationMs: duration });\n log.debug(`profiling: auto-closed span ${name} at trace end (${duration}ms, trace=${tid})`);\n }\n t.spanStarts.clear();\n\n const trace: ProfileTrace = {\n ts: new Date().toISOString(),\n kind: t.kind,\n traceId: tid,\n totalMs: Date.now() - t.start,\n spans: t.spans,\n configSnapshot: t.configSnapshot,\n };\n\n if (t.sessionKey) {\n trace.sessionKey = t.sessionKey;\n }\n if (t.parallelGroups.length > 0) {\n trace.parallelGroups = t.parallelGroups;\n }\n\n // Remove from active map.\n this.activeTraces.delete(tid);\n\n if (!this.enabled) {\n log.debug(\"profiling: trace discarded (disabled)\");\n return null;\n }\n\n // Persist.\n this.persistTrace(trace);\n\n // Buffer in memory (FIFO).\n this.traces.push(trace);\n if (this.traces.length > this.maxTraces) {\n this.traces.shift();\n }\n\n // Single-flight: if a prune is already running, piggyback on it;\n // otherwise start one. This prevents concurrent prunes from racing\n // on stale directory snapshots.\n if (!this.prunePromise) {\n this.prunePromise = this.pruneFiles().finally(() => {\n this.prunePromise = null;\n });\n }\n log.debug(`profiling: trace ${trace.traceId} finalized totalMs=${trace.totalMs}`);\n return trace;\n }\n\n // ---- Parallel group tracking -------------------------------------------\n\n startParallelGroup(name: string, traceId?: string): ParallelGroupHandle {\n const tid = traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n const startOffsetMs = t ? Date.now() - t.start : 0;\n return { name, startOffsetMs, traceId: tid };\n }\n\n async endParallelGroup(\n handle: ParallelGroupHandle,\n members: Array<{ name: string; promise: Promise<unknown> }>,\n ): Promise<void> {\n const wallStart = Date.now();\n\n let nextResolvedIndex = 0;\n const resolutionOrder = new Map<string, number>();\n\n const timed = members.map(async (m) => {\n const t0 = Date.now();\n try {\n await m.promise;\n } catch {\n // settled — still record order\n }\n resolutionOrder.set(m.name, nextResolvedIndex++);\n return { name: m.name, durationMs: Date.now() - t0 };\n });\n const timedResults = await Promise.allSettled(timed);\n\n const tid = handle.traceId ?? this.latestTraceId;\n const t = tid ? this.activeTraces.get(tid) : undefined;\n if (!t) return;\n\n const wallMs = Date.now() - wallStart;\n\n const groupMembers: ProfileParallelGroupMember[] = members.map((m, i) => {\n const timedResult = timedResults[i].status === \"fulfilled\"\n ? timedResults[i].value\n : { name: m.name, durationMs: wallMs };\n return {\n name: timedResult.name,\n durationMs: timedResult.durationMs,\n resolvedIndex: resolutionOrder.get(m.name) ?? i,\n };\n });\n\n t.parallelGroups.push({\n name: handle.name,\n startOffsetMs: handle.startOffsetMs,\n wallMs,\n members: groupMembers,\n });\n\n log.debug(`profiling: parallel group ${handle.name} wallMs=${wallMs} (trace=${tid})`);\n }\n\n // ---- Query methods -----------------------------------------------------\n\n getRecentTraces(limit?: number): ProfileTrace[] {\n const n = limit ?? this.traces.length;\n return this.traces.slice(-n);\n }\n\n getStats(): ProfilingStats {\n const byKind: Record<string, number[]> = {};\n const bySpan: Record<string, number[]> = {};\n\n for (const trace of this.traces) {\n if (!byKind[trace.kind]) byKind[trace.kind] = [];\n byKind[trace.kind].push(trace.totalMs);\n\n for (const span of trace.spans) {\n if (!bySpan[span.name]) bySpan[span.name] = [];\n bySpan[span.name].push(span.durationMs);\n }\n }\n\n const result: ProfilingStats = { byKind: {}, bySpan: {} };\n for (const [k, v] of Object.entries(byKind)) {\n result.byKind[k] = aggregateStats(v);\n }\n for (const [k, v] of Object.entries(bySpan)) {\n result.bySpan[k] = aggregateStats(v);\n }\n return result;\n }\n\n identifyBottleneck(): string | null {\n if (this.traces.length === 0) return null;\n const latest = this.traces[this.traces.length - 1];\n if (latest.spans.length === 0) return null;\n let slowest = latest.spans[0];\n for (const span of latest.spans) {\n if (span.durationMs > slowest.durationMs) slowest = span;\n }\n return slowest.name;\n }\n\n // ---- Persistence -------------------------------------------------------\n\n private persistTrace(trace: ProfileTrace): void {\n const filename = `${trace.kind}-${trace.traceId}.jsonl`;\n const filepath = join(this.storageDir, filename);\n try {\n writeFileSync(filepath, JSON.stringify(trace) + \"\\n\", \"utf-8\");\n log.debug(`profiling: persisted ${filename}`);\n } catch (err) {\n log.warn(`profiling: failed to persist ${filename}`, err);\n }\n }\n\n async pruneFiles(): Promise<void> {\n try {\n const dir = this.storageDir;\n const entries = await fsp.readdir(dir);\n const jsonlFiles = entries.filter((f) => f.endsWith(\".jsonl\"));\n const withMtime = await Promise.all(\n jsonlFiles.map(async (f) => ({\n name: f,\n mtime: (await fsp.stat(join(dir, f))).mtimeMs,\n })),\n );\n const files = withMtime.sort((a, b) => a.mtime - b.mtime).map((f) => f.name);\n\n while (files.length > this.maxTraces) {\n const oldest = files.shift()!;\n await fsp.unlink(join(dir, oldest));\n log.debug(`profiling: pruned ${oldest}`);\n }\n } catch (err) {\n log.warn(\"profiling: prune failed\", err);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// ASCII formatter\n// ---------------------------------------------------------------------------\n\nexport function formatProfileTraceAscii(trace: ProfileTrace): string {\n const lines: string[] = [];\n const BAR_WIDTH = 40;\n\n lines.push(`=== Profile: ${trace.kind} ===`);\n lines.push(`Trace ID : ${trace.traceId}`);\n lines.push(`Total : ${trace.totalMs}ms`);\n if (trace.sessionKey) lines.push(`Session : ${trace.sessionKey}`);\n lines.push(\"\");\n\n // Identify bottleneck.\n let bottleneckName: string | null = null;\n if (trace.spans.length > 0) {\n let slowest = trace.spans[0];\n for (const s of trace.spans) {\n if (s.durationMs > slowest.durationMs) slowest = s;\n }\n bottleneckName = slowest.name;\n }\n\n // Spans.\n if (trace.spans.length > 0) {\n const maxDuration = Math.max(...trace.spans.map((s) => s.durationMs), 1);\n lines.push(\"Spans:\");\n for (const span of trace.spans) {\n const barLen = Math.max(1, Math.round((span.durationMs / maxDuration) * BAR_WIDTH));\n const bar = \"\\u2588\".repeat(barLen);\n const suffix = span.name === bottleneckName ? \" \\u2190 bottleneck\" : \"\";\n lines.push(` ${span.name.padEnd(30)} ${String(span.durationMs).padStart(6)}ms ${bar}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Parallel groups.\n if (trace.parallelGroups && trace.parallelGroups.length > 0) {\n lines.push(\"Parallel Groups:\");\n for (const group of trace.parallelGroups) {\n lines.push(` ${group.name}:`);\n lines.push(` Wall time : ${group.wallMs}ms`);\n const efficiency = parallelEfficiency(group);\n if (efficiency !== null) {\n lines.push(` Efficiency : ${efficiency}%`);\n }\n for (const member of group.members) {\n lines.push(` [${String(member.resolvedIndex).padStart(2)}] ${member.name.padEnd(28)} ${String(member.durationMs).padStart(6)}ms`);\n }\n }\n lines.push(\"\");\n }\n\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\nfunction parallelEfficiency(group: ProfileParallelGroup): number | null {\n if (group.members.length <= 1) return null;\n const idealMs = Math.max(...group.members.map((m) => m.durationMs));\n if (group.wallMs === 0) return null;\n return Math.round((idealMs / group.wallMs) * 100);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,173 @@
1
+ import {
2
+ resolveCueAnchorStoreDir,
3
+ validateCueAnchor
4
+ } from "./chunk-C6QPK5GG.js";
5
+ import {
6
+ resolveAbstractionNodeStoreDir,
7
+ validateAbstractionNode
8
+ } from "./chunk-NGAVDO7E.js";
9
+ import {
10
+ countRecallTokenOverlap,
11
+ normalizeRecallTokens
12
+ } from "./chunk-DT5TVLJE.js";
13
+ import {
14
+ listJsonFiles,
15
+ readJsonFile
16
+ } from "./chunk-LPSF4OQH.js";
17
+
18
+ // src/harmonic-retrieval.ts
19
+ import path from "path";
20
+ function scoreNode(node, queryTokens) {
21
+ const matchedFields = [];
22
+ let score = 0;
23
+ const titleMatches = countRecallTokenOverlap(queryTokens, node.title);
24
+ if (titleMatches > 0) {
25
+ score += titleMatches * 3;
26
+ matchedFields.push("title");
27
+ }
28
+ const summaryMatches = countRecallTokenOverlap(queryTokens, node.summary);
29
+ if (summaryMatches > 0) {
30
+ score += summaryMatches * 3;
31
+ matchedFields.push("summary");
32
+ }
33
+ const tagMatches = countRecallTokenOverlap(queryTokens, node.tags?.join(" "));
34
+ if (tagMatches > 0) {
35
+ score += tagMatches * 2;
36
+ matchedFields.push("tags");
37
+ }
38
+ const entityMatches = countRecallTokenOverlap(queryTokens, node.entityRefs?.join(" "));
39
+ if (entityMatches > 0) {
40
+ score += entityMatches * 2;
41
+ matchedFields.push("entityRefs");
42
+ }
43
+ const kindMatches = countRecallTokenOverlap(queryTokens, `${node.kind} ${node.abstractionLevel}`);
44
+ if (kindMatches > 0) {
45
+ score += kindMatches;
46
+ matchedFields.push("kind");
47
+ }
48
+ return { score, matchedFields };
49
+ }
50
+ function scoreAnchor(anchor, queryTokens) {
51
+ const matchedFields = [];
52
+ let score = 0;
53
+ const valueMatches = countRecallTokenOverlap(queryTokens, anchor.anchorValue);
54
+ const normalizedMatches = countRecallTokenOverlap(queryTokens, anchor.normalizedCue);
55
+ const cueMatches = Math.max(valueMatches, normalizedMatches);
56
+ if (cueMatches > 0) {
57
+ score += cueMatches * 4;
58
+ if (valueMatches > 0) matchedFields.push("anchorValue");
59
+ if (normalizedMatches > 0) matchedFields.push("anchor");
60
+ }
61
+ const typeMatches = countRecallTokenOverlap(queryTokens, anchor.anchorType);
62
+ if (typeMatches > 0) {
63
+ score += typeMatches;
64
+ matchedFields.push("anchorType");
65
+ }
66
+ const tagMatches = countRecallTokenOverlap(queryTokens, anchor.tags?.join(" "));
67
+ if (tagMatches > 0) {
68
+ score += tagMatches * 2;
69
+ matchedFields.push("anchorTags");
70
+ }
71
+ return { score, matchedFields };
72
+ }
73
+ async function readAbstractionNodes(options) {
74
+ const rootDir = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);
75
+ const files = await listJsonFiles(path.join(rootDir, "nodes"));
76
+ const nodes = [];
77
+ for (const filePath of files) {
78
+ try {
79
+ nodes.push(validateAbstractionNode(await readJsonFile(filePath)));
80
+ } catch {
81
+ }
82
+ }
83
+ return nodes;
84
+ }
85
+ async function readCueAnchors(options) {
86
+ const abstractionRoot = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);
87
+ const rootDir = resolveCueAnchorStoreDir(abstractionRoot);
88
+ const files = await listJsonFiles(rootDir);
89
+ const anchors = [];
90
+ for (const filePath of files) {
91
+ try {
92
+ anchors.push(validateCueAnchor(await readJsonFile(filePath)));
93
+ } catch {
94
+ }
95
+ }
96
+ return anchors;
97
+ }
98
+ async function searchHarmonicRetrieval(options) {
99
+ throwIfAborted(options.abortSignal);
100
+ const queryTokens = new Set(normalizeRecallTokens(options.query, ["what", "which"]));
101
+ if (queryTokens.size === 0 || options.maxResults <= 0) return [];
102
+ const nodes = await readAbstractionNodes(options);
103
+ const candidates = /* @__PURE__ */ new Map();
104
+ for (const node of nodes) {
105
+ throwIfAborted(options.abortSignal);
106
+ const { score, matchedFields } = scoreNode(node, queryTokens);
107
+ if (score <= 0) continue;
108
+ candidates.set(node.nodeId, {
109
+ node,
110
+ nodeScore: score,
111
+ anchorScore: 0,
112
+ matchedFields: new Set(matchedFields),
113
+ matchedAnchors: /* @__PURE__ */ new Map()
114
+ });
115
+ }
116
+ if (options.anchorsEnabled) {
117
+ throwIfAborted(options.abortSignal);
118
+ const anchors = await readCueAnchors(options);
119
+ const nodeIndex = new Map(nodes.map((node) => [node.nodeId, node]));
120
+ for (const anchor of anchors) {
121
+ throwIfAborted(options.abortSignal);
122
+ const { score, matchedFields } = scoreAnchor(anchor, queryTokens);
123
+ if (score <= 0) continue;
124
+ for (const nodeRef of anchor.nodeRefs) {
125
+ const node = nodeIndex.get(nodeRef);
126
+ if (!node) continue;
127
+ const existing = candidates.get(nodeRef) ?? {
128
+ node,
129
+ nodeScore: 0,
130
+ anchorScore: 0,
131
+ matchedFields: /* @__PURE__ */ new Set(),
132
+ matchedAnchors: /* @__PURE__ */ new Map()
133
+ };
134
+ existing.anchorScore += score;
135
+ existing.matchedFields.add("anchor");
136
+ for (const field of matchedFields) existing.matchedFields.add(field);
137
+ existing.matchedAnchors.set(anchor.anchorId, {
138
+ anchorId: anchor.anchorId,
139
+ anchorType: anchor.anchorType,
140
+ anchorValue: anchor.anchorValue
141
+ });
142
+ candidates.set(nodeRef, existing);
143
+ }
144
+ }
145
+ }
146
+ return [...candidates.values()].map((candidate) => {
147
+ let score = candidate.nodeScore + candidate.anchorScore;
148
+ if (options.sessionKey && candidate.node.sessionKey === options.sessionKey) score += 0.5;
149
+ return {
150
+ node: candidate.node,
151
+ score,
152
+ nodeScore: candidate.nodeScore,
153
+ anchorScore: candidate.anchorScore,
154
+ matchedFields: [...candidate.matchedFields].sort(),
155
+ matchedAnchors: [...candidate.matchedAnchors.values()].sort(
156
+ (left, right) => left.anchorType.localeCompare(right.anchorType) || left.anchorValue.localeCompare(right.anchorValue)
157
+ )
158
+ };
159
+ }).filter((result) => result.nodeScore > 0 || result.anchorScore > 0).sort(
160
+ (left, right) => right.score - left.score || right.anchorScore - left.anchorScore || right.node.recordedAt.localeCompare(left.node.recordedAt)
161
+ ).slice(0, options.maxResults);
162
+ }
163
+ function throwIfAborted(signal) {
164
+ if (!signal?.aborted) return;
165
+ const err = new Error("harmonic retrieval aborted");
166
+ Object.defineProperty(err, "name", { value: "AbortError" });
167
+ throw err;
168
+ }
169
+
170
+ export {
171
+ searchHarmonicRetrieval
172
+ };
173
+ //# sourceMappingURL=chunk-AAI7JARD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/harmonic-retrieval.ts"],"sourcesContent":["import path from \"node:path\";\nimport { listJsonFiles, readJsonFile } from \"./json-store.js\";\nimport {\n resolveAbstractionNodeStoreDir,\n validateAbstractionNode,\n type AbstractionNode,\n} from \"./abstraction-nodes.js\";\nimport {\n resolveCueAnchorStoreDir,\n validateCueAnchor,\n type CueAnchor,\n type CueAnchorType,\n} from \"./cue-anchors.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\n\nexport interface HarmonicMatchedAnchor {\n anchorId: string;\n anchorType: CueAnchorType;\n anchorValue: string;\n}\n\nexport interface HarmonicRetrievalResult {\n node: AbstractionNode;\n score: number;\n nodeScore: number;\n anchorScore: number;\n matchedFields: string[];\n matchedAnchors: HarmonicMatchedAnchor[];\n}\n\ninterface HarmonicCandidate {\n node: AbstractionNode;\n nodeScore: number;\n anchorScore: number;\n matchedFields: Set<string>;\n matchedAnchors: Map<string, HarmonicMatchedAnchor>;\n}\n\nfunction scoreNode(node: AbstractionNode, queryTokens: Set<string>): { score: number; matchedFields: string[] } {\n const matchedFields: string[] = [];\n let score = 0;\n\n const titleMatches = countRecallTokenOverlap(queryTokens, node.title);\n if (titleMatches > 0) {\n score += titleMatches * 3;\n matchedFields.push(\"title\");\n }\n\n const summaryMatches = countRecallTokenOverlap(queryTokens, node.summary);\n if (summaryMatches > 0) {\n score += summaryMatches * 3;\n matchedFields.push(\"summary\");\n }\n\n const tagMatches = countRecallTokenOverlap(queryTokens, node.tags?.join(\" \"));\n if (tagMatches > 0) {\n score += tagMatches * 2;\n matchedFields.push(\"tags\");\n }\n\n const entityMatches = countRecallTokenOverlap(queryTokens, node.entityRefs?.join(\" \"));\n if (entityMatches > 0) {\n score += entityMatches * 2;\n matchedFields.push(\"entityRefs\");\n }\n\n const kindMatches = countRecallTokenOverlap(queryTokens, `${node.kind} ${node.abstractionLevel}`);\n if (kindMatches > 0) {\n score += kindMatches;\n matchedFields.push(\"kind\");\n }\n\n return { score, matchedFields };\n}\n\nfunction scoreAnchor(anchor: CueAnchor, queryTokens: Set<string>): { score: number; matchedFields: string[] } {\n const matchedFields: string[] = [];\n let score = 0;\n\n const valueMatches = countRecallTokenOverlap(queryTokens, anchor.anchorValue);\n const normalizedMatches = countRecallTokenOverlap(queryTokens, anchor.normalizedCue);\n const cueMatches = Math.max(valueMatches, normalizedMatches);\n if (cueMatches > 0) {\n score += cueMatches * 4;\n if (valueMatches > 0) matchedFields.push(\"anchorValue\");\n if (normalizedMatches > 0) matchedFields.push(\"anchor\");\n }\n\n const typeMatches = countRecallTokenOverlap(queryTokens, anchor.anchorType);\n if (typeMatches > 0) {\n score += typeMatches;\n matchedFields.push(\"anchorType\");\n }\n\n const tagMatches = countRecallTokenOverlap(queryTokens, anchor.tags?.join(\" \"));\n if (tagMatches > 0) {\n score += tagMatches * 2;\n matchedFields.push(\"anchorTags\");\n }\n\n return { score, matchedFields };\n}\n\nasync function readAbstractionNodes(options: {\n memoryDir: string;\n abstractionNodeStoreDir?: string;\n}): Promise<AbstractionNode[]> {\n const rootDir = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);\n const files = await listJsonFiles(path.join(rootDir, \"nodes\"));\n const nodes: AbstractionNode[] = [];\n for (const filePath of files) {\n try {\n nodes.push(validateAbstractionNode(await readJsonFile(filePath)));\n } catch {\n // fail-open: invalid artifacts stay visible via status tooling instead of recall\n }\n }\n return nodes;\n}\n\nasync function readCueAnchors(options: {\n memoryDir: string;\n abstractionNodeStoreDir?: string;\n}): Promise<CueAnchor[]> {\n const abstractionRoot = resolveAbstractionNodeStoreDir(options.memoryDir, options.abstractionNodeStoreDir);\n const rootDir = resolveCueAnchorStoreDir(abstractionRoot);\n const files = await listJsonFiles(rootDir);\n const anchors: CueAnchor[] = [];\n for (const filePath of files) {\n try {\n anchors.push(validateCueAnchor(await readJsonFile(filePath)));\n } catch {\n // fail-open: invalid artifacts stay visible via status tooling instead of recall\n }\n }\n return anchors;\n}\n\nexport async function searchHarmonicRetrieval(options: {\n memoryDir: string;\n abstractionNodeStoreDir?: string;\n query: string;\n maxResults: number;\n sessionKey?: string;\n anchorsEnabled: boolean;\n abortSignal?: AbortSignal;\n}): Promise<HarmonicRetrievalResult[]> {\n throwIfAborted(options.abortSignal);\n const queryTokens = new Set(normalizeRecallTokens(options.query, [\"what\", \"which\"]));\n if (queryTokens.size === 0 || options.maxResults <= 0) return [];\n\n const nodes = await readAbstractionNodes(options);\n const candidates = new Map<string, HarmonicCandidate>();\n\n for (const node of nodes) {\n throwIfAborted(options.abortSignal);\n const { score, matchedFields } = scoreNode(node, queryTokens);\n if (score <= 0) continue;\n candidates.set(node.nodeId, {\n node,\n nodeScore: score,\n anchorScore: 0,\n matchedFields: new Set(matchedFields),\n matchedAnchors: new Map(),\n });\n }\n\n if (options.anchorsEnabled) {\n throwIfAborted(options.abortSignal);\n const anchors = await readCueAnchors(options);\n const nodeIndex = new Map(nodes.map((node) => [node.nodeId, node]));\n for (const anchor of anchors) {\n throwIfAborted(options.abortSignal);\n const { score, matchedFields } = scoreAnchor(anchor, queryTokens);\n if (score <= 0) continue;\n for (const nodeRef of anchor.nodeRefs) {\n const node = nodeIndex.get(nodeRef);\n if (!node) continue;\n const existing = candidates.get(nodeRef) ?? {\n node,\n nodeScore: 0,\n anchorScore: 0,\n matchedFields: new Set<string>(),\n matchedAnchors: new Map<string, HarmonicMatchedAnchor>(),\n };\n existing.anchorScore += score;\n existing.matchedFields.add(\"anchor\");\n for (const field of matchedFields) existing.matchedFields.add(field);\n existing.matchedAnchors.set(anchor.anchorId, {\n anchorId: anchor.anchorId,\n anchorType: anchor.anchorType,\n anchorValue: anchor.anchorValue,\n });\n candidates.set(nodeRef, existing);\n }\n }\n }\n\n return [...candidates.values()]\n .map((candidate) => {\n let score = candidate.nodeScore + candidate.anchorScore;\n if (options.sessionKey && candidate.node.sessionKey === options.sessionKey) score += 0.5;\n return {\n node: candidate.node,\n score,\n nodeScore: candidate.nodeScore,\n anchorScore: candidate.anchorScore,\n matchedFields: [...candidate.matchedFields].sort(),\n matchedAnchors: [...candidate.matchedAnchors.values()].sort((left, right) =>\n left.anchorType.localeCompare(right.anchorType) || left.anchorValue.localeCompare(right.anchorValue)\n ),\n };\n })\n .filter((result) => result.nodeScore > 0 || result.anchorScore > 0)\n .sort(\n (left, right) =>\n right.score - left.score\n || right.anchorScore - left.anchorScore\n || right.node.recordedAt.localeCompare(left.node.recordedAt),\n )\n .slice(0, options.maxResults);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (!signal?.aborted) return;\n const err = new Error(\"harmonic retrieval aborted\");\n Object.defineProperty(err, \"name\", { value: \"AbortError\" });\n throw err;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,112 @@
1
+ // src/chunking.ts
2
+ var DEFAULT_CHUNKING_CONFIG = {
3
+ targetTokens: 200,
4
+ minTokens: 150,
5
+ overlapSentences: 2
6
+ };
7
+ function estimateTokens(text) {
8
+ return Math.ceil(text.length / 4);
9
+ }
10
+ function splitSentences(text) {
11
+ const sentences = [];
12
+ const sentenceRegex = /[^.!?]*[.!?]+(?:\s+|$)/g;
13
+ let match;
14
+ let lastIndex = 0;
15
+ while ((match = sentenceRegex.exec(text)) !== null) {
16
+ sentences.push(match[0].trim());
17
+ lastIndex = sentenceRegex.lastIndex;
18
+ }
19
+ if (lastIndex < text.length) {
20
+ const remaining = text.slice(lastIndex).trim();
21
+ if (remaining) {
22
+ sentences.push(remaining);
23
+ }
24
+ }
25
+ return sentences.filter((s) => s.length > 0);
26
+ }
27
+ function chunkContent(content, config = DEFAULT_CHUNKING_CONFIG) {
28
+ const totalTokens = estimateTokens(content);
29
+ if (totalTokens < config.minTokens) {
30
+ return {
31
+ chunked: false,
32
+ chunks: [{
33
+ content,
34
+ index: 0,
35
+ tokenCount: totalTokens
36
+ }]
37
+ };
38
+ }
39
+ const sentences = splitSentences(content);
40
+ if (sentences.length <= 1) {
41
+ return {
42
+ chunked: false,
43
+ chunks: [{
44
+ content,
45
+ index: 0,
46
+ tokenCount: totalTokens
47
+ }]
48
+ };
49
+ }
50
+ const chunks = [];
51
+ let currentChunkSentences = [];
52
+ let currentTokens = 0;
53
+ let chunkIndex = 0;
54
+ for (let i = 0; i < sentences.length; i++) {
55
+ const sentence = sentences[i];
56
+ const sentenceTokens = estimateTokens(sentence);
57
+ currentChunkSentences.push(sentence);
58
+ currentTokens += sentenceTokens;
59
+ const atTarget = currentTokens >= config.targetTokens;
60
+ const isLastSentence = i === sentences.length - 1;
61
+ if (atTarget || isLastSentence) {
62
+ const chunkContent2 = currentChunkSentences.join(" ");
63
+ chunks.push({
64
+ content: chunkContent2,
65
+ index: chunkIndex,
66
+ tokenCount: estimateTokens(chunkContent2)
67
+ });
68
+ chunkIndex++;
69
+ if (!isLastSentence) {
70
+ const overlapCount = Math.min(config.overlapSentences, currentChunkSentences.length);
71
+ currentChunkSentences = currentChunkSentences.slice(-overlapCount);
72
+ currentTokens = currentChunkSentences.reduce((sum, s) => sum + estimateTokens(s), 0);
73
+ }
74
+ }
75
+ }
76
+ return {
77
+ chunked: chunks.length > 1,
78
+ chunks
79
+ };
80
+ }
81
+ function reassembleChunks(chunks) {
82
+ if (chunks.length === 0) return "";
83
+ if (chunks.length === 1) return chunks[0];
84
+ const result = [chunks[0]];
85
+ for (let i = 1; i < chunks.length; i++) {
86
+ const prevChunk = chunks[i - 1];
87
+ const currChunk = chunks[i];
88
+ const prevSentences = splitSentences(prevChunk);
89
+ const currSentences = splitSentences(currChunk);
90
+ let overlapCount = 0;
91
+ for (let j = 0; j < Math.min(prevSentences.length, currSentences.length); j++) {
92
+ const prevEnd = prevSentences.slice(-(j + 1));
93
+ const currStart = currSentences.slice(0, j + 1);
94
+ if (prevEnd.join(" ") === currStart.join(" ")) {
95
+ overlapCount = j + 1;
96
+ }
97
+ }
98
+ if (overlapCount > 0 && overlapCount < currSentences.length) {
99
+ result.push(currSentences.slice(overlapCount).join(" "));
100
+ } else if (overlapCount === 0) {
101
+ result.push(currChunk);
102
+ }
103
+ }
104
+ return result.join(" ");
105
+ }
106
+
107
+ export {
108
+ DEFAULT_CHUNKING_CONFIG,
109
+ chunkContent,
110
+ reassembleChunks
111
+ };
112
+ //# sourceMappingURL=chunk-B7LOFDVE.js.map